PiensoPienso: Como unificar dos objetos que se llaman diferente?

Tengo una KB en GeneXus X Ev1. En la misma hay un objeto que esta siendo referenciado en varios (muchos) objetos en otros ambientes.

Para hacer una prueba y no correr riesgos, dicho objeto es salvado con otro nombre con el comando SAVE AS..

Después de varias pruebas y asegurarse que el nuevo objeto funciona correctamente quiero dejar a este objeto como versión "oficial" del mismo.

Resumiendo como ejemplo
1) Abrir el objeto MasterPage1 y hacerle SAVE AS MasterPage2
2) Modificar el objeto MasterPage2 y probarla.
3) Lograr que la MasterPage2 sustituya en todos lados a la MasterPage1
4) Borrar la MasterPage1


Hay una forma sencilla de lograr esto?. 

Las soluciones que no necesiten de herramientas externas van a ser valoradas positivamente.

Comentarios

  1. yo de hecho hago algo distinto, pero es para win y no web, pero creo que podría hacerse en forma similar (reitero que probablemente sea muy simplista mi solución y no vea otros problemas)

    - Objeto "A" está funcionando correctamente.
    - Lo grabo con el nombre "ABack20100618"
    - Cierro este nuevo objeto y vuelvo a trabajar en el objeto original "A"
    - Si algo anda mal, recupero el "A" desde el back, este puede hacerse varias maneras. Desde cambiar los llamados, hasta exportarlo a otra kb auxiliar, renombrarlo como "A" y volverlo para atrás con una "consolidacion" o "importacion"

    Salu2
    ElAndrew

    ResponderBorrar
  2. Andres:
    Lo que no esta facil de hacer, es tu paso de volver atras.
    Modificar todos los objetos llamados, es innecesario. Exportarlo a otra KB, renombrarlo y volver a consolidarlo, funciona en 9.0, pero no funciona igual en la X, pues lleva el identificador UID.

    ResponderBorrar
  3. No se como son los XPW de la Evolution 1, si siguen teniendo el mismo formato que en la 9, ni siquiera se si en la 9 funciona el procedimiento que voy a describir, pero es lo que se me ocurrió.

    1) Distribuir el objeto Nuevo
    2) Descomprimir el XPW
    3) Editar el XML y dentro cambiarle el nombre del objeto del NOMBRE NUEVO al NOMBRE VIEJO.
    4) Cambiar tambien el UID NUEVO al UID VIEJO (luego de leer el comentarion de Enrique)
    5) Comprimir y dejarlo denuevo como XPW.


    Esto funcionará ??

    Saludos.

    ResponderBorrar
  4. Hola Enrique.

    ¿es un tema de no querer perder el código fuente original?

    ¿que versión de Genexus estás usando?

    ¿es un tema relacionado a momento de ejecución? quieres que las dos versiones corran en el mismo ambiente?

    Te comento la forma desde el punto de vista del código fuente. La forma en que yo lo hago generalmente es haciendo un export del objeto que estoy modificando, si quiero volver atrás los cambios realizados, simplemente vuelvo a consolidar el export y santo remedio.

    También hay forma de hacerlo con otra producción, si tienes una producción que la estás usando para ese "testing", puedes recobrar el objeto original desde la producción "posta" en donde está el objeto verdadero, entrando a la producción realizas el export de ese objeto desde la misma y consolidas ese mismo nuevamente (te va a dar varios mensajes de advertencia previamente claro, estás pasando la versión de diseño que es mas nueva con una versión vieja).

    Algo que no explicas es el motivo por el cual creas realmente una copia, si lo estás haciendo porque quieres convivir con las dos versiones o simplemente es para no perder el fuente original.

    Si estás con la X el manejo de versionado te lo hace más simple para el lado de recobrar los fuentes desde otra versión.

    Lo que dices de los UUID es cierto, pero no sería necesario el Save AS ya que tienes la posibilidad de recobrar realmente la versión anterior desde varios lados (export o versión)

    Dame un poco más de pistas si el tema está a nivel del ambiente y no del fuente.

    ResponderBorrar
  5. Y Bueno comenté que no estoy con la X, por lo que por lo visto la situación es absolutamente diferente.

    Solo puedo desearles un hermoso SEP

    Saludos

    PD: SEP = Suerte En Pila

    ResponderBorrar
  6. El tip de Diego lo uso desde que existía el XPW, y mismo es válido con la X, cambiando como dice, nombre y UUID (y la fecha de modificación, sino GX creo que no se da cuenta que algo cambió para regenerar las referencias).

    No soy de la idea de promover los SaveAs a no ser que realmente pase a ser otro objeto (que no vuelva a su origen), si es un tema de ambiente mismo se puede manejar mediante repositorios/ambientes diferentes para no afectar al resto.

    Espero a ver que dice Enrique, cual es realmente el motivo y cual es su caso.

    ResponderBorrar
  7. Renombrar no es lo mismo que un SaveAs, como dice Enrique, ahora están los UUID, por lo que el cambio de nombre no importa, siempre seguirá siendo el mismo objeto, por eso lo de tocar el Export es algo válido (pero...sigue siendo rudimentario).

    PD: Perdón por mencionar soluciones GX previas a la X... no vi que al comienzo del Blog que aclara que es X Evo 1 (Será que agregaste después la aclaración? no la vi al principio :P )

    ResponderBorrar
  8. David:
    La letra decia desde el primer momento que la KB estaba en GX X.Ev1.
    Igual, sirve para la discusion ver que antes era mucho mas facil de lograr que ahora.

    El SaveAs, es algo que no debe hacerse, pero cuando alguien no esta seguro o no sabe bien cuanto puede demorar la prueba que va a realizar, es preferible tener otro objeto a dejar un objeto que esta en produccion en estado inconsistente.

    Igual, el planteo es anecdotico. Lo que carecemos es una forma facil de unificar dos objetos, que pueden ser 2 dominios, dos atributos o dos objetos cualquiera.
    Es algo muy comun cuando junto 2 KB y quiero unificar objetos y es bastante dificil de lograr.

    Las formas que conozco serian:

    1) Distribuir ambos objetos, modificar el xpz del objeto que quiero dejar como bueno y le pongo el mismo UUID y Nombre que el anterior y lo consolido. Luego borro el objeto viejo, que ahora no deberia quedar referenciado por nadie.

    2) Abrir ambos objetos y pasar con Cut/Paste cada una de las partes del objeto (form/variables,rules,conditions, etc). Tan peligroso como primitivo.

    3) Modificar todas las referencias al objeto viejo para que apunten al nuevo. Una forma es hacer un export de toda la KB y sustituir todas las referencias del objeto original por el objeto nuevo. Es muy facil de equivocarse en algo en esto. Quedan varios objetos como modificados que en realidad no lo fueron.

    4) Arreglar las referencias a mano. Dependiendo la cantidad de objetos, puede ser algo demasiado trabajoso.

    A nadie se le ocurre algo mas prolijo?

    ResponderBorrar
  9. Para las viejas versiones de GX tenía una herramienta que comparaba export's al mejor estilo "change defender" que lo que hacía era comparar 2 objetos de diferente nombre como si fueran el mismo (lo que hacía era un export y modifica el nombre interno de los que quería comparar entre si para que tuvieran mismo nombre).

    Estaría bueno algo así, un Change Defender entre objetos diferentes Nombres/UUID que nacieron de una versión inicial en común (Save As).

    ¿Alguien conoce si el comparador de Artech o la herramienta de Change Defender podría llegar a tener algo similar?

    Taría bueno che.
    Mismo al momento de consolidar, poder expresar con una regla quien quiere pasar por arriba de quien, ver los cambios y permitir aplicarlo en el destino (y algo similar entre versiones o dentro de una misma versión entre diferentes programas).

    ResponderBorrar
  10. Enrique,
    Probablemente no esté entendiendo la letra del problema, porque teniendo el history del objeto dentro de la KB, volver atrás ( a la versión que considero "original") en el caso de no lograr lo que quiero, es simplemente ir al history y hacer "Set as active version".

    ( si con "referenciado desde otros ambientes" te refieres a "otras kb/versión que se mezclan en runtime" ó "calls dinamicos por nombre" entonces puedes incluir un rename durantes las pruebas, lo cual no tendrá ningun efecto indeseado al volver a la versión original)

    ResponderBorrar
  11. Enrique

    Coincido con Willy. No soy programador, pero en la presentacion de GxX asisti a una de las charlas donde decian que una de las novedades era el administrador de versiones donde por ejemplo podias tener ramales de versionado por clientes, o para testing.
    Reitero no programo, y no se si lo implementaron, pero en el congreso lo mostraron.

    ResponderBorrar
  12. Willy y Roberto:
    Creo que no entendieron bien la letra del problema.
    Se trata de unificar dos objetos diferentes para que se comporten como uno solo.
    Por ejemplo, podria tratarse que dos grupos desarrollaron los programas "IsAuthorized" y "EstaAutorizado" que hacen lo mismo, y quiero dejar un unico objeto en la KB que haga ese control.

    En la 9.0, era relativamente facil lograrlo, pero con la X, es algo mas complejo.

    ResponderBorrar
  13. Enrique, no aplica directamente a tu problema puntual, pero igual quizas a futuro podría alivianar la cantidad de trabajo a realizar.

    En el patrón MVC, una de las partes, el controlador cumple el rol de "despachador". Entiendase por eso a un objeto encargado casi únicamente de invocar a otros.

    Si utilizaras este conceptoa nivel global de diseño tu problema, al menos en cuanto a los cambios en la invocación, se volveria trivial.

    Ahora para hacer el merge de los dos objetos, creo que cualquiera de las anteriores soluciones tienen sus pro y sus contras, y no puedo decantarme por ninguna.

    ResponderBorrar
  14. Hola Enrique

    Creo que el problema fue cambiando de forma con algunos comentarios. Digo esto porque en un principio entendí como que solo se modificaba MasterPage2, pero el problema planteado al final da a entender como que tienes 2 objetos diferentes (cada uno con llamadores diferentes) y quieres convertirlos en uno.

    Para el problema original, podes usar el comparador de objetos de GX. Simplemente tenes que elegir la opción en el menú contextual que dice "Select Left Side to Compare" sobre MasterPage1, y luego elegir la opción "Compare With MasterPage1 Revision:xx" sobre MasterPage2. Esto te permitirá ver qué se cambió de un objeto al otro, permitiéndote ver elegir con cuidado los cambios a pasar. Esto te puede resultar útil si MasterPage1 fue modificada luego de haber creado MasterPage2 a partir del Save as.
    Al momento del U3 de la Ev1, el comparador no tiene mayor funcionalidad que la de mostrar las diferencias, y algunos comandos básicos para seleccionar y copiar. En un futuro esperamos agregar mayor funcionalidad que permita pasar cambios de una vista a la otra.

    Para el problema extendido planteado al final, no tengo otras sugerencias fuera de las ya planteadas.

    saludos

    ResponderBorrar
  15. Fede:
    Entiendo que no se entendio bien el problema (tratare de plantearlo mas claro para la proxima), pero el titulo del mismo es "Unificar dos objetos que se llaman diferente", que es lo que queria hacer desde el principio.

    La problematica del control de versiones de un mismo objeto y su comparacion, esta bien resuelta.

    La que creo que no es tan sencilla y muchas veces necesaria, es la de unificacion de dos objetos (de forma automatica o mas o menos manual). Pasa mucho cuando unificas dos KB cuando se quiere por ejemplo juntar dos dominios en uno solo, o que dos procedimientos que hacen lo mismo pasen a ser uno solo.
    Muchas veces logramos soluciones como que desde uno se invoque al otro, pero hay objetos en los que esto no es posible, como por ejemplo los dominios.

    Lo que me gustaria, seria tener algo =(una extension?) que dados dos objetos, los unifique en todas sus referencias de la KB (propiedades, codigo, etc).

    ResponderBorrar
  16. Enrique, con los dominios puedes hacer lo mismo que con los objetos.

    ( un dominio puede estar basado en otro dominio ).

    ResponderBorrar
  17. Willy:

    Tenes razon, se pueden tener dominios basado sen dominios.. No me habia dado cuenta de eso...

    Gracias por el tip.

    ResponderBorrar
  18. No estaria mal que agregaran una herramienta a la IDE de genexus que realize un "merge" de dos objetos distintos en uno solo. Creando una nueva versión de ambos unificada en un solo objeto.

    Para hacer el merge.. se me ocurre que se podría analizar el código fuente y la navegación para determinar que es "igual" a que (recuerdo un programita en pascal de la fing que hacia esto para detectar copias en las tareas obligatorias).

    Si ademas de esto, la IDE se encarga de propagar el cambio a todas las invocaciones a los objetos.. Posiblemente no quede un 100% correcto pero ahorraria mucho esfuerzo.

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.