Duvida com o comando Locate?
Ola meus amigos,
To com uma duvida com o comando locate
fiz um codigo assim:
begin
if not query4.LOCATE(´codigo´,edit4.TEXT,[]) then
begin
if qry5valor.value <> 0 then
begin
query1.append;
query1.Edit;
query1codigo.value:=500;
query1ref.value:=edit3.text;
query1descricao.value:=´Desconto do INSS´;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end else
showmessage(´Nao ha valor informado para calculo do INSS´);
end else
query1.Edit;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end;
Na dbgrid supondo que ja esteja cadastrado o codigo 500 ele deve fazer um locate sobre esse codigo e se ja estiver cadastrado ba dbgrid ele so corrige o valor, caso nao tenha ai sim cria uma nova linha para incluir os valores, mais nao funciona da forma acima.
Se eu fizer assim da erro
if not query4.LOCATE(´codigo´,edit4.TEXT,[500]) then
Minha intençao eh o programa localizar na dbgrid esse codigo 500 para fazer a correçao do valor ou inclusao do valor
Se tiver jeito dessa forma ou de outra agradeceria a ajuda.
Obrigado
Adriano
To com uma duvida com o comando locate
fiz um codigo assim:
begin
if not query4.LOCATE(´codigo´,edit4.TEXT,[]) then
begin
if qry5valor.value <> 0 then
begin
query1.append;
query1.Edit;
query1codigo.value:=500;
query1ref.value:=edit3.text;
query1descricao.value:=´Desconto do INSS´;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end else
showmessage(´Nao ha valor informado para calculo do INSS´);
end else
query1.Edit;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end;
Na dbgrid supondo que ja esteja cadastrado o codigo 500 ele deve fazer um locate sobre esse codigo e se ja estiver cadastrado ba dbgrid ele so corrige o valor, caso nao tenha ai sim cria uma nova linha para incluir os valores, mais nao funciona da forma acima.
Se eu fizer assim da erro
if not query4.LOCATE(´codigo´,edit4.TEXT,[500]) then
Minha intençao eh o programa localizar na dbgrid esse codigo 500 para fazer a correçao do valor ou inclusao do valor
Se tiver jeito dessa forma ou de outra agradeceria a ajuda.
Obrigado
Adriano
Adriano_servitec
Curtidas 0
Respostas
Rjun
19/07/2005
Você está usando chave primária? Acontece que quando você da Locate, você esta movendo o ponteiro da query. Quando se sai do registro em que se está fazendo a edição, ele tenta dar o post e nesse momento ocorre o conflito de chave primária. Deve ser esse o erro que você esta tendo. O que você pode fazer é criar outra query para se fazer a busca. Aí, em vez de você dar o locate na query em que você esta editando, você da o locate na query auxiliar.
GOSTEI 0
Adriano_servitec
19/07/2005
Desculpe o codigo estava errado eh assim:
procedure TForm6.BitBtn7Click(Sender: TObject);
begin
label13.Caption:=edit1.text+label14.caption+me1.text;
if not query4.LOCATE(´codigo´,edit5.text,[]) then
begin
if qry5valor.value <> 0 then
begin
query1.append;
query1.Edit;
query1codigo.value:=500;
query1ref.value:=edit3.text;
query1descricao.value:=´Desconto do INSS´;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end else
showmessage(´Nao ha valor informado para calculo do INSS´);
end else
begin
query1.Edit;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end;
end;
O que ocorre nesse codigo eh que em vez dele corrigir em cima no codigo 500 o valor do INSS ele coloca no ultimo valor cadastrado na dbgrid, preciso que ele corrige em cima do codigo 500
Flw!
T+
procedure TForm6.BitBtn7Click(Sender: TObject);
begin
label13.Caption:=edit1.text+label14.caption+me1.text;
if not query4.LOCATE(´codigo´,edit5.text,[]) then
begin
if qry5valor.value <> 0 then
begin
query1.append;
query1.Edit;
query1codigo.value:=500;
query1ref.value:=edit3.text;
query1descricao.value:=´Desconto do INSS´;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end else
showmessage(´Nao ha valor informado para calculo do INSS´);
end else
begin
query1.Edit;
query1desconto.value:=strtofloat(edit4.text);
query1.post;
query2.refresh;
query3.refresh;
query4.refresh;
end;
end;
O que ocorre nesse codigo eh que em vez dele corrigir em cima no codigo 500 o valor do INSS ele coloca no ultimo valor cadastrado na dbgrid, preciso que ele corrige em cima do codigo 500
Flw!
T+
GOSTEI 0
Rjun
19/07/2005
Não sei a estrutura de sua query, mas acho que você deveria fazer um locate na query1. Coloquei um comentário no código. Outra coisa, utilize as tagas pois facilita o entendimento do código.
procedure TForm6.BitBtn7Click(Sender: TObject); begin label13.Caption := edit1.text + label14.caption + me1.text; if not (query4.LOCATE(´codigo´,edit5.text,[])) then begin if qry5valor.value <> 0 then begin query1.append; query1.Edit; query1codigo.value := 500; query1ref.value := edit3.text; query1descricao.value := ´Desconto do INSS´; query1desconto.value := strtofloat(edit4.text); query1.post; query2.refresh; query3.refresh; query4.refresh; end else showmessage(´Nao ha valor informado para calculo do INSS´); end else begin // Acho que você deveria por um locate aqui para achar o registro com // o código que você quer query1.Edit; query1desconto.value:=strtofloat(edit4.text); query1.post; query2.refresh; query3.refresh; query4.refresh; end; end;
GOSTEI 0
Adriano_servitec
19/07/2005
Ola Rjun
Nao estou usando chave primaria na query
Bom a query4 eh aonde fica os dados da dbgrid
no banco de dados da query4 esta assim:
Paradox
codigo N
Descricao A 50
REF A 10
Valor $
Desconto $
Na SQL esta assim
select * from tbsalario
order by codigo
Nao estou usando chave primaria na query
Bom a query4 eh aonde fica os dados da dbgrid
no banco de dados da query4 esta assim:
Paradox
codigo N
Descricao A 50
REF A 10
Valor $
Desconto $
Na SQL esta assim
select * from tbsalario
order by codigo
GOSTEI 0
Rjun
19/07/2005
Então nao entendi...se você usa a query4 para mostrar o grid, pq vc usa a query1 para fazer edição? Pq vc não usa somente uma query?
GOSTEI 0
Adriano_servitec
19/07/2005
Ola amigo bem que eu quis mais preciso fazer um order by na dbgrid e nao consegui usar order by na query1 por isso coloquei a query4 para aparecer em ordem no dbgrid.
Sera que eh por isso que esta errado?
Sera que eh por isso que esta errado?
GOSTEI 0
Rjun
19/07/2005
Acontece que se você esta editando direto no grid, então você esta editando a query4 e não a query1. Por que você não conseguiu utilizar o order by? Coloque o SQL para darmos uma olhada.
GOSTEI 0
Adriano_servitec
19/07/2005
Ola amigo,
Na query1 a SQL esta somente assim
select * from tbsalario
se eu colocar order by codigo na query1 aparece o seguinte erro na hora de gravar
Project.exe raised exception class EDataBase wuth message query1 cannot modify a read-only Dataset. Process stopped use step or run to continue
Na query1 o requestlive esta true e na query4 o requestlive esta false
Na query1 a SQL esta somente assim
select * from tbsalario
se eu colocar order by codigo na query1 aparece o seguinte erro na hora de gravar
Project.exe raised exception class EDataBase wuth message query1 cannot modify a read-only Dataset. Process stopped use step or run to continue
Na query1 o requestlive esta true e na query4 o requestlive esta false
GOSTEI 0
Rjun
19/07/2005
O query1 esta como readonly? Evite colocar select *. Coloque o nome dos campos. Adicione os campos na query1. Agora so pra eu entender sua interface. Ela tem o edit onde você informa o código que você quer inserir e uma grade contendo os registros par edição. É isso?
GOSTEI 0
Adriano_servitec
19/07/2005
Desculpe minha ignorancia mais o que eh readonly?
Coloquei assim na SQL
select codfunc,codigo,descricao,ref,valor,desconto from tbsalario
verifiquei num dbnavigator se eu colocar order by codigo na query1 os botoes de gravar e deletar ficam com o enabled false, se ficar sem o order by eles ficam true.
O edit5 aonde quero que o locate procure o codigo 500 No text dele esta digitado 500
Coloquei assim na SQL
select codfunc,codigo,descricao,ref,valor,desconto from tbsalario
verifiquei num dbnavigator se eu colocar order by codigo na query1 os botoes de gravar e deletar ficam com o enabled false, se ficar sem o order by eles ficam true.
O edit5 aonde quero que o locate procure o codigo 500 No text dele esta digitado 500
GOSTEI 0
Adriano_servitec
19/07/2005
Ola RJun, se eu fizer como vc disse pela query1 funciona perfeitamente, ele acha o codigo 500 e altera o valor, o ruim eh que nao consegui fazer o order by codigo funcionar
GOSTEI 0
Rjun
19/07/2005
Adriano
dei uma pesquisada no forum e não tem como você conseguir uma query editavel com paradox usando order by. Usando TTable com chave provavelmente você consegueria.
dei uma pesquisada no forum e não tem como você conseguir uma query editavel com paradox usando order by. Usando TTable com chave provavelmente você consegueria.
GOSTEI 0
Adriano_servitec
19/07/2005
Ola RJun
Agora seu que o order by nao funciona para query q a gente precisa gravar, incluir e editar e se nao me engano o group by tambem nao funciona.
Olha so como fiz.
if not query1.LOCATE(´codigo´,edit5.text,[]) then
Ai funciona perfeitamente
Para nao usar o order by na query1 deixei o dbgrid com a query4 mesmo e ai na hora de fechar para usar o comando uso um refresh na query4 que ta ligada no datasource1 da query1
Ficou perfeito
Obrigado pela ajuda e força amigo
Valeu mesmo
Me ajudou muto
Agora seu que o order by nao funciona para query q a gente precisa gravar, incluir e editar e se nao me engano o group by tambem nao funciona.
Olha so como fiz.
if not query1.LOCATE(´codigo´,edit5.text,[]) then
Ai funciona perfeitamente
Para nao usar o order by na query1 deixei o dbgrid com a query4 mesmo e ai na hora de fechar para usar o comando uso um refresh na query4 que ta ligada no datasource1 da query1
Ficou perfeito
Obrigado pela ajuda e força amigo
Valeu mesmo
Me ajudou muto
GOSTEI 0