Çok uzun bir sorgu cümlesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sako
Üye
Mesajlar: 477
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Çok uzun bir sorgu cümlesi

Mesaj gönderen sako »

Tablomda bir kişinintercih1,tercih2...tercih20 alanı var. Ben bir kurumu seçtiğimde pütün kayıtların 20 tercihini de kontrol etsin istiyorum. Aşağıdaki kod kırmızı yeri saymazsak çalışıyor. Kırmızı rengi ekleyince de hiç bir etkisi olmuoyr. Yani o alanı hiç yazmamışım gibi eski şekilde arıyor.
Kod oldukça uzun oldu biraz ama :oops:

Veritabanım access

atamapersonel.close;
atamapersonel.SQL.Clear;

atamapersonel.SQL.Add('select * from genel where ATANMAKISTEDIGIALAN = '''+Edit1.Text+''''+'and atanmadurumu = '''+Edit4.Text+''''+' and (tercih1id BETWEEN:ilk and :son)'+'or(tercih2id BETWEEN:ilk2 and :son2)'+'or(tercih3id BETWEEN:ilk3 and :son3)'+'or(tercih4id BETWEEN:ilk4 and :son4)'+'or(tercih5id BETWEEN:ilk5 and :son5)'+'or(tercih6id BETWEEN:ilk6 and :son6)'+'or(tercih7id BETWEEN:ilk7 and :son7)'+'or(tercih8id BETWEEN:ilk8 and :son8)'+'or(tercih9id BETWEEN:ilk9 and :son9)'+'or(tercih10id BETWEEN:ilk10 and :son10)');

çok uzun olduğu için bu şekilde ikiye ayırdım. Aksi halde hata veriyor çok uzun diye.

atamapersonel.SQL.Add('or(tercih11id BETWEEN:ilk11 and :son11)'+'or(tercih12id BETWEEN:ilk12 and :son12)'+'or(tercih13id BETWEEN:ilk13 and :son13)'+'or(tercih14id BETWEEN:ilk14 and :son14)'+'or(tercih15id BETWEEN:ilk15 and :son15)'+'or(tercih16id BETWEEN:ilk16 and :son16)'+'or(tercih17id BETWEEN:ilk17 and :son17)'+'or(tercih18id BETWEEN:ilk18 and :son18)'+'or(tercih19id BETWEEN:ilk19 and :son19)'+'or(tercih20id BETWEEN:ilk20 and :son20)');


atamapersonel.Parameters.ParamByName('ilk').Value:=atamaSIRA_NO.Value; // Kurumun id sine göre arama yapıyor.
atamapersonel.Parameters.ParamByName('SON').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk2').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON2').Value:=atamaSIRA_NO.Value;
{atamapersonel.Parameters.ParamByName('ilk3').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON3').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk4').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON4').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk5').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON5').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk6').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON6').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk7').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON7').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk8').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON8').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk9').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON9').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk10').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON10').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk11').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON11').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk12').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON12').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk13').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON13').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk14').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON14').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk15').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON15').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk16').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON16').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk17').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON17').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk18').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON18').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk19').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON19').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('ilk20').Value:=atamaSIRA_NO.Value;
atamapersonel.Parameters.ParamByName('SON20').Value:=atamaSIRA_NO.Value;
atamapersonel.open;
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Çok uzun bir sorgu cümlesi

Mesaj gönderen omurolmez »

* EditA1 :TEdit, EditB1 :TEdit, EditA2 :TEdit, EditB2 :TEdit, vb. ardaşık adlandırmalı bileşenler ile:

Kod: Tümünü seç

var
  AText :string;
  AWhere :string;
  i :integer;
begin
  AWhere :='';
  for i:=1 to 10 do begin
    ATextA :=( FindComponent( Format('EditA%d', [i]) ) as TEdit).Text;
    ATextB :=( FindComponent( Format('EditB%d', [i]) ) as TEdit).Text;
    AWhere := AWhere + Format(' and tercih%d between '%s' and '%s' ', [ i, ATextA, ATextB ]);
  end;
end;
* Çok uzun yatay tabloların dikey normalizasyonu için (Bkz: Veritabanı normalizasyonu) ;

Kod: Tümünü seç

 create table Master (

     ...
     TERCIH_ID integer not null,
     constraint UNQ_Master_1 unique (TERCIH_ID)     
     -- veya foreign key (bkz: foreign key / cascaded insert update delete)
  );

  create table Detail (
    TERCIH_ID integer not null primary,
    TERCIH_DEGER {gereken veri tipi}
  );
* Gömülü sql ifadelerinin daha okunaklı yazılması için Format kullanabilirsiniz:

Kod: Tümünü seç

ASql :='select * from tablo where Alan between '' ' + Deger1 + ' '' and '' ' + Deger2 + ' '' ';
yerine

Kod: Tümünü seç

ASql :=Format('select * from tablo where Alan between ''%s'' and ''%s'' ', [Deger1, Deger2]);
Daha da iyisi, parametreleri kullanabilirsiniz (tek tırnaklara gerek kalmaz) :

Kod: Tümünü seç

Query1.Sql.Text :='select * from tablo where Alan between :deger1 and :deger2';
  Query1.Params(0).AsString :=Deger1;
  Query1.Params(1).AsString :=Deger2;
Ömür Ölmez
sako
Üye
Mesajlar: 477
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Re: Çok uzun bir sorgu cümlesi

Mesaj gönderen sako »

Hocam teşekkürler. Ben bu format işini sevdim. Bu şekilde bir kodla tabledeki ardışık bütün alanları mesela alan1,alan2 ... alan 100 bu alanların hepsini temizliyim bir tuşla bir döngüyle dedim ama yine bu formatı uyarlayamadım kendime göre. Eklemem gereken birşey mi var acaba ?

mesela
table1alan1.text:='';
table1alan2.text:='';
....
table1alan100.text:='';


tek tek yazmak yerine

for i=1 to 100 do begin
Format(Table1alan%d',)).text:=''
...
yaptım ama yemedi :)
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
sako
Üye
Mesajlar: 477
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Re: Çok uzun bir sorgu cümlesi

Mesaj gönderen sako »

Şu şekilde oluyormuş :)

Table1.FieldByName('alan'+IntToStr(i)').Text;
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
Cevapla