[Resolvido] Gravar Linha Automaticamente

Ola Boa Tarde Companheiros de Fórum , depois de rebuscar y buscar mais umas 800 vezes, sem sucesso o jeito foi desvendar os mistérios dos códigos PHP gerados y chegar a minha solução então comparto com vocês caso seja útil para alguém… si for útil Comentem o resultado…
1- Formulário tipo (Grid Editavel View).

2- Necessidade = Gravar ao dar enter ou Tab (Onchange) do ultimo Campo. PS: so Gravar no meu caso o Usuario apenas grava sem edição em caso de Edição tem que tratar mais o código.

3- Criar um campo chamado linha do tipo Número, em modo invisível.

4- No evento onLoadRecord

{linha} = $sc_seq_vert;

a variável $sc_seq_vert esta guardando o Numero de linha.

5- Em Programação/ Criar un Novo Metodo Javascript no meu caso com o Nome de “atualiza” y incluir um parametro no meu caso “linha”, chamei linha para ficar mais fácil, eh que a função nm_atualizar_line pede 2 parametros, que tipo de atualização y em que linha.

findPos(this); nm_atualiza_line('incluir', linha); return false;

6- Criar um Evento Ajax no ultimo campo, ou no campo em que voçes querem que grave ao ser modificado ou clicado ou perda de Focus Etc. y agreguem o seguinte código

$javascript_function = 'atualiza'; sc_ajax_javascript($javascript_function,{linha});

Y pronto…

Obrigado por compartilhar.

Aqui também tem uma solução interessante, que me salvou na época, dada pelo usuário MikeC:
http://www.scriptcase.com.br/forum/index.php/topic,5028.msg22560.html#msg22560

Olá boa tarde, sou iniciante no ScriptCase.

Willian Fernando, estou tentando inserir a funcionalidade de gravar a linha com a tecla enter, como vc explicou acima, mas não deu certo, no meu caso o meu (Grid Editavel View) é um detalhe, onde fiz um form mestre/detalhe. Será que não está dando certo por isso?

Danielle, poste como você fez pra que possamos ver o que está errado. Não é por ser detalhe não.

1º Na aplicação form Grid editável(view) criei o campo linha do tipo número, em modo invisível.

2º No evento onLoadRecord
inseri:
{linha} = $sc_seq_vert;

3º criei um novo método javascript “atualiza”:

findPos(this); nm_atualiza_line(‘incluir’, linha); return false;

4º Criei um evento ajax onClik, Em “Escolha o Campo para criar um evento”, inseri o último campo da minha linha “numero_demanda”, e
não passei nenhum campo como parâmetro. E inseri o código abaixo:

$javascript_function   = 'atualiza'; 
sc_ajax_javascript($javascript_function,{linha});

Ao clicar em enter ou tab, a linha não salva.

Mais uma pergunta, qual é o tipo do último campo que você está tentando fazer isso? Se for campo do tipo select, não funciona. Pelo menos pra mim não funcionou.

é um campo do tipo numero.

Então no lugar do evento onClick, crie um evento Ajax para o campo onBlur com o mesmo código que você colocou no outro evento.

Mudei o evento Ajax para o onBlur e também não deu certo.

Obrigada Thyago Brasil.

Danielle boa tarde,

No método Javascript você passou o parâmetro indicado no primeiro post?

Boa tarde Kleyber,

inseri assim:

findPos(this); nm_atualiza_line(‘incluir’, linha); return false;

1º) Seu método javascript se chama assim: nm_atualiza_line?
2º) Fez a alteração que falei? Coloque no evento onBlur do campo e não no onClick

Deu certo utilizando somente a tecla tab, porém estou passando como parâmetro a linha 1 ai só funciona quando clico em novo para inseiri uma nova linha 1ª linha, mas e quando precisar inserir outras linhas no meu form de grid editavel(view), com umas 5 linhas, como eu chamaria esses parâmetros?

Tentei de tudo, mas não funciona, estou na v9…

1º Na aplicação form Grid editável(view) criei o campo linha do tipo número, em modo invisível.

2º No evento onLoadRecord
inseri:
{linha} = $sc_seq_vert;

3º criei um novo método javascript “atualiza”:

findPos(this); nm_atualiza_line(‘incluir’, linha); return false;

4º Criei um evento ajax onBlur, Em “Escolha o Campo para criar um evento”, inseri o último campo da minha linha “obs_produto” é um campo texto, e
não passei nenhum campo como parâmetro. E inseri o código abaixo:

$javascript_function   = 'atualiza'; 
sc_ajax_javascript($javascript_function,{linha});

Ao clicar em enter ou tab, a linha não salva.
Alguém pode me ajudar a resolver este problema…

Olá pessoal,
Alguém consegue me ajudar neste caso… Não acredito que seja problemas com o PHP 7…

Apague todo este código que você usou e use este:
Colocar o campo Linha junto com os da grid e marcar ele como ‘escondido’.

Criar em Metódos PHP > Checar_Linha:
if (empty({Linha})) {

/* Macro sc_lookup */	

$sql="
	SELECT
	   MAX(Linha)+1
	FROM
	   pedidos_itens
	WHERE 
	   PedidoID = [glo_PedidoID]
	ORDER BY
	   PedidoID, Linha
";

sc_lookup(chk_linha, $sql);

/* Erro no lookup */
if (FALSE === {chk_linha}) {
	sc_error_message("Ocorreu um erro no acesso ao banco de dados.<BR>");
}
elseif (empty({chk_linha})) { /* EOF */

   // CONTINUA...
   
} else {

   {Linha}={chk_linha}[0][0]};
}

} // if (empty({Linha}))

if (empty({Linha})) {
{Linha}=1;
}

Crie um Evento Ajax OnFocus para o primeiro campo Editável da Grid,
que o usuário vai passar por ele e coloque:
Checar_Linha();

No Onvalidate desta grid colocar:
Checar_Linha();

  • Grave uns itens e veja na tabela do banco de dados, que foi gerada a linha na sequência.

Observação caso o usuário excluir um item depois vai ficar números de linhas faltando,
mas, ai só você criar uma rotina para ajustar no evento OnAfterInsert, usando sc_select
e ordenando a sequência de ajuste em ORDER BY PedidoID, Linha e ir ajustando, linha a linha++;

Não entendi o sql… fiz a transposição para minha tabela, mas fiz a seguintes perguntas nas linhas abaixo…
if (empty({Linha})) {

/* Macro sc_lookup */

$sql="
SELECT
MAX(Linha)+1 //A LINHA É UM CAMPO VIRTUAL, POSSO COLOCÁ-LA ASSIM?
FROM
oslojadetalhe
WHERE
id_os = {id_os}
ORDER BY
id_os, Linha ////A LINHA É UM CAMPO VIRTUAL, POSSO COLOCÁ-LA ASSIM?
";

Outra coisa, após gerar a aplicação aparece o seguinte erro:
Parse error: syntax error, unexpected ‘}’ in C:\Program Files (x86)\develop\v9\wwwroot\scriptcase\app\SistemaXX\form_osLojaDetalhe\form_osLojaDetalhe_apl.php on line 6439

Vai ter que criar no banco de dados mesmo na tabela oslojadetalhe um Novo Campo, crie nela o campo: Item = Inteiro(11).

Depois entre nesse form oslojadetalhe, sincronize a aplicação para ele puxar o novo campo, selecione o campo Item, é para ficar
na tela junto com os outros, e esconda ele se quiser é opcional pode ficar na tela para o usuário ver que No. de Item que
esta editando.

Veja se você já tem no pai, que faz a chamada para este detalhe uma global, amarrando o pai ao detalhe, no exemplo eu usei:
[glo_id_os] baseado na sua tabela oslojadetalhe.

No Pai > Evento Onload:
[glo_id]={id_os}; // Marcar como variável de Saída.

Ai use esta rotinas no form_oslojadetalhe:

AJUSTAR SEQUÊNCIA DE ITENS NO PEDIDO
prevendo se o usuário excluir um item, a rotina corrige, automáticamente.

Criar em Programação > Metódos PHP > Novo Metódio: UltimoItem:
/* Macro sc_lookup */

sc_lookup(ultimo_nro, "
SELECT
MAX(Item)+1
FROM
oslojadetalhe
WHERE
id_os=[glo_id]
ORDER BY
id_os
");

{Item}={ultimo_nro[0][0]}; // Já retornou com o último número + 1.

if (empty({Item})) {
{Item}=1;
}

Colocar no Evento Evento OnLoadRecord e no OnValidate:
UltimoItem();

Criar a Procedure no MySQL/MariaDB use o Heidi SQL:
https://www.heidisql.com/

DELIMITER |

CREATE PROCEDURE ajustar_oslojadetalhe(IN parametro1 int(11))

BEGIN
	SET @Item=0;
	UPDATE 
		oslojadetalhe
	SET
		Item=@Item:=@Item+1
	WHERE
	    id_os = parametro1
	ORDER BY
	    id_os, Item;
END|

DELIMITER ;

// Colocar a Procedure em OnAfterDelete:

$sql="
call ajustar_oslojadetalhe([glo_id])
";

sc_exec_sql($sql);

Fiz tudo como orientou, exceto a variável global, pois como sendo mestre/detalhe eu já passo a ‘id_os’ para o detalhe.
Outra coisa que fiz foi fazer um evento ajax onFocus chamando o evento ‘UltimoItem();’ no primeiro campo que tenho que lançar valores, no qual é ‘quantidade’, mas nada aconteceu…

Como ficou esse seu código, checou se na hora que chama ele executando corretamente? teste no OnLoadRecord com echo.

sc_lookup(ultimo_nro, "
SELECT
MAX(Item)+1
FROM
oslojadetalhe
WHERE
id_os=[glo_id_os]
ORDER BY
id_os
");