Nächstes Problem Datensatz kann nicht geändert werden (VCL/SQL/ACCESS)



  • Hi

    sorry das ich schon wieder schreibe aber habe direkt den nächsten fehler gefunden und hoffe auf hilfe:

    Wenn ich nen datensatz ändern will macht er es nicht und der "fehler" kommt bei dem teil mit den monaten:

    vieleicht weiss einer was dazu

    Tausend dank

    Ps: habe mir extra 2 showmessages eingefügt und er gibt den richtigen wert aus nur füllt er es sozusagen nicht ein und ändert deshalb den datensatz nicht.

    in der db stehen nur zahlen von 0 bis 12 wobei 0 für leer also "-" steht und 1-12 für januar bis februar was aber beim auslesen im c++ programm dann so ausgegeben wird in der db steht nur 1-12

    void __fastcall Tfrmbaumschule::btnaendernClick(TObject *Sender)
    {
    String message;
    String del;
    AnsiString sqleingabe2;
    AnsiString temp;
    char textmessage[1000];
    
    String dname;
    String lname;
    String text;
    String matchcode;
    String art;
    String bluehvon;
    String bluehbis;
    String id;
    
    String zertifizierung;
    
    double nix;
    
    id = edtid->Text;
    dname = edtdname->Text;
    lname = edtlname->Text;
    text = edttext->Text;
    matchcode = edtmatchcode->Text;
    art = edtpflanzenart->Text;
    bluehvon = edtbluehvon->Text;
    bluehbis = edtbluehbis->Text;
    
    nix = 0;
    
    	if  ((bluehvon == "leer")
    		||
    		(bluehvon == "0"))
    		{
    		bluehvon = "0";
    		}
    
    	if  ((bluehvon == "Januar")
    		||
    		(bluehvon == "januar")
    		||
    		(bluehvon == "1"))
    		{
    		bluehvon = "1";
    		}
    
    	if  ((bluehvon == "Februar")
    		||
    		(bluehvon == "februar")
    		||
    		(bluehvon == "2"))
    		{
    		bluehvon = "2";
    		}
    
    	if  ((bluehvon == "März")
    		||
    		(bluehvon == "Maerz")
    		||
    		(bluehvon == "maerz")
    		||
    		(bluehvon == "märz")
    		||
    		(bluehvon == "3"))
    		{
    		bluehvon = "3";
    		}
    
    	if  ((bluehvon == "April")
    		||
    		(bluehvon == "april")
    		||
    		(bluehvon == "4"))
    		{
    		bluehvon = "4";
    		}
    
    	if  ((bluehvon == "Mai")
    		||
    		(bluehvon == "mai")
    		||
    		(bluehvon == "5"))
    		{
    		bluehvon = "5";
    		}
    
    	if  ((bluehvon == "Juni")
    		||
    		(bluehvon == "juni")
    		||
    		(bluehvon == "6"))
    		{
    		bluehvon = "6";
    		}
    
    	if  ((bluehvon == "Juli")
    		||
    		(bluehvon == "juli")
    		||
    		(bluehvon == "7"))
    		{
    		bluehvon = "7";
    		}
    
    	if  ((bluehvon == "August")
    		||
    		(bluehvon == "august")
    		||
    		(bluehvon == "8"))
    		{
    		bluehvon = "8";
    		}
    
    	if  ((bluehvon == "September")
    		||
    		(bluehvon == "september")
    		||
    		(bluehvon == "9"))
    		{
    		bluehvon = "9";
    		}
    
    	if  ((bluehvon == "Oktober")
    		||
    		(bluehvon == "oktober")
    		||
    		(bluehvon == "10"))
    		{
    		bluehvon = "10";
    		}
    
    	if  ((bluehvon == "November")
    		||
    		(bluehvon == "november")
    		||
    		(bluehvon == "11"))
    		{
    		bluehvon = "11";
    		}
    
    	if  ((bluehvon == "Dezember")
    		||
    		(bluehvon == "dezember")
    		||
    		(bluehvon == "12"))
    		{
    		bluehvon = "12";
    		}
    
    	if  ((bluehbis == "leer")
    		||
    		(bluehbis == "0"))
    		{
    		bluehbis = "0";
    		}
    
    	if  ((bluehbis == "Januar")
    		||
    		(bluehbis == "januar")
    		||
    		(bluehbis == "1"))
    		{
    		bluehbis = "1";
    		}
    
    	if  ((bluehbis == "Februar")
    		||
    		(bluehbis == "februar")
    		||
    		(bluehbis == "2"))
    		{
    		bluehbis = "2";
    		}
    
    	if  ((bluehbis == "März")
    		||
    		(bluehbis == "Maerz")
    		||
    		(bluehbis == "maerz")
    		||
    		(bluehbis == "märz")
    		||
    		(bluehbis == "3"))
    		{
    		bluehbis = "3";
    		}
    
    	if  ((bluehbis == "April")
    		||
    		(bluehbis == "april")
    		||
    		(bluehbis == "4"))
    		{
    		bluehbis = "4";
    		}
    
    	if  ((bluehbis == "Mai")
    		||
    		(bluehbis == "mai")
    		||
    		(bluehbis == "5"))
    		{
    		bluehbis = "5";
    		}
    
    	if  ((bluehbis == "Juni")
    		||
    		(bluehbis == "juni")
    		||
    		(bluehbis == "6"))
    		{
    		bluehbis = "6";
    		}
    
    	if  ((bluehbis == "Juli")
    		||
    		(bluehbis == "juli")
    		||
    		(bluehbis == "7"))
    		{
    		bluehbis = "7";
    		}
    
    	if  ((bluehbis == "August")
    		||
    		(bluehbis == "august")
    		||
    		(bluehbis == "8"))
    		{
    		bluehbis = "8";
    		}
    
    	if  ((bluehbis == "September")
    		||
    		(bluehbis == "september")
    		||
    		(bluehbis == "9"))
    		{
    		bluehbis = "9";
    		}
    
    	if  ((bluehbis == "Oktober")
    		||
    		(bluehbis == "oktober")
    		||
    		(bluehbis == "10"))
    		{
    		bluehbis = "10";
    		}
    
    	if  ((bluehbis == "November")
    		||
    		(bluehbis == "november")
    		||
    		(bluehbis == "11"))
    		{
    		bluehbis = "11";
    		}
    
    	if  ((bluehbis == "Dezember")
    		||
    		(bluehbis == "dezember")
    		||
    		(bluehbis == "12"))
    		{
    		bluehbis = "12";
    		}
    
    if ((bluehvon != "0")
    	||
    	(bluehvon != "1")
    	||
    	(bluehvon != "2")
    	||
    	(bluehvon != "3")
    	||
    	(bluehvon != "4")
    	||
    	(bluehvon != "5")
    	||
    	(bluehvon != "6")
    	||
    	(bluehvon != "7")
    	||
    	(bluehvon != "8")
    	||
    	(bluehvon != "9")
    	||
    	(bluehvon != "10")
    	||
    	(bluehvon != "11")
    	||
    	(bluehvon != "12")
    	||
    	(bluehbis != "0")
    	||
    	(bluehbis != "1")
    	||
    	(bluehbis != "2")
    	||
    	(bluehbis != "3")
    	||
    	(bluehbis != "4")
    	||
    	(bluehbis != "5")
    	||
    	(bluehbis != "6")
    	||
    	(bluehbis != "7")
    	||
    	(bluehbis != "8")
    	||
    	(bluehbis != "9")
    	||
    	(bluehbis != "10")
    	||
    	(bluehbis != "11")
    	||
    	(bluehbis != "12"))
    	{
    	ShowMessage ("Bitte nur Monate wie z.B. Januar, januar oder 1 angeben. Bei wert 0 oder leer wird kein Monat gesetzt");
    	nix = 1;
    	}
    
    ShowMessage (bluehvon);
    ShowMessage (bluehbis);
    
    temp = Query2->SQL->Text;
    
    if (rbja->Checked)
    	{
    	zertifizierung = "1";
    	}
    
    if (rbnein->Checked)
    	{
    	zertifizierung = "0";
    	}
    
    message = "Soll der Datensatz in " + lname + ", " + dname + " geändert werden?";
    
    StrCopy(textmessage, message.c_str());
    
    if (nix == 0)
    	{
    
    if 	(Application->MessageBox(textmessage, "Änderung bestätigen", MB_YESNO)==IDYES)
    	{
    	del = edtid->Text;
    
    	sqleingabe2 = "UPDATE Pflanzen set Pflanzen.LateinischerName='" + lname + "' where Pflanzen.ID = " + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Pflanzen set DeutscherName ='" + dname + "' where ID = " + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Pflanzen set Text ='" + text + "' where ID = " + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Pflanzenart set Pflanzenart ='" + art + "' where ID_Pflanzenart = " + id +";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Matchcode set Matchcode ='" + matchcode + "' where ID_Matchcode = " + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Bluehzeit set Bluehvon =" + bluehvon + " where ID_Bluehzeit = " + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Bluehzeit set Bluehbis =" + bluehbis + " where ID_Bluehzeit = " + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	sqleingabe2 = "UPDATE Zertifizierung set Zertifizierung =" + zertifizierung + " where ID_Zertifizierung =" + id + ";";
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(sqleingabe2);
    	Query2->ExecSQL();
    
    	Query2->Close();
    	Query2->SQL->Clear();
    	Query2->SQL->Add(temp);
    	Query2->Active=true;
    
    	ShowMessage ("Datensatz wurde geändert");
    	}
    
    	else
    		{
    		ShowMessage("Datensatz wurde nicht in " + dname + ", " + lname + " geändert");
    		}
       }
    }
    //---------------------------------------------------------------------------
    

    danke 🤡



  • Will dir ja nicht zu nahe treten, aber das ist doch alles einfach nur hässlich ><
    Mir ist es auch zu viel Arbeit deine 400Zeilen Code jz anzugucken (zu korrigieren) und den Fehler zu finden...

    Aber bau dir doch einfach mal ein paar kleine Funktionen, die Arbeit für dich machen - wenn du genug Funktionalität ausgelagert hast, dann wirst du vrmtl auch selbst wieder durchsehen...
    Mal ein Bsp.:

    if  ((bluehvon == "Januar")
            ||
            (bluehvon == "januar")
            ||
            (bluehvon == "1"))
            {
            bluehvon = "1";
            }
    

    du musst nicht noch auf "1" prüfen um es dann wieder auf "1" zu setzen...
    ==>

    if  ((bluehvon == "Januar") || (bluehvon == "januar"))
    {
       bluehvon = "1";
    }
    

    ==>

    if (lowercase(bluehevon) == "januar")
    {
       bluehevon = "1";
    }
    
    String lowercase (String val)
    {
       for (int i = 0; i != val.length(); ++i)
       {
          val[i] &= 0x11011111;
       }
       return val;
    }
    

    evtl solltest du dir auch mal überlegen, ob du die Eingabe nicht über ne ComboBox oder so realisieren möchtest - dann hättest du die ganzen Probleme nicht und könntest einfach mit dem Index arbeiten... Das würde allerdings auch mit standard C++ - Mitteln gehen:

    std::vector <std::string> monate(12);
    monate[0] = "januar";
    monate[1] = "februar";
    monate[2] = "maerz";
    monate[3] = "apirl";
    //...
    
    int GetMonthNumber(std::string name)
    {
       name = lowercase(name);
       const size_t R = monate.find(name);
       if (R == std::vector <std::string>::npos)
          throw "invalid input";
       return reinterpret_cast <int> (R);
    }
    
    void deine_komische_fkt()
    {
       try
       {
         int von = GetMonthNumber(bluhevon);
         int bis = GetMonthNumber(bluhebis);
       }
       catch(/*hier typ einsetzen - im moment wäre das wohl char* */)
       {
         MessageBox("Ungueltige Eingabe");
         return;
       }
    
       ; //usw
    
       std::stringstream str;
       str << "query_teil" << von << "query_teil" << bis << "query_teil;
    
       Query2->Add(str.str());
    }
    

    Ich hoffe, du hast es ein wenig verstanden, wie ich das meinte - wenn nicht, dann frag halt noch mal nach...

    bb



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • unskilled schrieb:

    Will dir ja nicht zu nahe treten, aber das ist doch alles einfach nur hässlich ><

    Dem stimme ich zu, auch wenn deine Lösung auch nicht optimal ist... Nahezu jede Stringklasse die ich kenne hat eine eigene Möglichkeit der Umwandlung in kleine/große Zeichen, zumal deine Umwandlung... nun ja, recht Abhängig vom Datentyp ist.

    Ich habe gerade nicht die Hilfe zur hand, aber ich glaube LowerCase(String) wäre unter der VCL richtig.

    if(LowerCase(bluehevon) == "januar")
       bluehevon = "1";
    

    cu André



  • Hi,

    du kannst mindestens 80% deines Codes eindampfen!

    Wenn ich das richtig verstehe, soll der Programmbenutzer jedesmal beim anlegen
    eines neuen Datensatzes den Monatsnamen und die Monatszahl eintippen !?!

    Nimm keine TEdits sondern Comboboxen, hier ist die Monatszahl dann auch gleich
    der ItemIndex.

    mfg
    Peter



  • Hi also danke schonmal und sorry für den langen cpp code

    hatte es im strg-c und vergessen nicht jeden einzelnen monat einzufügen.

    das problem ist wir machen das in der technikerschule (ist unser erstes projekt) und die lehrer sind nicht in der lage uns mal tipps zu geben da sie selber keine ahnung haben ausser von ihren beispiel aufgaben.

    haben uns so ziemlich alles selbst beigebracht und aus dem i-net und büchern angelesen deshalb ist der code auch nicht sehr ausgefeilt.

    ich hänge mal ein bild der eingabeoberfläche an dann wirds evtl verständlicher.

    und sorry aber muss nochmal nachhaken ist wirklich noch nicht ganz durchgedrungen bzw habs noch nicht ganz gecheckt

    Danke aber schonmal für eure hilfe und sry für den post im falschen forum :p

    also
    [url] http://img84.imageshack.us/my.php?image=oberflfy4.jpg [/url]

    wegen dem nochmals prüfen dabei geht es darum das evtl der user auch zb 1 für januar eintragen kann als monatszahl deshalb steht das nochmal drin

    danke schonmal



  • Hi,

    wie gesagt, ersetze die Edits unten rechts durch je eine ComboBox.
    Dabei legst du erst eine auf das Formular, trägst im Objektinspektor in
    der Eigenschaft Items die Monate ein.
    Diese Combobox kopierst du einfach und setzt die Kopie als 2. ComboBox.

    in die *.h-Datei:

    //unter private:
       String bluehvon;
       String bluehbis;
       int    mBegin;
       int    mEnde;
    

    Jetzt schreibst du in die Ereignisbehandlung der ComboBoxen:
    in die *.cpp-Datei:

    void __fastcall TForm1::ComboBox1Change(TObject *Sender)
    {
       bluehvon = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
       mBegin   = IntToStr(ComboBox1->ItemIndex + 1);
    }
    
    void __fastcall TForm1::ComboBox2Change(TObject *Sender)
    {
       bluehbis = ComboBox2->Items->Strings[ComboBox2->ItemIndex];
       mEnde    = IntToStr(ComboBox2->ItemIndex + 1);
    }
    

    Mir ist weiter aufgefallen, dass, egal ob bei dir der Monat klein oder gross
    eingegeben wird, am Ende immer die Monatszahl übergeben wird. Was soll das?

    mfg
    Peter



  • hi danke erst mal für die verbesserungsvorschläge habe jetzt auch die ganze sache ein bischen besser verstanden.

    Leider habe ich immer noch den fehler das er mir sagt das in den feldern bluehvon und bluehbis kein richtiger wert drin steht bekomme immer den fehler das die msgbox zeigt das ich nur zahlen, leer oder den monat eingeben darf.

    in der msgbox die mir sagt was drin steht (nur ne hilfestellung für mich) zeigt er mir aber jeweils an das die zahl richtig erkannt wurde die er in die db schreiben soll z.b. wenn ich januar reinschreibe sagt mir die msgbox das 1 drinsteht er schreibt es aber nich in die db.

    kann es sein das es am sql query liegt?

    danke an alle helfer mfg 😉



  • Welche Fehler treten denn beim Schreiben in die DB auf?
    Ist die Verbindung zur Datenbank auch hergestellt?

    [Edit] Noch ein kleiner Tipp: Kommasetzung vereinfacht das Lesen und Verstehen eines Textes erheblich 😉



  • Sorry wollte vorhin noch schnell antworten musste aber weg.

    verbindung ist da, datensatz löschen z.b. geht ja.

    2 dinge die nicht funktionieren:

    1. Datensatz ändern
    2. Datensatz hinzufügen

    zu 1-> wenn im TDBGrid ein datensatz angeklickt wird werden die edtfelder ausgefüllt, wobei das feld id nicht geändert werden kann (schreibgeschützt).
    wenn der datensatz nun angepasst wird in den edt feldern und ich auf ändern klicke ändert er nichts in der db. Dann bricht er mit der vorgegebenen meldung ab, das in den feldern bluehvon und bluehbis nur zahlen 1-12 oder monate drinstehen dürfen und ändert den datensatz nicht.(auch wenn in den feldern das richtige drin steht)

    zu 2-> wenn ich datensatz hinzufügen will dann soll er zum letzten datensatz springen und dann dahinter einen neuen einfügen.
    er zeigt auch an das er einen eingefügt hätte (zeigt als hilfe in einer msgbox auch die id an) tut er aber nicht.
    der nächste datensatz wäre 20100 das zeigt er auch an, er macht aber nix.
    wenn ich dann den nächsten einfügen will will er wieder mit id 20100 einfügen.

    mfg mad_devil ^^



  • kommentiere mal Zeilen 410 bis 412 aus ...


Anmelden zum Antworten