Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Insert dentro de um loop - Problema Boa tarde, estou tendo problemas com insert no adianti da seguinte forma: Abro uma transação faço o primeiro INSERT entre em um WHILE aonde pesquisa outra tabela e verifico se tem um determinado registro la se tiver, crio um objeto e faço um insert na primeira tabela de novo e assim fico até nao ter nada e assim dar break no loop Até esta sendo feito só que não é gravado, o loo...
AB
Insert dentro de um loop - Problema  
Boa tarde, estou tendo problemas com insert no adianti da seguinte forma:

Abro uma transação
faço o primeiro INSERT
entre em um WHILE aonde pesquisa outra tabela e verifico se tem um determinado registro la
se tiver, crio um objeto e faço um insert na primeira tabela de novo
e assim fico até nao ter nada e assim dar break no loop

Até esta sendo feito só que não é gravado, o loop nao se quebra nunca, e se abro varias transações ele me retorna TOO MANY CONNECTIONS.

segue a função abaixo

  1. <?php
  2.     public static function onLancePresencial$param )
  3.     {
  4.         try
  5.         {
  6.             $key str_replace('.','',$param['key']);
  7.             if (strlen((trim($key)) > 0))
  8.             {
  9.                 // open a transaction with database 'leilao'
  10.                 TTransaction::open('leilao');
  11.                 
  12.                 $lance                            = new T402lance();
  13.                 $lance->codBem200     TSession::getValue('codBem200');
  14.                 $lance->codCliente300 0;
  15.                 $lance->codLeilao400   TSession::getValue('codLeilao400');
  16.                 $lance->valor402          $key;
  17.                 $lance->dtaLance402   date('Y-m-d H:i');
  18.                 $lance->store();
  19.             
  20.                 $codLeilao   TSession::getValue('codLeilao400');
  21.                 $codBem     TSession::getValue('codBem200');
  22.                 $cliente        $lance->codCliente300;
  23.                 $valor           $lance->valor402;
  24.                 $incremento  $lance->get_incremento();
  25.                 
  26.                 $continua  TRUE;
  27.                 
  28.                 while ($continua == TRUE)
  29.                 {
  30.                     $repository = new TRepository('T404lanceinteligente');
  31.                     $criteria    = new TCriteria;
  32.                     
  33.                     $criteria->add(new TFilter('codLeilao400''='$codLeilao));
  34.                     $criteria->add(new TFilter('codBem200',    '='$codBem));
  35.                     $criteria->add(new TFilter('valor404',     '>'$valor));
  36.                     $criteria->add(new TFilter('saldo404',     '>'0.00));
  37.                     $criteria->add(new TFilter('codCliente300','<>'$cliente));
  38.                     $criteria->setProperty('limit'1);
  39.             
  40.                     $total $repository->count($criteria);
  41.                     if ($total == 0)
  42.                     {   
  43.                        $continua FALSE;
  44.                        break;
  45.                     }else{
  46.                        $objetos $repository->load($criteria);
  47.                        foreach ($objetos as $objeto)
  48.                        {
  49.                            $cliente   =  $objeto->codCliente300;
  50.                            if ($objeto->saldo404 0)
  51.                            {
  52.                                $valor_lance $valor $incremento;
  53.                                
  54.                                if ($objeto->saldo404 $valor_lance)
  55.                                {
  56.                                    $objeto->saldo404 $objeto->valor404 $valor_lance;
  57.                                    $objeto->store();
  58.                                    
  59.                                    $novo_lance                = new T402lance();
  60.                                    $novo_lance->valor402      number_format($valor_lance2'.''');
  61.                                    $novo_lance->dtaLance402   date('Y-m-d H:i:s');
  62.                                    $novo_lance->codLeilao400  $codLeilao;
  63.                                    $novo_lance->codBem200     $codBem;
  64.                                    $novo_lance->codCliente300 $objeto->codCliente300;
  65.                                    $novo_lance->store();                                   
  66.                                    $valor                     $valor_lance;
  67.                                }
  68.                            }
  69.                        }
  70.                    }                         
  71.                }     
  72.                                        
  73.                 // close the transaction
  74.                 TTransaction::close();
  75.                 
  76.             }                
  77.         }
  78.         catch (Exception $e// in case of exception
  79.         {
  80.             // shows the exception error message
  81.             new TMessage('error''<b>Error</b> ' $e->getMessage());
  82.             // undo all pending operations
  83.             TTransaction::rollback();
  84.             TScript::create("$(document).ready(function() {var at_lance = window.setInterval('atualiza_lance()', 4000); });");
  85.         }
  86.     
  87.     }
  88. ?>

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (8)


AC

Boa noite Agostinho,

Se entendi bem, não precisa do while. Tu cria o repositório, cria os critérios e faz o carregamento (load). O próprio foreach vai executar a quantidade de vezes proporcional a quantidade de registros que encontrou lá na outra tabela.

Não precisa contar quantos registros foram encontrados e fazer o while usando essa quantidade.
AB

Obrigado pelo retorno Alexandre, mas a questão ali é que eu preciso fazer a leitura sempre separado, nao posso trazer todos os registros de 1 unica vez, e pelo que vi no LOG, ele ta gerando todos os scripts que preciso de insert, update, só que chega determinado momento ele entra em loop e não sai, fica preso.
LC

Vc faz um
if ($total == 0)
{
$continua = FALSE;
break;
}else{
....

acho q aqui dentro em algum momento vc tem que ter um $continua = FALSE; para sair do while
}
AB

Obrigado por me responde Leandro, mas olhando a lõgica do while ela ta correta a não ser que o total que é carregado pelo repository->count nao retorne nada, dai justificaria isso, nos testes que fiz ele sempre retorna algo, pelo menos no echo vem 0.
LC

Entendi.
Ouro detalhe, vc usa esta variável $valor para refazer o $criteria ai dentro do while, e o $valor esta dentro de um if, então pode ser q não esteja passando dentro deste if para atualizar esta variavel ai o $criteria sempre será o mesmo e ai vai fica em loop. Acho q é isso.
AB

Obrigado por responde Leandro, mas a variavel $valor deve permanecer a mesma visto que não foi efetuado um novo registro, o que difere ali seria $cliente que renova dentro do foreach e assim o criteria iria buscar um outro lançamento de outro cliente. mas agradeço de qualquer forma. obrigado.
LC

Certo.
Então o ultimo $cliente atualizado no foreach, quando volta para fazer a $criteria não esta retornando $total == 0, dai faz o foreach novamente e tbem não deve estar passando dentro dos IF para atualizar $valor, então eu acho q esta fincando sempre no ultimo. Faz sentido ?
AB

Faz sim leandro, o que me leva a crer no retorno do criteria->count que nao deve estar retornando zero