Özet Tablo Almak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
deep_dream
Üye
Mesajlar: 33
Kayıt: 03 Nis 2007 01:57

Özet Tablo Almak

Mesaj gönderen deep_dream »

Resim

S.A.

Bir kaç gündür yukarıda çizdiğim resimdeki şekilde bir özet tablo almaya çalışıyorum ama açıkcası nereden başlayacağımı işin mantığını falan çözemedim. Forumda aramadığım konu kalmadı diyebilirim. Karşıma sürekli pivot denilen şey çıkıyor ama kullandığım veritabanında çalıştıramadım. Üzerinde çalıştığım iş bir hayır kurumuna olduğu için herhangi bir getirisi olmayacak. O yüzden devexpressin pivot gridinide alıp kullanamıyorum, masrafı bana yansıyacak. Gerçi almış olsam yapmak istediğim işi yapıp yapamayacağı hakkında da en ufak bir fikrim yok.

Firebird 1.5, Delphi 7 ve standart DBgrid ile bu şekilde bir özet tablo nasıl hazırlanır yada hazırlanabilir mi, anlatabilir misiniz lütfen?
En son deep_dream tarafından 25 May 2009 08:41 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Özet Tablo Almak

Mesaj gönderen Battosai »

Bir SQL sorgusu ile yapılabilir..Fakat Fisno sayısı arttıkça kolon sayısıda artacaktır...belli bir sayıdan sonra özet olmaktan çıkabilir yani...Yok en fazla 4-5 tane diyorsanız mantıklı olur....
deep_dream
Üye
Mesajlar: 33
Kayıt: 03 Nis 2007 01:57

Re: Özet Tablo Almak

Mesaj gönderen deep_dream »

kolon sayısı önemli değil, nasıl bir sql sorgu yazabilir misiniz acaba?
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: Özet Tablo Almak

Mesaj gönderen Ertugrul »

Yanilmiyorsam Delphi ile gelen Decision cube ile yapilabilir.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Özet Tablo Almak

Mesaj gönderen Battosai »

DBGrid değilde stringgrid'e aktarılabilir bu yapı...

Kod: Tümünü seç

select urun_adi,Fisno,SUM(satilan_miktar) from tablo_adi group by Fisno;
Bu sorgu ürünleri fisnoya göre gruplandırıp toplam kaç adet satıldığnı gösterir ..tam sizin istediğiniz değil fakat bu değerleri bir kaç kod ile stringgrid'e istediğinzi gibi aktarabilirsiniz...
deep_dream
Üye
Mesajlar: 33
Kayıt: 03 Nis 2007 01:57

Re: Özet Tablo Almak

Mesaj gönderen deep_dream »

Torry de gezerken gördüm. Sütunları toplamasada özet tablo veriyor. Belki birilerinin işine yarar.

simplepivot.pas isminde bir dosya açıp içeriğini bu şekilde değiştirin.

Kod: Tümünü seç

unit SimplePivot;

interface

uses DB;

function CreateSimplePivot(VerticalFieldName,
                           HorizontalFieldName,
                           ValueFieldName:String;
                           Query:TDataSet;
                           MemoryTable:TDataSet):Boolean;

implementation

function CreateSimplePivot(VerticalFieldName,
                           HorizontalFieldName,
                           ValueFieldName:String;
                           Query:TDataSet;
                           MemoryTable:TDataSet):Boolean;
var Temp1, Temp2:String;
    Value, idx:integer;
begin
  Query.DisableControls;
  memoryTable.DisableControls;
  MemoryTable.Close;
  MemoryTable.FieldDefs.Clear;

  if not Query.Active then Query.Open;
  {need to check for exception here}

  Query.First;
  MemoryTable.FieldDefs.Add(VerticalFieldName, ftString, 50);
  while not Query.EOF do
     begin
       Temp2 := Query.FieldByName(HorizontalFieldName).asString;
       if MemoryTable.FieldDefs.IndexOf(Temp2) = -1 then
         MemoryTable.FieldDefs.Add(Temp2, ftInteger);
       Query.Next;
     end;

  MemoryTable.Open;
  Query.First;
  while not Query.EOF do
     begin
       Temp1 := Query.FieldByName(VerticalFieldName).asString;
       Temp2 := Query.FieldByName(HorizontalFieldName).asString;
       Value := Query.FieldByName(ValueFieldName).asInteger;
       if MemoryTable.Locate(VerticalFieldName,temp1,[locaseinsensitive])
         then begin
                MemoryTable.Edit;
                MemoryTable.FieldByName(Temp2).AsInteger := Value;
                MemoryTable.Post;
              end
         else begin
                MemoryTable.Append;
                MemoryTable.FieldByName(VerticalFieldName).asString := Temp1;
                for idx := 1 to MemoryTable.Fields.Count - 1 do
                  MemoryTable.Fields[idx].AsInteger := 0;
                MemoryTable.FieldByName(Temp2).asInteger := Value;
                MemoryTable.Post;
              end;
       Query.Next;
     end;

  memoryTable.First;
  memoryTable.EnableControls;
  Query.First;
  Query.EnableControls;
end;


end.

Oluşan pas dosyasını projenize ekleyin.

Kullanımı :

Kod: Tümünü seç

 CreateSimplePivot('dikey sütunlar','yatay sütunlar','özettabloalınacakalanadı',Query1,MemoryData1);
Query veritabanına bağlı olan bildigimiz query, memorydata ise herhangi bir memory table bileşeni. Ben JEDİ içindeki memory table nesnesini kullandım.
Cevapla