Friday, 26 February 2016 18:18

Modelo de Datos en TPuy. parte 2

Written by
Rate this item
(0 votes)

dm test1

Continuando el artículo anterior "Modelo de datos en tpuy. Parte 1".

 

En el artículo anterior se construyó un modelo de datos en tpuy, el mismo, es desplegado en pantalla a través del objeto oListBox. Pero, eso es todo lo que hace nuestro pequeño programa.

Al Visualizar el listado (oListBox) y hacer clic sobre algún botón, línea o columna de un registro; se activan bloques de código generados al momento de instanciarse el objeto. A excepción del botón "Salir", el resto solo despliega mensajes como:

  • Acción del Botón "Nuevo".
  • Acción del Botón "Editar".
  • Acción del Botón "Borrar".
  • Acción del Botón "Imprimir".

Los bloques de código correspondientes son: oListBox:bNew, oListBox:bEdit, oListBox:bDel, oListBox:bPrint.  

 

Puede ver cómo estan definidos dentro de la clase tpy_listbox, en el metodo New() 

Al realizar doble clic sobre un registro del listado, igualmente se activa el botón "Editar".

 

Nota importante: El ejemplo ilustrado en este artículo, es totalmente funcional a partir de la versión de tpuy de Marzo de 2016 ó superior.

 

Una vez entendido lo anterior, vamos ahora a realizar algunos cambios al script, agregando algunas líneas al código actual. El objetivo de esta modificación es modificar el contenido de los bloques de código: bEdit y bNew.

Asi entonces, tras definir el objeto oListBox:

   DEFINE LISTBOX oListBox ;
          MODEL   oModel   ;
          TITLE "Listado"  ;
          SIZE 350,400

Agregamos lo siguiente:

   ACTION OF oListBox BUTTON NEW  __Editar( oListBox:oWnd, oListBox, .t. )
   ACTION OF oListBox BUTTON EDIT __Editar( oListBox:oWnd, oListBox, .f. )

Como se puede deducir, se define la acción a realizar para el boton "New" y se indica ejecutar la funcion local __Editar().  Igualmente para el botón "Edit", se ejecutará igualmente la funcion local __Editar() indicando a través del tercer argumento si la acción es crear un registro nuevo o no.

El código equivalente a lo anterior:

   oListBox:bNew  := {|| __Editar( oListBox:oWnd, oListBox, .t. ) }
oListBox:bEdit := {|| __Editar( oListBox:oWnd, oListBox, .f. ) }

 

Ahora, definimos la función __Editar().

FUNCTION __Editar( oParent, oListBox, lAdd, nRow )
   local aTables := {}
   local oABM

   default lAdd := .f.
   default nRow := 0

   oABM := Tpy_ABM2():New( oParent, oListBox, "Edición de Tabla.", , nRow ,,,,,,lAdd )

   if !IsObject( oABM )
      return .f.
   endif

   oABM:lButton := .t. //-- Agregar Botones (Guardar / Cancelar)
   oABM:lBarBtn := .f.

   //-- Luego de Guardar, cerrar la ventana.
   oABM:bPosSave := {|| oABM:lEndSilence:=.t., oABM:oWnd:End()  }

   oABM:Active()

RETURN .t.

 

Nuestro script debe quedar algo como:

dm_test2.xbs

View source
  1.  
  2. #include "tpy_xbs.ch"
  3.  
  4. func dm_test1()
  5.  
  6.    local aStruct
  7.    local aItems
  8.    local oModel
  9.    local oListBox, dFecha := date()
  10.  
  11.  
  12.    aItems := {;
  13.              {"Rafael"  , "Carmona"     ,.t., dFecha-15},;
  14.              {"Federico", "De Maussion" ,.f., dFecha-30},;
  15.              {"Daniel"  , "Garcia"      ,.f., dFecha+12},;
  16.              {"Riztan"  , "Gutierrez"   ,.f., dFecha   } ;
  17.              }
  18.  
  19.    aStruct := {{"Nombre"  , "C" , 20 , 0},;
  20.                {"Apellido", "C" , 20 , 0},;
  21.                {"Estatus" , "L" , 01 , 0},;
  22.                {"Fecha"   , "D" , 10 , 0}}
  23.  
  24.  
  25.    DEFINE MODEL  oModel  ;
  26.           STRUCT aStruct ;
  27.           DATA   aItems
  28.  
  29.  
  30.    DEFINE LISTBOX oListBox ;
  31.           MODEL   oModel   ;
  32.           TITLE "Listado"  ;
  33.           SIZE 350,400
  34.  
  35.  
  36.    ACTION OF oListBox BUTTON NEW  ;
  37.           __Editar( oListBox:oWnd, oListBox, .t./*Nuevo */ )
  38.  
  39.    ACTION OF oListBox BUTTON EDIT ;
  40.           __Editar( oListBox:oWnd, oListBox, .f./*Editar*/ )
  41.  
  42.    oListBox:Active()
  43.  
  44.    oModel:Destroy()
  45.  
  46. return nil
  47.  
  48.  
  49.  
  50. FUNCTION __Editar( oParent, oListBox, lAdd, nRow )
  51.  
  52.    local aTables := {}
  53.    local oABM
  54.  
  55.    default lAdd := .f.
  56.    default nRow := 0
  57.  
  58.    oABM := Tpy_ABM2():New( oParent, oListBox, "Edición de Tabla.", , nRow ,,,,,,lAdd )
  59.  
  60.    if !IsObject( oABM )
  61.       return .f.
  62.    endif
  63.  
  64.    oABM:lButton := .t. //-- Agregar Botones (Guardar / Cancelar)
  65.  
  66.    oABM:lBarBtn := .f.
  67.  
  68.    //-- Luego de Guardar, cerrar la ventana.
  69.    oABM:bPosSave := {|| oABM:lEndSilence:=.t., oABM:oWnd:End() }
  70.  
  71.    oABM:Active()
  72.  
  73. RETURN .t.
  74.  
  75.  
  76.  

 

dm test2

Al ejecutar el script, y luego de hacer clic al botón "Nuevo" ó al botón "Editar"; se va a abrir un formulario de edición. Este formulario se construye a partir de la información que el objeto oListBox contiene, el formulario es una instancia de la clase tpy_abm2. (acerca de la clase tpy_abm2 se dedicará luego otro artículo)

 

Analizamos ahora la funcion __Editar().

   oABM := Tpy_ABM2():New( oParent, oListBox, "Edición de Tabla.", , nRow ,,,,,,lAdd )

 De esta forma se instancia el objeto del tipo formulario donde se visualizan los datos a editar, el mismo incluye un botón "Guardar" y un botón "Cancelar".

Nota: Aún no está creada una sintaxis más simple para la creación de este objeto. Esperamos en una próxima versión ya esté definida para que sea más fácil formular esta instrucción.

 oABM:lButton := .t. //-- Agregar Botones (Guardar / Cancelar)
 oABM:lBarBtn := .f. //-- Indica si usar Barra de Botones

Si se define barra de botones, queda sin efecto la variable lButton.

 

   //-- Luego de Guardar, cerrar la ventana.
   oABM:bPosSave := {|| oABM:lEndSilence:=.t., oABM:oWnd:End()  }

El Bloque de código bPosSave del formulario de edición, se ejecuta luego de actualizar el modelo de datos. Para los efectos del ejemplo, se indican un par de instrucciones dirigidas a cerrar la ventana que contiene al formulario de edición.

 

oABM:Active()

A través de esta instrucción se indica al objeto que ya se hicieron los ajustes necesarios y puede desplegarse en pantalla.

 

 En el próximo artículo, veremos como hacer la edición directamente en la lista de datos. Es decir, en la rejilla o grid.

 

 

Read 3586 times Last modified on Tuesday, 18 April 2017 02:14
Riztan Gutierrez

Desarrollador de Software en xBase. (clipper, [x]Harbour)

Amante del Software Libre!

twitter 16x16 @riztanivan