Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Erro VirtualAlloc Senhores, Na execução da função abaixo é apresentada a mensagem de geração do relatório, mas o consumo de memória do Apache continua a subir até gerar erro no sistema e o mesmo deslogar. Alguém faz ideia do que possa estar acontecendo? ...
AR
Erro VirtualAlloc  
Senhores,

Na execução da função abaixo é apresentada a mensagem de geração do relatório, mas o consumo de memória do Apache continua a subir até gerar erro no sistema e o mesmo deslogar. Alguém faz ideia do que possa estar acontecendo?

  1. <?php
  2. public function onGerarRelatorio$param )
  3.     {
  4.         try
  5.         {
  6.             TTransaction::open('sia'); // open a transaction
  7.             
  8.             $this->form->validate(); // validate form data
  9.             
  10.             $objects TSession::getValue('contas_receber');
  11.             
  12.             switch ($param['tipo']) {
  13.                 case 1:
  14.                     $csv '"EMPRESA DE FATURAMENTO";"MATRÍCULA";"BENEFICIÁRIO";"PARCELA";"TOTAL DE PARCELAS";"VENCIMENTO";"VALOR"'."\r\n";
  15.                     foreach ($objects as $object)
  16.                     {
  17.                         if (empty($object->aglutinador)) {
  18.                             $csv .= '"'.$object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
  19.                                 $object->empresa->nome_fantasia."\n".$object->empresa->cnpj.'";"'.
  20.                                 $object->matricula->descricao.'";"'.$object->matricula->beneficiario->name.'";"'.
  21.                                 $object->parcela.'";"'.$object->total_parcelas.'";"'.$object->dt_vencimento_real.'";"R$ '.
  22.                                 number_format(($object->valor $object->acrescimo), 2',''.').'"'."\r\n";
  23.                         }
  24.                         else {
  25.                             foreach ($object->getAglutinados() as $aglutinado)
  26.                             {
  27.                                 $csv .= '"'.$aglutinado->empresa->nome_interno."\n".$aglutinado->empresa->razao_social."\n".
  28.                                     $aglutinado->empresa->nome_fantasia."\n".$aglutinado->empresa->cnpj.'";"'.
  29.                                     $aglutinado->matricula->descricao.'";"'.$aglutinado->matricula->beneficiario->name.'";"'.
  30.                                     $aglutinado->parcela.'";"'.$aglutinado->total_parcelas.'";"'.$aglutinado->dt_vencimento_real.'";"R$ '.
  31.                                     number_format(($aglutinado->valor $aglutinado->acrescimo), 2',''.').'"'."\r\n";
  32.                             }
  33.                         }
  34.                     }
  35.                     break;
  36.                 /*
  37.                 case 2:
  38.                     $csv = '"EMPRESA DE FATURAMENTO";"VALOR"'."\r\n";
  39.                     $array_csv = array();
  40.                     $empresas = array();
  41.                     foreach ($objects as $object)
  42.                     {
  43.                         if (isset($array_csv[$object->empresa->id])) {
  44.                             $array_csv[$object->empresa->id] += $object->valor + $object->acrescimo;
  45.                         }
  46.                         else {
  47.                             $array_csv[$object->empresa->id]  = $object->valor + $object->acrescimo;
  48.                             $empresas[$object->empresa->id] = $object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
  49.                                 $object->empresa->nome_fantasia."\n".$object->empresa->cnpj;
  50.                         }
  51.                     }
  52.                     foreach ($empresas as $key => $empresa)
  53.                     {
  54.                         $csv .= '"'.$empresa.'";"'.number_format($array_csv[$key], 2, ',', '.').'"'."\r\n";
  55.                     }
  56.                     break;
  57.                 case 3:
  58.                     $csv = '"MATRÍCULA";"BENEFICIÁRIO";"VALOR"'."\r\n";
  59.                     $array_csv = array();
  60.                     $matriculas = array();
  61.                     $nomes = array();
  62.                     foreach ($objects as $object)
  63.                     {
  64.                         if (isset($array_csv[$object->matricula->id])) {
  65.                             $array_csv[$object->matricula->id] += $object->valor + $object->acrescimo;
  66.                         }
  67.                         else {
  68.                             $array_csv[$object->matricula->id]  = $object->valor + $object->acrescimo;
  69.                             $matriculas[$object->matricula->id] = $object->matricula->descricao;
  70.                             $nomes[$object->matricula->id] = $object->matricula->beneficiario->name;
  71.                         }
  72.                     }
  73.                     foreach ($matriculas as $key => $matricula)
  74.                     {
  75.                         $csv .= '"'.$matricula.'";"'.$nomes[$key].'";"'.number_format($array_csv[$key], 2, ',', '.').'"'."\r\n";
  76.                     }
  77.                     break;
  78.                 case 4:
  79.                     $array_csv = array();
  80.                     $empresas = array();
  81.                     $dates = array();
  82.                     foreach ($objects as $object)
  83.                     {
  84.                         if (isset($array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))])) {
  85.                             $array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))] += $object->valor + $object->acrescimo;
  86.                         }
  87.                         else {
  88.                             $array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))]  = $object->valor + $object->acrescimo;
  89.                             $empresas[$object->empresa->id] = $object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
  90.                                 $object->empresa->nome_fantasia."\n".$object->empresa->cnpj;
  91.                             $dates[date('Ym', strtotime($object->dt_vencimento_real))] = date('m/Y', strtotime($object->dt_vencimento_real));
  92.                         }
  93.                     }
  94.                     
  95.                     $csv = '"EMPRESA DE FATURAMENTO";"'.implode('";"', $dates).'"'."\r\n";
  96.                     
  97.                     foreach ($empresas as $key => $empresa)
  98.                     {
  99.                         $csv .= '"'.$empresa.'";';;
  100.                         foreach ($dates as $date => $date_br)
  101.                         {
  102.                             if (isset($array_csv[$key][$date])) {
  103.                                 $csv .= '"R$ '.number_format($array_csv[$key][$date], 2, ',', '.').'";';
  104.                             }
  105.                             else {
  106.                                 $csv .= '"R$ 0,00";';
  107.                             }
  108.                         }
  109.                         $csv .= "\r\n";
  110.                     }
  111.                     break;*/
  112.             }
  113.                         
  114.             TTransaction::close(); // close the transaction
  115.             
  116.             parent::closeWindow();
  117.             /*
  118.             $output = 'app/output/Contas à Receber - '.date('Y-m-d').'.csv';
  119.             file_put_contents($output, utf8_decode($csv));
  120.             parent::openFile($output);
  121.             */
  122.             new TMessage('info''Relatório gerado com sucesso!');
  123.         }
  124.         catch (Exception $e// in case of exception
  125.         {
  126.             new TMessage('error'$e->getMessage()); // shows the exception error message
  127.             $this->form->setData$this->form->getData() ); // keep form data
  128.             TTransaction::rollback(); // undo all pending operations
  129.         }
  130.     }
  131. ?>

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (1)


JP

Bom dia Alisson BRAGA DA ROCHA!

Superficialmente entendi que:
na linha 17, vc traz um array de dados, que já está alocado na sessão ativa.
No loop vc cria uma variavel csv e adicionado itens a ela,
conforme os objetos instanciados em cada iteração.

Penso que poderia ter mais outras duas abordagens como o mesmo objetivo.
1) Usando arrays para csv, empresa, matricula e parcela, para minimizar o uso de memória.
2) Gerar arquivo via uma simples( e complexa) instrução SQL.


HOJE eu uso arrays de forma sistemática, lembrando de sempre setá-los como NULL ao invés de UNSET, no final de cada processo.