Newsgroup: it.comp.appl.access
Titolo: Report semplice basato su query complessa

Ciao a tutti.
Ho questo problema (lo semplifico): ho una tabella con nomeOperaio,
dataInizio e dataFine; data la differenza tra dataInizio e dataFine (che
chiamerò dataDiff) e data una tariffa giornaliera (tariffaGiorn) ho
questa specifica per il calcolo di un costo (costoFinale):
- se dataDiff <= 10 giorni costoFinale = dataDiff*tariffaGiorn
- se 10 < dataDiff <= 20 costoFinale = (10 +
(dataDiff-10)*0,8)*tariffaGiorn
- se dataDiff > 20 costoFinale = (10 + 10*0,8 + (dataDiff -
20)*0,7)*tariffaGiorn
inoltre (e qui si sfiora la paranoia), se tra dataInizio della n-sima
collaborazione e data Inizio della (n-1)-esima collaborazione sono
passati meno di 60 giorni, la collaborazione deve essere considerata
come continuativa.
Es.
tariffaGiorn = 5
1° collab. dataInizio  = 01 Gen 2002  -  dataFine = 04 Gen 2002 -->
costoFinale = 3*5=15
2° collab dataInizio = 01 Feb 2002 - dataFine = 12 Feb 2002 -->
dataDiff = 11 ma dataInizio(2) - dataInizio(1) < 60 quindi i primi 7
giorni vanno a tariffa piena e gli altri 4 all'80% --> costoFinale =
(7+4*0,8)*5 = 51
Se fossero passati + di 60 giorni il costoFinale sarebbe stato
(10+1*0,8)*5 = 54
e tutto questo in maniera "ricorsiva", cioè se ci fosse stato una
collaborazione ancora precedente alla prima con dataInizio nei 60 giorni
precedenti alla prima, il discorso si estendeva a 3 collaborazioni.
In realtà il problema sono riuscito a risolverlo, ma non riesco a creare
un report con i dati che sono riuscito a calcolare. Mi spiego meglio. Ho
scritto una procedura in VBA che esegue le query che gli sono necessarie
per fare i calcoli che deve fare, crea una linea di testo e per ogni
operaio (e per ogni mese) scrive in un file di testo la linea
corrispondente:
Luigi        7 0 0
Mario     10 2 0
Andrea    3  3 0   (quest'ultimo caso è relativo alle possibilità dette
in prec., cioè 6 giorni lavorati ma 7 giorni già fatti in un periodo
inf. a 60 giorni prima)
ecc.
Adesso mi serve trasferite tutto in un report per una stampa, quindi:
- in linea teorica è possibile creare una query (naturalmente anche
molto articolata e basata su molte sottoquery) che faccia quello che fa
il codice che ho scritto (in modo da poter basare semplicemente un
report su questa query)?
- è possibile creare un oggetto Recordset (e definirne quindi i campi),
popolarlo col codice che ho scritto (invece di scrivere nel file di
testo, scrivo nel recordset) e poi associarlo ad un report
preventivamente creato e non associato a niente (qualcosa tipo
rptCosti.Recordset = rsCreato)
Grazie a tutti
Bye
giaconet

 come continuativa.
cut
Secondo me sarebbe meglio non gestire questa situazione con una query.
Ad ogni modo, se proprio devi, ti suggerisco di scomporreil calcolo in
diversi campi della query in modo da ottenere tre campi che prendano in
considerazione i ter differenti fattori di correzione (1; 0,8 e 0,7).
Lavoro10: IIF(datadiff>10;10;datadiff)
Lavoro20: iif(datadiff>10;iif(datadiff>20;8;(datadiff-10)*0,8);0)
Lavoro30:iif((datadiff>20;(datadiff-20)*0,7;0)
Per quanto riguarda i 60 giorni non mi pare sia facilmente ottenibile con
una query perche' non puoi sapere di quanti periodi adiacenti dovresti
tenere conto, qui mi sembra molto piu' semplice ricorrere ad altri metodi
(magari controlli in fase di inserimento o riferimenti da un intervento al
successivo che ti consentano di raggrupparli in una query di raggruppamento.
Sib

"Sib" <si...@SPAMiol.it> ha scritto nel messaggio
news:Q2pE9.52179$744.1...@news1.tin.it...

Ti dico come ho risolto. Per il calcolo "normale" del costo ho fatto una
cosa simile a quella che suggerivi tu.
Per tenere in conto delle giornate lavorative precedenti mi sono
inventato un campo nuovo in ogni record "collaborazioni" che tiene in
conto di eventuali giornate precedenti (ad una distanza inferiore ai 60
gg) e l'ho incluso nel conto precedente.
Per tutti i record già inseriti ho scritto una procedura in VBA che è
andata ad aggiornare il campo, per i nuovi ho previsto un calcoletto
semplice all'atto dell'inserimento del nuovo record. E tutto è andato a
meraviglia...incredibile.
Bye
giaconet

 meraviglia...incredibile.
Mi fa piacere sia che hai risolto, sia che tra di noi ci sia stata identita'
di vedute su entrambi i problemi che manifestavi.
Sib