Newsgroup: it.comp.appl.access
Titolo: Calcoli con le date

Ciao a tutti, ho un problema con le date ma non riesco a risolverlo da solo
Ho una maschera Commessa in cui inserisco una data di inizio lavorazione,una
quantità e l'indicazione se il lavoro viene fatto su 2 turni (lun-ven)
oppure su 3 (ciclo continuo), con una query faccio il calcolo del tempo
necessario alla produzione con i dati presenti in una tabella Articoli e lo
aggiungo alla data di inizio per ottenere la data di fine lavoro
(((([Commessa]![Quantità]/[Articoli]![N° impronte])*[Articoli]![Tempo
ciclo])/3600)/(8*[Forms]![Commessa]![N° Turni]))+[Forms]![Commessa]![Data
inizio] AS [Data fine]
a questo punto mi va bene se N° turni è 3, ma come faccio a non far contare
il Sabato e la Domenica se nella maschera inserisco N° turni = 2 ???
Il risultato della query finisce in un report, posso usare il l'evento
format del corpo per fare il calcolo della Data fine in base al n° turni
indicato nella maschera invece di usare una query ???
Ps Non è da molto che uso Access e con le date ho un pò di difficoltà, spero
che qualcuno possa aiutarmi e vi ringrazio fin d'ora.
Mauro

 wrote in message
R1o15.180135$VM3.1...@news.infostrada.it...

Nel caso in cui N°Turni é uguale a 2, con un ciclo For-Next devi sommare 1 a
DataFine per ogni sabato e domenica che ci sono tra DataInizio e DataFine,
che scritto all'intero di un codice VBA sarebbe una cosa del genere:
Dim DataCalc As Date
If Me![N°Turni] = 2 Then
For DataCalc = Me![DataInizio] To Me![DataFine]
    If WeekDay(DataCalc) >= 6 Then
        Me![DataFine] = Me![DataFine] + 1
    End If
Next DataCalc
End If
Roberto

 Me![Data fine] = Me![Data fine] + 1
forse non ho capito dove devo posizionare il tutto ;-(((
PS  Nella guida dice che il valore restituito da WeekDay per Sabato è 7 e
per Domenica è 1 quindi ho difficoltà a capire
 >     If WeekDay(DataCalc)>= 6 Then
sono "gnucco" (*) io, o così trova tutti i Venerdi e Sabato tra DataInizio e
DataFine e gli aggiunge 1 ???
Dopo aver riletto il tutto, sono sicuro di essere proprio gnucco io, spero
in un tuo chiarimento   ;-)
Ciao e grazie
(*) Gnucco = Dalle mie parti si intende duro di comprendonio !!!!

 wrote in message
TWx15.184403$VM3.1...@news.infostrada.it...

Intanto per prima cosa cominciamo a correggere il mio errore, quindi anziché
        If WeekDay(DataCalc)>= 6 Then
va scritto
        If WeekDay(DataCalc) = 1 Or WeekDay(DataCalc) = 7 Then
e scusami per l'errore commesso.
Per l'altro problema io davo per sconteto che nel report  il controllo
relativo alla data di fine lavorazione si chiamasse appunto DataFine.
Roberto

 Roberto
... e così è infatti !!!
 ma l' Origine Controllo di DataFine è il calcolo che faccio nella Query su
cui si basa il Report e non è  calcolato dal Report stesso
Ora ho messo per Origine Controllo di Data Fine
=((([Quantità]/[N° impronte])*[Tempo ciclo])/3600)/(8*[N° Turni])+[Data
inizio]
e tutto funziona ancora nel senso che il calcolo lo esegue, appena metto
sull'evento Open oppure Activate del Report il codice che mi hai scritto,
mi dà ancora errore
"è impossibile assegnare un valore all' oggetto"
......stò perdendoci la testa ed il sonno ( sono le 2 meno 20 e domani si
lavora !!!! )
Grazie ancora e ciao, Mauro

 wrote in message
YIz15.185195$VM3.1...@news.infostrada.it...

Scusami er il sonno perso, ma ho commesso un'altra castroneria; mi sono
fatto un esempio e così funziona:
1) dichiarati la proprietà "Visibile" di DataFine a NO
2) inserisci nel corpo del report una casella di testo non associata e
chiamala DataFine2
3) a fronte dell'evento "Su formattazione" del corpo del report genera il
seguente codice VBA:
Dim DataCalc As Date
Me![DataFine2] = Me![DataFine]
If Me![N°Turni] = 2 Then
For DataCalc = Me![DataInizio] To Me![DataFine2]
    If WeekDay(DataCalc) =1 Or WeekDay(DataCalc) = 7 Then
        Me![DataFine2] = Me![DataFine2] + 1
    End If
Next DataCalc
End If
Come vedi dall'ora ho perso un pò di sonno anche io, ma è la giusta
punizione che mi merito.
Aspetto ansioso un tuo OK.
Roberto

 Roberto
... per un dirigente d'azienda è diverso però  ;-))))))
Riciao Mauro

 wrote in message
RPI15.186706$VM3.1...@news.infostrada.it...

Nooooooooooooo!!!!!!!!
Funziona bene così in quanto DataFine2  oltre ad essere il risultato del
calcolo è anche la data finale del ciclo For-Next.
E poiché il ciclo For-Next va in loop sino a quando DataCalc non risulta
maggiore di DataFine2, se DataFine è uguale a 17/06/00  il calcolo si
accorge che è un sabato a aggiunge 1 a DataFine2 (che diventa 18/06/00) e
ritorna in testa al ciclo; alla prossima passata si accorge che DataFine2 è
una domenica e quindi aggiunge ancora 1 (DataFine2 diventa 19/06/00) e
ritorna in testa al ciclo; in questa passata si accorge che DataFine2 non è
né sabato né domenica quindi ritorna in testa al ciclo senza sommare nulla;
è a questo punto che DataCalc risulta maggiore di DataFine2 e quindi si esce
dal ciclo. Puta caso in DataFine2 c'è 19/06/00: e non era quello che
volevi????
Come ti ho già detto il codice VBA l'ho testato (anche se tardi!) e funziona
bene: ora provalo te.
Ho capito che ho perso la tua fiducia per i due errori commessi, ma
insomma......  :-))))
A dopo che hai provato
Roberto

 Roberto
Come vedi non ho perso la fiducia nelle tue risorse......
Cerco di darti le maggiori indicazioni possibili:
In una maschera inserisco
1) Il codice articolo ( per estrarre dalla tab Articoli i dati per i
calcoli )
2)La quantità da produrre
3)La data di inizio produzione
4)Il n° dei turni
Passo il tutto al report nel quale per origine controllo di Data fine c'è la
seguente formula:
=((([Quantità]/[N° impronte])*[Tempo ciclo])/3600)/(8*[N° Turni])+[Data
inizio]
Facciamo un esempio Quantità = 5000, N° impronte = 2, Tempo ciclo (in sec)
per produrre 2 pezzi = 40
n° turni = 2 ; quindi i giorni da sommare a Data Inizio sono 1.736111
Se data inizio è  Venerdì 16/6, in Data fine ottengo 17/6 e in Data fine2
18/6
Non riesco assolutamente a capire dove possa stare l'errore, magari è
sbagliata la formula con cui calcolo i giorni da aggiungere a Data
inizio.Boh sono nelle tue mani ;-)))
PS Nel mio primo post avevo detto che con le date avevo un pò di difficoltà,
ma non pensavo che mi avrebbero fatto sudare le classiche sette camicie
;-))))
Ciao Mauro

 Come vedi non ho perso la fiducia nelle tue risorse......
[CUT]
Non so se riuscirai a non odiarmi, ma la soluzione giusta è quella che tu
hai indicato con il messaggio del 14/06/00 delle ore 12:07 ovvero:
Dim DataCalc As Date
     Me![DataFine2] = Me![DataFine]
     If Me![N°Turni] = 2 Then
     For DataCalc = Me![DataInizio] To Me![DataFine2]
     If WeekDay(DataCalc) =7 Then
     Me![DataFine2] = Me![DataFine2] + 2
 End If
    Next DataCalc
End If
Non so che cavolo ho provato; fra l'altro ho dimostrato di essere un
presentuoso.
Scusami ancora per il sonno perso.
Roberto
PS
Come vedi a sudare le sette camicie con le data sei in buona compagnia

 Come vedi a sudare le sette camicie con le data sei in buona compagnia
....E io che credevo di aver trovato un consulente SUPERMEGAESPERTO di
Access...Puah !!!  ;-)))))
Scherzo naturalmente, senza il tuo aiuto non sarei riuscito ad arrivare alla
soluzione, per cui i ringraziamenti sono d' obbligo, grazie di cuore
Al prossimo dubbio, Mauro
PS Ho già in mente di ampliare il mio DB, e qualche domanda verrà fuori
sicuramente, magari direttemente in e-mail, se non ti scoccia.
Riciao MAURO

Caro Mauro,
mi sto appassionando al tuo problema e visto ormai che il tormentone del
ciclo For_Next sembrerebbe da archiviare (e lo sarebbe per merito tuo), mi
sono soffermato a valutare la formula che hai inserito nell'origine
controllo di DataFine, che ricordo essere:
=((([Quantità]/[N° impronte])*[Tempo ciclo])/3600)/(8*[N° Turni])+[Data
inizio]
Mi vengono da fare alcune considerazioni:
1°) Nel caso in cui ciò che sommi a DataInizio risulti essere un numero
intero (non contenga decimali come invece 1.736111 del tuo esempio),
DataFine risulterebbe avere un giorno in più, e nel caso che DataFine fosse
un sabato e N°Turni fosse uguale a 2, DataFine2 risulterebbe avere tre
giorni in più.
Secondo me si può ovviare a tale inconveniente sostituendo nel codice VBA la
riga:
    Me![DataFine2] = Me![DataFine]
con
    If Me![DataFine] = Int(Me![DataFine]) Then
        Me![DataFine2] = Me![DataFine]-1
    Else
        Me![DataFine2] = Me![DataFine]
    End If
2°) La tua formula non tiene conto in che ora di DataInizio comincia la
lavorazione e questo potrebbe far sì che DataFine risulti in difetto di un
giorno; mi spiego meglio: ipotizzando che una certa lavorazione duri
l'equivalente di 10 ore, il calcolo ti restituisce una DataFine uguale a
DataInizio; ciò è giusto nel caso che la lavorazione inizi la prima ora del
primo turno, ma se iniziasse l'ultima ora dell'ultimo turno la data di fine
lavorazione dovrebbe essere quella successiva a quella di inizio.
Se il N°Turni fosse sempre uguale a 3, la cosa si risolverebbe facilmente:
basterebbe digitare in DataInizio oltre che la data anche l'ora di inizio
lavorazione (ovvero 16/06/00 08:35 anziché solamente 16/06/00); la cosa
funzionerebbe in quanto in questo caso le ore di una giornata lavorativa
coincidono con le ore di un giorno, ovvero sono 24.
Se però il N°Turni è uguale a 2 (giornata lavorativa di 16 ore) ed il
secondo turno non termina alle ore 24:00 (ad esempio i due turni sono
articolati dalle 06:00 alle 14:00 e dalle  14:00 alle 22:00) l'inserimento
dell'orario in DataInizio non è più sufficiente a garantirti sempre un
risultato giusto (vedi il caso di una lavorazione che dura 3 ore ed inizia
alle ore 21:00).
Se non sto prendendo l'ennesima cantonata, il problema si dovrebbe risolvere
facendo in modo che (nel caso in cui N°Turni è uguale a 2 e la durata della
lavorazione è maggiore del tempo che intercorre tra l'ora di inizio
lavorazione e l'ora di fine del secondo turno) la data di fine lavorazione
venga aumentata di un giorno.
Ipotizzando che, se N°Turni è uguale a 2, la giornata lavorativa finisce
alle 22:00, e stabilito che digiti anche l'ora di inizio lavorazione, il
codice VBA dovrebbe diventare:
Dim DataCalc As Date
Dim TempoSecondi As Long
Dim TempoOreMinuti As Date
Dim DurataLav As Long
TempoOreMinuti = #22:00# - (Me![DataInizio] - Int(Me![DataInizio])
TempoSecondi = Hour(TempoOreMinuti)*3600 + Minute(TempoOreMinuti)*60
DurataLav = (Me![Quantita]/Me![N°Impronte]) * Me![TempoCiclo]
      If Me![DataFine] = Int(Me![DataFine]) Then
        Me![DataFine2] = Me![DataFine]-1
     Else
        Me![DataFine2] = Me![DataFine]
     End If
     If Me![N°Turni] = 2 Then
        If DurataLav > TempoSecondi Then
            Me![DataFine2] = Me![DataFine2] + 1
        End If
    End If
     If Me![N°Turni] = 2 Then
     For DataCalc = Me![DataInizio] To Me![DataFine2]
     If WeekDay(DataCalc) =7 Then
     Me![DataFine2] = Me![DataFine2] + 2
 End If
    Next DataCalc
End If
Valuta la validità delle mie ipotesi e provale perché io non l'ho fatto.
Ciao Roberto