Persistir marcação das CheckBoxes da Consulta

Boa tarde Pessoal !
Daniel, tem algum exemplo onde seja utilizado um checkbox para fazer a seleção da consulta ?
Preciso criar uma seleção onde o usuário irá marcar quais veiculos irá utilizar para verificação de metas…
Montei o layout da seguinte forma, estou consultando os veiculos ativos e que seriam base para essa medição que tenho no cadastro de veiculos do Avacon…

Ai com o Checkbox queria jogar eles para a tabela do lado… e de lá vou utilizar no restante das telas para fazer os calculos das metas deles…
Minha principal dúvida é como “jogar” eles para lá e ter uma marcação de que aquele veiculo está ativo para validações em metas de acompanhamento…

Não sei se consegui transmitir a ideia do que queria fazer…

Olá @josimar.picoloto

Pense da seguinte forma: Você não vai mandar os registros de uma Grid para outra, mas sim ocultar de um lado, e mostrar do outro, através de condições nos comandos SQL.

Vou sugerir uma implementação básica a seguir, aí você completa com o que precisar.

Persistir a CheckBox

A primeira coisa a se fazer é gravar o valor da CheckBox no banco de dados. Neste caso, para não precisar criar colunas em uma tabela que já existe, vamos criar uma tabela nova apenas para gravar o valor das checagens. Vamos deixar preparado para gravar qualquer tipo de checagem:

CREATE TABLE marcacoes
(
   rotina      TEXT NOT NULL,
   chave       TEXT NOT NULL
);
ALTER TABLE marcacoes ADD CONSTRAINT pk_marcacoes_rotina_chave (rotina, chave);

Quando o registro estiver na tabela, significa que está marcado. Se não estiver, é porque está desmarcado.

Coluna Descrição
rotina Nome da rotina / operação / entidade.
chave Chave lógica da rotina / operação / entidade

No seu caso, você poderia gravar assim:

Coluna Valor Comentários
rotina VEICULO_META Valor fixo que identifica a sua rotina
chave IPY4D79 Placa do veículo

Abaixo um exemplo de como inserir na tabela quando o registro for marcado, evitando dupliciades:

INSERT INTO marcacoes (rotina, chave)
   SELECT 'VEICULO_META', v.placa
   FROM veiculo v
   WHERE v.placa = '{?QUERY placa}'
   AND NOT EXISTS (SELECT 1 FROM marcacoes m WHERE m.chave = v.placa)

Para fazer a gravação na Consulta, basta adicionar o Comando SQL abaixo e vincular como referência interna em no Link da coluna usada como CheckBox:

--#IF {?QUERY coluna_checkbox} = 1

INSERT INTO marcacoes (rotina, chave)
   SELECT 'VEICULO_META', v.placa
   FROM veiculo v
   WHERE v.placa = '{?QUERY placa}'
   AND NOT EXISTS (SELECT 1 FROM marcacoes m WHERE m.chave = v.placa)

--#ELSE

DELETE FROM marcacoes 
WHERE rotina = 'VEICULO_META' 
AND chave = '{?QUERY placa}'

--#ENDIF

No Comando SQL acima, com a ajuda das condições de pre-execução de SQL, implementamos a inserção e exclusão da marcação conforme o valor da coluna CheckBox (1-true e 0-false).

Selecionar os registros marcados

Para selecionar apenas os registros que foram marcados, basta juntar a tabela de veículos com a tabela de marcações usando um INNER JOIN:

SELECT 
   v.*
FROM veiculos v
-- Este JOIN faz com que apenas os veículos marcados sejam exibidos
INNER JOIN marcacoes m ON m.rotina = 'VEICULO_META' AND m.chave = v.placa

Para selecionar todos os veículos, e saber quais foram marcados, basta juntar as tabelas usando um LEFT JOIN:

SELECT 
   v.*,
   -- Se houver qualquer valor na chave, 
   -- significa que o JOIN encontrou a marcação. 
   -- Neste caso, retorna "true"
   (m.chave IS NOT NULL) AS marcado
FROM veiculos v
-- Este JOIN faz com que apenas os veículos marcados sejam exibidos
LEFT JOIN marcacoes m ON m.rotina = 'VEICULO_META' AND m.chave = v.placa
2 curtidas

Olá Daniel!
Grato pela ajuda até o momento já consegui evoluir bastante na tela, porém estou enfrentando dificuldades nesse ponto, ou seja, ao selecionar o checkbox ele não está fazendo a insersção na tavela de controle…

Porém não consegui identificar o problema, os testes que realizei fora: Se eu rodar o insert trocando apenas o ‘{?QUERY placa}’ ele faz a insersão, porém se for pelo check box não,

Tens algum dica de onde posso estar cometendo o erro ?

@josimar.picoloto, eu criei este exemplo usando o modo legado de valores booleanos, (0 e 1)

image.

Se essa opção estiver desmarcada na sua Consulta, faça a condição da seguinte forma:

--#IF {?QUERY marcado} 

--#ELSE

--#ENDIF

A opção até estava marcada…
tentei desmarcar e então testar da outra maneira porém sem sucesso também…

Nestes exemplos que criei, o nome da coluna é “marcado”. Você usou este mesmo nome?

Tente colocar isso no início do Comando SQL (antes das condições):

-- Marcado: {?QUERY marcado}

Aí então habilite o Log de Usuário e veja como o SQL está sendo executado. Pode postar aqui os comandos para verificarmos.

Dani, Segue logs…
Parametros da consulta:

image

Consulta:

Select
'' AS leg_ativoinativo
,'' AS leg_tipodefrota
,veiculo.tipofrota as tipofrota
,veiculo.placa as placa
,marcaveiculo.descricao as marca
,marcaveiculo_modelo.descricao  as modelo
,veiculo.anofabricacao as ano


,veiculo.ativoinativo
,veiculo.proprietario 
,veiculo.empresa 
,(silvestrin.checkmarcacoes.chave IS NOT NULL) AS marcado

from veiculo

LEFT JOIN   silvestrin.checkmarcacoes
ON silvestrin.checkmarcacoes.rotina = 'VEICULO_META'
AND silvestrin.checkmarcacoes.chave = veiculo.placa

left join marcaveiculo 
on marcaveiculo.codigo = veiculo.marcaveiculo 

left join marcaveiculo_modelo
on marcaveiculo_modelo.codigo = veiculo.modeloveiculo 

where veiculo.tipofrota = 1
and veiculo.tipoveiculo = 'CVTR'
and veiculo.ativoinativo = 1
and veiculo.empresa = 1

order by veiculo.placa

SQL do Checkbox:

-- Marcado: {?QUERY marcado}

--#IF {?QUERY marcado} = 1

INSERT INTO silvestrin.checkmarcacoes (rotina, chave)
   SELECT 'VEICULO_META', v.placa
   FROM veiculo v
   WHERE v.placa = '{?QUERY placa}'
   AND NOT EXISTS (SELECT 1 FROM silvestrin.checkmarcacoes m WHERE m.chave = v.placa)

--#ELSE

DELETE FROM silvestrin.checkmarcacoes
WHERE rotina = 'VEICULO_META' 
AND chave = '{?QUERY placa}'

--#ENDIF

LOG:


**************************** Sql Command ****************************

-- Marcado: NULL



DELETE FROM silvestrin.checkmarcacoes
WHERE rotina = 'VEICULO_META' 
AND chave = 'IQY1A39'

Boa Tarde @josimar.picoloto

Estive estudando este caso e acho que descobri um Bug.

Pelo fato das Condições de pre-execução de SQL serem declaradas dentro de comentários de linha do SQL, o sistema não considera necessário levar do Browser para o Servidor o valor das colunas que estão sendo utilizadas nas condições. Neste caso, as condições só funcionam quando os valores utilizados no teste também são usados em alguma parte do Comando SQL.

Para contornar este problema, tente adicionar o valor da coluna “marcado” no comando SQL apenas para que o valor seja enviado ao servidor no momento da checagem, e me avise se funcionou.

Exemplo:

--#IF {?QUERY marcado} = 1

INSERT INTO silvestrin.checkmarcacoes (rotina, chave)
   SELECT 'VEICULO_META', v.placa
   FROM veiculo v
   WHERE v.placa = '{?QUERY placa}'
   AND NOT EXISTS (SELECT 1 FROM silvestrin.checkmarcacoes m WHERE m.chave = v.placa)

--#ELSE

DELETE FROM silvestrin.checkmarcacoes
WHERE rotina = 'VEICULO_META' 
AND chave = '{?QUERY placa}'

--#ENDIF

-- A linha abaixo serve apenas para garantir que o valor da coluna será enviado para o servidor
;SELECT {?QUERY marcado} AS marcado
1 curtida

Dani!
Agora funcionou!
Obrigado pela ajuda ai

1 curtida