RE: In Ve Like Operatörleri - berduş - 14/08/2020
yalnız dikkatimi çekti açıklama alanı uzun metin türünde ama yanılmıyorsam liste kutuları çok uzun metinleri alamaz diyelim ki açıklama alanının uzunluğu 255ten büyük ve aradığınız sayısal alanlar 240 tan 270'e kadar ozaman 255ten sonraki verileri alamaz o durumda veriler eksik gösterilir Bu durumda update olayı aşağıdaki gibi düzenlenebilirPrivate Sub liste_AfterUpdate()
kodu = liste.Column(6)
islemadı = liste.Column(7)
'acıklama = liste.Column(8)
islem_turu = liste.Column(1)
islem_grubu = liste.Column(4)
yıldızlı_islem = liste.Column(5)
yururluk_tarihi = liste.Column(3)
Dim SQLB As String
Dim Kosulum As String
'______________________________________________
Dim AciklamaRs As DAO.Recordset
Dim AciklamaSql As String
AciklamaSql = "SELECT srg_bakanlıkkodları.ID, srg_bakanlıkkodları.TÜR, srg_bakanlıkkodları.AÇIKLAMA " & _
"FROM srg_bakanlıkkodları " & _
" where ID=" & liste.Column(0) & " and TÜR='" & liste.Value & "';"
Set AciklamaRs = CurrentDb.OpenRecordset(AciklamaSql, dbOpenDynaset)
acıklama = Nz(AciklamaRs(2))
'_____________________________________________
Kosulum = Sayim(acıklama)
SQLB = "SELECT srg_bakanlıkkodları.ID, srg_bakanlıkkodları.TÜR, srg_bakanlıkkodları.YIL, srg_bakanlıkkodları.[YÜRÜRLÜK TARİHİ] AS YÜRÜRLÜK, srg_bakanlıkkodları.GRUBU AS GRB, srg_bakanlıkkodları.YILDIZLI AS [*], srg_bakanlıkkodları.KOD, srg_bakanlıkkodları.ADI, srg_bakanlıkkodları.AÇIKLAMA, srg_bakanlıkkodları.PUAN, srg_bakanlıkkodları.FİYATI FROM srg_bakanlıkkodları " & _
"WHERE (((srg_bakanlıkkodları.TÜR)=[Formlar]![FRM_ANA]![islem_turu]) And " & Kosulum & _
"ORDER BY srg_bakanlıkkodları.YIL DESC;"
ListeFaturaEdilemez.RowSource = SQLB
ListeFaturaEdilemez.Requery
End Sub
RE: In Ve Like Operatörleri - berduş - 15/08/2020
2. liste kutusunun sadece seçilen tablodan veri aldığını fark ettim bu durumda tüm tabloların bileşkesi olan srg_bakanlıkkodları sorgusunu kullanmaya gerek yok sadece ilgili tabloyu kontrol etmesi çalışmanızın hızını artırır bu nedenle liste_AfterUpdate fonksiyonunun kodunu aşağıdaki ile değiştirebilirsiniz. Ayrıca açıklama alanı boşken yada sorguda kayıt yoksa 2. liste kutusunu boşaltma kodları da eklendi
Private Sub liste_AfterUpdate()
kodu = liste.Column(6)
islemadı = liste.Column(7)
'acıklama = liste.Column(8)
islem_turu = liste.Column(1)
islem_grubu = liste.Column(4)
yıldızlı_islem = liste.Column(5)
yururluk_tarihi = liste.Column(3)
If Len(liste.Column(8) & "") = 0 Then
acıklama = liste.Column(8)
ListeFaturaEdilemez.RowSource = ""
ListeFaturaEdilemez.Requery
Exit Sub
End If
Dim SQLBx, TblAdi As String
Dim Kosulum As String
Sqltbl_kamu = "SELECT tbl_kamu.id AS ID, tbl_kamu.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, '' AS PUAN, Format([fiyat],'Currency') AS FİYATI " & _
"FROM tbl_kamu"
Sqltbl_sut_2b = "SELECT tbl_sut_2b.id AS ID, tbl_sut_2b.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, islem_puani AS PUAN, Format([islem_puani]*0.593,'Currency') AS FİYATI " & _
"FROM tbl_sut_2b"
Sqltbl_sut_2c = "SELECT tbl_sut_2c.id AS ID, tbl_sut_2c.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], islem_grubu AS GRUBU, " & _
"yildizli_islem AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, islem_puani AS PUAN, " & _
"Format([islem_puani]*0.593,'Currency') AS FİYATI " & _
"FROM tbl_sut_2c"
Sqltbl_turist = "SELECT tbl_turist.id AS ID, tbl_turist.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, '' AS PUAN, Format([fiyat],'Currency') AS FİYATI " & _
"FROM tbl_turist"
SQLBx = Switch(islem_turu = "Kamu", Sqltbl_kamu, _
islem_turu = "Ek-2B", Sqltbl_sut_2b, _
islem_turu = "Ek-2C", Sqltbl_sut_2c, _
islem_turu = "Turist", Sqltbl_turist)
TblAdi = Switch(islem_turu = "Kamu", "tbl_kamu", _
islem_turu = "Ek-2B", "tbl_sut_2b", _
islem_turu = "Ek-2C", "tbl_sut_2c", _
islem_turu = "Turist", "tbl_turist")
'______________________________________________
Dim AciklamaRs As DAO.Recordset
Dim AciklamaSql As String
AciklamaSql = "SELECT " & TblAdi & ".id, " & TblAdi & ".aciklama " & _
"FROM " & TblAdi & _
" where " & TblAdi & ".id=" & liste.Column(0)
Set AciklamaRs = CurrentDb.OpenRecordset(AciklamaSql, dbOpenDynaset)
acıklama = Nz(AciklamaRs(1))
'_____________________________________________
Kosulum = Sayim(acıklama)
SQLBx = SQLBx & Kosulum & " ORDER BY yili DESC;"
SQLBx = IIf(Len(Kosulum & "") = 0, "", SQLBx)
ListeFaturaEdilemez.RowSource = SQLBx
ListeFaturaEdilemez.Requery
End Sub
Sayim fonksiyonun kodu:
Function Sayim(Aciklama As String) As String
Dim RegEx As Object, metin As String
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[a-zA-Z]{0,3}[0-9]{6}" '"[a-zA-Z]{0,3}[0-9]+"
RegEx.Global = True
RegEx.MultiLine = True
'RegEx.Execute (Aciklama)
Set eslesmeler = RegEx.Execute(Aciklama)
KelimeSayisi = eslesmeler.Count
For Each Kelime In eslesmeler
Kosulum = Kosulum & "','" & Kelime.Value
Next
If Kosulum <> "" Then Kosulum = " where ((KODU) IN (" & Mid(Kosulum, 3) & "'" & ")) " Else Kosulum = ""
Sayim = Kosulum
End Function
Dilerim işinize yarar
iyi çalışmalar)
RE: In Ve Like Operatörleri - berduş - 16/08/2020
3 farklı yöntem kullanarak çözmeye çalıştım
RegExp, InStr ve Like karşılaştırma için hepsini aynı sayfada göstermeye çalıştım bu nedenle biraz ağır çalışabilir siz bir yöntemi seçeceğinizden sorun çıkarmaz
her yöntem için başına yöntemin adını yazdım gereksizleri silerseniz belirgin bir hızlanma olabilir
1 - sadece RegExp için gerekli Modüldeki fonksiyon:
Function Sayim(Aciklama As String) As String
Dim RegEx As Object, metin As String
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[a-zA-Z]{0,3}[0-9]{6}" '"[a-zA-Z]{0,3}[0-9]+" '-->[0-9]{6} : 6 rakam ard arda,[0-9]+:en az bir rakam, [a-zA-Z]{0,3} 0 yada en fazla 3 harf
RegEx.Global = True 'Tüm değerleri bul
RegEx.MultiLine = True 'tüm satırlarda ara
Set eslesmeler = RegEx.Execute(Aciklama)
KelimeSayisi = eslesmeler.Count
For Each Kelime In eslesmeler ' bulunana tüm değerleri döngüye sokar
Kosulum = Kosulum & "','" & Kelime.Value
Next
If Kosulum <> "" Then Kosulum = Mid(Kosulum, 3) Else Kosulum = ""
Sayim = Kosulum
End Function
2 - hem RegExp hem de diğer yöntemler için gerekli modüldeki kod bu modül sadece sorgu değerlerini saklayan sabitler modülüdür :
Global Const SqlBos As String = "SELECT '' AS ID,'' AS TÜR, '' AS YIL, " & _
"'' AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, '' AS KOD, '' AS ADI, " & _
"'' AS AÇIKLAMA, '' AS PUAN,'' AS FİYATI " & _
"FROM tbl_secilenhizmetler"
Global Const Sqltbl_kamu As String = "SELECT tbl_kamu.id AS ID, tbl_kamu.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, '' AS PUAN, Format([fiyat],'Currency') AS FİYATI " & _
"FROM tbl_kamu"
Global Const Sqltbl_sut_2b As String = "SELECT tbl_sut_2b.id AS ID, tbl_sut_2b.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, islem_puani AS PUAN, Format([islem_puani]*0.593,'Currency') AS FİYATI " & _
"FROM tbl_sut_2b"
Global Const Sqltbl_sut_2c As String = "SELECT tbl_sut_2c.id AS ID, tbl_sut_2c.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], islem_grubu AS GRUBU, " & _
"yildizli_islem AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, islem_puani AS PUAN, " & _
"Format([islem_puani]*0.593,'Currency') AS FİYATI " & _
"FROM tbl_sut_2c"
Global Const Sqltbl_turist As String = "SELECT tbl_turist.id AS ID, tbl_turist.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, '' AS PUAN, Format([fiyat],'Currency') AS FİYATI " & _
"FROM tbl_turist"
3 - liste kutusu güncellendiğinde kodu :
Private Sub liste_AfterUpdate()
kodu = liste.Column(6)
islemadı = liste.Column(7)
islem_turu = liste.Column(1)
islem_grubu = liste.Column(4)
yıldızlı_islem = liste.Column(5)
yururluk_tarihi = liste.Column(3)
If Len(liste.Column(8) & "") = 0 Then
acıklama = ""
' InStr Kullanarak veri alma____________________________
FaturaEdilemezInstr.RowSource = SqlBos
FaturaEdilemezInstr.Requery
' Like Kullanarak veri alma____________________________
FaturaEdilemezLike.RowSource = SqlBos
FaturaEdilemezLike.Requery
' RegExp Kullanarak veri alma___________________________
FaturaEdilemezRegExp.RowSource = SqlBos
FaturaEdilemezRegExp.Requery
Exit Sub
End If
Dim SqlInStr, SqlLike, SqlRegExp, TblAdi As String
Dim KosulumInStr, KosulumLike, KosulumRegExp As String
'metin kutusundaki değere göre çağrılacak sorgu kodu ve tablo Adı________________
SQLBx = Switch(islem_turu = "Kamu", Sqltbl_kamu, _
islem_turu = "Ek-2B", Sqltbl_sut_2b, _
islem_turu = "Ek-2C", Sqltbl_sut_2c, _
islem_turu = "Turist", Sqltbl_turist)
TblAdi = Switch(islem_turu = "Kamu", "tbl_kamu", _
islem_turu = "Ek-2B", "tbl_sut_2b", _
islem_turu = "Ek-2C", "tbl_sut_2c", _
islem_turu = "Turist", "tbl_turist")
'hy Açıklama Alanını RecordSettn Alma_______
Dim AciklamaRs As DAO.Recordset
Dim AciklamaSql As String
AciklamaSql = "SELECT " & TblAdi & ".id, " & TblAdi & ".aciklama " & _
"FROM " & TblAdi & _
" where " & TblAdi & ".id=" & liste.Column(0)
Set AciklamaRs = CurrentDb.OpenRecordset(AciklamaSql, dbOpenDynaset)
acıklama = Nz(AciklamaRs(1))
' InStr Kullanarak veri alma____________________________
KosulumInStr = " WHERE (InStr(1,'" & acıklama & "',[kodu])>0)" 'Çalıştı
SqlInStr = SQLBx & KosulumInStr & " ORDER BY yili DESC;"
FaturaEdilemezInstr.RowSource = SqlInStr
FaturaEdilemezInstr.Requery
' Like Kullanarak veri alma____________________________
KosulumLike = " WHERE (('" & acıklama & "') like '*' & [kodu] & '*')" 'Çalıştı
SqlLike = SQLBx & KosulumLike & " ORDER BY yili DESC;"
FaturaEdilemezLike.RowSource = SqlLike
FaturaEdilemezLike.Requery
' RegExp Kullanarak veri alma____________________________
KosulumRegExp = " WHERE ([KODU] IN (" & Sayim(acıklama) & "'" & ")) "
SqlRegExp = SQLBx & KosulumRegExp & " ORDER BY yili DESC;"
If Len(Sayim(acıklama) & "") = 0 Then SqlRegExp = SqlBos
FaturaEdilemezRegExp.RowSource = SqlRegExp
FaturaEdilemezRegExp.Requery
End Sub
RE: In Ve Like Operatörleri - berduş - 17/08/2020
kodların sadeleştirilmiş hali
1 - Liste Güncellendiğinde kodu:
Private Sub liste_AfterUpdate()
Dim TblAdi As String
kodu = liste.Column(6)
islemadı = liste.Column(7)
islem_turu = liste.Column(1)
islem_grubu = liste.Column(4)
yıldızlı_islem = liste.Column(5)
yururluk_tarihi = liste.Column(3)
'metin Kutusuna göre Tablo Adı seçme_______________
TblAdi = Switch(islem_turu = "Kamu", "tbl_kamu", _
islem_turu = "Ek-2B", "tbl_sut_2b", _
islem_turu = "Ek-2C", "tbl_sut_2c", _
islem_turu = "Turist", "tbl_turist")
acıklama = Nz(DLookup("aciklama", TblAdi, "id=" & liste.Column(0))) 'açıklama alanını alma
sonuc = IIf(acıklama Like "*[0-9][0-9][0-9][0-9][0-9]*", 1, 0) ' Açıklama boşsa yada 6 haneli sayı yoksa
'yada --> sonuc = IIf(Not acıklama Like "*[0-9][0-9][0-9][0-9][0-9]*", 0, 1)
If sonuc = 0 Then
'InStr Kullanarak veri alma____________________________
FaturaEdilemezInstr.RowSource = SqlBos
' Like Kullanarak veri alma____________________________
FaturaEdilemezLike.RowSource = SqlBos
'RegExp Kullanarak veri alma___________________________
FaturaEdilemezRegExp.RowSource = SqlBos
Exit Sub
End If
Dim SqlInStr, SqlLike, SqlRegExp As String
Dim KosulumInStr, KosulumLike, KosulumRegExp As String
'metin Kutusuna göre sorgu seçme_______________
SQLBx = Switch(islem_turu = "Kamu", Sqltbl_kamu, _
islem_turu = "Ek-2B", Sqltbl_sut_2b, _
islem_turu = "Ek-2C", Sqltbl_sut_2c, _
islem_turu = "Turist", Sqltbl_turist)
'InStr Kullanarak veri alma____________________________
KosulumInStr = " WHERE (InStr(1,'" & acıklama & "',[kodu])>0)" 'Çalıştı
SqlInStr = SQLBx & KosulumInStr & " ORDER BY yili DESC;"
FaturaEdilemezInstr.RowSource = SqlInStr
'Like Kullanarak veri alma____________________________
KosulumLike = " WHERE (('" & acıklama & "') like '*' & [kodu] & '*')" 'Çalıştı
SqlLike = SQLBx & KosulumLike & " ORDER BY yili DESC;"
FaturaEdilemezLike.RowSource = SqlLike
'RegExp Kullanarak veri alma____________________________
xSayim = Sayim(acıklama & "")
KosulumRegExp = " WHERE ([KODU] IN (" & xSayim & "'" & ")) "
SqlRegExp = SQLBx & KosulumRegExp & " ORDER BY yili DESC;"
If Len(xSayim & "") = 0 Then SqlRegExp = SqlBos
FaturaEdilemezRegExp.RowSource = SqlRegExp
End Sub
2 - Sabitler Modülü:
Option Compare Database
Global Const SqlBos As String = "SELECT '' AS ID,'' AS TÜR, '' AS YIL, " & _
"'' AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, '' AS KOD, '' AS ADI, " & _
"'' AS AÇIKLAMA, '' AS PUAN,'' AS FİYATI " & _
"FROM tbl_secilenhizmetler"
Global Const Sqltbl_kamu As String = "SELECT tbl_kamu.id AS ID, tbl_kamu.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, '' AS PUAN, Format([fiyat],'Currency') AS FİYATI " & _
"FROM tbl_kamu"
Global Const Sqltbl_sut_2b As String = "SELECT tbl_sut_2b.id AS ID, tbl_sut_2b.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, islem_puani AS PUAN, Format([islem_puani]*0.593,'Currency') AS FİYATI " & _
"FROM tbl_sut_2b"
Global Const Sqltbl_sut_2c As String = "SELECT tbl_sut_2c.id AS ID, tbl_sut_2c.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], islem_grubu AS GRUBU, " & _
"yildizli_islem AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, islem_puani AS PUAN, " & _
"Format([islem_puani]*0.593,'Currency') AS FİYATI " & _
"FROM tbl_sut_2c"
Global Const Sqltbl_turist As String = "SELECT tbl_turist.id AS ID, tbl_turist.tür AS TÜR, yili AS YIL, " & _
"yururluk_tarihi AS [YÜRÜRLÜK TARİHİ], '' AS GRUBU, " & _
"'' AS YILDIZLI, kodu AS KOD, islem_adi AS ADI, " & _
"aciklama AS AÇIKLAMA, '' AS PUAN, Format([fiyat],'Currency') AS FİYATI " & _
"FROM tbl_turist"
3 - RegExp Modül kodu:
Option Compare Database
Function Sayim(Aciklama As String) As String
Sayim = ""
If Len(Aciklama & "") = 0 Then Exit Function 'GoTo 10
Dim RegEx As Object, metin As String
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "[a-zA-Z]{0,3}[0-9]{6}" '"[a-zA-Z]{0,3}[0-9]+"
RegEx.Global = True
RegEx.MultiLine = True
'RegEx.Execute (Aciklama)
Set eslesmeler = RegEx.Execute(Aciklama)
KelimeSayisi = eslesmeler.Count
For Each Kelime In eslesmeler
Kosulum = Kosulum & "','" & Kelime.Value
Next
If Kosulum <> "" Then Kosulum = Mid(Kosulum, 3) Else Kosulum = ""
Sayim = Kosulum
End Function
RE: In Ve Like Operatörleri - alperalper - 05/09/2020
Sn. Berduş çok emek hqrcamışsınız ve ilginiz için teşekkür ederim. Açıklamaları sonradan uzun metin olarak değiştim. Liste nin 255 ten fazla almaması aklıma gelmemişti onu irdeleyeceğim. Şuan pc yok. Aslında meselenin özü mesela bir işlem seçiyorum açıklamasında şunlarla fatura edilemez diyor. Ben o hizmetleri altta görmek istiyorum. Kodlara gelince bütün kodlar 6 rakamsal koddan ibaret. Ancak kiminin başında S.. var kiminde SL kiminde L.. Kiminde de hiç yok. İşi karıştıranda burası. Right ile sadece numeric olanları aldım fakat bu seferde aynı numara olup S veya SL gibi farklı işlemler olduğunu gördüm. Bu çalışmanıza bakacağım pazartesi.
RE: In Ve Like Operatörleri - berduş - 06/09/2020
Denemelerimde 10. mesajdaki kod bahsettiğiniz özelliklere sahip kayıtları gösteriyordu. Incelemelerimde Ister sadece 6 haneli sayı olsun ister başında 3 taneye kadar harf olsun sadece gerekli kayıtları gosteriyordu liste kutusunda.
Not : lütfen sonuç ister olumlu ister olumsuz olsun muhakkak geri bildirimde bulunun.
Iyi çalışmalar.
|