Suchfunktion in C++Prog mit MySQL



  • 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.


Anmelden zum Antworten