Hallo, ist es möglich in einer Anfügeabfrage eine Funktion aus einem Modul aufzurufen und das Ergebnis für das Anfügen in ein Feld zu nutzen?
In einem Modul ist eine Funktion GetUID, die einen eindeutigen Code erzeugt.
Wenn ich jetzt aber bei Feld eintrage "Ausdr1: GetUID()" dann kommt "Fehler beim Kompilieren dieser Funktion"
Danke für Eure Unterstützung
Gruß
Dieter
Hallo,
kompiliere die Funktion im VBA Editor.
Ist die Zeile
Option Explicit
Im Modulkopf vorhanden ?
Zeige mal die Funktion.
Hallo,
in einer INSERT-Abfrage mußt Du ja das zugehörige Feld mit angeben. Wenn Du als Feld "Ausdr1: GetUID()" verwendest, dann ist GetUID() der Name Deines Feldes und "Ausdr1" der Alias zu dem Feldnamen. Kann daher natürlich nicht funktionieren.
GetUID muß also in der Werteliste verwendet werden.
Einfach das Feld auswählen in der Designansicht und als Wert, der angefügt werden soll, GetUID() verwenden.
GetUID muß natürlich eine Public Function in einem Standardmodul sein, alles Andere kann von SQL nicht aufgerufen werden.
Gruß
Christian
Hallo
erst einmal Danke.
Wenn ich aber die Funktion eingebe
Bild1.png
und die Zeile verlasse, dann setzt er sofort den Text "AUSDR1" davor
Bild2.png
Ich habe dann die Anweisung mal in eine Auswahlabfrage eingegeben. Zusätzlich habe ich versucht eine fortlaufende Nummer zu erzeugen. Hier funktioniert es, aber es steht in jeder Zeile die gleiche GUID und die gleiche Nummer.
Bild3.png
Bild4.png
Hier mal der Code der Funktion:
Option Explicit
Option Compare Database
Public Declare PtrSafe Function C_API_CoCreateGuid Lib "ole32" Alias "CoCreateGuid" (ID As Any) As Long
Public Function CAL_GetUID() As String
Dim bArr(0 To 15) As Byte
Dim i As Long
Dim sTemp As String
Dim sChar As String
Dim sUID As String
On Error Resume Next
Const S_OK As Long = 0
If C_API_CoCreateGuid(bArr(0)) = S_OK Then
For i = 0 To 15
sUID = sUID & IIf(bArr(i) < 16, "0", "") + Hex$(bArr(i))
Next i
For i = 1 To Len(sUID)
sChar = Mid(sUID, i, 1)
sTemp = sTemp & Asc(sChar)
Next
CAL_GetUID = sTemp
End If
End Function
Hallo,
@ Christian
ZitatWenn Du als Feld "Ausdr1: GetUID()" verwendest, dann ist GetUID() der Name Deines Feldes und "Ausdr1" der Alias zu dem Feldnamen.
Das kann ich nicht verstehen. Das ist doch für eine Anfügeabfrage richtig und funktioniert problemlos.
Ich habe das getestet in SQL sieht das so aus:
INSERT INTO Daten ( Textfeld )
SELECT fncTest() AS Ausdr1
Fügt den Rückgabewert der Funktion als neuen Datensatz an.
Siehe Bild.
Hallo,
am besten in SQL zeigen, so wie Klaus es geschrieben hat, ist es OK.
Das mit der gleichen Nummer liegt daran, daß der Optimizer die Funktion nur einmal aufruft, wenn keine Parameter übergeben werden, die sich auf den aktuellen Datensatz beziehen. Auf diese Weise optimiert er die Abfrage, weil er es so nur einmal für alle Datensätze aufrufen muß.
Als Abhilfe übergibst Du einfach ein beliebiges Feld aus der Quelltabelle als Parameter (den Du der Funktion hinzufügen mußt, z.B. "varDummy As Variant") und änderst in der Abfrage z.B. "GetUID([MeinPKFeld])". Dann solltest Du für jede Zeile eine eigene GUID erhalten.
Für eine INSERT-Abfrage, die feste Werte verwendet, also nicht INSERT...SELECT (was mehrere Datensätze einfügen kann), sondern INSERT..VALUES benötigst Du das nicht, weil Du dann ja nur eine Zeile einfügen kannst (in SQL Server geht VALUES auch mit mehreren Zeilen, in Access SQL nicht).
Bei INSERT...SELECT ist im Designer der Quellwert natürlich aus einer Quelltabelle, daher unter "Feld" dann schon richtig und auch der automatische Alias.
Gruß
Christian
Hallo,
erst einmal herzlichen Dank an Euch beide.
Ich werde es heute Abend mal testen.
Gruß
Dieter
Hallo nochmal,
als das mit der GUID und dem Pseudofeld funktioniert. Bekomme jetzt für jeden Datensatz eine unterschiedliche GUID.
Was nicht funktioniert ist über DOMANZAHL den Autowert pro Satz hochzuzählen.
Hier habe ich jetzt eine eigene Funktion erstellt, mit der ich das manuell mache.
Das Ganze habe ich jetzt noch in ein Formular über einen Button per SQL-Anweisung eingebaut:
lngNew = 0
DoCmd.RunSQL "SELECT Cal_GetUID([tArt]) AS Ausdr1, GetNextAutoNumValue([tArt]) AS Ausdr2, TAB220_Kalendertermine.tDate, TAB220_Kalendertermine.tCaption INTO Test " & _
"FROM TAB220_Kalendertermine;", False
Jetzt bekomme ich die Daten, die ich benötige.
Danke.