Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

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

Moderator: Moderatoren

arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von arkadiuszpaluszek »

Hallo!

Habe hier eine Tabelle, welche unter anderem die Felder "Artikelnummer" und "Artikelbezeichnung" hat. Mein Anliegen ist einfach - wenn ich die Artikelnummer im Kombinationsfeld ändere, soll sich auch die Artikelbezeichnung anpassen - oder umgekehrt. Das Makro, welches die Felder mit entsprechenden Werten füllt habe ich schon.

Allerdings tue ich mir damit schwer es einem Ereignis zuzuordnen. Dem Programm muss klar sein, ob gerade die Artikelnummer oder die Bezeichnung neu ausgewählt worden sind - deshalb habe ich versucht das Makro dem Ereignis "Text verändert" des entsprechenden Feldes zuzuordnen - dann passiert aber eigenartigerweise gar nichts. Also bin ich auf "Status geändert" übergegangen mit folgendem Ergebnis:
Beispiel.jpg
Beispiel.jpg (23.42 KiB) 2277 mal betrachtet
Wie man sieht, im Feld Artikelnummer ist zwar eine "1" ausgewählt worden, folgender Code

Code: Alles auswählen

oDoc=thisComponent
oForm=oDoc.Drawpage.forms.GetByName("Formular1")
	oForm=oForm.GetByName("Formular1.1")
		oTabelle=oForm.getByName("Abrechnungsfeld")
			
			oElement=oTabelle.GetByName("Artikelnummer")
                       artikelnummer=oElement.text

if artikelnummer<>"" then 

	msgbox(artikelnummer)
	
else

	msgbox("Artikelnummer leer:"+artikelnummer)
	
end if
gibt aber zurück, dass das Feld noch leer wäre. Ich bekomme immer den letzten Wert der im Feld noch vor der Veränderung stand. Wenn ich jetzt in ein anderes Feld klicke, dann zurück zur Artikelnummer gehe und dort eine zwei eintrage, bekomme ich den Rückgabewert 1.

Daraufhin habe ich versucht nach

oElement=oTabelle.GetByName("Artikelnummer")

noch

oElement.commit(true)

einzufügen damit der Wert nicht mehr nur optisch, sondern "tatsächlich" im entsprechenden Feld steht, nutzt nichts. Ich frage mich, wo mein Fehler ist?

Viele Grüße

Arek
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von komma4 »

Dein Screenshot suggeriert mehr, dass es um die Tabellen einer Datenbank (odb) geht.

Dort brauchst Du i.d.R. kein Makro um abhängige Felder in einem Formular zu aktualisieren.

Die eben gemachte Einschränkung betrifft Listenfelder, bei denen ein Ereignis "ausgewählter Wert geändert" nicht weiter gegeben wird.


Dort arbeite ich mit einer Schaltfläche zum Aktualisieren abhängiger Listenfelder.

Schau' Dir mal in diesem Post das Beispiel an.


Kommst Du damit 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)
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von arkadiuszpaluszek »

Hallo Winfried,

vielen Dank, aber es trifft nicht ganz mein Problem. Ja, natürlich handelt es sich um eine Datenbank - im Bild siehst Du den Ausschnitt aus einem Writerdokument, welches ein Tabellenelement beinhaltet.

Die im Bild angezeigte Tabelle "Leistungsabrechnung" ist kein Subformular zur Artikelliste. Vielmehr gibt es ein übergeordnetes Formular "Kunde", weil die entsprechenden Leistungen einem ganz bestimmten Kunden zugeordnet werden. Hier gibt es keinerlei Probleme.

Die Kombinationsfelder werden mit SQL-Abfragen gefüllt - eine Abfrage fragt eben die Artikelnummer ab, die andere die Artikelbezeichnung. Es sollen beim Kunden mehrere verschiedene Artikel in die Abrechnung eingetragen werden können, deshalb scheidet Formular/Unterformular - Struktur aus, sonst würde er mir in der Tabelle gleichzeitig nur den Verkauf dieses Artikels anzeigen, der auch im Masterformular ausgewählt ist.

Das Kombinationsfeld scheint zudem auch das Ereignis "Status geändert" weiter zu geben - sonst würde das Makro ja nicht ausgelöst werden. Was mich verwundert, ist vielmehr, dass obwohl das Ereignis weitergegeben wird, das Makro aus dem Tabellenelement immer noch den alten Wert heraus liest.

Gruß

Arek
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von F3K Total »

Hallo Arek,
es handelt sich um das gleiche Problem wie hier schon einmal für dich beantwortet:
viewtopic.php?f=18&t=52570#p196759
Du siehst an dem Bleistift, das der Datensatz noch nicht gespeichert ist, da du das Feld nicht "von Hand" verläßt benötigst Du als Ersatz das

Code: Alles auswählen

.commit(true)
Gruß R
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von arkadiuszpaluszek »

Ich wäre ja wohl absolut lernunfähig, wenn ich Deinen Tipp vom anderen Beitrag hier nicht zumindest versucht hätte! :lol: Und ich betreibe es ja geradezu exzessiv:
1. Zuerst gehe ich in das Feld Artikelnummer und "verlasse" es .mit commit(true)
2. Gehe dann auch wirklich in ein anderes Feld - in diesem Fall die Artikelbezeichnung, und um ganz sicher zu gehen dass ich auch wirklich da war folgt auch hier commit(true)
3. Dann gehe ich erst zurück zur Artikelnummer.

Code: Alles auswählen


Sub Felder_fuellen
dim oDoc as Object
dim oForm as Object
dim oTabelle as Object
dim oElement as Object

' AUSLESEN DES FELDES ARTIKELNUMMER

oDoc=thisComponent
oForm=oDoc.Drawpage.forms.GetByName("Formular1")
	oForm=oForm.GetByName("Formular1.1")
		oTabelle=oForm.getByName("Abrechnungsfeld")
			
			oElement=oTabelle.GetByName("Artikelnummer")
			oElement.commit(true)
						
			oElement=oTabelle.GetByName("Artikelbezeichnung")
			bezeichnung=oElement.text
			oElement.commit(true)
			
			oElement=oTabelle.GetByName("Artikelnummer")
			oElement.commit(true)
			artikelnummer=oElement.text
							
if artikelnummer<>"" then 

	msgbox(artikelnummer)
	
else

	msgbox("Artikelnummer leer:"+artikelnummer)
	
end if
	 
End Sub

Das Ergebnis ist aber das Gleiche - wieder habe ich zunächst keinen Wert, bis ich aus dem Feld mit der Hand rausgehe und dann wieder rein und es erneut anklicke!
Wojtus - Kopie.zip
(28.42 KiB) 88-mal heruntergeladen
Das Formular findest Du im Ordner Formulare. Das Makro wird im Augenblick durch einen einfachen Klick auf das Feld "Artikelnummer" ausgelöst.
Das Makro findest Du im selbigen Dokument in der Standardbibliothek.

Wenn Du Zeit und Lust hast reinzuschauen, würde ich mich freuen! Die Datenbank muss angemeldet sein damit der Basic-Code richtig ablaufen kann,

Gruß

Arek
Zuletzt geändert von arkadiuszpaluszek am Fr, 09.03.2012 14:00, insgesamt 1-mal geändert.
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von arkadiuszpaluszek »

Habe schließlich das Makro dem Ereignis "Fokusverlust" zugeordnet und es geht! Dass ich es bis dahin nicht ausprobiert habe, lag daran, dass ich es mit "Maus innerhalb" gleichgesetzt habe, ist es ja aber nicht. Jetzt wird das Makro ausgeführt sobald ich z.B. per Tabtaste das Feld verlasse und es wird der korrekte Wert abgelesen.

Danke all den, die sich mit mir gemeinsam den Kopf zerbrochen haben!

Viele Grüße

Arek
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von F3K Total »

Hallo Arek,
der Weg über die Kontrollfelder ist schwierig zu beherrschen, im Prinzip gibst Du per Makro etwas ins Feld ein, was dann noch in die DB geschrieben werden muß.
Meiner Meinung nach geht es besser, wenn Du die Spalten der dem Formular zugrundeliegenden Tabelle direkt ansprichst.
Folgendes Makro dem Ereignis "Maustaste losgelassen" zugeordnet funktioniert ohne zusätzlichen Klick oder die Tab Taste.

Code: Alles auswählen

Sub S_Insert_Artikel

oform = thiscomponent.drawpage.forms.Formular1.getbyname("Formular1.1")
oTabelle=oForm.getByName("Abrechnungsfeld")
oElement=oTabelle.GetByName("Artikelnummer")

controller = thisComponent.CurrentController
Control = Controller.getControl(oTabelle)
Control.commit(true)
nselected_Artikelnr = oElement.Text

ncolArtikelbezeichnung = oform.findcolumn("artikel")
ncolAbrechnungseinheit = oform.findcolumn("einheit")
ncolEinzelpreis = oform.findcolumn("einzelpreis")

ocon = oform.activeconnection
sql_statement=ocon.createstatement
ssql="SELECT  ""artikel_bezeichnung"", ""artikel_einheit_FK"", ""artikel_preis"" FROM ""artikel_liste"" where ""artikelnummer""= " + nselected_Artikelnr
sql_result=sql_statement.executequery(ssql)
if sql_result.next then
sArtikelbezeichnung = sql_result.getstring(1)
sAbrechnungseinheit = sql_result.getstring(2)
dEinzelpreis = sql_result.getdouble(3)
endif

oform.updatestring(ncolArtikelbezeichnung,sArtikelbezeichnung)
oform.updatestring(ncolAbrechnungseinheit,sAbrechnungseinheit)
oform.updatedouble(ncolEinzelpreis,dEinzelpreis)

oform.updaterow

End Sub
Wenn du dann noch eine Abfrage "qKunden_Leistungen" von der Tabelle "kunden_leistungen" erzeugst, kannst Du den Gesamtpreis gleich nach Eingabe der "Menge" automatisch ausrechnen lassen, siehe Formular1 im Beispiel anbei.

Gruß R
Dateianhänge
Wojtus_Daten.odb
(21.45 KiB) 154-mal heruntergeladen
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von arkadiuszpaluszek »

Danke! So ähnlich hatte ich es auch bereits programmiert, allerdings hast Du es etwas eleganter gelöst, muss mir Dein Skript genauer anschauen...

Viele Grüße

Arek
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum Auslesen eines Inhaltes zum Ereignis zuordnen

Beitrag von F3K Total »

Moin,
damit das o.a. Makro beim Anlegen eines neuen Datensatzes nicht auf einen Fehler läuft, ändere die vorletzte Zeile wie folgt:

Code: Alles auswählen

if oform.isnew then oform.insertrow else oform.updaterow
Gruß R
Antworten