[VBA] Iki Tarih Arası Zaman Sayarken Kritere Uymaması
#1
Arkadaşlar periyot hesabı için kullandığım bir fonksiyonumda sorun yaşıyorum. ekli dosyaya aşağıdaki tarihleri girerek denediğiniz zaman göreceksiniz. Tarihin üstüne belirli zamanları koyarak saydırıyorum ama koşul istediğim tarihi göstermiş olmasına rağmen koşula uymuyor gibi geçiyor ve fazladan 1 periyot sayıyor. Bilgisi olan arkadaşlar fikir verirse sevinirim.

Başlama: 22.01.2022 16:30:00
Cevap: 22.01.2022 17:30:00
Bitiş: 22.01.2022 19:30:00

cevap süre: 1 Saat
düzeltme süre: 1 saat


Kural: Başlama zamanı üstüne cevap süresi eklenir eğer bu tarih cevaptan küçükse sorun yok heplama yapmaz. değilse periyot sayar. 16:30:01 terse 1 peryiot, 17:30:01 derse 2. periyot diye devam eder gider.

Eğer kural birde sorun yoksa 17:30:00 üstüne düzeltme süresi eklenir. bu süre cevap süresinden küçükse sorun yok değilse üstüne düzeltme süresi eklenerek saymaya devam eder.

Benim bu verdiğim örnek zamanlarda düzeltmeyi hesaplarken trhduzeltme 19:30:00 olmasına rağmen oradaki >= kuralı işlemiyor. anlayamadım gitti. Bu örnekte 18:30:00 a kadar bu sorun çözülmeliydi. 19:30:00 da çözüldüğü için 18:30:01 de 1 periyot 19:30:01 de ise 2. periyot olur. ama 19:30:00 da bittiği için 2. periyot oluşmuyor.

[Resim: hbft0u0.PNG]


Eklenti Dosyaları
.rar   Database1.rar (Boyut: 24,06 KB / İndirilme: 23)



  Alıntı
Bu mesajı beğenenler:
#2
Visual Basic
  1. Private Sub Komut0_Click()
  2. ...
  3. ...
  4. End Select
  5.  
  6. periyot_yanit = 0
  7. periyot_duzeltme = 0
  8.  
  9. hedefyanittarihi = DateAdd(yanit, hizmet_yanit_suresi, cagri_acilis_tarihi)
  10. hedefduzeltmetarihi = DateAdd(duzeltme, hizmet_duzeltme_suresi, hedefyanittarihi)
  11.  
  12.  
  13. If cagri_yanit_tarihi <= hedefyanittarihi Then
  14. trhduzeltme = hedefduzeltmetarihi
  15. Do Until trhduzeltme >= cagri_kapanis_tarihi
  16. trhduzeltme = DateAdd(duzeltme, hizmet_duzeltme_suresi, trhduzeltme)
  17. periyot_duzeltme = periyot_duzeltme + 1
  18. Loop
  19. Else
  20. trhyanit = hedefyanittarihi
  21. Do Until trhyanit >= cagri_yanit_tarihi
  22. trhyanit = DateAdd(yanit, hizmet_yanit_suresi, trhyanit)
  23. periyot_yanit = periyot_yanit + 1
  24. Loop
  25. End If
  26.  
  27.  
  28. periyot_yanit = Nz(periyot_yanit, 0)
  29. periyot_duzeltme = Nz(periyot_duzeltme, 0)
  30.  
  31. MsgBox periyot_yanit & "--" & periyot_duzeltme
  32.  
  33. End Sub



olarak dener misiniz?



  Alıntı
Bu mesajı beğenenler:
#3
(06-09-2022, 07:41)dsezgin demiş ki:
Visual Basic
  1. Private Sub Komut0_Click()
  2. ...
  3. ...
  4. End Select
  5.  
  6. periyot_yanit = 0
  7. periyot_duzeltme = 0
  8.  
  9. hedefyanittarihi = DateAdd(yanit, hizmet_yanit_suresi, cagri_acilis_tarihi)
  10. hedefduzeltmetarihi = DateAdd(duzeltme, hizmet_duzeltme_suresi, hedefyanittarihi)
  11.  
  12.  
  13. If cagri_yanit_tarihi <= hedefyanittarihi Then
  14.                trhduzeltme = hedefduzeltmetarihi
  15.                Do Until trhduzeltme >= cagri_kapanis_tarihi
  16.                    trhduzeltme = DateAdd(duzeltme, hizmet_duzeltme_suresi, trhduzeltme)
  17.                    periyot_duzeltme = periyot_duzeltme + 1
  18.                Loop
  19. Else
  20.            trhyanit = hedefyanittarihi
  21.            Do Until trhyanit >= cagri_yanit_tarihi
  22.                trhyanit = DateAdd(yanit, hizmet_yanit_suresi, trhyanit)
  23.                periyot_yanit = periyot_yanit + 1
  24.            Loop
  25. End If
  26.              
  27.                
  28.                periyot_yanit = Nz(periyot_yanit, 0)
  29.                periyot_duzeltme = Nz(periyot_duzeltme, 0)
  30.  
  31.                MsgBox periyot_yanit & "--" & periyot_duzeltme
  32.  
  33. End Sub



olarak dener misiniz?

Hocam teşekkür ederim.. Çok ilginç koşul do until ile kullanıldığı zaman oluyor. Acaba sebebi nedir?



  Alıntı
Bu mesajı beğenenler:
#4
(06-09-2022, 17:47)alperalper demiş ki: . Çok ilginç koşul do until ile kullanıldığı zaman oluyor. Acaba sebebi nedir?

koşul olana kadar sayacı 1 arttır diyorsunuz. Koşulu do ya taşıyıp, -1 olduğunda dur deniyor. If de koşul oluşmamış olabilir. biraz da goto ile değil de if...else ... end if içinde daha güzel olur.



  Alıntı
Bu mesajı beğenenler:
#5
(06-09-2022, 20:51)dsezgin demiş ki:
(06-09-2022, 17:47)alperalper demiş ki: . Çok ilginç koşul do until ile kullanıldığı zaman oluyor. Acaba sebebi nedir?

koşul olana kadar sayacı 1 arttır diyorsunuz. Koşulu do ya taşıyıp, -1 olduğunda dur deniyor. If de koşul oluşmamış olabilir. biraz da goto ile değil de if...else ... end if içinde daha güzel olur.

dsezgin hocam bu tarihteki sorunları hallettim. Kombinasyonlar çok karışıktı ama if else olarak yaptım hepsini güzelde oldu. Lakin bir sorunla karşılaştım. Birinci mesajda verdiğim örnek çalışmada dateadd içine eklenecek zaman dilimleri önceden tanımlıydı. Gün eklerken "d", yıl eklerken "y" saniye eklerken "n" gibi. Ancak bizim başka bir kriter olarak "w" varmış. İş günü. Dateadd("w", 1,tarih) dediğimde tarihin üstüne 1 iş günü eklemesi gerekiyor ama iş günü olmayan günlerde ekleniyor. Bu böyle çalışmaz mı? Weekday ile gün indeksine göre mi gitsem?



  Alıntı
Bu mesajı beğenenler:
#6
Visual Basic
  1. Dim ResIs As Long
  2. Public Function IsGunu(Tarih As Date) As Long
  3. Dim Resmi As Variant
  4. Dim Isaret, Sayac As Long
  5. ResIs = 0
  6. Resmi = Array("0101", "2304", "0105", "1905", "1507", "3008", "2910")
  7. If Eval(Weekday(Tarih, vbMonday) & "Not In(6, 7)") Then Isaret = -1
  8. For Sayac = 0 To 6
  9. If Format(Tarih, "ddmm") = Resmi(Sayac) Then ResIs = -1: Isaret = 0: Exit For
  10. Next Sayac
  11. IsGunu = Isaret
  12. End Function
  13. Sub nn()
  14. Dim Trh As Date, CalsGun As Long
  15. Dim Ay(12) As Long
  16. For Trh = #1/1/2022# To #12/31/2022#
  17. Ay(CLng(Month(Trh))) = Ay(CLng(Month(Trh))) + IIf(IsGunu(Trh) = -1, 1, 0)
  18. 'Debug.Print Format(Trh, "Long Date"), IsGunu(Trh), IIf(ResIs = -1, "Resmi Bayram", vbNullString)
  19. Next Trh
  20. Debug.Print "Ock:" & Ay(1) & vbNewLine; "Þub:" & Ay(2) & vbNewLine; "Mar:" & Ay(3) & vbNewLine; "Nis:" & Ay(4) & vbNewLine; "May:" & Ay(5) & vbNewLine; "Haz:" & Ay(6) & vbNewLine; "Tem:" & Ay(7) & vbNewLine; "Aðt:" & Ay(8) & vbNewLine; "Eyl:" & Ay(9) & vbNewLine; "Eki:" & Ay(10) & vbNewLine; "Kas:" & Ay(11) & vbNewLine; "Arl:" & Ay(12)
  21. End Sub


Resmi ve Cmt+Paz gunleri harici iki tarih arisini For Trh = #1/1/2022# To #12/31/2022# satırına referans ile aradaki işgününü saydırabilirsin.
Dini bayramları Calender(...) George'yi Hijri'ye çevirerek kontrol edilir.



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  [VBA] Tablolar Arası Dağılım benuva 1 196 09-02-2024, 00:56
Son Mesaj: halily
access-sql-18 [VBA] Veritabanları Arası şartlı Tablo Kopyalama BeyTor 5 257 22-07-2023, 00:29
Son Mesaj: dsezgin
  Formlar Arası Veri Gönderme kursun 2 181 26-11-2022, 22:14
Son Mesaj: kursun
  Kayıtlar Arası Gezinti Tuşlarının Iptali Hk. adnnfrm 1 127 01-10-2022, 09:45
Son Mesaj: alperalper
  Sql Iki Tarih Arası Fark benuva 11 469 25-08-2022, 17:38
Son Mesaj: halily
access-sql-4 Birden Fazla Kritere Göre Sorgulama Büyük Data 0 164 28-06-2022, 15:44
Son Mesaj: Büyük Data
  [VBA] Iki Tarih Arası Filtrelemede Hata derzulya 2 196 17-06-2022, 08:14
Son Mesaj: derzulya
  Iki Tarih Arası Filtre Kodlarını Uygulama Sorunu tarkanaykın 4 284 27-04-2022, 21:48
Son Mesaj: tarkanaykın

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi