Ir para conteúdo
Fórum Script Brasil
  • 0

Locate, Como Posicionar O Ponteiro Na Tabela Com Locate


schaukoski

Pergunta

Olá pessoal.

Eu preciso que quando eu dou locate, ele posicione o ponteiro no que localizou, para eu poder dar um delete.

meu codigo é esse


procedure TFormTCadCF.SBrelaccancelClick(Sender: TObject);
var
codficha,codrelacionado,codrelacao,codinverso:string;
begin
codficha:=SDSrelacionacodficha.asstring;
codrelacionado:=SDSrelacionacodrelacionado.asstring;
codrelacao:=SDSrelacionacodrelacao.asstring;
if application.MessageBox('Deseja Excluir Relação?', 'Relacionamento', mb_yesno+mb_iconquestion)=idyes then
  begin
  sdsrelaciona.delete;
  if dm.SDSrelacao.Locate('codrelacao', codrelacao,[])then
  codinverso:=dm.SDSrelacaoinverso.AsString;
  if (dm.sdsrelaciona.Locate('codficha', codrelacionado,[])) and (dm.sdsrelaciona.Locate('codrelacionado', codficha,[])) and (dm.sdsrelaciona.Locate('codrelacao', codinverso,[])) then
    dm.sdsrelaciona.Delete;

dm.sdsrelaciona.delete; dá um erro ao executar, porque n tem ponteiro selecionando....

Obrigado...

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

schaukoski, Vamos deixar seu código mais legível:

procedure TFormTCadCF.SBrelaccancelClick(Sender: TObject);
var
  codficha,codrelacionado,codrelacao,codinverso:string;
begin
  codficha:=SDSrelacionacodficha.asstring;
  codrelacionado:=SDSrelacionacodrelacionado.asstring;
  codrelacao:=SDSrelacionacodrelacao.asstring;
  if application.MessageBox('Deseja Excluir Relação?', 'Relacionamento', mb_yesno+mb_iconquestion)=idyes then
  begin
    SDSrelaciona.delete;       // ***  1
    if dm.SDSrelacao.Locate('codrelacao', codrelacao,[]) then
      codinverso:=dm.SDSrelacaoinverso.AsString;
    if (dm.SDSrelaciona.Locate('codficha', codrelacionado,[])) and       // ***  2
       (dm.SDSrelaciona.Locate('codrelacionado', codficha,[])) and       // ***  3
       (dm.SDSrelaciona.Locate('codrelacao', codinverso,[])) then
      dm.SDSrelaciona.Delete;       // ***  4
  end;
end;

Observe as marcas "// *** n":

1) em 1 você tenta excluir o item atual em SDSrelaciona;

2) em 2 e 3 parece que os parâmetros codficha e codrelacionado estão trocados, é assim mesmo?

3) o que você pretende excluir em 4, já que supostamente você já excluiu em 1?

Link para o comentário
Compartilhar em outros sites

  • 0

Ola Micheus;

Sim, está correto, é invertido mesmo.

Não é a mesma coisa que pretendo excluir.

No cadastro, tem a "ida" e a "volta".

quando eu cadstro um relacionamento entre duas pessoas ( dois codficha ), eu crio na tabela de relacionamento:

CODIGOFICHA / CODRELACIONADO / TIPO

001----------------002----------------------004

Relacionei o codigo 1 com o 2.., automaticamente em meu programa, eu já cadastro o "inverso" - ( a volta ) - ...

CODFICHA / CODRELACIONADO / TIPO

001------------002----------------------004 <- ida.

002------------001----------------------004 <- inverso.

... Ok... eu mostro para o usuário em um grid...( grid relacionado a SDSrelaciona ), eu busco o codficha dele, e mostro todos os CODRELACIONADO à ele.

acontece que quando ele deleta, ele deleta na primeira parte ou seja, ele deleta a "ida" apenas, e o inverso fica lá... e eu quero deletar o inverso.

então, por isso que primeiro eu deleto o Sdsrelaciona, e depois o DM.SDSrelaciona.... .

Então, eu preciso buscar no DM.SDSrelaciona, o registro que contenha os valores das variaves que eu criei, ( por isso está ao contrário ali no codigo fonte )...

Depois de muitas tentativas eu consegui Encontrar o registro que eu quero atraves deste código:

procedure TFormTCadCF.SBrelaccancelClick(Sender: TObject);
var
codficha,codrelacionado,codrelacao,codinverso:string;
begin
codficha:=SDSrelacionacodficha.asstring;
codrelacionado:=SDSrelacionacodrelacionado.asstring;
codrelacao:=SDSrelacionacodrelacao.asstring;
if application.MessageBox('Deseja Excluir Relação?', 'Relacionamento', mb_yesno+mb_iconquestion)=idyes then
  begin
  sdsrelaciona.delete;
  if dm.SDSrelacao.Locate('codrelacao', codrelacao,[])then
     codinverso:=dm.SDSrelacaoinverso.AsString;

   if dm.SDSrelaciona.locate('codrelacionado', codficha,[])then
    begin
      if (codrelacionado) = dm.SDSrelaciona.Fieldbyname('codficha').AsString then
       application.MessageBox('primera', 'primera');
       begin
          if (codinverso) = dm.sdsrelaciona.Fieldbyname('codrelacao').asstring then
            begin
              application.MessageBox('segunda', 'segunda'); // ****2
              dm.sdsrelaciona.delete;   /// *******1
              end
        end
     end;
              sdsrelaciona.Refresh;

  end

end;

O problema só, e que quando eu vou deletar *****1, ele dáa o seguinte erro:

.... EDatabaseError,.... ' Record not found, or changed by another user.

OBS: os aplication.messagebox, é pra mim saber se ele deu verdadeiro no if, se ele encontrou.

como que ele dá not found, se ele chega a aparecer o ultimo message? ***2

Se voce tiver alguma ideia para fazer isso... Obrigado , até mais.

Editado por schaukoski
Link para o comentário
Compartilhar em outros sites

  • 0
acontece que quando ele deleta, ele deleta na primeira parte ou seja, ele deleta a "ida" apenas, e o inverso fica lá... e eu quero deletar o inverso.
schaukoski, você não poderia utilizar uma query para fazer esse trabalho? Colocaria na instrução SQL desta forma:
DELETE relaciona 
WHERE CODFICHA = :COD_ELIMINAR
   OR CODRELACIONADO = :COD_ELIMINAR

Depois de você obter a confirmação da exclusão, pelo usuário, você executaria esta query através do ExecSQL; antes porém, passando o parâmetro COD_ELIMINAR que seria o código que está dos dois lados da sua tabela.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus.

Obrigado pela resposta, eu achei uma solução aqui, que apesar de MUITO, MUITO .. mas MUITO trabalho, deu certo..

 if dm.SDSrelaciona.Locate('codficha;codrelacionado;codrelacao', vararrayof([codrelacionado, codficha, codinverso]), []) then

O problema que estava dando eu não sei o que era... meu SDSrelaciona que estava em DM, eu deletei e tive que criar outro, e o problema sumiu....

adicionei um refresh no dm.sdsrelaciona também....

Obrigado pela atenção. ´

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...