Query1->SQL... geht nicht richtig



  • hi

    kann mir jemand ne alternative möglichkeit zu folgendem quellcode empfehlen???

    mecheditor->rsgewicht->Caption=mecheditor->RS->Position/16;
    mecheditor->Query1->SQL->Clear();
    mecheditor->Query1->SQL->Add("UPDATE `mechs` SET `RS` = :rswert WHERE `Name` = :mechname LIMIT 1");
    mecheditor->Query1->ParamByName("rswert")->Value = mecheditor->RS->Position;
    mecheditor->Query1->ParamByName("mechname")->Value = mecheditor->DBEdit1->Text;
    mecheditor->Query1->ExecSQL();
    mecheditor->Tmechs->Refresh();
    

    das problem ist das der den code zwar ausfürt aber nur bis ich nen anderen zugriff änder also wenn der dann zum 2. mal darauf zugreifen soll geht es nicht 😞 weis nicht wieso aber der fürt dann die zeilen fürs query einfach nicht mehr aus weis einer wieso hab ich nen fehler gemacht????

    gerne wäre mir auch nen lösungsweg ohne nen query also mit ner table oder so 😉

    danke schonmal!!



  • Query1->Close(); !?



  • ne klappt net dann bringt der nur noch mehr fehlermeldungen 😕
    brauch was was die parameter wieder refrecht oder so :/?? denk ich mal:(



  • wo hast du denn den Vorschlag von Jansen eingebaut?
    welche Fehlermeldungen kommen?



  • habs versucht direkt nach dem quellcode da oben ging aber net dann hab ichs versucht nochmal da einzubauen wo ich dann mit der dblookup...box was änder da reinzusetzen aber der efekt blieb der gleiche

    wenn ich in der datenbank einmal was mit der dblookup...box geändert hab gehts net mehr über den quellcode zu ändern und des obwohl die nicht den selben teil abändern sonder 2 verschiedene zeilen in der datenbank

    kan das daran liegen das ich alles in den cach ändern lass ne oder??? hab auch schon versucht nach dem wählen mit der bdl..box des erst in die datenbank zu übernehmen geht aber auch net 😕

    muss ich die datenbank erst von edit auf schreiben umstellen ??wenn ja wie??



  • black-lord-of-doom schrieb:

    habs versucht direkt nach dem quellcode da oben ging aber net dann hab ichs versucht nochmal da einzubauen wo ich dann mit der dblookup...box was änder da reinzusetzen aber der efekt blieb der gleiche

    normalerweise geht das eher so:
    [cpp]mecheditor->rsgewicht->Caption=mecheditor->RS->Position/16;
    mecheditor->Query1->Close();
    mecheditor->Query1->SQL->Clear();
    mecheditor->Query1->SQL->Add("UPDATE `mechs` SET `RS` = :rswert WHERE `Name` = :mechname LIMIT 1");
    mecheditor->Query1->ParamByName("rswert")->Value = mecheditor->RS->Position;
    mecheditor->Query1->ParamByName("mechname")->Value = mecheditor->DBEdit1->Text;
    mecheditor->Query1->ExecSQL();
    mecheditor->Tmechs->Refresh(); [/cpp]



  • muss ich des dann net auch irgendwei wieder öfnen ?

    habs versucht geht aber trotzdem nicht 😕 der ändert die werte nicht mehr ab:(
    der ignoriert den quelltext

    mecheditor->Query1->SQL->Add("UPDATE `mechs` SET `RS` = :rswert WHERE `Name` = :mechname LIMIT 1");
    mecheditor->Query1->ParamByName("rswert")->Value = mecheditor->RS->Position;
    mecheditor->Query1->ParamByName("mechname")->Value = mecheditor->DBEdit1->Text;
    mecheditor->Query1->ExecSQL();
    mecheditor->Tmechs->Refresh();
    

    und tut so als stände da immer noch der alte unaktuelle wert in rswert
    der liest einfach net den aktuellen ein dabei hat mecheditor->RS->Position den aktuellen:/



  • Hast Du an Query1 denn irgendwelche datensensitive Komponenten angebunden, ein TEdit o.ä.?
    Dann müsstest Du natürlich auch das ursprüngliche Statement nochmals ausführen oder am
    besten gleich eine andere TQuery-Instanz für Dein update-Statement verwenden.
    Gut wäre vielleicht einfach mal ein bisschen mehr Code zu posten, aus dem die Zusammenhänge
    etwas klarer werden.

    Gruß,

    Alexander



  • nein hab ich nicht also
    ich habe datenbank A die ich mit table über die dblookupcombobox mit datenbank B die auch mit table drin ist verbunden klappt auch alles soweit.
    datenbank A umfast lehrere spalten zum einen die über dei ich mit der datenbank B verbinde.
    zum anderen eine dessen wert(int) ich über eine TrackBar ändern will.
    hierzu verwende ich jenen quellcode

    void __fastcall Tmecheditor::TrackBarChange(TObject *Sender)
    {
    mecheditor->Query1->Close();
    mecheditor->Query1->SQL->Clear();
    mecheditor->Query1->SQL->Add("UPDATE `mechs` SET `RS` = :rswert WHERE `Name` = :mechname LIMIT 1");
    mecheditor->Query1->ParamByName("rswert")->Value = mecheditor->TrackBar->Position;
    mecheditor->Query1->ParamByName("mechname")->Value = mecheditor->DBEdit1->Text;
    mecheditor->Query1->ExecSQL();
    mecheditor->Tmechs->Refresh();
    }
    

    geht auch soweit super!

    nur nachdem ich die werte in dem mit datenbank B verknüpftem feld geändert hab aslo (z.b. die artikelnummer) des gekauften artikels kann ich dann die anzahl der artikel nicht merh mit der TrackBar ändern 😕 weil der den wert nicht mehr annimmt:/



  • black-lord-of-doom schrieb:

    nur nachdem ich die werte in dem mit datenbank B verknüpftem feld geändert hab aslo (z.b. die artikelnummer) des gekauften artikels kann ich dann die anzahl der artikel nicht merh mit der TrackBar ändern 😕 weil der den wert nicht mehr annimmt:/

    Ich kann nicht behaupten, dass ich Deinen Ausführungen folgen kann. Zumindest kann ich aber nicht sehen,
    an welcher Stelle Du die Daten neu einlesen lässt. Das passiert ja normalerweise nicht automatisch.
    Oder hast Du da irgendwas in der Refresh()-Methode stehen?

    Gruß,

    Alexander



  • am ende des quellcodes von der trackbar ist nen Refresh() drin und des andere ändert ja direkt also des mit der dblookupcombobox des ist ja auch garnet des problem des geht ja soweit eben nur der quelltext von der trackbar macht probleme das der net mehr geht wenn ich irgend was anderes geändert hatte:/

    ach so ja Tmechs ist die datenbank A



  • black-lord-of-doom schrieb:

    am ende des quellcodes von der trackbar ist nen Refresh() drin

    Das war mir nicht entgangen:

    Alexander Kempf schrieb:

    Oder hast Du da irgendwas in der Refresh()-Methode stehen?

    Da ich aber nicht erkennen kann, was dieses Refresh() macht, nehme ich mal an, dass es sich um das "ganz normale"
    Refresh() von TComponent (oder etwas derartigem) handelt. Und das wird wohl kaum ausreichen, um die Daten wieder
    zu aktualisieren.

    black-lord-of-doom schrieb:

    des ist ja auch garnet des problem

    Wenn Du das Problem schon kennst, dann kann ja die Lösung gar nicht so schwer sein 😉

    Wäre ganz schön, wenn Du ab und zu mal 'nen Punkt machen könntest (vielleicht sogar das ein oder andere
    Komma) - nur so, um die Lesbarkeit zu erhöhen - sonstkannmannbaldgarnichtsmehrerkennen. 😞

    Gruß,

    Alexander



  • ok werde mich bemühen.
    ne verwende die ganz normale standart Refresh()
    und bis auf den besagten quellcode hab ich auch keinen drin möchte des einfach erst mal zum laufen bringen.
    hab nochmal zum verdeutlichen nen bild gemacht;)

    http://www.8ung.at/black-lord-of-doom/erklaerung.JPG

    hoffe es wird nun klarer.



  • black-lord-of-doom schrieb:

    ok werde mich bemühen.

    Lobenswert.

    Also, ich versuche mal zusammenzufassen, was ich bisher glaube verstanden zu haben.
    Man wählt mit der Kombobox in der Mitte des Formulars irgendwas aus. Dann kann man mit
    der Trackbar den Wert RS (was immer das auch sein mag) ändern. Diese Änderungen werden
    im OnChange-Ereignis per SQL-UPDATE in die Datenbank geschrieben.

    Dein Problem scheint zu sein, dass der Wert von RS in dem oberen Grid nicht aktualisiert
    wird. Oder liege ich da falsch? Oder gibt es tatsächlich irgendwelche Fehlermeldungen -
    dazu hast Du Dich ja bisher leider ausgeschwiegen?

    Hast Du mal direkt in die Datenbank-Tabelle geschaut, ob der korrekte Wert auch tat-
    sächlich eingetragen wurde?

    Beim OnChange-Ereignis kann es doch auch sicherlich passieren, dass in recht kurzer
    Zeit eine ganze Menge Statements an die Datenbank geschickt werden. Könnte es da
    vielleicht Probleme geben? Dann könnte eine verzögerte Aktualisierung das Problem
    u.U. etwas lindern.

    Nebenbei: Das, was Du als Datenbank bezeichnest, würde ich eher als Tabelle bezeichnen.
    Oder hast Du tatsächlich zwei Datenbanken?

    Gruß,

    Alexander



  • ja ok. hast recht. handelt sich da um tabellen;)

    zu meinenn fehlern:
    also wenn ich mit der trackbar den wert änder geht das problemlos.
    auser! wenn ich zuvor die kombobox verwendet hab.
    wieso auch immer???

    und ja wegen der erheblichen datenmenden lass ich alles erstmal in den cach laden. also mit dem chachedupdate=true und so.

    ja der ändert es in der datenbank selbst auch ab also wenn ich über sqladmin gug.

    aber auch nur wenn ich zuvor net die combobox benutz hatte.

    Fehlermeldungen an sich gibt es nicht er ändert die werte eben nur nicht mehr ab.



  • black-lord-of-doom schrieb:

    also wenn ich mit der trackbar den wert änder geht das problemlos.
    auser! wenn ich zuvor die kombobox verwendet hab.
    wieso auch immer???

    Hast Du irgendwas für irgendein Ereignis der Combobox definiert?

    black-lord-of-doom schrieb:

    und ja wegen der erheblichen datenmenden lass ich alles erstmal in den cach laden. also mit dem chachedupdate=true und so.

    Klingt für mich wie "planloses Rumprobieren". Lass doch mal alle "Optimierungen" weg und schau, ob es dann
    funktioniert. Danach kannst Du immer noch versuchen zu optimieren - wenn nötig.

    black-lord-of-doom schrieb:

    Fehlermeldungen an sich gibt es nicht er ändert die werte eben nur nicht mehr ab.

    Aha.

    Leider habe ich noch nie CachedUpdates verwendet, aber der BCB-Hilfe nach zu urteilen, wird damit ja die Aktualisierung
    verzögert, was ja durchaus Probleme wie von Dir geschildert verursachen könnte.

    Gruß,

    Alexander



  • nein in meiner combobox ist nix an quelltext drin und verstellt hatte ich auch nur das was man zu verknüpfung der felder brauch.

    wenn ich des ohne cach mache bringt der ne meldung raus der akuelle datensatz kann noch nicht freigegeben werden da er noch von einem anderen benutzer benutzt wird oder sowas:/



  • also hab noch bischen rumprobiert und denk ich habs nun raus

    Tmechs->Edit();
    Tmechs->FieldByName("RS")->Value = mecheditor->RS->Position;
    Tmechs->Post();
    

    ist nun zwar ohne sqlanweisung aber es geht;)
    trotzdem danke für die hilfe 👍



  • black-lord-of-doom schrieb:

    wenn ich des ohne cach mache bringt der ne meldung raus der akuelle datensatz kann noch nicht freigegeben werden da er noch von einem anderen benutzer benutzt wird oder sowas:/

    Schon beim ersten Aktualisierungsversuch? Vielleicht hast Du vergessen, die Transaktion zu beenden?

    Gruß,

    Alexander



  • m 😕 wie beende ich die denn eigenlich. nur schonmal für zukünftige probleme;)



  • Also TDatabase hat die Methode Commit(), die das machen sollte.
    Oft wird das Commit aber auch automatisch ausgeführt.

    Gruß,

    Alexander


Anmelden zum Antworten