Diferencia entre revisiones de «TTfvsDBClientFrameMasterClases»

De Pragma Wiki
Ir a la navegación Ir a la búsqueda
Sin resumen de edición
 
(No se muestran 8 ediciones intermedias del mismo usuario)
Línea 3: Línea 3:


Según lo documentado en [[DEV ETIQUETAS/FRAME EDICION]] este frame correspondería a la '''instancia 2'''.
Según lo documentado en [[DEV ETIQUETAS/FRAME EDICION]] este frame correspondería a la '''instancia 2'''.
=[[QUEESESTO/IDENTIDAD|Identidad]]=
[[Category:MANUAL/PROGRAMADOR]]
[[Category:CONTROLES/FRAMES]]
*Ancestro: [[TTfvsDBClientFrame]]
*Carpeta: C:\DevelopPrx\frames
*Archivo: fvsDBClientFrameMasterClases.pas


===Imagen del frame en diseño===
===Imagen del frame en diseño===
Línea 10: Línea 17:
Sus partes son:
Sus partes son:
*'''Panel superior''': normalmente usado con controles de edición en formato de ficha, puede tener hasta dos paneles (el izquierdo y el derecho).
*'''Panel superior''': normalmente usado con controles de edición en formato de ficha, puede tener hasta dos paneles (el izquierdo y el derecho).
*'''Área para detalles''': se crean las pestañas para los detalles de la clase master (si los hubiere).
*'''Área para detalles''': se crean las pestañas para los detalles de la clase master (si los hubiere), el control en este panel es un [https://docwiki.embarcadero.com/Libraries/Alexandria/en/Vcl.ComCtrls.TPageControl TPageControl] que permite agregar esas pestañas.
*'''Panel de comentarios''': normalmente contiene el control de edición de comentarios, pero puede tener otros controles de edición.
*'''Panel de comentarios''': normalmente contiene el control de edición de comentarios, pero puede tener otros controles de edición.
*'''Panel de totales''': normalmente muestra los totales del comprobante.
*'''Panel de totales''': normalmente muestra los totales del comprobante.
Línea 23: Línea 30:


Sus partes son (notar que el panel superior se abre en dos, el izquierdo y el derecho):
Sus partes son (notar que el panel superior se abre en dos, el izquierdo y el derecho):
*'''Panel superior, izquierda''': los comprobantes del sistema tienen casi los mismos datos en este panel, pueden variar según si el comprobante valoriza o no o como en este caso agrega el campo '''Factura Crédito''' pero son todos muy parecidos.
*'''Panel superior, izquierda''': este panel es muy parecido para todos los comprobantes, pueden variar según si el comprobante valoriza o no o como en este caso agrega el campo '''Factura Crédito'''.
*'''Panel superior, derecha''': contiene los datos del proveedor y de la factura presentada
*'''Panel superior, derecha''': contiene los datos del proveedor y de la factura presentada
*'''Detalle de artículos''': contiene una grilla (instancia 1) del detalle de la factura, desde aquí se accede a la instancia 2 de esa misma tabla.
*'''Detalle de artículos''': contiene una grilla (instancia 1) del detalle de la factura, desde aquí se accede a la instancia 2 de esa misma tabla.
Línea 29: Línea 36:
*'''Panel de comentarios''': agrega dos controles de edición al estándar de comentarios.
*'''Panel de comentarios''': agrega dos controles de edición al estándar de comentarios.
*'''Panel de totales''': muestra los totales del comprobante.
*'''Panel de totales''': muestra los totales del comprobante.
[[DEV CLASES/CAMPOS#Panel|Panel]] desarrolla este tema.


===Ubicación de los campos en el frame===
===Ubicación de los campos en el frame===
En [[DEV CLASES/CAMPOS#Panel|Panel]] se describe cómo hacer para ubicar un campo en algún panel en particular.
En [[DEV CLASES/CAMPOS#Panel|Panel]] se describe cómo hacer para ubicar un campo en algún panel en particular.
[[Archivo:20250603 0933 CAMPO FCUENTA.png|miniaturadeimagen|no|Campo FCUENTA en panel '''main'''.]]
[[Archivo:20250603 0933 CAMPO FCUENTA.png|miniaturadeimagen|no|Campo FCUENTA en panel '''main'''.]]
El campo FCUENTA se ubica en panel '''main''' pero como tiene el comando '''BREAK''' se muestra en el panel a derecha.


El campo FCUENTA se ubica en panel '''main''' pero como tiene el comando <pre><BR></pre> se muestra en el panel a derecha.
[[Archivo:20250603 0951 CAMPO FRECUPEROIVA.png|miniaturadeimagen|no|Campo FRECUPEROIVA en el panel comentarios.]]
El campo FRECUPEROIVA se ubica en panel '''comentarios'''.


=Declaración=
=Declaración=
Línea 132: Línea 144:


=Implementación=
=Implementación=
===procedure ClassShow_BuildFrame(Sender: TObject)===
Si algún campo usa el panel '''tab_first''' entonces lo agrega al PageControl.
Verifica si la clase tiene detalles usando un SQL similar a:
<pre>
SELECT
prxclases.Codigo
, prxclases.Descripcion
, prxclases.DetalleCodigo
, prxclases.DetalleVisual
, prxclases.RestriccionCascada
, Instancia = pTAGS_FRAME_VISTA.FINSTANCIA
, Frame = pTAGS_FRAME_VISTA.FFRAME
, FrameS = pTAGS_FRAME_VISTA.FFRAMES
, FrameArgs = pTAGS_FRAME_VISTA.FFRAMEARGS
, prxclases.TS
, Next_FrameInstance = next_instance.FINSTANCIA
, Next_FrameName = next_instance.FFRAME
, Next_SubframeName = next_instance.FFRAMES
, Next_EditMode = prxclases.DetalleVisual
FROM
prxclases
, pTAGS_FRAME_VISTA
LEFT OUTER JOIN pTAGS_FRAME_VISTA next_instance ON
next_instance.FCLASE = pTAGS_FRAME_VISTA.FCLASE
AND next_instance.FINSTANCIA > pTAGS_FRAME_VISTA.FINSTANCIA
WHERE
prxclases.DetalleCodigo = 'FCCAB'
AND prxclases.DetalleVisual = 'detail'
AND prxclases.Abstracta = 0
AND pTAGS_FRAME_VISTA.FCLASE = prxclases.Codigo
AND pTAGS_FRAME_VISTA.FINSTANCIA =
(
SELECT MIN(I.FINSTANCIA) FROM pTAGS_FRAME_VISTA I WHERE
I.FCLASE = pTAGS_FRAME_VISTA.FCLASE
)
AND NOT EXISTS
(
SELECT * FROM pVISIBLES_PERFILV WHERE
pVISIBLES_PERFILV.FCLASE = prxclases.Codigo
AND pVISIBLES_PERFILV.FCAMPO IS NULL
)
ORDER BY
prxclases.TS
, pTAGS_FRAME_VISTA.FINSTANCIA
</pre>
Si tiene detalles los crea en el PageControl.
Si algún campo usa el panel '''tab_last''' entonces lo agrega al PageControl.
Si algún campo usa el panel de comentarios entonces lo hace visible.
Si algún campo usa el panel de totales entonces lo hace visible.
Este procedimiento se asiste con:
*procedure ClassShow_BuildFrame_ArmaTab_Especial(aTabName: String) arma las pestañas en el PageControl.
*procedure ClassShow_BuildFrame_PanelesAlPie(aPanelName: String; aScrollBox: TprxScrollBox) arma los paneles al pie.


=[[QUEESESTO/IDENTIDAD|Identidad]]=
===procedure OnExecute_INSERT_Master(Sender: TObject)===
[[Category:MANUAL/PROGRAMADOR]]
Recibe el OnClick de inserción del master, si el panel de la cabecera es de tipo [[TTfvsDBClientFrame]] ejecuta su función OnExecute_INSERT.
[[Category:CONTROLES/FRAMES]]
 
*Ancestro: [[TTfvsDBClientFrame]]
===procedure OnExecute_EDIT_Master(Sender: TObject)===
*Carpeta: C:\DevelopPrx\frames
Recibe el OnClick de edición del master:
*Archivo: fvsDBClientFrameMasterClases.pas
*Si el panel de la cabecera es de tipo [[TTfvsDBClientFrameCmpCabecera]] ejecuta su función OnExecute_EDIT, este panel identifica a un comprobante.
*Si es de tipo [[TTfvsDBClientFrame]] ejecuta su función OnExecute_EDIT, este panel identifica a clases distintas a comprobantes.
 
===procedure OnExecute_POST_Master(Sender: TObject)===
Cuando el panel de la cabecera (PanelCABECERA_ClassShow_Frame) es de tipo:
*[[TTfvsDBClientFrameCmpCabecera]] (es un comprobante) ejecuta su función OnExecute_POST.
*[[TTfvsDBClientFrame]] (no es un comprobante) ejecuta su función OnExecute_POST.
 
Luego llama al '''DataSet.PostXtd''' para guardar los cambios al dataset y solo si se trata del master llama a '''UpdateBatchXtd''' para guardar la transacción.
 
===procedure OnExecute_CANCEL_Master(Sender: TObject)===
Cancela la operación corriente (inserción o edición), si el panel es de tipo [[TTfvsDBClientFrame]] llama a su función OnExecute_CANCEL.
 
===procedure OnExecute_DELETE_Master(Sender: TObject)===
Intenta eliminar el registro según el tipo de panel superior:
*Si es [[TTfvsDBClientFrameCmpCabecera]] llama a su función OnExecute_DELETE.
*Si es [[TTfvsDBClientFrame]] llama a su función OnExecute_DELETE.
 
===procedure OnExecute_INSERT_Detail(Sender: TObject)===
Recibe el OnClick para insertar un detalle, llama al OnExecute_INSERT del frame que lo contiene.
 
===procedure OnExecute_EDIT_Detail(Sender: TObject)===
Recibe el OnClick para editar un detalle, llama al OnExecute_EDIT del frame que lo contiene.
 
===procedure OnExecute_POST_Detail(Sender: TObject)===
Recibe el OnClick para eliminar un detalle, llama al OnExecute_DELETE del frame que lo contiene.
 
===function OnExecute_Detail_Select_Frame(var aFrame: TTfvsDBClientFrame): Boolean===
Retorna el frame que contiene al dataset dentro de las pestañas del PageControl. Usa la propiedad ActivePageIndex del PageControlpara saber qué pestaña activa y luego dentro de sus componentes busca uno que sea de tipo [[TTfvsDBClientFrameGridClases]] (ya que los detalles normalmente se presentan en una grilla).
 
=Uso=
Este frame es usado por todas las clases definidas en [[:Category:DEV CLASES|Clases]].

Revisión actual - 16:13 3 jun 2025

Descripción

El frame TTfvsDBClientFrameMasterClases (Implementa ficha de clases) implementa un frame para editar las clases que hemos definido en Clases. Este frame va a crear lo necesario para editar el registro solicitado, y si esa clase tiene detalles va a crearlos también.

Según lo documentado en DEV ETIQUETAS/FRAME EDICION este frame correspondería a la instancia 2.

Identidad

  • Ancestro: TTfvsDBClientFrame
  • Carpeta: C:\DevelopPrx\frames
  • Archivo: fvsDBClientFrameMasterClases.pas

Imagen del frame en diseño

En diseño el frame se ve de la siguiente manera:

Frame en diseño.

Sus partes son:

  • Panel superior: normalmente usado con controles de edición en formato de ficha, puede tener hasta dos paneles (el izquierdo y el derecho).
  • Área para detalles: se crean las pestañas para los detalles de la clase master (si los hubiere), el control en este panel es un TPageControl que permite agregar esas pestañas.
  • Panel de comentarios: normalmente contiene el control de edición de comentarios, pero puede tener otros controles de edición.
  • Panel de totales: normalmente muestra los totales del comprobante.

Finalmente, abajo a derecha están los botones de aplicar y de cancelar.

El botón Button1 debe ignorarse, se usó para una prueba y no fue eliminado, no es visible en runtime.

Imagen del frame en runtime

En runtime se ve de la siguiente manera (el ejemplo es de una factura de compras de la BD pCatalogo):

Frame en runtime.

Sus partes son (notar que el panel superior se abre en dos, el izquierdo y el derecho):

  • Panel superior, izquierda: este panel es muy parecido para todos los comprobantes, pueden variar según si el comprobante valoriza o no o como en este caso agrega el campo Factura Crédito.
  • Panel superior, derecha: contiene los datos del proveedor y de la factura presentada
  • Detalle de artículos: contiene una grilla (instancia 1) del detalle de la factura, desde aquí se accede a la instancia 2 de esa misma tabla.
  • Otros datos en otra pestaña: agrega otra pestaña para guardar otros datos.
  • Panel de comentarios: agrega dos controles de edición al estándar de comentarios.
  • Panel de totales: muestra los totales del comprobante.

Panel desarrolla este tema.

Ubicación de los campos en el frame

En Panel se describe cómo hacer para ubicar un campo en algún panel en particular.

Campo FCUENTA en panel main.

El campo FCUENTA se ubica en panel main pero como tiene el comando BREAK se muestra en el panel a derecha.

Campo FRECUPEROIVA en el panel comentarios.

El campo FRECUPEROIVA se ubica en panel comentarios.

Declaración

const
  TTAplicarText = 'Aplicar';
  TTCancelarText = 'Cancelar';

type
  TTfvsDBClientFrameMasterClases = class(TTfvsDBClientFrame)
    PanelBASE: TPanel;
    PanelCABECERA: TPanel;
    PanelPIE: TPanel;
    SplitterCENTRAL: TSplitter;
    PopupMenu1: TPopupMenu;
    PanelCENTRAL: TPanel;
    SplitterPIE: TSplitter;
    PageControlDETALLES: TPageControl;
    PanelBOTONES_PIE: TPanel;
    ButtonAPLICAR: TButton;
    ButtonCANCELAR: TButton;
    StatusBar1: TStatusBar;
    PanelPIE_Comentarios: TPanel;
    Splitter_PanelPIE_Vertical: TSplitter;
    PanelPIE_Totales: TPanel;
    Panel5: TPanel;
    Panel1: TPanel;
    prxScrollBox_Comentarios: TprxScrollBox;
    prxScrollBox_Totales: TprxScrollBox;
    Button1: TButton;
    Action_INSERT_Master: TAction;
    Action_EDIT_Master: TAction;
    Action_POST_Master: TAction;
    Action_CANCEL_Master: TAction;
    Action_DELETE_Master: TAction;
    Action_INSERT_Detail: TAction;
    Action_EDIT_Detail: TAction;
    Action_POST_Detail: TAction;
    Action_CANCEL_Detail: TAction;
    Action_DELETE_Detail: TAction;
    Label_wflFIRMASX: TLabel;
    procedure prxADODataSetEdit1ppOnShowFieldHint(Sender: TprxADODataSet; aCampo, aAtributo: String; aEnteros, aDecimales: Integer; aRequerido: Boolean; aIndicaciones: String; aConstraint: String);
    procedure Button1Click(Sender: TObject);
    procedure PageControlDETALLESChange(Sender: TObject);
    procedure OnExecute_INSERT_Master(Sender: TObject);
    procedure OnExecute_EDIT_Master(Sender: TObject);
    procedure OnExecute_POST_Master(Sender: TObject);
    procedure OnExecute_CANCEL_Master(Sender: TObject);
    procedure OnExecute_DELETE_Master(Sender: TObject);
    procedure OnExecute_REFRESH_Master(Sender: TObject);
    procedure OnExecute_INSERT_Detail(Sender: TObject);
    procedure OnExecute_EDIT_Detail(Sender: TObject);
    procedure OnExecute_DELETE_Detail(Sender: TObject);
    procedure OnExecute_POST_Detail(Sender: TObject);
  private
    FUsaPanelCENTRAL: Boolean;
    FUsaPanelPIE: Boolean;
    FUsaPanelPIE_Totales: Boolean;

    FPanelCABECERA_ClassShow_Frame: TTfvsFrame;
  protected
    procedure   SetDataSet(aValue: TprxADODataSetEdit); override;
    procedure   FieldMessage(var Message: TprxADODataSetMessage); message MSG_PRXADODATASETMESSAGE;

    procedure   UsaPanelCENTRALSet(aValue: Boolean);
    function    UsaPanelCENTRALGet: Boolean;

    procedure   UsaPanelPIESet(aValue: Boolean);
    function    UsaPanelPIEGet: Boolean;

    procedure   UsaPanelPIE_Totales_Set(aValue: Boolean);
    function    UsaPanelPIE_Totales_Get: Boolean;

    procedure   ClassShow_BuildFrame_ArmaTab_Especial(aTabName: String);

    procedure   ClassShow_BuildFrame_PanelesAlPie(aPanelName: String; aScrollBox: TprxScrollBox);

    function    OnExecute_Detail_Select_Frame(var aFrame: TTfvsDBClientFrame): Boolean;

    property    UsaPanelCENTRAL: Boolean read UsaPanelCENTRALGet write UsaPanelCENTRALSet;
    property    UsaPanelPIE: Boolean read UsaPanelPIEGet write UsaPanelPIESet;
    property    UsaPanelPIE_Totales: Boolean read UsaPanelPIE_Totales_Get write UsaPanelPIE_Totales_Set;

    property    PanelCABECERA_ClassShow_Frame: TTfvsFrame read FPanelCABECERA_ClassShow_Frame write FPanelCABECERA_ClassShow_Frame;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure   OnFrameShow(Sender: TObject); override;

    procedure   ClassShow_BuildFrame(Sender: TObject); override;
    function    ClassShow_AgregarTablaMaster(aTabla: String): Boolean; override;
    function    ClassShow_AgregarControles: Boolean; override;
    function    ClassShow_Activate(aActivateDataSet: Boolean): Boolean; override;
    procedure   ClassShow_CloseFrame(Sender: TObject); override;
  end;

Implementación

procedure ClassShow_BuildFrame(Sender: TObject)

Si algún campo usa el panel tab_first entonces lo agrega al PageControl.

Verifica si la clase tiene detalles usando un SQL similar a:

SELECT
prxclases.Codigo
, prxclases.Descripcion
, prxclases.DetalleCodigo
, prxclases.DetalleVisual
, prxclases.RestriccionCascada
, Instancia = pTAGS_FRAME_VISTA.FINSTANCIA
, Frame = pTAGS_FRAME_VISTA.FFRAME
, FrameS = pTAGS_FRAME_VISTA.FFRAMES
, FrameArgs = pTAGS_FRAME_VISTA.FFRAMEARGS
, prxclases.TS
, Next_FrameInstance = next_instance.FINSTANCIA
, Next_FrameName = next_instance.FFRAME
, Next_SubframeName = next_instance.FFRAMES
, Next_EditMode = prxclases.DetalleVisual
FROM
prxclases
, pTAGS_FRAME_VISTA
LEFT OUTER JOIN pTAGS_FRAME_VISTA next_instance ON
next_instance.FCLASE = pTAGS_FRAME_VISTA.FCLASE
AND next_instance.FINSTANCIA > pTAGS_FRAME_VISTA.FINSTANCIA
WHERE
prxclases.DetalleCodigo = 'FCCAB'
AND prxclases.DetalleVisual = 'detail'
AND prxclases.Abstracta = 0
AND pTAGS_FRAME_VISTA.FCLASE = prxclases.Codigo
AND pTAGS_FRAME_VISTA.FINSTANCIA =
(
SELECT MIN(I.FINSTANCIA) FROM pTAGS_FRAME_VISTA I WHERE
I.FCLASE = pTAGS_FRAME_VISTA.FCLASE
)
AND NOT EXISTS
(
SELECT * FROM pVISIBLES_PERFILV WHERE
pVISIBLES_PERFILV.FCLASE = prxclases.Codigo
AND pVISIBLES_PERFILV.FCAMPO IS NULL
)
ORDER BY
prxclases.TS
, pTAGS_FRAME_VISTA.FINSTANCIA

Si tiene detalles los crea en el PageControl.

Si algún campo usa el panel tab_last entonces lo agrega al PageControl.

Si algún campo usa el panel de comentarios entonces lo hace visible.

Si algún campo usa el panel de totales entonces lo hace visible.

Este procedimiento se asiste con:

  • procedure ClassShow_BuildFrame_ArmaTab_Especial(aTabName: String) arma las pestañas en el PageControl.
  • procedure ClassShow_BuildFrame_PanelesAlPie(aPanelName: String; aScrollBox: TprxScrollBox) arma los paneles al pie.

procedure OnExecute_INSERT_Master(Sender: TObject)

Recibe el OnClick de inserción del master, si el panel de la cabecera es de tipo TTfvsDBClientFrame ejecuta su función OnExecute_INSERT.

procedure OnExecute_EDIT_Master(Sender: TObject)

Recibe el OnClick de edición del master:

  • Si el panel de la cabecera es de tipo TTfvsDBClientFrameCmpCabecera ejecuta su función OnExecute_EDIT, este panel identifica a un comprobante.
  • Si es de tipo TTfvsDBClientFrame ejecuta su función OnExecute_EDIT, este panel identifica a clases distintas a comprobantes.

procedure OnExecute_POST_Master(Sender: TObject)

Cuando el panel de la cabecera (PanelCABECERA_ClassShow_Frame) es de tipo:

Luego llama al DataSet.PostXtd para guardar los cambios al dataset y solo si se trata del master llama a UpdateBatchXtd para guardar la transacción.

procedure OnExecute_CANCEL_Master(Sender: TObject)

Cancela la operación corriente (inserción o edición), si el panel es de tipo TTfvsDBClientFrame llama a su función OnExecute_CANCEL.

procedure OnExecute_DELETE_Master(Sender: TObject)

Intenta eliminar el registro según el tipo de panel superior:

procedure OnExecute_INSERT_Detail(Sender: TObject)

Recibe el OnClick para insertar un detalle, llama al OnExecute_INSERT del frame que lo contiene.

procedure OnExecute_EDIT_Detail(Sender: TObject)

Recibe el OnClick para editar un detalle, llama al OnExecute_EDIT del frame que lo contiene.

procedure OnExecute_POST_Detail(Sender: TObject)

Recibe el OnClick para eliminar un detalle, llama al OnExecute_DELETE del frame que lo contiene.

function OnExecute_Detail_Select_Frame(var aFrame: TTfvsDBClientFrame): Boolean

Retorna el frame que contiene al dataset dentro de las pestañas del PageControl. Usa la propiedad ActivePageIndex del PageControlpara saber qué pestaña activa y luego dentro de sus componentes busca uno que sea de tipo TTfvsDBClientFrameGridClases (ya que los detalles normalmente se presentan en una grilla).

Uso

Este frame es usado por todas las clases definidas en Clases.