Farklı databaselerdeki ortak alana göre genel toplam almak..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Farklı databaselerdeki ortak alana göre genel toplam almak..

Mesaj gönderen Biltes »

Arkdaşlar merhaba;

Son derece ciddi bir sorun ile karşı karşıyayım. Mysql vt kullanıyorum. Burada Şirket1, Şirket2, Şirket3 gibi database'lerim var. Bu databaselerin her birinde benim rapor almak istediğim işlemin giriş formunda ilk olarak dönem seçiliyor ve bu döneme göre detay'a bilgiler giriliyor. Nedir bu bilgiler id,ad,soyad,tcno,bagkurno,borç,alacak vs... donem tablosunda ise id ve dönemadı var. Dönem tablosundaki id ile bilgitablosundaki id alanı bir birine eşit olarak çalışıyor. Bu yukarıda bahsettiğim olay şirket1,şirket2,şirket3 adlı databaseler içinde geçerli.

Her şirkette çalışırken normal olarak dönem'e göre bilgi tablosu ile alakalı her türlü raporu alabiliyor. Ama benim burada yapmak istediğim olay herhangi bir şirkette iken tüm şirketlerin seçtiğimiz dönem adına göre arka arkaya eklenmiş bilgilerinin genel bir listesini hazırlamak istiyorum tabi burada borç hanesini ve alacak hanesini de tüm şirketleri baz alarak toplamasını istiyorum. Yani bir çeşit genel toplam olayı.

Biraz uzun yazdım ama umarım detaylı bir şekilde anlatabilmişimdir. Projeyi yaptım yaptım buraya geldim tıkandım. Bana nasıl bir çözüm yolu önerebilirsiniz yada bu işlemi ben nasıl gerçekleştirebilirim arkadaşlar. Yardımlarınız için şimdiden çok tşk ediyorum.

Saygılar....
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

merhabalar belki sorununuza çözüm olmaz ancak ben de bu tür yapıda program geliştirdim. misal 2005 yılı kayıtlarının sum değerleri 2006 yılı datasına devir olarak aktarıyorum. bu süreç böle devam edip gidiyor. dolasıyla da diğer şirket datalarına bağlanmak gibi bir olayınız da ortadan kalkıyor. zaten size de bir önceki dönemin sum edilmiş genel toplamları lazım..
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Öncelikle cevap için çok tşk ediyorum. Evet normal şartlarda dediğiniz gibi olabilir ama bu şirketler bir yıl içinde kullanılan şirketler yani yıl sonu bitir öbür tarafa aktar olayı bunda maalesef geçerli olmuyor hepsi aynı yıl içinde faal olarak çalıştığı için o şekilde bir çözüm yolu yapamayız bu durumda. İlginiz için çok tşk ediyorum...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
kara_kule06
Üye
Mesajlar: 150
Kayıt: 18 Nis 2006 02:15
Konum: ankara/polatlı
İletişim:

Mesaj gönderen kara_kule06 »

Eğer program design aşamasında kaç adet database olduğunu biliyorsa,(Yani runtime iken DB oluşturmuyorsan) yapman gereken ayrı bir forma 3 şirketin Db'si için 3 ayrı connection nesnesi eklemek. Bundan sonrası tahmin edeceğin gibi basit. Listele dediğin zaman sırasıyla her DB deki sorguları çalıştır ve dönen değerleri topla ve Bir değişkene yazdır(bu bir memotable de olabilir). Burdanda 3 şirketin yıllık toplam karı/borcu/alacağı(sana kalmış) gibi bilgileri raporlayabilirsiniz.

Benim sorunuzdan anladığım kadarıyla bunu yapmak istiyorsunuz galiba.

Kolay Gelsin...
İlim öğrenmek akıntıya karşı yüzmek gibidir. Ara verildiği zaman gerilenir...
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

böyle bir olayı bende yaşamıştım..aklıma iki çeşit yöntem geldi..raporun ayrıntısını ve programı nasıl tasarladığını bilemediğim için kabaca anlatayım..önce şirket 1'i database ine bağla ve sql ile raporunu oluştur dönen sonucu bir tmp tabloya aktar tmp tabloda birde şirket diye field olsun her satırı temp tabloya yazarken şirketin kodunuda aktar.sonra şirket 1'i disconnect edip aynı işlemi şirket2 için yapıp tmp tablonun sonundan yazmaya devem et v.s tüm şirketlerden oluşan raporu tmp tabloya yazdıktan sonra raporlama bileşeninden raporu oluştur.şirkete görede gruplama yap.group footer ve page footer ile hem şirket bazındatoplam hemde tüm şirketlerin toplamını yazdır(fastreport ile kolayca yapabilirsin bilmiyorum ne kullanıyorsun) 2.yöntem formuna 3 tane databese koy(şirket sayısı kadar) ve hepsini ayrı bir şirkete bağla,onlara bağlıda birer query koy.raporunu 3 query'dede oluştur.ister bu üç qurydede rapor bileşeninin datasetlerini bağla ve ister her şirketi ayrı sütunda göster ister alt alta...

belki anlatamamışımdır ama bu kadar bilgiyle bu kadar oluyor.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Öncelikle cevaplar için çok soalsun...
Karakule arkdaşımız, kaç adet database olduğu biliniyorsa demiş ama maalesef bu sayı 3'te olabilir 40'ta o bakımdan o şekilde bir yol izleyemeyiz.
Serkan arkdaşımızın dediği ise biraz daha mantıklı aynı olayı forma yazdıktan sonra benimde aklıma geldi ama bu sefer o fikirde başka bir yerde takılı kaldım. Arkdaşımızın dediği gibi tmptable oluşturup buraya aktarmak mantıklı sırayla şirketleri ama diyelimki kullanıcı 5 şirket aktardı oldu da 2. aktardığı şirketteki bilgilerde hata gördü ve düzenledi bunu otomatik olarak tmptable'a nasıl atarız. Eğer tekrardan yapmak gerekirsa o da yanlış bir işlem olmaz mı acaba?

Bu konu nasıl olabilir peki arkadaşlar?
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

yani diyelimki 2.şirkette ahmet ak denilen müşterinin bakiyesi gözüküyo ama ödeme yapmıştı ve kullanıcı girmeyi unutmuş.sonra raporu kapatacak gidecek ahmet ak dan ödeme alacak.sonra raporu yeniden alacak.sen her raporu alırken tmp tabloyu sileceksin veya memtable'sa zaten form kapanınca oda silinecek.yani her rapor alımında güncel bilgiler gelecek.burda bir yanlışlık görenedim ben.
Kullanıcı avatarı
kara_kule06
Üye
Mesajlar: 150
Kayıt: 18 Nis 2006 02:15
Konum: ankara/polatlı
İletişim:

Mesaj gönderen kara_kule06 »

Bu işlem için ayrı bir tmptable değilde programın veri tabannda olan bir adet tablo oluştur. ve serkanın dediğini uygula. Ve şirketlerin herhangi bir kaydında değişiklik yaptığında tüm şirketlerin değerlerini tutan tabloyu da update et.
Böylece şirkete bir kayıt eklediğinde veya düzeltme veya çıkarma yaptığında tüm şirketlerin değerlerini tutan tablo da otomatik olarak update edilmiş olur.

Bunun için bir fonksiyon yapman daha kullanışlı olacaktır.

Kolay Gelsin.
İlim öğrenmek akıntıya karşı yüzmek gibidir. Ara verildiği zaman gerilenir...
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Serkan hocam yanlışlık olarak yani o şekilde yapsak bir sorun olur mu anlamında sordum ben ama dediğinizi gibi olacak.
Karakule hocamın da fikirlerini değerlendirerek mantıkta olayı çözdüm şimdi ise iş kodlamaya geldi.

Allah şimdiden yardımcım olsun :(

Yardımlar için çok tşk ediyorum hocam..
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Serkan, Karakule hocalarım söylediğiniz şekle göre mantığı kafamda oturttum ama gelelim koda dökemiyorum. Serkan hocam ben böyle bir olay hazırlamıştım dedi acaba bu bölüm ile ilgili bir kod örneği verebilirmisiniz hocam. Artık kafam durmuş şekilde.... :(
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

hocam vaktim yok müsait olunca veririm ayrıntıtısını ama yöntem olarak şirket bilgilerini ve yollarını tuttuğun bir tablon vardır mutlaka..

Kod: Tümünü seç

procedure Tform1.Button1Click(Sender: TObject);
begin
sirkettablo.first;
while not sirkettablo.eof do begin\\şirket tablosunun sonuna gelene kadar
database.close;
database.databasename:=sirkettablo_path.text;\\veritabanı yolu şirket tablosundaki aktif şirketin yolu olarak ata.
database .open;\\database'i aç.böylece şirket listesinde en üstte bulunan şirkete bağlandın.

raporquery1.close;
raporquery.selectsql.clear;
raporquery.selectsql.add('select * from cariler');\\ sen rapor sorgunu yazacaksın.
raporquery.open;
raporquery.first;
while not raporquery.eof do begin\\şirketA için oluşan raporun sonuna gelene dek..
TMPTablo.append;
TMPTabloHESAPKODU.TEXT:=raporqueryhesapkodu.text;\\Raporda oluşan sonucu TMP tablo yazıyorsun.
....
....
tmptablo.applyupdates;
raporquery.next;
end;\\ ilk şirket için oluşan raporu TMPTabloya yazdık...
sirkettablo.next;\\sonraki şirkete geç.
end;
Raporu gösteren kodları yaz...
end;
ben firebird ve ibx componentlerine uygun kod yazdım sen mysql' e uyarlarsın..
En son serkan tarafından 16 Kas 2006 12:56 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
iqprog

Mesaj gönderen iqprog »

hadi yine iyisin, al sana çözüm.

mysqlde örneğin select * from tablename yazdın veriler geldi. ama sen bunu
select * from databasename.tablename diye de yazabilirsin. çaktın köfteyi. bundan sonrasını çözmüş olmalısın. ama yine de açayım biraz daha , yani birden fazla databaseden tek sql ile sonuç alabilirsin.

örnek :

select ... donem1.carihar
union all
select ... donem2.carihar
union all
select ... donem3.carihar

ne oldu 3 dönemin cari hareketlerini tek sql ile çektin.

tabi esas uzun sqlini sen yazacaksın ama olta burada işde. balığı da sen tut.
En son iqprog tarafından 16 Kas 2006 10:55 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

evet hocam dediğiniz gibi oltalarımı attım pür dikkat denize bakıyorum insşallah balığı yakalayacağız.

Yardımlarınız için çok tşk ediyorum....
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Arkadaşlar tekrar merhaba;

biraz ilerleme kaydettik fakat ne yaptıysam ne ettiysem aşağıdaki kod sonsuz döngüye giriyor. Acaba benim bir yerlerde göremediğim bir hata mı var bir de siz bakarmısınız?

Kod: Tümünü seç

        ltable.close;
        ltable.SQL.Clear;
        ltable.SQL.Add('Select * From makbuz where id1=:id');
        ltable.Params[0].AsInteger := dtableid.AsInteger;
        ltable.Active := True;
        ltable.First;

        rxm.Open;
        while not ltable.Eof Do
          Begin
            rxm.Append;
            rxmunvan.AsString := ltableunvan.AsString;
            rxm.Post;
          End;  
        ltable.Next;
Şimdiden çok tşk ederim...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

Selam
syntax hatası var..

Kod: Tümünü seç


 ltable.close; 
        ltable.SQL.Clear; 
        ltable.SQL.Add('Select * From makbuz where id1=:id'); 
        ltable.Params[0].AsInteger := dtableid.AsInteger; 
        ltable.Active := True; 
        ltable.First; 

        rxm.Open; 
        while not ltable.Eof Do 
          Begin 
            rxm.Append; 
            rxmunvan.AsString := ltableunvan.AsString; 
            rxm.Post; 
           ltable.Next;
          End;  

        
Cevapla