Read the order BoM in a PI-Sheet

To manage BoM within a PI-Sheet, you should work with the class CL_IM_COCR_CMX_BI_GEN_MAT, but for some reason, I’ve not been able to do it properly, nor I could found a viable BAdI enhancement.

So I had to create a new enhancement for CMX_XS_SRV_GEN to do it.

Just there, I had to create a reference to that class and populate the system’s memory with the order BoM (it’s an old piece of code, just forgive my mistakes there):

* A lot of declarations missed
DATA: cl_super    TYPE REF TO cl_im_cocr_cmx_bi_gen_mat.
* Get context
lo_context = query->get_context( ).
ls_context = me->xs_get_context( lo_context ).
CHECK NOT ls_context-aufnr IS INITIAL.
* Let's go!

* tried to inherit the class, but it's a final one and cannot be
* inherited, I had to try the hard way
    CALL METHOD cl_super->if_cmx_xs_service_generation~get_data
        flt_val = flt_val
        query = query.
  CATCH cx_root INTO oref.
    err_text = oref->get_text( ).
* Check the number of created steps
mycount = query->get_count( ).
CHECK mycount > 0.
From there, you will work with the different symbols in a "DO mycount TIMES" loop:
    mysymbol = query->get_symbols( myindex ).
    myname-namespace = 'SAP'.
    myname-symbol = 'MATERIAL'.
    CALL METHOD mysymbol->get_value
        symbol = myname
        value  = myvalue.
  CATCH cx_root INTO oref.
    err_text = oref->get_text( ).
 With these pieces of code you should be able to "mount" a nice grid with the BoM details, adding any number of colums per row.



ABAP UNIT by example

I’m reading Ken Beck’s “Test-Driven Development by example” (a review when I’ll finish it) and I tried to find if there’s a way to adapt it to ABAP.

Yes, it does. Mainly because SAP launched ABAP Unit, a test environment appliable to both programs and classes.

In programs is easy to implement: you must just define a local class FOR TESTING and go on.

In classes… it’s the same, but a bit trickier: take a look at this link from SAP

Let’s try it.
Continue reading


Great class to show your HTML strings via dialog box or within a custom container.

Just a trick: if you will use both options within the same program, it will fail if you don’t reset your browser AND the custom container.

It means that you must create a global (sigh) variable for the custom container:

DATA: browser TYPE REF TO cl_gui_custom_container.

And before the call to the dialog version you must free it:

  TRY .
       IF browser IS BOUND.
         CALL METHOD browser->free
             OTHERS 0"nasty
     CATCH cx_root.

The nasty thing here is the cleansing of SY-SUBRC even when errors occured. You can find a way to make it cleaner, I bet.

But it’s up to you to do it.