Grid com checkbox + botão com função de duplicar registro

Alguem já teve a necessidade de criar uma grid com um campo checkbox, para que o usuário possa escolher quais registros duplicar.

Mas os registros não possuem chave unica, a chave é composta de 4 campos. Vou explicar melhor.

tenho uma tabela plano, onde existem n campos, dentre eles os 4 primeiros são inteiros e compõe a chave:

#Depto(int 3)
#Curso(int 4)
#Disciplina(int 7)
#Ano_Letivo(int 4)
.
.
.

Preciso duplicar os registros que os usuários marcarem o checkbox, apenas alterando o ano_letivo, para o ano corrente. Tipo o registro é do ano 2009, teria uma copia idêntica para o ano de 2010.
Não sei como fazer isso no scriptcase. Se alguem tiver a dica, por favor me ajude.

Boa Tarde,

Eu não olhei o que você me enviou ainda, mas creio que uma forma seria como lhe expliquei mesmo. Fazendo um formulário Multiplo Registro, deixando todos os campos como Readonly, e criando um campo do tipo checkbox, para selecionar os registros e armazenar na tabela.

Uma outra forma seria fazer tudo em um controle mesmo, mostrar algumas informações dos registros em vários checkbox e a pessoa selecionar se deseja ou não duplicar o registro, pode ser que seja até mais fácil e simples.

Mas, creio que alguém já tenha feito algo parecido e que tenha uma idéia melhor. É sempre interessante ver outra opiniões e soluções.

Rodrigo Lins.

Olá, bom dia!

Interessante a questão, já vi outras mensagens com a mesma dúvida… Não testei aqui, mas imagino que seria algo assim:

1º - Criar um campo texto na consulta, inserindo manualmente o checkbox com array dos valores;
2º - Criar uma aplicação blank para tratar e duplicar os registros;
3º - Fazer a ligação entre a consulta e a apl blank, enviando o array como parâmetro

Exemplo:

  • Na consulta, criar um campo Texto (ex: nome “check”) e um botão do tipo Ligação (ex: nome “duplicar”)

  • No Evento OnRecord da consulta:
    [tt]
    $valor = {Depto}."/".{Curso}."/".{Disciplina}."/".Ano_letivo;
    // Exemplo de valor armazenado: “121/1058/5945557/2009”
    {check} = “”;
    [/tt]

  • Criar uma ligação pro botão “duplicar”, apontando pra aplicação blank e enviando $opt como parametro


  • Aplicação Blank (ex: ctt.php):

[tt]
/**

  • Criar função duplicar -> Confere dados e realiza a duplicação.
  • Recuperar valores de $opt
  • Separar cada registro selecionado na consulta
  • Separar os campos por “/”
  • Chamar a função de duplicação
  • Conferir se todos forem alterados (retorna para consulta ou mostra erros)
    */

function duplicar($depto,$curso, $disc, $ano, $ano_n)
{
sc_lookup(sqlcont, “SELECT COUNT(*) FROM tabela WHERE Depto = ‘$depto’ AND Curso = ‘$curso’ AND Disciplina = ‘$disc’ AND Ano_Letivo = ‘$ano’”);
if (empty({sqlcont}) || {sqlcont}[0][0] == 0)
{
$erro = "- Falha ao localizar registro: $depto / $curso / $disc / $ano
";
return $erro;
}
else
{
sc_exec_sql(“INSERT INTO tabela (Depto, Curso, Disciplina, Ano_Letivo, …) VALUES ($depto, $curso, $disc, $ano_n, …)”);
// adicionar outros campos necessários
return true;
}
}

$campo = [opt];
$qtde = count($campo);
if ($qtde === 0)
{
// nenhum campo selecionado
sc_redir(consulta.php);
}

$msg = “”;
for ($i = 0; $i < $qtde; $i++)
{
$ef = explode("/", $campo[$i]);
$depto = trim($ef[0]);
$curso = trim($ef[1]);
$disc = trim($ef[2]);
$ano = trim($ef[3]);
$ano_n = date(‘Y’);
$dup = duplicar($depto, $curso, $disc, $ano, $ano_n);
if ($dup != true)
{
// se a função não retornar ‘true’, armazenar os erros na variavel msg
$msg .= $dup;
}
}

// se a variavel msg estiver vazia, redirecionar para consulta, senão, mostrar os erros.
if ($msg == “”)
{
sc_commit_trans(); // apenas se usar transactions (mysql)
sc_redir(consulta.php);
}
else
{
echo " Erros ao duplicar registros:

";
echo $msg;
echo “
Voltar”;
}
[/tt]

Acho que a idéia é mais ou menos isso aí…
Com certeza existem erros no código, precisa corrigi-lo e também adaptá-lo conforme suas necessidades, mas espero ter ajudado de alguma forma…

Att.
Robson

Bom Dia,

Robson, você conseguiu pegar o valor que está no “checkbox” da consulta, em alguns testes rapidamente que fiz, não consegui de forma alguma pegar este valor na aplicação de consulta. Vou tentar utilizar este seu código para testar.

E com relação a dúvida do Fulvio, eu passei um email para ele falando de uma possível solução que peguei com um companheiro. Fiz em uma aplicação de formulário Múltiplo Registros, coloquei todos os campos como Label e criei um novo campo do tipo texto.

No evento onLoadRecord, foi colocado o seguinte código:

{check} = “”;

E por fim, criado um botão php para fazer o processamento desejado com o valor proveniente do checkbox criado.

Exemplo do código do botão:

if(isset($_POST[‘cor’])) {
// Faz um loop no Array de checkbox
// A função count retorna a quantidade de checkbox selecionado

         for($i = 0; $i < count($_POST['cor']); $i++) {

$valor = $_POST[‘cor’][$i];
sc_lookup(ds,“SELECT id, nome, cidade FROM tb_qualquer WHERE id = $valor”);

$nome = {ds[0][1]};
$cidade = {ds[0][2]};
sc_exec_sql(“INSERT INTO tb_qualquer_duplicata (id,nome,cidade) VALUES ($valor,’$nome’,’$cidade’)”);

         }
 }    
     sc_exit(sel);

Rodrigo Lins.