Fórum AJUDA COM O CHECKLISTBOX NO DELPHI 7 #419960
16/07/2012
0
É o seguinte tenho um formulário que está trazendo informações dentro de um CHECKLISTBOX até ai tudo blz, meu problema começa no momento de dar baixa nas opções selecionadas.
Meu Checklistbox só tem 2 informações: número de via e código de barra; O que estou tentando fazer é quando selecionar a via no checklistbox e clicar no botão baixar entao a aplicação iria ATUALIZAR meu banco de dados, colocando numa tabela chamada BAIXA_VIAS a DT_BAIXA que está vazia e trocando o valor do campo PC que é o tipo CHAR que está com valor N para S.
Já dei uma vasculhada na net e não encontrei uma solução pro meu caso. E só estou conseguindo fazer pra atualizar todos os registros e não é o que quero pois quero atualizar somente aqueles registros que estiverem selecionados dentro do checklistbox.
Alguém se habilitar a me dar uma luz, orientação, direcionamento; me ajudem pessoal.
Hardsoft Informatica
Curtir tópico
+ 0Post mais votado
16/07/2012
Enfim vou lhe dar um exemplo de como percorrer os itens, verificar quais estão marcados e executar uma determinada ação.
queryAcao.SQL.Text := ´UPDATE BAIXA_VIAS SET DATA_BAIXA = :dtBaixa WHERE NUM_VIA = :numVia´; for i := 0 to Pred(checkVias.Items.Count) do begin if checkVias.Checked[i] then begin queryAcao.ParamByName(´dtBaixa´).AsDateTime := Today; queryAcao.ParamByName(´numVia´).AsString := checkVias.Items[i]; queryAcao.ExecSQL; end end
Claro que este é apenas um exemplo, eu nem mesmo testei no Delphi, mas a lógica é esta.
Joel Rodrigues
Gostei + 1
Mais Posts
16/07/2012
Hardsoft Informatica
meu formulário mostra os dados assim:
NR_VIA COD_BARRA
00001 0000000000000000001
00002 0000000000000000001
00003 0000000000000000001
....
O que eu estou tentando é, selecionar o checkbox do 00001 por exemplo e e clicar no botao baixar e assim atualiar o banco de dados modificando atualizando o campo DT_BAIXA que vai ser a data em que estou selecionando a via e o campo PC que está N e vai ter que fica S....
Tentei sua sugestão, mais acho q não compreendir direito.
Eu poderia fazer??? se o nr_via estiver seleionado entao sql_acao atualizaria os campos descritos acima.
Tô perdidinho....
Gostei + 0
16/07/2012
Cauê Nishijima
meu formulário mostra os dados assim:
NR_VIA COD_BARRA
00001 0000000000000000001
00002 0000000000000000001
00003 0000000000000000001
....
O que eu estou tentando é, selecionar o checkbox do 00001 por exemplo e e clicar no botao baixar e assim atualiar o banco de dados modificando atualizando o campo DT_BAIXA que vai ser a data em que estou selecionando a via e o campo PC que está N e vai ter que fica S....
Tentei sua sugestão, mais acho q não compreendir direito.
Eu poderia fazer??? se o nr_via estiver seleionado entao sql_acao atualizaria os campos descritos acima.
Tô perdidinho....
Ola HARDSOFT, acho que com algumas adaptações no código do Joel, resolve seu problemas 100%
queryAcao.SQL.Text := UPDATE BAIXA_VIAS SET DATA_BAIXA = :dtBaixa, PX = S WHERE NUM_VIA = :numVia;
for i := 0 to Pred(checkVias.Items.Count) do
begin
if checkVias.Checked[i] then
begin
queryAcao.ParamByName(´dtBaixa´).AsDateTime := Today;
queryAcao.ParamByName(´numVia´).AsString := trim(copy(checkVias.Items[i],0,Pos( ,checkVias.Items[i])));
queryAcao.ExecSQL;
end;
end;
Acredito que pelo que eu e o Joel entendemos é isso. Se não for explique novamente para nós.
Abraço
Cauê Nishijima
Gostei + 1
16/07/2012
Hardsoft Informatica
Não sei, devo estar compreendendo algo errado. Meu código está da seguinte forma:
procedure TFrmConferenciaPC.Btn_baixarClick(Sender: TObject);
var
i:Integer;
begin
for i:= 0 to CheckListBox1.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
Sql_acao.Close;
Sql_acao.SQL.Clear;
Sql_acao.SQL.Add(Update BAIXA_VIAS where DT_BAIXA=:dt_baixa, PC=:pc);
Sql_acao.ParamByName(DT_BAIXA).AsDate:= edt_data_confere.Date;
Sql_acao.ParamByName(PC).AsString:=S;
Sql_acao.ParamByName(NR_VIA).AsInteger:= (CheckListBox1.Items.Objects[i]).InstanceSize;
Sql_acao.ExecQuery;
end;
end;
end;
Mas ai está aparecendo a seguinte mensagem de erro:
Project Sindicat.exe raised exception class EIBInterBaseErro with message Dynamic SQL Error
SQL erro code =-104
Token unknown - line 1, column 19
where. Process stopped. Use Step or Run continue
Amigos, que devo fazer?????
Gostei + 1
17/07/2012
Cauê Nishijima
Não sei, devo estar compreendendo algo errado. Meu código está da seguinte forma:
procedure TFrmConferenciaPC.Btn_baixarClick(Sender: TObject);
var
i:Integer;
begin
for i:= 0 to CheckListBox1.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
Sql_acao.Close;
Sql_acao.SQL.Clear;
Sql_acao.SQL.Add(Update BAIXA_VIAS where DT_BAIXA=:dt_baixa, PC=:pc);
Sql_acao.ParamByName(DT_BAIXA).AsDate:= edt_data_confere.Date;
Sql_acao.ParamByName(PC).AsString:=S;
Sql_acao.ParamByName(NR_VIA).AsInteger:= (CheckListBox1.Items.Objects[i]).InstanceSize;
Sql_acao.ExecQuery;
end;
end;
end;
Mas ai está aparecendo a seguinte mensagem de erro:
Project Sindicat.exe raised exception class EIBInterBaseErro with message Dynamic SQL Error
SQL erro code =-104
Token unknown - line 1, column 19
where. Process stopped. Use Step or Run continue
Amigos, que devo fazer?????
Cara seu comando SQL esta errado, o comando segue a seguinte estrutura:
UPDATE tabela SET campo = valor WHERE campo = condição
No seu caso acho que deve ficar assim:
UPDATE baixa_vias SET dt_baixa = :dt_baixa, pc = :pc WHERE NR_VIA = (CheckListBox1.Items.Objects[i]).InstanceSize;
Apesar que não entendi o porque você utilizou o comando
(CheckListBox1.Items.Objects[i]).InstanceSize
Gostei + 1
17/07/2012
Cauê Nishijima
UPDATE baixa_vias SET dt_baixa = :dt_baixa, pc = :pc WHERE nr_via = :nr_via;
Gostei + 1
17/07/2012
Hardsoft Informatica
Gostei + 0
17/07/2012
Hardsoft Informatica
queryAcao.ParamByName(´numVia´).AsString := trim(copy(checkVias.Items[i],0,Pos( ,checkVias.Items[i])));
o que coloco aqui na ???
queryAcao.ParamByName(´numVia´).AsString := trim(copy(checkVias.Items[i],0,Pos(??? ,checkVias.Items[i])));
Gostei + 0
17/07/2012
Joel Rodrigues
Sql_acao.ParamByName(NR_VIA).AsInteger:= (CheckListBox1.Items.Objects[i]).InstanceSize;
Afinal você quer pegar parte do texto dos itens selecionados.
Gostei + 1
17/07/2012
Cauê Nishijima
queryAcao.ParamByName(´numVia´).AsString := trim(copy(checkVias.Items[i],0,Pos(´ ´,checkVias.Items[i])));
Explicando o comando COPY: copia um substring uma string, de uma posição inicial até uma certa quantidade,
copy(texto,posição inicial, quantidade de caracteres)
Explicando o comando POS: posição de uma substring, em uma substring
pos(substring, string)
sabendo a posição do primeiro espaço em branco da string eu sei quantos caracteres eu devo copiar desde a posição zero, onde o mesmo corresponde ao número da via.
Abraços
Cauê Nishijima
Gostei + 1
17/07/2012
Cauê Nishijima
queryacao.parambyname(´numvia´).asstring := trim(copy(checkvias.items[i],0,pos(´ ´,checkvias.items[i])));
explicando o comando copy: copia uma substring de uma string, de uma posição inicial até uma certa quantidade,
copy(texto,posição inicial, quantidade de caracteres)]
explicando o comando pos: posição de uma substring, em uma string
pos(substring, string)
sabendo a posição do primeiro espaço em branco da string eu sei quantos caracteres eu devo copiar desde a posição zero, onde o mesmo corresponde ao número da via.
abraços
cauê nishijima
Gostei + 0
26/07/2012
Hardsoft Informatica
Gostei + 0
16/11/2017
Marlos Silva
procedure TFrmEnquetes.GravaParticipantes(IDEnquete: Integer);
var
Ql: Integer;
k: Integer;
begin
Ql := 0;
For k := 0 To cb1.Items.Count - 1 do
begin
If cb1.checked[k] Then
Begin
Inc(Ql);
with DmCad.q3 do
begin
SQL.Clear;
SQL.Add('INSERT INTO TB_ENQUETES_USUARIOS (ENQUETE_ID, USUARIO_ID, ENU_CHAVE, ENU_CHAVE_INATIVA)');
SQL.Add(' VALUES (:ENQUETE_ID, :USUARIO_ID, :ENU_CHAVE, :ENU_CHAVE_INATIVA)');
ParamByName('USUARIO_ID').AsString:= trim(copy(cb1.Items[k],0,4));
ParamByName('ENQUETE_ID').AsInteger := IDEnquete;
ParamByName('ENU_CHAVE').AsString := GerarSenhaAleatoria(6);
ParamByName('ENU_CHAVE_INATIVA').AsBoolean := false ;
ExecSQL;
end;
End;
End;
end;
Gostei + 0
16/11/2017
Marlos Silva
no CheckListBox esta escrito assim: 0001- Usuario Fulano
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)