Persistir marcação das CheckBoxes da Consulta

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