Master-Detail ilişkili tablonun bozulmadan excell'e aktarımı

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

Master-Detail ilişkili tablonun bozulmadan excell'e aktarımı

Mesaj gönderen Biltes »

Arkadaşlar merhaba;
Öncelikle herkesin geçmiş bayramını kutluyorum.
Bu konu ile ilgili formdaki tüm excell konularına baktım ama aradığım cevabı bulamadım. Sorunum şu master-deteil ilişkili bir tablom var bunlardaki kayıtları ilişkiyi bozmadan excell'e aktarmak istiyorum. Yapmak istediğim olay örnek vermek gerekirse...

01.11.2005
001 - ekmek - 1 Adet - 0,25 - 0,25
002 - süt - 2 Adet - 1,30 - 2,60

02.11.2005
001 - peynir - 100 GR - 2,50 - 2,50

gibi ...
bu yukarıdaki şekilde ben bunlar dbgrid'de gösteriyorum. Excell'de aktarmak istediğimde bu şekilde bir aktarım yöntemi uygulamak istiyorum ama bu kounda çok fazla bilgim olmadığı için siz değerli arkadaşlardan yardım almak istedim...
Konuyla ilgilenen herkese şimdiden çok teşekkür ederim...
Saygılarımla...
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 »

sanırım cevap gelmediğine göre baya zor bişey bunu kodla yapmak..ama http://www.sqlmanager.net de EXLReport diye paralı bir komponent var belki free olanlarda vardır aynı işi yapan...süper bişey bence bir dene vaya demolarını incele..grouplandırma ,sum bile yapabiliyorsunn aslında başka bir projeye başlarsamm raporlama işlemlerinin tamamını bunda yapmayı düşünüyorum..kolay gelsin
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.
Bu normal bir döngü yöntemiyle halledilebilir (daha pratik bir çözümü olabilir emin değilim..).Baz aldığınız veriyi (örneğinizdeki tarih gibi..) temp bir değişkende tutarak değiştiğinde master bilgileri tekrar aktarmak suretiyle istediğiniz sonucu alabilirsiniz.
Kolay gele.
assoft

Mesaj gönderen assoft »

Eğer yanlış değilsem Quantumgrid bu işi yapıyor...
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Hocam bu işi en kolay quantum gridle halledilir.

Bunun için 2 yol var

Birincisi : Bir sql ile master-detail tabloları joinle.
01.11.2005
001 - ekmek - 1 Adet - 0,25 - 0,25
002 - süt - 2 Adet - 1,30 - 2,60
Yukarıda şekilden şu şekile gelecek şekilde:
01.11.2005 - 001 - ekmek - 1 Adet - 0,25 - 0,25
01.11.2005- 002 - süt - 2 Adet - 1,30 - 2,60


Sonra sqli çalıştırdığın nesneyi QuantumGride bağla. Ve Tarih alanının Columnuna tıkla ve groupindex ini 0 yap. Bu şekilde master detail bir görünüm elde etmiş olursun ve şu kodlarla Excele export et.

Kod: Tümünü seç

ExportGrid4ToExcel('deneme', cxgrid, true, true, true, 'xls');
Bu arada Uses'a cxExportGrid4Link'i ekle

ikinci yol : İki tane level oluştur Cxgridde. Sonra üst levelin viewine master table'ı, alt levelin viewine detail table'ı bağla. Aralarında Relation kur. Şu an tam net ayrıntısını hatırlamıyorum Cx gridde relation kurmanın. Sitede bununla ilgili örnekler var "cxgrid master-detail" diye bir arattır.

Birinci yol için yazdığım kod bunun içinde geçerli.

Kolay gelsin...
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

slm.

Mesaj gönderen aliemrei »

hocam aşıdaki kodu bir unit olarak sakla ve uses na ekle
sonrasında DBGridToExcelADO procedurü aracılığı ile dbgrid den excel e aktarım yapabilirsin.

Not : Ole Object olmadığı için çalıştırılan makinede excel olmasa bile sorun çıkartmaz.

Kod: Tümünü seç

unit DBGridExportToExcel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, ComCtrls, DB, IniFiles, Buttons, dbgrids, ADOX_TLB, ADODB;


type TScrollEvents = class
       BeforeScroll_Event: TDataSetNotifyEvent;
       AfterScroll_Event: TDataSetNotifyEvent;
       AutoCalcFields_Property: Boolean;
  end;

procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);


implementation

//Support procedures: I made that in order to increase speed in
//the process of scanning large amounts
//of records in a dataset

//we make a call to the "DisableControls" procedure and then disable the "BeforeScroll" and
//"AfterScroll" events and the "AutoCalcFields" property.
procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
begin
     with DataSet do
          begin
               DisableControls;
               ScrollEvents := TScrollEvents.Create();
               with ScrollEvents do
                    begin
                         BeforeScroll_Event := BeforeScroll;
                         AfterScroll_Event := AfterScroll;
                         AutoCalcFields_Property := AutoCalcFields;
                         BeforeScroll := nil;
                         AfterScroll := nil;
                         AutoCalcFields := False;
                    end;
          end;
end;

//we make a call to the "EnableControls" procedure and then restore
// the "BeforeScroll" and "AfterScroll" events and the "AutoCalcFields" property.
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
begin
     with DataSet do
          begin
               EnableControls;
               with ScrollEvents do
                    begin
                         BeforeScroll := BeforeScroll_Event;
                         AfterScroll := AfterScroll_Event;
                         AutoCalcFields := AutoCalcFields_Property;
                    end;
          end;
end;

//This is the procedure which make the work:

procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
var
  cat: _Catalog;
  tbl: _Table;
  col: _Column;
  i: integer;
  ADOConnection: TADOConnection;
  ADOQuery: TADOQuery;
  ScrollEvents: TScrollEvents;
  SavePlace: TBookmark;
begin
  //
  //WorkBook creation (database)
  cat := CoCatalog.Create;
  cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0');
  //WorkSheet creation (table)
  tbl := CoTable.Create;
  tbl.Set_Name(SheetName);
  //Columns creation (fields)
  DBGrid.DataSource.DataSet.First;
  with DBGrid.Columns do
    begin
      for i := 0 to Count - 1 do
        if Items[i].Visible then
        begin
          col := nil;
          col := CoColumn.Create;
          with col do
            begin
              Set_Name(Items[i].Title.Caption);
              Set_Type_(adVarWChar);
            end;
          //add column to table
          tbl.Columns.Append(col, adVarWChar, 20);
        end;
    end;
  //add table to database
  cat.Tables.Append(tbl);

  col := nil;
  tbl := nil;
  cat := nil;

  //exporting
  ADOConnection := TADOConnection.Create(nil);
  ADOConnection.LoginPrompt := False;
  ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0';
  ADOQuery := TADOQuery.Create(nil);
  ADOQuery.Connection := ADOConnection;
  ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]';
  ADOQuery.Open;


  DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);
  SavePlace := DBGrid.DataSource.DataSet.GetBookmark;
  try
  with DBGrid.DataSource.DataSet do
    begin
      First;
      while not Eof do
        begin
          ADOQuery.Append;
          with DBGrid.Columns do
            begin
              ADOQuery.Edit;
              for i := 0 to Count - 1 do
                if Items[i].Visible then
                  begin
                    ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString;
                  end;
              ADOQuery.Post;
            end;
          Next;
        end;
    end;

  finally
  DBGrid.DataSource.DataSet.GotoBookmark(SavePlace);
  DBGrid.DataSource.DataSet.FreeBookmark(SavePlace);
  EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);

  ADOQuery.Close;
  ADOConnection.Close;

  ADOQuery.Free;
  ADOConnection.Free;

  end;

end;

end.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Bu kod master-detail yapıyı excel'e geçirecekmiş gibi durmuyor. Bu sadece TDBGridi'n içeriğini excele basıyor.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Arkdaşlar öncelikle konu ile ilgilenip zaman ayırdığınız için çok tşk ediyorum...
Undefined hocamın da dediği gibi olay quantum grid ile halledilebiliyor. Bunu denedim bu ok. Onun haricinde cevap gelene kadar bende araştırma yaptım ve fast report'un excell ve buna benzer bir çok olaya export nesnesi var bunları kullanarak Excell'e aktarımı istediğim şekilde sağladım. Sonuçta her iki yöntemle de olabiliyor. Bu konuda sorunu olan tüm arkadaşlar bu iki yöntemi de kullanabilirler. Sağlıklı sonuç alacaklarına eminim.
Herkese çok tşk ederim.... Çalışmalarınızda başarılar dilerim...
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ı
idalan
Üye
Mesajlar: 58
Kayıt: 25 Şub 2004 02:14
Konum: Üsküdar
İletişim:

Mesaj gönderen idalan »

Arkadaşlar Allah hepinizden razı olsun valla ne diim bi arama ile buluyoruz herşeyi TEŞEKKÜRLER
Fikren emir almazsan, esir olursun ikisinin ortası yoktur.
Cevapla