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);