ABAP XML Condicional

Pedro TenorioPedro Tenorio
3 min read

Estamos de vuelta, tenía tiempo de no escribir por acá ni sobre este tema, pero entremos fuerte con algo divertido.

En este caso estaremos ampliando el tema del XML en ABAP en la transacción STRANS.

Recientemente trabajando con un XML para el formato de pago PAIN 1.5 me encontré con diferentes situaciones para la puesta en marcha, ya que en las validaciones, genera error al enviar etiquetas vacías, por lo tanto estas no se tienen que enviar, y eso hace que dependiendo de la información que enviamos y las condiciones dadas, el formato se vea diferente de una ejecución a otra es decir algunas veces muestra unas etiquetas y otras veces no.

Entremos al tema.

Dentro de las capacidades que tenemos a disposición en las transformaciones XML ABAP tenemos la posibilidad de agregar condiciones para mostrar o no una etiqueta, entre otras cosas; por acá te voy a dejar el enlace a la documentación SAP sobre este tema, y te explicaré como resolver un ejemplo sencillo.

https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenabap_st.htm

Esta es sólo una manera de llegar a la solución no dudo que existan otras y mejores.

Cuando creamos nuestra transformación desde una estructura del workbench, se asume que la misma traerá toda la información necesaria dentro del código de la transformación, podemos ver que se usan las variables de la estructura para transferir el valor, mapeo que se realiza en la transacción "TRANSFORMATION", tomando el nombre del campo en la estructura y transfiriendo como nodo al XML, por ejemplo: .CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.BICFI

<DbtrAgt>
  <FinInstnId>        
    <BICFI tt:value-ref=".CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.BICFI"/>
      <ClrSysMmbId>
       <MmbId tt:value-ref=".CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.ClrSysMmbId.MmbId"/>
         </ClrSysMmbId>
           <PstlAdr>
             <Ctry tt:value-ref=".CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.PstlAdr.Ctry"/>
           </PstlAdr>
  </FinInstnId>
</DbtrAgt>

En este caso lo que buscamos es que la etiqueta <BICFI> </BICFI> no se genere si esta no tiene datos.

Para esto usaremos la anotación <tt:d-cond> </tt:d-cond>, para la etiqueta "cond" tenemos dos opciones "d" y "s" lo que sería deserialización y serialización, la primera la usamos cuando estamos convirtiendo de ABAP a XML y la segunda al proceso de convertir XML a ABAP.

Para el ejemplo que estamos mostrando sería deserialización.

Agregaremos la etiqueta <tt:d-cond> </tt:d-cond> y dentro de esta etiqueta podemos manejar algunos tipos de validaciones, como en este caso, "Check" la cual nos va a permitir realizar una validación "not-initial" evaluando si un determinado campo es inicial o no.

Las condiciones trabajan muy similar al código que normalmente hacemos en ABAP, es decir que para esta condición no es necesario que sea el mismo campo que usaremos en la etiqueta, puede ser una variable creada dentro del XML, o bien una que esté disponible dentro de la estructura que estamos llamando para nuestro XML, además que sería algo así como un IF, las etiquetas que queremos condicionar tienen que estar dentro de la etiqueta "<tt: d-cond>", en este caso lo haremos con un campo de la estructura de la transformación.

El efecto que obtendremos es que la etiqueta esta condicionada a mostrarse o no, dependiendo de si el campo "cdtr.ctdtdtls.nm" tiene valor o no.

            <DbtrAgt>
              <FinInstnId>
              <tt:d-cond check="not-initial(ref('Cdtr.CtctDtls.NM'))" >
                <BICFI tt:value-ref=".CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.BICFI"/>
              </tt:d-cond>

                <ClrSysMmbId>

                  <MmbId tt:value-ref=".CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.ClrSysMmbId.MmbId"/>

                </ClrSysMmbId>

                <PstlAdr>

                  <Ctry tt:value-ref=".CstmrCdtTrfInitn.pmtinf.DbtrAgt.FinInstnId.PstlAdr.Ctry"/>

                </PstlAdr>

              </FinInstnId>
            </DbtrAgt>

De esta forma podemos agregar condiciones en las transformaciones, ya sea al convertir de ABAP a XML o viceversa, todo esto dependerá de las especificaciones y validaciones del sistema que esta consumiendo el XML.

Espero que esta información resulte de utilidad, déjame saber tu opinión en los comentarios !!

0
Subscribe to my newsletter

Read articles from Pedro Tenorio directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Pedro Tenorio
Pedro Tenorio