Compare OOPs method and ABAP Subroutines
Hi SAP,
In my client interview i faced a question that is "Iam calling perform statement for about 100 times in my program and i have found that there is a performance issue and what is the solution you will give to improve the performance?"
I told by using methods.
He told correct.
But i want to know how technically methods are performing than routines. and why?
Thanks in Advance.
I think your Interviewer here has displayed a "pitiful" lack of understanding of this topic if he / she really actually thought this way. (The Person <b>Giving</b> the Interview not the person being asked the questions).
OOP is a different METHODOLOGY. I'll use a sales order for example.
OK in a sales order you have all sorts of data such as who the customer is, quantities and costs of the the line item(s), what the materials are, delivery instructions, delivery schedule lines etc etc. You might also need other data that comes from different SAP modules such as has the order been invoiced, has it been paid and has the amount been booked to the appropriate general ledger account.
In a "True" object orientated scenario all this data would be "encapsulated" into a single "Sales Order Object". All you would have to do is to "Instantiate" the sales order --I.e give it a key say sales order number and then WITHOUT ANY FURTHER PROGRAMMING all these "Attributes" or properties of the Sales order would be retiurned to your program.
<b>As SAP is based on Relational data bases all this information needs to be read from the various distinct tables and your object is "Constructed". -- This is what the special method "Constructor" does when you first "Create " the object / instantiate it in your application program.
Constructing this object can take a considerable amount of time and resources depending on how much data needs to be read and from how many tables.
From then onwards you've got complete access to ALL the public attributes of the SALES ORDER class</b>.
I'm leaving discussion of " Other Methods" out of this post as they are not totally relevant to the case in point.
When you call a function module you are bulding up possibly a single table or want to retrieve / post a document etc. This function module can be used anywhere and doesn't have any relationship to anything except the parameters it gets from calls in your application program.
For sequential processing of large numbers of "Objects" the system has a lot more work to do INITIALLY as it has to go through all the programming to build up all the attributes FOR EVERY OBJECT. For complex objects this could involve 100's of function module calls.
Now when we get to OBJECT Orientated data bases this will not be a problem as after creation the object will be stored in its entireity so no overhead in re-building all the attributes is incurred. (The JDO for those doing JAVA does a lot of this already when "persistent objects" are used).
So your "Interviwer" was really asking the wrong questions.
OO is MUCH MUCH simpler once the objects and classes have been correctly designed and constructed. Application programming and development time can be much reduced.
However depending on what your Function module is doing in your application load on the system could bet be much reduced compared with OO (at least until a genuine OO DBMS system is used).
In any case whether you perform a function 100 times or read all the data in one go it actually depends on what the function module actially does since you might NOT be able to retrieve everything in one go without locking the system up thereby causing longer response times for other users.
If you are running processes which are highly dependendent on the data you are accessing it could well be MUCH BETTER to retrieve this data in small doses since you won't lock the data segements for anything like the same amount of time.
OO in classical SAP does have implications with DATA INTEGRITY as well.
Say your OO aplication needs to UPDATE some of the attributes of a sales order you will need to LOCK those attributes against otherconcurrent updates being done against the "Standard SAP tables" via "Classical SAP processes and Transactions". Not an easy task here if the Class Object is complex.
However if used sensibly OO is the way forward and once OODBMS (Object Orientated data base systems) become more common place performance and data integrity issues will be solved.
Having used OO for a number of years I would certainly NEVER want to go back to classical ABAP.
<b>Most problems with performance etc arise when people try and replicate standard sap transactions and programs with OO. DON'T -- IT DOESN'T WORK LIKE THAT.</b>
If you really DO need to process loads of items sequentially you might find that using something like BW anyway is a better bet.
Finally not the answer most "techies" will appreciate" but Hardware is actually very cheap these days compared to programming time, using expensive external SAP consultants, etc etc.
It Might be financially more profitable in any case just to upgrade the hardware rather than spend the time and cost of re-writing old inefficient code. (Even lower cost "Abap Factories" in India/Singapore etc cost significant amounts of money and the rising economies of those countries means in any case that's not such a cheap option anymore).
The best time for re-writing is when you start a new project so you can design the thing using OO from the START. Don't try and fit a square peg into a round hole.
Cheers
Jimbo
Similar Messages
-
ABAP OOP method in Workflow task 6.20
Hello all!
In the following blog /people/jocelyn.dart/blog/2006/07/25/using-abap-oo-methods-in-workflow-tasks it is mentionned that to enable OOP methods for workflow tasks on 6.20 one needs to run report SWF_CATID.
I'm currently on a customer system 6.20 ABAP SP50 and this report simply does not exist. Is this report appearing in a later support pack or is this not available until 6.40 as I belived....
Any advise on how to enable this on an above system is highly appriciated!
Regards
Martin JonssonHi,
Check this Report - RSWF_CATID.
Regards,
Surjith -
Reg : Classes And Methods In ABAP HR
Hii...
Can anyone tell me what are the standard OOPS classes and Interfaces related to ABAP HR Technical. I want to know the detailed view of all the classes and interfaces which can be used in HR technically.
Or is there any way I can find.
Your suggestions will be helpful for me. So, Kindly help me with this.
Thanks,
Regards,
Rahul GuptaVenkat,
Try look for any SAP Note or create Customer Message to SAP. It's clearly Program Error. We can't collect "lcl_transform" class into Transport Request Independently as it was local Class not Global Class.
Try transporting Transformations again, if it still gives problem. Contact SAP.
Let us know if you implement any SAP Notes.
all the best.
Regards,
Nagesh Ganisetti.
Assign Points if it helps. -
DIfference Between OOPS ALV and WEBDYNPRO FOR ABAP ALV?
Hi to All,
i want some information that What is main difference when we develop ALV Report in OOPS and WEBDYNPRO For ABAP.which is good n in what way it is good?
In the Same way I m also want know that WHICH IS BETTER AMONG WEBDYNPRO FOR JAVA/ABAP.In which way?
Regards,
Ravi KThanku for ur valuble Information.
could u give me information regarding OOPS ALV and WEBDYNPRO FOR ABAP ALV?which is better?is there differences?
Edited by: ravi k on Mar 26, 2008 12:23 PM -
Call Java Class and Methods from ABAP
Hi
I install de JCo, But how i can call java class and methods from ABAP?. somebody has an example?
The tutorial say that's is possible, but don't explain how do that?
Thanks.
Angel G. HurtadoIf you need only simple java program, you do not need to install JCo. The following codes can call java class.
DATA: COMMAND TYPE STRING VALUE 'C:\j2sdk1.4.2_08\bin\java',
DIR TYPE STRING VALUE D:\eclipse\workspace',
PARAMETER TYPE STRING VALUE 'Helloworld'. "here the name of your java program
CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE
EXPORTING
APPLICATION = COMMAND
PARAMETER = PARAMETER
DEFAULT_DIRECTORY = DIR
MAXIMIZED =
MINIMIZED = 'X' "If you need the DOS window to be minimized
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
BAD_PARAMETER = 3
FILE_NOT_FOUND = 4
PATH_NOT_FOUND = 5
FILE_EXTENSION_UNKNOWN = 6
ERROR_EXECUTE_FAILED = 7
OTHERS = 8.
Tell me if it works.
Nuno. -
Returning Parameter in OOPS method
Hi frnds,
I am learning oops ABAP. I want to use returning parameters in method and also STATIC METHOD.
If any example it will be more helpfulhttp://help.sap.com/saphelp_nw2004s/helpdata/en/08/d27c03b81011d194f60000e8353423/content.htm
check this too,
Reward points if helpful,
Thank you,
Regards,
Jagrut BharatKumar Shukla -
Compare 2 XML and only get the differences back
Hello ABAP XML experts,
I do not have an XI infrastructure, but need to perform a changes-only functionality in interfacing.
To achieve this I have a program which creates an XML string from an ABAP dictionary structure. I create this XML using the CALL TRANSFORMATION id statement. Then I store this XML in a custom database table.
The next time I run the interface program I create a new XML string and I read the one from the database, which I stored in the previous run of the program.
So far so good. Now the question.
Is there a standard function module, class or transformation who I can give the new and old XML and then it would compare the content and tell me which values have changed?
Kind Regards
Koen Van LoockeHi Patel,
the method sound promising, however I have my xml in a data field of type string and the method needs type XSTRING.
do you happen to know how to convert from string to XSTRING?
thanks
Koen -
Difference between Session method and call transaction
Hi,
please give me the differences between session method and call transaction,
briefly explaining synchronus , asynchronus, process, update.
Thanks in advanceHi Vijay Kumar
CLASSICAL BATCH INPUT (Session Method)
CALL TRANSACTION
BATCH INPUT METHOD:
This method is also called as CLASSICAL METHOD.
Features:
Asynchronous processing.
Synchronous Processing in database update.
Transfer data for more than one transaction.
Batch input processing log will be generated.
During processing, no transaction is started until the previous transaction has been written to the database.
CALL TRANSACTION METHOD :
This is another method to transfer data from the legacy system.
Features:
Synchronous processing. The system performs a database commit immediately before and after the CALL TRANSACTION USING statement.
Updating the database can be either synchronous or asynchronous. The program specifies the update type.
Transfer data for a single transaction.
Transfers data for a sequence of dialog screens.
No batch input processing log is generated.
http://www.sap-img.com/abap/difference-between-batch-input-and-call-transaction-in-bdc.htm
Among the two methods call transaction is better compared to session bcoz data transfer is faster in it.
Differences between call transaction and session.
Session Method:
1) Data is not updated in the database table until the session is processed.
2) No sy-subrc is returned.
3) Error log is created for error records.
4) Updation is always synchronous.
Call Transaction Method:
1) Immediate updation in the database table.
2) sy-subrc is returned.
3)Error need to be handled explicitly.
4) updation can be synchronous as well as asynchronous.
2) ya u can use using the N mode no screen.
3)u can't handle multiple transaction in call transaction.
4) u can handle multiple transaction in session using the BDC_INSERT fm.
5)When u go to SM35 u can able to see the error records.
Which is best?
That depends on your requirement. Both of them have there advantages.
According to the situation u can choose any one of these.
difference between batch input and call transaction in BDC Session method.
1) synchronous processing.
2) can tranfer large amount of data.
3) processing is slower.
4) error log is created
5) data is not updated until session is processed.
Call transaction.
1) asynchronous processing
2) can transfer small amount of data
3) processing is faster.
4) errors need to be handled explicitly
5) data is updated automatically
For session method,these are the function modules to b used.
BDC_OPEN_GROUP
BDC_INSERT
BDC_CLOSE_GROUP
For call transaction,this is the syntax.
CALL TRANSACTION TCODE USING BDCDATA
MODE A or E or N
UPDATE A or S
MESSAGES INTO MESSTAB.
Take a scenario where we need to post documents in FB01 and the input file has say 2000 records (2000 documents, not line items in FB01 but 2000 records)
In the BDC call transaction method
We call the transaction FB01 2000 times (once for each record posting) and if the processing fails in record no 3 it can be captured and start with reocord 4.
Eg: Loop at itab.
call transaction FB01
capture errors
endloop.
In the session method.
We do not explicity call the transaction 2000 times, but all the records are appeneded into a session and this session is stored. The processinf of the session is done wwhenever the user wants it to be done. Hence the errors cannot be captured in the program itself
Check these link:
http://www.sap-img.com/abap/difference-between-batch-input-and-call-transaction-in-bdc.htm
http://www.sap-img.com/abap/question-about-bdc-program.htm
http://www.itcserver.com/blog/2006/06/30/batch-input-vs-call-transaction/
http://www.planetsap.com/bdc_main_page.htm
Batch Input Session method is asynchronous as told by others here. But the advantage of this is that you have all the error messages and the data for each transaction held persistantly. You don't have to code anything for processing them or writing the logs.
But at the same time, the same feature can be disadvantageous if you need to react to an error or if there are too many errors to manually correct in a session. Since the session are created in the program and its execution is done seperately, you loose the trackability of such transactions.
With a call transaction, what was a disadvantage above will become an advantage. Call transaction immediately gives you messages back and you can react to it in your program. But the disadvantage is that, if you have several hundreds of transactions to run, running them from within the program can be resource crunching affair. It will hamper the system performance and you cannot really distribute the load. Of course, you have some mechanisms with which you can overcome this, but you will have to code for it. Also, storing the messages and storing the errored transaction data etc will have to be handled by you in the program. Whereas, in batch input session, your program's job is to just create the session, after that everything is standard SAP system's responsibility.
Ideally, you should do a call transaction if the resources are not a problem and if it fails, put the errored transaction into a session.
You can decide based on the data volume that your BDC is processing. If data volume is high go for session else call transaction will do.The call transaction updates will be instantaneous where as session needs to be processed explictly after creation.
Session Method
1) Session method supports both small amount of data aswell as large amount of data
2) data processing is asynchronus and data updation is synchronus.
3) it process multiple apllication while perfomaning validations.
4) in session method data will be updated in data base only after processing session only.
5) system provide by default logfile for handling error records.
6) it supports both foreground aswell as background process
in bdc we use FM ...
bdc_open_group " for creating Session
bdc_insert " adding transaction and bdcdata table for updating database
bdc_close_group " for closing Session
Call Transaction
1) Call transaction exclusively for small amout of data
2) it supports only one apllication while perfoming validations
3) there is no default logfile, We can explicitly provide logic for creating logfile for handling error records.
we can create logfile by using structure....BDCMSGCOLL
4) it doesn't support background processing.
5) data processing is synchronous and Data updation is Synchronous( default), in
this method also supports daya updation in asynchronus process also.
syntax:
Call transaction <transaction-name> using BDCDATA
mode <A/N/E>
update <L/A/S>
messages into BDCMSGCOLL.
BDC:
Batch Data Communication (BDC) is the process of transferring data from one SAP System to another SAP system or from a non-SAP system to SAP System.
Features :
BDC is an automatic procedure.
This method is used to transfer large amount of data that is available in electronic medium.
BDC can be used primarily when installing the SAP system and when transferring data from a legacy system (external system).
BDC uses normal transaction codes to transfer data.
Types of BDC :
CLASSICAL BATCH INPUT (Session Method)
CALL TRANSACTION
BATCH INPUT METHOD:
This method is also called as CLASSICAL METHOD.
Features:
Asynchronous processing.
Synchronous Processing in database update.
Transfer data for more than one transaction.
Batch input processing log will be generated.
During processing, no transaction is started until the previous transaction has been written to the database.
CALL TRANSACTION METHOD :
This is another method to transfer data from the legacy system.
Features:
Synchronous processing. The system performs a database commit immediately before and after the CALL TRANSACTION USING statement.
Updating the database can be either synchronous or asynchronous. The program specifies the update type.
Transfer data for a single transaction.
Transfers data for a sequence of dialog screens.
No batch input processing log is generated.
For BDC:
http://myweb.dal.ca/hchinni/sap/bdc_home.htm
https://www.sdn.sap.com/irj/sdn/wiki?path=/display/home/bdc&
http://www.sap-img.com/abap/learning-bdc-programming.htm
http://www.sapdevelopment.co.uk/bdc/bdchome.htm
http://www.sap-img.com/abap/difference-between-batch-input-and-call-transaction-in-bdc.htm
http://help.sap.com/saphelp_47x200/helpdata/en/69/c250684ba111d189750000e8322d00/frameset.htm
http://www.sapbrain.com/TUTORIALS/TECHNICAL/BDC_tutorial.html
Check these link:
http://www.sap-img.com/abap/difference-between-batch-input-and-call-transaction-in-bdc.htm
http://www.sap-img.com/abap/question-about-bdc-program.htm
http://www.itcserver.com/blog/2006/06/30/batch-input-vs-call-transaction/
http://www.planetsap.com/bdc_main_page.htm
call Transaction or session method ?
Check the following links:
http://www.sap-img.com/bdc.htm
See below example code :
Call three FM : BDC_OPEN_GROUP,BDC_INSERT and BDC_CLOSE_GROUP.
Once you execute the program and it creates the session at SM35 Transaction.
Report : ZMPPC011
Type : Data upload
Author : Chetan Shah
Date : 05/05/2005
Transport : DV3K919557
Transaction: ??
Description: This ABAP/4 Program creates new Production Versions
(C223). It accepts tab-delimited spreadsheet input and
creates BDC sessions.
Modification Log
Date Programmer Request # Description
06/10/2005 Chetan Shah DV3K919557 Initial coding
report zmppc011 no standard page heading line-size 120 line-count 55
message-id zz.
pool of form routines
include zmppn001.
Define BDC Table Structure
data: begin of itab_bdc_tab occurs 0.
include structure bdcdata.
data: end of itab_bdc_tab.
Input record layout of Leagcy File
data: begin of itab_xcel occurs 0,
matnr(18) type c,
werks(4) type c,
alnag(2) type c,
verid(4) type c,
text1(40) type c,
bstmi like mkal-bstmi,
bstma like mkal-bstma,
adatu(10) type c,
bdatu(10) type c,
stlal(2) type c,
stlan(1) type c,
serkz(1) type c,
mdv01(8) type c,
elpro(4) type c,
alort(4) type c,
end of itab_xcel.
data: begin of lt_pp04_cache occurs 0,
matnr like itab_xcel-matnr,
werks like itab_xcel-werks,
alnag like itab_xcel-alnag,
plnnr like mapl-plnnr,
arbpl like crhd-arbpl,
ktext like crtx-ktext,
end of lt_pp04_cache.
data: v_ssnnr(4) type n,
v_lines_in_xcel like sy-tabix,
v_ssnname like apqi-groupid,
v_trans_in_ssn type i,
wa_xcel LIKE itab_xcel,
l_tabix like sy-tabix,
v_matnr like rc27m-matnr,
v_plnnr like mapl-plnnr,
v_plnal like mapl-plnal,
v_tcode like sy-tcode value 'C223',
v_plnty like plas-plnty value 'R',
v_objty like crhd-objty value 'A',
v_plpo_steus like plpo-steus value 'PP04',
v_verwe like crhd-verwe value '0007'.
Parameters
selection-screen: skip 3.
selection-screen: begin of block 1 with frame.
parameters: p_name like rlgrap-filename
default 'C:\My Documents\InputFile.txt'
obligatory,
bdc session name prefix
p_bdcpfx(6) default 'ZPVCRT'
obligatory,
number for transction per BDC session
p_trnssn type i
default 2000 obligatory,
retain the BDC session after successfull execution
p_keep like apqi-qerase
default 'X',
user who will be executing BDC session
p_uname like apqi-userid
default sy-uname
obligatory.
selection-screen: end of block 1.
possible entry list (F4 dropdown) for input file name
at selection-screen on value-request for p_name.
*-SELECT FILE FROM USERS LOCAL PC
call function 'WS_FILENAME_GET'
exporting
DEF_FILENAME = ' '
def_path = 'C:\Temp\'
mask = ',.,..'
mode = 'O'
title = 'Select File '(007)
importing
filename = p_name
RC =
exceptions
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
others = 5.
if sy-subrc 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
begin the show
start-of-selection.
read data from input file
perform transfer_xcel_to_itab.
loop at itab_xcel.
hang on to xcel line num
l_tabix = sy-tabix.
each line in the xcel file marks begining of new prod.version defn
if num-of-trnas-in-session = 0, create new BDC session
if v_trans_in_ssn is initial.
perform bdc_session_open.
endif.
begin new bdc script for rtg create trans
fill in bdc-data for prod.version maintenance screens
perform bdc_build_script.
insert the bdc script as a BDC transaction
perform bdc_submit_transaction.
keep track of how many BDC transactions were inserted in the BDC
session
add 1 to v_trans_in_ssn.
if the user-specified num of trans in BDC session is reached OR
if end of input file is reached, close the BDC session
if v_trans_in_ssn = p_trnssn or
l_tabix = v_lines_in_xcel.
perform bdc_session_close.
clear v_trans_in_ssn.
endif.
endloop.
top-of-page.
call function 'Z_HEADER'
EXPORTING
FLEX_TEXT1 =
FLEX_TEXT2 =
FLEX_TEXT3 =
FORM TRANSFER_XCEL_TO_ITAB *
Transfer Xcel Spreadsheet to SAP Internal Table *
form transfer_xcel_to_itab.
Read the tab-delimited file into itab
call function 'WS_UPLOAD'
exporting
filename = p_name
filetype = 'DAT'
IMPORTING
filelength = flength
tables
data_tab = itab_xcel
exceptions
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_table_width = 4
invalid_type = 5
no_batch = 6
unknown_error = 7
others = 8.
if sy-subrc = 0.
sort the data
sort itab_xcel by matnr werks.
clear v_lines_in_xcel.
if no data in the file - error out
describe table itab_xcel lines v_lines_in_xcel.
if v_lines_in_xcel is initial.
write: / 'No data in input file'.
stop.
endif.
else.
if file upload failed - error out
write: / 'Error reading input file'.
stop.
endif.
endform.
FORM BDC_SESSION_OPEN *
Open BDC Session *
form bdc_session_open.
create bdc session name = prefix-from-selectn-screen + nnnn
add 1 to v_ssnnr.
concatenate p_bdcpfx v_ssnnr into v_ssnname.
open new bdc session
call function 'BDC_OPEN_GROUP'
exporting
client = sy-mandt
group = v_ssnname
keep = p_keep
user = p_uname
exceptions
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
others = 11.
endform.
FORM BDC_BUILD_SCRIPT *
Build BDC *
form bdc_build_script.
data: l_arbpl like crhd-arbpl,
l_text1 like mkal-text1,
l_mdv01 like mkal-mdv01,
l_mapl like mapl.
clear bdc-data itab - begin of new bdc transaction
clear itab_bdc_tab.
refresh itab_bdc_tab.
read material cross reference tables to determine sap part#
clear : v_matnr, v_plnnr, v_plnal.
perform read_matnr_cross_ref using itab_xcel-matnr
itab_xcel-werks
changing v_matnr.
determine the version description to use
if itab_xcel-text1 is initial.
l_text1 = itab_xcel-verid.
else.
l_text1 = itab_xcel-text1.
endif.
determine the routing group# and group ctr# to use
perform read_routing .
determine the production line to use
if itab_xcel-mdv01 is initial.
if not provided in the file then:
prod line = work ctr on the last PP04 op of the rtg determined above
perform read_wc_on_last_pp04 using v_plnnr v_plnal
changing l_mdv01.
NOTE: when executing the above form\routine, if v_plnnr is initial
or v_plnal is initial, THEN l_mdv01 will automatically be
returned blank (ie initial)
else.
l_mdv01 = itab_xcel-mdv01.
endif.
build bdc script
perform bdc_build_script_record
fill in initial screen
using: 'X' 'SAPLCMFV' '1000',
' ' 'BDC_OKCODE' '=ENTE',
' ' 'MKAL-WERKS' itab_xcel-werks,
' ' 'MKAL-MATNR' v_matnr,
' ' 'MKAL_ADMIN-DISPO' space,
' ' 'MKAL-PLNNR' space,
' ' 'MKAL_ADMIN-STTAG' space,
' ' 'MKAL-PLNNG' space,
' ' 'MKAL-MDV01' space,
' ' 'MKAL-PLNNM' space,
click create button on initial screen and go to detail screen
'X' 'SAPLCMFV' '1000',
' ' 'BDC_OKCODE' '=CREA',
fill in the detail screen and go back to initial screen
'X' 'SAPLCMFV' '2000',
' ' 'BDC_OKCODE' '=CLOS',
' ' 'MKAL_EXPAND-MATNR' v_matnr,
' ' 'MKAL_EXPAND-VERID' itab_xcel-verid,
' ' 'MKAL_EXPAND-TEXT1' l_text1,
' ' 'MKAL_EXPAND-BSTMI' itab_xcel-bstmi,
' ' 'MKAL_EXPAND-BSTMA' itab_xcel-bstma,
' ' 'MKAL_EXPAND-ADATU' itab_xcel-adatu,
' ' 'MKAL_EXPAND-BDATU' itab_xcel-bdatu,
' ' 'MKAL_EXPAND-PLTYG' v_plnty,
' ' 'MKAL_EXPAND-PLNNG' v_plnnr,
' ' 'MKAL_EXPAND-ALNAG' v_plnal,
' ' 'MKAL_EXPAND-STLAL' itab_xcel-stlal,
' ' 'MKAL_EXPAND-STLAN' itab_xcel-stlan,
' ' 'MKAL_EXPAND-SERKZ' itab_xcel-serkz,
' ' 'MKAL_EXPAND-MDV01' l_mdv01,
' ' 'MKAL_EXPAND-ELPRO' itab_xcel-elpro,
' ' 'MKAL_EXPAND-ALORT' itab_xcel-alort,
save the production version from initial screen
'X' 'SAPLCMFV' '1000',
' ' 'BDC_OKCODE' '=SAVE'.
endform.
FORM BDC_SUBMIT_TRANSACTION *
Submit BDC Session *
form bdc_submit_transaction.
Load BDC script as a trqansction in BDC session
call function 'BDC_INSERT'
exporting
tcode = v_tcode
tables
dynprotab = itab_bdc_tab
exceptions
internal_error = 01
not_open = 02
queue_error = 03
tcode_invalid = 04.
endform.
FORM BDC_BUILD_SCRIPT_RECORD *
form bdc_build_script_record using dynbegin name value.
clear itab_bdc_tab.
if dynbegin = 'X'.
move: name to itab_bdc_tab-program,
value to itab_bdc_tab-dynpro,
'X' to itab_bdc_tab-dynbegin.
else.
move: name to itab_bdc_tab-fnam,
value to itab_bdc_tab-fval.
shift itab_bdc_tab-fval left deleting leading space.
endif.
append itab_bdc_tab.
endform.
FORM BDC_SESSION_CLOSE *
Close BDC Session *
form bdc_session_close.
close the session
call function 'BDC_CLOSE_GROUP'
exceptions
not_open = 1
queue_error = 2
others = 3.
skip 2.
if sy-subrc ne 0.
write: / 'Error Closing BDC Session ' , 'RETURN CODE: ', sy-subrc.
else.
write : / 'Session created:', v_ssnname,
50 '# of transactions:', v_trans_in_ssn.
endif.
endform.
*& Form read_routing_cache
*FORM read_routing_cache USING pi_matnr
pi_werks
pi_alnag
pi_verid
pi_mdv01.
DATA: BEGIN OF lt_plpo OCCURS 0,
vornr LIKE plpo-vornr,
objty LIKE crhd-objty,
objid LIKE crhd-objid,
arbpl LIKE crhd-arbpl,
END OF lt_plpo,
l_mapl_plnnr LIKE mapl-plnnr.
determine the routing group#
CLEAR lt_pp04_cache.
chk if its in the cache first, if not then get it from MAPL table
and put it in the cache
READ TABLE lt_pp04_cache WITH KEY matnr = pi_matnr
werks = pi_werks
alnag = pi_alnag.
IF sy-subrc = 0.
do nothing - lt_pp04_cache header line has rtg#
ELSE.
get the routing group # from MAPL
SELECT plnnr INTO l_mapl_plnnr
FROM mapl UP TO 1 ROWS
WHERE matnr = pi_matnr AND
werks = pi_werks AND
plnty = 'R' AND
plnal = pi_alnag AND
loekz = space.
ENDSELECT.
put it in the cache internal table
IF NOT l_mapl_plnnr IS INITIAL.
lt_pp04_cache-matnr = pi_matnr.
lt_pp04_cache-werks = pi_werks.
lt_pp04_cache-alnag = pi_alnag.
lt_pp04_cache-plnnr = l_mapl_plnnr.
APPEND lt_pp04_cache.
ENDIF.
ENDIF.
if the rtg# was determined AND
-- the work center was not determined yet AND
-- work center was really needed for this line in the input file
then
-- read the work center from last PP04 operation on the routing
-- update the cache accordingly
IF NOT lt_pp04_cache-plnnr IS INITIAL AND
lt_pp04_cache-arbpl IS INITIAL AND
( pi_verid IS INITIAL OR
pi_mdv01 IS INITIAL ).
read the last PP04 operation
CLEAR lt_plpo.
REFRESH lt_plpo.
SELECT vornr eobjty eobjid e~arbpl
INTO CORRESPONDING FIELDS OF TABLE lt_plpo
FROM plas AS b
INNER JOIN plpo AS c
ON bplnty = cplnty AND
bplnnr = cplnnr AND
bzaehl = czaehl
INNER JOIN crhd AS e
ON carbid = eobjid
WHERE b~plnty = v_plnty AND
b~plnnr = lt_pp04_cache-plnnr AND
b~plnal = lt_pp04_cache-alnag AND
c~loekz = space AND
c~steus = v_plpo_steus AND
e~objty = v_objty AND
e~werks = lt_pp04_cache-werks AND
e~verwe = v_verwe.
SORT lt_plpo BY vornr DESCENDING.
READ TABLE lt_plpo INDEX 1.
IF NOT lt_plpo-arbpl IS INITIAL.
lt_pp04_cache-arbpl = lt_plpo-arbpl.
read work center description
SELECT SINGLE ktext INTO lt_pp04_cache-ktext
FROM crtx WHERE objty = lt_plpo-objty AND
objid = lt_plpo-objid AND
spras = sy-langu.
the following read will get the index of the correct record to be
updated in the cache
READ TABLE lt_pp04_cache
WITH KEY matnr = pi_matnr
werks = pi_werks
alnag = pi_alnag.
MODIFY lt_pp04_cache
INDEX sy-tabix
TRANSPORTING arbpl ktext.
ENDIF.
ENDIF.
*ENDFORM. " read_last_pp04_operation_cache
*& Form read_routing
form read_routing.
data: begin of lt_mapl occurs 0,
plnnr like mapl-plnnr,
plnal like mapl-plnal,
end of lt_mapl,
l_arbpl like crhd-arbpl.
get all the rtg# and grp ctr# from MAPL
select plnnr plnal
into corresponding fields of table lt_mapl
from mapl
where matnr = v_matnr and
werks = itab_xcel-werks and
plnty = v_plnty and "Rate Routing
loekz = space. "with del flag = OFF
sort lt_mapl by plnal.
if not itab_xcel-verid is initial.
if the verid=0001 then use the 1st good rtg-grp# and grp-ctr#
if itab_xcel-verid = '0001'.
read table lt_mapl index 1.
v_plnnr = lt_mapl-plnnr.
v_plnal = lt_mapl-plnal.
else.
if the verid0001 then use the rtg-grp# and grp-ctr# of the routing
whose work center on the last PP04 operation matches the given verid
loop at lt_mapl.
clear l_arbpl.
get the work center from the last PP04 operation
perform read_wc_on_last_pp04 using lt_mapl-plnnr
lt_mapl-plnal
changing l_arbpl.
if itab_xcel-verid = l_arbpl.
v_plnnr = lt_mapl-plnnr.
v_plnal = lt_mapl-plnal.
exit.
endif.
endloop.
endif.
else.
do nothing
endif.
For version IDs that are other then '0000' or 'ZWIP' :--
if itab_xcel-verid NE '0000' and
itab_xcel-verid NE 'ZWIP'.
if routing group# or group counter was not determined, make the
valid-to date 99/99/9999 so that the BDC, on execution, errors out.
if v_plnnr is initial or
v_plnal is initial.
itab_xcel-bdatu = '99/99/9999'.
endif.
endif.
determine the routing group#
CLEAR lt_pp04_cache.
chk if its in the cache first, if not then get it from MAPL table
and put it in the cache
READ TABLE lt_pp04_cache WITH KEY matnr = pi_matnr
werks = pi_werks
alnag = pi_alnag.
IF sy-subrc = 0.
do nothing - lt_pp04_cache header line has rtg#
ELSE.
get the routing group # from MAPL
put it in the cache internal table
IF NOT l_mapl_plnnr IS INITIAL.
lt_pp04_cache-matnr = pi_matnr.
lt_pp04_cache-werks = pi_werks.
lt_pp04_cache-alnag = pi_alnag.
lt_pp04_cache-plnnr = l_mapl_plnnr.
APPEND lt_pp04_cache.
ENDIF.
ENDIF.
if the rtg# was determined AND
-- the work center was not determined yet AND
-- work center was really needed for this line in the input file
then
-- read the work center from last PP04 operation on the routing
-- update the cache accordingly
IF NOT lt_pp04_cache-plnnr IS INITIAL AND
lt_pp04_cache-arbpl IS INITIAL AND
( pi_verid IS INITIAL OR
pi_mdv01 IS INITIAL ).
read the last PP04 operation
CLEAR lt_plpo.
REFRESH lt_plpo.
SELECT vornr eobjty eobjid e~arbpl
INTO CORRESPONDING FIELDS OF TABLE lt_plpo
FROM plas AS b
INNER JOIN plpo AS c
ON bplnty = cplnty AND
bplnnr = cplnnr AND
bzaehl = czaehl
INNER JOIN crhd AS e
ON carbid = eobjid
WHERE b~plnty = v_plnty AND
b~plnnr = lt_pp04_cache-plnnr AND
b~plnal = lt_pp04_cache-alnag AND
c~loekz = space AND
c~steus = v_plpo_steus AND
e~objty = v_objty AND
e~werks = lt_pp04_cache-werks AND
e~verwe = v_verwe.
SORT lt_plpo BY vornr DESCENDING.
READ TABLE lt_plpo INDEX 1.
IF NOT lt_plpo-arbpl IS INITIAL.
lt_pp04_cache-arbpl = lt_plpo-arbpl.
read work center description
SELECT SINGLE ktext INTO lt_pp04_cache-ktext
FROM crtx WHERE objty = lt_plpo-objty AND
objid = lt_plpo-objid AND
spras = sy-langu.
the following read will get the index of the correct record to be
updated in the cache
READ TABLE lt_pp04_cache
WITH KEY matnr = pi_matnr
werks = pi_werks
alnag = pi_alnag.
MODIFY lt_pp04_cache
INDEX sy-tabix
TRANSPORTING arbpl ktext.
ENDIF.
ENDIF.
endform. " read_last_pp04_operation_cache
*& Form read_wc_on_last_pp04
form read_wc_on_last_pp04 using pi_plnnr
pi_plnal
changing pe_arbpl.
data: begin of lt_plpo occurs 0,
vornr like plpo-vornr,
objty like crhd-objty,
objid like crhd-objid,
arbpl like crhd-arbpl,
end of lt_plpo.
get all the PP04 operations for the given rtg# & grp-ctr#
select vornr eobjty eobjid e~arbpl
into corresponding fields of table lt_plpo
from plas as b
inner join plpo as c
on bplnty = cplnty and
bplnnr = cplnnr and
bzaehl = czaehl
inner join crhd as e
on carbid = eobjid
where b~plnty = v_plnty and "Rate Routing
b~plnnr = pi_plnnr and
b~plnal = pi_plnal and
c~loekz = space and "Oper Del Flag = OFF
c~steus = v_plpo_steus and "PP04
e~objty = v_objty. "WC Obj Type = 'A'
read the last operation
sort lt_plpo by vornr descending.
read table lt_plpo index 1.
pe_arbpl = lt_plpo-arbpl.
endform. " read_wc_on_last_pp04
Goto LSMW-> Select Direct Input method in 1st step. These are the standard programs for data transfer.
Otherwise goto SPRO->SAP Reference IMG-> Under this you'll find standard data transfer programs module wise.
Reward points,
Shakir -
Redefine Static Methods in ABAP OO
Hello,
I want to redefine an public static method and returns always an error.
Okay, I already solved the problem with an workaround, but I still don't understand, why it is not possible to redefine static methods in ABAP OO.
If someone can give me an plausible reason, so I don't have do die stupid. G
Thanks for help!
MatthiasIt is built into the language that way. HEre is a link that may or may not give you an answer.
redefine static method?
Regards,
Rich Heilman -
Meaning of factory method in abap objects
Hi,
Can anybody help me in understanding the meaning of factory method in abap object? what is the importance of this?
Regards
SudhansuHi Krish and Sudhansu,
Design patterns are solutions which are already verified and known by many developers. That is why it is worth to use them. There is no need to reinvent the wheel in many cases.
I would recommend book which is placed in the ABAP world:
http://www.sap-press.com/products/Design-Patterns-in-Object%252dOriented-ABAP-(2nd-Edition).html
Although Java language has intuitive syntax, there are some special things in ABAP development so it is better to check solutions adjusted for ABAP editor.
The most common usage of factory pattern is to simplify object creation.
- By one method call you provide required parameters and do all initializations, including dependent objects.
- Class can have many factory methods, if you want to provide more ways of initialization.
- Factory method is usually static in the class and they return initialized instance of object for this class.
- There is naming convention to start factory method name with "create" - easy to recognize pattern.
- If you set property of class to "private instantiation" then you force to use factory method for object creation. In this way it is really simple to find all places where object are created with given set of input parameters - find references of factory method.
Factory pattern becomes even more powerful if we add inheritance. Factory method returns basic object (like ZCL_VEHICLE) but its implementation can return different subclass instance, depending on input parameter (ZCL_CAR, ZCL_TRAIN etc). Each instance can implement differently behavior (methods implementation), but these are object oriented techniques.
Regards,
Adam -
How to insert Method in ABAP code
Hi Gurus,
Plz tell me how to insert a METHOD in ABAP code as we do in the case of inserting function in ABAP code using PATTERN.Button
Rgds
rajeshHi,
Try this.
Click pattern tab ans select AABAP object patterns.
Select call method.
Then give the instance name , class/interface name and the method name.
Sharin. -
Query regerding Sapscript : Calling abap subroutines
Hello everybody
Hope everyone is doing fine.
I've a small query. Whenever we require to call an abap subroutine from an abap sapscript we do the same using PERFORM statement. The syntax for the same is as below:
PERFORM SUBROUTINE_NAME IN PROGRAM PROGRAM_NAME
USING &VARAIABLE&
CHANGING &VARAIABLE&
ENDPERFORM
Here we are passing the varaiables to the subroutine and getting back values in varaibles. In the actual program we then read values from in_tab and out_tab having structures similar to itcsy.
The above mentioned is as per my understanding. My query is as follows:
If in the above statement instead of passing varaibles abnd getting back variables can be pass/get back an internal table?
I had read somewhere that it is possible using structures. If anyone is aware of how to do the same can you please give me the syntax. Actually how to get value from subroutine into an internal table. What will be the structure? Will it be same as itcsy?
Thanks a lot to everybody in advance.
Thanks & Regards
Kabir Radhakrishnanihi check this program!!!
REPORT Z_TEST_VBBE .
types : begin of t_vbap ,
VBELN like vbap-VBELN,
posnr like vbap-posnr,
concat(18),
end of t_vbap.
tables : vbap .
select-options : s_vbeln for vbap-vbeln .
data : it_vbap type table of t_vbap ,
wa_vbap type t_vbap.
select vbeln posnr from vbap into table it_vbap
where vbeln in s_vbeln .
" group by vbeln.
loop at it_vbap into wa_vbap .
perform select_data using wa_vbap-vbeln
wa_vbap-posnr
changing wa_vbap-concat .
modify it_vbap from wa_vbap .
endloop .
*& Form select_data
*form select_data using vbeln type vbap-vbeln
posnr type vbap-posnr
concat.
*endform. " select_data
*& Form select_data
form select_data using p_wa_vbap_vbeln
p_wa_vbap_posnr
changing p_wa_vbap_concat.
concatenate p_wa_vbap_vbeln
p_wa_vbap_posnr
into p_wa_vbap_concat
separated by '|' .
endform. " select_data -
Form - Perform and ABAP coding
Hi:
I have a requirement to get vendor address from database and print on the form. I could print only one field only Name1, but not details like Street or country Etc are not getting printed. Even if we pass multiple variables as input and putput variables using perform of form, I think we need to declare only one input as INTTAB STRUCTURE ITCSY and one out put variable as OUTTAB STRUCTURE ITCSY in the ABAP program. In the program I am using Index option like 1, 2 and modifying details of OUTTAB. Is it correct?.
Still I am unable to print complete address on the form.
For this I am unsing Perfom option in the form.
Can you please help in the following:
1) Can I pass one value vendor from form using perform and get back a structure from ABAP program?.
2) I am using following:
DEFINE &VENDOR_NAME& = ' '
DEFINE &VENDOR_STREET& = ' '
PERFORM GET_DATA IN PROGRAM Z_TEST
USING &VENDOR_NO&
CHANGING &VENDOR_NAME&
CHANGING &VENDOR_STREET&
ENDPERFORM.
For Printing I am using inthe form
&VENDOR_NAME&
&VENDOR_STREET&
In the ABAP program I am using
FORM GET_DATA TABLES INTTAB STRUCTURE ITCSY
OUTTAB1 STRUCTURE ITCSY.
IF SY-SUBRC EQ 0.
SELECT SINGLE NAME1 STR_SUPPL1
FROM ADRC
INTO (V_NAME1,V_STR_SUPPL1)
WHERE ADDRNUMBER = V_ADRNR.
IF SY-SUBRC EQ 0.
*- Name1
READ TABLE OUTTAB1 INDEX 1.
MOVE V_NAME1 TO OUTTAB1-VALUE.
MODIFY OUTTAB1 INDEX SY-TABIX.
*- Street
READ TABLE OUTTAB1 INDEX 2.
MOVE V_STR_SUPPL1 TO OUTTAB1-VALUE.
MODIFY OUTTAB1 INDEX SY-TABIX.
ENDIF.
Can you please check above code and let me know if I am doing mistake anywhere?..like passing variables, printing variables on the form and ABAP sub-routine etc.
Please do not copye again same code what is find in SAP ABAP help.
Thanks in advance for your help.
Thanks,
RamaNaren:
Your code did not work...
Sorry I did not paste my complete code(when I posted message )as too much code might be confusing. Please find my code below:
FORM GET_DATA TABLES INTTAB STRUCTURE ITCSY
OUTTAB1 STRUCTURE ITCSY.
DATA: V_ADRNR LIKE LFA1-ADRNR,
V_NAME1 LIKE ADRC-NAME1,
V_STR_SUPPL1 LIKE ADRC-STR_SUPPL1,
V_LIFNR LIKE LFA1-LIFNR.
READ TABLE INTTAB INDEX 1.
V_LIFNR = INTTAB-VALUE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = V_LIFNR
IMPORTING
OUTPUT = V_LIFNR.
SELECT SINGLE ADRNR
INTO V_ADRNR
FROM LFA1
WHERE LIFNR = V_LIFNR.
IF SY-SUBRC EQ 0.
SELECT SINGLE NAME1 STR_SUPPL1
FROM ADRC
INTO (V_NAME1,V_STR_SUPPL1)
WHERE ADDRNUMBER = V_ADRNR.
IF SY-SUBRC EQ 0.
*- Name1
READ TABLE OUTTAB1 INDEX 1.
MOVE V_NAME1 TO OUTTAB1-VALUE.
MODIFY OUTTAB1 INDEX SY-TABIX.
*- Name1
READ TABLE OUTTAB1 INDEX 2.
MOVE V_STR_SUPPL1 TO OUTTAB1-VALUE.
APPEND OUTTAB1.
ELSE.
READ TABLE OUTTAB1 INDEX 1.
MOVE 'NO NAME' TO OUTTAB1-VALUE.
MODIFY OUTTAB1 INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDFORM.
I am not sure where the mistake can be in the SAP-Form or in the ABAP Subroutine code....
Thanks,
Rama -
Accessing the Par file or java methods in ABAP programming at ECC from EP
Hi experts,
Can we access par file or java methods in ABAP programming (ECC side)which are at Enterprise portal side .If it is possible please
let me know the procedure.Thanks for your help.
Thanks and Regards,
VenkatHi Das,
The mentioned wiki is for uploading the par file ,but my question is diffrent.This file or java method need to be used in ABAP side.
Thanks and Regards,
venkat -
Hi,
I have read the excellent blogs on Workflow and ABAP OO by Joycelyn Dart (/people/jocelyn.dart/blog/2007/07/16/referencing-bor-objects-in-abap-oo-classes). I have sucessfully created a BO (of type SIBFLPORB) in my class. However, I cannot figure out how to retrieve the workitem container that holds the BO. I have used macros before in workflow programming exists, but there I get the container from a workitem context. I can't find the workitem context in my class. Please provide me with some code samples of how I can retrieve the workitem container that holds the BO.
I am considering passing the workitem id to the method and reading the container via SAP_WAPI_READ_CONTAINER. If this is a good solution, then I see no point in having the BO as an attribute of the classe. Is it a good solution?
Thanks!
ElvezI am probably missing something obvious here (or we are not even speaking about a same thing), but I still try to clarify my point.
>I could of course just pass the necessary data as parameters to the class
This is the part that I don't really understand. If you already have an instance of a class existing (=there is an object instantiated), which has the BO as an attribute, there shouldn't be any need to change a signature of any method(?). The only thing you need to enhance is the constructor of your class.
Currently you create the BO instance as an attribute in your constructor method (isn't this correct?). Just create the attributes you need from the BO into your class, and "populate" them in your constructor. Or if it is an method that you need, just create a similar method (=you can copy the code) into your class.
This all might be much easier than using the WF macros, which shouldn't be that difficult either - as Jocelyn says:
"You will still need to use BOR macros in your ABAP OO classes if and only if you want to call BOR attributes and methods in your ABAP OO methods.
If you need to do this then make sure you include the BOR macro definitions in your class by putting the special include program <cntn02> in the "Macros" section of your ABAP OO class."
Regards,
Karri
Maybe you are looking for
-
Hi All , I got an error while executing a DTP. Short Dump analysis points this error. : DBIF_REPO_SQL_ERROR. Please provide in your valuable inputs to resolve this error. Thank & Regards, Rohit Garg
-
[915 Series] LiveUpdate 3 Hangs systems at end of Windows XP boot
After installing LiveUpdate 3, my system hangs near the end of XP boot. Searching the forum, I found one thread related to this - https://forum-en.msi.com/index.php?topic=63173.0 but it didn't offer any solution. Anyone else experience this or have
-
I just purchased a geforce ti4200 w/128mb of ram and 8x agp. The problem is that I can not get AGP 8x enabled, the agp utility that came with my 655-LS mobo says that my mainboard and video card capabilities are only 4x. Both my bios and SiS driver
-
Help with SmartSound and removing sound
I have been messing around with PSE10 for a few hours now and no matter what I try I can not get audio to work right. First I have video with my gopro from the outside of my car. I want to remove the sound track from the video because it is all wind
-
Flash player causes repeated pop-ups impeding my computer use.
I am frustrated with using flash player and its frequent upgrades which cause 3-4 pop-ups each time I click on a link. I would think you could engineer a more user friendly environment for a tool that many applications require. What's your excuse or