PDA

Ver la Versión Completa : Captura de Datos de Ado


Fiebru
05-03-2010, 01:41:44
Resulta que estoy desarrollando un proyecto en Delphi 7 que usa Ado Connection para Access, pero el programa solo lee la primera linea de cada tabla, o sea, solo lee la primera linea que he guardado de cada tabla. No se si el inconveniente esta en que en la parte de SQL puse: Select * from Usuario´
Teniendo en cuenta que Usuario es el nombre de una tabla en particular.

Les agradecere enormemente que me ayuden con esto.

Caral
05-03-2010, 02:15:42
Hola
Supongo que los datos te los muestra en DBEdit.
Si no pones un DBNaviagtor y lo enlazas al Datasource dará la impresión de que solo muestra el primer registro, aunque estén todos ahí.
Para asegurarte coloca un DBGrid y lo enlazas al Datasource, deberian verse todos los registros.
Saludos

Fiebru
05-03-2010, 02:22:36
Una de las ventanas es una entrada de usuario. Cuando la pongo a prueba me doy cuenta de que dicha ventana solo acepta los datos del primer usuario (en este caso: Juan en el nombre, y 20040708 en la contraseña) que guardé en la tabla a la que esta enlazada, los demas datos no los lee.

¿Si cambio los Edit por DBEdit, podria tener el resultado que quiero, o sea, que lea los demas datos de manera que funcione como una entrada de usuario correcta?

Caral
05-03-2010, 02:24:10
Hola
No entiendo.
Saludos

Fiebru
05-03-2010, 02:30:18
Tengo una ventana que sirve para que los usuarios se identifiquen. Contiene un Edit para el nombre, otro Edit para la contraseña, un boton de Aceptar, y un boton de Cancelar.

Entonces he conectado esta ventana a una tabla de Access que tiene varios nombres de usuario y contraseñas diversas, sucede que el unico usuario que acepta la ventana es el primero que guarde previamente en la tabla, los demas no los lee.

Espero haberme explicado, de lo contrario haganmelo saber, por favor.

Caral
05-03-2010, 02:34:21
Hola
Ahora si te entiendo.
Es dificil saber la razon sin ver el codigo que tienes.
Opcion 1- pones en un zip el codigo (sin el exe) y la base de datos aqui para revisarlo.
Opcion 2- Muestra el codigo que tienes (copialo y pegalo).
Saludos

Fiebru
05-03-2010, 02:37:24
Mañana traere el codigo porque aqui no tengo disponible el codigo.

Y lo hare en las dos opciones.

Gracias de antemano.

Caral
05-03-2010, 02:53:18
Hola
Mira este código, te va a servir de ejemplo.
Saludos

Fiebru
05-03-2010, 03:01:45
Porque ahora estoy en un cyber y mi compu esta en la casa. Pero para no volver a tener este contratiempo, mañana me conectare desde mi compu.

Revisare ese archivo que me mandaste, a ver si por fin entiendo esto.

Una ultima cosa por hoy, ¿tienes por ahi algun libro de Delphi que sea entendible para los humanos? No como algunos que solo los expertos lo entienden (vaya barrabasada esa de hacer un libro para expertos).

Caral
05-03-2010, 03:04:03
Hola
Un buen libro :rolleyes:
Club Delphi
Saludos
PD: Que conste que no hago publicidad:D

Fiebru
05-03-2010, 03:09:52
Por lo que he visto, aqui son muy solidarios. Esta es una buena comunidad, que vale la pena visitar.

He leido varios manuales y libros de Delphi, pero la mayoria no son muy detallistas, y me quedo con muchas lagunas en la cabeza.

Cuando llegue a casa chequeare lo que me mandaste y mañana te dare mi impresion de lo que vea.

Gracias mi pana.

Caral
05-03-2010, 03:13:15
Hola
No esperes mucho de mi, soy un novato.
Aquí hay gente que sabe mucho, ya te ayudaran con tus dudas.
Saludos

Neftali [Germán.Estévez]
05-03-2010, 10:24:46
¿tienes por ahi algun libro de Delphi que sea entendible para los humanos?

Prueba con la "Cara oculta de Deplhi" (http://www.terawiki.clubdelphi.com/archivos/Delphi/Manuales/La_Cara_Oculta_De_Delphi_4.pdf.zip) que puedes encontrar en el FTP del Club (http://www.terawiki.clubdelphi.com/Delphi/Manuales/)(si revisas este directorio (http://www.terawiki.clubdelphi.com/Delphi/Manuales/) hay alguno más que te puede servir).

También puedes revisar este pequeño curso Online (http://www.formauri.es/arrobamasmas/Cursos/index.php?apdo=0402&curso=4_02_00), que es bastante básico y muy bien explicado con imágenes.

Fiebru
06-03-2010, 01:59:06
unit EntradaUsuario;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, DB, DBTables, ADODB;

type
TFrmEntradaUsuario = class(TForm)
BtnAceptar: TButton;
BtnCancelar: TButton;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuery1NombredeUsuario: TWideStringField;
ADOQuery1Contrasena: TWideStringField;
Label1: TLabel;
Label2: TLabel;
EUsuario: TEdit;
EContrasena: TEdit;
ADOConnection1: TADOConnection;
procedure BtnCancelarClick(Sender: TObject);
procedure BtnAceptarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmEntradaUsuario: TFrmEntradaUsuario;

implementation

uses Menu;

{$R *.dfm}

procedure TFrmEntradaUsuario.BtnCancelarClick(Sender: TObject);
begin
FrmEntradaUsuario.close
end;

procedure TFrmEntradaUsuario.BtnAceptarClick(Sender: TObject);
begin
if (ADOQuery1NombredeUsuario.Text = EUsuario.Text)
and (ADOQuery1Contrasena.Text = EContrasena.Text)
then FrmMenu.Show;
if (ADOQuery1NombredeUsuario.Text = EUsuario.Text)
and (ADOQuery1Contrasena.Text = EContrasena.Text)
then FrmEntradaUsuario.Hide
else Application.Messagebox('Clave Incorrecta', 'Acceso Denegado', MB_OK);
end;
end.

Fiebru
06-03-2010, 02:06:09
Tomare en cuenta esa informacion.

Caral
06-03-2010, 02:12:31
Hola
El codigo dice:
Si el query es igual que el edit entonces abre el form.
Muy bien hasta ahi, PERO.
Cual usuario?, Cual clave? el query tiene un sql que dice, selecciona todo y lo hace, por supuesto desde el principio.
Lo logico es que SOLO mostrara o encontrara el primero ya que ahi es donde empieza.
Si viste el codigo que puse veras que existe un parametro dentro del query, este dice:
Si el parametro es igual al usuario entonces abre el from.
Me imagino que veras la diferencia.
Saludos

Fiebru
06-03-2010, 02:18:16
El archivo que me mandaste no se como abrirlo porque no dice que tipo de archivo es.

Entonces, ahi es donde tengo el problema, en los parametros, que no se como especificar que es un recorrido que debe hacer, en vez de agarrar el primer dato que encuentre.

Caral
06-03-2010, 02:24:32
Hola
El query:

SELECT CodUsuario, Clave FROM Usuarios WHERE
CodUsuario = :nom

Dice: Selecciona el codigo del usuario y la clave de la tabla usuarios.
Donde el codigo del usuario sea igual al parametro nom

El codigo del boton aceptar:
ADLoguin es el nombre del query (no te confundas)

procedure TFLogin.BtnOkClick(Sender: TObject);
begin
LoginOK := False;
ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
ADLogin.Active:= True;
EUsuario.Text:= ADLogin.Fields[1].AsString;
If ADLogin.RecordCount < 1 then
Begin
Cuenta := Cuenta + 1;
MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
EUsuario.Text := '';
EClave.Text := '';
ADLogin.Active := False;
If Cuenta = 3 then Close;
end
else
If ADLoginClave.AsString = EClave.Text then
Begin
LoginOk := True;
ADLogin.Active := False;
FClientes:=TFClientes.Create(self);
try
FLogin.Visible:= False;
FClientes.ShowModal;
finally
FClientes.Free;
end;
Close;
end
else
Begin
Cuenta := Cuenta + 1;
MessageDlg('Clave Inválida',mtError, [mbOK], 0);
EClave.Text := '';
ADLogin.Active := False;
If Cuenta = 3 then Close;
end;

end;

El archivo que coloque es un ZIP, dentro esta el ejemplo.
Saludos

Fiebru
06-03-2010, 02:30:35
Pero cuando lo descomprimi solo hay un archivo que no se que hacer con el.

El codigo que me pasaste lo voy a chequiar detenidamente a ver si me da resultado.

Gracias de antemano.

Caral
06-03-2010, 02:44:48
Hola
Paso a paso:

procedure TFLogin.BtnOkClick(Sender: TObject); // el procedimiento del boton aceptar
begin
// olvídate de esto por ahora
// LoginOK := False;

// el query. parametro. parametro por nombre (nom) = edit . text.
ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
// activa el query
ADLogin.Active:= True;
// edit .text = a query. archivo 1 . como string.
EUsuario.Text:= ADLogin.Fields[1].AsString;
// si la cuenta es mayor que uno entonces
If ADLogin.RecordCount < 1 then
Begin
// olviada esto
// Cuenta := Cuenta + 1;
// muestra un mensaje
MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
// retorna a vacío el edit del usuario y clave
EUsuario.Text := '';
EClave.Text := '';
// desactiva el query
ADLogin.Active := False;
// olvida esto
// If Cuenta = 3 then Close;
end
else
// si query clave como string es igual al edit de la clave entonces
If ADLoginClave.AsString = EClave.Text then
Begin
// olvida esto
// LoginOk := True;
// activa el query
ADLogin.Active := False;
// Crea el form en este caso se llama Fclientes
FClientes:=TFClientes.Create(self);
try
// oculta el form del loguin
FLogin.Visible:= False;
// abre el form en este caso se llama Fclientes
FClientes.ShowModal;
finally
// cuando termine lo libera
FClientes.Free;
end;
Close;
end
else
Begin
// esta parte es para darle al usuario solo tres intentos para encontrar la clave
// Cuenta := Cuenta + 1;
// MessageDlg('Clave Inválida',mtError, [mbOK], 0);
// EClave.Text := '';
// ADLogin.Active := False;
// If Cuenta = 3 then Close;
// end;

end;
Ni la cara oculta de delphi :D
Saludos

Fiebru
06-03-2010, 02:54:52
Ya que ahora mismo estoy en un cyber....hey si sigues asi seras buen profesor.

Fiebru
08-03-2010, 23:14:29
El codigo que me diste lo adapte a mi programa, este es el codigo actual de la ventana...

unit EntradaUsuario;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, DB, DBTables, ADODB;

type
TFrmEntradaUsuario = class(TForm)
BtnAceptar: TButton;
BtnCancelar: TButton;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuery1NombredeUsuario: TWideStringField;
ADOQuery1Contrasena: TWideStringField;
Label1: TLabel;
Label2: TLabel;
EUsuario: TEdit;
EContrasena: TEdit;
ADOConnection1: TADOConnection;
procedure BtnCancelarClick(Sender: TObject);
procedure BtnAceptarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmEntradaUsuario: TFrmEntradaUsuario;

implementation

uses Menu;

{$R *.dfm}

procedure TFrmEntradaUsuario.BtnCancelarClick(Sender: TObject);
begin
FrmEntradaUsuario.close
end;

procedure TFrmEntradaUsuario.BtnAceptarClick(Sender: TObject);

begin
ADOQuery1.Parameters.ParamByName('nom').Value:= EUsuario.Text;
ADOQuery1.Active:= True;
EUsuario.Text:= ADOQuery1.Fields[1].AsString;
If ADOQuery1.RecordCount < 1 then
Begin
MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
EUsuario.Text := '';
EContrasena.Text := '';
ADOQuery1.Active := False;
end
else
If ADOQuery1Contrasena.AsString = EContrasena.Text then
Begin
ADOQuery1.Active := False;
FrmMenu:=TFrmMenu.Create(self);
try
FrmEntradaUsuario.Visible:= False;
FrmMenu.ShowModal;
finally
FrmMenu.Free;
end;
Close;
end
else
end;
end.


Pero ahora hay otro incidente. Es que cuando voy a entrar cualquier clave, me sale una ventana con un error diciendo que falta un operador en la expresion de consulta 'Nombre de Usuario'.

Creo que se refiere al contenido del String List Editor:
SELECT Nombre de Usuario, Contrasena FROM
Usuarios WHERE
Nombre de Usuario = :nom


Bueno creo que ya estoy cerca de dar con el problema, pero necesito un empujon, jejeje.

Caral
09-03-2010, 01:43:36
Hola
A ver asi:

procedure TFrmEntradaUsuario.BtnAceptarClick(Sender: TObject);
begin
ADOQuery1.SQL.Text:= 'SELECT Usuario, Contrasena FROM Usuarios WHERE Usuario = :nom';
ADOQuery1.Parameters[0].Value:= EUsuario.Text;
ADOQuery1.Active:= True;
EUsuario.Text:= ADOQuery1.Fields[1].AsString;
If ADOQuery1.RecordCount < 1 then
Begin
MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
EUsuario.Text := '';
EContrasena.Text := '';
ADOQuery1.Active := False;
end
else
If ADOQuery1Contrasena.AsString = EContrasena.Text then
Begin
ADOQuery1.Active := False;
FrmMenu:=TFrmMenu.Create(self);
try
FrmEntradaUsuario.Visible:= False;
FrmMenu.ShowModal;
finally
FrmMenu.Free;
end;
Close;
end
else
end;
end.
La diferencia esta en que simplemente se hace la sentencia sql por codigo y no directa en la casilla string del query, que por cierto se necesita especificar el parametro, ahi esta el error que te da.
Saludos

Neftali [Germán.Estévez]
09-03-2010, 12:01:49
Fiebru, si utilizas TAG's cuando escribas código Delphi (http://tinyurl.com/yan5ubu) verás que se lee bastante mejor.

En el anterior ya las añado yo.

Fiebru
09-03-2010, 23:19:24
Ya estoy entendiendo por donde va el asunto.

Neftali: disculpa lo de los tags, no sabia lo que era, pero te prometo que los usare mas adelante. ;)

Caral: despues te dire si llegue al tic del asunto o no.

Gracias.

Neftali [Germán.Estévez]
10-03-2010, 12:16:28
Neftali: disculpa lo delos tags, no sabia lo que era...


No hace falta disculparse, al principio suele pasar... ;)

Un saludo.

Fiebru
10-03-2010, 23:02:32
Ahora me sale un error que me dice "No se han especificado algunos parametros requeridos". Pero no se si se refiere al string o al codigo en si.

A continuacion el cogido actual, que veras algunas pequeñas modificaciones...

unit EntradaUsuario;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, DB, DBTables, ADODB;

type
TFrmEntradaUsuario = class(TForm)
BtnAceptar: TButton;
BtnCancelar: TButton;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuery1NombredeUsuario: TWideStringField;
ADOQuery1Contrasena: TWideStringField;
Label1: TLabel;
Label2: TLabel;
EUsuario: TEdit;
EContrasena: TEdit;
ADOConnection1: TADOConnection;
procedure BtnCancelarClick(Sender: TObject);
procedure BtnAceptarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmEntradaUsuario: TFrmEntradaUsuario;

implementation

uses Menu;

{$R *.dfm}

procedure TFrmEntradaUsuario.BtnCancelarClick(Sender: TObject);
begin
FrmEntradaUsuario.close
end;

procedure TFrmEntradaUsuario.BtnAceptarClick(Sender: TObject);

begin
ADOQuery1.SQL.Text:= 'SELECT Usuario, Contrasena FROM Usuarios WHERE Usuario = :nom';
ADOQuery1.Parameters[0].Value:= EUsuario.Text;
ADOQuery1.Parameters.ParamByName('nom').Value:= EUsuario.Text;
ADOQuery1.Active:= True;
EUsuario.Text:= ADOQuery1.Fields[1].AsString;
If ADOQuery1.RecordCount < 1 then
Begin
MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
EUsuario.Text := '';
EContrasena.Text := '';
ADOQuery1.Active := False;
end
else
If ADOQuery1Contrasena.AsString = EContrasena.Text then
Begin
ADOQuery1.Active := False;
FrmMenu:=TFrmMenu.Create(self);
try
FrmEntradaUsuario.Visible:= False;
FrmMenu.ShowModal;
finally
FrmMenu.Free;
end;
Close;
end
else
end;
end.


La linea que resalte en negrita: EUsuario.Text:=ADOQuery1.Fields[1].AsString; es donde me señala el error. Pero puede ser que los parametros que tengan problemas son los del String. Que dicen: Select * from Usuarios

Bueno, como quiera que sea, hoy tengo clases y aprovechare para preguntarle a mi profe.

Gracias de todos modos.

Caral
11-03-2010, 01:14:56
Hola
Veamos el codigo:
procedure TFrmEntradaUsuario.BtnAceptarClick(Sender: TObject);
begin
ADOQuery1.SQL.Text:= 'SELECT Usuario, Contrasena FROM Usuarios WHERE Usuario = :nom';
ADOQuery1.Parameters[0].Value:= EUsuario.Text;// aqui indico el parametro BIEN
// ADOQuery1.Parameters.ParamByName('nom').Value:= EUsuario.Text; // aqui estoy indicando otra vez lo mismo sobra NO TAN BIEN, o es uno u otro.
ADOQuery1.Active:= True; // activo BIEN
// EUsuario.Text:= ADOQuery1.Fields[1].AsString; // aqui indicas que el usuario es el 1, cuando es el 0 osea:
//como en el codigo siguiente, mira la diferencia:
EUsuario.Text:= ADOQuery1.Fields[0].AsString; // usuario 0, Contraseña 1
If ADOQuery1.RecordCount < 1 then // si hago un recuento entonces...
Begin
MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
EUsuario.Text := '';
EContrasena.Text := '';
ADOQuery1.Active := False;
end
else
If ADOQuery1Contrasena.AsString = EContrasena.Text then
Begin
ADOQuery1.Active := False;
FrmMenu:=TFrmMenu.Create(self);
try
FrmEntradaUsuario.Visible:= False;
FrmMenu.ShowModal;
finally
FrmMenu.Free;
end;
Close;
end
else
end;


Debería funcionar, no le veo mas inconvenientes, aunque recuerda que solo trato de aportar, no me hagas mucho caso.
Para mi, vas muy bien.
Saludos

Fiebru
11-03-2010, 22:29:24
El unico problemita que faltaba era que el nombre del campo que llamaba el codigo es "Usuario", mientras que el campo de la tabla que realmente yo habia conectado se llamaba "Nombre de Usuario".
Lo unico que tuve que hacer fue cambiarle el nombre en Access, de "Nombre de Usuario" a "Usuario".
Esto lo hice, no sin antes haberle preguntado a mi profe :cool:.

Bueno, usare esta misma tecnica para las demas ventanas que me estan dando el mismo problema.

Muchas gracias Caral.