Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Modificaciones en el módulo UPC,



Como podéis ver hemos puesto un nuevo botón sobre un nuevo NewPanelDb, el datasource=DsPrincipal y el InverseAction=true. Este botón lo que hace es crear un nuevo registro con los datos de la Persona de contacto activa en ese momento, creando así el nuevo registro de manera automatizada.


El código añadido

Código Delphi [-]

procedure TFPC.FormActivate(Sender: TObject);
//------------------------------------------------------------------------------
//********************************************[ Cuando se activa El form ]******
// Lo que queremos que haga nuestro Form Cuando se Actiba
//------------------------------------------------------------------------------
begin
     . . .
    //Se ha añadido las siguientes lineas 
    PanelAux.ColorNotActive:=COLORPANELACT;
    PanelAux.ActiveColor:=COLORPANELNOACT;
end;

procedure TFPC.SpeedButtonBC4Click(Sender: TObject);
//------------------------------------------------------------------------------
//****************************************************[ Añadir a contactos ]****
// añadir al uses     UContactos    (Importante, para que funcione)
//------------------------------------------------------------------------------
begin
  try //Cremoas en contactos uno con los mismos datos que persona de contacto
      DSContactos.DataSet.Insert;
      DSContactos.DataSet.FieldByName('MODULO').Value:=DsPrincipal.DataSet.FieldByName('MODULO').value;
      DSContactos.DataSet.FieldByName('CODIGO').Value:=DsPrincipal.DataSet.FieldByName('CODIGO').value;
      DSContactos.DataSet.FieldByName('NOMBRE').Value:=DsPrincipal.DataSet.FieldByName('NOMBRE').value;
      DSContactos.DataSet.FieldByName('MOVIL').Value:=DsPrincipal.DataSet.FieldByName('MOVIL').value;
      DSContactos.DataSet.FieldByName('MAIL').Value:=DsPrincipal.DataSet.FieldByName('EMAIL').value;
      DSContactos.DataSet.Post;
      IBT.CommitRetaining;    //Donde IBT es el nombre de su Ibtrasaction, con ruta
      ShowMessage('Se ha creado un nuevo contacto con los datos de la persona de contacto actual');
  except
    on E: Exception do
    begin
        MessageBeep(1000);
        ShowMessage('Se ha producido un error y el proceso no se ha podido terminar   Unidad:[ UPC ]   Modulo:[ Grabar nuevo contacto]' + Chr(13) + Chr(13)
                  + 'Clase de error: ' + E.ClassName + Chr(13) + Chr(13)
                  + 'Mensaje del error:' + E.Message+Chr(13) + Chr(13)
                  + '    '+Chr(13) + Chr(13)
                  + 'El proceso ha quedado interrumpido');
        if DSContactos.DataSet.State in [dsEdit, dsInsert] then DSPrincipal.DataSet.Cancel;
        IBT.RollbackRetaining;    //Donde IBT es el nombre de su Ibtrasaction, con ruta
    end;
  end;
end;


También se detecto un error en el código de proveedores, os pongo el procedure con la corrección

Código Delphi [-]
procedure TFProveedor.CambiarPagina(index: Integer; Sender: TObject);
//------------------------------------------------------------------------------
//********************************************************[ Cambiar Página ]****
// Al pulsar los botones para acceder a las pestañas
//------------------------------------------------------------------------------
var VarBActivar:Boolean;
    VarISegundoPageControlIndex:Integer;
    VarSModulo, VarSCodigo:string;
begin
      . . .
         
     case Tipo of    

        . . .

      4:begin  //personas de contacto
           
           // Cambiar la linea ActQuery(DM.IBQContactos,'SELECT * FROM CONTACTOS WHERE (CONTACTOS.MODULO = '+QuotedStr(VarSModulo)+') AND (CONTACTOS.CODIGO = '+QuotedStr(VarSCodigo)+')');  
           //  Por

           ActQuery(DM.IBQPersonasContacto,'SELECT * FROM PC WHERE (PC.MODULO = '+QuotedStr(VarSModulo)+') AND (PC.CODIGO = '+QuotedStr(VarSCodigo)+')');
           if not DM.IBQPersonasContacto.IsEmpty then
           begin
             DBNavigator1.DataSource:=DM.DSIBQPersonasContacto;
           end else DM.IBQPersonasContacto.Active:=False;
           VarISegundoPageControlIndex:=1;
        end;
     
         . . .

    end;
end;
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 21-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Módulo empleados



No seguiré comentando sobre las pestañas ya tratadas en post anteriores ya que son lo mismo

Mejoras que hacer en los otros módulos incorporadas a este, al Dsprincipal en su evento DSPrincipalDataChange, se ha añadido, para que las tablas auxiliares cambien cuando cambiamos de datos, siempre y cuando no este en edición o inserción.

Hay cosa nuevas como el modulo de registros de histórico y poco más.

como siempre el código completo en https://gist.github.com/anonymous/5831048
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"

Última edición por José Luis Garcí fecha: 21-06-2013 a las 15:52:42.
Responder Con Cita
  #3  
Antiguo 22-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Bien comenzaba con la gestión de lotes cuando me di cuenta de que me faltaba un campo en su tabla

Como estaba era de la siguiente manera

Cita:
CREATE TABLE LOTES (
ID INTEGER NOT NULL,
CODIGOPRODUCTOFABRICABLE T20 /* T20 = VARCHAR(20) */, //Código del producto Fabricable
CODIGOEMPLEADO T20 /* T20 = VARCHAR(20) */, //Código del empleado responsable
FECHA DATE, //Fecha en que se fabrico
LOTE T20 /* T20 = VARCHAR(20) */, //Lote asignado
CADUCIDAD DATE, //Si es caduco su fecha de caducidad
CANTIDAD NUMERIC(15,2), //Cantidad total fabricada (litros, kilos unidades)
ACTIVO LOG /* LOG = CHAR(1) */ //Si el producto esta activo
);




La tabla completa queda así

Cita:
CREATE TABLE LOTES (
ID INTEGER NOT NULL,
CODIGOPRODUCTOFABRICABLE T20 /* T20 = VARCHAR(20) */, //Código del producto Fabricable
CODIGOEMPLEADO T20 /* T20 = VARCHAR(20) */, //Código del empleado responsable
FECHA DATE, //Fecha en que se fabrico
LOTE T20 /* T20 = VARCHAR(20) */, //Lote asignado
CADUCIDAD DATE, //Si es caduco su fecha de caducidad
CANTIDAD NUMERIC(15,2), //Cantidad total fabricada (litros, kilos unidades)
ACTIVO LOG /* LOG = CHAR(1), */ //Si el producto esta activo
MAESTRO T20 /* T20 = VARCHAR(20) //Si viene de un lote maestro
);
Por cierto el Campo Cantidad no tiene nada que ver con el Stock, sólo dejarlo claro.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #4  
Antiguo 22-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Vamos con dos tablas auxiliares importantes

Cita:
CREATE TABLE STOCK (
ID INTEGER NOT NULL,
CODIGOPRODUCTO T20 /* T20 = VARCHAR(20) */, //Código del producto
LOTE T20 /* T20 = VARCHAR(20) */, //Lote del producto
CANTIDADDEENTRADA INTEGER, //Cantidad de entrada, aquí se ira sumando según las entradas (1)
EXISTENCIAS INTEGER, //Las Existencias que quedan (2)
FECHAENTRADA DATE, //Fecha de la primera entrada , aunque luego sigan entrado más cantidades
CADUCIDAD DATE, //Fecha en la que se caduca el producto(3)
ACTIVO LOG /* LOG = CHAR(1) */ (4)
);

Es de suma importancia saber que en este caso el stock lo hacemos por Lote, con lo que saber el total de existencias reales, seria la suma de de todos los lotes que estén en activo y cuya EXISTENCIAS sean mayor o igual a 1, quiero decir que las existencias del 16-5 es todas las que estén en la tabla Stock con los siguientes datos

CODIGOPRODUCTO='16-5', ACTIVO='S' y EXISTENCIAS>=1

lo que nos puede dar varios registros.


(1) En ciertos tipos de fabricación, las mercancías no se sacan todas a la vez, por eso este campo, lo que hace es incrementar, según hagamos entradas

(2) Aquí debemos tener mucho ojo, es las Existencias (el verdadero Stock), debe indicarnos en todo momento la cantidad real de artículos que quedan , es importante esta cantidad normalmente disminuye, pero hay que tener en cuenta que si hemos echo un documento (albarán, Factura, Etc) que afecta al stock, debemos controlar sus modificamos
veamos diferentes ejemplos pongamos que inicialmente sacamos 10 vajillas

Primero tener en cuenta que si las existencias llegan a 0 debemos marcar como no activo (4)

Caso 1º Salida de 10 vajillas 5L código del producto 16-5 Lote 130001 Seria CODIGOPRODUCTO='16-5', LOTE=130001, EXISTENCIAS=EXISTENCIAS-10

Caso 2º Salida de 10 vajillas 5L código del producto 16-5 Lote 130001(6) y 130002(4) ya que del primer lote nos quedan solo 6, los cambios en la tabla stock serían

CODIGOPRODUCTO='16-5', LOTE=130001, EXISTENCIAS=EXISTENCIAS-6, ACTIVO='N'

Y

CODIGOPRODUCTO='16-5', LOTE=130002, EXISTENCIAS=EXISTENCIAS-4

Caso 3º Sobre el que teníamos con salida de 10 vajillas 5L código del producto 16-5 Lote 130001 lo modificamos y en vez de 10, subimos a 12 los cambios serían


CODIGOPRODUCTO='16-5', LOTE=130001, EXISTENCIAS=EXISTENCIAS-2 (ya que habíamos descontado anteriormente 10 por ello debemos controlar al editar la cantidad anterior siendo el cálculo resultante el siguiente CantiadaADescontar:=CantidadActual-CantidadAnterior; )

Caso 4º Sobre el que teníamos con salida de 10 vajillas 5L código del producto 16-5 Lote 130001 lo modificamos y en vez de 10, Bajamos a 8 los cambios serían

CODIGOPRODUCTO='16-5', LOTE=130001, EXISTENCIAS=EXISTENCIAS+2 (ya que habíamos descontado anteriormente 10 por ello debemos controlar al editar la cantidad anterior siendo el cálculo resultante el siguiente CantiadaADescontar:=CantidadActual-CantidadAnterior; en este caso cantidad actual sería mayor con los que nos daría -2 de resultado al ser el resultado negativo entonces sumamo)

Caso 5º Sobre el que teníamos con salida de 10 vajillas 5L código del producto 16-5 Lote 130001 lo modificamos Cambiamos el Lote por 130004 los cambios serían

CODIGOPRODUCTO='16-5', LOTE=130001, EXISTENCIAS=EXISTENCIAS+10
CODIGOPRODUCTO='16-5', LOTE=130004, EXISTENCIAS=EXISTENCIAS-10

Caso 6º Eliminamos el que teníamos con salida de 10 vajillas 5L código del producto 16-5 Lote 130001 lo cambios serían

CODIGOPRODUCTO='16-5', LOTE=130001, EXISTENCIAS=EXISTENCIAS+10
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Si existiesen varios lotes debemos tener Stringrid, dividiendo los lotes con sus cantidades y un edit por Row, para poder poner la nueva cantidad, su estructura seria más o menos como sigue

Lote, Fecha, Caducidad, Existencias, Activo (en caso de que sea 'N' no nos permitirá números positivos, pero si recuperar, si este fuese el caso debemos añadir a existencias y cambiar ACTIVO de 'N' a 'S')

(3) Si el producto es caduco aquí ira su Fecha de caducidad, como un lote sólo puede tener una única fecha de producción, sólo habrá una fecha de caducidad y repito a un número de lote asignado, es una única fabricación.

(4) El Campo ACTIVO tendrá los valores S o N y es de vital importancia, por defecto cuando damos una entrada, si no existe en la tabla STOCK, lo creamos con ACTIVO='S', salvo que indicamos lo contrario, el motivo para esta r en 'N' son los siguientes, que en la mayoría de los casos no tiene que ver con las Existencias

1º) Existencias a 0, en este caso no es lógico que cada vez que entramos en el artículo, o en uno de los documentos de venta siguiera apareciendo si no hay artículo de donde extraer.
2º) Un lote a retirar, podríamos detectar un problema en un lote y tener que retirarlo, para evitar que siga habiendo salidas, lo marcamos como no activo
3º) Es un producto de uso interno y por lo tanto no se vende, tato para uso del personal, como creado para usar en la fabricación/uso de otros productos

Siento el coñazo, pero es muy importante que este tema quede bien claro, para no tener problemas de trazabilidad y existencias reales. Si queda alguna duda, prefiero dedicarle más tiempo y aclararlo ahora que más adelante cuando el programa este más avanzado.

Espero no haberme dejado alguno de los casos posibles, si es así, por favor comunicármelo.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #5  
Antiguo 22-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
La otra tabla

Cita:
CREATE TABLE ENTRADAS (
ID INTEGER NOT NULL,
CODIGOPRODUCTO T20 /* T20 = VARCHAR(20) */, //Código del producto
LOTE T20 /* T20 = VARCHAR(20) */, //Lote asignado
FECHA DATE, //Fecha de la entrada y no del lote
CADUCIDAD DATE, //Fecha de la caducidad, esta si la recogemos de la tabla LOTES
CANTIDAD INTEGER, //Cantidad
CODIGOOPERARIO T20 /* T20 = VARCHAR(20) */ //Código del empleado
);;
Como podemos una tabla sencilla, que nos permite tener un buen control de las diferentes entradas.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #6  
Antiguo 22-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Se me olvidaba, por supuesto es importante que si el producto es caduco quiero decir con esto que tiene fecha de caducidad y no esta en blanco, debe controlar que la fecha actual es menor que la de la caducidad y como no si el caso es que la fecha es mayor que la de la caducidad debemos poner ACTIVO='N'
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #7  
Antiguo 22-06-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Como estaba harto de que este componente me diese problemas con el tema de la negrita, lo he vuelto a modificar y aquí lo dejo ya corregido

Código Delphi [-]
{ ****************************************************************** }
{                                                                    }
{   VCL component TDBIBCheckbox                                      }
{                                                                    }
{   Dbcheckbox para Firebird permitiendo Cambiae El Value según Check }
{                                                                    }
{   Code generated by Component Create for Delphi                    }
{                                                                    }
{   Generated from untitled component definition                     }
{   on 23 March 2012 at 15:59                                        }
{                                                                    }
{   Copyright © 2012 by J.L.G.T.                                     }
{                                                                    }
{ ****************************************************************** }

unit TDbIbchkbox;

interface

uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls,
     Forms, Graphics, Stdctrls, DbTables, DB, DBCtrls, TypInfo, Dialogs;

type
  TDBIBCheckbox = class(TCheckBox)
    private
      { Private fields of TDBIBCheckbox }
        FUpperCaseChk : Boolean;
        FBoldCheck: Boolean;
        FValueChecked : String;
        FValueUnChecked : String;
        { Pointer to application's OnChange handler, if any }
        FOnChange : TNotifyEvent;
        FDataLink : TFieldDataLink;
        FBoldfixed: Boolean;
        { Private methods of TDBIBCheckbox }
        { Method to set variable and property values and create objects }
        procedure AutoInitialize;
        { Method to free any objects created by AutoInitialize }
        procedure AutoDestroy;
        function GetDataField : String;
        procedure SetDataField(Value : String);
        function GetDataSource : TDataSource;
        procedure SetDataSource(Value : TDataSource);
        procedure SetUppercaseChk(value:Boolean);
        function GetUpperCaseChk : Boolean;
        procedure SetValueChecked(value:string);
        procedure SetValueUnChecked(value:string);
        procedure ActiveChange(Sender : TObject);
        procedure DataChange(Sender : TObject);
        procedure EditingChange(Sender : TObject);
        procedure UpdateData(Sender : TObject);
        procedure SetBoldCheck(Value:Boolean);
        procedure SetBoldfixed(Value:Boolean);      //Permite que sea fija o no la negrita
    protected
      { Protected fields of TDBIBCheckbox }

      { Protected methods of TDBIBCheckbox }
        { Method to generate OnChange event }
        procedure Change(Sender : TObject); virtual;
        procedure Click; override;
        procedure KeyPress(var Key : Char); override;
        procedure Loaded; override;

    public
      { Public fields and properties of TDBIBCheckbox }
      { Public methods of TDBIBCheckbox }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;

    published
      { Published properties of TDBIBCheckbox }
        { Cuando Cambia el Checked }
        property OnChange : TNotifyEvent read FOnChange write FOnChange;
        property OnClick;
        property OnDblClick;
        property OnDragDrop;
        property OnEnter;
        property OnExit;
        property OnKeyDown;
        property OnKeyPress;
        property OnKeyUp;
        property OnMouseDown;
        property OnMouseMove;
        property OnMouseUp;
        { Campo de la base de datos }
        property DataField : String           read GetDataField       write SetDataField;
        { Datasource unido a la base de datos }
        property DataSource : TDataSource     read GetDataSource       write SetDataSource;
        { Asegura que Se grave en mayusculas }
        property UpperCaseChk : Boolean       read GetUpperCaseChk    write SetUppercaseChk  default True;
        { Valor de cuando Esta Checked=true }
        property ValueChecked : String        read FValueChecked      write SetValueChecked;
        { Valor de cuando no esta Checked (Checked=False) }
        property ValueUnChecked : String      read FValueUnChecked    write SetValueUnChecked;
        property BoldCheck:Boolean            read FBoldCheck         write SetBoldCheck  default True;
        property Boldfixed:Boolean            read FBoldfixed         write SetBoldfixed  default True;

        Procedure DBICHKNOT;
  end;

procedure Register;

implementation


Function GetTipoCampo (DataSet :TDataSet; Index :Integer) :String;
Begin
    Result := GetEnumName (TypeInfo (TFieldType),
    Integer (DataSet.Fields [Index].DataType));
End;

procedure Register;
begin
     RegisterComponents('InterBase', [TDBIBCheckbox]);
end;

{ Method to set variable and property values and create objects }
procedure TDBIBCheckbox.AutoInitialize;
begin
     FDataLink := TFieldDataLink.Create;
     FBoldCheck:=True;
     FUpperCaseChk:=True;
     FBoldfixed:=True;
     with FDataLink do
     begin
          { Assign handlers }
          OnDataChange := DataChange;
          OnUpdateData := UpdateData;
          OnEditingChange := EditingChange;
          OnActiveChange := ActiveChange;
     end;
end; { of AutoInitialize }

{ Method to free any objects created by AutoInitialize }
procedure TDBIBCheckbox.AutoDestroy;
begin
     FDataLink.Free;
end; { of AutoDestroy }

function TDBIBCheckbox.GetDataField : String;
begin { Return the FDataLink.FieldName property }
     Result := FDataLink.FieldName;
end;

procedure TDBIBCheckbox.SetDataField(Value : String);
begin { Set the FDataLink.FieldName property }
     FDataLink.FieldName := Value;
end;

function TDBIBCheckbox.GetDataSource : TDataSource;
begin { Return the FDataLink.DataSource property }
     Result := FDataLink.DataSource;
end;

procedure TDBIBCheckbox.SetDataSource(Value : TDataSource);
begin { Set the FDataLink.DataSource property }
     FDataLink.DataSource := Value;
end;

function TDBIBCheckbox.GetUpperCasechk : Boolean;
begin
  Result := FUpperCaseChk;
end;

{ Method to generate OnChange event }
procedure TDBIBCheckbox.Change(Sender : TObject);
begin
     if Assigned(FOnChange) then FOnChange(Sender);
end;

{ Override OnClick handler from TCheckBox }
procedure TDBIBCheckbox.Click;
begin { Call method of parent class }
     if FDataLink.Editing then  //Comprueba si se esta editando el registro
     begin
          FDataLink.Modified;
          if fDataLink.field <> nil then
          begin
             if (Checked) then
             begin
               if FUpperCaseChk then fDataLink.field.Value := UPperCase(FValueChecked)
                                else fDataLink.field.Value := FValueChecked;
               if (FBoldCheck) then
               begin
                 if (fBoldfixed=False)  then Self.Font.Style:=[fsBold]
                                        else Self.Font.Style:=[];
               end;
             end else
             begin
              if FUpperCaseChk=False then fDataLink.field.Value := UpperCase(FValueChecked)
                                     else  fDataLink.field.Value := FValueUnChecked;
             end;
          end;
          inherited Click;
//       end;
     end;
end;

{ Override OnKeyPress handler from TCheckBox }
procedure TDBIBCheckbox.KeyPress(var Key : Char);
begin { Call method of parent class }
     inherited KeyPress(Key);
end;

constructor TDBIBCheckbox.Create(AOwner: TComponent);
begin
     inherited Create(AOwner);
     AutoInitialize;
     FUpperCaseChk:=True;
     FValueChecked:='SI';
     FValueUnChecked:='NO';
     { Code to perform other tasks when the component is created }
end;

procedure TDBIBCheckbox.DataChange(Sender : TObject);
begin
    if fDataLink.field <> nil then
    begin
       if FUpperCaseChk then
       begin
          if UpperCase(FDataLink.Field.AsString)=UpperCase(FValueChecked) then Checked:=true
                                                                          else Checked:=False;
       end else
       begin
          if FDataLink.Field.Value=FValueChecked then Checked:=true
                                                 else Checked:=False;
       end;
       if (Checked) then
       begin
               if (FBoldCheck) then
               begin
                 if (fBoldfixed=False)  then Self.Font.Style:=[fsBold]
                                        else Self.Font.Style:=[];
               end;
       end;
       if Assigned(FOnChange) then FOnChange(Sender);
    end;
end;

destructor TDBIBCheckbox.Destroy;
begin
     AutoDestroy;
     inherited Destroy;
end;

procedure TDBIBCheckbox.EditingChange(Sender : TObject);
begin
     //
end;

procedure TDBIBCheckbox.Loaded;
begin
     inherited Loaded;
end;

procedure TDBIBCheckbox.ActiveChange(Sender : TObject);
const
     IntFieldTypes = [ftSmallInt, ftInteger, ftWord];
begin
     if DataField = '' then  Exit;
end;

procedure TDBIBCheckbox.UpdateData(Sender : TObject);
begin
    if fDataLink.field <> nil then
    begin
        if (Checked) then
       begin
         if FUpperCaseChk then fDataLink.field.Value := UPperCase(FValueChecked)
                          else fDataLink.field.Value := FValueChecked;
         if (FBoldCheck) then
         begin
              if (fBoldfixed=False)  then Self.Font.Style:=[fsBold]
                                     else Self.Font.Style:=[];
         end;
       end else
       begin
         if FUpperCaseChk=False then fDataLink.field.Value := UpperCase(FValueChecked)
                                  else  fDataLink.field.Value := FValueUnChecked;
       end;
    end;
end;

procedure TDBIBCheckbox.SetUppercaseChk(value: Boolean);
begin
    if value<>FUpperCaseChk then FUpperCaseChk:=value;
end;

procedure TDBIBCheckbox.SetValueChecked(value: string);
begin
      if value<>FValueChecked then
      begin
         if FDataLink.Field<>nil then
         begin
             if Length(value)>FDataLink.Field.Size then ShowMessage('El ValueCheck [ '+Value+' ] contiene más caracteres de los '+#13+#10+
                                                                    'permitidos, que es de  [ '+IntToStr(FDataLink.Field.Size)+' ] caracteres')
                                                  else FValueChecked:=value;
         end else FValueChecked:=value;
      end;
end;
procedure TDBIBCheckbox.SetBoldCheck(Value: Boolean);
begin
    if FBoldCheck<>value then FBoldCheck:=Value;

end;

procedure TDBIBCheckbox.SetBoldfixed(Value: Boolean);
begin
   if FBoldfixed<>Value then FBoldfixed:=Value;
   if FBoldfixed then Self.Font.Style:=[fsBold] else Self.Font.Style:=[]
end;

procedure TDBIBCheckbox.SetValueUnChecked(value: string);
begin
      if value<>FValueUnChecked then
      begin
         if FDataLink.Field<>nil then
         begin
             if Length(value)>FDataLink.Field.Size then ShowMessage('El ValueUnCheck [ '+Value+' ] contiene más caracteres de los '+#13+#10+
                                                                    'permitidos, que es de  [ '+IntToStr(FDataLink.Field.Size)+' ] caracteres')
                                                  else FValueUnChecked:=value;
         end else FValueUnChecked:=value;
      end;
end;

Procedure TDBIBCheckbox.DBICHKNOT;
begin
   if  FDataLink.Editing=true then
   begin
        FDataLink.Field.Value:=FValueUnChecked;
   end;
end;

end.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #8  
Antiguo 09-07-2013
Avatar de PepeLolo
PepeLolo PepeLolo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Fuenlabrada - Madrid - Espagna
Posts: 265
Poder: 21
PepeLolo Va por buen camino
Sólo puedo decir ¡Chapeau! Por el trabajo que estas realizando. Estoy siguiendo el desarrollo desde el principio y me parece fantástico. Es un ejemplo ejemplarizante de desarrollo de aplicación.
Componentes, Datamodulos, explicaciones, imágenes.

Es un trabajo que puede servir tanto para un nivel de programador bajo-medío-alto ya das un montón de aportes al mismo y das buenos ejemplos de resolución como son los componentes adaptados a las necesidades concretas.
__________________
PepeLolo
El hombre el único virus que mide más de unas cuantas micras
Responder Con Cita
  #9  
Antiguo 09-07-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Cita:
Empezado por PepeLolo Ver Mensaje
Sólo puedo decir ¡Chapeau! Por el trabajo que estas realizando. Estoy siguiendo el desarrollo desde el principio y me parece fantástico. Es un ejemplo ejemplarizante de desarrollo de aplicación.
Componentes, Datamodulos, explicaciones, imágenes.

Es un trabajo que puede servir tanto para un nivel de programador bajo-medío-alto ya das un montón de aportes al mismo y das buenos ejemplos de resolución como son los componentes adaptados a las necesidades concretas.
Gracias PepeLoto, por tu comentario, imagino que el tutorial a de ser útil, ya que cuando yo comencé con estos temas, no encontraba casi nada de información, es verdad que ahora existe bastante más, pero es difícil de digerir y aplicar algunas veces.
Una cosa que no me ha quedado clara a lo largo del tutorial, es el conocimiento real de los temas tratados por los compañeros, es por lo que digo muchas veces, que no se si interesa o es que estoy siendo muy espeso en el tema e incluso que alguno piense en que estoy siendo prepotente.

Vuelvo y te repito gracias por el comentario, pero podrias poner una evaluación como la pido, ya que me sería más útil, para saber realmente, en que tendría que mejorar.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
llamar un programa desde otro programa en un computador con dos monitores RONPABLO Varios 0 10-10-2011 18:20:51
Cargar tu programa desde otro programa rmendoza83 Varios 7 05-01-2009 19:51:33
Lanzar programa desde mi programa Pablo Carlos API de Windows 32 09-09-2004 13:56:26
Ejecutar un programa externo desde un programa de Delphi Roger_Fernandez Varios 3 02-09-2004 18:05:36
ISC ERROR CODE:335544344 I/O error for file "c:\gestion\gestion.gdb" eliasterrero Firebird e Interbase 2 28-06-2004 12:20:25


La franja horaria es GMT +2. Ahora son las 13:15:51.


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
Copyright 1996-2007 Club Delphi