[RESOLVIDO] - Update a record on another table - Não quer funcionar

Boa tarde caros colegas!

Estou tentando realizar um Update num registro em determinada tabela após uma série de instruções, passando o dado [size=10pt]$result[/size] dentro de um botão AJAX, segue anexo o código do botão:

[code]/QUERY PARA SELECIONAR OS VALORES PARA CALCULAR O PREÇO MÉDIO PRODUÇÂO RAC/

$sql=“SELECT
EMPRESAS_IDEMPRESAS,
PRODUTOS_IDPRODUTOS,
ENCARGOS,
VENDAINTERNAT,
VENDAINTERNAR,
PERIODO,
ANO,
MES
FROM
ROOT.VIEW_PRECO_MEDIO_DADOS
WHERE
PERIODO=’{PERIODO_CONTROLE}’”;

sc_select (dados, $sql);

/VERIFICA EXCESSÃO CASO NAO TENHA DADOS NO SELECT/
if(empty({dados}))
{
sc_alert(‘ERRO na busca de dados!!!’);
}
else
{

 foreach({dados} as $dt)
 {
     //Aqui o resultado será linha por linha e acessado por
     {EMPRESAS_IDEMPRESAS}=$dt[0];
 {PRODUTOS_IDPRODUTOS}=$dt[1];
 {ENCARGOS}=$dt[2];                                    //campo[x] linha a linha
     {VENDAINTERNAT}=$dt[3];
	 {VENDAINTERNAR}=$dt[4];
 	
	 
	 
	 $result = ((( {VENDAINTERNAR} / 1000 ) /{VENDAINTERNAT} ) / {ENCARGOS} );
	
	 
	

	 
	/**
	 * Update a record on another table
	 */

	// SQL statement parameters
	$update_table  = 'PRODUCAORAC';      // Table name
	$update_where  = "PERIODO={PERIODO_CONTROLE} and 
					  EMPRESAS_IDEMPRESAS = {EMPRESAS_IDEMPRESAS} and
					  PRODUTOS_IDPRODUTOS = {PRODUTOS_IDPRODUTOS}"; // Where clause
	$update_fields = array("PRECO_MEDIO = $result");

	// Update record
	$update_sql = 'UPDATE ' . $update_table
		. ' SET '   . implode(', ', $update_fields)
		. ' WHERE ' . $update_where;
	
	 sc_exec_sql($update_sql); 
	 

 }

}
[/code]

Bom, até a parte do cálculo do $result está tudo ok o problema ocorre no momento seguinte, onde tento fazer um UPDATE na tabela, estou usando um bloco de código do próprio SC, são uns que estão meio que de “Sugestão” no lado direito da tela dentro de qlq evento que esteja dispnível.

Se precisarem de mais informações só falar aí em baixo.

Obrigado.

Dá um print ou sc_alert na variável : $update_sql .
Ativa o modo debug da aplicação.
Visualiza o que está sendo retornado no momento do update.

Tentei isso que vc me disse Ronyan Alves… mas nada acontece olha o código aqui:

[code]/**
* Update a record on another table
*/

	// SQL statement parameters
	$update_table  = 'PRODUCAORAC';      // Table name
	$update_where  = "PERIODO={PERIODO_CONTROLE} and 
					  EMPRESAS_IDEMPRESAS = {EMPRESAS_IDEMPRESAS} and
					  PRODUTOS_IDPRODUTOS = {PRODUTOS_IDPRODUTOS}"; // Where clause
	$update_fields = array("PRECO_MEDIO = $result");

	// Update record
	$update_sql = 'UPDATE ' . $update_table
		. ' SET '   . implode(', ', $update_fields)
		. ' WHERE ' . $update_where;
	
 echo "<pre>";
        print_r($update_sql);
     echo "</pre>";
 	 sc_alert($update_sql);	
	 break;
	
	 sc_exec_sql($update_sql); 
	 

 }

}[/code]

Dei print_r e sc_alert(). Modo debug mostra outras coisas da aplicação mas não meu Update.

Acho que faltam aspas aqui:

$update_fields = array(“PRECO_MEDIO = $result”);

deveria ser assim:

$update_fields = array(“PRECO_MEDIO = ‘$result’”);

Não?

Pessoal dei uma mexida e ficou assim:

[code]UPDATE PRODUCAORAC SET PRECO_MEDIO = ‘0.00094428706326723’

                                              WHERE PERIODO = '08/2016' and 

					  EMPRESAS_IDEMPRESAS = 1  and

					  PRODUTOS_IDPRODUTOS = 3494 

[/code]

Estou tendo este erro:
1843: ORA-01843: not a valid month

O campo PERIODO_CONTROLE está da seguinte forma:

Formato Interno - MM/AAAA

O campo PERIODO no banco está salvando como dd/mm/aa. Mas o estranho é que no Select da view ele entende a data e me traz os valores corretos mas na hora do Update não.

Alguém sabe?

É que a view está com o campo já formatado. No UPDATE você precisa passar o WHERE assim:

WHERE to_char(PERIODO,‘mm/yyyy’) = ‘08/2016’

Recria sua VIEW assim:

CREATE OR REPLACE FORCE VIEW “ROOT”.“VIEW_PRECO_MEDIO_DADOS” (“EMPRESAS_IDEMPRESAS”, “ENCARGOS”, “VENDAINTERNAT”, “VENDAINTERNAR”, “PERIODO”, “PERIODO_UPDATE”, “ANO”, “MES”) AS
SELECT
cr.EMPRESAS_IDEMPRESAS,
cr.ENCARGOS,
pr.VENDAINTERNAT,
pr.VENDAINTERNAR,
TO_CHAR(pr.PERIODO, ‘MM’)||’/’||TO_CHAR(pr.PERIODO, ‘YYYY’) AS PERIODO,
pr.PERIODO AS PERIODO_UPDATE,
cr.ANO,
cr.MES
FROM
COMPLEMENTORAC cr, PRODUCAORAC pr
WHERE
cr.EMPRESAS_IDEMPRESAS IN (SELECT EMPRESAS_IDEMPRESAS FROM COMPLEMENTORAC) AND
cr.ANO = TO_CHAR(pr.PERIODO, ‘YYYY’) AND
cr.MES = TO_CHAR(pr.PERIODO, ‘MM’) AND pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS;

Trocar todo o código por este:

/* Macro sc_select */

$sql=“SELECT
EMPRESAS_IDEMPRESAS,
PRODUTOS_IDPRODUTOS,
ENCARGOS,
VENDAINTERNAT,
VENDAINTERNAR,
PERIODO,
PERIODO_UPDATE,
ANO,
MES
FROM
ROOT.VIEW_PRECO_MEDIO_DADOS
WHERE
PERIODO=’{PERIODO_CONTROLE}’”;
";

sc_select(meus_dados, $sql);

/* Erro no select */
if ({meus_dados} === false) {
// Sua Base + _erro
sc_error_message(“Ocorreu um erro no acesso ao
banco de dados: {meus_dados_erro}.
”);
}
else {

 /* Inclua aqui sua rotina de processamento */

 // Qtde de Registros Retornados.
 $QtdeRegistros=$meus_dados->RecordCount();

 if ($meus_dados->EOF) {

     sc_error_message("Nenhum valor foi retornado pelo banco.<BR>");	 
 
 } else {

	 while (!$meus_dados->EOF) {		 
			
			{EMPRESAS_IDEMPRESAS}=$meus_dados->fields[0];
			{PRODUTOS_IDPRODUTOS}=$meus_dados->fields[1];
			{ENCARGOS}=$meus_dados->fields[2];
			{VENDAINTERNAT}=$meus_dados->fields[3];
			{VENDAINTERNAR}=$meus_dados->fields[4];
			$PERIODO_UPDATE_x=$meus_dados->fields[6];		 
	 
	       $PRECO_MEDIO_x = ((( {VENDAINTERNAR} / 1000 ) /{VENDAINTERNAT} ) / {ENCARGOS} );
			
			if (empty($PRECO_MEDIO_x)) {
			    $PRECO_MEDIO_x=0;
			}
			
			$sql="
			UPDATE
				    PRODUCAORAC
			SET
				    PRECO_MEDIO = $PRECO_MEDIO_x
			WHERE
				    PERIODO='$PERIODO_UPDATE_x' AND
				    EMPRESAS_IDEMPRESAS = {EMPRESAS_IDEMPRESAS} and
				    PRODUTOS_IDPRODUTOS = {PRODUTOS_IDPRODUTOS}
			";
				
			sc_exec_sql($sql);				
			
			// Avança para o próximo registro do BANCO DE DADOS.
			$meus_dados->MoveNext();
			
	 } // while (!$meus_dados->EOF)
 
 } // if ($meus_dados->EOF)	 
 
 // Limpa tudo até a conexão
 $meus_dados->Close();

} // sc_select(meus_dados, ** Nao deixar aspas aqui…

Opa Jailton!

Ficou certinho, mas quando vou no registro através da aplicação PRODUCAORAC que é um botão da PRODUTO_PAINEL, onde eu tenho um produto que contém uma Produção RAC específica a cada mes do ano, não aparece meu PRECO_MEDIO mas no banco existe o registro. Quando eu atualizo o registro e salvo novamente ele sobrescreve o valor que está persistente na base com 0 que é o que está na tela da aplicação.

Não entendo como isso é possível já que a aplicação é um reflexo da tabela do banco.

Acresta isso no final do código:

// Limpa tudo até a conexão
$meus_dados->Close();

} // sc_select(meus_dados, ** Nao deixar aspas aqui…

sc_commit_trans(); // <<- Aqui força a gravação na base.

Cara eu fiz isso … Na real tbm vi algo de jogar essa macro no evento onAfterUpdate da aplicação PRDUCAORAC no caso. Mas mesmo assim quando entro na tela de grid editável o preço médio ainda tá zerado…

E olhando direto na base de dados?

Ta lá o valor, quando vejo no banco, daí na tela da aplicação mesmo… ela ta vazio e quando atualizo ele grava o “0” por cima do cálculo do preço médio

Então na base banco de dados ele esta gravando o valor certo? correto? é só na mesma tela que tem o botão e o grid que não esta atualizando na hora certo?

Sim. Exatamente, quando eu vou na base o valor está lá corretamente, mas quando clico no botão de ligação que eu fiz passando o id_produto e id_empresa como chaves para a PRODUCAORAC o preço médio está zerado(“0”) para aquele produto do PRODUTO_PAINEL.

Outro problema quando eu realizo o cálculo ele tá gravando só o primeiro resultado em todos os outros registros… por exemplo na base eu gerei dois registros na PRODUCAORAC com valores diferentes de VENDAINTERNAT e VENDAINTERNAR apenas o ENCARGO que pertence ao COMPLEMENTORAC que é o mesmo para os dois e ele salva somente o valor que foi cálculado primeiro

Salva todo o código.

Trocar essa parte do código por esta:
$EMPRESAS_IDEMPRESAS_x=$meus_dados->fields[0];
$PRODUTOS_IDPRODUTOS_x=$meus_dados->fields[1];
$ENCARGOS_x=$meus_dados->fields[2];
$VENDAINTERNAT_x=$meus_dados->fields[3];
$VENDAINTERNAR_x=$meus_dados->fields[4];
$PERIODO_UPDATE_x=$meus_dados->fields[6];

         $PRECO_MEDIO_x = ((( $VENDAINTERNAR_x / 1000 ) / $VENDAINTERNAT_x ) / $ENCARGOS_x);
        
        if (empty($PRECO_MEDIO_x)) {
            $PRECO_MEDIO_x=0;
        }
        
        $sql="
        UPDATE
               PRODUCAORAC
        SET
               PRECO_MEDIO = $PRECO_MEDIO_x
        WHERE
               PERIODO='$PERIODO_UPDATE_x' AND
               EMPRESAS_IDEMPRESAS = $EMPRESAS_IDEMPRESAS_x and
               PRODUTOS_IDPRODUTOS = $PRODUTOS_IDPRODUTOS_x
        ";
           
        sc_exec_sql($sql);

** SALVA O CÓDIGO todo agora.

E muda ele novamente.

Desabilita o sc_exec_sql($sql); por // sc_exec_sql($sql);

E adiciona abaixo do: sc_exec_sql($sql);
echo 'SQL = '.$sql."
";

e No final do script após o sc_commit_trans();
break;

Isso é para ver que ele vai ‘rodar’ todos os comandos SQL, ai pega alguns deles e executa na base diretamente a instrução SQL e veja se tá rodando normal.

Se tiver o erro vai estar só na ligação que você fez com o outro formulário que não esta passando os registros certos na ligação.

Ou o formulário que tem PRODUCAORAC não esta relacionando certo também lá com o registro correto, por isso que ‘você tem a impressão’ visualmente que ele não atualizou.

Opa Jailton tudo bem?

Então cara fiz isso daí e peguei no $sql tanto o do select quanto o do update:

Select na view:

SELECT EMPRESAS_IDEMPRESAS, 
PRODUTOS_IDPRODUTOS,
ENCARGOS, 
VENDAINTERNAT, 
VENDAINTERNAR, 
PERIODO, 
PERIODO_UPDATE, 
ANO, 
MES FROM ROOT.VIEW_PRECO_MEDIO_DADOS WHERE PERIODO='08/2016'   

Update:

[code]SQL = UPDATE PRODUCAORAC SET PRECO_MEDIO = 0.00094428706326723
WHERE PERIODO=‘2016-08-01 00:00:00’ AND
EMPRESAS_IDEMPRESAS = 1 and
PRODUTOS_IDPRODUTOS = 2399

SQL = UPDATE PRODUCAORAC SET PRECO_MEDIO = 0.00094428706326723
WHERE PERIODO=‘2016-08-01 00:00:00’ AND
EMPRESAS_IDEMPRESAS = 1 and
PRODUTOS_IDPRODUTOS = 3494 [/code]

Está aparentemente correto e no BD gravou corretamente… só que o resultado do cálculo está errado pelo menos um, pois ambos estão iguais como vc mesmo pode ver no echo do sql.

E na hora que vou na tela da aplicação os valores do PRECO_MEDIO tão zerados.

Ok agora deixa o código correto habilitado novamente:

Habilita o // sc_exec_sql($sql); por: sc_exec_sql($sql);

E remove abaixo do: sc_exec_sql($sql);
echo 'SQL = '.$sql."
";
break;

Gera todas app, entra executa o botão novamente ‘não vai aparecer nenhum erro’.

Vai na base em um registro e veja se ficou certo lá, ficando certo, fechar o SC tudo, os app, etc; carregar entrar no SC novamente no formulário/consulta que você fez para exibir,
este valor e veja o valor, se estiver errado ainda diferente quer dizer que seu formulário/consulta esta puxando outro registro, ai só corrigir
para ‘pegar’ o registro correto da base.

Opa Jailton agora ele calculou certo… Acredito que não está puxando registro errado pq quando eu altero ele ou apago, chego no banco e o registro sofreu as mudanças.

Outro problema é que eu criei 4 registros na PRODUÇÂORAC, 2 numa EMPRESA e 2 EM OUTRA, o script tá calculando só o da empresa com ID_EMPRESA = 1 por coincidência é a empresa que estou fazendo os testes… a Outra Empresa é a de ID_EMPRESA= 60, está última ficou sem calcular.

Se esta ficando sem calcular na hora de filtrar o sc_select no código, veja se esta ‘puxando’ esses registros, ele para atualizar tudo segue o WHERE do quem vem no sc_select, se não vier lá ele não vai fazer o UPDATE,
já que ele vai seguir a sequência de registros no while (!$meus_dados->EOF) {

Ativa o MODO Debug do ScriptCase para você acompanhar os UPDATES e ver que dados que ele esta atualizando, ai com isso fica fácil você corrigir o WHERE:

Ok tudo certo Jailton, foi um erro no tratamento da DATA no COMPLEMENTORAC, pois estava no MES como “8” mas na verdade deveria ser “08”.

A única coisa que está dando pau ainda é o campo PRECO_MEDIO na tela de PRODUCAORAC, que ainda está zerado para todos os registros. Poderia ser alguma configuração do campo na aplicação será? Tipo casas decimais, ou o tipo de dados que ele irá exibir se é decimal ou inteiro, negativo e etc… Pois tenho certeza de que estão puxando o registro corretamente já que quando eu atualizo o registro com outro valor em qlquer um dos campos ele muda tbm no banco de dados.