Checkbox com uma inserção por linha

(Emerson Rodrigues) #1

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!

(system) #2

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

(Emerson Rodrigues) #3

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

(Haroldo) #4

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

(Emerson Rodrigues) #5

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.

(Rodrigo Lins) #6

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.

(Emerson Rodrigues) #7

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.

(Rodrigo Lins) #8

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.

(Emerson Rodrigues) #9

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.

(system) #10

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.

(Emerson Rodrigues) #11

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.

(Emerson Rodrigues) #12

Boa tarde pessoal,

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

Aguardo e agradeço a atenção.

(renatorfr) #13

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.

(Emerson Rodrigues) #14

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.

(renatorfr) #15

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.

(Emerson Rodrigues) #16

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…