13 de junio de 2017

El entorno de datos en las clases.

No se si les pasó a ustedes el tener que repetir una y otra vez el alta de las mismas tablas en el entorno de datos para similares ABM de datos, al crear un form de datos fijos repetitivos como clientes, proveedores, localidades, etc.

Si hacia una clase para cada una de estas tablas para luego crear el form de nuestro cliente derivado de la clase escrita, siempre me faltaba algo. Trabajar en los campos. (agregarlos en el form, o editar su ControlSource) y crear el entorno de datos en el formulario.

Todos los proveedores tienen campos similares, nombre, domicilio, etc. Y todas esas tablas se llaman igual. ¿Por qué no crear entonces un entorno de datos en la clase?

Lo que consideré al hacer esto fue:

  • Tablas similares deben usarse con un mismo nombre (aunque pertenezcan a bases de datos distintas) Ej. articulos.dbf, rubros.dbf, etc.
  • Estas tablas tienen siempre similares estructuras. (en algunos casos se agregan o quitan campos)
  • Ubicaciones en directorios diferentes y nombre de bases de datos diferentes.

1 - Cree una clase no visual visible para todos los formularios:

Define Class Cursores_01 As Cursor Name = "Cursores_01"
 Exclusive = .F.
 ReadOnly = .F.
 *- esta propiedad que sigue, es de lectura y escritura en modo de ejecucion:
 *-  _oSis.cDbc nombre de la base de datos de la aplicación del framework.
 Database = Juststem(_oSis.cDbc)+".DBC" 
 Procedure Init
  Lparameters tcTabla
  Set Exclusive Off
  Set Multilocks On
  tcTabla = Juststem(tcTabla)
  If !File(This.Database)
   Messagebox(This.Database+" no existe.",48,This.Name)
   Return .F.
  Endif
  If !File(tcTabla+'.dbf')
   Messagebox("No se puede encontrar: "+tcTabla+".dbf",16,This.Name)
   Return .F.
  Endif
  This.Alias = tcTabla
  This.CursorSource = tcTabla  && nombre largo de la tabla
  This.Comment = 'Cursor '+tcTabla
 Endproc
Enddefine

2 - En el método LOAD de la clase form escribí;

*- Ej. ABM de datos para proveedores:
If This.DataSession # 2
 Messagebox('No ha especificado sesion privada de datos',16,This.Name)
 Return .F.
Endif
If !"CLASES_01"$Set("Procedure")
 Set Procedure To Clases_01 Additive
Endif
Set Deleted On

With Thisform.DataEnvironment
 .CloseTables() && libera el entorno de datos cargado
 .AddObject("CurProveedores", "Cursores_01", ‘proveedores’)
 .AddObject("CurLocalidades", "Cursores_01", ‘Localidades’)
 *- ... etc. y todas las tablas que se necesitan en el form.
 .OpenTables()
Endwith
Return This.nError = 0
*- Fin Load.

(a partir de aqui esta clase ya puede tener todos los campos y sus ControlSource establecidos en tiempo de diseño y funcionará sin ninguna modificación adicional en el formulario que, de entrada no tendrá ni una linea de código y funcionará.)

3 - Crear el form derivado de esta clase de abm y establecer DataSession = 2

Guardar el formulario en el directorio del cliente (o aplicación) para modificar en el futuro las especificaciones exclusivas del cliente en el. (como agregar campos, cambiar Valid, etc.)

Los problemas del futuros podrían ser:

Agregar campos a la tabla: Siempre se puede sobrescribir el método load del form, copiando y pegando el de la clase y agregando el o los cursores adicionales.

Quitar campos: No implica problema en los pocos casos en que esto sucede se puede usar la propiedad Visible del campo. La tabla no hay porque modificarla.

Espero que les sirva como me sirvió a mi.

Saludos.

Alberto Rodriguez

1 comentario :

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.