Login Either EOF and BOF...

19/05/2003

1

Amigos,


Estou com um probleminha... Estou tentando fazer uma tela de login... A consulta está ok! E o programa está compilando. Eu tenho registros salvos no banco, mas quando eu entro com o login e a senha ele processa, entra na condição de usuário inexistente e retorna aquele erro: raises Menssage ´Either EOF and BOF´... alguma coisa desse tipo... Esse erro tem dado também em outros forms deste mesmo programa quando eu utilizo o DBNavigator para ir visualizando os dados e deixo o ultimo registro selecionado...
Alguem sabe me dizer o que pode estar havendo e o que posso fazer?!


Responder

Posts

19/05/2003

Sousa_thiago

Qual BD vc está usando ?

EOF = End Off File

BOF = Begin Off File

Agora essa msg sua ai eu nunca vi ....


Responder

19/05/2003

Okama

Se possível insira aqui o código da busca do usuário, pode ter algo errado. Você está utilizando Table, Query, Filtro ??


Responder

19/05/2003

Rafaelunp

Se possível insira aqui o código da busca do usuário, pode ter algo errado. Você está utilizando Table, Query, Filtro ??


Amigos,

Estou usando SQL Server.

O erro que está dando é esse:

Project Sgc.exe raised exception class EOleException with message ´Either BOF or EOF is True, or the current record has deleted. Requested Operation requires a currente record´. Process stoped. Use Step or Run to continue.

Estou usando uma Query e um DataModule (para as tables e o DataSouce)...

o código do botão ok do login é esse:

procedure TFmLogin.B_Login_OkClick(Sender: TObject);
var
Sql2 : String;
begin
Sql2 := ´SELECT * FROM TB_Usuario ´
+´WHERE (S_Usuario_Login like ´´+ S_Login.Text +´´)´
+´AND (S_Usuario_Senha like ´´+ S_Senha.Text +´´)´;
with ADOQ_Login do
begin
//close;
sql.clear;
sql.add(Sql2);
open;
S_Login.clear;
S_Senha.clear;
If (ADOQ_Login.REcordCount > 0) Then // deixa passar pois o usuario e a senha estao certos
FmLogin.close
else // a senha ou o logim são invalidos..
ShowMessage(´Login ou Senha Inválido!´);
Close;
end;
end;

sempre está entrando no segundo else, ou seja, havendo registro ou não ele avisa que ´Login ou Senha Inválido´ e apresenta o erro!

Vejam ai o que posso estar errando...


Responder

20/05/2003

Okama

Verifique os códigos abaixo, inseri um Showmessage para você visualizar o que estava sendo consultado. Altere para o código a seguir:

[b:117ae2d52a]Sql2 := ´SELECT * FROM TB_Usuario ´ +´WHERE (S_Usuario_Login like ´´+ S_Login.Text +´´)´ +´AND (S_Usuario_Senha like ´´+ S_Senha.Text +´´)´; [/b:117ae2d52a]with ADOQ_Login do begin //close; sql.clear; sql.add(Sql2); [color=red:117ae2d52a] showmessage( sql.text );[/color:117ae2d52a] open; S_Login.clear; S_Senha.clear;




Sql2 := ´SELECT * FROM TB_Usuario ´+
         ´WHERE (S_Usuario_Login like ´ +#39+Trim(S_Login.Text) +39+´)´+
         ´AND (S_Usuario_Senha like ´+39+Trim( S_Senha.Text ) +39+ ´)´;
  



Responder

20/05/2003

Rafaelunp

Sql2 := ´SELECT * FROM TB_Usuario ´+
         ´WHERE (S_Usuario_Login like ´ +#39+Trim(S_Login.Text) +39+´)´+
         ´AND (S_Usuario_Senha like ´+39+Trim( S_Senha.Text ) +39+ ´)´;
  

Okama,

O código acima funcionou, em termos! A consulta está ok! Posso verificar pelo ShowMessage(Sql.Text); Porem, se o login for inválido, isto é, senha ou usuário não existente, o erro continua! O que poderá ser?
1º O que posso fazer para não aparecer esse erro??

2º Para que serve o 39?? O trim é para tirar acentos e espaços né??

Grato,


Responder

20/05/2003

Gatoledo

Rafael,

O #39 do amigo Okama serve para substituir as aspas duplas que vc está utilizando em seu código.

Quando utilizar o SQL Server com ADO não utilize aspas duplas (´) e sim asplas simples.

Veja um exemplo:

SQL := ´SELECT * FROM TB_Usuario ´+
´WHERE (S_Usuario_Login like ´´´ + Trim(S_Login.Text) +´´´)´;

Observe que após a cláusula like existem 3 aspas simples (´´´). Assim o Delphi entenderá que vc quer inserir uma aspas simples na sua cláusula.

Se houver outras cláusulas SQL relacionadas com o seu programa eu te aconselho que verifique-as novamente.

Atenciosamente,
Gabriel


Responder

21/05/2003

Rafaelunp

Amigos,

Como já disse a aplicação está rodando, mas se houver um usuário/senha inválido, ele retorna o seguinte erro:
´Project.exe raised exception class EOleException with message ´Either BOF or EOF is true, or the current record has been deleted. Requested operation requires a currente record´. Process Stopped. Use Step or Run to Continue.´
Já percebi que este erro ocorre em todos os forms que utilizo caso eu percorra todos os registros, isto é chegue no ultimo e feche o form...

Imagino que este erro seja dos componentes que estou usando. Estou Usando a Table Usuário e o DataSource (da tabela Usuario) em um Datamodule e um ADOQUERY no form do login. Este ADOQuery se conecta com o Datamodule e com o DataSource_Usuario. porem em momento algum eu estou me conectando (ativando) a query. Estou abrindo o Datamodule e dentro do login conforme código abaixo.

Minha duvida: Estou usando componentes demais? Estes componentes estão certos nos lugares certos? O que pode estar havendo para estar dando esse erro, visto que só dá quando a consulta retorna vazia? Será que falta algum parametro para bloquear isso?


procedure TFmLogin.B_Login_OkClick(Sender: TObject);
var
Sql2 : String;
begin
Sql2 := ´SELECT * FROM TB_Usuario ´+
´WHERE (S_Usuario_Login like ´´´+Trim(S_Login.Text)+´´´)´+
´AND (S_Usuario_Senha like ´´´+Trim(S_Senha.Text)+´´´)´;
with ADOQ_Login do
begin
DataModule1.ADOT_Usuario.Active := True;
Sql.clear;
Sql.add(Sql2);
ADOQ_Login.Open;
S_Login.clear;
S_Senha.clear;
// ShowMessage(Sql.text);
If (ADOQ_Login.REcordCount > 0) Then
FmLogin.close
else
ShowMessage(´Login ou Senha Inválido!´);
ADOQ_Login.Close;
DataModule1.ADOT_Usuario.Active := False;
end;
end;

grato,


Responder

21/05/2003

Rafaelunp

Por favor, olhem o que eu postei por ultimo...


Responder

21/05/2003

Okama

Sugiro que altera o RecordCount Por IsEmpty e organize melhor o código retirando o ´With .. do´


procedure TFmLogin.B_Login_OkClick(Sender: TObject); 
var  Sql2 : String; 

begin 
Sql2 := ´SELECT * FROM TB_Usuario ´+ 
            ´WHERE (S_Usuario_Login like ´´´+Trim(S_Login.Text)+´´´)´+ 
            ´AND (S_Usuario_Senha like ´´´+Trim(S_Senha.Text)+´´´)´; 

DataModule1.ADOT_Usuario.Active := True; 
ADOQ_Login.Sql.clear; 
ADOQ_Login.Sql.add(Sql2); 
ADOQ_Login.Open; 

S_Login.clear; 
S_Senha.clear; 

// ShowMessage(Sql.text); 

If not ADOQ_Login.IsEmpty Then 
//*************************\\

    FmLogin.close 
else 
    ShowMessage(´Login ou Senha Inválido!´); 

ADOQ_Login.Close; 

DataModule1.ADOT_Usuario.Active := False; 

end; 



Responder

22/05/2003

Pardal3000

Por um acaso vc está usando Delphi 5 e Windows XP??


Responder

22/05/2003

Sparch

Voce jah experimentou rodar a aplicacao fora do debug do delphi?
Acessando ele direto pelo executavel?
Dependendo da mensagem de erro, caso seja bem lógica nao ha o pq se preocupar tanto tendo em vista que ele está dando esse erro somente quando o usuario informa o login ou a senha que foram digitados erroneamente.

---
Daniel


Responder

22/05/2003

Rafaelunp

Voce jah experimentou rodar a aplicacao fora do debug do delphi? Acessando ele direto pelo executavel? Dependendo da mensagem de erro, caso seja bem lógica nao ha o pq se preocupar tanto tendo em vista que ele está dando esse erro somente quando o usuario informa o login ou a senha que foram digitados erroneamente. --- Daniel


Amigos,

Estou usando o Delphi 5 e Win2000.

Já testei pelo executavel sim, e o erro persiste. Alias, como eu já disse esse erro dá em qualquer form que eu chame e através do DbNavigator deixe o cursor no ultimo registro...
Imagino que seja algum componente que estou usando, pois como estou aprendendo a programar agora, devo estar esquecendo de algo.

Só pra relembrar, estou usando um datamodule com conexao ADO. Neste, para cada tabela tenho um ADO_Table e um DataSource, Todos as tables estao desativadas e estou fazendo a conexao no onShow e no OnClose assim:

DataModule1.ADOT_Usuario.Active := True;

Onde estou errando?


Responder

22/05/2003

Okama

Os DataSouces e Tables estão ´todos´ no DataModule?

Vá isolando o problema tente descobrir em qual linha do código ocorre o erro, remova alguns componente e insira-os novamente...


Responder

22/05/2003

Pardal3000

Prezado amigo,

O Delphi 5 possui um bug nas plataformas Windows XP/2000. O ADO apresenta esse erro mesmo. Fiquei várias semanas quebrando a cabeça também.

Baixe o Update Pack 1 no site da Borland, e uma atualização do ADO nos mesmo site. O Update Pack 1 será requerido para a atualização do segundo.

Pode fazer isso que irá resolver seu problema, com certeza!

Espero ter ajudado,

Pardal3000


Responder