Utilizzare un parametro Data per una Query in JasperServer

From RVM Wiki
Revision as of 16:50, 3 April 2009 by Gabriele.vivinetto (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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