Announcement

Collapse
No announcement yet.

SQL: Syntax-Problemchen bei Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL: Syntax-Problemchen bei Abfrage

    Hallo beisammen,

    ich möchte mit folgendem Code eine Abfrage über eine SQL-Tabelle machen, die Summen für verschiedene Kostenarten (Material, Arbeitszeit, ...) erstellt.

    Diese Summen will ich dann gesammelt in einem Fenster anzeigen.

    <PRE><CODE>
    procedure TfmProSum.FormShow(Sender: TObject);
    begin
    with Query do
    begin
    Sql.Clear;
    Sql.Add('SELECT');
    Sql.Add('SUM(ek*menge) AS sumEkMat,');
    Sql.Add('SUM(vk*menge) AS sumVkMat');
    Sql.Add('FROM propos');
    Sql.Add('WHERE typ = ' + CHR(39)+'M'+CHR(39));
    Sql.Add('AND projektnr = 12345');
    Open;
    end;
    end;
    </PRE></CODE>

    Erstes Problem:
    Wie kann ich die Abfrage formulieren, dass verschiedene Kosten-Typen (M für Material, F für Fahrzeuge, ...) erfasst werden? Bei meinem Code muss ich mich für einen Typ (hier: M) entscheiden.

    Zweites Problem:
    Wie zeige ich die Ergebnisse der Abfrage dem Benutzer an?

    Am Ende soll ein Fenster stehen, das für jeden Typ Kosten, Erlöse und die jeweilige Differenz anzeigt.

    Geht das?

    Grüße
    Ralph

  • #2
    Hi,

    so geht es...

    Sql.Add('SELECT');
    Sql.Add(' SUM(ek*menge) AS sumEkMat,');
    Sql.Add(' SUM(vk*menge) AS sumVkMat');
    Sql.Add(' FROM propos');
    Sql.Add(' WHERE typ = ' + CHR(39)+'M'+CHR(39));
    Sql.Add(' AND projektnr = 12345')

    Comment


    • #3
      Sie Leerzeichen sind wichtig... add(' Select'

      Comment


      • #4
        Hi,

        zu Problem 1.
        Hier das Select-Statment
        SELECT SUM(ek*Menge) as SumEK,SUM(vk*menge) as SumVK,Typ FROM propos
        WHERE Projektnr=12345 GROUP BY TYP

        Jetzt bekommst alle Kostentypen Gruppiert angezeigt.

        zu Problem 2.
        Hm, hierfür gibt es viele möglichkeiten du kannst die Daten in einen
        Datengrid anzeigen lassen oder du erstellst über QReport einen
        Report.

        Gruß D

        Comment


        • #5
          Sascha,

          danke für die Antwort... ich kann nur leider keinen Unterschied zwischen Deinem Quellcode und meinem Beispiel erkennen <g>. Was wolltest Du mir denn nun sagen?

          Ralp

          Comment


          • #6
            Denis,

            danke für Deine Antwort!

            Eine gruppierte Abfrage hatte ich auch schon versucht. Die bringt mir zwar genau das gewünschte Ergebnis, ich weiß jedoch nicht, wie ich die gelieferten Daten nun sinnvoll anzeigen kann.

            Ein Grid funktioniert zwar, hat für mich aber folgenden kleinen Nachteil:

            Ich hätte gerne, dass der Endbenutzer optisch immer die selbe Ausgabe präsentiert bekommt. D.h. die Reihenfolge der Typen sollte immer die selbe sein und leere Typen sollten mit Null-Werten gefüllt sein.

            Kann ich auf dem Formular vorbereitete Labels mit den Werten der Abfrage füllen? Oder gibt es eine andere Möglichkeit?

            Grüße
            Ralp

            Comment


            • #7
              Hi,

              mit der Reihenfolge meinst du die Sortierung ?
              Du kannst noch ein "ORDER BY Feldname" anhängen.
              Leere Typen werden zu eine Gruppe zusammengefasst und angegezeigt.

              Gruß D

              Comment


              • #8
                Denis,

                >>leere Typen werden zu einer Gruppe zusammengefasst und angezeigt.

                Wenn aber ein Typ in der Abfrage gar nicht vorkommt (im Projekt also z.B. gar keine Fahrzeuge gebucht sind), taucht der Typ in der Ergebnis-Tabelle auch nicht auf... und somit auch nicht in meinem Grid.

                Ralp

                Comment


                • #9
                  Hallo Ralph,

                  da du Typen hast die gebucht werden können aber in deiner Tabelle 'propos' nicht auftauchen (müssen) gehe ich mal davon aus, das du diese in einer zweiten Tabelle (z.B. 'Tbl_Typen') pflegst. Wenn du nun für deine Auswertung alle Typen die irgendwie möglich sind angezeigt haben möchtest, dann mußt du dir eine 'OUTER JOIN'-Abfrage zusammenbauen - z.B.:<pre>
                  SELECT A.TYP, SUM(B.ek*B.menge) AS sumEkMat, SUM(B.vk*B.menge) AS sumVkMat
                  FROM Tbl_Typen A LEFT OUTER JOIN propos B ON A.TYP = B.TYP
                  WHERE (B.projektnr = 12345 OR B.projektnr is null')
                  ORDER BY A.TYP</pre>
                  Ein paar Erläuterungen: LEFT OUTER JOIN sorgt dafür, das dir alle Einträge aus Tabelle A angezeigt werden, verknüpft mit denen für die es in Tabelle B eine Entsprechung für A.Typ = B.Typ gibt. Das ...OR B.projektnr is null... ist notwendig um durch die Where-Bedingung den Join nicht wieder außer Kraft zu setzen.

                  Gruß Fal
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    Hallo Falk,

                    danke für Deine Antwort!

                    Die Idee mit der zweiten Tabelle (ich habe sie ProTypen genannt) ist perfekt! So kann ich auch noch die Reihenfolge der Anzeige bestimmen.

                    Bei folgendem SQL-Code erhalte jedoch die Fehlermeldung "Attribute a.typ must be GROUPed or used in an aggregate function"

                    <PRE><CODE>
                    SELECT a.typ,
                    SUM(b.ek*b.menge) AS sumEK,
                    SUM(b.vk*b.menge) AS sumVK
                    FROM protypen a LEFT OUTER JOIN propos b
                    ON a.typ = b.typ
                    WHERE (b.projektnr = 12345 OR b.projektnr IS null)
                    ORDER BY a.pos
                    </PRE></CODE>

                    Hmmm, ich bin leider nicht fit genug in SQL - könntest Du da nochmals drüber gehen?

                    Grüße
                    Ralp

                    Comment


                    • #11
                      Hallo Ralph,

                      A.Typ und B.Typ sind zwei Felder in den jeweiligen Tabellen. Ich bin einfach davon ausgegangen das die Tabelle A ein Feld 'Typ' hat, welches mit dem Feld 'Typ' von B identisch ist ;-) Wenn das nicht so ist, dann mußt du das noch entsprechend anpassen (eine eindeutige Kennung, ID o.ä.)

                      Gruß Fal
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Hallo Falk,

                        sowohl Tabelle a als auch Tabelle b haben ein Feld mit Namen 'Typ', beide sind als CHAR(1) definiert. Daran kann es also wohl nicht liegen.

                        Ich arbeite mit postgreSQL unter Linux und Delphi 4 C/S - es dürfte aber in diesem Zusammenhang nicht am Server liegen, oder?

                        Gruß Ralp

                        Comment


                        • #13
                          Hallo Ralph,

                          das kommt davon wenn man nicht gleich testet, vorher die Hälfte vergißt und sich anschließend die Fehlermeldung nicht richtig durchliest ;-) Ich habe bei meinem Posting natürlich das Group By vergessen und das bemängelt der Server zurecht.<pre>
                          SELECT a.typ,
                          SUM(b.ek*b.menge) AS sumEK,
                          SUM(b.vk*b.menge) AS sumVK
                          FROM protypen a LEFT OUTER JOIN propos b
                          ON a.typ = b.typ
                          WHERE (b.projektnr = 12345 OR b.projektnr IS null)
                          <b>GROUP BY A.Typ</b>
                          ORDER BY a.pos </pre>

                          Gruß Fal
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment


                          • #14
                            Hallo Falk,

                            nochmals danke für Deine Hilfe!

                            So funktioniert es tatsächlich (ich habe noch ein Feld Bezeichnung eingeführt, das die Typen als Klartext aufführt und eine Sortierung angegeben):

                            <PRE><CODE>
                            SELECT a.bezeichnung,
                            SUM(b.ek*b.menge) AS sumEK,
                            SUM(b.vk*b.menge) AS sumVK
                            FROM protypen a LEFT OUTER JOIN propos b
                            ON a.typ = b.typ
                            WHERE (b.projektnr = 8 OR b.projektnr IS null)
                            GROUP BY a.pos, a.bezeichnung
                            ORDER BY a.pos
                            </PRE></CODE>

                            Grüße
                            Ralp

                            Comment

                            Working...
                            X