Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Ergebnis aus Funktionsaufruf für Anfügeabfrage verwenden

Begonnen von DieterEsser, August 28, 2024, 19:03:12

⏪ vorheriges - nächstes ⏩

DieterEsser

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

MzKlMu

Hallo,
kompiliere die Funktion im VBA Editor.
Ist die Zeile
Option ExplicitIm Modulkopf vorhanden ?

Zeige mal die Funktion.
Gruß Klaus

Bitsqueezer

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

DieterEsser

Hallo
erst einmal Danke.

Wenn ich aber die Funktion eingebe
Sie dürfen in diesem Board keine Dateianhänge sehen.
und die Zeile verlasse, dann setzt er sofort den Text "AUSDR1" davor
Sie dürfen in diesem Board keine Dateianhänge sehen. 

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.
Sie dürfen in diesem Board keine Dateianhänge sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen.   

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
 

MzKlMu

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.
Gruß Klaus

Bitsqueezer

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

DieterEsser

Hallo,
erst einmal herzlichen Dank an Euch beide.
Ich werde es heute Abend mal testen.

Gruß
Dieter

DieterEsser

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.