Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Crear login en delphi7 + Interbase (https://www.clubdelphi.com/foros/showthread.php?t=92158)

Djsilver5 14-08-2017 19:30:42

Amigo al corregir el código todo me funciona correctamente me guarda el código y arranca el Run (F9) pero cuando escojo el Usuario en el DBLOOKUPCOMOBOX y escribo el Password de la BaseDatos y doy clic en aceptar me sale el siguiente error.
Cita:

(Project Sistema.exe raised exception class EIBInterBaseError with message 'Dynamic SQL Error SQL error code= -204
Table unknown
USUARIO'.Process stopped. Use Step or Run to continue.)

ecfisa 14-08-2017 20:02:37

Hola

En la siguiente línea del ejemplo:
Código Delphi [-]
qy.SQL.Add('SELECT * FROM USUARIO');
cambia la palabra USUARIO por el nombre que le diste a tu tabla.

Saludos :)

Djsilver5 14-08-2017 20:14:51

Hola, ahora me bota el siguiente error
Cita:

(Project Sistema.exe raised exception class EIBInterBaseError with message 'Dynamic SQL Error SQL error code= -206
Table unknown
USUARIO'.Process stopped. Use Step or Run to continue.)
NOTA: En mi Base de Datos la tabla principal se llama SIS_USUARIOS, dentro de esa tabla en la sección datos esta el DES_USUARIO y PWD_USUARIO debajo de esos 2 campos se encuentra el text del usuario y password.

Código Delphi [-]
unit DataModule02;

interface

uses
  SysUtils, Classes, DB, IBCustomDataSet, IBDatabase, IBQuery, IBTable,
  IBStoredProc;

type
  TDataModule2 = class(TDataModule)
    IBTransaction1: TIBTransaction;
    Procedimientos: TIBStoredProc;
    IBTEmpresas: TIBTable;
    IBQEmpresas1: TIBQuery;
    DSEmpresas: TDataSource;
    DSEmpresas1: TDataSource;
    IBTAgencia: TIBTable;
    IBQAgencia1: TIBQuery;
    DSAgencia: TDataSource;
    DSAgencia1: TDataSource;
    IBTUsuarios: TIBTable;
    DSUsuarios: TDataSource;
    IBQUsuarios1: TIBQuery;
    DSUsuarios1: TDataSource;
    IBDatabase1: TIBDatabase;
    IBTDNI: TIBTable;
    IBTDNIDES_DOC_IDE: TIBStringField;
    IBTDNICOD_DOC_IDE: TIBStringField;
    DSDNI: TDataSource;
    IBQDNI: TIBQuery;
    DTDNI1: TDataSource;
    IBTTipodePersona: TIBTable;
    IBQTipodePersona: TIBQuery;
    DSTipodePersona: TDataSource;
    DSTipodePersona1: TDataSource;
    IBTEstadoCivil: TIBTable;
    IBQEstadoCivil: TIBQuery;
    DSEstadoCivil: TDataSource;
    DSEstadoCivil1: TDataSource;
    IBTZona: TIBTable;
    IBQZona: TIBQuery;
    DSZona: TDataSource;
    DSZona1: TDataSource;
    IBTPassword: TIBTable;
    DSPassword: TDataSource;
    IBQPassword: TIBQuery;
    DSPassword1: TDataSource;
    //
  private
    //
  public
function LoginAccepted(const nam, pwd: string): Boolean;
  end;

var
  DataModule2: TDataModule2;

implementation {$R *.dfm}

// Implementación del método
function TDataModule2.LoginAccepted(const nam, pwd: string): Boolean;
var
  qy: TIBQuery;
begin
  qy := TIBQuery.Create(nil);
  try
    qy.Database := IBDataBase1;
    qy.Transaction := IBTransaction1;
    qy.Close;
    qy.SQL.Clear;
    qy.SQL.Add('SELECT * FROM SIS_USUARIOS');
    qy.SQL.Add('WHERE NOMBRE = :NOMBRE');
    qy.ParamByName('NOMBRE').AsString := nam;
    qy.Open;
    Result := not qy.IsEmpty and (qy.FieldByName('CLAVE').AsString = pwd);
    qy.Close;
  finally
    qy.Free;
  end;
end;

end.

ecfisa 14-08-2017 20:28:29

Hola.
Cita:

Empezado por Djsilver5 (Mensaje 520250)
...
NOTA: En mi Base de Datos la tabla principal se llama SIS_USUARIOS, dentro de esa tabla en la sección datos esta el DES_USUARIO y PWD_USUARIO debajo de esos 2 campos se encuentra el text del usuario y password.
...

Entonces la consulta sql en tu caso debería ser:
Código Delphi [-]
...
    qy.SQL.Add('SELECT * FROM SIS_USUARIOS');
    qy.SQL.Add('WHERE DES_USUARIO = :NOMBRE');
    qy.ParamByName('NOMBRE').AsString := nam;
    qy.Open;
    Result := not qy.IsEmpty and (qy.FieldByName('PWD_USUARIO').AsString = pwd);
...

Saludos :)

Djsilver5 14-08-2017 20:37:37

YA acepto el código pero cuando selecciono el Usuario y escribo la contraseña, despues de dar clic al boton aceptar me sale el siguiente error.

Cita:

Project Sistema.exe raise Exception class Exception with message'El usuario o la contraseña son inválidos'.Process stopped. Use Step or Run to continue.
justo al final en
Código Delphi [-]
procedure TAccesoSistema.AceptarClick(Sender: TObject);
begin
  if not DataModule2.LoginAccepted(edtUsuarios.Text, edtPassword.Text) then
     raise Exception.Create('El usuario o la contraseña son inválidos.');
end;
end.


En el codigo de Form AccesoAlSistema
Código Delphi [-]
unit AccesoAlSistema;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, Buttons, ExtCtrls;

type
  TAccesoSistema = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Empresa: TLabel;
    Agencia: TLabel;
    Usuarios: TLabel;
    Password: TLabel;
    Cancelar: TBitBtn;
    edtEmpresa: TDBLookupComboBox;
    edtAgencia: TDBLookupComboBox;
    edtUsuarios: TDBLookupComboBox;
    edtPassword: TEdit;
    Aceptar: TBitBtn;
    procedure CancelarClick(Sender: TObject);
    procedure AceptarClick(Sender: TObject);
    private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  AccesoSistema: TAccesoSistema;

implementation  {$R *.dfm}

uses DataModule02;



procedure TAccesoSistema.CancelarClick(Sender: TObject);
begin
close;
end;
procedure TAccesoSistema.AceptarClick(Sender: TObject);
begin
  if not DataModule2.LoginAccepted(edtUsuarios.Text, edtPassword.Text) then
    raise Exception.Create('El usuario o la contraseña son inválidos.');
end;
end.

ecfisa 14-08-2017 20:57:12

Hola.
Cita:

Empezado por Djsilver5 (Mensaje 520252)
YA acepto el código pero cuando selecciono el Usuario y escribo la contraseña, despues de dar clic al boton aceptar me sale el siguiente error.
Cita:

Project Sistema.exe raise Exception class Exception with message'El usuario o la contraseña son inválidos'.Process stopped. Use Step or Run to continue.

Correcto, ya funciona como debería.

Ahora, para que no aparezca el mensaje que lanza la línea:
Código Delphi [-]
raise Exception.Create('El usuario o la contraseña son inválidos.');
tanto el nombre como la contraseña deben coincidir con los almacenados en la tabla para ingresar al programa (recuerda que es case sensitive).

Saludos :)

Djsilver5 14-08-2017 21:03:20

Cita:

Empezado por ecfisa (Mensaje 520253)
Hola.

Correcto, ya funciona como debería.

Ahora, para que no aparezca el mensaje que lanza la línea:
Código Delphi [-]
raise Exception.Create('El usuario o la contraseña son inválidos.');
tanto el nombre como la contraseña deben coincidir con los almacenados en la tabla para ingresar al programa (recuerda que es case sensitive).

Saludos :)

La contraseña que puse coincide con el de la base de datos y el usuario también pero aun asi me aparece el mensaje

Djsilver5 14-08-2017 21:23:01

ecfisa amigo cuando quito el
Código Delphi [-]
 if not DataModule2.LoginAccepted(edtUsuarios.Text, edtPassword.Text) then
    raise Exception.Create('El usuario o la contraseña son inválidos.');
me deja entrar normal sin error pero cuando pongo otra contrasseña diferente igual entra

ecfisa 14-08-2017 23:00:42

Hola.

He probado el código que te puse de ejemplo y como podrás ver, funciona correctamente:

Sólo agregué una línea:
Código Delphi [-]
procedure TLogin.btnAceptarClick(Sender: TObject);
begin
  if not DataModule1.LoginAccepted(DBLookupComboBox1.Text, EditPassword.Text) then
    raise Exception.Create('El usuario o la contraseña son inválidos.');
  ShowMessage('INGRESA...'); // <--- LINEA AGREGADA
end;

Saludos :)

Djsilver5 14-08-2017 23:36:49

a mi me sale:

Cita:

Project Sistema.exe raise Exception class Exception with message'El usuario o la contraseña son inválidos'.Process stopped. Use Step or Run to continue.
después de dar al botón Aceptar y cuando vuelvo a poner Run (F9) me sale El usuario o la contraseña son invalidos le doy Aceptar y me abre el from2.
de igual manera si no pongo contraseña y soy aceptar el en boton me sale este error
Cita:

Project Sistema.exe raise Exception class Exception with message'El usuario o la contraseña son inválidos'.Process stopped. Use Step or Run to continue.
y cuando vuelvo a poner Run (F9) me sale El usuario o la contraseña son invalidos le doy Aceptar y me abre el from2.

Casimiro Notevi 14-08-2017 23:46:26

Asegúrate de seguir los pasos y el código que te ha indicado el maestro ecfisa.

Djsilver5 14-08-2017 23:59:19

CASEMIRO HOLA, CLARO ESTA TAL CUAL ME AYUDO ESTOS CODIGOS.
CODIGO EN DATAMODULE2
Código Delphi [-]
unit DataModule02;

interface

uses
  SysUtils, Classes, DB, IBCustomDataSet, IBDatabase, IBQuery, IBTable,
  IBStoredProc;

type
  TDataModule2 = class(TDataModule)
    IBTransaction1: TIBTransaction;
    Procedimientos: TIBStoredProc;
    IBTEmpresas: TIBTable;
    IBQEmpresas1: TIBQuery;
    DSEmpresas: TDataSource;
    DSEmpresas1: TDataSource;
    IBTAgencia: TIBTable;
    IBQAgencia1: TIBQuery;
    DSAgencia: TDataSource;
    DSAgencia1: TDataSource;
    IBTUsuarios: TIBTable;
    DSUsuarios: TDataSource;
    IBQUsuarios1: TIBQuery;
    DSUsuarios1: TDataSource;
    IBDatabase1: TIBDatabase;
    IBTDNI: TIBTable;
    IBTDNIDES_DOC_IDE: TIBStringField;
    IBTDNICOD_DOC_IDE: TIBStringField;
    DSDNI: TDataSource;
    IBQDNI: TIBQuery;
    DTDNI1: TDataSource;
    IBTTipodePersona: TIBTable;
    IBQTipodePersona: TIBQuery;
    DSTipodePersona: TDataSource;
    DSTipodePersona1: TDataSource;
    IBTEstadoCivil: TIBTable;
    IBQEstadoCivil: TIBQuery;
    DSEstadoCivil: TDataSource;
    DSEstadoCivil1: TDataSource;
    IBTZona: TIBTable;
    IBQZona: TIBQuery;
    DSZona: TDataSource;
    DSZona1: TDataSource;
    IBTPassword: TIBTable;
    DSPassword: TDataSource;
    IBQPassword: TIBQuery;
    DSPassword1: TDataSource;
  private
    { Private declarations }
  public
    function LoginAccepted(const nam, pwd: string): Boolean;
  end;

var
  DataModule2: TDataModule2;

implementation {$R *.dfm}

// Implementación del método
function TDataModule2.LoginAccepted(const nam, pwd: string): Boolean;
var
  qy: TIBQuery;
begin
  qy := TIBQuery.Create(nil);
  try
    qy.Database := IBDataBase1;
    qy.Transaction := IBTransaction1;
    qy.Close;
    qy.SQL.Clear;
    qy.SQL.Add('SELECT * FROM SIS_USUARIOS');
    qy.SQL.Add('WHERE DES_USUARIO = :NOMBRE');
    qy.ParamByName('NOMBRE').AsString := nam;
    qy.Open;
    Result := not qy.IsEmpty and (qy.FieldByName('PWD_USUARIO').AsString = pwd);
    qy.Close;
  finally
    qy.Free;
  end;
  end;
begin

end;

end.

CODIGO EN EL LOGIN CON EL NOMBRE(AccesoAlSistema)

Código Delphi [-]
unit AccesoAlSistema;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, DBCtrls;

type
  TAccesoSistema = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    edtPassword: TEdit;
    Empresa: TLabel;
    Agencia: TLabel;
    Usuarios: TLabel;
    Label6: TLabel;
    Aceptar: TBitBtn;
    Cancelar: TBitBtn;
    edtEmpresa: TDBLookupComboBox;
    edtAgencia: TDBLookupComboBox;
    edtUsuarios: TDBLookupComboBox;
    procedure CancelarClick(Sender: TObject);
    procedure AceptarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  AccesoSistema: TAccesoSistema;

implementation

uses DataModule02, SistemaIntegradoWincab;

{$R *.dfm}

procedure TAccesoSistema.CancelarClick(Sender: TObject);
begin
close;
end;

procedure TAccesoSistema.AceptarClick(Sender: TObject);
begin
SistemaPrincipal.Enabled:=True;
if not DataModule2.LoginAccepted(edtUsuarios.Text, edtPassword.Text) then
    raise Exception.Create('El usuario o la contraseña son inválidos.');
    ShowMessage('INGRESA...'); // <--- LINEA AGREGADA
end;

end.

Casimiro Notevi 15-08-2017 10:29:54

Como puedes ver en la imagen que ha puesto ecfisa, el código funciona bien, así que tan solo quedan dos posibilidades, que no lo hayas usado correctamente o que tengas algo más que no hemos visto.
Revisa con tranquilidad el código que ha puesto ecfisa y encontrarás el error.
Por cierto, creo que no has leido nuestra guía de estilo, mira concretamente el punto 6.

egostar 15-08-2017 16:10:40

¿Y estas apuntando a la base de datos correcta? :rolleyes:

Saludos

maeyanes 15-08-2017 16:32:07

Hola...

Viendo el código, veo que en el método TAccesoSistema.AceptarClick, primero activas el "sistema principal" (SistemaPrincipal.Enabled = True) y luego validas la contraseña, es por eso que aun si la contraseña no es válida, el "sistema principal" seguirá activo, aunque mandes un mensaje de error (la excepción). Otra cosa, cuando la contraseña no sea válida, no lances una excepción, es mejor indicarlo con un MessageBox.



Saludos...

Djsilver5 15-08-2017 18:09:18

Cita:

Empezado por Casimiro Notevi (Mensaje 520276)
Como puedes ver en la imagen que ha puesto ecfisa, el código funciona bien, así que tan solo quedan dos posibilidades, que no lo hayas usado correctamente o que tengas algo más que no hemos visto.
Revisa con tranquilidad el código que ha puesto ecfisa y encontrarás el error.
Por cierto, creo que no has leido nuestra guía de estilo, mira concretamente el punto 6.

Si lo he leído ya cuando mande el mensaje recién me había dado cuenta que estaba en mayuscula y como no pude editar, se quedo así.

Djsilver5 15-08-2017 18:09:56

Cita:

Empezado por egostar (Mensaje 520279)
¿Y estas apuntando a la base de datos correcta? :rolleyes:

Saludos

Así es, esta apuntado todo a la base de datos correctamente.

Djsilver5 15-08-2017 18:13:13

Cita:

Empezado por maeyanes (Mensaje 520280)
Hola...

Viendo el código, veo que en el método TAccesoSistema.AceptarClick, primero activas el "sistema principal" (SistemaPrincipal.Enabled = True) y luego validas la contraseña, es por eso que aun si la contraseña no es válida, el "sistema principal" seguirá activo, aunque mandes un mensaje de error (la excepción). Otra cosa, cuando la contraseña no sea válida, no lances una excepción, es mejor indicarlo con un MessageBox.



Saludos...

y como pongo el código para MessageBox en vez de excepción y que me mande al from2 quitando el
Cita:

SistemaPrincipal.Enabled = True

Djsilver5 15-08-2017 18:34:21

Cita:

Empezado por Casimiro Notevi (Mensaje 520276)
Como puedes ver en la imagen que ha puesto ecfisa, el código funciona bien, así que tan solo quedan dos posibilidades, que no lo hayas usado correctamente o que tengas algo más que no hemos visto.
Revisa con tranquilidad el código que ha puesto ecfisa y encontrarás el error.
Por cierto, creo que no has leido nuestra guía de estilo, mira concretamente el punto 6.

El Edit(Stdctrls) se tiene que apuntar a la base de datos, porque yo solo agrege el Edit para el password, sera por eso.

ecfisa 15-08-2017 21:20:03

Cita:

Empezado por Djsilver5 (Mensaje 520286)
El Edit(Stdctrls) se tiene que apuntar a la base de datos, porque yo solo agrege el Edit para el password, sera por eso.

No. A diferencia del TDBEdit, el componente TEdit no implementa el acceso a datos de una BD.

Saludos :)


La franja horaria es GMT +2. Ahora son las 21:44:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi