Excel Raporlama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Excel Raporlama

Mesaj gönderen ozcank »

Arkadaşlar şunu yapmak istiyorum bana yardımcı olur musunuz ?

Raporumda birçok cari ve stok var şu şekilde bir rapor yapmak istedim;

Bir cari ve onun stok hareketleri bittiğinde diğer cari ve onun hareketleri şeklinde.
CARİ
ADRES
TELEFON
STOK KODU - STOK ADI - GİRİŞ TARİHİ - ÇIKIŞ TARİHİ
...
...
...
....
CARİ
ADRES
TELEFON
STOK KODU - STOK ADI - GİRİŞ TARİHİ - ÇIKIŞ TARİHİ
...
..
..
..
..
..
CARİ
ADRES
TELEFON
STOK KODU - STOK ADI - GİRİŞ TARİHİ - ÇIKIŞ TARİHİ

Her carinin hareketlerini altına yazdırıp cari değiştiğinde ona ait hareketleri excel rapor etmek istiyorum.


Normal de excel şu şekilde 1 tek carinin raporunu alıyorum. Bu kod üzerinde değişiklik yapabilir miyiz ?

Kod: Tümünü seç

procedure TForm5.BitBtn3Click(Sender: TObject);
var ExcelApp, WBook, Sheet: OleVariant;
    Row, Col: Integer; // satır ve sütün için değişken
begin
If Edit1.Text='' Then
Begin
Application.MessageBox('Boş Kayıt Excel gönderilemez !!! ','Uyarı Mesajı',MB_ICONERROR);
End
Else
Begin

  if ADOQuery1.IsEmpty then Exit; // Çıkış
  try
    ExcelApp := CreateOleObject('Excel.Application');
    WBook := ExcelApp.WorkBooks.Add;
    Sheet := WBook.WorkSheets[1];
    Sheet.Range['A1','F1'].Merge;
    Sheet.Range['A1','F1'].Font.Bold:=True;
    Sheet.Range['A1','F6'].Font.Color:=clRed;
    Sheet.Cells[1,1].Value:='Emanet Cari Stok Raporlama';
    Sheet.Cells[1,1].HorizontalAlignment := -4108;
    Sheet.Cells[1,1].Font.Size := 20;

    Sheet.Cells[2,1].Value:='Cari Kod';
    Sheet.Cells[3,1].Value:='Cari İsim';
    Sheet.Cells[4,1].Value:='Cari Adres';
    Sheet.Cells[5,1].Value:='Vergi Dairesi';
    Sheet.Cells[6,1].Value:='Vergi No';

    Sheet.Cells[7,1].Value:='Stok Kodu';
    Sheet.Cells[7,2].Value:='Stok İsmi';
    Sheet.Cells[7,3].Value:='Toplam Giriş';
    Sheet.Cells[7,4].Value:='Toplam Çıkış';
    Sheet.Cells[7,5].Value:='Toplam Kalan';
    Sheet.Cells[7,6].Value:='Ölçü Birimi';


    Sheet.Range['A2','F7'].Font.Bold:=True;
    Sheet.Range['A2','F7'].Font.Color:=clRed;

ADOQuery2.close;
ADOQuery2.sql.clear;
ADOQuery2.sql.add('SELECT * FROM TBLCASABIT where CARI_KOD='+#39+''+edit1.text+''+#39+'');
ADOQuery2.open;

Sheet.Cells[2,2].Value:='''' + Edit1.Text;
Sheet.Cells[3,2].Value:='''' + Edit2.Text;
Sheet.Cells[4,2].Value:='''' + adoquery2.Fields[14].asstring;
Sheet.Cells[5,2].Value:='''' + adoquery2.Fields[16].asstring;
Sheet.Cells[6,2].Value:='''' + adoquery2.Fields[17].asstring;

   except
    ShowMessage('Excel başlatılamıyor.'); Exit;
  end;
  try
  with ADOQuery1 do
  begin
     Row := 8; // başlangıç 3. satır
     First;
     While not Eof do
     begin
       for Col := 0 to DBGrid1.FieldCount - 1 do
       begin
         Sheet.Cells[Row, Col + 1].Value := DBGrid1.Fields[Col].Value;
         if Col + 1 >= 3 then
           Sheet.Cells[Row, Col + 1].NumberFormat := '0_ ;-0';
       end;
       Next;
       Inc(Row); // Row := Row + 1;
     end;
  end;
  finally
    Sheet.Columns['A:F'].EntireColumn.AutoFit;
    ExcelApp.Visible := True;
    ExcelApp := Null; WBook := Null; Sheet := Null;
  end;
  end;
  end;
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Excel Raporlama

Mesaj gönderen kimimben »

Yapabilirsiniz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Excel Raporlama

Mesaj gönderen ozcank »

Nasıl?
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Excel Raporlama

Mesaj gönderen kimimben »

ADOQuery1 nesnesinde cari kayıtlarınızın olduğunu varsayarak;

1- Önce ADOQuery1 içersinde ki her bir kayıt bilgisine döngü içersinde erişeceksiniz.
2- Eriştiğiniz ve yazdırmak istediğiniz cari kayıt bilgilerini excel hücrelerine erişerek yazdıracaksınız.(Zaten yukarıda ki kod örneğinde mevcut).
3- Yine döngü içersinde, bir başka ADOQuery nesnesi ile cari kayıt ile ilişkili hareketleri çekeceksiniz.
4- Çektiğiniz kayıtları da yine, başka bir döngü yardımıyla excel'e yazdıracaksınız.

Gördüğünüz gibi çok basit...
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Excel Raporlama

Mesaj gönderen ozcank »

tek tablom var benim hareketler dahil peki gönderdiğim kod üzerinde yapabilirmisiniz?
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Excel Raporlama

Mesaj gönderen kimimben »

Hımm anlaşıldığı üzere her hareket için, tekrar cari bilgilerini girilmek zorunda...
Neden veritabanı normalizasyonu kurallarına uymayan bir bir tasarımı seçtiğinizi merak ettim.
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: Excel Raporlama

Mesaj gönderen ertank »

ozcank yazdı:tek tablom var benim hareketler dahil peki gönderdiğim kod üzerinde yapabilirmisiniz?
Merhaba,

Tek tablo içinde Cari kod değiştikçe yeni başlık yazarak yine çözüme ulaşabilirsiniz.
1- Başlangıçtaki cari kod bilgisini bir değişkende saklayın.
2- Her hareket yazımından önce değişken değeri ile database cari kod aynı mı kontrol edin.
3- Farklı ise değişkeni yeni carikod değerine değiştirerek (database değerini değişkenin içine saklayarak) başlıkları yazdırın.
4- Normal hareket kayıtlarını yazdırmaya devam edin.

Gönderdiğiniz kod çok anlaşılmıyor. Database yapınızı da tam olarak bilemediğimiz için direk gönderilen kod üzerinde çalışmak çok mümkün değil. Ancak proje ve database (içinde bilgi olacak şekilde) paylaşımı yapabilirseniz yardımcı olmaya çalışabiliriz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Excel Raporlama

Mesaj gönderen ozcank »

ertank kardeşim haklısın ben o kod da sadece 1 cari için önce dbgrid1 üzerine raporlayıp sonra button yardımı ile excel aktarıyorum. DBGrid1 e aktarmadan direkt button ile excel aktarabilir miyiz? Birde DBGrid1 de böyle bir şey yapmak mümkün mü?
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Excel Raporlama

Mesaj gönderen ozcank »

DBGrid1 de;

CARİ İSİM
STOK ADI / GİRİŞ MİKTAR / ÇIKIŞ MİKTAR / KALAN
..
..
..
CARİ İSİM
STOK ADI / GİRİŞ MİKTAR / ÇIKIŞ MİKTAR / KALAN
..
..
..
Bu şekilde yapabilir miyim?
Kullanıcı avatarı
barutali
Üye
Mesajlar: 297
Kayıt: 02 Tem 2007 02:30

Re: Excel Raporlama

Mesaj gönderen barutali »

2 tane döngü yapacaksınız..

Kod: Tümünü seç

Var
  RowIndex : Integer;

begin

  RowIndex := 0; 

with <CariListesiDataset> do
begin
  close;
  sql.clear;
  sql.add('SELECT Field1, field2, field_N... From CariTablosu');
  open;
  first;
end;

while not <CariListesiDataset>.eof do
begin
 Application.Processmessage;
 
 /*
    BURADA EXCEL E CARİ ADINI BASACAKSIN..

 */
  Inc(RowIndex);  // RowIndex +1 yaptık..
  with <StokHareketDataset> do
  begin
    close;
    clear;
    sql.beginupdate;
     sql.add('SELECT Field_1, fileld2, field_N... from StokHareketleri where CariID = :CID');
    sql.endupdate;
    Parameters.parambyname('CID').Value := <CariListesiDataset>.fieldbyname('ID').AsInteger;
   open;
   First;
  end;
 
  while not <StokHareketDataset>.eof do
  begin 
   application.processmessage;

  /*
  
   BURADA DA STOK HAREKETLERİNİ EXCEL E BASICAKSIN..
  
  */    
   Inc(RowIndex);
   <StokHareketDataset>.next;
  end;

 <CariListesiDataset>.next;
end;
Dipçe; IDE kullanmadan yazdım ufak hatalar olabilir..
amatör küme programcı :D
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Excel Raporlama

Mesaj gönderen ozcank »

barutali emeğine sağlık tşk. ederim. Bur da benim tablom 1 tane ekte gönderiyorum.Buna göre bir değişiklik yapmam gerekiyor mu?
Dosya ekleri
emanet.JPG
emanet.JPG (8.83 KiB) 1906 kere görüntülendi
En son ozcank tarafından 28 Eki 2016 05:12 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
barutali
Üye
Mesajlar: 297
Kayıt: 02 Tem 2007 02:30

Re: Excel Raporlama

Mesaj gönderen barutali »

tablonun 1 tane yada 2 tane olması önemsiz.. dikkat edersen kodlarım da 2 tane sorgu var.. Aynı tabloyu iki kere sorgularsın..

dipçe; Ek görünmüyor.
amatör küme programcı :D
Cevapla