Utilizzare un parametro Data per una Query in JasperServer
Jump to navigation
Jump to search
Se si vuole usare un parametro data in un report JasperServer, che poi andrà utilizzato in una Query SQL, procedere come segue:
- Creare i controlli di topo "Date", che si chiameranno Data_Inizio' e 'Data_Fine'
- Creare la Query con il parametro.
- Attenzione, il valore data passato dal controllo sarà nella forma:
- Per l'ora legale (estate)
Sun Jun 01 00:00:00 CEST 2008
- Per l'ora solare (inverno)
Sun Jun 01 00:00:00 CET 2008
Soluzione 1
La soluzione definitiva è usare questa QUERY:
SELECT
anagrafica.RagioneSociale,
verbalitabella.Tot_Ore_Lavoro,
verbalitabella.Tot_Ore_Viaggio,
verbalitabella.Tot_Km,
verbalitabella.CostoOre,
verbalitabella.CostoOreV,
verbalitabella.CostoKm,
verbalitabella.`CostoOre` * verbalitabella.`Tot_Ore_lavoro`
AS Importo_Ore,
verbalitabella.`CostoOreV` * verbalitabella.`Tot_Ore_Viaggio`
AS Importo_Ore_Viaggio,
verbalitabella.`CostoKm` * verbalitabella.`Tot_Km`
AS Importo_Km ,
STR_TO_DATE(CONCAT(LEFT($P{Data_Inizio},10), RIGHT'$P{Data_Inizio},4) ) ,'%a %b %d %Y')
AS Data_Inizio ,
STR_TO_DATE(CONCAT(LEFT($P{Data_Fine},10), RIGHT'$P{Data_Fine},4) ) ,'%a %b %d %Y')
AS Data_Fine
FROM
anagrafica
INNER JOIN
verbalitabella
ON
anagrafica.IDRagioneSociale = verbalitabella.IDCliente
WHERE
fd_Data
BETWEEN
STR_TO_DATE(CONCAT(LEFT($P{Data_Inizio},10), RIGHT'$P{Data_Inizio},4) ) ,'%a %b %d %Y')
AND
STR_TO_DATE(CONCAT(LEFT($P{Data_Fine},10), RIGHT'$P{Data_Fine},4) ) ,'%a %b %d %Y')
ORDER BY anagrafica.RagioneSociale;
Soluzione 2
- È quindi necessario usare la funzione MySql STR_TO_DATE() (nessuno spazio tra il nome e la parentesi, vedi Errore MySql 1305 - FUNCTION tablename.STR_TO_DATE does not exist ) per convertirlo nel formato data Mysql.
- La query avrà quindi la forma (CHE VA AGGIORNATA AL CAMBIO DELL'ORA):
SELECT
field1, field2
FROM
table
WHERE
field_date
BETWEEN
STR_TO_DATE('$P!{Data_Inizio}', '%a %b %d %H:%i:%s CEST %Y')
AND
STR_TO_DATE('$P!{Data_Fine}' , '%a %b %d %H:%i:%s CEST %Y')
In caso di problemi, attivare il logging di MySQL per vedere la Query generata.
Soluzione 3
In questo caso, si calcola automaticamente il range del mese corrente:
SELECT anagrafica.RagioneSociale, verbalitabella.Tot_Ore_Lavoro, verbalitabella.Tot_Ore_Viaggio, verbalitabella.Tot_Km, verbalitabella.CostoOre, verbalitabella.CostoOreV, verbalitabella.CostoKm, verbalitabella.`CostoOre` * verbalitabella.`Tot_Ore_lavoro` AS Importo_Ore, verbalitabella.`CostoOreV` * verbalitabella.`Tot_Ore_Viaggio` AS Importo_Ore_Viaggio, verbalitabella.`CostoKm` * verbalitabella.`Tot_Km`AS Importo_Km FROM anagrafica INNER JOIN verbalitabella ON anagrafica.IDRagioneSociale = verbalitabella.IDCliente WHERE fd_Data BETWEEN concat(date_format(LAST_DAY(now()),'%Y-%m-'),'01') AND LAST_DAY(now()) ORDER BY anagrafica.RagioneSociale;