Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2018
    residenza
    Vicenza
    Messaggi
    11

    cicli while annidati da semplificare

    Salve a tutti,
    devo iterare una tabella piu e piu volte per ricercare contratti origine che nel tempo sono stati rinnovati.Ad ogni rinnovo tengo traccia del vecchio id e del nuovo.
    Ho elaborato questo codice che tiene conto di 4 annidamenti massimi... (4 perchè so che ad oggi è il valore massimo) ... ma volevo capire se secondo voi posso creare un numero di cicli dinamico in funzione del numero di potenziali rinnovi che un contratto può subire...

    secondo voi c'è un modo più corretto di quanto ho trovato ?..

    Codice PHP:
    // esecuzione della query che imposta i parametri di riferimento per tutti i contratti da aggiornare definizione del primo ciclo$sql = "SELECT [IDCONTRATTO] ,[CodiceSezUpdated],[OreSezUpdated] FROM [Sicura].[dbo].[BiriOreSezUpdated]";$params = array();$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );$stmt = sqlsrv_query( $conn, $sql , $params, $options );$row_count = sqlsrv_num_rows( $stmt );// Se l'oggetto è vuoto restituisco un erroreif( $stmt === false ) {     die( print_r( sqlsrv_errors(), true));}
    //Inizio del primo ciclowhile($obj = sqlsrv_fetch_object($stmt)) {//1 PARTE               // Setto i parametri di riferimento per le ore_int dei contratti sucessivamente trovati dagli altri cicli$contratto=$obj->IDCONTRATTO;$sezione=$obj->CodiceSezUpdated;$oreupdated=$obj->OreSezUpdated;//echo "Primo Ciclo - Contratto : ".$contratto." - Sezione : ".$sezione." - ValOreUpdatet : ".$oreupdated."\n";//2 PARTE - AVVIO IL SECONDO CICLO SU CONTRATTI RINNOVATI DAL CONTRATTO ORIGINE UPDATED$sql1 = "SELECT [IDCONTRATTO] ,[SEZIONECONTRATTO] ,[OLD_RifSezioneGemma] ,[ORE_INT], [SEZIONECONTRATTO_Prec] FROM [Sicura].[dbo].[GEM_SEZIONICONTRATTO] where [OLD_RifSezioneGemma]='".$contratto."' and [SEZIONECONTRATTO_Prec]='".$sezione."'";$stmt1 = sqlsrv_query( $conn, $sql1 , $params, $options );// Se l'oggetto è vuoto restituisco un erroreif( $stmt1 === false ) {    die( print_r( sqlsrv_errors(), true));}while($obj1 = sqlsrv_fetch_object( $stmt1)) {    $contratto1=$obj1->IDCONTRATTO;    $sezione1=$obj1->SEZIONECONTRATTO;         $oreint1=$obj1->ORE_INT;//echo "Contratto Riferimento: ".$contratto."-".$sezione." Contratto Correlato: ".$contratto1."-".$sezione1."\n";
    $sql2 "SELECT [IDCONTRATTO] ,[SEZIONECONTRATTO] ,[OLD_RifSezioneGemma] ,[ORE_INT], [SEZIONECONTRATTO_Prec] FROM [Sicura].[dbo].[GEM_SEZIONICONTRATTO] where [OLD_RifSezioneGemma]='".$contratto1."' and [SEZIONECONTRATTO_Prec]='".$sezione1."'";$stmt2 sqlsrv_query$conn$sql2 $params$options );// Se l'oggetto è vuoto restituisco un erroreif( $stmt2 === false ) {    die( print_r( sqlsrv_errors(), true));}while($obj2 = sqlsrv_fetch_object( $stmt2)) {    $contratto2=$obj2->IDCONTRATTO;    $sezione2=$obj2->SEZIONECONTRATTO;         $oreint2=$obj2->ORE_INT;//$sql3 = "SELECT [IDCONTRATTO] ,[SEZIONECONTRATTO] ,[OLD_RifSezioneGemma] ,[ORE_INT], [SEZIONECONTRATTO_Prec] FROM [Sicura].[dbo].[GEM_SEZIONICONTRATTO] where [OLD_RifSezioneGemma]='".$contratto2."' and [SEZIONECONTRATTO_Prec]='".$sezione2."'";$stmt3 = sqlsrv_query( $conn, $sql3 , $params, $options );// Se l'oggetto è vuoto restituisco un erroreif( $stmt3 === false ) {    die( print_r( sqlsrv_errors(), true));}while($obj3 = sqlsrv_fetch_object( $stmt3)) {    $contratto3=$obj3->IDCONTRATTO;    $sezione3=$obj3->SEZIONECONTRATTO;         $oreint3=$obj3->ORE_INT;$sql4 = "SELECT [IDCONTRATTO] ,[SEZIONECONTRATTO] ,[OLD_RifSezioneGemma] ,[ORE_INT], [SEZIONECONTRATTO_Prec] FROM [Sicura].[dbo].[GEM_SEZIONICONTRATTO] where [OLD_RifSezioneGemma]='".$contratto3."' and [SEZIONECONTRATTO_Prec]='".$sezione3."'";$stmt4 = sqlsrv_query( $conn, $sql4 , $params, $options );// Se l'oggetto è vuoto restituisco un erroreif( $stmt4 === false ) {    die( print_r( sqlsrv_errors(), true));}while($obj4 = sqlsrv_fetch_object( $stmt4)) {    $contratto4=$obj4->IDCONTRATTO;    $sezione4=$obj4->SEZIONECONTRATTO;    $oreint4=$obj4->ORE_INT;      echo "Contratto Riferimento: ".$contratto."-".$sezione." Contratto Correlato D: ".$contratto4."-".$sezione4."\n";//Accodo sulla Tabella di Log i valori old e quelli aggiornati                $sqlu4 = "INSERT INTO BiriOreSezUpdatedLog(IDCONTRATTOBASE, CodiceSezUpdatedBASE, OreSezUpdatedBASE, IDCONTRATTOBASETU, CodiceSezTU, OreSezBefore)                VALUES        ( ?, ?, ?, ?, ?, ? )";                $params4 = array($contratto, $sezione, $oreupdated,$contratto4,$sezione4, $oreint4);                $stmtU4 = sqlsrv_query( $conn, $sqlu4, $params4);}echo "Contratto Riferimento: ".$contratto."-".$sezione." Contratto Correlato C: ".$contratto3."-".$sezione3."\n";                $sqlu3 = "INSERT INTO BiriOreSezUpdatedLog(IDCONTRATTOBASE, CodiceSezUpdatedBASE, OreSezUpdatedBASE, IDCONTRATTOBASETU, CodiceSezTU, OreSezBefore)                VALUES        ( ?, ?, ?, ?, ?, ? )";                $params3 = array($contratto, $sezione, $oreupdated,$contratto3,$sezione3, $oreint3);                $stmtU3 = sqlsrv_query( $conn, $sqlu3, $params3);                }echo "Contratto Riferimento: ".$contratto."-".$sezione." Contratto Correlato B: ".$contratto2."-".$sezione2."\n";                $sqlu2 = "INSERT INTO BiriOreSezUpdatedLog(IDCONTRATTOBASE, CodiceSezUpdatedBASE, OreSezUpdatedBASE, IDCONTRATTOBASETU, CodiceSezTU, OreSezBefore)                VALUES        ( ?, ?, ?, ?, ?, ? )";                $params2 = array($contratto, $sezione, $oreupdated,$contratto2,$sezione2, $oreint2);                $stmtU2 = sqlsrv_query( $conn, $sqlu2, $params2);                }echo "Contratto Riferimento: ".$contratto."-".$sezione." Contratto Correlato A: ".$contratto1."-".$sezione1."\n";                $sqlu1 = "INSERT INTO BiriOreSezUpdatedLog(IDCONTRATTOBASE, CodiceSezUpdatedBASE, OreSezUpdatedBASE, IDCONTRATTOBASETU, CodiceSezTU, OreSezBefore)                VALUES        ( ?, ?, ?, ?, ?, ? )";                $params1 = array($contratto, $sezione, $oreupdated,$contratto1,$sezione1, $oreint1);                $stmtU1 = sqlsrv_query( $conn, $sqlu1, $params1);                }}// chiudo la connessione al dbsqlsrv_close($conn); 

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Col codice così postato non si capisce nulla, prima di inviare un messaggio contenente codice, visualizza sempre l'anteprima e se necessario riformattalo, così è illegibile.
    Vado quindi ad intuito: potresti prevedere un campo "modifica" nel quale salvi l'id dell'eventuale contratto che modifica quello in esame, quindi ad esempio quando crei il primo contratto, il campo sarà vuoto, se lo modifichi, salvi il contratto modificato (il suo campo "modifica" sarà vuoto) e nel precedente inserisci l'id di questo nuovo contratto.

    In questo modo puoi decidere se ripetere l'iterazione o no in base al fatto che quel campo sia compilato o meno.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2018
    residenza
    Vicenza
    Messaggi
    11
    Scusate... non avevo visto l'anteprima.... il codice è questo... non riesco ancora a capire come poter ripetere lo stesso while passando i valori ...
    domanda... i record sono circa 40.000...
    scusate l'ipotesi magari strampalata...: potrei utilizzare 2 array depositando ad ogni ciclo il valore degli id e poi utilizzare gli array per passare i valori a 2 statement per vedere il vecchio valore ed il nuovo?.....
    Scusate ma sono agli inizi e vedo ancora molto buio...

    codice:
    <?php
    
    date_default_timezone_set('Europe/Rome');
    
    // Imposto i parametri di connessione
    $serverName = "localhost";
    $connectionInfo = array(
         "Database"=>"Sicura", 
         "UID"=>"Profiler", 
         "PWD"=>"65tekra20"
        );
    
    //Effettuo la connessione al database
    $conn = sqlsrv_connect( $serverName, $connectionInfo);
    if( $conn === false ) {
         die( print_r( sqlsrv_errors(), true));
    }
    
    // esecuzione della query che imposta i parametri di riferimento per tutti i contratti da aggiornare definizione del primo ciclo
    $sql = "SELECT [IDCONTRATTO] ,[CodiceSezUpdated],[OreSezUpdated] FROM [Sicura].[dbo].[BiriOreSezUpdated]";
    $params = array();
    $options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
    $stmt = sqlsrv_query( $conn, $sql , $params, $options );
    $row_count = sqlsrv_num_rows( $stmt );
    // Se l'oggetto è vuoto restituisco un errore
    if( $stmt === false ) {
         die( print_r( sqlsrv_errors(), true));
    }
    
    //Inizio del primo ciclo, per ogni record origine ricerco i vecchi contratti
    while($obj = sqlsrv_fetch_object($stmt)) {
    //Setto i valori di contratto, sezione ed ore origine
    $contrattoorigine=$obj->IDCONTRATTO;
    $sezioneorigine=$obj->CodiceSezUpdated;
    $oreupdatedorigine=$obj->OreSezUpdated;
    
    //Inposto la prima ricerca per il primo rinnovo
    $sql1 = "SELECT [IDCONTRATTO] ,[SEZIONECONTRATTO] ,[OLD_RifSezioneGemma] ,[ORE_INT], [SEZIONECONTRATTO_Prec] 
    FROM    [Sicura].[dbo].[GEM_SEZIONICONTRATTO] 
    WHERE [IDCONTRATTO]='".$contrattoorigine."' and [SEZIONECONTRATTO]='".$sezioneorigine."'";
    $stmt1 = sqlsrv_query( $conn, $sql1 , $params, $options );
    if( $stmt1 === false ) {
        die( print_r( sqlsrv_errors(), true));
    }
    //Secondo Ciclo, ricerco il primo contratto rinnovato
    while($obj1 = sqlsrv_fetch_object($stmt1)) {
        /**Imposto i valori del primo contratto rinnovato */
        $contrattotoupdate=$obj1->IDCONTRATTO;
        $sezionetoupdate=$obj1->SEZIONECONTRATTO;
        $ore_inttoupdate=$obj1->ORE_INT;
       
    
        $sqlu = "INSERTINTO BiriOreSezUpdatedLog(IDCONTRATTOBASE, CodiceSezUpdatedBASE, OreSezUpdatedBASE, IDCONTRATTOBASETU, CodiceSezTU, OreSezBefore)
    VALUES        ( ?, ?, ?, ?, ?, ? )";
        $params4 = array($contratto, $sezione, $oreupdated,$contratto4,$sezione4, $oreint4);
        $stmtU4 = sqlsrv_query( $conn, $sqlu4, $params4);
    
    
        }
    //FIne sEcondo ciclo
    }
    sqlsrv_close($conn);
    
    
    ?>
    

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Sarebbe semplice se tu avessi un id cliente con una tabelle che conterebbe id_cliente, id_contratto.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2018
    residenza
    Vicenza
    Messaggi
    11
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Sarebbe semplice se tu avessi un id cliente con una tabelle che conterebbe id_cliente, id_contratto.

    ho anche id cliente per questo.... ma non mi spiego come potrei fare ugualmente.... il problema di ripetere il ciclo c'è ugualmente... e l'unica chiave che posso utilizzare di match è id contrattoold e idcontrattonew....((

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Ecco una tecnica che consente di fare una query senza cicli. Comunque deve esserci un numero massimo di livelli.

    codice:
    SELECT * FROM `tabella4` t1
    left join `tabella4` t2 on t1.id_precedente = t2.id
    left join `tabella4` t3 on t2.id_precedente = t3.id
    left join `tabella4` t4 on t3.id_precedente = t4.id
    left join `tabella4` t5 on t4.id_precedente = t5.id
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2018
    residenza
    Vicenza
    Messaggi
    11
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Ecco una tecnica che consente di fare una query senza cicli. Comunque deve esserci un numero massimo di livelli.

    codice:
    SELECT * FROM `tabella4` t1
    left join `tabella4` t2 on t1.id_precedente = t2.id
    left join `tabella4` t3 on t2.id_precedente = t3.id
    left join `tabella4` t4 on t3.id_precedente = t4.id
    left join `tabella4` t5 on t4.id_precedente = t5.id

    Con la query si.. ma volevo cercare di risolvere anche se non conosco il numero di join che devo fare...

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Se hai un id cliente comune a tutti i contratti di una sola persona allora dove è il problema ?
    Se hai un record per un cliente allora nessun rinnovo se ne hai più di uno allora il numero di rinnovi è (n-1).
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2018
    residenza
    Vicenza
    Messaggi
    11
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Se hai un id cliente comune a tutti i contratti di una sola persona allora dove è il problema ?
    Se hai un record per un cliente allora nessun rinnovo se ne hai più di uno allora il numero di rinnovi è (n-1).
    con il codice cliente posso solo sapere se ci sono contratti rinnovati o no in effetti... ma mi resta il problema che; se trovo più record per lo stesso cliente devo ripetere il lo stesso ciclo cambiando riferimento di contratto...
    potrei farlo con il goto?... comandato da un if se trovo un nuovo contratto per lo stesso cliente?.... non so se ho reso l'idea...

  10. #10
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Per un cliente, l’ultimo contratto sarà quello con l’id maggiore. No ?
    Quindi.
    codice:
    select max(id_contratto) from tabella where id_cliente = ....
    o se hai una data di inizio l’ultimo sarà quello con la data maggiore.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

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 © 2024 vBulletin Solutions, Inc. All rights reserved.