Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jerfs

[Resolvido] Querys

Recommended Posts

Pessoal, estou terminando um software em delphi + ADOTables + Access, e a partir de um determinado momento ando tendo problemas com registro do meu grid, quando faço determinada operação, o delphi "diz" que não encontra o registro selecionado e tal, imagino que seja pelo fato da utilização de algumas Querys...

 

Quero saber se existe um jeito comum de utilização de Querys para não dar mais problemas, por exemplo, eu pensei que toda vez que eu fizesse alguma operação com uma query eu deveria aplicar a REQUERY, mas mesmo assim as vezes tenho problema com isso. Existe algo que eu não possa fazer com uma query por que ela perder a indexação!? tem jeito de eu atribuir mais um parametro sem precisar executar o sql.clear a uma query?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, está meio confuso sua explicação do problema.... poste o código do trecho onde ocorre problema e se possível copie a mensagem gerada pelo compilador para análise. Explique também a situação em que o erro ocorreu, por exemplo:

 

Estou tentando incluir um registro X na tabela Y e quando chamo a rotina J aparece essa mensagem de erro.

 

[estrutura da tabela]

 

{code}

código da rotina J

{/code} -- Substitua as {} por [] para por o código formatado.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, esse é o meu problema, o erro não ocorre com frequência, as vezes acontece as vezes não acontece. Quero saber e existe alguma operação que não se deve fazer com Query, tipo: depois que se faz uma query, sempre que for alterar algum valor, é necessário agir na tabela e não no resultado da query, então para isso precisa-se dar um locate na tabela com algum valor da query, ou é possível realizar alteração diretamente no resultado da query sem problema algum, por exemplo:

 

query.Edit;
query.FieldByName('descricao').asString := desc;
query.Post;
query.requery();

ou preciso fazer o seguinte:

 

tabela.locate('code',query.FieldByName('code').asString,[]);
tabela.Edit;
tabela.FieldByName('descricao').asString := desc;
tabela.Post;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eu particularmente nunca vi usar query com edit e post.... particularmente, sempre uso as estruturas abaixo:

 

query.close;
query.sql.add(sql);
try
   query.execsql;
except
   <tratamento erro inclusão/alteração/exclusão>
end;

querypesquisa.close;
querypesquisa.sql.add(sql);
querypesquisa.open;

Ou seja: uso uma query dando o execsql quando quero gravar/atualizar/excluir dados e depois refaço a consulta na base usando o comando open... isso nunca me deu dor de cabeça.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

para

 

Insert / Update / Delete

usa

 

Query1.ExecSQL;

 

para Select

 

Query1.Open;

 

foi assim que eu aprendi :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

então quando você faz alguma operação de inserção / edição / deleção de dados sempre diretamente na sintaxe sql? é isso?

 

Hoje eu trabalho usando Stored Procedure para gravar os dados, enviando para o BD como comando a ser executado o Exec da procedure com seus parâmetros, mas quando comecei a programar, se fosse pra editar os registros usando esta idéia de edit -> post, eu usava apenas componentes TTable para isso.

 

Quando comecei a entender a relação performance/benefício de usar comandos sql ao invés de TTables, migrei todos os códigos que fazia para TQuerys, onde passei a usar comandos como Insert, Delete e Update para manipular as informações diretamente onde me interessava, sem a necessidade de navegar registro a registro ou ter que abrir uma tabela inteira para alterar 1 único registro. É mais prático e eficiente montar uma pesquisa usando um select, que já trará os dados que preciso para dar um update no campo exato que eu quero, e depois mandar carregar novamente o registro via select após a atualização do dado usando os filtros de pesquisa de meu interesse do que ficar abrindo uma tabela, esperar ela carregar seus N registros para depois filtrar o que me interessa neles.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ótimo, gosto disso, acabo de ampliar um pouco mais meu conhecimento. só para eu entender melhor, quando eu já tenho uma query feita com um select e quero alterar um determinado campo em todos os registros previamente pesquisado... como eu uso o Update? isso ae embaixo ta dando erro, a idéia é essa mesmo ou não?

 

dmod.qryLote.close;
dmod.qryLote.sql.Clear;
dmod.qryLote.sql.AddStrings(dmod.qryPrincipal.SQL);
dmod.qryLote.sql.Add('UPDATE * FROM QUESTION SET STATUS = ' + QuotedStr(status));
try
  dmod.qryLote.execsql;
except
  showmessage('Error!');
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu comando update está errado... a sintaxe dele é esta:

 

Update tabela
set campoA = novo_valor,
      campoB = novo_valor,
      ...
      campoN = novo_valor
where <condições> <- Aqui é opcional o where... mas se não por, vai atualizar a tabela toda

No seu caso, poderia ser algo +/- assim:

 

dmod.qryLote.sql.Add('UPDATE QUESTION SET STATUS = ' + QuotedStr(status)); 

Agora, teria que ver qual é a condição para este seu update funcionar (montar o where), senão vai atualizar todos os status de uma vez.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Devagar se vai ao longe hehehe... posso marcar como resolvido então?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.