[RESOLVIDO] Evento onAfterUpdate - Formulário

Caros,

Adicionei no evento onAfterUpdate do “formulário de um registro” o código abaixo, porém ao utilizar o sc_alert para verificar o que está capturando o mesmo retorna o conteúdo “count” (sem as aspas). Também tentei utilizar pelo menos 3 campos da tabela (loccod, indcod, cieseq), e o resultado após o sc_select() ao utilizar o sc_alert() é “loccod, indcod, cieseq”.

Objetivo do meu código: Ao incluir um novo registro pai, ou alterar, devo verificar se na tabela filho a existência na sequência 00001:

  • Caso exista, então atualizar alguns campos pela tabela PAI
  • Caso não exista, então adicionar o registro na tabela FILHO (também adicionei este código em onAfterInsert)

$cCIESEQ = “00001”;
sc_select(rs, “SELECT count(*)
FROM web_gerencia.tbl_cgcie
WHERE loccod = '”. {loccod} ."’ AND
indcod = ‘". {indcod} ."’ AND
cieseq = ‘". $cCIESEQ ."’" );
sc_alert( {rs} );

if ({rs} !== false){
sc_alert(“Estou em 1”);
}else{
sc_alert(“Estou em 2”);
}
O resultado da condição if() é sempre mostrar “Estou em 1”, independente se o registro exista ou não.
Também já mudei a condição para “if (count(rs)>1)”, e também permanece mostrando apenas “Estou em 1”.
Após vários testes, não consigo fazer o sc_select() (já testei também pelo sc_lookup()) trazer os resultados esperados, porém em várias funções que criei ao projeto, com a mesma lógica funcionam sem problemas, consigo capturar o resultado, tratar o resultado do resultset, usar o seu conteúdo e tudo mais, porém nestes eventos não consigo.

O que mudar para resolver esta situação nestes eventos ?

Att,

Jocimar

sim, o seu select está selecionando a quantidade de registros, ou seja, ele irá contar (SELECT COUNT…) quantos registros existe na sua condição (WHERE …) e irá retornar apenas 1 registro com 1 campo informando essa quantidade.

no seu código, você está verificando quantos registros a “consulta” está retornando ao invés de verificar o valor do field (que contém a quantidade de registros que você quer saber).

use o código abaixo no lugar de {rs}: $rs->fields[0]

Obrigado Guariba,

Porém utilizei umas 20:00 hrs de estudos em cima do retorno deste select, e realmente não funciona dentro dos eventos onAfterInsert, onAfterUpdate e Cia.
Mesmo substituindo conforme sua instrução o retorno cai apenas no “Estou em 1”, independente se o registro exista ou não na tabela (tbl_cgcie).

Na verdade este é um tópico sem fim, pois não funciona mesmo.

Grato,

Jocimar

Faz o seguinte coloca a consulta numa variável e depois dá um echo nela ai você pelo o resultado sql que ele imprimir na tela e executa no banco de dados e vê que resultado vem.

[code]$cCIESEQ = “00001”;
$sql= “SELECT count(*)
FROM web_gerencia.tbl_cgcie
WHERE loccod = '”. {loccod} ."’ AND
indcod = ‘". {indcod} ."’ AND
cieseq = ‘". $cCIESEQ ."’";

echo $sql;[/code]

Jocimar, você nunca conseguirá o resultado esperado, você está fazendo um count, ele retorna um número baseado na quantidade de registros, logo se são 0 registros ele conta 0, então existe retorno, o retorno nunca será == false. Se você pretende que isso funcione, faça um {rs[0][0]} != 0, e talvez funcionará.

Obrigado Paulo,

Também já fiz isto, inclusive com o uso da macro sc_lookup().
Realmente é um problema que vou deixar para testar no futura.
Estou convertendo um sistema que está em Flagship/Linux com aproximadamente 250 mil linhas de código e aproximadamente 300 tabelas.
Como já utilizei muitas horas fazendo testes com as opções de macros disponíveis pelo SC, já utilizei várias funções do PHP para tentar capturar o resultado deste select, porém não há retorno de informação, e, apenas neste select, pois já tenho mais de 30 funções em biblioteca que são chamadas pelos eventos de formulário, e funciona, há retorno nos sc_select(), mas neste caso, já sai fora, não vou mais iniciar testes até terminar o projeto.
Em muitas mensagens aqui no fórum você verifica que acontece alguns “bugs” no SC e não adianta a gente ficar tentando, se não funciona, então deixa de lado, fazer o quê ?
No caso em tela, o que fiz foi o seguinte, no evento:
onAfterInsert -> Fiz o INSERT na outra tabela
onAfterUpdate -> Fiz o UPDATE da tabela
O Problema é se que, se o usuário deletar da tabela tbl_cgcie a sequência 00001, então não haverá mais INSERT nem UPDATE, e isto no FlagShip é só escrever o código, executar e ele funciona. No PHP utilizando SC não funciona!, só isto!, aí têm-se que deixar de lado mesmo.

Grato,

Jocimar

Obrigado Robert,

Funcionou, porém com a macro sc_lookup(), já que a sua solução estava em vetor!
O código final que funcionou para testar se a sequência existe ou não ficou como está abaixo:

$cCIESEQ = “00001”;

sc_lookup(rs, “SELECT count(*)
FROM web_gerencia.tbl_cgcie
WHERE loccod = '”. {loccod} ."’ AND
indcod = ‘". {indcod} ."’ AND
cieseq = ‘". $cCIESEQ ."’" );

if ({rs[0][0]} != 0){
sc_alert(“Estou em 1”);
}else{
sc_alert(“Estou em 2”);
}

Grato,

Jocimar

No sc_select eu acho que é: $rs->fields[0] != 0

Se você preferir usar.

Obrigado pelas dicas Robert,

Vou testar também o sc_select(), porém em consultas rápidas o sc_lookup() está de bom tamanho.
Vou aproveitar e re-fazer os testes com o resultado de sc_select(), inclusive considerando o conteúdo dos campos.

$cCIESEQ = “00001”;

sc_lookup(rs, “SELECT count(*)
FROM web_gerencia.tbl_cgcie
WHERE loccod = '”. {loccod} ."’ AND
indcod = ‘". {indcod} ."’ AND
cieseq = ‘". $cCIESEQ ."’" );

if ({rs[0][0]} != 0){
{
sc_alert(“Estou em 1”);
}else{
sc_alert(“Estou em 2”);
}

Grato,

Jocimar