SQL sorguda RS.RecordCount -1

Katılım
29 Ocak 2024
Mesajlar
98
Excel Vers. ve Dili
Office 2016
Merhabalar,

Aşağıdaki kodda;
r = RS.RecordCount

r değeri -1 olarak döndürüyor, burada kayıt sayısımı nasıl alabiliriz

yardımlarınız için şimdiden teşekkürler,
iyi Çalışmalar.

Kod:
Sub sorguu()
Dim Con As Object

Set Con = VBA.CreateObject("adodb.Connection")
Set RS = VBA.CreateObject("adodb.Recordset")

yol = ThisWorkbook.FullName

Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
yol & ";extended properties=""Excel 12.0;hdr=yes"""

sorgu = "select * from [icmal$] where [TÜR] = 'Bakliyat' "

RS.Open sorgu, Con

r = RS.RecordCount


End Sub
 

tugkan

Altın Üye
Katılım
6 Kasım 2004
Mesajlar
314
Excel Vers. ve Dili
Excel 2016
Türkçe 64 BIT
Altın Üyelik Bitiş Tarihi
16-10-2025
Excel'de ADO kullanarak bir veritabanı sorgusu çalıştırdığınızda, RecordCount özelliği bazı durumlarda -1 olarak dönebilir. Bu, genellikle Recordset nesnesinin tam bir sonuç kümesi oluşturmadığı anlamına gelir. Özellikle dinamik olarak oluşturulan Recordset'lerde, RecordCount değeri doğru bir şekilde alınmayabilir.

Çözüm Yöntemleri
RecordCount değerini almak için aşağıdaki yöntemleri deneyebilirsiniz:

1. MoveLast Metodu Kullanma
RecordCount değerini doğru almak için RS.MoveLast metodunu kullanarak kayıtların sonuna gidebilirsiniz. Ancak bu yöntem, veritabanının boyutuna bağlı olarak performans sorunlarına yol açabilir.

Aşağıda, MoveLast metodunu kullanarak nasıl yapabileceğinizi gösteren güncellenmiş kod:

Kod:
Sub sorguu()
    Dim Con As Object
    Dim RS As Object
    Dim yol As String
    Dim sorgu As String
    Dim r As Long

    Set Con = VBA.CreateObject("adodb.Connection")
    Set RS = VBA.CreateObject("adodb.Recordset")

    yol = ThisWorkbook.FullName

    Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
              yol & ";extended properties=""Excel 12.0;hdr=yes"""

    sorgu = "SELECT * FROM [icmal$] WHERE [TÜR] = 'Bakliyat'"

    RS.Open sorgu, Con

    ' Son kayda git ve kayıt sayısını al
    RS.MoveLast
    r = RS.RecordCount
    RS.MoveFirst ' Geri dön

    ' Kayıt sayısını görüntüle
    MsgBox "Kayıt sayısı: " & r

    ' Temizleme
    RS.Close
    Con.Close
    Set RS = Nothing
    Set Con = Nothing
End Sub
2. Alternatif Yöntem: Kayıt Sayısını Hesaplama
Bir başka yöntem de, kayıtları bir döngü içinde saymaktır. Aşağıda, kayıtları döngü ile sayan bir örnek verilmiştir:

Kod:
Sub sorguu()
    Dim Con As Object
    Dim RS As Object
    Dim yol As String
    Dim sorgu As String
    Dim r As Long

    Set Con = VBA.CreateObject("adodb.Connection")
    Set RS = VBA.CreateObject("adodb.Recordset")

    yol = ThisWorkbook.FullName

    Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
              yol & ";extended properties=""Excel 12.0;hdr=yes"""

    sorgu = "SELECT * FROM [icmal$] WHERE [TÜR] = 'Bakliyat'"

    RS.Open sorgu, Con

    ' Kayıt sayısını döngü ile hesapla
    r = 0
    Do While Not RS.EOF
        r = r + 1
        RS.MoveNext
    Loop

    ' Kayıt sayısını görüntüle
    MsgBox "Kayıt sayısı: " & r

    ' Temizleme
    RS.Close
    Con.Close
    Set RS = Nothing
    Set Con = Nothing
End Sub
Açıklamalar
  • MoveLast metodu, kayıt kümesinin sonuna gitmenizi sağlar, bu sayede RecordCount doğru bir değer döner. Ancak dikkatli olun, büyük veri setlerinde bu işlem yavaşlayabilir.
  • Alternatif olarak, kayıtları döngü ile saymak, verilerinize erişiminiz olduğunda her zaman geçerli bir yöntemdir ve daha kontrollü bir yaklaşım sunar.
 
Katılım
2 Temmuz 2014
Mesajlar
145
Excel Vers. ve Dili
2021 Türkçe, 64bit
koda aşağıdaki satır eklenebilir?
RS.CursorLocation = 3 '<-- bu satır eklenecek
RS.Open sorgu, Con'<-- bu satır zaten var

yada


RS.Open sorgu, Con , 3, 1 ' <-- open satırına 3,1 eklenmeli güncelleme yapabilmek için 1,3 0lmalı yada adOpenKeyset, adLockOptimistic
 
Katılım
29 Ocak 2024
Mesajlar
98
Excel Vers. ve Dili
Office 2016
Excel'de ADO kullanarak bir veritabanı sorgusu çalıştırdığınızda, RecordCount özelliği bazı durumlarda -1 olarak dönebilir. Bu, genellikle Recordset nesnesinin tam bir sonuç kümesi oluşturmadığı anlamına gelir. Özellikle dinamik olarak oluşturulan Recordset'lerde, RecordCount değeri doğru bir şekilde alınmayabilir.

Çözüm Yöntemleri
RecordCount değerini almak için aşağıdaki yöntemleri deneyebilirsiniz:

1. MoveLast Metodu Kullanma
RecordCount değerini doğru almak için RS.MoveLast metodunu kullanarak kayıtların sonuna gidebilirsiniz. Ancak bu yöntem, veritabanının boyutuna bağlı olarak performans sorunlarına yol açabilir.

Aşağıda, MoveLast metodunu kullanarak nasıl yapabileceğinizi gösteren güncellenmiş kod:

Kod:
Sub sorguu()
    Dim Con As Object
    Dim RS As Object
    Dim yol As String
    Dim sorgu As String
    Dim r As Long

    Set Con = VBA.CreateObject("adodb.Connection")
    Set RS = VBA.CreateObject("adodb.Recordset")

    yol = ThisWorkbook.FullName

    Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
              yol & ";extended properties=""Excel 12.0;hdr=yes"""

    sorgu = "SELECT * FROM [icmal$] WHERE [TÜR] = 'Bakliyat'"

    RS.Open sorgu, Con

    ' Son kayda git ve kayıt sayısını al
    RS.MoveLast
    r = RS.RecordCount
    RS.MoveFirst ' Geri dön

    ' Kayıt sayısını görüntüle
    MsgBox "Kayıt sayısı: " & r

    ' Temizleme
    RS.Close
    Con.Close
    Set RS = Nothing
    Set Con = Nothing
End Sub
2. Alternatif Yöntem: Kayıt Sayısını Hesaplama
Bir başka yöntem de, kayıtları bir döngü içinde saymaktır. Aşağıda, kayıtları döngü ile sayan bir örnek verilmiştir:

Kod:
Sub sorguu()
    Dim Con As Object
    Dim RS As Object
    Dim yol As String
    Dim sorgu As String
    Dim r As Long

    Set Con = VBA.CreateObject("adodb.Connection")
    Set RS = VBA.CreateObject("adodb.Recordset")

    yol = ThisWorkbook.FullName

    Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
              yol & ";extended properties=""Excel 12.0;hdr=yes"""

    sorgu = "SELECT * FROM [icmal$] WHERE [TÜR] = 'Bakliyat'"

    RS.Open sorgu, Con

    ' Kayıt sayısını döngü ile hesapla
    r = 0
    Do While Not RS.EOF
        r = r + 1
        RS.MoveNext
    Loop

    ' Kayıt sayısını görüntüle
    MsgBox "Kayıt sayısı: " & r

    ' Temizleme
    RS.Close
    Con.Close
    Set RS = Nothing
    Set Con = Nothing
End Sub
Açıklamalar
  • MoveLast metodu, kayıt kümesinin sonuna gitmenizi sağlar, bu sayede RecordCount doğru bir değer döner. Ancak dikkatli olun, büyük veri setlerinde bu işlem yavaşlayabilir.
  • Alternatif olarak, kayıtları döngü ile saymak, verilerinize erişiminiz olduğunda her zaman geçerli bir yöntemdir ve daha kontrollü bir yaklaşım sunar.
Hocam teşekkürler,
1. yöntemde:
RS.MoveLast satırında
Excel'de ADO kullanarak bir veritabanı sorgusu çalıştırdığınızda, RecordCount özelliği bazı durumlarda -1 olarak dönebilir. Bu, genellikle Recordset nesnesinin tam bir sonuç kümesi oluşturmadığı anlamına gelir. Özellikle dinamik olarak oluşturulan Recordset'lerde, RecordCount değeri doğru bir şekilde alınmayabilir.

Çözüm Yöntemleri
RecordCount değerini almak için aşağıdaki yöntemleri deneyebilirsiniz:

1. MoveLast Metodu Kullanma
RecordCount değerini doğru almak için RS.MoveLast metodunu kullanarak kayıtların sonuna gidebilirsiniz. Ancak bu yöntem, veritabanının boyutuna bağlı olarak performans sorunlarına yol açabilir.

Aşağıda, MoveLast metodunu kullanarak nasıl yapabileceğinizi gösteren güncellenmiş kod:

Kod:
Sub sorguu()
    Dim Con As Object
    Dim RS As Object
    Dim yol As String
    Dim sorgu As String
    Dim r As Long

    Set Con = VBA.CreateObject("adodb.Connection")
    Set RS = VBA.CreateObject("adodb.Recordset")

    yol = ThisWorkbook.FullName

    Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
              yol & ";extended properties=""Excel 12.0;hdr=yes"""

    sorgu = "SELECT * FROM [icmal$] WHERE [TÜR] = 'Bakliyat'"

    RS.Open sorgu, Con

    ' Son kayda git ve kayıt sayısını al
    RS.MoveLast
    r = RS.RecordCount
    RS.MoveFirst ' Geri dön

    ' Kayıt sayısını görüntüle
    MsgBox "Kayıt sayısı: " & r

    ' Temizleme
    RS.Close
    Con.Close
    Set RS = Nothing
    Set Con = Nothing
End Sub
2. Alternatif Yöntem: Kayıt Sayısını Hesaplama
Bir başka yöntem de, kayıtları bir döngü içinde saymaktır. Aşağıda, kayıtları döngü ile sayan bir örnek verilmiştir:

Kod:
Sub sorguu()
    Dim Con As Object
    Dim RS As Object
    Dim yol As String
    Dim sorgu As String
    Dim r As Long

    Set Con = VBA.CreateObject("adodb.Connection")
    Set RS = VBA.CreateObject("adodb.Recordset")

    yol = ThisWorkbook.FullName

    Con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
              yol & ";extended properties=""Excel 12.0;hdr=yes"""

    sorgu = "SELECT * FROM [icmal$] WHERE [TÜR] = 'Bakliyat'"

    RS.Open sorgu, Con

    ' Kayıt sayısını döngü ile hesapla
    r = 0
    Do While Not RS.EOF
        r = r + 1
        RS.MoveNext
    Loop

    ' Kayıt sayısını görüntüle
    MsgBox "Kayıt sayısı: " & r

    ' Temizleme
    RS.Close
    Con.Close
    Set RS = Nothing
    Set Con = Nothing
End Sub
Açıklamalar
  • MoveLast metodu, kayıt kümesinin sonuna gitmenizi sağlar, bu sayede RecordCount doğru bir değer döner. Ancak dikkatli olun, büyük veri setlerinde bu işlem yavaşlayabilir.
  • Alternatif olarak, kayıtları döngü ile saymak, verilerinize erişiminiz olduğunda her zaman geçerli bir yöntemdir ve daha kontrollü bir yaklaşım sunar.
Tugkan Hocam teşekkürler,
2. yöntem gayet güzel çalışıyor.
1. yöndemde;
RS.MoveLast satırında aşağıdaki hatayı verdi,
Run-time error ‘-2147217884 (80040e249’:
Satır Kümesi geriye doğru getirmeyi desteklemiyor


tekrar teşekkürler,
iyi çalışmalar dilerim.
 
Katılım
29 Ocak 2024
Mesajlar
98
Excel Vers. ve Dili
Office 2016
koda aşağıdaki satır eklenebilir?
RS.CursorLocation = 3 '<-- bu satır eklenecek
RS.Open sorgu, Con'<-- bu satır zaten var

yada


RS.Open sorgu, Con , 3, 1 ' <-- open satırına 3,1 eklenmeli güncelleme yapabilmek için 1,3 0lmalı yada adOpenKeyset, adLockOptimistic
Hocam çok teşekkürler,
gayet güzel çalışıyor.

iyi çalışmalar dilerim.
 
Katılım
2 Temmuz 2014
Mesajlar
145
Excel Vers. ve Dili
2021 Türkçe, 64bit
Rica ederim
İyi çalışmalar
Yalniz,çok fazla kayıt varsa, kesin kayit sayısı bazen son kayda gitmeden bulunamayabilir
 
Katılım
2 Temmuz 2014
Mesajlar
145
Excel Vers. ve Dili
2021 Türkçe, 64bit
Rs.movelast
Rs.movefirst

Bu ikili beraber kullanılmalı
Bazı durumlarda son kayda gidince başa donulmediginde sadece son kaydı alabiliyor, hatta boş değer döndürüp hata verebiliyor
Mesela rs.getstring 'te hata verir, aklımda yanlış kalmadıysa. Deneyip duruma gore kodu düzenleyebilirsiniz.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,343
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
RecordCount, arka planda sessizce fetch yaparak geri dönüyor bildiğim kadarıyla.

Eğer dönecek kayıt sayısı büyükse ve öğrenilmesi zorunlu ise, dönecek kayıt sayısını aşağıdaki gibi de alabilirsiniz...

SQL:
select count(*) as [say] from [icmal$] where [TÜR] = 'Bakliyat'
Ve ardından kayıt kümesini çekersiniz. (Performans sonuçlarını kendiniz test etmelisiniz)

SQL:
select * from [icmal$] where [TÜR] = 'Bakliyat'
.
 
Katılım
29 Ocak 2024
Mesajlar
98
Excel Vers. ve Dili
Office 2016
RecordCount, arka planda sessizce fetch yaparak geri dönüyor bildiğim kadarıyla.

Eğer dönecek kayıt sayısı büyükse ve öğrenilmesi zorunlu ise, dönecek kayıt sayısını aşağıdaki gibi de alabilirsiniz...

SQL:
select count(*) as [say] from [icmal$] where [TÜR] = 'Bakliyat'
Ve ardından kayıt kümesini çekersiniz. (Performans sonuçlarını kendiniz test etmelisiniz)

SQL:
select * from [icmal$] where [TÜR] = 'Bakliyat'
.
Halil Hocam burada bir alanı tekilleştirmek için;
örnek alanların birinin başlığı "Kategori" bu sorguda;

aşağıdaki gibi düzenleyince aynı kategori çıkanları tekilleştirip ; özetle tekrar eden kayıtlardan bir tane alıyor.
SQL:
select Distinct Kategori from [icmal$] where [TÜR] = 'Bakliyat'
kayıt kümesini de r = RS.RecordCount ile saydırıyoruz,

bunu aşağıdaki gibi sorguda saydırmanın kısa bir yolu var mıdır?
SQL:
select count(Distinct Kategori) from [icmal$] where [TÜR] = 'Bakliyat'
tekrar teşekkürler,
iyi çalışmalar.
 
Katılım
2 Temmuz 2014
Mesajlar
145
Excel Vers. ve Dili
2021 Türkçe, 64bit
Ilgili mesaj sayin @Zeki Gürsoy hocama ait o konuda bir şey diyemiyeceğim ama önerdiğim kodda sorun mu var?
 
Katılım
2 Temmuz 2014
Mesajlar
145
Excel Vers. ve Dili
2021 Türkçe, 64bit
aşağıdaki kodu denermisiniz?
SQL:
select count(*) from (select Distinct Kategori from [icmal$] where [TÜR] = 'Bakliyat')
 
Üst