Hallo Josef,
danke für die schnelle Antwort.
BTW:
CODE: ALLES AUSWÄHLEN
strSQL = ExecuteParamQdf(...)
"strSQL" als Variablenname finde ich nicht sehr aussagekräftig für die Anzahl der Datensätze.
Ja, Josef, das ist ein Überbleibsel meines ursprünglichen VBA-Programms.
Vielleicht in diesem Zusammenhang noch eine kurze Hintergrundinfo zum Arbeitsablauf:
Das Anfügen oder Ändern von Datensätzen an die bzw. in der Tabelle
tabtest soll ausschließlich mit Hilfe eines Formulars erfolgen.
Die Formularmaske, welche ich für ein anderes Projekt im Rahmen eines Workshops vor einigen Jahren gebaut und jetzt für mein aktuelles Projekt angepasst habe, enthält dazu ein Listenfeld, welches die Datensätze der Tabelle
tabtest auflistet. Damals wurde im VBA-Programm ein zusammengesetzter SQL-Code "gestrickt" . Das war nicht besonders professionell, sondern diente Übungszwecken. Und daher rührt auch der Variablenname, den ich aus Bequemlichkeit weiterverwendet habe.
Im Formular konnte ich einen Datensatz auswählen, den ich dann mittels "Ändern"-Button bearbeiten und abspeichern konnte.
Jetzt will ich aber das Formular und das VBA-Programm mit Eurem "Code-Schnipsel" professionalisieren.
Den Wert für
FilterID müsste ich ja von Hand eingeben. Und in meinem Formular wird - bewußt - das Schlüsselfeld
D_ID nicht angezeigt. Somit weiß ich nicht, welchen Wert ich für
FilterID eingeben muss.
Ich könnte natürlich neben dem von Access generierten Schlüsselfeld
D_ID auch das Feld
D_InvNr verwenden, welches ebenfalls eindeutig ist. Hier müßte ich allerdings noch Vorkehrungen treffen, um Doppelvergaben u.ä. Fehler abzufangen.
Meine Idee für die neue Lösung mit der Funktion
ExecuteParamSQL() bestand darin, die ID des ausgewählten Datensatzes
automatisch in die WHERE-Klausel zu übergeben.
Ergänzung 9.1.2020, 11.35 Uhr:Ich habe Deinen Lösungsansatz in mehreren Schritten umgesetzt.
Schritt 1:
Wenn ich nur die Änderungsabfrage
abfParaTestUpdate ausführe und alle Parameter P1 bis FilterID von Hand eingebe, funktioniert die Sache.
Hier die Syntax der Abfrage:
- Code: Alles auswählen
PARAMETERS P1 Long, P2 Text ( 255 ), P3 Text ( 255 ), P4 DateTime, P5 DateTime, P6 DateTime, P7 DateTime, P8 DateTime, FilterID Long;
UPDATE tabTest SET tabTest.D_InvNr = P1, tabTest.D_INTERPRET = P2, tabTest.D_TITEL_LP_CD = P3, tabTest.D_KAUFDATUM = P4, tabTest.D_LP_Reinigung = P5, tabTest.D_LP_DIGI = P6, tabTest.D_DIGI_FLAC_WAV = P7, tabTest.D_DIGI_MP3 = P8
WHERE tabTest!D_ID = [FilterID];
Schritt 2:
Gehe ich über das Formular, bringt Access mir zunächst einen Fehler, weil ich zuwenig Parameter an die Funktion
ExecuteParamQdf übergebe.
![Fehlermeldung 3061.png](./download/file.php?id=88&sid=6a8b1defa648095f14cfb803e40a43ea)
- Fehlermeldung 3061.png (2.57 KiB) 68286-mal betrachtet
Schritt 3:
Mit der Erweiterung
- Code: Alles auswählen
"FilterID", Me.lstDokumente.Column(0))
im Aufruf der Funktion
ExecuteParamQdf (den Namen der aufrufenden Variable habe ich in anzahlDS geändert
![Wink ;)](./images/smilies/icon_e_wink.gif)
) funktioniert es dann:
- Code: Alles auswählen
anzahlDS = ExecuteParamQdf("abfParaTestUpdate", _
"P1", Me.txtInvNr, "P2", Me.txtINTERPRET, "P3", Me.txtTITEL_LP_CD, "P4", Me.txtKAUFDATUM, "P5", Me.txtLP_Reinigung, _
"P6", Me.txtLP_DIGI, "P7", Me.txtDIGI_FLAC_WAV, "P8", Me.txtDIGI_MP3, "FilterID", Me.lstDokumente.Column(0))
Damit wird automatisch die Indexnummer des einzigen, zu ändernden Datensatzes in die Funktion übernommen und nur dieser Datensatz wird auch aktualisiert.
Danke für Eure Unterstützung!