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
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
- <?php
- public static function onLancePresencial( $param )
- {
- try
- {
- $key = str_replace('.','',$param['key']);
- if (strlen((trim($key)) > 0))
- {
- // open a transaction with database 'leilao'
- TTransaction::open('leilao');
- $lance = new T402lance();
- $lance->codBem200 = TSession::getValue('codBem200');
- $lance->codCliente300 = 0;
- $lance->codLeilao400 = TSession::getValue('codLeilao400');
- $lance->valor402 = $key;
- $lance->dtaLance402 = date('Y-m-d H:i');
- $lance->store();
- $codLeilao = TSession::getValue('codLeilao400');
- $codBem = TSession::getValue('codBem200');
- $cliente = $lance->codCliente300;
- $valor = $lance->valor402;
- $incremento = $lance->get_incremento();
- $continua = TRUE;
- while ($continua == TRUE)
- {
- $repository = new TRepository('T404lanceinteligente');
- $criteria = new TCriteria;
- $criteria->add(new TFilter('codLeilao400', '=', $codLeilao));
- $criteria->add(new TFilter('codBem200', '=', $codBem));
- $criteria->add(new TFilter('valor404', '>', $valor));
- $criteria->add(new TFilter('saldo404', '>', 0.00));
- $criteria->add(new TFilter('codCliente300','<>', $cliente));
- $criteria->setProperty('limit', 1);
- $total = $repository->count($criteria);
- if ($total == 0)
- {
- $continua = FALSE;
- break;
- }else{
- $objetos = $repository->load($criteria);
- foreach ($objetos as $objeto)
- {
- $cliente = $objeto->codCliente300;
- if ($objeto->saldo404 > 0)
- {
- $valor_lance = $valor + $incremento;
- if ($objeto->saldo404 > $valor_lance)
- {
- $objeto->saldo404 = $objeto->valor404 - $valor_lance;
- $objeto->store();
- $novo_lance = new T402lance();
- $novo_lance->valor402 = number_format($valor_lance, 2, '.', '');
- $novo_lance->dtaLance402 = date('Y-m-d H:i:s');
- $novo_lance->codLeilao400 = $codLeilao;
- $novo_lance->codBem200 = $codBem;
- $novo_lance->codCliente300 = $objeto->codCliente300;
- $novo_lance->store();
- $valor = $valor_lance;
- }
- }
- }
- }
- }
- // close the transaction
- TTransaction::close();
- }
- }
- catch (Exception $e) // in case of exception
- {
- // shows the exception error message
- new TMessage('error', '<b>Error</b> ' . $e->getMessage());
- // undo all pending operations
- TTransaction::rollback();
- TScript::create("$(document).ready(function() {var at_lance = window.setInterval('atualiza_lance()', 4000); });");
- }
- }
- ?>
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.
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.
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
}
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.
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.
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.
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 ?
Faz sim leandro, o que me leva a crer no retorno do criteria->count que nao deve estar retornando zero