2013 Aug 22 3:41 PM
Hi All,
I am facing runtime error ITAB_DUPLICATE_KEY during retreving the data from the VBKD table into an internal table type hashed table.
Actually I am performing the following things..
Firstly I am retreving the data from the custom table into a internal table which is declared as TYPE STANDARD TABLE WITH DEFAULT KEY.
Upto this is fine..
Again retreving the data from the VBKD table for all entries in the above internal table into an another internal table which is declared as
TYPE HASHED TABLE WITH UNIQUE KEY VBELN.
I am getting runtime error as ITAB_DUPLICATE_KEY.
Whether is there any problem in the declaration of the second internal table?
And also for the VBKD table as I observe that there are 2 KEY fields which are VBELN and POSNR.
If the table contains 2 key fields, then whether can we declare the internal table like hashed table with unique key as 1 field i.e VBELN?
Whether runtime error is due to the Declaration...?
I know if we declare the internal table as NON-UNIQUE KEY then runtime error wont occurs..
But I need to know whether I am declaring the internal tabel correctly i.e if there are 2 key fields can we declare unique key with 1 key field...If YES...then what was the reason for the runtime error.
Any suggestion will be appreciated.
Regards
Raj
2013 Aug 22 6:35 PM
Yes, the problem is with the second table declaration. It is missing a key field, causing duplicate keys and then runtime errors. Instead, declare your second table as:
DATA gt_vbkd TYPE HASHED TABLE OF vbkd
WITH UNIQUE KEY vbeln posnr.
To clarify, hashed tables must have a unique key. Sorted tables can have unique or non-unique keys. Standard tables cannot have a unique key.
Best,
Eric
2013 Aug 22 5:56 PM
VBKD is a line item table. It is pretty sure that if you select on vbeln, you will get more than 1 record per vbeln.
Neal
2013 Aug 23 12:18 PM
HI,
Actually in my custom table the key fields are KUNNR,VBELN,ERDAT,MATNR
I am retreving the data from the custom table based on the selction screen date and sorted internal table by VBELN but I did not delete the adjacent duplicates of VBELN.
And my second internal table as per the requirement I am declaring the internal table as shown below.
TYPES: BEGIN OF ty_vbkd,
vbeln TYPE vbkd-vbeln,
bstkd TYPE vbkd-bstkd,
END OF ty_vbkd,
it_vbkd type hashed table of ty_vbkd with unique key vbeln.
and I am retreving data from VBKD table for all entries in the above custom table.
Now if I wrote the adjacent duplicates from the first internal table comparing by VBELN is enough?
or I need to include the key filed POSNR also and declare the second internal table like shown below..
it_vbkd type hashed table of ty_vbkd with unique key vbeln posnr.
Actually the runtime error occurs in production and we are unable to replicate the scenario in the development client that was the big problem
otherwise i can write the code and test.
Suggestions appreciated.
Regards
Raj
.
2013 Aug 23 1:47 PM
Option 1
Select single from the second table. But that say that it doesn't mater which record of the duplicates you will pull. Is that a true statement? What happens if there are 3 line items and each has a different bstkd?
I'm still thinking about other options [As time allows]
Neal
2013 Aug 23 1:58 PM
you can do like this :
LOOP AT <first_table>
INTO wa.
ls_vbkd_hashed-bstkd = wa-bstkd." Because at new make other fields *
AT NEW VBELN.
ls_vbkd_hashed-vbeln = <wa>-vbeln.
INSERT ls_vbkd_hadhed
INTO TABLE lt_vbkd_hashed.
CLEAR : ls_vbkd_hashed.
ENDAT.
ENDLOOP.
Regards
Tolga
Message was edited by: Tolga POLAT
2013 Aug 23 2:22 PM
Hi Polat,
Thanks for the reply...
Actually there is no bstkd field in the custom table..
So as per the logic given by you it wont work..
Actually my concern is declaration part only but not the coding part..
i.e. How to declare the internal table as type hashed table so that we can eliminate the runtime error..
Regards
Raj
2013 Aug 24 12:05 AM
Hi Raj,
for dublicate error, you have to eliminate key fields dublication.
I give you example for your answer
"
And my second internal table as per the requirement I am declaring the internal table as shown below.
TYPES: BEGIN OF ty_vbkd,
vbeln TYPE vbkd-vbeln,
bstkd TYPE vbkd-bstkd,
END OF ty_vbkd,
it_vbkd type hashed table of ty_vbkd with unique key vbeln.
and I am retreving data from VBKD table for all entries in the above custom table.
"
with AT NEW or DELETE ADJACENT DUPLICATES FROM itab CONPARING f1 f2 f3 you can eliminate dublication.
For declaration if you dont want to use DELETE you have to add POSNR key field to your hashed table or just use DELETE comparing vbeln.
2013 Aug 26 3:29 PM
Hi All,
Anyone knows the reason for going to dump.
Actually when i check in quality client for VBKD there are multiple entries for the saleorder number.
there the program executed correctly without having runtime error.
But what is the reason in PRD it is giving runtime error.
Suggestions Appreciated.
Regards
Raj
2013 Aug 26 4:28 PM
You still haven't given us sufficient code to evaluate your question!
It is going to come down to :
VBKD has multiple records per vbeln
AND
Hashed itab's can not have duplicate keys in them!
You have to either only read one of the multiple records,
Combine the multiple records down to one,
OR extend the hashed key.
There are no other options.
Neal
PS: OR eliminate the hashed itab...
2013 Aug 22 6:17 PM
Hi Raj,
you can declare both vbeln and posnr as key.
DATA : lt_vbkd TYPE HASHED TABLE OF vbkd WITH UNIQUE KEY vbeln posnr.
2013 Aug 22 6:35 PM
Yes, the problem is with the second table declaration. It is missing a key field, causing duplicate keys and then runtime errors. Instead, declare your second table as:
DATA gt_vbkd TYPE HASHED TABLE OF vbkd
WITH UNIQUE KEY vbeln posnr.
To clarify, hashed tables must have a unique key. Sorted tables can have unique or non-unique keys. Standard tables cannot have a unique key.
Best,
Eric
2013 Aug 22 10:00 PM
Hi Raj,
I think you kind of know the issue yourself that data from one internal table with two key fields looks like duplicate entries for another table with just one key though its really not as they are from different line items. So, if you want to use key fields of internal table, you'll have to match thiem in case. But my question to you is.... do you really need Key fields in internal table? Can you not use a simple declaration without key fields?
Regards
Sachin
2013 Aug 23 5:04 AM
Hi,
the advantage of an hash table is that the retrieving will be faster. this acually works like their will be hash function which will generate the index of the record you are searching for using the keys that you submit. Here in your table you have the primary key a combination key but in your internal table you have defined only one key. So there for when the hash internal table is searched using the particular it will find duplicate entries because in your actual table you have defined the key as a combination key
With regards
Suneesh
2013 Aug 23 5:26 AM
Hi Raj,
When you check the table VBKD, you will find that there are multiple values for same primary key field(As it is not the header table). So, your declaration is fine but add other key fields available in the table.
Regards,
Shahir Mirza
2013 Aug 23 5:39 AM
Hi Raj,
Since the vbkd is a line item table it will have multiple recorde per vbeln.
To correct this error first sort the first standard internal table by vbeln and remove adjacent duplicate entries comparing vbeln.
Now declare the hashed internal table with two unique keys VBELN and POSNR so that the combination only will be checked and avoids duplication.
Regards
Ashish Kumar,
Applexus Technologies
2013 Aug 23 5:57 AM
hi raj kumar ,
"Firstly I am retreving the data from the custom table into a internal table which is declared as TYPE STANDARD TABLE WITH DEFAULT KEY. "
In this internal table you have to check whether there is a duplicate entry and you should delete it .
" TYPE HASHED TABLE WITH UNIQUE KEY VBELN " .
Change it to TYPE HASHED TABLE WITH UNIQUE KEY VBELN POSNR.
Still you have the problem then it can be because of the below mentioned reason ..
With the SELECT statement, entries should be read into an internal table of the type HASHED TABLE via the addition "INTO itab" or "APPENDING itab". The addition "FOR ALL ENTRIES" is also used.The result of a SELECT statement with the addition "FOR ALL ENTRIES" could be built by the database interface in several portions. Internally, temporary duplicates may arise. The internal elimination of the duplicates was incorrect.
2013 Aug 23 6:54 AM
Hii
firstly
The problem is with the TYPE HASHED TABLE WITH UNIQUE KEY VBELN declaration.
Since VBKD is an item table with key fields VBELN and POSNR.But U have onlu mentioned VBELN in hashed table declaration and because of that getting duplicate entries.
So declarae the Internal table type hashed table with all combination of key dields.
secondly, before the FOR ALL ENTRIES
sort the STANDARD TABLE WITH DEFAULT KEY by VBELN.
Next delete adjacent duplicates comparing the requirement fields.
then use for all entries.
Regards
Syed
2013 Aug 23 8:31 AM
Once you've got your data declarations correct, don't use FOR ALL ENTRIES. Use an INNER JOIN instead.
For All Entries is old technology and should be avoided as much as possible. In nearly every case an INNER JOIN is more efficient than FOR ALL ENTRIES. Inner join usually provides for simpler and less error prone program code.
2013 Aug 23 12:41 PM
Raj,
You should know that this in most likely the most important thing anyone has said to you in this thread...
Neal
2013 Aug 23 1:02 PM
In case anyone wonders why, here's the reply I gave someone earlier:
See this thread: http://scn.sap.com/thread/3374731
Also: http://scn.sap.com/docs/DOC-29243 contains a huge amount of
extremely useful information about writing efficient code, and debunks
some other myths (e.g. that move-corresponding is a performance killer -
it isn't).
Google using: "for all entries" myth site:sap.com for more information.
If someone tells you to use FOR ALL ENTRIES - point them to these posts!
2013 Aug 26 3:42 PM
2013 Aug 26 4:19 PM
HI All,
Whether can anyone please clarify ...
If the database table(Taking EG:VBKD) is having 2 key fields then internal table must be declared as follows..
it_vbkd type hashed table of ty_vbkd with unique key vbeln posnr.
is it correct?
Regards
Raj
2013 Aug 26 5:20 PM
Yes, the internal hashed table must have the same key fields as the transparent table.
2013 Aug 26 5:32 PM
No, that depends on how you read the table or more importantly when you insert. However, if you need every matching item represented, then the keys must be identical.
So, say that you knew that you were going to get duplication data, then having every item represented would only cause you headaches. Then, instead, you could select single or select upto 1.
So if your output does not have the line item number in it. Then your output will appear to have many records needlessly repeating if you represent every record. It really depends on the exact need!
Neal
2013 Aug 26 6:21 PM
You're right. I just meant it should have the same key if you want to remove any possibility of runtime error ITAB_DUPLICATE_KEY when inserting to the itab from a database query of that table with no joins.
So I realize now my previous statement assumed a lot.
2013 Aug 26 6:29 PM
2013 Aug 26 6:41 PM
2013 Aug 27 5:48 AM
Hii
It is not mandatory to declare hashed type internal table with all combination of key field but it's always better to declarae with all key fields.
Because we might need some operation with the internal table like insert, modify,delete and sort.
Suppose u want to to delete duplicate entries from ur internal table comparing only vbeln then there will be a problem.
Regards
Syed
2013 Aug 26 7:21 PM
My 2 cents ...
First-things-first -
I know if we declare the internal table as NON-UNIQUE KEY then runtime error wont occurs..
Afaik you can't define HASHED tables with NON-UNIQUE keys, this is only possible for SORTED & STANDARD tables.
As each of the responders have said the definition your hashed internal table seems incorrect. As Neal has already pointed out the definition should depend entirely on the scenario you want to achieve.
Couple of things i would like to point out -
- Suhas
PS - To get better (and faster) responses try to provide as much information as possible viz., the code which triggers this RT error, select from VBKD etc
2013 Aug 27 8:02 AM
Hi Suhas,
Thanks for the reply...
Actually as I mentioned above the actual code in my custom program with declarations is shown below..
TYPES
: BEGIN OF ty_vbkd,
vbeln TYPE vbkd-vbeln,
bstkd TYPE vbkd-bstkd,
END OF ty_vbkd,
it_vbkd TYPE HASHED TABLE OF ty_vbkd WITH UNIQUE KEY vbeln.
TYPES: it_order TYPE STANDARD TABLE OF zcustom_table WITH DEFAULT KEY.
Actually in my custom table(zcustom_table) the key fields are KUNNR,VBELN,ERDAT,MATNR
SELECT *
INTO TABLE it_order
FROM zcustom_table
WHERE erdat IN irt_date.(Selection screen date)
IF sy-subrc = 0.
SORT it_order BY vbeln DESCENDING.
ENDIF.
SELECT vbeln
bstkd
INTO TABLE it_vbkd
FROM vbkd
FOR ALL ENTRIES IN it_order
WHERE vbeln = it_order-vbeln.
*Appending to the final output table
Loop at it_order into wa_order.
READ TABLE it_vbkd ASSIGNING <vbkd>
WITH KEY vbeln = <ord>-vbeln.
IF sy-subrc = 0.
ls_output-bstkd = <vbkd>-bstkd.
ENDIF.
APPEND ls_output TO rt_output.(final output table)
Endloop.
.
So..during retreving data from VBKD table I am getting runtime error ITAB_DUPLICATE_KEY.
Whether it is due to some data problem?..And also from the runtime error(ST22) i am not able to find which sale order is going to dump..is there any way to find for which sale order it is going dump?
Suggestion appreciated.
Regards
Raj
2013 Aug 27 10:08 AM
Hi,
Can you please send the screenshot of ST22 showing which section of the code is giving the RT error?
Moreover what is the type of the int. table RT_OUTPUT?
BR,
Suhas
2013 Aug 27 11:00 AM
Hi Suhas,
I am sending the screen shot.
Moreover my final RT_OUTPUT is of type
TYPE STANDARD TABLE OF ty_output WITH DEFAULT KEY
t_
And during appending to final internal table it is not going to dump...During retrival from VBKD it is going to Dump.
I am not able to send the entire dump analysis.If you provide the mail id I will send the dump analysis screen shot.
Regards
Raj
.
2013 Aug 27 5:42 AM
Hi,
Sort the first internal table and delete the duplicate entries. Then in the second internal table add one more key field POSNR.
With regards,
Riju Thomas.
2013 Aug 27 6:26 AM
Dear Raj,
Add one more field POSNR on your Custom table as a Secondary Primary key.
delete duplicate entry comparing VBELN AND POSNR.
Declear VBKD as "STANDARD TABLE WITH DEFAULT KEY".
with regards
pankaj
2013 Aug 27 11:23 AM
Dear Raj,
if you only want is a unique record from VBKD in every VBELN,
Just do this.
SELECT DISTICNT vbeln
bstkd
INTO TABLE it_vbkd
FROM vbkd
FOR ALL ENTRIES IN it_order
WHERE vbeln = it_order-vbeln.
Regards,
Rogelio
2013 Aug 27 12:27 PM
Hello Rajkumar,
Please make use of Distinct in your query, this should cause dump.
Regards
Suresh Nair
2013 Aug 28 1:38 PM
Hi all,
Thanks for the replies given by you all....
points are awarded.
Actually it issue is related to the data problem...
In the VBKD table by mistake for one sale order number there are different customer purchase orders(BSTKD) is updated..
so when I am retreving data from VBKD into the internal table which is declared as shown below
TYPES
: BEGIN OF ty_vbkd,
vbeln TYPE vbkd-vbeln,
bstkd TYPE vbkd-bstkd,
END OF ty_vbkd,
it_vbkd TYPE HASHED TABLE OF ty_vbkd WITH UNIQUE KEY vbeln.
SELECT vbeln
bstkd
INTO TABLE it_vbkd
FROM vbkd
FOR ALL ENTRIES IN it_order
WHERE vbeln = it_order-vbeln.
so for that sale order it has multiple BSTKD so VBELN is not unique hence it is going to dump.
Once again thanks for all who given replies to my questions.
I am closing this thread.