Ratschlag gesucht!!

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Fritz5
**
Beiträge: 20
Registriert: Do, 02.07.2009 15:15

Ratschlag gesucht!!

Beitrag von Fritz5 »

Hallo Experten, wer kann mir sagen, ob es in Base möglich ist, benutzerdefinierte Funktionen zu erstellen, die nicht nur aus Kombinationen von den eingebauten Funktionen bestehen, also z.B. Basic Macro Funktionen, die in Calc gut funktionieren? Ein Beispiel ist die Umrechnung einer Zahl in das entsprechende Wort (z.B. Eingabe: 12, Ausgabe: zwölf)

Wenn das möglich ist, wo finde ich eine "Gebrauchsanleitung" für die Erstellung und Anwendung solcher Funktionen?

Vielen Dank für jeden Rat!!

Gruß, Fritz
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Ratschlag gesucht!!

Beitrag von eBayer »

Natürlich geht das.... Du kannst beliebige Funktionen selbst entwickeln und dann in Deiner Anwendung verwenden... Mit Parameterübergabe oder ohne - ganz wie Du es brauchst.
ich denke, eine sehr gute Quelle für dieses Thema findest Du hier: http://www.pitonyak.org/oo.php

Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Fritz5
**
Beiträge: 20
Registriert: Do, 02.07.2009 15:15

Re: Ratschlag gesucht!!

Beitrag von Fritz5 »

Hallo eBayer, erst einmal vielen Dank für die schnelle Antwort mit der Mitteilung, dass mein Problem grundsätzlich in Base lösbar ist. Mit meinen noch etwas laienhaften Versuchen war ich erst einmal festgefahren. :(
Ich werde mich jetzt an den genannten Text heranmachen. Hoffentlich komme ich klar, wenn nicht.... dann werde ich hier wohl wieder fragen und hoffe auf Hilfe. Noch einmal vielen Dank und Gruß, Fritz
Fritz5
**
Beiträge: 20
Registriert: Do, 02.07.2009 15:15

Re: Ratschlag gesucht!!

Beitrag von Fritz5 »

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
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Ratschlag gesucht!!

Beitrag von eBayer »

Hallo Fritz,
so ist das mit ungenauen Fragestellungen.......
In Base kannst Du selbstverständlich eigene Funktionen erstellen...... aaaaaber in SQL ist das so nicht möglich!
SQL hat eine Menge eingebauter Funktionen, aber die selbst geschriebenen Funktionen sind für SQL nicht existent.
Schau Dir die Doku von der HSQLDB oder Deiner externen Datenbank an. Möglicherweise findest Du darin das was Du suchst.
Für die interne Datenbank HSQLDB: http://hsqldb.org/web/hsqlDocsFrame.html
Und hier was allgemeineres: http://sql.1keydata.com/de/

Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Fritz5
**
Beiträge: 20
Registriert: Do, 02.07.2009 15:15

Re: Ratschlag gesucht!!

Beitrag von Fritz5 »

Hallo eBayer, Dank für die Klarstellung. Dann weiß ich wenigstens, das meine Pläne so nicht aufgehen. Viele Grüße, Fritz
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ratschlag gesucht!!

Beitrag von komma4 »

Hallo Fritz,

in eine SQL-Abfrage lässt sich das nicht einbauen, aber...


Du möchtest Spendenquittungen erstellen (Info per PM)

Und Du verwendest Base...

Mein Vorschlag:
Erstelle Deine Abfrage und verknüpfe das Ergebnis mit einer Calc-Datei (ggfs. Vorlage).
Das füllt Dir bspw. die Spalte A bis C: id, SpenderID und Betrag
In Spalte D ziehst Du die benutzerdef. Funktion =ZWort( C1 ) runter.


Diese Daten nimmst Du als Quelle eines Serienbriefs.

Hilft Dir das weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Antworten