Hallo zusammen,
ich habe mir eine kleine Test-Access-ACCDB Datei erstellt. 2 Tabellen (Personen, Telefonnr). Beide haben ein Autowert ID-Feld als Long Integer.
Personen_______Telefonnr
ID_____________ID
Vorname_______PersonenID (auch Zahl, Long Integer)
Nachname_____Vorwahl
______________Durchwahl
Dann habe ich diese Datenbank in mein Projekt eingebunden. Dann noch schnell eine Form mit 3 Buttons (Btn_Neue_Person, Btn_Speichern und Btn_Aktualisieren angelegt und den Anzeigetext geändert. Dann habe ich mir den DataSet-Designer geöffnet und eine Beziehung (Join) von Personen.ID nach Telefon.PersonenID gezogen, noch schnell den Punkt bei 'Sowohl Bezeichungs- als auch Fremdschlüsseleinschränkung aktiviert (Cascade, Cascade, None wurden ja automatisch eingestellt). Dann zurück in die Form und dort die Datetnquellen geöffnet. Als erstes dann die Personen-Tabelle als DGV auf die Form gezogen und dann die verknüpfte Tabelle 'Telefonnr' auch als DGV rüber gezogen. Weitere Einstellungen habe ich nicht mehr vorgenommen.
Vor den ersten Start habe ich ein paar Testdaten in beide Tabellen eingetragen, damit ich zu mindestens das Join-Ergebnis sehen kann.
Danach das ganze mit unten stehenden Code gestartet.
Ergebnis
1. Links in dem Personen-DGV stehen alle Datensätze vollständig drin. Auch die Telefonnr. für den ersten Datensatz werden angezeigt.
2. Wechsel ich nun den Datensatz, dann ändert sich auch die Anzeige im Telefon-DGV
3. Ändere ich nun im DGV den Vornamen bzw. Nachnamen und verlasse den Datensatz, werden diese Änderungen auch in der Access-Tabelle angezeigt (ggf. F5 drücken)
4. Möchte ich nun einen neuen Datensatz eintragen, drücke ich Btn_Neue_Person und trage dort den Vornamen ein. Die ID ist -1.
Soweit alles gut und schön.
Möchte ich aber auch eine Telefonnr. eintragen, so kann ich dies zwar tun. Es wird auch PersonenID = -1 übernommen, aber wenn ich das ganze abspeichere, dann bekommt zwar Person.ID einen Autowert, dieser wird aber nicht in Telefonnr.PersonenID mit geändert. Dort steht in der Access-Datenbank immer noch -1.
Jetzt die Frage:
Wie komme ich direkt nach der Inputbox die ID aktualisiert zurück geliefert und kann somit auch die Telefonnr. eintragen. Denn mache ich die Eingabe einer Telefonnr. die schon einen Wert PersonenID>0 hat, so klappt der Rest einwandfrei.
All die Beispiele, die ich bisher gesehen habe, fügen keinen neuen Datensatz hinzu in beiden Tabellen. Die meisten Beispiele sind nur für eine Tabelle.
Über eine kurze Rückmeldung würde ich mich sehr freuen.
Volker
Spoiler anzeigen
ich habe mir eine kleine Test-Access-ACCDB Datei erstellt. 2 Tabellen (Personen, Telefonnr). Beide haben ein Autowert ID-Feld als Long Integer.
Personen_______Telefonnr
ID_____________ID
Vorname_______PersonenID (auch Zahl, Long Integer)
Nachname_____Vorwahl
______________Durchwahl
Dann habe ich diese Datenbank in mein Projekt eingebunden. Dann noch schnell eine Form mit 3 Buttons (Btn_Neue_Person, Btn_Speichern und Btn_Aktualisieren angelegt und den Anzeigetext geändert. Dann habe ich mir den DataSet-Designer geöffnet und eine Beziehung (Join) von Personen.ID nach Telefon.PersonenID gezogen, noch schnell den Punkt bei 'Sowohl Bezeichungs- als auch Fremdschlüsseleinschränkung aktiviert (Cascade, Cascade, None wurden ja automatisch eingestellt). Dann zurück in die Form und dort die Datetnquellen geöffnet. Als erstes dann die Personen-Tabelle als DGV auf die Form gezogen und dann die verknüpfte Tabelle 'Telefonnr' auch als DGV rüber gezogen. Weitere Einstellungen habe ich nicht mehr vorgenommen.
Vor den ersten Start habe ich ein paar Testdaten in beide Tabellen eingetragen, damit ich zu mindestens das Join-Ergebnis sehen kann.
Danach das ganze mit unten stehenden Code gestartet.
Ergebnis
1. Links in dem Personen-DGV stehen alle Datensätze vollständig drin. Auch die Telefonnr. für den ersten Datensatz werden angezeigt.
2. Wechsel ich nun den Datensatz, dann ändert sich auch die Anzeige im Telefon-DGV
3. Ändere ich nun im DGV den Vornamen bzw. Nachnamen und verlasse den Datensatz, werden diese Änderungen auch in der Access-Tabelle angezeigt (ggf. F5 drücken)
4. Möchte ich nun einen neuen Datensatz eintragen, drücke ich Btn_Neue_Person und trage dort den Vornamen ein. Die ID ist -1.
Soweit alles gut und schön.
Möchte ich aber auch eine Telefonnr. eintragen, so kann ich dies zwar tun. Es wird auch PersonenID = -1 übernommen, aber wenn ich das ganze abspeichere, dann bekommt zwar Person.ID einen Autowert, dieser wird aber nicht in Telefonnr.PersonenID mit geändert. Dort steht in der Access-Datenbank immer noch -1.
Jetzt die Frage:
Wie komme ich direkt nach der Inputbox die ID aktualisiert zurück geliefert und kann somit auch die Telefonnr. eintragen. Denn mache ich die Eingabe einer Telefonnr. die schon einen Wert PersonenID>0 hat, so klappt der Rest einwandfrei.
All die Beispiele, die ich bisher gesehen habe, fügen keinen neuen Datensatz hinzu in beiden Tabellen. Die meisten Beispiele sind nur für eine Tabelle.
Über eine kurze Rückmeldung würde ich mich sehr freuen.
Volker
VB.NET-Quellcode
- Imports System.Data.Common
- Public Class Form1
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- ' Braucht man diese Zeilen?
- ' Wenn ja, dann muss man ggf. die Reihenfolge ändern: Erst die Haupttabellen und dann zum Schluss die Untertabellen
- 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestDBDataSet.Personen". Sie können sie bei Bedarf verschieben oder entfernen.
- Me.PersonenTableAdapter.Fill(Me.TestDBDataSet.Personen)
- 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestDBDataSet.Telefonnr". Sie können sie bei Bedarf verschieben oder entfernen.
- Me.TelefonnrTableAdapter.Fill(Me.TestDBDataSet.Telefonnr)
- PersonenDataGridView.AllowUserToAddRows = False
- ' TelefonnrDataGridView.AllowUserToAddRows = False
- End Sub
- Sub Speichern()
- ' Ist eine extra SUB, damit diese von jeder Stelle ggf. aufgerufen werden kann.
- Try
- ' Überprüft die Eingaben
- Me.Validate()
- ' Die Änderungen werden in die DataTable geschrieben
- Me.TelefonnrBindingSource.EndEdit()
- Me.PersonenBindingSource.EndEdit()
- ' und von dort aus in die Access-Datenbank
- Me.TableAdapterManager.UpdateAll(Me.TestDBDataSet)
- Catch ex As Exception
- ' Zeigt ggf. einen Fehler an
- MsgBox("Fehler beim speichern der Daten in die Access-Datenbank Fehler:" & vbCrLf & vbCrLf &
- ex.Message)
- End Try
- End Sub
- Private Sub PersonenDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles PersonenDataGridView.CellEnter
- ' Damit bei einem Wechsel innerhalb des DataGridViews gleich die ggf. vorhandenen Änderungen gesichert werden,
- ' wird hier erst einmal der Wert der ersten Spalte (ID) ermittelt
- Dim value As Object = PersonenDataGridView.Item(0, e.RowIndex).Value
- ' Wenn es keinen Wert gibt,
- If value = Nothing Or value < 0 Then
- ' dann passiert hier nichts mehr
- Exit Sub
- Else
- ' andernfalls werden die Änderungen gesichert
- Call Speichern()
- End If
- End Sub
- Private Sub TelefonnrDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles TelefonnrDataGridView.CellEnter
- ' Damit bei einem Wechsel innerhalb des DataGridViews gleich die ggf. vorhandenen Änderungen gesichert werden,
- ' wird hier erst einmal der Wert der ersten Spalte (ID) ermittelt
- Dim value As Object = TelefonnrDataGridView.Item(0, e.RowIndex).Value
- ' Wenn es keinen Wert gibt,
- If value = Nothing Or value < 0 Then
- ' auf die letzte Datenzeile gehen
- 'TelefonnrDataGridView.FirstDisplayedCell = TelefonnrDataGridView.Rows(TelefonnrDataGridView.RowCount - 1).Cells(0)
- 'Call Speichern()
- ' dann passiert hier nichts mehr
- Exit Sub
- Else
- ' andernfalls werden die Änderungen gesichert
- ' Call Speichern()
- End If
- End Sub
- Sub Aktualisieren()
- ' Hier soll eigentlich das passieren, was nicht klappt.
- ' Ich möchte nach der Eingabe eines Vornamens, dass die angezeigte ID sich auf den Wert ändert, des diese Zeile auch in der Datenbank hat.
- ' Aktuell steht dort immer -1 usw.
- End Sub
- Private Sub Btn_Speichern_Click(sender As Object, e As EventArgs) Handles Btn_Speichern.Click
- ' Ruft das Speichern der Daten in die Access-Datenbank auf
- Call Speichern()
- End Sub
- Private Sub Btn_Aktualisieren_Click(sender As Object, e As EventArgs) Handles Btn_Aktualisieren.Click
- Call Aktualisieren()
- End Sub
- Private Sub Btn_Neue_Person_Click(sender As Object, e As EventArgs) Handles Btn_Neue_Person.Click
- ' Für das Abfragen des Vornamens habe ich hier eine Variable deklariert,
- Dim NeuePerson As String
- ' die hier über eine Eingabebox ihren Wert bekommt.
- NeuePerson = InputBox("Welchen Vornamen hat die neue Person?", "", "Test")
- ' Gültigkeitsabfragen oder ähnliches spare ich mir hier erst einmal
- ' Jetzt wird die Eingabe in die Access-Datenbank eingetragen.
- TestDBDataSet.Personen.AddPersonenRow(NeuePerson, "")
- ' und die neue aktuelle letzte Zeile sowie die zweite Spalte (0 basiert) angesteuert
- PersonenDataGridView.CurrentCell = PersonenDataGridView(1, PersonenDataGridView.Rows.Count - 1)
- Try
- ' Die Änderungen werden jetzt gespeichert
- Call Speichern()
- ' und die ID soll hier eigentlich aktualisiert werden
- Call Aktualisieren()
- Catch ex As Exception
- MsgBox("Das Hinzufügen hat einen Fehler verursacht Fehler:" & vbCrLf & vbCrLf &
- ex.Message)
- End Try
- End Sub
- 'Private Sub Btn_Neue_Telefonnr_Click(sender As Object, e As EventArgs) Handles Btn_Neue_Telefonnr.Click
- ' ' Für das Abfragen des Vornamens habe ich hier eine Variable deklariert,
- ' Dim NeueTelefonnr As String
- ' ' die hier über eine Eingabebox ihren Wert bekommt.
- ' NeueTelefonnr = InputBox("Welche Vorwahl. hat die Person?", "", "12345")
- ' ' Gültigkeitsabfragen oder ähnliches spare ich mir hier erst einmal
- ' Dim PersonID As Int32
- ' PersonID = PersonenDataGridView.CurrentRow.Cells(1).Value
- ' ' Jetzt wird die Eingabe in die Access-Datenbank eingetragen.
- ' TestDBDataSet.Telefonnr.AddTelefonnrRow(PersonID, NeueTelefonnr, "", "")
- ' ' und die neue aktuelle letzte Zeile sowie die zweite Spalte (0 basiert) angesteuert
- ' TelefonnrDataGridView.CurrentCell = TelefonnrDataGridView(3, TelefonnrDataGridView.Rows.Count - 2)
- ' Try
- ' ' Die Änderungen werden jetzt gespeichert
- ' Call Speichern()
- ' ' und die ID soll hier eigentlich aktualisiert werden
- ' Call Aktualisieren()
- ' Catch ex As Exception
- ' MsgBox("Das Hinzufügen hat einen Fehler verursacht Fehler:" & vbCrLf & vbCrLf &
- ' ex.Message)
- ' End Try
- 'End Sub
- End Class
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Volker Bunge“ ()