Diferencia entre revisiones de «TTfvsDBClientFrameCmpCabecera»

De Pragma Wiki
Ir a la navegación Ir a la búsqueda
(Página creada con «=Descripción= El frame '''TTfvsDBClientFrameCmpCabecera''' (Implementa cabecera de comprobantes) implementa el panel superior usado por todos los comprobantes. Contiene los controles de edición necesarios para todos los comprobantes. =Identidad= Category:MANUAL/PROGRAMADOR Category:CONTROLES/FRAMES *Ancestro: TTfvsDBClientFrameScrollBox *Carpeta: C:\DevelopPrx\frames *Archivo: fvsDBClientFrameCmpCabecera.pas =Ejemplo de definici…»)
 
Sin resumen de edición
 
(No se muestran 4 ediciones intermedias del mismo usuario)
Línea 11: Línea 11:
=Ejemplo de definición=
=Ejemplo de definición=
===Frame en diseño===
===Frame en diseño===
En diseño el frame se ve así, los controles se acomodan durante la ejecución de la aplicación:
[[Archivo:20250603 1516 FRAME CMPCABECERA DISEÑO.png|miniaturadeimagen|no|Frame para comprobantes en diseño.]]
[[Archivo:20250603 1516 FRAME CMPCABECERA DISEÑO.png|miniaturadeimagen|no|Frame para comprobantes en diseño.]]
Define los campos para:
Define los campos para:
*Código de comprobante.
*Código de comprobante.
*Tipo según {{COMPROBANTES/TIPOS]].
*Tipo según [[COMPROBANTES/TIPOS]].
*Punto de emisión según [[COMPROBANTES/PUNTOSEMISION]].
*Punto de emisión según [[COMPROBANTES/PUNTOSEMISION]].
*Fecha de emisión.
*Fecha de emisión.
Línea 20: Línea 21:
*Estado (ver [[:Category:COMPROBANTES#Estados de un comprobante|Estados de un comprobante).
*Estado (ver [[:Category:COMPROBANTES#Estados de un comprobante|Estados de un comprobante).


===Frame en runtime===
Al ejecutarse, el frame adquiere otro aspecto como se ve en la cabecera de órdenes de compra:
[[Archivo:20250603 1526 FRAME CMPCABECERA RUNTIME.png|miniaturadeimagen|no|Frame para comprobantes en runtime.]]


En el recuadro vemos los campos según el diseño, en el panel a la derecha podemos ver los campos que la orden de compra agrega. separando ambos paneles está el splitter.


===Definición del frame===
No es necesario definir este frame durante el diseño de las clases ya que es la opción por defecto para todas las clases derivadas de:
*cmpCABECERA_pragma_XTD.
*cmpCABECERA.
Ver [[TprxCmpCABECERA]].
=Declaración=
<pre>
type
  TTfvsDBClientFrameCmpCabecera = class(TTfvsDBClientFrameScrollBox)
    Panel_cmpCodigo: TPanel;
    Panel_cmpTipo: TPanel;
    Panel_cmpPuntoEmision: TPanel;
    Panel_cmpFecha: TPanel;
    Panel_cmpValuacion: TPanel;
    Panel_cmpEstado: TPanel;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    StaticText5: TStaticText;
    StaticText6: TStaticText;
    prxDBEdit_cmpCodigo: TprxDBEdit;
    prxDBEdit_cmpTipo: TprxDBEdit;
    prxDBEditcmpTipo_Descripcion: TprxDBEdit;
    prxDBEdit_cmpPuntoEmision: TprxDBEdit;
    prxDBEdit_cmpPuntoEmision_Descripcion: TprxDBEdit;
    prxDBEdit_cmpFecha: TprxDBEditDateTime;
    prxDBEdit_cmpMoneda: TprxDBEdit;
    prxDBEdit_cmpFechaValuacion: TprxDBEditDateTime;
    prxDBEdit_cmpCotizacion: TprxDBEdit;
    prxDBEdit_cmpUsuario: TprxDBEdit;
    Panel5: TPanel;
    prxSpeedButton_cmpFechaValuacion: TprxSpeedButton;
    prxSpeedButton_cmpTipo: TprxSpeedButton;
    prxSpeedButton_cmpPuntoEmision: TprxSpeedButton;
    prxSpeedButton_cmpFecha: TprxSpeedButton;
    prxDBEdit_cmpEstado: TprxDBEdit;
    procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean);
    procedure SpeedButton_cmppFecha_GetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu);
    procedure prxSpeedButton_cmpTipoClick(Sender: TObject);
    procedure prxSpeedButton_cmpPuntoEmisionClick(Sender: TObject);
    procedure prxSpeedButton_cmpFechaClick(Sender: TObject);
  private
    FComprobanteTipo: TTfvsDBClientFrameCmpCabecera_Tipo;
  protected
    procedure  SetDataSet(aValue: TprxADODataSetEdit); override;
    property    ComprobanteTipo: TTfvsDBClientFrameCmpCabecera_Tipo read FComprobanteTipo write FComprobanteTipo;
  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;
    procedure  OnExecute_INSERT(var aHandled: Boolean); override;
    procedure  OnExecute_EDIT(var aHandled: Boolean); override;
    procedure  OnExecute_POST(var aHandled: Boolean); override;
    procedure  OnExecute_CANCEL(var aHandled: Boolean); override;
    procedure  OnExecute_DELETE(var aHandled: Boolean); override;
    procedure  OnExecute_REFRESH(var aHandled: Boolean); override;
  end;
</pre>
=Implementación=
===procedure SetDataSet(aValue: TprxADODataSetEdit)===
Asocia el dataset a los controles del frame.
===procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean)===
Recibe los clicks del navegador:
*nbEdit es la edición y llama a OnExecute_EDIT.
*nbPost es el posteo de los cambios al dataset, llama a OnExecute_POST.
*nbDelete es la eliminación de un registro, llama a OnExecute_DELETE.


*'''Navegador''' permite navegar entre los registros del dataset, cambiar el estado (inserción, edición, etc) y se activará según el dataset. Está contenido dentro de un panel horizontal que ocupa todo el ancho del frame.
===function ClassShow_AgregarControles: Boolean===
*'''TScrollbox izquierdo''' es el panel visible por defecto, al panel se le agregan controles de edición. Si éstos ocuparan más que la altura del panel aparecerán barras de desplazamiento (scroll bars).
Ajusta los controles al tamaño y posición del frame.
*'''TScrollbox derecho''' por defecto no está visible, pero si alguno de los campos contiene el prefijo '''BREAK''' en su definición entonces este panel se hace visible y contendrá los siguientes campos. Del mismo modo que el panel a izquierda, si los controles agregados superaran la altura del panel aparecerán barras de desplazamiento.
*'''Splitter''' divide ambos paneles y permite correrlo hacia la izquierda o derecha para cambiar el ancho de los paneles.


Ver [[DEV CLASES/CAMPOS#Panel|Panel]] para mayores detalles sobre el posicionamiento de un control en un frame.
===function ClassShow_Activate(aActivateDataSet: Boolean): Boolean===
Al activarse el frame verifica si debe insertar o editar conj:
<pre>
if ClassShow.DataSetState = dsInsert then
  begin
  // Si hay que ponerlo en inserción...


===Frame con un solo panel===
  if DataSet.CanInsertXtd then
Este frame corresponde a la tabla de [[ARTICULOS]] y tiene un solo panel.
      DataSet.InsertXtd(Self);
[[Archivo:20250603 1437 SCROLLBOX FRAME UN PANEL.png|miniaturadeimagen|no|Frame con un solo panel.]]
  end
else
if ClassShow.DataSetState = dsEdit then
  begin
  // Si hay que ponerlo en edición...


===Frame con dos paneles===
  if DataSet.RecordCount > 0 then
Para ver el mismo frame con dos paneles primero tenemos que agregar el atributo '''BREAK''' al campo selección:
      begin
[[Archivo:20250603 1441 SCROLLBOX FRAME AGREGAR BREAK.png|miniaturadeimagen|no|Agregar el atributo BREAK al grupo.]]
      if DataSet.CanEditXtd then
        DataSet.EditXtd(Self)
      end;
  end;
</pre>


Ahora vemos la misma pantalla, pero con los dos paneles y el splitter separando ambos (se nota el cursor indicando el separador justo entre ambos paneles):
===procedure OnExecute_EDIT(var aHandled: Boolean)===
[[Archivo:20250603 1443 SCROLLBOX FRAME DOS PANELES.png|miniaturadeimagen|no|Frame con dos paneles.]]
Al picar el botón de editar en el navegadro verifica si el comprobante puede ser editado:
*Se encuentra en estado abierto.
*Puede ser reabierto por el usuario.


El comando '''BREAK''' abre el panel a derecha, solo lo hace una vez por lo que si más de un campo tiene el comando el panel se abre solo con el primero.
===procedure OnExecute_POST(var aHandled: Boolean)===
Guarda los cambios al comprobante, abre el form donde podemos elegir en qué estado se graba el comprobante.


=Uso=
===Definición del frame===
===Definición del frame===
No es necesario definir este frame durante el diseño de las clases ya que es la opción por defecto.
El frame se usa para todas las clases derivadas de:
*cmpCABECERA_pragma_XTD.
*cmpCABECERA.
Ver [[TprxCmpCABECERA]].

Revisión actual - 20:39 3 jun 2025

Descripción

El frame TTfvsDBClientFrameCmpCabecera (Implementa cabecera de comprobantes) implementa el panel superior usado por todos los comprobantes. Contiene los controles de edición necesarios para todos los comprobantes.

Identidad

Ejemplo de definición

Frame en diseño

En diseño el frame se ve así, los controles se acomodan durante la ejecución de la aplicación:

Frame para comprobantes en diseño.

Define los campos para:

  • Código de comprobante.
  • Tipo según COMPROBANTES/TIPOS.
  • Punto de emisión según COMPROBANTES/PUNTOSEMISION.
  • Fecha de emisión.
  • Datos de valuación: moneda, fecha de valuación y cotización.
  • Estado (ver [[:Category:COMPROBANTES#Estados de un comprobante|Estados de un comprobante).

Frame en runtime

Al ejecutarse, el frame adquiere otro aspecto como se ve en la cabecera de órdenes de compra:

Frame para comprobantes en runtime.

En el recuadro vemos los campos según el diseño, en el panel a la derecha podemos ver los campos que la orden de compra agrega. separando ambos paneles está el splitter.

Definición del frame

No es necesario definir este frame durante el diseño de las clases ya que es la opción por defecto para todas las clases derivadas de:

  • cmpCABECERA_pragma_XTD.
  • cmpCABECERA.

Ver TprxCmpCABECERA.

Declaración

type
  TTfvsDBClientFrameCmpCabecera = class(TTfvsDBClientFrameScrollBox)
    Panel_cmpCodigo: TPanel;
    Panel_cmpTipo: TPanel;
    Panel_cmpPuntoEmision: TPanel;
    Panel_cmpFecha: TPanel;
    Panel_cmpValuacion: TPanel;
    Panel_cmpEstado: TPanel;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    StaticText5: TStaticText;
    StaticText6: TStaticText;
    prxDBEdit_cmpCodigo: TprxDBEdit;
    prxDBEdit_cmpTipo: TprxDBEdit;
    prxDBEditcmpTipo_Descripcion: TprxDBEdit;
    prxDBEdit_cmpPuntoEmision: TprxDBEdit;
    prxDBEdit_cmpPuntoEmision_Descripcion: TprxDBEdit;
    prxDBEdit_cmpFecha: TprxDBEditDateTime;
    prxDBEdit_cmpMoneda: TprxDBEdit;
    prxDBEdit_cmpFechaValuacion: TprxDBEditDateTime;
    prxDBEdit_cmpCotizacion: TprxDBEdit;
    prxDBEdit_cmpUsuario: TprxDBEdit;
    Panel5: TPanel;
    prxSpeedButton_cmpFechaValuacion: TprxSpeedButton;
    prxSpeedButton_cmpTipo: TprxSpeedButton;
    prxSpeedButton_cmpPuntoEmision: TprxSpeedButton;
    prxSpeedButton_cmpFecha: TprxSpeedButton;
    prxDBEdit_cmpEstado: TprxDBEdit;
    procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean);
    procedure SpeedButton_cmppFecha_GetPopupOptions(Sender: TComponent; aPopupMenu: TprxPopupMenu);
    procedure prxSpeedButton_cmpTipoClick(Sender: TObject);
    procedure prxSpeedButton_cmpPuntoEmisionClick(Sender: TObject);
    procedure prxSpeedButton_cmpFechaClick(Sender: TObject);
  private
    FComprobanteTipo: TTfvsDBClientFrameCmpCabecera_Tipo;
  protected
    procedure   SetDataSet(aValue: TprxADODataSetEdit); override;

    property    ComprobanteTipo: TTfvsDBClientFrameCmpCabecera_Tipo read FComprobanteTipo write FComprobanteTipo;
  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;

    procedure   OnExecute_INSERT(var aHandled: Boolean); override;
    procedure   OnExecute_EDIT(var aHandled: Boolean); override;
    procedure   OnExecute_POST(var aHandled: Boolean); override;
    procedure   OnExecute_CANCEL(var aHandled: Boolean); override;
    procedure   OnExecute_DELETE(var aHandled: Boolean); override;
    procedure   OnExecute_REFRESH(var aHandled: Boolean); override;
  end;

Implementación

procedure SetDataSet(aValue: TprxADODataSetEdit)

Asocia el dataset a los controles del frame.

procedure DBNavigator1NavigatorClick(Sender: TDBNavigator; aButton: TNavigateBtn; aX, aY: Integer; var aHandled: Boolean)

Recibe los clicks del navegador:

  • nbEdit es la edición y llama a OnExecute_EDIT.
  • nbPost es el posteo de los cambios al dataset, llama a OnExecute_POST.
  • nbDelete es la eliminación de un registro, llama a OnExecute_DELETE.

function ClassShow_AgregarControles: Boolean

Ajusta los controles al tamaño y posición del frame.

function ClassShow_Activate(aActivateDataSet: Boolean): Boolean

Al activarse el frame verifica si debe insertar o editar conj:

if ClassShow.DataSetState = dsInsert then
   begin
   // Si hay que ponerlo en inserción...

   if DataSet.CanInsertXtd then
      DataSet.InsertXtd(Self);
   end
else
if ClassShow.DataSetState = dsEdit then
   begin
   // Si hay que ponerlo en edición...

   if DataSet.RecordCount > 0 then
      begin
      if DataSet.CanEditXtd then
         DataSet.EditXtd(Self)
      end;
   end;

procedure OnExecute_EDIT(var aHandled: Boolean)

Al picar el botón de editar en el navegadro verifica si el comprobante puede ser editado:

  • Se encuentra en estado abierto.
  • Puede ser reabierto por el usuario.

procedure OnExecute_POST(var aHandled: Boolean)

Guarda los cambios al comprobante, abre el form donde podemos elegir en qué estado se graba el comprobante.

Uso

Definición del frame

El frame se usa para todas las clases derivadas de:

  • cmpCABECERA_pragma_XTD.
  • cmpCABECERA.

Ver TprxCmpCABECERA.