hocu da izbrisem red u bazi na osnovi podatka po koloni...kada koristim nesto ovako DELETE FROM Tabela WHERE Kolona1=1 AND Kolona2=1 radi OK znaci izbrise samo jedan red...al kad koristim DELETE FROM Tabela WHERE Kolona1 LIKE '%" + Edit->Text + "%' AND Kolona2 LIKE '%" + Edit1->Text + "%'"; da kazemo u edit se zapisuje vredost kolone1 po kliku u edit1 se zapisuje vrednost po kolone2 po kliku....ako u gridu imam 6 reda i selektiram prvi red i izbrisem ok je...ali ako selektiram zadnji red i izbrisem ode sve...Ucemu je problem tu?
delete (sql) brise sve redove
Zaključano
Zakačeno
To je specifičan slučaj kada sql upit moraš sastavljati upotrebom QuotedStr funkcije.
http://www.delphipages.com/forum/showthread.php?t=143249
http://www.delphipages.com/forum/showthread.php?t=143249
ako ti nije tesko aj sastavi ga ovo sa tom funkciom.....
AnsiString Upit= "DELETE FROM Tabela WHERE Kolona1 LIKE '%" + Edit->Text + "%' AND Kolona2 LIKE '%" + Edit1->Text + "%'";
probao sam ama ne mi ide...javlja mi gresku t.e puca sql...ako nije problem...Hvala ti...
AnsiString Upit= "DELETE FROM Tabela WHERE Kolona1 LIKE '%" + Edit->Text + "%' AND Kolona2 LIKE '%" + Edit1->Text + "%'";
probao sam ama ne mi ide...javlja mi gresku t.e puca sql...ako nije problem...Hvala ti...
Imas neku gresku u kodu a ne u upitu.
Napravi neki test primer, sa Edit-om u kome mozes da menjas delove upita.
Da li koristis?
ADOQuery1->ExecSQL();
... umesto:
ADOQuery1->Open();
Napravi neki test primer, sa Edit-om u kome mozes da menjas delove upita.
Da li koristis?
ADOQuery1->ExecSQL();
... umesto:
ADOQuery1->Open();
izmenjeno 1 put, poslednji put milan_sr 24.10.2010. u 18:39
Izmene poruke
- milan_sr24.10.2010. u 18:39zapis iz teksta poruke
evo koda
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit= "DELETE FROM Tabela WHERE Kolona1 LIKE '%" + Edit->Text + "%' AND Kolona2 LIKE '%" + Edit1->Text + "%'";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->ExecSQL();
kako sta je reko itf probao sam da koristim QuotedStr funkciju, kao sto sam primetio ona dodaje ' na pocetku i nakraju od stringa...nikako ne mogu uklopiti funkciju u upit...svaki put upit "pukne"...upit kao sta je gore napisan brise mi celu tabelu...kada brises redom odozgo pa nadole ured je brise...ali ako probas da izbrises neki drugi red onda izbrise celu tabelu(bar kod mene tako funkcionise). Hvala
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit= "DELETE FROM Tabela WHERE Kolona1 LIKE '%" + Edit->Text + "%' AND Kolona2 LIKE '%" + Edit1->Text + "%'";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->ExecSQL();
kako sta je reko itf probao sam da koristim QuotedStr funkciju, kao sto sam primetio ona dodaje ' na pocetku i nakraju od stringa...nikako ne mogu uklopiti funkciju u upit...svaki put upit "pukne"...upit kao sta je gore napisan brise mi celu tabelu...kada brises redom odozgo pa nadole ured je brise...ali ako probas da izbrises neki drugi red onda izbrise celu tabelu(bar kod mene tako funkcionise). Hvala
Evo jedan primer, pa vidi kako kod mene radi.
Moraces da ponovo napravis ConnectionString i za TADOTable i za TADOQuery, jer je kod mene apsolutna putanja.
Inace, potrebno je neko vreme (sekund, dva) da bi se podaci reflektovali na DBGrid, pa mozes kod doraditi sa nekim Close/Open nad TADOTable...
Moraces da ponovo napravis ConnectionString i za TADOTable i za TADOQuery, jer je kod mene apsolutna putanja.
Inace, potrebno je neko vreme (sekund, dva) da bi se podaci reflektovali na DBGrid, pa mozes kod doraditi sa nekim Close/Open nad TADOTable...
i kod mene radi tako kada nemam relacie u bazi...al kad ima eve kako radi...evo primer http://0.mk/test2 ako nije problem pogledaj...
Ne mogu da pruzmem fajl, mada trenutno i nemam puno vremena.
Ako su relacije problem, da nisi mozda u\kod integriteta baze definisao da se kaskadno brise?
U svakom slucaju, ne treba ti SQL upit za operaciju koju zelis
1. DisableControls
2. Napravis klasicu petlju koja ide do EOF i brises stavku po stavku sve sto je pod uslovom koji zelis
3. EnableControls
Ako su relacije problem, da nisi mozda u\kod integriteta baze definisao da se kaskadno brise?
U svakom slucaju, ne treba ti SQL upit za operaciju koju zelis
1. DisableControls
2. Napravis klasicu petlju koja ide do EOF i brises stavku po stavku sve sto je pod uslovom koji zelis
3. EnableControls
Ovo je tvoj kod koji ne radi:
UVEK u fazi testiranja, pre izvrsenja upita stavi neki ShowMessage(), koji ce ti pokazati kako glasi upit i eventualno gde je greska.
Dakle, umesto:
... stavi:
Videces da uvek dobijas PRAZAN DBEdit1->Text.
... sto znaci da se SVE uzima u obzir, a ne ono sto ocekujes.
DBEdit->Text je prazan jer PRVO zatvaras upit (ADOQuery1->Close();) a zatim pokusavas da pristupis elementu tog zatvorenog upita (DBEdit1->Text).
Dakle, pre zatvaranja treba da ZAPAMTIS sta da prosledis u upit:
Code:
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit = "DELETE FROM Relacija WHERE IDT1 in (SELECT IDTabela1 from Tabela1 WHERE IDTabela1 LIKE '%"+DBEdit1->Text+"%') AND IDT2 in (select IDTabela2 from Tabela2 WHERE IDTabela2 LIKE '%" + Edit2->Text+ "%')";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->ExecSQL();
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit = "DELETE FROM Relacija WHERE IDT1 in (SELECT IDTabela1 from Tabela1 WHERE IDTabela1 LIKE '%"+DBEdit1->Text+"%') AND IDT2 in (select IDTabela2 from Tabela2 WHERE IDTabela2 LIKE '%" + Edit2->Text+ "%')";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->ExecSQL();
UVEK u fazi testiranja, pre izvrsenja upita stavi neki ShowMessage(), koji ce ti pokazati kako glasi upit i eventualno gde je greska.
Dakle, umesto:
Code:
ADOQuery1->ExecSQL();
ADOQuery1->ExecSQL();
... stavi:
Code:
// ADOQuery1->ExecSQL(); // komentar, ne izvrsava se
ShowMessage( Upit );
// ADOQuery1->ExecSQL(); // komentar, ne izvrsava se
ShowMessage( Upit );
Videces da uvek dobijas PRAZAN DBEdit1->Text.
Code:
... IDTabela1 LIKE '%%' ...
... IDTabela1 LIKE '%%' ...
... sto znaci da se SVE uzima u obzir, a ne ono sto ocekujes.
DBEdit->Text je prazan jer PRVO zatvaras upit (ADOQuery1->Close();) a zatim pokusavas da pristupis elementu tog zatvorenog upita (DBEdit1->Text).
Dakle, pre zatvaranja treba da ZAPAMTIS sta da prosledis u upit:
Code:
AnsiString STA_BRISEM = DBEdit1->Text;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit = "DELETE FROM Relacija WHERE IDT1 in (SELECT IDTabela1 from Tabela1 WHERE IDTabela1 LIKE '%"+STA_BRISEM+"%') AND IDT2 in (select IDTabela2 from Tabela2 WHERE IDTabela2 LIKE '%" + Edit2->Text+ "%')";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->ExecSQL();
AnsiString STA_BRISEM = DBEdit1->Text;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString Upit = "DELETE FROM Relacija WHERE IDT1 in (SELECT IDTabela1 from Tabela1 WHERE IDTabela1 LIKE '%"+STA_BRISEM+"%') AND IDT2 in (select IDTabela2 from Tabela2 WHERE IDTabela2 LIKE '%" + Edit2->Text+ "%')";
ADOQuery1->SQL->Add( Upit );
ADOQuery1->ExecSQL();
Milane, u ovoj poruci:
http://www.elitesecurity.org/p2723775
...NISI dao kod koji proizvodi problem. Da si dao PRAVI kod, problem bi bio resen odmah.
Inace, i taj LIKE ti je opasan u upitu, jer ce obrisati sve sto SADRZI U SEBI trazeni broj, a to sigurno ne zelis.
http://www.elitesecurity.org/p2723775
...NISI dao kod koji proizvodi problem. Da si dao PRAVI kod, problem bi bio resen odmah.
Inace, i taj LIKE ti je opasan u upitu, jer ce obrisati sve sto SADRZI U SEBI trazeni broj, a to sigurno ne zelis.
Hteo sam da ne "kopliciram" upit, a i sa tim upitom daje iste rezultate...Naviko sam od dev c++ da koristim watch i tu sam probao i mislim da dbedit je imao vredost koju zelim ili sam nes drugo video...hvala ti mnogo za pomoc
Kada uploadujes test projekat, prethodno obrisi: *.tds *.obj *.~* fajlove, jer nisu potrebni. Recimo *.tds fajl cini cesto oko 90% velicine samog projekta. Tada ces moci da uploadujes projekat i na ES.