J'ai un module fonction qui importe my_values
my_values
est un type de chaîne de table interne personnalisé.
Cette variable "my_values" contient par exemple: ["foo", "bar"]
Je veux sélectionner toutes les valeurs de la table Z_MYTAB
où la colonne my_col
est dans mes_valeurs.
J'ai essayé ceci:
SELECT * FROM Z_MYTAB WHERE my_col in @my_values INTO TABLE @DATA(my_rows).
Mais cela échoue avec un message d'erreur:
table my_values a une structure de ligne incorrecte
(Le message a été traduit en anglais. L'original pourrait être légèrement différent)
Je pourrais boucler sur mes_valeurs
mais j'aimerais éviter cela.
Comment faire du SQL IN
avec des variables hôtes qui sont des tables internes?
3 Réponses :
La sélection avec IN
n'est possible qu'avec un range table.
La conversion d'une table interne en table range peut se faire comme ceci:
DATA ltr_value TYPE RANGE OF string. ltr_value = VALUE #( FOR <my_value> IN my_values ( sign = 'I' option = 'EQ' low = <my_value> ) ).
IN openands peut être de 2 types:
DATA sel_tab type range of string. sel_tab = value #( for ls in my_values ( sign = 'I' option = 'EQ' low = ls ) ). SELECT * FROM Z_MYTAB WHERE my_col in @sel_tab[] INTO TABLE @DATA(my_rows).
dans ce cas aucune expression d'hôte ne peut être utilisée comme opérande droit
SELECT ... WHERE my_col IN sel_tab[]
dans ce cas sel_tab est une plage comme
Vous pouvez donc utiliser ce qui suit:
SELECT ... WHERE my_col IN ( value1, value2 , value3)
Cordialement
Faites attention que dans la première variante, il ne doit y avoir aucun espace avant value1
( IN (value1, ...)
)
J'ai essayé en 7.52 en utilisant une expression d'hôte , mais ce n'est toujours pas une syntaxe valide ( my_col IN @ (VALUE ty_range_my_col (sign = 'I' option = 'EQ' (low = 'value1') (low = 'value2'))) < / code> (toujours pas disponible en 7.53 selon la documentation)
Les expressions d'hôte ne sont pas possibles dans la première variante mais les variables d'hôte sont possibles: WHERE my_col IN (@ value1, @ value2)
(ainsi que les littéraux classiques non-hôtes IN ('foo', ' barre ')
)
L'utilisateur JozsefSzikszai m'a indiqué "SELECTIONNER POUR TOUTES LES ENTRÉES".
J'ai trouvé ceci dans la documentation:
Pour un type ligne élémentaire, le pseudo composant table_line doit être spécifié pour comp.
Voir: https: // aide .sap.com / doc / abapdocu_752_index_htm / 7.52 / fr-US / abenwhere_logexp_itab.htm
IF my_values is initial. exit. endif. SELECT * FROM Z_MYTAB FOR ALL ENTRIES IN @my_values WHERE column_name = @my_values-table_line INTO TABLE @DATA(result_rows).
Je crains que ce ne soit pas possible, après IN une plage est attendue (qui est techniquement aussi une table interne, juste la structure est donnée (signe, option, bas, haut)). Vous avez deux options: changez mes_valeurs en une plage ou au lieu de IN, utilisez FOR ALL ENTRIES avec la table my_values
@JozsefSzikszai merci pour cet indice. J'ai utilisé POUR TOUTES LES ENTRÉES maintenant, et j'ai écrit une réponse (voir ci-dessous).