Introducir datos en tabla

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • relojdepared
    Junior Member
    • oct
    • 5

    #1

    Introducir datos en tabla

    Hola a todos, tengo un pequeño problema:

    A traves de las tablas ekko y ekpo he creado un alv, la cosa es que quiero meter el nombre del proveedor de la tabla LFA1 (NAME1) en el alv, tengo el codigo del proveedor y al lado quiero poner el nombre, la cosa es que no se como hacerlo.

    En el codigo la parte que creo que tengo mal es la del LOOP, a parte de eso no se si tengo mas errores.

    Saludos y gracias de antemano

    Código:
    FORM data_retrieval.
    
      DATA: lt_lfa1 TYPE STANDARD TABLE OF lfa1.
    
      SELECT ekko~ebeln ekpo~ebelp ekko~aedat ekpo~matnr ekpo~menge ekpo~meins ekpo~netpr ekpo~peinh
             ekko~bukrs ekko~waers ekko~ernam ekpo~txz01 ekpo~matkl ekko~lifnr
        INTO CORRESPONDING FIELDS OF TABLE it_salida
        FROM ekpo
        INNER JOIN ekko ON ekpo~ebeln = ekko~ebeln
        WHERE ekko~ebeln IN s_ebeln AND
        ekko~aedat IN s_aedat AND
        ekpo~matnr IN s_matnr AND
        ekko~waers IN s_waers AND
        ekko~lifnr IN s_lifnr.
    
    
    
    *-----------------------------------------------------------------
      IF sy-subrc EQ 0.
        SORT it_salida.
    
        SELECT *
          FROM lfa1
          INTO CORRESPONDING FIELDS OF TABLE lt_lfa1
          FOR ALL ENTRIES IN it_salida
          WHERE lifnr EQ it_salida-lifnr.
    
        IF sy-subrc EQ 0.
          SORT lt_lfa1.
        ENDIF.
    
    
    
        LOOP AT it_salida INTO wa_salida.
          
            READ TABLE lt_lfa1 INTO lfa1 WITH KEY lifnr = wa_salida-lifnr. 
            SORT lt_lfa1.
            MODIFY it_salida FROM wa_salida INDEX sy-tabix TRANSPORTING name1.
            
            
        ENDLOOP.
  • vanesamacri
    Senior Member
    • jun
    • 146

    #2
    Buenas.

    Dentro del LOOP, la variable de sistema SY-TABIX no solamente se valoriza con cada iteración del mismo, sino también luego de cada READ TABLE, por lo que puede estar ocurriendo que al querer hacer el MODIFY, se esté intentando apuntar hacia un número de registro diferente al actual que se esté recorriendo en el bucle.

    Probá reemplazando la parte del bucle por lo siguiente:

    Código:
        SORT lt_lfa1 BY lifnr.      " Se ordena tabla por campo relevante de posterior lectura para facilitar la búsqueda binaria.
    
        LOOP AT it_salida ASSIGNING FIELD-SYMBOL(<fs_salida>).
          
            READ TABLE lt_lfa1 
            ASSIGNING FIELD-SYMBOL(<fs_lfa1>)
            WITH KEY lifnr = <fs_salida>-lifnr
            BINARY SEARCH.
    
            IF sy-subrc   IS INITIAL AND
                <fs_lfa1> IS ASSIGNED.
    
              <fs_salida>-name1 = <fs_lfa1>-name1
    
            ENDIF.
            
        ENDLOOP.
    Mediante el uso de punteros (field symbols) no hacer falta utilizar la sentencia MODIFY puesto que la asignación de valores impacta directamente en el destino que está siendo referenciado.

    Fijate si te sirve. Cualquier cosa, avisá.

    Un saludo.
    Iván

    Comentario

    • relojdepared
      Junior Member
      • oct
      • 5

      #3
      Originalmente publicado por vanesamacri
      Buenas.

      Dentro del LOOP, la variable de sistema SY-TABIX no solamente se valoriza con cada iteración del mismo, sino también luego de cada READ TABLE, por lo que puede estar ocurriendo que al querer hacer el MODIFY, se esté intentando apuntar hacia un número de registro diferente al actual que se esté recorriendo en el bucle.

      Probá reemplazando la parte del bucle por lo siguiente:

      Código:
          SORT lt_lfa1 BY lifnr.      " Se ordena tabla por campo relevante de posterior lectura para facilitar la búsqueda binaria.
      
          LOOP AT it_salida ASSIGNING FIELD-SYMBOL(<fs_salida>).
            
              READ TABLE lt_lfa1 
              ASSIGNING FIELD-SYMBOL(<fs_lfa1>)
              WITH KEY lifnr = <fs_salida>-lifnr
              BINARY SEARCH.
      
              IF sy-subrc   IS INITIAL AND
                  <fs_lfa1> IS ASSIGNED.
      
                <fs_salida>-name1 = <fs_lfa1>-name1
      
              ENDIF.
              
          ENDLOOP.
      Mediante el uso de punteros (field symbols) no hacer falta utilizar la sentencia MODIFY puesto que la asignación de valores impacta directamente en el destino que está siendo referenciado.

      Fijate si te sirve. Cualquier cosa, avisá.

      Un saludo.
      Iván
      Va perfecto, muchas gracias.

      Saludos JM

      Comentario

      • relojdepared
        Junior Member
        • oct
        • 5

        #4
        Lo he conseguido sin usar punteros, de esta forma:

        Código:
            LOOP AT gt_salida INTO gs_salida.
              gd_tabix = sy-tabix.
        
              READ TABLE lt_lfa1 INTO ls_lfa1 WITH KEY lifnr = gs_salida-lifnr.
              IF sy-subrc EQ 0.
                SORT lt_lfa1.
                gs_salida-name1 = ls_lfa1-name1.
              ENDIF.
              MODIFY gt_salida FROM gs_salida INDEX gd_tabix TRANSPORTING name1.
        
        
            ENDLOOP.

        Comentario

        Trabajando...