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...  |