Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda en cierto trabajo de clase (y trata sobre clases, precisamente) (https://www.clubdelphi.com/foros/showthread.php?t=50672)

sdiaz1983 24-11-2007 20:21:17

Ayuda en cierto trabajo de clase (y trata sobre clases, precisamente)
 
Señores del Foro Muy buen dia.

Les Queria pedir un favor a ustedes, pero antes de decirle lo que les quiero decir aca esta el enunciado de un trabajo de clase:
  • Construir un objeto tcuenta, que reciba un número de cuenta y una contraseña, luego haga una consulta sobre la tabla cuentas y responda informando si la cuenta existe, si la contraseña es correcta y en caso afirmativo autorice al usuario a solicitar el monto del retiro.
  • Construir un objeto tcajero, que reciba el monto requerido por el usuario, consulte la tabla "cajero" y responda si con los billetes que tiene puede construir el monto solicitado y en caso afirmativo autorice el retiro.
  • Después de lo anterior, el objeto Tcuenta debe consultar si el saldo de la cuenta es suficiente, y en caso tal, descuente de dicho saldo el monto del retiro y autorice la entrega del dinero.
  • Finalmente el objeto tcajero debe entregar el dinero y actualizar el inventario de billetes.

CUENTAS
#numero a9
Saldo $
Contraseña a6

CAJERO
B50 I
B20 I
B10 I

De ese enunciado lo que ya tengo hecho es el primer punto que es construir el objeto TCuenta y que me valide las cuentas y los usuarios, en los renglones siguientes les coloco el codigo que mas o menso intente de hacer tanto para el objeto tcuenta como el formulario validar que es el que hace la validacion de las cuentas.

Código Delphi [-]
 
unit Cuenta;
interface
uses Classes, DBTables, QControls, SysUtils,Windows, Messages, Variants,Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TCuenta = class(TWidgetControl)
private
Qry1 : TQuery;
FCuen: ShortString;
FCon : ShortString;
public
property Cue : ShortString read FCuen write FCuen;
property Con : ShortString read FCon write FCon;
procedure Buscar(Direccion,Archivo,Ccuen,Ccon,cuenta,Contrasena : ShortString);
end;
implementation
uses validar;
procedure Tcuenta.Buscar(Direccion,Archivo,Ccuen,Ccon,cuenta,contrasena: ShortString);
Begin
FCon:=Contrasena;
FCuen:=cuenta;
if Qry1=nil then Qry1:=TQuery.Create(Owner);
Qry1.DatabaseName:=Direccion;
Qry1.SQL.Text:='select * from '+Archivo+' where '+Ccuen+'=:P1 and '+Ccon+'=:P2';
Qry1.Params[1].AsString:=FCon;
Qry1.Params[0].AsString:=FCuen;
Qry1.Active:=True;
if Qry1.RecordCount>0 then
begin
FCuen:=Qry1.FieldByName(Ccuen).AsString;
FCon:=Qry1.FieldByName(Ccon).AsString;
MessageDlg('INFORMACION CORRECTA BIENVENIDO',mtInformation,[mbok],0);
FrmValidar.BtnIr.Enabled:=true;
FrmValidar.EdtCuenta.Enabled:=False;
FrmValidar.EdtContra.Enabled:=False;
FrmValidar.EdtCuenta.Text:='';
FrmValidar.EdtContra.Text:='';
Qry1.Active:=False;
end
else
begin
MessageDlg('CUENTA Y/O CONTRASEÑA INCORRECTOS',mtError,[mbok],0);
FrmValidar.EdtCuenta.SetFocus;
FrmValidar.EdtCuenta.Text:='';
FrmValidar.EdtContra.Text:='';
end;
end;
end.

Código Delphi [-]
unit validar;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Cuenta;
type
TFrmValidar = class(TForm)
LblTitulo: TLabel;
LblCuenta: TLabel;
LblContra: TLabel;
EdtCuenta: TEdit;
EdtContra: TEdit;
BtnIr: TButton;
BtnFin: TButton;
procedure BtnFinClick(Sender: TObject);
procedure EdtContraKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BtnIrClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmValidar: TFrmValidar;
Cuen: TCuenta;
implementation
uses Transaccion;
  
{$R *.dfm}
procedure TFrmValidar.BtnFinClick(Sender: TObject);
begin
FrmValidar.Close;
end;
procedure TFrmValidar.EdtContraKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_RETURN then
begin
if Cuen=nil then Cuen:=TCuenta.Create(FrmValidar);
Cuen.Buscar('c:\parcial3','cuentas','Numero','Contraseña',EdtCuenta.Text,EdtContra.Text);
EdtCuenta.Text:=Cuen.Cue;
EdtContra.Text:=Cuen.Con;

end;
end;
procedure TFrmValidar.BtnIrClick(Sender: TObject);
begin
FrmValidar.Visible:=False;
FrmTransacciones:=TFrmTransacciones.Create(self);
try
FrmTransacciones.ShowModal;
finally
FrmTransacciones.Free;
end;
end;
end.

Resulta que como no tengo casi muy claro el tema este de objetos y esas cuestiones he estado tratando de crear infructuosamente el objeto cajero par ahacer los siguientes.

El favor que les iva a pedir es si alguno de ustedes me puede orientar en base al codigo que les consigno aca como deberia mas o menos plantear el objeto Tcajero par hacer el otro punto y mas que todo lo que em tiene embolatado es como planteo la consulta sqlm por que lo que hast el momento mas o menos he tratado de plantear es:

Código SQL [-]
 
select sum((B50*50000)+(B20*20000)+(B10*10000)) from cajero;

Segun tengo entendido esta consulta me suma en los campos B50,B20,B10 segun el parametro que consigno ahi.

Pero como me dice que tiene que comparar con la cantidad que el usuario consigna ahi en el programa entonces no se si tiene que comparar con algo mas la verdad no se.

Les agradezco toda al asesoria que me puedan prestar para eso y las pautas que me puedan proporcionar para poder crear el objeto TCajero y tambien para hacer los otros puntos.

El Programa que llevo esta en el siguiente enlace:

http://www.gigasize.com/get.php/3196...voparcial3.rar
contraseña: 2061055


Por si acaso alguno lo quiere observar y asi tener mas fundamento par ael favor que les pido.

Compañeros del foro me despido no si antes agradecerles por toda la ayuda que me pueda prestar y espero no causar alguna molestia

Muchas Gracias.

dec 24-11-2007 20:26:26

Hola,

Por favor, revisa la guía de estilo de los foros, ten un poco de respeto: cuida de titular tus mensajes más descriptivamente y encierra el código fuente entre las etiquetas correspondientes. Ganarás tú y ganaremos todos. Gracias. ;)

sdiaz1983 25-11-2007 03:22:16

Disculpas
 
Mil Disculpas Señores Por Lo Ocurrido Pero Quisiera Saber Si Siempre Puedo Contar Con La Ayuda De Ustedes Para Poder Resolver Esta Duda.


Gracias

Lepe 25-11-2007 04:09:43

El problema está en saber si hay billetes suficientes o no.

Si el cajero tiene 2 Billetes de 50$, 2 Billetes de 20$, tienes en total 140$ disponibles. Si el usuario quiere 130$ no puedes suministrarlo (no te quedan billetes de 10).

Existen algoritmos para analizar estos problemas, pero son bastante complejos (redes neuronales) y a nivel de clase no son viables. Lo fácil:
- Primero compruebas que el monto que quiere el usuario es menor al disponible en el cajero.
- Intentas servir billetes grandes mientras no sobrepases el monto, y cuando no puedas, cambias a un billete menor.

Código Delphi [-]
// supongo que B50 es la cantidad de Billetes de 50$ que tienes en el cajero

var n50, n20, n10:integer; // cantidad de billetes de cada clase que Necesito
begin

if Monto < (B50 * 50) + (B20 * 20) + (B10*10) then
begin
  while Monto >= 50 do
  begin
     inc (n50);
     dec(Monto, 50);
  end;
  While Monto >= 20 do
  begin
     inc(n20);
     dec(Monto,20);
 end;
  While Monto >= 10 do
  begin
     inc(n10);
     dec(Monto,10);
 end;
 if Monto > 0 then ShowMessage('error: no tengo billetes suficientes');

en "n50" tienes los billetes necesarios de 50 $, ahora tendrás que mirar en la Base de datos si tienes suficientes o no.

Hay un caso que no he tenido en cuenta y no sé si te lo pedirán. Puede que no tengas billetes de 50$, pero podrías conseguir el monto necesario si tienes muchos billetes del 20$ y de 10$. Adapta el código.

Saludos

Delphius 26-11-2007 02:57:26

Hola sdiaz1983,

Si no me equivoco, este ejercicio es el que estabas tratando aqui.

Bueno, se que te estás inciando en Delphi y POO... espero que no te moleste lo que te voy a decir: no me gusta el código que veo...

Si bien nada impide hacer un objeto descendiente de otro... no creo que sea adecuado hacer que TCuenta descienda de TWidgetControl. Por otro lado tampoco me gusta la manera en que estás enlazando las tablas con los objetos.

Se que es un simple ejercicio... pero no considero que TCuenta y TCajero deban mantener un acoplamiento hacia la capa de datos... Además, la delegación entre TCajero y el o monto que dispone puede entenderse desde otro punto de vista. A mi modo de ver TCajero se comunica con un objeto TInventarioBilletes y éste le informa de las cantidades.

¿Es obligación que TCuenta y TCajero sean responsables de acceder a la base de datos? ¿Es obligación emplear sólo estos dos objetos, o se le permite diseñar algún otro objeto que sea conveniente?

Yo fácilmente distingo al menos 4 objetos: TCajero, TCuenta, TInventario, TFachada. Este último actúa de Fachada entre los otros tres y la base de datos.
Te pediría que me aclares estas dudas con respecto a tu ejercicio pues dependiendo de ello se debe hacer el diseño más adecuado.

Quiero comentarte que mi FF me detecta demasiados scripts maliciosos en el sitio donde supuestamente colocaste el código y no quiero arriesgar mi equipo. ¿Tanto pesa? ¿Podrías considerar exponer más código que el expuesto aquí?

Yo te podría ayudar y guiarte, pero a partir del miercoles a la noche, o jueves... No voy a estar disponible durante el Martes y Miercoles. Mientras tanto, aquí puedes seguir considerando el consejo de muchos. Estaba a punto de escribir unos ejemplos de acuerdo a mi percepción... pero no quiero:
1. Imponerte un diseño al que posiblemente no estés acostumbrado.
2. "Regalarte" un ejercicio.

Considero que la mejor guia para tu problema es emplear UML, no te dirijas al código de una... hay algo que no me termina de convencer en el "caso de uso" que expones. ¿Es una copia textual del ejercicio? Si bien el problema es simple, me parece que te haz ahogado en un pequeño vaso de agua... parte de tu problema es como dice Lepe, determinar la cantidad, otro es saber como lograr que los objetos se comuniquen correctamente. calma... no quiere decir que todo lo que hiciste está mal, si recuerdas del otro hilo... yo he dicho que no hay un único modelo y punto de vista como enfocar un diseño OO. (de hecho considero que yo todavía no lo domino en su total potencial), Y es lo que yo comprendo de lo que estoy viendo en el código que expones aquí.

Espero que no tengas prisas en esto (de hecho... aqui hacemos lo posible para evitar a quienes vienen con caracter de "urgente" o "es para hoy"). POO no se aprende en un día.

Un consejo: Primero olvidate de donde obtienen los datos, centra tu esfuerzo en buscar la manera en que se comuniquen. Asume inicialmente un punto de vista sencillo: manten el supuesto de que los datos ya lo tienen y/o lo deben pedir a otro objeto. Cuando tengas resuelto el tema de la comunicación evalua el análisis de como hace para obtener los datos desde la base de datos.

Saludos,


La franja horaria es GMT +2. Ahora son las 18:11:12.

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