Suchfunktion in C++Prog mit MySQL



  • Guten Abend,

    ich progge gerade eine Suchfunktion für meine Kundendaten. Datenbank ist MySQL, der Suchparameter wird in ein TEdit-Feld eingeben. Nach klick auf "Suchen" soll die komplette Tabelle mit den Kundenstammdaten durchsucht werden. Die Ausgabe der Suche erfolgt in ein DBGrid.

    Mein Lösungsansatz war folgender, aber es klappt nicht.

    void __fastcall TFkdsuchen::searchClick(TObject *Sender)
    {
    AQkdsuchen->Close();
    AQkdsuchen->SQL->Clear();
    AQkdsuchen->SQL->Add("SELECT kundennummer, kommission, bemerkung, email, mobil, fax, telefon, ort, plz, strasse, firma, vorname, name");
    AQkdsuchen->SQL->Add("FROM kunden");
    AQkdsuchen->SQL->Add("WHERE kundennummer or kommission or bemerkung or email or mobil or fax or telefon or ort or plz or strasse or firma or vorname or name like :search");
    AQkdsuchen->Parameters->ParamByName("search")->Value = searchfield->Text;
    AQkdsuchen->Open();
    }
    

    Wichtig ist auch noch wie mache ich es das nicht nur der genaue Suchbegriff wie zum Beispiel "mit" ausgegeben wird sondern auch alle Datensätze die z.B. "Schmitt" enthalten.

    Vielen Dank schon mal für Eure Hilfe



  • a) "klappt nicht" ist keine ausreichende Fehlermeldung bzw. Problembeschreibung
    b) das Thema hatten wir gerade, vor dem Starten neuer Threads bitte die Suchfunktion benutzen
    c) für die "unscharfe" Suche mittels SQL bzw. für die generelle SQL-Syntax bitte das SQL-Tutorial deiner Wahl zu Rate ziehen
    d) bitte die Faustregel beachten: ein Thema pro Thread, ein Thread pro Thema

    So, das dürfte erstmal alles gewesen sein. 😉



  • Also, bevor hier alle wieder rumschreien ;),habe mittlerweile kilometerweise Forumsbeiträge gewälzt, stundenlang gegoogelt, bin aber kein stück weitergekommen mit meinem Problem.

    Fehlermeldungen bekomme ich keine. Nach ausführung der Query ist mein DBGrid leer, ich bekomme also kein Rückgabewert obwohl das gesuchte Wort im Parameter ":search" gespeicht ist und in der DB vorhanden ist. 😕

    Auch habe ich nichts gefunden, wie ich die Tabelle nach einer Zeichnfolge durchsuchen kann. Also z.B. alle Einträge welche "mit" enthalten.

    Bitte helft mir, die Zeit drückt, am MOntag muss ich erste ergebnisse auf den Tisch legen.

    Danke schon mal.



  • Hast du dein SQL-Statement mal mit einem garantiert funktionierenden Programm wie z.B. MySQLFront oder phpMyAdmin getestet?

    Nochmal: das BCB-Forum ist nicht der Ort, um die Feinheiten der SQL-Syntax zu diskutieren, dafür gibt's entweder das "Rund um"-Forum oder sonst halt dedizierte SQL-Seiten bzw. -Foren. Und ich habe Probleme, deinen Bericht von der erfolglosen Google-Suche zu glauben. Für diese Seite habe ich zwei Minuten gebraucht: http://www.little-idiot.de/mysql/mysql-168.html



  • 1. es heist

    boolean_expression OR boolean_expression

    also:
    xyz = 'abc' OR der = 'abc'

    und nicht:
    xyz OR der = 'abc'

    ich wundere mich, dass es überhaupt keine exception bei der abfrage kommt. aber vielleicht kann mysql so was verdauen...

    2. in jedem sql-tut findest du, dass like

    Bestimmt, ob die angegebene Zeichenfolge einem angegebenen Muster entspricht. Ein Muster kann normale Zeichen und Platzhalterzeichen einschließen. Bei einem Mustervergleich müssen normale Zeichen exakt mit den angegebenen Zeichen in der Zeichenfolge übereinstimmen. Platzhalterzeichen können jedoch mit beliebigen Teilen der Zeichenfolge übereinstimmen.

    also für Schmitt: name like '%mit%'



  • also für Schmitt: name like '%mit%'

    Wenn ich die Platzhalterzeichen nach MYSQL nutze bekomme ich die Fehlermeldung das der Parameter ":search" nicht gefunden werden kann.

    2. in jedem sql-tut findest du, dass like

    Like beutze ich doch.

    Und ich habe Probleme, deinen Bericht von der erfolglosen Google-Suche zu glauben.

    Das Tut habe ich gesehen, aber es klappt nicht, weil er den Parameter nicht mehr findet.



  • Woher sollen wir wissen, was du eventuell noch falsch machst, wenn du uns deinen aktuellen Code nicht zeigst?

    Ausserdem: was ist mit der Überprüfung deines SQL-Statements durch ein externes Programm?



  • Ich vermute er hat so was, in der Art „verbrochen“:

    select * from tablename where name like '%:search%'
    

    In dem Fall wird :search nicht als Parameter behandelt, sondern als ganz normaler String. So wäre es richtig:

    select * from tablename where name like '%' + :search + '%'
    

    wenn man :search aber mehrmals verwenden möchte,

    select * from tablename where name like '%' + :search + '%' or place like '%' + :search + '%'
    

    dann hat Borland da ein Problem. Es wird nämlich nur ein :search beim Parametersetzen berücksichtigt. Beim Ausführen „excepted“ 😉 das mit der Meldung, dass :search nicht zugewiesen ist.
    Bei so einem Fahl konnte man folgendes versuchen:

    declare @param varchar(20) -- 20 ist die länge des strings
    set @param = :search
    select * from tablename where name like '%' + @param + '%' or place like '%' + @param + '%'
    

    ich weis allerdings nicht, in wie weit so ein SQL Statement mit MySql kompatibel ist.



  • Ich habe mir mal eine Suchfunktion gebastelt, die aus mehreren Edit-Feldern zusammengebaut wurde. Je nachdem, welche Felder gefüllt waren.

    Dies ging allerdings nicht über einen Parameter sondern alles in einen String geschmissen, der dann der TQuery üergeben wurde.

    Das müßte weitestgehend auf Deine Suche zutreffen. Das einzige was noch fehlt, das mit allen Suchbegriffen über alle Felder gesucht wurde.

    Ich pack Dir den Code mal hierhin, wenn Du noch Fragen hast melde Dich. Habe im Moment keine Zeit für weitere Erklärungen.

    void __fastcall TSuchenForm::SuchenBitBtnClick(TObject *Sender)
    {
      AnsiString SuchString;
      AnsiString Anweisung;
      AnsiString UpperStart;
      AnsiString UpperEnd;
      AnsiString SuchFeld;
    
      bool erstesFeld = true;
    
      if(RBExactSearch->Checked)
        Anweisung = " = ";
      else
        Anweisung = " like ";
    
      if(CBUPLO->Checked)
      {
        UpperStart = " ";
        UpperEnd   = " ";
      }
      else
      {
        UpperStart = " Upper(";
        UpperEnd   = ") ";
      }
    
      for(int i=0; i < this->ComponentCount; i++)
        if (this->Components[i]->ClassNameIs("TEdit") &&
            dynamic_cast<TEdit*>(this->Components[i])->Text != "")
        {
          if (erstesFeld)
          {
            if(CBUPLO->Checked)
              SuchFeld =          dynamic_cast<TEdit*>(this->Components[i])->Text;
            else
              SuchFeld = UpperCase(dynamic_cast<TEdit*>(this->Components[i])->Text);
    
            SuchString = "Select * from " + HauptForm->IBTable->TableName + " where" +
                         UpperStart +
                         dynamic_cast<TEdit*>(this->Components[i])->Name +
                         UpperEnd +
                         Anweisung + "'" + SuchFeld + "'";
            erstesFeld = false;
          }
          else
          {
            if(CBUPLO->Checked)
              SuchFeld =          dynamic_cast<TEdit*>(this->Components[i])->Text;
            else
              SuchFeld = UpperCase(dynamic_cast<TEdit*>(this->Components[i])->Text);
    
            SuchString = SuchString + " and " +
                         UpperStart +
                         dynamic_cast<TEdit*>(this->Components[i])->Name +
                         UpperEnd +
                         Anweisung + "'" + SuchFeld + "'";
          }
        }
      if(!erstesFeld)
      {
        SuchDBGrid->Visible = false;
        Query1->SQL->Clear();
        Query1->SQL->Add(SuchString);
        Query1->Open();
        if(Query1->RecordCount == 0)
          ShowMessage("hierzu wurden keine Daten gefunden");
        else
        {
          SuchDBGrid->Visible = true;
          for(int i = 0; i < SuchDBGrid->Columns->Count;++i)
            if(SuchDBGrid->Columns->Items[i]->Width > 200)
              SuchDBGrid->Columns->Items[i]->Width = 200;
        }
      }
    }
    


  • Geschafft, jetzt klappts. Für alle die einmal das selbe Problem haben sollten.

    void __fastcall TFkdsuchen::searchClick(TObject *Sender)
    {
    AnsiString Suchbegriff;
    AnsiString SuchString;
    
    Suchbegriff = SuchFeld->Text;
    SuchString = "Select * from kunden where kundennummer like '%" + Suchbegriff + "%' or kommission like '%" + Suchbegriff + "%' or bemerkung like '%" + Suchbegriff + "%' or email like '%" + Suchbegriff + "%' or mobil like '%" + Suchbegriff + "%' or fax like '%" + Suchbegriff + "%' or telefon like '%" + Suchbegriff + "%' or plz like '%" + Suchbegriff + "%' or strasse like '%" + Suchbegriff + "%' or firma like '%" + Suchbegriff + "%' or vorname like '%" + Suchbegriff + "%' or name like '%" + Suchbegriff + "%'";
    
    AQkdsuchen->Close();
    AQkdsuchen->SQL->Clear();
    AQkdsuchen->SQL->Add(SuchString);
    AQkdsuchen->Open();
    }
    

    Jetzt habe ich aber dennoch eine Fragen. Gibt er eine möglichkeit im C++ Builder einen Zeilenumbruch herbeizuführen, da der Code für die Abfrage sehr lang ist und dadurch unübersichtlich wird.

    Danke nochmal allen Helfern.



  • Derberon schrieb:

    Für alle die einmal das selbe Problem haben sollten.

    Häh? Warum sollten andere sich an deinem Beitrag orientieren? Statt die Suchfunktion zu benutzen können sie doch einfach einen neuen Thread anfangen, genau wie du!?



  • ...und was passiert, wenn dein Suchbegriff mal so heisst: d'art für D'Artagnan???

    probier' doch mal...



  • Häh? Warum sollten andere sich an deinem Beitrag orientieren? Statt die Suchfunktion zu benutzen können sie doch einfach einen neuen Thread anfangen, genau wie du!?

    Was soll denn das bitte heißen? Ist das hier ein Forum für Profis oder dürfen hier auch Anfänger fragen stellen?

    Ich als Anfänger, habe halt mit einigen dingen meine Probleme, wenn ich sie lösen könnte würde ich hier auch keine Fragen stellen. Es gibt leider keine Bücher in denen alles haargenau erklärt ist oder dementsprechende Threads. Wenn einem meine Hilflosigkeit auf den Sack geht soll er doch bitte meine fragen überlesen und fertig, es wird sich schon jemand finden der einem Helfen will. Als Moderator oder Profi in einem solchen Forums bestimmt nicht immer so einfach, gerade wenn mann das Wissen eventuell hat. Ein verweiss auf die "Suche" oder "Google" ist da natürlich schnell gemacht, wenn mann sich mit kinderkram rumärgern muss. Programme zu entwerfen ist ne schöne Sache, aber wir alle haben mal klein angefangen.

    Ich bitte dies doch zu bedenken zum wohle diese wircklich guten Forums.

    Gruß Derberon

    P.S.: Sollte an meiner Lösung ein Fehler sein (Bei mir funktioniert es gut), oder irgendwann einmal ein Problem auftauchen können, teilt es mir bitte mit, damit ich es ändern kann.


  • Mod

    Hallo

    @Derberon

    Es gibt leider keine Bücher in denen alles haargenau erklärt ist oder dementsprechende Threads.

    Es gibt zum Thema SQL und Builder einige (gute) Buecher

    gab auch schon einige Beitraege zu dem Thema

    MfG
    Klaus



  • Derberon schrieb:

    Was soll denn das bitte heißen? Ist das hier ein Forum für Profis oder dürfen hier auch Anfänger fragen stellen?

    Das soll heissen, dass man, bevor man eine Frage stellt, zuerst die FAQ und die Suchfunktion bemüht, um zu prüfen, ob das Thema vielleicht bereits behandelt wurde.
    Wenn es einen solchen Thread gibt, auch wenn er vielleicht keine fixfertige Lösung enthält oder zu 100% auf dein Problem passt, dann stellt man dort eine entsprechende Nachfrage.

    So wird verhindert, dass insbesondere Trivialthemen wie das in diesem Thread hier wieder und wieder durchgekaut werden müssen.


Log in to reply