Announcement

Collapse
No announcement yet.

Query SQL Abfragen mit delphi

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

  • Query SQL Abfragen mit delphi

    Hallo !

    Ich habe folgendes Problem :

    Ich möchte während der Laufzeit in meinen Programm in einer Tabelle
    Summen zusammen Rechnen und das Ergebnis in einer anderen Tabelle
    abspeichern, Ich bekomme aber den SQL Befehl einfach nicht zusammen.

    Kann mir da vieleicht jemand helfen?

    Ich arbeite mit delphi 5.0 und verwende Querys als Komponente.
    Die Datenbank ist Paradox.

    Mit dank im vorraus
    Georg

  • #2
    Hi Georg,

    Beispiel für eine Summierung in SQL:

    SELECT SUM(Feld_mit_Wert) AS Gesamtsumme
    FROM Tabelle;

    Das summiert alle Werte eines Feldes über die gesamte Tabelle.

    Wenn Du z.B. nur nach einer Person gruppieren willst:

    SELECT NAME,SUM(Feld_mit_Wert) AS Gesamtsumme
    FROM Tabelle
    GROUP BY Name;

    In dem Query hast Du dann die einzelnen Summen drin und kannst die in einer anderen Tabelle abspeichern - entweder per Hand oder vielleicht auch über Batchmove.

    Viele Grüße

    Fran

    Comment


    • #3
      Hallo Frank
      Danke für den Tip aber ich habe noch eine Frage !

      Wie kann ich das Ergebnis der Abfrage in eine Variable schreiben oder
      anderst gesagt lese ich das Ergebnis aus der Query aus.

      Dank im vorraus
      Geor

      Comment


      • #4
        In der TQuery werden die Attribute aus der SQL-Anweisung in einer Felderliste gespeichert. Die kann man entweder über den Namen oder über die Reihenfolge ansprechen. Bei unserem Beispiel wäre also:

        "TQuery.Field[0].AsString" der Ausdruck für den Namen und
        "TQuery.Field[1].AsFlotat" der Ausdruck für die Summe.

        Das kannst Du dann einer ganz normalen Variablen zuweisen. Die TQuery verwendest Du genauso wie eine TTable also, Schleife solange NOT Tquery.eof, Variable schreiben, Next etc....

        Frohes Schaffen

        Fran

        Comment


        • #5
          Hallo nochmal

          Danke für den Typ leider habe ich noch ein Problem :

          Der Code sieht so aus

          QRY_Berechnung.Close;
          QRY_Berechnung.SQL.Clear;
          QRY_Berechnung.SQL.Add('SELECT SUM(Betrag) FROM "CSaetze.DB" Csaetze');
          QRY_Berechnung.ExecSQL ;
          Summe := QRY_Berechnung.Fields[0].AsCurrency;

          In Summe soll dann die Gesamtsumme (aus 3 Datensätzen)stehen und in einer anderen Tablle abgespeichert werden.

          Ich erhalte jetzt die Fehlermeldung Maximum Überschreitet die Grenze (0) was mache ich den jetzt wieder Falsch ??

          Nochmals danke im vorraus.

          Geor

          Comment


          • #6
            Nimm kein execSQL sondern Qry_berechnung.Active:=true. ExecSQL nur bei Update, DELTE verwenden!

            Viele Grüße

            Frna

            Comment


            • #7
              Hallo Frank
              Danke für den Typ hat geklapp aber jetzt habe ich eine noch eine dumme Frage :

              Das Ergebnis befindet sich jetzt in der Variablen "Summe" (Typ Currency )
              ich möchte den Inhalt der Variablen jetzt per UPdate in eine andere Tabelle speichern wie muß ich das machen.

              Nochmas vielen dank
              Geor

              Comment


              • #8
                Tja, das ist ja witzig... ich dachte Du hattest nur Probleme mit dem SUM...

                Nun gut. Ich mache immer die SQL-Befehle in eine Stringvariable oder packe sie gleich in die query.sql - Stringliste mit Add. Also einfach mal string machen:
                UPDATE Tabelle SET Feld=Wert.

                Und dann mußte EXECSQL verwenden.

                Viel Erfolg

                Fran

                Comment


                • #9
                  Hallo nochmal,

                  Nein ich habe mit SQL Probleme damit habe ich bisher nämlich noch nichts gemacht.

                  Habe ich so wie in deinen letzten Typ gemacht die Variable Summe wird aber imm als Feld erkannt und nicht als Variable.

                  Irgendwas mache ich noch Vewrkehrt.

                  So sieht das aus :

                  QRY_Speichern.Close;
                  QRY_Speichern.SQL.Clear;
                  QRY_Speichern.SQL.Add('UPDATE "Gesamt.db" SET Gesamt.Brutto = RSumme ');
                  QRY_Speichern.ExecSQL ;

                  In RSumme steht das ergebnis.

                  Danke im Vorraus
                  Geor

                  Comment


                  • #10
                    ja nene... das ist ja auch richtig verkehrt! Jetzt hast Du RSumme ja im String! Es muß heissen:

                    ....brutto = '+inttostr(RSumme)+';'

                    Wobei, RSumme ist kein Integer sondern ein Float ?! Also mußt Du vorher die RSumme in einen String packen. Mit FloattoStrF oder so war das glaube ich. Schau mal in die Hilfe darunter. Den String mußt Du dann angehängen.

                    Viel Erfolg

                    Frna

                    Comment


                    • #11
                      Hallo Frank !

                      Danke für die Hilfe jetzt komme ich fast schon zurecht aber ich habe noch eine kleine Frage :

                      Ich bekomme jetzt die Fehlermeldung "Merkmal nicht vorhanden"
                      was heist das die Eigenschaft ReqestLive der Querry steht auf True,
                      da ich local arbeite und keinen Server habe.

                      Danke im Vorraus
                      Georg

                      Comment


                      • #12
                        Merkmal nicht vorhanden ?

                        Tja, :grübel: was meint er denn damit? Auf alle Fälle mach RequestLive erstmal auf false denn mit local hat das nix zu tun. Bei Querys geht es dann darum direkt in der Ergebnismenge etwas verändern zu können. Aber bei einem UPDATE müsste das sowieso ignoriert werden.

                        Vorschlag: Den SQL-Text mach mal in einen STRING und las ihn Dir am Bildschirm ausgeben. Versuch den SQL-Text mal in der DB-Oberfläche oder im DB-Explorer zum laufen zu bekommen damit Du ausschliessen kannst, daß der Fehler im SQL-Text sit.

                        bis dann und Viel Erfolg

                        Fran

                        Comment


                        • #13
                          Also mal in aller Ruhe, warum sollen die Angaben immer so anonym sein, wo doch die BDE und Delphi es einem viel leichter machen.
                          Es gibt doch die Funktionen FieldByName, und ParamByName um eine Query abzufragen bzw. zu bedienen. Und die BDE gestattet Aliase.
                          Das sieht dann zum Beispiel so aus:

                          procedure rechneGehalt;
                          var
                          fGehalt:real;
                          begin
                          with Query do begin
                          active:=false;
                          SQL.Clear;
                          SQL.Add('select sum(Gehalt) as GehaltSum from Lohn');
                          active:=true; //entspricht open
                          fGehalt:=FieldByName('GehaltSum').AsFloat;
                          active:=false;
                          SQL.Clear;
                          SQL.Add('Update Mitarbeiter set');
                          SQL.Add('Gehalt = Gehalt'); // der : bezeichnet einen Parameter
                          SQL.Add('where Name = Name); // wenn die Where Klausel nicht gesetzt wird, werden alle Datensätze geändert!!!
                          ParamByName('pGehalt').AsFloat:=fGehalt;
                          ParamByName('pName').AsString:='Müller';
                          ExecSQL;
                          end;
                          end

                          Comment


                          • #14
                            Hi Helmut,

                            hast Du alles gelesen gehabt? Ob Fields[x] oder FieldbyName ist bei dem SQL-Statement wurscht. Das Problem lag an EXECSQL beim SELECT.

                            Auf alle Fälle würde ich bei temp. SQL-Statements NIE FieldbyName verwenden sondern immer auf die Spalte "zielen". Nur bei "generellen" SELECT benutze ich direkt die Feldnamen aus Wartungsgründen. Aber das ist halt Geschmackssache.

                            Parameter machen eigentlich auch nur Sinn wenn man das SQL-Statement häufiger verwendet und die Datenbank über einen SQL-Cache verfügt. Bei Paradox und einem eh dynamisch erzeugten SQL-Statement hat die langsame Zuweisung über Parameter überhaupt keinen Sinn.

                            Aber trotzdem danke für Deinen Hinweis über die WHERE - Klausel. Könnte sein, daß Georg es irgendwann nochmal braucht.

                            Frank

                            P.S: Wozu brauchst Du in Deinem Beispiel ein Alias

                            Comment

                            Working...
                            X