[RESOLVIDO]Fatal error: Uncaught Error: Call to a member function mensagem() on null

Salve pessoal!

Possuo uma aplicação que estava funcionando corretamente há meses e começou a apresentar agora a mensagem: "Fatal error: Uncaught Error: Call to a member function mensagem() on null "

Nada foi atualizado ou alterado tanto no desenvolvimento quanto na produção.
O código inteiro que está no evento OnApplicationInit é:

sc_exec_sql("truncate embaixada");


sc_exec_sql("insert into embaixada
(apol, endo, parc, clie, comi, ciax)
select apol, endo, parc, clie, sum(comi) as tcomi, ciax from embaixa group by apol, endo, parc, clie, ciax order by apol");

sc_exec_sql("update embaixada set endo = NULL where endo = '0'");
sc_exec_sql("update embaixada set endo = NULL where endo = '-000'");
sc_exec_sql("update embaixada set endo = NULL where endo = '      '");

sc_exec_sql("update embaixada set parc = (left(trim(parc), 2)) where ciax = 'TOKIO'");
sc_exec_sql("update embaixada set parc = (left(trim(parc), 2)) where ciax = 'ALLIANZ'");
sc_exec_sql("update embaixada set parc = (left(trim(parc), 2)) where ciax = 'LIBERTY'");
sc_exec_sql("update embaixada set parc = (left(trim(parc), 2)) where ciax = 'AZUL'");

$sql = "UPDATE embaixada 
        SET propo = (SELECT proposta FROM documentos 
                     WHERE embaixada.apol = documentos.apolice 
                       AND (embaixada.endo = documentos.endosso OR (embaixada.endo IS NULL AND documentos.endosso = '') OR (embaixada.endo IS NULL AND documentos.endosso IS NULL)))
        WHERE EXISTS (
            SELECT 1 FROM documentos 
            WHERE embaixada.apol = documentos.apolice 
              AND (embaixada.endo = documentos.endosso OR (embaixada.endo IS NULL AND documentos.endosso = '') OR (embaixada.endo IS NULL AND documentos.endosso IS NULL)))";

sc_exec_sql($sql);

sc_exec_sql("update embaixada set p1 = (select prod1 from documentos where embaixada.propo = documentos.proposta)");
sc_exec_sql("update embaixada set p2 = (select prod2 from documentos where embaixada.propo = documentos.proposta)");
sc_exec_sql("update embaixada set p3 = (select prod3 from documentos where embaixada.propo = documentos.proposta)");

sc_exec_sql("truncate embaixa");

Observando o código php, o ponto onde o erro acontece é:


$sql = "UPDATE embaixada 
        SET propo = (SELECT proposta FROM documentos 
                     WHERE embaixada.apol = documentos.apolice 
                       AND (embaixada.endo = documentos.endosso OR (embaixada.endo IS NULL AND documentos.endosso = '') OR (embaixada.endo IS NULL AND documentos.endosso IS NULL)))
        WHERE EXISTS (
            SELECT 1 FROM documentos 
            WHERE embaixada.apol = documentos.apolice 
              AND (embaixada.endo = documentos.endosso OR (embaixada.endo IS NULL AND documentos.endosso = '') OR (embaixada.endo IS NULL AND documentos.endosso IS NULL)))";

sc_exec_sql($sql);

Onde pode estar o erro, sabendo-se que o metodo “mensagem” aparece em outros pontos anteriores e não gera erro?

Veja o nro da linha do erro e investigue direto no fonte gerado.

Mestre, o erro acontece neste bloco:

$nm_select = "UPDATE embaixada SET propo = (SELECT proposta FROM documentos WHERE embaixada.apol = documentos.apolice AND (embaixada.endo = documentos.endosso OR (embaixada.endo IS NULL AND documentos.endosso = '') OR (embaixada.endo IS NULL AND documentos.endosso IS NULL))) WHERE EXISTS (SELECT 1 FROM documentos WHERE embaixada.apol = documentos.apolice AND (embaixada.endo = documentos.endosso OR (embaixada.endo IS NULL AND documentos.endosso = '') OR (embaixada.endo IS NULL AND documentos.endosso IS NULL)))";

      $_SESSION['scriptcase']['sc_sql_ult_comando'] = $nm_select;

      $_SESSION['scriptcase']['sc_sql_ult_conexao'] = '';

     

      $rf = $this->Db->Execute($nm_select);

      if ($rf === false) {

          // Verificar se $this->Erro não é nulo antes de chamar o método mensagem()

          if ($this->Erro !== null) {

              $this->Erro->mensagem(__FILE__, __LINE__, "banco", $this->Ini->Nm_lang['lang_errm_dber'], $this->Db->ErrorMsg());

          }

          $this->NM_rollback_db();

          if ($this->NM_ajax_flag) {

              baixaaut3_pack_ajax_response();

          }

          exit;

      }

      $rf->Close();

O erro em questão se reporta nesta linha:

$this->Erro->mensagem(__FILE__, __LINE__, "banco", $this->Ini->Nm_lang['lang_errm_dber'], $this->Db->ErrorMsg());

Sendo que o metodo mensagem é referenciado em cada linha anterior sem apresentar e executando a rotina. A partir desta linha, o erro acontece.

Como o erro é em uma função interna do SC, sugiro reportar ao suporte da ferramenta.

2 Curtidas

Resta agora esperar o pessoal do suporte.
Enviaram emails com link quebrado 3x. Tento entrar em contato e ainda não obtive retorno.
Dificil.

1 Curtida

Olá, entre em contato com neste email bugs@scriptcase.com.br
Irei verificar o problema.
No corpo do email, favor informa mais detalhes do ambiente (Versão do Scriptcase, versão do PHP, Sistema operacional), para que possamos agilizar a simulação do problema.

Aguardo seu retorno.

Email enviado com todos os detalhes solicitados e mais alguns.

Netmake, Henrique, Rafael, Marcia… eu mando emails, vcs me mandam outro dizendo que não receberam… daí marco pelo Zoho, vcs mandam convite para outro horário, mas respondem o email do que foi marcado com um link quebrado.

Pessoal, tá difícil.

Bom dia a todos.
Ontem o Henrique fez o acesso remoto e apontou que o erro acontecia na instrução sql.
E se acontece o erro no sql então o sc_exec_sql envia o tal erro. Claro que essa mensagem de erro traz muito pouco informação uma vez que a mensagem gerada pelo sql diretamente no banco de dados era “ERROR: more than one row returned by a subquery used as an expression”
Refiz a SQL para:

sc_exec_sql("UPDATE embaixada
SET propo = (
    SELECT proposta
    FROM documentos
    WHERE embaixada.apol = documentos.apolice AND (
        embaixada.endo = documentos.endosso OR
        (embaixada.endo IS NULL AND documentos.endosso = '') OR
        (embaixada.endo IS NULL AND documentos.endosso IS NULL)
    )
    LIMIT 1
)
WHERE EXISTS (
    SELECT 1
    FROM documentos
    WHERE embaixada.apol = documentos.apolice AND (
        embaixada.endo = documentos.endosso OR
        (embaixada.endo IS NULL AND documentos.endosso = '') OR
        (embaixada.endo IS NULL AND documentos.endosso IS NULL)
    )
)");

E no banco de dados rodou sem problemas, porém, no SC ainda apontava o mesmo erro.
Desativei a aplicação e criei outra com a instrução nova e a rotina executou normalmente.
Aparentemente, as duas aplicações são idênticas, tanto a nível de SC quanto em linha de comando, incluindo o número de linhas. Mas a antiga gera o erro e a nova não.
Isso é o que tinha acontecido anteriormente.
Agradeço o suporte, colocarei RESOLVIDO no sentido de agora eu saber que as mensagens geradas definitivamente nada tem de indicativo quanto ao erro em si.

Olá, pedimos desculpas pelo transtorno e demora na resposta. Ficamos felizes em conseguir ajudá-lo.