vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen & Antworten rund um sev-Komponenten
SevDataGrid und NULL im ForeignKey 
Autor: Reinski
Datum: 02.05.05 20:01

Hallo zusammen,

das SevDataGrid2 bietet ja wunderbare Funktionalitäten für die meisten Standardfälle an, ABER...
Leider hänge ich gerade an einem Problem, was nur wenig von einem solchen Standardfall abweicht und ich kriegs nicht hin.
Hier die Beschreibung eines einfachen Projektes zum Nachvollziehen:

Ich habe eine Access 2003 Datenbank mit zwei Tabellen:
- MasterTabelle (Key as Autowert, MasterText as Text)
- DetailTabelle (Key as Autowert, Text as Text, ForeignKey as Long)
Dazu eine Relation:
- MasterTabelle.Key-->DetailTabelle.ForeignKey
mit der Besonderheit, dass für das Feld ForeignKey keine Eingabe erforderlich ist, d.h. man kann Detail-Sätze anlegen, die keinem Master-Satz zugeordnet sind.
Im Access geht es auch ohne Probleme:
Wenn man einen Wert in DetailTabelle.ForeignKey einträgt, dann muss es einen entsprechenden Eintrag in der MasterTabelle geben, sonst gibt's nen Fehler.
Wenn man keinen Wert eintragen möchte, dann löscht man ihn einfach heraus und Access akzeptiert das.

Genau dieses Verhalten möchte ich im SevDataGrid2 abbilden (mit Recordset-Anbindung und ComboBox, die statt ForeignKey den entsprechenden MasterText anzeigt!) und bekomme es nicht sauber hin. Denn ich schaffe es nicht, das Feld ForeignKey (per ComboList, wohlgemerkt) auf Null zu setzen und wenn ich es auf "" lasse, dann gibt's nen Fehler 3201: "Der Datensatz kann nicht hinzugefügt werden, da ein DS in der Tabelle 'MasterTabelle' mit diesem DS in Beziehung stehen muss".

Hier mein Beispielprojekt:
- Verweis auf DAO3.6
- Form mit SevDataGrid (Name: SevGrid1) und CheckBox (Name: Check1, Caption: "ComboBox aktiviert")
- Code:
Option Explicit
 
Const db_file As String = "F:\Eigene" & _
  "Dateien\VB\Debug\DataGrid2\ForeignKeyNULL\db1.mdb"
 
Dim DB As DAO.Database
Dim MasterRS As DAO.Recordset
 
Private Sub Check1_Click()
    If Check1.Value = 1 Then
        'Aktiviere ComboBox
        sevGrid1.Columns("ForeignKey").ColType = TYPE_COMBOLIST
        sevGrid1.Refresh    'nötig um die RowLoaded-Ereignisse auszulösen
    Else
        'Deaktiviere ComboBox
        sevGrid1.Columns("ForeignKey").ColType = TYPE_TEXT
        sevGrid1.Refresh
    End If
End Sub
 
Private Sub Form_Load()
    On Error GoTo ErrorHandler
    'Datenbank öffnen
    Set DB = DBEngine.OpenDatabase(db_file)
    'Form-globalen Recordset auf die MasterTabelle öffnen
    Set MasterRS = DB.OpenRecordset("MasterTabelle", dbOpenSnapshot)
    'Grid einrichten und Recordset auf DetailTabelle zuweisen
    With sevGrid1
        .DataMode = Mode_Recordset
        .AllowEdit = True
        Set .Recordset = DB.OpenRecordset("SELECT * FROM DetailTabelle;")
        .Refresh
    End With
    Exit Sub
ErrorHandler:
    MsgBox Err.Number & ": " & Err.Description, vbCritical, "Fehler", _
      Err.HelpFile, Err.HelpContext
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    MasterRS.Close
    DB.Close
End Sub
 
Private Sub sevGrid1_ErrorUpdate(ByVal nRow As Long, ByVal nCol As Long, ByVal _
  sText As String, ByVal nError As Long, ByVal sDescription As String)
    MsgBox nError & ": " & sDescription
End Sub
 
Private Sub sevGrid1_FillComboBox(ByVal nRow As Long, ByVal nCol As Long, _
  oComboBox As sevDataGrid2.EditComboBox)
    'Werte aus der MasterTabelle füllen
    With oComboBox
'        'So wäre es einfach:
'        Set .Recordset = DB.OpenRecordset("SELECT * FROM MasterTabelle;")
        'Aber wir wollen ja auch die Möglichkeit, die Auswähl zu löschen:
        Set .Recordset = DB.OpenRecordset("SELECT '' AS Key, '' AS MasterText" & _
          "FROM MasterTabelle UNION SELECT Key, MasterText FROM MasterTabelle;")
        .ColVisible("Key") = False
        .ColVisible("MasterText") = True
        .BoundColumn = 1
        .DisplayColumn = 2
    End With
End Sub
 
Private Sub sevGrid1_RowLoaded(ByVal nRow As Long, Item As _
  sevDataGrid2.ListItem)
    If Check1.Value = 1 Then
        'Numerischen Schlüssel durch den Text ersetzen
        If Item.CellText("ForeignKey") = "" Then
            'Kein Fremdschlüssel zugewiesen -> Leer anzeigen
            Item.CellText("ForeignKey") = ""
        Else
            MasterRS.FindFirst "Key = " & Item.CellText("ForeignKey")
            If MasterRS.EOF Then
                Item.CellText("ForeignKey") = ""
            Else
                Item.CellText("ForeignKey") = MasterRS.Fields( _
                  "MasterText").Value
            End If
        End If
    End If
End Sub
Fortsetzung folgt...

Immer noch auf der Suche nach dem "Tu's trotzdem"-Button...

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
SevDataGrid und NULL im ForeignKey1.711Reinski02.05.05 20:01
Re: SevDataGrid und NULL im ForeignKey1.045Reinski02.05.05 20:04
Einfacher ausgedrückt 1.188Reinski04.05.05 17:34
Re: Einfacher ausgedrückt 1.023ModeratorDieter06.05.05 10:20
Re: Einfacher ausgedrückt 1.038Reinski06.05.05 12:55
Re: Einfacher ausgedrückt 1.027ModeratorDieter07.05.05 09:27
Spitze! 998Reinski07.05.05 22:22

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel