l'errore è nella query... controlla così:
Codice PHP:
$risultato = mysql_query($querystat) or die(mysql_error());
l'errore è nella query... controlla così:
Codice PHP:
$risultato = mysql_query($querystat) or die(mysql_error());
Ottimo miniscript! Ottimo!
Dimentico sempre di mettere i controlli.
Era una banalità.
c'era un <br> nella varibile che disturbava la query.
Adesso ho stampati i grafici mese per mese. Grande!
Rimane adesso la faccenda di come escludere dalla somma i giorni fuori intervallo.
avevo pensato di aggiungere dopo:
where YEAR(datascad) = $anno AND MONTH(datascad) = $mese
questo
and datascad >= str_to_date('$inizio', '%d/%m/%Y') and datascad <= str_to_date('$fine', '%d/%m/%Y')
Si può? Mis a di no
Grazie ancora e ciao
Ultima modifica di gianlucaweb : 25-03-2011 alle ore 20.54.17
Dovrei testarla per essere sicuro che funzioni... ma provala (ovviamente devi avere le 4 variabili: $anno_min, $mese_min, $anno_max, $mese_max):
PS: il mese fallo nella versione a 2 cifre, cioè marzo => 03Codice PHP:
$querystat = "
SELECT
SUM(importo) somma,
DATE_FORMAT(datascad,'%d/%m/%Y') giorno
FROM scadenze
WHERE
MOUNTH(datascad) BETWEEN '$mese_min' AND '$mese_max'
AND
YEAR(datascad) BETWEEN '$anno_min' AND '$anno_max'
GROUP BY giorno
ORDER BY datascad";
Aspetta con la query :
indico i mesi per produrre mese x mese tot graficiCodice PHP:
$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%d/%m/%Y') giorno FROM scadenze
where YEAR(datascad) = $anno AND MONTH(datascad) = $mese AND GROUP BY giorno ORDER BY datascad";
con la parte che vorrei aggiungere dovrebbero essere indicati i 2 giorni precisi
che esclude gli importi fuori dalle 2 date, anche se rientrano nello stesso mese come spiegato qualche post fa.
and datascad >= str_to_date('$inizio', '%d/%m/%Y') and datascad <= str_to_date('$fine', '%d/%m/%Y')
qui $inizio e $fine riportano la data con formato completo:
10/01/2011
20/03/2011
ad esempio.
Ciao e grazie
Ultima modifica di gianlucaweb : 26-03-2011 alle ore 10.24.07
sostituisci la tua query con questa:
dovrebbe funzionare regolarmente... e fare ciò che diciCodice PHP:
$querystat = "
SELECT
SUM(importo) somma,
DATE_FORMAT(datascad,'%d/%m/%Y') giorno
FROM scadenze
WHERE
datascad BETWEEN STR_TO_DATE('$inizio', '%d/%m/%Y') AND STR_TO_DATE('$fine', '%d/%m/%Y')
GROUP BY giorno
ORDER BY datascad";
-----------------
PS: ma rileggendo forse te vuoi estrarre questo...
prova anche questa...:
Codice PHP:
$querystat = "
SELECT
SUM(importo) AS somma,
YEAR(datascad) AS anno,
MONTH(datascad) AS mese
FROM scadenze
WHERE datascad
BETWEEN STR_TO_DATE( '$inizio', '%d/%m/%Y' ) AND STR_TO_DATE( '$fine', '%d/%m/%Y' )
GROUP BY anno, mese
ORDER BY anno, mese";
Ultima modifica di miniscript : 26-03-2011 alle ore 14.54.05
Trovata!!!
E' questa:
mi sembra di averla già utilizzata.Codice PHP:
...
$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%d/%m/%Y') giorno FROM scadenze
where YEAR(datascad) = $anno AND MONTH(datascad) = $mese AND datascad
BETWEEN STR_TO_DATE( '$inizio', '%d/%m/%Y' ) AND STR_TO_DATE( '$fine', '%d/%m/%Y' ) GROUP BY giorno ORDER BY datascad";
Forse prima non funzionava a causa dell'errore del <br> nella query...boh?!
Grazie
uff
mi sa che ho cantato vittoria troppo presto.
Il codice sembra inaffidabile.
Se seleziono un intervallo dal
25/01/2011
al
28/02/2011
i risultati sono giusti.
se seleziono dal
28/01/2011
al
16/02/2011
mi riporta solo il mese di gennaio
anche se ci sono operazioni prima del 16/02 nel mese di febbraio (coem risultavano della prima selezione sopra.
Non capisco quale possa essere l'errore.
Voi lo vedete?
Ultima modifica di gianlucaweb : 26-03-2011 alle ore 20.25.13
io non ci capisco cosa combini...
... se non vanno bene queste due mandami un piccolo dump della tabella...Codice PHP:
<?php
//ENTRAMBE LE QUERY ESCLUDONO I GIORNI PRECEDENTI E SUCCESSIVI ALL'INTERVALLO
// statistiche giornaliere comprese fra le due date selezionate
$querystat = "
SELECT
SUM(importo) AS somma,
DATE_FORMAT(datascad,'%d/%m/%Y') AS giorno
FROM scadenze
WHERE
datascad BETWEEN STR_TO_DATE( '$inizio', '%d/%m/%Y' ) AND STR_TO_DATE( '$fine', '%d/%m/%Y' )
GROUP BY giorno
ORDER BY datascad";
// statistiche mensili comprese fra le due date selezionate
$querystat_2 = "
SELECT
SUM(importo) AS somma,
DATE_FORMAT(datascad,'%d/%m/%Y') AS giorno,
MOUNTH(datascad) AS mese,
YEAR(datascad) AS anno
FROM scadenze
WHERE
datascad BETWEEN STR_TO_DATE( '$inizio', '%d/%m/%Y' ) AND STR_TO_DATE( '$fine', '%d/%m/%Y' )
GROUP BY mese, anno
ORDER BY mese, anno";
?>
Non ci siamo capiti.
La prima raggruppa tutti i dati in un solo grafico
la seconda query invece mi da un messaggio di errore.
con la query precedente (quella che avevo pensato fosse definitiva e giusta:
se inserisco le date:Codice PHP:
$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%d/%m/%Y') giorno FROM scadenze
where YEAR(datascad) = $anno AND MONTH(datascad) = $mese AND datascad
BETWEEN STR_TO_DATE( '$inizio', '%d/%m/%Y' ) AND STR_TO_DATE( '$fine', '%d/%m/%Y' ) GROUP BY giorno ORDER BY datascad";
dal 04/01/2011
al 31/03/2011
ottengo giustamente questi 3 grafici
se inserisco invece nei campi queste 2 date :
dal 26/01/2011
al 22/02/2011
ottengo inspiegabilmente solo questo grafico:
e il resto di febbraio (stampato correttamente nel primo)
dov'è?
E' questo che non capisco.
Grazie
Ultima modifica di gianlucaweb : 27-03-2011 alle ore 16.39.21
... posta lo script...
Non chiedermi di aggiustarti lo script perchè è scritto troooooppo incasinato...
come puoi vendere la query funziona esattamente con le date a cui ti riferivi...
http://i52.tinypic.com/rhlu2v.jpg
Ultima modifica di miniscript : 27-03-2011 alle ore 18.58.09
No No, figurati non mi interessa che mi aggiusti lo script lo so che è incasinato, ma per il momento è l'ultimo problema. A me interessa la query.
Comunque non ci siamo ancora.
E' vero che la tua query seleziona i giorni giusti ma questo già lo facevo con un' altra query precedente . Non mi serve il grafico così:
e nemmeno così (3 grafici uguali se seleziono ad esempio dal 01/01 al 31/03
I mesi devono essere separati (un grafico x mese).
Mi sa che ci vuole una query ca**uta di quelle con il doppio select ad esempio o qualcosa di simile.
Ma ne capisco poco di query mysql un pochino più articolate.
Hai qualche idea in merito?
Grazie comunque per la disponibilità.
Ciao
ps: forse ho scoperto qualcosa.
Se la prima data ha il giorno inferiore alla seconda il codice non funziona.
Cioè se inserisco
15/01/2011 come prima data
e 14/03/2011 come seconda data
mi da solo il grafico di gennaio.
Ho l'impressione che ci sia un errore qui:
Prima della query. Infatti ho fatto una prova senza il codice della query e del grafico così:Codice PHP:
...
if ($inizio < $fine) {
while ( $increData < $secondaDataSenzaGiorno ) {
$differenza++;
$increData=date ("m/Y", mktime (0,0,0,$mese+$differenza,1,$anno) );
$mesi_s= substr($increData,0,2) . "/" . substr($increData,3,4);
$mesitot[] = $mesi_s;
}
}
$i = 0;
foreach($mesitot as $valore)
{
...
e mi stampa per le date di cui sopra soloCodice PHP:
foreach($mesitot as $valore)
{
$anno = conv_date_anno ($valore);
$mese = conv_date_mese ($valore);
echo $anno."<br>".$mese."<br><br>";
}
2011
01
Accidenti!! Come lo aggiusto?
Grazie
Ultima modifica di gianlucaweb : 27-03-2011 alle ore 21.16.53
La query è esatta... è lo script incasinato che non gestisce correttamente i dati (funzioni annidate, substring su date... madò...)
devi costruirti un array tri-dimensionale di questo tipo:
$array_dati_estratti['anno']['mese']['giorno'] = importo
... e poi fare un ciclo annidato di foreach.
Posso chiederti a che scopo lo stai facendo?
Personale 20%
Per Studio-test 40%
Per sfizio 20%
A titolo gratuito a qualcuno 20%
A parte gli scherzi. Ho utilizzato le basi di un progetto precedente che è in pratica un piccolo gestionale che ho realizzato per un amico (a titolo gratuito) e nel quale questa funzionalità (la produzione di grafici) potrebbe essere implementata.
Più che altro l'ho fatto per studio visto che già qualche tempo fa mi ero trovato ad affrontare le stesse problematiche e avevo momentaneamente abbandonato il lavoro.
Questa è stata un'occasione per riaffrontare gli stessi problemi e finalmente trovarne la soluzione (anche se casereccia e terra terra...ma per il momento mi accontento; insomma basta che funzioni).
Grazie e alla prossima. Ciao
Ultima modifica di gianlucaweb : 28-03-2011 alle ore 19.13.09
ok... allora siccome non è a scopo di lucro ti faccio vedere il metodo che io seguirei...
ovviamente deve essere limato il tutto... (se ci fai caso ci sono functioni vuote):
Codice PHP:
<?php
// connessione
$connessione = mysql_connect('localhost','root','') or die (mysql_error());
$selezione_db = mysql_select_db('test', $connessione) or die (mysql_error());
// classe da posizionare in file esterno da includere
Class Gestione_Scadenze{
/*NB: ho modificato il formato delle date
in fase di estrazione e selezione
per renderlo compatibile con il data picker*/
public $datamin = NULL;
public $datamax = NULL;
/*dati estratti sotto forma di array*/
public $data_day = array(); // array tri-dimensionale $a[anno][mese][giorno] = importo
public $data_month = array(); // array bi-dimensionale $a[anno][mese] = importo
public $data_year = array(); // array mono-dimensionale $a[anno] = importo
/*dati image*/
public $image_day = array();
public $image_month = array();
public $image_year = array();
public function get_estremi_data()
{
if($this->datamin==NULL OR $this->datamax== NULL)
{
$querymese = "
SELECT
DATE_FORMAT( MAX(datascad), '%c/%d/%Y') AS data_max,
DATE_FORMAT( MIN(datascad), '%c/%d/%Y') AS data_min
FROM scadenze";
$result = mysql_query($querymese) or die(mysql_error());
$recordmese = mysql_fetch_array($result);
$this->datamin = $recordmese['data_min'];
$this->datamax = $recordmese['data_max'];
}
return array('min' => $this->datamin, 'max' => $this->datamax);
}
public function get_statistic_day($start, $end)
{
$query = "
SELECT
SUM( importo ) AS somma,
DATE_FORMAT( datascad, '%d' ) AS giorno,
MONTH( datascad ) AS mese,
YEAR( datascad ) AS anno
FROM scadenze
WHERE datascad
BETWEEN STR_TO_DATE( '".$start."', '%c/%d/%Y' ) AND STR_TO_DATE( '".$end."', '%c/%d/%Y' )
GROUP BY giorno
ORDER BY datascad";
$result = mysql_query($query) or die(mysql_error());
$this->data_day = array();
while($row = mysql_fetch_array($result))
{
$this->data_day[$row['anno']][$row['mese']][$row['giorno']] = $row['somma'];
}
return $this->data_day;
}
public function get_statistic_month($start, $end)
{
$query = "
SELECT
SUM( importo ) AS somma,
MONTH( datascad ) AS mese,
YEAR( datascad ) AS anno
FROM scadenze
WHERE datascad
BETWEEN STR_TO_DATE( '".$start."', '%c/%d/%Y' ) AND STR_TO_DATE( '".$end."', '%c/%d/%Y' )
GROUP BY anno, mese
ORDER BY anno, mese";
$result = mysql_query($query) or die(mysql_error());
$this->data_month = array();
while($row = mysql_fetch_array($result))
{
$this->data_month[$row['anno']][$row['mese']]= $row['somma'];
}
return $this->data_month;
}
public function array_date($data, $separator=' ')
{
list ($d, $m, $y) = explode ($separator, $data);
return array('day' => $d, 'month' => $m, 'year' => $y);
}
public function Number_to_TextMonth($n)
{
switch($n){
case 1: $month = 'gennaio'; break;
case 2: $month = 'febbraio'; break;
case 3: $month = 'marzo'; break;
case 4: $month = 'aprile'; break;
case 5: $month = 'maggio'; break;
case 6: $month = 'giugno'; break;
case 7: $month = 'luglio'; break;
case 8: $month = 'agosto'; break;
case 9: $month = 'settembre'; break;
case 10: $month = 'ottobre'; break;
case 11: $month = 'novembre'; break;
case 12: $month = 'dicembre'; break;
default: $month = 'parametro errato'; break;
}
return $month;
}
/**************************************************************************************/
public function create_grafics_day()
{
}
public function create_grafics_month()
{
}
public function create_grafics_year()
{
}
/**************************************************************************************/
}
$scadenze = new Gestione_Scadenze();
$scadenze->get_estremi_data();
$img_array = array();
if(isset($_POST['B1']))
{
$inizio = ( (isset($_POST['inizio'])) AND (!empty($_POST['inizio'])) ) ? $_POST['inizio'] : $scadenze->datamin;
$fine = ( (isset($_POST['fine'])) AND (!empty($_POST['fine'])) ) ? $_POST['fine'] : $scadenze->datamax;
$array_importi = $scadenze->get_statistic_day($inizio, $fine);
require_once("libchart/libchart/classes/libchart.php");
foreach($array_importi as $anno => $array_mesi) // scorriamo tutti gli anni coinvolti
{
foreach($array_mesi as $mese => $array_giorni) // per ogni anno scorriamo i mesi
{
$Grafico = new VerticalBarChart(500,250); // per ogni mese facciamo un grafico
$dati_giornalieri = new XYDataSet();
foreach($array_giorni as $giorno => $importo) // per ogni mese scorriamo i giorni
{
$dati_giornalieri->addPoint(new Point($giorno, $importo)); // per ogni giorno aggiungiamo una bar nel grafico
}
// i dati raccolti per ogni giorno li mettiamo nel grafico del mese
$Grafico->setDataSet($dati_giornalieri);
// titolo al grafico del mese
$Grafico->setTitle("Importi di ".$scadenze->Number_to_TextMonth($mese). " " .$anno);
// nome univoco della img
$nome_img = $anno.$mese.'.png';
// creaimo l'img per il mese
$Grafico->render("generated/".$nome_img);
// aggiungiamo l'immagine all'array
$img_array[] = "generated/".$nome_img;
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery UI Datepicker - Restrict date range</title>
<!-- general lib //-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
<!-- plugin //-->
<script src="http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/scripts/date.js"></script>
<script src="http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/scripts/jquery.datePicker.js"></script>
<script type="text/javascript" charset="utf-8">
$(function() {
$( "#datepicker_dal" ).datepicker({ minDate: "<?php echo $scadenze->datamin; ?>", maxDate: "<?php echo $scadenze->datamax; ?>" });
$( "#datepicker_al" ).datepicker({ minDate: "<?php echo $scadenze->datamin; ?>", maxDate: "<?php echo $scadenze->datamax; ?>" });
});
</script>
</head>
<body>
<center><h2>Scegli l'intervallo di tempo per la produzione dei grafici</h2></center>
<div class="demo">
<form name="ricercascad" id="scadric" action="" method="post">
<input type="hidden" name="task" value="ricerca">
<p>
Data dal :
<input type="text" name="inizio" id="datepicker_dal">
Data al:
<input type="text" name="fine"id="datepicker_al"></p>
<input type="submit" value="Ricerca" name="B1">
</form>
</div>
<br><br>
<?php foreach($img_array as $url) : ?>
<img src="<?php echo $url; ?>" />
<?php endforeach; ?>
</body>
</html>
Ultima modifica di miniscript : 28-03-2011 alle ore 20.40.43
Beh che dire. Davvero notevole per quanto mi riguarda anche se io delle classi ci capisco poco o niente. Sono ancora sul procedurale.
Grazie di tutto. Ciao
ps: volendo cambiare i datapicker in italiano mi sa che bisognerebbe fare qualche modifica al tuo codice
che non mi avventuro a fare :-)
Non capisco dal codice come fai a ordinare 2 grafici per riga.
Ultima modifica di gianlucaweb : 28-03-2011 alle ore 21.42.21
le immagini sono larghe 500px (come da parametro);
il tag img sono elementi inline (cioè si affiancano l'uno a l'antro http://css.flepstudio.org/css-tips/block-inline.html);
il tuo monitor ha un larghezza di almeno 1020px ma sicuramente meno di 1500px (i monitor 1920 x 1200 sono dei 16:9 da 24 pollici...)
ERGO:
le img vengono affiancate.
Ultima modifica di miniscript : 28-03-2011 alle ore 22.51.58
nella funzione get_statistic_day()
modifica la query mettendo
GROUP BY anno, mese, giorno
Potresti farlo tramite iframe, ma lo sconsiglio.Scusate un'info. Ma non c'è la possibilità di caricare una pagina in html. Ad esempio, con php si adopera require e in html ???
Potresti usare anche javascript, ma non so quanto convenga (dipende dalla situazione: se vuoi una cosa dinamica, va bene).
Altrimenti, la cosa migliore è tramite PHP.
Anche qui, dipende cosa vuoi fare...Ed inoltre come posso visualizzare la data odierna ????
Tramite PHP, ci sono varie funzioni: time(), date() (ce ne son molte: tutte quelle nella colonnina a sinistra che trovi nelle pagine che ti ho linkato).
Tramite javascript, puoi usare l'oggetto Date: anche qui consiglio tramite PHP, ma se vuoi avere una certa "dinamicità", puoi usare javascript.
In generale, ricorda che javascript non tutti possono averlo attivo/supportare.
Ciao!
Ultima modifica di alemoppo : 27-09-2011 alle ore 17.45.07
regolamento altervista_______________ regolamento forum