3
votes

Type approprié pour l'opérande OpenSQL IN

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?


2 commentaires

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).


3 Réponses :


3
votes

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> )
                    ).


0 commentaires

3
votes

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


3 commentaires

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 ') )



2
votes

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).


0 commentaires