[gelöst] Wert aus Tabelle lesen und in einer Form nutzen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

AndyK70
*
Beiträge: 15
Registriert: Mi, 24.09.2008 12:00

[gelöst] Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von AndyK70 »

Ich geb's auf, ich hab mich durch die Wiki gehangelt, bin auf etlichen Tut-Seiten gewesen aber ich schnall dieses ooBasic einfach nicht.

Meine Situation:
Ich habe mit ooBase eine Datenbank gemacht (SO-Cad-NGs) und darin eine Tabelle (Tabelle1) und ein Formular (Dateneingabe).
Das Formular hat keine Subformulare und ist als "Datenblatt" angelegt worden.
Daten dürfen in diesem Formular angelegt, verändert und auch gelöscht werden.

Bei der Dateneingabe hab ich zu einem Tag mehrere Datensätze. Ich gebe aber auch nachträglich mehrere Tage ein.

Was ich möchte:
Wenn ich in diesem Form einen neuen Datensatz anlege, möchte ich, dass das höchste Datum der Tabelle als Standardwert in der Spalte Datum automatisch schon eingetragen wird.

Die Felder in der Tabelle1 sind:
long Spielertyp
long Partnertyp
long Gegnertyp
long NGs
boolean Eagle
long NGs
date Datum

Das höchste Datum ist ja auch kein Problem: SELECT MAX("Datum") AS maxDate FROM "Tabelle1"

ich war auch schon soweit gekommen, dass ich diese Abfrage in ooBasic ausführen konnte und bekam ein ResultObject und konnte den Wert in eine Variable speichern.
Aber wie ich dann jetzt auf den neuen Datensatz zugreife und dort den Wert einfüge ist mir weiterhin ein Rätsel.
Ich will ja nicht ein Textfeld mit einem anderen Wert versehen, oder ein beliebiges Control benennen... hab ich alles gefunden, aber nicht wie ich den neuen (noch nicht gespeicherten) Datensatz in dem Formular ansprechen kann...

Andy

Edit:
hier mal das, was ich bisher habe:

Code: Alles auswählen

Function getMaxDate
	Dim oStatement, oDBSource, oConnection, rRowset As Object
	Dim sQuery as String
	Dim dDate as Date
	
	oDatabaseContext = createUnoService( "com.sun.star.sdb.DatabaseContext" )
	oDBSource = oDatabaseContext.GetByName("SO-Cad-NGs")
	oConnection = oDBSource.GetConnection("", "")
	oStatement = oConnection.createStatement()

	sQuery = "SELECT MAX(""Datum"") AS MaxDate FROM ""Tabelle1"""
	rRowset = oStatement.executeQuery( sQuery )
	if(rRowset.isbeforefirst) then rRowset.next
	dDate = rRowset.getString(1)
	
	'msgbox(dDate)
	getMaxDate = dDate
End Function

Sub setMaxDate(oForm as Object)
	dim dDate as Date
	dim oControl as Object
	
	oControl = oForm.GetByName("Mainform_Grid")
	' und nu weiß ich nich weiter...
End Sub
Die Funktion getMaxDate() funktioniert eigentlich tadellos und gibt auch das richtige Datum zurück. Nur wie kann ich es jetzt in dem Grid nutzen?
Wenn ich bei den Ereignissen des Grid nachschaue weiss ich nicht welches ich nutzen kann, um die Erzeugung eines neues Datensatzes abzufangen.
Wenn ich innerhalb des Grids bei der Spalte "Datum" auf die Ereignisse schaue, seh ich genauso wenig.
Vielleicht bin ich da auch total falsch?

Ich hätte eigentlich gedacht, dass ich bei den Eigenschaften der Spalte bei "Standarddatum" einfach die Funktion getMaxDate() eintrage und es das übernimmt. Aber da bin ich wohl von einer anderen Office-Entwicklungsumgebung in der Vergangenheit zu sehr verwöhnt worden. ;)

Andy
Zuletzt geändert von AndyK70 am Mo, 19.07.2010 12:45, insgesamt 1-mal geändert.
AndyK70
*
Beiträge: 15
Registriert: Mi, 24.09.2008 12:00

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von AndyK70 »

Inzwischen hab ich mir auch XRAY besorgt, hoffe die Version 5.2 von 2006(!!) ist immer noch aktuell?

Aber irgendwie bekomme ich das SDK (http://download.services.openoffice.org ... _en-US.exe) nicht gedownloadet??
Habs mit Firefox 3.6.6, Opera 10.60 und Google Chrome 5.0.375.99 probiert.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von DPunch »

Aloha
AndyK70 hat geschrieben:Aber irgendwie bekomme ich das SDK (http://download.services.openoffice.org ... _en-US.exe) nicht gedownloadet??
Der Download scheint im Moment nicht zur Verfügung zu stehen - über Google findet man noch diverse andere Downloadseiten für die 3.2.1 SDK, aber welche davon vertrauenswürdig sind, kann ich nicht sagen.
AndyK70 hat geschrieben:Wenn ich in diesem Form einen neuen Datensatz anlege, möchte ich, dass das höchste Datum der Tabelle als Standardwert in der Spalte Datum automatisch schon eingetragen wird.
Gehe ich Recht in der Annahme, dass Du mit einem Tabellen-Kontrollfeld arbeitest (aka Datagrid)? "oForm.GetByName("Mainform_Grid")" legt diese Vermutung zumindest nahe.
Wenn dem so sein sollte, dann kannst Du mal folgendes versuchen:

Code: Alles auswählen

Sub setMaxDate
   dim oControl as Object, oDateColumn as Object, oDoc as Object, oForm as Object
   Dim sMaxDate as String
   Dim nNewDate as Long
   oDoc = thisComponent
   oForm = oDoc.Drawpage.Forms(0)
   oControl = oForm.GetByName("Mainform_Grid")
   oDateColumn = oControl.getByName("DateField1")
   sMaxDate = getMaxDate
   nNewDate = Right(sMaxDate,4) & Mid(sMaxDate,4,2) & Left(sMaxDate,2)
   oDateColumn.DefaultDate = nNewDate
End Sub
"setMaxDate" weist Du dann unter Formular -> Ereignisse z.B. dem Ereignis "Vor dem Datensatzwechsel" zu.

Noch ein Hinweis:
Die Umwandlung

Code: Alles auswählen

nNewDate = Right(sMaxDate,4) & Mid(sMaxDate,4,2) & Left(sMaxDate,2)
kann variieren.
Die Datumsspalte erwartet einen Datumswert in der Form 20100715, also Jahr,Monat,Tag, vom Typ Long.
In der beispielhaften Umwandlung bin ich von einem Datumsstring wie "15.07.2010" ausgegangen.
AndyK70
*
Beiträge: 15
Registriert: Mi, 24.09.2008 12:00

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von AndyK70 »

Suuuper!!
Danke, hat echt geklappt.
DPunch hat geschrieben:"setMaxDate" weist Du dann unter Formular -> Ereignisse z.B. dem Ereignis "Vor dem Datensatzwechsel" zu.
Damit bin ich noch nicht ganz zufrieden. Es wird einfach zu häufig aufgerufen. Wenn ich nur in den Datensätzen blättere wird das ganze schon spürbar langsam.
Habe mal zuerst das Ereignis "Vor dem Submit" ausprobiert, weil ich dachte das müsste ja kommen, wenn ich einen neuen Datensatz in die DB schreibe, aber hat wohl mit was anderem zu tun.
Dann das Ereignis "Vor der Datensatzaktion", weil ich dachte wenn ich etwas an einem Datensatz ändere, dann wird es vor dem update aufgerufen. Scheint auch irgendwie zu funktionieren.... aber leider erst beim zweiten Aufruf. irgendwie komisch.

Hab es jetzt erst wie Du gesagt hast, "Vor dem Datensatzwechsel" eingetragen. Ist zwar etwas zäh, aber es funktioniert.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von komma4 »

AndyK70 hat geschrieben:Habe mal zuerst das Ereignis "Vor dem Submit" ausprobiert, weil ich dachte das müsste ja kommen, wenn ich einen neuen Datensatz in die DB schreibe
Kann an der Stelle die (englischsprachige) Dokumentation von Plan-B empfehlen, welche nicht nur hier (Suchbegriff: Events) OOo etwas ausführlicher erklärt.
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)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von DPunch »

Aloha
AndyK70 hat geschrieben:Hab es jetzt erst wie Du gesagt hast, "Vor dem Datensatzwechsel" eingetragen. Ist zwar etwas zäh, aber es funktioniert.
Eine Alternative wäre, das aktuelle MaxDate als globale Variable zu setzen, die jedesmal aktualisiert wird, so es denn was zu aktualisieren gibt.
Ich kann das zwar grad nicht testen, aber ich behaupte einfach mal, dass das deutlich schneller ist, als bei jedem Datensatzwechsel per SQL das MaxDate aus der Tabelle zu holen und umzuwandeln (von meinen Erfahrungen mit OOo Base und HSQLDB her gehe ich sehr stark davon aus, dass die SQL-Abfragen der größte Bremsklotz sind).
Wenn Du dabei Hilfe benötigen solltest, sag einfach nochmal Bescheid.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von komma4 »

In meiner Krabbelkiste habe ich dazu noch was gefunden...

Ich setze einen solchen Wert (maxDatum) in einer Hilfstabelle (Spalten: Name, Wert), lese den bei Bedarf durch eine vordefinierte Abfrage aus und setze ihn ins Formular.


Da Du beim Setzen des Datums im Formular nicht weiter gekommen bist, hier der relevante Code-Teil:

Code: Alles auswählen

' setzen in Form
oDok = ThisComponent
oForm = oDok.getDrawpage().getForms().getByName( "MainForm" )
oControl = oForm.getByName( "datDatum" )
oControl.Date = _
 maxDatum.Year & _
 Format( maxDatum.Month, "00" ) & _
 Format( maxDatum.Day, "00" )   
Meine Abfrage liefert die Spalte als Variable vom Typ com.sun.star.util.Date, deshalb die Aufbereitung, da .Day oder .Month einstellig sein können.
Erwartet wird von einem Form-Datefield.Date ein LONG, also bswp. 20100716


HTH
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)
AndyK70
*
Beiträge: 15
Registriert: Mi, 24.09.2008 12:00

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von AndyK70 »

Erst mal danke für die tolle Unterstützung! :D

Das mit der globalen Variable und einer kurzen if-Abfrage ob es denn überhaupt nötig ist zu aktualisieren hab ich mir auch schon überlegt.
Werde das mal heute Abend ausprobieren.

Danke auch für den Link zu Plan-B, werde ich mir dann auch in Ruhe zu Gemüte führen. ;)

Das mit dem setzen des Datums im Formular hat ja soweit geklappt, ich will nur schauen, ob ich es ein wenig optimieren (schneller machen) kann, siehe oben bzgl. Überprüfung ob nötig.
AndyK70
*
Beiträge: 15
Registriert: Mi, 24.09.2008 12:00

Re: Wert aus Tabelle lesen und in einer Form nutzen

Beitrag von AndyK70 »

Sodele... :D

hab es gelöst bekommen, aber etwas anders als gedacht:

Beim Laden der Form les ich das höchste Datum einmal aus und setze es als das Standarddatum für neue Datensätze.
Wenn ich dann mal das Datum ändere hab ich bei dem Event "Nach dem Aktualisieren" dieser Spalte den unten stehenden Code stehen, um das neue Standarddatum zu setzen.

Das Schöne ist: Das Event wird ausgelöst, nachdem der neue Wert drin steht, aber sogar noch bevor der Datensatz gewechselt/geschrieben wird.
Falls ich tatsächlich mal bei einem Datensatz nachträglich das Datum ändern sollte, was eigentlich nicht der Fall sein dürfte, dann muss ich eben bei dem nächsten neuen Datensatz es wieder einmal korrigieren. Aber wie gesagt, das dürfte eigentlich nicht vorkommen und somit fällt es nicht weiter ins Gewicht.

Da ich die Tabelle nur einmal beim Laden abfragen muss bleibt alles schön geschmeidig und flüssig. Dass bei einer Änderung nochmal der kurze Code ausgeführt wird, bemerkt man auch nicht.

Code: Alles auswählen

Sub setDefValDatum
	dim oColPartner as Object

	oColPartner = thisComponent.Drawpage.Forms.GetByName("MainForm_Grid").GetByName("Datum")
	oColPartner.DefaultDate = oColPartner.CurrentValue
End Sub
Zu Plan-B:
Ich hab dort tatsächlich auch Beschreibungen zu Events gefunden, aber irgendwie nicht wirklich brauchbar.
Zum Beispiel steht dort
Prior to reset

The Prior to reset event occurs before a form is reset. The linked macro can, for example, prevent this action by returning "FALSE".
A form is reset if one of the following conditions is met:
  • The user presses an (HTML) button that is defined as a reset button.
  • A new and empty record is created in a form that is linked to a data source. For example, in the last record, the Next Record button may be pressed.
Man beachte den zweiten Punkt der Auflistung. Ich dachte "TOLL!! genau das was ich suche..."
Das Ergebnis war: Nach einer Änderung des Datums wurde bei dem 1. neu erzeugten Datensatz das neue Datum nicht übernommen. Ich musste erst zurückgehen und erneut nach unten und bei der 2. Erzeugung des Datensatzes kam dann das neue Datum als Vorgabe.

Naja und ansonsten ist es wirklich sehr mühsam etwas zu finden. Man muss die Suchbegriffe sehr genau wissen, d.h. die englischen Bezeichnungen der Sachen die man finden will. Mit dem Stichwort "Events" kam ich nicht sehr weit, erst als ich "Base Form Events" eintrug kam dann bei dem 7. Entry das Gewünschte.
Zu dem Tabellenkontrollfeld hab ich nix finden können. Ich habs es mit "Datagrid" "Mainform_Grid" und auch mit "Grid Form Base" versucht, mit "Grid" alleine eh keine Chance. Dann noch mit "table" "table control" "table control base" aber auch nix... wie gesagt alles sehr mühsam dort. Leider kann man sich auch nicht "durchklicken" ohne die Suche zu bemühen. Alles was zu "Base" über die Menüs zu erreichen war hatte nix mit Programmierung oder gar Events zu tun.


Summa-Summarum
Ich finde OO echt toll für alle normalen Tätigkeiten und total klasse das es sowas als Open-Source und auch noch kostenlos gibt, aber für Leute die mal ein wenig unter die Haube schauen wollen und mit der Programmierung anfangen ist es echt grausig. Die Usability der IDE ist auf dem Stand wo ich 1986 unter DOS mit Ansi-C angefangen habe zu programmieren. Ich bin bei Leibe kein MS Verfechter, um Gottes willen. Wenn's irgendwie geht, nutze ich alternativ-Software (bis auf das OS).
Beruflich hatte ich aber viel mit MS-Produkten zu tun und die Entwicklung mittels VBA ist echt top. Da brauch ich nicht ständig die API-Referenz neben mir liegen haben, ich kann per Auto-Complete sofort sehen welche Möglichkeiten ich habe und auch per Quick-Info was die Methode/Eigenschaft erwartet und zurückgibt wenn ich nur mit der Maus drüber schwebe... Da könnte sich das OO-Team noch ne Scheibe von abschneiden.
Für mich heisst es: ich werde weiter mit OO zu hause arbeiten und wenn möglich Programmierung vermeiden. :lol:

Danke Allen, die mich hier Unterstützt haben und mich so letztendlich auf die Lösung gebracht haben.
Schön so eine Community zu finden.

LG Andy
Antworten