Probleme mit einer SQL Abfrage



  • Hallo,

    ich habe eine Datenbankanwendung (Access) mit dem Borland Builer 6 geschrieben und stehe nun vor einem Problem. Ich habe folgende Zeilen zu der SQL Anweisung geschrieben

    if (CheckBox1->Checked==true){
    AnsiString x=DBEdit15->Text;
    Query2->Close();
    Query2->SQL->Clear();
    Query2->SQL->Add("SELECT Provisionr,Abschlußprovision,Inkassoprovision,Summe_Provision FROM Kunden");
    Query2->SQL->Add("WHERE Name_Vermittler='"+x+"'");
    Query2->SQL->Add("SET Provisionr='0'");
    Query2->Open();
    }

    Ich möchte, wenn ich auf diese CheckBox1 klicke, dass die Werte Provision,Abschlußprovision,Inkassoprovision und Summe_Provision für die jeweiligen Datensätze die dem Vermittler betreffen auf 0 gesetzt werden.
    Leider bekomme ich immer wieder bei der Anweisung "SET Provisionr='0'" die Fehlermeldung fehlender Operator, wenn ich diese Anweisung anders formuliere werden die Werte nicht auf 0 gesetzt.
    Was mach ich dabei falsch???

    Gruß
    Dieter



  • Hallo,

    ich kenne mich mit der Syntax von Access und dem Borland Builder nicht aus, aber es macht den anschein, dass Du ein Update Statement benötigst :

    UPDATE Kunden SET Provisionr = '0', Abschlußprovision = '0', Inkassoprovision = '0', Summe_Provision = '0' WHERE Name_Vermittler = 'wasauchimmer'
    

    Gruß SciFi



  • Danke für deine Hilfe,

    ich denke jetzt wird es funktionieren.

    Gruß

    Dieter



  • Hat leider doch nicht funktioniert, nun bekomme ich die Fehlermeldung "Fehler beim Erstellen des Curser-Handle"

    Gruß

    Dieter



  • Wie gesagt, ich kenne mich damit leider nicht aus. Aufgrund der Fehlermeldung würde ich vermuten, dass das Query eine Rückgabe ala SELECT erwartet. Hast Du eine Möglichkeit eine Abfrage ohne Rückgabe zu senden ?



  • Leider nicht. Gibt es denn eien Möglichkeit die Datensätz über
    Table1->FindKey(ARRAYOFCONST((DBEdit15->Text))) zu suchen, dann die Werte zu ändern und zum nächsten Datensatz zu springen der dem DBEdit15->Text Wert enthält???

    Wäre dir dankbar, wenn du mir diesbezüglich Antworten könntest.
    Ich denke mal, das dies über eien For Schleife zu realisieren ist der die Werte des DBEdit15->Text abfragt und automatisch zu dem passenden Datensatz springt und die Werte ändert.
    Leider weiß ich nicht wie ich das machen kann.

    Gruß
    Dieter



  • Leider sind diese (DBEdit15->Text) etc. Böhmische Dörfer für mich, aber vielleicht hat ja noch jemand eine Idee 🙂

    Gruß SciFi



  • Jedenfalls danke für deine Hilfe.

    Gruß
    Dieter



  • die Suchfunktion könnte dir weiterhelfen, z.B. hiermit



  • Danke nun hat es geklappt. Aber merkwürdiger weise, hatte ich dieses Problem auch wenn ich DELETE Kunden statt UPDATE Kunden eingebe. Das was daran merkwürdig ist, ich hatte diese Funktion gestern getestet und bekam die gleiche Fehlermeldung. Dannach hatte ich den Computer ausgeschaltet und heute morgen waren die Datensätze glöscht. Es hatte also doch funktioniert trzotz Fehlermeldung.

    Gruß

    Dieter

    Und vielen dank für Eure Hilfe 😋



  • Moin,

    ich vermute, dass die Klasse Query eine Rückgabe erwartet. Du kannst zwar DELETE und UPDATES über die Query senden, aber diese Anweisungen geben keine Daten zurück wie ein SELECT. Die Anweisung wird zwar ausgeführt, aber das Objekt Query meldet einen Fehler. ( Cursor Handle).
    Meistens stehen Funktionen zur Verfügung, um eine Anfrage ohne Rückdaten zu senden.

    Gruß SciFi



  • Danke für die Info.
    Ich bin gestern echt an diesem Problem verzweifelt, da auch in der Hilfe immer wieder erscheint man solle das Query möglichst nicht mit Query->ExecSQL() öffnen. Aber nu ist es ja erledigt und fürs nächste mal weiß ich nu Bescheid.

    Gruß
    Dieter 😋



  • Mit der Methode ExecSQL können Sie die SQL-Anweisung der Abfrage ausführen.

    Zitat aus der BCB-Hilfe zu TQuery::ExecSQL():

    Mit ExecSQL können Sie die Anweisung ausführen, die aktuell in der Eigenschaft SQL enthalten ist. Mit ExecSQL können Sie Anweisungen ausführen, die keinen Cursor auf Daten (wie z.B. INSERT, UPDATE, DELETE oder CREATE TABLE) zurückgeben.

    Hinweis

    Für die SELECT-Anweisung verwenden Sie statt ExecSQL die Methode Open.

    Da steht doch ganz klar, welche Funktion für was zu verwenden ist?!?


Log in to reply