von Fritz5 » Fr, 20.11.2009 15:36
Hallo eBayer, ich bin doch nicht mit der nutzerdefinierten Funktion weitergekommen. Um zu erklären was, mein Problem ist, hier ein stark vereinfachtes Beispiel:
In einer Tabelle:
ID Zahl
1 25
2 6,15
soll auf die Spalte "Zahl" eine Funktion angewandt werden und das Ergebnis in einer neuen Spalte gezeigt werden. Mit vorgegebenen Funktionen aus Base geht das problemlos, z.B. mit der Wurzelfunktion SQRT. Mit
SELECT "ID", "Zahl", SQRT( "Zahl" ) AS "Wurzel" FROM "TestTabelle" AS "TestTabelle"
ergibt sich das gewünschte Abfrageergebnis:
ID Zahl Wurzel
1 25 5
2 6,15 2,48
Dasselbe Vorgehen mit mit der Abfrage
SELECT "ID", "Zahl", ZWort( "Zahl" ) AS "Zahl_in_Wort" FROM "TestTabelle" AS "TestTabelle"
wobei ZWort die unten angegebene nutzerdefinierten Funktion ist , führt zu einer Fehlermeldung. Die Funktion ZWort funktioniert in calc einwandfrei.
Nach allen Recherchen habe ich jetzt den Eindruck, dass nutzerdefinierte Funktionen in Abfragen doch nicht eingesetzt werden können. Oder habe ich etwas falsch gemacht??
Viele Grüße, Fritz
Hier die Funktion ZWort:
____________________________________________________________
'In Anlehnung an eine Klassenprogrammierung von Hans W. Hofmann
Function ZWort(dZahl As Double, Optional bln As Boolean)
'bln nicht angegeben: "xx/00" wird angegeben. bln = 0: Bruchteilangabe
'wird unterdrückt
Dim dRest As Double
dRest = Fix((dZahl - Fix(dZahl)) * 100 +0.5)
dZahl = Fix(dZahl)
BisNeunzehn = Array("", "ein", "zwei", "drei", "vier", _
"fünf", "sechs", "sieben", "acht", "neun", "zehn", _
"elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", _
"sechzehn", "siebzehn", "achtzehn", "neunzehn")
Zehner = Array("", "zehn", "zwanzig", "dreißig", _
"vierzig", "fünfzig", "sechzig", "siebzig", _
"achtzig", "neunzig")
Tausender = Array("", "tausend", "millionen", "milliarden")
If dRest = 0 Then
ZWort = Textt(dZahl)
Else
If bln Then
ZWort = Textt(dZahl) & " " & dRest & "/00"
Else
ZWort = Textt(dZahl)
End If
End If
End Function
Private Function Wort(wert As Integer) As String
Dim h As Integer
h = wert Mod 100
If h < 20 Then
Wort = BisNeunzehn(h)
Else
Wort = BisNeunzehn(h Mod 10) & IIf(h Mod 10 > 0, "und", "") & _
Zehner(Int(h / 10))
End If
h = (wert Mod 1000 - h) / 100
If h > 0 Then Wort = BisNeunzehn(h) & "hundert" & Wort
End Function
Private Function Textt(wert As Double)
Dim l As Integer, i As Integer, p As Integer
If InStr(1, Str(wert), ",") = 0 And InStr(1, Str(wert), ".") = 0 Then
For i = 1 To 1 + Int(Len(Str(wert)) / 3)
p = Val("0" & Mid("000" & Str(wert), _
Len("000" & Str(wert)) - i * 3 + 1, 3))
If p > 0 Then Textt = Wort(p) & Tausender(i - 1) & Textt
Next
Else
Textt = "#Ganzzahl!"
End If
If Right(Textt, 3) = "ein" Then Textt = Textt & "s"
End Function
Hallo eBayer, ich bin doch nicht mit der nutzerdefinierten Funktion weitergekommen. Um zu erklären was, mein Problem ist, hier ein stark vereinfachtes Beispiel:
In einer Tabelle:
ID Zahl
1 25
2 6,15
soll auf die Spalte "Zahl" eine Funktion angewandt werden und das Ergebnis in einer neuen Spalte gezeigt werden. Mit vorgegebenen Funktionen aus Base geht das problemlos, z.B. mit der Wurzelfunktion SQRT. Mit
SELECT "ID", "Zahl", SQRT( "Zahl" ) AS "Wurzel" FROM "TestTabelle" AS "TestTabelle"
ergibt sich das gewünschte Abfrageergebnis:
ID Zahl Wurzel
1 25 5
2 6,15 2,48
Dasselbe Vorgehen mit mit der Abfrage
SELECT "ID", "Zahl", ZWort( "Zahl" ) AS "Zahl_in_Wort" FROM "TestTabelle" AS "TestTabelle"
wobei ZWort die unten angegebene nutzerdefinierten Funktion ist , führt zu einer Fehlermeldung. Die Funktion ZWort funktioniert in calc einwandfrei.
Nach allen Recherchen habe ich jetzt den Eindruck, dass nutzerdefinierte Funktionen in Abfragen doch nicht eingesetzt werden können. Oder habe ich etwas falsch gemacht??
Viele Grüße, Fritz
Hier die Funktion ZWort:
____________________________________________________________
'In Anlehnung an eine Klassenprogrammierung von Hans W. Hofmann
Function ZWort(dZahl As Double, Optional bln As Boolean)
'bln nicht angegeben: "xx/00" wird angegeben. bln = 0: Bruchteilangabe
'wird unterdrückt
Dim dRest As Double
dRest = Fix((dZahl - Fix(dZahl)) * 100 +0.5)
dZahl = Fix(dZahl)
BisNeunzehn = Array("", "ein", "zwei", "drei", "vier", _
"fünf", "sechs", "sieben", "acht", "neun", "zehn", _
"elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", _
"sechzehn", "siebzehn", "achtzehn", "neunzehn")
Zehner = Array("", "zehn", "zwanzig", "dreißig", _
"vierzig", "fünfzig", "sechzig", "siebzig", _
"achtzig", "neunzig")
Tausender = Array("", "tausend", "millionen", "milliarden")
If dRest = 0 Then
ZWort = Textt(dZahl)
Else
If bln Then
ZWort = Textt(dZahl) & " " & dRest & "/00"
Else
ZWort = Textt(dZahl)
End If
End If
End Function
Private Function Wort(wert As Integer) As String
Dim h As Integer
h = wert Mod 100
If h < 20 Then
Wort = BisNeunzehn(h)
Else
Wort = BisNeunzehn(h Mod 10) & IIf(h Mod 10 > 0, "und", "") & _
Zehner(Int(h / 10))
End If
h = (wert Mod 1000 - h) / 100
If h > 0 Then Wort = BisNeunzehn(h) & "hundert" & Wort
End Function
Private Function Textt(wert As Double)
Dim l As Integer, i As Integer, p As Integer
If InStr(1, Str(wert), ",") = 0 And InStr(1, Str(wert), ".") = 0 Then
For i = 1 To 1 + Int(Len(Str(wert)) / 3)
p = Val("0" & Mid("000" & Str(wert), _
Len("000" & Str(wert)) - i * 3 + 1, 3))
If p > 0 Then Textt = Wort(p) & Tausender(i - 1) & Textt
Next
Else
Textt = "#Ganzzahl!"
End If
If Right(Textt, 3) = "ein" Then Textt = Textt & "s"
End Function