ADO Nesnesi İle Tarih İşlemi

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
Arkadaşlar merhaba, Personelin belirtiğim tarihte (tarih1 değişkeni) izinde olup olmadığını nasıl kontrol edebilirim?
 

Ekli dosyalar

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Farklı koşullarınız varsa kendinize göre düzenlersiniz.

C++:
Option Explicit

Sub Check_Staff_Leave()
    Dim My_Date As Date, My_Connection As Object
    Dim My_Recordset As Object, My_Query As String
    Dim Process_Time As Double
    
    Process_Time = Timer
    
    Set My_Connection = VBA.CreateObject("AdoDb.Connection")
    
    My_Connection.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
     
    My_Date = DateSerial(2022, 6, 25)
    
    Set My_Recordset = My_Connection.Execute("Select [İZİN TÜRÜ], AYRILIS, KATILIS, GÜN From [01-1$E5:U] " & _
                                             "Where " & CLng(My_Date) & ">= AYRILIS And " & CLng(My_Date) & "<= KATILIS")

    If Not My_Recordset.EOF Then
        MsgBox My_Date & " tarihinde personel izinlidir." & vbCrLf & vbCrLf & _
               My_Recordset.Fields(0).Value & vbCrLf & _
               My_Recordset.Fields(1).Value & vbCrLf & _
               My_Recordset.Fields(2).Value & vbCrLf & _
               My_Recordset.Fields(3).Value & vbCrLf & vbCrLf & _
               "İşlem süresi ; " & Format(Timer - Process_Time, "0.00") & " Saniye", vbInformation
    End If

    If My_Recordset.State <> 0 Then My_Recordset.Close
    If My_Connection.State <> 0 Then My_Connection.Close
  
    Set My_Connection = Nothing
    Set My_Recordset = Nothing
End Sub
 

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
Hocam teşekkür ederim benim yazdığım mantık doğru çalışmama sebebi nedir acaba AYRILIS tarihine büyük ve eşit KATILIS tarihine küçük ve eşit olan değerleri getirmesi için sorgu oluşturuyorum.


C++:
Sub izin_kontrol()
    Dim con, rs As Object
    'değişken tanımlama
    Dim query, ConStr, db_file As String
    Dim i, sonhucre As Long
    'Dim per_arr() As String
    
    Set con = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    db_file = ThisWorkbook.FullName
    con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
    db_file & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

sonhucre = db_izin_arsiv.Cells(6, 6).End(xlDown).row 'son boş satiri bulmak için

ARALIK = db_izin_arsiv.Name & "$" & "E5" & ":" & "Q" & sonhucre 'aralık belirle

''''KRİTERE SORGUSU
İşlem_Yap_TC = "11111111111"
tarih1 = DateSerial(2022, 6, 27)
tarih2 = "29.06.2023"

'Bu sorgu çalışıyor
'query = "SELECT * FROM [" & ARALIK & "] " & _
            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _
            "and AYRILIS <=" & CLng(CDate(tarih2)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "

'bu çalışmıyor
query = "SELECT * FROM [" & ARALIK & "] " & _
            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _
            "and AYRILIS <=" & CLng(CDate(tarih1)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "
rs.Open query, con, 3, 1
If rs.RecordCount >= 1 Then: MsgBox "Personel İzinde"
end sub
 
Son düzenleme:

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
Mantık olarak olması gerekirken bu da olmuyor mesela
C++:
sub test2 ()
Dim con, rs As Object

    'değişken tanımlama

    Dim query, ConStr, db_file As String

    Dim i, sonhucre As Long

    'Dim per_arr() As String

    

    Set con = CreateObject("ADODB.Connection")

    Set rs = CreateObject("ADODB.Recordset")

    db_file = ThisWorkbook.FullName

    con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _

    db_file & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"



sonhucre = db_izin_arsiv.Cells(6, 6).End(xlDown).row 'son boş satiri bulmak için



ARALIK = db_izin_arsiv.Name & "$" & "E5" & ":" & "Q" & sonhucre 'aralık belirle

''query = "SELECT * FROM [" & ARALIK & "]" 'tüm izinleri getir

''''KRİTERE SORGUSU

İşlem_Yap_TC = "11111111111"

tarih1 = DateSerial(2022, 3, 16)

tarih2 = "29.06.2023"

''2 tarih arası işlem yapılan tc

query = "SELECT * FROM [" & ARALIK & "] " & _

            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _

            "and AYRILIS <=" & CLng(CDate(tarih2)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "

rs.Open query, con, 3, 1

MsgBox rs.Fields.Item(7).Value

'RecordSet sonuçlarını belirli alanlara yazdırmak için döngü

    Do Until rs.EOF 'until true olana kadar döngü döner

     'MsgBox rs.Fields.Item(2).Value 'izin ayrılıs tarihi

     ayrılıs = CLng(CDate(rs.Fields.Item(7).Value))

     katılıs = CLng(CDate(rs.Fields.Item(8).Value))

     tarih2 = CLng(CDate(tarih2))

     If tarih2 >= ayrılıs And tarih2 < katılıs Then

         MsgBox "İzinde"

     End If



    rs.movenext 'bir sonraki değere

    Loop
rs.close
end sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Siz sorgunuzda KATILIS kriterini kullanmamışsınız.
 

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
@Korhan Ayhan Hocam katılıs olarak değiştirdim ama sonuç yine aynı tek sorguda neden olmuyor anlamış değilim
Bu sorguda ne hatası var

C++:
Sub izin_kontrol()
Dim con, rs As Object
Dim query, db_file As String
Dim i, sonhucre As Long

Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
db_file = ThisWorkbook.FullName
con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
db_file & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

sonhucre = db_izin_arsiv.Cells(6, 6).End(xlDown).row 'son boş satiri bulmak için
ARALIK = db_izin_arsiv.Name & "$" & "E5" & ":" & "Q" & sonhucre 'aralık belirle
query = "SELECT * FROM [" & ARALIK & "] " & _
            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _
            "and KATILIS <" & CLng(CDate(tarih1)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "
rs.Open query, con, 3, 1
MsgBox rs.RecordCount
rs.Close
End Sub
 
Son düzenleme:

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Paylaştığınız kod bloğunda kullandığınız değişkenleri göremiyorum.

ARALIK ?
tarih1 ?
İşlem_Yap_TC ?

Birde büyüklük ve küçüklük sorgusunda kriterlerinizin yerini değiştirip deneyiniz.
 

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
Hocam bu sorgu ile doğru sonuç geliyor
C++:
İşlem_Yap_TC = "11111111111"
tarih1 = "01.01.2022"
tarih2 = "29.12.2022"
tarih3 = "27.06.2022"
''2 tarih arası işlem yapılan tc
query = "SELECT * FROM [" & ARALIK & "] " & _
            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _
            "and KATILIS <=" & CLng(CDate(tarih2)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "
'query = "SELECT * FROM [" & ARALIK & "] " & _
'            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _
'            "and KATILIS <" & CLng(CDate(tarih1)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "
rs.Open query, con, 3, 1
'MsgBox rs.Fields.Item(7).Value
'RecordSet sonuçlarını belirli alanlara yazdırmak için döngü
    Do Until rs.EOF 'until true olana kadar döngü döner
     If CLng(CDate(tarih3)) >= CLng(CDate(rs.Fields.Item(7).Value)) And CLng(CDate(rs.Fields.Item(8).Value)) > CLng(CDate(tarih3)) Then
            MsgBox "AKTİF SIRA:" & rs.Fields.Item(0).Value & vbCrLf & "AKTİF TARİH:" & tarih2 & vbCrLf & "Ayrlıs:" & rs.Fields.Item(7).Value & vbCrLf & "Katılıs:" & rs.Fields.Item(8).Value
     End If

    rs.movenext 'bir sonraki değere
   Loop
 

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
Paylaştığınız kod bloğunda kullandığınız değişkenleri göremiyorum.

ARALIK ?
tarih1 ?
İşlem_Yap_TC ?

Birde büyüklük ve küçüklük sorgusunda kriterlerinizin yerini değiştirip deneyiniz.
Deneyeceğim hocam küçüktür çalışmıyor olabilir mi? Hocam döngüye girmeden tek sorguda yapmaması mantık hatası

Kod:
Sub izin_kontrol()
Dim con, rs As Object
Dim query, db_file As String
Dim i, sonhucre As Long

Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
db_file = ThisWorkbook.FullName
con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
db_file & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

sonhucre = db_izin_arsiv.Cells(6, 6).End(xlDown).row 'son boş satiri bulmak için
ARALIK = db_izin_arsiv.Name & "$" & "E5" & ":" & "Q" & sonhucre 'aralık belirle

''''KRİTERE SORGUSU
İşlem_Yap_TC = "11111111111"
tarih1 = "01.01.2022"
tarih2 = "29.12.2022"
tarih3 = "27.06.2022"
query = "SELECT * FROM [" & ARALIK & "] " & _
            "WHERE AYRILIS >=" & CLng(CDate(tarih1)) & _
            "and KATILIS <" & CLng(CDate(tarih1)) & " and [TC KİMLİK NO] = " & İşlem_Yap_TC & " "
rs.Open query, con, 3, 1
MsgBox rs.RecordCount
rs.Close
End Sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Sizin kodunuzu aşağıdaki gibi yapınca ben sonuç aldım...

Kendi önerdiğim koda göre neleri değiştirdim... (TANIMLAMA İSİMLERİNİ ve sorguya da TC NO kriterini ekledim.)

C++:
Sub izin_kontrol()
    Dim con, rs As Object
    Dim query, db_file As String
    Dim i, sonhucre As Long
    
    Set con = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    db_file = ThisWorkbook.FullName
    con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
    db_file & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    
    sonhucre = db_izin_arsiv.Cells(6, 6).End(xlDown).Row 'son boş satiri bulmak için
    ARALIK = db_izin_arsiv.Name & "$" & "E5" & ":" & "Q" & sonhucre 'aralık belirle
    
    ''''KRİTERLER
    İşlem_Yap_TC = 11111111111#
    tarih1 = "25.06.2022"
    
    query = "Select * From [" & ARALIK & "] " & _
                "Where " & CLng(CDate(tarih1)) & ">= AYRILIS " & _
                "And " & CLng(CDate(tarih1)) & "<= KATILIS And [TC KİMLİK NO] = " & İşlem_Yap_TC
    rs.Open query, con, 3, 1
    MsgBox rs.RecordCount
    rs.Close
End Sub
 

yusuf1284

Altın Üye
Katılım
17 Ocak 2015
Mesajlar
224
Excel Vers. ve Dili
Office Pro 2016 TR
Altın Üyelik Bitiş Tarihi
09-02-2028
Katılıs tarihinde 1 gün çıkarmam gerekiyor bir de tc sonuna kare işareti eklemediğim için mi olmamış
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,247
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
ADO veritabanı sorgulama yöntemidir. Belli kurallara uymanız gerekir ki bunu başka başlıklarda da sürekli dile getiriyoruz.

Sayısal alanlarda kriteri sayı olarak yazmak gerekir. (TC = 12345678901 gibi)
Metinsel alanlarda ise tek tırnak kullanarak kriteri yazmak gerekir. (AD = 'YUSUF' gibi)

Katılış tarihinden 1 gün çıkarmanız gerekiyorsa < (küçük) sembolü işinize yarayabilir.

ADO'ya merakınız varsa linkteki konuları irdeleyebilirsiniz.

 
Üst