In Update eine Funktion aufrufen

Hallo,

kann man eine Funktion die für jeden Datensatz ausgeführt werden soll in einem Update verwenden? Bei der Funktion siehe unten wird im Update die Funktion „Fuellen“ nur einmal aufgerufen und nicht für jeden DS?! Ist das nicht anders möglich???

Function Ausfuellen(Nr)

Bezeichnung1 = „Prospekt“ & Nr
Bezeichnung2 = „Stückzahl“ & Nr

CurrentDb.Execute „UPDATE Tourenabfrage SET " & Bezeichnung1 & = '“ & Me!(Bezeichnung1) & „’, & Bezeichnung2 & " = '“ & Fuellen(Nr) & „’ WHERE Tourenplan=“ & Me!Tourenplan


End Function

Danke, Thomas

Hallo,

kann man eine Funktion die für jeden Datensatz ausgeführt
werden soll in einem Update verwenden?

klar geht das…

Bei der Funktion siehe
unten wird im Update die Funktion „Fuellen“ nur einmal
aufgerufen und nicht für jeden DS?!

Das stimmt nicht: Die Funktion wird VOR (bzw. BEI) dem Zusammenbau des SQL-Strings einmal aufgerufen. Der Rückgabewert der Funktion wird in den SQL-String eingesetzt und erst dann wird das Update (für alle betroffenen DS) ausgeführt, eben mit diesem einen Funktionswert.

Ist das nicht anders

möglich???

Schon…

Wenn der Rückgabewert für jeden DS individuell berechnet werden soll, dann muss die Funktion INNERHALB des SQL-Strings stehen

Wobei in dieser Programm-Logik gar keine Variation von „NR“ vorhanden ist („NR“ ist kein Feld aus/in der Abfrage „Tourenabfrage“, falls ich das richtig sehe)

Insgesamt verstehe ich das eigentliche Vorhaben nicht…

Function Ausfuellen(Nr)

Bezeichnung1 = „Prospekt“ & Nr
Bezeichnung2 = „Stückzahl“ & Nr

Hier ist NR ein Funktionsargument, kein Tabellen/Abfragefeld

CurrentDb.Execute „UPDATE Tourenabfrage SET " & Bezeichnung1 &
= '“ & Me!(Bezeichnung1) & „’, & Bezeichnung2 & " = '“ &
Fuellen(Nr) & „’ WHERE Tourenplan=“ & Me!Tourenplan


End Function

Wenn es ein Feld "NR in „Tourenabfrage“ gäbe, dann sähe das so aus:

CurrentDb.Execute „UPDATE Tourenabfrage SET " & [Bezeichnung1] &
= '“ & Me!Bezeichnung1 & „’, & [Bezeichnung2] & " = Fuellen([Nr]) WHERE Tourenplan=“ & Me!Tourenplan

Viele Grüße vom Bodensee
Franz, DF6GL

Der Wert „Nr“ trägt die Zahlen (1-10), je nachdem welcher Button im Formular gedrückt wird. Und mit dieser „Nr“ soll dann meine „Tourenabfrage“ durchlaufen werden.

Hallo Franz,

hier nochmal die komplette Routine, habe versucht das so anzupassen, wie du es meinst:

----- zuerst die Funktion die eine Menge berechnet---------
Function Fuellen(Pos, TMengeN, TMengeG, TMengeV)

Bezeichnung1 = „TProspekt“ & Pos
Bezeichnung2 = „TStückzahl“ & Pos

If DLookup("[PTypZ]", „Prospektdaten“, Bezeichnung1 & " = PBezeichnung") = -1 Then
Fuellen = TMengeN + TMengeG + TMengeV 'Zeitung für alle
End If
If DLookup("[PTypP]", „Prospektdaten“, Bezeichnung1 & " = PBezeichnung") = -1 Then
Fuellen = TMengeN 'Prospekte nur für normale Haushalte
End If
If DLookup("[PTypI]", „Prospektdaten“, Bezeichnung1 & " = PBezeichnung") = -1 Then
Fuellen = TMengeN + TMengeG + TMengeV 'Infozettel für alle
End If
Me.Refresh

End Function

------------hier das Update, welches aus einer Funktion aufgerufen wird-------------

Function Ausfuellen(Nr)
Bezeichnung1 = „TProspekt“ & Nr
Bezeichnung2 = „TStückzahl“ & Nr

If Me.FilterOn Then
CurrentDb.Execute "UPDATE Tourenabfrage gefiltert SET " & Bezeichnung1 & „= '“ & Me(Bezeichnung1) & „’, & [Bezeichnung2] & " = Fuellen(Nr, [TMengeN], [TMengeG], [TMengeV]) & " WHERE TTourenplan=“ & Me!TTourenplan

Me.Requery
End If
End Function

-----------Hier der Aufruf, ausgelöst durch einen der zehn Button------

Private Sub Ausfuellen3_Click()
Call Ausfuellen(„03“)
End Sub

Jetzt stellt sich dir sicher die Frage wie das ganze funktionieren soll:

Das Formular hat 10 Zeilen in denen man jeweils ein Prospekt auswählen kann und per Knopfdruck soll z.B. das Prospekt in Zeile 1 in alle anderen Datensätze der Tourenabfrage auch auf Position 1 kopiert werden. Das klappt auch schon, die Schwierigkeit ist, dass es noch eine Stückzahl gibt. Diese muss bei jedem DS einzeln berechnet werden. Ich glaub das ist ganz schön kompliziert zu erklären…
Die Berechnung der Stückzahl ist dann noch vom Typ des Prospektes abhängig, deshalb die Funktion ganz oben…

Hallo,

sorry, aber da durchblick ich die Datenverhältnisse nicht so ganz…

Fakt ist, dass Deine Update-Abfrage die selbe Zahl bei allen DS aktualisiert, für die TTourenplan zutrifft (sofern Du die Syntaxfehler darin ausmerzt)

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo Franz,

das hab ich mir schon fast gedacht, ist halt sehr verschachtelt…
Aber ich glaube das klappt auch nicht, er ruft in meinem Update
generell nur einmal die Funktion auf, deshalb steht überall der selbe
Wert drin!
Hier mal ein ganz einfaches Beispiel, was mein Problem verdeutlicht:

Die Werte (a,b) sind bei jedem DS anders und bereits vorhanden, nur der Preis soll mit der Funktion berechnet und eingetragen werden.
Ich habe folgende Spalten in der Tabelle (Preis,a,b) und die folgenden Updates sollen laufen (1-letzten DS) am besten in einer Schleife!!!

CurrentDb.Execute „UPDATE Tabelle SET Preis=“ & FktBerechnung(a,b) & " WHERE Id =" & Me!ID (1. DS)

CurrentDb.Execute „UPDATE Tabelle SET Preis=“ & FktBerechnung(a,b) & " WHERE Id =" & Me!ID (2. DS)

CurrentDb.Execute „UPDATE Tabelle SET Preis=“ & FktBerechnung(a,b) & " WHERE Id =" & Me!ID (3. DS)

CurrentDb.Execute „UPDATE Tabelle SET Preis=“ & FktBerechnung(a,b) & " WHERE Id =" & Me!ID (4. DS)

CurrentDb.Execute „UPDATE Tabelle SET Preis=“ & FktBerechnung(a,b) & " WHERE Id =" & Me!ID (5. DS)

Baue ich alles in eine UpdateAbfrage, wird die Funktion nur einmal aufgerufen und somit steht überall der erste Wert.

Hallo,

habe ich doch erklärt, dachte ich…

Du darfst die Funktion nicht AUSSERHALB des SQL-Strings (also innerhalb VBA) aufrufen und mit dem Rückgabewert den SQL-String zusammenbauen, sondern sie muß Bestandteil der Abfrage selber sein:

CurrentDb.Execute „UPDATE Tabelle SET Preis = FktBerechnung([a],[b]) WHERE Id =“ & Me!ID (1. DS)

Nur „darin“ sind die Felder „a“ und „b“ bekannt und deren Werte werden aus den einzelnen Datensatzfeldern der Tabelle entnommen…

Viele Grüße vom Bodensee
Franz, DF6GL

PS:

Voraussetzung ist, dass die Funktion als Public deklariert in einem Standard-Modul steht.

Hallo Franz,

der letzte Eintrag war die Lösung :smile: ich hab die Funktion in ein Modul gepackt und als Public deklariert… das war mein Fehler!!!
Aber eine Frage noch, kann ich irgendwie einen externen Wert (Zähler)an die Public Funktion übergeben, er nimmt bis jetzt nur die Werte die in der DB stehen. Hab auch schon versucht die Variable (nr) global zu machen…

So in etwa:
Fuellen([TMengeN],[TMengeG],[TMengeV],nr)

Nochmal Danke für den Tipp mit der Public Function :wink:
Thomas

Hallo,

deklariere „Nr“ als Public Variable in einem Standardmodul (wie eben die Funktion) und benutze sie einfach in der Funktion… und ohne die Parameterliste zu bemühen.(Aus einem SQL-String (Abfrage) heraus kannst Du nicht ohne weiteres auf einen globalen Variablennamen verweisen)

Viele Grüße vom Bodensee
Franz, DF6GL