Relacion Pedido Entrega Factura SD

Buenos tardes amigos, un cordial saludo a la comunidad, hoy traigo una duda en el mundo ABAP,
Se requiere desarrollar un reporte que visualice Pedido Entrega Factura

La idea general que tengo es 3 tablas internas: dos de información y 1 de resumen
Una tabla interna 1 para guardar información pedido.

types: BEGIN OF st_pedido_entrega,
        VBELN TYPE VBELN, "Documentos Comercial Todos
        VKORG TYPE VKORG,
        NAME1 TYPE NAME,
        VBTYP TYPE VBTYP,
        KUNNR TYPE KUNNR,
        POSNR TYPE POSNR,
        VBELV TYPE VBELN, "Documentos Comercial Todos
        POSNV TYPE POSNR,
        VBTYP_N TYPE VBTYP,
        POSNN TYPE POSNR,
        GBSTK TYPE GBSTK,
        BSTNK TYPE BSTNK,
        ERDAT TYPE ERDAT,
        BSTDK TYPE DATUM,
        LIGHTS TYPE C,

END OF st_pedido_entrega.

Una tabla 2 para guardar información entrega.

types: BEGIN OF st_entrega_factura,
        VBELN TYPE VBELN, "Documentos Comercial Todos
        POSNR TYPE POSNR,
        VBELV TYPE VBELN, "Documentos Comercial Todos
        POSNV TYPE POSNR,
        VBTYP_N TYPE VBTYP,
        POSNN TYPE POSNR,
        LIGHTS TYPE C,
        ERDAT TYPE ERDAT,
        WADAT_IST TYPE DATUM,
        FKDAT TYPE DATUM,
        BLDAT TYPE DATUM,
END OF st_entrega_factura.

Una tercera Tabla para reunir las dos tablas anteriores

types: BEGIN OF st_reporte,
           KUNNR TYPE KUNNR,
           VBELN TYPE VBELN,
           POSNV TYPE POSNR,
           VBELN2 TYPE VBELN,
           VBELN3 TYPE VBELN,
           BSTNK TYPE BSTNK,
              LIGHTS TYPE C,
          GBSTK TYPE GBSTK,
          ERDAT TYPE ERDAT,
          NAME1 TYPE NAME,
          ERDAT2 TYPE ERDAT,
           WADAT_IST TYPE DATUM,
           FKDAT TYPE DATUM,
            BSTDK TYPE DATUM,
BLDAT TYPE DATUM,
END OF st_reporte.

Hacer la búsquedas respectivas.

SELECT a~KUNNR a~VKORG a~VBTYP a~BSTNK a~ERDAT a~VBELN
 b~VBELV b~POSNV b~VBELN b~VBTYP_N
c~GBSTK
 e~KUNNR e~NAME1
g~BSTDK
INTO CORRESPONDING FIELDS OF TABLE it_pedido
FROM VBAK AS a
INNER JOIN VBFA AS b ON a~VBELN = b~VBELV
INNER JOIN VBUK AS c ON a~VBELN = c~VBELN
INNER JOIN KNA1 AS e ON a~KUNNR = e~KUNNR
INNER JOIN VBKD AS g ON a~VBELN = g~VBELN
WHERE  VKORG IN SO_ORG  AND VBTYP_n = 'J'  AND a~VBELN in SO_PED AND a~KUNNR IN SO_CLIE AND a~VBTYP = 'C'.
SORT it_pedido ASCENDING BY vbelN.


SELECT f~VBELN f~WADAT_IST f~BLDAT f~WADAT_IST f~FKDAT
 g~VBELV g~POSNV g~VBELN g~VBTYP_N
INTO CORRESPONDING FIELDS OF TABLE it_entrega
   FROM LIKP AS f
  INNER JOIN VBFA AS g ON f~VBELN = g~VBELV
   WHERE VBTYP_N = 'M'.

Llenar la tabla 3

SORT  it_entrega BY VBELN.
 LOOP AT  it_pedido.
   "   CLEAR it_entrega.
      READ TABLE it_entrega WITH KEY VBELV = it_pedido-VBELN.

        IF SY-SUBRC EQ 0.
        it_reporte-KUNNR = it_pedido-KUNNR.
        it_reporte-VBELN = it_pedido-VBELV.
        it_reporte-VBELN2  = it_entrega-VBELV.
        it_reporte-VBELN3  = it_entrega-VBELN.
        it_reporte-GBSTK = it_pedido-GBSTK.
        it_reporte-BSTNK = it_pedido-BSTNK.
        it_reporte-LIGHTS = it_pedido-LIGHTS.
        it_reporte-ERDAT = it_pedido-ERDAT.
        it_reporte-NAME1 = it_pedido-NAME1.
        it_reporte-ERDAT2 = it_entrega-ERDAT.
        it_reporte-WADAT_IST = it_entrega-WADAT_IST.
        it_reporte-FKDAT = it_entrega-FKDAT.
        ENDIF.
        APPEND it_reporte.

 ENDLOOP.

SORT it_reporte ASCENDING BY VBELN VBELN2.
DELETE ADJACENT DUPLICATES FROM it_reporte COMPARING VBELN VBELN2

Que ocurre muestra toda la información correctamente pero no muestra los pedidos que aun no tiene Entrega o en su defecto Factura.

Hola,

Habria que debuguear un poco, ver que esté trayendo toda la informacion en los selects, pero si lo que esta fallando es que no muestra toda la informacion cuando no tiene entrega, quizas sea por esto:
READ TABLE it_entrega WITH KEY VBELV = it_pedido-VBELN.

    **IF SY-SUBRC EQ 0.**
    it_reporte-KUNNR = it_pedido-KUNNR.
    it_reporte-VBELN = it_pedido-VBELV.
    it_reporte-VBELN2  = it_entrega-VBELV.
    it_reporte-VBELN3  = it_entrega-VBELN.
    it_reporte-GBSTK = it_pedido-GBSTK.
    it_reporte-BSTNK = it_pedido-BSTNK.
    it_reporte-LIGHTS = it_pedido-LIGHTS.
    it_reporte-ERDAT = it_pedido-ERDAT.
    it_reporte-NAME1 = it_pedido-NAME1.
    it_reporte-ERDAT2 = it_entrega-ERDAT.
    it_reporte-WADAT_IST = it_entrega-WADAT_IST.
    it_reporte-FKDAT = it_entrega-FKDAT.
    **ENDIF.**
    APPEND it_reporte.

Yo le sacaria la verificacion del sy-subrc para que ponga los campos, ya sea tenga registro en la tabla de entregas o no.

Saludos!

1 me gusta

Que tal @Jesus_Escobar tengo la impresión que este filtro es el que te esta ocasionando el comportamiento que indicas. Comenta el Where y ejecútalo de nuevo para observar el resultado.

Saludos.

Hola @Jesus_Escobar, que tal si simplemente usas el modulo de función RV_ORDER_FLOW_INFORMATION

Este post que indico a continuación tiene la explicación de como usar la función, a mi me permitio reducir una búsqueda de mas de 1200 líneas de código, a menos de 200 líneas al final. Voy a tomar en cuenta hacer aquí un tutorial.

ht_ps://sapfxpro.blog/2018/04/10/como-obtener-el-flujo-de-documentos-desde-un-programa-abap/

1 me gusta

Hola @Jesus_Escobar

Aqui esta el problema:

SELECT a~KUNNR a~VKORG a~VBTYP a~BSTNK a~ERDAT a~VBELN
b~VBELV b~POSNV b~VBELN b~VBTYP_N
c~GBSTK
e~KUNNR e~NAME1
g~BSTDK
INTO CORRESPONDING FIELDS OF TABLE it_pedido
FROM VBAK AS a
INNER JOIN VBFA AS b ON a~VBELN = b~VBELV
INNER JOIN VBUK AS c ON a~VBELN = c~VBELN
INNER JOIN KNA1 AS e ON a~KUNNR = e~KUNNR
INNER JOIN VBKD AS g ON a~VBELN = g~VBELN
WHERE VKORG IN SO_ORG AND VBTYP_n = ‘J’ AND a~VBELN in SO_PED AND a~KUNNR IN SO_CLIE AND a~VBTYP = ‘C’.
SORT it_pedido ASCENDING BY vbelN.

Al utilizar INNER JOIN VBFA estas condicionando que los pedidos de la tabla VBAK deben existir en la tabla VBFA que son las facturas, si necesitas que te muestre los pedidos sin importar que tengan factura o no debes utilizar LEFT OUTER JOIN

@sconoredhot saludos, lo intente pero no funciona, la condición persiste.

1 me gusta

@farosales viendo tu respuesta creo que por ahí va la cosa, quizás mañana intente nuevamente con tu solución hoy estuve un poco liado con otras actividades.

Gracias por tu tiempo.
Saludos.

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.