ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Seleção de registros com checkbox
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Ter Set 12, 2017 2:45 pm    Assunto: Seleção de registros com checkbox Responder com Citação

Estou trabalhando numa tela onde o usuario localiza as contas a receber.
A busca retorna um ou mais registros. Em alguns casos pode retornar mais de 1000 registros.

ex:


Código:
SELECT CAMPOS FROM CONTAS_RECEBER WHERE STATUS = NÃO PAGO


Pensei em adicionar um checkbox no dbgrid e um checkbox chamado Selecionar Todos no formulario, para então fazer a baixa das contas selecionadas

Minha duvida é:

Tem como selecionar os registros sem gravar um campo na tabela?
Tudo que encontrei foi fazendo algo assim:

Código:
procedure TFrmBusca.CheckTodosClick(Sender: TObject);
begin
  query.First;

  while not query.EOF do
  begin
      query.Edit;
      if query.FieldByName('FLAG').AsInteger = 1 then
         query.FieldByName('FLAG').AsInteger := 0
    else
      query.FieldByName('FLAG').AsInteger := 1;
      query.Post;
  end;
   query.Next;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Ter Set 12, 2017 3:25 pm    Assunto: Responder com Citação

Acredito que nesse caso, você deveria utilizar um ClientDataSet, ai vc cria uma coluna virtual no ClientDataSet que vai informar se o checkbox está marcado ou não, e por ser ClientDataSet, você pode trabalhar com os dados sem fazer o commit direto no banco
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Ter Set 12, 2017 3:26 pm    Assunto: Responder com Citação

Certo Leo, mas me tira uma duvida.

Após o select, como jogo os dados no clientdataset e depois de alterados, como jogo as atualizações de volta no banco?

Teria que trabalhar com um datasetprovider?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Ter Set 12, 2017 3:43 pm    Assunto: Responder com Citação

Pra jogar do select no clientdataset é só fazer as ligações entre os componentes que ele já pega os dados sozinho.

ai para pegar a coluna de controle você pode fazer assim por exemplo:
Código:
SELECT Nome, Endereco, 0 Marcado
FROM Clientes


ai para salvar, você vai ter que alterar as opções de ProviderFlag da coluna Marcado para que o valor da mesma não tente ser salvo no banco.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Ter Set 12, 2017 4:51 pm    Assunto: Responder com Citação

Sim, então a ligação é usando o datasetprovider.
Acredito que tenha que ser assim, para não dar commit direto no banco diversas vezes.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Set 14, 2017 10:57 am    Assunto: Responder com Citação

Leo, me tira uma dúvida sobre esse campo virtual.

Pra entender, removi o updatesql e adicionei o datasetprovider e o clientdataset.

Adicionei todos os campos da query no clientdataset e criei um novo campo, pelo fieldseditor do clientdataset, chamado SELECIONADO, do tipo integer.

Ao fazer uma busca, o erro informando que o campo SELECIONADO não existe no clientdataset aparece.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Set 14, 2017 11:23 am    Assunto: Responder com Citação

mas ele existe na sua query?
pois como o ClientDataSet está ligado à query, ele vai buscar todos os dados de lá, inclusive o campo SELECIONADO.

Ex:
Código:
SELECT Nome, Endereco, 0 SELECIONADO
FROM Clientes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Set 14, 2017 11:43 am    Assunto: Responder com Citação

Então.

Fui na query e adicionei o campo.
Em seguida fui no cds e cliquei em add all, mas ele diz que o campo no existe na query.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Set 15, 2017 8:45 am    Assunto: Responder com Citação

Leo, fiz um select mais ou menos assim

Código:
SELECT
  CodConta,
  DataVencimento,
  Valor,
  'N' as Marcado <-- essa é um coluna falsa para controlar a marcação
FROM
  ContasReceber


Trouxe essa coluna "falsa", para evitar ter que dar edit e post no banco a cada registro que eu selecionar.

Agora restou a duvida. Como marcar?

Via banco de dados seria algo assim
Código:

edit;
  (Sender as TDBGrid).DataSource.Dataset.FieldByName('MARCADO').AsString :=
    IfThen((Sender as TDBGrid).DataSource.Dataset.FieldByName('MARCADO').AsString = 'S', 'N', 'S');
post;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Sex Set 15, 2017 8:57 am    Assunto: Responder com Citação

você atualiza pelo ClientDataSet, usando o edit e post, porém não utiliza o ApplyUpdates
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Set 15, 2017 10:49 am    Assunto: Responder com Citação

Sem interação com o banco de dados não tem como marcar e desmarcar esse campo né?

Me evitaria um bom trabalho.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Sex Set 15, 2017 11:52 am    Assunto: Responder com Citação

Daria pra utilizar apenas o ClientDataSet sem nenhuma ligação com a query, mas ai você teria que passar registro por registro (acredito que a função de clone do ClientDataSet funcione apenas para outro ClientDataSet), o que dependendo da quantidade de registros faça com que o método fique bem demorado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Set 15, 2017 1:34 pm    Assunto: Responder com Citação

Pois é.

Não queria ter que usar datasetprovider e clientdataset para essa rotina, pois terei que alterar outras partes do sistema só por isso.

Dar 1.000 edits e posts é preocupante, por outro lado será feito apenas 1x por mês, no fechamento do convenio.

Decisão dificil, vou dar uma pensada.

Obrigado pelas dicas.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Set 15, 2017 5:22 pm    Assunto: Responder com Citação

Um componente nativo que já vem com Checkbox disponível em suas propriedades é o Listview.

A vantagem dele é que você não vai precisar ter um campo flag para criar os checkboxes.

A desvantagem é que ele não é ligado a banco de dados, você vai precisar preenchê-lo "manualmente" e não automaticamente como um DBGrid.

Se decidir usar o Listview, veja estes links:

http://www.linhadecodigo.com.br/artigo/581/delphi-usando-listview-como-dbgrid.aspx
http://www.devmedia.com.br/ler-e-gravar-listview-em-delphi/18010
http://www.planetadelphi.com.br/dica/7433/-verificar-se-o-checkbox-do-listview-foi-marcado-
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Set 15, 2017 7:17 pm    Assunto: Responder com Citação

Olá natanbh1.

O listview seria uma opção, mas seria mais trabalhoso configurá-lo.

Fiz um select com um campo falso, mas mesmo sem esse campo na tabela, não fujo do edit e post.

Minha conclusão é que vou precisar usar o datasetprovider e o clientdataset.
Já sei fazer as ligações. Minha unica duvida é quanto ao select que trará os dados.

- devo fazer esse select na query ou no clientdataset?

Pergunto pois tenho selects pre-definidos direto no sql da query que recebem os parametros só no momento da pesquisa só quando clico no botão de pesquisa no formulario.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB