|
[ Miki2013 @ 10.09.2018. 14:33 ] @
| Pozdrav!
Zanima me da li je u MS Accessu 2003 moguce dobiti zadnji datum na osnovu prvog datuma i broja radnih dana?
Konkretno radi se o ispisu zadnjeg datuma godisnjeg odmora na osnovu pocetnog datuma i broja radnih dana.
Ta stvar radi svoj posao u Excelu fantasticno pa me zanima moze li i u MS Accessu.
npr. 10 radnih dana i pocetak 10.09.2018 = 21.09.2018.
Hvala unaprijed.
|
[ bokinet @ 10.09.2018. 16:42 ] @
Napravis funkciju u kojoj prosledis ulazne parametre/promenljive pocetni datum i broj dana.
U f-ji saberes datum i dane i onda proveris da li je rezultat radni dan. Ako nije onda dodajes +1 dok ne dodjes do radnog dana.
U natavku prilazem primer koda koji bi trebalo da radi u MS Access (nisam probao u njemu vec u drugom VBA editoru).
Ovo moze da se optimizuje i sredi jos. Evo brzinski primer.
Code:
Function PocetakRada(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As String
Dim PrviRadniDan As String
Dim DodajBrojDana As Integer
Dim nDan As Integer
' Broj dana koji se dodaje na dan pocetka odmora
DodajBrojDana = BrojDanaOdmora + 1
' Prvi radni dan je
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", PrviRadniDan, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
Debug.Print Now, "> Vikend. preracunati na prvi sledecei radni dan.", "Dan u nedelji: "; nDan
' Postavi vrednost za broj dana koji se dodaje
DodajBrojDana = 0
' Ako je subota
If nDan = 6 Then DodajBrojDana = 2
' Ako je nedelja
If nDan = 7 Then DodajBrojDana = 1
' Ukupan broj dana koji se dodaje na pocetak datuma odmora
DodajBrojDana = DodajBrojDana + BrojDanaOdmora + 1
' Prvi radni dan je
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
End If
Debug.Print Now, "PocetakOmdora: "; PocetakOdmora, "Broj dana odmora: "; BrojDanaOdmora, "Prvi radni dan je: "; PrviRadniDan
' Povratna vrednost
PocetakRada = PrviRadniDan
End Function
Primer koriscenja f-je
Code:
PocetakRada "10/09/2018", 10
PocetakRada "10/09/2018", 11
PocetakRada "10/09/2018", 12
PocetakRada "10/09/2018", 13
PocetakRada "10/09/2018", 14
Dim r As String
r = PocetakRada("10/09/2018", 10)
Debug.Print "10/09/2018", 10, r
Obratiti paznju na sistemske parametre kako su podeseni na racunaru za datum i vreme i koji se format za iste koristi.
[ Miki2013 @ 11.09.2018. 08:15 ] @
Hvala na brzom odgovoru.
Pokusao sam to implementirati ali sam se zapetljao i nisam uspio.
Kacim konkretan primjer pa ako mozes molim te da prilagodis ovom primjeru.
[ bokinet @ 11.09.2018. 14:30 ] @
Nasao sam neki MS Access i odradio primer na osnovu prilozene baze.
[ Miki2013 @ 11.09.2018. 14:57 ] @
Hvala na trudu ali ako ukucate npr.15 dana od 10.09.2018 kao rezultat daje 26.09. a ne 28.09 kako bi trebao.
[ bokinet @ 11.09.2018. 15:37 ] @
Mozda sam napravio neki previd u kodu... pogledacu kad stignem.
U svakom slucaju, opet 28.09. na 10.09. i 15 dana tesko :)
Jedino ako je bitno da pocetak bude petak u nedelji posto je 28.09. petak!
[ bokinet @ 11.09.2018. 15:40 ] @
Evo samo f-je gde je iskljuceno dodavanje '+1' na broj dana.
Code:
Function PocetakRada(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As String
Dim PrviRadniDan As String
Dim DodajBrojDana As Integer
Dim nDan As Integer
' Broj dana koji se dodaje na dan pocetka odmora
DodajBrojDana = BrojDanaOdmora '+ 1
' Prvi radni dan je
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", PrviRadniDan, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
Debug.Print Now, "> Vikend. preracunati na prvi sledecei radni dan.", "Dan u nedelji: "; nDan
' Postavi vrednost za broj dana koji se dodaje
DodajBrojDana = 0
' Ako je subota
If nDan = 6 Then DodajBrojDana = 2
' Ako je nedelja
If nDan = 7 Then DodajBrojDana = 1
' Ukupan broj dana koji se dodaje na pocetak datuma odmora
DodajBrojDana = DodajBrojDana + BrojDanaOdmora '+ 1
' Prvi radni dan je
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
End If
Debug.Print Now, "PocetakOmdora: "; PocetakOdmora, "Broj dana odmora: "; BrojDanaOdmora, "Prvi radni dan je: "; PrviRadniDan
' Povratna vrednost
PocetakRada = PrviRadniDan
End Function
p.s. Videti da li se uzima u obzir i dan pocetak i dan isteka u obim br. dana odmora. Zbog toga je iskljuceno gore u kodu '+1'
Evo online kalkulatora
https://www.timeanddate.com/da...am=&aw=&ad=15&rec=
[ dusans @ 11.09.2018. 16:02 ] @
Ne znam kako si zamislio da ti ovo radi kada si na slepo dodao broj dana odmora početku odmora,
bez da si uzeo u obzir dane vikenda i ostale neradne dane po kalendaru (koje čak i nemaš kao input, a trebao bi).
Jedino na kraju gledaš da pronađeš prvi radni dan, što je u principu OK.
Dosta logike ti fali u ovome.
Prosto rešenje je da ideš iterativno, dan-po-dan dok ne potrošiš sve radne dane u dužini trajanja odmora i dok ne dođeš do prvog narednog radnog dana.
Nije baš efikasno rešenje, problem je kada odmori traju na hilade ili milione dana.
[ bokinet @ 11.09.2018. 16:04 ] @
@dusanns pa dati kod to i radi... prvo doda dane pa onda vidi koji je dan u nedelji kada se dodaju dani. Ako je subota ili nedelja onda se odradi preracun. nDan (1...7)
[ dusans @ 11.09.2018. 16:16 ] @
Ne radi to što treba da radi...
Code:
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
Ako na 10.09.2018 dodaš 15 dana, onda dobijaš 25.09.2018,
što je pogrešno zato što si računao i dve Subote i dve Nedelje kao radne dane.
Dakle, umesto da neko dobije 15 NERADNIH dana, u tvom kodu on dobija 11 neradnih dana.
Dalji račun za pronalaženje sledećeg radnog dana je OK.
Na kraju, ako neko počinje odmor 10.09.2018 i ima 15 dana odmora,
njegov prvi radni dan posle odmora je 01.10.2018 (odnosno 28.09.2018 mu je zadnji neradni dan, ono što treba Mikiju)
[Ovu poruku je menjao dusans dana 11.09.2018. u 17:27 GMT+1]
[ bokinet @ 11.09.2018. 16:54 ] @
Nisam obracao paznju da se racunaju samo radni dan.
Evo dole je dodata f-ja koja racuna broj vikend dana i f-ja koja je preradjena da koristi istu kako bi se pomenuto uzelo u obzir.
Sada se dobija da je prvi radni 01.10.2018. ako je pocetak odmora 10/09/2018 i odmor traje 15 RADNIH dana.
Code:
' Broj vikend dana za dati datum i broj RADNIH dana
Public Function BrojVikendDana(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As Integer
Dim iDay As Integer
' Brojac dana
r = 0
For i = 0 To BrojDanaOdmora
' Dan u nedelji
iDay = Weekday(CDate(PocetakOdmora) + i, vbUseSystemDayOfWeek)
' Ako je subota ili nedelja onda azuriraj brojac dana
If iDay = 6 Or iDay = 7 Then r = r + 1
Next
' Ako je poslednji dan u dodavanju subota onda, dodaji jos jedan dan, posto je sledeci dan nedelja
If iDay = 6 Then r = r + 1
' Povratna vrednost
BrojVikendDana = r
End Function
Function PocetakRada(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As String
Dim PrviRadniDan As String
Dim DodajBrojDana As Integer
Dim DodajBrojVikendDana As Integer
Dim nDan As Integer
' Broj dana koji se dodaje na dan pocetka odmora
'DodajBrojDana = BrojDanaOdmora
' Broj vikend dana
DodajBrojVikendDana = BrojVikendDana(PocetakOdmora, BrojDanaOdmora)
Debug.Print Now, "Ukupno obracunato vikend dana:", DodajBrojVikendDana
' Broj radnih dana + broj vikend dana
DodajBrojDana = BrojDanaOdmora + DodajBrojVikendDana
' Prvi radni dan je
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", PrviRadniDan, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
Debug.Print Now, "> Vikend. preracunati na prvi sledecei radni dan.", "Dan u nedelji: "; nDan
' Postavi vrednost za broj dana koji se dodaje
DodajBrojDana = 0
' Ako je subota
If nDan = 6 Then DodajBrojDana = 2
' Ako je nedelja
If nDan = 7 Then DodajBrojDana = 1
' Ukupan broj dana koji se dodaje na pocetak datuma odmora
DodajBrojDana = DodajBrojDana + BrojDanaOdmora + DodajBrojVikendDana
' Prvi radni dan je
PrviRadniDan = CDate(PocetakOdmora) + DodajBrojDana
End If
Debug.Print Now, "PocetakOmdora: "; PocetakOdmora, "Broj dana odmora: "; BrojDanaOdmora, "Prvi radni dan je: "; PrviRadniDan
' Povratna vrednost
PocetakRada = PrviRadniDan
End Function
Sub Test()
Dim r As String
r = PocetakRada("10/09/2018", 15)
End Sub
Code:
11/09/2018 17:54:19 Ukupno obracunato vikend dana: 4
11/09/2018 17:54:19 > Vikend. preracunati na prvi sledecei radni dan. Dan u nedelji: 6
11/09/2018 17:54:19 PocetakOmdora: 10/09/2018 Broj dana odmora: 15 Prvi radni dan je: 01/10/2018
[Ovu poruku je menjao bokinet dana 11.09.2018. u 18:05 GMT+1]
[Ovu poruku je menjao bokinet dana 11.09.2018. u 18:06 GMT+1]
[Ovu poruku je menjao bokinet dana 11.09.2018. u 18:23 GMT+1]
[ dusans @ 11.09.2018. 21:15 ] @
Svaka čast na trudu i zalaganju!
Ali, na 25 radnih dana odmora, opet će da ti "pojede" 2 dana odmora.
I kako dužina odmora raste, tako će i apsolutna greška da bude sve veća.
Zato sam i napisao da je ne-baš-efikasno rešenje ALI BAREM PROSTO REŠENJE
da ideš dan-po-dan kao što već činiš u petlji funkcije BrojVikendDana.
Ako je i dalje nejasno zbog čega dolazi do greške, to je zbog ovoga:
Code:
DodajBrojDana = BrojDanaOdmora + DodajBrojVikendDana
Ako je DodajBrojVikendDana = 6, onda, u najboljem slučaju greškom uzimaš bar jedan dan vikenda, u gorim slučajevima greškom uzimaš dva dana vikenda.
Kako DodajBrojVikendDana raste, tako sve više i više vikend dana uzimaš kao da su radni.
Drugačije rečeno - prostom aritmetikom se ovo ne rešava - ulaziš sam sebi u stomak.
Ovo me podseća na test-first pristup (a.k.a. lako ćemo) - prvo napravimo nešto što ne radi
pa posle ispravljamo dok ne proradi - umesto da se trud usmeri na razumevanje problema i razradu valjanog rešenja.
[Ovu poruku je menjao dusans dana 11.09.2018. u 22:40 GMT+1]
[ bokinet @ 11.09.2018. 23:16 ] @
@dusans pomozi onda coveku ako sve tako lepo znas i drzis u malom prstu... neki pomoazu koliko mogu i kad mogu paralelno sa svojim poslom a neki eto nakrive kapu i ...
[ bokinet @ 11.09.2018. 23:17 ] @
Code:
Function PocetakRada2(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As String
'...dusans
End Function
Code:
' U pauzi za kafu
Function PocetakRada2(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As String
Dim BrojRadnihDanaUNedelji As Integer
Dim BrojNedelja As Integer
Dim UkupanBrojDanaOdmora As Integer
Dim Ostatak As Integer
Dim r As String
' Broj radnih dana u nedelji Pon - Pet - 5
BrojRadnihDanaUNedelji = 5
UkupanBrojDanaOdmora = BrojDanaOdmora
If BrojDanaOdmora > BrojRadnihDanaUNedelji Then
UkupanBrojDanaOdmora = 0
' Broj nedelja
BrojNedelja = BrojDanaOdmora \ BrojRadnihDanaUNedelji
Ostatak = BrojDanaOdmora Mod BrojRadnihDanaUNedelji
' Ukupan broj
UkupanBrojDanaOdmora = (BrojNedelja * 7) + Ostatak
End If
r = CDate(PocetakOdmora) + UkupanBrojDanaOdmora
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", r, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
' Ako je subota
If nDan = 6 Then r = DateAdd("d", 2, r)
' Ako je nedelja
If nDan = 7 Then r = DateAdd("d", 1, r)
End If
Debug.Print "PocetakOdmora:"; PocetakOdmora, "BrojDanaOdmora:"; BrojDanaOdmora, "BrojNedelja:"; BrojNedelja, "Ostatak:"; Ostatak, "UkupanBrojDanaOdmora:"; UkupanBrojDanaOdmora, r
' Povratna vrednost
PocetakRada2 = r
End Function
[Ovu poruku je menjao bokinet dana 12.09.2018. u 01:07 GMT+1]
[Ovu poruku je menjao bokinet dana 12.09.2018. u 01:09 GMT+1]
[ Miki2013 @ 12.09.2018. 09:33 ] @
Hvala bokinet na velikoj pomoći.
Ujedno se izvinjavam zbog mog previda jer nisam spomenuo da je riječ o izradi rješenja za godišnji odmor.
U rješenjima koja se donose u firmi gdje radim se navode prvi i zadnji dan godišnjeg odmora (ne prvi radni dan nakon odmora).
Ovaj zadnji primjer radi dobro s tim da bi samo, ako je moguće bilo dobro dobiti i zadnji dan g/o umjesto prvi radni dan.
primjer: covjek koristi 10 radnih dana počevši od 10.09.2018 i to mu u rješenju treba da stoji do 21.09.2018.
znači, 10.09. mu je već prvi dan odmora a 21.09 je zadnji dan. radnicima koji dobiju ta rješenja se
podrazumjeva da je 24.09. dan kada se lice javlja na radno mjesto.
Ono što sam slučajno primjetio je da nekada računa (kako treba - zadnji dan g/o)
- primjer: kada se unese 11 radnih dana radi ok, a već kada se unese 12 dana onda računa kao dan kada se lice javlja na posao.
[Ovu poruku je menjao Miki2013 dana 12.09.2018. u 11:56 GMT+1]
[ bokinet @ 12.09.2018. 13:59 ] @
@Miki2013 ja sam malo vise u guzvi, kad budem stigao gledacu da dodam tu mogucnost u primeru koda.
[ bokinet @ 12.09.2018. 14:04 ] @
Citat:
Ono što sam slučajno primjetio je da nekada računa (kako treba - zadnji dan g/o)
- primjer: kada se unese 11 radnih dana radi ok, a već kada se unese 12 dana onda računa kao dan kada se lice javlja na posao.
@Miki2013 Da li je u pitanju poslednja f-ja koja je navedena? Imate rezultate testa ispod takodje.
Code:
Function PocetakRada2(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer) As String
Dim BrojRadnihDanaUNedelji As Integer
Dim BrojNedelja As Integer
Dim UkupanBrojDanaOdmora As Integer
Dim Ostatak As Integer
Dim r As String
' Broj radnih dana u nedelji Pon - Pet - 5
BrojRadnihDanaUNedelji = 5
UkupanBrojDanaOdmora = BrojDanaOdmora
If BrojDanaOdmora > BrojRadnihDanaUNedelji Then
UkupanBrojDanaOdmora = 0
' Broj nedelja
BrojNedelja = BrojDanaOdmora \ BrojRadnihDanaUNedelji
Ostatak = BrojDanaOdmora Mod BrojRadnihDanaUNedelji
' Ukupan broj
UkupanBrojDanaOdmora = (BrojNedelja * 7) + Ostatak
End If
r = CDate(PocetakOdmora) + UkupanBrojDanaOdmora
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", r, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
' Ako je subota
If nDan = 6 Then r = DateAdd("d", 2, r)
' Ako je nedelja
If nDan = 7 Then r = DateAdd("d", 1, r)
End If
Debug.Print "PocetakOdmora:"; PocetakOdmora, "BrojDanaOdmora:"; BrojDanaOdmora, "BrojNedelja:"; BrojNedelja, "Ostatak:"; Ostatak, "UkupanBrojDanaOdmora:"; UkupanBrojDanaOdmora, r
' Povratna vrednost
PocetakRada2 = r
End Function
Code:
PocetakOdmora:10/09/2018 BrojDanaOdmora: 1 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 1 11/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 5 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 5 17/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 6 BrojNedelja: 1 Ostatak: 1 UkupanBrojDanaOdmora: 8 18/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 7 BrojNedelja: 1 Ostatak: 2 UkupanBrojDanaOdmora: 9 19/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 9 BrojNedelja: 1 Ostatak: 4 UkupanBrojDanaOdmora: 11 21/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 10 BrojNedelja: 2 Ostatak: 0 UkupanBrojDanaOdmora: 14 24/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 11 BrojNedelja: 2 Ostatak: 1 UkupanBrojDanaOdmora: 15 25/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 12 BrojNedelja: 2 Ostatak: 2 UkupanBrojDanaOdmora: 16 26/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 13 BrojNedelja: 2 Ostatak: 3 UkupanBrojDanaOdmora: 17 27/09/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 15 BrojNedelja: 3 Ostatak: 0 UkupanBrojDanaOdmora: 21 01/10/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 20 BrojNedelja: 4 Ostatak: 0 UkupanBrojDanaOdmora: 28 08/10/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 23 BrojNedelja: 4 Ostatak: 3 UkupanBrojDanaOdmora: 31 11/10/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 26 BrojNedelja: 5 Ostatak: 1 UkupanBrojDanaOdmora: 36 16/10/2018
PocetakOdmora:10/09/2018 BrojDanaOdmora: 30 BrojNedelja: 6 Ostatak: 0 UkupanBrojDanaOdmora: 42 22/10/2018
[ Miki2013 @ 12.09.2018. 14:55 ] @
Uzeo sam tvoj zadnji gotov primjer i u njemu su bile anomalije koje su se pojavljivale sa danima 11, 21 je radilo ok a sve preko 30 je bilo (-1) dan.
Sada nema tih anomalija ali i dalje je prisutan "problem" prvi radni dan umjesto zadnji dan g/o kako bi trebalo.
Ako ovo uspijes rijesiti kralj si :)
P.S. Radni dani su: ponedjeljak - petak (subota, nedjelja i praznici se NE računaju u rješenju).
Primjer: Ako se praznik nađe "na putu" ignoriše se kao da i nije već se interno samo produzi odmor koliko je trajao praznik. Znači ne opterećuj se praznicima.
Isteklo mi radno vrijeme i moram napustiti kancelariju pa ću sutra testirati ako budes nesto napravio.
Hvala mnogo.
[ bokinet @ 12.09.2018. 16:24 ] @
U pauzi za kafu sam uspeo da poradim nesto. Treba proveriti i testirati.
Promenio sam naziv f-je pa se tako f-ja zove ObracunajKrajOdmora()
Ulazne vrednosti su:
1. datum pocetka odmora (String / Date)
2. broj radnih dana odmora (Integer)
3. da li se vraca datum kraja odmora ili datum pocetka rada (Boolean)
Tackom 3. imate reseno i jednu i drugu varijantu ja se nadam... koliko mi vreme dozvoljavalo da to brzo ispovezujem.
U nastavku deo koda tj. f-ja kao i test rezultati kada za ulaznu vrednost br. 3 stavljeno 3.1. da se vraca datum pocetka rada i 3.2. da se vraca datum kraja odmora.
U prilogu treba da je i MS Access verzija - posto uvek zaboravim da prilozim...
Dodato na vasu form-u u MS Access, checkbox kontrola koja predstavlja vrednost za tacku 3. i cija se vrednost koristi kao 3. ulazni parametar f-je. Podrazumevana vrednost (default value) za checkbox kontrolu je postavljena na 1.
Ubaceno je jedno test dugme koje poziva f-ja, test radi zbog checkbox vrednosti i provere na formi za unete vrednosti.
Kod f-je:
Code:
Function ObracunajKrajOdmora(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer, Optional ByVal VratiPrviRadniDan As Boolean = True) As String
Dim BrojRadnihDanaUNedelji As Integer
Dim BrojNedelja As Integer
Dim UkupanBrojDanaOdmora As Integer
Dim Ostatak As Integer
Dim r As String
' Broj radnih dana u nedelji Pon - Pet - 5
BrojRadnihDanaUNedelji = 5
UkupanBrojDanaOdmora = BrojDanaOdmora
If BrojDanaOdmora > BrojRadnihDanaUNedelji Then
UkupanBrojDanaOdmora = 0
' Broj nedelja
BrojNedelja = BrojDanaOdmora \ BrojRadnihDanaUNedelji
Ostatak = BrojDanaOdmora Mod BrojRadnihDanaUNedelji
If VratiPrviRadniDan = False Then Ostatak = Ostatak - 1
' Ukupan broj
UkupanBrojDanaOdmora = (BrojNedelja * 7) + Ostatak
Else
If VratiPrviRadniDan = False Then UkupanBrojDanaOdmora = UkupanBrojDanaOdmora - 1
End If
r = CDate(PocetakOdmora) + UkupanBrojDanaOdmora
If VratiPrviRadniDan = True Then
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", r, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
' Ako je subota
If nDan = 6 Then r = DateAdd("d", 2, r)
' Ako je nedelja
If nDan = 7 Then r = DateAdd("d", 1, r)
End If
End If
Debug.Print "PocetakOdmora: "; PocetakOdmora, "BrojDanaOdmora: "; BrojDanaOdmora, "BrojNedelja: "; BrojNedelja, "Ostatak: "; Ostatak, "UkupanBrojDanaOdmora: "; UkupanBrojDanaOdmora, r, IIf(VratiPrviRadniDan, "Prvi radni dan", "Kraj odmora")
' Povratna vrednost
ObracunajKrajOdmora = r
End Function
Povratne vrednost f-je
Code:
3.1. DATUM POCETKA RADA NAKON ODMORA - PRVI RADNI DAN
----------------------------------------------------------------------------
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 1 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 1 11/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 2 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 2 12/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 3 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 3 13/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 4 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 4 14/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 5 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 5 17/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 6 BrojNedelja: 1 Ostatak: 1 UkupanBrojDanaOdmora: 8 18/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 7 BrojNedelja: 1 Ostatak: 2 UkupanBrojDanaOdmora: 9 19/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 9 BrojNedelja: 1 Ostatak: 4 UkupanBrojDanaOdmora: 11 21/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 10 BrojNedelja: 2 Ostatak: 0 UkupanBrojDanaOdmora: 14 24/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 11 BrojNedelja: 2 Ostatak: 1 UkupanBrojDanaOdmora: 15 25/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 12 BrojNedelja: 2 Ostatak: 2 UkupanBrojDanaOdmora: 16 26/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 13 BrojNedelja: 2 Ostatak: 3 UkupanBrojDanaOdmora: 17 27/09/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 15 BrojNedelja: 3 Ostatak: 0 UkupanBrojDanaOdmora: 21 01/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 20 BrojNedelja: 4 Ostatak: 0 UkupanBrojDanaOdmora: 28 08/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 21 BrojNedelja: 4 Ostatak: 1 UkupanBrojDanaOdmora: 29 09/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 23 BrojNedelja: 4 Ostatak: 3 UkupanBrojDanaOdmora: 31 11/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 26 BrojNedelja: 5 Ostatak: 1 UkupanBrojDanaOdmora: 36 16/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 30 BrojNedelja: 6 Ostatak: 0 UkupanBrojDanaOdmora: 42 22/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 31 BrojNedelja: 6 Ostatak: 1 UkupanBrojDanaOdmora: 43 23/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 34 BrojNedelja: 6 Ostatak: 4 UkupanBrojDanaOdmora: 46 26/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 35 BrojNedelja: 7 Ostatak: 0 UkupanBrojDanaOdmora: 49 29/10/2018 Prvi radni dan
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 36 BrojNedelja: 7 Ostatak: 1 UkupanBrojDanaOdmora: 50 30/10/2018 Prvi radni dan
3.2. DATUM KRAJA ODMORA
----------------------------------------------------------------------------
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 1 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 0 10/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 2 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 1 11/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 3 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 2 12/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 4 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 3 13/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 5 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 4 14/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 6 BrojNedelja: 1 Ostatak: 0 UkupanBrojDanaOdmora: 7 17/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 7 BrojNedelja: 1 Ostatak: 1 UkupanBrojDanaOdmora: 8 18/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 9 BrojNedelja: 1 Ostatak: 3 UkupanBrojDanaOdmora: 10 20/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 10 BrojNedelja: 2 Ostatak: -1 UkupanBrojDanaOdmora: 13 23/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 11 BrojNedelja: 2 Ostatak: 0 UkupanBrojDanaOdmora: 14 24/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 12 BrojNedelja: 2 Ostatak: 1 UkupanBrojDanaOdmora: 15 25/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 13 BrojNedelja: 2 Ostatak: 2 UkupanBrojDanaOdmora: 16 26/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 15 BrojNedelja: 3 Ostatak: -1 UkupanBrojDanaOdmora: 20 30/09/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 20 BrojNedelja: 4 Ostatak: -1 UkupanBrojDanaOdmora: 27 07/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 21 BrojNedelja: 4 Ostatak: 0 UkupanBrojDanaOdmora: 28 08/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 23 BrojNedelja: 4 Ostatak: 2 UkupanBrojDanaOdmora: 30 10/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 26 BrojNedelja: 5 Ostatak: 0 UkupanBrojDanaOdmora: 35 15/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 30 BrojNedelja: 6 Ostatak: -1 UkupanBrojDanaOdmora: 41 21/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 31 BrojNedelja: 6 Ostatak: 0 UkupanBrojDanaOdmora: 42 22/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 34 BrojNedelja: 6 Ostatak: 3 UkupanBrojDanaOdmora: 45 25/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 35 BrojNedelja: 7 Ostatak: -1 UkupanBrojDanaOdmora: 48 28/10/2018 Kraj odmora
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 36 BrojNedelja: 7 Ostatak: 0 UkupanBrojDanaOdmora: 49 29/10/2018 Kraj odmora
[Ovu poruku je menjao bokinet dana 12.09.2018. u 17:48 GMT+1]
[ Miki2013 @ 13.09.2018. 08:11 ] @
@bokinet zaista sam vam zahvalan na trudu i želji da mi pomognete.
Testirao sam vaš primjer i vidio da još uvijek ne radi kako treba.
Naime, ukoliko je checkbox aktivan tada daje izlaznu vrijednost - prvi radni dan nakon odmora kao i ranije a ukoliko nije aktivan onda vraća dan unazad i kao kraj godišnjeg odmora daje nedjelju što ni u kojem slučaju nije prihvatljivo u izradi rješenja za g/o.
checkbox.value = -1 (10 dana odmora, start 10.09.2018 = 24.09.2018 - početak rada)
checkbox.value = 0 (10 dana odmora, start 10.09.2018 = 23.09.2018 - nedjelja)
Znači, ukoliko je moguće samo dobiti zadnji dan g/o a da nije vikend. Sve ostalo mi je nepotrebno.
Ako baš treba taj "početak rada" dodat ću još jedno polje "početak rada" koje neću koristiti, samo da kraj g/o daje ispravan rezultat.
P.S. Ako te kad put nanese u Sarajevo, namirit ću ti sve propuštene pauze za kafu ;)
[ bokinet @ 13.09.2018. 08:44 ] @
@miki2013
F-ja pozdrava i jednu i drugu varijantu. Po potrebi se poziva varijanta koja se hoce.
U MS Access je dato samo kako se koristi (oba primera).
Checkbox i ostalo sto sam dodao bi trebalo da se ukloni.
Pitanje: Ako je kraj g/o vikend, da li rezultat treba da bude (dan pre) petak ili (dan posle) ponedeljak?
[ bokinet @ 13.09.2018. 09:56 ] @
Uz kafu, odradjena podrska za sve 3 varijante, pre i posle vikend dana, i kada se zavrsava odmor.
Dodata je dodatna ulazna vrednost u f-ji koja odredjuje gore navedeno.
Ima smisla samo kada je ulazna vrednost za 'VratiPrviRadniDan' = False
Vrednosti za trecu promenljivu u f-ji 'KrajOdmoraDaniVikenda'
' 0 - pre vikenda
' 1 - posle vikenda
' 2 - tacan dan
Evo preradjene f-je i rezultati u nastavku.
U prilogu je MS Access file.
Sto se tice MS Access treba privesti nameni i potrebi.
Code:
Public Function ObracunajKrajOdmora(ByVal PocetakOdmora As String, ByVal BrojDanaOdmora As Integer, Optional ByVal VratiPrviRadniDan As Boolean = False, Optional ByVal KrajOdmoraDaniVikenda As Integer = 0) As String
' KrajOdmoraDaniVikenda
' 0 - pre vikenda
' 1 - posle vikenda
' 2 - tacan dan
Dim BrojRadnihDanaUNedelji As Integer
Dim BrojNedelja As Integer
Dim UkupanBrojDanaOdmora As Integer
Dim Ostatak As Integer
Dim r As String
' Broj radnih dana u nedelji Pon - Pet - 5
BrojRadnihDanaUNedelji = 5
UkupanBrojDanaOdmora = BrojDanaOdmora
If BrojDanaOdmora > BrojRadnihDanaUNedelji Then
UkupanBrojDanaOdmora = 0
' Broj nedelja
BrojNedelja = BrojDanaOdmora \ BrojRadnihDanaUNedelji
Ostatak = BrojDanaOdmora Mod BrojRadnihDanaUNedelji
If VratiPrviRadniDan = False Then Ostatak = Ostatak - 1
' Ukupan broj
UkupanBrojDanaOdmora = (BrojNedelja * 7) + Ostatak
Else
If VratiPrviRadniDan = False Then UkupanBrojDanaOdmora = UkupanBrojDanaOdmora - 1
End If
r = CDate(PocetakOdmora) + UkupanBrojDanaOdmora
' Koji je dan u nedelji kao integer vrednost
nDan = CInt(DatePart("w", r, vbUseSystemDayOfWeek, vbUseSystem))
If VratiPrviRadniDan = True Then
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
' Ako je subota - dodaj 2 dana
If nDan = 6 Then r = DateAdd("d", 2, r)
' Ako je nedelja - dodaj 1 dan
If nDan = 7 Then r = DateAdd("d", 1, r)
End If
Else
' Ako je dan vikend (subota ili nedelja) onda
If nDan > 5 Then
' Ako je rezim rada pre vikenda da bude datum onda
If KrajOdmoraDaniVikenda = 0 Then
' Ako je subota - oduzmi 1 dan
If nDan = 6 Then r = DateAdd("d", -1, r)
' Ako je nedelja - oduzmi 2 dana
If nDan = 7 Then r = DateAdd("d", -2, r)
' Ako je rezim rada posle vikenda da bude datum onda
ElseIf KrajOdmoraDaniVikenda = 1 Then
' Ako je subota - dodaj 2 dana
If nDan = 6 Then r = DateAdd("d", 2, r)
' Ako je nedelja - dodaj 1 dan
If nDan = 7 Then r = DateAdd("d", 1, r)
End If
End If
End If
Debug.Print "PocetakOdmora: "; PocetakOdmora, "BrojDanaOdmora: "; BrojDanaOdmora, "BrojNedelja: "; BrojNedelja, "Ostatak: "; Ostatak, "UkupanBrojDanaOdmora: "; UkupanBrojDanaOdmora, r, Format(r, "dddd"), IIf(VratiPrviRadniDan, "Prvi radni dan", "Kraj odmora"), IIf(KrajOdmoraDaniVikenda = 0, "Pre vikenda", IIf(KrajOdmoraDaniVikenda = 1, "Posle vikenda", "Tacan datum"))
' Povratna vrednost
ObracunajKrajOdmora = r
End Function
Code:
3.2. DATUM KRAJA ODMORA --- KrajOdmoraDaniVikenda = 0
----------------------------------------------------------------------------
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 1 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 0 10/09/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 2 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 1 11/09/2018 Tuesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 3 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 2 12/09/2018 Wednesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 4 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 3 13/09/2018 Thursday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 5 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 4 14/09/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 6 BrojNedelja: 1 Ostatak: 0 UkupanBrojDanaOdmora: 7 17/09/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 7 BrojNedelja: 1 Ostatak: 1 UkupanBrojDanaOdmora: 8 18/09/2018 Tuesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 8 BrojNedelja: 1 Ostatak: 2 UkupanBrojDanaOdmora: 9 19/09/2018 Wednesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 9 BrojNedelja: 1 Ostatak: 3 UkupanBrojDanaOdmora: 10 20/09/2018 Thursday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 10 BrojNedelja: 2 Ostatak: -1 UkupanBrojDanaOdmora: 13 21/09/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 11 BrojNedelja: 2 Ostatak: 0 UkupanBrojDanaOdmora: 14 24/09/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 12 BrojNedelja: 2 Ostatak: 1 UkupanBrojDanaOdmora: 15 25/09/2018 Tuesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 13 BrojNedelja: 2 Ostatak: 2 UkupanBrojDanaOdmora: 16 26/09/2018 Wednesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 14 BrojNedelja: 2 Ostatak: 3 UkupanBrojDanaOdmora: 17 27/09/2018 Thursday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 15 BrojNedelja: 3 Ostatak: -1 UkupanBrojDanaOdmora: 20 28/09/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 20 BrojNedelja: 4 Ostatak: -1 UkupanBrojDanaOdmora: 27 05/10/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 21 BrojNedelja: 4 Ostatak: 0 UkupanBrojDanaOdmora: 28 08/10/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 23 BrojNedelja: 4 Ostatak: 2 UkupanBrojDanaOdmora: 30 10/10/2018 Wednesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 25 BrojNedelja: 5 Ostatak: -1 UkupanBrojDanaOdmora: 34 12/10/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 26 BrojNedelja: 5 Ostatak: 0 UkupanBrojDanaOdmora: 35 15/10/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 30 BrojNedelja: 6 Ostatak: -1 UkupanBrojDanaOdmora: 41 19/10/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 31 BrojNedelja: 6 Ostatak: 0 UkupanBrojDanaOdmora: 42 22/10/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 32 BrojNedelja: 6 Ostatak: 1 UkupanBrojDanaOdmora: 43 23/10/2018 Tuesday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 34 BrojNedelja: 6 Ostatak: 3 UkupanBrojDanaOdmora: 45 25/10/2018 Thursday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 35 BrojNedelja: 7 Ostatak: -1 UkupanBrojDanaOdmora: 48 26/10/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 36 BrojNedelja: 7 Ostatak: 0 UkupanBrojDanaOdmora: 49 29/10/2018 Monday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 60 BrojNedelja: 12 Ostatak: -1 UkupanBrojDanaOdmora: 83 30/11/2018 Friday Kraj odmora Pre vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 61 BrojNedelja: 12 Ostatak: 0 UkupanBrojDanaOdmora: 84 03/12/2018 Monday Kraj odmora Pre vikenda
3.2. DATUM KRAJA ODMORA --- KrajOdmoraDaniVikenda = 1
----------------------------------------------------------------------------
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 1 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 0 10/09/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 2 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 1 11/09/2018 Tuesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 3 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 2 12/09/2018 Wednesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 4 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 3 13/09/2018 Thursday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 5 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 4 14/09/2018 Friday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 6 BrojNedelja: 1 Ostatak: 0 UkupanBrojDanaOdmora: 7 17/09/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 7 BrojNedelja: 1 Ostatak: 1 UkupanBrojDanaOdmora: 8 18/09/2018 Tuesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 8 BrojNedelja: 1 Ostatak: 2 UkupanBrojDanaOdmora: 9 19/09/2018 Wednesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 9 BrojNedelja: 1 Ostatak: 3 UkupanBrojDanaOdmora: 10 20/09/2018 Thursday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 10 BrojNedelja: 2 Ostatak: -1 UkupanBrojDanaOdmora: 13 24/09/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 11 BrojNedelja: 2 Ostatak: 0 UkupanBrojDanaOdmora: 14 24/09/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 12 BrojNedelja: 2 Ostatak: 1 UkupanBrojDanaOdmora: 15 25/09/2018 Tuesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 13 BrojNedelja: 2 Ostatak: 2 UkupanBrojDanaOdmora: 16 26/09/2018 Wednesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 14 BrojNedelja: 2 Ostatak: 3 UkupanBrojDanaOdmora: 17 27/09/2018 Thursday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 15 BrojNedelja: 3 Ostatak: -1 UkupanBrojDanaOdmora: 20 01/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 20 BrojNedelja: 4 Ostatak: -1 UkupanBrojDanaOdmora: 27 08/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 21 BrojNedelja: 4 Ostatak: 0 UkupanBrojDanaOdmora: 28 08/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 23 BrojNedelja: 4 Ostatak: 2 UkupanBrojDanaOdmora: 30 10/10/2018 Wednesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 25 BrojNedelja: 5 Ostatak: -1 UkupanBrojDanaOdmora: 34 15/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 26 BrojNedelja: 5 Ostatak: 0 UkupanBrojDanaOdmora: 35 15/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 30 BrojNedelja: 6 Ostatak: -1 UkupanBrojDanaOdmora: 41 22/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 31 BrojNedelja: 6 Ostatak: 0 UkupanBrojDanaOdmora: 42 22/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 32 BrojNedelja: 6 Ostatak: 1 UkupanBrojDanaOdmora: 43 23/10/2018 Tuesday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 34 BrojNedelja: 6 Ostatak: 3 UkupanBrojDanaOdmora: 45 25/10/2018 Thursday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 35 BrojNedelja: 7 Ostatak: -1 UkupanBrojDanaOdmora: 48 29/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 36 BrojNedelja: 7 Ostatak: 0 UkupanBrojDanaOdmora: 49 29/10/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 60 BrojNedelja: 12 Ostatak: -1 UkupanBrojDanaOdmora: 83 03/12/2018 Monday Kraj odmora Posle vikenda
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 61 BrojNedelja: 12 Ostatak: 0 UkupanBrojDanaOdmora: 84 03/12/2018 Monday Kraj odmora Posle vikenda
3.2. DATUM KRAJA ODMORA --- KrajOdmoraDaniVikenda = 2
----------------------------------------------------------------------------
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 1 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 0 10/09/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 2 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 1 11/09/2018 Tuesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 3 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 2 12/09/2018 Wednesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 4 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 3 13/09/2018 Thursday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 5 BrojNedelja: 0 Ostatak: 0 UkupanBrojDanaOdmora: 4 14/09/2018 Friday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 6 BrojNedelja: 1 Ostatak: 0 UkupanBrojDanaOdmora: 7 17/09/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 7 BrojNedelja: 1 Ostatak: 1 UkupanBrojDanaOdmora: 8 18/09/2018 Tuesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 8 BrojNedelja: 1 Ostatak: 2 UkupanBrojDanaOdmora: 9 19/09/2018 Wednesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 9 BrojNedelja: 1 Ostatak: 3 UkupanBrojDanaOdmora: 10 20/09/2018 Thursday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 10 BrojNedelja: 2 Ostatak: -1 UkupanBrojDanaOdmora: 13 23/09/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 11 BrojNedelja: 2 Ostatak: 0 UkupanBrojDanaOdmora: 14 24/09/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 12 BrojNedelja: 2 Ostatak: 1 UkupanBrojDanaOdmora: 15 25/09/2018 Tuesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 13 BrojNedelja: 2 Ostatak: 2 UkupanBrojDanaOdmora: 16 26/09/2018 Wednesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 14 BrojNedelja: 2 Ostatak: 3 UkupanBrojDanaOdmora: 17 27/09/2018 Thursday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 15 BrojNedelja: 3 Ostatak: -1 UkupanBrojDanaOdmora: 20 30/09/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 20 BrojNedelja: 4 Ostatak: -1 UkupanBrojDanaOdmora: 27 07/10/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 21 BrojNedelja: 4 Ostatak: 0 UkupanBrojDanaOdmora: 28 08/10/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 23 BrojNedelja: 4 Ostatak: 2 UkupanBrojDanaOdmora: 30 10/10/2018 Wednesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 25 BrojNedelja: 5 Ostatak: -1 UkupanBrojDanaOdmora: 34 14/10/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 26 BrojNedelja: 5 Ostatak: 0 UkupanBrojDanaOdmora: 35 15/10/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 30 BrojNedelja: 6 Ostatak: -1 UkupanBrojDanaOdmora: 41 21/10/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 31 BrojNedelja: 6 Ostatak: 0 UkupanBrojDanaOdmora: 42 22/10/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 32 BrojNedelja: 6 Ostatak: 1 UkupanBrojDanaOdmora: 43 23/10/2018 Tuesday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 34 BrojNedelja: 6 Ostatak: 3 UkupanBrojDanaOdmora: 45 25/10/2018 Thursday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 35 BrojNedelja: 7 Ostatak: -1 UkupanBrojDanaOdmora: 48 28/10/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 36 BrojNedelja: 7 Ostatak: 0 UkupanBrojDanaOdmora: 49 29/10/2018 Monday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 60 BrojNedelja: 12 Ostatak: -1 UkupanBrojDanaOdmora: 83 02/12/2018 Sunday Kraj odmora Tacan datum
PocetakOdmora: 10/09/2018 BrojDanaOdmora: 61 BrojNedelja: 12 Ostatak: 0 UkupanBrojDanaOdmora: 84 03/12/2018 Monday Kraj odmora Tacan datum
[ Miki2013 @ 13.09.2018. 12:33 ] @
Po prvim impresijama sve radi za 10.
Ovaj checkbox i combobox sam ubacio na formu i sakrio jer mi nece trebati vise, obzirom da sam dobio ono sto sam trazio.
Sada cu se baciti na obimnije testiranje da budem spreman za iducu godinu.
Zelim da ti se od srca zahvalim na ovoj zaista velikoj pomoci. Poziv za nadoknadu vremena je i dalje vazeci. Znaci, ako te put nanese u Sarajevo castim te i ruckom i picem, samo mi se javi e-mailom preko profila i dogovorit cemo se.
Nadam se da ce ovaj primjer posluziti jos nekome ko radi istu stvar.
Hvala jos jednom i lijep pozdrav!
[ bokinet @ 13.09.2018. 15:09 ] @
Evo uradio sam brzinski jos jednu kracu varijantu sa do while petljom kao moguce resenje.
Probati i uporediti sa prethodnom varijantom.
Kad budem stigao napravicu i MS Access uzorak i priloziti.
Code:
Public Function ObracunajKrajOdmora2(ByVal DatumPocetka As String, ByVal BrojDanaOdmora As Integer, Optional ByVal KrajOdmoraDaniVikenda As Integer = 2) As String
Dim iDana As Integer
Dim iBrojac As Integer
Dim Dan As String
Dim iDan As Integer
iDana = BrojDanaOdmora
iBrojac = 0
' Prvi dan odmora
Dan = DateAdd("d", iBrojac, DatumPocetka)
' Uzmi dan u nedelji (1...7)
iDan = CInt(DatePart("w", Dan, vbUseSystemDayOfWeek, vbUseSystem))
If BrojDanaOdmora > 1 Then
Do While Not iDana = 1
' Brojac dana
iBrojac = iBrojac + 1
' Dan kada se doda broj vec izbrojanih dana
Dan = DateAdd("d", iBrojac, DatumPocetka)
' Uzmi dan u nedelji (1...7)
iDan = CInt(DatePart("w", Dan, vbUseSystemDayOfWeek, vbUseSystem))
' Ako je dan u nedelje 1...5 onda
If iDan < 6 Then iDana = iDana - 1
Loop
End If
If iDan > 5 Then
' Dan pre vikenda
If KrajOdmoraDaniVikenda = 0 Then
' Ako je subota - oduzmi 1 dan
If iDan = 6 Then Dan = DateAdd("d", -1, Dan)
' Ako je nedelja - oduzmi 2 dana
If iDan = 7 Then Dan = DateAdd("d", -2, Dan)
' Dan posle vikenda
ElseIf KrajOdmoraDaniVikenda = 1 Then
' Ako je subota - dodaj 2 dana
If iDan = 6 Then Dan = DateAdd("d", 2, Dan)
' Ako je nedelja - dodaj 1 dan
If iDan = 7 Then Dan = DateAdd("d", 1, Dan)
End If
End If
Debug.Print "DatumPocetka: "; DatumPocetka, "BrojDanaOdmora: "; BrojDanaOdmora, "Dan: "; Dan, Format(Dan, "dddd"), IIf(KrajOdmoraDaniVikenda = 0, "Pre vikenda", IIf(KrajOdmoraDaniVikenda = 1, "Posle vikenda", "Tacan datum")); KrajOdmoraDaniVikenda
' Povratna vrednost
ObracunajKrajOdmora2 = Dan
End Function
Test f-je
Code:
Sub Test2()
Dim i As Integer
Dim DatumPocetka As String
Dim BrojDanaOdmora As Variant
Dim KrajOdmoraDaniVikenda As Integer
DatumPocetka = "10/09/2018"
BrojDanaOdmora = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 21, 23, 25, 26, 30, 31, 32, 34, 35, 36, 60, 61)
KrajOdmoraDaniVikenda = 2
Debug.Print vbCrLf, vbCrLf
Debug.Print "DATUM KRAJA ODMORA"
Debug.Print String(76, "-")
For i = 0 To UBound(BrojDanaOdmora)
ObracunajKrajOdmora2 DatumPocetka, BrojDanaOdmora(i), KrajOdmoraDaniVikenda
Next
End Sub
Rezultati f-je
Code:
DATUM KRAJA ODMORA --- KrajOdmoraDaniVikenda = 2
----------------------------------------------------------------------------
DatumPocetka: 10/09/2018 BrojDanaOdmora: 1 iBrojac: 0 Dan: 10/09/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 2 iBrojac: 1 Dan: 11/09/2018 Tuesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 3 iBrojac: 2 Dan: 12/09/2018 Wednesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 4 iBrojac: 3 Dan: 13/09/2018 Thursday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 5 iBrojac: 4 Dan: 14/09/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 6 iBrojac: 7 Dan: 17/09/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 7 iBrojac: 8 Dan: 18/09/2018 Tuesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 8 iBrojac: 9 Dan: 19/09/2018 Wednesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 9 iBrojac: 10 Dan: 20/09/2018 Thursday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 10 iBrojac: 11 Dan: 21/09/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 11 iBrojac: 14 Dan: 24/09/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 12 iBrojac: 15 Dan: 25/09/2018 Tuesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 13 iBrojac: 16 Dan: 26/09/2018 Wednesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 14 iBrojac: 17 Dan: 27/09/2018 Thursday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 15 iBrojac: 18 Dan: 28/09/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 20 iBrojac: 25 Dan: 05/10/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 21 iBrojac: 28 Dan: 08/10/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 23 iBrojac: 30 Dan: 10/10/2018 Wednesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 25 iBrojac: 32 Dan: 12/10/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 26 iBrojac: 35 Dan: 15/10/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 30 iBrojac: 39 Dan: 19/10/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 31 iBrojac: 42 Dan: 22/10/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 32 iBrojac: 43 Dan: 23/10/2018 Tuesday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 34 iBrojac: 45 Dan: 25/10/2018 Thursday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 35 iBrojac: 46 Dan: 26/10/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 36 iBrojac: 49 Dan: 29/10/2018 Monday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 60 iBrojac: 81 Dan: 30/11/2018 Friday Tacan datum 2
DatumPocetka: 10/09/2018 BrojDanaOdmora: 61 iBrojac: 84 Dan: 03/12/2018 Monday Tacan datum 2
p.s. Nadam se da gore nisam nesto izostavio... anyway fresh coffeeeee edition
[ Miki2013 @ 25.09.2018. 13:13 ] @
Da ne otvaram novu temu jer se sljedeci "problem" odnosi na isti program.
Pitanje: Kako ukloniti "namjerno" ubacena prazna polja u reportu?
Pitanje je nejasno pa cu priloziti sliku i gotov primjer da bude jasnije.
Napravio sam upit koji pravi tabelu - (izvor podataka za plan)
e sad u koloni napomena treba da budu poredane stavke jedna ispod druge po osnovama.
Koristio sam u upitu chr(13) i chr(10) za prebacanje uslova u nove redove i to radi ok, medjutim
"problem" se javlja kad je neki od uslova prazan.
Ja sam to uradio amaterski sa mojim skromnim znanjem ali ako ima neko srecnije rjesenje, svakako bi dobro doslo.
EDIT: Promjena svojstva polja Can Shrink = Yes u reportu ne dolazi u obzir jer kvari izgled tabele
[Ovu poruku je menjao Miki2013 dana 25.09.2018. u 14:25 GMT+1]
[ bokinet @ 25.09.2018. 22:59 ] @
Ako sam dobro razumeo:
trenutno kako je i kako izgleda pre prepravke
Code:
- 30 radnih dana - ostvareni penzijski staž
- 2 radna dana - Lice koje ima dvoje ili više djece mlađih od 7 godina.
- 2 radna dana - Lice čije je mjesto rada udaljeno 80 km i više od mjesta stalnog boravka.
posle prepravke
Code:
- 30 radnih dana - ostvareni penzijski staž
- 2 radna dana - Lice koje ima dvoje ili više djece mlađih od 7 godina.
- 2 radna dana - Lice čije je mjesto rada udaljeno 80 km i više od mjesta stalnog boravka.
Dole evo jednog brizinskog resenja korigovanog SQL upita iz Queries dela ('test') kao i orginalnog koji je bio prisutan pre toga:
Pre:
Code:
SELECT [Prezime] & " (" & [ime_oca] & ") " & [ime] AS [Prezime, ime oca i ime], tblPodaci.GodStaza AS [Godine penzijskog staža], tblPodaci.UkupnoDana AS [Broj radnih dana g/o], [I_dio_dana] & Chr(13) & Chr(10) & [II_dio_dana] AS [Broj dana], [I_dio_od] & Chr(13) & Chr(10) & [II_dio_od] AS od, [I_dio_do] & Chr(13) & Chr(10) & [II_dio_do] AS do, [Osnov] & Chr(13) & Chr(10) & [Osnov1] & Chr(13) & Chr(10) & [Osnov2] & [Osnov3] & Chr(13) & Chr(10) & [Osnov4] & [Osnov5] & Chr(13) & Chr(10) & [Osnov6] AS Napomena INTO tblPodacizaPlan
FROM tblOsnovna INNER JOIN tblPodaci ON tblOsnovna.IndexID = tblPodaci.IndexID;
Primer koda upita posle korekcije koji daje gore navedeni rezultat #1:
Code:
SELECT [Prezime] & " (" & [ime_oca] & ") " & [ime] AS [Prezime, ime oca i ime], tblPodaci.GodStaza AS [Godine penzijskog staža], tblPodaci.UkupnoDana AS [Broj radnih dana g/o], [I_dio_dana] & Chr(13) & Chr(10) & [II_dio_dana] AS [Broj dana], [I_dio_od] & Chr(13) & Chr(10) & [II_dio_od] AS od, [I_dio_do] & Chr(13) & Chr(10) & [II_dio_do] AS do,
Replace(IIF(len(trim([Osnov]))>0,Replace(Osnov,Chr(13) & Chr(10),"") & Chr(13) & Chr(10),"") &
IIF(len(trim([Osnov1]))>0,Replace(Osnov1,Chr(13) & Chr(10),"") & Chr(13) & Chr(10),"") &
IIF(len(trim([Osnov2]))>0,Replace(Osnov2,Chr(13) & Chr(10),"") & Chr(13) & Chr(10),"") &
IIF(len(trim([Osnov3]))>0,Replace(Osnov3,Chr(13) & Chr(10),"") & Chr(13) & Chr(10),"") &
IIF(len(trim([Osnov4]))>0,Replace(Osnov4,Chr(13) & Chr(10),"") & Chr(13) & Chr(10),"") &
IIF(len(trim([Osnov5]))>0,Replace(Osnov5,Chr(13) & Chr(10),"") & Chr(13) & Chr(10),"") &
IIF(len(trim([Osnov6]))>0,Replace(Osnov6,Chr(13) & Chr(10),""),""),Chr(13) & Chr(10) & Chr(13) & Chr(10),"")
AS Napomena
FROM tblOsnovna INNER JOIN tblPodaci ON tblOsnovna.IndexID = tblPodaci.IndexID;
Ako sam nesto izmasio sorry...
[ Miki2013 @ 26.09.2018. 15:45 ] @
@bokinet... nemam riječi. Ti si genije i što je najvažnije, Veliki čovjek sa veliko V.
Hvala ti mnogo...
[ bokinet @ 26.09.2018. 21:27 ] @
Nema na cemu.
Nadam se samo da u zurbi nisam nesto izmasaio ;)
Inace, postoji isto i mogucnost da se recimo prilikom azuriranja vrednosti u bazi to podrzi i da se to isto tada precisti, kroz pozivanje f-je koja bi to radila.
Takodje isto moze da se napravi i bulk operacija (f-ja) koja bi recimo odradila sve to nad vec postojecom tabelom i poljima.
Evo espresso varijante f-je koja nesto slicno to radi kao u SQL upitu ali samo sto je kod za namene kroz aplikaciju, odnsno bulk azuriranje tabela u bazi:
Code:
Public Function DataFixCrLf(ByRef ThisContent As String) As String
Dim v() As String
Dim i As Integer
Dim r As String
r = ThisContent
On Error GoTo ErrHandler
If InStr(ThisContent, vbCrLf) > 0 Then
r = ""
v = Split(ThisContent, vbCrLf)
For i = 0 To UBound(v)
v(i) = Trim(Replace(v(i), vbCrLf, ""))
If Len(v(i)) > 0 Then r = r & v(i) & vbCrLf
Next
If Right(r, 2) = vbCrLf Then r = Left(r, Len(r) - 2)
End If
DataFixCrLf = r
r = ""
Erase v
Exit Function
ErrHandler:
' Show message
MsgBox "Doslo je do greske u radu." & vbCrLf & vbCrLf & "Error # " & Err.Number & " - " & Err.Description, vbCritical, "Error in DataFixCrLf"
End Function
Evo double espresso f-je koja to nesto kao isto radi samo nad tabelom/recordsetom gde se kao ulazne vrednosti unose naziv tabele i naziv polja koje se azurira i 'sredjuje'. Ova f-ja koristi gornju f-ju 'DataFixCrLf()' kao deo cele price.
Code:
Public Sub dbFixDataCrLf(ByVal TableName As String, ByVal FieldName As String)
On Error GoTo ErrHandler
Dim Rs As DAO.Recordset
Dim r As String
' Get data recordset
Set Rs = Access.CurrentDb.OpenRecordset(TableName)
With Rs
' If we have records then
If .RecordCount > 0 Then
Do While Not .EOF
r = DataFixCrLf("" & .Collect(FieldName))
.Edit
.Collect(FieldName) = r
.Update
Debug.Print r
' Move to next record
.MoveNext
Loop
End If
' Close recordset
.Close
End With
' Free memory resource
Set Rs = Nothing
Exit Sub
ErrHandler:
' Show message
MsgBox "Doslo je do greske u radu." & vbCrLf & vbCrLf & "Error # " & Err.Number & " - " & Err.Description, vbCritical, "Error in dbFixDataCrlf"
End Sub
Sve ovo moze da se utegne i optimizuje...
code espresso ende :)
cus
[ Zidar @ 15.10.2018. 19:27 ] @
Malo je kasno za ukljucivanje u diskusiju, ali ne zamerite starom coveku
Problemi sa datumima se veoma efikasno resavaju upotrebom Kalendar tabele. U zakacenom primeru je jedna varijanta takve tabele i primer kako se moze primeniti na problem koji se resava - kako eliminisati neradne dane iz datog vremenskog intervala.
Tabela se lako pravi u Excelu, uz primenu funkcija za manipulisanje datumima. Primetite kolone JeLiPraznik in NazivPraznika. One se mogu rucno popuniti - svaka godina ima manje od deset dana praznika, pa se u tom procesu podesi i pomeranje praznika na ponedeljak ili utorak, kada praznik padne ne vikend. Kada normalan radni dan pretvorite u praznik treba da uradite 3 stvari: 1)postavie JeLiPraznik na TRUE, 2) upisete Ime Praznika, i 3) postavite RadniDan = FALSE. Posle toga na prosto prebrojite neradne dane (RadniDan = FALSE) u datom intervalu. Za unos praznika i podesavanja ako padnu u neradni dan, Boki moze da moze se napisati bulk update program  .
Tabela Kalendar moze potpuno da eliminise potrebu za koriscenjem datumskih funkcija. Moguse je odgovoriti lako na pitanja tipa: "Sastanak ce biti svakog drugom meseca, poslednji utorak u mesecu, pocevsi of marta". Meni posebno draga opcija je [AbsolutnaSedmica] Pocevsi od 1.1.2000 sedmice se broje u rastucem redosledu. Ovo dozvoljava da radite sedmicne (weekly) izvestaje. ISOweek drugacije tretira prvu i poslednju sedmicu u godini i to pravi ponekad probleme. AbsoluteWeek resava taj problem.
[ bokinet @ 15.10.2018. 19:37 ] @
@Zidar Ja koliko se secam, to nije bilo potrebno.
Ima 2 resenja, jedan kroz ciklus (drugi ponudjeni) i drugi (prvi ponudjeni) je preko date f-ja.
Vas predlog moze da se odradi i da se napravi deo koji predvidja izuzetke kao sto su praznici, turnusi, slobodni dani nakon trecih smena i svasta nesto sto moze da bude kao uslov i sto se desava u praksi u uredjenim i (ne)uredjenim zemljama... ali to @Miki2013 nije trazio posto je i sam rekao da mu to nije bitno.
Ja trenutno nemam bas puno vremena time da se bavim tako da mogu nekom drugom prilikom da vidim da to odradim ako nekome bude trebalo i to.
Do tada sta je tu je.
Ziveli!
Svako dobro.
p.s. @Zidar -> Excel file nema u prilogu
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|