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 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
  #2  
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
  #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
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
  #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
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
  #5  
Antiguo 23-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
El Módulo de Lotes



Es importante darse cuenta que el nuevo número de lote siempre lo cogemos de configuración evitando de esta manera que se puedan duplicar los número de lotes

Tenemos que poner un apartado en el programa para cerrar el año, ya que este nos permite poner el contador de lotes y de otros si es necesario a 0

El código en https://gist.github.com/anonymous/5844768

Veamos un detalle de como va cambiando el módulo UbusquedaFP

Código Delphi [-]
procedure TFbusquedaFP.FormActivate(Sender: TObject);
//------------------------------------------------------------------------------
//********************[ Cargamos los Campos de la tabla  en el ComboBox  ]******
//------------------------------------------------------------------------------
begin
  //Comprobamos si el combo esta vacio cargamos los datos
  if Edbusqueda.Text='' then ActQuery(IBQBusqueda,'Select * From '+VarSTabla);
  if IBQBusqueda.IsEmpty then
  begin
     ShowMessage('No hay datos para buscar o mostrar');
     SB_SalirClick(Sender);
  end else
  begin
     if comboCampos.Items.Count=0 then DataSource1.DataSet.GetFieldNames(comboCampos.items);
     if VarSTabla='FPAGOS' then
     begin
       CarGarGrid(0,'ID',50,'ID');
       CarGarGrid(1,'CODIGO',130,'Código');
       CarGarGrid(2,'FORMAPAGO',260,'Forma de pago');
       CarGarGrid(3,'DIASPRESENTACION',130,'Días de presentación');
       CarGarGrid(4,'DIASCOBRO',130,'Días de cobro');
       CarGarGrid(5,'NUMERODEPAGOS',130,'Número de pagos');
     end;
     if VarSTabla='FABRICABLES' then
     begin
       CarGarGrid(0,'ID',50,'ID');
       CarGarGrid(1,'CODIGO',130,'Código');
       CarGarGrid(2,'PRODUCTO',520,'Producto');
     end;
     if VarSTabla='EMPLEADOS' then
     begin
       CarGarGrid(0,'ID',50,'ID');
       CarGarGrid(1,'CODIGO',130,'Código');
       CarGarGrid(2,'NOMBRE',520,'Nombre');
       CarGarGrid(3,'PUESTO',130,'Puesto de trabajo');
       CarGarGrid(4,'AGENTE ',130,'Es Agente o comercial');
     end;
  end;
end;

procedure TFbusquedaFP.FormClose(Sender: TObject; var Action: TCloseAction);
//------------------------------------------------------------------------------
//****************************************************************[ Cerrar ]****
//------------------------------------------------------------------------------
begin
   if (VarSNomMod='PROVEEDORES')  and (FProveedor.DsPrincipal.DataSet.State in [dsEdit,dsInsert]) then
   begin
       FProveedor.DBNCodigoFormaPago.Field.Value:=IBQBusqueda.FieldByName('FORMAPAGO').AsString; //Ponemos la forma de pago elegida
       FProveedor.DBNCodigoFormaPago.SetFocus;                        //Damos el foco nuevamente al campo
   end;
   if (VarSNomMod='LOTESF')  and (FLotes.DsPrincipal.DataSet.State in [dsEdit,dsInsert]) then
   begin
       FLotes.DBNCodFabricable.Field.Value:=IBQBusqueda.FieldByName('CODIGO').AsString; //Ponemos el código elegido
       FLotes.DBNCodFabricable.SetFocus;                        //Damos el foco nuevamente al campo
   end;
   if (VarSNomMod='LOTESE')  and (FLotes.DsPrincipal.DataSet.State in [dsEdit,dsInsert]) then
   begin
       FLotes.DBNCodEmpleado.Field.Value:=IBQBusqueda.FieldByName('CODIGO').AsString; //Ponemos el código elegido
       FLotes.DBNCodEmpleado.SetFocus;                        //Damos el foco nuevamente al campo
   end;
   Button3Click(Sender);
   QuerryOC(IBQBusqueda);
   comboCampos.Items.Clear;
end;

procedure TFbusquedaFP.FormShow(Sender: TObject);
//------------------------------------------------------------------------------
//****************************************************************[ OnShow ]****
// Adaptamos el título del form a la tabla que usamos
//------------------------------------------------------------------------------
begin
  if VarSTabla='FPAGOS' then Caption:='Búsquedas en Fomas de pago';  //Caption del Form
  if VarSTabla='EMPLEADOS' then Caption:='Búsquedas en Empleados';  //Caption del Form
  if VarSTabla='FABRICABLES' then Caption:='Búsquedas en Fabricables';  //Caption del Form
end;

como podemos ver usamos el mismo módulo, para diferentes llamadas, e incluso cunado las llamadas son desde el mismo módulo, pero para diferente Tablas ('LOTESF' y 'LOTESE')

El próximo módulo es el de entradas, que tiene muchas similitudes con este pero también con el de Stock, realmente es el paso intermedio entre ambos.

Que paséis un buen Domingo.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"

Última edición por José Luis Garcí fecha: 23-06-2013 a las 14:44:22.
Responder Con Cita
  #6  
Antiguo 24-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
Bueno le toca al modulo de entradas



y el código como siempre en https://gist.github.com/anonymous/5850255

Como se puede apreciar, se va complicando la cosa , os que yo soy muy complicado como prefierán
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #7  
Antiguo 29-06-2013
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Un consejo por la experiencia de trabajar con distintos sistemas y clientes. En el diseño de los formularios no hagas demasiado grandes los botones porque eso le quita importancia las demas cosas del formulario y a los campos de ingreso de datos. Además intenta que los campos de ingreso de datos sean lo mas justo posibles con el tamaño de lo que puedne ingresar, o sea, que si en un campo pueden ingresar solamente 20 caracteres o dígitos que el campo de ingreso se ajuste a tener ese tamaño y no sobre espacio.

Otra cosas, tampoco pongas muchos colores al fondo de los formularios. Es conveniente que tengan un estilo mas similar al que tiene Windows XP/7.

Veo que todos generalmente opinan como debe ser la base de datos, pero lo que nadie dice es que intentes tener una base normalizada. Esto a largo plazo sera mas conveniente y te evitará grandes dolores de cabeza cuando el proyecto cresca.

Con respecto a los campos de la base lo que yo hago es poner 3 letra delante del nombre para identificar la tabla a la que pertenece. Con esto si algun campo como pueden ser los códigos si se necesitan hacer referencia en otra tabla es mas facil identificarlos

Ejemplo:

Tablas:
- Provincias
* prvCodigo
* prvDescripcion

- Clientes
* cliCodigo
* cliNombre
* cliDireccion
* prvCodigo <-- este hace referencia a un registro de otra tabla.
* cliNota

Por el momento creo que este es todo mi aporte.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
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
  #10  
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
Además creo que mi sistema de trabajo no es el mejor, estoy seguro de que muchos compañeros, pueden hacer maravillas comparado con lo que yo hago, la única ventaja que yo puedo tener, es que suelo trabajar en las empresas para que hago los programas, ya que es la manera más eficaz de conocer las carencias y necesidades de una empresa. Por supuesto si te dedicas a la programación, esto es casi imposible, pero tampoco debemos quedarnos con lo que nos dice el jefe de una empresa, ya que suelen tener un ideal de la empresa, que muchas veces choca con la realidad, de la misma.

Normalmente suelo hablar de cosas que conozco, aunque sea un poco, hace ya cerca de 17-18 empece a trabajar para una empresa que vendía cupones, tipo a los de la once, el primer día me pusieron a trabajar, con un señor que llevaba unos cuantos años buenos trabajando para esta asociación de Madrid, empezó a explicarme el programa, claro, al final y al cabo se trata de un programa de gestión y yo programaba en clipper en esa época, que era el mismo lenguaje de la aplicación, al cabo de una hora y media, ya empece a trabajar con el programa y terminamos el día de trabajo, me preguntaron que que tal y le comente que no entendía, por que algunos procesos se hacían de determinada manera.
Al cabo de una semana, me presentaron a un señor, que me pregunto por las dudas, que tenia del programa, le comente y explique, el por que de mis dudas, me pregunto como lo haría yo, esquematizando le dije más o menos, mis ideas y planteamientos, al cabo de dos días volvió este señor, con otro mucho más joven, era la persona que había hecho el programa, tuve que volver a explicar mis dudas y decir mis planteamientos, esa misma tarde me sacaron de la oficina, para ir al hotel donde se quedaban, tenia una reunión, entre el gerente de zona, la persona que me enseño (era el tercero dentro de la asociación con más de 8 años en ella), el señor más mayor que me pregunto por mis dudas (resulto ser el Presidente de la Asociación, cosa que yo aun desconocía) y el programador), claro, como podéis imaginaros, estaba un poco acojonado, ya que había sido padre hacía pocos meses y estuve en el paro antes de este puesto cerca de 3 años, pensaba que me despedían, sinceramente.
Aquella reunión termino por la noche, me invitaron a cenar y me convocaron nuevamente, a la mañana siguiente en el hotel, durante esos dos días, se estuvo planteando y rebatiendo los diferentes puntos, tiradas, premiso, cierres, partes, etc. a la hora de comer, se presentan a un chaval joven, ante el delegado de zona y el señor que me enseñaba a mi, era mi sustituto, podéis imaginaros, se me cayo el alma a los pies, aún así, mantuve el tipo y calle, seguimos la reunión y al final del segundo día, me preguntaron, por que encontré con tanta facilidad, tantos puntos flacos, posibles errores y mejoras, mi respuesta fue sincera, por que estaban ahí, el presidente se rió y el informático cayo, estaba serio, muy serio, cuando el presidente se sereno, le pregunto al informático, que como era posible que un programa que estaba terminado hacia dos años, más un año terminarlo, no se hubiese dado cuenta de esos errores, mejoras y huecos de seguridad, el informático me miro, estaba triste, se le notaba que estaba enfadado imagine que consigo mismo (luego supe que así era), se hizo el silencio, yo me vire y le pregunte, algo que Jesús, el amigo que me enseño a programar en clipper me dijo al principio del todo, "oye Carlos (el nombre del informático), cuantas horas pasaste con el personal preguntándoles y viéndoles trabajar", me miro sorprendido y me dijo 0, fue el Presidente (no recuerdo su nombre), quien me dio las pautas, a el se le entregaba el programa y me comentaban los errores, me vire a este y le pregunte, cuantas horas paso usted con el programa, su respuesta fue tajante, yo no trabajo con eso se la doy a Fulanito (La persona que me enseño el primer día del cual no recuerdo el nombre) y el a su vez se lo da al personal el cual le dice los fallos, entonces tú (Carlos), no haz hablado nunca con nadie que trabajara directamente con el programa, me volvió a mirar, haciendo un esfuerzo por recordar y dijo no, nunca, dije, esta claro, ahí radica el problema, los usuarios finales, son los que detectan los fallos, si hay un jefe por medio, siempre se cohiben más que con un igual o alguien externo que este para solucionar los problemas, los dos me miraron, se miraron y me dijeron que volviera la hotel al día siguiente.

Regrese al día siguiente y me dijeron que no volvería a mi puesto de inspector (introductor), que me subían el sueldo (25.000 pesetas si no recuerdo mal) y que tendría que estar los próximos quince días yendo a trabajar a una casa que habían alquilado, con Carlos, que luego era probable, que tuviese que viajar a Madrid, cuando el programa estuviese en su fase final de pruebas, nunca fui, diez días despues, hubo un problema muy serio entre la persona que me había contratado y la asociación (el problema fue por parte de esta), no se bajaron del burro, así que mi jefe Jerónimo, decidió despues de preguntarme si yo era capaz de hacer un programa parecido como el que tenia la asociación, le dije que si, me dijo en 20 días, le dije, completo no, pero algunas partes si, acepto y rompió los acuerdos con la asociación, montando una nueva, dicho programa en terminarlo completo, tarde 6 meses, al cabo de otros tres años y medio, me pidió y pago que le hiciera una nuevo para windows, y que yo sepa a día de hoy lo signe usando, tiene fallos, debido a que fue echo en DBF y Delphi 3, hoy en día hubiese echo muchas cosas de manera diferente, pero me imagino que nos pasa a todos.

En cuanto a Carlos, estuve en contacto hasta el 2007, año en que por desgracia murió, durante muchos años, cuando venia a canarias, siempre nos veíamos, el programa lo corrigió siguiendo muchos de mis concejos y aplicando su técnica y forma de programar, pero fue siempre un buen amigo, a partir de aquel tercer día de conocernos.

Siento el coñazo, pero para que entandáis a que me refiero, se debe contar la historia completa.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #11  
Antiguo 09-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
jeje... me gustan las historias de los "abuelos"

Fdo. Otro abuelo
Responder Con Cita
  #12  
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 Casimiro Notevi Ver Mensaje
jeje... me gustan las historias de los "abuelos"

Fdo. Otro abuelo
, ya no vamos para jovencitos, yo ya voy por tres pastillas al día y tú?
__________________
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 07:31:53.


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