Formular mit bestimmtem Datensatz anzeigen

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: Formular mit bestimmtem Datensatz anzeigen

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Fr, 21.08.2009 12:03

Hallo eBayer,

ich hab die Navigationsleiste tatsächlich zur Zeit ausgeblendet. Ich wollte erstmal versuchen, die Navigation durch Buttons hinzubekommen. Werde mir aber die Navigationsleiste später nochmal genauer anschauen. Ich muss auch erst nochmal den weiteren Programmablauf überlegen. Je nachdem, was die Anwender dann später machen wollen. Den Filter kann ich dann ja bei der nächsten Aktion im Hintergrund einfach wieder abstellen. Ist vielleicht besser, als ein Button auf dem Formular. Na ja, mal weiter überlegen...

Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von eBayer » Fr, 21.08.2009 11:53

Hallo bert,
hast Du keine Navigationsleiste im Formular?
Da hast Du neben vielen anderen Objecten auch Filter an und Filter aus.
Du kannst ja die Navigationsleiste so konfigurieren, daß Sie nur noch das bietet, was Du benötigst.
Ansonsten täte es doch ein schlichter Button "Filter aus"
Gruß eBayer

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Fr, 21.08.2009 11:15

OK, nach langem Herumprobieren bezüglich der korrekten SQL-Schreibweise hab ich es wohl nun geschafft.

Mit einem Button im Hauptformular wird der Suchdialog aufgerufen:

Code: Alles auswählen

Sub Personensuche_dlg
       DialogLibraries.LoadLibrary("Standard")    'Dialogbibliothek wird geladen
       oSDlg = createUNODialog(DialogLibraries.Standard.PersonSuchen)
       sql_init       'füllt das Listenfeld beim ersten Aufruf
       oSDlg.execute()
       datenAktualisieren(nSelected)
End Sub
Beim execute bleibt der Code stehen und geht an dieser Stelle nach dem Beenden des Dialoges weiter mit der Aktualisierung des angezeigten Datensatzes im Hauptformular. Der Wert nSelected wird im Dialog aus dem selektierten Datensatz des Listenfeldes ausgelesen und beinhaltet die ID-Nummer.

Code: Alles auswählen

Sub datenAktualisieren(nSelect_ID)
	oForm = ThisComponent.drawpage.forms.getByName("MainForm")
	oForm.Filter = (" ""stamm_ID"" = " & nSelect_ID)
	oForm.ApplyFilter = true
	oForm.reload()
End Sub
Command und CommandType brauche ich da wohl garnicht, da ich den Filter ja direkt im Formular anwende. Und bei Christianas Code war ein kleiner Fehler drin: der Filter muss zuerst formuliert werden, bevor er angewandt wird. Jetzt muss ich nur noch schauen, wo ich das einbaue, damit der Filter wieder aufgehoben wird.

Viele Grüsse
Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Fr, 21.08.2009 10:30

Hallo Christiana,

das mit dem Filter werde ich gleich mal testen. Das hört sich auf jeden Fall so an, als müsste es funktionieren.


Hallo eBayer,

deine Lösung funktioniert, aber doch widerspricht sie ein bisschen meinem Verständnis von Datenbanken, wenn man alle Datensätze durchgehen und vergleichen muss, bis man den richtigen gefunden hat. So etwas sollte eigentlich ein DBMS für einen machen :-; Klar, ich benutze lieber eine funktionierende Möglichkeit, als keine zu haben und oft gibt es auch mehrere Wege, die zum Ziel führen. Ich kann dann ja mal hier reinschreiben, wie ich das mit den Filtern umgesetzt habe.

Viele Grüsse
Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von eBayer » Fr, 21.08.2009 08:40

Hallo Bert, hallo Christiana,
wenn die von mir zuerst vorgeschlagene Lösung zu aufwändig scheint, bleibt als praktikabelste Lösung meines Erachtens tatsächlich noch der Vorschlag von Christiana mit dem Filter. Im Gegensatz zur vorher diskutierten Variante kann man immerhin den Filter dann per Knopfdruck aufheben.
Meine erste Variante ist sicher auch nicht für ein größeres Datenvolumen (vielleicht > 5000) geeignet. Vorher kann ich kaum eine Verzögerung erkennen, weil sich doch alles überwiegend im gepufferten Memorybereich abspielt.
Trotzdem...... es macht Spaß, gemeinsam Lösungswege zu suchen und zu finden.
Gruß eBayer

Re: Formular mit bestimmtem Datensatz anzeigen

von Christiana » Fr, 21.08.2009 08:26

Hallo Bert,

mir ist noch eine andere Variante eingefallen. Du kannst natürlich auch direkt einen Filter setzen, den Du dann auch wieder aufheben kannst, z.B. über das Steuerelement ”Navigationsleiste“ oder über ein Makro, indem Du oForm.ApplyFilter wieder auf false setzt.

Code: Alles auswählen

Sub datenAktualisieren
   oForm.CommandType    =  0				REM Tabelle
   oForm = ThisComponent.drawpage.forms.getByName("MainForm")
   oForm.Command = ""01_Stamm"
   oForm.ApplyFilter = true 
   oForm.Filter = ""stamm_ID""=" & 4
   oForm.reload()
End Sub 
Weiterhin viel Spaß beim Testen
Christiana

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Fr, 21.08.2009 00:29

Hallo eBayer,

da hast du natürlich Recht. Das ist auf jeden Fall ein Problem. Es müsste irgendwie die Möglichkeit geben, innerhalb des Resultsets des Formulars direkt an den Datensatz zu springen, den ich (per ID) ausgewählt habe. Vielleicht ist deine Idee mit dem "oMainForm.absolute(nRow)" doch garnicht so falsch. Auch wenn es mir ziemlich umständlich erscheint. Kann man denn das Resultset nicht irgendwie anders noch ansteuern? Mit der Navigation des Formulares geht es doch auch.

Ich hab gerade eben mal das mit dem weiteren Code nach dem Schliessen des Dialoges getestet. Das scheint zu klappen. So kann man einen Wert (z.B. die ID eines selektierten Datensatzes in einem Listenfeld) in das aufrufende Formular übernehmen, wenn dieser Wert global definiert ist, im Dialog gesetzt wird und nach dem execute des Dialogs im Formular ausgewertet wird.

So langsam macht mir das Spass. Da wird sich doch bestimmt noch eine bessere Lösung finden...

Viele Grüsse
Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von eBayer » Do, 20.08.2009 22:30

Hallo Bert,
ich habs jetzt mal getestet.
Wenn Du mit "Form.command" ein SQL-Statement absetzt, wird dem Formular praktisch ein neues Recordset zugewiesen, welches sich natürlich nur auf die Auswahl im SQL-Statement bezieht. Es hat dann im Prinzip die gleiche Wirkung, wie eine Filterbedingung.
Allerdings kannst Du den Filter eben nicht wieder aufheben, wie es bei einer Filterbedingung möglich ist. Wenn Du nur genau den EINEN Datensatz sehen willst, ist es ok. Wenn Du aber nur positionieren willst, ohne die Manövrierfähigkeit des Formulars einzuschränken, funktioniert das eben nicht!
Trotzdem eine ganz hilfreiche Erfahrung.
Gruß eBayer

Re: Formular mit bestimmtem Datensatz anzeigen

von Christiana » Do, 20.08.2009 14:56

Hallo Bert,
gigabert hat geschrieben:Die Schreibweise mit dem PostgreSQL hatte ich mir so angewöhnt, weil die Datenbank selbst beim anlegen der Tabellen auf die Anführungszeichen bestanden hatte. Ansonsten hätte es mir die Tabellennamen alle in Kleinbuchstaben umgewandelt. Scheint aber dann wohl in OpenOffice nicht notwendig zu sein.
Oh, diesen Zusammenhang kannte ich nicht, weil wir generell alle Tabellennamen klein schreiben. Da wirst du wohl doch bei Deiner Schreibweise bleiben müssen.

Christiana

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Do, 20.08.2009 14:37

Hallo Christiana,

danke für diese Tipps. Werde ich gleich mal probieren. Die Schreibweise mit dem PostgreSQL hatte ich mir so angewöhnt, weil die Datenbank selbst beim anlegen der Tabellen auf die Anführungszeichen bestanden hatte. Ansonsten hätte es mir die Tabellennamen alle in Kleinbuchstaben umgewandelt. Scheint aber dann wohl in OpenOffice nicht notwendig zu sein.

Das mit dem "CommandType" hab ich auch gerade in Krumbeins BASIC-Buch gefunden:

Code: Alles auswählen

Sub Tabelle_aktualisieren(sSQL as string)
   oDoc = thisComponent
   oForm = oDoc.drawpage.Forms.getByName("Formular1")
   oForm.command = sSQL
   oForm.CommandType = com.sun.star.sdb.CommadType.COMMAND
   oForm.reload()
End Sub
Werde ich später mal weiter testen. Muss jetzt mal kurz weg.

Bis später
Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von Christiana » Do, 20.08.2009 14:18

Hallo Bert,

mit Command habe ich auch schon gearbeitet. Das funktioniert auf jeden Fall. Da mir Dein SQL-Befehl auch in Ordnung zu sein scheint, vermute ich mal, dass du nur den folgenden Befehl vor oForm.Command setzen musst:

Code: Alles auswählen

oForm.CommandType    =  2
Das entspricht bei den Eigenschaften des Formulars Art des Inhalts: SQL. Das steht bei Dir bestimmt noch auf Tabelle.

Da Du auch mit PostgreSQL arbeitest, habe ich noch einen Tipp für Dich. Den SQL-String kannst Du auch einfach so schreiben:

Code: Alles auswählen

"SELECT * FROM 01_Stamm WHERE stamm_ID = " & 4


Jedenfalls klappt es bei mir so auch und es ist übersichtlicher.

Viele Grüße
Christiana

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Do, 20.08.2009 14:16

Hmm, hab gerade problemlos per Konsole mit dem SELECT auf die Datenbank zugegriffen. Scheint also korrekter SQL-Code zu sein. Dann müsste das Problem vielleicht doch in Basic liegen. Vielleicht muss vor dem "Command" noch eine Datenverbindung hergestellt werden, oder ist die schon automatisch vorhanden?

Gruss
Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Do, 20.08.2009 14:01

Der Tipp mit dem Code, der nach dem Schliessen des Dialogs weitergeht, hört sich aber auch nicht schlecht an. Ich muss jetzt aber erst mal weiter probieren, warum das SELECT nicht funktioniert und mir eine Messagebox sagt, es gäbe solch eine Tabelle garnicht. Wie gesagt, ich vermute da ein SQL-Problem. Ich melde mich dann, sobald ich da weiter bin.

Gruss
Bert

Re: Formular mit bestimmtem Datensatz anzeigen

von eBayer » Do, 20.08.2009 13:45

Hallo Bert,
Du hast das richtig gesehen... in meinem Fall ist es ein Formular. Aber das ist letztendlich egal.
In meinem Fall glaubte ich, durch alle ID's durchlaufen zu müssen, weil bei gesetztem Filter oder Sortierung die Satznummer nicht mehr passt.
Wesentlich ist jedenfalls, daß Du aus dem aufgerufenen Dialog oder Formular heraus das aufrufende aktualisierst. Und das ging für mich am einfachsten, wie ich es Dir geschrieben habe. Bei einem Dialog wäre es genaugenommen noch einfacher, weil der ja im Regelfall modal ist. Das bedeutet, nach Beendigung des Dialogs machst Du genau an der Stelle weiter, wo Du ihn aufgerufen hast denn dort bist Du ja in Deinem Ausgangsformular und Du hast die volle Kontrolle.
Bei einem Formular ist es komplizierter - da ist die globale Variable und die Positionierung des Ausgangsformulars aus dem aufgerufenen Formular heraus vermutlich nicht zu umgehen.
Dein Ansatz, mit command ein select-Statement auszuführen liest sich gut. Falls das so funktioniert, würde es auch meine Logik vereinfachen. Ich vermute allerdings, daß in diesem Fall das select-Statement wie ein Filter wirkt, was ein weiterblättern durch die Tabelle dann ja wohl verhindern würde.
Trotzdem wäre ich Dir dankbar, wenn Du mich über das Ergebnis auf dem laufenden halten würdest.
Ich habe halt das programmiert, was ich zu der Zeit kannte und zum Erfolg führte. Aber man lernt ja nicht aus!
Gruß eBayer

Re: Formular mit bestimmtem Datensatz anzeigen

von gigabert » Do, 20.08.2009 13:18

Hm, ich weiss nicht genau, ob ich das jetzt richtig verstanden habe. Ich versuch das mal zu rekapitulieren.

Du hast ein Formular (oMainForm), welches als global festgelegt ist. Aus diesem rufst du einen Dialog auf. Soll das dieser sein: oForm = ThisComponent.drawpage.forms.getByName("Teamauswahl") Das wäre aber ein Formular und kein Dialog, oder? Na ja, wahrscheinlich egal. Und dann liest du aus oForm die ID aus. Ist das die ID aus der Datenbank, also der Primärschlüssel des Datensatzes, welcher in oForm angezeigt wird? Danach gehst du alle IDs in der Tabelle durch und vergleichst, ob diese nID damit identisch ist, und holst dir die absolute Satznummer. Dann lässt du dir diesen Datensatz im Formular anzeigen.

Scheint mir etwas zu übertrieben zu sein, alle Datensätze zu durchlaufen. Die ID des gesuchten Datensatzes ist ja bekannt. Die habe ich aus den Daten eines Listenfeldes bzw. des Arrays, welches die Daten für das Listenfeld enthält. Ich müsste nur diese ID dem Formular mitteilen, damit es sich dann aktualisieren kann. Ich hab bei meiner Suche vielleicht eine Lösungsmöglichkeit entdeckt. Mit Command kann ich dem Formular SQL-Befehle übergeben. Ich müsste dann nur noch dynamisch die ID an das SELECT hinten mit WHERE id = dranhängen. Evtl. auch noch ein reload des Formulars. Hab das auch mal mit fest eingetragener ID-Nummer probiert, aber ich bekam ne Meldung, dass die Tabelle nicht existiert. Scheint mir ein SQL-Problem zu sein.

Code: Alles auswählen

Sub datenAktualisieren
	oForm = ThisComponent.drawpage.forms.getByName("MainForm")
	oForm.Command = "SELECT * FROM ""01_Stamm"" WHERE ""stamm_ID""=" & 4
	oForm.reload()
End Sub
Viele Grüsse
Bert

Nach oben