Number range 관련 재미있는 coding
FORM number_range_create .
DATA : lv_nr_range_nr LIKE inri-nrrangenr,
lv_nr_object LIKE inri-object,
lv_returncode LIKE inri-returncode,
lv_h_ret_code(1) TYPE c,
lv_error_occured,
lv_warning_occured.
DATA : BEGIN OF lt_error_tab OCCURS 5.
INCLUDE STRUCTURE inriv.
DATA : END OF lt_error_tab.
DATA : BEGIN OF lt_errors_tab OCCURS 5.
INCLUDE STRUCTURE inoer.
DATA : END OF lt_errors_tab.
DATA : BEGIN OF ls_err.
INCLUDE STRUCTURE inrer.
DATA : END OF ls_err.
DATA : BEGIN OF lt_interval_tab OCCURS 5.
INCLUDE STRUCTURE inriv.
DATA : END OF lt_interval_tab.
DATA : BEGIN OF lt_obj_attr_tab OCCURS 5.
INCLUDE STRUCTURE tnro.
DATA : END OF lt_obj_attr_tab.
DATA : BEGIN OF lt_obj_text_tab OCCURS 5.
INCLUDE STRUCTURE tnrot.
DATA : END OF lt_obj_text_tab.
DATA : lv_number_numc(12) TYPE n. " LIKE INRIV-NRLEVEL.
lv_nr_range_nr = '01'.
lv_nr_object = 'ZQM_005'.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = lv_nr_range_nr
object = lv_nr_object
IMPORTING
number = lv_number_numc
returncode = lv_returncode
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4.
* Check if number found...
CASE sy-subrc.
WHEN 0. "Number found...
WHEN 1. "Interval not found...
* Create new Interval... first get the old counter from SOOC
* Pass the obj_type to the key
* Fill the interval structure for insert
CLEAR lt_interval_tab. REFRESH lt_interval_tab.
lt_interval_tab-fromnumber = '1'.
lt_interval_tab-tonumber = '999999999999'.
MOVE: lv_nr_range_nr TO lt_interval_tab-nrrangenr,
lv_number_numc TO lt_interval_tab-nrlevel,
'I' TO lt_interval_tab-procind.
APPEND lt_interval_tab.
* Insert the new interval
CALL FUNCTION 'NUMBER_RANGE_INTERVAL_UPDATE'
EXPORTING
object = lv_nr_object
IMPORTING
error = ls_err
error_occured = lv_error_occured
warning_occured = lv_warning_occured
TABLES
error_iv = lt_error_tab
interval = lt_interval_tab
EXCEPTIONS
object_not_found = 1.
* Write the Numberrangedata to the Database.
CALL FUNCTION 'NUMBER_RANGE_UPDATE_CLOSE'
EXPORTING
object = lv_nr_object
EXCEPTIONS
no_changes_made = 1
object_not_initialized = 2.
IF sy-subrc NE 0.
EXIT.
ENDIF.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = lv_nr_range_nr
object = lv_nr_object
IMPORTING
number = lv_number_numc
returncode = lv_returncode
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4.
WHEN 3. "Interval not found
* Create new object... first get the old counter from SOOC
* Create the object...
CLEAR lt_obj_attr_tab. REFRESH lt_obj_attr_tab.
MOVE: lv_nr_object TO lt_obj_attr_tab-object,
'' TO lt_obj_attr_tab-yearind,
'NUMC12' TO lt_obj_attr_tab-domlen,
10 TO lt_obj_attr_tab-percentage,
'X' TO lt_obj_attr_tab-buffer,
10 TO lt_obj_attr_tab-noivbuffer.
APPEND lt_obj_attr_tab.
CLEAR lt_obj_text_tab. REFRESH lt_obj_text_tab.
MOVE: sy-langu TO lt_obj_text_tab-langu,
lv_nr_object TO lt_obj_text_tab-object,
TEXT-m01 TO lt_obj_text_tab-txtshort, "Issue Number
TEXT-m01 TO lt_obj_text_tab-txt. "Issue Number
APPEND lt_obj_text_tab.
* Insert the object...
CALL FUNCTION 'NUMBER_RANGE_OBJECT_UPDATE'
EXPORTING
indicator = 'I' "Insert
object_attributes = lt_obj_attr_tab
object_text = lt_obj_text_tab
IMPORTING
returncode = lv_h_ret_code
TABLES
errors = lt_errors_tab
EXCEPTIONS
object_already_exists = 1
object_attributes_missing = 2
object_not_found = 3
object_text_missing = 4
wrong_indicator = 5.
IF sy-subrc NE 0.
EXIT.
ENDIF.
* Save the changes..
CALL FUNCTION 'NUMBER_RANGE_OBJECT_CLOSE'
EXPORTING
object = lv_nr_object
EXCEPTIONS
object_not_initialized = 1.
IF sy-subrc NE 0.
EXIT.
ENDIF.
* Check if an interval already exists
* Shouldn't occur but we've had already problems with it
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = lv_nr_range_nr
object = lv_nr_object
IMPORTING
number = lv_number_numc
returncode = lv_returncode
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4.
CASE sy-subrc.
WHEN 0.
WHEN 1.
* Fill the interval structure for insert
CLEAR lt_interval_tab. REFRESH lt_interval_tab.
lt_interval_tab-fromnumber = '1'.
lt_interval_tab-tonumber = '999999999999'.
MOVE: lv_nr_range_nr TO lt_interval_tab-nrrangenr,
lv_number_numc TO lt_interval_tab-nrlevel,
'I' TO lt_interval_tab-procind.
APPEND lt_interval_tab.
* Insert the new interval
CALL FUNCTION 'NUMBER_RANGE_INTERVAL_UPDATE'
EXPORTING
object = lv_nr_object
IMPORTING
error = ls_err
error_occured = lv_error_occured
warning_occured = lv_warning_occured
TABLES
error_iv = lt_error_tab
interval = lt_interval_tab
EXCEPTIONS
object_not_found = 1.
* Write the Numberrangedata to the Database.
CALL FUNCTION 'NUMBER_RANGE_UPDATE_CLOSE'
EXPORTING
object = lv_nr_object
EXCEPTIONS
no_changes_made = 1
object_not_initialized = 2.
IF sy-subrc GE 2. "BS310395
EXIT.
ENDIF.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = lv_nr_range_nr
object = lv_nr_object
IMPORTING
number = lv_number_numc
returncode = lv_returncode
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4.
WHEN OTHERS.
EXIT.
ENDCASE.
WHEN OTHERS.
ENDCASE.
gs_header-ziss_id = lv_number_numc.
ENDFORM.