ho realizzato una piccola app, per i miei giorni lavorativi, e vorrei sapere se esiste una funzione per calcolare i giorni utili del mese, che poi utilizzo per dividere quanto guadagno per i giorni utili, cosi da avere quanto guadagno mediamente al giorno.
i giorni che mi interessano sono dal lunedi al sabato, escluso tutti i giorni rossi sul calendario, ed essendo di Roma anche il 29 giugno..
esiste una funzione che li calcola in automatico?
cosi io se guadagno 1000 euro / (giugno 25 giorni) = 40 euro giorno.
Infatti il codice della funzione Pasqua, ad esempio, incollato così com'era dava solo errori (in Excel), mentre così funziona:
B4X:
Public Function Pasqua(ByVal Anno As Integer) As Date
'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
'ossia dal 1583 in poi
Dim A%, B%, C%, P%, Q%, R%
A = Anno% Mod 19: B = Anno% / 100: C = Anno% Mod 100
P = (19 * A + B - (B / 4) - ((B - ((B + 8) / 25) + 1) / 3) + 15) Mod 30
Q = (32 + 2 * ((B Mod 4) + (C / 4)) - P - (C Mod 4)) Mod 7
R = (P + Q - 7 * ((A + 11 * P + 22 * Q) / 451) + 114)
Pasqua = DateSerial(Anno%, R / 32, (R Mod 31) + 1)
End Function
Uhm... devo trovare il bug, perché la conversione VBA -> B4A sembra riuscita ma il risultato è imperfetto:
B4X:
Public Sub Pasqua(Anno As Int) As String
'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
'ossia dal 1583 in poi
Dim DataPasqua As String
Dim A, B, C, P, Q, R As Int
A = Anno Mod 19
B = Anno / 100
C = Anno Mod 100
P = (19 * A + B - (B / 4) - ((B - ((B + 8) / 25) + 1) / 3) + 15) Mod 30
Q = (32 + 2 * ((B Mod 4) + (C / 4)) - P - (C Mod 4)) Mod 7
R = (P + Q - 7 * ((A + 11 * P + 22 * Q) / 451) + 114)
DataPasqua = DateTime.Date(DateUtils.SetDate(Anno, R / 32, (R Mod 31) + 1))
Return DataPasqua
End Sub
Per il 2018 restituisce il 30 aprile, mentre è stata il 1°
Quindi, grazie a @udg, la funzione per la Pasqua è ok (usa DateUtils):
B4X:
Public Sub CalcolaPasqua(Anno As Int) As String
Dim DataPasqua As String
Dim a, b, c, d, e, m, n As Double
Dim giorno As Double
Dim mese As Double
If (Anno <= 2099) Then
m = 24
n = 5
Else If (Anno <= 2199) Then
m = 24
n = 6
Else If (Anno <= 2299) Then
m = 25
n = 0
Else If (Anno <= 2399) Then
m = 26
n = 1
Else If (Anno <= 2499) Then
m = 25
n = 1
End If
a = Anno Mod 19
b = Anno Mod 4
c = Anno Mod 7
d = ((19 * a) + m) Mod 30
e = ((2 * b) + (4 * c) + (6 * d) + n) Mod 7
If ((d + e) < 10) Then
giorno = d + e + 22
mese = 3
Else
giorno = d + e - 9
mese = 4
End If
If (giorno = 26 And mese = 4) Then
giorno = 19
mese = 4
End If
If (giorno = 25 And mese = 4 And d = 28 And e = 6 And a > 10) Then
giorno = 18
mese = 4
End If
DataPasqua = DateTime.Date(DateUtils.SetDate(Anno, mese, giorno))
Return DataPasqua
End Sub