Skip to main content

AccessTr.neT


Excelden Veri Alma Ve Kaydı Güncelleme

Excelden Veri Alma Ve Kaydı Güncelleme

#98
Aşağıdaki resimde test sonuçları var ne kadar güvenilir emin değilim kendiniz karar verirsiniz ama bana süreyi daha kısa gösteriyor gibi geldi
Testin nasıl yapıldığını anlatayım
ekleme kodları dışında her şeyiyle özdeş 4 çalışma var
testin ilk kısmında boş tablolara excelden 1500 kayıt ekleniyor
(bu 1500 kaydın 750 si asıl exceldeki -3000 kayıtlık - kayıtlarla birebir aynıyken
750 tanesinde sadece 1 alana fazladan a harfi eklenmiş)
2 kısımda ise bu sefer 3000 kayıtlı asıl dosyadan veri almaya çalışıyoruz
yani 2. testte hem ekleme hem de güncelleme yapıyoruz
Transfer Yöntemleri
1. Yöntemde normal ilk kullaılan kod var
    Do While Not rs.EOF And Not rs.BOF 'Tablo güncelleme icin(Exceldeki recordseti icine alinan veriler icin döngü)
        If DCount("[kod]", "tesisler", "[kod] = '" & rs(0) & "'") > 0 Then 'Eger tesisler deki kod sütununda excelden alinan recordset icindeki veri mevcutsa

            CurrentDb.Execute _
            "UPDATE tesisler SET [kod] = """ & rs(0) & """," & _
                              "[Kaynak] = """ & rs(1) & """," & _
                              "[Tarih] = '" & rs(2) & "'," & _
                              "[tesis] = """ & rs(3) & """," & _
                              "[bolum] = """ & rs(4) & """," & _
                              "[Tespit_eden] = """ & rs(5) & """," & _
                              "[gozlem] = """ & rs(6) & """," & _
                              "[oneriler] = """ & rs(7) & """," & _
                              "[sorumlu] = """ & rs(8) & """," & _
                              "[termin_tarihi] = '" & rs(9) & "'," & _
                              "[sorumlu_gorusu] = """ & rs(10) & """," & _
                              "[tamamlama_tarihi] = '" & rs(11) & "'," & _
                              "[durum] = '" & rs(12) & "'" & _
                              "WHERE [kod] = """ & rs(0) & """"
             
                  

            say = say + 1

        ElseIf DCount("[kod]", "tesisler", "[kod] = """ & rs(0) & """") = 0 Then 'Eger tesisler deki kod sütununda excelden alinan recordset icindeki veri mevcut degilse

            CurrentDb.Execute _
                        "INSERT INTO tesisler" _
                            & " ([kod], [kaynak], [tarih], [tesis], [bolum],[Tespit_eden],[gozlem],[oneriler],[sorumlu],[termin_tarihi],[sorumlu_gorusu],[tamamlama_tarihi],[durum])" _
                            & " VALUES ( """ & rs(0) & """ , """ & rs(1) & """ , '" & Format(rs(2), "dd.mm.yyyy") & "', """ & rs(3) & """, """ & rs(4) & """, """ & rs(5) & """, """ & rs(6) & """, """ & rs(7) & """, """ & rs(8) & """, '" & Format(rs(9), "dd.mm.yyyy") & "', """ & rs(10) & """, '" & Format(rs(11), "dd.mm.yyyy") & "', """ & rs(12) & """ );" 'Kayit ekle exceldekinde olup accesste mevcut olmayan veri

            say1 = say1 + 1
        End If

        rs.MoveNext
    Loop
2. Yöntemde
    Do While Not rs.EOF And Not rs.BOF 'Tablo güncelleme icin(Exceldeki recordseti icine alinan veriler icin döngü)
       SrgK = " select * from tesisler where [kod]='" & Replace(rs(0), "'", "''") & "'"
       rsK.Open SrgK, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
       If rsK.RecordCount = 0 Then 'rsK.MoveFirst
            rsK.AddNew
            rsK(1) = rs(0)
            rsK(2) = rs(1)
            rsK(3) = rs(2)
            rsK(4) = rs(3)
            rsK(5) = rs(4)
            rsK(6) = rs(5)
            rsK(7) = rs(6)
            rsK(8) = rs(7)
            rsK(9) = rs(8)
            rsK(10) = rs(9)
            rsK(11) = rs(10)
            rsK(12) = rs(11)
            rsK(13) = rs(12)
            rsK.Update
            say1 = say1 + 1
       Else
'            rsK.EditMode
'            rsK(1) = rs(0)
            rsK(2) = rs(1)
            rsK(3) = rs(2)
            rsK(4) = rs(3)
            rsK(5) = rs(4)
            rsK(6) = rs(5)
            rsK(7) = rs(6)
            rsK(8) = rs(7)
            rsK(9) = rs(8)
            rsK(10) = rs(9)
            rsK(11) = rs(10)
            rsK(12) = rs(11)
            rsK(13) = rs(12)
            rsK.Update
            say = say + 1
       End If
       rsK.Close
       rs.MoveNext
    Loop
3. ve 4. yöntem temelde aynı 3. yöntemde ortak kayıtlar silini exceldekiler tekrar alınırken
4.de ortaklardan farklı olan güncellenip tabloda olmayanlar ekleniyor
3. Yöntem
BasZmn = Now
'hy_Geçici_tablo_var_mı_varsa_sil_____
   If Not IsNull(DLookup("Name", "MSysObjects", "Name='TmpTablo'")) Then DoCmd.DeleteObject acTable, "TmpTablo"
'hy_tablo_kontrol____________________Bitti
TestBil = ""

DoCmd.TransferSpreadsheet TransferType:=acLink, _
                          TableName:="TmpTablo", _
                          SpreadsheetType:=10, _
                          FileName:=yahya, _
                          HasfieldNames:=True, _
                          Range:="Sayfa1$B2:N" '"Hy bin 2!B3:E"

'hy Tablo Boş Mu_____________
Dim SayRS As New ADODB.Recordset
Dim SaySql As String

SaySql = "select * from TmpTablo" 'öğretmenler tablosundan öğretmen seç

    SayRS.Open SaySql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    KytSay = SayRS(0)
     Krt = " where [" & SayRS(0).Name & "] Is Not Null"
    SayRS.Close
    SayRS.Open SaySql & Krt, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    If SayRS.RecordCount = 0 Then
        DoCmd.DeleteObject acTable, "TmpTablo"
        MsgBox "Tabloda veri yok"
        Exit Sub
    End If
    SayRS.Close

'hy Excel Boş Mu_____________Bitti
KytSy1 = DCount("*", "TmpTablo")

CurrentDb.Execute " delete from tesisler where [KOD] in (select [KOD] from TmpTablo)"
KytSy1Gncl = KytSy1 - DCount("*", "tesisler")


CurrentDb.Execute " INSERT INTO tesisler " & _
                 " ( [kod], [kaynak], [tarih], [tesis], [bolum],[Tespit_eden],[gozlem],[oneriler],[sorumlu],[termin_tarihi],[sorumlu_gorusu],[tamamlama_tarihi],[durum] ) " & _
                 " SELECT [KOD],[Kaynak],[Tarih],[Tesis],[Yer/Bölüm],[Tespit Yapan],[Uygunsuzluk/Ramak Kala/Gözlem],[Önerilen Aksiyon],[sorumlu],[Termin tarihi],[Sorumlu Görüşü/Kararı],[Tamamlama Tarihi],[Durum] " & _
                 " FROM TmpTablo where [KOD] Is Not Null"

KytSyEk = DCount("*", "tesisler") - KytSy1

Me.tesisler.Requery

    CurrentDb.TableDefs.Refresh
4. Yöntem
BasZmn = Now
'hy_Geçici_tablo_var_mı_varsa_sil_____
  If Not IsNull(DLookup("Name", "MSysObjects", "Name='TmpTablo'")) Then DoCmd.DeleteObject acTable, "TmpTablo"
'hy_tablo_kontrol____________________Bitti
TestBil = ""

DoCmd.TransferSpreadsheet TransferType:=acLink, _
                          TableName:="TmpTablo", _
                          SpreadsheetType:=10, _
                          FileName:=yahya, _
                          HasfieldNames:=True, _
                          Range:="Sayfa1$B2:N" '"Hy bin 2!B3:E"

'hy Tablo Boş Mu_____________
Dim SayRS As New ADODB.Recordset
Dim SaySql As String

SaySql = "select * from TmpTablo"

    SayRS.Open SaySql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    KytSay = SayRS(0)
    Krt = " where [" & SayRS(0).Name & "] Is Not Null"
    SayRS.Close
    SayRS.Open SaySql & Krt, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    If SayRS.RecordCount = 0 Then
        DoCmd.DeleteObject acTable, "TmpTablo"
        MsgBox "Tabloda veri yok"
        Exit Sub
    End If
    SayRS.Close

'hy Excel Boş Mu_____________Bitti
SaySql = " SELECT Count([TmpTablo]![KOD]) AS GnclSay " & _
        " FROM TmpTablo INNER JOIN tesisler ON TmpTablo.KOD = tesisler.kod " & _
        " WHERE ((([tesisler]![kaynak] & [tesisler]![tarih] & [tesisler]![tesis] & [tesisler]![bolum] &  " & _
        " [tesisler]![tespit_eden] & [tesisler]![gozlem] & [tesisler]![oneriler] & [tesisler]![sorumlu] &  " & _
        " [tesisler]![termin_tarihi] & [tesisler]![sorumlu_gorusu] & [tesisler]![tamamlama_tarihi] &  " & _
        " [tesisler]![durum])<>([TmpTablo]![Kaynak] & [TmpTablo]![Tarih] & [TmpTablo]![Tesis] &  " & _
        " [TmpTablo]![Yer/Bölüm] & [TmpTablo]![Tespit Yapan] & [TmpTablo]![Uygunsuzluk/Ramak Kala/Gözlem] &  " & _
        " [TmpTablo]![Önerilen Aksiyon] & [TmpTablo]![Sorumlu] & [TmpTablo]![Termin Tarihi] &  " & _
        " [TmpTablo]![Sorumlu Görüşü/Kararı] & [TmpTablo]![Tamamlama Tarihi] & [TmpTablo]![Durum])));"


    SayRS.Open SaySql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    GuncellenecekKyt = SayRS(0)
    SayRS.Close


SqlGuncelle = " UPDATE TmpTablo INNER JOIN tesisler ON TmpTablo.KOD = tesisler.kod  " & _
              " SET " & _
              " tesisler.kaynak = [TmpTablo]![Kaynak],  " & _
              " tesisler.Tarih = [TmpTablo]![Tarih],  " & _
              " tesisler.tesis = [TmpTablo]![Tesis],  " & _
              " tesisler.bolum = [TmpTablo]![Yer/Bölüm],  " & _
              " tesisler.tespit_eden = [TmpTablo]![Tespit Yapan],  " & _
              " tesisler.gozlem = [TmpTablo]![Uygunsuzluk/Ramak Kala/Gözlem],  " & _
              " tesisler.oneriler = [TmpTablo]![Önerilen Aksiyon],  " & _
              " tesisler.sorumlu = [TmpTablo]![sorumlu],  " & _
              " tesisler.termin_tarihi = [TmpTablo]![Termin tarihi],  " & _
              " tesisler.sorumlu_gorusu = [TmpTablo]![Sorumlu Görüşü/Kararı],  " & _
              " tesisler.tamamlama_tarihi = [TmpTablo]![Tamamlama Tarihi],  " & _
              " tesisler.durum = [TmpTablo]![Durum] " & _
              " WHERE (((TmpTablo.KOD) In (SELECT tesisler.kod " & _
              " FROM TmpTablo INNER JOIN tesisler ON TmpTablo.KOD = tesisler.kod " & _
              " WHERE ((([tesisler]![kaynak] & [tesisler]![tarih] & [tesisler]![tesis] & [tesisler]![bolum] &  " & _
              " [tesisler]![tespit_eden] & [tesisler]![gozlem] & [tesisler]![oneriler] & [tesisler]![sorumlu] &  " & _
              " [tesisler]![termin_tarihi] & [tesisler]![sorumlu_gorusu] & [tesisler]![tamamlama_tarihi] &  " & _
              " [tesisler]![durum])<> " & _
              " ([TmpTablo]![Kaynak] & [TmpTablo]![Tarih] & [TmpTablo]![Tesis] & [TmpTablo]![Yer/Bölüm] &  " & _
              " [TmpTablo]![Tespit Yapan] & [TmpTablo]![Uygunsuzluk/Ramak Kala/Gözlem] &  " & _
              " [TmpTablo]![Önerilen Aksiyon] & [TmpTablo]![Sorumlu] & [TmpTablo]![Termin Tarihi] &  " & _
              " [TmpTablo]![Sorumlu Görüşü/Kararı] & [TmpTablo]![Tamamlama Tarihi] & [TmpTablo]![Durum]))) )));"
CurrentDb.Execute SqlGuncelle

SaySql = " SELECT Count(TmpTablo.KOD) AS SayKOD " & _
        " FROM tesisler RIGHT JOIN TmpTablo ON tesisler.kod = TmpTablo.KOD " & _
        " GROUP BY tesisler.kod " & _
        " HAVING (((Count(TmpTablo.KOD)) Is Not Null) AND ((tesisler.kod) Is Null))"


    SayRS.Open SaySql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    EklenecekKyt = SayRS(0)
    SayRS.Close

SqlEkle = " INSERT INTO tesisler ( kod, kaynak, tarih, tesis, bolum, Tespit_eden, gozlem, oneriler, sorumlu, termin_tarihi, sorumlu_gorusu, tamamlama_tarihi, durum )" & _
          " SELECT TmpTablo.KOD, TmpTablo.Kaynak, TmpTablo.Tarih, TmpTablo.Tesis, TmpTablo.[Yer/Bölüm], TmpTablo.[Tespit Yapan], TmpTablo.[Uygunsuzluk/Ramak Kala/Gözlem], TmpTablo.[Önerilen Aksiyon], TmpTablo.sorumlu, TmpTablo.[Termin tarihi], TmpTablo.[Sorumlu Görüşü/Kararı], TmpTablo.[Tamamlama Tarihi], TmpTablo.Durum" & _
          " FROM tesisler RIGHT JOIN TmpTablo ON tesisler.kod = TmpTablo.KOD" & _
          " WHERE (((TmpTablo.KOD) Is Not Null) AND ((tesisler.kod) Is Null))"

CurrentDb.Execute SqlEkle

Me.tesisler.Requery

    CurrentDb.TableDefs.Refresh
    'DoCmd.DeleteObject acTable, "TmpTablo"
BitZmn = Now

[Resim: do.php?img=9542]
.rar TransferKarsilastirma_hy.rar (Dosya Boyutu: 607,83 KB | İndirme Sayısı: 12)
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da

Bu Konudaki Yorumlar
Cvp: Excelden Veri Alma Ve Kaydı Güncelleme - Yazar: berduş - 07/02/2020, 15:48
Task