Kombinationsfeld - Daten zweier Tabellen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

Hallo ihr Lieben,

ich habe 2 Tabellen: TA_Main ("ID", "Kunde_ID", "...") und TA_Kunde ("Kunde_ID", "Name") - beide sind also über eine ID verknüpft.

Im Formular (Inhalt TA_Main) möchte ich gerne ein Kombinationsfeld haben, in dem man Kunden, die in der Tabelle TA_Kunden gespeichert sind, auswählen kann und falls der Kunde nicht vorhanden ist, ein neuer angelegt wird. (Deswegen fällt das Listenfeld schon mal raus - es muss die Option bestehen, auch neue Kunden einzutragen.)

Wenn ich ein Kontrollfeld anlege, kann ich zwar den Namen von TA_Kunden anzeigen lassen und neu eingeben, dieser wird aber beim Sprung auf ein neues Feld sofort zu 0, da der Name (Text) dann nicht gespeichert werden kann, weil das ja über das ID Feld (Integer) geschieht. Ich dachte ich bekomme es über einen Verbund hin, allerdings ist das Kombifeld dann gar nicht mehr anwählbar und nur grau dargestellt :/
Vllt muss ich das auch ganz anders angehen, ich hoffe einer von euch hat eine Idee und kann mir weiterhelfen.

Liebe Grüße, Steffi
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

Ich hänge mal noch ein vereinfachtes Beispiel ran, dann versteht man vllt besser was ich meine.

In der BeispielDB sieht man wie die Einträge 0 werden, aufgrund der unterschiedlichen Datentypen.

und in der BeispielDB - 2 sieht man wie das Kombinationsfeld beim Verbund der beiden Tabellen nicht mehr auswählbar ist.
Dateianhänge
BeispielDB - 2.odb
BeispielDB - 2
(11.85 KiB) 109-mal heruntergeladen
BeispielDB.odb
BeispielDB
(11.75 KiB) 105-mal heruntergeladen
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von RobertG »

Hallo Steffi,

Dein Vorhaben geht nicht. Ein Kombinationsfeld lässt sich zur Eingabe nutzen, weiß aber nichts von einem anderen Feld als dem, mit dem es in dem Formular verbunden ist. Bei Texteingaben erhältst Du in einem Integer-Feld also immer '0'. Entweder musst Du auf Neueingaben verzichten oder ein Makro nutzen, dass Dir die Möglichkeiten öffnet, in einem Kombinationsfeld eine entsprechende Eingabe zu machen. Ein entsprechendes Makro ist z.B. den Beispieldatenbanken des Base-Handbuches beigefügt - siehe die Beispieldatenbank Medien_mit_Makros.odb.

Du kannst natürlich auch mit einer einfacheren Variante arbeiten, indem Du die Neueingabe in einem separaten Formular (das ohne weiteres auf der gleichen Formularoberfläche liegt) machen lässt und dann das Listenfeld aktualisieren lässt.

Schau Dir dazu einfach einmal das Handbuch an - die Kapitel Formulare und Makros sind dort die entsprechenden Anlaufstellen.

Gruß

Robert
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

Hach & ich dachte ich komme um Makros doch irgendwie herum. Naja, ich versuch mich mal reinzulesen und durch die Beispieldatenbank_mit_Makros zu finden - die Variante ist schon schöner als ein separates Formular einzubinden.
Danke für die schnelle Antwort! (:
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

Hallo Robert,

ich habe mir jetzt mal die BeispielDB mit Makros angesehen und versucht zu schauen bei welchem Kombinationsfeld solch ein entsprechendes Makro verknüpft ist. Eigentlich kann es nur im Formular "Medien" sein, allerdings erscheint schon beim Öffnen des Formulars eine Fehlermeldung "Die Dateninhalte konnten nicht geladen werden. Table not found ..."

Klicke ich die Kombifelder an, erscheinen ständig Fehlermeldungen dieser Art: "Basic Laufzeitfehler. Objektvariable nicht belegt." Konnte es dann auch nur noch über den Task-Manager schließen. Liegt das an mir oder ist das ein Fehler in der Beispieldatenbank? Habs jetzt auch schon mit der 4.0 und 4.1 Version probiert, Fehlermeldungen sind identisch.

Falls es nicht an mir liegt, gibt es noch ein anderes Beispiel für ein Makro mit möglichen Neueingaben?

Liebe Grüße, Steffi
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von RobertG »

Hallo Steffi,

da habe ich bei der letzten Bereinigung der Datenbank tatsächlich eine Abfrage zu viel rausgeschmissen. Deshalb startet das Formular mit einer Fehlermeldung.

Du kannst Die Funktion vermutlich einfacher in der Lesereingabe bei den Adressen sehen (Feld z.B. für die Straße oder für den Ort und die Postleitzahl) . Vielleicht schaffe ich es aber auch noch, das Ganze in eine separate DB einzubauen.

Ich habe die korrigierte Fassung hier ins Netz gestellt: http://robert.familiegrosskopf.de/downl ... Makros.odb

Gruß

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

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von F3K Total »

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) 144-mal heruntergeladen
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

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) 2979 mal betrachtet
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von F3K Total »

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) 90-mal heruntergeladen
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von RobertG »

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) 103-mal heruntergeladen
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

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
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von RobertG »

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
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

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) 90-mal heruntergeladen
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von RobertG »

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) 94-mal heruntergeladen
S_teffi
**
Beiträge: 26
Registriert: Do, 12.12.2013 15:31

Re: Kombinationsfeld - Daten zweier Tabellen

Beitrag von S_teffi »

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
Antworten