Dönem için bakiye deviri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Dönem için bakiye deviri

Mesaj gönderen ertline »

S.A. Arkadaşlar
Programdan yeni bir dönem oluşturup cari kayıtlarını yeni dönemin veritanbanınıa(Firebird) aktarıyorum(ibpump programı ile).Buraya kadar problem yok.Bundan sonra cari kayıt tablosunda bulunan devir alanımda hastanın bakiyesini tutuyorum ve bunu hastanın harekenine dönem deviri olarak aktarmam gerekiyor.
Ben şu şekilde yaptım:

Kod: Tümünü seç

data.hastakayit.First;
repeat
data.carihrk_toplam.Edit;
data.carihrk_toplam.FieldByName('HASTAKODU').AsFloat:=data.hastakayit.fieldbyname('HASTAKODU').AsFloat;
data.carihrk_toplam.FieldByName('TARIH').AsDateTime:=date();
data.carihrk_toplam.FieldByName('TOPLAM_TUTAR').AsFloat:=data.hastakayit.FieldByName('DEVIR').AsFloat;
data.carihrk_toplam.FieldByName('BORCTOPLAM').AsFloat:=data.hastakayit.FieldByName('DEVIR').AsFloat;
data.carihrk_toplam.post;
data.hastakayit.Next;
until(data.hastakayit.Eof);
Bu kod aktarmayı yapıyor ama fazla kayıtta döngüden kaynaklanan bir zaman aşımı hatası veriyor.Bundan dolayıda hatalı aktarım oluyor.
Bunun başka yolu varmı acaba.Döngüsüz ,sql komutlarıyla..

Yardımlarınız için teşekkürler..
"Bilginin Doruğuna Hep Birlikte..."
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bu kodun dogru calistigini zannetmiyorum. Eger ihtiyaci dogru anladiysam tabi....
Zira carihrk_toplam tablosu uzerinde ileri geri gidilmiyor. Hep aynı kayıda farklı hastanın verileri yazılıp duruyor.....
Tabiki bu işi sql ile daha kolay ve hızlı yapabilirsiniz... Fakat tablo yapınızı bilmeye ve o tablolar uzerinde tam olarak yapılacak işlemin tarifine ihtiyaç var.
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Sanırım bir tersilik var hem data.hastakayit dosyasını tarayıp sonra data.carihrk_toplam a atama yapıyorsun. Ayrıca atayacağın tablodaki ilgili kayıta FindKey veya Locate ile ulaşıp öyle atamalısın :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Şimdi hocalarım
kodu düzenleyerek yazıyorum
kodda CARIKAYIT master tablo, CARIHAREKET detail tablo
2005 dönemine ait cari hareket verileri var ve bu hareketlerin toplamları CARIKAYIT tablosununBORC_TOP VE ALACAK_TOP alanlarında tutuluyor, BAKIYE alanına da 2 sinin farkı yazdırılıyor.
şimdi 2006 dönemi için bir boş database oluşturdum ve ibpump programı vasıtasıyla CARIKAYIT tablosunu yeni databaseye aktardım, yeni databasede CARIHAREKET ler boş bu carihareket tablosuna 2005 döneminin cari toplamlarını aktarmam gerekiyor onlarda 2005 ten 2006 ya aktardığım CARIKAYIT tablosunun BORC_TOPLAM VE ALACAK_TOPLAM alanlarında tutuluyordu.
Ben de bir döngü vasıtasıyla bu BORC_TOP VE ALACAK_TOP ALANLARINdaki verileri 2006 döneminin CARIHAREKET tablosuna yeni kayıt olarak (dönemi deviri) aktarmaya çalışıyorum ama döngüden kaynaklanan zaman aşımı hatası veriyor yaklaşık 4000 cari kaydı var.

Kod: Tümünü seç

data.carikayit.First;
repeat

data.cariharaket.insert;
data.cariharaket.FieldByName('KNO').AsFloat:=data.carikayit.fieldbyname('KNO').AsFloat;
data.cariharaket.FieldByName('TARIH').AsDateTime:=DATE();
data.cariharaket.FieldByName('ACIKLAMA').AsString:='Dönem Deviri';
data.cariharaket.FieldByName('OEDEME_TIPI').AsString:='Nakit';
data.cariharaket.FieldByName('BORC').AsFloat:=data.carikayit.fieldbyname('BORC_TOP').AsFloat;
data.cariharaket.FieldByName('ALACAK').AsFloat:=data.carikayit.fieldbyname('ALACAK_TOP').AsFloat;
data.cariharaket.post;

data.carikayit.Next;
until(data.carikayit.Eof);
Bu işlemi daha farklı nasıl yapabilirim.Sql ile olabilir gibi sanki ama nasıl yapılacağı konusunda hiç bir fikrim yok.

İlginiz için çok tşk. ederim.
Allah Razı Olsun.
"Bilginin Doruğuna Hep Birlikte..."
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Öncelikle şunu belirtmeliyim. Daha önce de forumda geçmişti. Bu tür kullanımı tasvib etmiyorum. Yani yeni bir yıla geçişte eski yeni veritabanı oluşturma eski yılın verilerini ayri bir veritabanıdna yedekleme vs....
Bu tamamen ilk nesil muhasebe yazılımlarından kalma bir alışkanlık. O zamanki veritabanı sistemlerinin yetersizliği nedeni ile boyle bir yontem geliştirilmiş. Hala devam etmekte..
Fakat artık kullandığımız yeni nesil veritabanları ki zaten Firebir kullanıyorsunuz buna ihtiyac duymaz. Yani bırakın butun yılların verileri aynı veritabanında dursun... Nasilsa her islemin bir tarihi var... Boylece eski kayıtlara ulasılacagı zaman haydiii yedekleri kurcala o veritabanını yukle derdi yok... Gezmis yıllarla mukayeseli rapor almak hiç dert degil... Her firma icin farklı DB de yanlis tabi. Konsolide rapor almayi neredeyse imkansiz hale getirmekte zira.. vs.. vs....
Farkli firmalar soz konusu ise en tepede bir Firma tablosu olup firma bazındaki butun tablolara buradan bir foreing key gonderirsiniz butun tablolar firma detayında olur. Yıl meselesi zaten dert degil butun islermleriniz tarih bazında...

Simdi yukarida bahsettigim işin ideali... Fakat şu an dereyi geçiyorum at değiştiremem söz ilk fırsatta değiştiricem diyorsanız o zaman bu derenin geçişindeki probleme gelelim... Eğer anlattığınızı doğru anladıysam aşağıdaki SQL cümlesi işinizi görür... Yedek aldığınız bir DB ustunde denersiniz olmayan yerlerini belki duzenler veya tekrar sorabilirsiniz...
carikayit tablosundaki kayit sayisi kadar kayit bu kod ile carihareket tablosuna insert edilmiş olacak.

Kod: Tümünü seç

insert into carihareket(KNO,TARIH,ACIKLAMA,ODEME_TIPI,BORC,ALACAK)
Select KNO, current date,'Donem deviri','Nakit',BORC_TOP,ALACAK_TOP
from carikayit
Firebird de o gunun tarihini veren fonksiyondan emin degilim current date olarak yazdim. Farkli bir fonksiyon ise o kısmını düzeltmelisiniz...

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Bence iyice karışıyor :idea: Hangisine neyi aktaracağın ve aktaracağın tablodaki kayıta yukarıda söylediğim yollarla ulaşmamışsın. :!: Yada soru ve sorun tam anlaşılmıyor.

Şöyle bir genel yapı ile de sorunu kısa yoldan çözebilirsin :!:

Mevcut bilgilerin olduğu tabloya diğer tablodaki bir alanı aktarma:

Kod: Tümünü seç

UPDATE mevcut_tablo
set mevcut_tablodaki_alan = 
    (select aktarilacak_alan from aktarilacak_tablo 
     where anahtar_alani = mevcut_tablo.anahtar_alani)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Fahrettim hocam Allah Razı olsun
verdiğiniz sql tam işime yaradı.Söylediğiniz doğru yani devir işlemi yapmadan hep aynı database ile devam etmek özellikle raporlama açısından çok güzel. Fakat hocam veritabanı boyutu 1 yılda 350 Mb oluyor bu programı 10 yıl kullandıklarını ve devir yapmadıklarını varsayarsak veritabanı boyutu baya bir büyüyor.Bu yıl 20 senede olabilir.O zaman acaba problem olmaz mı? Bu konuda tereddüt yaşadığımdan bu şekilde bir devir işlemi yapma ihtiyacı yaşıyorum.
Bu konudaki fikirlerinizi bekliyorum hocam.

Hocam bir de aşağıdaki kod çok güzel çalışıyor fakat ben carihareket in tarih alanına sistemin tarihini koymak istiyorum, ACIKLAMA ve ODEME_TIPI ALANLARINA da dışarıdan yani kodla veriyi girmek istiyorum(Dönem Deviri, Nakit) bunu nasıl yapabiliriz.

Kod: Tümünü seç

ekle.Close;
ekle.SQL.Clear;
ekle.SQL.Add('insert into carihareket(KNO,TARIH,ACIKLAMA,ODEME_TIPI,BORC,ALACAK)');
ekle.SQL.Add('Select KNO,date,Dönem Deviri,Nakit,BORC_TOPLAM,ALACAK_TOPLAM from carikayit');
ekle.ExecSQL;
aşağıdaki işlemi sql de nasıl yapabilkiriz.

Kod: Tümünü seç

data.cariharaket.FieldByName('TARIH').AsDateTime:=DATE(); 
data.cariharaket.FieldByName('ACIKLAMA').AsString:='Dönem Deviri'; 
data.cariharaket.FieldByName('OEDEME_TIPI').AsString:='Nakit';

Yardımlarınız için çok tşk. ederim[/code]
"Bilginin Doruğuna Hep Birlikte..."
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.
Ben tek DB kullanılmasının çok sağlıklı olduğunu düşünmüyorum.Eski sistemlerde veritabanı ne kadar yetersizse şimdiki sistemlerde de o kadar yetersiz denebilir.Önceden tek büro içinde 2-3 makinayı geçmeyen sistemler ağırlıktayken artık dünyanın herhangi bir yerinden kablosuz erişim sözkonusu..Keza o dönemlerin "esnaf" kitlesi artık kurumsallaştı ve potansiyel olarak ciddi bir noktaya geldi.Bugün 100-150 kullanıcının cirit attığı, günde 5-10 bin kaydın işlendiği bir sistemde FireBird birkaç yıl sonra sizi yarı yolda bırakır (kesin bir hüküm değil elbette..).Kaldı ki yazılım mühendisliğinde proje geliştirmenin temel tekniği, "böl-parçala-yönet" 'tir vs.vs.

Kolay gele..
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

bLue aLonE yazdı:.Kaldı ki yazılım mühendisliğinde proje geliştirmenin temel tekniği, "böl-parçala-yönet" 'tir vs.vs.
Ben de tam tersine bir politika izliyorum ve her zaman veri tabanın tek dosya halinde kalmasını sağlayacak şekilde sistemi hazırlıyorum. Örneğin böyle dönemsel çalışmayı gerektirecek bir durum varsa dönemler diye bir tablo oluşturur ve dönemid ve dönemadi isimli alanlar yaratırım. Daha sonra hareketlerin dönemid lerini belirler ve buna göre verilerimi gösteririm. Bu kullanıcıya çok büyük bir esneklik ve kolaylık sağlar. Programın herhangi bir yerinde iken dönemler arasında geçiş yapabilir.

Bu şekil bir çalışma özellikle raporlamada ve istatistiki bilgileri edinmede çok işe yarar.

Diğer türlü veri tabanını 10 parçaya böldüğünüzde tüm dönemleri kapsayan bir rapor almak veya grafik çıkarmak ölümden farksız olur.

Tabloların satırca artması ile birlikte dönemlerine göre iyi bir indexleme yapılması gerekir elbette.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@Ali Erdoğan;

Tümleşik kodlama ve standardizasyon temelli geliştirilen büyük projelerde zaten böl-parçala-yönet tekniğini kullanmazsan, sistemi yönetmek için olması gerekenden kat kat fazla emek harcarsın..Bu, rastgele tespit edilmiş bir olgu değil, evrensel bir yöntemdir ve büyüdükçe sorun çıkarmayan tüm büyük projelerde bu yöntemi görebilirsin.Bir analizi gerçekleştirip kullanıcıya bunu sunmak hangi tekniği kullanırsan kullan çok fazla emek gerektiren bir iş değil vs.vs.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Kod: Tümünü seç

insert into carihareket(KNO,TARIH,ACIKLAMA,ODEME_TIPI,BORC,ALACAK)
Select KNO, current date,'Donem deviri','Nakit',BORC_TOP,ALACAK_TOP
from carikayit
Zaten bu yazdigim kodda dikkat ederseniz. 'Donem deviri' ve 'Nakit' sabit degerler. Fakat siz delphi koduna cevirirken tırnak isaretlerini attiginiz icin alan adi muamelesi gorecekler ve zaten hata verirler...

Kod: Tümünü seç

ekle.SQL.Add('insert into carihareket(KNO,TARIH,ACIKLAMA,ODEME_TIPI,BORC,ALACAK)');
ekle.SQL.Add('Select KNO,date,'+Quetedstr('Dönem Deviri')+','+ Quotedstr('Nakit')+ ',BORC_TOPLAM,ALACAK_TOPLAM from carikayit');
ekle.ExecSQL; 
Sytax hatasi olaiblir belki ama bunun gibi bir kod olmali...

Veritabani boyu meselesine gelince.... Acikcasi kafamda canlanan projenizin capina gore yilda 350 MB cok fazla.... Resim filan mi var DB de? Ya da bir tasarim problemi mi bilemiyorum.... Fakat nihayetinde sonuç şu ki veritabanlarının görevi zaten bu... 20 yılda 7 GB a ulaşan dunyadaki tek proje sizinki degil. Daha buyuk verileri halen olan projeler bu işi tek DB uzerinde tutabilmekte... Tabi bu çapta data ile DB server uğraşır uğraşmasına da iyi bir makina da şart...
Ben bu gune kadar hic sirket ya da yıl icin farkli DB kullanmadim, kullanmam da acikcasi... Eğer proje büyükse her yıl yuzlerce MB veri birikiyorsa. O zaman ilgili musteri bu yukun altında kalabilecek capta bir DB server ve onu uzerinde calisacagi guclu sunucu veya sunucularin maliyetine katlanmali....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Fahrettin hocam date te hata veriyor yazımı için

Kod: Tümünü seç

'+Quotedstr('date')+'
'+Quotedstr(date)+'
'+Quoteddate(date)+'
date
current date
denedim olmadı
sadece Tarih alanı kaldı.

Yardımlarınız için teşekkürler...
"Bilginin Doruğuna Hep Birlikte..."
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

En sonunda da onuda buldum
Şu şekilde oluyormuş

Kod: Tümünü seç

'+QuotedStr(datetostr(date))+'
Allah razı olsun Fahrettin abi ve bütün delphiturkiye üyeleri.
"Bilginin Doruğuna Hep Birlikte..."
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

date icin Qoutedstr fonksiyonu kullanmamaliydiniz. Sadece date yeterliyid benim yazdigim koddaki gib..... Zira bu fonksiyonun amaci string degerlerin tırnaklarını sql icine gomebilmek.... Neyse datetostr de date degerini stringe cevirdigi icin is cozulmus....
Cümlemizden.....
Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Hocam aşağıdaki kod çok güzel çalışıyor.

Kod: Tümünü seç

ekle.Close;
ekle.SQL.Clear;
ekle.SQL.Add('insert into tl_cariharaket(KNO,TARIH,ACIKLAMA,ODEMETIPI,BORC,ALACAK)');
ekle.SQL.Add('Select KNO,'+QuotedStr(datetostr(date))+','+Quotedstr('Dönem Deviri')+','+ Quotedstr('Nakit')+ ',BORC_NAKIT_TOP,ALACAK_NAKIT_TOP from carikayit');
ekle.ExecSQL;
bir de buna ek olarak; yukarıda cariharekete kayıt eklendikten sonra her cari için toplam aldırabilmemiz acaba mümkün mü?
Yani cariharekete kayıt eklendikten sonra aşağısına borc_toplam, alacak_toplam ve bakiye alanlarına bunu toplatabilirmiyiz?
ben

Kod: Tümünü seç

ekle.Close;
ekle.SQL.Clear;
ekle.SQL.Add('insert into tl_cariharaket(KNO,TARIH,ACIKLAMA,ODEMETIPI,BORC,ALACAK)');
ekle.SQL.Add('Select KNO,'+QuotedStr(datetostr(date))+','+Quotedstr('Dönem Deviri')+','+ Quotedstr('Nakit')+ ',BORC_NAKIT_TOP,ALACAK_NAKIT_TOP from carikayit');

ekle.SQL.Add('Select SUM(BORC),SUM(ALACAK) from carihareket');

ekle.ExecSQL;
şeklinde denedim ama bir sonuç vermedi
"Bilginin Doruğuna Hep Birlikte..."
Cevapla