Exceldeki verileri veritabanına yazma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

tekrar mrb,
bu konuyla ilgili yine bi sorunla karşılaştım:) sorun şu :
ben forma iki tane edit koydum. birine barkod başlangıç numarasını dierine barkod adetini giriyorum.butona tıkladığımda o başlangıç numarası ile istenen adet kadar 1 artırarak barkod numaralarını ALICIDATA adındaki tabloma kaydediyorum.daha sonra ad ve soyad alanlarını excelden aktarmak istiyorum.bu aktarmadada sorun yok fakat önce barkod numaralarını kaydettiğim için ad ve soyadları barkodun bittiği satırın altından itibaren aktarıyor.yani diyelimki 4 tane barkod no kayıtlı tabloda, ad soyadları aktardığım zaman 5.satırdan başlayıp devam ediyor oysaki 1.barkod numarasının karşısına 1. ad ve soyadı, 2. barkod numarasının karşısına 2. ad ve soyadı.... kaydetmesi lazım.
bunun için yukarda verdiğim kodlara ilave olarak aşağıdaki satırları ekledim ama yine olmadı .

Kod: Tümünü seç

...
            if (str <> '') then
            begin
                Update;
                dm.ALICIDATA.First;
                while not dm.ALICIDATA.Eof do
                begin
                   dm.ALICIDATA.Edit;
                   for sutun:=1 to 2 do
                       dm.ALICIDATA.Fields[sutun+1].AsString :=sheet.cells[satir, sutun];
                   dm.ALICIDATA.post;
                   dm.ALICIDATA.next;
                end;
            end;
...
kolay gelsin..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

selam,
yukarıdaki bahsettiğim sorunu biraz daha açık anlatsam cvp gelirmi acaba :?

örneğin ;
barkod başlangıç numarası 25000 ve adet 4 olsun .
exceldeki ad soyad alanlarımdaki değerlerde aşağıdaki gibi olsun:

AD SOYAD
ayşe can
fatma han
ali kan
veli sam


olmasını istediğim sonuç :

250001 ayşe can
250002 fatma han
250003 ali kan
250004 veli sam


ama görünen sonuç :

250001 veli sam
250002 veli sam
250003 veli sam
250004 veli sam


umarım anlatabilmişimdir. ii çalışmalar..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

neyse sorunu hallettim.

kolay gelsin herkese.
Bilginin temelini sağlam at depremde zarar görmesin
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen denizfatihi »

Merhaba,

Konu eski ama tekrar başlık açmaktansa ve konunun devamı olması sebebiyle birş ey merak ediyorum.
Şöyle ki bir excel kitabını aktarırken içinde 3 sayfa olsun Sayfa1, Sayfa2 ve Sayfa3 gibi birinci sayfayı import sonrası otomatik olarak sayfa2'ye ve sonra Sayfa3'çe geçsin aynı zamanda okuyup yazarken veritabanı içine bir sütuna hangi sayfadan okunduğunu nasıl yazarım, birde mükerrer satır varsa import yapmaması, normalde import esnasında sayfa bazında aşağıdaki kodu kullanıyorum ama yukarıda bahsettiğim olayı kod üzerinde iyileştirme yaparaktan nasıl daha aktif yapabilirim ? şimdiden ilginize ve yardımlarınıza teşekkür ederim.

Kod: Tümünü seç

procedure TForm6.BitBtn2Click(Sender: TObject);
Const
  xlCellTypeLastCell = $0000000B;
var
    book:variant;
    excel,sheet:variant;
    satir, sutun:integer;
    str :string;
begin
    excel := createOleObject('Excel.application');
    OpenDialog1.Filter := 'Excel Dosyaları (*.xls;*.xlsx)|*.xls;*.xlsx';
    if opendialog1.Execute then
    begin
        book:= Excel.WorkBooks.Open(OpenDialog1.FileName);
        try
            Screen.Cursor := crHourGlass;
            sheet := book.worksheets['TOTAL'];

            for satir:=3+1 to Excel.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row do
            begin
                str := sheet.cells[satir, 1];
                if (str <> '') then

                begin
                    Update;
                    ADOQuery2.Append;
                    ADOQuery2TARIH.AsString:=DateToStr(VarToDateTime(excel.ActiveSheet.Cells[satir,1].Value));
                    ADOQuery2SAYFA.AsString:='TOTAL';
                    ADOQuery2SNO.AsString:=(excel.ActiveSheet.Cells[satir,2].Value);
                    ADOQuery2TITLE.AsString:=(excel.ActiveSheet.Cells[satir,3].Value);
                    ADOQuery2CHANNEL.AsString:=(excel.ActiveSheet.Cells[satir,4].Value);
                    ADOQuery2DATE.AsString:=DateToStr(VarToDateTime(excel.ActiveSheet.Cells[satir,5].Value));
                    ADOQuery2START_TIME.AsString:=TimeToStr(VarToDateTime(excel.ActiveSheet.Cells[satir,6].Value));
                    ADOQuery2END_TIME.AsString:=TimeToStr(VarToDateTime(excel.ActiveSheet.Cells[satir,7].Value));
                    ADOQuery2GENRE.AsString:=(excel.ActiveSheet.Cells[satir,8].Value);
                    ADOQuery2RTGNET.AsString:=(excel.ActiveSheet.Cells[satir,9].Value);
                    ADOQuery2SHARENET.AsString:=(excel.ActiveSheet.Cells[satir,10].Value);
                    ADOQuery2TVR.AsString:=(excel.ActiveSheet.Cells[satir,11].Value);
                    ADOQuery2.Post;
                end;
            end;
            Excel.quit;
        finally
            Screen.Cursor := crDefault;
        end;
end;
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen ertank »

Merhaba,

Ekteki örnek uygulama yol gösterici olacaktır. Aşağıdaki kısa kod örnekleri sizin yukarıda verdiğiniz koda uygun olarak verilmiştir.

-Bir Excel dosyası içinde kaç sayfa olduğunu aşağıdaki şekilde öğrenebilirsiniz.

Kod: Tümünü seç

Book.WorkSheets.Count;
- Excel dosyasının çalışma sayfasını isim değil indeks numarası ile aşağıdaki gibi değiştirebilirsiniz.

Kod: Tümünü seç

Sheet := Book.WorkSheets[1];
-Excel dosyasının çalışma sayfasının adını aşağıdaki gibi öğrenebilirsiniz.

Kod: Tümünü seç

Sheet.Name;
Mükerrer satır kontrolü kısmını database tarafına bırakmakta fayda olduğunu düşünüyorum. Kayıt işlemine başlamadan ilgili kayıt var mı kontrol edip yok ise kaydı girebilirsiniz. Ancak database yapısı ve mükerrer satır tanımı bilinmediği için örnek kod yazmak çok doğru olmayacaktır.
Dosya ekleri
excelworksheet.rar
(2.68 KiB) 136 kere indirildi
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen greenegitim »

Ben genelde excelden memorytable a alıp delphi tarafında kontrolleri yapıp gerçek database e aktarım yapıyorum. bu şekilde kullanmayı deneyebilirsiniz.
Mücadele güzelleştirir!
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen denizfatihi »

Sayın ertank ve Sayın greenegitim

Yardımınız için çok teşekkür ederim.

ertank istediğim tam olarak buydu tekrar tekrar teşekkür ederim.
greenegitim bastettiğiniz memorytable olarak değilde veri tabanına mssql geçici tablo ile bu durumu aşabilir miyim ? Veritabanın da 3 alana göre kontrol etmem gerekiyor, bu alanları convert ile varchar alana dönüştürüp tek satır halinde kontrol etmem gerekiyor, bunlar tarih, sıra_no, ve saat alanları olacak şekilde.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen greenegitim »

Tam olarak içeriğinizi bilmiyorum ama tercih size kalmış delphi son versiyonlarını kullanıyorsanız fdmemtable bileşenini veya kbmemtable bileşenini inceleyebilirsiniz.
Mücadele güzelleştirir!
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen denizfatihi »

Merhaba,

Yeni başlık açmak istemedim konunun devamı olabilir diye, aşağıdaki kod ile stringgirdi geçici tabloya almak istiyorum, yalnız aşağıda ki hata ile karşılaşıyorum, yardımınızı rica ederim, herkese kolay gelsin.

Kod: Tümünü seç

var
i : integer;
begin
for i := 0 to StringGrid1.RowCount do
begin
  ClientDataSet1.Append();
  ClientDataSet1.FieldByName('A').AsString := StringGrid1.Cells[0, i];
  ClientDataSet1.FieldByName('B').AsString := StringGrid1.Cells[1, i];
  ClientDataSet1.FieldByName('C').AsString := StringGrid1.Cells[2, i];

  ClientDataSet1.Post();
hata kodu,

Kod: Tümünü seç

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EDatabaseError with message 'ClientDataSet1: Cannot perform this operation on a closed dataset'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen aslangeri »

ClientDataset1 i open etmeyi unutmuşsunuz.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen denizfatihi »

Merhaba,

Teşekkür ederim sn.aslangeri fakat hata devam ediyor.
Kullanıcı avatarı
proteknikblg
Üye
Mesajlar: 35
Kayıt: 27 Nis 2006 08:39
Konum: Sivas
İletişim:

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen proteknikblg »

Kod: Tümünü seç

for i := 0 to StringGrid1.RowCount do 
i 0' dan başladığı için satir sayısının 1 azaltman gerekmekte

Kod: Tümünü seç

for i := 0 to StringGrid1.RowCount-1 do 
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen aslangeri »

Eğer aldığın hata aynı hata ise ClientDataset1 döngüye başlamadan önce open etmeniz lazım.
Farklı hata ise hata mesajı nedir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen denizfatihi »

Merhaba,

Hata kodu bu sefer değişti.

Kod: Tümünü seç

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EDatabaseError with message 'ClientDataSet1: Missing data provider or data packet'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: Exceldeki verileri veritabanına yazma

Mesaj gönderen denizfatihi »

Tekrar Merhaba,

ClientDataSet eklemek yetmiyormuş tekrardan oluşturunca sorun düzeldi, destek ve yardım için teşekkür ederim.

Kod: Tümünü seç

procedure TForm1.BitBtn4Click(Sender: TObject);
var
i : integer;
begin
 ClientDataSet1.CreateDataSet; 
  ClientDataSet1.Active := true;
  // ClientDataSet1.Open();
for i := 0 to StringGrid1.RowCount do
begin


  ClientDataSet1.Append();
  ClientDataSet1.FieldByName('A').AsString := StringGrid1.Cells[0, i];
  ClientDataSet1.FieldByName('B').AsString := StringGrid1.Cells[1, i];
  ClientDataSet1.FieldByName('C').AsString := StringGrid1.Cells[2, i];
// vs. kaç alan varsa
  ClientDataSet1.Post();
Cevapla