Diferencia entre revisiones de «TTfvsDBClientFrameMasterClases»
Sin resumen de edición |
|||
(No se muestran 13 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 9: | Línea 16: | ||
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. | ||
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 | 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=== | ===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): | |||
[[Archivo:20250603 0924 MASTER CLASES RUNTIME.png|miniaturadeimagen|no|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. | |||
[[DEV CLASES/CAMPOS#Panel|Panel]] desarrolla este tema. | |||
===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. | |||
[[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. | |||
[[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 118: | 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. | |||
===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: | |||
*[[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:

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):

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.

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

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:
- 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 Clases.