Hallo,
ich habe ca. 1000 Datensätze, welche ich gerne mit einer Aktualisierungsabfrage befüllen wollte, da die Menge manuell zu aktualisieren doch etwas aufwendig ist. Das Problem dabei st, dass es sich um Datensätze in einem Unterformular handelt. es gibt frmErfassung, welches frmErfassungUfoZusatzKarten beinhaltet (siehe auch Beziehungen in bild1). Im Bild entspricht das grün gerahmte dem zu aktualiserenden Feld im Unterformular frmErfassungUfoZusatzKarten. Ich habe nicht das Knowhow, wie der Query dazu aussehen muss, damit er die Datensatz-IDs herausfindet, welche aktualisiert werden müssen. Aktualisierungsabfragen im Ufo bekomme ich einfach nicht hin :(. Ist dies sehr aufwendig zu erstellen und kann mir dabei jemand helfen?
Danke und Gruß
Andreas
Hallo Andreas,
eine UFo enthält üblicherweise die Daten einer Tabelle. Die gilt es dann wohl zu aktualisieren. Die Syntax einer Abfrage lautet dann so
Zitat
UPDATE Tabellenname
SET Feld1=zuzuweisender Wert, Feld2=zuzuweisender Wert
WHERE Bedingung
Alternativ könntest du ein Ja/Nein Feld in deine Tabelle einfügen und im UFo mit ausgeben. Dann kannst du bequem anhaken, was du aktualisieren möchtest, der Where-teil lautet dann
Zitat
WHERE DeinJaNeinFeld = True
hoff es helfd ;)
Hallo,
mir ist nicht ganz klar, mit welchem Wert das Feld aktualisiert werden soll.
Ist das Feld (das Grüne) z.Z. leer ?
Hallo Klaus,
ja das Feld im Ufo in den angesprochenen 1000 Datensätzen ist aktuell leer, siehe bild2.
Gruß Andreas
Hi,
Zitat von: el_gomero am Mai 11, 2017, 18:39:07
Hallo Andreas,
eine UFo enthält üblicherweise die Daten einer Tabelle. Die gilt es dann wohl zu aktualisieren. Die Syntax einer Abfrage lautet dann so
UPDATE Tabellenname
SET Feld1=zuzuweisender Wert, Feld2=zuzuweisender Wert
WHERE Bedingung
Mit der von dir beschriebenen Vorgehensweise habe ich in der tblSpiele schon fehlende Daten ergänzt.
Aber.... (vielleicht denk ich da wieder viel zu kompliziert) die Tabelle wird ja nur mit einem Datensatz bestückt, wenn ich auch einen anlege. Das bedeutet, die Tabelle tblZusatzKartenArtZuSpiel welche vom frmErfassungUfoZusatzKarten gefüttert wird, hat aktuell 1572 Datensätze von Spielen. Erfasste Spiele selbst in Tabelle Spiele (gefüttert mit dem HF frmErfassung --> beinhaltet frmErfassungUfoZusatzKarten) habe ich aber 2518. Da ich keine ID's in der Tabelle tblZusatzKartenArtZuSpiel der ca. 1000 Datensätzen habe, wie soll ich da aktualisieren? Denk ich da zu "komisch"?
Zitat
hoff es helfd ;)
Ich hoffe es auch bei jeder Antwort :-).
Gruß Andreas
Hi Andreas,
kannst Du bitte mal obigen Beitrag editieren, irgendwie ist der durcheinander.
Zum Problem:
OK, das Feld ist leer, aber mir ist nicht klar, welcher Wert da rein soll, mit welchen Abhängigkeiten.
Hallo Klaus,
ich hab es editiert, sorry my fault.
Ich hab bild3 angehängt. Das soll rein ins Feld -keine Zusatzkarten o. Flyer-
Ich will die leeren Datensätze deswegen bestücken, weil man sonst nie weiss, ob man es einfach nur vergessen hat zu befüllen, oder ob das Spiel wirklich keinen Zusatzkarten hat. Das zum Hintergrund warum der Aufwand.
Dieser Zusatz -keine Zusatzkarten o. Flyer- ist in der Tabelle tblZusatzKartenArt und hat die ID=39, VerlagID_F ID=0. VerlagID_F ID=0 ist Verlag ungebunden. Der Eintrag hat also keinerlei sonstige Abhängigkeiten. Ich muss also zuerst herausfinden, bei welchen Datensätze diese Feld leer ist (wohl auch mit einer Abfrage wie liste alle fehlenden ID's von 1-2518 auf). Für mich ist das alles andere als trivial.
Gruß Andreas
Hallo,
ZitatIch muss also zuerst herausfinden, bei welchen Datensätze diese Feld leer ist
das verstehe ich schon wieder nicht, Du hast Doch geschrieben, das Feld wäre leer.
Versuche mal diese Abfrage:
UPDATE tblZusatzKartenArtZuSpiel SET ZusatzKartenArtID_F = 39
WHERE ZusatzKartenArtID_F Is Null
Aber an einer Kopie !!!!!
Hi,
die Abfrage bringt wie zu erwarten
Sie sind dabei 0 Datensätze zu aktualisieren.
ZitatIch muss also zuerst herausfinden, bei welchen Datensätze diese Feld leer ist
das verstehe ich schon wieder nicht, Du hast Doch geschrieben, das Feld wäre leer.
Ja, das ist immer schwierig es verständlich zu erklären, ich weiss es ja :(. Also, ich habe ja 2518 Datensätzen in der DB, erfasst mit frmErfassung, wo auch frmErfassungUfoZusatzKarten drin ist. Die tblZusatzKartenArtZuSpiel hat aber nur 1572 Datensätze. Bei 471 Datensätzen habe ich den Eintrag
-keine Zusatzkarten o. Flyer- drin, der Rest von den 1101 Datensätzen hat andere Einträge wie
Werbekarte, Spielregel in Deutsch etc. Wenn solch einen Datensatz im frmErfassung aufrufe, dann sieht das aus wie in bild4+5. Aber in den restlichen 946 Datensätzen sieht es aus wie in bild6, da ist das Feld eben leer. Und genau das will ich bei diesen 946 Datensätzen ändern.
Gruß Andreas
bei richtigem Datenmodell dürfte es keine leeren Felder geben. Ein Eintrag in der Tabelle Zusatzkarten erfolgt nur, wenn auch eine solche vorhanden ist.
Im Umkehrschluss würdest du Quartette ohne Zusatzkarte nur über eine Inkosistenzabfrage finden.
Hi,
Zitat von: el_gomero am Mai 11, 2017, 20:26:10
bei richtigem Datenmodell dürfte es keine leeren Felder geben. Ein Eintrag in der Tabelle Zusatzkarten erfolgt nur, wenn auch eine solche vorhanden ist.
Im Umkehrschluss würdest du Quartette ohne Zusatzkarte nur über eine Inkosistenzabfrage finden.
Wenn man eine Datenbank hat, in dem man nachträglich ein Feature hinzu bringt, wie eben das der Zusatzkarten, dann liegt es in der Natur der Sache, dass es Datensätzen gibt, welche NICHT über einen solchen Eintrag verfügen, oder? Imho ist das mal in 1. Linie keine Sache des richtigen Datenmodells.
Gruß Andreas
das wär auch bei nachträglicher Anlage kein Problem, aber egal - wie ist denn der konkrete Zustand? Wo werden die Zusatzkarten gespeichert? In TblZusatzkartenArtZuSpiel?
Hallo Jürgen,
ja, die werden in der tblZusatzkartenArtZuSpiel gespeichert, korrekt.
Gruß Andreas
Hab mir das alles in Ruhe nochmal durchgelesen und glaube jetzt zu wissen, was du willst. Du willst überall Zusatzkarten quasi als Dummy eintragen, wo bisher keine erfasst wurden.
Dann kopier mal den (ungetesteten) Code in eine Kopie deiner db in ein leeres Modul und führe in mit F5 aus.
Public Sub Update_Zusatzkarte()
Dim strSQL as string, db as dao.Database, rs as DAO.Recordset
Set db = currentdb
Set rs = db.OpenRecordset("SELECT SpielID FROM tblSpiele")
Do until rs.eof
If Dcount("*", "tblZusatzKartenArtZuSpiel", "SpielID_F=" & rs!SpielID) < 1 Then
strSQL = "INSERT INTO tblZusatzKartenArtZuSpiel " & _
" ( SpielID_F, ZusatzKartenArtID_F ) " & _
" SELECT " & rs!SpielID & ", 39"
db.execute strsql, 128
End If
rs.movenext
Loop
rs.close: set rs = nothing
Set db = nothing
End Sub
Nachtrag - die 39 musst du natürlich durch die ID ersetzen, die bei dir für "keine ..." steht ;)
Hi,
wow, das hat auf Anhieb gepasst, top. Vielen Dank dafür. Kannst du mir kurz wenn möglich die eine oder andere Zeile des Codes erklären, zumindest den welchen ich eingepastet und in Fett gehalten habe?
Das kann man ja immer mal wieder gebrauchen, wenn man so etwas wieder mal hat!
Set rs = db.OpenRecordset("SELECT SpielID FROM tblSpiele") ==> ist klar
Do until rs.eof
[b]If Dcount("*", "tblZusatzKartenArtZuSpiel", "SpielID_F=" & rs!SpielID) < 1[/b] Then
strSQL = "INSERT INTO tblZusatzKartenArtZuSpiel " & _
" ( SpielID_F, ZusatzKartenArtID_F ) " & _
" SELECT " & rs!SpielID & ", 39"
[b]db.execute strsql, 128[/b]
Den Thread stelle ich als gelöst ein.
Danke und Gruß Andreas
Moin Andreas,
der Code von gestern durchläuft alle IDs aus der tblSpiele. Innerhalb dieser Schleife schaut er für jede ID wie oft es diese im Fremdschlüsselfeld der tblZusatzKartenArtZuSpiel gibt (DCount). Wenn weniger als einmal vorhanden, dann wird diese ID eingefügt und im Fremdschlüssel für die Zusatzkarte der Wert 39. Die Anweisung steht zuerst in einer Stringvariablen, da kann sie bei auftretendem Fehler besser ausgewertet werden. Ausgeführt wird sie dann mit dem Execute-Befehl, die 128 dahinter steht für dbfailonerror, was bedeutet, dass eine "sprechende" Fehlermeldung ausgegeben wird, falls sie nicht ausführbar ist.
Gestern abend war ich schon müde und hab noch einiges parallel gemacht. Der gepostete Code liese sich noch vereinfachen.
Public Sub Update_Zusatzkarte()
Dim strSQL as string, db as dao.Database, rs as DAO.Recordset
Set db = currentdb
' nur SpieleID ohne korrespondierenden Fremdschlüssel übernehmen
strSQL = "SELECT tblSpiele.SpielID " & _
"FROM tblSpiele " & _
" LEFT JOIN tblZusatzKartenArtZuSpiel ON tblSpiele.SpielID = tblZusatzKartenArtZuSpiel.SpielID_F " & _
"WHERE tblZusatzKartenArtZuSpiel.SpielID_F IS NULL"
Set rs = db.OpenRecordset(strSQL)
Do until rs.eof
' Prüfung mit Dcount kann entfallen
strSQL = "INSERT INTO tblZusatzKartenArtZuSpiel " & _
" ( SpielID_F, ZusatzKartenArtID_F ) " & _
" SELECT " & rs!SpielID & ", 39"
db.execute strsql, 128
rs.movenext
Loop
rs.close: set rs = nothing
Set db = nothing
End Sub
Eberhard packt das sicher noch einfacher, aber für einen Anfänger dürfte diese Lösung leichter zu überblicken sein.
Achja - und an dem Datenmodell gibt es nix auszusetzen ;)
Hallo Jürgen,
danke für die Erklärungen. Noch einfacher kann man alles machen, ob es dann aber wirklich noch human readable bleibt ist wie du schon sagst oft unklar :). Danke fürs nachdenken und die Lösung. Das mit dem Datenmodell passt wirklich ziemlich gut, da die Forumsmitglieder (insbesondere Klaus und MaggieMay) sich hier beim entwerfen stark involviert hatten und somit auf das machbare und wesentliche geschaut haben.
Gruß Andreas
PS: Ich glaube, dass du mir bei dem hier auch den fehlenden Tip geben könntest, ist im Ansatz dem Thema hier ähnlich, nur dass es um eine Standardvorgabe geht (für das gleiche Feld übrigens)! http://www.access-o-mania.de/forum/index.php?topic=22413.0 (http://www.access-o-mania.de/forum/index.php?topic=22413.0)