Wednesday, August 29, 2007

Front end services

This morning, one of my colleagues had a requirement, in which he wanted to process a file from presentation server and once done, the file system should move the file to a different directory, in the presentation server. We have done the same in application server using SYSTEM command, but to do the same, the following approach can be used.

Assuming presentation server is a Windows system.

  1. Create a .BAT file with following script. Assuming that we are moving a file called 'File1.txt' from C: to C:\Folder

    c:
    cd \
    move file1.txt folder\file1.txt
  2. Name the file as move_file.bat and store it in C:\ root
  3. Have the following piece of code for executing from ABAP code

    CALL METHOD cl_gui_frontend_services=>execute
    EXPORTING
    APPLICATION = 'C:\move_file.bat' .

The above code will execute the BAT file from ABAP code. We can also launch any application from ABAP with above manner.

Learnt something !

Friday, August 24, 2007

SDN - Wiki pages posted

Recently published two SDN Wiki pages. Have a look at them:

SAP Business Workflow

Performance using Parallel Cursor

Want to Wiki more ...

Saturday, August 18, 2007

Wiki Pages Added in SDN

I added Code sample for Parallel Cursor in SDN Wiki. Have a look .

https://wiki.sdn.sap.com/wiki/x/CKs

Similarly, I also added a Workflow page in SDN Wiki..

https://wiki.sdn.sap.com/wiki/x/oKo

Friday, June 29, 2007

Improved version of Parallel Cursor

Problem with previous Method: The disadvantage of the code in my previous post is that we can not use it when the inner loop key fields are are independent of key fields of outer loop. i.e. The assumption was the inner loop index keeps incrementing as the outer loop index index moves ahead. But this is not the case for 90% of our code. For example let outer loop be VBPA table and inner loop be KNA1 table, in which case, the key field for VBPA will be VBELN, but the key field for KNA1 would be KUNNR. Also reader can note it is not necessary that inner loop index gets incremented for each outer loop parse.

Alternate Method: To overcome this problem, we use a READ statement with binary search before the inner loop starts. This gets the starting index of the inner loop and then rest of the logic remains same.

Reader can witness that this methods is very easy and understandable compared to previous code.

Code:

sort: lt_vbpa by vbeln,
kna1 by kunnr.

loop at lt_vbpa into wa_vbpa.
read lt_kna1 into wa_kna1
with key kunnr = wa_vbpa-kunnr
binary search.
if sy-subrc = 0.
v_kna1_index = sy-tabix.
loop at lt_kna1 into wa_kna1 from v_kna1_index.
if wa_kna1-kunnr <> wa_vbpa-kunnr.
exit.
endif.

****** Your Actual logic within inner loop ******

endloop. "KNA1 Loop
endif.
endloop. " VBPA Loop


Labels: , , ,

Tuesday, June 19, 2007

Avoiding Nested Loops Using Parallel Cursors

Background: Performance of program, function modules, BAdi or any piece of code would drastically go down when:


  1. Nested loops are used

  2. Corresponding internal tables are very huge

  3. When child table is larger than the parent table
Statistics:
Sample program run with different number of BKPF and BSEG tables entries is shown below:

Observation:
One can observe that as the data increases, the time taken for nested loop increases drastically, at the same time, Parallel cursor method did not have any considerable time.

Verdict: Use parallel cursor method whenever there is a need to have nested loop.

Method:
Assume you fill up bkpf_tab and bseg_tab.
Code for normal nested loop: ( I consider this as UGLY code from now onwards)



loop at bkpf_tab into bkpf_lin.
bkpf_reads = bkpf_reads + 1.
loop at bseg_tab into bseg_lin where
bukrs = bkpf_lin-bukrs and
belnr = bkpf_lin-belnr and
gjahr = bkpf_lin-gjahr.
bseg_reads = bseg_reads + 1.
endloop.
endloop.

Code for Parallel Cursor:


SORT: bkpf_tab BY bukrs belnr gjahr,
bseg_tab BY bukrs belnr gjahr.
bseg_index = 1.
LOOP AT bkpf_tab INTO bkpf_lin.
bkpf_reads = bkpf_reads + 1.
LOOP AT bseg_tab INTO bseg_lin FROM bseg_index.
IF bseg_lin-bukrs <> bkpf_lin-bukrs OR
bseg_lin-belnr <> bkpf_lin-belnr OR
bseg_lin-gjahr <> bkpf_lin-gjahr.
bseg_index = sy-tabix.
EXIT.
ELSE.
bseg_reads = bseg_reads + 1.
ENDIF.
ENDLOOP.
ENDLOOP.

Go through these code and post your comments

Analysis:
In the so called UGLY code, for every record in parent table (BKPF), the whole child table (BSEG) is searched and hence the delay. In Parallel cursor code both the tables are sorted and child table is not accessed completely, instead the index is stored in every iteration of the child table, once all the child records for current parent record is over, the index of the current child record is used for accessing first child record of next parent entry without searching the entire table. This is doen using 'FROM' clause of the loop. The where condition for the child loop should be avoided at any cost. Store the index and use the same for the next parent record. As the tables are sorted, this method should work excellently.

Going forward:
I would add a checkilist item for my code review to check for Parallel cursor for any place where a Nested loop is involved.

Labels: , , , ,

Friday, June 15, 2007

Advanced SAP Workflow Concepts - Document and Templates

Prerequisites: SAP Technical Consultant, Worked on SAP Workflow development.
Business requirement: It is required that user has to work with one of the PC application document like Microsoft Word, XL or Power point during workitem execution. Also the system has to capture the changes done by the user and store the document within the workflow and can be binded to different tasks and workflows.

Purpose: Usage of 'Document and Template' step in workflow builder

Details:
Step 1: Creating a Template
In the workflow builder use the left pane for selecting Document and Template as shown

Following screen comes up. If you want to change document type you can do so.



Type in what ever data you need to and save the Document and it will be stored with the Workflow.



Step 2: Using the template in the Workflow:

Once the template is created, you can use the step type 'Document and Template' to use the template.



Type in the description of the step, select the template and associate the agent, as shown.

Workflow should look like:


Save and Activate:


Step 3: Run the Workflow

When the 'Edit Document' workitem is run, the template document is automatically loaded in the SAP screen and the user can change the document and save it. The document is saved in the workflow container.


Save the document and go back. As this is only the step in the workflow, the workflow would be completed.

Step 4: Verify the Change

Goto the workflow log and get the workflow container



Right click on the Document and choose 'Call Default Method', which is Display. That would display the document and we can see whether the changes done in the Previous step is captured or not

Hurray yes it is..

Summary:

Thus we can use this container element further in multiple steps. This would be very useful when a document needs to be edited by multiple people in a business sequence.

Labels: , ,

Monday, November 07, 2005

Search Help or Input help

I has this doubt from long time.. Got solved today.

Case is like this:

I have 2 fields on the screen:
- MATNR
- MTART ( Material Type)

When I give a particular Material Type in MTART and press F4 on MATNR all the material of that particular MTART should only be displayed .. and not all the materials.


Solution for this:

Create a search help with MATNR and MTART
MATNR as both IMPORT/EXPORT parameter and MTART as IMPORT parameter.

Create a Z table with these 2 fields and attach the same search help to both of them.
Create screen fields by referencing the above Z table.

The system will automatically do the required job. When attach the seach help directly to the screen field.. it does not work.

Please refer SAP Document : Link

Any thing related to Search Help: Link