Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Orientación como convertir procedure a clases (https://www.clubdelphi.com/foros/showthread.php?t=92022)

webmasterplc 03-07-2017 16:05:09

Orientación como convertir procedure a clases
 
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
Código Delphi [-]
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.

Código Delphi [-]
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:
Código Delphi [-]
  ...
  private
    MiEquipo: TEquipo;

y cuando se destruye el formulario:
Código Delphi [-]
procedure TForm1.FromDestroy(Sender: TObject);
begin
  FreeAndNil(MiEquipo);
end;

En los TEdit:
Código Delphi [-]
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
Código Delphi [-]
procedure TForm1.NuevoClick(Sender: TObject);
begin
  MiEquipo := TEquipo.Create;

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

En un Boton donde ponga Modificar
Código Delphi [-]
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
Código Delphi [-]
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):

Código Delphi [-]
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:

Código Delphi [-]
equipo:= TEquipo.Crate( 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,


La franja horaria es GMT +2. Ahora son las 20:38:08.

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