Seite 1 von 1

[gelöst] Base: Tabellenkontrollfeld Datensatz suchen/setzen

Verfasst: Sa, 13.10.2012 13:58
von juetho
Folgende Situation (vereinfacht):
  • Hauptformular: Tabelle mit Rechnungen (darunter Feld "kunden_id"), Anzeige in einzelnen Controls (Text- und numerische Felder).
  • Als Zusatzinformation sollen Angaben zur kunden_id in Textfeldern angezeigt werden.
  • Unterformular: Tabelle der Kunden, Anzeige im Tabellenkontrollfeld.
Im Unterformular soll ein Kunde ausgewählt werden, wenn eine neue Rechnung erfasst wird - kein Problem. Wenn im Hauptformular eine andere Rechnung angezeigt wird, sollen über das Ereignis "nach dem Datensatzwechsel" die Angaben zur kunden_id in den Textfeldern angepasst werden. Das ist kein Problem, wenn ich über Connection.createStatement und einen SELECT die Daten hole. Ich habe dazu folgende Fragen und Probleme:
  • Weil die Daten bereits im Unterformular bzw. Tabellenkontrollfeld vorhanden sind, sollten sie direkt geholt werden können. Im Formular geht das über oForm.first/oForm.next, bis die richtige kunden_id gefunden wurde; im GridControl über eine Schleife über alle Zeilen (siehe die beiden Code-Ausschnitte).
  • Das Formular hat aber keine Methode, um gezielt einen Wert zu suchen; das habe ich inzwischen über XResultSet herausgefunden. Hat das GridControl eine Suchfunktion? Ich habe noch nichts gefunden, ob das GridControl eigene Methoden zur Navigation und zur Suche hat oder auf das ResultSet des Formulars zurückgreift.
  • Wenn im Hauptformular der Datensatz gewechselt wird, soll auch im Unterformular der richtige Kunde markiert werden. Das klappt mit dem folgendem Verfahren.

    Code: Alles auswählen

    gridForm.first
    while not (gridForm.grid.getByIndex(0).Value = currentID)
      gridForm.next
    wend
    Beim folgenden Verfahren wird aber im Tabellenkontrollfeld nur ab und zu der richtige Datensatz markiert (es werden immer die richtigen Daten angezeigt). Ich kann natürlich auf dieses Verfahren verzichten, aber es wundert mich doch.

    Code: Alles auswählen

    gridForm.first
    while not (gridForm.getInt(1) = currentID)
      gridForm.next
    wend
  • thisComponent.lockcontrollers() hat keine Auswirkung: Während mit gridForm.next der richtige Datensatz gesucht wird, sieht man den Datensatzzeiger im Tabellenkontrollfeld springen.
Über ein paar Erklärungen und Tipps zur Verbesserung würde ich mich sehr freuen. Gruß Jürgen

Re: Base: im Tabellenkontrollfeld Datensatz suchen und setze

Verfasst: Sa, 13.10.2012 14:19
von F3K Total
Hallo Jürgen,
warum so kompliziert?
Anbei ein Beispiel, makrofrei.
In die Tabelle Rechnungen, gebunden an das Formular Rechnungen, wird der FK des Kunden im Tabellenkontrollfeld per Listbox eingepflegt.
Dies muss nicht über ein Tabellenkontrollfeld erfolgen, es kann auch eine einzelne Listbox sein.
Das Unterformular Kunden ist an die Kundentabelle gebunden und mit der FK-Spalte von Rechnungen verknüpft. Es zeigt die detaillierten Kundendaten bei Auswahl einer Rechnung.

Gruß R

Re: Base: im Tabellenkontrollfeld Datensatz suchen und setze

Verfasst: Sa, 13.10.2012 16:30
von juetho
F3K Total hat geschrieben:warum so kompliziert?
Grundsätzlich gebe ich dir recht. (Das ist immer wieder einmal ein Problem bei mir, wenn ich mich an einem Verfahren orientiere und Alternativen nicht mehr erkenne. Da ich nur in Foren darauf aufmerksam gemacht werde, passieren solche Irrwege.)

In diesem Fall geht es mir aber wesentlich um das Tabellenkontrollfeld im Unterformular. Wenn ich es nur für die Auswahl des Kunden bei einer neuen Rechnung nutze, verwirrt es, wenn im Hauptformular die Adresse zur aktuellen Rechnung steht und im GridControl eine andere als aktueller Datensatz steht. Meine Fragen bleiben deshalb bestehen bzw. werden erweitert:
  • Wie kann im GridControl gesucht werden,
  • oder wie kann der Datensatzzeiger im GridControl an die kunden-id gebunden werden?
  • Warum funktioniert lockControllers() beim GridControl nicht?
Dein Beispiel passt übrigens nicht ganz: Das Tabellenkontrollfeld, um das es mir geht, soll im Unterformular alle Kunden anzeigen (nicht die Rechnungen) und zusätzlich den Kunden der aktuellen Rechnung markieren.

Außerdem zeigt es ein ganz seltsames Verhalten: Die Ansicht Tabellen > Rechnungen kann nicht geschlossen werden; das Base-Hauptfenster wird nicht mehr aktiviert. Selbst Alt-F4 funktioniert nicht; ich habe LibO über den TaskManager geschlossen. Aber das soll uns nicht weiter interessieren. Gruß Jürgen

Re: Base: im Tabellenkontrollfeld Datensatz suchen und setze

Verfasst: Sa, 13.10.2012 17:22
von DPunch
Servus
juetho hat geschrieben:Wie kann im GridControl gesucht werden
So, wie Du es getan hast, nämlich per Iteration über die Inhalte des Grids oder per Iteration über den Inhalt des Resultsets.
juetho hat geschrieben:oder wie kann der Datensatzzeiger im GridControl an die kunden-id gebunden werden?
Aller Voraussicht überhaupt nicht mit Hausmitteln, entweder Du verküpfst die Formulare über ein Feld, damit die gewünschte Beziehung überhaupt bekannt ist, was in Deinem Fall ja nicht erwünscht ist, oder Du musst andere Wege finden.
juetho hat geschrieben:Warum funktioniert lockControllers() beim GridControl nicht?
Offenbar gehört das GridControl nicht zu den Elementen, deren Benachrichtigung durch lockControllers unterdrückt wird.
juetho hat geschrieben:Während mit gridForm.next der richtige Datensatz gesucht wird, sieht man den Datensatzzeiger im Tabellenkontrollfeld springen.
Das kannst Du umgehen, indem Du in einer Kopie des zugrunde liegende Resultsets suchst, nicht im Formular selber.

Code: Alles auswählen

	oResultSet =  gridForm.createResultSet
	nCounter = 1
	oResultSet.beforeFirst
	Do While oResultSet.Next
		If oResultSet.getInt(1) <> currentID Then 
			nCounter = nCounter + 1
		Else
			Exit Do
		End If
	Loop
	If NOT oResultSet.isAfterLast Then
		gridForm.absolute(nCounter)
	End If

Re: Base: im Tabellenkontrollfeld Datensatz suchen und setze

Verfasst: Sa, 13.10.2012 18:28
von juetho
Danke für die Erläuterungen, das macht einiges klarer. Dein Vorschlag mit createResultSet klingt sehr gut, funktioniert aber so nicht: Das Erzeugen von oResultSet geht noch; oResultSet.fetchSize hat den richtigen Wert. Aber beim Aufruf von oResultSet.beforeFirst gibt es eine DisposedException, und die kann ich mir nicht erklären.* Kannst du es? Jürgen

* Wie kann es eine solche Exception geben bei einem Objekt, das gerade eben erzeugt worden ist und mit Inhalt vorhanden ist? :o

Re: Base: im Tabellenkontrollfeld Datensatz suchen und setze

Verfasst: Sa, 13.10.2012 20:10
von F3K Total
Tach,
die Lösung von DPunch funktioniert bei mir, siehe Anhang.
juetho hat geschrieben:Außerdem zeigt es ein ganz seltsames Verhalten: Die Ansicht Tabellen > Rechnungen kann nicht geschlossen werden; das Base-Hauptfenster wird nicht mehr aktiviert. Selbst Alt-F4 funktioniert nicht; ich habe LibO über den TaskManager geschlossen. Aber das soll uns nicht weiter interessieren. Gruß Jürgen
Kann ich nicht nachvollziehen!
juetho hat geschrieben:Situation: LibO 3.6.1.2 auf Win 7 Home Premium
die Version hat so ihre Probleme mit Base siehe z.B:
http://www.libreoffice-forum.de/viewtop ... 10&t=10191
Es gibt inzwischen LO 3.6.2
Gruß R

Re: Base: im Tabellenkontrollfeld Datensatz suchen und setze

Verfasst: So, 14.10.2012 12:10
von juetho
F3K Total hat geschrieben: die Version 3.6.1.2 hat so ihre Probleme mit Base siehe z.B... Es gibt inzwischen LO 3.6.2
Gruß R
Das ist an mir vorbeigegangen. Ich habe zwar mitbekommen, dass sie in Vorbereitung ist, aber nicht die Freigabe. Ich habe sie jetzt installiert.
F3K Total hat geschrieben:
juetho hat geschrieben:Außerdem zeigt es ein ganz seltsames Verhalten: ... Aber das soll uns nicht weiter interessieren. Gruß Jürgen
Kann ich nicht nachvollziehen!
Ich schrieb ja auch, dass uns das nicht interessieren soll. So etwas hängt von zu vielen Faktoren ab, als dass man es reproduzieren könnte.
F3K Total hat geschrieben:die Lösung von DPunch funktioniert bei mir, siehe Anhang.
Bei mir jetzt auch. Der entscheidende Unterschied zwischen euren und meinen Lösungen bestand darin: Das Adressen-Formular hatte ich als Unterformular zu den Rechnungen konzipiert. (Meine wichtigste Überlegung war, dass damit die Verknüpfung zwischen den Tabellen einfacher und direkter hergestellt werden könnte. Wegen meiner weiteren Wünsche spielt das aber keine große Rolle.) Ich habe das Adressen-Formular jetzt als weiteres Hauptformular (gleichrangig zum Rechnungen-Formular) gesetzt - und es funktioniert. Gleichzeitig tritt auch die DisposedException nicht mehr auf. Die kann ich mir zwar nach wie vor nicht erklären, aber was soll's.

Es fehlt mir wohl noch das Gefühl für das Zusammenwirken der verschiedenen Elemente und Ebenen. Mit eurer Hilfe entwickelt sich das nach und nach. Danke und besten Gruß! Jürgen