Select3 Fonksiyonu

Tanım


Herhangi bir uygulamada, bellekte geçici olarak tutulan rowsetlerden, istenilen kriterlere uygun kayıtlara ulaşmak için kullanılan bir fonksiyondur. O an bellekte olmayan bir rowset sorgulanamaz. Eğer sorgulanan rowset, uygulama tarafından dinamik olarak yaratılan rowset ise, rowsetin belgeye ait olan rowseti okunur. Bu fonksiyon alt rowsetleri okumaz.


Alt rowset, bir uygulamada yüklenen belgeye ve üzerinde bulunan satıra göre , uygulama tarafından yeniden oluşturulan rowsetlerdir. Örneğin kullanıcı bir cari hesap fişinin satırlarında gezerken uygulama, satıra özel alt tablolardan aynı isimlerde olmak üzere alt rowsetleri de dinamik olarak yaratır. Örneğin her satırın muhasebe hesaplarına dağıtım tablosu olan MUHDST; dinamik olarak üzerinde bulunan satıra göre içeriği sürekli değişen bir alt rowsettir. Fakat aynı zamanda cari hesap fişin tüm satırlarının muhasebe hesap dağılımlarının tutulduğu ve adı yine MUHDST olan başka bir rowset de, dinamik olarak uygulama tarafından yaratılmaktadır. Select3 fonksiyonu bu örnekteki gibi, sadece bir uygulamadaki belgeye ait rowsetleri okumaktadır.


Fonksiyon sorgulama sonucunda elde edilen bilgileri, kullanım sırasında ismi verilen yeni bir RowSet oluşturup içine kopyalar. Fonksiyonun işlevi sadece bu RowSeti oluşturmakdır. Bu bilgileri kullanmak için başka fonksiyonlar mevcuttur. RowSet belirli sayıda kayıt içinde oluşturulabilir.  Örneğin kriterlere uyan, ilk kaydı getir denilebilir. SQL deki select ile benzer işleve sahiptir. Geri dönülen alanların seçilmesi gibi bazı işlevlere sahip değildir.

Kullanım Şekli


Set RowSetNesnesi = Document.Select3(SonuçRowSetAdı, SorgulananRowSetAdı, KriterCümlesi, SıralamaCümlesi, KayıtSayısı)

Ana Nesne


Document (Doc) nesnesinin elamanıdır. Bir doküman nesnesi ile kullanılmak zorundadır.

Parametreler


Parametre

Açıklama

SonuçRowSetAdı

Sorgulama sonucu elde edilen bilgilerin bellekte geçici tablo gibi saklandığı RowSetin adı. Aynı uygulama içinde, aynı ad bir kez kullanılır. Başka bir sorgulamada da kullanılırsa, önceki sorgulama sonucu oluşturlan rowset yokedilir.

SorgulananRowSetAdı

Sorgulanmak istenen ve çalışan uygulamada o an bellekte olan rowsetin adı. Veritabanındaki tablolar, bu fonksiyonda kullanılamaz.

KriterCümlesi

Veritabanında saklanan verilerden, hangilerinin okunucağının tespit edildiği kriterlerin yer aldığı cümle. Kriter olarak TabloAdı ile verilen tablodaki alan adları kullanılır. Sayısal alanlar kriter olarak kullanılamaz. Bir kriterde, kıyaslama için karşılaştırma işaretleri kullanılabilir. Bunlar:

“=” : Eşit,

“!=” veya “<>” : Eşit değil veya farklı,

“<” : Küçük

“<=” : Küçük eşit,

“>” : Büyük,

“>=” : Büyük eşit,

Birden fazla kriter kullanılmak istenirse; kriterler arasında “&” (and) işareti kullanılmalıdır.  

Bir alanın karşılaştırılacağı veri ise “’” (tek tırnak) işareti içinde girilmelidir. Aksi halde kriter işlevini görmez.

SıralamaCümlesi

Sorgulama sonucu elde edilen verilen tablodaki hangi alan veya alanlara göre sıralanacağının belirtildiği cümledir. Tablodaki alan adları girilmelidir. Varsayılan sıralama şekli küçükten büyüğedir. Eğer büyükten küçüğe sıralanmak isteniyorsa ilgili alanın başına “<” işareti konulmalıdır. Birden fazla sıralama alanı kullanılabilir. Bu durumda sıralama alanları arasında “+” işareti kullanılmalıdır. Eğer herhangi bir sıralama yapılmak istenmiyorsa kriter “” boş bırakılmalıdır.

KayıtSayısı

Sorgulama sonucu, elde edilen verilerden kaç kayıt sayısının geri dönüleceğinin söylendiği parametredir. Tam sayı değeri olarak girilmelidir. Kriterlere uyan tüm kayıtların geri dönülmesi isteniyorsa “-1“  değeri girilmelidir. 0 (sıfır) ve pozitif tamsayılarda istenilen kadar kayıt sayısı geri dönülür. Diğer tüm değerlerde fonksiyon hata verir.

Geri Dönen Değerler


Bellekte, SonuçRowSetAdı parametresinde verilen isimde bir geçici bir tablo geri dönülür. Bir rowset nesnesine atanarak (set edilerek) kullanılmalıdır.

Hatırlatmalar


Sadece, sorgulama anından bellekte var olan tablolar sorgulanabilir.

Uygulama tarafından yaratılan rowsetlerden, belgeye ait olan rowsetleri okur.

Eğer bir rowsetteki tüm kayıtlarının geri dönülmesi isteniyorsa KriterCümlesi boş olarak fonksiyona verilmelidir.

Sorgu sonucu oluşan rowsetler büyüklüğüne göre bellekte yer kaplar. Bellek tutarını aşan aşırı büyük sorgular, bellek bitine kadar çalışır, sonra da hata verirler.

Select1 fonksiyonundan farkı, sadece rowsetleri okumasıdır.

Select2 fonksiyonundan farkı; alt rowsetleri okumamasıdır.

Rowsetler üzerinde işlem yapmak için, RowSet Fonksiyonları kısmına bakabilirsiniz.

Örnek 1


Sub Makro1()

       Kriter = "KOD>'SI'&KOD<'SZ'"

       Set C00 = Doc.Select1("ABC001","CARI00",Kriter,"",-1)

       ToplamSaticiSayisi = C00.GetRecCount()

       Kriter = "AP10='1'"

       Set C00 = Doc.Select3("ABC002"," ABC001",Kriter,"<KOD",-1)

       AktifSaticiSayisi = C00.GetRecCount()

       Mesaj = "Sistemdeki Aktif Satıcı sayısı / Toplam Satıcı sayısı bilgisi : "

       Mesaj = Mesaj & AktifSaticiSayisi & " / " & ToplamSaticiSayisi

       Mesaj = Mesaj & chr(13) & "İlk kayıttaki Satıcı Kodu : " & C00.KOD(1)        

       Doc.MsgBox Mesaj

End Sub




Yukarıdaki örnekte, daha önce Select1 fonksiyonu kullanılarak bellekte “ABC001” adı ile saklanan rowsetten, sadece AP10 alanının “1” (aktif kart) olan değerlerinin sorgulanıp, yine bellekte   ABC002” isimli bir rowsetin yaratılıp, C00 adlı RowSet nesnesine atanması istenmiştir. Bu örnekteki, “C00” rowset nesnesi adı ve “ABC001” ile “ABC002” geçici tablo adları kullanıcı tarafından rastgele verilmektedir. Elde edilen değerler ise KOD alanına göre büyükten küçüğe sıralanmıştır. “-1“ KayıtSayısı parametre değeri ise kriter cümlesine uyan tüm kayıtların geri dönüleceğini göstermektedir.


Bu örnekte, Select3 ile henüz bellekte olan bir tablonun sorgulanması örneği verilmiştir. Aynı örnek Select1 fonksiyonunda da verilmiştir ve sonuçları tamamen aynıdır. Select1 fonksiyonu örneğinde her iki sayıda veritabanındaki “CARI00” tablosundan yaratılmıştı. Burdaki örnekte ise Select1 fonksiyonu ile CARI00 tablosundan elde edilen kayıtlardan bellekte geçici olarak yaratılan ABC001 tablosundan (rowset), ikinci bir sorgu ile elde edilmiştir. Her iki örnekte sadece ikinci sorguların şekli değişiktir. Doğal olarak Select3 fonksiyonu, daha önceden elenmiş verilerden elde edilen daha küçük bir kümeden sorgulandığından daha hızlı çalışacaktır


Ayrıca ikinci fonksiyonun sonucunda elde edilen Rowset nesnesinin ilk kayıdının KOD alanı (“KOD(1)” birinci kayıt anlamındadır.) ekranda gösterilmiştir. Sıralama büyükten küçüğe olduğundan en son aktif satıcı kodu geri dönülmüştür.




Örnek 2


Örnek İçin kullanılacak veri seti; ekran görüntüsü yardımı ile  aşağıda verilmiştir. Ekran görüntüsü 1’ deki cari hesap fişinde iki farklı fatura işlenmiştir. Bu faturaların (satırların) muhasebe hesap dağılımları ise şu şekildedir.


39006446” numaralı fişin birinci satırında aşağıdaki muhasebe hesap dağılımı bilgisi vardır.


Hesap No

Hesap Adı

Masraf Merkezi

Masraf Merkezi Adı

Tutar

770 2002 30 20 11      

SEYAHAT GİDERLERİ                                

AI 02 008 0000          

MALİ İŞLER GENEL                                  

          2.485,00  

760 2002 30 20 11      

TANITIM SEYAHAT GİDERLERİ                        

AI 02 102 0000          

PAZARLAMA BİRİMİ GENEL                            

          2.450,12  

740 2002 30 21 21      

AKADEMİK SEYAHAT GİDERİ (DİĞER)                  

AK 02 000 0000          

FEN EDEBİYAT FAKÜLTESİ GENEL                      

          5.478,34  

740 2002 30 21 21      

AKADEMİK SEYAHAT GİDERİ (DİĞER)                  

AK 04 041 0000          

MESLEK YÜKSEK OKULU GENEL                        

          2.560,00  

740 2002 30 21 21      

AKADEMİK SEYAHAT GİDERİ (DİĞER)                  

AK 05 000 0000          

HUKUK FAKÜLTESİ GENEL                            

          7.863,83  

191 100 001            

İNDİRİLEBİLİR KDV %18                            

                       

                                                 

          3.750,71  









Toplam

       24.588,00  


39006446” numaralı fişin ikinci satırında aşağıdaki muhasebe hesap dağılımı bilgisi vardır.


Hesap No

Hesap Adı

Masraf Merkezi

Masraf Merkezi Adı

Tutar

770 2002 30 20 11      

SEYAHAT GİDERLERİ                                

AI 02 008 0000          

MALİ İŞLER GENEL                                  

             913,56  

191 100 001            

İNDİRİLEBİLİR KDV %18                            

                       

                                                 

             164,44  









Toplam

          1.078,00  



Ekran görüntüsü 1


Yukardaki verilere dayanarak, aşağıdaki örnek verilmiştir. Örnek, CARI20 (Cari Hesap Fişi) uygulamasında çalışmak üzere tasarlanmıştır.




Sub Makro1()

       Set TempMuhdst = Doc.Select3("ABC001","MUHDST","","",-1)

       Mesaj ="Cari Hesap Fiş No : " & CARI20E.EVRAKNO & " - Satır No :  " & CARI20t.GetCurrentRow()

       Mesaj =Mesaj & Chr(13) & "Muhasebe Kodu" & Chr(9) & "Masraf Merkezi" & Chr(9) & Doc.RightJustify("Tutar",15)

       for i = 1 to TempMuhdst.GetRowCount()

               HesapKodu = TempMuhdst.MUHASEBECODE(i)

               MasrafMerkezi = TempMuhdst.MUHASEBECODE2(i)

               Tutar = Doc.RightJustify(Doc.NumFormat(TempMuhdst.MUHASEBEFIYAT(i),12,2),15)

       Mesaj = Mesaj & Chr(13) & HesapKodu & Chr(9) & MasrafMerkezi & Chr(9) &Tutar        

       Next

       Doc.MsgBox Mesaj

End Sub



Yukarıdaki örnek cari hesap fişlerinde çalışmak üzere tasarlanmıştır. Örnek “39006446” nolu fişin özellikle içinde bilgi olmayan dördüncü (4’üncü) satırlarında çalıştırılmıştır. Örnekteki Select3 fonksiyonu, uyguluma tarafından dinamik yaratılan ve belgeye ait olan rowsetlerden biri olan MUHDST rowsetinden veri okumaktadır. Dolayısı ile hangi satırda olursak olalım, fonksiyon belgedeki tüm satırların MUHDST bilgilerini okuyacaktır. Aşağıdaki mesaj kutusu, uygulama tarafından dinamik olarak yaratılan belge rowsetinin çıktısını göstermektedir.


Bu örneği, Select2 fonksiyonu ile 4’üncü satırda çalıştırmış olsaydık, uygulamanın yarattığı dinamik alt rowsetin içi boş olacağından, mesaj kutusuda bomboş olacaktı.


Paylaşım Makrosu