Announcement

Collapse
No announcement yet.

Variable in SQL Abfrage einsetzen

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

  • Variable in SQL Abfrage einsetzen

    Hallo,

    ich versuche nun schon seit Tagen in eine SQL Abfrage über eine ADODataSet Komponente eine Variable einzusetzten. Und zwar soll der Anwender aus einer DBComboBox einen Wert 'KundenID' auswählen können und der dazugehörige Wert 'KundenName' soll in einer andere DBCombobox erscheinen. Diese Anwendung soll wechselseitig möglich sein, also der Anwender soll entscheiden können ob er die ID oder den Namen des Kunden auswählen will.

    Bei meinem Programmcode erhalte ich immer die Fehlermeldung: Parameter name expected.

    Auch wenn unter Parameters den Namen eingebe.

    DBComboBox4.DataSource := DataModule1.DataSource6;

    DBComboBox4.DataField := 'F_1';

    with DataModule1.ADODataSet6 do

    begin

    Parameters.ParamByName('id').Value := DBComboBox3.Field.AsString;

    CommandText := 'select NAME1 from KUNDENSTAMM where kundenid = :id';

    active := true

    end

    wer kann mir helfen ?

    Gruß Elke

  • #2
    Hallo Elke,

    ein paar Denkanstöße zur "sinnvollen" Verwendung von DBCombobox: Solche Comboboxen sind auf den ersten Blick recht komfortabel weil man schnell einen Wert auswählen kann und automatisch sichergestellt ist, das er gültig ist. Das funktioniert aber nur vernünftig wenn es dabei nur um ein paar (10,20 max.100) Datensätze geht, sonst scrollt sich der Anwender zur Verzweiflung.
    Ich bin bei solchen Anwendungsfällen immer auf separate (kleine, wiederverwendbare) Suchmasken ausgewichen. Diese kann z.B. eine Kombination aus Eingabefeld und DBGrid enthalten. Im DBGrid wird dann immer nur noch das Angezeigt was mit der Eingabe zum Teil übereinstimmt. Dort ist es dann z.B. auch Problemlos möglich dem Anwender eine Auswahl an IDNr anzugeben wenn er eine Zahl eingibt und sobald der wert nicht numerisch interpretiert werden kann erhält er im DBGrid eine Auswahl der passenden Namen.

    Gruß Falk

    P.S. Meine Erfahrung mit DBCombobox war immer von Frustration geprägt ;-
    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


    • #3
      Hallo Falk,

      klingt interessant, was Du da vorschlägst. Könntest Du mir ein Beispiel schicken, wie man das realisiert ?

      Gruß Elk

      Comment


      • #4
        Hallo Elke,

        so sollte es gehen
        <pre><b>
        begin
        DBComboBox4.DataSource := DataModule1.DataSource6;
        DBComboBox4.DataField := 'F_1';
        with DataModule1.ADODataSet6 do begin
        CommandText := 'select NAME1 from KUNDENSTAMM where kundenid = :id';
        Parameters.ParamByName('id').Value := DBComboBox3.Field.AsString;
        active := true;
        end;
        end;</pre></b>

        Tschüß

        Torste

        Comment


        • #5
          Hallo Torsten,

          so hab ich's auch schon probiert. Aber dannerhalte ich die meldung:

          Field '''' not found.

          Gruß Elk

          Comment


          • #6
            Wenn kundenid ein string<br>
            with Query1 do begin<br>
            Active:=false;<br>
            SQL.clear;<br>
            SQL.add('select NAME1 from KUNDENSTAMM where kundenid = '''+ID+'''');<br>
            Active:=true;<br>
            end;<br>
            <br>
            Wenn kundenid ein Integer, Float, etc.<br>
            with Query1 do begin<br>
            Active:=false;<br>
            SQL.clear;<br>
            SQL.add('select NAME1 from KUNDENSTAMM where kundenid = '+ID);<br>
            Active:=true;<br>
            end;<br>

            Gruß Karsten Raue

            Comment


            • #7
              Hallo Elke,

              ich konnte es leider nur mit den IBX-Komponenten testen und funktioniert es so.

              Tschüß

              Torste

              Comment


              • #8
                Hallo ,

                Danke an euch alle. Mit dem Vorschlag von Karsten bekomme ich nun wenigstens keine Fehlermeldung mehr. Aber trotzdem wird in der anderen Combobox der selectierte Wert nicht angezeigt. Ich hab die Datasource und DataField wie oben beschrieben definiert. Ist das korrekt ober muss ich da anders vorgehen ?

                Gruß Elk

                Comment


                • #9
                  DB-Comboboxen funktionieren nur mit Tabellen, so meine Erfahrung. Ein aktives Query läßt sich leider nicht einsetzen.
                  Ich nutze zur auswahl normale Comboboxen.
                  Folgend ein Beispiel:

                  { Auslesen Abteilung }<br>
                  with Query1 do begin<br>
                  Active:=false;<br>
                  SQL.clear;<br>
                  SQL.add('select * from K_MandantAbteilung where Abteilung<>'''+''+''' order by Abteilung');<br>
                  Active:=true;<br>
                  end;<br>
                  with ComboBoxAbteilung do begin<br>
                  Items.Clear;<br>
                  Query1.First;<br>
                  repeat<br>
                  Items.Add(Query1.FieldByName('Abteilung').AsString );<br>
                  Query1.Next;<br>
                  until Query1.EOF;<br>
                  end;<br>

                  Viel Erfolg

                  Comment


                  • #10
                    ok. Danke ich probiers mal so

                    Gruß Elk

                    Comment


                    • #11
                      Hallo Elke,

                      die Datasource-Eigenschaft brauchst Du nicht zu setzen. Die Syncronisation der LookupComboboxen erfolgt dann so wie im anderen Thread gezeigt über die DataSource-Komponente.

                      Tschüß

                      Torste

                      Comment


                      • #12
                        Hi Torsten,

                        scheinbar funktioniert das mit der DataSource-Komponente nicht. Die implementierung wie von Dir vorgeschlagen führt immer zum Systemabsturz. Liegt das vielleicht daran dass ich ein DatenModul verwende ? Das Problem tritt auch an anderer Stelle auf. Siehe z.B die Threads "Berechnung mit Zeitformaten" und" Kombination von Tabellenfeldern.."

                        Gruß Elk

                        Comment


                        • #13
                          ok,

                          Problem gelöst. Es lag an der Create-Reihenfolge. Beim erstellen des DatenModules war das benötigte Fromular noch nicht erzeugt. Mit den DBLookupComboFeldern funktioniert jetzt auch die Abfrage.

                          Danke noch mal an alle

                          Gruß Elk

                          Comment

                          Working...
                          X