A user guide in how overcome the common problems in migrating fixed assets into SAP. For a one-time conversion into SAP, we favour using the LSMW tool. It allows you to leverage the full power of ABAP while using standard SAP processing functions, yet it does a lot of the file management and processing work automatically. However, even within LSMW there are a number of possible methods for migrating fixed assets. This document will discuss loading fixed assets using the standard load program RAALTD01, although two alternatives are briefly discussed below. Keywords / Search Terms Fixed Assets, SAP Data Migration, LSMW, RAALTD01, AS01, AS91, IDOC, BAPI, Standard Load Program, BDC Load methods
- BDC recording of transaction AS91 This is the simplest solution and so it might be suitable for a very basic upload. If for example you are not creating fixed assets in SAP, but rather updating one field in fixed assets which already exist in the system, then this might be the right approach. But it is not flexible enough to be used for the creation of fixed asset data.
- Business object BUS1022 This would create IDOCs of type FIXEDASSET_CREATEINCLVALUES01 and process them through the SAP BAPI function BAPI_FIXEDASSET_OVRTAKE_CREATE. This is possibly the solution that SAP would recommend. SAP is keen on BAPIs as they are powerful, flexible and can be easily called from an external system via an RFC. But that does not necessarily make them the right choice for data migration. The structure of BAPIs is not always particularly intuitive and the upfront development work can be complicated. Also this method involves the processing of IDOCs. While the standard error handling and reprocessing functionality for IDOCs in SAP is impressive, it is not always transparent. Migrating fixed assets using this method would be suitable for someone who is particularly strong in the area of BAPIs and IDOCs.
- Standard load program RAALTD01 This is generally the approach I would favour for the migration of fixed assets into SAP. The standard load program is not perfect. As discussed later, there are one or two areas which it does not cover and like many SAP standard programs, it has its quirks: for example, when you come to load the assets, you do not have the option to create a BDC session yet if any of the transaction calls fail, then the program will create a BDC session for those records. Nevertheless, it is a powerful and flexible program, and it is relatively simple to use. The fact that you can run the asset load in test mode before creating any data is also a major advantage, even though the test run does not always pick up 100% of the errors.
Assumptions This document assumes a working knowledge of LSMW, and at least some basic understanding of the structure of fixed assets data in SAP. Data structures There are two data structures in the asset load program RAALTD01 – BALTD and BALTB.
- BALTD This structure is mandatory and contains all the basic fixed asset master data.
- BALTB This structure is for what are known as asset transactions. The two common scenarios in which this structure needs to be populated are: a) An asset was capitalised after the start of the current financial year (the current financial year being the year in which you are going to migrate these assets into SAP), or b) An asset was disposed of in the current financial year.
|BALTD||ANLN1||Asset number||Normally internally assigned|
|BALTD||ANLN2||Asset subnumber||Normally internally assigned|
|BALTD||OLDN1||Legacy asset main number||Mandatory if there are transactions|
|BALTD||OLDN2||Legacy asset sub number||Mandatory if there are transactions|
|BALTD||TCODE||SAP transaction||AS91 for asset creation, AS92, AS94|
|BALTD||RCTYP||Record type||Always ‘A’|
|BALTD||AIBN1||Original Vendor Number|
|Depreciation Data (multiple records per asset)|
|BALTD||NDJARnn||Planned useful life (years)|
|BALTD||NDPERnn||Planned useful life (months)|
|BALTD||AFABGnn||Depreciation start date|
|BALTD||KANSWnn||Gross book value|
|BALTD||KNAFAnn||Accumulated depreciation||Total dep to end of previous fiscal year|
|BALTD||NAFAGnn||Ord dep posted||Depr posted in current fiscal year|
|BALTD||BWCNT||Number of transactions||Should equal the number of BALTB records for this asset|
|BALTB||OLDN1||Legacy asset main number||Mandatory|
|BALTB||OLDN2||Legacy asset sub number||Mandatory|
|BALTB||TCODE||SAP transaction||‘AS91’ for asset creation, etc|
|BALTB||RCTYP||Record type||Always ‘B’|
|BALTB||BWASL||Transaction type||‘100’ for acquisition, ‘200’ for disposal|
|BALTB||ANBTRnn||Amount||Enter acquisition or disposal amount|
Modifying the standard asset structure It is possible (and sanctioned by SAP) to modify SAP structures BALTD and BALTB. You only need to modify BALTB if you have added extra depreciation areas to BALTD. You will of course need an object key to do so, but as long as the fields you are adding are active in transactions AS91, AS92, etc, then this is the only change you will need to make. RAALTD01 will do the rest. Common reasons for modifying BALTD might be to increase the number of investment keys (default setting is 2) or the number of depreciation areas (default setting is 8). See more on the depreciation areas below. There is more information in SAP OSS note 23716. Common Problems
- Alpha conversion As RAALTD01 is very closely linked with the direct upload program RAALTD11, it retains some of the features of a direct upload program. One of these is that it checks during upload whether key data referenced in the asset exists in SAP. It does this without making any alpha conversion. So, if you are creating an asset with asset class (field ANLKL) ‘100’, you must specify this in the LSMW mapping in its internal SAP format, ie. ‘00000100’. The same goes for cost centres, vendors, etc.
- Legacy asset number It is crucial when migrating data into SAP to store a reference to the legacy data key. It is important for business reasons – so that a user can easily see the link between their old data and the new – but it is also important for technical reasons. This is obvious for certain objects like vendors and customers where you need to store the link in order to be able to migrate follow-on transactional data like AR and AP. But it is also useful for assets. It is very helpful in the test stages of a data migration to be able to run and rerun your load program without fear of loading duplicate information. By storing the legacy asset number somewhere in the asset master, you can easily check with some ABAP code in your LSMW whether this legacy asset has already been created in table ANLA. The most common field for storing the legacy number is AIBN1 (Original Asset Number) but do not put your legacy number here without checking. This field was intended to be used for the original asset number in SAP after it had been transferred to a new number. If using AIBN1 is going to be a problem, another option is ANLH-ANLHTXT. This is a text field which is often unused. One red herring in the load program is OLDN1 (Old asset number). This field exists in the load structures but not in the database tables. It is only used in the processing of the load program. See further information on this field below in ‘Other quirks’. If you find that AIBN1 and ANLHTXT are not appearing in the AS91 screens, you can change the screen layouts in customising:
Financial Accounting > Asset Accounting > Master Data > Screen Layout > Define Screen Layout for Asset Master Data
- Missing customising Before running your test and live asset migrations, please check that the following customising is in place. For some reason, these steps are often overlooked by the FI-CO functional consultants: Transfer date – this should be set to close to the date you migrate the assets. As AS91 is specifically for data migration, it expects that the capitalisation date for all the assets you migrate will be before the transfer date. Check this in table T093C. Current fiscal year – also in T093C, check that this has been correctly set. Number ranges – transaction SNUM.
- NBV – Net book value It is not possible to directly migrate the net book value of an asset. You must migrate the gross book value (acquisition cost) and the accumulated depreciation. SAP will then calculate the NBV.
- Time-dependent data Some of the asset data is time-dependent, ie. you can see the history of these fields. Example fields are cost centre, plant, internal order, location and business area. They are all stored in table ANLZ. The standard SAP load programs can only handle the current values of these fields. You cannot migrate multiple ANLZ records per asset. If you need to do this, you should first create your assets using RAALTD01 and load the initial values of these fields. Then create another LSMW program using an AS92 recording to upload any changes.
- Mid-year asset migration In their financial statements, companies must disclose the following:
- Depreciation methods used,
- Depreciation methods used and/or the useful economic lives
- Deprecation charged in the current fiscal year
- Gross amount of depreciable assets and the related total accumulated depreciation
As a result, if you are migrating assets midway through a fiscal year you have to split the depreciation to date into two amounts: depreciation up to the end of the previous fiscal year, and depreciation during the current fiscal year. One way of doing this is in your LSMW code: in the Takeover Values screen, enter the depreciation amount up to the end of the previous year into the field Accumulated Depreciation (BALTD-KNAFAnn) and the amount of depreciation in the current year into the field Ordinary Depreciation Posted (BALTD-NAFAGnn). This is generally the most popular method. The second way is to transfer the assets as at the end of the previous fiscal year and then run depreciation in SAP for all months in the current year. This involves more work for the functional consultants.
- Assets created in this fiscal year You also have to distinguish in SAP between assets created in previous years and assets created in the current year. Your capitalisation in the current year needs to be identified as a transaction. In this situation you will need to post both a BALTD record and a BALTB record. Your posting will differ from the standard asset creation in the following ways:
- BALTD-BWCNT needs to be populated with ‘0001’ (assuming you are only posting one transaction)
- You need to map the acquisition value into BALTB-ANBTRnn with transaction type ‘100’ instead of mapping it as normal to BALTD-KANSWnn
- BALTD-KNAFAnn does not need to be populated
- BALTD-NAFAGnn should be populated with the depreciation amount
- BALTB-BZDAT should be populated with the capitalisation date
- Asset disposals Disposals in the current fiscal year must also be identified as transactions.
In this situation you will need to post both a BALTD record and a BALTB record. Your posting will differ from the standard asset creation in the following ways:
- BALTD-BWCNT needs to be populated with ‘0001’ (assuming you are only posting one transaction)
- You need to map the disposal value into BALTB-ANBTRnn with transaction type ‘200’
- BALTB-BZDAT should be populated with the date of disposal
- Depreciation areas When creating fixed assets in SAP you will often populate multiple depreciation areas. Common depreciation areas set up in SAP might be Local Depreciation, Group Depreciation (if your company is international) and Tax. The depreciation rules for each of these might be slightly different, therefore you will create one depreciation area for each. Rarely, you might need more than the 8 depreciation areas provided as a default by SAP in structure BALTD and BALTB. I have only ever experienced this once while loading fixed assets in Italy. It was necessary due to the multiple currency devaluations that the Italian lira had undergone over the past thirty years or so. This can be handled by modifying the standard structures BALTD and BALTB. See information on this above in the section ‘Modifying the standard asset structure’.
- Invalid characters You may not put the hash character # in any of the BALTB or BALTD fields.
- Long texts The standard upload program does not handle long texts. These would need to be loaded in a separate program. For more information, please see our Harlex Guide to Loading Long Text in SAP.
- ‘Unexpected record type found’ This error occurs if you enter the wrong record type in the two RCTYP fields. It should be ‘A’ in BALTD and ‘B’ in BALTB. However, it you are sure that you do not have this problem and you are still getting the error, check that all of the master data you have referenced exists. For example, are all of your cost centre numbers valid. I have had this error in the past when migrating assets with transactions. The ‘real’ error of invalid data in your BALTD record is not given by SAP. It gives this error instead. The conclusion: always validate your master data fields in LSMW when loading fixed assets. A set of user routines such as CHECK_KOSTL, CHECK_WERKS, CHECK_LIFNR, etc, can save you a lot of time.
- Audit and Error report The error reporting is dreadful in RAALTD01 if you do not populate the field BALTD-OLDN1. If you do not populate this field, the program will list any errors you have with the asset description only, which is not particularly helpful. So, always populate OLDN1 even if you are not migrating transactions.