Fifo Hesabı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Fifo Hesabı

Mesaj gönderen ALUCARD »

Resim

ş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

Re: Fifo Hesabı

Mesaj gönderen ertank »

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.
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: Fifo Hesabı

Mesaj gönderen ALUCARD »

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
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Re: Fifo Hesabı

Mesaj gönderen ALUCARD »

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
Cevapla