ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

ADOTable não procura

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
gumedeiros1
Novato
Novato


Registrado: Sexta-Feira, 19 de Outubro de 2018
Mensagens: 23

MensagemEnviada: Sex Nov 16, 2018 7:56 am    Assunto: ADOTable não procura Responder com Citação

Pessoal, uma dúvida.

Criei um banco de dados no Access, uso o TADOTable para visualizar as informações e até consigo inserir valores, mas quando quero apagar ou localizar algo, o delphi retorna Dataset not in edit or insert mode. Acho estranho porque ele consegue incluir informação e até editar.

Já usei ADOTable1.Edit, ADOTable1.Insert e o ADOTable1.Append e nada. Se eu usar o locate ou delete ele retorna o erro.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Nov 16, 2018 9:20 am    Assunto: Responder com Citação

Bom dia,

Acho melhor você postar o trecho do código que você utilizou no Locate e no Delete.
Para posicionar em um determinado registro basta executar o Locate passando o(s) nome(s) do(s) campo(s) e o(s) respectivo(s) valor(es).
Para excluir basta posicionar no registro desejado e depois executar o Delete.


Editado pela última vez por imex em Dom Out 01, 2023 4:26 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gumedeiros1
Novato
Novato


Registrado: Sexta-Feira, 19 de Outubro de 2018
Mensagens: 23

MensagemEnviada: Sex Nov 16, 2018 9:17 pm    Assunto: Responder com Citação

Imex, desculpe a demora. Então seria assim:

No access:

Código - Integer, chave primaria e complementa com +1 a cada linha
LOJA_FILIAL - Integer
FAIXA - Integer

Código:

Código     LOJA_FILIAL              FAIXA
1             68                    3
2             69                    1
3             70                    2
4             71                    4
5             72                    5


No Delphi:

Código:

ADOTable1.Open;
ADOTable1.Insert;
ADOTable1.FieldByName('Código').AsInteger := 6;
ADOTable1.FieldByName('LOJA_COD').AsInteger := 73;
ADOTable1.FieldByName('FAIXA').AsInteger := 6;
ADOTable1.Post;
ADOTable1.Close;


Insere normal caso o valor não fique duplicado. Se ficar da erro informando a duplicação.

Se eu fizer:

Código:

ADOTable1.Open;
ADOTable1.Edit;
ADOTable1.Locate('Código', 4, []);
ADOTable1.FieldByName('Código').AsInteger := 4;
ADOTable1.FieldByName('LOJA_COD').AsInteger := 71;
ADOTable1.FieldByName('FAIXA').AsInteger := 8;
ADOTable1.Post;
ADOTable1.Close;


Ele da erro de Dataset not in edit ou insert mode.

Se eu apagar o locate, ele edita a linha onde o ponteiro está, se ele estiver no Código 1, ele edita o COD_LOJA e FAIXA do 1 sem erro. Não consigo mover até o valor q eu quero, por exemplo o 4.

Se depois eu usar o ADOTable1.Delete para apagar, ele da o msm erro de editar ou inserir.

ADOConnection1:

Código:

Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\dados.mdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;


Tentei editar as permissões dele, usei read / readwrite e o write mas msm assim sem sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Dom Nov 18, 2018 8:00 pm    Assunto: Responder com Citação

Primeiro deve ser executado o método Locate para posicionar a ADOTable no registro a ser alterado, depois é que deve ser executado o Edit:

Código:
if ADOTable1.Locate('Código', 4, []) then
  begin
    ADOTable1.Edit;
    // ADOTable1.FieldByName('Código').AsInteger := 4;
    ADOTable1.FieldByName('LOJA_COD').AsInteger := 71;
    ADOTable1.FieldByName('FAIXA').AsInteger := 8;
    ADOTable1.Post;
  end;


O Locate retorna true ou false para indicar se o registro foi encontrado, então foi adicionado um If para fazer a alteração só se o registro for encontrado.
E a linha para atribuir 4 ao campo Código (não é indicado o uso de acentos e caraceres especiais em nomes de objetos do banco de dados (tabelas, campos, etc)) é desnecessária porque o valor desse campo já é 4.
Para excluir é só executar o Locate para posicionar a ADOTable no registro a ser excluído, e depois executar o Delete.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gumedeiros1
Novato
Novato


Registrado: Sexta-Feira, 19 de Outubro de 2018
Mensagens: 23

MensagemEnviada: Ter Nov 20, 2018 7:33 am    Assunto: Responder com Citação

Imex, obrigado.

Deu certo. Era pq estava colocando o Locate dentro do Edit msm. Igual ao delete.

Tudo ok, vlw
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gumedeiros1
Novato
Novato


Registrado: Sexta-Feira, 19 de Outubro de 2018
Mensagens: 23

MensagemEnviada: Qui Nov 29, 2018 4:40 pm    Assunto: Responder com Citação

Imex, uma dúvida.

O locate só pesquisa Integer? Ele não pesquisa String?

Por exemplo, se eu coloco uma coluna (NOMEFILIAL) com valor string, ai pesquiso usando if ADOTable1.Locate('NOMEFILIAL', 'ADM', [] then ...). Ele da o seguinte erro: raised exception EOleException with message 'A ordem de classificação não pode ser aplicada'. Mas se pesquiso a coluna q só tem valores inteiros, ele pesquisa normalmente. O locate é só para integer ou pesquisa string tbm?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Nov 29, 2018 5:04 pm    Assunto: Responder com Citação

O Locate funciona com campo do tipo string também, inclusive podem ser adicionadas 2 opções entre os colchetes, a loPartialKey para pesquisar por parte da string e a loCaseInsensitive para desconsiderar diferença entre minúsculas e maiúsculas.
Desconfio que esse erro que você citou está ocorrendo em função de algum outro código existente que talvez esteja sendo executado em algum evento que está ocorrendo depois do Locate.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gumedeiros1
Novato
Novato


Registrado: Sexta-Feira, 19 de Outubro de 2018
Mensagens: 23

MensagemEnviada: Seg Dez 03, 2018 10:34 am    Assunto: Responder com Citação

Imex, o form aqui é bem simples e coloquei para teste.

Retorna aquele erro.

Código:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    ADOTable1: TADOTable;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var

  nomeFilial : String;

begin

ADOTable1.Open;

if ADOTable1.Locate('LOJANOME', 'AAA', [loPartialKey]) then

  begin

    ADOTable1.Edit;

    faixa := ADOTable1.FieldByName('FAIXA').AsInteger;

    ShowMessage('faixa: ' + IntToStr(faixa));

  end;

  ADOTable1.Post;
  ADOTable1.Close;

end;

end.


Se eu coloco integer na pesquisa, vai. Se for string da erro. Ate ujsei o IoPartialKey mas retorna esse erro.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Dez 03, 2018 7:50 pm    Assunto: Responder com Citação

Você experimentou colocar um BreakPoint na linha do Locate para confirmar se o erro ocorre nessa linha mesmo?
Para desencargo experimente fazer um teste acrescentando a função VarArrayOf:

Código:
if ADOTable1.Locate('LOJANOME', VarArrayOf(['AAA']), [loPartialKey]) then


obs: pode não ter relação com o erro mas acho que no seu código não é necessário executar o Edit e o Post já que nenhum campo está sendo alterado, e o Post só deveria ser executado se o Edit foi executado anteriormente e isso pode não acontecer já que o Edit está dentro do bloco begin / end do Locate e o Post não.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gumedeiros1
Novato
Novato


Registrado: Sexta-Feira, 19 de Outubro de 2018
Mensagens: 23

MensagemEnviada: Sáb Dez 08, 2018 9:28 am    Assunto: Responder com Citação

Imex, bom dia.

Descobri o que era, o problema está no access msm. Qdo cria uma coluna, o access quer saber o tipo de valor, na logica eu pensava que Texto Curto era algo similar ao char e Texto Longo era similar a String. Mas o proprio access da um bug na pesquisa no textos longos, por isso o delphi não consegue pesquisar.

Colocando como texto curto ele aceita normalmente e pesquisa como String no delphi. Como não são textos grandes que vou utilizar, então não vai dar erro. Pesquisei agora usando o locate e sem parametros no [] e deu certo.

O access que tem problemas com textos longos.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB