FireBird Com Delphi Field Not Found

31/05/2021

0

Boa noite, estou estudando delphi a alguns meses e resolvi fazer um aplicativo mobile e estou com um problema eu faço a conexão normalmente com o firedac TFDConnection, TFDQuery e DataSource, quando eu digito o código manualmente de limpar o TFDQuery e adicionar o código Sql e ligo via LiveBiding no GriD vai tudo certo, mas eu tentei fazer uma tela de login e o código foi o seguinte:

Login := edtlogin.text;
Senha := edtsenha.text;

TFDQuery.close;
TFDQuery.Sql.Clear;
TFDQuery.Sql...(''''select nome,senha from usuarios'''');
loginsel := fieldbyname(''''nome'''').value;
senhasel := fieldbyname(''''nome'''').value;

If (loginsel = login) and (senhasel = senha) then
Begin
ShowMessage(''''voce está logado'''');
End;

TFDQuery.open;


Ignorem os erros de digitação está correto no meu código, mas estou acostumado com o php é diferente, já até adicionei o componente do driver do FireBird e fica dando o mesmo erro :

Field nome Not Found

Queria saber o que fiz de errado eu tentei citar os campos do select e fazer a comparação para fazer o login mas fica dando está mensagem de erro, parece que não puxa os campos do banco de dados;
Helton Faria

Helton Faria

Responder

Post mais votado

01/06/2021

você não pode obter os dados de um dataset fechado. note que você fecha o dataset (.close), tenta recuperar os dados (.fieldbyname) e só depois abre o dataset (.open).

pelo que eu entendi do teu código, deveria ser algo assim:

Login := edtlogin.text; // login informado
Senha := edtsenha.text; // senha informada

FDQuery.Close;
FDQuery.Sql.Text := 'select nome from usuarios where nome = :login and senha = :password'
FDQuery.ParamByName('login').Asstring := login;
FDQuery.ParamByName('password').Asstring := senha;
FDQuery.Open;

If FDQuery.Eof then
    ShowMessage('Usuário ou senha inválidos');



Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

02/06/2021

Helton Faria

você não pode obter os dados de um dataset fechado. note que você fecha o dataset (.close), tenta recuperar os dados (.fieldbyname) e só depois abre o dataset (.open).

pelo que eu entendi do teu código, deveria ser algo assim:

Login := edtlogin.text; // login informado
Senha := edtsenha.text; // senha informada

FDQuery.Close;
FDQuery.Sql.Text := 'select nome from usuarios where nome = :login and senha = :password'
FDQuery.ParamByName('login').Asstring := login;
FDQuery.ParamByName('password').Asstring := senha;
FDQuery.Open;

If FDQuery.Eof then
    ShowMessage('Usuário ou senha inválidos');







Obrigado pela ajuda eu consegui fazer o que queria meu código ficou assim:
procedure TFrmLogin.rct_fundo_acessarClick(Sender: TObject);
var
  login, senha, login_edt, senha_edt: String;

begin

  login_edt := edt_login.text; // login informado
  senha_edt := edt_senha.text; // senha informada

  DM_Comanda.FDQuery.Close;
  DM_Comanda.FDQuery.Sql.Clear;
  DM_Comanda.FDQuery.Sql.Add('select nome,senha from usuarios where nome = :login and senha = :password');
  DM_Comanda.FDQuery.ParamByName('login').Asstring := login_edt;
  DM_Comanda.FDQuery.ParamByName('password').Asstring := senha_edt;
  DM_Comanda.FDQuery.Open;
  login := DM_Comanda.FDQuery.FieldByName('nome').Value;
  senha := DM_Comanda.FDQuery.FieldByName('senha').Value;

  If (login_edt = login) and (senha_edt = senha) then
  begin
      ShowMessage('Você está logado!!');
  end
  else
  begin
      ShowMessage('Você errou o login ou a senha!!!');
  end;

end;


Só que agora com o else depois do teste ta dando uma mensagem assim: Could not convert variant of type (null) into type (OleStr),
eu não entendo está tudo como String e está falando de converssão o que pode ser ?
Responder

02/06/2021

Emerson Nascimento

se você já está mandando o login e senha nos parâmetros, não é necessário comparar novamente.
você está fazendo assim:
"me traga o nome do usuário que possui esse login e senha que foram digitados"
"agora veja se o login e senha digitados são os mesmo que eu procurei".
não faz sentido porque a busca com parâmetros só terá retorno se o login e senha forem encontrados.
basta:
procedure TFrmLogin.rct_fundo_acessarClick(Sender: TObject);
begin

  DM_Comanda.FDQuery.Close;
  DM_Comanda.FDQuery.SQL.Text := 'select nome from usuarios where nome = :login and senha = :password';
  DM_Comanda.FDQuery.ParamByName('login').Asstring := edt_login.text; // login informado
  DM_Comanda.FDQuery.ParamByName('password').Asstring := edt_senha.text; // senha informada
  DM_Comanda.FDQuery.Open;
 
  If DM_Comanda.FDQuery.Eof then // se está vazio é porque o login ou senha estão errados
    ShowMessage('Você errou o login ou a senha!!!')
  else
    ShowMessage('Você está logado!!');
 
end;

Responder

02/06/2021

Helton Faria

se você já está mandando o login e senha nos parâmetros, não é necessário comparar novamente.
você está fazendo assim:
"me traga o nome do usuário que possui esse login e senha que foram digitados"
"agora veja se o login e senha digitados são os mesmo que eu procurei".
não faz sentido porque a busca com parâmetros só terá retorno se o login e senha forem encontrados.
basta:
procedure TFrmLogin.rct_fundo_acessarClick(Sender: TObject);
begin

  DM_Comanda.FDQuery.Close;
  DM_Comanda.FDQuery.SQL.Text := 'select nome from usuarios where nome = :login and senha = :password';
  DM_Comanda.FDQuery.ParamByName('login').Asstring := edt_login.text; // login informado
  DM_Comanda.FDQuery.ParamByName('password').Asstring := edt_senha.text; // senha informada
  DM_Comanda.FDQuery.Open;
 
  If DM_Comanda.FDQuery.Eof then // se está vazio é porque o login ou senha estão errados
    ShowMessage('Você errou o login ou a senha!!!')
  else
    ShowMessage('Você está logado!!');
 
end;




Sou estudante de Análise de Sistemas, o que certamente a função "eof" faz ?
Responder

02/06/2021

Helton Faria

Mais uma útima pergunta, no php quando eu quero fazer uma verificação se o campo é vazio eu faria um else caso o campo fosse vazio ele exibiria o que eu quizesse,
como eu faço aqui no delphi ? meu código está assim :

procedure TFrmPrincipal.rct_atualizarmesaClick(Sender: TObject);
var
  numesa : integer;

begin
  numesa := edt_numcomand.Text.ToInteger;

  if edt_numcomand.Text <> '' then
  begin

  DM_Comanda.FDQuery.Close;
  DM_Comanda.FDQuery.SQL.Clear;
  DM_Comanda.FDQuery.SQL.Add('select * from MESACARTAO where mesa like :cMesa');
  DM_Comanda.FDQuery.ParamByName('cMesa').AsInteger := numesa;
  DM_Comanda.FDQuery.Open;


  lbl_numesa.Text := edt_numcomand.Text;
  end;



end;[
/quote]

Quando eu clico no botão que filtra as mesas sem nada no campo ele exibe a mensagem para mim :
"" is not a valid integer value for integer type
como eu poderia estar corrigindo isto ?
Responder

02/06/2021

Emerson Nascimento

EoF significa "End Of File" (fim de arquivo).
Se você acabou de abrir a tabela e já está no fim do arquivo quer dizer que não há dados.

Sobre o erro "is not a integer value"... Está ocorrendo porque você está tentando transformar uma string vazia em inteiro.

Para evitar o erro coloque a linha da atribuição de numesa dentro do if

Responder

04/06/2021

Helton Faria

EoF significa "End Of File" (fim de arquivo).
Se você acabou de abrir a tabela e já está no fim do arquivo quer dizer que não há dados.

Sobre o erro "is not a integer value"... Está ocorrendo porque você está tentando transformar uma string vazia em inteiro.

Para evitar o erro coloque a linha da atribuição de numesa dentro do if



Emerson estou acostumado com o php web, muito obrigado por ter me ajudado eu estou começando agora a estudar o delphi há muitas diferenças, no php não precisa de tudo isso ele já entende o tipo de variável se é inteirou ou string e faz as conversões automáticamente, para mim tudo é novo agora. Obrigado!!!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar