Erro A non-numeric value encountered versão 7.3 php

Bom dia,

Ao atualizar para o PHP 7.3 estou tendo o erro A non-numeric value encountered, coloquei todas as variáveis declaradas inicialmente como 0, mas o erro persiste; algum colega sabe como resolver?

Código usado:

$TotalGeral = 0;
$totalf = 0;
$totali = 0;
$icmsst = 0;
$ipi = 0;
$desconto = 0;
$baseicms = 0;
$icms = 0;
$baseicmsst = 0;
$icmsst = 0;

// Total dos Itens
sc_lookup(RsAtualizaMasterNF, “SELECT sum(desconto), sum(baseicms), sum(icms), sum(baseicmsst), sum(icmsst), sum(ipi), sum(total) FROM item_compra WHERE fkcodigo_compra = “{id_compra}””);

if (isset({RsAtualizaMasterNF[0][0]}))

{
	$desconto		= {RsAtualizaMasterNF[0][0]};
	$baseicms		= {RsAtualizaMasterNF[0][1]};
	$icms			= {RsAtualizaMasterNF[0][2]};
	$baseicmsst		= {RsAtualizaMasterNF[0][3]};
	$icmsst			= {RsAtualizaMasterNF[0][4]};
	$ipi			= {RsAtualizaMasterNF[0][5]};
	$totali		 	= {RsAtualizaMasterNF[0][6]};

	sc_format_num({RsAtualizaMasterNF[0][0]}, '.', ',', 2, 'S', '1', 'R$');
	sc_format_num({RsAtualizaMasterNF[0][1]}, '.', ',', 2, 'S', '1', 'R$');
	sc_format_num({RsAtualizaMasterNF[0][2]}, '.', ',', 2, 'S', '1', 'R$');
	sc_format_num({RsAtualizaMasterNF[0][3]}, '.', ',', 2, 'S', '1', 'R$');
	sc_format_num({RsAtualizaMasterNF[0][4]}, '.', ',', 2, 'S', '1', 'R$');
	sc_format_num({RsAtualizaMasterNF[0][5]}, '.', ',', 2, 'S', '1', 'R$');
	sc_format_num({RsAtualizaMasterNF[0][6]}, '.', ',', 2, 'S', '1', 'R$');

	{desconto}		= {RsAtualizaMasterNF[0][0]};
	{baseicms}		= {RsAtualizaMasterNF[0][1]};
	{icms}			= {RsAtualizaMasterNF[0][2]};
	{baseicmsst}	= {RsAtualizaMasterNF[0][3]};
	{icmsst}		= {RsAtualizaMasterNF[0][4]};
	{ipi} 			= {RsAtualizaMasterNF[0][5]};
}
else
{
sc_error_message("Erro ao somar o total da NF!");
}

// Atualizo o valor de despesas acessorias
sc_exec_sql(“UPDATE compras_nf SET frete = ‘{frete}’, despesas = ‘{despesas}’, seguro = ‘{seguro}’ WHERE id_compra = “{id_compra}””);

sc_lookup(RsAtualizaTotalNFF, “SELECT SUM((frete + despesas + seguro) - desconto) FROM compras_nf WHERE id_compra = “{id_compra}””);

if (isset({RsAtualizaTotalNFF[0][0]}))

{	

$totalf = {RsAtualizaTotalNFF[0][0]};

$TotalGeral = ($totalf + $totali + $icmsst + $ipi + $desconto);

sc_exec_sql("UPDATE compras_nf SET desconto = '$desconto', baseicms = '$baseicms', icms = '$icms', baseicmsst = '$baseicmsst', icmsst = '$icmsst', ipi = '$ipi', totalnf = '$TotalGeral', total = '$totali' WHERE id_compra = "{id_compra}"");

//Total da NF
sc_format_num($TotalGeral, '.', ',', 2, 'S', '1', 'R$');
{totalnf} 	= $TotalGeral;

//Total dos produtos
sc_format_num($totali, '.', ',', 2, 'S', '1', 'R$');
{total} 	= $totali + $desconto;

sc_commit_trans();

}
else
{
sc_error_message("Não consegui atualizar os totais da compra!");
}

1º) Quando criar valores locais $, NUNCA use o mesmo nome do campo da tabela coloque um $_
antes se na tabela é ‘Desconto’ no SC é {Desconto} e sua variável local tem que ser $_Desconto e
se for global tem que ser [glo_Desconto], se não colocar $_ e glo_ antes ele mistura as variáveis.

2º) Nunca, Nunca, Nunca some variáveis strings com R$ junto, a variável tem que estar no
formato padrão com . no final, exemplo: R$ 1.000,00 tem que ser usado na soma como 1000.00

E aqui você esta querendo somar uma variável STRING R$ com uma numérica, ai vai dar o
erro Erro A non-numeric value encountered:
sc_format_num($totali, ‘.’, ‘,’, 2, ‘S’, ‘1’, ‘R$’);
{total} = $totali + $desconto;

3º) Quando montar a sua SQL não coloque ela diretamente na macro sc_exec_sql()
coloque ela numa variável primeiro, exemplo:
sc_exec_sql(“UPDATE compras_nf SET desconto = ‘$desconto’, baseicms = ‘$baseicms’, icms = ‘$icms’, baseicmsst = ‘$baseicmsst’, icmsst = ‘$icmsst’, ipi = ‘$ipi’, totalnf = ‘$TotalGeral’, total = ‘$totali’ WHERE id_compra = “{id_compra}””);

E só coloque ’ em torno do nome da variável para gravar variáveis strings ou datas, variáveis numéricas, decimais, inteiras, etc não se coloca nada em torno do campo.

Fica:

$sql="
UPDATE
	compras_nf
SET desconto = $_desconto,
    baseicms = $_baseicms,
	icms = $_icms,
	baseicmsst = $_baseicmsst,
	icmsst = $_icmsst,
	ipi = $_ipi,
	totalnf = $_TotalGeral,
	total = $_totali
WHERE
    id_compra = {id_compra}
";

sc_exec_sql($sql);
sc_commit_trans();

A triste verdade é que em PHP ANTERIOR a versão 7.1 isso abaixo era aceito e a partir da 7.1 não mais.

$variavel = “”;
$resultado = $variavel + 10;

Ocorre que muitos de nós temos CENTENAS de aplicações legadas da vs 5.x que faziam algo similar e ao atualizar para novo SC dançamos.

Mas aí não é culpa do SC e sim do PHP.

Ao converter aplicações o SC corrige todo o código gerado para a nova versão do PHP, menos o código customizado, ou seja, aquele criado pelo desenvolvedor. Esse código criado pelo desenvolvedor tem que ser ajustado manualmente para a nova versão do PHP.
Se fosse Script com PHP puro, o trabalho seria o mesmo.

2 Curtidas

Grande amigo Haroldo! Muito obrigado mesmo! Explicado 100%.
Estou para dar um grande passo de migração de cerca de 1.200 apps e precisava tirar essa dúvida cruel, ver se tinha alguma outra possibilidade, pois no ERP verifiquei várias apps que acabam caindo nesta situação, principalmente se o campo não tem valor. Mais uma vez muito obrigado!

1 Curtida