lunes, 16 de abril de 2007

abm-o-matic para todo el mundo

Hace un par de años atras cuando comencé a trabajar para una empresa de software, me di cuenta el caos de programas que tenia, cada programa era totalmente distinto al otro, siendo que todos hacian básicamente lo mismo un proceso de ALTA, uno de MODIFICACION, uno de CONSULTA y uno de LISTADO. Si si, el famoso ABM.

El tema es que estos ABM's venian de la época de Francisco Cachilo (un programador no muy agil que se las rebuscaba para hacer todo más complicado y más feo).

Por lo que me surgió la idea de hacerle una lavada de cara al sistema y eliminar del menu de usuarios como 3 o 4 opciones por cada subsistema.

Me acuerdo que los menues no terminaban nunca, por cada opcion tenias un submenu que decia

Archivo de Talcosa
  • Alta de Talcosa
  • Consulta de Talcosa
  • Listado de Talcosa

o a veces peor

Archivo de Talcosa
  • Alta de Talcosa
  • Consulta de Talcosa por color de Pelo
  • Consulta de Talcosa por color de Ojos
  • Consulta de Talcosa por color de Calzones
  • Listado de Talcosa por color de Pelo
  • Listado de Talcosa por color de Ojos
  • Listado de Talcosa por color de Calzones

EN FIN UN HORROR!!!!

Luego de pelearme con la vida y despues de muchas horas de trabajo (8) se me ocurrio hacer un Programa que haga ABM's!

Si si .. algo así como una herramienta CASE pero más a lo bestia.

Bueno de ahí fue donde empece a buscar como demonios acceder a la definición de los campos y las tablas y los indices y etc. etc., pero eso ya lo puse en el posteo pasado por lo que ahora me voy a centrar en como lo hice.

Bien la cosa fue realmente sencilla:

Agarre un programa modelo que había hecho en donde se contemplaba, el Alta, la modificación el borrado, la consulta y el listado. A este programa lo llame PLANTILLA.p.

/*****************************************************************************/
/* PLANTILLA PARA ABM-O-MATIC */
/*****************************************************************************/

/** DEFINO BOTONES **/

def button btnAgregar label 'AGREGAR'.
def button btnModificar label 'MODIFICAR'.
def button btnBorrar label 'BORRAR'.
def button btnImprimir label 'IMPRIMIR'.

/** DEFINO UN QUERY **/
def query qry01 for @4@.

/** DEFINO UN BROWSE **/
def browse brw01 query qry01 share-lock
display
@1@
with 10 down width 78.

/** DEFINO UN FRAME **/
def frame frmMain
brw01 at 1
btnAgregar at 1
btnModificar
btnBorrar
btnImprimir
with 1 down row 3 centered
title '[ @5@ ]'.

def frame frmIngreso
@1@
with 1 down row 6 centered overlay 1 col color message
title '[ ALTA/MODIFICACION DE REGISTRO ]'.

/** DEFINO EVENTOS **/
on choose of btnAgregar run Agregar.
on choose of btnModificar run Modificar.
on choose of btnBorrar run Borrar.
on choose of btnImprimir run Imprimir.

/** MAIN **/
hide all no-pause.
status input off.
run OpenQry.
enable all with frame frmMain.
wait-for endkey of this-procedure.

/*** PROCEDURES ***/
procedure Agregar.

create @0@.
update
@2@
with frame frmIngreso.

message 'Confirma el Alta?'
view-as alert-box buttons OK-CANCEL title '[ ATENCION ]'
set wCh as Log.

if wCh <> true then delete @0@.
run OpenQry.

end procedure.


procedure Modificar.

update
@2@
with frame frmIngreso.

run OpenQry.

end procedure.

procedure Borrar.
message 'Confirma la baja?'
view-as alert-box buttons OK-CANCEL title '[ ATENCION ]'
set wCh as Log.

if wCh = TRUE then delete @0@.
run openQry.
end procedure.

procedure Imprimir.

form header
'Nombre Empresa' at 1
'Nro.Pag.: ' to 70 page-number format "99999999" to 80
'Fecha ..: ' to 70 today to 80
skip(1)
"Listado de @5@" at 30
skip(1)
with frame tit no-label no-box page-top.

message '¿Confirma la Impresión?' view-as alert-box buttons YES-NO update wCh.

if wCh <> TRUE then return.

output to archivo.txt paged page-size 66. /*** ACA LA SENTENCIA OUTPUT ***/

view frame tit.

get first qry01.
repeat while avail @0@:
display
@1@
with down frame frmImpresion width 255 no-box.

get next qry01.
end.

reposition qry01 to row 1.
output close.

end procedure.

procedure OpenQry.
close query qry01.
open query qry01
@3@
.
end procedure.


/*****************************************************************************/
/* (C) 2000 ABM-O-MATIC by Diego J. Coppari All Right Reserved */
/********************************* EOF ***************************************/


Bien, esa fue mi plantilla, ahora que fue lo siguiente que hice, hice un programa que "parseaba" este archivo y a medida que lo recorría iba reemplazando los numeros por su valor. Si se fijan tenemos varios.

@0@ = Nombre de la Tabla primaria
@1@ = Lista de campos para los display estos además de TABLA.campo tienen el label y el format.
@2@ = Lista de campos en el formato TABLA.campo sin agregados para los ABM.
@3@ = Sentencia del Open Query
@4@ = Lista de Tablas para el Query (Tabla1, Tabla2, TablaN)
@5@ = Titulo del Programa


Explicado esto creo que no les será muy difícil crear algo funcional, la parte más difícil ya la tienen.

Se trata de jugar y de tener un programa funcional en un 90%, cosa de tocar 2 o 3 pabadas y que quede andando.

Y por sobre todo, lo más importante, que todos los programas tengan la misma estructura.

sábado, 7 de abril de 2007

VACACIONES!

Je que bien me vinieron estos 2 días feriados. El único inconveniente fue el contenido televisivo, pero bueno ... aguante isohunt. Ah, por cierto no miren EPIC Movie.

Volviendo al tema de Progress no se donde nos habíamos quedado pero se me ocurrió postear algo que quizá muchos no lo saben, y es la forma de acceder a la info sobre la base de datos.

Las bases de datos Progress tienen una serie de tablas ocultas en donde guarda toda la información sobre las tablas, campos, indices, etc.

Estas tablas comienzan con un guión bajo "_".

Las más importantes o las que yo más he usado son:

_Filelist: Contiene Registros sobre los archivos que componen la base de datos.

_Field: Contiene Registros sobre todas las tablas de la base de datos.
_Field-Trig: Contiene Registros sobre los triggers de tablas.

_File: Contiene Registros sobre los campos de una determinada tabla (_file).
_File-Trig: Contiene Registros sobre triggers de campos.

_Index: Contiene Registros sobre los indices de una tabla.
_Index-Field: Contiene Registros sobre los campos que integran un indice.

Por ejemplo, si quisieramos saber todos los campos de una tabla llama "USUARIOS" tendriamos que ejecutar la siguiente instrucción:

for each _file
where _file._file-name = "USUARIOS",
each _field of _file:

display _field.

end.


Un ejemplo que voy a postear me sirvio mucho para detectar todos los trigguers que tenia una base de datos.

for each _file,
each _field of _file,
each _field-trig of _field:

display _file._file-name format 'X(10)'
_field._field-name format 'X(10)'
_field-trig._Event format 'X(08)'
_field-trig._Proc-Name format 'x(30)'
_field-trig._Override
_field-trig._Trig-Crc

with width 255 no-label.

end.

En el próximo post les voy a enseñar como hacer ABM's genericos utilizando estas tablas.

Salu2

miércoles, 4 de abril de 2007

Como repuntar

Bueno tendría que leer un rato largo para acordarme donde me quede :D jejeje pero igual ahora estoy medio distraído ya que estuve pasando la ecografía que le realizaron a mi mujer la cual grabaron en un prehistorico VHS por lo que tube que salir a pedir una video cassetera prestada y desempolvar mi vieja AIMS Video Highway Xtreme 98, colocarla en mi computadora y renegar!!!! pasando el VHS a DVD.

Ya que tamos lo incrusto acá ya que lo subí a youtube para que lo vea la flia (y los que no tienen vhs :p) ahí va.





En fin, para los que son poseedores de una placa capturadora de tv (o tv tunner) y la tienen ahi tirada porque no anda más que en Win98 les cuento que hay un fantastico programa freeware que se llama DScaler que tiene soporte para estas placas basadas en el chip Bt848. Es más este programa hace de todo incluso grabar desde la tele o la entrada video-in.

No hace falta instalar la placa para hacerla funcionar, solamente bajan el software y el mismo se comunica directamente con la placa. Trae soporte para un montón de placas por lo que si les interesa bajenlo y denle una oportunidad, además trae filtros y soporte para Close Caption y otra infinidad de cosas. Realmente no tiene desperdicio y no consume recursos como los Programas que generalmente vienen con las placas.

Por otro lado si les interesa, también hay un proyecto freeware que se llama btwincap que es un driver gratuito para cualquier placa sintonizadora de tv (tv tunner) que tengan chips Bt848/49/78/79. Esta muy bueno porque es un Driver universal con el que van a poder hacer andar esa placa que habían dado por muerta, o que la estaban por usar para hacer un asadito.

Ok, hecho este paréntesis prometo que mi próxima aparición va a ser sobre algo de Progress

Ultimos comentarios