0
votes

Recherche d'une sous-chaîne dans une table à cordes?

  1. J'ai une table interne avec les données suivantes ( code>): li> xxx pré>
    1. Je dois rechercher des valeurs à plusieurs reprises comme ceci ( v1 code>): li> ol> xxx pré>
      1. Je pense que les valeurs suivantes sont identifiées, qui correspondent à une ligne dans la table interne ( itab_v1_result code>): li> ol> xxx pré>

        mais comme vous pouvez le constater dans code> il y a le même code 005056b467ae1ed9b1962f12360477e9 code>, après offre / code> jusqu'à - code> symbole. p>

        MAINTENANT, je veux affecter les lignes de code> au symbole de champ code> en comparant la valeur v1 code> avec chaque ligne dans code>, mais le problème est que V1 code> n'est pas complètement identique à celui code> lignes. P>

        J'ai essayé de faire quelque chose comme ça, mais ça ne fonctionne pas, code> est toujours vide: p > xxx pré>

        Comment puis-je obtenir itab_v1_result code> pour contenir ce que j'attends? p>

        mon exemple de reproductible minimal: P>

        TYPES:
          BEGIN OF ty_content,
            attr_name TYPE string,
          END OF ty_content.
        FIELD-SYMBOLS:
          <fs_my_content> TYPE any,
          <fs_content>    TYPE ANY TABLE.
        DATA:
          itab_content   TYPE STANDARD TABLE OF ty_content,
          itab_v1        TYPE STANDARD TABLE OF string,
          itab_v1_result TYPE STANDARD TABLE OF string,
          v1             TYPE string.
        
        itab_content = VALUE #(
        ( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-A' )
        ( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-B' )
        ( attr_name = 'OFFER/005056B467AE1ED9B1962F123604D7E9-C' )
        ( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-D' )
        ( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-E' ) ).
        
        itab_v1 = VALUE #(
        ( `OFFER-A` )
        ( `OFFER-B` )
        ( `OFFER-C` )
        ( `OFFER-M` )
        ( `OFFER-L` ) ).
        
        ASSIGN itab_content TO <fs_content>.
        LOOP AT itab_v1 INTO v1.
          READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = v1.
          IF sy-subrc = 0.
            APPEND v1 TO itab_v1_result.
          ENDIF.
        ENDLOOP.
        
        " Here, itab_v1_result is empty unfortunately!?
        


5 commentaires

Pouvez-vous donner un exemple de ce que vous attendez d'où dirigez-vous le symbole de champ si v1 = 'offre-c', est-ce la ligne entière, la valeur au milieu ou quoi? Pourriez-vous également fournir un exemple de reproductible minimal s'il vous plaît? Merci (note que demander un "lien utile" est off-Topic pour débordement de pile, simplement parce que les réponses doivent être Terminer - Certains liens ne peuvent être donnés que pour soutenir la réponse).


Sandra, merci beaucoup pour votre réponse. Je vais essayer de donner un exemple et de modifier la question, peut-être qu'il serait plus compréhensible.


J'ai ajouté l'exemple reproductible minimal, afin que les gens puissent rapidement essayer de vous répondre.


Merci beaucoup, Sandra. Votre exemple est plus clair que le mien.


Notez que votre question semble être: "Comment rechercher une sous-chaîne dans une table interne". Mais votre exemple utilise une table interne dynamique, alors je sens que la question n'est pas "minimale": l'utilisation d'une table interne définie statique rendrait la question plus claire.


3 Réponses :


2
votes

Vous ne pouvez utiliser aucun opérateur autre que = dans Tableau de lecture . Mais vous pouvez les utiliser dans une boucle .

Tout d'abord, vous devez organiser votre V1 de manière à ce que CS puisse identifier, il suffit d'utiliser "-x", ce qui semble être unique. Ensuite, vous pouvez utiliser votre état dans la clause . xxx


1 commentaires

Bien que je suppose que la principale question concerne comment "rechercher une sous-chaîne dans une table interne", il existe également une petite complexité ajoutée à la question à cause de la table interne dynamique. J'ai ajouté un exemple de reproductible minimal pour soutenir la question de sorte qu'il est plus facile d'utiliser le code réel.



0
votes

Merci beaucoup à vous tous pour vos variantes de solution. C'était très utile pour moi.

Voici la solution de mon problème.

  1. Tout d'abord, nous devrions boucler à et l'attribuer au nouveau symbole de champ . .
  2. Ensuite, nous devrions obtenir attr_name du champ à partir de et attribuez-le à un autre symbole de champ
  3. Nous allons utiliser une fonction pour travailler avec la valeur de type de type , car nous affecterons à lv_attr_name .
  4. Comme nous le savons (de la description de la tâche) dans lv_attr_name serait les valeurs telles que: Offre / 005056B467AE1ED9B1962F12360477E9-A et ainsi de suite. Pour cette raison, nous trouverons la position du premier / par Rechercher () méthode à partir du début de lv_attr_name et mettez la valeur dans LV_SLASH_POSITION .

    Nous répétons cette opération pour rechercher la position du premier - après lv_slash_position lv_dash_position .

    Après cette opération, nous utiliserons la méthode remplacer () et remplacer lv_dash_position - lv_slash_position à vide vide. En fin de compte, nous obtiendrons l'offre / -a et le mettre dans lv_attr_val_string .

    à la fin, nous comparerons lv_attr_val_string < / code> et v1 , si lv_attr_val_string <> v1 Nous ne le mettrions pas à la finale itab itab_v1_result , sinon nous le ferons. xxx


0 commentaires

0
votes

Vous compliquez la solution. Pourquoi pas simplement utiliser Accès sous-chaîne ?

LOOP AT itab_v1 INTO v1.
  LOOP AT itab_content ASSIGNING FIELD-SYMBOL(<content>).
    CHECK v1(5) = <content>-attr_name(5) AND substring( val = v1 off = strlen( v1 ) - 1 len = 1 ) = substring( val = <content>-attr_name off = strlen( <content>-attr_name ) - 1 len = 1 ).
    APPEND v1 TO itab_v1_result.
  ENDLOOP.
ENDLOOP.


0 commentaires