Search This Blog

Showing posts with label vendor blocking using bapi. Show all posts
Showing posts with label vendor blocking using bapi. Show all posts

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.

Pages