stored procedure

Buongiorno,

so che le stored procedure non sono supportate per ovvi motivi.

Sto utilizzando una procedura che mi estrae una tabella "pivot": chiamando questa procedura con una call viene restituito un array di array con diversi elementi, l'ultimo dei quali è di fatto una tabella in sola lettura. Ho già scritto il codice php per estrarre questi valori, quindi di fatto ho un array da visualizzare come se fosse il risultato di una query. Volendo nell'array c'è anche la query, generata dalla procedura, che serve per stampare la tabella pivot, quindi potrebbe essere sufficiente una procedura che visualizza una query (non posso fare la vista perché questa query calcolata varia di giorno in giorno, a seconda della data).

Vorrei aggiungere una pagina con il risultato di questa call: qual è la via più "lineare" per poter avere una tabella simile a quelle già esistenti? Prendo una pagina esistente e copio le classi oppure c'è una funzione a cui posso passare un array per averlo stampato in sola lettura? O magari c'è una funzione php a cui passare una query per avere il risultato in tabella?

La pagina custom per il momento contiene questo codice:

[pre]
if(!defined('custom_page_from_inclusion')) { die(); }
$_cp_sql = "CALL Pivot('dati_totali', 'stato', 'd1', 1, 'WHERE greatest(`fine_contratto`,`prolungamento`) between now() and (now() + interval 90 day)', '');";
$_cp_stmt=$conn->query($_cp_sql);
do {
$_cp_rows = $_cp_stmt->fetchAll();
if ($_cp_rows) {
print_r($_cp_rows);
}
} while ($_cp_stmt->nextRowset());
[/pre]

ed il risultato è il seguente

[pre]
Array
(
[0] => Array
(
[@stmt] => SELECT GROUP_CONCAT(CONCAT('SUM(IF(d1 = ', '"', val, '"', ', 1, 0)) AS ', '"', val, '"') SEPARATOR ",
") INTO @sums FROM ( SELECT DISTINCT d1 AS val FROM dati_totali WHERE greatest(`fine_contratto`,`prolungamento`) between now() and (now() + interval 90 day) ORDER BY 1 ) AS top
[0] => SELECT GROUP_CONCAT(CONCAT('SUM(IF(d1 = ', '"', val, '"', ', 1, 0)) AS ', '"', val, '"') SEPARATOR ",
") INTO @sums FROM ( SELECT DISTINCT d1 AS val FROM dati_totali WHERE greatest(`fine_contratto`,`prolungamento`) between now() and (now() + interval 90 day) ORDER BY 1 ) AS top
)

)
Array
(
[0] => Array
(
[@stmt2] => SELECT stato,
SUM(IF(d1 = "2019-06", 1, 0)) AS "2019-06",
SUM(IF(d1 = "2019-07", 1, 0)) AS "2019-07",
SUM(IF(d1 = "2019-08", 1, 0)) AS "2019-08",
SUM(IF(d1 = "2019-09", 1, 0)) AS "2019-09",
SUM(1) AS Total
FROM dati_totali WHERE greatest(`fine_contratto`,`prolungamento`) between now() and (now() + interval 90 day) GROUP BY stato
WITH ROLLUP

[0] => SELECT stato,
SUM(IF(d1 = "2019-06", 1, 0)) AS "2019-06",
SUM(IF(d1 = "2019-07", 1, 0)) AS "2019-07",
SUM(IF(d1 = "2019-08", 1, 0)) AS "2019-08",
SUM(IF(d1 = "2019-09", 1, 0)) AS "2019-09",
SUM(1) AS Total
FROM dati_totali WHERE greatest(`fine_contratto`,`prolungamento`) between now() and (now() + interval 90 day) GROUP BY stato
WITH ROLLUP

)

)
Array
(
[0] => Array
(
[stato] =>
[0] =>
[2019-06] => 3
[1] => 3
[2019-07] => 3
[2] => 3
[2019-08] => 3
[3] => 3
[2019-09] => 2
[4] => 2
[Total] => 11
[5] => 11
)

[1] => Array
(
[stato] => IN GESTIONE
[0] => IN GESTIONE
[2019-06] => 5
[1] => 5
[2019-07] => 17
[2] => 17
[2019-08] => 12
[3] => 12
[2019-09] => 7
[4] => 7
[Total] => 41
[5] => 41
)

[2] => Array
(
[stato] => PERSO - DEFLOTTAMENTO
[0] => PERSO - DEFLOTTAMENTO
[2019-06] => 3
[1] => 3
[2019-07] => 3
[2] => 3
[2019-08] => 1
[3] => 1
[2019-09] => 3
[4] => 3
[Total] => 10
[5] => 10
)

[3] => Array
(
[stato] =>
[0] =>
[2019-06] => 11
[1] => 11
[2019-07] => 23
[2] => 23
[2019-08] => 16
[3] => 16
[2019-09] => 12
[4] => 12
[Total] => 62
[5] => 62
)

)
[/pre]
 

eugenio

Administrator
Staff member
Buongiorno,
al momento non è disponibile un API che permetta di generare la results grid classica partendo da dai custom. Potresti utilizzare la funzione build_results_table in views/results_grid.php, probabilmente sarebbe la soluzione più "pulita" ma non credo sia così banale se non hai esperienza con il codice di DaDaBIK.

Io procederei diversamente:

soluzione 1) riesci a rigenerare ogni notte la vista con una procedura? Se non ci sono grossi cambiamenti a livello di form configurator e permessi probabilmente sarebbe la soluzione migliore


soluzione 2) guardi come è costruita la results grid (a livello di html e di stili) e la costruisci allo stesso modo (non molto "pulita" ma senz'altro veloce)

Saluti,
 
Buongiorno,

grazie Eugenio per la risposta, proverò a guardare la funzione che mi hai indicato. Purtroppo la tabella pivot va calcolata in tempo reale perché i dati cambiano a seconda delle operazioni che vengono fatte da altri operatori nelle altre tabelle, quindi non posso ricorrere a viste consolidate come suggerito.

Per il momento ho risolto scrivendo il codice "a mano" come hai suggerito: siccome c'era anche la richiesta era di poter accedere ai dati cliccando sul risultato della query pivot ho anche inserito il codice per fare una ricerca parametrica usando un form con i parametri hidden, anche in questo caso ho usato un po' di "reverse engineering" per determinare quali parametri sono necessari per avere il risultato al volo... :)

Guarderò con calma la funzione che mi hai indicato, anche a me sembra una soluzione più pulita.

Grazie ancora
Claudio
 

eugenio

Administrator
Staff member
Buonasera,
bene per la ricerca, sì esatto è necessario passare tutto in post e se guardi come è costruita la form di ricerca dovrebbe essere abbastanza chiaro come replicarla.

Sì forse ti conviene anche fare una prova con la funzione se l'approccio che hai usato non ti soddisfa; un metodo API che generi la results grid a partire da una fonte dati è nella todo list, so che in alcuni casi sarebbe molto utile, al momento però rispetto ad altre funzioni non ha una priorità molto alta quindi non ti so dire se e quando sarà realizzato.

Saluti,
 
Top