Search This Blog

Wednesday, March 17, 2021

Vendor Blocking in SAP

 Vendor Blocking in SAP


Scenario : Block the vendor as per Last Transaction

Fields Responsible for vendor Blocking in table LFA1, LFB1, LFM1

  • SPERR
  • SPERM


Declaration of variables

DATA:LS_LFA1  TYPE LFA1,
     LS_LFB1  TYPE LFB1,
     LS_LFM1  TYPE LFM1,
     LS_YLFA1 TYPE LFA1,
     LS_YLFB1 TYPE LFB1,
     LS_YLFM1 TYPE LFM1.


DATALT_XLFAS TYPE TABLE OF  FLFAS,
      LT_XLFB5 TYPE TABLE OF  FLFB5,
      LT_XLFBK TYPE TABLE OF  FLFBK,
      LT_XLFZA TYPE TABLE OF  FLFZA,
      LT_YLFAS TYPE TABLE OF  FLFAS,
      LT_YLFB5 TYPE TABLE OF  FLFB5,
      LT_YLFBK TYPE TABLE OF  FLFBK,
      LT_YLFZA TYPE TABLE OF  FLFZA.


Bapi call

CALL FUNCTION 'VENDOR_UPDATE'
      EXPORTING
        I_LFA1  LS_LFA1
        I_LFB1  LS_LFB1
        I_LFM1  LS_LFM1
        I_YLFA1 LS_YLFA1
        I_YLFB1 LS_YLFB1
        I_YLFM1 LS_YLFM1
      TABLES
        T_XLFAS LT_XLFAS
        T_XLFB5 LT_XLFB5
        T_XLFBK LT_XLFBK
        T_XLFZA LT_XLFZA
        T_YLFAS LT_YLFAS
        T_YLFB5 LT_YLFB5
        T_YLFBK LT_YLFBK
        T_YLFZA LT_YLFZA
*       T_XKNVK =
*       T_YKNVK =
      .


  T-Code : BP 
 






complete program.

*&---------------------------------------------------------------------*
*& Report ZVENDOR_BLOCKING
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZVENDOR_BLOCKING.

TABLESLFA1LFB1BSAKBSIK.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERSP_DATE  TYPE  BUDAT OBLIGATORY DEFAULT SY-DATUM.
PARAMETERSP_LIFNR TYPE LIFNR OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
PARAMETERSR1 RADIOBUTTON GROUP D1,
            R2 RADIOBUTTON GROUP D1,
            R3 RADIOBUTTON GROUP D1,
            R4 RADIOBUTTON GROUP D1.
SELECTION-SCREEN END OF BLOCK B2.



TYPESBEGIN OF TY_FINAL,
         VENDOR           TYPE LIFNR,
         LAST_TRANSACTION TYPE BUDAT,
         DAYS             TYPE PEA_SCRDD,
         FLAG             TYPE C,
         STATUS(7)        TYPE C,
       END OF TY_FINAL.

DATACURRENT_DATE LIKE  P0001-BEGDA,
      DOC_DATE     LIKE  P0001-BEGDA,
      DAYS         TYPE  PEA_SCRDD.
DATAIT_FINAL TYPE TABLE OF TY_FINALWA_FINAL TYPE TY_FINAL.
DATAIT_BSAK2 TYPE TABLE OF BSAK.
DATAIT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.


DATA:LS_LFA1  TYPE LFA1,
     LS_LFB1  TYPE LFB1,
     LS_LFM1  TYPE LFM1,
     LS_YLFA1 TYPE LFA1,
     LS_YLFB1 TYPE LFB1,
     LS_YLFM1 TYPE LFM1.


DATALT_XLFAS TYPE TABLE OF  FLFAS,
      LT_XLFB5 TYPE TABLE OF  FLFB5,
      LT_XLFBK TYPE TABLE OF  FLFBK,
      LT_XLFZA TYPE TABLE OF  FLFZA,
      LT_YLFAS TYPE TABLE OF  FLFAS,
      LT_YLFB5 TYPE TABLE OF  FLFB5,
      LT_YLFBK TYPE TABLE OF  FLFBK,
      LT_YLFZA TYPE TABLE OF  FLFZA.

CURRENT_DATE P_DATE.  " Set system date
CONSTANTS:
          C_X   TYPE CHAR1 VALUE 'X'   .

START-OF-SELECTION.

  PERFORM FETCH_DATA.
  PERFORM DISPLAY.



*&---------------------------------------------------------------------*
*& Form FETCH_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FETCH_DATA .


  SELECT
        A~LIFNR,
        B~KTOKK
                 FROM LFB1 AS A INNER JOIN  LFA1 AS B  ON A~LIFNR EQ B~LIFNR INTO TABLE @DATA(T_LFB1)
  WHERE A~BUKRS '1000' AND  B~KTOKK NE 'E001' AND  B~KTOKK NE 'E002' AND  B~KTOKK NE 'E003'  AND A~LIFNR @P_LIFNR.

  IF SY-SUBRC 0.

    SELECT
      LIFNR,
      BUDAT
    FROM BSAK INTO TABLE @DATA(IT_BSAKFOR ALL ENTRIES IN @T_LFB1  WHERE LIFNR @T_LFB1-LIFNR AND BUKRS '1000' .

    SELECT
      LIFNR,
      BUDAT
    FROM BSIK INTO TABLE @DATA(IT_BSIKFOR ALL ENTRIES IN @T_LFB1 WHERE LIFNR @T_LFB1-LIFNR AND BUKRS '1000' .

    LOOP AT IT_BSIK INTO DATA(WA_BSIK).
      APPEND WA_BSIK TO IT_BSAK.
      CLEARWA_BSIK.
    ENDLOOP.

    REFRESH  IT_BSIK.

    SORT IT_BSAK BY LIFNR DESCENDING   BUDAT DESCENDING.
    DELETE ADJACENT DUPLICATES FROM IT_BSAK COMPARING LIFNR.

  ENDIF.

  """""""""""""""""""""""""""""""""""""""""""""""'  CALCULATE DATE DIFFERENCE

  LOOP AT IT_BSAK INTO DATA(WA_BSAK).

    CALL FUNCTION 'HR_HK_DIFF_BT_2_DATES'
      EXPORTING
        DATE1                       CURRENT_DATE
        DATE2                       WA_BSAK-BUDAT
        OUTPUT_FORMAT               '02'
      IMPORTING
*       YEARS                       =
*       MONTHS                      =
        DAYS                        DAYS
      EXCEPTIONS
        OVERFLOW_LONG_YEARS_BETWEEN 1
        INVALID_DATES_SPECIFIED     2
        OTHERS                      3.
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.

    WA_FINAL-VENDOR WA_BSAK-LIFNR.
    WA_FINAL-LAST_TRANSACTION WA_BSAK-BUDAT.
    WA_FINAL-DAYS DAYS.
    APPEND WA_FINAL TO IT_FINAL.
    CLEARWA_FINALDAYSWA_BSAK.
  ENDLOOP.

  IF R1 'X'.
    LOOP AT IT_FINAL INTO WA_FINAL.
      IF WA_FINAL-DAYS > 90.
        WA_FINAL-FLAG 'X'.
        MODIFY IT_FINAL INDEX SY-TABIX FROM  WA_FINAL TRANSPORTING FLAG.
        CLEAR WA_FINAL.
      ENDIF.
    ENDLOOP.

  ELSEIF R2 'X'.
    LOOP AT IT_FINAL INTO WA_FINAL.
      IF WA_FINAL-DAYS > 180.
        WA_FINAL-FLAG 'X'.
        MODIFY IT_FINAL INDEX SY-TABIX FROM  WA_FINAL TRANSPORTING FLAG.
        CLEAR WA_FINAL.
      ENDIF.
    ENDLOOP.


  ELSEIF R3 'X'.
    LOOP AT IT_FINAL INTO WA_FINAL.
      IF WA_FINAL-DAYS > 270.
        WA_FINAL-FLAG 'X'.
        MODIFY IT_FINAL INDEX SY-TABIX FROM  WA_FINAL TRANSPORTING FLAG.
        CLEAR WA_FINAL.
      ENDIF.
    ENDLOOP.

  ELSEIF R4 'X'.
    LOOP AT IT_FINAL INTO WA_FINAL.
      IF WA_FINAL-DAYS > 360.
        WA_FINAL-FLAG 'X'.
        MODIFY IT_FINAL INDEX SY-TABIX FROM  WA_FINAL TRANSPORTING FLAG.
        CLEAR WA_FINAL.
      ENDIF.
    ENDLOOP.

  ENDIF.

  DELETE IT_FINAL WHERE FLAG NE 'X'.
  DATAIT_LFA1 TYPE TABLE OF LFA1,  WA_LFA1 TYPE LFA1,
        IT_LFB1 TYPE TABLE OF LFB1,  WA_LFB1 TYPE LFB1,
        IT_LFM1 TYPE TABLE OF LFM1,  WA_LFM1 TYPE LFM1.


  SELECT FROM LFA1 INTO TABLE IT_LFA1  FOR ALL ENTRIES IN IT_FINAL WHERE  LIFNR IT_FINAL-VENDOR .
  SELECT FROM LFB1 INTO TABLE IT_LFB1  FOR ALL ENTRIES IN IT_FINAL WHERE  LIFNR IT_FINAL-VENDOR .
  SELECT FROM LFM1 INTO TABLE IT_LFM1  FOR ALL ENTRIES IN IT_FINAL WHERE  LIFNR IT_FINAL-VENDOR .

  LOOP AT IT_FINAL INTO WA_FINAL.

    READ TABLE IT_LFA1 INTO WA_LFA1 WITH KEY LIFNR WA_FINAL-VENDOR.
    IF SY-SUBRC 0.
      WA_LFA1-SPERR 'X'.
      WA_LFA1-SPERM 'X'.
      MOVE-CORRESPONDING WA_LFA1 TO LS_LFA1.
    ENDIF.

    READ TABLE IT_LFB1 INTO WA_LFB1 WITH KEY LIFNR WA_FINAL-VENDOR.
    IF SY-SUBRC 0.
      WA_LFB1-SPERR 'X'.
*      WA_LFB1-SPERM = 'X'.
      MOVE-CORRESPONDING WA_LFB1 TO LS_LFB1.
    ENDIF.

    READ TABLE IT_LFM1 INTO WA_LFM1 WITH KEY LIFNR WA_FINAL-VENDOR.
    IF SY-SUBRC 0.
*      WA_LFM1-SPERR = 'X'.
      WA_LFM1-SPERM 'X'.
      MOVE-CORRESPONDING WA_LFM1 TO LS_LFM1.
    ENDIF.

    CALL FUNCTION 'VENDOR_UPDATE'
      EXPORTING
        I_LFA1  LS_LFA1
        I_LFB1  LS_LFB1
        I_LFM1  LS_LFM1
        I_YLFA1 LS_YLFA1
        I_YLFB1 LS_YLFB1
        I_YLFM1 LS_YLFM1
      TABLES
        T_XLFAS LT_XLFAS
        T_XLFB5 LT_XLFB5
        T_XLFBK LT_XLFBK
        T_XLFZA LT_XLFZA
        T_YLFAS LT_YLFAS
        T_YLFB5 LT_YLFB5
        T_YLFBK LT_YLFBK
        T_YLFZA LT_YLFZA
*       T_XKNVK =
*       T_YKNVK =
      .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT C_X.

    IF SY-SUBRC 0.
      WA_FINAL-STATUS 'BLOCKED'.
      MODIFY IT_FINAL INDEX SY-TABIX FROM WA_FINAL TRANSPORTING STATUS.
    ENDIF.

    CLEAR WA_FINALWA_LFA1WA_LFB1WA_LFM1 .
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM DISPLAY .

  PERFORM CREATE_FCAT.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM SY-REPID
      IT_FIELDCAT        IT_FIELDCAT
      I_DEFAULT          'X'
      I_SAVE             'X'
*     IS_LAYOUT          = IT_LAYOUT
    TABLES
      T_OUTTAB           IT_FINAL[]
    EXCEPTIONS
      PROGRAM_ERROR      1
      OTHERS             2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_FCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM CREATE_FCAT .
  WA_FIELDCAT-FIELDNAME  'VENDOR'.
  WA_FIELDCAT-TABNAME   'IT_FINAL'.
  WA_FIELDCAT-OUTPUTLEN '15'.
  WA_FIELDCAT-SELTEXT_M  'VENDOR'.
  APPEND WA_FIELDCAT TO IT_FIELDCAT.
  CLEAR WA_FIELDCAT.

  WA_FIELDCAT-FIELDNAME  'LAST_TRANSACTION'.
  WA_FIELDCAT-TABNAME   'IT_FINAL'.
  WA_FIELDCAT-OUTPUTLEN '25'.
  WA_FIELDCAT-SELTEXT_M  'LAST TRANSACTION'.
  APPEND WA_FIELDCAT TO IT_FIELDCAT.
  CLEAR WA_FIELDCAT.


  WA_FIELDCAT-FIELDNAME  'DAYS'.
  WA_FIELDCAT-TABNAME   'IT_FINAL'.
  WA_FIELDCAT-OUTPUTLEN '15'.
  WA_FIELDCAT-SELTEXT_M  'DAYS'.
  APPEND WA_FIELDCAT TO IT_FIELDCAT.
  CLEAR WA_FIELDCAT.

  WA_FIELDCAT-FIELDNAME  'STATUS'.
  WA_FIELDCAT-TABNAME   'IT_FINAL'.
  WA_FIELDCAT-OUTPUTLEN '15'.
  WA_FIELDCAT-SELTEXT_M  'STATUS'.
  APPEND WA_FIELDCAT TO IT_FIELDCAT.
  CLEAR WA_FIELDCAT.
ENDFORM.

No comments:

Post a Comment

Pages