🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[Gelöst]Listenfeld oder Kombinationsfeld verknüpfen[/Gelöst]

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Cardinal
Beiträge: 9
Registriert: Mo 21. Nov 2011, 20:19

[Gelöst]Listenfeld oder Kombinationsfeld verknüpfen[/Gelöst]

Beitrag von Cardinal » Mo 21. Nov 2011, 20:43

Ahoi,

Beschäftige mich erst seit kurzem mit Datenbanken.

Zu meiner DB:

Ich möchte eine Datenbank mit folgender Struktur anlegen: Firma/Projekt/Zeichnung/Parameter.Mehrere Firmen. Eine Firma hat mehrere Projekte dort sind wiederum mehrere Zeichnungen untergelistet, welche verschidene Parameter aufweisen können. Ich hab zum allen vier Ebenen eine Tabelle erstellt.

Von "oben" nach "unten" (Strukturbaum) Daten zu erstellen ist kein Problem.Wenn man eine neue Firma im Firmen-Formular erstellt, kann dort im Unterformular Projekte gleich noch ein Projekt hinzugefügt werden. Man kann auch die Firma aus einem Kombinationsfeld auswählen, wenn man im Projekte-Formular arbeitet.

Mein Problem:

Der Auftraggeber hat den Wunsch, dass man z.B eine neue Zeichnung im Zeichnungsformular einträgt. Dort soll man dann eine Firma auswählen können, und danach noch ein Projekt, welches zur Firma gehört. Ich habs zimlich schnell geschafft, dass man aus allen Firmen auswählen kann und dann aus ALLEN Projekten. Ich kriegs jedoch nicht hin, dass wenn ich eine Firma definiert habe, nur die Projekte dieser Firma im nächsten Kombinations- oder Listenfeld erscheinen.

Ich hab mir folgendes zu Gemüte geführt:
http://wiki.documentfoundation.org/imag ... se_V33.pdf
http://www.wienandt.de/seiten/libreoffice.htm

Wäre sehr glücklich, wenn mir jemand helfen könnte. Langsam gehen mir die Ideen aus :)

Gruss Car

Edith: hab jetzt mal ne SQL-Anfrage eingetipt, um bei einem Kombinationsfeld nur Projekte von einer bestimmten Firma zu kriegen:

SELECT "Projekte"."Projektname" FROM "Projekte" "Projekte", "Firma" "Firma" WHERE ( "Firma"."Firma" = "Projekte"."Firma" AND "Firma"."Firma" = 'Firma1' )

hinter dem AND sollte jetzt nich auf Firma1 verwiesen werden sondern auf ein Wert in einem txtFeld im selbigen Forumlar. Sind die referenziert?
Zuletzt geändert von Cardinal am Mi 23. Nov 2011, 10:29, insgesamt 2-mal geändert.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von gogo » Di 22. Nov 2011, 00:18

Sind die referenziert?
klaro:

Code: Alles auswählen

sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Name_des_Formulars").component.drawpage.Forms.getByName("MainForm").getByName("Name_des_Textfeldes").!Property!
... weist der Variablen sFirmenname den entsprechenden Wert zu.

Name_des_Formulars: Durch den Namen des Formulars ersetzen der im Datenbankfenster zu sehen ist
MainForm: Vermutlich musst Du MainForm nicht ersetzen, denn dieser Name wird dem ersten Drawpage-Formular gegeben das in einem Formular erstellt wird. Auf alle Fälle kannst Du den Namen des Drawpage-Formulars in dem sich Dein Textfeld bvefindet im Formular-Navigator erkennen.
Name_des_Textfeldes: ohne den geht's natürlich auch nicht
!Property!: Bei Textfeldern ist die Property "text" ansonsten meist "value", bei Datumsfeldern "date". "Currentvalue" liefert meist auch Brauchbares.

Bei Deinem SQL komm' ich nicht ganz mit - da "fehlt" der Join ... der eigentlich gar nicht notwendig ist ;) ... denn ich nehme an, dass Du alle Projekte in der Projekt-Tabelle gespeichert hast, und dort auch der Firmenname vorkommt - oder?

Code: Alles auswählen

SELECT DISTINCT "Projekte"."Projektname" FROM "Projekte" "Projekte" WHERE ( "Projekte"."Firma" = ' & sFirmenname & ';
... würde die oben gefüllte Variable im SQL verwenden.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Cardinal
Beiträge: 9
Registriert: Mo 21. Nov 2011, 20:19

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von Cardinal » Di 22. Nov 2011, 09:22

Vielen Dank für deine Hilfe.

Bei Deinem SQL komm' ich nicht ganz mit - da "fehlt" der Join ... der eigentlich gar nicht notwendig ist ;) ... denn ich nehme an, dass Du alle Projekte in der Projekt-Tabelle gespeichert hast, und dort auch der Firmenname vorkommt - oder?
So ist es.

Wenn ich im Listeninhalt (SQL Native) des Kombinationfeldes:

Code: Alles auswählen

 SELECT DISTINCT "Projekte"."Projektname" FROM "Projekte" "Projekte" WHERE ( "Projekte"."Firma" = ' & sFirmenname & '; sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm").getByName("txtFirma").!Property! ) 


eintippe kommt folgende Fehlermeldung:

SQL-Status: 37000
Fehler-Code: -11

Unexpected token: ; in statement [
SELECT DISTINCT "Projekte"."Projektname" FROM "Projekte" "Projekte" WHERE ( "Projekte"."Firma" = ' & sFirmenname & '; sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm").getByName("txtFirma").!Property! )
]

das unerwartete token kann ich mir nicht erklären. was mache ich falsch? Ah... kann es sein, weil in dem Moment kein Wert in txtFirma vorhanden ist? Irgendwie sollte ich wohl das Kombifeld so einstellen, dass es erst aktualisiert, wenn ich z.B draufklicke.

Gruss Car

asti
Beiträge: 3
Registriert: Mi 2. Nov 2011, 09:51

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von asti » Di 22. Nov 2011, 10:46

Hi,

ich denke dass das

Code: Alles auswählen

"& sFirmenname & '; sFirmenname = ThisDatabaseDocument
" eher

Code: Alles auswählen

& sFirmenname & ' sFirmenname = ThisDatabaseDocument.
so lauten sollte (der ';' im statement dürfte nicht wirklich gut tun)


lg

Cardinal
Beiträge: 9
Registriert: Mo 21. Nov 2011, 20:19

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von Cardinal » Di 22. Nov 2011, 10:53

wenn ich das ; weglasse, sagt er mir das unexpectet token ist sFirmenname ^^ leider kenne ich mich mit dem sql sintax nicht aus... hab jetzt n bisschen mit dem Sql-Code rumgespielt:

Ich habe das Gefühl: Es könnte sein, dass man in einem Listeninhalt keine Variable definieren kann. Vielleicht wird der Sql-Code auch nur einmal beim Öffnen des Formulars ausgeführt und dann nicht mehr... k.A. Wenn ich das Formular öffne, steht im Firmafeld ja noch nichts drin. Erst wenn ich über das erste Kombinationsfeld die Firma auswähle, wird diesem einen Wert zugewiesen.
Ich habe versuchts, die Ausführung des Kombinationfeldes 2 beim Öffnen des Formulars auszuschalten. Hab dies jedoch nicht hingekriegt.

Ich sitze hier an einem Mac. Ich denke jedoch, dass die Sql-Syntax plattformunabhängig ist.... Ist noch wichtig weil: Ich arbeite je nach dem auf nem Mac/Windows PC, laufen wird die DB aber dann unter Linux Suse^^


Edith: sooo...

mit dieser Variante:

Code: Alles auswählen

 SELECT DISTINCT "Projekte"."Projektname" FROM "Projekte" "Projekte" WHERE ( "Projekte"."Firma" = ' & sFirmenname & ') AND ( sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm").getByName("txtFirma").!Property!) 
kommt die Meldung:

SQL-Status: 22019
Fehler-Code: -226

Three part identifiers prohibited in statement [
SELECT DISTINCT "Projekte"."Projektname" FROM "Projekte" "Projekte" WHERE ( "Projekte"."Firma" = ' & sFirmenname & ') AND ( sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm").getByName("txtFirma").!Property!)
]


Ich interpretiere dies so, dass ich die (Geometrie/MainForm/txtFirma) Identifizierung nicht unterstützt wird?

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von gogo » Di 22. Nov 2011, 11:19

SELECT DISTINCT "Projekte"."Projektname" FROM "Projekte" "Projekte" WHERE ( "Projekte"."Firma" = ' & sFirmenname & '; sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm").getByName("txtFirma").!Property!
... dass das kein SQL-Statement ist versteht sich von selbst. - und Du musst in dem Listeninhalt einen SQL-String verwenden, und zwar bei der Einstellung "SQL-Native" in der Syntax der zugrundeliegenden Datenbank. Die Verweise auf Basic-Objekte funktionieren da nicht.

Den Listeninhalt kannst/musst Du über ein Makro ändern:

Code: Alles auswählen

Sub Listenfeld_Aendern
'erzeugt oForm und fuellt diese Variable mit dem Objekt "MainForm"
oForm = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm")
'erzeugt oTextfeld und fuellt diese Variable mit dem Objekt "txtFirma"
oTextfeld = oForm.getByName("txtFirma")

'erzeugt sFirmenname und fuellt diese Variable mit dem String der derzeit im Feld "txtFirma" steht.
sFirmenname = oTextfeld.text

'erzeugt sSQL und fuellt diese Variable mit dem gewuenschten SQL-Statement
sSQL = "SELECT DISTINCT ""Projekte"".""Projektname"" FROM ""Projekte"" ""Projekte"""_
 	  & " WHERE ""Projekte"".""Firma"" = '" & sFirmenname & "';"

print sSQL

'fuellt die Variable oTextfeld mit dem Objekt "???"
oTextfeld = oForm.getByName("???") '<== hier statt der 3 Fragezeichen den Namen der Listbox eintragen

'Weist den neuen Verweis auf die Daten dem Objekt als ListSource zu, und aktualisiert das Kontrollelement
oTextfeld.ListSource = sSQL
oTextfeld.refresh
end sub
Das Makro abspeichern und dann dem Formularereignis "Nach dem Datensatzwechsel" zuordnen - dann wird das Listenfeld jedesmal wenn Du einen Datensatz anzeigst auf die Projekte der aktuellen Firma abgestimmt.

... VORSICHT beim Kopieren der Zeilen:
"sSQL =" muss am Ende das "_" Zeichen haben, und danach NICHTS mehr (auch keinen Blank!) - Und vorher MÜSSEN 3 doppelte Anführungszeichen stehen, sonst wird das Anführungszeichen hinter "Projekt" nicht korrekt dargestellt!
Zum Testen am besten das "print sSQL" drinlassen, dann kannst Du genau sehen welchen Wert sSQL hat - wenn's dann funktioniert ein Hochkomma oder "REM" davor, dann wird diese Zeile nicht ausgeführt...
Zuletzt geändert von gogo am Di 22. Nov 2011, 11:31, insgesamt 1-mal geändert.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

asti
Beiträge: 3
Registriert: Mi 2. Nov 2011, 09:51

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von asti » Di 22. Nov 2011, 11:28

Hi

also soweit ich sql kenne, bedeutet das ';' ein ende des statements. parameter habe ich bislang immer mit :paramxx bezeichnet (und verwendet) und im sqleditor fragt er mich dann auch immer brav nach dem gewünschten wert.
im originalen statement setzt du die variable NACH dem select !

Anmerkung ich bin mir nicht sicher, ob 'ThisDatabaseDocument.FormDocuments', da das kein gültiges SQL Statement ist.

dazu aus dem HSQL handbuch:
Assignment Statement
The SET statement is used for assignment. It can be used flexibly with rows or single values. The BNF is given below:
<assignment statement> ::= <singleton variable assignment> | <multiple variable
assignment>
<singleton variable assignment> ::= SET <assignment target> <equals operator>
<assignment source>
<multiple variable assignment> ::= SET (<variable or parameter>, ...) = <row
value expression>

In the example below, the result of the SELECT is assigned to two OUT or INOUT arguments. The SELECT must
return one row. If it returns more than one, an exception is raised. If it returns no row, no change is made to ARG1
and ARG2.
SET (arg1, arg2) = (SELECT col1, col2 FROM atable WHERE id = 10);
In the example below, the result of a function call is assigned to VAR1.
SET var1 = SQRT(var2);
Analog dazu

Code: Alles auswählen

DECLARE sFirmenname INTEGER;
SET sFirmenname = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm").getByName("txtFirma").!Property! );
SELECT DISTINCT "Projektname" FROM "Projekte" WHERE  "Firma" = sFirmenname ;
oder:
im normalen libreOffice SQLeditor fragt er mich dann nach :txtFirma

Code: Alles auswählen

SELECT DISTINCT "Projektname" FROM "Projekte" WHERE  "Firma" = :txtFirma ;
lg

uhai
Beiträge: 15
Registriert: Do 10. Nov 2011, 19:06

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von uhai » Di 22. Nov 2011, 13:47

Newbie-Zwischenfrage:

Kann man nicht im Auswahlfeld "Firmenname" ein Ereignis "bei Verlassen" oder "nach Aktualisierung" setzen, so dass die Variable "sFirmenname" jeweils aktualisiert wird?

Oder sind die Variablen lokal und werden nicht auf das Listenfeld übertragen?

Sorry, wenn das eine dumme Idee ist, ich fange gerade erst mit Base an...

uahi

Cardinal
Beiträge: 9
Registriert: Mo 21. Nov 2011, 20:19

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von Cardinal » Di 22. Nov 2011, 13:59

hallo



Danke für eure Mühe. Ich merke jedoch, dass ich viel zu wenig Ahnung von Sql habe um da noch gross aus Eigeninitiative Fehler zu beheben.

Ich habe das Makro wie angewiesen implementiert. Wenn ich das Formular Geometrie öffne plopt der Makroeditor auf. Folgende Linie wird markiert:

oForm = ThisDatabaseDocument.FormDocuments.GetByName("Geometrie").component.drawpage.Forms.getByName("MainForm")

dazu steht: Basic-Laufzeitfehler. Objektvariable nicht belegt.

Ich denke die Fehlerbehebung versteht sich von selbst :D

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Listenfeld oder Kombinationsfeld verknüpfen

Beitrag von gogo » Di 22. Nov 2011, 15:39

sry - mein Fehler!

Das Makro bitte dem Ereignis "Nach dem Aktualisieren" des Kontrollelements zuweisen nach dessen Änderung das Listfeld geändert werden soll. - also das in dem die Firma steht.

@uhai:
Kann man nicht im Auswahlfeld "Firmenname" ein Ereignis "bei Verlassen" oder "nach Aktualisierung" setzen, so dass die Variable "sFirmenname" jeweils aktualisiert wird?
ist damit beantwortet - oder?
Zuletzt geändert von gogo am Di 22. Nov 2011, 15:48, insgesamt 3-mal geändert.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten