ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

Hallo,
bin neu hier und auch im Programmieren von Makros in ooBase (wohl irrtümlich habe ich die Frage auch im OpenOffice-Forum.de gestellt, aber bisher keine Antwort erhalten).

Habe folgende Probleme:
1. Datumabfrage, 2. Währungseingabe
zu 1. Datumabfrage
- Datenbank (DB) erstellt mit u.a. einer Zelle "DATUM", in die über das Eingabeformular ein Datum eingegeben werden soll.
- beim "Laden" des Eingabeformulars wird zuerst der letzte Datensatz aus der DB eingelesen. Die entsprechende Zelle ist ein Datumsfeld mit dem Namen "fDatum" und der Eigenschaft Datenfeld = DATUM.
Grund: will eine jahresabhängige lfdNr erstellen d.h. wenn sich das Jahr ändert, soll wieder bei 1 begonnen werden.
Nach dem Auslesen wird eine neue "Row" (Datensatz) eingelesen, der dann bearbeitet wird.
- habe für das Formular entsprechende Makros programmiert, die alle funktionieren mit Ausnahme des Auslesens des Datums aus dem letzten Datensatz.

Meine SUB:

SUB Daten ermitteln
DIM oDoc AS OBJECT, oDrawpage AS OBJECT, oForm AS OBJECT, oFeld AS OBJECT
DIM stJahr as Long, stName as Long, intFeld as integer, intJahr as Integer
' DIM unoDate AS NEW com.sun.star.util.Date

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Eingabe")
oForm.last 'geht zur letzten Zeile der Datenbank
REM alte lfdNr auslesen und speichern
stName = oForm.findColumn("mlfdnr") ' Name des KFeldes flfdnr mit den Daten=mlfdnr (in DB)
intFeld = oForm.getInt(stName)
!!!!!! bis hierher funktioniert alles, mit intFeld kann ich arbeiten !!!!!!!!!
REM altes Datum auslesen, Jahr ermitteln
stName = oForm.findColumn("Datum") ' Name des KFeldes fDatum mit Daten=DATUM (in DB)
stJahr = oForm.getDate(stName) '!!!! Fehler: Falscher Wert bei Eigenschaft !!!!
msgbox stJahr

REM neue Zeile einfügen
oForm.MoveToInsertRow()
.......
END SUB

Habe für stJahr bereits getString, getDouble probiert aber immer die gleiche Fehlermeldung erhalten.


zu 2. Das zweite Problem ist die Eingabe eines Währungsbetrages in ein Währungsfeld. Obwohl ich Währung mit 2 Nachkommastellen ausgewählt habe (Eigenschaften in Datenbank und Eingabeformular) und im Eingabeformular der Währungsbetrag auch korrekt eingegeben und angezeigt wird (zB 23,89€) steht in der Datenbank nur 23,00€.

Was mache ich in beiden Fällen falsch??

Gruß Frewer
Nach oben
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von RobertG »

Hallo Frewer,

ich hoffe, dass es sich bei dem Fehler nicht um den Unterschied zwischen OpenOffice und LibreOffice handelt. In LibreOffice gilt seit der Version LO 4.1.2 nämlich:
LO 4.1.2
Der Zugriff auf Datumswerte mit Makros in Formularen wurde geändert. Der Datumswert wird jetzt im Datumsfeld als eine Kombination von Tag, Monat und Jahr wiedergegeben und nicht als ISO-Zahlenwert: oFeld.CurrentValue.Year ist so z.B. die Jahresangabe.
Wenn Du das Jahr auslesen möchtest, dann erhältst Du zuerst einmal eine Datumsvariable:
In Basic selbst werden Datums- und Zeitwerte einheitlich mit dem Datentyp DATE verarbeitet. Für den Zugriff auf die Datenmenge gibt es verschiedene Datentypen: com.sun.star.util.Date für ein Datum, com.sun.star.util.Time für eine Zeit, com.sun.star.util.DateTime für einen Zeitstempel.
Das Ergebnis ist also aus oForm.getDate(stName) auf jeden Fall eine Date-Format, nicht eine Variable des Typs Long, Double etc.

... und das zweite Problem würde ich zuerst einmal in der Tabelle testen. Manchmal wird dort der Fehler gemacht, nur die Formatierung in der Tabelle zu ändern, nicht aber die Eigenschaften des Feldes (Decimal oder Numeric mit 2 Nachkommastellen - standardmäßig auf 0 Nachkommastellen eingestellt im Tabelleneditor ...).
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

vielen, vielen Dank RobertG, beide Probleme sind gelöst.
1. OpenOffice 4.1.3
2. es funktioniert mit "DIM unoDate AS NEW com.sun.star.util.Date"
3. in der DB sowie im Formblatt hatte ich ein Dezimalfeld mit der Eigenschaft "Formelbeispiel" mit Währung gewählt und dort bei der Formatierung auch 2 Nachkommastellen angegeben, nicht aber in der DB die Eigenschaft "Nachkommastellen" auf 2 gestellt. Ist jetzt im Kopf.

Noch eine Frage:
bei ACCESS konnte ich beim Öffnen einer Datenbank mit "Autoexec" automatisch ein sog "Hauptformular" öffnen und von da aus weitergehen. Geht das bei ooBase auch?

Gruß Frewer
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von RobertG »

Hallo Frewer,

ich antworte einmal mit einem Auszug aus dem Base-Handbuch. Ist auch für Leute mit OpenOffice in den meisten Fällen nutzbar:
Das folgende Makro wird über Extras → Anpassen → Ereignisse → Dokument öffnen gestartet. Dabei ist Speichern in → Datenbankdatei.odb zu wählen.

Code: Alles auswählen

SUB Formular_Direktstart
DIM oDatenquelle AS OBJECT
oDatenquelle = ThisDatabaseDocument.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
ThisDatabaseDocument.FormDocuments.getByName("Formularname").open
REM alternativ geht auch:
'oDatenquelle.loadComponent(com.sun.star.sdb.application.DatabaseObject.FORM,
"Formularname",FALSE)
END SUB
gruß

Robert
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

nochmals vielen Dank. Werde das Base Handbuch jetzt mal detailliert studieren für ggf weitere Unklarheiten.

Gruß
Werner
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

Habe leider weitere Fragen:
Nachdem es mir gelingt von einem hauptformular andere Formulare per Taste aufzurufen, habe ich versucht, meinen Bericht aufzurufen. Dazu habe ich im Internet folgenden Makro gefunden.

SUB Bericht_oeffnen
DIM oDatenquelle AS OBJECT
oDatenquelle = ThisDatabaseDocument.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oDatenquelle.loadComponent(com.sun.star.sdb.application.DatabaseObject.Report,"Abrechnung_BH",FALSE)
END SUB

Ergebnis: Eigenschaft oder Methode nicht gefunden: Report
Ich gestehe, dass ich den ganzen Aufruf nicht verstehe. oDatenquelle ist ja wohl meine geöffnete Datenbank, loadComponent() sollte den angegebenen Bericht laden und dann sollte die Aktion an den bericht gehen zB Ausdruck.

was ist falsch?
Gruß Frewer
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von RobertG »

Hallo Frewer,

das, was Du da gefunden hast, soll wohl von außen Berichte in einer Base-Datei öffnen.

Von einem Formular aus schreibst Du einfach

Code: Alles auswählen

 ThisDatabaseDocument.ReportDocuments.getByName("Berichtsname").open
statt

Code: Alles auswählen

 ThisDatabaseDocument.FormDocuments.getByName("Formularname").open
Gruß

Robert
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

Hallo Robert,
klappt prima. Merci für die Hilfe.
Vermisse in den Dokumenten doch so einfache Dinge wie die Erklärung, dass auch Berichte im geöffneten Dokument ansprechbar sind. Dann wär es mir vielleicht auch klar geworden.
Ich habe ja einige Batenbanken in VBA Basic programmiert, die auch alle funktionieren und wollte nun auf OpenOffice umstellen. Das ist aber garnicht so einfach wie ich es mir gedacht hatte, das Basic ist ja ganz anders als in VBA und eine verstehbare Erklärung der diversen Befehle konnte ich bisher eigentlich nur für den einfachen Teil wie zB Variablendefinitionen und das Drumherum finden. So langsam habe ich mit Deiner Hilfe jetzt auch ein bisschen das Bedienen der datenbank mit Daten, das Thema "von einem Formular zum Anderen" etc kapiert.
Als nächsten Schritt bin ich jetzt dabei einen Bericht zu erstellen zusammen mit einer Abfrage und ggf Gruppierung.
Wenns nicht klappt muss ich mich wieder melden.
Also vielen Dank erneut für deine professionelle Hilfe!!
Gruß
Werner
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von RobertG »

Hallo Werner,

wenn Du Dich gerade erst in OpenOffice einarbeitest: Du weißt, dass die letzte kleine Bugbeseitigung von 2018 ist und das Projekt nicht mehr groß entwickelt wird? Ich arbeite hier mit LibreOffice.

Und was die Beschreibung betrifft. Lade Dir das Handbuch runter. Trifft bei Base in fast allen Bereichen sowohl auf OpenOffice als auch auf LibreOffice zu, was ich dort aufgeschrieben habe.

Gruß

Robert
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

Hallo Robert,
vielen Dank für Deinen Kommentar. Mich wundert das ganze OpenOffice Paket etwas. Ich habe LibreOffice 4 heruntergeladen mit all seinen Komponenten also auch Base. Warum bei Base mir stets OpenOffice "entgegenspringt" ist mir unklar. Das LibreOffice habe ich erst Anfang dieses Jahres heruntergeladen tatsächlich scheint es aber das OpenOffice 4 zu sein. Meine Erklärung ist, dass vielleicht mit meinem WIN XP, das ich nach wie vor nutze, nur OpenOffice angeboten wird. Das könnte sein.

Nun habe ich aber noch ein simples Problem mit dem ich trotz heftigem Lesen nicht klarkomme:
Ich möchte in ein Formular das heutige Datum in die Zelle fDatum (Datumsfeld) eingeben. Habe bereits mehrere Varianten versucht, doch meldet sich das Programm stets mit Laufzeitfehler und "Objektvariable nicht belegt" und zwar in der Zeile "oFeld.BoundField.Update(unoDate)". Das ist mir deshalb unklar, weil das Objekt oFeld 1Zeile davor mit dem Namen des Kontrollfeldes belegt wird.

SUB Datum_Heute
DIM unoDate ' AS NEW com.sun.star.util.Date
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Abrechnung_BH")
unoDate = createUnoStruct("com.sun.star.util.Date")
unoDate = Date
oFeld = oForm.getByName("fDatum")
oFeld.BoundField.UpdateDate(unoDate)
END SUB

Bei der Thematik verstehe ich auch nicht, warum unoDate als struct aufgebaut werden muss und zB die DIM Definition in der 1ten Zeile mit AS NEW com.... nicht ausreicht. Ich habe auch mit LONG, mit Double experimentiert - ohne Erfolg.
Sicher hast Du eine Lösung an der ich sehr interessiert wäre.

Gruß von der lahnsmündung nach wo immer Du lebst
Werner
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Toxitom »

Hallo Werner,

der Fehler liegt in diesem Fall in der Zeile:

Code: Alles auswählen

...
unoDate = Date
...
"Date" ist das unbekannte Objekt. Die Funktion liefert einen Datumsstring des aktuellen Datums (schreibe dafür aber besser: date()) - das kannst Du dem Objekt(unodate) aber nicht zuordnen.

Was Du brauchst würde so lauten:

Code: Alles auswählen

unodate= cDateToUnoDate( Date() )
Dann wäre dieses Objekt im übrigen korrekt.

Über diese Zeile bräuchtest Du ebenfalls weder die Zeile Dim unoDate as new....
noch die Zeile unoDate = createUnoStruct...

es reicht: Dim unoDate as variant. Die Funktion cDataToUnoDate() erzeugt schon den richtigen Typ, hier also einen entsprechenden Struct.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

Vielen Dank Thomas,

ist das alles schwierig!!
Ich bin davon ausgegangen, dass DATE ein Datum an die "Variable" unoDate übergibt. Das hat auch funktioniert, wenn ich nach dem unoDate=DATE mit der msgbox unoDate ausgegeben habe (da stand dann zB 12.3.2020). Das deutet doch auf eine Variable hin, die mit einem String besetzt ist.
Das ist also falsch. D.h. verstehe ich richtig, dass in dem Ausdruck "oFeld.BoundField.UpdateDate(unoDate)" unoDate keine Variable sondern ein Objekt ist? oder wie muss ich das verstehen.

Gruß
Werner
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von RobertG »

Hallo Werner,

Die Variablen stecken unterhalb von unoDate. Das ist dann die Jahresangabe, Monatsangabe usw.

Code: Alles auswählen

unoDate.Year = Year(Date)
unoDate.Month = Month(Date)
unoDate.Day = Day(Date)
Wenn Du Dir etwas mit msgbox anzeigen lässt, dann wird dabei der Inhalt nach den Einstellungen Deines Rechners auf das entsprechende Datumsformat gemünzt - ob das nun eine Zahl oder anderes ist.

Gruß

Robert
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Toxitom »

Hallo Werner,
Ich bin davon ausgegangen, dass DATE ein Datum an die "Variable" unoDate übergibt.
Das ist korrekt ;)) DATE() ist eine vordefinierte Funktion in LO/OO Basic und liefert das aktuelle Systemdatum als Typ String zurück, also so etwas wie "15.3.2020".

Schreibst Du dieses rechts von einer Zuweisung ("=" ) wird es der links stehenden Variablen zugewiesen, vorausgesetzt, die Variablentypen passen zusammen.
Eine Variable vom Typ variant (so etwas wird immer automatisch erstellt, wenn explizit kein Typ angegeben wird oder der Typ "variant" verwendet wird) wird dabei immer auf den zugewiesenen Typ (rechte Seite) angepasst. Das ist eben Basic.

Schreibst Du also "nur" unoDate=DATE , dann wird der Typ von unoDate ein String. Hast Du den aber schon andersweitg definiert (bei dir im Code als Struct - und ein Struct ist ein Objekttyp) - dann passt das nicht.

Kann sein, dass in Deinem Code die Variable geändert intern wurde...?? wer weiss.

Der Ausdruck "oFeld.BoundField.UpdateDate(unoDate)" erwartet aber ein Struct des Typs Date - sonst gibt es halt ne Fehler, wenn Du einen String zuweist.

Den dargestellten Fehlermeldungen in Basic ist nicht immer ganz zu trauen.. da gibt es oft Verschiebungen von Zeilen und unklare Beschreibungen.

Aber nun weisst Du es ja:) Kannst es jetzt wie ich beschrieben habe machen oder wie es Robert dargestellt hat. Ist halt Länger.

Lass einfach die ganze Variablenbestimung etc weg und schreibe direkt:

oFeld.BoundField.UpdateDate(cDateToUnoDate(Date()))

Fetisch...

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Frewer
**
Beiträge: 39
Registriert: Do, 05.03.2020 16:10

Re: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

Beitrag von Frewer »

Hallo Thomas,
habe Deine Zeile eingebaut und probiert: leider Pech, jetzt schreibt er "Sub- oder Function-Procedur nicht definiert".

Nun habe ich nach Deiner Erklärung mal eine Stringvariable strDate definiert, das Feld "fDatum" als Textfeld festgelegt, das Makro unter Ereignisse angebunden (Fokuserhalt) und lese mit msgbox korrekt das Datum. Doch beim oFeld.BoundField.UpdateString(strDate) meckert er wieder mit "Objektvariable nicht belegt", obwohl doch String zu String passen müsste.

Was nun sprach Zeus?
Gruß
Werner
Antworten