Diferencia entre revisiones de «TTfvsDBClientFrameMasterClases»
Línea 138: | Línea 138: | ||
=Implementación= | =Implementación= | ||
===procedure ClassShow_BuildFrame(Sender: TObject)=== | ===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. | |||
=[[QUEESESTO/IDENTIDAD|Identidad]]= | =[[QUEESESTO/IDENTIDAD|Identidad]]= |
Revisión del 15:22 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.
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.
Identidad
- Ancestro: TTfvsDBClientFrame
- Carpeta: C:\DevelopPrx\frames
- Archivo: fvsDBClientFrameMasterClases.pas