Utilizzare un parametro Data per una Query in JasperServer

From RVM Wiki
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;

Riferimenti