Unofficial Content

Generación del xpz

Como dijimos, la generación del xpz se va haciendo desde los dkt.
Los dkts combinan código C# y código GX (KMW), al principio del dkt aparece:

<%@ Template Language="C#" TargetLanguage="GX" Description="Work With Main Template" %>

Lo que se hace con el C# es ir recorriendo y procesando el xml de la instancia y a partir de allí se va escribiendo un nuevo xml de salida (el xpz).

El xpz es también un xml con un cierto formato:

<ExportFile>
  <Model>                                                           
>>> Info sobre las props. del modelo
    <Id>1</Id>
    <Name>NewKB</Name>
    <AttLen>30</AttLen>
    <TblLen>30</TblLen>
    <ObjLen>30</ObjLen>
    </Model>
  <KMW>                                                             
>>> Info sobre la KB
    <MajorVersion>2</MajorVersion>
    <MinorVersion>2</MinorVersion>
    <Path>D:\AJAXSample</Path>
    <MaxGxBuildSaved>2601</MaxGxBuildSaved>
  </KMW>
  <GXObject>                                                         >>> Aqui empieza la info de los objetos que están dentro del xpz    
<Transaction>                                                            (
en este caso es solo una TRN)
      <Info>                                       
        <Name>Client</Name>
        <Description>Client</Description>
      </Info>
       ........................
       ........................
      <Structure>                                                     
>>> Info de la estructura
        <Source>
        ................
        </Source>
        <LevelInfo>                                                   >>> Info de los atributos
          <KeyId>1</KeyId>
          <Name>Client</Name>
          <Description>Client</Description>
        </LevelInfo>
        <AllowNulls>
          <Name>ClientName</Name>
          <Value>No</Value>
        </AllowNulls>
      .......................
      </Structure>
      <Variable>                                                      >>> Info de las variables
        <Name>Today</Name>
        <Title>Today</Title>
        <Type>Date</Type>
        <Length>8</Length>
        <Decimals>0</Decimals>
        <Picture>99/99/99</Picture>
        <Property>
          <Type>string</Type>
          <Name>ATT_PICTURE</Name>
          <Value>99/99/99</Value>
        </Property>
      </Variable>
.....................
<Form>WinForm</FormInfo>                                             
>>> Info de los forms
<HTMLForm>WebForm</HTMLForm>
<Events>
...................
</Events>                                                            >>> Info de los eventos
..................
    </Transaction>
</GXObject>
<GXObject>
   <Attributes>
    ..................
    </Attributes>
     ...............
  </GXObject>
</ExportFile>

 

Entonces lo que se hace es recorrer la instancia con los templates e ir escribiendo el xpz como se describió antes.
Así encontramos en los templates lo siguiente:

<GXObject>                                                 >>> Esto se escribe en el xpz
<Transaction>                                              >>> Esto se escribe en el xpz
<%
foreach (XmlNode subNode in trnNode.SelectNodes("*"))      >>> Se comienza a recorrer la instancia
{
switch (subNode.Name)
{
case "LastUpdate" :
// Strip LastUpdate info.
break;
case "HTMLForm" :
if (updateWebForm)
{
%>
<%@ CallSubTemplate WWTrnWebForm Transaction='transaction' TransactionNode='TransactionNode' HTMLFormNode='subNode' PgmDescVarId='GetVarId(trnNode, "PgmDesc")' GxRemoveVarId='GetVarId(trnNode, "GxRemove")' Update='Update' %>
<% }
else
{
%>
<%= subNode.OuterXml %>                                 >>> Se escribe toda la info del nodo en el xml
??????????????
case "Events" :
<Events>
??????????????
</Events>
??????????????
</Transaction>
</GXObject>

Algunas clases interesantes para generar el xpz pueden ser:

HTMLToKMW - por ejemplo, para el caso de las celdas se usa TD.
WinToKMW

Ejemplo de uso de estas clases:

Imagen11

Son clases que ayudan a escribir el xml (celdas, controles, etc.)
En este caso los tags HTMLForm y HTMLBlock se escriben directamente en el xpz, y también el resultado de las variables que están entre <% y %>.

Mas info en el Documentation.chm.

Por otro lado se utilizan los métodos InnerXml y OuterXml para escribir subnodos en el xpz.
Estos métodos se utilizan de la siguiente forma, suponiendo que se tiene que generar los siguientes nodos en el xpz:

Imagen12

 

Last update: February 2024 | © GeneXus. All rights reserved. GeneXus Powered by Globant