Raporlama Hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
secret_boy
Üye
Mesajlar: 151
Kayıt: 17 Kas 2005 04:46

Raporlama Hakkında

Mesaj gönderen secret_boy »

Merhaba arkadaşlar öncelikle hayırlı ramazanlar ve hayırlı kandiller.
Arkadaşlar Ekte bir resim paylaştım o resimdeki veri tabanı alanlarımdan sadece seçilenlerin raporlanmasını istiyorum nasıl yapabilirim bana yardımcı olabilir misiniz ?

Teşekkürler.
Dosya ekleri
Adsız.rar
(14.16 KiB) 82 kere indirildi
Adsız.jpg
Adsız.jpg (7.39 KiB) 1854 kere görüntülendi
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Raporlama Hakkında

Mesaj gönderen mrmarman »

(1) SQL kullanacaksınız.
(2) Joker bir SELECT satırı yazıp uygulayacaksınız. Bunlardan hiçbiri seçilmemişse uyarıp işlemi durduracaksınız.

Örnek :

Kod: Tümünü seç

SQL.Add(' SELECT 1 as BuSutunDBGriddeGizlenecek');
if chkAd.checked    then SQL.Add(', FieldAd');
if chkSoyad.checked then SQL.Add(', FieldSoyad');
if chkAdres.checked then SQL.Add(', FieldAdres');
if chkGSM.checked   then SQL.Add(', FieldGSM');
...
...
Active := True;
DBGrid1.Columns[0].Visible := False; // ilk sütunu gizleyecektik ya işte o...
Başarılar.
Resim
Resim ....Resim
secret_boy
Üye
Mesajlar: 151
Kayıt: 17 Kas 2005 04:46

Re: Raporlama Hakkında

Mesaj gönderen secret_boy »

mrmarman yazdı:(1) SQL kullanacaksınız.
(2) Joker bir SELECT satırı yazıp uygulayacaksınız. Bunlardan hiçbiri seçilmemişse uyarıp işlemi durduracaksınız.

Örnek :

Kod: Tümünü seç

SQL.Add(' SELECT 1 as BuSutunDBGriddeGizlenecek');
if chkAd.checked    then SQL.Add(', FieldAd');
if chkSoyad.checked then SQL.Add(', FieldSoyad');
if chkAdres.checked then SQL.Add(', FieldAdres');
if chkGSM.checked   then SQL.Add(', FieldGSM');
...
...
Active := True;
DBGrid1.Columns[0].Visible := False; // ilk sütunu gizleyecektik ya işte o...
Başarılar.
Sayın mrmarman cevabın için teşekkür ederim.Raporlama derken benim kastettiğim yazıcı için raporlama grid üzerinde değil bu yöntemle yazıcı içinde yapabilir miyim ?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Raporlama Hakkında

Mesaj gönderen mrmarman »

Merhaba.

Yazıcı için raporlama aracı kullanmak veya bu aracı bizzat kendin tasarlamak zorundasın.
Aslında raporlama araçlarının da yazın düzeni ve şablonunu senin tasarladığın göz önüne alındığında iki halde de iş sende bitiyor.

Şahsen artık FastReport, QuickRepot vs. raporlama araçlarını kullanmayı bıraktım. Excel, Word otomasyon ile veya direkt HTML bir çıktı tasarlayıp bunu yazıcıya yönlendirmek her platformda bana kolaylık sağlıyor.

Şimdi bu verdiğim örnek DBGrid'den bahis şekilde algılamamdan dolayı ona yönelik özelleştirme idi. Yazıcı için buna ihtiyacın yok, önerdiğim şekillerde sütun sayısı farklılaşan dinamik çözümler de üretebilirsin.

Eğer sistemde MSOffice kurulu ise senin için EXCEL ile bir örnek hazırladım bu mesaj ekinde bulabilirsin.
// ADOQuery içeriğini ne varsa direkt Excel'e gönderen bir procedure hazırlamıştım...

Kod: Tümünü seç

USES ComObj;
Procedure AdoQueryToExcel( Baslik, Sheet : String; AdoQuery:TAdoQuery; ProgressBar:TProgressBar; boolYazdir: Boolean );
// Uses AdoDb, ComObj, ComCtrls
Const // Excel97'den
  xlWBATWorksheet    = $FFFFEFB9;
  xlCenter           = $FFFFEFF4;
  xlEdgeLeft         = $00000007;
  xlEdgeRight        = $0000000A;
  xlContinuous       = $00000001;

  xlInsideHorizontal = $0000000C;
  xlInsideVertical   = $0000000B;
  xlEdgeTop          = $00000008;
  xlEdgeBottom       = $00000009;

  Sonuc : Array[1..2] of Char = ('x', ' ');
Var
  xExcel,
  xRange      : OleVariant;
  Sayac       : Integer;
  Harfler     : TStringList;
begin
  If AdoQuery.Eof then Exit;
  AdoQuery.DisableControls;
  AdoQuery.First;

  Harfler := TStringList.Create;
  For Sayac := 65 to 90 do Harfler.Add(     Chr( Sayac ) );
  For Sayac := 65 to 90 do Harfler.Add( 'A'+Chr( Sayac ) );
  For Sayac := 65 to 90 do Harfler.Add( 'B'+Chr( Sayac ) );

  With AdoQuery do begin
    IF NOT EOF then begin
      Try
        xExcel := CreateOleObject('Excel.Application');
        xExcel.Workbooks.Add(xlWBatWorkSheet);
        xExcel.Workbooks[1].WorkSheets[1].Name := Format('(%s)',[Sheet]);
      Except
        MessageDlg('İşlem Başarısız...', mtError, [mbOk], 1);   //mrOK = 1
        Exit;
      End;
      // xExcel.Visible := True;

      xRange := xExcel.Range['A1',Harfler[Fields.Count]+'1'];
        xRange.MergeCells := True;
        xRange.Columns.Font.Name         := 'Tahoma';
        xRange.Columns.Font.Size         := 14;
        xRange.Columns.Font.Color        := clNavy;
        xRange.Columns.Font.Bold         := True;
        xRange.Columns.ColumnWidth       := 10;
        xRange.Cells.Interior.Color      := clYellow;
        xRange.Cells.HorizontalAlignment := xlCenter;

// Başlıklar
      xExcel.Range['A1'].Value := Baslik;
      xExcel.Range['A2'].Value := 'S.No';

      For Sayac := 0 to Fields.Count-1 do begin
        xExcel.Range[Harfler[Sayac+1]+'2'].Value := Fields[Sayac].DisplayName;
        xExcel.Range[Harfler[Sayac+1]+'2'].Font.Bold:= True;
      end;

     If Assigned(ProgressBar) then ProgressBar.Max := RecordCount;

      While (NOT EOF) do begin
        If Assigned(ProgressBar) then ProgressBar.Position := RecNo;
        xExcel.Range['A'+IntToStr(2+RecNo)].Value := Format('%d', [RecNo]);
        For Sayac := 0 to Fields.Count-1 do begin
          xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].NumberFormat := '@';
          If Fields[Sayac].DataType = ftBoolean then
          begin
            xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].Value := Sonuc[Integer(Fields[Sayac].AsBoolean)];
            xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].Cells.HorizontalAlignment := xlCenter;
          end else
          begin
            xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].Value := Fields[Sayac].AsString;
          end;
        end; //For
        Next;
        Application.ProcessMessages;
      end; // While

// Format
      xRange := xExcel.Range['A2',Format('%s%d', [Harfler[Fields.Count], RecordCount+2]) ];
      xRange.Columns.AutoFit;
      xRange.Cells.VerticalAlignment                    := xlCenter;
      xRange.Borders.Item[xlEdgeLeft].LineStyle         := xlContinuous;
      xRange.Borders.Item[xlEdgeRight].LineStyle        := xlContinuous;
      xRange.Borders.Item[xlInsideHorizontal].LineStyle := xlContinuous;
      xRange.Borders.Item[xlInsideVertical].LineStyle   := xlContinuous;
      xRange.Borders.Item[xlEdgeTop].LineStyle          := xlContinuous;
      xRange.Borders.Item[xlEdgeBottom].LineStyle       := xlContinuous;
    end;  // IF NOT EOF
    xExcel.Visible := True;
    if boolYazdir
      then xExcel.ActiveWorkBook.PrintOut(Copies := 2, Collate := True, Preview := True);

  end; // With
  Harfler.Free;
  AdoQuery.EnableControls;
end;
// Yazdır Butonu

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  i          : Integer;
  AQSorgu    : TAdoQuery;
  strAlanlar : String;
begin
  strAlanlar := '';
  for i := 0 to CheckListBox1.Items.Count - 1 do begin
    if CheckListBox1.Checked[i] then
    begin
      if strAlanlar <> '' then strAlanlar := strAlanlar + ',' + CheckListBox1.Items[i]
                          else strAlanlar := CheckListBox1.Items[i];
    end;
  end;
  AQSorgu := TAdoQuery.Create(nil);
  With AQSorgu do begin
    Try
      Connection := AdoQuery1.Connection;
      SQL.Text := 'SELECT ' + strAlanlar + ' FROM FILM';
      Active := True;
        AdoQueryToExcel( 'Benim Raporum', 'Rapor-01', AQSorgu, ProgressBar1, True );
      Active := False;
    Finally
      Free;
    End;
  end;
end;
// Form açılınca Veritabanı gösteren standart kısım

Kod: Tümünü seç

procedure TForm1.FormShow(Sender: TObject);
Var
  i : Integer;
begin
  AdoConnection1.LoginPrompt := False;
  AdoConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;'
  + 'Data Source='+ ExtractFilePath(Application.Exename) + 'film_veritabani.mdb';
  AdoQuery1.Connection := ADOConnection1;
  AdoQuery1.SQL.Text   := 'SELECT * FROM FILM';
  AdoQuery1.Active     := True;
  DataSource1.DataSet  := ADOQuery1;
  DBGrid1.DataSource   := DataSource1;
  DBGrid1.Options      := DBGrid1.Options - [dgEditing];

  CheckListBox1.Columns := 7;
  for i := 0 to AdoQuery1.FieldCount - 1
    do CheckListBox1.Items.Add( AdoQuery1.Fields[i].FieldName );    
end;
Dosya ekleri
YaziciDinamikSutun.rar
Excel kullanarak raporlama örneği (ofis kurulu ise geçerlidir)
(57.18 KiB) 75 kere indirildi
Resim
Resim ....Resim
secret_boy
Üye
Mesajlar: 151
Kayıt: 17 Kas 2005 04:46

Re: Raporlama Hakkında

Mesaj gönderen secret_boy »

Yardımlarınız için teşekkür ederim.
Kullanıcı avatarı
Commandx
Üye
Mesajlar: 181
Kayıt: 01 Oca 2008 05:34

Re: Raporlama Hakkında

Mesaj gönderen Commandx »

mrmarman yazdı: 14 Tem 2015 03:36 Merhaba.

Yazıcı için raporlama aracı kullanmak veya bu aracı bizzat kendin tasarlamak zorundasın.
Aslında raporlama araçlarının da yazın düzeni ve şablonunu senin tasarladığın göz önüne alındığında iki halde de iş sende bitiyor.

Şahsen artık FastReport, QuickRepot vs. raporlama araçlarını kullanmayı bıraktım. Excel, Word otomasyon ile veya direkt HTML bir çıktı tasarlayıp bunu yazıcıya yönlendirmek her platformda bana kolaylık sağlıyor.

Şimdi bu verdiğim örnek DBGrid'den bahis şekilde algılamamdan dolayı ona yönelik özelleştirme idi. Yazıcı için buna ihtiyacın yok, önerdiğim şekillerde sütun sayısı farklılaşan dinamik çözümler de üretebilirsin.

Eğer sistemde MSOffice kurulu ise senin için EXCEL ile bir örnek hazırladım bu mesaj ekinde bulabilirsin.
// ADOQuery içeriğini ne varsa direkt Excel'e gönderen bir procedure hazırlamıştım...

Kod: Tümünü seç

USES ComObj;
Procedure AdoQueryToExcel( Baslik, Sheet : String; AdoQuery:TAdoQuery; ProgressBar:TProgressBar; boolYazdir: Boolean );
// Uses AdoDb, ComObj, ComCtrls
Const // Excel97'den
  xlWBATWorksheet    = $FFFFEFB9;
  xlCenter           = $FFFFEFF4;
  xlEdgeLeft         = $00000007;
  xlEdgeRight        = $0000000A;
  xlContinuous       = $00000001;

  xlInsideHorizontal = $0000000C;
  xlInsideVertical   = $0000000B;
  xlEdgeTop          = $00000008;
  xlEdgeBottom       = $00000009;

  Sonuc : Array[1..2] of Char = ('x', ' ');
Var
  xExcel,
  xRange      : OleVariant;
  Sayac       : Integer;
  Harfler     : TStringList;
begin
  If AdoQuery.Eof then Exit;
  AdoQuery.DisableControls;
  AdoQuery.First;

  Harfler := TStringList.Create;
  For Sayac := 65 to 90 do Harfler.Add(     Chr( Sayac ) );
  For Sayac := 65 to 90 do Harfler.Add( 'A'+Chr( Sayac ) );
  For Sayac := 65 to 90 do Harfler.Add( 'B'+Chr( Sayac ) );

  With AdoQuery do begin
    IF NOT EOF then begin
      Try
        xExcel := CreateOleObject('Excel.Application');
        xExcel.Workbooks.Add(xlWBatWorkSheet);
        xExcel.Workbooks[1].WorkSheets[1].Name := Format('(%s)',[Sheet]);
      Except
        MessageDlg('İşlem Başarısız...', mtError, [mbOk], 1);   //mrOK = 1
        Exit;
      End;
      // xExcel.Visible := True;

      xRange := xExcel.Range['A1',Harfler[Fields.Count]+'1'];
        xRange.MergeCells := True;
        xRange.Columns.Font.Name         := 'Tahoma';
        xRange.Columns.Font.Size         := 14;
        xRange.Columns.Font.Color        := clNavy;
        xRange.Columns.Font.Bold         := True;
        xRange.Columns.ColumnWidth       := 10;
        xRange.Cells.Interior.Color      := clYellow;
        xRange.Cells.HorizontalAlignment := xlCenter;

// Başlıklar
      xExcel.Range['A1'].Value := Baslik;
      xExcel.Range['A2'].Value := 'S.No';

      For Sayac := 0 to Fields.Count-1 do begin
        xExcel.Range[Harfler[Sayac+1]+'2'].Value := Fields[Sayac].DisplayName;
        xExcel.Range[Harfler[Sayac+1]+'2'].Font.Bold:= True;
      end;

     If Assigned(ProgressBar) then ProgressBar.Max := RecordCount;

      While (NOT EOF) do begin
        If Assigned(ProgressBar) then ProgressBar.Position := RecNo;
        xExcel.Range['A'+IntToStr(2+RecNo)].Value := Format('%d', [RecNo]);
        For Sayac := 0 to Fields.Count-1 do begin
          xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].NumberFormat := '@';
          If Fields[Sayac].DataType = ftBoolean then
          begin
            xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].Value := Sonuc[Integer(Fields[Sayac].AsBoolean)];
            xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].Cells.HorizontalAlignment := xlCenter;
          end else
          begin
            xExcel.Range[Harfler[Sayac+1]+IntToStr(2+RecNo)].Value := Fields[Sayac].AsString;
          end;
        end; //For
        Next;
        Application.ProcessMessages;
      end; // While

// Format
      xRange := xExcel.Range['A2',Format('%s%d', [Harfler[Fields.Count], RecordCount+2]) ];
      xRange.Columns.AutoFit;
      xRange.Cells.VerticalAlignment                    := xlCenter;
      xRange.Borders.Item[xlEdgeLeft].LineStyle         := xlContinuous;
      xRange.Borders.Item[xlEdgeRight].LineStyle        := xlContinuous;
      xRange.Borders.Item[xlInsideHorizontal].LineStyle := xlContinuous;
      xRange.Borders.Item[xlInsideVertical].LineStyle   := xlContinuous;
      xRange.Borders.Item[xlEdgeTop].LineStyle          := xlContinuous;
      xRange.Borders.Item[xlEdgeBottom].LineStyle       := xlContinuous;
    end;  // IF NOT EOF
    xExcel.Visible := True;
    if boolYazdir
      then xExcel.ActiveWorkBook.PrintOut(Copies := 2, Collate := True, Preview := True);

  end; // With
  Harfler.Free;
  AdoQuery.EnableControls;
end;
// Yazdır Butonu

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  i          : Integer;
  AQSorgu    : TAdoQuery;
  strAlanlar : String;
begin
  strAlanlar := '';
  for i := 0 to CheckListBox1.Items.Count - 1 do begin
    if CheckListBox1.Checked[i] then
    begin
      if strAlanlar <> '' then strAlanlar := strAlanlar + ',' + CheckListBox1.Items[i]
                          else strAlanlar := CheckListBox1.Items[i];
    end;
  end;
  AQSorgu := TAdoQuery.Create(nil);
  With AQSorgu do begin
    Try
      Connection := AdoQuery1.Connection;
      SQL.Text := 'SELECT ' + strAlanlar + ' FROM FILM';
      Active := True;
        AdoQueryToExcel( 'Benim Raporum', 'Rapor-01', AQSorgu, ProgressBar1, True );
      Active := False;
    Finally
      Free;
    End;
  end;
end;
// Form açılınca Veritabanı gösteren standart kısım

Kod: Tümünü seç

procedure TForm1.FormShow(Sender: TObject);
Var
  i : Integer;
begin
  AdoConnection1.LoginPrompt := False;
  AdoConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;'
  + 'Data Source='+ ExtractFilePath(Application.Exename) + 'film_veritabani.mdb';
  AdoQuery1.Connection := ADOConnection1;
  AdoQuery1.SQL.Text   := 'SELECT * FROM FILM';
  AdoQuery1.Active     := True;
  DataSource1.DataSet  := ADOQuery1;
  DBGrid1.DataSource   := DataSource1;
  DBGrid1.Options      := DBGrid1.Options - [dgEditing];

  CheckListBox1.Columns := 7;
  for i := 0 to AdoQuery1.FieldCount - 1
    do CheckListBox1.Items.Add( AdoQuery1.Fields[i].FieldName );    
end;
Yemin ederim çok kıymetli paylaşımlar.
Bu tür sketch'ler benim başımı döndürüyor...
Fastreportun dbgrid Excel export bileşeni var çok dandik, yarın ilk iş bu kodları pas haline getirip projemde deneyeceğim.
Anladığım kadarıyla, field sütun başlıkları büyütülebilir, font değiştirilebilir
Bold sutun başlığı ekleyecem, offf kodlara bak, geliştirilmesi gerek, bundan neler yapilir be.
3 parti yazilimlara gerek yok Excel dururken.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
http://www.neonhaber.com/Static/mega-co ... index.html
www.delphican.con
Function PARSE( text, ilk, son:String ): String; //
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;
Cevapla