agosto 17, 2022 Ana Paula Novello
Buenas, hoje pela manhã vi em um fórum que muitos programadores não utilizam o
checklistbox por não saberem como usar ou não ver onde ele poderia ser aplicado.
Vamos num exemplo:
Temos um cadastro de produto, e esse produto pode ter vários grupos ou variações, então teremos de selecionar vários grupos para cada produto.
Então vamos fazer um exemplo simples, nele vamos inicializar o checklistbox com informações que teremos uma uma tabela do banco, isso será num botão.
Na função de gravar vamos colocar o comando para gravar o'que alteramos para o banco de dados.
Exemplo prático:
Vamos ter uma tabela chamada VARIACOES que ela terá CODIGO_VAIRACAO, DESCRICAO.
Vamos ter outra tabela chamada PRODUTOS_VARIACOES, nessa tabela vamos ter CODIGO_VARIACAO e CODIGO_PRODUTO.
Botão btnAbrirVariacoesClick vamos colocar um comando para limpar o checklistbox, após isso um SQL para trazer todas as variações e fazer vínculo com a tabela PRODUTOS_VARIACOES para ver quais já foram marcados, após isso vamos colocar um laço de repetição para poder preencher o checklistbox.
procedure TFSistemas.btnAbrirVariacoesClick(Sender: TObject);
begin
CheckListBox.Clear;
FDQuery1.Close;
FDQuery1.SQL.Text := 'select ('' '' || H.CODIGO_VARIACAO || '' - '' || H.DESCRICAO) as DESCRICAO,' +
' iif(AV.CODIGO_PRODUTO > 0, 1, 0) as MARCADO, H.CODIGO_VARIACAO' +
' from VARIACOES H' +
' left join PRODUTOS_VARIACOES AV on AV.CODIGO_VARIACAO = H.CODIGO_VARIACAO' +
' and AV.CODIGO_PRODUTO = ' + IntToStr(tbProdutosCODIGO_PRODUTO.asInteger) +
' order by H.DESCRICAO';
FDQuery1.Open;
FDQuery1.First;
while not FDQuery1.Eof do begin
CheckListBox.Items.Append(FDQuery1.FieldByName('DESCRICAO').AsString);
CheckListBox.Checked[FDQuery1.RecNo - 1] := FDQuery1.FieldByName('MARCADO').AsInteger = 1;
FDQuery1.Next;
end;
end;
Nossa tela esta ficando assim.
Vamos para o botão btnSalvarVariacoes agora:
procedure TFSistemas.btnSalvarVariacoesClick(Sender: TObject);
var
lString,
lCodigo: String;
li: Integer;
begin
lString := EmptyStr;
{Verifica as variações que estão marcadas e salvar em uma variável separando por virgula}
for li := 0 to CheckListBox.Count - 1 do begin
if CheckListBox.Checked[li] then begin
lCodigo := copy(CheckListBox.Items[li], 0, 50);
lString := lString + (ifthen(lString <> '', ', ') + Trim(Copy (lCodigo, 1, Pos ('-', lCodigo) - 1)));
end;
end;
{Aqui vamos deletar o conteúdo da tabela para depois fazer um insert}
FDConnection1.ExecSQL('delete from PRODUTOS_VARIACOES' +
' where CODIGO_PRODUTO = ' + IntToStr(tbProdutosCODIGO_PRODUTO.asInteger));
{Nessa parte verificamos se algum campo foi marcado se houver algum campo iremos fazer um insert na tabela}
if Trim(lString) <> EmptyStr then begin
FDConnection1.ExecSQL('insert into PRODUTOS_VARIACOES (CODIGO_PRODUTO, CODIGO_VARIACAO)' +
' select ' + IntToStr(tbProdutosCODIGO_PRODUTO.asInteger) + ', V.CODIGO_VARIACAO' +
' from VARIACOES V' +
' where V.CODIGO_VARIACAO in (' + lString + ')');
end;
end;
Um exemplo simples da utilização, tem muitas coisas que dá para melhorar para deixar mais dinâmico para o usuário, mas vamos ver como ficou?