Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Tabellen Inhalt in Abfrage schreiben über 2 Recordset´s

Begonnen von Frank77, Dezember 28, 2011, 18:42:23

⏪ vorheriges - nächstes ⏩

Frank77

Hallo!

Ich habe da ein kleines Problem mit dem übertragen von Daten einer Tabelle  in 2 Tabellen die mit einer 1:1 Beziehung verknüpft sind und in einer gespeicherten Abfrage zusammengefast sind
Warum die Daten nicht übertragen werden weis ich leider auch nicht
Denn wenn ich die Abfrage öffne und direkt in die Tabelle schreibe geht es ja auch

Was ich in der RS.AddNew nicht berücksichtigt habe ist das Feld  RS![BestandID]
Es ist ein Autowert Feld das  die 1:1 Beziehung ausmacht,  es ist in der Abfrage enthalten und erstellt die ID wenn ich es von Hand in die Abfrage eingebe von alleine und setzt die Datensätze beim Speichern in Beziehung

Leider bekomme ich es in VBA nicht gebacken ich bekomme allerdings auch keine Fehlermeldung

Ich denke  das es daran liegt das ich das Autowert Feld in der Prozedur nicht berücksichtigt habe

   Dim db As DAO.Database
   Dim RS As DAO.Recordset
   Dim RS1 As DAO.Recordset
   
   Set db = CurrentDb
   Set RS = db.OpenRecordset("QryWarenausgangWarenkorb", dbOpenDynaset)
   Set RS1 = db.OpenRecordset("TblWarenkorb", dbOpenSnapshot)
 
  With RS
   Do Until RS.EOF
       RS.AddNew
       RS![BestandArtIDRef] = RS1.Fields("WkorbArtID")
       RS![BestandAnzahl] = RS1.Fields("WkorbAnzahl")
       RS![BestandVorzeichen] = RS1.Fields("WkorbVorzeichen")
       RS![BestandDatum] = RS1.Fields("WkorbDatum")
       RS![PosMwst] = RS1.Fields("WkorbMwst")
       RS![PosNetto] = RS1.Fields("WkorbArtNetto")
       RS![PosBestellIDRef] = RS1.Fields("WKorbBestellIDRef")
       RS.Update
       RS1.MoveNext
   Loop
   End With
   RS.Close
   RS1.Close
   
   Set RS = Nothing
   Set RS1 = Nothing
   Set db = Nothing


SQL Der zugrunde liegenden Abfrage :

SELECT tblBestandsaenderungen.BestandsaenderungID, tblBestandsaenderungen.BestandArtIDRef, tblBestandsaenderungen.BestandAnzahl, tblBestandsaenderungen.BestandVorzeichen, tblBestandsaenderungen.BestandDatum, tblPositionen.PosMwst, tblPositionen.PosNetto, tblPositionen.PosBestellIDRef
FROM tblBestandsaenderungen INNER JOIN tblPositionen ON tblBestandsaenderungen.BestandsaenderungID = tblPositionen.BestandsaenderungID;




Gruß Frank
Selbstständig = Selbst und Ständig

MzKlMu

Hallo,
1:1 Beziehungen sind nur selten sinnvoll und im Regelfall überflüssig.
Auch Recodesets sollten in einer korrekten DB nur sehr selten (wenn überhaupt) notwendig sein.
Was ist denn der Hintergrund des Vorhabens?

Zu Deinem Problem:
Das Feld in der 2. (abhängigen Tabelle) darf für die Beziehung kein Autowert sein.
Also:
Tabelle 1 ID = Autowert
Tabelle 2 ID = Autowert
Tabelle 2 ID_F Das ist der Fremdschlüssel (ohne Duplikate) und über dieses Feld läuft die Beziehung.

Demzufolge muss in Tabelle 2 der Fremdschlüssel geschrieben werden.
Gruß Klaus

daolix

Hallo

Irgendwie verstehe ich deinen Code nicht richtig. Du willst an RS etwas anfügen ( mit rs.AddNew )  lässt deinen Loop aber über die Prüfung nach rs.eof laufen. Wenn dein RS ("QryWarenausgangWarenkorb")  aber keine Daten wiedergibt können auch keine Daten aus RS1 ("TblWarenkorb") an RS angefügt werden.
müsste das nicht lauten: Do Until RS1.EOF weil das sind ja die Daten die angefügt werden sollen. Zudem kannst die die Zeilen with rs und end with aus dem Code löschen.



ebs17

Eine Anfügeanfrage wäre einfacher, fehlerunträchtiger und schneller als Recordsetschleifen, sieht aber nicht so wichtig aus. Vielleicht würdest Du es trotzdem versuchen.

Bei zwei Tabellen würde ich dann zwei Abfragen verwenden, pro Tabelle eine. Bei einer 1:1- Beziehung dürfte die Zuordnung zwischen PK und FK nicht schwierig sein.

MfGA
ebs

Frank77

Hallo danke für die Antworten !

Es ist so dass die zugrundeliegende Idee eine Bestellverwaltung mit Inventur ist nur das ich die Daten in einem Warenkorb Tabelle sammle  wird die Bestellung nicht abgeschlossen werden alle Daten beim verlasen aus der Tabelle Warenkorb gelöscht  

In der Original Vorlage ist es ein Unter Formular das auf der Abfrage basiert wenn dort eine Bestellung eingegeben wird werden die Daten an die 2 Tabellen übergeben
TblBestandsänderung und TblPosition übergeben
Während am Anfang im Haupt Formular eine Referenz in der TblBestellung anlegt    

Mein Vorgehen ist das das ich die Artikel im Warenkorb sammle  die ich bestellen möchte

Dann wird die Bestellung in eine pdf ausgegeben und per email ans Büro gesendet und in einem Ordner gespeichert

Beim Senden der email wird die Bestellung in der TblBestellung Angelegt  dessen ID habe ich über
strSQL = "SELECT Max(BestellID) AS MaxID FROM TblBestellung;"

Als test zurück in die TblWarenkorb  in jeden Datensatz geschrieben da es über die obere Prozedur
Mitgeschrieben werden muss  das möchte ich nachher aber in einem schritt erledigen

Was also im Original über die Eingabe im unter Formular passiert muss ich jetzt per VBA lösen
Das geht leider nicht mehr anders

Was ich jetzt nicht verstehe ist das die Abfrage die ich als Recordset angegeben habe die Daten nicht weiter gibt !  da es sonst ja auch geht

Wen ich wie in dem Bild die Daten in die Qry eingebe verteilen die sich auf die TblBestandsaenderung und TblPossitionen das Feld  BestandsaenderungID erstellt sich automatisch daher dachte ich das ich es eventuell als Autowert Feld in die VBA einbauen muss dass die Abfrage das Schreiben der Datensätze annimmt



Gruß frank
Selbstständig = Selbst und Ständig

Frank77

so gings dann


    Dim db As DAO.Database
    Dim RS As DAO.Recordset
    Dim RS1 As DAO.Recordset
   
    Set db = CurrentDb
    Set RS = db.OpenRecordset("QryWarenausgangWarenkorb", dbOpenDynaset)
    Set RS1 = db.OpenRecordset("TblWarenkorb", dbOpenSnapshot)
   
   
    Do Until RS1.EOF                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<          Das wars
        RS.AddNew
        RS![BestandArtIDRef] = RS1.Fields("WkorbArtID")
        RS![BestandAnzahl] = RS1.Fields("WkorbAnzahl")
        RS![BestandVorzeichen] = RS1.Fields("WkorbVorzeichen")
        RS![BestandDatum] = RS1.Fields("WkorbDatum")
        RS![PosMwst] = RS1.Fields("WkorbMwst")
        RS![PosNetto] = RS1.Fields("WkorbArtNetto")
        RS![PosBestellIDRef] = RS1.Fields("WKorbBestellIDRef")
        RS.Update
        RS1.MoveNext
    Loop
   
    RS.Close
    RS1.Close
   
    Set RS = Nothing
    Set RS1 = Nothing
    Set db = Nothing


Selbstständig = Selbst und Ständig