Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: derilzemer am Mai 11, 2017, 18:06:26

Titel: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 18:06:26
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
Titel: Re: Aktualisierungsabfrage komplex
Beitrag 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

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 ;)
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: MzKlMu am Mai 11, 2017, 18:41:21
Hallo,
mir ist nicht ganz klar, mit welchem Wert das Feld aktualisiert werden soll.
Ist das Feld (das Grüne) z.Z. leer ?
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 18:56:49
Hallo Klaus,
ja das Feld im Ufo in den angesprochenen 1000 Datensätzen ist aktuell leer, siehe bild2.
Gruß Andreas
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 19:05:53
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
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: MzKlMu am Mai 11, 2017, 19:11:54
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.
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 19:32:39
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
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: MzKlMu am Mai 11, 2017, 19:45:19
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 !!!!!
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 20:03:23
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
Titel: Re: Aktualisierungsabfrage komplex
Beitrag 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.
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 20:54:19
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
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: el_gomero am Mai 11, 2017, 21:16:25
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?
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 22:28:11
Hallo Jürgen,
ja, die werden in der tblZusatzkartenArtZuSpiel gespeichert, korrekt.

Gruß Andreas
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: el_gomero am Mai 11, 2017, 22:43:22
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 ;)
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 11, 2017, 22:56:02
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
Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: el_gomero am Mai 12, 2017, 09:43:22
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 ;)

Titel: Re: Aktualisierungsabfrage komplex
Beitrag von: derilzemer am Mai 12, 2017, 10:45:30
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)