[VBA] Veritabanları Arası şartlı Tablo Kopyalama
#1
access-sql-18 
Merhabalar,

2 tane access veritabanım mevcut. Birinde aktif tablolarım mevcut diğeri ise backup için tutuyorum. Aktif kullandığım veritabanından backup olan veritabanına tablomu VBA ile timer ile kopyalama sağlıyorum fakat, aynı isimde bir tablo varsa "yedek (1)" veya "yedek (2)" gibi yapmasını istiyorum. varolan tablonun üstüne kayıt yapıp eski tabloda ki verileri yok etmesini istemiyorum. bunu Excel çıktısında başarılı VBA düzenledim fakat iki access arasında yaparken hatalar alıyorum.

Size aşağıda örnek bir kodlamamı bırakıyorum. Biraz karışık veya mantıklarımda hatalar olabilir    Eek
Ayrıca bu kod umarım ihtiyacınızı da giderir.  Gg

Geri dönüşlerinizi ve yardımlarınızı bekliyorum 

Visual Basic
  1. Function m1()
  2.  
  3.    ' Yedek alınacak veritabanı yolu
  4.    strKaynakPath = CurrentProject.Path & "\database\DBkaynak.accdb"
  5.  
  6.    ' backup veritabanı konumu
  7.    strYedekDB = CurrentProject.Path & "\backup\backup_db.accdb"
  8.  
  9.    ' Oluşturulan Yedek DB bilgisi
  10.    strYedekTbl = Format(Date, "dd") & "_" & Format(Date, "mmmm") & "_" & "kayit"
  11.  
  12.    ' Yedekleme işlemi
  13.    Set objAccess = CreateObject("Access.Application")
  14.    objAccess.OpenCurrentDatabase strKaynakPath
  15.    objAccess.DoCmd.CopyObject strYedekDB, strYedekTbl, acTable, "kayit"
  16.    objAccess.CloseCurrentDatabase
  17.    objAccess.Quit
  18.    
  19.    ' -------------------------------------
  20.    ' Excel Prosedürü
  21.    Dim BTkayit As String
  22.    Dim BTexcel As String
  23.    Dim btName As String
  24.    Dim btNameWithoutExt As String
  25.    Dim btExtension As String
  26.    Dim counter As Integer
  27.    
  28.    ' Tablo
  29.    BTkayit = "kayit"
  30.    
  31.    ' Kaydedilecek konum
  32.    BTexcel = Environ("USERPROFILE") & "\Desktop\"
  33.    
  34.    ' Çıktı bilgisi
  35.    btNameWithoutExt = Format(Date, "mmmm") & " " & "-" & " " & Format(Date, "dd.mm.yyyy")
  36.    btExtension = ".xls"
  37.    btName = BTexcel & btNameWithoutExt & btExtension
  38.    
  39.    ' Kopya kontrolü
  40.    counter = 1
  41.    Do While Dir(btName) <> ""
  42.        counter = counter + 1
  43.        btName = BTexcel & btNameWithoutExt & " güncel " & counter & btExtension
  44.    Loop
  45.    
  46.    ' Excel çıktı komutu
  47.    DoCmd.OutputTo acOutputTable, BTkayit, acFormatXLS, btName
  48.    
  49.    ' Ana tabloyu sıfırlama
  50.    CurrentDb.Execute "DELETE FROM kayit;"
  51.    
  52.    
  53.    ' İşlem tamamlandı mesajı
  54.    MsgBox "Yedekleme tamamlandı. EXCEL dosyası masaüstüne kayıt edildi." & vbNewLine & vbNewLine & vbNewLine & "...OTOMASYONU KAPATIP AÇINIZ...", vbApplicationModal + vbInformation, "BeyTor"
  55. End Function





  Alıntı
Bu mesajı beğenenler:
#2
Sanırım herkes tatildi  Gg



  Alıntı
Bu mesajı beğenenler:
#3
Yazdığınız koda ek satırla, strYedekTbl 1, 2. 3.... oluşturulacak veritabanın da
Visual Basic
  1. Dim Tbl As TableDef
  2. Dim Sy, EnBuyuk As Long
  3.      strYedekTbl = Format(Date, "dd") & "_" & Format(Date, "mmmm") & "_" & "kayit"
  4. For Each Tbl In CurrentDb.TableDefs
  5.    If UBound(Split(Tbl.Name, strYedekTbl)) > 0 Then Sy = Sy + 1
  6. Next Tbl
  7. Debug.Print strYedekTbl & IIf(Sy = 0, vbNullString, "(" & Sy + 1 & ")")


prosedürü ile yeni tablo adı üretilir.

veya

Sizin yazdığınız koda ek olarak    
...
...
    Dim Syc As Long
    Syc = objAccess.DCount("*", "M_SysObjects", "[Name]='" & strYedekTbl & "'")
    strYedekTbl = strYedekTbl & IIf(Syc = 0, vbNullString, "(" & Syc + 1 & ")")

    objAccess.DoCmd.CopyObject strYedekDB, strYedekTbl, acTable, "kayit"
...
...

şeklinde yeni tablo adı belirlenebilir.

NOT : M_SysObjects kelimesindeki _ karakterini silin.(Sistem dosyası olduğu için sayfada HATA verdi)



  Alıntı
Bu mesajı beğenenler:
#4
Merhaba Sn BeyTor,
Aşağıdaki alt yordam ile işleminiz başarılı bir şekilde yapılacaktır. Bu alt yordamı bir modül oluşturup kodları içine ekleyin.
Visual Basic
  1. Public Sub m1()
  2. Dim strKaynakPath As String
  3. Dim strYedekDB As String
  4. Dim strYedekTbl As String
  5. Dim objAccess As Object
  6. Dim BTkayit As String
  7. Dim BTexcel As String
  8. Dim btName As String
  9. Dim btNameWithoutExt As String
  10. Dim btExtension As String
  11. Dim counter As Integer
  12.  
  13.    ' Yedek alınacak veritabanı yolu
  14.    strKaynakPath = CurrentProject.Path & "\database\DBkaynak.accdb"
  15.  
  16.    ' backup veritabanı konumu
  17.    strYedekDB = CurrentProject.Path & "\backup\backup_db.accdb"
  18.  
  19.    ' Oluşturulan Yedek DB bilgisi
  20.    strYedekTbl = Format(Date, "dd") & "_" & Format(Date, "mmmm") & "_" & "kayit"
  21.  
  22.    ' Yedekleme işlemi
  23.    Set objAccess = CreateObject("Access.Application")
  24.    objAccess.OpenCurrentDatabase strKaynakPath
  25.    objAccess.DoCmd.CopyObject strYedekDB, strYedekTbl, acTable, "kayit"
  26.    objAccess.CloseCurrentDatabase
  27.    objAccess.Quit
  28.    
  29.    ' -------------------------------------
  30.    ' Excel Prosedürü
  31.  
  32.    ' Tablo
  33.    BTkayit = "kayit"
  34.    
  35.    ' Kaydedilecek konum
  36.    BTexcel = Environ("USERPROFILE") & "\Desktop\"
  37.    
  38.    ' Çıktı bilgisi
  39.    btNameWithoutExt = Format(Date, "mmmm") & " " & "-" & " " & Format(Date, "dd.mm.yyyy")
  40.    btExtension = ".xls"
  41.    btName = BTexcel & btNameWithoutExt & btExtension
  42.    
  43.    ' Kopya kontrolü
  44.    counter = 1
  45.    Do While Dir(btName) <> ""
  46.        counter = counter + 1
  47.        btName = BTexcel & btNameWithoutExt & " güncel " & counter & btExtension
  48.    Loop
  49.    
  50.    ' Excel çıktı komutu
  51.    DoCmd.OutputTo acOutputTable, BTkayit, acFormatXLS, btName
  52.    
  53.    ' Ana tabloyu sıfırlama
  54.    CurrentDb.Execute "DELETE FROM kayit;"
  55.    
  56.    
  57.    ' İşlem tamamlandı mesajı
  58.    MsgBox "Yedekleme tamamlandı. EXCEL dosyası masaüstüne kayıt edildi." & vbNewLine & vbNewLine & vbNewLine & "...OTOMASYONU KAPATIP AÇINIZ...", vbApplicationModal + vbInformation, "BeyTor"
  59. End Sub


Çağırma işleminide 
Visual Basic
  1. Call m1


ile yapabilirsiniz.
iyi çalışmalar...



  Alıntı
Bu mesajı beğenenler:
#5
Sn. onur_can hocam, kodda bir değişiklik görmedim sadece dağınık kod düzenim toparlanmış görünüyor. Kopya alacak veritabanın da var olan tarihte bir tablo olduğunda eski kayıtları silip yenisini yazıyor. Bense bunu yapması yerine Örn: "21_TEMMUZ_2023_kayit" isimli tablo varsa eğer bunu yanına ilave olarak parantez içinde (1) yapabilir. 



Sn. dsezgin hocam, tam olarak istediğim olay bu değil. Veritabanları arasında kopyalama yapılınca oluşturulan tablo formatı "Format(Date, "dd") & "_" & Format(Date, "mmmm") & "_" & "kayit"  şeklinde biçimlendirme olacak. Buna ilave olarak eğer aynı biçimde bir tablo veritabanına kopyalarken tespit edilirse, tablo isminin sonuna "(1)" gibi stackleme yapsın. Bu sayede kayıtlar üst üste bindiğinde veriler kayıp olmayacak. Çünkü yedekleme sonrasında tablo sıfırlanıyor. 

cevaplarınız ve ilginiz için çok teşekkürler  Cute



  Alıntı
Bu mesajı beğenenler:
#6
(21-07-2023, 19:19)BeyTor demiş ki: Sn. dsezgin hocam, tam olarak istediğim olay bu değil. Veritabanları arasında kopyalama yapılınca oluşturulan tablo formatı "Format(Date, "dd") & "_" & Format(Date, "mmmm") & "_" & "kayit"  şeklinde biçimlendirme olacak. Buna ilave olarak eğer aynı biçimde bir tablo veritabanına kopyalarken tespit edilirse, tablo isminin sonuna "(1)" gibi stackleme yapsın. Bu sayede kayıtlar üst üste bindiğinde veriler kayıp olmayacak. Çünkü yedekleme sonrasında tablo sıfırlanıyor. 


Mesaj 3 Güncelledim.
...
     Dim Syc As Long
     Syc = objAccess.DCount("*", "M_SysObjects", "[Name]='" & strYedekTbl & "'")
     strYedekTbl = strYedekTbl & IIf(Syc = 0, vbNullString, "(" & Syc + 1 & ")")
...

NOT:   M_SysObjects yazılı olan yerdeki alt tire(_) karakterini silmeyi unutma



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  [VBA] Birden çok Seçenek Seçili Alandaki Verileri Kopyalama evidi 9 676 26-02-2025, 17:36
Son Mesaj: evidi
  [FORM] Tarihler Arası Toplam Veri Getirme omergenc7 5 504 18-02-2025, 15:11
Son Mesaj: halily
access-sql-18 [RAPOR] Kayıt Içerisindeki Miktar Alanındaki Sayı Kadar Rapora Ilgili Kaydı Rapora Kopyalama gurolk 12 1.002 29-07-2024, 12:01
Son Mesaj: dsezgin
  Sorguda Tarihler Arası Veri Alma metınaycıcek 8 687 18-07-2024, 14:28
Son Mesaj: metınaycıcek
  [TABLO] Tablolar Arası Veri Pasham 5 410 10-07-2024, 14:11
Son Mesaj: Pasham
  [VBA] Tablolar Arası Dağılım benuva 1 406 09-02-2024, 00:56
Son Mesaj: halily
  [SORGU] Tablo2'den Tablo1'e şartlı Veri Girişi. ŞabanTR 4 448 19-01-2024, 20:17
Son Mesaj: ŞabanTR
  [FORM] Pdf Içerik Kopyalama Ve Yapıtırma orderyazbim 2 546 26-10-2023, 15:39
Son Mesaj: serdem48

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi