ADO sorgusuna Userform Listbox da başlık eklemek

Katılım
24 Nisan 2005
Mesajlar
3,653
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Merhaba,

Çok aramama rağmen, sorgu yaptığım tablonun başlıklarını Userform listbox listesinde RS.GetRows komutu ile beraber kullanamadım.
Farklı cevaplar olmasına rağmen, testlerimde RS.GetRows un daha hızlı sonuç aktardığını gördüğüm için bun uygun çözüm bulmak istedim.

Biraz uğraştırıcı oldu ama benim için çözüm olan bir yöntem yaptım bu işin RS.GetRows kullanımı ile beraber daha kolay yolu var ise önerilere açığım :)

* İki listbox kullanıldı. ListboxHeader aşağıdaki özellikler belirlendi. Ayrıca TabStop false yapıldı.

217329

Sorgu öncesinde, listbox1 de kolon genişlikleri tanımlandı. UserForm1.ListBox1.ColumnWidths = "0;120;250;160;160"
ListBoxHeader da TANIMLAR sayfasından O1:S1 de başlıklar yazıldı.
ListBoxHeader rowsource içinde O2:S2 tanımlandı. Bu hücreler boş içinde veri yok. UserForm1.ListBoxHeader.RowSource = "'TANIMLAR'!O2:S2"

ListBoxHeader ın kolon sayısı sorguya göre belirlendi. UserForm1.ListBoxHeader.ColumnCount = RS.Fields.Count
ListBoxHeader ın kolon genişlikleri Listbox1 e göre belirlendi. UserForm1.ListBoxHeader.ColumnWidths = UserForm1.ListBox1.ColumnWidths
TANIMLAR sayfasında tablo başlıklarından bağımsı istenilen başlıklar verilebilir.

Kod:
Sub listboxdoldur() 
    UserForm1.ListBox1.Clear
    UserForm1.ListBoxHeader.Clear
    UserForm1.ListBoxHeader.RowSource = ""
    
    Sql = ""
    Sql = Sql + " SELECT LOGICALREF,CODE, NAME,NAME3,NAME4 FROM [" & LOGODATASI & "].[dbo].[" & LOGOTABLOSU & "] "
    Sql = Sql + " WHERE CARDTYPE IN (10,11,12) AND ACTIVE=0 ORDER BY CODE"

    UserForm1.ListBox1.ColumnWidths = "0;120;250;160;160"
    UserForm1.ListBoxHeader.RowSource = "'TANIMLAR'!O2:S2"

    RS.Open Sql, conn, 1, 1

    On Error Resume Next
    If Not RS.EOF Then
    UserForm1.ListBoxHeader.ColumnCount = RS.Fields.Count
    UserForm1.ListBoxHeader.ColumnWidths = UserForm1.ListBox1.ColumnWidths
    UserForm1.ListBox1.ColumnCount = RS.Fields.Count
    UserForm1.ListBox1.Column = RS.GetRows
    End If
    On Error GoTo 0
End sub
217330
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,310
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Sorgudan dönen sonuçları "CopyFromRecordSet" metoduyla bir sayfaya döküp, ListBox'a "RowSource" ile aktardığınızda "ColumnHeader"ları da alabilirsiniz.... ama ben olsam, sizin yaptığınıza benzer şekilde ama 1 adet ListBox'ı "RS" için kullanıp, "Header" olarak da yeteri kadar "Label" kullanırdım. Label'ların "Caption" özelliklerini RS'in "FieldNames" özelliğinden dinamik olarak çekerdim.

.
 
Katılım
24 Nisan 2005
Mesajlar
3,653
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Sorgudan dönen sonuçları "CopyFromRecordSet" metoduyla bir sayfaya döküp, ListBox'a "RowSource" ile aktardığınızda "ColumnHeader"ları da alabilirsiniz.... ama ben olsam, sizin yaptığınıza benzer şekilde ama 1 adet ListBox'ı "RS" için kullanıp, "Header" olarak da yeteri kadar "Label" kullanırdım. Label'ların "Caption" özelliklerini RS'in "FieldNames" özelliğinden dinamik olarak çekerdim.
Öneri için teşekkür ederim. Sorgu sonuçlarını excel sayfasına aktarmak istedim.
Tek form da 5 ayrı sorgu sonucu listeleyip işlem yaptırıyorum her birinin kolon genişlikleri farklı. Bu şekilde daha pratik gibi geldi.
Label olarak da deneyebilirim.

Tablo başlıklarını listbox da 1. satıra kalanları da diğer satırlar RS.GetRows metodu ile yazabilseydim güzel olacaktır.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,534
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
ListBox veri yüklemesinde satır bazına girdiğinizde döngü kullanmak gerekir. Bu da daha yavaş yüklemeye sebep olacaktır.

Sayfaya yükleyip ListBox'a RowSource yöntemi alma süresi ile sizin yaptığınız şekilde alma süresini kıyaslamak gerekir.
 
Katılım
24 Nisan 2005
Mesajlar
3,653
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
ListBox veri yüklemesinde satır bazına girdiğinizde döngü kullanmak gerekir. Bu da daha yavaş yüklemeye sebep olacaktır.

Sayfaya yükleyip ListBox'a RowSource yöntemi alma süresi ile sizin yaptığınız şekilde alma süresini kıyaslamak gerekir.
Lisbox a sayfaya yüklemeden satır satır aktarmayı 13000 satırlık veri için test ettiğimde
Satır satır 12 sn de aktarıyor.
RS.GetRows ise 3 sn de aktarıyor.

RowSource denemedim. Userform da arama kutusu var sürekli sorgu güncelleniyor.
Uygun bir zamanda 13000 kaydı denerim
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,260
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Tablo başlıklarını listbox da 1. satıra kalanları da diğer satırlar RS.GetRows metodu ile yazabilseydim güzel olacaktır.
GetRows işlemi bittiğinde ilk satır öncesine satır ekleyerek kolon başlıkları eklenebilir gibi...

PHP:
Me.ListBox1.AddItem , 0

For i = 0 To ListBox1.ColumnCount - 1
    ListBox1.List(0, i) = rs(i).Name
Next
.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,534
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Üstad,

Bu durumda başlık satırı sanırım sabit kalamıyor. Veri satırı gibi davranıyor.
 
Katılım
24 Nisan 2005
Mesajlar
3,653
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
GetRows işlemi bittiğinde ilk satır öncesine satır ekleyerek kolon başlıkları eklenebilir gibi...

PHP:
Me.ListBox1.AddItem , 0

For i = 0 To ListBox1.ColumnCount - 1
    ListBox1.List(0, i) = rs(i).Name
Next
.
Zeki bey, denedim. ilk satıra kolon başlıkları geliyor. Ancak Korhan bey in belirttiği gibi veri satırı gibi ekleniyor.
Aşağı kaydırınca yeri sabit kalmıyor.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,260
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Bu durumda, farklı control kullanmak zorunlu. Kontrol yerine GDI api ile kolon başlığı çizilebilir. Ama genel olarak VBA kullanıcıları Win32 API pek sevmez.

.
 
Katılım
24 Nisan 2005
Mesajlar
3,653
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Altın Üyelik Bitiş Tarihi
25/05/2022
Bu durumda, farklı control kullanmak zorunlu. Kontrol yerine GDI api ile kolon başlığı çizilebilir. Ama genel olarak VBA kullanıcıları Win32 API pek sevmez.
Evet, programın her kullanıcıda direkt çalışması lazım. Ne kadar fazla eklenti ve kullanıcıya özel ayarlar o kadar çok sorun :)
 
Üst