SOMAR CAMPOS NO FORMULARIO AO CARREGAR A APLICAÇÃO!

Estou tentando somar campos em um formulario no momento em que a aplicação é carregada, mas a soma somente acontece no efento onRefresh!

Ja testei dos estes eventos…
onApplicationInit
onNavigate
onScriptInit
onLoad
onRefresh

Vejam meu codigo!

//Calculando o salario total…

{total_salario} = ‘0’;
$varSalarioA = ‘0’;
$varSalarioFamilia = ‘0’;
$varArredMes = ‘0’;
$varOutrosPag = ‘0’;

$varSalarioA={salarioa};
//trocando virgula por ponto e tirando o ponto
$varSalarioA=str_replace(’.’,’’,$varSalarioA);
$varSalarioA=str_replace(’,’,’.’,$varSalarioA);

$varSalarioFamilia={salariofamilia};
//trocando virgula por ponto e tirando o ponto
$varSalarioFamilia=str_replace(’.’,’’,$varSalarioFamilia);
$varSalarioFamilia=str_replace(’,’,’.’,$varSalarioFamilia);

$varArredMes={arredmes};
//trocando virgula por ponto e tirando o ponto
$varArredMes=str_replace(’.’,’’,$varArredMes);
$varArredMes=str_replace(’,’,’.’,$varArredMes);

$varOutrosPag={outrospag};
//trocando virgula por ponto e tirando o ponto
$varOutrosPag=str_replace(’.’,’’,$varOutrosPag);
$varOutrosPag=str_replace(’,’,’.’,$varOutrosPag);

{total_salario} = $varSalarioA + $varSalarioFamilia + $varArredMes + $varOutrosPag;

Alguém pode me dar uma força!!

Abraço!

Se você usar o código no onLoad, supõe-se que os campos que vc atribui as variáveis de valor já tenham valor. Está usando um lookup para buscar os valores? É o usuário quem fornece os valores? Está usando formulário ou controle? Explica melhor seu cenário.

Utilize tipos de campos moeda ou decimal que o SC faz a validação.

Veja Bem!

Minha aplicação é de formulário!

O campo total_salario é um campo novo da aplicação.

Exemplo do que preciso…

abaixo os campos do meu formulario

salarioa
salariofamilia
arredmes
outrospag

Preciso somar e colocar o valor em um campo novo!

Criei um campo total_salario para colocar a soma de todos os campos…

//Este codigo é para tirar a virgula senão a soma fica errada!
$varSalarioA={salarioa};
//trocando virgula por ponto e tirando o ponto
$varSalarioA=str_replace(’.’,’’,$varSalarioA);
$varSalarioA=str_replace(’,’,’.’,$varSalarioA);

Valeu!

voce ta fazendo isso para dados ja existentes ou para dados novos?

Dados novos, onRecord ainda nao tem os valores nos campos, o campo novo fica vazio.
So vai ser preenchido no onBeforeInsert ou onBeforeUpdate …

Não há necessidade de retirar a virgula … virgula é apenas para exibição da interface(html) … se esta com virgula apos o submit … ou o separador do seu banco esta errado … ou realmente voce configurou para usar virgula (estranho :-P) …

Se o usuario vai digitando e em tempo de voo voce quer mostrar o total … vc tem que fazer com evento ajax no onchage em cada campo ou no onchange via javscript mesmo … ai sim, voce precisaria remover a virgula para fazer as operações.

Estou com um problema parecido, Creio que seja simples mais não estou conseguindo concluir. Estou tentando alterar um campo e que esse o valor deste campo faça o calculo quando eu altero e passe o valor deste calculo para o BD.

Por exemplo, eu estou alterando o campo {hora_final_atendimento}, de uma OS que ja está gravada. Ao alterar esse campo, coloquei nos eventos ONBEFOREUPDATE e ONAFTERUPDATE, o seguinte lookup:

sc_lookup(HORAF, "SELECT SUBTIME(adm_os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas FROM adm_os INNER JOIN adm_clientes ON (adm_os.id_cliente = adm_clientes.ClienteId) WHERE adm_os.id = ‘{id}’ AND adm_os.id_unidade = ‘2’ AND adm_os.tipo_contrato_m = ‘F’ AND adm_clientes.qtde_contrato_m <> ‘(NULL)’ ");

if (sc_changed({hora_final_atendimento})) { {hora_adic_atendimento} = ($HORAF[0][0]);

Mais o que acontece e que ele so faz o calculo se eu apertar o botão ATUALIZAR 2 vezes, ou seja, ele faz no UPDATE primeiro com o valor anteriormente gravado, DEPOIS ele pega o valor que gravou e refaz o calculo correto.

Onde eu deveria colocar esse evento (ja tentei tb o OnValidade e OnScriptInit) e tb não deu certo.

Se alguem tiver uma luz, eu agradeço !!!

Tem erro ai na sua construção:

if (sc_changed({hora_final_atendimento})) { {hora_adic_atendimento} = {$HORAF[0][0]};

Vc usou parentesis.

Pela lógica, ele tem que atualizar o valor do campo antes de mandar para o BD, então deve usar o evento onBeforeUpdate. E eu não usaria a macro sc_changed.

Bom dia Cleyton…tudo joia ???

Então cara, até tentei usar conforme voce me passou, mesmo assim, ele so esta calculando (com o valor correto) quando eu clico 2 vezes para atualizar (na primeira vez ele pega o valor anterior para calculo).

Coloquei assim no OnBeforeUpdate:

sc_lookup(HORAF, "SELECT SUBTIME(adm_os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas
FROM adm_os INNER JOIN adm_clientes ON (adm_os.id_cliente = adm_clientes.ClienteId) WHERE adm_os.id = ‘{id}’ AND adm_os.id_unidade = ‘2’ AND adm_os.tipo_contrato_m = ‘F’ AND adm_clientes.qtde_contrato_m <> ‘(NULL)’ ");

{hora_adic_atendimento} = {HORAF[0][0]};

O que poderia ser isso ???

O lookup acho que vc tem que fazer no onLoad.

Ele faz somente no segundo clique, porque somente no segundo ele enxerga o novo valor.

PS.: Faz o lookup no onLoad e a atribuição do novo valor no onBeforeUpdate.

tentei fazer isso…

Coloquei no onload:

sc_lookup(HORAF, "SELECT SUBTIME(adm_os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas
FROM adm_os INNER JOIN adm_clientes ON (adm_os.id_cliente = adm_clientes.ClienteId) WHERE adm_os.id = ‘{id}’ AND adm_os.id_unidade = ‘2’ AND adm_os.tipo_contrato_m = ‘F’ AND adm_clientes.qtde_contrato_m <> ‘(NULL)’ ");

Coloquei no OnBeforeUpdate:

{hora_adic_atendimento} = {HORAF[0][0]};

Agora ele nem faz a atualização na 2 clicada: com o modo debug ligado ele aparece uma linha de erro:

ERRO

Undefined index: line
Script: C:\Arquivos de programas\NetMake\v5\wwwroot\scriptcase\prod\third\adodb\adodb-lib.inc.php (1123)
Undefined index: file
Undefined property: cad_os_ser_novo_apl::$horaf
Script: C:\Arquivos de programas\NetMake\v5\wwwroot\scriptcase\app\ERP_CENTRAXI\cad_os_ser_novo\cad_os_ser_novo_apl.php (11132)

No evento onBeforeUpdate ele não entende {HORAF[0][0]}

Vc tem que jogar numa variável global no evento onLoad

Tentei fazer isso, mais ainda so está gravando na segunda clicada do ATUALIZAR.

Ficou assim agora:

ONLOAD:

sc_lookup(HORAF, "SELECT SUBTIME(adm_os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas
FROM adm_os INNER JOIN adm_clientes ON (adm_os.id_cliente = adm_clientes.ClienteId) WHERE adm_os.id = ‘{id}’ AND adm_os.id_unidade = ‘2’ AND adm_os.tipo_contrato_m = ‘F’ AND adm_clientes.qtde_contrato_m <> ‘(NULL)’ ");

$TOTAL_HORAS = {HORAF[0][0]};
sc_set_global($TOTAL_HORAS);

ONBEFOREUPDATE:

{hora_adic_atendimento} = [TOTAL_HORAS] ;

Bixo, não sei mais o que faço…:frowning:

Se quiser podemos fazer pelo compartilhamento de tela do Skype.

Meu user: cleyton_euler

blz fera…te add … valeu…

Com a atenção 100% do Cleyton, conseguimos resolver o impasse e misterio :slight_smile:

Chegamos a uma conclusão que passou no teste, não usar variavel global e sim, fazer um update na tabela após a inclusão de um valor novo no campo.

sc_lookup(HORAF, "SELECT SUBTIME(os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas
FROM os INNER JOIN adm_clientes ON (os.id_cliente = adm_clientes.ClienteId) WHERE os.id = ‘{id}’ AND os.id_unidade = ‘2’ AND os.tipo_contrato_m = ‘F’ AND adm_clientes.qtde_contrato_m <> ‘(NULL)’ ");

$TOTAL_HORAS = {HORAF[0][0]};

sc_exec_sql("Update adm_os set hora_adic_atendimento =’$TOTAL_HORAS’ where id = ‘{id}’ ");

Deu certinho, 100% dos CREDITOS AO CLEYTON pela ajuda e “batidas de cabeça”… RESOLVIDO !!! valeu brother…

somente mais uma coisa pra fechar…me deparei com um problema, ao tentar gravar alguns id’s no formulario, obtenho um erro:

Undefined offset: 0

sc_lookup(HORAF, "SELECT SUBTIME(adm_os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas
FROM adm_os INNER JOIN adm_clientes ON (adm_os.id_cliente = adm_clientes.ClienteId) WHERE adm_os.id = ‘{id}’ AND (adm_os.id_unidade = ‘2’) AND (adm_os.tipo_contrato_m = ‘F’) AND (adm_clientes.qtde_contrato_m > ‘0’) ");

$TOTAL_HORAS = {HORAF[0][0]};

if ($TOTAL_HORAS < “00:00:00”)
sc_exec_sql("Update adm_os set hora_adic_atendimento =’$TOTAL_HORAS’ where id = ‘{id}’ ");
}
else
{
sc_exec_sql("Update adm_os set hora_adic_atendimento = ‘00:00:00’ where id = ‘{id}’ ");
}

Creio, pela logica que algumas procuras do lookup voltam VAZIAS (que é normal se não baterem com a clausula WHERE).
Essas que voltam vazias estão dando esse Undefined offset: 0

Como faço para explicar ao BD que se voltarem vazias, gravar no BD o valor 00:00:00 tb ???

Um grande abraço a todos e aguardo uma luz assim que possivel !!!

Se não estou errado, $TOTAL_HORAS está causando o Undefined offset, pelo motivo que vc já detectou.

Faça uma validação com empty do retorno do lookup.

Fala mano,

tentei sc_lookup(HORAF, "SELECT SUBTIME(adm_os.hora_final_atendimento,adm_clientes.hora_final_atendimento_m) AS total_horas
FROM adm_os INNER JOIN adm_clientes ON (adm_os.id_cliente = adm_clientes.ClienteId) WHERE adm_os.id = ‘{id}’ AND (adm_os.id_unidade = ‘2’) AND (adm_os.tipo_contrato_m = ‘F’) AND (adm_clientes.qtde_contrato_m > ‘0’) ");

$TOTAL_HORAS = {HORAF[0][0]};

if( empty($TOTAL_HORAS))
{ if ($TOTAL_HORAS > “00:00:00”) {
sc_exec_sql("Update adm_os set hora_adic_atendimento = ‘00:00:00’ where id = ‘{id}’ ");
}
else
{
sc_exec_sql("Update adm_os set hora_adic_atendimento =’$TOTAL_HORAS’ where id = ‘{id}’ ");
}
}

mais ainda deu Undefined offset. O pior que é o resultado da $TOTAL_HORAS vazio mesmo… a sintaxe acima está corretá não está ???

Blz irmão,

Vc tem que fazer o teste na atribuição da variável:

Se não for vazio então

 $TOTAL_HORAS = {HORAF[0][0]};

Do jeito que vc colocou ela continua recebendo vazio, quando o dataset vem vazio.

Cara, tentei de tudo, dei uma pesquisada na net mais não consegui obter a logica. Coloquei o IF EMPTY antes da $TOTAL_HORAS = {HORAF[0][0]}; mesmo assim o erro não para…estou errando algo na posição da sintaxe…

if empty = se for vazio, então vc está atribuindo quando for vazio, o que não está correto.

Então como fazer para atribuir somente qdo não for vazio?

Vc tem que fazer a negação do empty, que acho que é !empty

Algo assim:

if(!empty($TOTAL_HORAS))