Jul 21, 2014

Major Lessons Learnt from BW 7.30 Upgrade


Dear SAP BW-ers,

It's about journey when upgrading to BW 7.30 SP05 from BW 7.01 SP07.
Whatever written below is purely an opinion and may not be best practice.

It has been a painful project yet rewarding since this will enable the BW to be on HANA and have much better integration with other Business Objects tools.

Data Modelling Issue
·         There is a new data validation check procedure in BW 7.30, some of our daily batch jobs fails because of this new behavior. We have to remove conversion routine in 0TCTTIMSTMP and also write an ABAP routine to do the conversion during data loading. The same thing happened for 0WBS_ELEMT, we wrote a routine to fix this thing as well.

·         Cannot activate an InfoSource after the upgrade, run program RS_TRANSTRU_ACTIVATE_ALL in debugging mode and set the value of the parameter "v_without" to "x".

·         3.x DBConnect Data source stopped working after upgrade, needs to be regenerated because it was corrupted after the upgrade Go-Live

B WA Issue
·         If you are running on BWA 7.20 lower than revision 22, please set the query properties back into using Individual access instead of Standard/Cluster access. You can also do mass maintenance of every queries in an InfoProvider in transaction RSRT. If you don't do this you will be having major performance problem, for example a query that used to take 9 secs before upgrade will come back in 800 seconds if the cluster access is enabled.

Reporting Issue
·         Error #2032 because of dashboard crosstab data binding, we experienced this with most query that has 0CALDAY. You have to remove the 0CALDAY and then put it back again in the query so that the BICS connection will be refreshed from the query to the dashboard.

·         UOM conversion issue after the upgrade for some query, implements this SAP Note 1666937 to solve the issue.

·         Cell defined value was not impacted by scaling factor in BW 7.01, but in BW 7.30 it does. We have to make lots of adjustment in few queries because of this.

·         A condition on a hidden key figures no longer supported in BW 7.30, again some queries has to be adjusted because of this.

·         Dashboard Design 4.0 cannot be connected to BW 7.30 system until we upgrade SAP GUI version to 7.20 SP10.

This is the list of major issues that we encountered so far a week after Go-Live; hope that this will help your journey. I personally say to run the upgrade better we need to have a copy of production right before the upgrade and do the heavy testing few times and involve the business when doing so. You will then expect only few minor issues during the go-live.

Jul 14, 2014

How to handle Year Wise Cubes in a Multiprovider


Applies to: Up to BI 7.0

Introduction

                 After the BW implementation is over in any client, the data from the Source systems will keep on extracting to BW system on a daily basis. The size of the data volume increases day by day incrementally. This fills up(accumulates) all our Infocubes what we have developed in our Data Mart Layer over a period of time. Then the question of maintenance will come into the picture. That's exactly, I am going to demonstrate about the steps and Strategy to handle it.

Disadvantages with the current Infocubes

  • Large data volumes in Cubes, which leads to higher administration efforts
  • Dropping and Creating indices takes longer times which can delay process chains
  • Aggregates Roll-up will be longer
  • Attribute Change run takes substantial time during Master data loads
  • Reporting performance will be a big question
  • Recreating Aggregates may require every now & then to meet reporting performance.
  • Initial Fill up will take substantial times to fill up new aggregates
  • Adhoc Querying during Year Ends will be tough, while fetching data from bigger Cubes/Aggregates

                 I am sharing my current Data Mart Layer which is under a Multiprovider. The Go-Live had happened in 2008.This tells you that the data is available from 2008 to till date in our Infocubes. Our implementation partner had created Year wise Cubes like below.

Yearwise MP.JPG

                This above Layer has been serving good so far. Because our data volume is able to adjust with the available cubes. Now the data volume has substantially hiked since 2012 on wards. The data volume is roughly around 13 Crores records in (2012 and 2013) Cube. The previous years data was also some big figure. We have other small cubes in the Multiprovider also. Hope you got the bottle neck situation now.

                I have proposed a solution to overcome above mentioned all disadvantages. Archiving is not possible in my case as it is against our management policy. But we are trying our best to convince the management to get the approvals . So I have made a proposal to organize all years data as per the extent of usage. You could see "Very Less usage" and "Mostly Used in Trend Analysis" in the above figure for your understanding.

                Strategy 1 :
I have proposed to club the older years cubes by keeping the extent of usage in mind. Usually we do Trend Analysis by considering Last Year and Current year figures. Some companies may go with last 3 years also, depends up on the client's requirement.

                                                                      My Proposed Dart Mart LayerYearwise MP1.JPG

      � �          I have clubbed 2008 to 2011 into a single Infocube as it is hardly used for business analysis. If you have observed, I have split  (2012 & 2013) Cube into separate Cube for each year. Because, As I stated in the beginning, I have 13 Crore records for both years in a single Cube. It has been observed that reports are running slower when the users do trend analysis, as we approach towards the year end.

                 Eventually, we will have to club 2012, 2013 and 2014(may be) into a single Infocube when the importance of that period is very less. The whole idea is to merge older Cubes as the time passes by based on the importance and usage of data by Business Analysts.

Advantages of this Strategy

  • Lower Administration efforts by focusing on  current Cubes
  • Faster dropping and re-building indices during data loads
  • Trend Analysis can be done quickly
  • All the other disadvantages (which are mentioned in the beginning) can be overcome by this approach

Steps to carry out this entire activity without disturbing the existing setup

  1. Draw flow charts like above in a white paper. So that you will have great idea on what you are going to do in your system
  2. Take any one year Cube and make 4 copies(only Structures) as per the second image
  3. Do not forget to partition these new cubes according to the respective years by 0calmonth. Because, the copied Cubes will have old partitions based on first image. This is a key step to organize your data systematically
  4. Note: We have EDW Layer(Central DSO which is our total warehouse) under Data Mart Layer. So I will be uploading data to these new Cubes from the central DSO
  5. Copy the transformation bet ween DSO and existing Cube(any year, because transformation is uniform for all year wise Cubes) to the DSO and New Cubes
  6. Create Full load DTPs for all new Cubes and load all the respective Cubes by chunks
  7. Copy the existing Multiprovider with a new technical name and extend the description by "Back up".
                    
         Strategy 2 :  The idea in copying is, I will detach the existing year wise Cubes from the original Multiprovider and add the new year wise Cubes to the original Multiprovider(make sure assignments are done to the new cubes). By this, we need not to wo rry about our Bex Queries, WAD and Portal. Because, all the Queries which are based on the existing Multiprovider will continue to run as usual. The only difference is, the data will be retrieved from the new year wise Cubes. This strategy will completely avoid the risk of touching front-end.

  8.   Regenerate all your Queries in RSRT to refresh them from the database level. This will ensure all your queries will fetch data from the new Cubes
  9.   Make sure to change the 0INFOPROV restriction to the new Cubes in your queries, if any
10.   Modify all your Process Chains with the new Cube variants
11.   Verify the data thoroughly in your Portal Report s by comparing with the data display of you Back Up Multiprovider with same Query restrictions/Filters etc..
12.   You can also verify the data by copying Queries from your main Multiprovider to Back up Multiprovider by using RSZC
13.   Observe your Portal reports for 2-3 days by comparing with the Back up Multiprovider. If everything is ok, then you can drop all the old Cubes

Conclusion

                 This is a pure Production Support/maintenance activity, which will have to be taken up over a period of time. As Archiving is not in my scope, I have proposed above ideas and implemented the same.

Jul 8, 2014

Data Functions in Bex Query Designer


Hi All,

I have made an attempt to explain some of the data functions which can be used as operands when we define formula or Calculated Key Figure

1) COUNT()
 
      This data function is used when we would like to display value of the count made and it returns value 1 if the is <> 0, otherwise it would return
      value as 0
      Eg: To display Count of Open Sales orders.

2) DATE
   
    The value is seen as the number of days from 01.01.0000 onwards and is output as a date.
    The value can be between 0 and one million, which results in a date between 01.01.0000 and 27.11.2738.

3) NDIV()
  
   It is used when we do some calculations based on division taking into account numerator and denominator. This function returns value 0 if the expression causes a division by 0, otherwise the result is the value of the expression. This is used to avoid error messages or so that we can continue to calculate with a defined result.
  E.g: NDIV{5/(2-2)} would result value as 0.

4) NOERR()

    Returns 0 if the calculation of

  E.g: NOERR(sqrt(-1)) = 0

5) SUMCT ;  

Returns the result of the operand to all rows or columns

Example table for operator SUMCT
YearRegionSalesSUMCT "Sales"
1999North3060

South3060

Result for 199960180
2000North60120

South60120

Result for 2000120180
Overall Result

180180

6) SUMGT
Returns the overall result of the operand
Example table for operat or SUMGT
YearRegionSalesSUMGT "Sales"
1999North30180

South30180

Result for 199960180
2000North60180

South60180

Result for 2000120180
Overall Result

180180

7) TIME  
The TIME operator takes any key figure or (partial) formula and makes a key figure of type TIME
For example, the formula is then TIME(Sales).
The system cuts off the decimal places, interprets the value as seconds, and displays the value in format +-hh:mm:ss. For example, 4812 is displayed as 1:20:12

Jul 3, 2014

Some key points about SAP HANA Technology & Architecture


The term SAP HANA is used for both (in-memory) database and an application platform.
SAP HANA is a platform offered as both an appliance and a cloud service.

SAP HANA in-memory database is a specialized database with following features
  • All the read & write operations, take place in memory.
  • Data can be stored both in row and column format.
  • Every column is a secondary index and there is no need to maintain separate indexes.
  • It has a much better Data compression as data from the same column can be stored together
  • It utilizes distributive, multiprocessing & massive parallel processing capabilities of modern CPUs.

It comes with a tightly integrated lightweight application server out-of-the-box, SAP HANA XS or Extend ed Application Services. SAP HANA XS is esigned/engineered specificly for SAP HANA database and is closely integrated with it to take care of
  • validation logic
  • control flow logic
  • service enablement logic
as most of
  • calculation logic
  • data-intensive processing
are pushed down into the database layers to leverage the power of the features mentioned above.

HANA Extended Application Services uses
  • server-side JavaScript as the main programming language 
  • supports REST-based OData services with both JSON and Atom XML rendering
using which complex transnational business applications can be build.

Data-intensive logic can be written in
    SQL and SQL Script and

  • it also has built-in support for XML for Analysis (XMLA) and Multidimensional Expression language (MDX) access for analytics.
  • Jun 30, 2014

    FI-AP Data Extraction to BW using 0FI_AP_4, 0FI_AP_6 and 0FI_AP_7 DataSources. Parked Documents


    1      Scope:

    From the Functional Specs it was derived that Business required reporting on the AP Line Item Data, Transaction Figures and Payment history along with some Vendor Master Data.
    The following standard DataSources were identified which could address the basic extraction need.
    • 0FI_AP_4: Vendors: Line Items with Delta Extrcation
    • 0FI_AP_6: Vendor Sales Figures via Delta Extraction
    • 0FI_AP_7: Vendor SGL Sales Figures using Delta Extraction
    • ZFI_AP_4: Vendors: Line Items (Parked Documents)

    Details on the DataSources are available at the following URL Customer / Vendor Analysis

    2      R/3 DataSource Customizations:

    2.1    Applicable SAP Notes

    Customizations were carried out based on the following SAP Notes.
    • Note 410797 - FI line item extraction transfer to new DataSources:
             If using earlier versions of FI-AP Line Item DataSources like 0FI_AP_3, this note has to be applied.
    • Note 410799 - Enhancement of line item extraction FI-GL, FI-CIS, FI-CIS
             Implemented for 0FI_AP_4 DataSource customization.
    • Note 551044 - Detaching the extractors for the InfoSources 0FI_xx_4.pdf
             Already available as part of BI 7.0
    • Note 991429 - Minute Based extraction enhancement for 0FI_xx_4 extractors
             Implem ented to enable Minute Based Extraction. Changes are already available as part of BI 7.0, only need to enable flag and modify table Index.
    • Note 1012874 - FAQ extractors 0FI_AP_* 0FI_AR_* 0FI_GL_* (except 10)
    • Note 411758 - Extracting noted item

    2.2    0FI_AP_4 Customization

    0FI_AP_4 extracts data from the table BSIK (Open Items) and BSAK (Cleared Items). As per Note 410799, the Structure CI_BSIK was created to include the additional fields. The structure gets automatically included in the main structure DTFIAP_3. Since the source of data for these additional fields were not from BSIK/BSAK, we had to write ABAP code to bring in the data by implementing the BTE 00005121. The function module ZBWFI_FILL_CI_00005021 was created to be invoked by the BTE for this purpose. The module holds the necessary ABAP Code for data extraction for the additional fields. An entry was made in the table TPS31 for the BTE 00005021. The function group ZBWFI4 [BW FI: Functions to fill FI_XX_4 CI flds] was created and used.
    Limitations: The following FI Document Types are not extracted by 0FI_AP_4 DataSource – Parked Documents & Noted Items. Noted Items can be extracted by further implementing SAP Note 411758.


    2.3    0FI_AP_6 Customization

    0FI_AP_6 extracts data from the table LFC1 [Vendor master (transaction figures)]. No customization was requested.


    2.4    0FI_AP_7 Customization

    0FI_AP_7 extracts data from the table LFC3 [Vendor master (special G/L transaction figures)]. No customization was requested.


    2.5    ZFI_AP_4 Creation

    For Parked documents extraction from SAP, we have created the DataSource ZFI_AP_4 to extract the data from ECC. This is based on a Database view ZVBSEGK. To accommodate the additional fields an Append Structure ZAZOXDAE0290 was created for the Extract Structure ZOXDAE0290 from the interface of RSA6. The data for the additional fields are sourced from various tables by implementing the code in CMOD.


    2.6    Settings in R/3

    Following are the settings that are maintained in R/3 for the Extraction to work properly.
    Table: TPS31
    PROCSLANDAPPLKFUNCT
    5010


    FBW4_WRITE_CHANGE_QUEUE
    5010

    FI-CFDM_COLL_WRITE_CHANGE_QUEUE
    5010

    UKMUKM_EVENT_5010
    5011


    BWFIP_WRITE_AEDAT_POINTER
    5012


    BWFI2P_WRITE_AEDA2_POINTER
    5013


    BWFI3P_WRITE_AEDA3_POINTER
    5021


    ZBWFI_FILL_CI_00005021
    5022


    ZBWFI_FILL_CI_00005022

    *** If you delete the last initialization selection in the source system for the InfoSources 0FI_*_4 in the BW system Administrator Workbench, the entry from table TPS31 is also removed. This stops recording of chan ged line items in table BWFI_AEDAT. Existing data in table BWFI_AEDAT is also deleted. Before a new data request can be made in the update mode initialization of the delta method, the entry must be added again to table TPS31.
    *** Recording of the changed line items must be started a reasonable amount of time before the first data request in update mode initialization of the data method. For this purpose, add the entry in table TPS31 using transaction SM30.
    Table: BWOM_SETTINGS
    MANDTOLTPSOURCEPARAM_NAMEPARAM_VALUEFormat/Values


    BWFILOWLIM19910101YYYYMMDD


    BWFINEXTX<space> or X


    BWFINSAF3600<seconds>


    BWFIOVERLA

    <space> or X


    BWFISAFETY1<Days>


    BWFITIMBOR020000<Time>


    DELTIMEST60<Days>


    ORGSYSONLY

    <space> or X
    *** SAP recommends that you do not change the standard value.
    More details about the settings are available at the following URL.
    Financial Accounting: Procedure for Line Item Extraction


    Index was modified for table BWFI_AEDAT as per Note 991429 to enable minute based extraction.
    FIAP-img1.jpg

    FIAP-img2.jpg

    2.7    R/3 Tables used

    The following R/3 tables were used for the FI-AP extraction.
    Data Tables
    BSIKAccounting: Secondary Index for Vendors
    BSAKAccounting: Secondary Index for Vendors (Cleared Items)
    LFA1Vendor Master (General Section)
    LFB1Vendor Master (Company Code)
    LFB5Vendor master (dunning data)
    LFM1Vendor master record purchasing organization data
    LFM2Vendor Master Record: Purchasing Data
    LFBKVendor Master (Bank Details)
    EKKOPurchasing Document Header
    EKPOPurchasing Document Item

    Config Tables
    BWFI_AEDATList of changed documents with the change date and the document number which helps in the delta extraction. The number of days the data stored here depends on the setting in the bwom_settings table.The 0FI_*_4 extractors use this table for registering change data.
    BWFI_AEDA2This is the BW FI: Log Table for Changed Transaction Figures The 0FI_*_6, 0FI_*_7 extractors use this table for registering change data.
    BWFI_AEDA3This is the BW FI: Log Table for Changed Credit Management Data The 0FI_AP_8, 0FI _AP_9, 0FI_AP_10 extractors use this table for registering change data.
    BWOM_SETTINGSSettings for the delta extraction each entry in the table signifies a special purpose.This table parameters are common to all the datasource extractors.
    Parameters: BWFILOWLIM, BWFISAFETY, BWFIOVERLA, ORGSYSONLY, DELTIMEST, BWFIT IMBOR, BWFINEXT, BWFINSAF
    BWOM2_TIMESTStores the delta extraction date and timestamp for reference from where the next delta extraction for the specific datasource to begin.
    ROOSPRMSFStores the selections for the specific datasources under specific
    source and destination systems.
    TP S31This table contains the Process BTE: Alternative Function Modules from SAP. The function modules for the various BTEs are mapped in this table.
    TPS01This table contains the description of the BTEs.

    3      B/W Customization:

    3.1    InfoProviders

    The following InfoProviders were created i n BW to hold the data for FI-AP
    FIAP-img3.jpg

    3.2    Data Flows

    The various data flows are as below.

    0FI_AP_4 & ZFI_AP_4

    FIAP-img4.jpg

    *** The InfoObject ZFIAPLK has been modeled to have the Long Text loaded across 5 text attributes as in BW the Character limitation is that of 60 characters only while the Long text field is of 255 characters. The data gets loaded from ZFIAP_O3.


    0FI_AP_6
    FIAP-img6.jpg
    0FI_AP_7
    FIAP-img7.jpg

    3.3    Roles for FI-AP

    The following roles have been created to cater to different user groups
    • BW-INFO-PROVIDER-FIAP
    • BW-POWER-USER-FIAP
    • BW-END-USER-FIAP

    3.4    Process Chain

    To load the FI-AP data from SAP, a process chain has been created for the same which runs as part of the Meta Chains on a daily basis. It is basicall y run twice daily except on Sundays.
    FIAP-img8.jpg

    4         Appendix

    4.1       Routines used in Transformations

    • RSDS 0FI_AP_4 PAE050 -> ODSO ZFIAP_O3
      • 0REF_DOC
      • 0POSTXT
      • ZFIAPLK
      • ZTXTLG_1
      • ZTXTLG_2
      • ZTXTLG_3
      • ZTXTLG_4
      • ZTXTLG_5
    • RSDS ZFI_AP_4 PAE050 -> ODSO ZFIAP_O4
      • 0REF_DOC
      • 0POSTXT

    4.2       Source Code for ZBWFI_FILL_CI_00005021

    FUNCTION ZBWFI_FILL_CI_00005021.
    *"----------------------------------------------------------------------
    *"*"Local Interface:
    *"  IMPORTING
    *"     REFERENCE(I_OLTPSOURCE) TYPE  SBIWA_S_INTERFACE-ISOURCE
    *"  CHANGING
    *"     REFERENCE(C_STRUCTURE)
    *"----------------------------------------------------------------------
    DATA: BEGIN OF WA_KNB5,
            BUSAB TYPE BUSAB_MA,
          END OF WA_KNB5,
          BEGIN OF WA_ KNVP,
            PERNR TYPE PERNR_D,
          END OF WA_KNVP,
          BEGIN OF WA_T014,
            WAERS TYPE WAERS,
          END OF WA_T014,
          BEGIN OF WA_T001,
            KTOP2 TYPE KTOP2,
          END OF WA_T001.
    DATA: THEAD LIKE THEAD.
    DATA: BEGIN OF TLINETAB OCCURS 100.    "table to process comments
            INCLUDE STRUCTURE TLINE.
    DATA: END OF TLINETAB.
    DATA: C_KEY TYPE THEAD-TDNAME,
          I_LINE TYPE I.

      CASE I_OLTPSOURCE.
        WHEN '0FI_AR_4'. "Customers: Line Items with Delta Extraction
          FIELD-SYMBOLS: <FS_DTFIAR_3> TYPE DTFIAR_3.
          ASSIGN C_STRUCTURE TO <FS_DTFIAR_3>.
          "Details from KNA1:General Data in Customer Master
          SELECT  SINGLE KONZS KUKLA NIELS BRAN1
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_3>
            FROM  KNA1
            WHERE KUNNR = < FS_DTFIAR_3>-KUNNR.
          "Details from KNB1:Customer Master (Company Code)
          SELECT  SINGLE BUSAB
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_3>
            FROM  KNB1
            WHERE KUNNR = <FS_DTFIAR_3>-KUNNR
            AND   BUKRS = <FS_DTFIAR_3>-BUKRS.
          "Details from KNB5:Customer master (dunning data)
          SELECT  SINGLE BUSAB
            INTO  CORRESPONDING FIELDS OF WA_KNB5
            FROM  KNB5
            WHERE KUNNR = <FS_DTFIAR_3>-KUNNR
            AND   BUKRS = <FS_DTFIAR_3>-BUKRS
            AND   MABER = <FS_DTFIAR_3>-MABER.
          IF SY-SUBRC EQ 0.
            <FS_DTFIAR_3>-BUSAB_D = WA_KNB5-BUSAB.
          ENDIF.
          "Details from KNVV:Customer Master Sales Data
          SELECT  SINGLE VKORG VTWEG SPART BZIRK
            INTO  CORRESPONDING F IELDS OF <FS_DTFIAR_3>
            FROM  KNVV
            WHERE KUNNR = <FS_DTFIAR_3>-KUNNR.
          "Sales Engineer from KNVP:Customer Master Partner Functions
          SELECT  SINGLE PERNR
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_3>
            FROM  KNVP
            WHERE KUNNR = <FS_DTFIAR_3>-KUNNR
            AND   VKORG = <FS_DTFIAR_3>-VKORG
            AND   VTWEG = <FS_DTFIAR_3>-VTWEG
            AND   SPART = <FS_DTFIAR_3>-SPART
            AND   PARVW = 'SA'.
          "Sales Manager from KNVP:Customer Master Partner Functions
          SELECT  SINGLE PERNR
            INTO  CORRESPONDING FIELDS OF WA_KNVP
            FROM  KNVP
            WHERE KUNNR = <FS_DTFIAR_3>-KUNNR
            AND   VKORG = <FS_DTFIAR_3>-VKORG
            AND   VTWEG = <FS_DTFIAR_3>-VTWEG
    � �       AND   SPART = <FS_DTFIAR_3>-SPART
            AND   PARVW = 'SM'.
          IF SY-SUBRC EQ 0.
             <FS_DTFIAR_3>-PERNR_M = WA_KNVP-PERNR.
          ENDIF.
          "Details from KNKK:Customer master credit management: Control area data
          SELECT  SINGLE KLIMK SKFOR NXTRV CTLPC CASHD
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_3>
            FROM  KNKK
            WHERE KUNNR = <FS_DTFIAR_3>-KUNNR
            AND   KKBER = <FS_DTFIAR_3>-KKBER.
          "Currency Key for KNKK from T014:Credit control areas
          SELECT  SINGLE WAERS
            INTO  CORRESPONDING FIELDS OF WA_T014
            FROM  T014
            WHERE KKBER = <FS_DTFIAR_3>-KKBER.
          IF SY-SUBRC EQ 0.
             <FS_DTFIAR_3>-WAERS_CM = WA_T014-WAERS.
          ENDIF.
          "Sold-To-Part y from VBRK:Billing Document: Header Data
          SELECT  SINGLE VKORG VTWEG SPART BZIRK KUNAG
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_3>
            FROM  VBRK
            WHERE VBELN = <FS_DTFIAR_3>-VBELN.
        WHEN '0FI_AP_4'. "Vendors: Line Items with Delta Extrcation
          FIELD-SYMBOLS: <FS_DTFIAP_3> TYPE DTFIAP_3.
          ASSIGN C_STRUCTURE TO <FS_DTFIAP_3>.
          "Details from EKPO:Purchasing Document Item
          SELECT  SINGLE MENGE MEINS
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAP_3>
            FROM  EKPO
            WHERE EBELN = <FS_DTFIAP_3>-EBELN
            AND   EBELP = <FS_DTFIAP_3>-EBELP.
          "Details from BKPF:Accounting Document Header
          SELECT  SINGLE PPNAM USNAM
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAP_3>
            FROM  BKPF
             WHERE BUKRS = <FS_DTFIAP_3>-BUKRS
            AND   BELNR = <FS_DTFIAP_3>-BELNR
            AND   GJAHR = <FS_DTFIAP_3>-FISCPER+0(4).
          "Read Long Text
          C_KEY+0(4) = <FS_DTFIAP_3>-BUKRS.
          C_KEY+4(10) = <FS_DTFIAP_3>-BELNR.
          C_KEY+14(4) = <FS_DTFIAP_3>-FISCPER+0(4).
          C_KEY+18(3) = <FS_DTFIAP_3>-BUZEI.
          CALL FUNCTION 'READ_TEXT'
            EXPORTING
              id                      = '0001'
              language                = sy-langu
              object                  = 'DOC_ITEM'
              name                    = C_KEY
            IMPORTING
              header                  = thead
            TABLES
              lines                    = tlinetab
            EXCEPTIONS
              id                      = 1
              language                = 2
              name                    = 3
              not_found               = 4
              object                  = 5
              reference_check         = 6
              wrong_access_to_archive = 7
              others                  = 8.
          IF SY-SUBRC = 0.
            I_LINE = 0.
            LOOP AT TLINETAB.
              IF I_LINE EQ 0.
                <FS_DTFIAP_3>-LGTXT = TLINETAB-TDLINE.
              ELSE.
                CONCATENATE <FS_DTFIAP_3>-LGTXT TLINETAB-TDLINE INTO <FS_DTFIAP_3>-LGTXT SEPARATED BY SPACE.
              ENDIF.
              ADD 1 TO I_LI NE.
            ENDLOOP.
          ENDIF.
        WHEN '0FI_GL_4'. "Customers: Line Items with Delta Extraction
          FIELD-SYMBOLS: <FS_DTFIGL_4> TYPE DTFIGL_4.
          ASSIGN C_STRUCTURE TO <FS_DTFIGL_4>.
          "Details from SKA1:G/L Account Master (Chart of Accounts)
          SELECT  SINGLE XBILK GVTYP
            INTO  CORRESPONDING FIELDS OF <FS_DTFIGL_4>
            FROM  SKA1
            WHERE SAKNR = <FS_DTFIGL_4>-HKONT
            AND   KTOPL = <FS_DTFIGL_4>-KTOPL.
          "Read Alt GL Account from SKB1:G/L account master (company code)
          SELECT  SINGLE ALTKT
            INTO  CORRESPONDING FIELDS OF <FS_DTFIGL_4>
            FROM  SKB1
            WHERE BUKRS = <FS_DTFIGL_4>-BUKRS
            AND   SAKNR = <FS_DTFIGL_4>-HKONT.
          IF <FS_DTFIGL_4>-ALTKT IS NOT INITIAL.
             "Read corresponding Chart of Account for Alt GL Account from T001
            SELECT  SINGLE KTOP2
              INTO  CORRESPONDING FIELDS OF WA_T001
              FROM  T001
              WHERE BUKRS = <FS_DTFIGL_4>-BUKRS.
            IF SY-SUBRC EQ 0.
              <FS_DTFIGL_4>-ZKTOPL = WA_T001-KTOP2.
            ENDIF.
          ENDIF.
        WHEN OTHERS.
      ENDCASE.
      UNASSIGN <FS_DTFIAR_3>.
      UNASSIGN <FS_DTFIAP_3>.
      UNASSIGN <FS_DTFIGL_4>.
    ENDFUNCTION.

    4.3       Source Code for ZBWFI_FILL_CI_00005022

    FUNCTION ZBWFI_FILL_CI_00005022.
    *"----------------------------------------------------------------------
    *"*"Local Interface:
    *"  IMPORTING
    *"     REFERENCE(I_OLTPSOURCE) TYPE  SBIW A_S_INTERFACE-ISOURCE
    *"  CHANGING
    *"     REFERENCE(C_STRUCTURE)
    *"----------------------------------------------------------------------
    DATA: BEGIN OF WA_T001,
            KTOP2 TYPE KTOP2,
          END OF WA_T001.
      CASE I_OLTPSOURCE.
        WHEN '0FI_AR_6'. "Customer Sales Figures via Delta Extraction
          FIELD-SYMBOLS: <FS_DTFIAR_1> TYPE DTFIAR_1.
          ASSIGN C_STRUCTURE TO <FS_DTFIAR_1>.
          "Details from KNA1:General Data in Customer Master
          SELECT  SINGLE NIELS
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_1>
            FROM  KNA1
            WHERE KUNNR = <FS_DTFIAR_1>-KUNNR.
          "Details from KNB1:Customer Master (Company Code)
          SELECT  SINGLE AKONT
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_1>
            FROM  KNB1
            WHERE KUNNR = <FS_DTFIAR_1>-K UNNR
            AND   BUKRS = <FS_DTFIAR_1>-BUKRS.
          "Details from KNVV:Customer Master Sales Data
          SELECT  SINGLE BZIRK
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_1>
            FROM  KNVV
            WHERE KUNNR = <FS_DTFIAR_1>-KUNNR.
          "Details from T001:Company Codes
          SELECT  SINGLE KTOPL
            INTO  CORRESPONDING FIELDS OF <FS_DTFIAR_1>
            FROM  T001
            WHERE BUKRS = <FS_DTFIAR_1>-BUKRS.
        WHEN '0FI_GL_6'. "General Ledger Sales Figures via Delta Extraction
          FIELD-SYMBOLS: <FS_DTFIGL_1> TYPE DTFIGL_1.
          ASSIGN C_STRUCTURE TO <FS_DTFIGL_1>.
          "Read Alt GL Account from SKB1:G/L account master (company code)
          SELECT  SINGLE ALTKT
            INTO  CORRESPONDING FIELDS OF <FS_DTFIGL_1>
            FROM  SKB1< br>        WHERE BUKRS = <FS_DTFIGL_1>-BUKRS
            AND   SAKNR = <FS_DTFIGL_1>-SAKNR.
          IF <FS_DTFIGL_1>-ALTKT IS NOT INITIAL.
            "Read corresponding Chart of Account for Alt GL Account from T001
            SELECT  SINGLE KTOP2
              INTO  CORRESPONDING FIELDS OF WA_T001
              FROM  T001
              WHERE BUKRS = <FS_DTFIGL_1>-BUKRS.
            IF SY-SUBRC EQ 0.
              <FS_DTFIGL_1>-ZKTOPL = WA_T001-KTOP2.
            ENDIF.
          ENDIF.

        WHEN OTHERS.
      ENDCASE.
      UNASSIGN <FS_DTFIAR_1>.
      UNASSIGN <FS_DTFIGL_1>.
    ENDFUNCTION.

    4.4       Source Code for ZFI_AP_4 in CMOD

    Include: ZXRSAU01
    -----------------
      WHEN 'ZFI_AP_4'.
        PERFOR M enhance_ZFI_AP_4 TABLES c_t_data.
    Include: ZXRSAF02
    -----------------
    *...enhance_ZFI_AP_4:Enhancements for FIAP: Parked Documents
    FORM enhance_zfi_ap_4 TABLES c_t_data STRUCTURE zoxdae0290.
      DATA: i_zfiap4 TYPE TABLE OF zoxdae0290 WITH HEADER LINE.
      DATA: BEGIN OF ls_faede.
              INCLUDE STRUCTURE faede.
      DATA: END   OF ls_faede.
    *  STATICS: R_FISCPER TYPE BWFI_T_FISCPER.
      LOOP AT c_t_data INTO i_zfiap4.
    *...check for fiscper selection........................................*
        i_zfiap4-fiscper(4)   = i_zfiap4-gjahr.
        i_zfiap4-fiscper+4(1) = '0'.
        i_zfiap4-fiscper+5(2) = i_zfiap4-monat.
    *    CHECK i_ZFIAP4-FISCPER IN R_FISCPER.
    *...setting constants........................................*
        i_zfiap4-uposz = '0001'.
        i_zfiap4-statusps = 'D'.
        i_zfiap4-koart = 'K'.
        i_zfiap4-augdt = '00000000'.
    *...amount fields........... ...........................................*
        CASE i_zfiap4-shkzg.
          WHEN 'S'.
            i_zfiap4-dmsol = i_zfiap4-dmbtr.
            i_zfiap4-dmshb = i_zfiap4-dmbtr.
            i_zfiap4-wrsol = i_zfiap4-wrbtr.
            i_zfiap4-wrshb = i_zfiap4-wrbtr.
          WHEN 'H'.
            i_zfiap4-dmhab = i_zfiap4-dmbtr.
            i_zfiap4-dmshb = i_zfiap4-dmbtr * -1.
            i_zfiap4-wrhab = i_zfiap4-wrbtr.
            i_zfiap4-wrshb = i_zfiap4-wrbtr * -1.
        ENDCASE.
    *...negative posting
        IF i_zfiap4-xnegp = 'X'.
          CASE i_zfiap4-shkzg.
            WHEN 'S'.
              i_zfiap4-dmhab = i_zfiap4-dmbtr * -1.
              i_zfiap4-wrhab = i_zfiap4-wrbtr * -1.
              CLEAR: i_zfiap4-dmsol,
                     i_zfiap4-wrsol.
            WHEN 'H'.
              i_zfiap4-dmsol = i_zfiap4-dmbtr * -1.          i_zfiap4-wrsol = i_zfiap4-wrbtr * -1.
              CLEAR: i_zfiap4-dmhab,
                     i_zfiap4-wrhab.
          ENDCASE.
        ENDIF.

    *...Due Date Calculations
        IF ( i_zfiap4-zfbdt IS INITIAL ).
          MOVE i_zfiap4-bldat TO i_zfiap4-zfbdt.
        ENDIF.
        MOVE-CORRESPONDING i_zfiap4 TO ls_faede.
        CALL FUNCTION 'DETERMINE_DUE_DATE'
          EXPORTING
            i_faede = ls_faede
          IMPORTING
            e_faede = ls_faede
          EXCEPTIONS
            OTHERS  = 1.
        MOVE: ls_faede-netdt TO i_zfiap4-netdt,
              ls_faede-sk1dt TO i_zfiap4-sk1dt,
              ls_faede-sk2dt TO i_zfiap4-sk2dt.
    *...Details from BKPF:Accounting Document Header
        SELECT  SINGLE usnam
            INTO i_zfiap4-ppnam
            FROM  vbkpf
            WHERE bukrs = i_zfiap4-bukr s
            AND   belnr = i_zfiap4-belnr
            AND   gjahr = i_zfiap4-gjahr.
        IF sy-subrc EQ 0.
          MODIFY c_t_data FROM i_zfiap4.
        ENDIF.
        CLEAR i_zfiap4.
      ENDLOOP.
    ENDFORM.                    "enhance_ZFI_AP_4
    *...enhance_ZFI_AP_4:Enhancements for FIAP: Parked Documents