In the transaction SM12 you can see all current SAP locks, they can be selected using object or user name. If you want to get that list in your ABAP, the function ENQUEUE_READ will return you a list of object locks for specific objects (that can be specified with a pattern). The function can be useful if you want to process some object without locking it, for example, with a BAPI or BDC, and you want to check whether you may do this at the moment. If the object is currently locked by another user, you can read the lock and decide what to do: wait, or just report an error.
February 26, 2007
February 23, 2007
How to run the CIF queue LUWs that are stuck in READY state.
When we started to play with SAP APO and its CIF interface with R/3, we had, as most of other companies should, all kind of data errors that brought data transfer to a halt. Normally you should clean up your data in R/3 and then run the transfer again after deleting the crashed data queue, but then we found that many queues continued to hang in WAIT state, even if the blocking entry was deleted. You can rerun those LUWs one by one manually, but it’s obviously no fun. After doing some research in OSS and asking advice on Sapfans, I have found that the program RSTRFCI3 does this for many queues at once.
February 19, 2007
Handling date and time on SAP systems running across multiple time zones.
The easiest way to prevent any time zone problems is to run everything with UTC (formerly GMT – Greenwich Mean Time). But while it’s a good idea for servers, end users will most likely complain about being confused (my family doesn’t – my home systems are on UTC to prevent the hassles with summer/winter time). And if you implement SAP using local time on the server, while your users are in different time zones, things can get slightly complicated. Just try searching in OSS with search term “sy-timlo”.
The main problem is that some fields in SAP are stored as server local time (and date), while others use user’s local time. In general, as SAP explains in many OSS notes, any date/time that is written by the system is server local time, and any date/time that can be manually entered by users is in respective user’s time zone. To help us even more, the time zone used is not stored in documents, but only in user profile, so to be really sure which time is meant, one has to find the user who did the data entry or update, and then find the time zone and do conversion if necessary. SAP gives a good example in OSS note 636992. There, a user sitting in Japan creates a notification about, for example, machine breakdown, entering local time. Several hours later, a colleague in Germany looks at the notification and thinks that the machine has been down only a few moments, while it’s actually several hours!
Things are enough confusing if you are analysing some problem by looking at the data. And if you are creating documents (material movements, accounting postings or production order confirmations) from ABAP programs with, for example, BAPI functions, you have to be especially careful because the system will run checks on date and time fields, with different logic. In general, the posting date (BUDAT or, as in BAPIs, POSTG_DATE) and several date/time fields like EXEC_START_DATE, EXEC_START_TIME, EXEC_FIN_DATE, EXEC_FIN_TIME, EX_CREATED_DATE/TIME in confirmations in the BAPI function BAPI_PRODORDCONF_CREATE_TT are your local date and time. While creating order confirmations, the system will check the date/time against the user local date and time and will prevent creating confirmations in the future. In contrast to PP, the BAPI to create a goods movement – BAPI_GOODSMVT_CREATE – assumes that posting date is a local date, but doesn’t complain if it’s in the future. The potential problems can be hard to find and detect: if you have small time differences, the posting date can differ only during one-two hours per date – only then you will get an error when posting an order confirmation. For all those fields mentioned above you should normally use the system fields SY-DATLO and SY-TIMLO if they have to be populated with current date and time. If the data is provided by an external system, then either the system has to care about the correct time, or your ABAP program has to do time zone conversion.
In certain situations you can assume that if a document is being created for some plant, then the current server time can be converted into local time of the plant, if you know the time zones of both. The server’s time zone, or more exactly, its difference with UTC, can be found in the system variable SY-TZONE. To find the time zone of a plant, you can use the logic that can be found in the function CO_R0_SET_LOCAL_DATE_AND_TIME.
February 15, 2007
Rounding material quantities taking unit into account.
Sometimes ABAP reports end up showing funny material quantities as “0.5 pieces”. You could truncate or round the values easily, but you have to be sure when you may do that. The function MD_SINGLE_ROUNDING will do the material- and UoM-specific rounding correctly.
February 12, 2007
Getting SAP object directory entry from a partial object.
If you change an ABAP program source code, it is recorded in a transport with an entry type LIMU REPS, but the program object has an object directory entry of type R3TR PROG in the TADIR table. To convert from partial object to the “real” name, you can use the function TR_CHECK_TYPE. This may be useful if you, for example, want to check what are the objects contained in several transports and whether they “overlap”, so that you should take care if you have several transports to import into another system.
February 7, 2007
Language-specific logic in ABAP.
Writing code to support users all over the world is never easy, and SAP has, of course, its own specifics. You should process language-dependent data with care. You can get into a trouble if you assume that the data like material description is always available in your current language.
Have a look at this example of selecting production orders for materials together with their descriptions:
select afko~aufnr makt~maktx from afko inner join makt on makt~matnr = afko-plnbez into table t_orders where afko-plnbez = material and makt~spras = sy-langu.
What if some material has a description only in a language other than current? You’ll miss some orders! If that can be possible on your system, it’s better to select production orders for the material first and then do a loop, selecting descriptions and assigning something like “Unknown” to those that do not have one.
A problem of similar kind can arise if you are using text constants for texts that are actually language dependent. Let’s say that your ABAP program is checking whether a production order is completed, assuming a presence of order status ‘TECO’. If you give this text to the status check function and don’t supply the language, you will get the wrong status information if your program is running in German (where ‘TECO’ is ‘TABG’). To solve the problem you can supply the right language or read the status directly from table JEST, providing language-independent status name like ‘Ixxxxxxx’ (see the contents of table TJ02T for possible values).
Another kind of problems with language-dependent data arise when your are doing updates with CALL TRANSACTION supplying BDC data in an internal table. The quantity fields or date and time are stored in your program variables in an internal form. To make your BDC work, you have to convert them to “output” representation that is specific to the user, with which your BDC will be running. For example, the difference can be on the order of date and month (European format vs USA), or decimal separator (comma or period?). The most simple way to get proper format is to declare a character variable and use WRITE … TO operation that will take care of current user’s formats.
February 5, 2007
Reading machine capacity calendar in ABAP.
If you create a production order, SAP schedules start and end times using the machine and routing parameters. Even with a routing, you can ask SAP to make a simulated scheduling. If you want to do that yourself, you will have to use not only standard times of machine (capacity per time unit), but you will have to know when the machine is available (to throw the holidays out). Function CR_CAPACITY_AVAILABLE_TIMES will return a list of time periods when the machine is running.
February 1, 2007
SAP database tables documentation.
While SAP doesn’t provide real technical documentation, you can still do a lot to get the information about SAP data model and the sources of data for your programs. I have written a short guide once describing many tricks you can do if you have no idea where the data is coming from. It is published as one of the articles in the ABAP Knowledge Corner from Richard Harper. Apart from that, lots of information is stored right in the SAP system, as standard documentation for programs, functions and ABAP Dictionary objects. For the function modules’, the best way is to use the www.se37.com – a searchable library of documentation. If you want to (try to) get a document from SAP for a database table, here’s the trick: you run the report RSSDOCTB, select the output to be printed on screen and in the popup window (coming after F8 – Run) check all the checkboxes to get the documentation not only for the table but also for relationships and data elements. If you are lucky enough, meaning that normally all older tables (master data and core transaction data tables) are more or less documented, you get a report looking similar to the sample below, that can be stored in a local file. Long time ago I even wrote a program that reprocessed the resulting file into HTML to produce hyperlinked version for many tables.
MARC Material Master: C Segment Application class MG Table class TRANSP SQL-Tabelle Last change by SAP Date 04/09/1996 ______________________________________________________________________ Technical settings data class: APPL0 size category:4 buffering type: ______________________________________________________________________ Table structure Field name K Type Length Data el. Domain Text ______________________________________________________________________ MANDT X CLNT 3 MANDT MANDT Client MATNR X CHAR 18 MATNR MATNR Material number WERKS X CHAR 4 WERKS WERKS Plant PSTAT CHAR 15 PSTAT PSTAT Maintenance status LVORM CHAR 1 LVOWK XFELD Deletion flag for all material data of a plant BWTTY CHAR 1 BWTTY BWTTY Valuation category XCHAR CHAR 1 XCHAR XFELD Batch management indicator (internal) MMSTA CHAR 2 MMSTA MMSTA Material status from MM/PP view MMSTD DATS 8 MMSTD DATUM Date as from which MM/PP status is valid (deactivated) MAABC CHAR 1 MAABC MAABC ABC indicator ... Relationships Field name Checks fromDependencyCardinality Text ______________________________________________________________________ MANDT T000 KEY CN Client MATNR MARA KEY CN WERKS T001W KEY CN BWTTY T149C REF CN MMSTA T141 REF CN EKGRP T024 REF CN AUSME T006 REF CN Unit of measure DISPR MDIP REF CN MRP profile DISMM T438A REF CN MRP type DISPO T024D REF CN Disponent DISLS T439A REF CN Lot size ... Data element BESKZ Domain BESKZ _______________________________________________________________________ Procurement type Definition Indicator that defines how the material is procured. The following procurements types are possible: o The material is produced in-house. o The material is procured externally. o The material can be both produced in-house and procured externally. Checks Lower limit Upper limitValue description __________________________________________________________________ E In-house production F External procurement SPACE No procurement X Both procurement types