🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Makroprogrammierung in Base

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
WonneWasti
! Supporter - Spende !
Beiträge: 73
Registriert: So 1. Jan 2017, 11:34

Makroprogrammierung in Base

Beitrag von WonneWasti » Do 27. Feb 2020, 09:57

Nur ein Luxusproblem-chen ! Es geht auch ohne das Makro.

Ich versuche mittels Schaltfläche das Datum der Auftragsannahme automatisch auf "heute" eintragen zu lassen.
Basic meldet hartnäckig " Es ist eine Ausnahme aufgetreten Type: com.sun.star.container.NoSuchElementException Message: ."

in der letzten Zeile von :

SUB Update(oEvent AS OBJECT)
DIM oForm AS OBJECT
DIM oFeld AS OBJECT
DIM oFeldID AS OBJECT
DIM stTag AS STRING
DIM arList()
oFeld = oEvent.Source.Model
oForm = oFeld.Parent
stTag = oFeld.Tag
arList = Split(stTag, ";")
oFeldID = oForm.getByName(Trim(arList(1)))

Das habe ich shon probiert:
Ich habe mir das Array schon ausgeben lassen, es passt. Es scheint am oForm zu liegen.
Testweise habe ich die Schaltfläche auf andere Formulare geschoben -> keine Änderung.
Die Objekterstellung "statisch" über "this.component..."
Test auf dreierlei Rechnern mit Windows und 2 Linuxen -> immer dasselbe.
Roberts Originaldatei Schnürt wie am Klappchen. Ich habe versucht den Fehler dort zu provozieren, ohne Erfolg.

=> I haven't got a clue what to do ! ;-)

Gruß und Dank an die Moderatoren für die Aufmerksamkeit !
......und vielleicht einen Hinweis.....

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makroprogrammierung in Base

Beitrag von RobertG » Do 27. Feb 2020, 15:32

Hallo WonneWasti,

wenn Du auf solche Probleme kommst versuche immer, innerhalb eine Zeile möglichst nur ein Element zu ändern. Ich würde zuerst einmal arList(1) über ein msgbox ausgeben lassen, um sicher zu gehen, dass der richtige String weitergegeben wird.

oForm ist nur dann oFeld.Parent, wenn es sich um ein einzelnen Formularfeld handelt, nicht wenn es sich um ein Tabellenkontrollfeld handelt.

Wie sieht Deine Konstruktion an diesen Punkten aus?

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

WonneWasti
! Supporter - Spende !
Beiträge: 73
Registriert: So 1. Jan 2017, 11:34

Re: Makroprogrammierung in Base

Beitrag von WonneWasti » So 1. Mär 2020, 17:26

Hallo, Robert,
ich habe das Formular so umgebaut dass nur ein einfaches Datumsfeld statt des Tabellenkontrlollfeldes vorhanden war.
Kein Erfolg,
Ceterum : Ich fühle mich ja geschmeichelt dass du mir diese Konstruktion zutraust, aber sie ist von einer Homepage eines gewissen Robert Großkopf..... :-)

Zweierlei möchte ich wissen : warum heißt der übergebene String "fmtID" während in der Tabelle das Indexfeld "ID" heißt ?
Ist das "fmt" eine Formatanweisung für den Zugriff auf oForm ?

Kann ich dem oForm unter die Haube schauen um zu sehen wie ich den aktuellen Wert des Feldes "AuftragsID" auslesen kann ?
In deiner Datei "Defaultdatum_Makro_SQL" schnürt ja alles wie am Klappchen. Mir der habe ich auch schon herumexperimentiert. Sobald ich an "fmtID" etwas ändere bekomme ich "Type: com.sun.star.container.NoSuchElementException"
Message: .

Und wenn ich an meiner Überwinterungsdatei "oForm.getByName("fmtID")" Aufrufe laufe ich auch wieder an die Wand.

Ich bekomme die Sache ums Verrecken (nicht ernst) nicht zusammen.
In meiner Datenbank sind original Kundenadressen, die will und darf ich nicht öffentlich einstellen.
, dass der richtige String weitergegeben wird.
Was ist denn der richtige String ? Der Spaltenname des Indexfedes ?


Ist mir noch zu helfen ? ;-)

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makroprogrammierung in Base

Beitrag von RobertG » So 1. Mär 2020, 18:19

Hallo WonneWasti,
WonneWasti hat geschrieben:
So 1. Mär 2020, 17:26
Zweierlei möchte ich wissen : warum heißt der übergebene String "fmtID" während in der Tabelle das Indexfeld "ID" heißt ?
Ist das "fmt" eine Formatanweisung für den Zugriff auf oForm ?
Nein, das ist die Bezeichnung des Formularfeldes. Öffne das Formular zum Bearbeiten, nicht zur Dateneingabe. Gehe auf das Feld, aus dem Du die den entsprechenden Inhalt auslesen willst, und schau Dir an, was dort unter "Allgemein" > "Name" steht.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

WonneWasti
! Supporter - Spende !
Beiträge: 73
Registriert: So 1. Jan 2017, 11:34

Re: Makroprogrammierung in Base

Beitrag von WonneWasti » So 1. Mär 2020, 18:47

O-mei saind mia bläääd ! (Zitat aus "Die Erstbesteigung vom Kofler Horn" )

Abende - lang hatte ich es unter der Nase und habe es nicht gesehen......

Ich schäme mich meiner Blindheit und Verwirrung. (auch nicht gaaanz ernst)

Und ich danke.

Wasti aus Wonneberg

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Makroprogrammierung in Base

Beitrag von F3K Total » So 1. Mär 2020, 18:55

Hallo WonneWasti,
habe zwar gerade gelesen, dass das Problem gelöst ist, trotzdem hier meine bereits vorbereitete Antwort:

Die Makrokonstruktion ist etwas schwer zu verstehen, weil in der "Zusatzinformation" (.Tag) der auslösenden Schaltfläche, eine Information eingetragen werden muss, die das Makro verwendet um den Namen des zu verwendenden Kontrollfeldes zu übergeben.
Beispiel: In der Zusatzinformation steht true; fmtID
mit

Code: Alles auswählen

stTag = oFeld.Tag
wir der String true; fmtID in die Variable stTag eingelesen.
mit

Code: Alles auswählen

arList = Split(stTag, ";")
wird dieser String am Semikolon getrennt und in ein Array eingelesen also

Code: Alles auswählen

arList(0) = true
arList(1) = fmtID
darum steht in folgender Zeile

Code: Alles auswählen

oFeldID = oForm.getByName(Trim(arList(1)))
letztendlich nicht mehr als

Code: Alles auswählen

oFeldID = oForm.getByName("fmtID")
was wiederum nichts weiter bedeutet, als dass das Kontrollfeld mit dem Namen fmtID, welches sich auf dem strukturellen Formular oForm befindet, in die Variable oFeldID eingelesen wird.

Wenn du den Aufbau der Formulare per Makro analysieren möchtest, empfehle ich Dir die Verwendung eines Introspection-Tools wie MRI oder Xray
Damit kannst Du alle OOo-Dokumente hinsichtlich ihres Aufbaues durchleuchten.
Beispiel, im Formularnavigator siehst du dies:
FN.PNG
FN.PNG (14.18 KiB) 3467 mal betrachtet
Dann geht der folgende Code:

Code: Alles auswählen

Sub analyse_Conrols
    oFormular = Thiscomponent.drawpage.Forms.getbyname("Formular")
    otxt = oFormular.getbyname("Textfeld 1")
    ocmd = oFormular.getbyname("Schaltfläche 1")
    ochk = oFormular.getbyname("Markierfeld 1")
    Xray otxt
    Xray ocmd 
    Xray ochk
End Sub
um die drei Kontrollfelder auf dem Formular mit dem Namen Formular zu analysieren. Beispiel anbei, geht aber nur wenn du Xray installiert, und die Xray-Makro-Library geladen hast.
Gruß R (alias F3K Total)
Dateianhänge
XrayTest.odt
(10.08 KiB) 214-mal heruntergeladen
Windows 11: AOO, LO Linux Mint: AOO, LO

WonneWasti
! Supporter - Spende !
Beiträge: 73
Registriert: So 1. Jan 2017, 11:34

Re: Makroprogrammierung in Base

Beitrag von WonneWasti » So 1. Mär 2020, 20:07

Hallo, F3K Total,

deine Antwort erschlägt mich ja schon fast mit ihrer Ausführlichkeit ! Merci bouqou !

Ich hatte tatsächlich versucht "fmtID" mit "ID" als Spaltenname in Verbindung zu bringen, Tabellenfeldbezeichner anzupassen oder den übergebenen String. Die Programmstruktur mit dem Tag/Zusatzinformationen - String hatte ich sogar schon verstanden. Die Fehlermeldung mit "exception" hat mich zunächst eher verwirrt als geleitet.
Und manchmal fällt es einem wie Schuppen von den Augen. Der Lerneffekt bei Fehlersuche ist jedenfalls bei mir um Längen besser als wen ich ein Lehrbuch lese dessen Sinn sich erst zum Schluss offenbart. Oder: fach es macht einfach Spass.

Die liebsten Weihnachtsgeschenke waren mir immer die Spielzeuge die bald kaputt waren. Dann hatte ich nämlich einen Grund sie zu zerlegen und zu sehen wie sie funktionieren - sollten.

Habe noch einmal Dank und
"möge deine Hilfe auch mit Anderen sein!"


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten