Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
Question Crear login en delphi7 + Interbase

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)
Imágenes Adjuntas
Tipo de Archivo: jpg imagen.jpg (34,1 KB, 4 visitas)
Responder Con Cita
  #2  
Antiguo 12-08-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.477
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración
Responder Con Cita
  #3  
Antiguo 12-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
Thumbs up

Gracias lo leeré y lo tendré en cuenta Amigo.
Responder Con Cita
  #4  
Antiguo 12-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Djsilver5.

¿ Usas tablas diferentes para usuarios y contraseñas ?

Saludos


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

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 12-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 12-08-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.477
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pero, exactamente, ¿el problema cuál es?
Responder Con Cita
  #7  
Antiguo 12-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 13-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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í:
Código Delphi [-]
...
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:
Código Delphi [-]
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, 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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 13-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
Gracias ecfisa

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

Código Delphi [-]
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.

Última edición por ecfisa fecha: 13-08-2017 a las 19:40:58. Razón: Agregar etiquetas [DELPHI][/DELPHI]
Responder Con Cita
  #10  
Antiguo 13-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Djsilver5 Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 13-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
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'
Responder Con Cita
  #12  
Antiguo 13-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Empecemos por el primer error... quita la función del form Login y declarala como un método de DataModule1:
Código Delphi [-]
...
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:
Código Delphi [-]
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 13-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
cuando le doy en Run me bota este error:
Error in module AccesoalSistema: Declaration of class Tlogin is missing or incorrect
Responder Con Cita
  #14  
Antiguo 13-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Revisa si por descuido no modificaste la declaración de TLogin, por ejemplo si originalmente era:
Código Delphi [-]
type
  TLogin = class(TForm)
modificaste por:
Código Delphi [-]
type
  TLogin = class()
  ...
// o por:
type
  TLogin = class(TObject)
  ...
// o por:
type
  TLogin = class
   ...
// etc,...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #15  
Antiguo 13-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
Lo quite con todo lo que tenia
"type
TLogin = class(TForm)"
Y copie este:
type
TDataModule1 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBQPassword: TIBQuery;
Responder Con Cita
  #16  
Antiguo 13-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Claro, de allí el error.

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

TDataModule:
Código Delphi [-]
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:
Código Delphi [-]
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 13-08-2017 a las 23:27:57.
Responder Con Cita
  #17  
Antiguo 14-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
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:
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.)
Así ingrese los 2 formularios editando algunos nombres:

DATAMODULE02
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(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:
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;
    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.

Última edición por ecfisa fecha: 14-08-2017 a las 01:32:10. Razón: Agregar etiquetas [DELPHI][/DELPHI]
Responder Con Cita
  #18  
Antiguo 14-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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:
Código Delphi [-]
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,
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.');
end;
ya que ahora el nombre de usuario se toma desde el DBLookupComboBox.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 14-08-2017 a las 18:04:23.
Responder Con Cita
  #19  
Antiguo 14-08-2017
Djsilver5 Djsilver5 is offline
Miembro
 
Registrado: ago 2017
Posts: 22
Poder: 0
Djsilver5 Va por buen camino
Buenos días amigo, ayer estaba intentado poner el código tal cual me dijiste y me bota estos error del DataModule.
Código:
[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í:
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 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;
Responder Con Cita
  #20  
Antiguo 14-08-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.794
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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í:
Código Delphi [-]
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear Un Login Belen12 Conexión con bases de datos 2 31-05-2016 23:23:25
crear login con adotabla1 Yensis22 Conexión con bases de datos 3 01-04-2008 23:06:22
Login Lento En Interbase Local GIVO Conexión con bases de datos 1 17-03-2004 22:03:42
Suprimir Login InterBase jsc Conexión con bases de datos 4 29-01-2004 02:46:51
InterBase Login? TIKIMORE Firebird e Interbase 6 23-06-2003 17:36:34


La franja horaria es GMT +2. Ahora son las 22:17:44.


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