[SAP ABAP] - Get Condition from Quatation/PO Document

FUNCTION yofm_get_po_condition.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(FU_WAERS) LIKE  EKKO-WAERS
*"     VALUE(FU_KNUMV) LIKE  EKKO-KNUMV
*"     VALUE(FU_EBELP) LIKE  EKPO-EBELP
*"     VALUE(FU_KTMNG) LIKE  EKPO-KTMNG
*"     VALUE(FU_MEINS) LIKE  EKPO-MEINS
*"  EXPORTING
*"     REFERENCE(FC_UNITPRICE) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_TOTALAMOUNT) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_DISCOUNT) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_FREIGHT) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_OTHER_CHARGES) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_TAX_AMOUNT) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_TOTALAMOUNT_AP) TYPE  BP_RISK_AMNT
*"     REFERENCE(FC_TOTALGROSS_AP) TYPE  BP_RISK_AMNT
*"----------------------------------------------------------------------

  CLEAR fc_unitprice,
          fc_totalamount,
          fc_discount,
          fc_freight,
          fc_other_charges,
          fc_tax_amount,
          fc_totalamount_ap,
          fc_totalgross_ap.

  DATA ztmp(17),
         zktmng TYPE p LENGTH 13 DECIMALS 2,
         zkwert1 TYPE p LENGTH 13 DECIMALS 2,
         zkwert2 TYPE p LENGTH 13 DECIMALS 2,
         lv_rate TYPE au_amount,
         lv_waers LIKE ekko-waers.

  TYPES BEGIN OF ty_konv,
            kschl LIKE konv-kschl,
            kwert LIKE konv-kwert,
            kpein LIKE konv-kpein,
            kmein LIKE konv-kmein,
            waers LIKE konv-waers,
          END OF ty_konv.
  DATA li_konv TYPE STANDARD TABLE OF ty_konv WITH HEADER LINE.

  "Get Condition
  SELECT kschl kwert kpein kmein waers INTO TABLE li_konv
  FROM konv
  WHERE knumv fu_knumv AND
        kposn fu_ebelp.

  SORT li_konv BY kschl.
  DELETE ADJACENT DUPLICATES FROM li_konv COMPARING kschl.

  zktmng fu_ktmng.
  LOOP AT li_konv.
    IF li_konv-waers IS NOT INITIAL.
      lv_waers li_konv-waers.
    ENDIF.
    CLEAR zkwert1.
    li_konv-kwert ABSli_konv-kwert ).

    "Get Exchange Rate
*    SELECT SINGLE waerk INTO li_konv-waers
*    FROM komk WHERE knumv = fu_knumv.

    IF li_konv-waers IS INITIAL.
      li_konv-waers lv_waers.
    ENDIF.

    IF li_konv-waers NE fu_waers AND li_konv-waers IS NOT INITIAL.
      CALL FUNCTION 'YOFM_CONVERT_TAX_CURRENCY'
        EXPORTING
          p_from li_konv-waers
          p_to   fu_waers
          p_dat  sy-datum
        IMPORTING
          p_rate lv_rate.

      li_konv-kwert li_konv-kwert * lv_rate.
    ENDIF.

    WRITE li_konv-kwert CURRENCY fu_waers TO ztmp.
    PERFORM fm_string_to_number USING ztmp CHANGING zkwert1.

    IF li_konv-kschl 'YGPX'.
      fc_totalamount fc_totalamount + zkwert1.
      IF li_konv-kpein > 0.
        fc_unitprice fc_unitprice + zkwert1 / zktmng ).
      ENDIF.
    ELSEIF li_konv-kschl 'YDCA' OR li_konv-kschl 'YDCP'.
      fc_discount fc_discount + zkwert1.
    ELSEIF li_konv-kschl 'YFRA' OR li_konv-kschl 'YFRQ'.
      fc_freight fc_freight + zkwert1.
    ELSEIF li_konv-kschl 'YPPN'.
      fc_tax_amount fc_totalamount fc_discount 10.
    ELSE.
      fc_other_charges fc_other_charges + zkwert1.
    ENDIF.

  ENDLOOP.

  fc_totalamount_ap fc_totalamount fc_discount + fc_freight + fc_other_charges + fc_tax_amount.
  fc_totalgross_ap  fc_totalamount_ap / zktmng.


ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  fm_string_to_number
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FU_INPUT   text
*      -->FU_XFACTOR text
*      -->FC_OUTPUT  text
*----------------------------------------------------------------------*
FORM fm_string_to_number USING fu_input fu_xfactor CHANGING fc_output.
  DATA lw_usr01_exp LIKE usr01,
         lv_input(17).

  lv_input fu_input.

  CHECK NOT lv_input ' ' OR lv_input space ).
*  "Get User Profile
  CALL FUNCTION 'CETA_USR01_READ'
    EXPORTING
      bname     sy-uname
    IMPORTING
      usr01_exp lw_usr01_exp.

  "Convert String to Number
*  CALL FUNCTION 'ZHR_RU_STRING_TO_NUMBER'
*    EXPORTING
*      dcpfm  = lw_usr01_exp-dcpfm
*    IMPORTING
*      string = fc_output.

  IF lw_usr01_exp-dcpfm NE 'X'.
    REPLACE ALL OCCURRENCES OF '.' IN lv_input WITH ''.
    REPLACE ',' WITH '.' INTO lv_input.
  ELSE.
    REPLACE ALL OCCURRENCES OF ',' IN lv_input WITH ''.
  ENDIF.
  CONDENSE lv_input NO-GAPS.

  fc_output fu_xfactor * lv_input.


ENDFORM.                    "fm_string_to_number

Comments