Übergabe Wert von Formular an Formular

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

Moderator: Moderatoren

Puck1978

Übergabe Wert von Formular an Formular

Beitrag von Puck1978 » Mo, 02.01.2017 14:48

Guten Tag zusammen und ein frohes neues Jahr

ich benötige Eure Hilfe bei der Lösung eines hoffentlich einfachen Problems: Ich habe eine Datenbank mit mehreren Tabellen und Formularen. Formular 1 befüllt Tabelle 1. Um einige Zusatzinformationen zu erfassen, soll aus Formular 1 heraus ein weiteres Formular (2) geöffnet werden. In dieses werden per Makro drei Filterwerte aus Formular 1 übertragen, die mit Formulareinträgen in Formular 2 zu einem Datensatz ergänzt werden, der in einer separaten Tabelle abgelegt wird.
Das Makro, welches ich dank der Hilfe im Forum hierfür erstellt habe (vielen Dank hierfür), sieht so aus:

Code: Alles auswählen

Sub CallOrderFormStamm( oEvent as Object )

Dim adrForm as Object
Dim newForm as Object
Dim ssql(0) as string

adrForm = oEvent.Source.Model.Parent

oform = Thiscomponent.drawpage.forms.MainForm
oListenfeld1 = oform.getByName("lbEmittent")
s_selection = oListenfeld1.CurrentValue'Ausgewählten Wert aus Listbox 1 auslesen

oListenfeld2 = oform.getByName("lbStamm")
s_selection2 = oListenfeld2.CurrentValue'Ausgewählten Wert aus Listbox 2 auslesen

oListenfeld3 = oform.getByName("lbGeschaeftsjahr")
s_selection3 = oListenfeld3.CurrentValue'Ausgewählten Wert aus Listbox 3 auslesen

newForms = thisDatabaseDocument.FormDocuments.getByName("frm_Aktien_Umlauf_Stamm").open

newForm = newForms.drawpage.forms.MainForm

oListenfeld1 = newForm.getByName("lbEmittentStA")
oListenfeld1.ListSourceType = 3'Sql
ssql(0)= "SELECT ""Name_Emittent"" FROM ""T_Stammdaten_Emittent"" WHERE ""Name_Emittent"" ='"+s_selection+"'"
oListenfeld1.ListSource=ssql'Sql Befehl eintragen
oListenfeld1.refresh

oListenfeld2 = newForm.getByName("lbISIN_Stamm")
oListenfeld2.ListSourceType = 3'Sql
ssql(0)= "SELECT ""ISIN"" FROM ""T_Stammdaten_Wertpapiere"" WHERE ""ISIN"" ='"+s_selection2+"'"
oListenfeld2.ListSource=ssql'Sql Befehl eintragen
oListenfeld2.refresh

oListenfeld3 = newForm.getByName("lbGeschaeftsjahr2")
oListenfeld3.ListSourceType = 3'Sql
ssql(0)= "SELECT ""Geschaeftsjahr"" FROM ""T_Geschaeftsjahre"" WHERE ""Geschaeftsjahr"" ='"+s_selection3+"'"
oListenfeld3.ListSource=ssql'Sql Befehl eintragen
oListenfeld3.refresh

End Sub
Die Felder, in welche das Makro die Daten schreibt, sind als nicht aufklappbare, einzeilige Listenfelder definiert.

Mein Problem ist nun, dass die vom Makro übertragenen Daten in den Listenfeldern angezeigt werden, beim Speichern des Datensatzes in Formular 2 jedoch folgende Fehlermeldung erscheint:
"Für das Feld "[Listenfeld]" ist eine Eingabe erforderlich. Geben Sie dort einen Wert ein".

Obwohl also das Formular einen Wert anzeigt, interpretiert die Datenbank das Feld als leer, wodurch der Constraint NOT NULL verletzt wird.
Der Fehler tritt nicht auf, wenn ich entweder
  • die Listenfelder mit der Maus anklicke, oder
  • die Listenfelder als aufklappbar definiere und die Daten nach Aufrufen des Formulars über das Dropdown noch einmal auswähle.
Beide Aktionen lösen also offenbar einen Vorgang aus, der im Makro bislang fehlt.
Bislang ging ich davon aus, dass dies der .refresh-Befehl sei, aber entweder funktioniert er in meinem Makro nicht oder er muss durch einen weiteren Befehl ergänzt werden.
Ich hoffe, ich habe das Problem einigermaßen nachvollziehbar beschrieben.

Für Anregungen (gerne auch Orte zum Nachlesen) danke ich im Voraus.


Viele Grüße


Puck1978

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

Re: Übergabe Wert von Formular an Formular

Beitrag von F3K Total » Mo, 02.01.2017 16:16

Hallo Puck,
mit

Code: Alles auswählen

oListenfeld2.ListSource=ssql
füllst du nur die Auswahlliste des Listenfeldes, mit refresh zeigst du sie an.
Weshalb verwendest du überhaupt ein Listenfeld, wenn du sowieso nur einen Wert je Feld in die DB eintragen möchtest? Das geht per Textfeld oder formatiertem Feld, aber noch einfacher, wenn du gleich die Daten in die Datengrundlage des Formulares schreibst, etwa so, wenn deine Spalten EmittentStA, ISIN_Stamm und Geschaeftsjahr heißen:

Code: Alles auswählen

.
.
.
newForm = newForms.drawpage.forms.MainForm
newForm.movetoinsertrow
newForm.Columns.EmittentStA.updatestring(s_selection)
newForm.Columns.ISIN_Stamm.updateint(s_selection2)
newForm.Columns.Geschaeftsjahr.updateint(s_selection3)
newForm.insertrow
newForm.reload
Das ist nur geschossen. Ich habe die Spaltennamen und den Spaltentyp angenommen, EmittentStA sei VARCHAR, die andern INTEGER.
Du kannst die DB ja mal verfremdet hier hochladen.
Gruß R

Puck1978

Re: Übergabe Wert von Formular an Formular

Beitrag von Puck1978 » Di, 03.01.2017 09:07

Guten Morgen R

vielen herzlichen Dank für die rasche Antwort. Der Feldtyp Listenfeld ist in der Tat ein Relikt aus einer früheren Version. Das Listenfeld sollte den Klarnamen des Werts anzeigen, eingetragen werden sollte nur der Schlüssel. Klarname und Schlüssel sind für "ISIN" und "Geschäftsjahr" jedoch inzwischen identisch, so dass ich in der Tat mit einem Text- oder einem formatierten Feld arbeiten kann.

Ich habe Deinen Code nun wie folgt modifiziert übernommen:

Code: Alles auswählen

newForm.movetoinsertrow
newForm.Columns.ISIN.updatestring(s_selection2)
newForm.Columns.Geschaeftsjahr.updateint(s_selection3)
newForm.insertrow
newForm.reload

oListenfeld1 = newForm.getByName("lbEmittentStA")
oListenfeld1.ListSourceType = 3'Sql
ssql(0)= "SELECT ""Name_Emittent"" FROM ""T_Stammdaten_Emittent"" WHERE ""Name_Emittent"" ='"+s_selection+"'"
oListenfeld1.ListSource=ssql'Sql Befehl eintragen
oListenfeld1.refresh
Da "EmittentStA" aus "ISIN" über eine Schlüsseltabelle ermittelt werden kann, habe ich die Tabelle so modifiziert, dass der Wert nur angezeigt und nicht eingetragen werden muss.
Ich habe die beiden Listenfelder in formatierte Felder umgewandelt, erhalte aber dennoch folgenden

Basic-Laufzeitfehler. Es ist eine Exception aufgetreten. Type: com.sun.star.sdbc.SQLException Message:Fehler in der Funktionsfolge.

Irgendwo scheint es also noch zu klemmen. Falls Du für die Analyse eine verfremdete Version der DB benötigst, kann ich diese noch erstellen, meine Vermutung wäre jedoch, dass wir schon fast am Ziel sind.

Vielen herzlichen Dank für die Hilfe und beste Grüße

Puck1978

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

Re: Übergabe Wert von Formular an Formular

Beitrag von F3K Total » Di, 03.01.2017 10:05

Hallo Puck,
ja eine verfremdete Version ist besser, momentan hast du Kuddelmuddel...
Ah Sekunde, vermutlich gibt es das Problem, weil das strukturelle Formular noch nicht geladen ist. Füge mal

Code: Alles auswählen

do
    wait 10
loop until newForm.isloaded
über

Code: Alles auswählen

newForm.movetoinsertrow
ein.
Gruß R

Puck78
Beiträge: 3
Registriert: Mo, 02.01.2017 14:07

Re: Übergabe Wert von Formular an Formular

Beitrag von Puck78 » Mi, 04.01.2017 11:28

Guten Morgen R,

ich habe das Makro wie beschrieben angepasst, erhalte aber nun eine andere Fehlermeldung. Zur Illustration habe ich eine verfremdete Version der Datenbank unter folgendem Link hinterlegt: https://www.dropbox.com/s/ou5bs2in2meyl ... P.odb?dl=0. Der Upload ins Forum ist leider daran gescheitert, dass ich keinen Weg gefunden habe, die Datenbank unter die Uploadbeschränkung zu komprimieren.
Der Testszenario ist wie folgt:
  • Formular frm_Emittent_Jahresabschluesse aufrufen
  • Emittent per Dropdown auswählen und per Tab zum Dropdown ISIN Stämme wechseln
  • Detailformular über Button Detaildaten erfassen aufrufen.
Die weiß hinterlegten Felder des Detailformulars sollen durch das Makro so befüllt werden, dass nur noch in die grau hinterlegten Felder Werte eingegeben werden müssen und der Datensatz dann gespeichert werden kann.

Noch einmal vielen herzlichen Dank für die Hilfsbereitschaft, beste Grüße

Puck1978

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

Re: Übergabe Wert von Formular an Formular

Beitrag von F3K Total » Mi, 04.01.2017 12:39

Hey,
kann die Datei nicht nutzen, es fehlt die Tabelle "T_Emittent_Jahresabschluesse" an die das erste Formular gebunden ist.

Allerdings frage ich mich, wozu du in ein zweites Formular springen willst, das Erfassen der Jahresabschlüsse kann man doch in einem Formular erledigen. Oben werden Emittent, ISIN und Geschäftsjahr ausgewählt, unten die sechs weiteren Felder befüllt. Das geht mit einem strukturellen Unterformular sehr einfach und braucht kein Makro, nur eine Verknüpfung.
Gruß R

Puck78
Beiträge: 3
Registriert: Mo, 02.01.2017 14:07

Re: Übergabe Wert von Formular an Formular

Beitrag von Puck78 » Mi, 04.01.2017 18:11

Guten Abend R

ich bitte um Entschuldigung, ich habe wohl eine falsche Version hochgeladen. Ich habe die Datei nun getauscht, der neue Link lautet:
https://www.dropbox.com/s/ygogyje2xweia ... P.odb?dl=0

Vielen Dank auch für Deinen Vorschlag mit dem Unterformular - dies hatte mir aber für folgende Anforderung keine befriedigende Lösung geliefert: Werden alle Daten in einer Tabelle erfasst, sind die Kennzahlen Ergebnis je Aktie und Dividende je Aktie nur für das jeweilige Jahr auf Basis der für dieses Jahr gültigen Aktienanzahl ermittelbar. Für Zeitreihen kann es aber notwendig sein, diese Kennzahlen auf Basis einer einheitlichen Aktienanzahl zu berechnen, da Aktiensplitts o.ä. andernfalls zu Verzerrungen führen. Hier erschien es mir das Einfachste, zwei Tabellen zu erstellen und die Daten über eine Query zusammenzuführen.
Gerne bin ich hier aber auch offen für einfachere Vorschläge.

Vielen Dank noch einmal und beste Grüße

Puck78

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

Re: Übergabe Wert von Formular an Formular

Beitrag von F3K Total » Do, 05.01.2017 01:34

Hey,
tut mir Leid, ich verstehe das nicht. Im Formular frm_Aktien_Umlauf_Stamm hast du ein Listenfeld lbEmittentStA an eine Spalte ID_Emittent gebunden, die in der Tabelle T_Aktien_Umlauf_Stamm nicht existiert. Siehe Bild:
Form.png
Form.png (28.06 KiB) 1023 mal betrachtet
Ausserdem hast du das Makro Makros_PCS.Makros_Kennzahlen_Wertpapiere.FormularClose nicht mitgeliefert.
Also irgendwie ist da der Wurm drin.
Gruß R

Puck78
Beiträge: 3
Registriert: Mo, 02.01.2017 14:07

Re: Übergabe Wert von Formular an Formular

Beitrag von Puck78 » Fr, 06.01.2017 12:16

Hallo R,

entschuldige, wenn ich Dich nun zweimal umsonst bemüht habe. Ich habe anhand Deines ersten Hinweises und Deinen Anregungen aus diesem älteren Post (viewtopic.php?t=53803)
Re: Recordset des Formulars manipulieren
Beitrag von F3K Total » Fr, 15.06.2012 18:25
noch einmal herumprobiert und siehe da, es hat geklappt. Folgendes Makro liefert nun das gewünschte Ergebnis:

Code: Alles auswählen

Sub CallOrderFormStammTrans( oEvent as Object )

Dim adrForm as Object
Dim newForm as Object
Dim ssql(0) as string

adrForm = oEvent.Source.Model.Parent

oform = Thiscomponent.drawpage.forms.MainForm

oListenfeld1 = oform.getByName("lbEmittent")
s_selection = oListenfeld1.CurrentValue'Ausgewählten Wert aus Listbox 1 auslesen

oListenfeld2 = oform.getByName("lbStamm")
s_selection2 = oListenfeld2.CurrentValue'Ausgewählten Wert aus Listbox 2 auslesen

oListenfeld3 = oform.getByName("lbGeschaeftsjahr")
s_selection3 = oListenfeld3.CurrentValue'Ausgewählten Wert aus Listbox 3 auslesen

newForms = thisDatabaseDocument.FormDocuments.getByName("frm_Aktien_Umlauf_Stamm").open

newForm = newForms.drawpage.forms.MainForm

do
    wait 10
loop until newForm.isloaded

newForm.movetoinsertrow
newForm.Columns.ISIN.updatestring(s_selection2)
newForm.Columns.Geschaeftsjahr.updatestring(s_selection3)

oListenfeld1 = newForm.getByName("lbEmittentStA")
oListenfeld1.ListSourceType = 3'Sql
ssql(0)= "SELECT ""Name_Emittent"" FROM ""T_Stammdaten_Emittent"" WHERE ""Name_Emittent"" ='"+s_selection+"'"
oListenfeld1.ListSource=ssql'Sql Befehl eintragen

End Sub
Deine Codezeile

Code: Alles auswählen

newForm.insertrow
habe ich eliminieren müssen - anderenfalls hat das Makro in Verbindung mit den als NOT NULL definierten Spalten der Zieltabelle eine Fehlermeldung erzeugt. Zudem habe ich im Formular Änderungen zugelassen, sonst waren keine manuellen Eingaben möglich.
Falls Du hier noch etwas Eleganteres im Ärmel hast, bin ich für Vorschläge dankbar, kann aber mit der jetzigen Lösung gut weiterarbeiten.

Vielen Dank noch einmal für Deine Hilfe, beste Grüße und schönes Wochenende


Puck78

Antworten

Wer ist online?

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