PDA

Ver la Versión Completa : Orientación como convertir procedure a clases


webmasterplc
03-07-2017, 16:05:09
Buenas tengo estos procedimientos para guardar, editar y eliminar, lo que necesito es una orientación de como cionvertir esas en una sola clase, un ejemplo cortito que me sirva de orientación para yo convertirla
procedure guardar (equipcod,equipmodelo,equipdesc,equipmarca,equipimportado,equipafijo:string; equipcost,equipvalor,equipfactor:Double);
begin
with datos.tequipos do
begin
Close;
Active:=False;
Active:=True;
Open;
Append;
FieldByname('eq_codigo').AsString := equipcod;
FieldByname('eq_descripcion').AsString := equipdesc;
FieldByname('eq_marca').AsString := equipmarca;
FieldByname('eq_modelo').AsString := equipmodelo;
FieldByname('eq_fechaing').AsDateTime:= now;
FieldByName('eq_costodiario').AsCurrency:=equipcost;
FieldByName('eq_valor').AsCurrency:=equipcost;
FieldByName('eq_activofijo').AsString:=equipafijo;
FieldByName('eq_importado').AsString:=equipimportado;
FieldByName('eq_factor').AsCurrency:=equipfactor;
Post;
Close;
Active:=False;

end;

end;

procedure editar (equipcod,equipmodelo,equipdesc,equipmarca,equipimportado,equipafijo:string; equipcost,equipvalor,equipfactor:Double);
begin
with datos.sqactualizar do
begin
Close;
SQL.Clear;
SQL.Add('Update csequipos');
SQL.Add('set eq_factor=:factor, eq_valor=:valora, eq_activofijo=:propio, eq_importado=:importado,eq_descripcion=:descripcion, eq_marca=:marca,eq_costodiario=:costodiario,eq_modelo=:modelo');
SQL.Add('WHERE eq_codigo=:codigo');
ParamByName('descripcion').AsString:=equipdesc;
ParamByName('marca').AsString:=equipmarca;
ParamByName('costodiario').AsCurrency:=equipcost;
ParamByName('modelo').AsString:=equipmodelo;
ParamByName('codigo').AsString:=equipcod;
ParamByName('factor').AsCurrency:=equipfactor;
ParamByName('valora').AsCurrency:=equipvalor;
ParamByName('importado').AsString:=equipimportado;
ParamByName('propio').AsString:=equipafijo;
Execute;
end;
MessageDlg('El Material Fue Actualizado Exitosamente', mtCustom, [mbOK], 0);

end;

procedure eliminar(eqcodigo,partcodigo:string);
begin
with datos.sqeliminarcequipo do
begin
Close;
ParamByName( 'eqcodigo' ).AsString :=eqcodigo;
ParamByName( 'partcodigo' ).AsString :=partcodigo;
ExecSQL;
MessageDlg('Registro Eliminado Exitosamente', mtCustom, [mbOK], 0);
end;
end;

Ñuño Martínez
04-07-2017, 09:10:46
Primero, no crees una clase "porque sí". Tiene que haber una ventaja clara. No todo tiene por qué ser un objeto.

Luego, no pienses en "clase" sino en "objeto". Y me refiero a un objeto del mundo real. Es decir, si existe (o existiera), ¿cómo es y qué puedes hacer con él?

Ahora haz que el "cómo es" sean las propiedades y el "qué puedes hacer" sean los métodos públicos.

Y ya está.

olbeup
04-07-2017, 09:50:23
Hola webmasterplc,

En principio tienes que entender un poco sobre OOP, de lo contrario te vas a perder, a ver si con esto te puedo ayudar un poco a entender como funciona y vayas aprendiendo tú poco a poco.


unit FyPTMyEquipos;

interface

type

{ TEquipo }

TEquipo = class(TObject)
private
FIDCodigo: Integer;
FCodigo: String;
FModelo: String;
FDescripcion: String;
procedure SetIDValue(IDValue: Integer);
function GetExisteCodigo: Boolean;
protected
public
constructor Create;
destructor Destroy; override;
function Post: Integer;
published
property IDCodigo: Integer read FIDCodigo write SetIDValue;
property Codigo: String read FCodigo write FCodigo;
property Modelo: String read FModelo write FModelo;
property Descripcion: String read FDescripcion write FDescripcion;
property ExisteCodigo: Boolean read GetExisteCodigo;
end;

implementation

uses
ADODB;

{ TEquipo }

constructor TEquipo.Create;
begin
inherited;
FIDCodigo := -1;
FCodigo := '';
FModelo := '';
FDescripcion := '';
end;

destructor TEquipo.Destroy;
begin
inherited;
end;

function TEquipo.Post: Integer;;
var
FadoCnn: TADOConnection;
begin
case FIDCodigo of
-1..0: // Añadir un regristro nuevo
begin
FadoCnn := TADOConnection.Create(nil);
FadoCnn.LoginPrompt := False;
FadoCnn.ConnectionString := "Tus datos de conexión";

with TADOQuery.Create(nil) do
begin
Connection := FadoCnn;

SQL.Add('INSERT INTO csequipos');
SQL.Add(' (');
SQL.Add(' eq_codigo');
SQL.Add(' ,eq_modelo');
SQL.Add(' ,eq_descripcion');
SQL.Add(' )');
SQL.Add(' VALUES');
SQL.Add(' (');
SQL.Add( QuotedStr(Codigo));
SQL.Add(' ,' + QuotedStr(Modelo));
SQL.Add(' ,' + QuotedStr(Descripcion));
SQL.Add(' )');

SQL.Add('SELECT @@IDENTITY AS FIELDINTEGER');

Open;

FIDCodigo := FieldByName('FIELDINTEGER').AsInteger;
Result := FIDCodigo;

FreeAndNil(FadoCnn);
Free;
end;
end;
else begin // Actualizar registro
Result := FIDCodigo;

FadoCnn := TADOConnection.Create(nil);
FadoCnn.LoginPrompt := False;
FadoCnn.ConnectionString := "Tus datos de conexión";

with TADOQuery.Create(nil) do
begin
Connection := FadoCnn;

SQL.Add('UPDATE csequipos');
SQL.Add(' SET');
SQL.Add(' eq_codigo = ' + QuotedStr(Codigo));
SQL.Add(' ,eq_modelo = ' + QuotedStr(Modelo));
SQL.Add(' ,eq_descripcion = ' + QuotedStr(Descripcion));
SQL.Add(' WHERE ideq_codigo = ' + IntToStr(FIDCodigo));

ExecSQL;

FreeAndNil(FadoCnn);
Free;
end;
end;
end;
end;

procedure TEquipo.SetIDValue(IDValue: Integer);
var
FadoCnn: TADOConnection;
begin
FadoCnn := TADOConnection.Create(nil);
FadoCnn.LoginPrompt := False;
FadoCnn.ConnectionString := "Tus datos de conexión";

with TADOQuery.Create(nil) do
begin
Connection := FadoCnn;

SQL.Add('SELECT');
SQL.Add(' IDCODIGO');
SQL.Add(' ,eq_codigo');
SQL.Add(' ,eq_modelo');
SQL.Add(' ,eq_descripcion');
SQL.Add(' FROM csequipos');
SQL.Add(' WHERE IDCODIGO = ' + IntToStr(IDValue));

Prepared := True;

Open;

FIDCodigo := FieldByName('IDCODIGO').AsInteger;
FCodigo := FieldByName('eq_codigo').AsString;
FModelo := FieldByName('eq_modelo').AsString;
FDescripcion := FieldByName('eq_descripcion').AsString;

FreeAndNil(FadoCnn);
Free;
end;
end;

function TEquipo.ExisteCodigo: Boolean;
var
FadoCnn: TADOConnection;
begin
FadoCnn := TADOConnection.Create(nil);
FadoCnn.LoginPrompt := False;
FadoCnn.ConnectionString := "Tus datos de conexión";

with TADOQuery.Create(nil) do
begin
Connection := FadoCnn;

SQL.Add('SELECT');
SQL.Add(' IDCODIGO AS FIELDINTEGER');
SQL.Add(' FROM csequipos');
SQL.Add(' WHERE eq_codigo = ' + QuotedStr(FCodigo));

Prepared := True;

Open;

if (FieldByName('FIELDINTEGER').AsInteger = 0) then
Result := False
else
Result := (FIDCodigo <> FieldByName('FIELDINTEGER').AsInteger);

FreeAndNil(FadoCnn);
Free;
end;
end;


y en un formulario nuevo y en la parte privada pones:

...
private
MiEquipo: TEquipo;


y cuando se destruye el formulario:

procedure TForm1.FromDestroy(Sender: TObject);
begin
FreeAndNil(MiEquipo);
end;


En los TEdit:

procedure TForm1.Edit1Change(Sender: TObject);
begin
MiEquipo.Codigo := Edit1.Text;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
MiEquipo.Modelo := Edit2.Text;
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
MiEquipo.Descripcion := Edit3.Text;
end;


En un Boton donde ponga Añadir

procedure TForm1.NuevoClick(Sender: TObject);
begin
MiEquipo := TEquipo.Create;

Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
end;


En un Boton donde ponga Modificar

procedure TForm1.ModificarClick(Sender: TObject);
begin
MiEquipo := TEquipo.Create;

with dbgGrid.DataSource.Dataset do
MiEquipo.IDCodigo := FieldByName('IDCODIGO').AsInteger;

Edit1.Text := MiEquipo.Codigo;
Edit2.Text := MiEquipo.Modelo;
Edit3.Text := MiEquipo.Descripcio;
end;


En un Boton donde ponga Grabar

procedure TForm1.GrabarClick(Sender: TObject);
begin
if MiEquipo.ExisteCodigo then
ShowMessage('Este código ya existe en la DB')
else
MiEquipo.Post;
end;


No lo he probado que funcione lo he realizado todo de memoria

Un saludo

p.d.: añade los campos que te faltan,

p.d2. el IDCODIGO y el FIDCodigo lo he puesto yo para identificar cada registro único e inequívoco

webmasterplc
04-07-2017, 20:10:02
Fino Voy a probar a ver como me va

gatosoft
06-07-2017, 12:31:46
Yo prefiero trabajar el siguiente modelo (pseudo codigo):

TEquipo = class(Tobject)
Private
Procedure setCodigo(Value: Integer)
Public
Property Codigo: Integer read Fcodigo write setCodigo
Property Modelo
Property Descripcion
{....}
Construtor
Destructor
{....}
function Guardar
function Eliminar
end;


Procedure TEquipo.setCodigo(Value: Integer);
Begin
{al asignar, el codigo Consultas si el codigo existe y cargas la info en los demas datos.. si no existe, no deberias asignar el codigo (si es un incremental o algo asi en la BD).. FCodigo=-1}
FModelo:= consulta.modelo
FDescripcion:= consulta.modelo
end;

function Guardar()
begin
if fcodigo= -1 then InsertarEnBD
else ActualizarEnBD
end;


Lo utilizarias de esta forma:

equipo:= TEquipo.Crate( <puedes pasar un parametro en el constructor para que te cargue un eqquipo>)
equipo.codigo:= 5; {carga los datos}
equipo.Descripcion:= 'nueva descripcion'
equipo.guardar

Por otro lado, te recomiendo realizar todas las operaciones de base de datos en otro unidad o clase... por si algun dia decides cambiar los componentes o el motor de base de datos, no afectes la dinamica de tu clase TEquipo...

saludo,