Daha önce Burada Sorduğum sorunun cevabıdır aslında.
Kısa bir açıklama!
Datamodulerle çalışmak istemediğim için çalışma anında dataset oluşturup işim bittiğinde free etme yoluna gitmeye karar vermiştim. Fakat burada update,insert SQL cümlelerini yazmak açıkçası çok zamanımı almaya başlamıştı o yüzden böyle bir Procedure olurmu derken oldu ve paylaşayım istedim.
SelectSQL cümlesinin ardından
Kod: Tümünü seç
procedure SQLOlustur(dataset:TIBDataset;Tablo,keyField:string);
var
i:integer;
met:array[1..75] of string; // Tablolarınızda bulunan alan sayısına göre 1..XX sayısını belirlemeyi unutmayın
//aksi takdirde 50 alan olan tabloda 1..45 yaparsanız Hata alacaksınızdır.
mSQL,iSQL,Listee:String;
begin
dataset.Open;
Listee:=dataset.FieldList.CommaText;
iSQL:=iSQL+'insert into '+Tablo+' (';
Listee:=Trim(StringReplace(Listee,'(','',[rfReplaceAll]));
Listee:=Trim(StringReplace(Listee,')','',[rfReplaceAll]));
mSQL:='update '+Tablo+' set ';
i:=1;
if pos(',',Listee) <> 0 then
begin
repeat
met[i] := copy(Listee,1,pos(',',Listee)-1);
mSQL:=mSQL+met[i]+'=:'+met[i]+',';
iSQL:=iSQL+met[i]+',';
delete(Listee,1,(pos(',',Listee)));
inc(i);
until
pos(',',Listee) = 0;
end;
mSQL:=mSQL+Listee+'=:'+Listee;
mSQL:=mSQL+' Where '+keyField+' = :OLD_'+keyField;
iSQL:=iSQL+Listee;
iSQL:=iSQL+')';
Listee:=dataset.FieldList.CommaText;
iSQL:=iSQL+(' values (');
i:=1;
if pos(',',Listee) <> 0 then
begin
repeat
met[i] := copy(Listee,1,pos(',',Listee)-1);
iSQL:=iSQL+':'+met[i]+',';
delete(Listee,1,(pos(',',Listee)));
inc(i);
until
pos(',',Listee) = 0;
end;
iSQL:=iSQL+':'+Listee;
iSQL:=iSQL+')';
dataset.ModifySQL.Add(mSQL);
dataset.InsertSQL.Add(iSQL);
end;
//Kullanımı Dataset'in SelectSQL.Text'ini girdikten sonra aşağıdaki şekilde yazmak yeterli olacaktır.
SQLOlustur(datasetadi,'TabloAdı','keyField');
Not:Giriş seviyesinde olduğum için gereksiz kodlarım olmuş olabilir bildirirseniz memnun olurum.
Düzenlenme Sebebi "met:array[1..25] of string;" olan kısım "met:array[1..75] of string;" olarak değiştirildi ve karşısına açıklama getirildi.