Hi SCN community!
It's me again, with another contribution to
Project Object.
Has it ever happened to you to be in a situation where you might be requesting the same thing over and over again to the database?
And if you're a good developer, you avoided repetitive calls to the database implementing a buffer, correct?
Well, what I've got for you today is a class the will serve as a buffer for
everything you want! Everything? Everything!
I can't take full credits for this though... I got this from a guy who got this from another guy... so I have no idea who was the actual developer of this thing. I can take the credit for "perfecting" it though, and implementing some exception classes in it. So at least that :smile:
You'll be able to find it in nugget and text version in my github, in the utilities section:
GitHub
Use example
Below is just an example of how to use this class. I am fully aware that the first "loop" is not how someone would properly perform this particular select to the database, this is meant simply as an example of how to use this class and for what.
DATA:
db_counter TYPE i,
lt_sbook TYPE TABLE OF sbook,
ls_sbook LIKE LINE OF lt_sbook,
ls_sbuspart TYPE sbuspart.
SELECT * FROM sbook
INTO TABLE lt_sbook.
BREAK-POINT.
CLEAR db_counter.
LOOP AT lt_sbook INTO ls_sbook.
SELECT SINGLE * FROM sbuspart
INTO ls_sbuspart
WHERE buspartnum = ls_sbook-customid.
ADD 1 TO db_counter.
ENDLOOP.
"check db_counter
BREAK-POINT.
CLEAR db_counter.
LOOP AT lt_sbook INTO ls_sbook.
TRY.
CALL METHOD zcl_buffer=>get_value
EXPORTING
i_name = 'CUSTOMER_DETAILS'
i_key = ls_sbook-customid.
CATCH zcx_buffer_value_not_found.
"If we haven't saved it yet, get it and save it
SELECT SINGLE * FROM sbuspart
INTO ls_sbuspart
WHERE buspartnum = ls_sbook-customid.
ADD 1 TO db_counter.
CALL METHOD zcl_buffer=>save_value
EXPORTING
i_name = 'CUSTOMER_DETAILS'
i_key = ls_sbook-customid
i_value = ls_sbuspart.
ENDTRY.
ENDLOOP.
"check db_counter
BREAK-POINT.
Performance remark
One last remark that I should make though... due to the high flexibility of this buffer, I think it's not possible to have a sorted read (or, in other words, a fast read) of the value in the buffer. Therefore, if you are using a buffer with a high volume of entries, and if performance is critical, you should create a subclass and redefine the "key" with the type you are interested in particular, and also redefine the get method to replace the "LOOP" statement with a "READ" statement.
All the best!
Bruno