detail tablosuz detail yapısı

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

detail tablosuz detail yapısı

Mesaj gönderen kadirkurtoglu »

s.a.

arkadaşlar başlıktan anlaşılacağı üzere master-detail diye 2 tablo olmadan tek tablo ile bazı kayıtları master bazı kayıtları detail göstereceğiz.

Kod: Tümünü seç

100 Kasa   100,00
  100 001 Merkez Kasa   50,00
  100 002 Şube Kasa     50,00
yapı bu yazdığım gibi bunların tamamının aynı tabloda olması gerekiyor. yani tek tablo. bahsetmiş olduğum yapıyı fbsql server vt ile kurmam için nasıl bir yol izlemem gerekiyor. procedure veya trigger hangisi uygun olursa bununla ilgili örnek yapımı lazım.
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Bence yapmak istediğinizde bir zorluk olmaz. Sadece hesap ve alt hesapların konumları(pos) aynı yerde olsun yeter. Gerisi like ve % ye kalmış bir şey.

Kolay gelsin.
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

..
En son kadirkurtoglu tarafından 26 Eki 2005 03:05 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

kardeş bu yapı biraz karışık yani önceden alt hesaplar belli değildir.
ve bu yapı

Kod: Tümünü seç

100 Kasa 260,00
  100 001 Merkez Kasa 80,00
     100 001 001 Merkez 1 Nolu Kasa  20,00
     100 001 002 Merkez 2 Nolu Kasa  60,00
  100 002 Şube Kasa 180,00
     100 002 001 Şube 1 Nolu Kasa  40,00 
     100 002 002 Şube 2 Nolu Kasa  90,00
     100 002 003 Şube 3 Nolu Kasa  50,00
bu şekilde devam edecek. tabi hesabın açılması sırasında hangi hesaba dahil olacağı belirlenecek. yani bu işi trigger veya procedure ile mümkün ancak izlenecek yolu kestiremiyorum.
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
procedure falan demişsiniz. Ben size mesaj atarken şöyle düşünmüştüm.
hesap kodunun alanını verdiğiniz örneğe göre varchar(11) verirseniz. Ve
İlk üç karakter daima ana hesap
5-8 arası daima grup hesap
9-11 arası daima alt hesap olarak verirseniz bence istediğinizi alabilirsiniz.

Mesela merkez kasayı almak için de

Kod: Tümünü seç

select sum(tutar) from deneme where hes_kod like '100 001%' 
gibi bir kod ile alabilirsiniz. Komutta eksiklik olabilir.
Kolay gelsin. Benim aklıma gelen bu. Daha profesyonel bir şey için bilgili arkadaşlarımız umarım size bir fikir verirler.

Kolay gelsin.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

kadirkurtoglu yazdı:kardeş bu yapı biraz karışık yani önceden alt hesaplar belli değildir.
Alt hesaplar belli olmayabilir. Siz eklerken 100 001 099 şeklinde bir alt hesap girdiğiniz gibi 001 grubuna dahil etmiş oluyorsunuz. Yani önceden tanımlı olmasına gerek yok. Sonuç alırken tek bilmeniz gereken değeri alınacak hesap aralığı.

Kolay gelsin.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,
bunu tamamen VT seviyseinde çözmek biraz zor gibi görünüyor benzer bir yapıyı kurmuştum, aynı tabloları sorgulayan datasetleri birbirine bağlayarak GROUP BY fonksiyınunu kademelendirerek yapmıştım.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

hesap açılırken hesapları kategoriye sokarak çözebilirmiyim diye düşündüm. Şöyleki:
vt de hesap_kategori isimli field tanımlayıp

Kod: Tümünü seç

1 100 Kasa 260,00 
  2 100 001 Merkez Kasa 80,00 
     3 100 001 001 Merkez 1 Nolu Kasa  20,00 
     3 100 001 002 Merkez 2 Nolu Kasa  60,00 
  2 100 002 Şube Kasa 180,00 
     3 100 002 001 Şube 1 Nolu Kasa  40,00 
     3 100 002 002 Şube 2 Nolu Kasa  90,00 
     3 100 002 003 Şube 3 Nolu Kasa  50,00
1 = sum(2)
2 = sum(3)

burda 1 ana hesap 2 alt hesap 3 ayrıntı alt hesap şeklinde
yani hesabın ne türde olduğunu belirlemek. ancak bu ne kadar çözüm olur bilemiyorum. fikirleri olan arkadaşlardan fikirlerini bekliyorum....
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.
Kemikleşmiş bir muhasebe programı olan GMSS2'nin hesap planı yapısını incelerseniz hesabın detay hesap mı ana hesap mı olduğu, girişi esnasında belirleniyor.Bence bu noktada sizin işinizi kolaylaştırmak adına bir de detay hesaplar için ait olduğu ana hesabı belirten bir alan eklenmeli ve sorgulamalar buna göre yapılmalı.@Ofenx'in bahsettiği gibi like ile olayı ile de stabilleştirebilirsiniz.İlk üç karakterini alıp ana hesabın tutarını, karakterlerin devamını kullanarakta detay hesapların toplamlarını hesaplayabilirsiniz fikrimce.

Ek olarak bu tür işlemler için belirttiğiniz gibi SP kullanmak en iyi yöntem diyebilirim.
Kolay gele.
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

son olarak aklıma geln bir fikirle

1- hesapların belirleneceği ana hesap için Master Tablo
2- alt hesapların belirleneceği detail tablo
3- alt detay hesapların belirleneceği subdetail Tablo(Detaylar Çoğaltılabilir)

bu üç tabloda sadece hesaplar belirlenecek

hareket olarak bir bağımsız tabloya bu hesap kodları işlenecek ve burdaki değerler ilgili yukarıdaki tablolara yazılacak. bu işlem daha mantıklı gibi geldi bana. denemelere başladım. sonucu buraya yazacam.
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ben bahsettiğiniz yapıza bir Muhasebe Mizanı yapmıştım ekran görüntüsü şöyle,
Resim


yapıda size fikir verecektir.

Kod: Tümünü seç

procedure TmizanRapor.Query1CalcFields(DataSet: TDataSet);
var
qSorgula:TQuery;
Temp:AnsiString;
begin

   if yer=1 then
   begin
   Temp:='select sum(tutar) from mhsfisi where YEAR(fistar)='+''''+genelmizan.edit16.Text+'''';
   if genelmizan.ComboBox3.ItemIndex=0 then
   Temp:=temp+' and MONTH(fistar)<='+''''+genelmizan.edit11.Text+'''' else
   Temp:=temp+' and MONTH(fistar)='+''''+genelmizan.edit11.Text+'''';
   if genelmizan.ComboBox2.ItemIndex=0 then
   Temp:=Temp+' and fistip<>4';
   Temp:=Temp+' and ba=:ba';
   Temp:=Temp+' and LEFT(heskod,:uzunluk)='+''''+Query1heskod.AsString+'''';
   end else

   begin
   Temp:='select sum(tutar) from mhsfisi where fistar>=:t1 and fistar<=:t2';
   if donemselmizan.ComboBox2.ItemIndex=0 then
   Temp:=Temp+' and fistip<>4';
   Temp:=Temp+' and ba=:ba';
   Temp:=Temp+' and LEFT(heskod,:uzunluk)='+''''+Query1heskod.AsString+'''';
   end;


   try
     qSorgula:=TQuery.create(nil);
      with qSorgula do
       begin
         if yer=1 then
         begin
         DatabaseName:='dbsm';
         close;
         sql.clear;
         sql.add(Temp);
         Params[0].AsString:='B';
         Params[1].AsInteger:=Length(Query1heskod.AsString);
         Active:=true;
         Query1borc.AsCurrency:=qSorgula.fields[0].AsCurrency;
         Active:=false;
         Params[0].AsString:='A';
         Params[1].AsInteger:=Length(Query1heskod.AsString);
         Active:=true;
         Query1alacak.AsCurrency:=qSorgula.fields[0].AsCurrency;
         Active:=false;
         end else
         begin //dönemsel mizan
         DatabaseName:='dbsm';
         close;
         sql.clear;
         sql.add(Temp);
         Params[0].AsDate:=donemselmizan.DateTimePicker2.date;
         Params[1].AsDate:=donemselmizan.DateTimePicker1.date;
         Params[2].AsString:='B';
         Params[3].AsInteger:=Length(Query1heskod.AsString);
         Active:=true;
         Query1borc.AsCurrency:=qSorgula.fields[0].AsCurrency;
         Active:=false;
         Params[0].AsDate:=donemselmizan.DateTimePicker2.date;
         Params[1].AsDate:=donemselmizan.DateTimePicker1.date;
         Params[2].AsString:='A';
         Params[3].AsInteger:=Length(Query1heskod.AsString);
         Active:=true;
         Query1alacak.AsCurrency:=qSorgula.fields[0].AsCurrency;
         Active:=false;
         end;
       end;
   finally
     qSorgula.free;
   end;
Tek bir tablodan elde ediyorum bu sonucu.
kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

hocam tam olarak istediğim bu gönderdiğiniz yapı. ancak bu yapı bilanço görüntüsünde mizan yani 1 ve 10 değerlerine gerek yok ancak bilançoda lazım yani burdaki mantık şu; ben muhasebe ihtisaslı olduğum için tam terimsel yapıya değilde mantık yapısı hakkında genel fikir vermek anlamında örneklendirmiştim. ama yukarıdada yazdığım gibi tam olarak istediğim yapı bu hocam

1 Ana Grup
10 alt grup
100 ana hesap
100 01 alt hesap
100 01 001 alt detay hesap

kodlardan dolayıda çok teşekkür ediyor. Allah Razı olsun diyorum.. Ellerinize Sağlık
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Zamanında yapmış olduğum "Bütçe Hesap Planı" programında ben hesap kodlarını şu şekilde vermiştim. Belki yardımcı olur.
01 00 000 000 Ana Hesap
01 01 000 000 Alt Hesap
01 01 001 000 Detay Hesap
01 01 001 001 Alt detay hesap
Bu yapıya göre oluşturduğum tablo yapısında ilk alana ANA_HESAP ikinciye ALT_HESAP .. vs. şeklinde isim vermiştim. Bir kayıtın ANA HESAP olup olmadığını sonraki alanın yani ALT_HESAP alanının sıfır olup olmadığından ayırt ediyordum. Belki başka bir fikir verir :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

volkan hocam mizan örneğinizde mizan toplamlarına bakıldığında mizan yanlış görünüyor. tabi bu durum deneme olduğu için olabilir. ben sizin yazdığınız kod u biraz inceledim. ancak peki bişey anlamadım. çünkü arada başka sorgular var. temp ile aradaki boşlukları buluyoruz. query ile sorgulama felan o kısmı anladım. ama yapıyı gruplayan kısmını anlamadım.

bir diğer konu bu anlattığım yapı aslında vt de yapılması en zor olan yapıdır.

100 değişmez hesaptır bilanço esasındaki hesap planında ve kasa yı temsil eder. dolayısıyla burda bir problem yok. ancak kullanıcı hesapları derinleştirmek amacıyla ve teferruat açısından alt hesap açma ihtiyacı hisseder ancak alt hesap 1 değil birden fazla sayıda açılmalıdır. çünkü 100 kasaiken siz 100 01 kasa demenizin bir manası yoktur. keza aynı şekilde 100 01 merkez kasa iken 100 01 01 hesabı açıp 1nolu merkez kasa demenin bir manası yoktur. alt hesaplar açılırken ayrıştırma, teferruatlandırma maksatlı açılır. bunları niye yazıyorsun derseniz. yapmak istediğim yapıdaki mantığı anlatmak maksatlıdır.

Kod: Tümünü seç

100 anahesap   
  100 01 alt hesap  
     100 01 01 alt detay hesap   120,00 YTL değer girilebilir hesap
     100 01 02 alt detay hesap     80,00 YTL değer girilebilir hesap
  100 02 alt hesap 
     100 02 01 alt detay hesap    230,00 YTL değer girilebilir hesap
     100 02 02 alt detay hesap      20,00 YTL değer girilebilir hesap
bu yapıdaki hesaplardan sadece en altta bulunan hesaplara değer girilebilir. diğer hesaplar alt hesapların toplamlarından oluşur. 100 nolu hesap altında bulunan bütün hesapların toplamını ihtiva eder. 100 01 de aynı şekilde kendi alt hesaplarının toplamından oluşur.
ve bu yapıda alt hesaplar açılırken daha önce ana hesaba değer girilmiş ise ana hesaptaki değerin belirlenecek alt hesaba aktarılması gerekmektedir. aksi halde doğru sonuç ortaya çıkmaz. bu kadar yazdım hem kafam hemde ellerim yoruldu. oruçlu olunca insan kafası durma noktasına geliyor... :lol:
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,
evet mizan deneme amaçlı sağlıklı bir mizan değil. :)
yukarıda gördüğünüz yapı Hesap planı tablosuna eklenmiş hesapalana sahaların her bir satırda OnCalcField olayında hesaplanıyor.
yani çözüm VT seviyesinde bir çözüm değil. aslında üzerinde hç bir rakam olmayan heap planını listesi rakamların hepsi heaplanan saha.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla