The more efficient is to fill the key.
In fact, I think one of the better way to access BSEG is :
- First try to do a selection in BKPF ( into table t_bkpf eg : with GJAHR, )
- And then to "select" from BSEG ( using the 'for all entries' statement ) for all entries in t_bkpf where ....
Hope this helps.
Usually, index usage makes access faster. This means that rather than querying cluster table BSEG, select data from tables like BSAS, BSIS, BSAK, BSIK, BSAD, and BSID, etc by issuing a join on the required tables and making sure that an index is used. Otherwise, you could also use logical databases like SDF, KDF, BRM, etc. The LDB programs are optimized for accessing data, though that is subjective to the level of data your require.
better approach is to use the index loop on the header table
and the item internal table which contains bseg data
loop at itab1
loop at itab-bseg from index
if the key fields = itab1-keyfields
then do the process
if the key fields ne itab1-keyfields
index = sy-tabix
i feel this is the better approach and better performance
Careful with the BS<b>I</b>K and BS<b>A</b>K. These are for Vendor (Accounts Payable) documents only, as BS<b>I</b>D and BS<b>A</b>D is for Customer (Accounts Recievable) lines.
Use BS<b>I</b>S and BS<b>A</b>S for all GL lines.
<b>I</b> Stands for Open Items
<b>A</b> Stands for Cleared Items
Thank you for clarifying. I failed to mention that using BSIK and BSAK are appropriate in my individual case, but may not be appropriate for others' requirements. I really meant to say that accessing the individual tables seems to work best for me. The inner joins are to other tables, not between BSIK/BSAK.
Hi, because you referred to something in HR ABap, there is similarity between BSEG and payroll clusters. As you know, BSEG is a cluster table and should have a table cluster with it. It is RFBLG. As you would do reading a RT cluster from PCL1 table cluster -- fill up the key and pass that key to the "import" statement to read from PCL1 table cluster which inturn would read (using the index it creates) RT(RU) cluster for say USA. Same way fill up the key and use the 'Import" statement on RFBLG(BSEG).
Just another take on reading BSEG!!!
AS BSEG is cluster table, BSEG Table consists of data from BSIS, BSAS, BSID, BSAD, BSIK, and BSAK tables.
BSIS: G/L Open Items
BSAS: G/L Closed Items
BSID: Customer Open Items(Account Receivables)
BSAD: Customer Closed Items)(Account Receivables)
BSIK: Vendor Open Items(Account Payables)
BSAK: Vendor Closed Items(Account Payables)
It is better to retrieve data from above tables based up on the data(vendor,customer,G/L account).Otherwise it will give performance issue if u use BSEG in production and may give run time error. So please use above tables to avoid run time error in Production.
this method: READ_BSEG has nothing more than select * from BSEG with WHERE (primary key) statement therefore I do not recomend to use that method.
Much better is to receive the data from another table, for example BSIS - if you need only G/L Accounts.
Then you can ask once again BSEG with primary keys if some fields are missing.
I just tested few sql-statements on the Quality System and I would like to share results:
1. Select in first flow the BSIS table to find the actuals accounts (I used the selection screen to fill in the input data):
TYPES: BEGIN OF doc,
bukrs TYPE bsis-bukrs,
belnr TYPE bsis-belnr,
gjahr TYPE bsis-gjahr,
buzei TYPE bsis-buzei,
END OF doc.
DATA: doc_int TYPE TABLE OF doc.
SELECT bukrs belnr gjahr buzei
INTO TABLE doc_int
WHERE bukrs in s_bukrs
AND hkont in s_hkont
AND gjahr in s_gjahr.
2. Select additionally BSEG if you need some other fields like MATNR which is not in BSIS.
You have 2 possibilities:
*****&1 - select with for all entries
check doc_int is not INITIAL.
SELECT bukrs belnr gjahr buzei
INTO TABLE gt_bseg_sel
FOR ALL ENTRIES IN doc_int
WHERE bukrs = doc_int-bukrs
AND belnr = doc_int-belnr
AND gjahr = doc_int-gjahr
and buzei = doc_int-buzei.
*******&2 - Select in LOOP!!!! - Why? .... I'll explain you soon.
DATA: ls_bseg_sel like line of doc_int.
FIELD-SYMBOLS: <fs_doc_int> like line of doc_int.
CHECK doc_int is not INITIAL.
LOOP AT doc_int ASSIGNING <fs_doc_int>.
SELECT single bukrs belnr gjahr buzei
WHERE bukrs = <fs_doc_int>-bukrs
AND belnr = <fs_doc_int>-belnr
AND gjahr = <fs_doc_int>-gjahr
and buzei = <fs_doc_int>-buzei.
append ls_bseg_sel to gt_bseg_sel.
And now the results:
Program check routine
Bsis time: 18.358.456
BSEG Time for all entries 387.986.642
BSEG Time with loop 34.930.089
No of lines: 210.438
As you can see, Select statement in LOOP is much much much more efficient than for all entries.