• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Ado Left Join Kullanma

Mdemir63

Altın Üye
Katılım
7 Temmuz 2006
Mesajlar
2,989
Excel Vers. ve Dili
Ofis2010 32Bit Türkçe
Selamlar

Arkadaşlar
İcmal çalışma kitabındaki Sonuc sayfasının D sütunundaki Daire no kısmına göre, Kapalı Data Çalışma kitabındaki Veri Sayfası C sütunundaki Daire no larına eşit olanların Sabit toplamı sütunundan o dairelere ait olanlarını Sabit Aidat Bedeli sütununa getirmek istiyorum.

Aslında Düşeyara ya da İndis ile yapıyorum. Ancak dosya büyük olduğundan çok kasıyor. O yüzden ADO da Left Join (Soldan Birleştir) yöntemi ile yapmak istiyorum. Uğraştım ama Sorgu kısmını bir türlü yapamadım. Ya da kod ile nasıl yapılabilirse . Şimdiden çok teşekkürler
 

Ekli dosyalar

Kolay bu yaaaa deyip uğraştım. Kulaklarınızı çınlattın biraz.
Bayağı yorgun ve uykusuzum. Herşeyi doğru yaptığıma eminim değer gelmiyor.
Yorgunluk ve uykusuzluktan icmaldeki Daire nolarının data dosyasına göre farklı olup boşluk içerdiğini bayağı geç farkettim.
Ondan uğraşıp durmuşum.
Diğer bir husus icmaldeki D.No başlığın daire no diye değiştirdim. Aradaki nokta yüzünden sıkıntı çıkardı, hata verdi.

Kod:
Sub AdoLeftJoin()
Dim con As Object, rs As Object, qStr As String, myPath As String, clsPath As String
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
myPath = ThisWorkbook.FullName
clsPath = "C:\Users\admin\Desktop\Mdemir\Data.xlsx"
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & myPath & _
";Extended Properties='Excel 12.0;HDR=YES'"
qStr = "SELECT b.[Sabit Toplamı] FROM [Sonuc$D2:D" & Range("C" & Rows.Count).End(3).Row & "] AS a LEFT JOIN [Excel 12.0 Xml;HDR=YES;DATABASE=" & clsPath & "].[Veri$] AS b ON a.[D_No]=b.[Daire No]"
rs.Open qStr, con, 1, 1
Range("G3").CopyFromRecordset rs
rs.Close: con.Close
Set con = Nothing: Set rs = Nothing: qStr = vbNullString: myPath = vbNullString: clsPath = vbNullString
End Sub
 
Selamlar

Resimdeki hatayı verdi

248501
 
Merhaba,
İcmal dosyasında iki değişiklik yaptım demiştim.
1. Daire noları arasında boşluk var. Eşitlemek için boşlukları kaldırdım.Data sayfasındaki daire nolarında yok.
2. İcmal dosyasında D.NO başlığı nokta var diye sıkıntı çıkarttı. D-No olarak değiştirdim demiştim.
3. Bunu belitmemiştim ama kapalı dosya yolunu (clsPath) düzenleyin.
Buna göre çalışan dosya ektedir.
248504
 

Ekli dosyalar

.........
......
Diğer bir husus icmaldeki D.No başlığın daire no diye değiştirdim. Aradaki nokta yüzünden sıkıntı çıkardı, hata verdi.
.......
....


Erkan Bey, bu tür karakterlerin yerine SQL metninde "#" kullanabilirsiniz. Yani, veri tabanında "D.No" kullanılabilir, ama siz SQL metninde bu alana referans verirken orjinal alan adının yerine "D#No" kullanmalısınız....

.
 
Son düzenleme:
Selamlar

Elinize sağlık Dosya çalıştı
Yalnız sorgu kısmın da ki a ve b nin ne anlama geliyor anlayamadım
 
Benim verdiğim uydurma takma adlar. Başka şeylerde yazabilirdim.
Literatürde as x şeklinde geçer. Ama kısaca x şeklinde kullanabiliriz.
İki Tablo birleştiriyoruz. Bu iki tabloyu birbirinden ayırıp adreslemem lazımki ilişkide ve getirilecek değerde hangi alanın hangi tabloya ait olduğu anlaşılsın. Bu şekilde isimlendirmezsek bu alan hangi tabloda diye SQL kızar. a'nın D_No ile b'nin Daire Nosu diye hem uydurduğum tablo adını hem alanı ilişkilendirdim.
Bu ilişkilerde, sub querylerde vb. her durumda kullanılması zorunlu bir durumdur.
Benzer ama daha basit bir durumu kolay bir sorguda da yaşayabilirsiniz. Sorguda Sum(Miktar) diye bir işlem yaptırdınız.
Sum(Miktar) as Toplam diye bir alan başlıklandırmasını yaparsınız. Benzer bir durumdur.
 
Benim verdiğim uydurma takma adlar. Başka şeylerde yazabilirdim.
Literatürde as x şeklinde geçer. Ama kısaca x şeklinde kullanabiliriz.
İki Tablo birleştiriyoruz. Bu iki tabloyu birbirinden ayırıp adreslemem lazımki ilişkide ve getirilecek değerde hangi alanın hangi tabloya ait olduğu anlaşılsın. Bu şekilde isimlendirmezsek bu alan hangi tabloda diye SQL kızar. a'nın D_No ile b'nin Daire Nosu diye hem uydurduğum tablo adını hem alanı ilişkilendirdim.
Bu ilişkilerde, sub querylerde vb. her durumda kullanılması zorunlu bir durumdur.
Benzer ama daha basit bir durumu kolay bir sorguda da yaşayabilirsiniz. Sorguda Sum(Miktar) diye bir işlem yaptırdınız.
Sum(Miktar) as Toplam diye bir alan başlıklandırmasını yaparsınız. Benzer bir durumdur.

Açıklayıcı bilgiler için ayrıca çok teşekkür ederim.
Elinize Emeğinize sağlık.

Saygılar
 
Alternatif...

C++:
Option Explicit

Sub Update_Data()
    Dim My_File As String
   
    Application.ScreenUpdating = False
   
    My_File = "'" & ThisWorkbook.Path & "\[Data.xlsx]Veri'!"
   
    Range("G3:G" & Rows.Count).ClearContents
   
    With Range("G3:G" & Cells(Rows.Count, "B").End(3).Row)
        .Formula = "=INDEX(" & My_File & "I:I,MATCH(SUBSTITUTE(D3,"" "","""")," & My_File & "C:C,0))"
        .Value = .Value
    End With
   
    Application.ScreenUpdating = True
   
    MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub
 
Konu hakkında ben de ADO/SQL ile bir alternatif hazırladım....

Bu alternatifte;

-Geçici bir Excel dosyası oluşturuluyor (Data.xlsx)

-Tablo1 ve Tablo2 sayfaları oluşturuluyor (Icmal.xlsb dosyasındaki "Sonuc" sayfasındaki tablo ile Data.xlsx dosyasindaki "Veri" sayfasından verilerle)

-Tablo1 ve Tablo2 sayfalarındaki "Daire No" ile ilgili sütunlarda verilerde karakterler arasında boşluklar varsa, siliniyor ve böylece Left Join sorgusunun sonucunda ilgili aidat tutarları sorunsuzca kapalı Data.xlsx dosyasında "Tablo1" sayfasına yazdırılıyor.

-Daha sonra, kodların yazıldığı Icmal.xlsb dosyasıyla Data.xlsx dosyalarında ilgili tablolarda Left Join ile aidat tutarları Icmal.xlsb dosyasına aktarılıyor.

-İstenirse "Data.xlsx" kod ile silinebilir veya merak ediyorsanız, silmeyip içeriğini görüntüleyebilirsiniz.

.
 

Ekli dosyalar

Son düzenleme:
Haluk Hocam
Çok Teşekkür ederim.
Elinize Emeğinize Sağlık
 
Not:

Aşağıdaki satırda kırmızı ile belirtildiği şekilde, dosyanın uzantısını "xlsb" yaparsanız, açarken uyarı mesajı gelmez.... daha iyi olur.

Rich (BB code):
    DataFile = ThisWorkbook.Path & Application.PathSeparator & "Test.xlsb"

.
 
ADO/SQL kullanarak başka bir alternatif daha hazırladım.... Bu alternatifte, ayrıca "Data.xlsb" gibi bir dosya oluşturmadan tüm işlemler mevcut açık ve kapalı 2 dosya üzerinden yürütülmektedir.... Bu şekilde, daha az kodla işem yapılmaktadır. Kodlar daha da kısaltılabilir, ama şimdilik bu kadarı yeterli olacaktır....



Not: Sayfadaki Buton'un üzerinde yer alan yazı da düzeltilmiştir... :)


.
 

Ekli dosyalar

Selamlar

Haluk Hocam
resimdeki hatayı verdi

248530
 
Dosyaları "RAR"'dan çıkartıp, masaüstü falan bir yere yerleştirdikten sonra mı denediniz?

.
 
ADO/SQL ile bir alternatif daha hazırladım..... Ekli dosyada tüm işlemler tek bir SQL sorgusu ile yapılmaktadır.

.
 

Ekli dosyalar

Geri
Üst