tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Yaslaw
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
463
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    netprog netprog ist offline Grünschnabel
    Registriert seit
    Sep 2004
    Beiträge
    4
    Hallo, liebe Forengemeinde.

    Ich steh mal wieder vor einem Problem, und zwar hab ich eine Tabelle welche in Delphi in einem Tree angezeigt wird mit folgendem Aufbau:

    ID | PARENTID | PROJECTID | BEZEICHNUNG
    1 |0| 19| EG
    2 |1| 19| Achse A-D
    3 |1| 19| Achse E-G
    4 |0| 19| 1. OG
    5 |4| 19| Achse A-D
    6 |4| 19| Achse E-G
    usw.


    Und wird demnach als Tree anhand PARENTID so angezeigt wird:

    EG
    - Achse A-D
    - Achse E-G
    1.OG
    - Achse A-D
    - Achse E-G

    In einer weiteren Tabelle habe ich jeweils ein Aufmaßblatt mit folgendem Aufbau:

    ID | PROJECTID | GRUPPE | BEZEICHNUNG | ABMESSUNGEN
    1 | 19 | 2 | Wand 1 | 3,45 * 3,36
    2 | 19 | 3 | Wand 2 | 7,31 * 3,36
    3 | 19 | 6 | Wand 1 | 2,25 * 1,25
    usw.

    Nun zu meinem eigentlichen Problem , ich zeige nun mit folgendem SQL-Code die Gruppen an
    zu denen noch kein Eintrag in der Aufmaßblatttabelle vorhanden ist.
    Störend ist nur, sollte schon zu allen Kindeinträgen (PARENTID <> 0) bsp. im EG , Einträge im Aufmaßblatt vorhanden
    sein, so wird dennoch der Elterneintrag (PARENTID = 0) als EG im Tree angezeigt.
    Wie bekomme ich es hin, das halt nur Elterneinträge angezeigt werden wo auch Kindereinträge vorhanden sind.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    SELECT
        Gruppen.ID,
        Gruppen.PARENTID,
        Gruppen.ProjektID,
        Gruppen.Bezeichnung
    FROM
        Gruppen
        LEFT JOIN (
            SELECT DISTINCT 
                Aufmasse.ProjektID,
                Aufmasse.Gruppe
            FROM
                Aufmasse
            WHERE
                Aufmasse.ProjektID = 19
        ) AS GrAbfrage
        ON Gruppen.ID = GrAbfrage.Gruppe
    WHERE
        GrAbfrage.Gruppe IS NULL
        AND Gruppen.ProjektID = 19

    Vielen Dank schonmal für Eure Hilfestellungen und einen guten Rutsch ins Jahr 2012.
    Geändert von Yaslaw (27.12.11 um 21:36 Uhr) Grund: SQL-Tags gesetzt und SQL formatiert
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    item: Willkommen im Forum

    item: Ich habe mal dein SQL formatiert und in SQL-Tags gesetzt

    item: Annahme meinerseits: Es handelt sich um MySQL

    item: Ich poste später ein Vorschlag..
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    netprog netprog ist offline Grünschnabel
    Registriert seit
    Sep 2004
    Beiträge
    4
    @Yaslaw

    Danke schonmal für Deine Antwort zu meinem Problem.

    Zu meinem Code, ich benutze diesen wie gesagt beim programieren in Delphi.
    Die Syntax entspricht MySQL.

    MfG
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    MySQL-Syntax oder MySQL? Nun, mit Variablen kann man tolle Dinge machen.

    Ich liebe solche Denksportaufgaben *g*

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    SELECT
        grp.*,
        -- Speichern ob der Block immer noch komplet ist
        @block_complet := 
                -- prüfen ob ein aufmass vorhanden ist
                NOT am.gruppe IS NULL 
                -- prüfen ob der gesammte Block bissher komplet war
                AND @block_completD 
            AS set_block_complet
    FROM
        -- Variablen initialisieren
        (SELECT @block_complet:=TRUE) AS vars,
        -- Gruppe nach Block und anschliessend nach id absteigend sortiert
        (
            SELECT
                *,
                IF(parentid=0, id, parentid) AS block
            FROM
                gruppen 
            WHERE
                projectid = 19
            ORDER BY
                IF(parentid=0, id, parentid),
                parentid DESC
        ) AS grp
        LEFT JOIN aufmasse AS am
            ON grp.id = am.gruppe
            AND grp.projectid = am.projectid
    WHERE
        -- Falls es sich um ein Parent handelt, das resultat der block-Auswertung, 
        -- ansonsten eine normale Auswertung auf die aufmasse
        IF(grp.parentid = 0, !@block_complet, am.gruppe IS NULL)
    netprog bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    netprog netprog ist offline Grünschnabel
    Registriert seit
    Sep 2004
    Beiträge
    4
    Danke für Deinen Supi Lösungsvorschlag, leider hab ich wieder ein neues Problem:

    Ich kann leider keine Variablen verwenden, da ich doch glatt gestern Abend verwirrender Weise geschrieben hab das ich die MySQL - Syntax benutze. Dabei handelt es sich doch um eine Access-Datenbank auf die mitels ADO zugegriffen wird. Sorry war mein Fehler, wenn man nicht so recht bei der Sache ist, da das liebe Kind mit Magenschmerzen und Übelkeit zukämpfen hatte.

    Dennoch hoffe ich das es auch dafür eine Lösung gibt.

    MfG
    netprog
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    MS Access? oh - also abgespecktes SQL ohne weiterreichende Möglichkeiten. Leider habe ich sehr viel Erfahrung mit MS Access SQL. Unterabfragen sind nur möglich indem man sie einzeln speichert. Komplexere SQL-Funktionen sind nur möglich wenn man sie selber in VBA hinterlegt.
    Ich denke es ist einfacher in Delphi die ausgelesen Daten mit einer Schleife nachzuprüfen als das mit MS Access-SQL lösen zu wollen.

    Also erweitere dein SQL um die Block-sortierung und FLags für Vollständigkeit und Parent
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    SELECT
        grp.*,
        am.gruppe IS NULL AS have_aufmass,
        grp.parentid=0 AS is_parent
    FROM
        gruppen AS grp
        LEFT JOIN aufmasse AS am
            ON grp.id = am.gruppe
            AND grp.projectid = am.projectid
    WHERE
        grp.projectid = 19
    ORDER BY
        IIF(grp.parentid=0, grp.id, grp.parentid),
        parentid DESC
        LEFTAND grp.projectid = am.projectid;

    Diesen dann innerhalb von Delphi mit einer schleife durchgehen. Ich kann kein Delphi, aber so wäre die Logik:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    [block_complet] = true
    [items] = array()
    foreach [row] in [rows]
        -- FLag setzen, dass kein Aufmass vorhanden ist
        [missung_aufmass] = not [row]![have_aufmass]
        -- Wenn es kein Parent ist und bisher der Block komplett ist, 
        -- erneut prüfen ob der Block immer noch komplett ist.
        if not [row]![is_parent] and [block_complet] then
            [block_complet] = [row]![have_aufmass]
        else
        -- Bei einem Parent den Flag übernehmen und den block_complet zurücksetzen
            [missung_aufmass] = not [block_complet]
            [block_complet] = true
        end if
     
        -- Falls der Flag gesetzt ist, die ganze Zeile dem Array mit allen unvollständigen Items hinzufügen
        if [missung_aufmass] then
            [items].add([row])
        end if
     
    next [row]
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #7
    netprog netprog ist offline Grünschnabel
    Registriert seit
    Sep 2004
    Beiträge
    4
    @Yaslaw

    Danke nochmals für Deine schnelle Unterstützung.
    Ich werde das ganze in den nächsten Tagen mal in Ruhe testen und mich dann wieder melden.
    Werde mich erstmal um meine Kranke kleine Maus kümmern.

    Also bis denn ....
     

Ähnliche Themen

  1. [MSSQL] - Komplexe Abfrage
    Von TehQuila im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 04.11.11, 14:18
  2. Schwierigkeit bei Komplexe SQL Abfrage
    Von thehasso im Forum PHP
    Antworten: 1
    Letzter Beitrag: 04.10.10, 17:28
  3. Komplexe Abfrage
    Von anaya im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 12.02.08, 09:54
  4. Komplexe Abfrage in kleiner Datenbank
    Von glader im Forum PHP
    Antworten: 19
    Letzter Beitrag: 26.04.06, 09:24
  5. komplexe Abfrage
    Von silverzone im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 02.02.05, 17:33