Datenbankzugriff auf mehrere Tabellen, Beziehungsproblem

chris-xy

Grünschnabel
Hallo zusammen,

ich bin Christian, Administrator an einer Schule und arbeite an einem Datenbank-VB-Projekt. (VB 6.0 + Access Datenbank)

Da ich mit mehreren Tabellen gleichzeitig arbeiten muss, habe ich mir das Fomular selbst erstellt und das Anzeigen der Datensätze funktioniert auch ganz gut.

Meine beiden Tabellen: Orte und Personal

Wenn ich nun einen neuen Mitarbeiter eingeben will, funktioniert das nur wenn dieser die selbe Postleitzahl hat, wie die, die schon in der Orte-Tabelle vorhanden sind.

Bei meiner Überprüfungsabfrage läuft das Programm durch, aber der Personal.Update Befehl am Ende bringt eine Fehlermeldung und der Datensatz wird nicht gespeichert.

Code:
Personal.AddNew
Personal.Fields("PersonalID").Value = PersID
Personal.Fields("FahrerID").Value = FahrerId
Personal.Fields("Name").Value = FName
Personal.Fields("Vname").Value = Vname
Personal.Fields("Strasse").Value = Strasse
Personal.Fields("Telefon").Value = Tel
Personal.Fields("Fax").Value = Fax
Personal.Fields("Mobil-Telefon").Value = Mobil
Personal.Fields("E-Mail").Value = Email
    ' Postleitzahl überprüfen
Orte.MoveFirst
Do
    If Orte.EOF = False Then
        Orte.MoveNext
    Else
        MsgBox "keine Übereinstimmung"
        Exit Do
    End If
Loop Until Orte.Fields("PLZ").Value <> PLZ

If Orte.Fields("PLZ") = PLZ Then
    Personal.Fields("PLZ").Value = PLZ
    txt_Ort = Orte.Fields("Ort").Value
    ' txt_Ortsteil = Orte.Fields("Ortsteil").Value
    txt_Land = Orte.Fields("Land").Value
    Personal.Update
Else
    Orte.AddNew
    Orte.Fields("PLZ").Value = PLZ
    Orte.Fields("Ort").Value = Ort
    ' Orte.Fields("Ortsteil").Value = Ortsteil
    Orte.Fields("Land").Value = Land
    Orte.Update
    'Personal.Update
End If
End Sub

Schon einmal besten Dank für eure Hilfe
Liebe Grüße
Chris
 
Hallo nochmal,

jetzt hab ich nochmal dran rumgebastelt und einen schlimmeren Fehler bemerkt.
Beim Laden der Form nimmt er den ersten Datensatz aus der Personaltabelle und den ersten Satz der Ortetabelle.

wo liegt hier mein Feher?

Code:
Private Sub Form_Load() 
    ' Datenbank öffnen und Tabellen aunswählen
Set db = DBEngine.Workspaces(0).OpenDatabase("f:\db1.mdb")
Set Orte = db.OpenRecordset("tblOrte", dbOpenDynaset)
Set Personal = db.OpenRecordset("tblPersonal", dbOpenDynaset)

Personal.MoveFirst
PersID = Personal.Fields("PersonalID").Value
FahrerId = Personal.Fields("FahrerID").Value
FName = Personal.Fields("Name").Value
Vname = Personal.Fields("Vname").Value
Strasse = Personal.Fields("Strasse").Value
Tel = Personal.Fields("Telefon").Value
Fax = Personal.Fields("Fax").Value
Mobil = Personal.Fields("Mobil-Telefon").Value
Email = Personal.Fields("E-Mail").Value
PLZ = Personal.Fields("PLZ").Value
    ' plz überprüfen
Orte.MoveFirst
Do
    If Orte.EOF = False Then
        Orte.MoveNext
    Else
        MsgBox "keine Übereinstimmung"
        Exit Do
    End If
Loop Until Orte.Fields("PLZ").Value <> PLZ
If Orte.Fields("PLZ").Value = PLZ Then
    OPLZ = Orte.Fields("PLZ").Value
    Ort = Orte.Fields("Ort").Value
    Land = Orte.Fields("Land").Value
End If
    ' Variablen den Textfeldern zuordnen
txt_PersonalID = PersID
txt_FahrerID = FahrerId
txt_Name = FName
txt_Vname = Vname
txt_Strasse = Strasse
txt_PLZ = OPLZ
txt_Ort = Ort
txt_Land = Land
txt_Tel = Tel
txt_Fax = Fax
txt_Handy = Mobil
txt_Mail = Email
End Sub

Liebe Grüße
Chris
 
Hallo Chris,
logisch das die beiden DAO Recordsets den ersten Datensatz anzeigen
wenn du ein rs.movefirst ausführst. Selbst wenn es in deiner Access
Datenbank Beziehungen gibt kennt die DAO (also deine Zugriffsmethode) nicht.
Besser wäre es ADO zu nutzen aber ok das hat nix mit deinem Problem zu tun.
Du musst in dein OpenRecordset mit SQL deine Beziehung einbauen.

z.B. Set Orte = db.OpenRecordset("Select * from tblOrte where Ort = 'Berlin' ", dbOpenDynaset)

Beschreibe doch mal genauer was beim Laden der Form angezeigt wird, wie
die Tabellen aufgebaut sind und wie du darin navigierst.

Jens
 
Hallo Jens,

beim laden der FORM, zeigt er den ersten Datensatz der 'Personal'-Tabelle an.
In den Textfeldern deren Inhalte von der 'Orte'-Tabelle kommen sollen steht bei 'PLZ' ne 0 und die anderen Felder sind leer. Es sieht so aus als ob er die letzte Zeile der AccessDB nimmt.
Wenn ich dann auf Letzten Datensatz gehe liefert er zufällig das richtige Ergebnis.
Wenn ich jetzt zum ersten, zurück oder sonstwas mache, behält er die Ortsdaten bei.

Er sollte eigentlich die vorgegebenen Daten aus meiner 'Personal'-Tabelle, die PLZ von dem jeweiligen Datensatz aus der 'Orte'-Tabelle holen und die weiteren Ortsdaten in die Textfelder laden.

Die beiden PLZ sind Integer
Die anderen Felder String

Irgengwie auch die DO LOOP - Schleife nicht richtig, da die MsgBox nicht aufgerufen wird.

Zur Navigation:
Hier habe ich Buttons angelegt, die eigentlich wie bei der FORM nur mit rs.MoveNext, rs.MoveLast,... arbeiten, eine Abfrage die EOF und BOF abfängt und dabei meine Variablen füllt.

Das mit dem Beziehungsproblem tritt nur beim Editieren eines Datensatzes auf.
Hier kommt eine Fehlermeldung, dass in der DB nicht geschrieben werden kann, da sie mit einem Datensatz einer anderen Tabelle in Beziehung stünde.

Schöne Grüße
Chris
 
Hallo Chris,

zippe doch einfach bitte mal den Code inklusive der Datenbank und stelle das mal zum testen zur Verfügung.

Jens
 
Hallo Jens,

'möge mit der erfahrene Programierer entschuldigen ;-)

Die DB ist noch im aufbau, das bleibt nicht so!
die SQL-Syntax wäre doch:

select * from Personal, Orte where Personal.plz = Orte.plz

Schöne Grüße
Chris
 

Anhänge

  • Test.zip
    20,4 KB · Aufrufe: 15
Zuletzt bearbeitet:
Hallo Chris,

ich habe bissel was geändert in deinem Code und jetzt
es soweit. Es läßt sich sicher noch einiges
verbessern und optimieren, möglicherweise sind auch noch
Fehler drin. Eine Fehlerbehandlung solltest du auch noch
einbauen.
Fürs erste sollte dies aber reichen, mehr Zeit habe ich
leider im Moment nicht.
Die Datenbank habe ich nach Access 2002 konvertieren
müssen da ich die Felder PLZ von Zahl auf Text geändert
habe, ansonsten wird die führende 0 bei den PLZ weggeschnitten.
Das musst du bei dir ändern.
Unter Verweise habe ich den DAO Verweis von 3.51 noch auf
3.6 geändert, solltest duu 3.6 nicht haben musst du das zurückstellen.

HTH
Jens
 

Anhänge

  • test.zip
    29,2 KB · Aufrufe: 17
Hallo Jens,

den rest könnte ich dann hinbekommen. Es fehlt meistens nur ein kleiner Denkanstoß, wie mit der Funktion.
Wenn ich nochmal ein Problem hab, dann weiss ich ja wo ich dich finde. :)

Vielen Dank für deine Hilfe

Schöne Grüße
Chris
 

Neue Beiträge

Zurück