Ir al contenido


Foto

Programa de gestión desde 0 (Activo)


  • Por favor identifícate para responder
156 respuestas en este tema

#61 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 18 julio 2013 - 04:48

Pequeñas correcciones en
[DELPHI]

procedure TFXPAF.DBNCodigoClienteExit(Sender: TObject);
//...  Cmbiar
    ShowMessage('Este campo no puede quedar vacio, por favor rellene l campo [Código de cliente]');
//...por
  ShowMessage('Este campo no puede quedar vacio, por favor rellene el campo [Código de cliente]');[/DELPHI]

y en

[DELPHI]procedure TFXPAF.DBNNumeroDocumentoExit(Sender: TObject);

//...Cambiar
    ActQuery(IBQBuscarNumeroDocumento,'Select * From DOCUMENTOS where WHERE (DOCUMENTOS.TIPODOCUMENTO = '+QuotedStr(VarSTipoDocumento)+
  ') AND (DOCUMENTOS.NUMERODOCUMENTO = '+QuotedStr(DBNNumeroDocumento.Text) +
                ') AND (DOCUMENTOS.SERIE = '+QuotedStr(DBNSerie.Text)+')');
//...por
      ActQuery(IBQBuscarNumeroDocumento,'Select * From DOCUMENTOS WHERE (DOCUMENTOS.TIPODOCUMENTO = '+QuotedStr(VarSTipoDocumento)+
  ') AND (DOCUMENTOS.NUMERODOCUMENTO = '+QuotedStr(DBNNumeroDocumento.Text) +
                ') AND (DOCUMENTOS.SERIE = '+QuotedStr(DBNSerie.Text)+')');

[/DELPHI]

Os pido disculpas pues he visto varias faltas de ortografía, pero es el corrector de texto, que no se que problema tiene pero ha incluido varias palabras en el diccionario y me las cambia automáticamente, ya por defecto escribo y suele comerme o poner alguna letra demás y se que cometo varias faltas ortográficas.
  • 0

#62 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 18 julio 2013 - 07:52

Hola Desart,
He estado siguiendo el progreso del trabajo, y vaya que si le estás poniendo todo el cuerpo en ello  (y)

Lo que si noto y me llama mucho la atención es la forma en como llevas la documentación:



delphi
  1. procedure TForm.Algo;
  2. // Documentación
  3. begin
  4. // El código
  5. end;



Yo también llevaba la documentación de esta forma, y durante un tiempo me decía que era lo mejor pero luego me estuve dando cuenta de que no es del todo sana a largo plazo y cuando las unidades son muy grandes (con 1,5KLDC ya es tedioso).
Es mejor llevar la documentación en la sección interface y no en implementation y que esté antes o al final de los métodos o funciones. Es decir:



delphi
  1. interface
  2.  
  3. // Aquí va la documentación
  4. procedure Algo;
  5. // O bien aquí



De este modo en implementation queda sólo el código y no se "rompe" la vista de donde comienza la declaración del procedimiento o función y el código efectivo (lo que está entre el begin y end).
En todo caso en el código sólo se debe de añadir la documentación a modo de acotación o comentario aclaratorio sobre algo en particular.

Yo me valgo de GExpert para generar mis macros/plantillas para documentación. Tengo varias, cada una diseñada para llevar la documentación de cada cosa: Unidades, Clases, Interfaces, Métodos, Registros, Enumerados, y una en general.

Por ejemplo, este es el macro para los métodos:



delphi
  1. %BEFORE%{---------------------------------------------------------------------------
  2.  Método: %CLASS%.%METHODCLASS%
  3.  Fecha: %DATETIME%
  4.  Versión: 0.<M.n.c>
  5.  ***************************************************************************
  6.  Parámetros:%BEGINPARAMLIST%
  7.  * %PARAMNAME%: %PARAMTYPE% = %PARAMDEF% 
  8.   <Descripción-parámetro-%PARAMNAME%>%ENDPARAMLIST%
  9.  Resultado: %RESULT%
  10.  * <valor>: <descripción-resultado>
  11.  Excepciones:
  12.  * <Excepction>: <Descripción-excepción>
  13.  Descripción:
  14.  |
  15.  Véase: <LISTA-DOCS>
  16.  --------------------------------------------------------------------------}



Está pensada para funcionar después de la declaración del método. Aquí dejo un ejemplo de como se veería:



delphi
  1.     {---------------------------------------------------------------------------
  2.     Método: TAbstractSubject.GetObserver
  3.     Fecha: 15/08/2012 5:13:44 p.m.
  4.     ***************************************************************************
  5.     Parámetros:
  6.     * Index: Integer
  7.       Índice del Observador a devolver.
  8.     Resultado: IAbstractObserver
  9.       Observador index-ésimo en lista.
  10.     Excepciones:
  11.     * EIndexObserverException: Índice de Observadores fuera de rango
  12.     Descripción:
  13.       Método de lectura para la propiedad vectorial Observers.
  14.       Puede definir su propio GetObservers con el tipo esperado para su
  15.       propia propiedad vectorial específica. y por defecto.
  16.     --------------------------------------------------------------------------}



Yo me he acostumbrado a no sobrepasar la línea de 80 caracteres. Y justamente mi documentación se presenta sangrada o tabulada a 4 espacios.

Tengo además otras macros para separadores, e incluso para colocar como señalador de fin de método. Por ejemplo:



delphi
  1. function TAbstractSubject.Subscribe(Observer: IAbstractObserver): Integer;
  2. var Pos: Integer;
  3. begin
  4.   Pos := FObservers.IndexOf(Observer);
  5.   if Pos = -1
  6.     then Result := FObservers.Add(Observer)
  7.     else Result := -1;
  8. end; {* Fin M. TAbstractSubject.Subscribe *}



Esto me permite ver para aquellos métodos que consumen muchas líneas de código donde está el final e identificarlos en la medida en me voy desplazando más abajo. En ocasiones cuando programamos vemos un end; en la parte superior de la pantalla mientras estamos programando el siguiente método y nos quedamos preguntando "Ummm... ¿ese end de que era?".

Saludos,
  • 0

#63 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 18 julio 2013 - 08:54

Muchas gracias Delphius, la verdad que me parece interesante lo que dices. Llevo años programando poniendo las cabeceras y ya estoy acostumbrado, pero creo que tienes razón, en lo que rompe la lectura del código, creo que lo ire cambiando paulatinamente, pero no en el tutorial, ya que me parece a algunos compañeros les va a ser más fácil seguir de esta manera que poniendo los comentarios antes de la implementacion.

A mi también me pasa lo que comentas con los end y me parece muy buena solución la que das, pero sólo lo haces con funciones y procedures o también cuando el if contiene muchas lineas?.

En cuanto a los macros e de decir que no los he usado nunca y que uso más el CNPACK que el Gexpert.
  • 0

#64 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 18 julio 2013 - 09:10

Yo también hice el cambio de forma paulatina.
Es más, probé con varias formas de llevar la documentación... mezclando adelante, atrás, en interface , en implementation... hasta llegar a esta plantilla pasé por otros diseños. Esta es la más minimalista que me ha gustado.

Solamente tengo plantilla para el fin del método. Pero si "señalo" a mano los ends de los ifs para no perderme y saber efectivamente cual es cual, y lo mismo hago incluso con los ciclos u otras sentencias "agrupadas". Aunque gracias a la utilidad Source Highlight que viene con CnPack se distingue mejor y a todos colores cada begin y end  ;)
Por ejemplo:



delphi
  1. if (cond1)
  2.   then begin
  3.   // algo
  4.         end;
  5.   else begin
  6. end; //fin cond1
  7.  
  8. if cond1
  9.   then begin
  10.           if cond2
  11.             then begin
  12.                   end;
  13.             else begin
  14.                   end; //fin cond2
  15.         end; //fin cond1
  16.  
  17.  
  18. for i := 1 to N-1 do
  19. begin
  20.   for j := i+1 to N do
  21.   begin
  22.     // algo
  23.   end; //fin for-j
  24. end; // fin for-i



Yo he intentado adaptarme al script de macros para plantillas que ofrece CnPack pero no le encuentro la mano. Se que en parte es más potente. Creería que para alguien más entrenado en CnPack podría tranquilamente portar mi plantilla para éste.

Saludos,
  • 0

#65 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 04:36

Ahora seguimos con el comercial o agente, comenzamos con el código del comercial con los siguientes tres eventos

[DELPHI]

procedure TFXPAF.DBNCodigoComercialChange(Sender: TObject);
// ------------------------------------------------------------------------------
// **************************************************[ Change Cod Comercial ]****
// ------------------------------------------------------------------------------
begin

  if FXPAF.Active then
  begin
    if DBNCodigoComercial.Text <> '' then
    begin
        ActQuery(IBQAgentes, 'Select * from EMPLEADOS where (EMPLEADOS.AGENTE = '+QuotedStr('S')+') AND (Upper(EMPLEADOS.CODIGO)=Upper('+
                            QuotedStr(DBNCodigoComercial.Text) + '))');
    end;
  end;
end;

procedure TFXPAF.DBNCodigoComercialEnter(Sender: TObject);
// ------------------------------------------------------------------------------
// *************************************************[ entrar en comerciales ]****
// ------------------------------------------------------------------------------
begin
  SBComercialesClick(Sender);
end;

procedure TFXPAF.DBNCodigoComercialExit(Sender: TObject);
// ------------------------------------------------------------------------------
// ***********************************************[ Salir de cód. Comercial ]****
// ------------------------------------------------------------------------------
begin
  if DBNCodigoComercial.Text = '' then
  begin
    ShowMessage('Este campo no puede quedar vacio, por favor rellene el campo [Código de ccomercial]');
    DBNCodigoComercial.SetFocus;
  end else
  begin
  if UpperCase(DBNCodigoComercial.Text)='B' then SBBuscarAgenteClick(Sender) else
    begin
      if IBQAgentes.IsEmpty then
      begin
          Case Application.MessageBox(pchar(  'El comercial buscado no se encuentra, ¿desea crearlo?'),
  pchar('No se encuentra el comercial'),4+32+0) of
  6:SBNuevoAgenteClick(Sender);      //Si
  7:DBNCodigoComercial.SetFocus;      //No
end;
      end else
      begin  //Descripción del c
          if DBNNombreComercial.Text='' then DBNNombreComercial.Field.Value:=IBQAgentes.FieldByName('NOMBRE').Value else
          begin
            if DBNNombreComercial.Text<>IBQAgentes.FieldByName('NOMBRE').AsString then
            begin
                Case Application.MessageBox( pchar(  'El nombre de este comercial y el que tiene puesto no coinciden,            ¿desea cambiarlo por el nombre que tiene asignado este código?'),
                      pchar('Datos diferentes'),4+64+0) of
                  6:DBNNombreComercial.Field.Value:=IBQagentes.FieldByName('NOMBRE').Value;      //Si
                end;
            end;
          end;
      end;
    end;
  end;
end;

[/DELPHI]
  • 0

#66 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 04:38

Ups!, se me olvidó en la tabla de empleados, el campo NIF, lo tendréis que añadir

NIF                    T20 /* T20 = VARCHAR(20) */


  • 0

#67 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 06:40

Tenemos que cambiar un procedure, de los anteriores por este

[DELPHI]procedure TFXPAF.DBNCodigoComercialChange(Sender: TObject);
// ------------------------------------------------------------------------------
// **************************************************[ Change Cod Comercial ]****
// ------------------------------------------------------------------------------
begin
  if FXPAF.Active then
  begin
    if DBNCodigoComercial.Text <> '' then
    begin
        ActQuery(IBQAgentes, 'Select * from EMPLEADOS where (EMPLEADOS.AGENTE = '+QuotedStr('S')+') AND (Upper(EMPLEADOS.CODIGO)=Upper('+
                            QuotedStr(DBNCodigoComercial.Text) + '))');
        if Not IBQAgentes.IsEmpty then ActQuery(IBQAgenteIMAGEN, 'Select * from PC where (PC.MODULO = '+QuotedStr('EMPLEADOS')+') AND (Upper(PC.CODIGO)=Upper('+
        QuotedStr(DBNCodigoComercial.Text) + '))');
    end;
  end;
end;[/code]

ya que si no, no podríamos mostrar la imagen del comercial
  • 0

#68 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 07:05

Este es el evento para cuando cambiamos de ´numero de serie, al lado de la serie, se me había pasado

[DELPHI]procedure TFXPAF.NSESerieChange(Sender: TObject);
//------------------------------------------------------------------------------
//***************************************************[ Cambiar la serie ]*******
//------------------------------------------------------------------------------
begin
  case NSESerie.Value of
      1:DBNSerie.Field.Value:=DM.IBDCONFISERIE.Value;
      2:DBNSerie.Field.Value:=DM.IBDCONFISERIE2.Value;
      3:DBNSerie.Field.Value:=DM.IBDCONFISERIE3.Value;
  end;
end;[/DELPHI]
  • 0

#69 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 07:46

Otra modificación esta vez en SbNuevoClick  *-) *-) *-)



delphi
  1. procedure TFXPAF.SbNuevoClick(Sender: TObject);
  2. //------------------------------------------------------------------------------
  3. //*******************************************[ Creamos un nuevo registro ]******
  4. //------------------------------------------------------------------------------
  5. begin
  6.   ...
  7.   NDBSENumeroProteccionDatos.Field.Value:=1;  //añadimos esta linea antes de
  8.   DBNNumeroDocumento.Field.value:=VerNumeroDocumento(VarSTipoDocumento,DBNSerie.Text);
  9.   DBNSerie.SetFocus;
  10. end;


  • 0

#70 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 08:05

Cambios en mis componentes spinedit en el create, dentro de la creación de lo botones añadimos a cada uno la siguiente linea

[DELPHI]TabStop :=False;[/DELPHI]

Con esto evitamos que los botones  UP y Down, reciban el foco.

Pongo el código del create de uno de ellos, sabéis lo que tenéis que hacer para cambiarlos en los demás

[DELPHI]

constructor TNewDBSpinEdit.Create(AOwner: TComponent);
begin
  inherited;
  width :=121;
  height :=24;
  FCaptionDown :='q';
  FCaptionUp :='p';
  FWidthButton :=15;
  FontButtons :=TFont.Create;
  with FFontButtons do
  begin
    Name :='wingdings 3';
    Size :=7;
  end;
  FButtonUP :=TBitbtn.Create (self);
  with FButtonUP do
  begin
    width :=FWidthButton;
    height :=15;
    Font :=FFontButtons;
    top :=1;
    parent :=Self;
    Caption :=FCaptionUp;
    OnClick :=UpClick;
    OnKeyPress  :=Self.OnKeyPress;
    OnKeyDown :=Self.OnKeyDown;
    TabStop :=False;
  end;
  FButtonDown :=TBitbtn.Create (self);
  with FButtonDown do
  begin
    width :=FWidthButton;
    height :=15;
    Font :=FFontButtons;
    top :=1;
    parent :=Self;
    Caption :=FCaptionDown;
    OnClick :=DownClick;
    OnKeyPress  :=Self.OnKeyPress;
    OnKeyDown :=Self.OnKeyDown;
    TabStop :=False;
  end;
  FProportional :=True;
  ControlStyle := ControlStyle - [csSetCaption];
  FIncrement := 1;
  Text :='0';
end;

[/DELPHI]
  • 0

#71 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 08:07

Claro esta también debemos adapta el evento KEypress de nuestro formulario

[DELPHI]procedure TFXPAF.FormKeyPress(Sender: TObject; var Key: Char);
//------------------------------------------------------------------------------
//************************************************[  Al pulsar una tecla ]******
// Al pulsar la tecla salta al foco del siguiente componente, si esta admitido
//------------------------------------------------------------------------------
begin
    if (Key = #13) then {Si se ha pulsado enter }
    if (ActiveControl is TEdit)
    or (ActiveControl is TDBEdit)
    or (ActiveControl is TDBNewEditJL)
    or (ActiveControl is TNewDBSpinEdit)
    or (ActiveControl is TNewDBSpinEditDouble)
    or (ActiveControl is TDBComboBox) then
    begin
      Key := #0; { anula la puulsación }
      Perform(WM_NEXTDLGCTL, 0, 0); { mueve al próximo control }
    end;
end;[/DELPHI]

  • 0

#72 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 08:08

y ya por último hoy el siguiente evento

[DELPHI]procedure TFXPAF.NDBSENumeroProteccionDatosChange(Sender: TObject);
//------------------------------------------------------------------------------
//********************************************************[ Cambia la LOPD ]****
// Cambiamos la ley de protección de datos.
//------------------------------------------------------------------------------
begin
  if FXPAF.Active then
  begin
      if NDBSENumeroProteccionDatos.Text='' then NDBSENumeroProteccionDatos.Value:=1;
      if not ((NDBSENumeroProteccionDatos.Value<1) or (NDBSENumeroProteccionDatos.Value>3)) then
      begin
        Memo1.Lines.Clear;
        case NDBSENumeroProteccionDatos.Value of
          1:Memo1.Lines.Text:=DM.IBDCONFILDPD1.AsString;
          2:Memo1.Lines.Text:=DM.IBDCONFILDPD2.AsString;
          3:Memo1.Lines.Text:=DM.IBDCONFILDPD3.AsString;
        end;
      end else
      begin
        if (DSPrincipal.DataSet.State in [dsEdit,dsInsert])  then
        begin
          ShowMessage('El rango sólo esta permitido entre 1 y 3');
          NDBSENumeroProteccionDatos.SetFocus;
        end;
      end;
  end;
end;[/DELPHI]

  • 0

#73 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 julio 2013 - 08:10

Pido disculpas por tantas rectificaciones, pero es que según voy haciendo en caso lo voy subiendo, muchas veces sin haber probado el código primero :o
  • 0

#74 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 21 julio 2013 - 03:32

Vamos a hora por el botón "Escribir nota" con el siguiente código

[DELPHI]procedure TFXPAF.SBEscribirNotaClick(Sender: TObject);
//------------------------------------------------------------------------------
//******************************************************************[ Nota ]****
//------------------------------------------------------------------------------
var VarSText:string;
begin
  VarSText:=DBIBMemo2.Lines.Text;
  DBIBMemo2.Lines.Text:=InputMemo('Nota','Escriba su nota',VarSText);
end;[/DELPHI]

y como no estoy seguro de si puse esta function aquí os la pongo

[DELPHI]//------------------------------------------------------------------------------
//*************************************************************[ ImputMemo ]****
//  Parte de la idea original de  Felipe Monteiro  del 25/05/2006
// bajada de http://www.planetade...tbox-com-combo)
//------------------------------------------------------------------------------
// J.L.G.T. 06/08/2012 Basando me en el código de Felipe Monteiro , lo adapte a
// mis necesidades, creando un imput para entradas en memo
//------------------------------------------------------------------------------
//  [Acaption]  String    Texto en la barra del caption
//  [Aprompt]    String    Texto aclaratorio para elmensaje o petición
//  [Text]  String    Texto del MEmo
//------------------------------------------------------------------------------
//---EJEMPLO--------------------------------------------------------------------
//  procedure TForm1.Button1Click(Sender: TObject);
//  begin
//    DBMEMO1.lines.text:=InputMemo('Comentario con fecha','Comentario');
//  end;
//------------------------------------------------------------------------------
function InputMemo(const ACaption, APrompt: string; Text:String =''): string;
  function GetCharSize(Canvas: TCanvas): TPoint;
  var
    I: Integer;
    Buffer: array[0..51] of Char;
  begin
    for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
    for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
    GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
    Result.X := Result.X div 52;
  end;

var
  Form: TForm;
  Prompt: TLabel;
  MEM: TMemo;
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
  R: TRect;
begin
  Result := '';
  Form  := TForm.Create(Application);
  with Form do
    try
      Canvas.Font := Font;
      DialogUnits := GetCharSize(Canvas);
      BorderStyle := bsDialog;
      FormStyle :=fsStayOnTop;
      Caption    := ACaption;
      ClientWidth := MulDiv(396, DialogUnits.X, 4);
      Position    := poScreenCenter;
      Prompt      := TLabel.Create(Form);
      with Prompt do
      begin
        Parent  := Form;
        Caption  := APrompt;
        Left    := MulDiv(8, DialogUnits.X, 4);
        Top      := MulDiv(8, DialogUnits.Y, 8);
        Constraints.MaxWidth := MulDiv(180, DialogUnits.X, 4);
        WordWrap := True;
      end;
      MEM := TMemo.Create(Form);
      with MEM do
      begin
        Parent := Form;
        Left      := Prompt.Left;
        Top      := Prompt.top+Prompt.Height+5;
        Height    := 150;
        Width    := MulDiv(380, DialogUnits.X, 4);
        Lines.Text := Text;
      end;
      ButtonTop    := MEM.top+MEM.Height+10;;
      ButtonWidth  := MulDiv(50, DialogUnits.X, 4);
      ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
      with TButton.Create(Form) do
      begin
        Parent      := Form;
        Caption    := 'OK';
        ModalResult := mrOk;
        default    := True;
        SetBounds(MulDiv(Prompt.Left-2, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      with TButton.Create(Form) do
      begin
        Parent      := Form;
        Caption    := 'Cancelar';
        ModalResult := mrCancel;
        Cancel      := True;
        SetBounds(MulDiv(340, DialogUnits.X, 4), ButtonTop,ButtonWidth, ButtonHeight);
        Form.ClientHeight := 220;
      end;
      MEM.Lines.Clear;
      MEM.Lines.Add(Text);
      if ShowModal = mrOk then Result:=MEM.Lines.Text
                          else Result:=Text;  //Devuelve el original
    finally
      Form.Free;
    end;
end;[/DELPHI]

Ahora pasamos al desglose de la factura, explicare la función de algunos botones, el resto son iguales a los de siempre
  • 0

#75 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 21 julio 2013 - 04:43

Otra modificación

[DELPHI]procedure TFXPAF.SbNuevoClick(Sender: TObject);
//------------------------------------------------------------------------------
//*******************************************[ Creamos un nuevo registro ]******
//------------------------------------------------------------------------------

begin
  ...
  Memo2.Lines.Clear;
  DBNSerie.SetFocus;
end;[/DELPHI]
  • 0

#76 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 21 julio 2013 - 04:45

y otra

[DELPHI]procedure TFXPAF.SBEscribirNotaClick(Sender: TObject);
//------------------------------------------------------------------------------
//******************************************************************[ Nota ]****
//------------------------------------------------------------------------------
var VarSText:string;
begin
  VarSText:=Memo2.Lines.Text;
  Memo2.Lines.Text:=InputMemo('Nota','Escriba su nota',VarSText);
end;[/DELPHI]
  • 0

#77 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 21 julio 2013 - 06:13

más y más modificaciones

[DELPHI]procedure TFXPAF.DBNCodigoClienteChange(Sender: TObject);
// ------------------------------------------------------------------------------
// ********************************************************[ Change Cod Cli ]****
// Para posicionar en el cliente
// ------------------------------------------------------------------------------
begin
  if FXPAF.Active then
  begin
    if DBNCodigoCliente.Text <> '' then
    begin
        ActQuery(IBQClientes, 'Select * from Clientes where Upper(CODIGO)=Upper(' + QuotedStr (DBNCodigoCliente.Text) + ')');
        if not IBQDirecciones.isempty then ActQuery(IBQDirecciones,'SELECT * FROM DIRECCIONES WHERE (DIRECCIONES.MODULO = '+
        QuotedStr ('CLIENTES')+') AND (DIRECCIONES.CODIGO = '+QuotedStr (DBNCodigoCliente.Text)+')');
    end;
  end;
end;[/DELPHI]

[DELPHI]procedure TFXPAF.SbNuevoClick(Sender: TObject);
//------------------------------------------------------------------------------
//*******************************************[ Creamos un nuevo registro ]******
//------------------------------------------------------------------------------
begin
  PC.ActivePageIndex:=1;
  DSPrincipal.DataSet.Insert;
  NSESerie.Value:=1;
  if DM.IBDCONFIUSARSERIEYEAR.Value='S' then
  begin
    NSESerie.Enabled:=False;
  DBNSerie.Field.Value:=Copy(IntToStr(Ano(now)),3,4);
  end else
  begin
    NSESerie.Enabled:=True;
  DBNSerie.Field.Value:=DM.IBDCONFISERIE.AsString;
  end;
  NDBSENumeroProteccionDatos.Field.Value:=1;
  DBNNumeroDocumento.Field.value:=VerNumeroDocumento(VarSTipoDocumento,DBNSerie.Text);
  DSPrincipal.DataSet.FieldByName('PORCENTAJEFINANCIADO').Value:=0;
  DSPrincipal.DataSet.FieldByName('TIPODOCUMENTO').Value:=VarSTipoDocumento;
  Memo2.Lines.Clear;
  DBNSerie.SetFocus;
end;[/DELPHI]
  • 0

#78 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 23 julio 2013 - 01:13

Siguiendo con el tutorial, lo siguiente es

[DELPHI]procedure TFXPAF.SBDireccionesClick(Sender: TObject);
//------------------------------------------------------------------------------
//****************************************************[ Buscar direcciones ]****
//------------------------------------------------------------------------------
begin
  if DBNCodigoCliente.Text<>'' then
  begin
    VarSTabla:='DIRECCIONES';  //Pertenece al formularios  UFbusquedaFP
    VarSNomMod:='XPAFD';  //Desde que modulo lo llamamos
    FbusquedaFP.Show;
  end else ShowMessage('Debe seleccionar primero el código del cliente');
end;[/DELPHI]

y estos son los cambios más significativos hechos en  UFbusquedaFP

[DELPHI]

//------------------------------------------------------------------------------
//****************************************************[ Hace la búsqueda ]******
//------------------------------------------------------------------------------
begin  // Usamos por defecto locate pero lo podemos cambiar por un Query y sus cláusulas
    if comboCampos.Text<>'' then
    begin
      if VarSNomMod='XPAFD' then  //Módulo de documentos (direcciones)
      begin
            if CheckBox1.Checked then ActQuery(IBQBusqueda,'Select * From '+VarSTabla+' WHERE (DIRECCIONES.MODULO = '+ QuotedStr('CLIENTES')+
            ') AND (DIRECCIONES.CODIGO = '+ QuotedStr(FXPAF.DBNCodigoCliente.Text)+
                                                          ') AND (UPPER('+comboCampos.text+ ') LIKE UPPER('+QuotedStr('%'+Edbusqueda.Text+'%')+'))')
                                else ActQuery(IBQBusqueda,'Select * From '+VarSTabla+' WHERE (DIRECCIONES.MODULO = '+ QuotedStr('CLIENTES')+
            ') AND (DIRECCIONES.CODIGO = '+ QuotedStr(FXPAF.DBNCodigoCliente.Text)+
                                                          ') AND (UPPER('+comboCampos.text+') WHERE UPPER('+QuotedStr(Edbusqueda.Text)+'))');
      end else
      begin
      if CheckBox1.Checked then ActQuery(IBQBusqueda,'Select * From '+VarSTabla+' WHERE UPPER('+comboCampos.text+') LIKE UPPER('+QuotedStr('%'+Edbusqueda.Text+'%')+')')
                              else ActQuery(IBQBusqueda,'Select * From '+VarSTabla+' WHERE UPPER('+comboCampos.text+') WHERE UPPER('+QuotedStr(Edbusqueda.Text)+')');
      end;
    end else ShowMessage('Debe seleccionar el campo por el que buscar');
end;


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
  begin
    if (VarSTabla='DIRECCIONES') AND (VarSNomMod='XPAFD') then
    begin
    if VarSTabla='DIRECCIONES' then Caption:='Búsquedas en direcciones';  //Caption del Form
      ActQuery(IBQBusqueda,'Select * From '+VarSTabla+' WHERE (DIRECCIONES.MODULO = '+ QuotedStr('CLIENTES')+
                ') AND (DIRECCIONES.CODIGO = '+ QuotedStr(FXPAF.DBNCodigoCliente.Text)+ ')');
    end else ActQuery(IBQBusqueda,'Select * From '+VarSTabla);
  end;
  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='DIRECCIONES' then
    begin
      CarGarGrid(0,'ID',50,'ID');
      CarGarGrid(1,'CODIGO',130,'Código');
      CarGarGrid(2,'DIRECCION',520,'Dirección');
      CarGarGrid(3,'CP',65,'Dirección');
      CarGarGrid(4,'POBLACION',520,'Población');
      CarGarGrid(5,'PROVINCIA',520,'Provincía');
      CarGarGrid(6,'PAIS',520,'País');
    end;
  end;
end;


procedure TFbusquedaFP.FormClose(Sender: TObject; var Action: TCloseAction);
//------------------------------------------------------------------------------
//****************************************************************[ Cerrar ]****
//------------------------------------------------------------------------------
begin

  ...

  if (VarSNomMod='XPAFD')  and (FXPAF.DsPrincipal.DataSet.State in [dsEdit,dsInsert]) then
  begin
      DM.IBDDocumentosIDDIRECCIONES.AsInteger:=IBQBusqueda.FieldByName('ID').AsInteger; //Ponemos el código elegido
    FXPAF.Show;
  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='DIRECCIONES') AND (VarSNomMod='XPAFD') then
  begin
  if VarSTabla='DIRECCIONES' then Caption:='Búsquedas en direcciones';  //Caption del Form
    ActQuery(IBQBusqueda,'Select * From '+VarSTabla+' WHERE (DIRECCIONES.MODULO = '+ QuotedStr('CLIENTES')+
            ') AND (DIRECCIONES.CODIGO = '+ QuotedStr(FXPAF.DBNCodigoCliente.Text)+ ')');
                        ShowMessage(IBQBusqueda.SQL.Text);
  end;
end;

[/DELPHI]

Como podéis ver al tratarse de una tabla auxiliar que va vinculada a los módulos y el código, el tratamiento es un poco diferente.
  • 0

#79 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 23 julio 2013 - 01:28

Como va quedando el botón nuevo documento

[DELPHI]procedure TFXPAF.SbNuevoClick(Sender: TObject);
//------------------------------------------------------------------------------
//*******************************************[ Creamos un nuevo registro ]******
//------------------------------------------------------------------------------
begin
  PC.ActivePageIndex:=1;
  DSPrincipal.DataSet.Insert;
  NSESerie.Value:=1;
  if DM.IBDCONFIUSARSERIEYEAR.Value='S' then
  begin
    NSESerie.Enabled:=False;
  DBNSerie.Field.Value:=Copy(IntToStr(Ano(now)),3,4);
  end else
  begin
    NSESerie.Enabled:=True;
  DBNSerie.Field.Value:=DM.IBDCONFISERIE.AsString;
  end;
  NDBSENumeroProteccionDatos.Field.Value:=1;
  DBNNumeroDocumento.Field.value:=VerNumeroDocumento(VarSTipoDocumento,DBNSerie.Text);
  //Campos que no pueden quedar nulos
  DSPrincipal.DataSet.FieldByName('PORCENTAJEFINANCIADO').Value:=0;
  DSPrincipal.DataSet.FieldByName('TIPODOCUMENTO').Value:=VarSTipoDocumento;
  DSPrincipal.DataSet.FieldByName('COBRADO').Value:='N';
  DSPrincipal.DataSet.FieldByName('TOTALCOMISIONES').Value:=0;
  DSPrincipal.DataSet.FieldByName('MODIFICACIONES').Value:=0;
  DSPrincipal.DataSet.FieldByName('SUBTOTAL').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALIMPUESTOS').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALIMPUESTO1').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALIMPUESTO2').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALIMPUESTO3').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALIMPUESTO4').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALPESO').Value:=0;
  DSPrincipal.DataSet.FieldByName('TOTALDESCUENTOS').Value:=0;
  Memo2.Lines.Clear;
  DBNSerie.SetFocus;
end;
[/DELPHI]
  • 0

#80 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 23 julio 2013 - 01:47

Bueno empezamos con la botonera de detalles del documento, explicaremos algunos botones, los otros, son iguales a los anteriores

[DELPHI]procedure TFXPAF.SBDetalleNuevoClick(Sender: TObject);
// ------------------------------------------------------------------------------
// *********************************************************[ Nuevo Detalle ]****
// ------------------------------------------------------------------------------
var I, varIPaso:Integer;
begin
  varIPaso:=0;  //Si sigue a 0 grabará y pasará al siguiente
  if DsPrincipal.DataSet.State in [DsInsert] then
  begin { Si esta en insercion, lo salvamos y editamos, para que acepte los cambios posteriores }
    if DM.IBDDocumentosIDDIRECCIONES.IsNull then
    begin
      if IBQDirecciones.IsEmpty then DM.IBDDocumentosIDDIRECCIONES.Value:=0
                                else DM.IBDDocumentosIDDIRECCIONES.Value:=IBQDirecciones.FieldByName('IDDIRECCIONES').Value;
    end;
    DSPrincipal.DataSet.FieldByName('NUMERODOCUMENTO').Value:=DBNNumeroDocumento.Text;
    DSPrincipal.DataSet.FieldByName('SERIE').Value:=DBNSerie.Text;
    if DSPrincipal.DataSet.FieldByName('CODIGOCLIENTE').IsNull then varIPaso:=1;
    if DSPrincipal.DataSet.FieldByName('CODIGOAGENTE').IsNull then varIPaso:=2;
    if DSPrincipal.DataSet.FieldByName('FECHA').IsNull then varIPaso:=3;
    if DSPrincipal.DataSet.FieldByName('FORMADEPAGO').IsNull then varIPaso:=4;
    if DSPrincipal.DataSet.FieldByName('NUMEROPROTECCIONDATOS').IsNull then varIPaso:=5;
    if varIPaso=0 then
    begin
      DsPrincipal.DataSet.Post;
      DsPrincipal.DataSet.Edit;
    end;
  end;
  if varIPaso=0 then
  begin
    DsDetalle.DataSet.Insert;
    FExtPPAF.ListView1.Items.Clear;
    for I := 1 to FExtPPAF.StringGrid1.RowCount - 1 do  FExtPPAF.StringGrid1.Rows[i].Clear;
    FExtPPAF.Show;
    FExtPPAF.DBEdit1.SetFocus;
  end else
  begin
    case varIPaso of
        1:begin
            ShowMessage('Falta por rellenar el código de cliente');
            DBNCodigoCliente.SetFocus;
          end;
        2:begin
            ShowMessage('Falta por rellenar el código de agente/comercial');
            DBNCodigoComercial.SetFocus;
          end;
        3:begin
            ShowMessage('Falta por rellenar la fecha');
            DBNFecha.SetFocus;
          end;
        4:begin
            ShowMessage('Falta por rellenar la forma de pago');
            DBNFormaPago.SetFocus;
          end;
        5:begin
            ShowMessage('Falta por rellenar el número de protección de datos');
            NDBSENumeroProteccionDatos.SetFocus;
          end;
    end;
  end;
end;[/DELPHI]

Se que el código cliente y otros, tienen control de salida, por lo que no permite quedarse vacio, pero puede pasar que el cliente con el ratón salte los pasos y lo coloque en otra posición dejando en blanco o nulos, campos que deben tener datos. Para evitarlo creamos la variable VarIPaso y la iniciamos a 0, si se mantiene a 0 todo va bien, en caso contrario según su valor nos indica donde se encuentra el error.
  • 0




IP.Board spam blocked by CleanTalk.