Excell den Db ye veri aktarmak !!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

viewtopic.php?t=1530 linkindeki gibi bir de ADO ile almayı dene.. Tek bir INSERT INTO satırı ile tüm Excel verisini veritabanına aktarabilirsin...
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

dediklerinizi yaptım fakat

Kod: Tümünü seç

Var 
  ExcelDosya : String; 
begin 
  ExcelDosya := 'D:\DOC\Kitap1.xls'; 
  DataSource1.DataSet := AdoQuery1; 
  DBGrid1.DataSource  := DataSource1; 

  AdoConnection1.LoginPrompt := False; 
  AdoConnection1.ConnectionString := 
  'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ ExcelDosya + ';Extended properties=Excel 8.0'; 
  AdoQuery1.Connection := AdoConnection1; 
  AdoQuery1.SQL.Clear; 
  AdoQuery1.SQL.Add( 'Select * from [Sayfa1$]'); 
  AdoQuery1.Active := True; 
end;
Sayfa1$] burda hata verdi? Ne yapabilirim?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Excel'de açtığın sayfanın adını değiştirmediğine emin misin ? Hani altta gördüğün kulakçıklarda gördüğün.

- Kodunu aynen test ettim, sorunsuz çalışıyor. Hatta DBGrid içerisine kayıt girdikçe arkada açık olan Excel sayfasında satırların dolduğunu dahi gözlemleyebiliyorum...
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

tamam oldu arkadaşım teşekkür ederim fakat bir şey daha sorabilirmiyim bu verileri kaydedebilirmiyim? DB kütüğüne?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Dediğim gibi cevabım evet...
DB kütüğü dediğin Paradox veritabanı mıdır ?
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

evet paradox ve dbgrid1 de Excell deki verileri görüyorum aktarma.db dosyam var buna tum excel deki verileri kayıt yapmak istiyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

- Bahsettiğim tek SQL komutunda birbirine aktarma olayı şu şekilde.

Kod: Tümünü seç

  With AdoQuery1 do
  begin
    SQL.Clear;
    SQL.Add('INSERT INTO ' + PDXDosya );
    SQL.Add(' (A, B, C)');
    SQL.Add('SELECT XA, XB, XC from [Sayfa1$] IN "'+XLSDosya+'" "Excel 8.0;"');
    ExecSQL;
  end;
- Buna rağmen her seferinde ISAM hatası alıyorum...Halbu ki Jet 4.0 ile BDE için kullanılan Windows altındaki Mspbde40.DLL yerli yerinde duruyor ODBC sürücülerimi güncelleyince hata ortadan kalktı..

- Alternatif bir tane daha hazırladım. İşin görülsün... Açıklayıcı olsun diye açık ifadeler kullanmaya çalıştım... PDX'ler paradox, XLS'ler Excel için tanımlı nesnelerdir.

Kod: Tümünü seç

Procedure ExcelToParadox_ADO(XLSKaynak, PDXHedef:TFileName);
Var
  ADOQueryPDX,
  ADOQueryXLS : TAdoQuery;
  ADOConnPDX,
  ADOConnXLS  : TAdoConnection;
  BagXLS,
  BagPDX : String;
begin
  BagXLS := 'Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;'
          + 'Data Source='+XLSKaynak;
  BagPDX := 'Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Paradox 5.x;'
          + 'Data Source=' + ExtractFilePath(PDXHedef);
  ADOConnPDX  := TADOConnection.Create(Nil);
  ADOConnPDX.LoginPrompt := False;
  ADOConnPDX.ConnectionString := BagPDX;
  ADOConnXLS  := TADOConnection.Create(Nil);
  ADOConnXLS.LoginPrompt := False;
  ADOConnXLS.ConnectionString := BagXLS;

  ADOQueryPDX := TADOQuery.Create(Nil);
  ADOQueryPDX.Connection := ADOConnPDX;
  ADOQueryXLS := TADOQuery.Create(Nil);
  ADOQueryXLS.Connection := ADOConnXLS;

  ADOQueryXLS.SQL.Text := 'SELECT XA, XB, XC FROM [Sayfa1$]';
  ADOQueryXLS.Active := True;
  While NOT ADOQueryXLS.Eof do
  begin
    With ADOQueryPDX do
    begin
      SQL.Clear;
      SQL.Add('INSERT INTO '+ExtractFileName(PDXHedef) );
      SQL.Add('        (   A,    B,    C) ');
      SQL.Add(' VALUES ( :d1,  :d2,  :d3) ');
      Parameters.ParamByName('d1').Value := ADOQueryXLS.FieldByName('XA').AsString;
      Parameters.ParamByName('d2').Value := ADOQueryXLS.FieldByName('XB').AsString;
      Parameters.ParamByName('d3').Value := ADOQueryXLS.FieldByName('XC').AsString;
      ExecSQL;
    end;
    ADOQueryXLS.Next;
  end;
  ADOQueryXLS.Active := False;
  ADOQueryXLS.Free;
  ADOQueryPDX.Free;
  ADOConnPDX.Close;
  ADOConnXLS.Close;
  Application.ProcessMessages;
  ADOConnPDX.Free;
  ADOConnXLS.Free;
  ShowMessage('Aktarma Bitti');
end;
Kullanımı basit

Kod: Tümünü seç

  ExcelToParadox_ADO('D:\DOC\Kitap1.xls', 'D:\DOC\pdx.DB');
- Başarılar...
En son mrmarman tarafından 24 Ara 2005 11:16 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Tekrar selam...

- Okumuş olabilirsiniz diye yeni cevap olarak yazıyorum. Mesajı da EDIT ediyorum..

- Sistemimdeki ODBC sürücülerini düzeltince ilk bahsettiğim tek sorguda aktarma çalıştı... :lol:

- Böylece iki türlüsünün de örneğini vermiş olduk... 8)
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Yazmış olduğunuz kod için çok teşekkür ediyorum. Allah Razı olsun kodu denedikten sonra cevabı yazarım birde Query1 "d1" , "d2" ,"d3" ve ADOQuery de "XA","XB","XC" tanımlamalımıyım?



Parameters.ParamByName('d1').Value := ADOQueryXLS.FieldByName('XA').AsString;
Parameters.ParamByName('d2').Value := ADOQueryXLS.FieldByName('XB').AsString;
Parameters.ParamByName('d3').Value := ADOQueryXLS.FieldByName('XC').AsString
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- A, B, C denemek için oluşturduğum Paradox DB'nin alan isimleridir.

- XA, XB, XC ise Excel'deki sütun isimleri olarak örneklemek istedim. Yazmayı unutmuşum...

- Bana sorarsan önce, ilk yazdığım tek SQL ile halletmeyi dene..
Resim
Resim ....Resim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@ozcank

Burada verilen örnekler, senin projenle aynı olmayacaktır genellikle.Mühim olan mantığını kavramaktır ve kendi projene monte edebilmen için de gereklidir.Her zaman önceliği olayın mantığını kavramaya vermen ezbere iş yapmandan iyi olacaktır.Bugün ezbere yapılan bir işlem, yarın sorun çıktığında daha çok eziyet verir.Bu nedenle kod ya da mantık önerildiğinde olayın mantığını ön plana almanı salık veririm.

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

Mesaj gönderen ozcank »

DB ve Excel İsimlerini yerleştiriyorum fakat hata alıyorum ;

[Error] Unit1.pas(69): Undeclared identifier: 'AKTARMA'

Kod: Tümünü seç

 With AdoQuery1 do 
  begin 
    SQL.Clear; 
    SQL.Add('INSERT INTO ' + AKTARMA.DB ); 
    SQL.Add(' (A, B, C)'); 
    SQL.Add('SELECT XA, XB, XC from [Sayfa1$] IN "'+GIRESUN.XLS+'" "Excel 8.0;"'); 
    ExecSQL; 
  end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Aktarma.DB 'yi ve Giresun.XLS'leri tırnak içerisinden neden çıkardın ? Örnekte gösterdiğim gibi değişkene alıp denersen basit hatalar yapmamış olursun...
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Bu şekilde çalıştı fakat başka bir hata alıyorum ;

ADOQuery1:Cannot perform this operation on an open dataset

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
 With AdoQuery1 do
  begin
    SQL.Clear;
    SQL.Add('INSERT INTO ' + 'AKTARMA.DB');
    SQL.Add(' (A, B, C, D, E, F, G)');
    SQL.Add('SELECT A, B, C, D, E, F, G from [Sayfa1$] IN " '+'GIRESUN.XLS'+'" "Excel 8.0;"');
   ExecSQL;
  end
end;

Cevapla