Guarda dados XML numa ST (Simple Transformation)
2019-04-01
No outro dia estava a aprender sobre ST (Simple Transformations) e lembrei-me que, ainda que tenha sido desenvolvida para transformar dados, é uma forma práctica de guardar dados XML.
Temos o seguinte XML:
<cocktails>
<cocktail id="gt" nome="Gin Tonic"/>
<cocktail id="ws" nome="Whiskey Sour"/>
<cocktail id="cl" nome="Campari Laranja"/>
</cocktails>
A forma de o guardar numa ST é envolvê-la da seguinte forma:
<xsl:transform version="1.0"
xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
xmlns:sap="https://www.sap.com/sapxsl">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<cocktails>
<cocktail id="gt" name="Gin Tónico"/>
<cocktail id="ws" name="Whiskey Sour"/>
<cocktail id="cl" name="Campari Laranja"/>
</cocktails>
</xsl:template>
</xsl:transform>
E depois lê-la para uma STRING assim:
DATA: xml_str TYPE string.
xml_str = |<x/>|.
CALL TRANSFORMATION zcocktail_data
SOURCE XML xml_str
RESULT XML xml_str.
E agora temos o XML numa variável do tipo STRING. Nota: é apenas importante que o XML_STR de entrada seja um XML válido ainda que vá ser ignorado.
Se quisermos converter o XML numa tabela interna basta usar outra ST simples:
<?sap.transform simple?>
<tt:transform
xmlns:tt="https://www.sap.com/transformation-templates"
xmlns:ddic="https://www.sap.com/abapxml/types/dictionary"
xmlns:def="https://www.sap.com/abapxml/types/defined">
<tt:root name="T_COCKTAIL" type="ddic:ZCOCKTAIL_T"/>
<tt:template>
<cocktails>
<tt:loop ref=".T_COCKTAIL">
<cocktail>
<tt:attribute name="id" value-ref="ID"/>
<tt:attribute name="name" value-ref="NAME"/>
</cocktail>
</tt:loop>
</cocktails>
</tt:template>
</tt:transform>
E depois chamar o seguinte comando para converter o XML na tabela intena:
DATA: t_cocktail TYPE zcocktail_t.
CALL TRANSFORMATION zcocktail_itbl
SOURCE XML xml_str
RESULT constants = t_cocktail.
E aqui está uma forma pouco ortodoxa mas práctica e simples de guardar dados sem ter de recorrer à base de dados.
O Abapinho saúda-vos.