Duvida com o comando Locate?

Delphi

19/07/2005

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


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Rjun

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

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+


GOSTEI 0
Rjun

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

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


GOSTEI 0
Rjun

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

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?


GOSTEI 0
Rjun

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

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


GOSTEI 0
Rjun

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

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


GOSTEI 0
Adriano_servitec

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

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.


GOSTEI 0
Adriano_servitec

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


GOSTEI 0
POSTAR