PDA

Ver la Versión Completa : Crear login en delphi7 + Interbase


Djsilver5
12-08-2017, 20:47:21
Buenas Tardes ojala me puedan ayudar soy nuevo en esto (principiante) pero estoy intentado hacer un login, la idea es que los DBLOOKUPCOMBOBOX (edtEmpresa, edtAgencia, edtUsuario) estén enlazados con el DBEDIT (edtPassword) todo enlazado con la base de datos de ibexpert que tengo es decir que cuando escribo el password del usuario seleccionado en (edtPassword) busca en la base de datos el mismo password del usuario y entra correctamente al FORM2 que tiene como nombre de (SistemaPrincipal) y cuando no es el password me salga un mensaje de incorrecto, en mi caso en ibexpert tengo las tablas que son EMPRESA, PUNTOS_DE_VENTAS, SIS_USUARIOS.
En la Tabla EMPRESA en la opcion datos se encuentra el DES_EMP (EL NOMBRE DE LA EMPRESA)
En la Tabla PUNTOS_DE_VENTAS en la opción datos se encuentra el DES_PTO.(EL NOMBRE DE LA OFICINA)
En la Tabla SIS_USUARIOS en la opción datos se encuentra el DES_USUARIO(EL NOMBRE DE USUARIO) y PWD_USUARIO.(LA CONTRASEÑA DEL USUARIO)

NOTA: YA TENGO CONECTADO EL INTERBASE CON DELPHI7 USANDO EL DATAMODULE1:

TENGO (IBDatabase1, IBTransaction1, IBSToredProc1) conectados.

y para el DBLOOKUPCOMBOBOX DE EMPRESA tengo IBTable con el nombre (IBTEmpresas), TDataSource con el nombre (DSEmpresas)
TIBQuery con el nombre(IBQEmpresas1) y TDataSource con el nombre(DSEmpresas1).

para el DBLOOKUPCOMBOBOX DE AGENCIA tengo IBTable con el nombre (IBTAgencia), TDataSource con el nombre (DSAgencia)
TIBQuery con el nombre(IBQAgencia1) y TDataSource con el nombre(DSAgencia1)

para el DBLOOKUPCOMBOBOX DE USUARIO tengo IBTable con el nombre (IBTUsuarios), TDataSource con el nombre (DSUsuarios)
TIBQuery con el nombre(IBQUsuarios1) y TDataSource con el nombre(DSUsuarios1)

para el DBEDIT DE PASSWORD tengo IBTable con el nombre (IBTPassword), TDataSource con el nombre (DSPassword)
TIBQuery con el nombre(IBQPassword1) y TDataSource con el nombre(DSPassword1)

Casimiro Notevi
12-08-2017, 20:52:05
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias por tu colaboración :)

Djsilver5
12-08-2017, 21:12:37
Gracias lo leeré y lo tendré en cuenta Amigo.

ecfisa
12-08-2017, 22:35:38
Hola Djsilver5.

¿ Usas tablas diferentes para usuarios y contraseñas ?

Saludos :)


Pd: El mensaje es muy contrastante, lo hace difícil de leer.

Djsilver5
12-08-2017, 22:42:25
ecfisa, en la base de datos interbase en la tabla SIS_USUARIOS están en una sola fila el nombre del usuario de (DES_USUARIO) y la contraseña del usuario de (PWD_USUARIO)
en Delphi 7 en DataModule los he puesto separado para el DBLOOKUPCOMBOBOX del usuario he puesto un TIBTABLE enlazado con un TDataSource + TIBQuery enlazado con TDataSource1
y de igual forma con el DBEDIT del Password le he puesto un TIBTABLE enlazado con un TDataSource para que muestre el password de la base de datos

Casimiro Notevi
12-08-2017, 22:55:29
Pero, exactamente, ¿el problema cuál es?

Djsilver5
12-08-2017, 23:25:51
el problema es de como puedo crear un login enlazando los 3 DBLOOKUPCOMBOBOX (EMPRESA, AGENCIA,USUARIO) + DBEDIT (PASSWORD) con la base de datos,
para que cuando escoja uno de los usuarios de la base de datos y escriba solamente la contraseña que aparece también en la base de datos y si es el password que aparece en la base datos, ingrese correctamente al form 2, y si no es la misma contraseña que salga un aviso también diciendo password incorrecto.

ecfisa
13-08-2017, 12:24:15
Hola.

Con respecto a la verificación del usuario y contraseña te sugiero usar componentes TEdit en lugar de TDBEdit. Y, suponiendo que realizaras la verificación de los datos cuando el usuario presiona el botón aceptar, podrías hacer algo así:

...
implementation

function LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
begin
//
qy.Close;
qy.SQL.Clear;
qy.SQL.Add('SELECT DES_USUARIO, PWD_USUARIO');
qy.SQL.Add('FROM SIS_USUARIOS WHERE DES_USUARIO = :NOMBRE');
qy.ParamByName('NOMBRE').AsString := nam;
qy.Open;
Result := not qy.IsEmpty and (qy.FieldByName('PWD_USUARIO').AsString = pwd);
qy.Close;
end;


Un ejemplo del uso:

procedure TForm1.btnAceptarClick(Sender: TObject);
begin
if not LoginAccepted(Datamodule1.IBQPassword1, EditUsuario.Text, EditPassword.Text) then
raise Exception.Create('El usuario o la contraseña son inválidos.');
...


El punto 12 de la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), explicita que sólo se permite una pregunta por hilo, por favor abre otro nuevo con la consulta hacerca de como enlazar los TDBLoockupComboBox con las tablas.

Saludos :)

Djsilver5
13-08-2017, 19:09:26
ecfisa gracias por responder a mi pregunta, cuando ingreso el código (function LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean; ) se pinta de color rojo y me bota error nose si lo este haciendo bien pero yo lo puse aquí(este es todo el código del form con el nombre (AccesoalSistema)):


unit AccesoalSistema;

interface

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

type
TLogin = class(TForm)
Panel: TPanel;
Text1: TLabel;
Text2: TLabel;
Empresa: TLabel;
Agencia: TLabel;
Usuario: TLabel;
Password: TLabel;
edtEmpresa: TDBLookupComboBox;
edtAgencia: TDBLookupComboBox;
edtUsuario: TDBLookupComboBox;
Aceptar: TBitBtn;
Cancelar: TBitBtn;
edtPassword: TEdit;
procedure CancelarClick(Sender: TObject);
procedure AceptarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Login: TLogin;

implementation

uses DataModule01, SistemaPrincipal01;
function LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
begin
//
qy.Close;
qy.SQL.Clear;
qy.SQL.Add('SELECT DES_USUARIO, PWD_USUARIO');
qy.SQL.Add('FROM SIS_USUARIOS WHERE DES_USUARIO = :NOMBRE');
qy.ParamByName('NOMBRE').AsString := nam;
qy.Open;
Result := not qy.IsEmpty and (qy.FieldByName('PWD_USUARIO').AsString = pwd);
qy.Close;
end;


{$R *.dfm}

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

procedure TLogin.AceptarClick(Sender: TObject);
begin

end;

procedure TForm1.btnAceptarClick(Sender: TObject);
begin
if not LoginAccepted(Datamodule1.IBQPassword1, EditUsuario.Text, EditPassword.Text) then
raise Exception.Create('El usuario o la contraseña son inválidos.');
end.

ecfisa
13-08-2017, 19:49:58
Hola.
ecfisa gracias por responder a mi pregunta, cuando ingreso el código (function LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean; ) se pinta de color rojo y me bota error...
Por favor, publica exactamente el mensaje de error que te muestra.


Saludos :)

Djsilver5
13-08-2017, 20:02:15
Estos errores me bota en la parte de abajo (code)
[Error] AccesoalSistema.pas(37): Undeclared identifier: 'TIBQuery'
[Error] AccesoalSistema.pas(40): Missing operator or semicolon (cuando doy clic me pinta de color rojo el qy.Close; )
[Error] AccesoalSistema.pas(41): Missing operator or semicolon (cuando doy clic me pinta de color rojo el qy.SQL.Clear; )
[Error] AccesoalSistema.pas(42): Missing operator or semicolon (cuando doy clic me pinta de color rojo el qy.SQL.Add('SELECT DES_USUARIO, PWD_USUARIO'); )
[Error] AccesoalSistema.pas(43): Missing operator or semicolon (cuando doy clic me pinta de color rojo el qy.SQL.Add('FROM SIS_USUARIOS WHERE DES_USUARIO = :NOMBRE'); )
[Error] AccesoalSistema.pas(44): Missing operator or semicolon (cuando doy clic me pinta de color rojo el qy.ParamByName('NOMBRE').AsString := nam; )
[Error] AccesoalSistema.pas(45): Missing operator or semicolon (cuando doy clic me pinta de color rojo el qy.Open; )
[Error] AccesoalSistema.pas(46): Missing operator or semicolon (cuando doy clic me pinta de color rojo el Result := not qy.IsEmpty and (qy.FieldByName('PWD_USUARIO').AsString = pwd); )
[Error] AccesoalSistema.pas(46): ')' expected but identifier 'FieldByName' found
[Error] AccesoalSistema.pas(46): 'END' expected but ')' found
[Error] AccesoalSistema.pas(58): ';' expected but '.' found
[Error] AccesoalSistema.pas(60): Undeclared identifier: 'IBQPassword1'
[Error] AccesoalSistema.pas(60): Undeclared identifier: 'EditUsuario'
[Error] AccesoalSistema.pas(60): Not enough actual parameters
[Error] AccesoalSistema.pas(62): ';' expected but '.' found
[Error] AccesoalSistema.pas(64): Declaration expected but end of file found
[Fatal Error] Sistema.dpr(9): Could not compile used unit 'AccesoalSistema.pas'

ecfisa
13-08-2017, 20:48:47
Hola.

Empecemos por el primer error... quita la función del form Login y declarala como un método de DataModule1:

...
uses ..., IBQuery;
...
type
TDataModule1 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBQPassword: TIBQuery;
//...
private
//...
public
function LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
end;

var
DataModule1: TDataModule1;

implementation

function TDataModule1.LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
begin
qy.Close;
qy.SQL.Clear;
qy.SQL.Add('SELECT * FROM USUARIO');
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;
end;
...

Estando la unidad de DataModule1 incluída en el form "Login", llama a la función de este modo:

procedure TLogin.btnAceptarClick(Sender: TObject);
begin
if not DataModule1.LoginAccepted(DataModule1.IBQPassword, EditUsuario.Text, EditPassword.Text) then
raise Exception.Create('El usuario o la contraseña son inválidos.');
end;


Saludos :)

Djsilver5
13-08-2017, 20:58:40
cuando le doy en Run me bota este error:
Error in module AccesoalSistema: Declaration of class Tlogin is missing or incorrect

ecfisa
13-08-2017, 21:53:43
Hola.

Revisa si por descuido no modificaste la declaración de TLogin, por ejemplo si originalmente era:

type
TLogin = class(TForm)

modificaste por:

type
TLogin = class()
...
// o por:
type
TLogin = class(TObject)
...
// o por:
type
TLogin = class
...
// etc,...


Saludos :)

Djsilver5
13-08-2017, 22:05:27
Lo quite con todo lo que tenia
"type
TLogin = class(TForm)"
Y copie este:
type
TDataModule1 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBQPassword: TIBQuery;

ecfisa
13-08-2017, 22:58:04
Hola.

Claro, de allí el error.

Básicamente deberías tener algo similar a lo siguiente,

TDataModule:

unit unit_name; // nombre con que guardaste la unidad

interface

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

type
TDataModule1 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBQPassword: TIBQuery;
//...
private
//...
public
function LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
end;

var
DataModule1: TDataModule1;

implementation {$R *.dfm}
...

function TDataModule1.LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
begin
qy.Close;
qy.SQL.Clear;
qy.SQL.Add('SELECT * FROM USUARIO');
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;
end;
...
end.


Formulario login:

unit Unit1;

interface

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

type
TLogin = class()
...
EditUsuario: TEdit;
EditPassword: TEdit;
btnAceptar: TButton;
procedure btnAceptarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Login: TLogin;

implementation {$R *.dfm}

uses unit_name; // nombre con que guardaste el DataModule

...
procedure TLogin.btnAceptarClick(Sender: TObject);
begin
if not DataModule1.LoginAccepted(DataModule1.IBQPassword, EditUsuario.Text, EditPassword.Text) then
raise Exception.Create('El usuario o la contraseña son inválidos.');
end;
...
end.


Saludos :)

Djsilver5
14-08-2017, 01:18:15
Hola ecfisa nuevamente al ingresar los 2 códigos en DATAMODULE02 y el Formulario de Login todo conecta correctamente pero cuando intento seleccionar el usuario del DBLOOKUPCOMBOBOX y pongo el password y clic en aceptar me bota el siguiente error:

(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.)

Así ingrese los 2 formularios editando algunos nombres:

DATAMODULE02

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(qy: TIBQuery; const nam, pwd: string): Boolean;
end;

var
DataModule2: TDataModule2;

implementation {$R *.dfm}

function TDataModule2.LoginAccepted(qy: TIBQuery; const nam, pwd: string): Boolean;
begin
qy.Close;
qy.SQL.Clear;
qy.SQL.Add('SELECT * FROM USUARIO');
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;
end;

end.


Formulario del Login:

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;
Aceptar: TBitBtn;
Cancelar: TBitBtn;
edtEmpresa: TDBLookupComboBox;
edtAgencia: TDBLookupComboBox;
edtUsuarios: TDBLookupComboBox;
edtPassword: TEdit;
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(DataModule2.IBQPassword, edtUsuarios.Text, edtPassword.Text) then
raise Exception.Create('El usuario o la contraseña son inválidos.');
end;
end.

ecfisa
14-08-2017, 01:56:11
Hola.

Es que no termino de entender la lógica de tu código, pensé que ingresabas usuario y contraseña mediante los DBEdit, pero aparentemente seleccionas el usuario desde el DBLookupComboBox...

Estoy suponiendo que la función LoginAccepted altera la cadena SQL original del IBQuery que alimenta el DBLookupComboBox (si no estoy apreciando equívocamente como funciona).

Para evitar esa situación cambia la función anterior por esta que crea una consulta temporal para verificar la contraseña:

function TDataModule1.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 USUARIO');
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;


Y también tendrás que cambiar los argumentos al llamar al método LoginAccepted,

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.');
end;

ya que ahora el nombre de usuario se toma desde el DBLookupComboBox.

Saludos :)

Djsilver5
14-08-2017, 18:17:44
Buenos días amigo, ayer estaba intentado poner el código tal cual me dijiste y me bota estos error del DataModule.
[Error] DataModule02.pas(52): Undeclared identifier: 'TDataModule2'
[Error] DataModule02.pas(52): 'END' expected but 'CONST' found
[Error] DataModule02.pas(52): Undeclared identifier: 'pwd'
[Error] DataModule02.pas(52): '=' expected but ';' found
[Error] DataModule02.pas(53): Expression expected but 'VAR' found
[Error] DataModule02.pas(55): Statements not allowed in interface part
[Error] DataModule02.pas(58): Undeclared identifier: 'IBDataBase1'
[Error] DataModule02.pas(59): Undeclared identifier: 'IBTransaction1'
[Error] DataModule02.pas(66): Undeclared identifier: 'Result'
[Error] DataModule02.pas(66): Operator not applicable to this operand type
[Error] DataModule02.pas(73): Declaration expected but end of file found
[Fatal Error] Sistema.dpr(7): Could not compile used unit 'DataModule02.pas'

EL código lo puse así:
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 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 USUARIO');
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;

ecfisa
14-08-2017, 19:12:57
Hola.

Uff! hiciste todo un cóctel ahí :), en principio revisa si faltan o tienen otro nombre los siguientes componentes: TDataModule, TIBDataBase y TIBTransaction.

Luego el esqueleto de tu DataModule debería ser aproximadamente así:

unit Unit2;

interface

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

type
TDataModule2 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
...

private
{ Private declarations }

public
function LoginAccepted(const nam, pwd: string): Boolean; // <- Declaración del método
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 USUARIO');
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.

Si cotejas con tu código, enseguida notarás que pusiste la implementación del método donde debería ir la declaración.

Saludos :)

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.

(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:

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
(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.

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.
...
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:

...
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.

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 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
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.
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.

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:
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
Hola.

Correcto, ya funciona como debería.

Ahora, para que no aparezca el mensaje que lanza la línea:
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 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:
https://s13.postimg.org/4uit6vh5z/DJSilver.gif
Sólo agregué una línea:

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:

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
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
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)

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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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
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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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
¿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
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 SistemaPrincipal.Enabled = True

Djsilver5
15-08-2017, 18:34:21
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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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
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 (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DBCtrls_TDBEdit.html), el componente TEdit (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/StdCtrls_TEdit.html) no implementa el acceso a datos de una BD.

Saludos :)

Djsilver5
15-08-2017, 21:35:45
No. A diferencia del TDBEdit (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DBCtrls_TDBEdit.html), el componente TEdit (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/StdCtrls_TEdit.html) no implementa el acceso a datos de una BD.

Saludos :)
Entonces en el caso mio cual seria, al comienzo tenia el DBEdit ya que ese si apuntaba normal el password de la base de datos pero no sabia el codigo, después con el código que me enseñaste, me dijiste que ponga solo un edit simple, ahora cuando doy clic en Run(F9) para ver si funciona escojo el usuario en el DBLOOKUPCOMOBOX y pongo la contraseña de la base de datos y cuando doy clic en el botón Aceptar me sale el mensaje de usuario o contraseña incorrecta y después se habilita el from2 y de igual forma si pongo una contraseña diferente que no esta en la base de datos o lo dejo vació después de dar clic en Aceptar me sale el mismo mensaje de usuario o contraseña incorrecta y después de eso igual se habilita el from2.

Casimiro Notevi
15-08-2017, 23:10:42
http://terawiki.clubdelphi.com/Delphi/Manuales/?download=Curso_de_Delphi_basico_pdf_.rar
http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_4_pdf_.zip
http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_6_pdf_.rar