SELECT dans la structure profonde
Je suis relativement nouveau dans ABAP et j'ai donc encore besoin de m'habituer aux tables internes et autres, donc actuellement, je me demande un peu comment utiliser SQL dans ABAP pour remplir une structure imbriquée.
Par exemple:
TYPES: BEGIN of <<mystructure>>,
someID type sometype,
relatedItemsInDataModel type table of sometabletype,
END of <<mystructure>>.
DATA wa type <<mystructure>>.
<<SELECT INTO STATEMENT>>
DATA(lv_json) = /ui2/cl_json=>serialize( data = wa compress abap_true ... ).
Donc, fondamentalement, j'ai une table (A) dans le dictionnaire qui a une relation un-à-plusieurs avec une autre table (B) et je veux sélectionner tous les éléments dans A et pour chaque élément dans AI, je veux sélectionner tous les éléments liés éléments en B pour cet enregistrement.
La raison pour laquelle je veux faire cela est que je veux plus tard convertir ces données en JSON ressemblant à:
[
{
"someID": "someValue",
"relatedItemsInDataModel": [{...}, {...}]
},
{
"someID": "someValue2",
"relatedItemsInDataModel": [{...}, {...}, {...}, ...]
},
...
]
Alors, est-ce que j'aborde cela de la bonne manière en premier lieu et comment puis-je réaliser ce que je viens de décrire?
Réponses
SELECTs ne récupère que les tables plates. Vous devez donc récupérer les données imbriquées en plusieurs étapes et les assembler dans le code ABAP.
Votre exemple pourrait ressembler à ceci:
DATA the_ids_i_want TYPE RANGE OF sometype.
SELECT <field-list>
FROM table_a
INTO TABLE @DATA(selection_a)
WHERE some_id IN @the_ids_i_want.
SELECT <field-list>
FROM table_b
INTO TABLE @DATA(selection_b)
WHERE parent_id IN @the_ids_i_want.
LOOP AT selection_a INTO DATA(row_a).
DATA(result_row) =
VALUE <<mystructure>>(
some_id = row_a-some_id ).
LOOP AT selection_b INTO DATA(row_b)
WHERE parent_id = row_a-some_id.
INSERT VALUE #(
field_a = row_b-field_a
... )
INTO TABLE row_a-relatedItemsInDataModel.
ENDLOOP.
ENDLOOP.
De nombreux aspects peuvent être optimisés en fonction de vos données. Par exemple, les WHEREconditions peuvent varier en fonction du type de relations de clé étrangère, vous pouvez envisager d'ajouter des clés triées à la table interne pour accélérer la LOOP ... WHERErecherche, il peut y avoir des variantes plus courtes pour l'assembly, en utilisant FORau lieu de LOOP AT, etc. - mais fondamentalement, c'est ce dont vous avez besoin.