Srs. Boa tarde!
Preciso melhorar a usabilidade de uma aplicação do tipo formulário “grid editável”, para realizar uma função de “teste de múltipla escolha”.
A solução que implementei (que está funcionando, mas estou tentando simplificar ações do usuário na “marcação” da alternativa) exige do usuário que ele click na “canetinha” e depois “confirme” ou “cancele” a opção.
O procedimento dessa funcionalidade foi implementado no evento “onBeforeUpdate” (por decorrência as funcionalidades de “canetinha”, “cancelar” ou “confirmar”, até onde eu sei, é inerente a esse evento, dentro do ciclo da informação - correto?).
A melhoria que eu estou tentando foi criar um evento ajax (onclick ou onfocus, já tentei os dois) que, após clicado em um campo de qualquer das linhas do grid, a programação associada ao evento ajax, toma a iniciativa de marcar a opção (atualizar as bases), sem passar pelo onBeforeupdate, reduzindo as etapas de clicar na “canetinha” e depois “confirmar” ou “cancelar” a opção escolhida.
Quando carrego o grid no evento onLoadrecord eu coloco em um array, para cada registro, os ids das alternativas e o id de suas opções (A,B,…), indexado pelo número da linha do grid (sc_seq_vert). Essa carga está funcionando. Porém, após o grid apresentado, quando eu clico em qualquer das linhas do grid o procedimento ajax (onFocus ou onClick) não é executado corretamente, ou seja, as bases não são atualizadas (lembro que esse mesmo procedimento que está no ajax é, basicamente, o que funciona na implementação atual, que está funcionando no evento onBeforeupdate).
Além disso, trackeando a aplicação (com ECHO) eu observei que o número da linha que ele considera quando acionado o ajax é sempre o número da última linha do grid, independentemente da linha em que eu clico para executar o ajax.
A pergunta é, após o grid carregado, em um evento ajax (click ou focus) eu tenho como recuperar o número da linha em que eu clickei para poder usar o id da alternativa guardado no array, indexado pelo número da linha?
Outra coisa, como eu não sei qual o ciclo da informação eu pergunto, eventos ajax desse tipo (onclick ou onfocus – não é o caso de onchange por que o conteúdo não está sendo alterado) tem escopo de aplicação? Ou seja, podem ser usados para substituir um procedimento que, teoricamente, deveria estar no evento onBeforeupdate?
Recorro a vocês porque não há nada nos manuais Caso tenham uma abordagem melhor, peço um briefing de qual seria.
Obrigado.
Azeredo não sei se entendi muito bem, veja se o que precisa é como apresentado no GIF
se for eu posto como fazer
Caso seja útil segue a solução
Crie um campo (linha) do tipo texto e habilite para escondê-lo
Vá no onLoadRecord e insira o seguinte código
{linha} = $sc_seq_vert;
Desta forma o campo irá armazenar o número da linha
Crie um campo do tipo texto e habilite a opção “Campo Label”
Crie o evento ajax onClick para o campo, no código use {linha} para obter o número da linha clicada
Vá no onLoadRedord e coloque o seguinte código
{meu_campo} = “<a href=’#’ style=‘text-decoration: none;’ onclick=‘do_ajax_nome_da_sua_aplicacao_event_meu_campo__onclick($sc_seq_vert)’> <img src=’…/_lib/img/scriptcase__NM__ico__NM__about_24.png’ border=‘0’ > </a>”;
Graeffs, obrigado pela dica. Vou tentar. Ocorre que neste meio tempo eu resolvi fazer uma aplicação alternativa, uma aplicação tipo CONTROLE que acabou ficando mais simples com a funcionalidade que eu precisava. On click no campo ativando a função de alteração que eu precisava. A aplicação tipo controle resolveu um problema que eu tinha na aplicação tipo Formulário Grid editável que era “bypassar” a etapa do “onBeforerUpdate” ou “onAfterUpdate”. Me parece que o ciclo da informação não permite que se faça o update no campo fora desses pontos. Toda vez que tentei fazer essa burla bypassando o campo ele diz que executou o ajax mas não sensibiliza as bases. Pode ser “merda” minha, mas como a documentação é outra, não dá pra saber. A aplicação CONTROLE te dá mais controle sobre isso, mas você precisa ser um “mago” para gerar a interface porque dá um trabalho “do Carvalho” para ajustá-la. De qualquer forma obrigado.
Azerero, se você está utilizando comandos INSERT ou UPDATE nos eventos, fazendo algum redirecionamento ou coisa do tipo talvez seja interessante colocar o sc_commit_trans() no inicio do AfterUpdate ou Insert, para efetivar a transação do banco.