DBEdit iel ilgili bir soru!!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

asoft kardeşim onstatechange yok ben Delphi5 kullanıyorum
assoft

Mesaj gönderen assoft »

Pardon

Kod: Tümünü seç

OnDataChange olacaktı
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

'Query2:No SQL Statement available' Process stopped hatası alıyorum
assoft

Mesaj gönderen assoft »

Kod: Tümünü seç

procedure TForm1.QUERY1_DSDataChange(Sender: TObject; Field: TField);
begin
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT * FROM ISILTAKIPFOR2 WHERE FIRMAKOD='''+IntToStr(Query2.FieldByName('FIRKOD').AsInteger)+'''');
Query2.Open;
end;
Query1 Açık olacak.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

with query1 do
begin
Close;
SQL.Clear;
SQL.Add('select ISILTAKIPFOR1.*,DIGERTABLONUNADI.* from ISILTAKIPFOR1');
SQL.Add('left join DIGERTABLONUNADI on ISILTAKIPFOR1.FIRKODU=DIGERTABLONUNADI=FIRKOD');
SQL.Add('where FIRKODU=:x');
parameters.parambyname('x').value:=edit1.text;
Open;
end;


mucar kardeşim 'x' yerine ne koyacam birde parameters kısmında hata veriyor.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

begin
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT * FROM ISILTAKIPFOR2 WHERE FIRMAKOD='''+IntToStr(Query2.FieldByName('FIRKOD').AsInteger)+'''');
Query2.Open;


SQL açık ama yine aynı hata.

Query2.Open;
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

Mesaj gönderen mucar »

Benim gönderdiğim kod iki tabloyu birleştiriyor, dbgridde bu iki tabloyu birleşmiş olarak görürsün.

Kod: Tümünü seç

with query1 do 
begin 
Close; 
SQL.Clear; 
SQL.Add('select ISILTAKIPFOR1.*,ISILTAKIPFOR2.* from ISILTAKIPFOR1'); 
SQL.Add('left join ISILTAKIPFOR2 on ISILTAKIPFOR1.FIRKODU=ISILTAKIPFOR2.FIRKOD'); 
SQL.Add('where FIRKODU='''+Edit1.Text+''''); 
Open; 
end; 
Bir de hata veriyor demek yerine nerede, nasıl hata veriyor, hangi kodda onları yazarsanız yardım etmemizi kolaylaştırırsınız, aksi halde yapacak fazla bişey yok. Mesela "No SQL Statement available" hatasını forumda arattım, eksik SQL cümlesinden kaynaklandığına dair bi cevap verilmiş.

viewtopic.php?t=8793&view=next
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

ozcank yazdı:'Query2:No SQL Statement available' Process stopped hatası alıyorum
Bu mesaj kullanılabilir bir sql deyimi yok demektir. Yani forma bir query bileşeni koyup Onun aktive özelliğini true yaptığınızda bu hata mesajını size verir. Bu yüzden sql propertisine bir table ın basit bir deyimini yazarsanız sorun çıkmaz.

Kod: Tümünü seç

select * from deneme 
gibi . Daha sonra karmaşık deyiminizi kodla yazarsınız.
menderes

Mesaj gönderen menderes »

Kolay gelsin yardımcı olma açısından access te bir örnek yapmaya çalışalım umarım faydalı olabiliriz.
Access tarafında cari.mdb adında veritabanı oluşturalım,
İki tablemiz;
Musteri (birinci table)
id - o/s // otomatik sayı
adsoyad metin(50)
mushareket (ikinci table)id - o/s
urunkodu - metin(13)
urunadi - metin(100)
musteri_id - sayı // ilişkilendirmede kullanacağız

Şimdi gelelim delphi tarafına;delphi yi açalım
1 Adet DataModule1 açalım ve içerisinde
ADOConecction1 --> cari.mdb ye (ConnectionString le) bağlanalım
ADOTable1 -->Musteri bağlantılı
ADOTable2 -->mushareket bağlantılı
Formlarımızı oluşturalım;
Form name-->Fana olsun -- içerisinde 1 adet dbgrid ve datasource yi ADOTable1 le bağlayalım.
//Not:(implementation altındaki uses e DataModule1 ekleyelim aynı şekilde bu formdan kullanacağımız formlar içinde geçerli)
Bir adet Yeni (kayıt için) buton ekleyelim.//Biz örnek için bir adet koyduk siz düzelt sil içinde koyabilirsiniz.
Form1 açalım, project options tan Available forms olarak ayarlayalım, açılışta kalabalık yapmasın,
onclose olayınada;
action:=caFree; //kapattığımızda form yok olsun
Yine müşteri kayıtları için
Ben genelde kayıtlarda edit.text ler kullanırım;
İşlem kodu : Edit1.Text;
Müşteri Adı Soyadı: Edit2.Text;
Bir Adet de kaydet butonumuz olsun.
//Başka ekleyebilirsiniz biz örnek için iki adet koyalım.
public altına bir procedure tanımlayalım;kullandığımız editleri işimiz bitince boşaltmak için

Kod: Tümünü seç

 public
    { Public declarations }
    procedure atemiz();
  end;
implementation

uses UnitDataModule1;

{$R *.dfm}

Procedure TForm1.atemiz();
begin
Edit1.Text:='Otomatik Sayı';//readonly=true olsun ki veri girilemesin.
Edit2.Text:='';
//Başka varsa ekleyebilirsiniz 
end;
Fana adlı formumuza dönelim ve buradan yeni adlı butonumuza tıklayalım,

Kod: Tümünü seç

procedure TFana.yeniClick(Sender: TObject);
begin
Application.CreateForm(TForm1, Form1);
Form1.atemiz;//public olarak tanımladığımız procedure
Form1.ShowModal;
end;
Geldik Form1 e;
Burada Edit2 ye müşteri adını girdik diyelim
kaydet butonunua tıklayalım...

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);//kaydet
begin
 if Trim(Edit2.Text)<>'' then // boş geçilmemişse
 begin
 DataModule1.ADOTable1.Open;
 DataModule1.ADOTable1.Insert;
 DataModule1.ADOTable1.FieldByName('adsoyad').AsString:=Edit2.Text;
  DataModule1.ADOTable1.Post;
 atemiz;
//buraya Close; yazabiliriz, yani işimiz bitince form kapanması için.
 end
 else
 begin
 ShowMessage('Müşteri Adı Boş Geçilemez');
 Edit2.SetFocus;
 Abort;
 end;
end;
Kayıdımız
id si 1 adsoyad ise menderes yıldız olsun
Şimdi bu kişiye mal satalım...
Aynı şekilde Form2 açalım ve project/options dan available forms olarak ayarlayıp onclose olayına action:=caFree; yazalım....
İşlem No : Edit1.Text;
Ürün Kodu : Edit2.Text;
Ürün Adı : Edit3.Text;
//visible özelliği false olan Edit4.Text (müşteri_id yazmak için)
bir de kaydet butonu koyalım.
Şimdi yine dönelim Fana formumuza;
ürün satışı diye bir buton koyalım;

Kod: Tümünü seç

procedure TFana.satisClick(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
if DataModule1.ADOTable1.Active=True then//kayıt aktifmi
begin
Form2.Edit4.Text:=DataModule1.ADOTable1.FieldByName('id').AsString;
//Bu id yi mushareket tablesinde ki musteri_id ye kaydederken kullanacağız.
  Form2.ShowModal;
     end;
Edit3.text içerisinde müşterinin id si var. Bu id ye istediğimiz kadar satış yapabiliriz. Bu iş genelde DGBrid veya başka bileşenlerle yapılıyor. Biz örnek olsun diye editleri kullanacağız.
Form2 de ise verileri girdik diyelim ve kaydet butonuna tıklayalım...

Kod: Tümünü seç

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
 if (Trim(Edit2.Text)<>'') and (Trim(Edit3.Text)<>'') then
 begin
 DataModule1.ADOTable2.Open;
 DataModule1.ADOTable2.Insert;
 DataModule1.ADOTable2.FieldByName('urunkodu').AsString:=Edit2.Text;
 DataModule1.ADOTable2.FieldByName('urunadi').AsString:=Edit3.Text;
 DataModule1.ADOTable2.FieldByName('musteri_id').AsInteger:=StrToInt(Edit4.Text);// Müşteri id sini almış olduk...
   DataModule1.ADOTable2.Post;
Edit1.Text:='Otomatik Sayı';
Edit2.Text:='';
Edit3.Text:='';
Edit2.SetFocus;
//yukarıdaki gibi procedure tanımlayarak da (atemiz gibi) buraya bu kadar kod yazılmayabilir.
end
else
begin
ShowMessage('Eksik Bilgi Girişi');
Edit2.SetFocus;
Abort;
end;
end;
Bu şekilde manuel ilişkilendirme yi de belirtmiş olduk.
Şimdi gelelim yine Fana formumuza ve yukarıda sorulan soruya;
bir adet aldığı ürünler diye buton koyalım ve Alınan ürünlerle ilgili Form3 adında Form açalım buraya;
Müşteri id si için Edit1.Text //visible özelliği false
Müşteri Adı Soyadı :Edit2.Text;
1 adet ADOQuery1 ve DataSource,
//Alınan ürünler için
1 adet dbgrid sourcesi ADOQuery1 e bağlı,

Fana formundan aldığı ürünler diye tıklayalım,

Kod: Tümünü seç

procedure TFana.DBGrid1DblClick(Sender: TObject);
begin
Application.CreateForm(TForm3, Form3);
if DataModule1.ADOTable2.Active=True then//kayıtlar aktif mi
begin
Form3.Edit1.Text:=DataModule1.ADOTable2.FieldValues['id'];
Form3.Edit2.Text:=DataModule1.ADOTable2.FieldByName('adsoyad').AsString;
Form3.ADOQuery1.Close;
Form3.ADOQuery1.SQL.Clear;
Form3.ADOQuery1.SQL.Add('select * from mushareket');
Form3.ADOQuery1.SQL.Add('where musteri_id= ' + IntToStr(DBGrid1.DataSource.DataSet.FieldByName('id').AsInteger));
Form3.ADOQuery1.Prepared:=True;
Form3.ADOQuery1.Open;
end;
Form3.ShowModal;
     end;
Bu sayede seçilen müşteriye ait hareket gözükmüş olacak.
Ürün sayısını da bir label koyarak gösterelim,
Datasourcenin DataChange sine yazıyoruz.

Kod: Tümünü seç

procedure Teolst.DataSource1DataChange(Sender: TObject; Field: TField);
begin
Label1.Caption:='Aktif Öğrenci Kayıt :'+IntToStr(ADOquery1.RecordCount);
end;
Artık burada istediğimiz gibi bu kişiye ait hareketleri sıralayabilir ve raporlayabiliriz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Mucar kardeşim işlem tamamdır oldu çok teşekkür ediyorum ve diğer yardımcı olan arkadaşlarımada herkese teşekkürler SAYGILAR
Cevapla