Seite 1 von 1

Makroprogrammierung in Base

Verfasst: Do 27. Feb 2020, 09:57
von WonneWasti
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.....

Re: Makroprogrammierung in Base

Verfasst: Do 27. Feb 2020, 15:32
von RobertG
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

Re: Makroprogrammierung in Base

Verfasst: So 1. Mär 2020, 17:26
von WonneWasti
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 ? ;-)

Re: Makroprogrammierung in Base

Verfasst: So 1. Mär 2020, 18:19
von RobertG
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

Re: Makroprogrammierung in Base

Verfasst: So 1. Mär 2020, 18:47
von WonneWasti
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

Re: Makroprogrammierung in Base

Verfasst: So 1. Mär 2020, 18:55
von F3K Total
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) 3460 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)

Re: Makroprogrammierung in Base

Verfasst: So 1. Mär 2020, 20:07
von WonneWasti
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!"