Ist eine Abfrage machbar?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Richie
Beiträge: 5
Registriert: Fr, 04.01.2013 14:35

Ist eine Abfrage machbar?

Beitrag von Richie »

Fortsetzung von hier

Erklärung zum untenstehenden Bild:
  • Die Tabelle "Transportgut" beeinflusst die beiden rechten Tabellen
  • Die Tabelle rechts oben wird gefiltert und zeigt nur die 'Basen' an, welche verkaufen
  • Die Tabelle rechts unten wird nicht gefiltert
  • Die Währungsboxen Einkausfspreis/Verkaufspreis erhalten ihre Werte durch die markierung eines Datensatzes der jeweiligen rechten Tabelle
  • Der Inhalt der Währungsbox wird durch ein Makro berechnet
Preisvergleich.png
Preisvergleich.png (106.38 KiB) 1861 mal betrachtet
Im oben verlinkten Beitrag hat mich @F3K Total mehrmals auf eine Abfrage hingewiesen. Ich behaupte mal, dass das mit einer Abfrage nicht zu lösen ist. Lasse mich aber gerne vom Gegenteil überzeugen.


MfG
Richie


Hinweis/Anmerkung zur Angehängten DB:
Die DB-Struktur entspricht in etwa der Originaldatenbank
Der Inhalt der DB wurde mit den "Handelsdaten" aus dem Spiel Freelancer gefüllt
Dateianhänge
Freelancer.odb
100% Anonymisierte Datenbank
(87.04 KiB) 99-mal heruntergeladen
Betriebssystem Arch Linux | Version 3.6.10-1 | 64 bit /|\ KDE | Version 4.9.4
OfficeSuite LibreOffice | Version 3.6.4.3 | Build ID: 3.6.4.3 Arch Linux build-3
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Ist eine Abfrage machbar?

Beitrag von F3K Total »

Ja!
Und nun ist das Ganze schön nach dem Gewinn geordnet und farbig markiert :D
Gruß R

Edit: Ich habe die Formularstruktur aufgeräumt und verändert.
F.png
F.png (42.88 KiB) 1825 mal betrachtet
Wieso hattest Du für die Anzeige von Ein- und Verkaufspreis ein extra Unterformular angelegt? Die Daten sind jeweils im übergeordneten Formular verfügbar. Das frmVerkauf ist nun ein Unterformular des frmEinkauf, und über die ID verknüpft. d.h. es werden nur die Werte der Abfrage (SQL-Befehl) angezeigt, die zum Einkaufsartikel und damit auch zur Transportgutgruppe passen.
Dateianhänge
Freelancer_neu.odb
(87.19 KiB) 116-mal heruntergeladen
Richie
Beiträge: 5
Registriert: Fr, 04.01.2013 14:35

Re: Ist eine Abfrage machbar?

Beitrag von Richie »

Ich bin baff... Ich hätte nie gedacht, dass man das ohne Makro lösen kann...
F3K Total hat geschrieben:Wieso hattest Du für die Anzeige von Ein- und Verkaufspreis ein extra Unterformular angelegt?
Ehrliche Antwort? Weil ich es nicht besser wusste. Die ganzen Abfragen und Listenfeldzuordnungen habe ich nur in der Design-Ansicht erstellt, da ich die SQL Befehle nicht kenne.
Dank dem Hinweis von juetho werde ich bald den SQL Befehl von dir verstehen und weiter ver(schlimm)bessern können.

Danke.
Betriebssystem Arch Linux | Version 3.6.10-1 | 64 bit /|\ KDE | Version 4.9.4
OfficeSuite LibreOffice | Version 3.6.4.3 | Build ID: 3.6.4.3 Arch Linux build-3
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Ist eine Abfrage machbar?

Beitrag von F3K Total »

Hallo Richie,
den SQL-Befehl

Code: Alles auswählen

SELECT "Handelskurse"."ID", "X"."ID" AS "IDX", "Handelskurse"."Transportgüter_ID", "Handelskurse"."Preis", "Handelskurse"."Preis" - "X"."Preis" AS "Gewinn", "Handelskurse"."Basisnamen_ID" 
FROM "Handelskurse" AS "X", "Handelskurse" 
WHERE "X"."Transportgüter_ID" = "Handelskurse"."Transportgüter_ID" 
AND "Handelskurse"."Basis verkauft" = 'Nein'
kann man der Übersichtlichkeit wegen auch noch mit einem Alias Y für die zweite Tabelle "Handelskurse" versehen

Code: Alles auswählen

SELECT "Y"."ID", "X"."ID" AS "IDX", "Y"."Transportgüter_ID", "Y"."Preis", "Y"."Preis" - "X"."Preis" AS "Gewinn", "Y"."Basisnamen_ID" 
FROM "Handelskurse" AS "X", "Handelskurse" AS "Y"
WHERE "X"."Transportgüter_ID" = "Y"."Transportgüter_ID" 
AND "Y"."Basis verkauft" = 'Nein'
oder mit JOIN ... ON

Code: Alles auswählen

SELECT "Y"."ID", "X"."ID" "IDX", "Y"."Transportgüter_ID", "Y"."Preis", "Y"."Preis" - "X"."Preis" "Gewinn", "Y"."Basisnamen_ID" 
FROM "Handelskurse" "X" 
JOIN "Handelskurse" "Y" 
ON "X"."Transportgüter_ID" = "Y"."Transportgüter_ID" 
WHERE "Y"."Basis verkauft" = 'Nein'
schreiben. Hier handelt es sich um den von Juetho beschriebenen SELF JOIN.
Wenn Du einen dieser beiden Befehle verwendest, mußt du in den Formulareigenschaften, unter Sortierung, "Handelskurse" durch "Y" ersetzen.
Lass es uns wissen, wenn du den Befehl hast, mit dem du unter allen möglichen Einkauf-Verkauf Varianten die, mit dem größten Gewinn herausgefunden hast.
Viel Spaß beim Üben.

Gruß R
Richie
Beiträge: 5
Registriert: Fr, 04.01.2013 14:35

Re: Ist eine Abfrage machbar?

Beitrag von Richie »

Ich nehme die Herausforderung
F3K Total hat geschrieben:Lass es uns wissen, wenn du den Befehl hast, mit dem du unter allen möglichen Einkauf-Verkauf Varianten die, mit dem größten Gewinn herausgefunden hast.
an.
F3K Total hat geschrieben:Viel Spaß beim Üben.
Danke, werde ich haben.



Ich habe deinen Filterbefehl

Code: Alles auswählen

[...] AND "Handelskurse"."Basis verkauft" = 'Nein'
mal nach

Code: Alles auswählen

[...] AND "X"."Basisnamen_ID" NOT LIKE "Handelskurse"."Basisnamen_ID"
transformiert.

Der neue Filterbefehl arbeitet auch so wie ich es erwartet habe. Aber wenn ich über die Formulareigenschaften wieder auf den SQL Befehl zugreiffen möchte, erhalte ich einen Syntax-Error sobald ich von der Design-Ansicht in die SQL-Ansicht wechseln möchte:
Fehler in der SQL Syntax
Unter Mehr erhalte ich folgende Informationen:
  • SQL-Status: S1000
  • Fehler-Code 1000
  • Fehler in der SQL-Syntax
Wenn ich das Fenster schließe und anschließend wieder öffne, erhalte ich sofort einen Hinweis:
Syntaxfehler im SQL-Ausdruck
syntax error, unexpected NOT
Wenn ich auf [OK] klicke, bietet sich mir folgendes Bild:

Code: Alles auswählen

SELECT "Handelskurse"."ID", "X"."ID" AS "IDX", "Handelskurse"."Transportgüter_ID", "Handelskurse"."Preis", "Handelskurse"."Preis" - "X"."Preis" AS "Gewinn", "Handelskurse"."Basisnamen_ID"
FROM "Handelskurse" AS "X","Handelskurse"
WHERE ( "X"."Transportgüter_ID" = "Handelskurse"."Transportgüter_ID" ) AND (( "X"."Basisnamen_ID"=NICHT WIE [Handelskurse].[Basisnamen_ID]))
Sieht so aus, als ob das LO-Frontend hier Mist baut.


Bisheriger Lösungsweg:
  • In den Formulareigenschaften die Option >SQL-Befehl analysieren< auf Nein stellen
  • Den Dialog zum editieren der SQL-Befehle öffnen
  • SQL-Befehle bearbeiten
  • Speichern
  • Dialog schließen
  • In den Formulareigenschaften die Option >SQL-Befehl analysieren< auf Ja stellen


MfG
Richie
Betriebssystem Arch Linux | Version 3.6.10-1 | 64 bit /|\ KDE | Version 4.9.4
OfficeSuite LibreOffice | Version 3.6.4.3 | Build ID: 3.6.4.3 Arch Linux build-3
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Ist eine Abfrage machbar?

Beitrag von juetho »

Richie hat geschrieben:
Fehler in der SQL Syntax
Unter Mehr erhalte ich folgende Informationen:
  • SQL-Status: S1000
  • Fehler-Code 1000
  • Fehler in der SQL-Syntax
Wenn ich das Fenster schließe und anschließend wieder öffne, erhalte ich sofort einen Hinweis:
Syntaxfehler im SQL-Ausdruck
syntax error, unexpected NOT
Bei diesen Fehlermeldungen (meistens werden mehrere angezeigt) gilt: Die unterste Fehlermeldung ist die wichtigste - hier vermutlich die mit "unexpected NOT". Es könnte zwei Ursachen geben:
  • LIKE vergleicht Zeichenketten, nicht Zahlen. Möglicherweise musst du zuerst die IDs konvertieren, bevor du sie vergleichen kannst.
  • Die Struktur "(Ausdruck) NOT LIKE (Ausdruck)" entspricht zwar dem SQL-Standard. Vielleicht benötigt HSQL den umgekehrten Aufbau und wegen des vorhergehenden AND mit Klammerung:

    Code: Alles auswählen

    [...] AND NOT ("X"."Basisnamen_ID" LIKE "Handelskurse"."Basisnamen_ID")
Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Ist eine Abfrage machbar?

Beitrag von F3K Total »

Hallo zusammen,
ich hatte mit dem JOIN sogar Komplettabstürze. Ich denke die werden verursacht, wenn man ein komplexes SQL-Statement anlegt, SQL Befehl analysieren auf Ja steht (Direkt-SQL ausgeschaltet) und man dann in den Bearbeitungsmodus wechselt. Das Programm versucht das GUI aufzurufen, es kann den Code aber grafisch nicht darstellen, Absturz.
Daher kann ich den Workaround von Richie bestätigen, wenn die Formulare verknüpft werden sollen, braucht man nämlich "SQL-Befehl-analysieren" sonst ist die Verknüpfung tot.
Also, wenn das Statement geschrieben ist, speichern, Editor verlassen, und dann erst "SQL-Befehl-analysieren" wieder einschalten.

Zum NOT LIKE:
Tippe ich den Befehl ein, läuft er, kein Problem.
Da hast Du mich noch auf eine Idee gebracht, Richie.
Ich habe einmal versucht zu verstehen, was eigentlich genau bei so einem SELF JOIN passiert:
Wir haben in der Tabelle "Handelskurse" 864 Zeilen, 36 Transportgüter_IDs und zufällig je Transportgüter_ID 24 Teile
36*24 = 864
Daher errechnet sich die maximale mögliche Zeilenzahl, da die beiden Instanzen der Tabellen über die Transportgüter_ID miteinander verknüpft sind, so:
24^2 *36 = 20736 wobei das ^2 eben durch den SELF JOIN kommt.
Wenn du keine "Where" Einschränkung angibst, die Abfrage ausführst und ans Ende der Abfrage springst, findest Du
----> 20736 Zeilen
Passt erstaunlich gut!
Jetzt habe ich folgende Einschränkungen ausprobiert:

Code: Alles auswählen

WHERE "Y"."Basis verkauft" = 'Nein' 
----> 17064 Zeilen

Code: Alles auswählen

WHERE "Y"."Basis verkauft" NOT LIKE "X"."Basis verkauft"
----> 4838 Zeilen

<> bedeutet ungleich, ob hier auch nur Strings verglichen werden?

Code: Alles auswählen

WHERE "Y"."Basis verkauft" <> "X"."Basis verkauft" 
----> 4838 Zeilen

Code: Alles auswählen

WHERE "X"."Basis verkauft" = 'Ja'
----> 3672 Zeilen

Code: Alles auswählen

WHERE "Y"."Basis verkauft" = 'Nein' 
 AND "X"."Basis verkauft" = 'Ja' 
----> 2419 Zeilen
Super-> Das ist es!
Ich habe den Befehl eingesetzt, und mit den bisherigen Ergebnissen verglichen, funktioniert einwandfrei.
Man muß ja nicht mehr abfragen als man benötigt!
Schneller sollte es so auch gehen.
EDIT:Ich konnte alle Zahlenwerte in Calc nachrechnen und so nachvollziehen, ich denke die Tabelle hilft zu verstehen, was passiert:
Zeilenberechnung.png
Zeilenberechnung.png (16.58 KiB) 1770 mal betrachtet
Sinngemäß bedeutet das letzte Statement mit den beiden Bedingungen also:
Nimm nur die Preise mit 'Ja' aus Tabelle1(X) und ziehe nur die Preise mit 'Nein' aus Tabelle2(Y) davon ab.
Das aber nur bei den Datensätzen, die die gleiche Transportgüter_ID in X und Y haben.
Beste Grüße von R
Antworten