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

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