|
[ Miloš Baić @ 17.03.2006. 11:36 ] @
| Napravio sam tabelu koja sadrzi ID, Prezime, Ime. Na formi sam postavio ADOQuery i DBGrid, to je forma za filtriranje lica čiji se rezultat prikazuje u DBGrid-u. Napravio sam još jednu novu formu na kojoj ce se vršiti UNOS-IZMENE podataka na osnovu dinamickih edita. Ta forma se poziva sa forme za pretragu na osnovu klika na dugme 'Unos Osoba', kod za to dugme je:
Code:
...
public
{ Public declarations }
FilterList:TStringList;
...
var
i:Integer;
begin
UnOsoba:=TUnOsoba.Create(Self);
for i:=0 to ADOOsoba.FieldCount-1 do
UnosOsoba.FilterList:=TStringList.Create();
UnosOsoba.FilterList.Add('ID');
UnosOsoba.FilterList.Add('JMBG');
UnosOsoba.FilterList.Add('IME');
UnosOsoba.FilterList.Add('PREZIME');
Posle ovoga na formi 'Unos Osoba' imamo "OnActivate" :
Code:
...
public
{ Public declarations }
FilterList:TStringList;
...
var i:integer;
begin
for i:=0 to FilterList.Count-1 do begin
eFieldsList[i]:=TEdit.Create(pTopSifr);
lFieldsList[i]:=TLabel.Create(pTopSifr);
eFieldsList[i].Top:=(i div 4)*87 + 19;
lFieldsList[i].Top:=(i div 4)*88 + 2;
eFieldsList[i].Left:=((i mod 4)*235)+10;
lFieldsList[i].Left:=((i mod 4)*235)+10;
eFieldsList[i].Width:=205;
eFieldsList[i].Height:=30;
lFieldsList[i].Caption:=FilterList.Strings[i];
eFieldsList[i].Parent:=pTopSifr;
lFieldsList[i].Parent:=pTopSifr;
lFieldsList[i].Font.Style:=lFieldsList[i].Font.Style + [fsBold];
eFieldsList[i].Font.Style:=lFieldsList[i].Font.Style + [fsBold];
end;
eFieldsList[0].SetFocus;
Tada se otvori ta forma za unos - izmene i pojave se editi sa labelima za ID, JMBG, Prezime i Ime.
Meni je problem kako sad iz tih edita da memorišem podatke u Tabelu. U pitanju je ADOQuery?! Nešto slično ovome
Code: INSERT INTO ImeTabele (ListaPolja) VALUES (VrednostiPolja) |
[ Almedin @ 17.03.2006. 20:49 ] @
prodji opet kroz sva edit polja i uzmi vrijednosti sa
TEdit(eFieldsList).Text
i kreiraj string za update
nesto ovako
var
i: integer;
v: string;
f: string;
sql: string;
begin
v := '';
f := '';
for i:=0 to FilterList.Count-1 do begin
if i > 0 then begin
v := v + ', ';
f := f + ', ';
end;
v := v + TEdit(eFieldsList).Text;
f := f + FilterList.Strings + ', ';
end;
sql := 'INSERT INTO ImeTabele (' + f + ') VALUES (' + v + ')';
vjerovatno treba doraditi malo
[ Miloš Baić @ 18.03.2006. 03:17 ] @
Hmmm..???? Prvo, hvala na odgovoru... Drugo, nisam baš uspeo rešiti problem... Ovaj rad sa stringovima baš i nisam najbolje razumeo. Naime, evo koda koji pokazuje šta sam razumeo:
Code: ...
var
i:Integer;
temp,temp1:string;
begin
UnosOsoba:=TUnOsoba.Create(Self);
for i:=0 to ADOOsoba.FieldCount-1 do
UnosOsoba.FilterList:=TStringList.Create();
UnosOsoba.FilterList.Add('JMBG');
UnosOsoba.FilterList.Add('IME');
UnosOsoba.FilterList.Add('PREZIME');
if UnosOsoba.ShowModal = mrOK then
begin
for i:=1 to FilterList.Count-1 do begin
if temp='' then
temp:=' '''+FilterList.Strings[i]+''' '
else
temp:=temp+', '''+FilterList.Strings[i]+''' ';
if temp1='' then
temp1:=' '''+eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+eFieldsList[i].Text+''' ';
end;
UnosOsoba.ADOOsoba.Close;
UnosOsoba.ADOOsoba.SQL.Clear;
UnosOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
UnosOsoba.ADOOsoba.ExecSQL;
Kao što se vidi, ovaj kod se nalazi na formi za pretragu lica, a pritiskom na Button 'UNOS' otvara se forma sa Editima JMBG, IME, PREZIME. Na njoj se nalazi dugme za čiju akciju OnClick je obrađen kod na formi za pretragu, akcija za unos podataka:
Code: if UnOsoba.ShowModal = mrOK then
begin
for i:=1 to FilterList.Count-1 do begin
if temp='' then
temp:=' '''+FilterList.Strings[i]+''' '
else
temp:=temp+', '''+FilterList.Strings[i]+''' ';
if temp1='' then
temp1:=' '''+eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+eFieldsList[i].Text+''' ';
end;
UnOsoba.ADOOsoba.Close;
UnOsoba.ADOOsoba.SQL.Clear;
UnOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
UnOsoba.ADOOsoba.ExecSQL;
Kad pokrenem program prijavljuje mi grešku "Invalid Object Name 'Osoba' ", to bi trbalo biti problem u vezi tabele Osoba?! Ali ja sam i na formi za unos i pretragu postavio ADOQuery ( na obe forme ADOOsoba - naziv ) i DataSet i povezao sa tabelom Osoba! Ti podaci koje sam uneo kros Server za Bazu se vide u DBGrid-u?!
Sad mi je problem opet to memorisanje?
[Ovu poruku je menjao loshmiscg dana 18.03.2006. u 14:46 GMT+1]
[ martinj @ 19.03.2006. 05:11 ] @
Prvo, koristi parametre... Umesto
Code:
UnOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
stavi
Code:
UnOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (polje1, polje2, polje3) VALUES (:polje1, polje2, polje3));
UnOsoba.ADOOsoba.Parameters.ParamByName('polje1').Value := NekaVrednost1;
UnOsoba.ADOOsoba.Parameters.ParamByName('polje2').Value := NekaVrednost2;
UnOsoba.ADOOsoba.Parameters.ParamByName('polje3').Value := NekaVrednost3;
Koliko vidim, nigde nisi dao konekciju za UnOsoba...
Code:
UnosOsoba:=TUnOsoba.Create(Self);
UnOsoba.Connection := ADOConnection1; // Ovo ti fali.
[ Miloš Baić @ 19.03.2006. 11:54 ] @
Što se tiče parametara, stvar je jasna, ali ja sam pravio, kao što se vidi, listu polja i koristio stringove na osnovu čega bi vršio unos. Ako bi koristio parametre, mogao bih navesti polja ali kako u mom slučaju, filter liste, da navedem vrednosti?!
Code: UnosOsoba:=TUnOsoba.Create(Self);
UnosOsoba.ADOQuery1.Connection := ADOConnection1;
Ovo je spojeno, ADOQuery sa forme za unos je spojen sa ADOConnection na formi za pretragu. Ali i dalje, kad pokrenem program i sa forme za pretragu pokrenem formu za unos, kreira se lista edita ( polja ) u koju upisujem podatke i pritiskom na memorisanje izbacuje se ista greška:
Code: Invalid Object Name Osoba
i poplavi red:
Code: UnOsoba.ADOOsoba.ExecSQL;
Dugme za memorisanje na formi za unos je spojeno sa ovim kodom:
Code: UnosOsoba.ADOOsoba.Close;
UnosOsoba.ADOOsoba.SQL.Clear;
UnosOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
UnosOsoba.ADOOsoba.ExecSQL;
[ martinj @ 19.03.2006. 17:39 ] @
Probaj ovako...
izbaci
Code:
UnOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
i umesto toga, rucno postavi vrednosti
Code:
UnOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (pollje1, polje2...) VALUES (1, 2...)');
da vidis da li je u tome problem...
ili
Postavi watch na temp i temp1 da vidis vrednosti tih promenljivih. Mozda je u njima neka vrednost koja ne bi smela tu da bude...
Koju bazu koristis?
Access?
[ Miloš Baić @ 20.03.2006. 00:10 ] @
Pozdrav....
Ovaj kod:
Code: UnOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (pollje1, polje2...) VALUES (1, 2...)');
valja!!! Hoću reći, memorisanje u tom obliku ide, uspeva...
Citat: Postavi watch na temp i temp1 da vidis vrednosti tih promenljivih. Mozda je u njima neka vrednost koja ne bi smela tu da bude...
Možda bi ovo moglo da mi pomogne?! Kako to sa 'watch' da odradim?!
Tabelu na kojoj ovo radim sam napravio u MS SQL Server 2000 - rci !!! Školski?! 
[ martinj @ 20.03.2006. 19:10 ] @
Osnove rada sa IDE...
postavi break point na liniju u kojoj su ti promenljive temp i temp1, iz view menija ukljuci "watches" i negde ih zalepi uz ekran. U "watches" postavi obe promenljive (desni klik na promeljivu, "debug/add watch") i pokreni program..
Kad program dodje do break point-a zaustavice se i mocices da vidis vrednost promenljivih u watch prozoru ili kao hint ako zadrzis kursor iznad promenljive...
edit: ako ti bez promeljivih upit radi, onda je problem u vrednostima koje promenljive imaju... znaci, temp i temp1 imaju neke pogresne vrednosti...
[Ovu poruku je menjao martinj dana 20.03.2006. u 20:11 GMT+1]
[ Miloš Baić @ 20.03.2006. 22:54 ] @
Uradio sam kako si rekao i postavio iznad temp i temp1 i dobio hint:
Citat: temp= ''Prezime' , 'JMBG''
Komentar?!
Verovatno je problem u:
Code: for i:=1 to FilterList.Count-1 do begin
if temp='' then
temp:=' '''+FilterList.Strings[i]+''' '
else
temp:=temp+', '''+FilterList.Strings[i]+''' ';
if temp1='' then
temp1:=' '''+eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+eFieldsList[i].Text+''' ';
jer ovo:
Code: UnosOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (polje1, polje2...) VALUES (1, 2...)');
funkcioniše?!!!
U MS SQL Server - u sam za kolone postavio tip nvarchar, sem prve, ID, gde je Identity = Yes. Znači, oni se automatski upisuju u tabelu?!!!
[Ovu poruku je menjao loshmiscg dana 21.03.2006. u 00:00 GMT+1]
[ martinj @ 21.03.2006. 00:16 ] @
String sa parametrima ti je prazan i u tome ti je problem, a baza je verovatno napravljena tako da polja ne primaju nul vrednosti. Nemam neko iskustvo sa ms serverom posto uglavnom koristim mysql, ali pretpostavljam da je to problem.
E sad, ako polja iz kojih citas vrednosti koje treba da se upisu u bazu imaju neku vrednost onda imas problem.
Ako ne, onda samo proveri definiciju tabele na serveru i ako je napravljena tako da ne prima nul vrednosti to promeni i problem resen...
Sto se tice parametara, mozes da napravis novi TStringList i u petlji u kojoj popunjavas temp1 da umesto temp1 ubacujes vrednosti u string listu a kasnije iz string liste dodeljujes parametrima vrednost petljom
Code:
for i := 0 to stringlist.count - 1 do
begin
Parameters[i].Value := StringList.Strings[i];
end;
I ono sto ne razumem, zasto moras da dinamicki kreiras edit kontrole?
edit: mislim da imas problem sa citanjem vrednosti iz dinamicki kreiranih kontrola a da je sam kod koji radi upis u tabelu ok...
[Ovu poruku je menjao martinj dana 21.03.2006. u 01:17 GMT+1]
[ Miloš Baić @ 21.03.2006. 00:46 ] @
Druže, tebi zaista hvala puno, ali nešto iz nekog razloga ne funkcioniše?!!!
Zašto hoću ovako da radim i zašto sam uporan? Pa zato što smatram da je to pravi način rada. Naravno, to je diskutabilno, jer svako ima svoj način rada, jel?! Napravio sam pomoću ADOTable ovaj primer. Znači, imam formu za pretragu i za Unos-Izmene. Sa forme za pretragu pokrećem formu za unos - izmene. Memorisanje radi ovako, pretpostavljam da znaš:
Code: with ADOUnos do
begin
Insert;
FieldByName('JMBG').Value := EditJMBG.Text;
FieldByName('IME').Value := EditIME.Text;
FieldByName('PREZIME').Value := EditPREZIME.Text;
Post;
end;
A izmene sa iste forme, ali prvo sa forme za pretragu prenesem vrednosti isfiltriranog, recimo lica, u te edite:
Code: procedure TIzmeneOsoba.FormActivate(Sender: TObject);
begin
EditJMBG.Text:=PretragaOsoba.ADOOsobaJMBG.AsString;
EditIME.Text:=PretragaOsoba.ADOOsobaIME.AsString;
EditPREZIME.Text:=PretragaOsoba.ADOOsobaPREZIME.AsString;
Pa onda izmene:
Code: PretragaOsoba.ADOOsoba.Edit;
PretragaOsoba.ADOOsobaJMBG.AsString := EditJMBG.Text;
PretragaOsoba.ADOOsobaIME.AsString := EditIME.Text;
PretragaOsoba.ADOOsobaPREZIME.AsString := EditPREZIME.Text;
PretragaOsoba.ADOOsoba.Post;
Hteo bih baš ovo sa ovim editima da naučim?! Da li bi mogao postaviti neki primer sa neka tri polja u tabeli, JMBG, IME, PREZIME i obraditi UNOS i IZMENE, da vidim konkretno. Formu sa DBGrid - om i jednu za unos - izmene. Ako budeš imao vremena, napravi sa BDE - om, tabelu, najmanje sa source code - om će zauzeti?!
Ako ne, hvala ti i na ovim odgovorima i posvećenom vremenu, pa ću ako napravim neki korak postovati opet!!!
[ aleksandarpopov @ 21.03.2006. 13:06 ] @
Napisi klasu koja ce biti npr. Osoba, pacijent, sta god sa poljima kao sto ima tvoja tabela, napisi procedure koje ce obavljati sve tvoje operacije prema bazi, insert updat delete ... sa SQl - om otprilike kao sto si napisao...sve to testiras bez korisnickog interfejsa, pa zatim tu klasu koristis posle kako hoces, korisnicki interfejs pravis kako hoces...dinamicki, u designeru...sve jedno...bitno da razdvojis logiku baze, poslovnu logiku i logiku korisnickog interfejsa...
Pozdrav....
[ Miloš Baić @ 21.03.2006. 23:44 ] @
Najbolje bi bilo kada bi se:
Citat: Da li bi mogao postaviti neki primer sa neka tri polja u tabeli, JMBG, IME, PREZIME i obraditi UNOS i IZMENE, da vidim konkretno. Formu sa DBGrid - om i jednu za unos - izmene. Ako budeš imao vremena, napravi sa BDE - om, tabelu, najmanje sa source code - om će zauzeti?!
[ johnnie @ 22.03.2006. 11:42 ] @
A zasto koristis editbox, zar ne mozes da koristis TDBEdit, a zatim radis post (ili cancel, ak ne zelis izmenu?).
Ako vec prenosis vrednosti iz tabele u string, uradi bezbedno prevodjenje ( datum -> string itd), izbegni nul vrednosti itd...Pa tek onda vrsi upis u tabelu...
[ Miloš Baić @ 22.03.2006. 14:40 ] @
Citat: johnnie: A zasto koristis editbox, zar ne mozes da koristis TDBEdit, a zatim radis post (ili cancel, ak ne zelis izmenu?).
Ako vec prenosis vrednosti iz tabele u string, uradi bezbedno prevodjenje ( datum -> string itd), izbegni nul vrednosti itd...Pa tek onda vrsi upis u tabelu...
Vidi, sve to sam odradio sa ADOTable. Znači, jedna forma za pretragu, na njoj imam dva dugmeta ( UNOS, IZMENE ). Druga forma sadrži edite i na njoj u zavisnosti od uslova vršim UNOS - IZMENE. Kad se otvori forma za UNOS - IZMENE i ispunjen je uslov za UNOS, punjenje u bazu radim na sledeći način:
Code: with ADOOsobaUn do
begin
Insert;
FieldByName('IME').Value := EditIME.Text;
FieldByName('PREZIME').Value := EditPREZIME.Text;
...
Post;
end
Znači, na taj način radim i da se u te iste edite pune podaci iz tabele za izmenu (Edit)... Potom ih editujem...
U ovom mom sadašnjem slučaju sam koristio pored watches i:
Code: UnosOsoba.ADOOsobaUn.SQL.SaveToFile('query.txt');
i dobio kao rezultat:
Citat: INSERT INTO Osoba ( 'Prezime' , 'JMBG' ) VALUES ( '' , '' )
Kao što sam naveo, u tabeli polja sam stavio na nvarchar, sem kolone ID koja je int i Identity je na Yes. Dozvolio sam i 'Allow Nulls' na Yes.
Bezbedno prevođenje u string odraditi u ovom delu?!
Code: UnosOsoba.ADOOsoba.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
Ako da, kako je najpravilnije to odraditi?
[ Almedin @ 22.03.2006. 19:34 ] @
Code: if temp1='' then
temp1:=' '''+eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+eFieldsList[i].Text+''' ';
Stavi breakpoint na ovaj dio koda pa vidi zašto ne uzima vrijednosti iz TEdit polja.
[ Miloš Baić @ 22.03.2006. 23:46 ] @
Kad sam to odradio kaže ovako
Citat: eFieldsList = ( nil, nil, nil, ..., nil)
Vrednosti iz TEdit polja ne uzima verovatno zbog ovoga?! Šta sad?
Da podsetim, ovako izgleda:
Code: for i:=1 to FilterList.Count-1 do begin
if temp='' then
temp:=' '''+FilterList.Strings[i]+''' '
else
temp:=temp+', '''+FilterList.Strings[i]+''' ';
if temp1='' then
temp1:=' '''+eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+eFieldsList[i].Text+''' ';
[ Trodmi @ 23.03.2006. 02:39 ] @
E zbog ovakvih stvari sam ja otvorio sajt.
http://www.delcode.com/Database.zip
[ johnnie @ 23.03.2006. 08:09 ] @
Probaj da proveravas Code: Trim(temp1)='' ili
length(trim(temp1))=0 , u praksi radi bolje nego Code: if temp1='' , ne pitaj me zasto, nikad mi nije bilo jasno ali radi...
A bezbedno prevodjenje u string, mislio sam na slucajeve kada unosis datum ili nesto slicno, sto treba biti formatirano a ne koristis maskedit...Znaci, u editu na onkeypress event postavi Code: if not key in ['0'..'9','.'] then key:=#0; ;(ili koji ti vec karakteri trebaju odnosno koji smeju biti uneti...
[ Miloš Baić @ 23.03.2006. 09:26 ] @
Da, naišao sam i ja na taj primer, ranije, ali nema source code - a nego tek kad se kupi... Vidi:
http://www.shareit.com/product.html?productid=300046654
[ Miloš Baić @ 23.03.2006. 15:52 ] @
Jedino do sad što sam uspeo jeste to da kod:
Code: for i:=1 to FilterList.Count-1 do begin
if temp='' then
temp:=' '''+FilterList.Strings[i]+''' '
else
temp:=temp+', '''+FilterList.Strings[i]+''' ';
if temp1='' then
temp1:=' '''+eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+eFieldsList[i].Text+''' ';
sam modifikovao u:
Code: for i:=1 to UnosOsoba.FilterList.Count-1 do begin
if temp='' then
temp:=' '''+UnosOsoba.FilterList.Strings[i]+''' '
else
temp:=temp+', '''+UnosOsoba.FilterList.Strings[i]+''' ';
if temp1='' then
temp1:=' '''+UnosOsoba.eFieldsList[i].Text+''' '
else
temp1:=temp1+', '''+UnosOsoba.eFieldsList[i].Text+''' ';
end;
i na osnovu:
Code: UnosOsoba.ADOOsobaUn.SQL.SaveToFile('query.txt');
što je sastavni deo:
Code: UnosOsoba.ADOOsobaUn.Close;
UnosOsoba.ADOOsobaUn.SQL.Clear;
UnosOsoba.ADOOsobaUn.SQL.Add('INSERT INTO Osoba (' + temp + ') VALUES (' + temp1 + ')');
UnosOsoba.ADOOsobaUn.SQL.SaveToFile('query.txt');
UnosOsoba.ADOOsobaUn.ExecSQL;
dobio sledeće u query.txt:
Citat: INSERT INTO Osoba ( 'JMBG' , 'IME' , 'PREZIME' ) VALUES ( '2606981890046' , 'Pera' , 'Petrovic' )
Koliko shvatam, sad je prihvatio punjenje ali neće da memoriše u tabelu. Kaže lepo:
Citat: Invalid Object name 'Osoba'
A 'Osoba' je tabela u koju se treba memorisati?!!! 
[ Almedin @ 23.03.2006. 21:13 ] @
Probaj
Code: INSERT INTO "Osoba"...
[ Trodmi @ 24.03.2006. 00:17 ] @
A bre, al' si se upetlj'o, poslacu ti ja source na email, ionako je moj sajt...
[ Miloš Baić @ 24.03.2006. 01:00 ] @
Stvarno, ovo više nema smisla...
Ajd pošalji na mail...
[ Trodmi @ 24.03.2006. 01:46 ] @
Sredjeno
[ Miloš Baić @ 24.03.2006. 18:22 ] @
Probao sam sa ADOTable?! Punjenje:
Code: with ADOTable1 do begin
Insert;
FieldByName(UnOsoba.FilterList.Strings[i]).Value := UnOsoba.eFieldsList[i].Text;
Post;
end;
Ovako se memoriše u tabelu, napokon, ali, vrednost koju unosim za JMBG je u jednom redu, vrednost za IME u redu ispod, a vrednost za PREZIME u još jednom redu ispod... Znači, svaku kolonu unosi u novi red:
Code: JMBG | IME | PREZIME
2606981890046
Pera
Petrovic
5464652546554
Zoki
Zoric
Kako dovesti do toga da se punjenje vrši u jedan red, kako treba?
[Ovu poruku je menjao loshmiscg dana 27.03.2006. u 18:07 GMT+1]
[ Almedin @ 24.03.2006. 20:52 ] @
onda radi ovako
; Code:
with ADOTable1 do begin
Insert;
for i := 0 to UnOsoba.FilterList.Count -1 do
FieldByName(UnOsoba.FilterList.Strings[i]).Value := UnOsoba.eFieldsList[i].Text;
Post;
end
[ Miloš Baić @ 25.03.2006. 01:51 ] @
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Napokon, ljudi, uspeo sam.... Zahvaljujem se svima....
Ali... vratiću se i na ADOQuery, na to isto ali sa SQL upitima, kad malo odanem.... Moram i to rešiti....
Pozzzz 
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|