PDA

Ver la Versión Completa : Buen Dia


sdiaz1983
06-01-2008, 17:11:22
Señores Vengo a comentarles una consulta que tengo, antes quiero mostrarles este codigo:


unit INGRESO;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBTables, DB, ExtCtrls;
type
TFrmIngreso = class(TForm)
LblNombre: TLabel;
LblClave: TLabel;
LblIngreso: TLabel;
BtnAceptar: TButton;
BtnCancelar: TButton;
EdtNombre: TEdit;
EdtClave: TEdit;
DtUsuario: TDataSource;
TblUsuario: TTable;
QryUsuario: TQuery;
RgRol: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure BtnCancelarClick(Sender: TObject);
procedure BtnAceptarClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmIngreso: TFrmIngreso;
implementation
uses BIENVENIDA;
{$R *.dfm}
procedure TFrmIngreso.FormCreate(Sender: TObject);
begin
FrmBienvenida.Visible:=False;
TblUsuario.Active:=False;
QryUsuario.Active:=False;
end;
procedure TFrmIngreso.BtnCancelarClick(Sender: TObject);
begin
FrmIngreso.Close;
end;
procedure TFrmIngreso.BtnAceptarClick(Sender: TObject);
var a: String;
begin
QryUsuario.SQL.Text:='select * from usuario where Nombre=:P1 and Clave=:P2 and Rol:=P3';
QryUsuario.Params[1].AsString:=EdtNombre.Text;
QryUsuario.Params[2].AsString:=EdtClave.Text;
if(RgRol.ItemIndex=0) then
begin
a:='operador';
QryUsuario.Params[3].AsString:=a;
end
else
begin
a:='administrador';
QryUsuario.Params[3].AsString:=a;
end;
if(QryUsuario.RecordCount>0) then
begin
ShowMessage('INFORMACION CORRECTA')
end
else
ShowMessage('INFORMACION INCORRECTA');
end;
end.


En el formulario tengo una pantalla de ingreso que consta de dos Edit un datasource, un table, un query y un radiogroup, en el codigo estoy consultando una tabla creada en Paradox 7.0 que se llama usuario que tiene tres campos que son nombre, clave, rol que el usuario tiene registrado en la tabla usuario, pero cuando ejecuto el programa me esta arrojando la siguiente excepcion cuando en la pantalla de ingreso le meto la informacion y le doy el boton de aceptar: List index out of bounds (3).

Señores soy principiante en delphi, queria preguntarles que correcciòn le tnego que hacer al codigo para que me valide correctamente los datos y pues me muestre los mensajes que aparecen en showmessages por ahora mientras avanzo, y de paso queria aprovechar para preguntarles que material me recomiendan para estudiar mas acerca de el manejo de componentes de bases de datos en delphi y Paradox par apoder afianzar mejor mis conocimientos.

Mil gracias por su ayuda y estaré pendiente de su respuesta.

Caral
06-01-2008, 17:25:31
Hola
Veamos el problema aca:

procedure TFrmIngreso.BtnAceptarClick(Sender: TObject);
var a: String;
begin
QryUsuario.SQL.Text:='select * from usuario where Nombre=:P1 and Clave=:P2 and Rol:=P3';
QryUsuario.Params[1].AsString:=EdtNombre.Text;
QryUsuario.Params[2].AsString:=EdtClave.Text;
if(RgRol.ItemIndex=0) then
begin
a:='operador';
QryUsuario.Params[3].AsString:=a;
end
else
begin
a:='administrador';
QryUsuario.Params[3].AsString:=a;
end;
if(QryUsuario.RecordCount>0) then
begin
ShowMessage('INFORMACION CORRECTA')
end
else
ShowMessage('INFORMACION INCORRECTA');
end;
Veamos que el parametro Rol esta mal escrito:
Rol:=P3';
Veamos que dice el mensaje:
List index out of bounds (3).
Veamos como van los archivos o registros de una tabla.
Nombre = 0
Clave = 1
Rol = 2.

Ahora veamos la logica de mensaje:
HEYYYY amigo, DONDE ESTA EL REGISTRO 3 ??????

Comprendes?
Usemos la logica, si no, no vamos a entender a Delphi.
Saludos

sdiaz1983
06-01-2008, 17:33:08
ok ya te entendi, como te dije soy novato en delphi, te agradezco tu ayuda voy a mirar haber que sale y cualquier cosa te aviso listo.

Gracias

Caral
06-01-2008, 17:41:48
Hola
Me parece muy bien, ahora una guia mas:
Primero la consulta seria asi:

QryUsuario.SQL.Text:='select * from usuario where Nombre = :P1 and Clave = :P2 and Rol= :P3';
QryUsuario.Params[0].AsString:=EdtNombre.Text;
QryUsuario.Params[1].AsString:=EdtClave.Text;
Los parametros empezarian desde 0, lo ves?
Tenemos tres parametros, verdad?, pero solo tengo dos referencias a los mismos, verdad?.
De donde saco la tercera referencia, osea el parámetro ROL, donde esta?.
Saludos

sdiaz1983
06-01-2008, 17:41:54
procedure TFrmIngreso.BtnAceptarClick(Sender: TObject);
var a: String;
begin
QryUsuario.Active:=True;
TblUsuario.Active:=True;
QryUsuario.SQL.Text:='select * from usuario where Nombre=:P0 and Clave=:P1 and Rol:=P2';
QryUsuario.Params[0].AsString:=EdtNombre.Text;
QryUsuario.Params[1].AsString:=EdtClave.Text;
if(RgRol.ItemIndex=0) then
begin
a:='operador';
QryUsuario.Params[2].AsString:=a;
end
else
begin
a:='administrador';
QryUsuario.Params[2].AsString:=a;
end;
QryUsuario.ExecSQL;
if(QryUsuario.RecordCount>0) then
begin
ShowMessage('INFORMACION CORRECTA')
end
else
ShowMessage('INFORMACION INCORRECTA');
end;
end.


Hice las correcciones de los parámetros, pero ahora que lo ejecuto me bota la siguiente excpeción

QryUsuario: No Sql Statement available

A que se debra, que tengo que corregir del codigo de nuevo????

Mil Gracias por su atencion y perdone la molestia.

sdiaz1983
06-01-2008, 17:47:03
El parametro tres esta en esta parte:


if(RgRol.ItemIndex=0) then
begin
a:='operador';
QryUsuario.Params[2].AsString:=a;
end
else
begin
a:='administrador';
QryUsuario.Params[2].AsString:=a;
end;


Lo que hago es validar la propiedad ItemIndex del RadioGroup si es 0 me guarde en la variable a que he definido previamente una palabra y esa sea la que consult een al base de datos, pero la verdad no se si me quedo bien, no habia leido la cita tuya de arriba de que en la consulta empezaban los parametros p1,p2,p3 ya le hice esta modificacion o sea asi:


QryUsuario.SQL.Text:='select * from usuario where Nombre=:P1 and Clave=:P2 and Rol:=P3';


Pero aun me bot ael error que dije anteriormente

Una vez mas mil gracias por tu ayuda.

Caral
06-01-2008, 17:48:50
Hola
Te lo puedo decir, pero te voy a poner a pensar un poco.
Piensa en esto:
Primero: creo la consulta.
Segundo: coloco los parametros que especifico en la consulta.
Tercero: Abro o ACTIVO el query.

Lo tienes asi????
Verdad que no.
Revisalo y me dices si no lo ves.
Saludos

sdiaz1983
06-01-2008, 17:57:37
Si tiene razon en eso, gracias por su paciencia, ya modifque eso.

Tengo un problema con respecto la validacion del dato de rol, el programa no lo esta validando, dice que no lo encuentra porque sera?????, que tengo que corregir

gracias una vez mas

Caral
06-01-2008, 18:04:31
Hola
Parametros?????
Si tengo tres y solo pongo dos la consulta me enviara dos.

procedure TFrmIngreso.BtnAceptarClick(Sender: TObject);
var a: String;
begin
TblUsuario.Active:=True;
QryUsuario.SQL.Text:='select * from usuario where Nombre=:P0 and Clave=:P1 and Rol=:P2';
QryUsuario.Params[0].AsString:=EdtNombre.Text;
QryUsuario.Params[1].AsString:=EdtClave.Text;
QryUsuario.Params[2].Value:=0; // aqui esta el parametro que falta
QryUsuario.Active:=True; // aqui activo

if(RgRol.ItemIndex=0) then // aqui defino el parametro ROL supongo?
begin
a:='operador';
QryUsuario.Params[2].AsString:=a;
end
else
begin
a:='administrador';
QryUsuario.Params[2].AsString:=a;
end;
QryUsuario.ExecSQL;
if(QryUsuario.RecordCount>0) then
begin
ShowMessage('INFORMACION CORRECTA')
end
else
ShowMessage('INFORMACION INCORRECTA');
end;
end.
Saludos

Caral
06-01-2008, 18:11:50
Hola
RgRol que es?
Parece un combobox o un listboxt, me equivoco?
Saludos

sdiaz1983
06-01-2008, 18:13:55
Con respecto a tu pregunta es un radiogroup, pero lo cambie mejor por puros campos de edición para facilitar mas las cosas, muchas gracias por su ayuda y hasta otra oportunidad.

jachguate
06-01-2008, 23:51:15
Hola.

El título de este mensaje está mal. En adelante debes tomar el tiempo necesario para encontrar un título de tema que sea acorde a la pregunta que harás, de acuerdo a lo expuesto en la guía de estilo.

Hasta luego.

;)