Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ALUCARD
Üye
Mesajlar: 1269 Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:
Mesaj
gönderen ALUCARD » 15 Eyl 2015 02:24
şeklinde tablolarım var.
İlk gridde hangi üründen ne zaman ne kadar geldiyse onlar var.
ikinci giridde kullanılan miktarlar var
üçüncü gridde ise kullanılan ürün hangi alımdan geldiyse o var.
Aşağı yukarı herkes bilir fifo (First in First out - İlk Giren İlk Çıkar)hesabını. ,
kodlarım ise şöyle
Kod: Tümünü seç
procedure TVardiyaSonuIslemleri.UniBitBtn17Click(Sender: TObject);
var
kalan,kullan : double;
depoid : integer;
Liste,sql : string;
I: Integer;
begin
liste :='select * from faturasatir WHERE ISLETME_ID = :ISLETME_ID AND KALANLITRE > 0 ORDER BY FATURASATIR_ID';
for I :=0 to IBQAlinanUrunler.RecordCount -1 do
begin
kullan := IBQKullanilanKULLANILAN.Value;
depoid := IBQKullanilanDEPO_ID.Value;
sql := 'select * from faturasatir ';
sql :=sql + ' WHERE ISLETME_ID = :ISLETME_ID ';
sql :=sql + ' and YAKIT_ID ='+INTTOSTR(DEPOID);
sql :=sql + ' AND KALANLITRE > 0 ';
sql :=sql + 'ORDER BY FATURASATIR_ID';
IBQAlinanUrunler.Close;
IBQAlinanUrunler.SelectSQL.Clear;
IBQAlinanUrunler.SelectSQL.Add(SQL);
IBQAlinanUrunler.Open;
if KULLAN <= IBQAlinanUrunlerKALANLITRE.Value then
BEGIN
IBDMaliyet.Append;
IBDMaliyetISLETME_ID.Value := IBQAlinanUrunlerISLETME_ID.Value;
IBDMaliyetVARDIYA_ID.Value := IBQVardiyaVARDIYA_ID.Value;
IBDMaliyetYAKIT_ID.Value := DEPOID;
IBDMaliyetYAKITADI.Value := IBQAlinanUrunlerYAKITADI.Value ;
IBDMaliyetKULLANILAN.Value := KULLAN;
IBDMaliyetFIYATI.Value := IBQAlinanUrunlerFIYATI.Value;
IBDMaliyetTUTAR.Value := IBDMaliyetFIYATI.Value * IBDMaliyetKULLANILAN.Value;
IBQAlinanUrunler.Edit;
IBQAlinanUrunlerKALANLITRE.Value:= IBQAlinanUrunlerKALANLITRE.Value - KULLAN;
IBQAlinanUrunler.Post;
IBDMaliyet.Post;
UniMainModule.IBTransaction1.CommitRetaining;
IBQAlinanUrunler.Close;
IBQAlinanUrunler.SelectSQL.Clear;
IBQAlinanUrunler.SelectSQL.Add(liste);
IBQAlinanUrunler.Open;
END
else
begin
kalan := kullan - IBQAlinanUrunlerKALANLITRE.Value;
IBDMaliyet.Append;
IBDMaliyetISLETME_ID.Value := IBQAlinanUrunlerISLETME_ID.Value;
IBDMaliyetVARDIYA_ID.Value := IBQVardiyaVARDIYA_ID.Value;
IBDMaliyetYAKIT_ID.Value := DEPOID;
IBDMaliyetYAKITADI.Value := IBQAlinanUrunlerYAKITADI.Value ;
IBDMaliyetKULLANILAN.Value := IBQAlinanUrunlerKALANLITRE.Value;
IBDMaliyetFIYATI.Value := IBQAlinanUrunlerFIYATI.AsInteger;
IBDMaliyetTUTAR.Value := IBDMaliyetFIYATI.Value * IBDMaliyetKULLANILAN.Value;
IBQAlinanUrunler.Edit;
IBQAlinanUrunlerKALANLITRE.Value:= IBQAlinanUrunlerKALANLITRE.Value - IBQAlinanUrunlerKALANLITRE.Value;
IBQAlinanUrunler.Post;
IBDMaliyet.Post;
UniMainModule.IBTransaction1.CommitRetaining;
IBQAlinanUrunler.Close;
IBQAlinanUrunler.SelectSQL.Clear;
IBQAlinanUrunler.SelectSQL.Add(sql);
IBQAlinanUrunler.Open;
IBDMaliyet.Append;
IBDMaliyetISLETME_ID.Value := IBQAlinanUrunlerISLETME_ID.Value;
IBDMaliyetVARDIYA_ID.Value := IBQVardiyaVARDIYA_ID.Value;
IBDMaliyetYAKIT_ID.Value := DEPOID;
IBDMaliyetYAKITADI.Value := IBQAlinanUrunlerYAKITADI.Value ;
IBDMaliyetKULLANILAN.Value := kalan;
IBDMaliyetFIYATI.Value := IBQAlinanUrunlerFIYATI.Value;
IBDMaliyetTUTAR.Value := IBDMaliyetFIYATI.Value * IBDMaliyetKULLANILAN.Value;
IBQAlinanUrunler.Edit;
IBQAlinanUrunlerKALANLITRE.Value:= IBQAlinanUrunlerKALANLITRE.Value - kalan;
IBQAlinanUrunler.Post;
IBDMaliyet.Post;
UniMainModule.IBTransaction1.CommitRetaining;
IBQAlinanUrunler.Close;
IBQAlinanUrunler.SelectSQL.Clear;
IBQAlinanUrunler.SelectSQL.Add(liste);
IBQAlinanUrunler.Open;
end;
IBQKullanilan.Next;
end;
IBQAlinanUrunler.Close;
IBQAlinanUrunler.SelectSQL.Clear;
IBQAlinanUrunler.SelectSQL.Add(liste);
IBQAlinanUrunler.Open;
end;
doğru sonucu hiç alamıyorum. üçüncü gridde hep fazla kayıt çıkıyor.
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365 . Üyesi
Hiç Bir Şey İnsan Kadar
Yükselemez ve
Alçalamaz
Erkan ÇAĞLAR
ertank
Kıdemli Üye
Mesajlar: 1657 Kayıt: 12 Eyl 2015 12:45
Mesaj
gönderen ertank » 16 Eyl 2015 05:24
Merhaba,
Öncelikle kod yazarken begin..end blokları arasında kalanları biraz daha içeriden yazarsan okuması daha kolay olur.
İlk sormak istediğim: "for I :=0 to IBQAlinanUrunler.RecordCount -1 do" şeklinde başladığın blok içinde IBQAlinanUrunler kapatılıp tekrar açılıyor. Yani RecordCount değişmiş oluyor. Bunu özellikle mi yapıyorsun? Eğer özellikle yaptığın birşey değil ise ikinci bir query nesnesi kullanmanı öneriyorum.
ikinci olarak: Kod kısmi gönderilmiş gibi. begin..end blokları dışında kalan kod var gibi görüyorum. Tabi düzgün takip edemediğim içinde olabilir bu.
üçüncü olarak: Bir tablo içine kayıt eklerken başka bir tabloda kayıt değişikliği yapıyorsun. Ben bu tarz kodları yazarken kayıtları tek tek ele almayı tercih ederim. Yani bir tablo "append" modunda iken ikinci bir tabloyu mümkün olduğunca "edit/append/insert" moduna geçirmemeye çalışırım.
IBQAlinanUrunler.Edit;
IBQAlinanUrunlerKALANLITRE.Value:= IBQAlinanUrunlerKALANLITRE.Value - KULLAN;
IBQAlinanUrunler.Post;
Yukarıdaki kod bloğunu
IBDMaliyet.Post;
satırından sonra kullanmanda bir sakınca yok. Zaten tabloya post edildiğindeki bilgiler ile append modundaki bilgilerin aynı olması gerekli. Eğer ki Maliyet tablosunun BeforePost veya AfterPost gibi olaylarında değerlerin değişmesine sebep olacak başka kod çalışmıyor ise...
Yukarıdaki düzenlemeleri yaptıktan sonra kodu tekrar buraya gönderebilirsen tekrar üzerinden geçebiliriz. Bu defa biraz daha detaya inme şansımız da olacaktır diye düşünüyorum.
ALUCARD
Üye
Mesajlar: 1269 Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:
Mesaj
gönderen ALUCARD » 16 Eyl 2015 05:29
Gözden geçireceğim. İlginiz için tesekkurler
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365 . Üyesi
Hiç Bir Şey İnsan Kadar
Yükselemez ve
Alçalamaz
Erkan ÇAĞLAR
ALUCARD
Üye
Mesajlar: 1269 Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:
Mesaj
gönderen ALUCARD » 18 Eyl 2015 04:36
Hocam kodu şu şekilde düzenledim. ama giren bazı durumlarda yanlış hesaplama yapıyor. bi kontrol edersen sevinirim.
Kod: Tümünü seç
procedure TVardiyaSonuIslemleri.UniBitBtn17Click(Sender: TObject);
var
I : INTEGER;
KALAN,KULLANILAN : DOUBLE;
begin
IBQKullanilan.First;
IBDataSet1.First;
for I := 1 to IBQKullanilan.RecordCount do
BEGIN
KALAN:= 0;
KULLANILAN := IBQKullanilanKULLANILAN.Value;
while NOT (KULLANILAN = 0) do
BEGIN
if KULLANILAN <= IBDataSet1KALANLITRE.Value then
BEGIN
IBDMaliyet.Append;
IBDMaliyetISLETME_ID.Value := IBDataSet1ISLETME_ID.Value;
IBDMaliyetVARDIYA_ID.Value := IBQVardiyaVARDIYA_ID.Value;
IBDMaliyetYAKIT_ID.Value := IBDataSet1YAKIT_ID.Value;
IBDMaliyetYAKITADI.Value := IBDataSet1YAKITADI.Value ;
IBDMaliyetKULLANILAN.Value := KULLANILAN-KALAN;
IBDMaliyetFIYATI.Value := IBDataSet1FIYATI.Value;
IBDMaliyetTUTAR.Value := IBDataSet1FIYATI.Value * IBDMaliyetKULLANILAN.Value;
IBDMaliyet.Post;
IBDataSet1.Edit;
IBDataSet1KALANLITRE.Value := IBDataSet1KALANLITRE.Value - (KULLANILAN - KALAN);
IBDataSet1.Post;
KULLANILAN := 0;
END
ELSE
BEGIN
KALAN := IBDataSet1KALANLITRE.Value - KALAN;
IBDMaliyet.Append;
IBDMaliyetISLETME_ID.Value := IBDataSet1ISLETME_ID.Value;
IBDMaliyetVARDIYA_ID.Value := IBQVardiyaVARDIYA_ID.Value;
IBDMaliyetYAKIT_ID.Value := IBDataSet1YAKIT_ID.Value;
IBDMaliyetYAKITADI.Value := IBDataSet1YAKITADI.Value ;
IBDMaliyetKULLANILAN.Value := KALAN;
IBDMaliyetFIYATI.Value := IBDataSet1FIYATI.Value;
IBDMaliyetTUTAR.Value := IBDataSet1FIYATI.Value * IBDMaliyetKULLANILAN.Value;
IBDMaliyet.Post;
IBDataSet1.Edit;
IBDataSet1KALANLITRE.Value := 0;
IBDataSet1.Post;
IBDataSet1.Close;
IBDATASET1.Open;
END;
END;
IBQAlinanUrunler.Close;
IBQAlinanUrunler.Open;
IBDataSet1.Close;
IBDataSet1.Open;
IBQKullanilan.Next;
END;
IBQAlinanUrunler.Close;
IBQAlinanUrunler.Open;
end;
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365 . Üyesi
Hiç Bir Şey İnsan Kadar
Yükselemez ve
Alçalamaz
Erkan ÇAĞLAR