Announcement

Collapse
No announcement yet.

sql-string bauen

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

  • sql-string bauen

    Hallo!

    Ich möchte mittels parameter eine abfrage ausführen!

    übergeben werden bestimmte felder, leider kommt nach einer bestimmten anzahl eine fehlermeldung.

    also das möchte ich machen

    select feld1 from tabelle where feld1= parameter1 or feld2= parameter2 or feld3= parameter3 ....

    wie muß/soll ich das lösen?

    BINE

  • #2
    <p>Hallo Bine,<br>
    <br>
    sicherlich handelt es sich um eine endliche Menge an Feldern, mit denen Du Deine Where-Bedingung zusammenbauen willst. Diese Felder würde ich in einem String-Array ablegen. Darauf aufbauen, wird der Where-Teil dann in einer Schleife zusammengebaut.<br>
    <pre>
    const
    sFeldArr=array[0..3] of String=('Feld1', 'Feld2', 'Feld3', 'Feld4');
    ...
    ...
    procedure DoAbfrage(AnzFelder:Integer);
    var i:Integer;
    s:String;
    q:TQuery;
    begin
    q:=TQuery.Create(Application);
    with q do
    begin
    SQL.Add('SELECT feld1');
    SQL.Add('FROM "tabelle");
    s:='WHERE ';
    for i:=1 to AnzFelder do
    begin
    s:=s+Format('%s=:Param%d', [sFeldArr[i-1], i);
    if (i<AnzFelder) then s:=s+' OR ';
    end; // for i
    SQL.Add(s);
    --> Parameter übergeben;
    Open;
    end; // with q
    end; // DoAbfrage
    </pre>
    Hoffe es hilf.<br>
    <br>
    Gruß Thomas</p&gt

    Comment


    • #3
      hi thomas!

      Leider ist dies eine unendliche Menge an Feldern (anzahl ist gleich der Menge der Daten/Felder in einer Tabelle!)
      Mit Array's habe ich auch noch nicht gearbeitet!

      Kannst du mir helfen?

      Gruß Bine :

      Comment


      • #4
        Vielleicht liegt es auch an den BDE-Grenzen:
        64K Size of SQL statement (RequestLive=False)<br>
        4K Size of SQL statement (RequestLive=True) <br>
        6K Size of SQL statement (RequestLive=True) (4.01, 32 Bit) <br>

        mfg l

        Comment


        • #5
          arbeite nicht mit der BDE....

          KAnnst du mir trotzdem helfen

          Comment


          • #6
            Hallo Bine,
            auch in der Welt der Informationsverarbeitung ist nichts unendlich. Man weiß manchmal nur nicht, wieviel Daten auf einen zukommen.
            Ich nehme mal an, daß du etwas in dieser Form machen möchtest:
            Aus einer Kundenkartei sollen wahlweise alle Kunden, oder Kunden mit der Kundennummer von-bis oder nur ein Kunde mit einer Kundennummer angezeigt werden. Zusätzlich kann man den Wohnort dieser Kunden eingrenzen (oder auch nicht). Und wenn man den Namen nicht mehr genau weiß, kann man noch den oder die ersten Buchstaben eingeben. Das würde bedeuten, du hast von 0 bis 4 Parameter.

            procedure TfrmMain.btnSQLClick(Sender: TObject);<br>
            var<br>
            s, von_bis, Ort, Nachname : String;<br>
            begin<br>
            von_bis := ''; //Der Anfang der Kundennummern <br>
            {Hier beginnt der eigentliche Teil. Wir müssen uns jetzt aus den ange-<br>
            botenen Werten unseren SQL-String zusammenstellen.}<br>
            {Unsere erste Prüfung ist, ob der Nutzer eine gültige "von bis-<br>
            Kombination eingetragen hat.}<br>
            {Steht in der Nummer bis eine "00000", hat sich für uns alles erledigt.<br>
            Bei einem ungültigen Eintrag (Kunde nicht vorhanden) wird bis zu dem<br>
            Kunden gesucht, der die nächstkleinere Kundennummer hat. Eine<br> Kundennummer ohne führende Nullen ergänzen wir freundlicherweise.<br> Ich habe die Kundennummer als Text genommen, da oftmals auch <br>Buchstaben oder führende Nullen darin vorkommen.}<br>
            if (eBis.Text <> '00000') then begin<br>
            if length(eBis.Text) < 5 then<br>
            eBis.Text := copy('0000'+eBis.Text,length('0000'+eBis.Text)-4,5);<br>
            {Auch eVon wird notfalls aufgefüllt.}<br>
            if length(eVon.Text) < 5 then<br>
            eVon.Text := copy('0000'+eVon.Text,length('0000'+eVon.Text)-4,5);<br>
            {Falls "bis" kleiner sein sollte als "von", setzen wir "von" auf den<br>
            Wert von "bis".}<br>
            if eVon.Text > eBis.Text then eVon.Text := eBis.Text;<br>
            {Jetzt können wir unseren SQL-Teilstring zusammenbasteln.}<br>
            von_bis := '((nummer >= "'+eVon.Text+'") AND (nummer <= "'+eBis.Text+'"))';<br>
            end;<br>
            <br>
            {Jetzt müssen wir herausfinden, ob ein Ort gewählt wurde. Das trifft zu,<br>
            wenn der ItemIndex von "cOrt" über 0 liegt, denn 0 ist "kein Ort".}<br>
            if cOrt.Itemindex > 0 then begin<br>
            ort := '(ort = "'+cOrt.Items[cOrt.Itemindex]+'")';<br>
            end else ort := '';<br>
            {Wenn irgendein Kunden-Namenfragment wie "M" gewählt wurde.}<br>
            Nachname := '(name like "'+eKunden.Text+'%")';<br>
            <br>
            s := 'SELECT nummer, name, ort FROM kunden WHERE '+von_bis;<br>
            if ort <> '' then s := s + ' AND '+ ort;<br>
            if Nachname <> '' then s := s + ' AND '+Nachname;<br>
            s := s +' ORDER BY nummer';<br>
            <br>
            with Query1 do begin<br>
            close;<br>
            SQL.Clear;<br>
            SQL.add(s);<br>
            open;<br>
            end;<br>
            end;<br>

            Das komplette Programm steht auch zum Download bereit.

            mfg Klaus-Peter (lp

            Comment


            • #7
              hi! danke für deine hilfe

              mein sql code steht schon!
              ich übergeben (bis jetzt 3 parameter)

              ein von datum
              ein bis datum
              und einen key

              und jetzt kommen noch eine menge dazu (die endlichen!)

              ich brauch das um einen report zu machen (reportbuilder 5.6)

              hast du vielleicht icq? dann könnten wir das ganze per icq mache

              Comment


              • #8
                hab dir im icq ne nachricht geschickt :O

                Comment


                • #9
                  mein problem ist das ich jetzt im moment versuche eine Tstringlist

                  irgendwie in meinen sql-code reinzubekommen, aber nicht weiß wie...

                  :

                  Comment


                  • #10
                    <pre>
                    select...
                    from....
                    where...
                    And feld1= (tstringlist)
                    </pre>

                    wie mache ich das???

                    in der strinliste stehen nur variablen drinnen aber noch kein 'OR'
                    wie ich das machen muß weiß ich nicht ...

                    hab noch nie mit stringlisten gearbeitet!
                    BIN

                    Comment


                    • #11
                      Folgendes würde evtl gehen:

                      <pre>
                      SELECT ....
                      FROM ...
                      WHERE ...
                      AND feld1 IN (Wert1, Wert2, Wert3)

                      Die Werteliste füllst Du über eine for-next-Schleife:

                      for i := 0 to stringlist.items.count - 1
                      begin
                      strWerteListe := strWerteListe + stringlist.items[i];
                      if i < stringlist.items.count - 1 then
                      strWerteListe := strWerteListe + ',';
                      end;
                      </pre&gt

                      Comment


                      • #12
                        danke bernhard (und hallo :O)

                        strWerteListe ist vom typ??

                        Comment


                        • #13
                          ich schätze einmal string :

                          Comment


                          • #14
                            oje TStringList hat keine items laut meinem compile

                            Comment


                            • #15
                              items kennt er nicht ich hab items weggelasse

                              Comment

                              Working...
                              X