Hallo zusammen,
ich habe ein grosses Problem und komme irgendwie nicht weiter, vielleicht kann mir jemand von euch helfen?
Hier der Quellcode der leider nicht funktioniert :-(
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim rstMyAql As DAO.Recordset
Dim strKdNr As String
Set db = CurrentDb
Set rst = db.OpenRecordset("Analyse", dbOpenDynaset)
Set rstMyAql = db.OpenRecordset("kundenbestand", dbOpenDynaset)
rst.MoveFirst
Do Until rst.EOF
rstMyAql.Filter = adFilterNone
strKdNr = rst!Kundennummer
rstMyAql.Filter = "Vernum = '" & strKdNr & "'"
If rstMyAql.EOF And rstMyAql.BOF Then
rst!Beitrag= 0
Else
rst!Beitrag= rstMyAql!Beitrag
End If
rst.Update
rst.MoveNext
Loop
rst.Close
rstMyAql.Close
Wie Ihr seht versuche ich mehrer Kunden die in der Tabelle Analyse stehen
mit Daten aus der Tabelle Kundenbestand zu aktualisieren, aber es funktioniert
nicht.
Hallo,
Zitataber es funktioniertnicht.
ein Hinweis auf Fehlermeldungen oder sonstiges Fehlverhalten wäre schon sinnvoll.
wie oft kann die Kundennummer in rstMyAql vorhanden sein? Wenn es nur einmal ist, könntest du suchen anstatt zu filtern. Außerdem vermischst du da offenbar DAO mit ADO.
Des weiteren könntest du beide Tabellen nach Kundennummer sortiert lesen und dich mit FindNext durch das Recordset hangeln.
Vor einem rst.Update sollte es ein rst.Edit geben.
Das sind so die Sachen die mir auf Anhieb aufgefallen sind.
Hallo Maggie May,
sorry das rst.Edit habe ich vergessen zu kopieren, das steht da, es kommt auch keine Fehlermeldung
und wenn ich Debug.Print mache hat er auch immer eine neue Kundennummer, aber updaten will er
immer 14,90€, obwohl die da gar nicht stehen :-(
Die Kundennummer ist in jeder Tabelle nur einmal vorhanden, nur den Beitrag möchte ich aus der
Kundentabelle in die Analyse einfügen.
Könntest du mir ein Beispiel geben wie ich es am geschicktesten machen kann, aber bitte keine
Abfrage.
Zitatdas rst.Edit habe ich vergessen zu kopieren
Wie kann man eine einzelne Zeile aus einer Code-Block "vergessen" zu kopieren??
Aber warum machst du das eigentlich nicht mit einer Aktualisierungsabfrage, das wäre doch die einfachste Lösung.
Beispiel:
Update Analyse As A INNER JOIN kundenbestand As K
ON A.Kundennummer = K.vernum
SET A.Beitrag= K.Beitrag
Hallo,
statt dem Recordset-Gegurke:
Update Analyse inner join Kundenbestand
on Analyse.Vernum = Kundenbestand.Kundennummer
set Analyse.Beitrag = Kundenbestand.Beitrag
@Franz:
geht das auch mit einem Left Join, um die Beiträge ggfls. löschen zu können?
Hallo,
sicherlich....
Update Analyse Left join Kundenbestand
on Analyse.Vernum = Kundenbestand.Kundennummer
set Analyse.Beitrag = 0
Where Kundennummer is Null
Hi,
die Syntax ist mir schon klar, ich wollte nur wissen ob das auch ausführbar ist, da Aktualisierungsabfragen manchmal ein bißchen rumzicken. ;-)
Außerdem dachte ich da eher an eine "All-In-One"-Abfrage ala:
Update Analyse Left Join Kundenbestand
On Analyse.Kundennummer = Kundenbestand.Vernum
Set Analyse.Beitrag = IIF(Kundenbestand.Vernum Is Null, 0, Kundenbestand.Beitrag)
BTW:
ZitatWie Ihr seht versuche ich mehrer Kunden die in der Tabelle Analyse stehen
mit Daten aus der Tabelle Kundenbestand zu aktualisieren
Was wir in deinem Code sehen ist eher der umgekehrte Fall.
Wie herum soll es denn nun tatsächlich sein?
Hallo,
ausführbar ist die Akt-Abfrage mit dem left join schon...
Inwieweit sich aber die IIF-Konstruktion als Performance-Bremse auswirkt, kann ich nicht sagen.
Löschen und auf 0 setzen können sehr verschiedene Dinge sein.
Null ... heißt unbekannt. Das kann etwas ganz anderes als 0 sein, z.B. bei Schulden.
Auch: Wenn man eine Tabelle über eine andere Tabelle aktualisiert, macht meiner Meinung nach nur ein INNER JOIN Sinn, da man für eine Aktualisierung jeweils eine Entsprechung Quell- zu Zieldatensatz benötigt. Alles andere wären Konstanten, die man auch in einer zusätzlichen Abfrage abhandeln kann.