Edit in place, Creando Vistas en tablas tps (Parte VII-A)

Código útil, tips de programación, etc.
R.Pacheco
Al nivel de RZ
Mensajes: 367
Registrado: Lun Feb 07, 2011 4:45 pm
Ubicación: Santo Domingo,Rep.Dominicana
Contactar:

Edit in place, Creando Vistas en tablas tps (Parte VII-A)

Mensaje por R.Pacheco » Mié Jun 08, 2011 5:24 pm

Edit in place, Creando Vistas en tablas tps (Parte VII-A)
Nota: Este tema al ser muy largo lo voy a tener que deividir en tre parte A, B y C.

Introdución
Uno de los temas, que más trabajo me dio implementar y quizas es desconocido por muchos programadores de clarión, es el tema de las vistas, por eso quiero dedicar este post de forma excusivo.

Puedo decir, que la vista son más rápida que los process y son muchos más fáciles de hacer, solo hay que cogerles el hilo y usar habilidades para su pronto desarrollo.

Pero ante de entrar a la práctica quiero dejar de manera de introducción esta nota sobre el tema de las vistas extraída de la Revista el ABC de Clarión –gracia a nuestro colega Luís Parra.

En innumerables ocasiones al procesar tablas manualmente, necesitamos hacerlo con varias de ellas al mismo tiempo. A veces no resulta tan fácil si añadimos algunas especificaciones, como: Procesar una tabla en cierto orden sin contar con un índice o cambiar dinámicamente el orden o filtro del proceso. Para facilitar el manejo de múltiples tablas contamos con Views (Vistas)

¿Qué es una Vista?
Es una estructura lógica que puede incorporar campos de diferentes tablas (aún cuando no estén relacionadas en el diccionario). Es como contar con una sola tabla que incorpore todos los campos que necesitamos en el orden que los deseamos.

¿Qué ventajas provee una vista?
Entre las más importantes tenemos:
- Podemos crear índices en tiempo de ejecución.
- Filtros en tiempo de ejecución.
- Podemos mezclar campos de diferentes tablas para crear el índice o filtro.
- Es posible especificar que no se incorporen registros sin hijos (por ejemplo, clientes sin facturas). Requieren mucha menos programación que usar tablas.
En general son estructuras muy rápidas y presisas con el resultado esperado. (Y aún más si se aplican sobre un sistema cliente - servidor), además son muchos más rápidas que los process. (Fuente el ABC de Clarión –Luís Parra).

Creando los procedimientos de las vistas
A nuestro sistema de facturación les vamos a crear varios procedimientos para agregar vistas, que al final de todos no son más que consultas filtradas, para eso vamos a crear los siguientes procedimientos:

1- Vista Facturas Por Fecha
Aquí filtraremos todas las facturas realizada en nuestro sistema por un rango de fecha, con la finalidad de eterminar el monto vendido o la cantidad de facturas elaboradas.

2- Vista Facturas Por Cliente
aquí vamos a filtraremos la cantidad de facturas realizadas a un determinado clientes, con el objetivo de conocer el monto facturado.

3- Facturas Clientes Por Rango de Fecha
aquí vamos a filtrar las cantidades de facturas realizadas a un determinado clientes por un rango de fecha, con el objetivo de conocer el monto facturado.

4- Facturas Por Producto
aquí vamos a filtrar en todas las facturas las ventas de un determinado producto, con el objetivo principal de saber la cantidad de venta que ha tenido ese producto.

5- Facturas Producto Por Cliente
aquí vamos a filtrar en todas las facturas la ventas de un determinado producto a un cliente en especifico, con el objetivo principal de saber la cantidad de ventas que ha tenido ese producto a dicho cliente.

6- Facturas Producto por Rango de Fecha
aquí vamos a filtrar en todas las facturas las ventas de un determinado producto por un rango de fecha con el objetivo principal de saber la cantidad de ventas que ha tenido ese producto en ese rango de fecha.

Agregando los procedimientos de las vistas al menú del sistema
Ahora váyase al menú y cree una opción llamada Vistas agrégueles los ítems anteriores,
si lo hizo así, debe haberles quedado como se muestra en la siguiente imagen.

Imagen

Entrando a la práctica
Ahora comenzaremos a crear las vistas en nuestro sistema de facturación, pero ante Quiero decirle que debe ir creando cada vista en el orden en que está el menú, quizás Usted no entienda por ahora el asunto del orden pero más adelante se dará cuenta el por que. Pero tambien ante de la creación de una vista en una tabla tenemos que tener en cuenta en que vamos a cargar el resultado de esa vista, los resultados pueden ser cargados de varias formas o maneras entres la cuales están por tabla estupida o boba, por Queue locales, Queue Globales y por tablas normales, en mi caso yo voy usar Queue globales, Aunque a muchos programadores no le gustan trabajar con Queue globales, yo lo voy a usar en este caso para ahorrar espacio y tiempo, para luego aprovecharla la impresión de la cola.

Diferencia entre Queue local y Queue Globales.
La diferencia radica en que las queues locales los datos o las variables de memorias son liberada cuando se cierra la ventana que los cargas, Mientras que la Queue Globales, los datos permanecen abierto y residente en la memoria hasta que el sistema esté arriba.
Debemos tener muchos cuidado a la hora de diseñar queue Globales en nuestro sistema, ya que los resultados no son reales hasta que no hayan sido liberadoso limpiados.
Como voy a manejar datos de la factura debo crear una buena estructura de Queue, esta será global, no se desesperen por que iré explicando pasos por pasos este tema.

Creando la estructura de Queue Global.
Voy a crear dos Queues Globales, para cargar los datos de la facturas en la vista
Mi primer queue global la voy a llamar QueCliente con los siguientes datos
QueClientes ¡Nombre de queue
NroFactura Long(07) ! Factura
De Fecha Date(d6) ! Fecha Factura
CodiCliente Long(07) ! Código del cliente
Nombre String(80) !Nombres del cliente
Monto Decimal ¡ Monto de la facturas
Contador Long(5) ¡ contador de cantidad de factura

La segunda Queue que voy a crear la llamaré QFactura y tendrá la siguiente estructura
QueCliente ¡Nombre de queue
NroFactura Long(07) ! Factura
De Fecha Date(d6) ! Fecha Factura
CodiCliente Long(07) ! Código del cliente
Nombre String(80) !Nombres del cliente
Monto Decimal ¡ Monto de la facturas
Contador Long(5) ¡ contador de cantidad de factura
!Datos de la factura
CodiProducto Long(07) !Codigo de producto
Envase String(25) !La medida o el empaque del producto
Cantidad Decima(15.2) !Cantidad de la factura
Producto String(70) ! Descripción de los productos
TotalFactura Decima(15.2 !Sumar las Facturas

Como usted está ahora creando las queues aproveche el momento y cree de una vez los siguientes campos de memoria globales, que serán de mucho beneficio en los Filtros que haremos más adelantes.

Campos de memoria Globales
Glo:FechaInicial Date(d6)
Glo:FechaFinal Date(d6)
Glo:CodigoClie Long(07)
Glo:CodigoPro long(07)

Creando nuestra primera Vista
Ahora tomamos nuestro primer procedimiento y procedemos a crear nuestra primera vista, esta se llama “VistaFacturaFecha”, el tipo de procedimiento que voy a usar es una Window o Ventana, luego procedo a darle forma a mi ventanita hasta que me quede hermosa, así como se observa en la imagen.
Imagen
aquí agregueles los campos de memoria globales fecha inicial y fecha final, para hacer el rango de fecha en el filtro, en el boton OK de la ventana, le cambié la etiqueta y le puse procesar ahí vamos crear un procedimiento llamado “ResultadofacturaFecha”, es donde se van a cargar los datos de la vista. Ahora vamos a crear el browse o el list que va a contener los datos de la queue QueCliente. Para hacer esto debe elegir Window como procedimiento en cada uno de los casos y luego págale el control list, siga los pasos con mucho cuidado sin desesperase, el browse o el list le debió haber quedado así como se observa en la imagen
Imagen

Agregando código
Ahora vamos agregarles códigos a nuestra ventana de Browse o list, para eso
No vamos a la propiedad del browse, elegimos embeds, local data elegimos la opción
otra declaración, ahí ponga el siguiente código, como se observa en la imagen.
Imagen
Colocamos el siguiente código.

Código: Seleccionar todo

Definición de la vista
VistaFacturas View(Factura),Filter('FAC:FechaFactura>=Glo:FechaInicial and FAC:FechaFactura<=Glo:FechaFinal'),Order('FAC:NumeroFactura')
                Project(FAC:FechaFactura)
                Project(FAC:FechaFactura)
                Project(FAC:Montofactura)
                 !Nota: Se coloca la llave de la tabla cliente por el nombre del campo que se relaciona en la tabla factura 
                Join(CLIentes:PorCodigoClienteKey, FAC:CodigoClientes)
                Project(CLIentes:CodigoCliente)
                Project(CLIentes:Nombres)
                Project(CLIentes:Apellidos)
              End
             End
Explicando la estrucura del código
VistaFacturas(es el nombre de la vista) View(es la vista(Factura) la parte roja(es tabla por la cual estoy haciendo la vista.
Esto es la parte de filtros de la vista Filter('FAC:FechaFactura>=Glo:FechaInicial and FAC:FechaFactura<=Glo:FechaFinal'),Order('FAC:NumeroFactura')
Como vamos a filtrar las facturas por un rango de fecha aqui tomamos el campo de la FAC:FechaFactura y los vamos a filtrar por los campos de memorias globales Glo:FechaInicial y Glo:FechaFinal, luego la va ordenar por numero de factura asi:Order('FAC:NumeroFactura').
Luego colocamos algunnos de los campo de nuestra tabla que van a participar en la vista.
Project(FAC:FechaFactura)
Project(FAC:FechaFactura)
Project(FAC:Montofactura)
Aqui entra la parte mas importantes y es los join que tiene que ver con la relaciones de las tablas. hago un Join por la tabla clientes amarrado por su llave CLIentes:PorCodigoClienteKey con la llave de factura que es FAC:CodigoClientes, luego coloco los campos de la tabla cliente que yo quiero que participen en la vista.
Join(CLIentes:PorCodigoClienteKey, FAC:CodigoClientes)
Project(CLIentes:CodigoCliente)
Project(CLIentes:Nombres)
Project(CLIentes:Apellidos)
Nota importante: usted puede tener cuanto join desee en una vista y recuerde que cada join es una relacion de su tabla principal con otra tabla, lo único que debe tener encuenta es que por cada join que coloque debe haber un un end que cierre.
Cuando hacemos una vista de una sola tabla yo la llamo vista simple por que no la relaciónamos con ninguna otra tabla su codigo solo lleva un solo end de cierre, asi como se miestra el siguiente código.

Código: Seleccionar todo

Codigo de vista simple
!Definición de la vista
[size=85]VistaCumpleanos View(Nombremitabla),Filter('Mic:Micampo=Glo:Mivarible'),Order('MIEM:Mifecha')[/size]
 Project(MIEM:Codigo)
 Project(MIEM:Nombres)
 Project(MIEM:Apodo)
 Project(MIEM:Apellidos)
 Project(MIEM:Fechacumple)
END
Agregando el código para cargar los datos.
Ahora vamos cargar los datos de la vista en una Queue, para logra esto nos vamos a la propiedad del browse, elegimos embeds, Init, elegimos Open Files, ahí colocamos el siguiente código.

Código: Seleccionar todo

! Cargando los Datos de la Factura en la Queue QueCliente
! Bindeando los campos participantes en el fitros
 BIND('FAC:FechaFactura', FAC:FechaFactura)
 BIND('Glo:FechaInicial', Glo:FechaInicial)
 BIND( 'Glo:FechaFinal', Glo:FechaFinal)
 Qclie:Contador =0 ! igualandolo a cero 
 !LLamando y barriendo la vista
 Open(VistaFacturas)
 Set(VistaFacturas)
 Loop
  Next(VistaFacturas)
!  IF ERRORCODE()
  If Error() then break .
  !Cargando los datos de la tabla factura a la queue
   Qclie:NorFactura     =FAC:NumeroFactura
   Qclie:DeFecha       =FAC:FechaFactura
   Qclie:CodiCliente   =CLIentes:CodigoCliente !datos tabla Vliente
   Qclie:Nombre        =Clip(CLIentes:Nombres)&' '&clip(CLIentes:Apellidos) !datos tabla Vliente
   Qclie:Monto         =FAC:Montofactura
   Qclie:Contador +=1  !Contador de cantidad de facturas eleboradas
   Qclie:TotalGeneral +=Qclie:Monto !Sumando monto de factura
 Add(QueClientes)
 end
  Close(VistaFacturas)
  !Liberando el bing
 UNBIND('FAC:FechaFactura')
 unBIND('Glo:FechaInicial')
 UNBIND('Glo:FechaFinal')
Nota: Importante
Los campos con Bind son aquellos que participan en el filtro, tanto los de la Tabla principal como los campos de memorias. Ya termine mi primera vista y le digo a mi filtro que me muestras todas las facturas elaboradas el dia 14/04/2011, este es mi resultado, así como se vez en la imagen.
Imagen

Imprimiendo el resultado de la Vista
Ahora le voy a agregar un reporte al resultado obtenido de la vista de Factura por rango de fecha, aquí es donde entra la ventaja de hacer la queue global, como le decía anteriormente, por que se aprovechamos mejor el tiempo, ya que se hace una sola estructura para todos los movimiento que uno quiere hacer. por favor de le click a la imagen de arriba
a la del resulltado para que vea bien el diseño y así coloque un un botón de Reporte póngale el nombre de ReporteResultdoFacturaFecha. Luego diseñe su reporte como a usted mejor les parezca, recuerde que los campos que lleva son los de las Queue QueClientes, si lo hizo así, le debió haber quedado como se muestra en la imagen.
Imagen

Agregándole código al reporte
Para cargar los datos de la tabla membresía ponemos el siguiente código el NextProcedure()Byte, Viertual Prioridad 4500,

Código: Seleccionar todo

!Teniendo acceso a la tabla
SET(Membresia)
Access:Membresia.Next()
Este tema fue explicado el post anterior en la Parte VI
Ahora en el Takerecord del reporte en la Window Manager coloque el siguiente código para imprimir la cola de la Queue,

Código: Seleccionar todo

!Imprimir la cola de Memoria de (QueClientes)
LOOP C# = 1 to RECORDS(QClientes)
     GET(QueClientes,C#)
     IF ERRORCODE() THEN STOP(ERROR()).
PRINT(RPT:Detail)
END!LOOP
ENDPAGE(Report)
 Free(QueClientes).
Si desea puede compilar su reporte y mire haber como le quedó.
Si usted siguió todos los pasos hasta ahora explicados su sistema debe estar super bien, ya
hicimos nuestra primera vista de la tabla factura con el objetivo de filtrar todas la facturas
por un rango de fecha, a mi en lo personal me quedo fenomenal. Ahora hay una parte que me preocupa y la quiero agregar en este tema, y es cuando mando a imprimir si usted se da cuenta cuando envió el reporte o lo cierro la ventana de resultado se queda vacia por que el reporte cuando termina de imprimir borra la Cola de la Queue de memoria, por eso quiero que cuando el reporte se cierre o termine de imprimir me cierre la ventana de resultado y vuelva al menú normalmente de forma automática, para esto voy agragar el siguiente punto:

Cerrando una ventana desde otra ventana o Procedimiento
Para lograr esto yo quiero que usted siga con muchos cuidados los siguientes pasos.

1- Crear el Botón del reporte
Los primero que vamos hacer es crear un botón para llamar al reporte, si ya lo tiene hecho mucho mejor, entonces vaya a la propiedad del botón de su reporte, Action, donde dice difinición de procedimiento active el check que dice Initiate Thread 25,000,así como se observa en la imagen.
Imagen

2- Crear una Variable Global
Ahora no vamos a la propiedad global y creamos una variable de memoría llamada Glo:Thread de Bytes(3)

3- Agregando el código al Browse de la Vista
Ahora en la ventana del Bowse o list de la vista agregamos el sisguiente código, para esto entramos en la Winidow Manager, Init, Open Window.

Código: Seleccionar todo

¡Para cerrar  Ventana
Glo:Cierre = Thread()  
4- Agregando código en el Reporte para hacer el cierre
Ahora procedemos a colocar el código al reporte para cuando este finalize me cierre la ventana del browse o list de la vista, para eso entre a la local Data, closeWindow ahí coloque el siguiente código.

Código: Seleccionar todo

POST( Event:CloseWindow , , Glo:Cierre) 
Le recomiendo ahora que compile su aplicación, para ver los resultados de seguro que le tuvo que haber queado excelente como me quedo a mi.

Ya terminé con este tema y con nuestra primera vista, quedando así por desarrollar 5 procedimientos de vista, según usted puede observar en la primera gráfica de este post.
Por asunto de tiempo y espacio he decido dividir este post en varias partes quizas en A, B y C
con el objetivo de no cargar demaciado el tema en un solo post.
En nuestra próxima entrega la cosa serán más facil de hacer porque le señaré algunos trucos para agilizar el diseños de los procedimientos faltantes de la vista.
Ing. R. Pacheco
Analista Programador
Pachecoramon@hotmail.com, Skype:pachecoramon
Santo Domingo, Rep. Dominicana
Para cualquier consulta rápida: hacerla por WhatApp al 1 347-6159 US


Mariow
Novato
Mensajes: 35
Registrado: Lun Feb 07, 2011 12:40 pm
Ubicación: Leandro N. Alem - Misiones - ARGENTINA
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por Mariow » Vie Jun 10, 2011 11:20 am

Hola Ramón
Muy buen tutorial, había hecho algunas pruebas con views pero por falta de tiempo nunca llegue a ver bien como funcionaban. Con esto el código que haga se vera mas profesional y posiblemente sea mas eficiente.
Gracias!
==============
Mario Wojcik
Leandro N. Alem
Misiones
Argentina
==============

R.Pacheco
Al nivel de RZ
Mensajes: 367
Registrado: Lun Feb 07, 2011 4:45 pm
Ubicación: Santo Domingo,Rep.Dominicana
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por R.Pacheco » Vie Jun 10, 2011 12:57 pm

Hola

Mario

Para mi es un honor que este tutorial, le sirva a usted de apoyo, para que perfecione
su tecnica, en la proxima semana estaré subiendo la segunda parte el B de este tema.

recibe muchas bendiciones
Ing. R. Pacheco
Analista Programador
Pachecoramon@hotmail.com, Skype:pachecoramon
Santo Domingo, Rep. Dominicana
Para cualquier consulta rápida: hacerla por WhatApp al 1 347-6159 US

LuisMarcantoni
Ayudante de Santa
Mensajes: 86
Registrado: Dom Feb 06, 2011 6:06 pm
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por LuisMarcantoni » Vie Jun 10, 2011 2:55 pm

Muy buen aporte Ramón. Siga adelante con su experiencia y dedicación.

Saludos

Luis

SDigitales
Novato
Mensajes: 26
Registrado: Mar Feb 08, 2011 2:50 pm
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por SDigitales » Vie Ago 12, 2011 1:20 pm

Que buenas notas!!!
Muchas gracias!!

edgar Fernando
Al nivel de RZ
Mensajes: 210
Registrado: Vie Feb 25, 2011 7:16 pm
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por edgar Fernando » Vie Dic 23, 2011 12:40 am

hola ramon como estas,, y despues cuando publicas las partes que faltan de tu publicacion


edgar

R.Pacheco
Al nivel de RZ
Mensajes: 367
Registrado: Lun Feb 07, 2011 4:45 pm
Ubicación: Santo Domingo,Rep.Dominicana
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por R.Pacheco » Vie Dic 23, 2011 3:37 am

Hola edgar
he tenido muchisimo trabajo pero estare de vacaciones a partir 2
de enero 2012 y aprovecharé para hacer varia publicaciones.
Ing. R. Pacheco
Analista Programador
Pachecoramon@hotmail.com, Skype:pachecoramon
Santo Domingo, Rep. Dominicana
Para cualquier consulta rápida: hacerla por WhatApp al 1 347-6159 US

jg.viera
Mensajes: 7
Registrado: Sab Feb 15, 2014 2:52 am
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por jg.viera » Mié Feb 26, 2014 6:06 pm

Gracias por el aporte.

Una pregunta, ¿puedo usar este mismo ejemplo para replicarlo en MSSQL?

Saludos!

R.Pacheco
Al nivel de RZ
Mensajes: 367
Registrado: Lun Feb 07, 2011 4:45 pm
Ubicación: Santo Domingo,Rep.Dominicana
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por R.Pacheco » Jue Feb 27, 2014 2:02 am

Hola
Colega

En cuanto a tu pregunta te puedo decir que ya con motores de base de datos no es necesario aplicar esta tecnica
solo es cuando se esta trabajando en Tps.
En cambio para MSSQ tu crea tu propias vistas desde el mismo motor como si fuera una tabla normal, luego la importa a clarion igual como lo hace con tu tabla. Pero debe asegurarte si el administrador de base de datos que esta usando te permite crea vistas en MSSQ.
Las vistas MSSQ son facil de crear y la puede consultar tal como la impotar a tu Clarion.

Espero haberte respondidcas y abundantes bendiciones
Ing. R. Pacheco
Analista Programador
Pachecoramon@hotmail.com, Skype:pachecoramon
Santo Domingo, Rep. Dominicana
Para cualquier consulta rápida: hacerla por WhatApp al 1 347-6159 US

jg.viera
Mensajes: 7
Registrado: Sab Feb 15, 2014 2:52 am
Contactar:

Re: Edit in place, Creando Vistas en tablas tps (Parte VII-A

Mensaje por jg.viera » Jue Feb 27, 2014 8:35 pm

R.Pacheco escribió:Hola
Colega

En cuanto a tu pregunta te puedo decir que ya con motores de base de datos no es necesario aplicar esta tecnica
solo es cuando se esta trabajando en Tps.
En cambio para MSSQ tu crea tu propias vistas desde el mismo motor como si fuera una tabla normal, luego la importa a clarion igual como lo hace con tu tabla. Pero debe asegurarte si el administrador de base de datos que esta usando te permite crea vistas en MSSQ.
Las vistas MSSQ son facil de crear y la puede consultar tal como la impotar a tu Clarion.

Espero haberte respondidcas y abundantes bendiciones
Gracias por la pronta respuesta.

Antes que nada déjame comentarte que soy novato en Clarion. No tengo ningún problema en crear vistas desde la base de datos, lo que me genera duda es como voy a mostrar esa vista en un browse/list y como manejarla en Clarion.

Será posible que me brindaras algún norte por donde comenzar.

Saludos!


Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 17 invitados