[RESOLVIDO]Botão Run não processa todos registros marcados

Olá,

O Jailton me passou um exemplo para o botão Run fiz e ficou dessa forma:

onScriptInit

// BOTÃO RUN
[x] = 0;
[registro_selecionados] = array();

OnRecord

$arr=[x];
[registro_selecionados][$arr]={Id}; // Campo da Grid
[x]++;

// Atualiza saldo do lançamento

$update_table = ‘lanctos’;
$update_where = “Id = ‘{Id}’”;
$update_fields = array(
“saldo = saldo - {Valor}”
);

$update_sql = ‘UPDATE ’ . $update_table
. ’ SET ’ . implode(’, ', $update_fields)
. ’ WHERE ’ . $update_where;
sc_exec_sql($update_sql);

// ==============================================================

// Atualiza saldo do conta corrente

$dtlan = date(‘Ymd’);

$update_table = ‘cta_corrente’;
$update_where = “cc_id = ‘{cc_id}’”;
$update_fields = array(
“cc_saldo_atual = cc_saldo_atual - {Valor}”,
“cc_dt_ult_lanc = ‘$dtlan’”
);

$update_sql = ‘UPDATE ’ . $update_table
. ’ SET ’ . implode(’, ', $update_fields)
. ’ WHERE ’ . $update_where;
sc_exec_sql($update_sql);

}

// ========================================================

$_historico_a = ‘Pagto do valor total do documento’;
$dtlan = date(‘Ymd’);

$insert_table = ‘lanctos_bx’;
$insert_fields = array(
‘id’ => “’{Id}’”,
‘cc_id’ => “’{cc_id}’”,
‘data’ => “’$dtlan’”,
‘valor’ => “’{Valor}’”,
‘historico’ => “’$_historico_a’”,
‘empresa_id’ => “’{empresa_id}’”
);

$insert_sql = ‘INSERT INTO ’ . $insert_table
. ’ (’ . implode(’, ‘, array_keys($insert_fields)) . ‘)’
. ’ VALUES (’ . implode(’, ', array_values($insert_fields)) . ‘)’;

sc_exec_sql($insert_sql);

// ============================================================

// Lançamento do pagamento do documento

$_historico_b = ‘Pagto do valor doc. num. ‘.{Doc}.’ de ‘.{nome_parc}.’.’;

$insert_table = ‘mov_ccorrente’;
$insert_fields = array(
‘cc_id’ => “’{cc_id}’”,
‘data’ => “’$dtlan’”,
‘valor’ => “’{Valor}’”,
‘historico’ => “’ $_historico_b’”,
‘tipomov_id’ => “‘2’”,
‘empresa_id’ => “’{empresa_id}’”
);
// Insert record
$insert_sql = ‘INSERT INTO ’ . $insert_table
. ’ (’ . implode(’, ‘, array_keys($insert_fields)) . ‘)’
. ’ VALUES (’ . implode(’, ', array_values($insert_fields)) . ‘)’;

sc_exec_sql($insert_sql);

sc_commit_trans();

onFinish

$qtde_registros=count([registro_selecionados]);
for ($_x=0; $_x<$qtde_registros; $_x++) {
$_Id = [registro_selecionados][$_x];

No botão Run tenho dois updates e dois inserts ambos em outras tabelas, quando seleciono um registro ele faz corretamento, porém quando seleciono mais que um ele só faz o último registro selecionado.

Olá,

Faça os UPDATEs e INSERTs no OnFinish, dentro do FOR…NEXT

1 Curtida

Olá Kleyber,

Procurei no Fórum e não vi nada que me desse condição de fazer esse For … Next.

Tenho várias aplicações no meu SC mas precisamente onde vou achar eu não sei.

Teria como me enviar um exemplo, só o início o meio e o fim que vai no onFinish de resto eu me viro.

Agradeço.

Seria mais ou menos assim:
OnFinish:

for ($_x=0; $_x<$qtde_registros; $_x++) {
    $_Id = [registro_selecionados][$_x];
   $update_table = ‘lanctos’;
   $update_where = “Id = $_Id”;
   $update_fields = array(
   “saldo = saldo - {Valor}”
   );

   $update_sql = ‘UPDATE ’ . $update_table
   . ’ SET ’ . implode(’, ', $update_fields)
   . ’ WHERE ’ . $update_where;
   sc_exec_sql($update_sql);
}

A partir daí você pode montar os demais, sempre dentro do FOR, ok?

1 Curtida

Valeu Kleyber, obrigado!

Olá,

Não fez o insert correto porque será?

Na Grid os 3 registros selecionados:

O que processou:

Não processou direito porque você colocou o campo {Id} e não a variável $_Id. Entenda que a variável $_Id é que contém cada um dos IDs dos registros selecionados. Tem que ser assim:

’id’ => “$_Id”,

Olá Kleyber,

Já tinha tentado dessa forma e não deu, tentei agora e retornou os dois registros somente.

Olá Kleyber,

Refiz alguns itens e ficou assim agora:

Coloquei em OnRecord:

OnFinish coloquei esse código que me dá informação no final do processo:

A base da grid é o mesmo: 3 registros marcados.

Informação do processamento - OnFinish
4-Tela

Agora, em OnRecord - retorna os 3 registros:

Porém :
O primeiro não foi (R$ 3.252,20 - 326222 - 01/01);
O segundo foi e é o primeiro no BD (R$ 6.000,00 - 326230 - 01/01);
O terceiro foi em duplicidade no BD (R$ 7.000,00 - 32522 - 01/01);

Complicado, mas no OnRecord funcionou melhor.

Bem, vamos aos fatos:

1 - Você percebeu que no OnFinish retornou pra você os IDs corretos a serem gravados, certo? Isso significa que o teu código de UPDATE ou de INSERT precisa ficar mesmo no OnFinish

2 - Refaça o INSERT dentro do FOR no OnFinish. Se for o caso, desmembre o INSERT e coloque manualmente os campos e os valores ou então dê um ECHO no INSERT que é gerado e veja como está sendo gerado.

Oi, desculpe me intrometer :slight_smile: mesmo por que sou novato na ferramenta e estou aprendendo aqui

o for no onrecord não esta errado?
image

no onfinish acho que tudo bem, mas o onrecord vai fazer registro a registro, colocando o for nele ele vai fazer todos a cada linha, se selecionar 3 ele vai rodar o for 3 vezes para cada registro, ou não?

Olá, Jair

Estou apanhando ainda nessa matéria, ainda não deu certo. No OnRecord não deu, voltei para o OnFinish.

Olá,

O mais perto que cheguei:

$tot = count([total_chked]); // Contagem do total de registros selecionados.
$_Id = $tot." Registros selecionados: "; // Atualiza saldo do lançamento

for ($_x=0; $_x<$tot; $_x++) {
$_Id = [total_chked][$_x];

$_historico_a = ‘Receb. do valor total do documento’;
$dtlan = date(‘Ymd’);

   $sql_bx = "INSERT INTO lanctos_bx (id,cc_id,data,documento,valor,saldo_rest,historico,empresa_id)
       VALUES('$_Id','{cc_id}','$dtlan','{documento_g}','{Valor}','0','$_historico_a','{empresa_id}')";	   
   sc_exec_sql($sql_bx);   

}

Os 3 registros com a sequencia de ID porem só pega dados do último registro.

Bem, observando melhor tua rotina, entendi o porque de não inserir os demais dados corretamente. Ele está inserindo somente o ID porque é somente o ID que você está pegando para inserir… Tens que fazer um sc_lookup com cada ID recebido dentro do FOR pra buscar os demais dados e aí sim, colocar os dados no INSERT, pra resolver o teu problema.

Olá Kleyber,

Deu certo, valeu obrigado!

1 Curtida