Wert einer Tabelle per Makro auslesen und in eine andere speichern

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Robs123
Beiträge: 20
Registriert: Mo 7. Aug 2017, 09:49

Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von Robs123 » Mo 14. Aug 2017, 10:59

Hallo zusammen,

ich schreibe zur Zeit an einem Makro, welches zum Ziel hat, ein zweites Formular zu öffnen, und die im ersten Formular eigegebene ID zu übernehmen und in die zugehörige Tabelle zu speichern. Ich habe also zwei Formulare und zwei Tabellen. Meine bisherige Vorgehensweise:

1. Aktuelle Daten im Formular(1) in die Tabelle(1) speichern.
2. Das Feld "ID" auslesen und irgendwie speichern, dass es in einem anderen Formular abgerufen werden kann. Hierzu habe ich etwas von versteckten Feldern gelesen, die dann Temporär mit dem Wert belegt werden? Oder geht das direkter?
3. Das nächste Formular öffnen. Es ist für mich an dieser Stelle wichtig, dass ein seperater Bogen geöffnet wird, da dieser nur manchmal (Bei 'Nein' einer vorherigen Frage) gebraucht wird.
4. Den Wert 'ID' aus der ersten Tabelle ins zweite Formular einzutragen. Hierzu müsste ich den unter 2. gespeicherten Wert auslesen und ganz normal eintragen. Dies muss sicher funktionieren, damit die Daten am Ende nicht durcheinander geraten.


Der Stand so weit: Mein Makro kann speichern und ein zweites Formular öffnen. Wenn ich beiden zusammen in ein sub schreibe erhalte ich allerdings bei der Formular öffnen Zeile (ganz unten) den 'Objektvariable nicht belegt' Fehler. In einem eigenen Makro funktioniert es allerdings, auch ohne dass ich irgendwelche Variablen definiere.. Zu den Punkten 2. und 4. bin ich bisher noch Ideenlos.

Code: Alles auswählen

sub Saveandopen


dim document   as object
dim dispatcher as object


document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")


dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())

ThisDatabaseDocument.FormDocuments.getByName("Formular2").open

end sub
Ich brauche die Formulare nur Daten einzutragen, Abfragen (außer das mit der ID) werden nicht gebraucht. Der Versuch eine Beziehung zwischen den Tabellen herzustellen und somit den ID-Wert zu übernehmen is leider auch fehlgeschlagen. Da ich mit der Sprache hier nicht vertraut bin, fällt es mir sehr schwer, ein neues Makro 'von null' zu schreiben. Gibt es vielleicht ähnliche Makros, aus denen ich mir einzelne Punkte zusammen suchen kann? Bei meiner Suche im Forum konnte ich leider auch nicht die richtige Lösung finden.

Liebe Grüße,

Rob



gogo
Beiträge: 807
Registriert: Sa 5. Feb 2011, 19:07

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von gogo » Mo 14. Aug 2017, 16:29

Im Handbuch gibt's dazu sicher eine Beschreibung ...

Kurz:

Code: Alles auswählen

sub FormularMitFilterOeffnen(oEvent)
    sFormZwei = "Formular2"

    ' ermittle die fuer Formular2 gefragte ID aus Formular1:
    sGewuenschteID = oEvent.Source.Model.Parent.getbyname("Name_des_Kontrollelements_in_dem_die_gewuenschte_ID_steht").currentValue

    ' oeffne Formular2 und speichere das "Fenster" in der Variable oNeuGeoeffnetesFormular
    oNeuGeoeffnetesFormular = ThisDatabaseDocument.FormDocuments.getByName( sFormZwei ).open

    oFormObjektFuerFilter   = oNeuGeoeffnetesFormular.Drawpage.Forms.getbyIndex(0)

    ' setze in dem neuen Formular einen Filter um nur die gewuenschte ID anzuzeigen
    oFormObjektFuerFilter.Filter= "ID = " & sGewuenschteID
    oFormObjektFuerFilter.reload

end sub
Dieses Makro einem Button in Deinem Ersten Formular zuweisen.
Anpassen musst Du "Formular2", "Name_des_Kontrollelements_in_dem_die_gewuenschte_ID_steht" sowie "ID = " & sGewuenschteID.
Also den Namen des Formulars das Du öffnen willst, den Namen des Eingabefeldes in Formular1 für die in Formular2 gesuchte ID und den Text des Filters - der wäre derzeit "ID = 5" - falls 5 in dem ID-Feld steht
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff

RobertG
Beiträge: 1768
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von RobertG » Mo 14. Aug 2017, 17:25

Hallo *,

ich habe das jetzt doch noch eben kurz in eine Beispieldatenbank gepackt. Das Makro dazu ist an einen Button gebunden, der in den Zusatzinformationen die Information liegen hat, welches Formular als nächstes geöffnet werden soll. Die ID ist händisch zu vergeben. Das Makro geht von einer ID > 0 aus. Die Variablen sind alle nicht weiter definiert.
Kurzdefinition: alles mit o... ist ein Objekt, mit st... ist ein String, mit lo... ist eine Long-Variable usw.

Gruß

Robert
Dateianhänge
Formularsprung.zip
(17.38 KiB) 59-mal heruntergeladen

Robs123
Beiträge: 20
Registriert: Mo 7. Aug 2017, 09:49

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von Robs123 » Di 15. Aug 2017, 09:52

Hallo, vielen lieben Dank ihr zwei!

gogo: ich versuche gerade deinen code an meine Datenbank anzupassen, bekomme aber immer den Fehler, das eine Objektvariable nicht belegt sei in

Code: Alles auswählen

  oNeuGeoeffnetesFormular = ThisDatabaseDocument.FormDocuments.getByName( sFormZwei ).open
ich habe statt sFormZwei schon versucht, "Formular2" direkt zu öffnen - selber Fehler.
Des weiteren verstehe ich nicht, was ich bei
"ID = " & sGewuenschteID
ändern soll? ID = aktuelle ID ist doch genau das, was ich brauche.


Robert:
Ich danke dir recht herzlich für deine Mühe.
Es klappt leider nur mit den ID's 1 und 2 die schon in der Hintergrundtabelle vorhanden sind. Wenn ich eine neue ID eintrage, kommt folgender Fehler:
Fehler beim Schreiben des aktuellen Datensatzes
SQL-Status: 23000
Fehler-Code: -8

Integrity constraint violation SYS_FK_59 table: Tabelle2 in statement [UPDATE "Tabelle1" SET "ID" = ?,"Inhalt1" = ? WHERE "ID" = ?]
Das Makro hängt sich an der Stelle "UpdateRow" auf, so wie ich es verstehe.
Schön gelöst finde ich es, den Namen aus den Zusatzinformationen zu bekommen, elegant!


Mit beiden Varianten bin ich nun kurz vor dem Ziel! Ich werde es heute den Tag über weiter probieren, ich denke aber, dass jemand mit mehr Ahnung die Fehler schneller findet.

Danke für die Hilfe!

RobertG
Beiträge: 1768
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von RobertG » Di 15. Aug 2017, 10:34

Hallo Robs123,

der Fehler liegt darin, dass Du vermutlich einfach die Eingabe von Formular 1 löscht und mit anderen Daten zu überschrieben versuchst. Ich habe das gerade mit "3" probiert: Neuer Datensatz, 3 und in das Textfeld etwas Text, Speichern und Wechsel nach Formular 2 > 3 wird eingetragen, Text kann hinzugefügt werden usw.
Du landest bei Formular 1 wieder bei der 3 als Primärschlüssel. Du darfst diese Schlüssel nicht ändern (oder musst das vorher in den Beziehungen klären). Du musst einen neuen Datensatz erstellen. Geht über die Datensatznavigation gegebenenfalls auch einen Button.

Gruß

Robert

Robs123
Beiträge: 20
Registriert: Mo 7. Aug 2017, 09:49

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von Robs123 » Di 15. Aug 2017, 10:37

Hallo Robert,

Tatsache, es klappt!
Super, vielen lieben Dank!

LG Rob

Robs123
Beiträge: 20
Registriert: Mo 7. Aug 2017, 09:49

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von Robs123 » Di 15. Aug 2017, 12:25

Liebe Experten,

die Einbettung des makros scheitert an folgendem Problem: Im Hauptformular, aus dem heraus das Makro gestartet wird, hat mehrere Elemente, die eine Eingabe erfordern. Diese Elemente kommen aber nach dem Makro-auslösenden element, sind also noch leer. Wenn das Makro nun startet erscheint die Fehlermeldung, dass das Feld X eine Eingabe benötigt, und das Makro hängt sich an der Stelle updateRow auf.
Kann ich das irgendwie in dem Makro umgehen? Insgesamt würde ich die Fehlermeldung gerne behalten, um sicher zu gehen, dass am Ende des Formulars nichts vergessen wurde.

RobertG
Beiträge: 1768
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von RobertG » Di 15. Aug 2017, 12:45

Hallo Robs123,

ich bin davon ausgegangen, dass Du zuerst das erste Formular abarbeitest, anschließend das 2. und danach das 3. Du kannst natürlich auch die ganze Schleife zum Abspeichern raus nehmen. Dann springst Du von einem Formular zum anderen und wirst Durch die GUI dazu aufgefordert, gegebenenfalls zu speichern.
Also

Code: Alles auswählen

IF oForm.isNew THEN 'Abspeichern - bei neuem Datensatz insert, bei bestehendem Datensatz update
	oForm.insertRow()
ELSE
	oForm.updateRow()
END IF
einfach löschen oder mit ' jede Zeile auskommentieren.

Gruß

Robert

Robs123
Beiträge: 20
Registriert: Mo 7. Aug 2017, 09:49

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von Robs123 » Di 15. Aug 2017, 14:03

Hi Robert,

ich nutze diese Art um ggf. Zwischenfragen aufzurufen. An sich würde ich schon gerne speichern an der Stelle, aus Angst, die bisher eingegebenen Daten zu verlieren. Wenn es mit dem 'Eingabe erforderlich' nicht geht, muss ich diese wieder aus dem Formular entfernen. Ich dachte nur, es gäbe vielleicht einen 'force save' befehl, der die aufpoppende 'Eingabe erforderlich' meldung unterdrückt.

Wenn ich alles rausnehme wie von dir vorgeschlagen, passiert so leider garnichts mehr... Kein Dokument geht auf und auch keine Fehlermeldung.


Liebe Grüße,
Rob

RobertG
Beiträge: 1768
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Wert einer Tabelle per Makro auslesen und in eine andere speichern

Beitrag von RobertG » Di 15. Aug 2017, 16:08

Hallo Rob,

wenn ich die oben vermerkten Zeilen zum Speichern entferne, dann springe ich mit dem Button von einem zum anderen Formular - auch wenn ich den eingetragenen Schlüsselwert nicht speichere.
Was natürlich passiert: Ein nicht abgespeichertes Formular, erneut angesprungen, ist natürlich wieder leer. Das geht also so lange gut, wie Du von Formular 1 nach Formular 2 und dann nach Formular 3 springst. Danach solltest Du die geöffneten Fenster nutzen, wenn Du nicht gespeichert hast. Der Button im Formular 3 müsste also raus, damit klar wird: Spätestens jetzt bitte Fenster füllen und dann speichern - sonst wird das nichts.

Gruß

Robert



Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste