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

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: ooBase -Daten aus einem Datumsfeld auslesen, korrekte Währung abspeichern

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

von Frewer » Di, 17.03.2020 13:23

Hallo Tom,
sorry, dass ich auf Deine Erklärung zum Thema Version von OO nicht eingegangen bin (auch das Lesen in der OO.info Datenbank ist schwierig-war immer auf Seite 1).
Ja ich habe OO 4.1.3 und das, weil ich eben noch mit meinem WIN XP Betriebssystem arbeite, das mir bei meinen elektronischen Entwicklungen und den entsprechenden Programmen, die noch bestens funktionieren aber nicht auf neuere Systeme portierbar sind. Habe LO probiert, geht nicht.
Zum Glück habe ich ja jetzt eine lösung gefunden, die ich oben dargestellt habe. Das funktioniert auch prima jetzt. Dennoch das Programmieren in starBasic scheint erheblich schwieriger zu sein als bei Access. Dort lief meine Datenbank ohne Probleme, doch kann ich die diversen Macros leider nicht benutzen.
Nun gleich noch eine Frage: Was ist xray und wie komme ich daran und läuft das auch mit WIN XP?

Gruß
Werner

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

von Frewer » Di, 17.03.2020 10:13

Hallo,
ich habe nach vielen Versuchen jetzt das Datum im Formular. Das Hauptproblem war wahrscheinlich, dass ich den Punkt nicht komplett beschrieben hatte. Ich habe ein Formular mit einem Kontrollfeld "fDatum", diesem Kontrollfeld ist kein Datenfeld aus der Tabelle zugeordnet. Dann funktioniert offenbar der Befehl "oFeld.BoundField.Update(unoDate)" nicht sondern nur der Befehl "oFeld.commit()". Dann habe ich dem Kontrollfeld unter Daten ein Datumsfeld der Tabelle zugeordnet, dann kann ich das Datum mit Update() in die Tabelle schreiben.
Nun kann es sein, dass ich für diese Vorgehensweise nur den 2ten Teil benötige und das commit() nicht brauche aber zum Studieren ist die Erkenntnis schon ganz gut gewesen.

Gruß bis zum nächsten Problem
Werner

Anbei meine Lösung:

SUB Datum_Heute
DIM unoDate AS NEW com.sun.star.util.Date
DIM strName AS LONG
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Abrechnung_BH")
oFeld = oForm.getByName("fDatum")
REM heutiges Datum in Kontrollfeld schreiben
oFeld.Text=Format(NOW(),"dd.mm.yyyy")
oFeld.commit() 'damit wird in das Kontrollfeld geschrieben
REM jetzt das heutige Datum in die Datenbank schreiben
REM dazu muss aber zunächst der Datensatz gesucht werden in den
REM geschrieben werden soll
oForm.last 'zur letzten Zeile der Tabelle gehen
unoDate.Year = Year(Date)
unoDate.Month = Month(Date)
unoDate.Day = Day(Date)
oFeld.BoundField.UpdateDate(unoDate)
oForm.UpdateRow()
END SUB

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

von Toxitom » So, 15.03.2020 16:41

Hallo Werner,

tia... programmieren ist nicht immer so einfach ;)

Hab mir mal den kompletten Tread im Detail durchgelesen - wenn ich das richtig sehe, arbeitest Du mit AOO 4.x?

Tia, dann geht es nicht. Die Funktion "cDateToUnoDate()" gibt es erst seit LO 5.... da wurden interne Date-Variablen von der ISO-Darstellung auf den UNO-Typ umgestellt.
Also sorry, vergass zu erwähnen, dass meine Ideen nur für LO gelten.

Wenn Dein String aber auch nicht passt - gibt es vielleicht kein "BoundField"? Oder "oFeld" ist nicht definiert?

Lade Dir einen Objektinspektor (z.B. xray oder mri) und fange an, die Details der Objekte zu verstehen und zu analysieren. Sonst bleibt das hier einfach ein Blick in die Glaskugel....

VG
Tom

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

von Frewer » So, 15.03.2020 16:25

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

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

von Toxitom » So, 15.03.2020 16:00

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

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

von RobertG » So, 15.03.2020 15:06

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

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

von Frewer » So, 15.03.2020 14:51

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

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

von Toxitom » So, 15.03.2020 14:07

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

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

von Frewer » So, 15.03.2020 13:36

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

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

von RobertG » Di, 10.03.2020 15:05

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

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

von Frewer » Di, 10.03.2020 10:26

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

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

von RobertG » Mo, 09.03.2020 17:12

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

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

von Frewer » Mo, 09.03.2020 12:40

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

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

von Frewer » Fr, 06.03.2020 10:00

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

Gruß
Werner

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

von RobertG » Do, 05.03.2020 19:58

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

Nach oben