Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    while multipli a cascata

    Ciao a tutti, io devo creare una pagina che crei una spece di bilancio dai dati presenti nei db MYSQL affitti e spese. la pagina deve quindi guardare ogni periodo di affitto e vedere se è presente nel periodo l'anno in questione. in tale caso sommarlo ai dati dell'anno in questione e guardare la riga successiva del db. quando ha finito di guardare tutte le riche del db deve rifare tutto per l'anno successivo.. il codice sotto riportato che ho provato a creare non va avanti negli anni di affitto e quindi prende solo un dato. vi prego aiutatemi! mi sta facendo impazzire sta cosa...

    Codice PHP:
    $annoi "2000"//anno di inizio dati
    $mesei "1";
    $giornoi "1";
    $annoc date('Y'); //anno corrente
    $mesec date('m');
    $giornoc date('g');

    $myquery8 "SELECT * FROM `db_affitti`  ORDER BY 'dal'";
     
    $qe8 mysql_query($myquery8);
     
    $annof $annoc 1;
    while(
    $annoi != $annof) { 

     while(
    $riga8 mysql_fetch_array($qe8)){ //non ri fa l'azione ogni anno!!
        
    list ($annoi8$mesei8$giornoi8) = explode ("-"$riga8[dal]);
        list (
    $annof8$mesef8$giornof8) = explode ("-"$riga8[al]);    
        
        if(
    $annoi8 == $annoi AND $annof8 == $annoi){  // lo fa solo per il primo dato!!
            
    while($giornoi8 != $giornof8 AND $mesei8 != $mesef8 AND $annoi8 != $annof8) { 
            
        if(
    $mesei8 == "1"){ $month "gennaio";    }
        if(
    $mesei8 == "2"){ $month "febbraio";    }
        if(
    $mesei8 == "3"){ $month "marzo";    }
        if(
    $mesei8 == "4"){ $month "aprile";    }
        if(
    $mesei8 == "5"){ $month "maggio";    }
        if(
    $mesei8 == "6"){ $month "giugno";    }
        if(
    $mesei8 == "7"){ $month "luglio";    }
        if(
    $mesei8 == "8"){ $month "agosto";    }
        if(
    $mesei8 == "9"){ $month "settembre";    }
        if(
    $mesei8 == "10"){ $month "ottobre";    }
        if(
    $mesei8 == "11"){ $month "novembre";    }
        if(
    $mesei8 == "12"){ $month "dicembre";    }
            
    $myquery9 "SELECT * FROM `db_prezzi_$month` WHERE `id` LIKE '$id' LIMIT 0, 1";
    $qe9 mysql_query($myquery9);
    $riga9 mysql_fetch_array($qe9);

    if(
    $annoi8 == $annoi){ //da aggiungere variabile mese $mesei8 == $mesei se si vuole analitico per mese!
    $affitto01 $affitto01 $riga8[prezzo_giorno];

    }

    if(
    $giornoi8 == $riga9[giorni_mese]){
        
    $giornoi8 "0";
        
    $mesei8 $mesei8 1;    
    }
        if (
    $mesei8 == "13"){
            
    $mesei8 "1";
            
    $giornoi8 "0";
            
    $annoi8 $annoi8 1;
        }
            
    $giornoi8 $giornoi8 1;

            
        }
    }     
    //fine problema da qui funziona!
     

     
    $myquery10 "SELECT * FROM `db_spese` WHERE `id_casa` LIKE '$id'  ORDER BY 'dal'";
     
    $qe10 mysql_query($myquery10);
    while(
    $riga10 mysql_fetch_array($qe10)){
        list (
    $annoi10$mesei10$giornoi10) = explode ("-"$riga10[data]);
        if(
    $annoi10 == $annoi){
            
    $spese01 $spese01 $riga10[importo];
        }
    }
    $bilancio $affitto01 $spese01;
    echo 
    "$bilancio";
    $annoi $annoi 1;

    ciao !!! :þ by neo_86

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Non ho capito esattamente che vuoi fare, ma molto probabile che si possa risolvere con le funzioni di raggruppamento di mysql senza scrivere valanghe di codice.

    prova a postare una tabellina di esempio con qualche record e ciò che vorresti ottenere.

    edit. ti faccio un esempio per calcolare i totali per ogni mese

    select sum(prezzo) as totale, extract(YEAR_MONTH from campo_data) as periodo
    from tabella group by extract(YEAR_MONTH from campo_data) order by periodo asc

  3. #3
    devo fare una tabella dove ho nella prima colonna l'anno, nella seconda l'affitto - le spese e nella terza il rendimento.
    Codice PHP:
    $bilancio $affitto01 $spese01;
    $rendi $bilancio $riga[prezzo_acq];
    $rendimento $rendi 100;
    echo
    "
      <tr>
        <td width=\"33%\">[url="
    scheda_rendimento.php?annoi=$annoi&id=$id>$annoi</a></td>
    "]<a href=scheda_rendimento.php?annoi=$annoi&id=$id>$bilancio[/url]</td>
        <td width=\"34%\"><a href=scheda_rendimento.php?annoi=
    $annoi&id=$id>$rendimento</a></td>
      </tr>"

    e i dati nel db affitti sono: id, dal, al, prezzo_giorno
    nel db spese: id, data, importo
    nel db_prezzi_[mese]: id, prezzo_consigliato, n_giorni
    dove il numero dei giorni è il numero dei giorni del mese (es. settembre = 30)

    ovviamente $annoi deve andare dal 2000 all'anno corrente e dal db affitti si deve calcolare prezzo dell'affitto non di tutto il periodo bensì solo della parte relativo all'$annoi
    quindi se ho un affitto dal 20 dicembre 2005 al 15 gennaio 2006 l'importo acquisito dall'affitto dal 20dicembre al 31 dicembre deve andarsi a sommare con tutti quelli relativi all'anno 2005 mentre l'importo acquisito dal 1 gennaio al 15 gennaio deve andare a sommarsi in quello dell'anno 2006.

    il risultato deve essere una tabella del genere:

    Anno | Rendimento | bilancio |
    2000 | 5000 | 50% |
    2001 | 4000 | 40% |
    2002 | 6000 | 60% |
    2003 | 1000 | 10% |
    2004 | 7000 | 70% |
    2005 | 200 | 2% |
    2006 | -4000 | -40% |

    ovviamente nei db ci possono essere dati di affitti dal 2000 al 2003 oppure solo di qualche giorno. nell'esempio $riga[prezzo_acq] = 10000
    ciao !!! :þ by neo_86

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Ora ho capito. E' più complicato di quanto pensassi in effetti. Se mi viene in mente qualcosa ti faccio sapere.

  5. #5
    grazie comunque per l'interessamento!
    ciao !!! :þ by neo_86

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Incuriosito dal tuo thread ci ho smanettato un pò sopra e ho trovato questo link che proponeva una soluzione interessante per il tuo problema:

    http://www.artfulsoftware.com/queries.php#16

    Ti posto anche il dump che ho utilizzato io per le mie prove. Non devi fare altro che incollarlo.
    Della tabella affitto devi solo crearti la struttura, i dati verranno inseriti dinamicamente.

    L'unica modifica che devi fare nello script è quella di mettere al posto di tabella_appoggio una tua tabella qualsiasi che contenga un numero abbastanza alto di record da coprire la massima differenza di date della tua tabella.
    (Nel senso che sei ha un record con data_inizio affitto 2004-01-01 e data fine 2006-01-01, la tua tabella d'appoggio deve avere almeno 730 record (ho fatto un calcolo approssimativo.

    codice:
    CREATE TABLE `affitti` (
      `id` int(11) NOT NULL auto_increment,
      `data_dal` date default NULL,
      `data_al` date default NULL,
      `prezzo` int(10) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (1,'2006-10-28','2006-11-10',20);
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (2,'2006-10-10','2006-10-15',15);
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (3,'2006-04-03','2006-04-28',10);
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (4,'2004-02-27','2004-03-09',5);
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (5,'2006-11-11','2006-11-19',30);
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (6,'2005-12-20','2006-01-15',4);
    insert into `affitti` (`id`,`data_dal`,`data_al`,`prezzo`) values (7,'2006-01-01','2006-01-10',8);
    
    
    CREATE TABLE `affitto` (
      `id` int(11) NOT NULL auto_increment,
      `datas` date default NULL,
      `prezzo` int(10) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Codice PHP:
    <?php

    // connessione e selezione db

    // Ogni volta elimino tutto il contenuto della tabella affitto,
    // quella che contiene il range di tutte le date coi rispettivi prezzi
    $elimina mysql_query("truncate affitto") or die(mysql_error() );

    // Dalla tabella affitti recupero tutto il contenuto più la differenza di giorni tra i due estremi
    // dell'intervallo
    $query mysql_query("select *,datediff(data_al,data_dal) as giorni from affitti") or die(mysql_error() );
    while (
    $row mysql_fetch_assoc($query) ) {
    // incremento il numero di giorni di un'unità. 
    //Per datediff (2006-01-02) - (2006-01-01) sarebbe pari a 1 ma ovviamente son due giorni di affitto.
    $giorni $row['giorni'] + 1
    $dal $row['data_dal']; // recupero data di partenza del periodo di affitto
    $prezzo $row['prezzo']; // ... e il rispettivo prezzo

    // Soluzione suggerita in questo link: [url]http://www.artfulsoftware.com/queries.php#16[/url]
    // utilizzare una tabella di appoggio che contenga un numero di record almeno pari
    // alla differenza massima tra le due date della mia tabella
    $query2 mysql_query("INSERT INTO affitto (id) 
                             SELECT NULL FROM tabella_appoggio LIMIT 
    $giorni;") or die(mysql_error() );
    $ultimo mysql_insert_id(); // ricavo l'id dell'ultimo record inserito. Mi servirà nel where successivo

    // Mi creo un record per ogni giorno compreso nell'intervallo tra le due date e a ciascun 
    // record assegno il prezzo corrispondente
    $query3 mysql_query("UPDATE affitti,affitto 
                           SET affitto.datas = '
    $dal' + interval (affitto.id - $ultimo) day,
                           affitto.prezzo = 
    $prezzo
                           where affitto.id >= 
    $ultimo") or die(mysql_error() );
    }

    // A questo punto che ho un record per ogni giorno posso usare le funzioni di raggruppamento
    // e calcolare il totale per ogni mese/anno
    $query_affitti mysql_query("select sum(prezzo) as totale, extract(YEAR_MONTH from datas) as periodo
                                    from affitto group by extract(YEAR_MONTH from datas) order by periodo asc"

                                    or die(
    mysql_error() );

    // Li stampo a video
    echo '<table>';    
    echo 
    '<thead>';
    echo 
    '<tr>';
    echo 
    '<td>Totale</td>';
    echo 
    '<td>Periodo</td>';
    echo 
    '</tr>';
    echo 
    '</thead>';
                  
    while (
    $row2 mysql_fetch_assoc($query_affitti) ){
    echo 
    '<tr>';
    echo 
    "<td>$row2[totale]</td>";
    echo 
    "<td>$row2[periodo]</td>";
    echo 
    '</tr>';
    }
    echo 
    '<table>';
    ?>
    Ovviamente se qualcuno conosce una soluzione più efficiente si faccia avanti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.