Title: Como obtengo los objetos modificados desde la base de datos de la KB de Genexus?
Tags: genexus
Question: Buen dia gente,
Necesito obtener los objetos (WebPanels, Procedures, etc) modificados en cierta fecha pero sin abrir Genexus. Osea, utilizando la base de datos de la KB. Llevo dias analizando las tablas pero tengo varias versiones lo cual hace que todo se complique mas. Alguna idea o alguien que haya trabajado con algo parecido? Desde ya gracias y espero sus comentarios.
gracias por tu respuesta. Estoy de acuerdo con todo lo que planteas. Te platico el requerimiento. Se cuenta con dos KBs para cada aplicacion que tenemos en la empresa, una de QA y otra de Produccion. Por cuestiones administrativas de la empresa, se necesita dar seguridad a las KBs de Produccion, de tal manera que nadie pueda acceder a ellas y que los builds y las importaciones de .XPZs se hagan de manera controlada. Para eso se ha construido una aplicacion con las MsBuild y hasta aqui todo funciona bien. El problema esta en que los auditores requieren comparar el reporte que devuelve nuestra aplicacion (que no es mas que los objetos que se han leido en cada .XPZ importado) con el resultado de hacer Ctrl+O y filtrar por cierta fecha. No se necesita cambiar nada en esas tablas, ademas sabemos que ahi esta todo el conocimiento de Genexus y si algo se mueve, dejara de funcionar. En conclusion lo unico que se requiere es obtener un reporte de los objetos modificados en cierta fecha alguna idea o herramientas que pueda usar?
Agradezco mucho tu respuesta Fede.
Comment: @MiquelColl la idea es usar el SDK para resolver estos escenarios, aunque si alcanza con visualizar los objetos en Genexus, puedes ir al WW Objects y filtrar por objetos modificados luego de cierta fecha.

Comment: @Fede aunque salga mi nombre en la edición todo el contenido es de Jose :)

Comment: @MiquelColl gracias por la respuesta. Cuando dices "WW Object" te refieres a hacer Ctrl+O en Genexus y filtrar los objetos?

Here is the accepted answer: La forma apropiada de resolver tu consulta es usando el SDK de GeneXus.
El esquema de tablas y la semántica de los datos en cada una de ellas no es algo que queremos exponer. Una manipulación indebida de los datos en la base de datos de la KB puede llegar a causar que una KB ya no pueda abrirse, u ocasionar pérdida inadvertida de datos.
Por el  lado de resolverlo usando el SDK de GeneXus, eso sí es algo a lo que damos soporte, y nos aseguramos de brindar compatibilidad o mecanismos claros de detección de incompatibilidad y necesidad conversión.
Entiendo que quieres evitar abrir la KB, pero lamentablemente no es posible evitarlo. Todas las consultas a través del SDK necesitan acceder a una KB abierta. Si el requerimiento de NO abrir la KB es porque quieres independizarte de los diálogos de usuario (por ejemplo porque necesitas correr alguna tarea de forma batch), puedes implementar tu consulta como una tarea msbuild que accede a la KB abierta (que debería abrirse con la tarea msbuild OpenKnowledgeBase), o levantando la BL de GeneXus de forma manual (como lo hace el ejemplo de una aplicación command line que usa el SDK de GeneXus).
Si deseas más información de cómo resolver la consulta específica (ésta u otras) usando el SDK, te invito a que nos sigas enviando preguntas.
UPDATE
Agrego a continuación un breve ejemplo de cómo obtener los objetos modificados luego de cierta fecha.
Suponiendo que ya accediste a la KB, y obtuviste el KBModel sobre el cuál hacer la consulta.
KBModel model = ....; // Obtener el modelo en donde consultar de alguna forma
DateTime afterTimestamp = ....; // Definir la fecha a partir de dónde se quiere buscar cambios
IEnumerable<EntityKey&gt; modifiedAfterKeys = model.Objects.GetKeys(afterTimestamp);
// Agregar los objetos con las keys anteriores a una lista
List<KBObject&gt; modifiedAfterObjs = new List<KBObject&gt;();
foreach (EntityKey objKey in modifiedAfterKeys)
modifiedAfterObjs.Add(model.Objects.Get(objKey));
Espero estos tips te ayuden a arrancar con la implementación de la consulta que necesitas resolver.
Comment for this answer: Acabo de ver lo que comentas del SDK, voy a ver la info que hay en la Wiki, de todas formas si tienes mas documentacion que me puedas pasar te agradeceria. Saludos Fede.
Comment for this answer: @JoseRascon hay varios ejemplos en el wiki sobre distintas formas de implementar extensiones. Voy a modificar mi respuesta para agregar un breve ejemplo de cómo obtener los objetos modificados luego de cierta fecha usando el SDK.
Comment for this answer: Gracias por la ayuda, pude resolverlo de ese modo. Debo agregar que para mi solucion tuve que agregar otra linea de codigo para filtrar por "LastUpdate" ya que algunas veces (no se porque razon) la consulta devuelve algunos objetos que fueron importados al momento de crear la KB. 'IEnumerable cleanObjects = from p in modifiedAfterObjs
where p.LastUpdate > afterTimestamp
select p;'
Comment for this answer: @JoseRascon excelente! La consulta que propuse filtra los objetos con `Timestamp` menor a la fecha indicada. Básicamente los objetos tienen 2 fechas. `Timestamp` representa el instante exacto en el que se creó la revisión del objeto. `LastUpdate` representa el instante exacto en el que el objeto fue modificado a través de la UI. Generalmente `Timestamp` es igual a `LastUpdate`, salvo que importes un xpz, y en ese caso `LastUpdate` puede ser menor a `Timestamp`.


{'source': 'StackExchangeDataset', 'subset': 'es.stackoverflow.com', 'metadata': {'AnswerCount': 1, 'CommentCount': 3, 'ContentLicense': 'CC BY-SA 3.0', 'CreationDate': '2016:00:10/03/16', 'FavoriteCount': None, 'PostTypeId': 1, 'Tags': '<genexus>', 'Title': 'Como obtengo los objetos modificados desde la base de datos de la KB de Genexus?', 'ViewCount': 344, 'id': 25936, 'user_AboutMe': None, 'user_AccountId': 9316994.0, 'user_DisplayName': 'Jose Rascon', 'user_Reputation': 13.0, 'user_Views': 1.0, 'user_id': 15655.0}}