https://foro.gambas-es.org/viewtopic.php?f=4&t=6476
-----------------------------------
alessandri
Miercoles, 28 Junio 2017, 20:57

Cargar Objetos En Runtime
-----------------------------------
Hola amigos.

Tengo la necesidad de crear objetos en tiempo de ejecución para resolver el siguiente problema:

Mi aplicación de contabilidad comercial se utiliza en varias empresas diferentes y suele ocurrir, Ej:
que en una farmacia la entidad CLIENTE requiere el atributo ARS (Administradora de riesgos
de salud) etc., y en otra empresa como una ferretería no se requiere, por tanto hay una redundancia
en el segundo tipo de empresa. Seria interesante crear un pequeño asistente que permitiera 
crear un campo para una empresa especifica cuando se requiera, es algo así como GENEXUS.

[u]El asistente debería:[/u]
1- permitir crear el campo en la DB con tipo, longitud, default value
2- crear los mensajes de alerta para valores admitidos o rangos
3- definir si es obligatorio
4- definir la ubicación en el formulario (quizás usando drap and drop)
5- agregar en la lista de campos para INSERT y UPDATE
6- definir si se admite duplicidad
7- cargar el dato al consultar la entidad
8- mostrar el dato nuevo en reportes y otros formularios
9- mostrar el campo en formulario en el cual ha sido creado

[u]Los beneficios serian los siguientes:[/u]
1- cada empresa podría personalizar el software a su medida (hasta cierto punto)
2- las empresas que no requieren un dato especifico no tendrían que visualizarlo,
y por tanto les resultaría mas fácil su uso
3- el desarrollador tendría que responder menos preguntas (¿A que ser refiere el campo NCS, etc.?)
4- no se corre el riesgo de inestabilizar el software al crear campos nuevos para una empresa especifica
5- se puede resolver un problema de nuevos datos con una llamada telefónica

Gracias por su acostumbrada ayuda.


-----------------------------------
jsbsan
Jueves, 29 Junio 2017, 09:22

Re: Cargar Objetos En Runtime
-----------------------------------
alessandri:

[quote]Cargar Objetos En Runtime[/quote]
ufff... el titulo no describe lo que quieres hacer....

Quieres un "asistente" que realmente es un nuevo programa o extensión a tu programa prinicipal,  capaz de modificar la base de datos (más o menos en fácil), pero que también sea capaz de modificar (o añadir ) funciones al programa principal... 

Creo que lo fundamental, es ver como tienes hecho el programa principal ("Mi aplicación de contabilidad comercial "), como genera los informes, los formularios, etc... como son las funciones y subrutinas encargadas de insertar/modificar los datos, si lo hacen "al vuelo" (ajustándose a la base de datos/tablas donde trabajan como parámetros de entrada), en plan "generalista" o no 

El compañero Shordi, tiene controles hechos en "plan generalista", capaces de mostrar datos, filtros, etc.. pasandole las instrucciones SQL como parámetro.


Yo he creado programas [mabdbvistas], desde otro punto de vista, ya que generan código "ajustado" a la base de datos dada...para luego usarlo insertarlas en el código fuente de las aplicaciones de bases de datos, pero creo que se quedan "a medio camino" de lo que tu quieres...

No se si te he liado más o te he dado alguna idea...


[b]Nota:[/b]
Tambien habría que ver si has usado el Modelo Vista Controlador.. 
http://jsbsan.blogspot.com.es/2013/08/modelo-vista-controlador-mvc-ejemplos.html
http://codejavu.blogspot.com.es/2013/06/ejemplo-modelo-vista-controlador.html

En el ejemplo, hay una clase "Lógica" que se encarga mediante distintos métodos de validar los datos introducidos.

Esa clase se podría automatizar para que leyera unas reglas de limitaciones de los valores de los campos de los registros y los validara..(dar true o false)

Por ejemplo:
Tendriamos en un fichero de texto plano, las limitaciones de los valores de los campos
campo: edad       minima: 18  maxima: 99

Y en la clase "logica", tendríamos un método que leyera el archivo de texto plano y que comprobara las reglas para los registros...

De esta manera, se podría añadir fácilmente nuevas reglas o limitaciones a nuevos campos (o campos ya existentes), sin tener que modificar el codigo de la clase lógica.


-----------------------------------
shordi
Jueves, 29 Junio 2017, 10:23

Re: Cargar Objetos En Runtime
-----------------------------------
Algo similar hice hace muchos años (en los viejos tiempos del Clipper 5 y las pantallas de texto). 
El truco era dejar al final de cada tabla un número par de campos de más (2 o cuatro o 6, según) con los nombres Title1,Value1, Title2, Value2, etc.
uno contenía el nombre a aplicar al campo custom y otro el valor 
Los formularios tenían luego la opción de mostrar o no dicho valor en la pantalla o informes según estuviesen rellenos o no. 

No recuerdo qué problemas me dió, pero sí que acabé por abandonar la idea.

Al final se aplica el principio del misterio de la construcción de la pirámide: Si haces una rampa para subir las piedras, el trabajo es mayor que el de construir la pirámide en sí misma. O, como se dice por mi pueblo: Demasiada alforja para tan poco viaje. En otras palabras es mucho menos costoso modificar cada aplicación para adecuarla a la empresa concreta que meterte en tal berenjenal... dejando claro que si lo haces y consigues, has hecho algo grande de lo que podrás estar orgulloso.


-----------------------------------
alessandri
Jueves, 29 Junio 2017, 11:48

Re: Cargar Objetos En Runtime
-----------------------------------
Muchas gracias amigos.


-----------------------------------
tincho
Sabado, 01 Julio 2017, 01:25

Re: Cargar Objetos En Runtime
-----------------------------------
Modificar la base de datos en tiempo de ejecución no supone problema alguno siempre y cuando se haga con cierta lógica.
Por ejemplo, yo uso una base para Tradukisto que depende del idioma nativo del usuario de turno y los idiomas a los que desea traducir las aplicaciones. Por lo tanto la base  tendrá unos idiomas, unas tablas, unas vistas que muy probablemente difieran de un usuario a otro.
Luego, volviendo a tu aplicación, con "settings" o algo así podes controlar si los campos serán vistos en los formularios o que tipo de datos tendrán etc.
por ejemplo:
unatabla-uncampo = "oculto"
Si en settings tal o cual campo es oculto, simplemente no lo muestras en los formularios.

Saludos.


