Checkbox com uma inserção por linha

Boa tarde a todos!

Gostaria que alguém me informasse se com o ScriptCase eu consigo realizar a seguinte situação usando o campo Checkbox.

Tenho uma tabela no banco que funciona da seguinte forma:

procedimento desejado
ID resposta
1 0
1 2
1 3
1 4
2 1
2 2
2 3
2 4

O que ocorre acima é o seguinte: para cada ID eu posso ter mais de uma resposta, por isso na coluna ID os números 1 e 2 se repetem. Mas ao utilizar o checkbox com opção de Lookup Múltiplos Valores (delimitador), consigo somente realizar inserção de valores diferentes, separados por ;(ponto e virgula) e na mesma linha ficando da seguinte forma:

procedimento indesejado
ID resposta
1 0;2;3;4
1 1;2;3;4

Existe alguma forma de realizar o procedimento desejado deste tópico utilizando o ScriptCase? Quem puder me ajudar eu agradeço muito agradecido. Até logo!

Emerson,
Você pode fazer isso utilizando o recurso Atualizar Tabela de Ligação, dentro de um formulário. Basta seguir o passo-a-passo que o SC fará automaticamente para você os Inserts, Updates e Deletes.

Abs

Amigo, desde o dia que vc respondeu essa minha dúvida eu estou tentando realizar esse procedimento mas não consegui. Você não teria um tutorial para mim? Aguardo resposta

Olha, to aqui tetando entender seu problema, mas esta difícil, é possível sim incluir valores repetidos via checkbox mult, pelo menos manualmente eu consegui fazer isso. E a resposta do colega NoP também não sei oque tem a ver com o assunto.
Exemplifique melhor seu problema.

Haroldo Passos
http://www.scriptcaseajax.com.br

Vou tentar exemplificar melhor o meu problema. Tenho a seguinte tela:

Cada Checkbox tem um valor pré-definido, que no caso acima são os números antes da descrição do checkbox.

Eu necessito que ao marcar os checkbox e clicar no botão enviar, os valores sejam inderidos todos de uma vez, mas um em cada linha, e cada valor seria identificado pelo campo id. Então nesse exemplo, os valores deveriam ficar no banco como abaixo: vale lembrar que se não for marcado o checkbox, deverá também inserir um calor, só que deve ser o valor 0 (zero).

id valor
22 0
22 0
22 3
22 4
22 5
22 6
22 0

O máximo que eu estou conseguindo, é fazer a inserção desses dados separados por ; (ponto e vírgula), ficando assim:

id valor
22 3;4;5;6

Como pode perceber acima, nem o zero eu estou conseguinto inserir como valor defaut, caso não seja marcado o checkbox.

Será q eu consigo fazer isso utilizando o ScriptCase? Aguardo resposta e agradeço a atenção.

Pelo que entendi seria pegar o id “22” ficar repetido e pegar os valores separadamente.

É só no evento onBeforeInsert, utilizar a função explode do php, para desmembrar os valores do campo, para no caso ficar valores separados e não mais com as vírgulas.

Depois disso é só fazer um laço (for) para percorrer e dar os inserts (com macro sc_exec_sql) na quantidade de registros que tiver.

Espero ter ajudado.

Rodrigo Lins.

Olá amigo, ajudou sim, mas ainda tenho algumas dúvidas:

Como não conheço muito de php, fui até a página php.net e olhei a documentação da função explode.
Então pude entender o seguinte:

<?php $pizza = "piece1 piece2 piece3"; //o que eu coloco aqui para substituir essa string? $pieces = explode(" ", $pizza); //aqui eu irei substituir o espaço em branco por ;(ponto e vírgula). echo $pieces[0]; // o que eu coloco aqui para fazer a inserção no banco? ?>

Será que alguém pode me ajudar ainda mais com isso??? Obrigado pela atenção.

Boa,

Existem alguns detalhes no seu código e comentário, não está muito bem entendido o uso dele.

01: $pizza = “piece1 piece2 piece3”; //o que eu coloco aqui para substituir essa string?
02: $pieces = explode(" ", $pizza); //aqui eu irei substituir o espaço em branco por ;(ponto e vírgula).
03: echo $pieces[0]; // o que eu coloco aqui para fazer a inserção no banco?

Na linha 01 seria o que vem do campo valor do scriptcase, é a forma original. No seu caso ele irá vir separado por “ponto e vírgula”.

Na linha 02 estamos “desmembrando” separando, os valores da variável $pizza, para cada um ser indendente, estamos dividindo a string. Que no seu caso seria o ponto e vírgula.

Na linha 03 está sendo somente mostrado uma saída, e mostrando a posição 0, no caso vai mostrar o primeiro elemento que é ‘pieces’. No seu caso tem que ser utilizado a macro sc_exec_sql para dar um comando INSERT na tabela desejada.

Um outro exemplo, seria o seguinte:

<?php $pizza = "piece1;piece2;piece3"; //Valor separado por ponto e vírgual $pieces = explode(";", $pizza); foreach($pieces as $value) { echo "Valor: $value
\n"; } ?>

Se você executar este código verá que a saída será:

Valor: piece1
Valor: piece2
Valor: piece3

Para o seu caso seria necessário substituir o “echo” pelo comando INSERT.

Exemplo:

sc_exec_sql(“INSERT INTO tabela (valor) VALUES ($value)”); //MAcro do scriptcase

Este comando estaria dentro do “foreach”.

Espero ter ajudado.

Rodrigo Lins.

Boa Tarde Rodrigo,

A parte final do seu exemplo eu até entendi, o que quero saber agora é como eu faria para substituir os dados de entrada deste exemplo (piece1;piece2;piece3) pelos meus campos do checkbox. Tenho itens Checkbox de 1 até 8, como vou inseri-los. Aguardo resposta.

Só basta colocar o nome do campo que checkbox, entre chaves {}, no lugar dos valores definidos.
Ex: $pizza = {campoCheckBox};–> dessa forma irá trazer uma string com o separador o vc setou.
Em seguida basta seguir a idéia do Rodrigo.

Pessoal o meu código ficou assim:

$pizza = {a1}; //Esse é o nome do campo onde estão os checkbox $pieces = explode(";", $pizza); foreach($pizza as $pieces) { sc_exec_sql("INSERT INTO public.partea_a1 (a1) VALUES ($pieces)"); }

Inseri o código acima dentro da função “Eventos => onBeforeInsert”. Rodei a aplicação e ate ai funcionou tudo certinho. Selecionei os campos checkbox que gostaria de inserir no banco e quando cliquei no botão + (incluir registro) apareceu o seguinte erro:

[center]ERRO
Invalid argument supplied for foreach()
ERRO
Erro ao incluir na base de dados:
ERROR: syntax error at or near “;” at character 96
INSERT INTO public.partea_a1 (idpartea_a1, a1) VALUES (1, 1;2;3;4;5;6;7)
[/center]

Alguém consegue desvendar esse mistério para mim? Já tentei tudo que eu conheço e nada. Aguardo resposta e agradeço a atenção de todos.

Boa tarde pessoal,

Será que alguém conseguiu desvendar esse problema para mim?

Aguardo e agradeço a atenção.

1-$pizza = {a1}; //Esse é o nome do campo onde estão os checkbox
2-$pieces = explode(";", $pizza);
3-foreach($pizza as $pieces) {
4-sc_exec_sql(“INSERT INTO public.partea_a1 (a1) VALUES ($pieces)”);
5-}

emerson, só dando uma corrigida no seu código, eu numerei as linhas para ficar mais fácil, na linha 3 o correto dentro dos () seria $pieces as $value e na linha 4 o VALUES do seu SQL utiliza o $value.

Opa amigo agradeço a paciência…

Fiz as alterações que me disse, mas mesmo assim ao tentar inserir os dados aparece o seguinte erro:

[center]ERRO
pg_query() [function.pg-query]: Query failed: ERROR: null value in column “idpartea_a1” violates not-null constraint
ERRO
Erro ao acessar o banco de dados
ERROR: null value in column “idpartea_a1” violates not-null constraint
INSERT INTO public.partea_a1 (a1) VALUES (1)[/center]

O pessoal do suporte da Scriptcase me deu a sugestão de usar um “for” simples. Ao implementar e executar a plicação também da erro. O erro que aparece ao executar a aplicação é:

Parse error: syntax error, unexpected T_VARIABLE in C:\Arquivos de programas\netmake\v4\wwwroot\scriptcase\app\Questionarios\parte_a\parte_a_apl.php on line 1289

O código que eu utilizei foi o seguinte:

$pizza = {a1}; //Esse é o nome do campo onde estão os checkbox
$pieces = explode(";", $pizza);
$total= count($pieces);
for($i=0;$i<$total;$i++) {
sc_exec_sql(“INSERT INTO public.partea_a1 (a1) VALUES ($pieces[$i])”);
}

Alguma sugestão? Agradeço a atenção de todos.

1 Curtida

tem um detalhe, pelo visto vc tem um campi chamado idpartea_a1 no seu banco, ele é do tipo SERIAL? se for vc tem que fazer o insert da seguinte maneira INSERT INTO public.partea_a1 (idpartea_a1, a1) VALUES (DEFAULT, $pieces[$i]) para que o Postgre pegue o próximo valor da sequence e coloque no campo idpartea_a1.

o erro de parse que esta aparecendo precisa ver qual é a linha do erro (1289) precisa abrir o código fonte do arquivo parte_a_apl.php (vc vai em exibir -> código fonte e seleciona o arquivo que você quer ver) e procura a linha 1289, deve ter algum erro nela. qualquer coisa coloca a linha aqui para a gente dar uma olhada.

Bom esse campo existe realmente e ele é do tipo INT, mas eu defini ele como auto incremento tanto no banco como na aplicação do scriptcase. Teria algum problema?

Quanto ao erro q esta me retornanando é o seguinte:

1285| if (“incluir” == $this->nmgp_opcao) {
1286| $this->sc_evento = $this->nmgp_opcao;
1287| $SESSION[‘scriptcase’][‘parte_a’][‘contr_erro’] = ‘on’;
1288| $sc_temp
$i = (isset($_SESSION[’$i’])) ? $_SESSION[’$i’] : “”;
1289| $pizza = $this->a1 ;
1290| $pieces = explode(";", $pizza);
1291| $total= count($pieces);
1292| for($i=0;$i<$total;$i++) {

Isso ajuda em alguma coisa? Agradeço a atenção…