Kombinationsfeld - Daten zweier Tabellen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Kombinationsfeld - Daten zweier Tabellen

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Do, 09.01.2014 14:41

ohja, das habe ich wirklich übersehen. Jetzt funktioniert es (:

Musste allerdings im Makro "ID" zu "Kunde_ID" ändern, wodurch dann leider mein zweites Combifeld (Stationsort_ID) mit dem Makro nicht funktioniert. Nenne dummerweise meine Primärschlüssel nicht nur ID, sondern "Sonstewas_ID" also je nach Tabelle unterschiedlich :/ Hab jetzt gedacht ich benenne die Primärschlüssel einfach um, aber das zerschießt meine ganzen Beziehungen und Tabellen.

Naja zumindest klappt es dann bei Kunde > Ort, beim Stationsort behalte ich dann einfach die andere Variante zum Eintragen eines neuen Datensatzes über ein externes Formular.

Danke für deine Hilfe! (:

Liebe Grüße, Steffi

Re: Kombinationsfeld - Daten zweier Tabellen

von RobertG » Mi, 08.01.2014 15:42

Hallo Steffi,

in der Schilderung, was Du bisher erledigt hast, fehlt
- Gründung eines versteckten Steuerelementes mit dem Namen "Comboboxen", in dem der Name der verschiedenen eingebauten Kombinationsfelder (in den Zusatzinformationen) steht.
- Eintrag in den Zusatzinformationen der Kombinationsfelder, welchen Namen das Feld trägt, das den Fremdschlüssel beherbergt. (bei Dir also in dem Kombifeld: "Kunden_ID")

Wenn die Fehlermeldung bereits bei den "Comboboxen" auftaucht, dann fehlt schlicht dieses (versteckte) Steuerelement.
Schau Dir das Ganze einfach einmal in den Formularen an, indem Du auch den Formularnavigator zu Hilfe nimmst. Die versteckten Steuerelemente tauchen ja sonst nirgendwo auf.

Gruß

Robert

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Mi, 08.01.2014 08:35

Hallo Robert,

bin jetzt endlich mal dazu gekommen es auszuprobieren (: habe die Variante ohne Abfrage genutzt aus dem Formular "Name".
Dank deinem automatisierten Code ists ja eigentlich nur:

- Kombifeld erstellen mit einem SQL-Befehl (in meinem Fall: SELECT "Name" FROM "TA_Kunde" ORDER BY "Name" ASC) und an das Ereignis "Text modifiziert" das Makro "Datensatzaktion_erzeugen" hängen
- numerisches Feld mit der ID von TA_Kunde erstellen, also: Kunden_ID
- an das Formular die Aktionen "TextAuswahlWertSpeichern" (Vor der Datensatzaktion) und "TextAnzeigen" (Nach dem Datensatzwechsel) fügen.

aber irgendwie kommt beim Ausführen eine NoSuchElementException, weil er scheinbar das betreffende Kombifeld nicht findet - es wird dann auf die Codezeile

Code: Alles auswählen

aComboboxen() = Split(oForm.getByName("Comboboxen").Tag,",") 'Ermittelt aus dem Startformular die betroffenen Comboboxen
verwiesen.

Woran könnte das liegen? Vllt daran, dass ich neben dem Combifeld noch Listenfelder in meinem Formular habe?

Liebe Grüße & noch ein frohes neues Jahr (:

Re: Kombinationsfeld - Daten zweier Tabellen

von RobertG » Fr, 27.12.2013 12:24

Hallo Steffi,

ich habe jetzt noch einmal an dem Makro für Kombinationsfelder als Ersatz für Listenfelder gearbeitet. Inzwischen habe ich das so weit, dass keine Zusatzinformationen mehr in das Makro eingegeben werden müssen. Die werden jetzt alle aus den Formularfeldern und entsprechenden Eingaben in den Zusatzinformationen der Formularfelder erstellt.

Ich hänge die entsprechende Beispieldatenbank für das kommende Handbuch der Version LO 4.2 einmal an.

Gruß

Robert
Dateianhänge
Combobox_Listfeld.odb
Combobox zur Eingabe in Fremdschlüsselfelder
(50.5 KiB) 130-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Mo, 23.12.2013 16:14

Hallo Robert,

ja das hilft mir weiter und funktioniert super - mit solch einer Abfrage bleiben dann auch die anderen Felder der Tabelle editier- und speicherbar (:

Dankeschön und frohe Weihnachten (:

Re: Kombinationsfeld - Daten zweier Tabellen

von RobertG » Fr, 20.12.2013 19:33

Hallo Steffi,

ich habe die Abfrage einmal zu einer Abfrage mit korrelierenden Unterabfragen geändert. Vielleicht hilft Dir das etwas weiter. Die Kosten solltest Du auf keinen Fall in der Tabelle "Main" als Feld aufführen. Die berechnest Du.

Gruß

Robert
Dateianhänge
BeispielDB_TabelleListenfeld(1).odb
(29.61 KiB) 93-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Fr, 20.12.2013 10:31

Ach ja stimmt.. diese SQL-Abfrage hatte ich integriert, weil ich noch etwas mithilfe anderer Felder berechnen wollte.. und ich keine Möglichkeit gefunden habe, in diese Standard-Tabellenfelder SQL-Abfragen einzubinden - oder geht das doch irgendwie?

Also soll beispielsweise im Formular "Alle Daten" auf Basis der Tabelle TA_Main die Summe aus einem Feld der Tabelle TA_Farbe und beispielsweise einer neuen Tabelle TA_Form berechnet werden.
Im Formular "Alle Daten Abfrage Kosten" ists zu sehen, bloß da geht der Rest dann wieder nicht, weil es auf einer Abfrage beruht und nicht auf der Tabelle TA-Main.

Liebe Grüße, Steffi (:
Dateianhänge
BeispielDB_TabelleListenfeld.odb
(29.98 KiB) 77-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von RobertG » Do, 19.12.2013 17:29

Hallo Steffi,

das Formular "Datensatz Bearbeiten Tabelle" ist nicht mit der Tabelle verbunden, die Du eigentlich bearbeiten willst. Der dort enthaltene Wert "Farbe_ID" ist nicht der Wert des Fremdschlüsselfeldes. Er ist der Primärschlüssel der Tabelle "Farbe". Damit würdest Du also gegebenenfalls versuchen, in der Tabelle "Farbe" den Primärschlüssel mit einem bestehenden Wert zu überschreiben.
Es funktioniert allerdings auch nicht mit einer Abfrage, in der der Fremdschlüssel enthalten ist. Das könnte eventuell als Bug durchgehen, da bei einer entsprechend versuchten Eingabe sich sehr wohl die entsprechenden Felder erst einmal anpassen (Farbe ändert sich in der dem Textfeld und dem Schlüsselfeld).

Grundsätzlich solltest Du in einem Formular nur die Daten einer Tabelle ändern und nicht irgendwie versuchen, Änderungen in zwei Tabellen gleichzeitig zu machen. Eigentlich willst Du ja gar nicht die Tabelle "Farbe" verändern, sondern nur die Zuweisung in der Tabelle "Main". Dann brauchst Du auch nur diese Tabelle in Deinem Formular zu bearbeiten - und Farbe eben über ein Listenfeld darzustellen.

Ich habe Dir einmal ein neues Formular, basierend auf "Alle Daten", erstellt. Da ist dann wirklich das enthalten, was Du brauchst.

Gruß

Robert
Dateianhänge
BeispielDB_TabelleListenfeld.odb
(44.36 KiB) 95-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Do, 19.12.2013 15:13

Hallo Robert,

danke für den Navi-Tipp! Durch das Kopieren hat sich noch ein neues MainForm-Formular gebildet, in dem die Felder drin lagen - konnten also gar nicht gefunden werden ;) Allerdings klappt jetzt irgendwas mit dem insert nicht, aber da muss ich mich später mit beschäftigen.

Hänge jetzt erst mal an einer Kleinigkeit (glaube ich), aber weiß einfach nicht warum es nicht klappt. Ich hab mal eine stark vereinfachtes Beispiel (BeispielDB_TabelleListenfeld.odb) erstellt, in dem man den Fehler erkennen kann.

Und zwar hab ich ein Formular zur Dateneingabe "Neuer Datensatz" und eins zur Änderung "Datensatz Bearbeiten". Das "Datensatz Bearbeiten" Formular (in Blöcken) funktioniert (speziell das Listenfeld ist gemeint), allerdings wollt ich es jetzt auf die "Datenblatt"-Form also in Form einer Tabelle übertragen - siehe "Datensatz Bearbeiten Tabelle". In dem Fall kommt aber die Fehlermeldung "Fehler beim Schreiben des aktuellen Datensatzes" und ich kann mir nicht erklären warum. Im Prinzip ists doch das Gleiche, nur dass das Listenfeld nun in einem Tabellenkontrollfeld steckt... oder nicht?

Liebe Grüße, Steffi (:
Dateianhänge
BeispielDB_TabelleListenfeld.odb
(35.9 KiB) 91-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von RobertG » Mi, 18.12.2013 13:42

Hallo Steffi,

numKunde ist das Feld, was (unsichtbar) mit dem Formular verbunden ist (Kunde_ID oder so ähnlich). Das Feld scheint das Makro im Moment nicht zu finden. Das Kombinationsfeld ist mit keinem Feld des Formulars verbunden. Das wird automatisch über das Makro auf die entsprechende Anzeige eingestellt.
Wie sieht Dein Formularaufbau im Naviagtor aus. Gibt es vielleicht ein Formular und ein Unterformular? Dann müssen die Startprozeduren angepasst werden. Die Parameter darin beginnen mit dem für das Hauptformular, das erste Unterformular (oder frei) sowie das 2. Unterformular (oder frei).

Die Meldung jedenfalls sagt, dass das numerische Feld (Du schreibst Textfeld) nicht gefunden wird.

Gruß

Robert

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Mi, 18.12.2013 11:15

Hallo ihr beiden,

@F3K Total: habs abgeändert und eingebunden und klappt super, danke (: (frag mich nur warum meine nacheinander geschalteten Prozeduren von oben nicht klappen, vom Sinn her ists ja das gleiche - aber ist egal, deins ist kürzer und schöner!)

@Robert: dein Makro ist auch super und eigentlich noch besser geeignet - nur irgendwie bin ich zu doof es zu übertragen :/
Ich sag mal wie ichs gemacht hab, vllt siehst du was ich falsch mache - bzw. was mir noch an Änderungen fehlt.

Also ich habe:
- das Makro Comboboxen hinzugefügt
- die Combobox „comKunde“ und das Textfeld „numKunde“ in mein Formular kopiert
--> Datenquelle geändert (meine TA_Main heißt inzwischen TA_Uebersicht)
- comKunde habe ich mit dem Ereignis „Datensatzaktion_erzeugen“ (bei Fokuserhalt) versehen
- Formular habe ich mit dem Ereignis „Formular_neu_speichern“ (vor der Datensatzaktion) und dem Ereignis „Formular_Neu_Start“ (nach dem Datensatzwechsel) versehen

Wenn ich das Formlar nun aber ausführe, kommt sofort ein Fehler: „BASIC-Laufzeitfehler - NoSuchElementException“ und springt im Makro auf die Prozedur „TextAnzeigen“ in die Zeile „oFeld = oForm.getByName(NameIDFeld)“ und im Formularfeld taucht eine 6 auf.
..aber „NameIDFeld“ ist ja bei „numKunde“ geblieben, habs ja kopiert..
Muss ich beim Kopieren noch weitere Einstellungen oder Beziehungen beachten?

Sorry für die ganze Fragerei :/ Will auch eure Zeit nicht zu sehr beanspruchen - eine funktionierende Lösung mit dem Extra-Formular hab ich ja, zur Not nehme ich die!

Liebe Grüße, Steffi

Re: Kombinationsfeld - Daten zweier Tabellen

von RobertG » Di, 17.12.2013 19:34

Hallo Steffi, hallo R.,

ich habe jetzt auch noch einmal ein bisschen zu der ursprünglichen Fassung ergänzt. Die Einbindung des Makros zu den Comboboxen ist wirklich nicht trivial. Da muss ich mir noch einmal etwas überlegen.

Allerdings ist es jetzt möglich, in dem ursprünglichen Formular direkt eine neue Firma und einen neuen Ort einzugeben, der dann in der entsprechenden Tabelle gespeichert und über die Fremdschlüsselnummer in der Haupttabelle angezeigt wird.

Grundbedingung für die Funktion sind zur Zeit: Der Primärschlüssel der Tabelle, in die etwas gespeichert werden muss, sollte "ID" heißen. Der Primärschlüssel sollte außerdem automatisch hochgeschrieben werden (AutoWert). Das habe ich jetzt erst einmal in der beiliegenden Version so gemacht und eben kurz mit einem bestehenden und einem neuen Datensatz getestet. Das numerische Feld ist zur Zeit noch sichtbar, damit die Funktion erkennbar ist. Es sollte vor dem dauerhaften Betrieb natürlich auf "Unsichtbar" geschaltet werden.

Gruß

Robert
Dateianhänge
BeispielDB(1).odb
Eingabe mit Comboboxen und Fremdschlüssel
(18.33 KiB) 104-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von F3K Total » Di, 17.12.2013 19:06

Hi,
S_teffi hat geschrieben: Ist es eigentlich möglich einem Button unter Eigenschaften>Allgemein eine vordefinierte Aktion zuzuschreiben UND bei Eigenschaften>Ereignisse ein Makro zuzuweisen oder geht nur eins von beiden?
Alle meine Versuche haben gezeigt, dass nur eines geht, Aktion oder Makro.
Dann muss die erweiterte Funktionalität eben mit dem Makro kommen, speichern und Listboxrefresh in einem:

Code: Alles auswählen

Sub S_save_Row_refresh_lstFilter
    oFormFilter = ThisComponent.Drawpage.Forms.getbyname("Filter")
    oFormKunden = oFormFilter.getbyname("Kunden")
    if oFormKunden.isnew then oFormKunden.insertRow else oFormKunden.updateRow
    olstF_ID_Kunde = oFormFilter.getbyname("lstF_ID_Kunde")
    olstF_ID_Kunde.refresh
End Sub
funktioniert für meine BeispielDB
Gruß R
Dateianhänge
BeispielDB.odb
(15.4 KiB) 91-mal heruntergeladen

Re: Kombinationsfeld - Daten zweier Tabellen

von S_teffi » Di, 17.12.2013 09:53

Ihr seid echt toll, danke für eure Hilfe!

Ich glaub das mit den Makros der Comoboxen ist mir doch noch zu komplex :/ dachte man braucht nur die eine Prozedur "Datensatzaktion_erzeugen", aber glaub da spielt ja alles mit rein.

Ich probiers erst mal so ähnlich wie F3K Total zu lösen. Hatte gestern schon was gebastelt (siehe Bild), allerdings hab ichs nicht hinbekommen, dass beim Abspeichern der Kundendaten sofort das Listenfeld aktualisiert wird, deswegen hab ich jetzt erst mal ein Speichern- und ein Aktualisieren-Button integriert. Hätte es aber gerne, dass der Speicher-Button gleich beides erledigt.

Hab gedacht ich kann auf das Ereignis "Maustaste gedrückt" ein Makro legen, dass den Datensatz speichert:

Code: Alles auswählen

Sub DatensatzSpeichern()
	DIM oDoc, oForm As Object
	DIM DatabaseContext, ODataSource, oCon As Object
	   DatabaseContext   = createUnoService("com.sun.star.sdb.DatabaseContext")
	   DataSource        = DatabaseContext.getByName("file:///.../BeispielDB.odb")
	   oCon              = DataSource.GetConnection("","")
	   odoc              = thiscomponent
	   oform             = odoc.drawpage.forms.getByName("Form_NeuerKunde")
	On Error Goto ErrorBehandlung
	If oForm.isNew Then
	  oForm.insertRow
	  MsgBox "Der Kunde wurde in die Datenbank aufgenommen."
	  DataSource.flush
	ElseIf oForm.isModified Then
	  oForm.updateRow
	  MsgBox "Daten wurden aktualisiert."
	  DataSource.flush  
	else 
	  exit sub
	End If
	exit sub
	 ErrorBehandlung:
	 MsgBox "Keine Daten eingegeben!"
End Sub
[/size]

und auf das Ereignis "Maustaste loslassen" ein Makro, dass das Listenfeld des anderen Formulars aktualisiert:

Code: Alles auswählen

Sub Aktualisiere()

   oDoc = thisComponent
   oDrawpage = oDoc.Drawpage
   oForm = oDrawpage.forms.getByName("MainForm")
   oListboxModel = oForm.getByName("Listenfeld 6")
   oListboxModel.refresh()

End Sub
[/size]


aber gleichzeitig geht es nicht, beim ersten Klick wird gespeichert und beim zweiten Klick, also Eintragen eines neuen Kunden, steht der erste erst drin.

Zweite Frage, die währenddessen aufgetreten ist: Ist es eigentlich möglich einem Button unter Eigenschaften>Allgemein eine vordefinierte Aktion zuzuschreiben UND bei Eigenschaften>Ereignisse ein Makro zuzuweisen oder geht nur eins von beiden? Hab probiert dem Button die Aktion "Neuer Datensatz" zuzuschreiben und zusätzlich das Makro "Aktualisieren" einzubinden. Ergebnis war das gleiche wie oben, weiß allerdings nicht ob es generell möglich.

Liebe Grüße, Steffi
Dateianhänge
Oberfläche_MainFormular_NeuerKundeFormular.JPG
Oberfläche_MainFormular_NeuerKundeFormular.JPG (27.02 KiB) 2980 mal betrachtet

Re: Kombinationsfeld - Daten zweier Tabellen

von F3K Total » Mo, 16.12.2013 17:39

Hallo Steffi,
ich habe als Alternative in deiner Beispieldatei mal ein Formular erstellt, das ohne Makros arbeitet.
Wenn das Listenfeld leer ist, werden alle Kunden angezeigt und du kannst neue Kunden anlegen.
Wenn du einen Kunden im Listenfeld auswählst (es funktioniert wie ein Filter, wenn du nur die Anfangsbuchstaben eintippst, werden alle passenden Kunden vorselektiert), und dann "Kunden suchen" anklickst, wird nur dieser Kunde angezeigt. Wählst du im Listenfeld den obersten leeren Eintrag, und klickst "Kunden suchen", werden wieder alle Kunden angezeigt.
Rechts, im Unterformular, kannst Du zu jedem Kunden so viele Eigenschaften anlegen, wie nötig.
Wenn Du wissen möchtest, wie das mit dem Suchen funktioniert, siehe unten "Base Videotutorial"
Gruß R
Dateianhänge
BeispielDB.odb
(13.79 KiB) 145-mal heruntergeladen

Nach oben