Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
iç içe döngüyle excelden veri tabanına kayıt alma sorunu?[SORUN ÇÖZÜLDÜ]
#1
ŞABAN AKMAN HOCAMIN KATKILARI İLE SORUN ÇÖZÜLMÜŞTÜR. TEŞEKKÜRLER
Arkadaşlar selamlar saygılar. Yazdığım okul programında bir güncelleme yapacağım. Kullanıcının seçtiği excel dosyasının başlıklarını tabloda alan adı olarak oluşturuyorum. Akabinde bu alan adlarına excel dosyasındaki satırları aktarmam gerekiyor. bunun için iç içe döngü kurdum. 
VAR
 EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
 SAYFA: Variant;
 cs : STRING;
begin
  IF OpenDialog1.Execute THEN BEGIN                        
        EXCELDOSYASI:=CreateOleObject('excel.application');     
        EXCELDOSYASI.Visible:=false;                             
          EXCELDOSYASI.workbooks.open[OpenDialog1.FileName];    
          exceldebilgisayisi;
          
     FOR EXCELDEKISUTUN:=1 to KACSUTUN DO  // exceldeki sütun sayısı 
         BEGIN
         FOR EXCELDEKISATIR:=2 to KACSATIR DO  // exceldeki satır sayısı 
         BEGIN
         ADOTable1.Open;
         ADOTable1.Append;
         ADOTable1.FieldByName(exceldosyasi.ActiveSheet.Cells[1,EXCELDEKISUTUN].Value).AsVariant:= exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].Value;
      END;
    END;
   END;
END;
ancak excelde 30 satır olmasına karşın 300 üzerinde kayıt atıyor. Sanıyorum ki döngü mantığını kuramadım. Bu işlemi nasıl gerçekleştirebilirim. Yapılan işlem ile kullanıcı önce excel dosyasını seçiyor bu seçilen dosyaya göre alan adları oluşturuluyor. Sonra bu alan adlarına denk gelecek şekilde exceldeki satırları aktaracağım. Yardımcı olacak arkadaşlara teşekkür ederim. Saygıyla kalınız..
Cevapla
#2
İyi günler. Döngüden önce Open yapmak yeterli ama fazlalık kayıtlarınızın nedeni her satır ve sütün için Append metodunu kullanmanızdır. Bunun yerine önce satırların döngüsünü kurup Append yapıldıktan sonra sütun değerlerini atamanız ve sonunda mutlaka Post ile kayıt etmeniz gerekmektedir.
var
 EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
SAYFA: Variant;
cs : string;
begin
 if Opendialog1.Execute THEN begin                        
   EXCELDOSYASI:=CreateOleObject('excel.application');     
   EXCELDOSYASI.Visible:=false;                             
   EXCELDOSYASI.workbooks.open[Opendialog1.FileName];    
   exceldebilgisayisi;
   ADOTable1.Open;//kayıtları ele almadan önce bir kere açmak yeterlidir...     
   for EXCELDEKISATIR:=2 to KACSATIR do  // exceldeki satır sayısı 
   begin //her satır bir kayıt demektir...
     ADOTable1.Append; //kayıt eklenir
     for EXCELDEKISUTUN:=1 to KACSUTUN do  // exceldeki sütun sayısı 
     begin //tüm satırlara değerler yazılır                
       ADOTable1.FieldByName(exceldosyasi.ActiveSheet.Cells[1,EXCELDEKISUTUN].Value).AsVariant:= exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].Value;
     end;
     ADOTable1.Post;//satırlar yazıldıktan sonra tüm sütunların değerleri tabloya kayıt edilir...
   end;
 end;
end;
Eğer burada Post metodu kullanılmazsa program ADOTAble1.Append koduyla değerleri (arka planda önce Post yaptığı için) yine veritabanına yazacaktır fakat son excel satırı için döngü bu satıra gelmeyeceği için kayıt etmeyecek ve yazma modunda bekleyecektir. Tablo bir şekilde kapatıldığında ise bu değerler tabloya yazılmayacağından son bir satır eksik kaydınız olacaktır. O yüzden yukarıdaki gibi değerler yazıldıktan sonra değerleri Post ile yazılması gerekmektedir. İyi çalışmalar.
Cevapla
#3
(20-01-2019, Saat: 08:14)sabanakman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.İyi günler. Döngüden önce Open yapmak yeterli ama fazlalık kayıtlarınızın nedeni her satır ve sütün için Append metodunu kullanmanızdır. Bunun yerine önce satırların döngüsünü kurup Append yapıldıktan sonra sütun değerlerini atamanız ve sonunda mutlaka Post ile kayıt etmeniz gerekmektedir.
var
 EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
SAYFA: Variant;
cs : string;
begin
 if Opendialog1.Execute THEN begin                        
   EXCELDOSYASI:=CreateOleObject('excel.application');     
   EXCELDOSYASI.Visible:=false;                             
   EXCELDOSYASI.workbooks.open[Opendialog1.FileName];    
   exceldebilgisayisi;
   ADOTable1.Open;//kayıtları ele almadan önce bir kere açmak yeterlidir...     
   for EXCELDEKISATIR:=2 to KACSATIR do  // exceldeki satır sayısı 
   begin //her satır bir kayıt demektir...
     ADOTable1.Append; //kayıt eklenir
     for EXCELDEKISUTUN:=1 to KACSUTUN do  // exceldeki sütun sayısı 
     begin //tüm satırlara değerler yazılır                
       ADOTable1.FieldByName(exceldosyasi.ActiveSheet.Cells[1,EXCELDEKISUTUN].Value).AsVariant:= exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].Value;
     end;
     ADOTable1.Post;//satırlar yazıldıktan sonra tüm sütunların değerleri tabloya kayıt edilir...
   end;
 end;
end;
Eğer burada Post metodu kullanılmazsa program ADOTAble1.Append koduyla değerleri (arka planda önce Post yaptığı için) yine veritabanına yazacaktır fakat son excel satırı için döngü bu satıra gelmeyeceği için kayıt etmeyecek ve yazma modunda bekleyecektir. Tablo bir şekilde kapatıldığında ise bu değerler tabloya yazılmayacağından son bir satır eksik kaydınız olacaktır. O yüzden yukarıdaki gibi değerler yazıldıktan sonra değerleri Post ile yazılması gerekmektedir. İyi çalışmalar.
Şaban hocam çok açıklayıcı ve doyurucu bir cevap vermişsiniz. Çok teşekkür ediyorum. Yazılıma 4-5 yıldır ara vermiştim. Körelmişim. Dediklerinizi yaptım gayet güzel güzel çalıştı. Yalnız field alanlara hep aynı kayıtları atıyor. Bunu çözemedim. Örneğin ilk sütün tarih sütunu.. Tarih sütununa exceldeki tarih sütunundaki verileri, sonra diğer sütunlarla devam etmesi gerekiyor. Ama tüm alanlara tarih sütunundaki verileri aktarıyor. Bunu nasıl çözebilirim? Teşekkür eder saygılar dilerim.
Cevapla
#4
O kısmı dikkatten kaçmış. Sütunları 1 den değil ilgili sütundan almak gerekmektedir.
var
 EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
SAYFA: Variant;
cs : string;
begin
 if Opendialog1.Execute THEN begin                        
   EXCELDOSYASI:=CreateOleObject('excel.application');     
   EXCELDOSYASI.Visible:=false;                             
   EXCELDOSYASI.workbooks.open[Opendialog1.FileName];    
   exceldebilgisayisi;
   ADOTable1.Open;//kayıtları ele almadan önce bir kere açmak yeterlidir...     
   for EXCELDEKISATIR:=2 to KACSATIR do  // exceldeki satır sayısı 
   begin //her satır bir kayıt demektir...
     ADOTable1.Append; //kayıt eklenir
     for EXCELDEKISUTUN:=1 to KACSUTUN do  // exceldeki sütun sayısı 
     begin //tüm satırlara değerler yazılır                
       ADOTable1.FieldByName(exceldosyasi.ActiveSheet.Cells[1,EXCELDEKISUTUN].Value).AsVariant:= exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,EXCELDEKISUTUN].Value;
     end;
     ADOTable1.Post;//satırlar yazıldıktan sonra tüm sütunların değerleri tabloya kayıt edilir...
   end;
 end;
end;
Cevapla
#5
(20-01-2019, Saat: 10:32)sabanakman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.O kısmı dikkatten kaçmış. Sütunları 1 den değil ilgili sütundan almak gerekmektedir.
var
 EXCELDEKISATIR,EXCELDEKISUTUN:Integer;
SAYFA: Variant;
cs : string;
begin
 if Opendialog1.Execute THEN begin                        
   EXCELDOSYASI:=CreateOleObject('excel.application');     
   EXCELDOSYASI.Visible:=false;                             
   EXCELDOSYASI.workbooks.open[Opendialog1.FileName];    
   exceldebilgisayisi;
   ADOTable1.Open;//kayıtları ele almadan önce bir kere açmak yeterlidir...     
   for EXCELDEKISATIR:=2 to KACSATIR do  // exceldeki satır sayısı 
   begin //her satır bir kayıt demektir...
     ADOTable1.Append; //kayıt eklenir
     for EXCELDEKISUTUN:=1 to KACSUTUN do  // exceldeki sütun sayısı 
     begin //tüm satırlara değerler yazılır                
       ADOTable1.FieldByName(exceldosyasi.ActiveSheet.Cells[1,EXCELDEKISUTUN].Value).AsVariant:= exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,EXCELDEKISUTUN].Value;
     end;
     ADOTable1.Post;//satırlar yazıldıktan sonra tüm sütunların değerleri tabloya kayıt edilir...
   end;
 end;
end;

Şaban hocam harikasınız. Uygulama tam istediğim gibi oldu. Kullanıcı hatasını önlemek, uygulamanın kullanımını kolaylaştırmak için birkaç sorgu ve iyileştirme yapacağım. Elinize ve emeğinize sağlık. Teşekkürler... Sorun böylece çözülmüş oldu arkadaşlar...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Comboboxa girilen değere göre veri çekme. bünyamin68 4 170 06-10-2019, Saat: 10:16
Son Yorum: bünyamin68
  [ÇÖZÜLDÜ] Rapor Baskısında 0 değerleri yazılmasın wiseman 2 115 01-10-2019, Saat: 18:04
Son Yorum: wiseman
  Delphi'den SP ile kayıt Aktolgali 4 209 30-09-2019, Saat: 23:05
Son Yorum: Aktolgali
  cxgrid String alan sorunu HuseyinF 7 232 25-09-2019, Saat: 16:54
Son Yorum: HuseyinF
  [ÇÖZÜLDÜ] fast report dil hatası wiseman 6 235 25-09-2019, Saat: 14:29
Son Yorum: wiseman



Konuyu Okuyanlar: 1 Ziyaretçi