|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
gumedeiros1 Novato
Registrado: Sexta-Feira, 19 de Outubro de 2018 Mensagens: 23
|
Enviada: Sex Nov 16, 2018 7:56 am Assunto: ADOTable não procura |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Nov 16, 2018 9:20 am Assunto: |
|
|
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 |
|
|
gumedeiros1 Novato
Registrado: Sexta-Feira, 19 de Outubro de 2018 Mensagens: 23
|
Enviada: Sex Nov 16, 2018 9:17 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Dom Nov 18, 2018 8:00 pm Assunto: |
|
|
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 |
|
|
gumedeiros1 Novato
Registrado: Sexta-Feira, 19 de Outubro de 2018 Mensagens: 23
|
Enviada: Ter Nov 20, 2018 7:33 am Assunto: |
|
|
Imex, obrigado.
Deu certo. Era pq estava colocando o Locate dentro do Edit msm. Igual ao delete.
Tudo ok, vlw |
|
Voltar ao Topo |
|
|
gumedeiros1 Novato
Registrado: Sexta-Feira, 19 de Outubro de 2018 Mensagens: 23
|
Enviada: Qui Nov 29, 2018 4:40 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Nov 29, 2018 5:04 pm Assunto: |
|
|
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 |
|
|
gumedeiros1 Novato
Registrado: Sexta-Feira, 19 de Outubro de 2018 Mensagens: 23
|
Enviada: Seg Dez 03, 2018 10:34 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 03, 2018 7:50 pm Assunto: |
|
|
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 |
|
|
gumedeiros1 Novato
Registrado: Sexta-Feira, 19 de Outubro de 2018 Mensagens: 23
|
Enviada: Sáb Dez 08, 2018 9:28 am Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|