Hola Delphius...
Primero que nada muchas gracias por toda tu aportación de verdad te agradesco mucho...
Cita:
Disculpa, pero no puedo darme el lujo de estar probando tu código
|
Solo queria que me comentaran si no estaba mal la forma de haserlo asi como lo hisite muchas gracias tambien por eso ya que para uno que inicia siempre hay temor de si se esta haciendo lo correcto o no...
Cita:
Más o menos la idea es que: el Proveedor realiza al menos un movimiento y cada movimiento está conformado por una serie de lineas (el detalle).
|
Creo que no me explique bien pero mi problema es mas simple que eso ya que no se como podria ser la estructura de las clases Movimiento y Detalle_Movimiento ya que estas son Maestro Detalle la clase de Proveedores solo la puse para que me comentaran si era correcto lo que estaba haciendo pero no tiene ninguna relación con la clase de Movimiento...
Cita:
La idea de delegar este trabajo es que tanto TProveedor, como TMovimiento envien el mensaje de grabar, modificar, borrar, etc a este objeto y sea éste el encargado de hacer el trabajo sucio.
¿Porqué dije podría? Porque si tu diseño (mejor dicho el dominio) es simple es posible que adosar esta nueva clase (llamemosla AccesoDB) haga más complicado al modelo y lleve a costos y pérdida de tiempo.
|
Esactamente eso queria que me comentaran por eso puse el codigo de la clase de proveedor... si tengo una clase se llama Conexion y Todas las demas heredan de esa para poder insertar modificar o eliminar datos pero ese es el problema que no sabia si es correcta la implementación te pongo el codigo:
Uso los Fibplus para conectarme a Firebird: Por todo lo que comentas y otro hilo que cheque hasta me da pena publicar mi codigo...
Código Delphi
[-]unit C_Conexion;
interface
Uses Db, SysUtils, pFIBDatabase, pFIBQuery, pFIBDataSet, C_Parametros;
Type
TConexion = Class (TObject)
private
FDb_Firebird: TpFIBDatabase;
FConectado: Boolean;
FParametros: TParametros;
FConsulta: TpFIBDataSet;
FTransaccion: TpFIBTransaction;
FOperacion: TpFIBQuery;
FUsuario_Conectado: String;
FDatos_Guardados: Boolean;
FTarea: String;
FOtros_Datos: TpFIBDataSet;
FError_Valida: String;
procedure SetError_Valida(const Value: String);
procedure SetOtros_Datos(const Value: TpFIBDataSet);
procedure SetDatos_Guardados(const Value: Boolean);
procedure SetTarea(const Value: String);
procedure SetUsuario_Conectado(const Value: String);
procedure SetOperacion(const Value: TpFIBQuery);
procedure SetTransaccion(const Value: TpFIBTransaction);
procedure SetParametros(const Value: TParametros);
procedure SetConsulta(const Value: TpFIBDataSet);
procedure SetConectado(const Value: Boolean);
procedure SetDb_Firebird(const Value: TpFIBDatabase);
public
constructor Create;
Procedure Conectar_Db_Firebird;
Function Identificar(Clave:String):String;
Function Traer_Datos(Select:String):TDataSource;
Function Validar_Datos:Boolean; Virtual;
Published
Property Db_Firebird:TpFIBDatabase read FDb_Firebird write SetDb_Firebird;
Property Parametros:TParametros read FParametros write SetParametros;
Property Conectado:Boolean read FConectado write SetConectado;
Property Consulta:TpFIBDataSet read FConsulta write SetConsulta;
Property Otros_Datos:TpFIBDataSet read FOtros_Datos write SetOtros_Datos;
Property Transaccion:TpFIBTransaction read FTransaccion write SetTransaccion;
Property Operacion: TpFIBQuery read FOperacion write SetOperacion;
Property Usuario_Conectado:String read FUsuario_Conectado write SetUsuario_Conectado;
Property Datos_Guardados:Boolean read FDatos_Guardados write SetDatos_Guardados;
Property Tarea:String read FTarea write SetTarea;
Property Error_Valida:String read FError_Valida write SetError_Valida;
end;
implementation
uses FIBDatabase, FIBDataSet;
constructor TConexion.Create;
begin
Transaccion:= TpFIBTransaction.Create(Nil);
Db_Firebird:= TpFIBDatabase.Create(Nil);
Parametros:= TParametros.Create;
Db_Firebird.Connected:=False;
Conectar_Db_Firebird;
Operacion:= TpFIBQuery.Create(Nil);
Operacion.Database:=Db_Firebird;
Consulta:= TpFIBDataSet.Create(Nil);
Consulta.Database:=Db_Firebird;
Otros_Datos:= TpFIBDataSet.Create(Nil);
Otros_Datos.Database:=Db_Firebird;
end;
function TConexion.Identificar(Clave: String): String;
begin
With Consulta Do
Begin
Close;
SQLs.SelectSQL.Clear;
SQLs.SelectSQL.Add('Select Nombre_Usuario, Tipo_Usuario, Activo From Usuarios' +
' Where Clave = :Clave');
ParamByName('Clave').AsString:=Clave;
Prepare;
Try
Open;
Except on E:Exception do
Begin
Raise;
Exit;
End; End; End; if Consulta.IsEmpty then
Result:=''
else
begin
if Consulta.FieldByName('Activo').AsString = 'SI' then
begin
Usuario_Conectado:=Consulta.FieldByName('Nombre_Usuario').AsString;
Result:=Consulta.FieldByName('Tipo_Usuario').AsString;
end
else
Result:='INACTIVO';
end;
end;
Procedure TConexion.Conectar_Db_Firebird;
begin
Transaccion.TRParams.Add('write nowait rec_version read_committed');
Transaccion.DefaultDatabase:=Db_Firebird;
Db_Firebird.SQLDialect:=3;
Db_Firebird.DatabaseName:=Parametros.Nombre_Db;
Db_Firebird.ConnectParams.UserName:=Parametros.Usuario;
Db_Firebird.ConnectParams.Password:=Parametros.Clave;
Db_Firebird.ConnectParams.CharSet:=Parametros.Caracteres;
Db_Firebird.DefaultTransaction:=Transaccion;
Db_Firebird.DefaultUpdateTransaction:=Transaccion;
try
Db_Firebird.Connected:=True;
except on E: Exception do
begin
Conectado:=False;
Raise;
Exit;
end;
end;
Conectado:= True;
end;
procedure TConexion.SetConectado(const Value: Boolean);
begin
FConectado := Value;
end;
procedure TConexion.SetConsulta(const Value: TpFIBDataSet);
begin
FConsulta:=Value;
end;
procedure TConexion.SetDatos_Guardados(const Value: Boolean);
begin
FDatos_Guardados := Value;
end;
procedure TConexion.SetDb_Firebird(const Value: TpFIBDatabase);
begin
FDb_Firebird := Value;
end;
procedure TConexion.SetError_Valida(const Value: String);
begin
FError_Valida := Value;
end;
procedure TConexion.SetOperacion(const Value: TpFIBQuery);
begin
FOperacion := Value;
end;
procedure TConexion.SetOtros_Datos(const Value: TpFIBDataSet);
begin
FOtros_Datos := Value;
end;
procedure TConexion.SetParametros(const Value: TParametros);
begin
FParametros := Value;
end;
procedure TConexion.SetTarea(const Value: String);
begin
FTarea := Value;
end;
procedure TConexion.SetTransaccion(const Value: TpFIBTransaction);
begin
FTransaccion := Value;
end;
procedure TConexion.SetUsuario_Conectado(const Value: String);
begin
FUsuario_Conectado := Value;
end;
function TConexion.Traer_Datos(Select: String): TDataSource;
begin
Otros_Datos.Close;
Otros_Datos.SQLs.SelectSQL.Clear;
Otros_Datos.SQLs.SelectSQL.Add(Select);
try
Otros_Datos.Open;
except on E: Exception do
begin
Raise;
Exit;
end;
end;
Result:= TDataSource.Create(Nil);
Result.DataSet:=Otros_Datos;
end;
function TConexion.Validar_Datos: Boolean;
begin
Result:=True;
end;
end.
en un hilo que cheque comentan que los atributos privados de una clase se deben de usar en la misma clase y los publicos desde fuera y mi clase no aplica eso
...
Cita:
En fin... esto dependerá de como estructures y diseñes tus clases. Como te decía... hay varias posibilidades de como lograr hacer los "vinculos".
|
Pues ese es el punto que no se como estructurar mis clases nunca habia trabajado con objetos...
los libros que me recomendaste te prometo leerlos pero como tu dices no hay mucho tiempo y mi proyecto lo tengo que entregar en febrero...
Cita:
Se que no te he ayudado con el código pero al menos creo haber dicho que algo deberías tener en cuenta: La correcta asignación de responsabilidades.
|
Creo que si ya habia visto eso del TObjectList lo malo es que uno como novato nunca sabe si es una sola clase y donde pondria la propiedad de ese tipo
Cita:
No es que lo que hayas hecho esté mal...sino que no veo como logras hacer referencia entre la clase proveedor y la clase movimientos. No veo, al menos yo, un vinculo de interés (o como debe decirse: asignación de responsabilidades).
Para una primera aproximación, tu diseño ha sido un gran avance.
|
Gracias esto da animos y quiere decir que no voy tan mal....
Cita:
Y ten presente que no hay un único diseño y comprención del problema. Existen tantos diagramas de dominio, como personas hay en este mundo... por lo que no existe una única solución de como implementar correctamente la asignación de responsabilidades de las clases. De modo que para poder recibir la mejor ayuda sería oportuno que tu nos informes de tu modelo, de tu comprensión del dominio. Porque si yo te muestro mi diseño es posible que no sea tan coincidente con el tuyo y para ti sea más complicado de asimilarlo y comprenderlo.
|
Por Responsabilidades voy a entender que es la relación que hay de una clase con otra...
Por otro lado creo que mi modelo es simple:
segun yo tengo mi clase Conexion con esta me conecto a la DB... y todas mis demas clases heredan de esta para Insertar Modificar y Eliminar Datos.. lo demas es comun Movimeintos con su Detalle_Movimiento, Ticket y su Detalle_Ticket pero la verdad no tengo nada diseñado como dises solo la idea de acuerdo a la Db que tengo y mi problema es q no se como estructurar esas clases Maestro Detalle...
bueno y siendo realistas creo que me falta mucho que aprender....
Por todo Gracias...