I want to know string contain symbol
hhi
i wana to know that if string contain symbol then remove the
symbol from string
i dont know which type of symbol is in string find and remove
the symbol and put spacce
like this
string is ================"screen-capturing"
result will be screen capturing
tell me the result
It would take a lot longer time that I have to explain how
regular
expressions work. And I only know the bare basics of them to
begin
with. Basically a regular expression is a pattern matching
algorithm.
You say what letters you want to find and what you want to do
with those
characters.
function cleanString(vText){
return vText.replace(/[^0-9a-z]|"_"/gi," ");
In this example, the javascript replace function looks for
the stuff in
the beginning between the / marks and replaces it with the "
" (space).
The ^ character means "not" and everything in the brackets is
what we
are not looking for. i.e. it is saying that anything that is
not a
number (0-9) or a letter (a-z). Then the | pipe character
means "or".
So in addition to the non alphanumerics, it is also looking
for "_" the
underscore. Then after the last / are the switches. The g
switch says
to match all of the instances of the pattern (without the g,
it would
only replace the 1st one) and the i tells it to be
case-insensitive..
Now are you more confused than before?
Here is a pretty good site with some more specific
information about how
the replace method works in Javascript:
http://www.regular-expressions.info/javascript.html
If you really want to get deep into regex, find the xtra for
Director
called pRegEx. It is free and super powerful and superfast.
The
documentation that comes with it is extremely detailed about
all the
different functions of regular expressions and how to use
them in Director.
Similar Messages
-
I want to know more about transaction(Container-managed).
i want to know more about transaction,how to use Container-managed
transaction?
can someone give me an example?
fish
That is not part of Firefox. It is either an add-on for Firefox which you installed, or it is a separate program you have.
Also, is '''Sanapshot tool''' the correct name? Or did you mean '''''Snapshot'''''? -
I should have said in my previous message that the iphoto program I am using is for an ipad 2. I simply want to know how to delete an edited album which contains one photo that I do not want taking up space.
OK....I'm stumped. The message you are seeing is typically there to protect someone from syncing with a different computer/iTunes account. Is there any way anyone else has used your iPad and possibly connected it to their computer?
-
U rgent:"i want to know the work of this "conversion routine".
Hi all,
In the domain of any field in the database table there is one option called "conversion routine" just below to "output list".
i want to know the work of this "conversion routine".
can any one please tell me the practical use of this with real time example.
good points will be rewarded for helpful answer.
thanks in advance
Message was edited by:
tapu abapHi,
REPORT ZTEST.
TYPES: UPC_YS_API_CHASEL_T TYPE STANDARD TABLE OF UPC_YS_API_CHASEL.
TYPES: UPC_YS_API_CHAPRO_T TYPE STANDARD TABLE OF UPC_YS_API_CHAPRO.
TYPES: UPC_YS_API_KYFPRO_T TYPE STANDARD TABLE OF UPC_YS_API_KYFPRO.
CLASS CL_ABAP_CONV_ROUTINE DEFINITION DEFERRED.
TYPES: BEGIN OF CONVEXIT_LOOKUP_S,
CONVEXIT TYPE LVC_S_FCAT-CONVEXIT,
O_CONVEXIT TYPE REF TO CL_ABAP_CONV_ROUTINE,
END OF CONVEXIT_LOOKUP_S.
TYPES: CONVEXIT_LOOKUP_T TYPE HASHED TABLE OF CONVEXIT_LOOKUP_S
WITH UNIQUE KEY CONVEXIT.
TYPES: FIELDCATALOG_UNIQUE TYPE HASHED TABLE OF LVC_S_FCAT
WITH UNIQUE KEY FIELDNAME.
TYPES: BEGIN OF PLAN_AREA_STRUCT_CACHE,
PLANNING_AREA TYPE UPC_AREA-AREA,
FIELDCATALOG TYPE LVC_T_FCAT,
CHARACTERISTICS TYPE ZUPC_YS_API_CHAPRO_T,
KEYFIGURES TYPE ZUPC_YS_API_KYFPRO_T,
TRANSACTION_DATA_TABLE TYPE REF TO DATA,
END OF PLAN_AREA_STRUCT_CACHE.
TYPES: PLAN_AREA_STRUCT_CACHE_T TYPE SORTED TABLE OF
PLAN_AREA_STRUCT_CACHE WITH UNIQUE KEY PLANNING_AREA.
* CLASS CX_DATE_CONVERSION DEFINITION
CLASS CX_DATE_CONVERSION DEFINITION INHERITING FROM CX_DYNAMIC_CHECK.
PUBLIC SECTION.
DATA: MESSAGE TYPE STRING.
METHODS CONSTRUCTOR
IMPORTING MESSAGE TYPE STRING.
ENDCLASS. "CX_DATE_CONVERSION DEFINITION
* CLASS CX_DATE_CONVERSION IMPLEMENTATION
CLASS CX_DATE_CONVERSION IMPLEMENTATION.
METHOD CONSTRUCTOR.
SUPER->CONSTRUCTOR( ).
ME->MESSAGE = MESSAGE.
ENDMETHOD. "CONSTRUCTOR
ENDCLASS. "CX_DATE_CONVERSION IMPLEMENTATION
* CLASS CL_ABAP_CONV_ROUTINE DEFINITION
CLASS CL_ABAP_CONV_ROUTINE DEFINITION.
PUBLIC SECTION.
METHODS APPLY_CONV_INPUT
IMPORTING
INPUT TYPE ANY
EXPORTING
OUTPUT TYPE ANY .
METHODS APPLY_CONV_OUTPUT
IMPORTING
INPUT TYPE ANY
EXPORTING
OUTPUT TYPE ANY .
METHODS GET_CONVEXIT
RETURNING
VALUE(CONVEXIT) TYPE CONVEXIT .
METHODS SET_CONVEXIT
IMPORTING
VALUE(CONVEXIT) TYPE CONVEXIT .
METHODS CONSTRUCTOR
IMPORTING
CONVEXIT TYPE CONVEXIT OPTIONAL .
PRIVATE SECTION.
DATA CONVEXIT TYPE CONVEXIT .
METHODS GET_INPUT_CONVERSION_EXIT
RETURNING
VALUE(FUNCTION_MODULE_NAME) TYPE STRING .
METHODS GET_OUTPUT_CONVERSION_EXIT
RETURNING
VALUE(FUNCTION_MODULE_NAME) TYPE STRING .
ENDCLASS. "CL_ABAP_CONV_ROUTINE DEFINITION
* CLASS CL_ABAP_CONV_ROUTINE IMPLEMENTATION
CLASS CL_ABAP_CONV_ROUTINE IMPLEMENTATION.
METHOD APPLY_CONV_INPUT .
DATA: FUNCT_MOD TYPE STRING.
IF NOT ME->CONVEXIT IS INITIAL.
* Only apply conversion routine if it exits
CALL METHOD ME->GET_INPUT_CONVERSION_EXIT
RECEIVING
FUNCTION_MODULE_NAME = FUNCT_MOD.
CALL FUNCTION FUNCT_MOD
EXPORTING
INPUT = INPUT
IMPORTING
OUTPUT = OUTPUT.
ELSE.
* Can only hope this works
OUTPUT = INPUT.
ENDIF.
ENDMETHOD. "APPLY_CONV_INPUT
METHOD APPLY_CONV_OUTPUT.
DATA: FUNCT_MOD TYPE STRING.
IF NOT ME->CONVEXIT IS INITIAL.
* Only apply conversion routine if it exits
CALL METHOD ME->GET_OUTPUT_CONVERSION_EXIT
RECEIVING
FUNCTION_MODULE_NAME = FUNCT_MOD.
CALL FUNCTION FUNCT_MOD
EXPORTING
INPUT = INPUT
IMPORTING
OUTPUT = OUTPUT.
ELSE.
* Can only hope this works
OUTPUT = INPUT.
ENDIF.
ENDMETHOD. "APPLY_CONV_OUTPUT
METHOD CONSTRUCTOR.
IF CONVEXIT IS SUPPLIED.
CALL METHOD ME->SET_CONVEXIT
EXPORTING
CONVEXIT = CONVEXIT.
ENDIF.
ENDMETHOD. "CONSTRUCTOR
METHOD GET_CONVEXIT.
CONVEXIT = ME->CONVEXIT.
ENDMETHOD. "GET_CONVEXIT
METHOD SET_CONVEXIT.
ME->CONVEXIT = CONVEXIT.
ENDMETHOD. "SET_CONVEXIT
METHOD GET_INPUT_CONVERSION_EXIT.
* Generate standard conversion routines for input conversion
* This is based on standard SAP ABAP help documentation
CONCATENATE 'CONVERSION_EXIT_' ME->CONVEXIT
'_INPUT' INTO FUNCTION_MODULE_NAME.
ENDMETHOD. "GET_INPUT_CONVERSION_EXIT
METHOD GET_OUTPUT_CONVERSION_EXIT.
* Generate standard conversion routines for output conversion
* This is based on standard SAP ABAP help documentation
CONCATENATE 'CONVERSION_EXIT_' ME->CONVEXIT
'_OUTPUT' INTO FUNCTION_MODULE_NAME.
ENDMETHOD. "GET_OUTPUT_CONVERSION_EXIT
ENDCLASS. "CL_ABAP_CONV_ROUTINE IMPLEMENTATION
* CLASS CL_ABAP_CONV_DECIMAL DEFINITION
CLASS CL_ABAP_CONV_DECIMAL DEFINITION.
PUBLIC SECTION.
CLASS-DATA SAP_DECIMAL_FMT_SPACE TYPE USR01-DCPFM VALUE ' '
READ-ONLY .
CLASS-DATA SAP_DECIMAL_FMT_X TYPE USR01-DCPFM VALUE 'X' READ-ONLY .
CLASS-DATA SAP_DECIMAL_FMT_Y TYPE USR01-DCPFM VALUE 'Y' READ-ONLY .
CLASS-DATA USER_DECIMAL_FORMAT TYPE USR01-DCPFM READ-ONLY .
CLASS-METHODS CLASS_CONSTRUCTOR .
CLASS-METHODS CONVERT_DECIMAL_EXT2INT
IMPORTING
EXTERNAL_VALUE TYPE STRING
CHANGING
INTERNAL_VALUE TYPE P
RAISING
CX_SY_CONVERSION_OVERFLOW
CX_SY_CONVERSION_NO_NUMBER .
CLASS-METHODS CONVERT_DECIMAL_INT2EXT
IMPORTING
INTERNAL_VALUE TYPE P
CHANGING
EXTERNAL_VALUE TYPE STRING .
ENDCLASS. "CL_ABAP_CONV_DECIMAL DEFINITION
* CLASS CL_ABAP_CONV_DECIMAL IMPLEMENTATION
CLASS CL_ABAP_CONV_DECIMAL IMPLEMENTATION.
METHOD CLASS_CONSTRUCTOR .
SELECT SINGLE DCPFM FROM USR01 INTO USER_DECIMAL_FORMAT
WHERE BNAME = SY-UNAME.
ENDMETHOD. "CLASS_CONSTRUCTOR
METHOD CONVERT_DECIMAL_EXT2INT .
* THE GOAL IS TO GET THIS INTO INTERNAL FORMAT WHICH IS EQUIVALENT TO
* EX. NNNNN.NN
DATA: NUM_STR TYPE STRING.
NUM_STR = EXTERNAL_VALUE.
CONDENSE NUM_STR NO-GAPS.
CASE USER_DECIMAL_FORMAT.
WHEN SAP_DECIMAL_FMT_X.
REPLACE ALL OCCURRENCES OF ',' IN NUM_STR WITH SPACE.
CONDENSE NUM_STR NO-GAPS.
WHEN SAP_DECIMAL_FMT_SPACE.
REPLACE ALL OCCURRENCES OF '.' IN NUM_STR WITH SPACE.
CONDENSE NUM_STR NO-GAPS.
REPLACE ALL OCCURRENCES OF ',' IN NUM_STR WITH '.'.
WHEN SAP_DECIMAL_FMT_Y.
REPLACE ALL OCCURRENCES OF ',' IN NUM_STR WITH '.'.
ENDCASE.
INTERNAL_VALUE = NUM_STR.
ENDMETHOD. "CONVERT_DECIMAL_EXT2INT
METHOD CONVERT_DECIMAL_INT2EXT .
* THE GOAL IS TO GET THIS INTO EXTERNAL FORMAT WHICH IS BASED ON SAP
* USER PROFILE SETTINGS
* CURRENT INPUT FORMAT EQUIVALENT IS EX. NNNNN.NN
DATA: TEMP(70) TYPE C.
WRITE INTERNAL_VALUE TO TEMP.
EXTERNAL_VALUE = TEMP.
ENDMETHOD. "CONVERT_DECIMAL_INT2EXT
ENDCLASS. "CL_ABAP_CONV_DECIMAL IMPLEMENTATION
* CLASS CL_ABAP_CONV_DATE DEFINITION
CLASS CL_ABAP_CONV_DATE DEFINITION.
PUBLIC SECTION.
CLASS-DATA SAP_DATE_FMT_5 TYPE USR01-DATFM VALUE '5' READ-ONLY .
CLASS-DATA SAP_DATE_FMT_6 TYPE USR01-DATFM VALUE '6' READ-ONLY .
CLASS-DATA SAP_DATE_FMT_3 TYPE USR01-DATFM VALUE '3' READ-ONLY .
CLASS-DATA SAP_DATE_FMT_4 TYPE USR01-DATFM VALUE '4' READ-ONLY .
CLASS-DATA SAP_DATE_FMT_1 TYPE USR01-DATFM VALUE '1' READ-ONLY .
CLASS-DATA SAP_DATE_FMT_2 TYPE USR01-DATFM VALUE '2' READ-ONLY .
CLASS-DATA USER_DATE_FORMAT TYPE USR01-DATFM READ-ONLY .
CLASS-METHODS CONVERT_DATE_EXT2INT
IMPORTING
EXTERNAL_DATE TYPE STRING
RETURNING
VALUE(INTERNAL_DATE) TYPE D
RAISING
CX_DATE_CONVERSION .
CLASS-METHODS CONVERT_DATE_INT2EXT
IMPORTING
INTERNAL_DATE TYPE D
RETURNING
VALUE(EXTERNAL_DATE) TYPE STRING .
CLASS-METHODS CLASS_CONSTRUCTOR .
ENDCLASS. "CL_ABAP_CONV_DATE DEFINITION
* CLASS CL_ABAP_CONV_DATE IMPLEMENTATION
CLASS CL_ABAP_CONV_DATE IMPLEMENTATION.
METHOD CLASS_CONSTRUCTOR.
SELECT SINGLE DATFM FROM USR01 INTO USER_DATE_FORMAT
WHERE BNAME = SY-UNAME.
ENDMETHOD. "CLASS_CONSTRUCTOR
METHOD CONVERT_DATE_EXT2INT.
* HERE ARE THE CURRENT DATE FORMATS FROM SAP GUI
*1 DD.MM.YYYY
*2 MM/DD/YYYY
*3 MM-DD-YYYY
*4 YYYY.MM.DD
*5 YYYY/MM/DD
*6 YYYY-MM-DD
DATA: PERMITTED_NUMBERS TYPE STRING VALUE '0123456789'.
DATA: TEMP_DATE TYPE D.
DATA: MESSAGE_VALID_NUMERICS TYPE STRING
VALUE 'Only Numerics (0-9) are acceptable.'.
DATA: MESSAGE_VALID_FORMAT TYPE STRING
VALUE 'Invalid date format.'.
IF STRLEN( EXTERNAL_DATE ) = 10.
CASE USER_DATE_FORMAT.
WHEN SAP_DATE_FMT_1.
IF EXTERNAL_DATE+2(1) = '.' AND EXTERNAL_DATE+5(1) = '.'.
TEMP_DATE+0(4) = EXTERNAL_DATE+6(4). " YEAR
TEMP_DATE+4(2) = EXTERNAL_DATE+3(2). " MONTH
TEMP_DATE+6(2) = EXTERNAL_DATE+0(2). " DAY
IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
ENDIF.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
WHEN SAP_DATE_FMT_2.
IF EXTERNAL_DATE+2(1) = '/' AND EXTERNAL_DATE+5(1) = '/'.
TEMP_DATE+0(4) = EXTERNAL_DATE+6(4). " YEAR
TEMP_DATE+4(2) = EXTERNAL_DATE+0(2). " MONTH
TEMP_DATE+6(2) = EXTERNAL_DATE+3(2). " DAY
IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS. " ISSUE
ENDIF.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
WHEN SAP_DATE_FMT_3.
IF EXTERNAL_DATE+2(1) = '-' AND EXTERNAL_DATE+5(1) = '-'.
TEMP_DATE+0(4) = EXTERNAL_DATE+6(4). " YEAR
TEMP_DATE+4(2) = EXTERNAL_DATE+0(2). " MONTH
TEMP_DATE+6(2) = EXTERNAL_DATE+3(2). " DAY
IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
ENDIF.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
WHEN SAP_DATE_FMT_4.
IF EXTERNAL_DATE+4(1) = '.' AND EXTERNAL_DATE+7(1) = '.'.
TEMP_DATE+0(4) = EXTERNAL_DATE+0(4). " YEAR
TEMP_DATE+4(2) = EXTERNAL_DATE+5(2). " MONTH
TEMP_DATE+6(2) = EXTERNAL_DATE+8(2). " DAY
IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
ENDIF.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
WHEN SAP_DATE_FMT_5.
IF EXTERNAL_DATE+4(1) = '/' AND EXTERNAL_DATE+7(1) = '/'.
TEMP_DATE+0(4) = EXTERNAL_DATE+0(4). " YEAR
TEMP_DATE+4(2) = EXTERNAL_DATE+5(2). " MONTH
TEMP_DATE+6(2) = EXTERNAL_DATE+8(2). " DAY
IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
ENDIF.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
WHEN SAP_DATE_FMT_6.
IF EXTERNAL_DATE+4(1) = '-' AND EXTERNAL_DATE+7(1) = '-'.
TEMP_DATE+0(4) = EXTERNAL_DATE+0(4). " YEAR
TEMP_DATE+4(2) = EXTERNAL_DATE+5(2). " MONTH
TEMP_DATE+6(2) = EXTERNAL_DATE+8(2). " DAY
IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
ENDIF.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
ENDCASE.
INTERNAL_DATE = TEMP_DATE.
ELSEIF STRLEN( EXTERNAL_DATE ) = 8.
* ASSUME NORMAL DATE FORMAT (YYYYMMDD)
INTERNAL_DATE = EXTERNAL_DATE.
ELSE.
RAISE EXCEPTION TYPE CX_DATE_CONVERSION
EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
ENDIF.
ENDMETHOD. "CONVERT_DATE_EXT2INT
METHOD CONVERT_DATE_INT2EXT.
* HERE ARE THE CURRENT DATE FORMATS FROM SAP GUI
*1 DD.MM.YYYY
*2 MM/DD/YYYY
*3 MM-DD-YYYY
*4 YYYY.MM.DD
*5 YYYY/MM/DD
*6 YYYY-MM-DD
DATA: EXTERNAL_DATE_TEMP(10) TYPE C.
WRITE INTERNAL_DATE TO EXTERNAL_DATE_TEMP.
EXTERNAL_DATE = EXTERNAL_DATE_TEMP.
ENDMETHOD. "CONVERT_DATE_INT2EXT
ENDCLASS. "CL_ABAP_CONV_DATE IMPLEMENTATION
* CLASS CX_SEM_BPS_DATA_ACCESS DEFINITION
CLASS CX_SEM_BPS_DATA_ACCESS DEFINITION INHERITING FROM CX_DYNAMIC_CHECK
PUBLIC SECTION.
DATA: MESSAGE TYPE STRING.
DATA: RETURN_T TYPE BAPIRET2_T.
METHODS CONSTRUCTOR
IMPORTING
MESSAGE TYPE STRING
RETURN_T TYPE BAPIRET2_T OPTIONAL.
ENDCLASS. "CX_SEM_BPS_DATA_ACCESS DEFINITION
* CLASS CX_SEM_BPS_DATA_ACCESS IMPLEMENTATION
CLASS CX_SEM_BPS_DATA_ACCESS IMPLEMENTATION.
METHOD CONSTRUCTOR.
SUPER->CONSTRUCTOR( ).
ME->MESSAGE = MESSAGE.
ME->RETURN_T = RETURN_T.
ENDMETHOD. "CONSTRUCTOR
ENDCLASS. "CX_SEM_BPS_DATA_ACCESS IMPLEMENTATION
* CLASS CL_SEMBPS_DATA_ACCESSOR DEFINITION
CLASS CL_SEMBPS_DATA_ACCESSOR DEFINITION.
PUBLIC SECTION.
DATA TRANSACTION_DATA TYPE REF TO DATA .
CLASS-DATA C_LEVEL TYPE UPC_PLEVEL-PLEVEL VALUE 'ZLABAP' READ-ONLY .
CLASS-DATA C_LAYOUT TYPE UPP_PARAM-PARAM VALUE 'ZMABAP' READ-ONLY .
CLASS-DATA C_ADHOC_PACK TYPE UPC_PACKAGE-PPACKAGE VALUE '0-ADHOC'
READ-ONLY .
CLASS-DATA C_MULTIPLAN_AREA TYPE UPC_YS_API_CHAPRO-CHANM VALUE
'_AREA_____' READ-ONLY .
METHODS GET_INFOCUBE
RETURNING
VALUE(INFOCUBE) TYPE UPC_BW_AREA-INFOCUBE .
METHODS GET_CHARACTERISTIC_SELECTIONS
EXPORTING
CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T .
METHODS REFRESH
RAISING
CX_SEM_BPS_DATA_ACCESS .
METHODS CONSTRUCTOR
IMPORTING
PLANNING_AREA TYPE UPC_AREA-AREA
IT_FIELDCATALOG TYPE LVC_T_FCAT
TRANSACTION_DATA_TABLE TYPE REF TO DATA
CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T
RAISING
CX_SEM_BPS_DATA_ACCESS .
METHODS GET_PLANNING_AREA
RETURNING
VALUE(PLANNING_AREA) TYPE UPC_AREA-AREA .
METHODS GET_CHARACTERISTICS
EXPORTING
CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T .
METHODS GET_KEYFIGURES
EXPORTING
KEYFIGURES TYPE UPC_YS_API_KYFPRO_T .
METHODS SAVE
RAISING
CX_SEM_BPS_DATA_ACCESS .
PRIVATE SECTION.
DATA CONVEXIT_LOOKUP TYPE CONVEXIT_LOOKUP_T .
DATA INFOCUBE TYPE UPC_BW_AREA-INFOCUBE .
DATA IT_FIELDCATALOG TYPE FIELDCATALOG_UNIQUE .
DATA PLANNING_AREA TYPE UPC_AREA-AREA .
DATA CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T .
DATA KEYFIGURES TYPE UPC_YS_API_KYFPRO_T .
DATA CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T .
DATA LAYOUT_COL_SPEC TYPE STANDARD TABLE OF UPC_YS_API_COL .
CLASS-METHODS FORCE_ERROR_MESSAGE
IMPORTING
MESSAGE TYPE STRING OPTIONAL
RETURN_STRUCT TYPE BAPIRET2 OPTIONAL
RETURN_STRUCTS TYPE BAPIRET2_T OPTIONAL
RAISING
CX_SEM_BPS_DATA_ACCESS .
CLASS-METHODS CHECK_MESSAGE
IMPORTING
E_SUBRC TYPE SY-SUBRC
RETURN_STRUCT TYPE BAPIRET2
RAISING
CX_SEM_BPS_DATA_ACCESS .
METHODS SET_CHARACTERISTIC_SELECTION
IMPORTING
CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T .
METHODS SET_PLANNING_AREA
IMPORTING
PLANNING_AREA TYPE UPC_AREA-AREA
RAISING
CX_SEM_BPS_DATA_ACCESS .
METHODS VALIDATE_PLANNING_OBJECTS
RAISING
CX_SEM_BPS_DATA_ACCESS .
CLASS-METHODS CHECK_MESSAGES
IMPORTING
RETURN_STRUCTS TYPE BAPIRET2_T
E_SUBRC TYPE SY-SUBRC
RAISING
CX_SEM_BPS_DATA_ACCESS .
METHODS READ_DATA
RAISING
CX_SEM_BPS_DATA_ACCESS .
ENDCLASS. "CL_SEMBPS_DATA_ACCESSOR DEFINITION
* CLASS CL_SEMBPS_DATA_ACCESSOR IMPLEMENTATION
CLASS CL_SEMBPS_DATA_ACCESSOR IMPLEMENTATION.
METHOD CONSTRUCTOR .
DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
* BUILD CONVERSION EXITS AND FIELDCATALOG
LOOP AT IT_FIELDCATALOG INTO WA_FIELDCATALOG.
INSERT WA_FIELDCATALOG INTO TABLE ME->IT_FIELDCATALOG[].
IF NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
CLEAR CONVEXIT_WA.
CONVEXIT_WA-CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
CREATE OBJECT CONVEXIT_WA-O_CONVEXIT
EXPORTING
CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
INSERT CONVEXIT_WA INTO TABLE ME->CONVEXIT_LOOKUP.
ENDIF.
ENDLOOP.
CALL METHOD ME->SET_PLANNING_AREA
EXPORTING
PLANNING_AREA = PLANNING_AREA.
CALL METHOD ME->SET_CHARACTERISTIC_SELECTION
EXPORTING
CHARACTERISTIC_SELECTION = CHARACTERISTIC_SELECTION.
* POINT TO TABLE CONTAINING TRANSACTION DATA
ME->TRANSACTION_DATA = TRANSACTION_DATA_TABLE.
* READ DATA
CALL METHOD ME->REFRESH.
ENDMETHOD. "CONSTRUCTOR
METHOD GET_CHARACTERISTICS .
CHARACTERISTICS[] = ME->CHARACTERISTICS[].
ENDMETHOD. "GET_CHARACTERISTICS
METHOD GET_CHARACTERISTIC_SELECTIONS.
CHARACTERISTIC_SELECTION[] = ME->CHARACTERISTIC_SELECTION[].
ENDMETHOD. "GET_CHARACTERISTIC_SELECTIONS
METHOD GET_INFOCUBE .
INFOCUBE = ME->INFOCUBE.
ENDMETHOD. "GET_INFOCUBE
METHOD GET_KEYFIGURES .
KEYFIGURES[] = ME->KEYFIGURES[].
ENDMETHOD. "GET_KEYFIGURES
METHOD GET_PLANNING_AREA .
PLANNING_AREA = ME->PLANNING_AREA.
ENDMETHOD. "GET_PLANNING_AREA
METHOD REFRESH.
CALL METHOD ME->READ_DATA.
ENDMETHOD. "REFRESH
METHOD SAVE .
DATA: E_SUBRC TYPE SY-SUBRC.
DATA: ES_RETURN TYPE BAPIRET2.
DATA: CHARACTERISTICS_WA TYPE UPC_YS_API_CHAPRO.
DATA: WA_REF TYPE REF TO DATA.
DATA: ITK_ROW TYPE TABLE OF UPC_YS_API_ROW.
DATA: ITK_ROW_WA TYPE UPC_YS_API_ROW.
DATA: LAYOUT_COL_SPEC_WA TYPE UPC_YS_API_COL.
DATA: ITK_DATA TYPE TABLE OF UPC_YS_API_DATA.
DATA: ITK_DATA_WA TYPE UPC_YS_API_DATA.
DATA: ETK_RETURN TYPE TABLE OF BAPIRET2.
DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
DATA: CONVERSION_EXIT TYPE STRING.
DATA: KEYFIG TYPE STRING.
DATA: DATE_CHAR TYPE STRING.
DATA: MESSAGE TYPE STRING.
CONSTANTS: FIND_FIELD_ERR TYPE STRING VALUE 'Unable to find field'.
FIELD-SYMBOLS: <TD_FIELD> TYPE ANY.
FIELD-SYMBOLS: <TD_WA> TYPE ANY.
FIELD-SYMBOLS: <TD_TAB> TYPE STANDARD TABLE.
ASSIGN ME->TRANSACTION_DATA->* TO <TD_TAB>.
CREATE DATA WA_REF LIKE LINE OF <TD_TAB>.
ASSIGN WA_REF->* TO <TD_WA>.
CLEAR <TD_WA>.
DATA: ROWC TYPE I.
ROWC = 1.
LOOP AT <TD_TAB> INTO <TD_WA>.
* FILL CHARACTERISTIC DATA
LOOP AT ME->CHARACTERISTICS INTO CHARACTERISTICS_WA.
ASSIGN COMPONENT CHARACTERISTICS_WA-CHANM OF STRUCTURE <TD_WA>
TO <TD_FIELD>.
IF SY-SUBRC = 0.
ITK_ROW_WA-ROW = ROWC.
ITK_ROW_WA-CHANM = CHARACTERISTICS_WA-CHANM.
CLEAR ITK_ROW_WA-CHAVLEXT.
* APPLY OUTPUT CONVERSION EXIT FOR SAP EXTERNAL TYPE
* ONLY APPLIES WHEN VALUE IS NOT UNASSIGNED ('#') MEANING INITIAL(ABAP)
* FOR EXTERNAL CONVERSION UNASSIGED ('#') IS JUST A BLANK
IF NOT <TD_FIELD> IS INITIAL.
READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
WITH TABLE KEY FIELDNAME = ITK_ROW_WA-CHANM.
IF SY-SUBRC = 0 AND NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
READ TABLE ME->CONVEXIT_LOOKUP INTO CONVEXIT_WA
WITH TABLE KEY CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_OUTPUT
EXPORTING
INPUT = <TD_FIELD>
IMPORTING
OUTPUT = <TD_FIELD>.
ITK_ROW_WA-CHAVLEXT = <TD_FIELD>.
ELSEIF SY-SUBRC = 0 AND WA_FIELDCATALOG-INTTYPE = 'D'.
* APPLY DATE CONVERSION TO EXTERNAL FORMAT BASED ON USER PROFILE
CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_INT2EXT
EXPORTING
INTERNAL_DATE = <TD_FIELD>
RECEIVING
EXTERNAL_DATE = DATE_CHAR.
ITK_ROW_WA-CHAVLEXT = DATE_CHAR.
ELSE.
ITK_ROW_WA-CHAVLEXT = <TD_FIELD>.
ENDIF.
ENDIF.
APPEND ITK_ROW_WA TO ITK_ROW.
ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
CONCATENATE FIND_FIELD_ERR CHARACTERISTICS_WA-CHANM
INTO MESSAGE.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
MESSAGE = MESSAGE.
ENDIF.
ENDLOOP.
* FILL KEY FIGURE DATA
LOOP AT ME->LAYOUT_COL_SPEC INTO LAYOUT_COL_SPEC_WA.
ASSIGN COMPONENT LAYOUT_COL_SPEC_WA-CHAVLEXT
OF STRUCTURE <TD_WA> TO <TD_FIELD>.
IF SY-SUBRC = 0.
ITK_DATA_WA-ROW = ROWC.
ITK_DATA_WA-COL = LAYOUT_COL_SPEC_WA-COL.
READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
WITH TABLE KEY FIELDNAME = LAYOUT_COL_SPEC_WA-CHAVLEXT.
IF WA_FIELDCATALOG-INTTYPE = 'P'.
* MUST CONVERT TO EXTERNAL FORMAT FOR DECIMALS
CALL METHOD CL_ABAP_CONV_DECIMAL=>CONVERT_DECIMAL_INT2EXT
EXPORTING
INTERNAL_VALUE = <TD_FIELD>
CHANGING
EXTERNAL_VALUE = KEYFIG.
ELSEIF WA_FIELDCATALOG-INTTYPE = 'F'
OR WA_FIELDCATALOG-INTTYPE = 'I'.
KEYFIG = <TD_FIELD>.
ENDIF.
ITK_DATA_WA-VALUE = KEYFIG.
APPEND ITK_DATA_WA TO ITK_DATA.
ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
CONCATENATE FIND_FIELD_ERR LAYOUT_COL_SPEC_WA-CHAVLEXT
INTO MESSAGE.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
MESSAGE = MESSAGE.
ENDIF.
ENDLOOP.
ROWC = ROWC + 1.
ENDLOOP.
* SET ADHOC PACKAGE SELECTIONS
CALL FUNCTION 'API_SEMBPS_ADHOCPACKAGE_SET'
EXPORTING
I_AREA = ME->PLANNING_AREA
I_PLEVEL = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN
TABLES
ITK_CHASEL = CHARACTERISTIC_SELECTION.
* THROW EXCEPTIONS IF NECESSARY
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCT = ES_RETURN.
CALL FUNCTION 'API_SEMBPS_SETDATA'
EXPORTING
I_AREA = ME->PLANNING_AREA
I_PLEVEL = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
I_PACKAGE = CL_SEMBPS_DATA_ACCESSOR=>C_ADHOC_PACK
I_LAYOUT = CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
IMPORTING
E_SUBRC = E_SUBRC
TABLES
ITK_ROW = ITK_ROW
ITK_DATA = ITK_DATA
ETK_RETURN = ETK_RETURN.
* THROW EXCEPTIONS IF NECESSARY
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCTS = ETK_RETURN.
* SAVE THE DATA INTO THE CUBE
CALL FUNCTION 'API_SEMBPS_POST'
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCT = ES_RETURN.
* CLEAR SEM BPS DATA BUFFER AS WEIRD BEHAVIOR MAY OCCUR IF
* NOT CLEARED WHETHER IF SUCCESSFUL OR NOT
CALL FUNCTION 'API_SEMBPS_REFRESH'
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCT = ES_RETURN.
ENDMETHOD. "SAVE
METHOD CHECK_MESSAGE .
DATA: RETURN_T TYPE BAPIRET2_T.
APPEND RETURN_STRUCT TO RETURN_T.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
EXPORTING
RETURN_STRUCTS = RETURN_T
E_SUBRC = E_SUBRC.
ENDMETHOD. "CHECK_MESSAGE
METHOD CHECK_MESSAGES .
IF E_SUBRC <> 0.
DATA: MESSAGE TYPE STRING.
DATA: RETURN TYPE BAPIRET2.
READ TABLE RETURN_STRUCTS INTO RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
READ TABLE RETURN_STRUCTS INTO RETURN WITH KEY TYPE = 'A'.
ENDIF.
MESSAGE = RETURN-MESSAGE.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
EXPORTING
MESSAGE = MESSAGE
RETURN_T = RETURN_STRUCTS.
ENDIF.
ENDMETHOD. "CHECK_MESSAGES
METHOD FORCE_ERROR_MESSAGE.
DATA: RC TYPE SY-SUBRC VALUE 4.
IF MESSAGE IS SUPPLIED.
DATA: RETURN TYPE BAPIRET2.
RETURN-TYPE = 'E'.
RETURN-MESSAGE = MESSAGE.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
RETURN_STRUCT = RETURN
E_SUBRC = RC.
ENDIF.
IF RETURN_STRUCT IS SUPPLIED.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
RETURN_STRUCT = RETURN_STRUCT
E_SUBRC = RC.
ENDIF.
IF RETURN_STRUCTS IS SUPPLIED.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
EXPORTING
RETURN_STRUCTS = RETURN_STRUCTS
E_SUBRC = RC.
ENDIF.
ENDMETHOD. "FORCE_ERROR_MESSAGE
METHOD READ_DATA .
DATA: CHAR_DATA TYPE TABLE OF UPC_YS_API_ROW.
DATA: KEYFIG_DATA TYPE TABLE OF UPC_YS_API_DATA.
DATA: ETK_ROW_WA TYPE UPC_YS_API_ROW.
DATA: ETK_COL TYPE TABLE OF UPC_YS_API_COL.
DATA: ETK_RETURN TYPE TABLE OF BAPIRET2.
DATA: KEYFIGURES_WA TYPE UPC_YS_API_KYFPRO.
DATA: E_SUBRC TYPE SY-SUBRC.
DATA: ES_RETURN TYPE BAPIRET2.
DATA: ETK_COL_WA TYPE UPC_YS_API_COL.
DATA: WA_REF TYPE REF TO DATA.
DATA: HAS_DATA TYPE BOOLEAN.
DATA: KEYFIG_DATA_WA TYPE UPC_YS_API_DATA.
DATA: LINE1 TYPE I.
DATA: LINE2 TYPE I.
DATA: MESSAGE TYPE STRING.
CONSTANTS: FIND_FIELD_ERR TYPE STRING VALUE 'Unable to find field '.
FIELD-SYMBOLS: <TD_FIELD> TYPE ANY.
FIELD-SYMBOLS: <TD_WA> TYPE ANY.
FIELD-SYMBOLS: <TD_TAB> TYPE STANDARD TABLE.
CALL FUNCTION 'API_SEMBPS_ADHOCPACKAGE_SET'
EXPORTING
I_AREA = ME->PLANNING_AREA
I_PLEVEL = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN
TABLES
ITK_CHASEL = ME->CHARACTERISTIC_SELECTION.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCT = ES_RETURN.
CALL FUNCTION 'API_SEMBPS_GETDATA'
EXPORTING
I_AREA = ME->PLANNING_AREA
I_PLEVEL = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
I_PACKAGE = CL_SEMBPS_DATA_ACCESSOR=>C_ADHOC_PACK
I_LAYOUT = CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
I_READ_ONLY = 'X'
IMPORTING
E_SUBRC = E_SUBRC
TABLES
ETK_ROW = CHAR_DATA
ETK_COL = ETK_COL
ETK_DATA = KEYFIG_DATA
ETK_RETURN = ETK_RETURN.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCTS = ETK_RETURN.
* SET LAYOUT COLUMN SPECIFICATION
ME->LAYOUT_COL_SPEC[] = ETK_COL[].
* CHECK TO SEE IF THE COLUMN SPEC CONTAINS ALL KEY FIGURES REQUIRED
* THIS WOULD GUARANTEE THAT ALL THE KEY FIGURES PRESENT IN THE CUBE
* ARE ALSO IN THE LAYOUT
DESCRIBE TABLE ME->KEYFIGURES LINES LINE1.
DESCRIBE TABLE ME->LAYOUT_COL_SPEC LINES LINE2.
IF LINE1 <> LINE2.
LOOP AT ME->KEYFIGURES INTO KEYFIGURES_WA.
READ TABLE ME->LAYOUT_COL_SPEC
WITH KEY CHAVLEXT = KEYFIGURES_WA-KYFNM
TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 4.
CONCATENATE 'Layout ' CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
' is missing keyfigure: ' KEYFIGURES_WA-KYFNM
INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ETK_RETURN.
ENDIF.
ENDLOOP.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
RETURN_STRUCTS = ETK_RETURN.
ENDIF.
* CLEAR TRANSACTION DATA IF ANY
ASSIGN TRANSACTION_DATA->* TO <TD_TAB>.
REFRESH <TD_TAB>.
CREATE DATA WA_REF LIKE LINE OF <TD_TAB>.
ASSIGN WA_REF->* TO <TD_WA>.
DATA: PREV_ROWID TYPE UPC_YS_API_ROW-ROW VALUE 1.
DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
DATA: CONVERSION_EXIT TYPE STRING.
DATA: DECIMAL_CONV TYPE STRING.
DATA: DATE_CONV TYPE STRING.
CLEAR <TD_WA>.
* SORT DATA
SORT KEYFIG_DATA BY ROW.
SORT ETK_COL BY COL.
SORT CHAR_DATA BY ROW.
* INSERT ALL CHARACTERISTIC ROWS
LOOP AT CHAR_DATA INTO ETK_ROW_WA.
IF ETK_ROW_WA-CHANM IS NOT INITIAL.
IF ETK_ROW_WA-ROW <> PREV_ROWID.
CLEAR HAS_DATA.
PREV_ROWID = ETK_ROW_WA-ROW.
APPEND <TD_WA> TO <TD_TAB>.
CLEAR <TD_WA>.
ENDIF.
HAS_DATA = 'X'.
ASSIGN COMPONENT ETK_ROW_WA-CHANM OF STRUCTURE
<TD_WA> TO <TD_FIELD>.
IF SY-SUBRC = 0.
CLEAR <TD_FIELD>.
IF ETK_ROW_WA-CHAVLEXT <> '#'.
* APPLY INPUT CONVERSION EXIT FOR SAP INTERNAL DATA ELEMENTS
* ONLY APPLIES WHEN VALUE IS NOT UNASSIGNED ('#')
READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
WITH TABLE KEY FIELDNAME = ETK_ROW_WA-CHANM.
IF SY-SUBRC = 0 AND NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
<TD_FIELD> = ETK_ROW_WA-CHAVLEXT.
* APPLY INPUT CONVERSION EXIT IF ANY, CHECK INFOOBJECT RSD1 TRANSACTION
DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
READ TABLE ME->CONVEXIT_LOOKUP INTO CONVEXIT_WA
WITH TABLE KEY CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_INPUT
EXPORTING
INPUT = <TD_FIELD>
IMPORTING
OUTPUT = <TD_FIELD>.
ELSEIF SY-SUBRC = 0 AND WA_FIELDCATALOG-INTTYPE = 'D'.
* APPLY DATE CONVERSION AS THERE IS NO COVERSION EXIT FOR DATES DUE TO
* SAPGUI DISPLAY FORMATS BASED ON USER PROFILES
TRY.
DATE_CONV = ETK_ROW_WA-CHAVLEXT.
CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_EXT2INT
EXPORTING
EXTERNAL_DATE = DATE_CONV
RECEIVING
INTERNAL_DATE = <TD_FIELD>.
CATCH CX_DATE_CONVERSION .
* THERE SHOULD BE NO DATE CONVERSION ERROR.
ENDTRY.
ELSE.
<TD_FIELD> = ETK_ROW_WA-CHAVLEXT.
ENDIF.
ENDIF.
ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
CONCATENATE FIND_FIELD_ERR ETK_ROW_WA-CHANM
INTO MESSAGE.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
MESSAGE = MESSAGE.
ENDIF.
ENDIF.
ENDLOOP.
* APPEND THE LAST ROW
IF HAS_DATA IS NOT INITIAL.
APPEND <TD_WA> TO <TD_TAB>.
ENDIF.
* INSERT ALL KEY FIGURES
LOOP AT KEYFIG_DATA INTO KEYFIG_DATA_WA.
READ TABLE <TD_TAB> INTO <TD_WA> INDEX KEYFIG_DATA_WA-ROW.
IF SY-SUBRC <> 0.
* SUMMARY LINE WHICH INDICATES COMPLETION
EXIT.
ENDIF.
* AVAILABLE KEY FIGURES
READ TABLE ETK_COL INTO ETK_COL_WA
INDEX KEYFIG_DATA_WA-COL.
ASSIGN COMPONENT ETK_COL_WA-CHAVLEXT OF STRUCTURE
<TD_WA> TO <TD_FIELD>.
IF SY-SUBRC = 0.
READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
WITH TABLE KEY FIELDNAME = ETK_COL_WA-CHAVLEXT.
IF WA_FIELDCATALOG-INTTYPE = 'P'.
DECIMAL_CONV = KEYFIG_DATA_WA-VALUE.
CALL METHOD CL_ABAP_CONV_DECIMAL=>CONVERT_DECIMAL_EXT2INT
EXPORTING
EXTERNAL_VALUE = DECIMAL_CONV
CHANGING
INTERNAL_VALUE = <TD_FIELD>.
ELSEIF WA_FIELDCATALOG-INTTYPE = 'F' OR
WA_FIELDCATALOG-INTTYPE = 'I'.
<TD_FIELD> = KEYFIG_DATA_WA-VALUE.
ENDIF.
MODIFY <TD_TAB> INDEX KEYFIG_DATA_WA-ROW FROM <TD_WA>
TRANSPORTING (ETK_COL_WA-CHAVLEXT) .
ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
CONCATENATE FIND_FIELD_ERR ETK_ROW_WA-CHANM
INTO MESSAGE.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
MESSAGE = MESSAGE.
ENDIF.
ENDLOOP.
ENDMETHOD. "READ_DATA
METHOD SET_CHARACTERISTIC_SELECTION.
DATA: CHARACTERISTIC_SELECTION_WA TYPE UPC_YS_API_CHASEL.
DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
DATA: CONV_EXIT TYPE STRING.
DATA: DATE_CONV TYPE STRING.
DATA: TEMP_DATE TYPE D.
* basically convert the selection criteria to external values and hold
* copy of that
REFRESH ME->CHARACTERISTIC_SELECTION.
LOOP AT CHARACTERISTIC_SELECTION INTO CHARACTERISTIC_SELECTION_WA.
READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
WITH TABLE KEY FIELDNAME = CHARACTERISTIC_SELECTION_WA-CHANM.
IF SY-SUBRC = 0.
IF NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
READ TABLE ME->CONVEXIT_LOOKUP INTO CONVEXIT_WA
WITH TABLE KEY CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_OUTPUT
EXPORTING
INPUT = CHARACTERISTIC_SELECTION_WA-LOW
IMPORTING
OUTPUT = CHARACTERISTIC_SELECTION_WA-LOW.
CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_OUTPUT
EXPORTING
INPUT = CHARACTERISTIC_SELECTION_WA-HIGH
IMPORTING
OUTPUT = CHARACTERISTIC_SELECTION_WA-HIGH.
ELSEIF WA_FIELDCATALOG-INTTYPE = 'D'.
* DATE TYPE CONVERSION BASED ON SAP GUI
IF NOT CHARACTERISTIC_SELECTION_WA-LOW IS INITIAL.
TEMP_DATE = CHARACTERISTIC_SELECTION_WA-LOW.
CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_INT2EXT
EXPORTING
INTERNAL_DATE = TEMP_DATE
RECEIVING
EXTERNAL_DATE = DATE_CONV.
CHARACTERISTIC_SELECTION_WA-LOW = DATE_CONV.
ENDIF.
IF NOT CHARACTERISTIC_SELECTION_WA-HIGH IS INITIAL.
TEMP_DATE = CHARACTERISTIC_SELECTION_WA-HIGH.
CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_INT2EXT
EXPORTING
INTERNAL_DATE = TEMP_DATE
RECEIVING
EXTERNAL_DATE = DATE_CONV.
CHARACTERISTIC_SELECTION_WA-HIGH = DATE_CONV.
ENDIF.
ENDIF.
APPEND CHARACTERISTIC_SELECTION_WA TO
ME->CHARACTERISTIC_SELECTION.
ENDIF.
ENDLOOP.
ENDMETHOD. "SET_CHARACTERISTIC_SELECTION
METHOD SET_PLANNING_AREA.
DATA: ES_RETURN TYPE BAPIRET2.
DATA: E_SUBRC TYPE SY-SUBRC.
* CHECK TO SEE OF PLANNING AREA IS A MULTI-PLANNING AREA
CALL FUNCTION 'API_SEMBPS_AREA_GETDETAIL'
EXPORTING
I_AREA = PLANNING_AREA
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN
TABLES
ETK_CHAPRO = ME->CHARACTERISTICS
ETK_KYFPRO = ME->KEYFIGURES.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCT = ES_RETURN.
ME->PLANNING_AREA = PLANNING_AREA.
* FIND THE INFOCUBE RELATED TO THE PLANNING AREA
SELECT SINGLE INFOCUBE FROM UPC_BW_AREA INTO ME->INFOCUBE
WHERE AREA = PLANNING_AREA.
CALL METHOD ME->VALIDATE_PLANNING_OBJECTS.
ENDMETHOD. "SET_PLANNING_AREA
METHOD VALIDATE_PLANNING_OBJECTS.
DATA: E_SUBRC TYPE SY-SUBRC.
DATA: ES_RETURN TYPE BAPIRET2.
DATA: ES_RETURN_T TYPE TABLE OF BAPIRET2.
DATA: ETK_CHA TYPE TABLE OF UPC_YS_API_PLEVEL_CHA.
DATA: ETK_CHA_WA TYPE UPC_YS_API_PLEVEL_CHA.
DATA: CHARACTERISTIC_WA TYPE UPC_YS_API_CHAPRO.
DATA: KEYFIGURES_WA TYPE UPC_YS_API_KYFPRO.
DATA: ETK_CHASEL TYPE TABLE OF UPC_YS_API_CHASEL.
DATA: ETK_KYF TYPE TABLE OF UPC_YS_KYF.
DATA: ETK_RETURN TYPE TABLE OF BAPIRET2.
DATA: LINES1 TYPE I.
DATA: LINES2 TYPE I.
DATA: E_LEADCOL_COMPL TYPE UPC_YS_API_INFO-LEADCOL_COMPL.
DATA: ETK_HEAD_INFO TYPE TABLE OF UPC_YS_API_HEAD_INFO.
DATA: ETK_ROW_INFO TYPE TABLE OF UPC_YS_API_ROW_INFO.
DATA: ETK_COL_INFO TYPE TABLE OF UPC_YS_API_COL_INFO.
* CHECK TO SEE IF ITS A MULTI-PLANNING AREA
READ TABLE ME->CHARACTERISTICS TRANSPORTING NO FIELDS
WITH KEY CHANM = CL_SEMBPS_DATA_ACCESSOR=>C_MULTIPLAN_AREA.
* MULTI-PLANNING AREAS SHOULD NOT BE ACCEPTABLE TO THIS AS IT LEADS
* TO REFERENCING OF PLANNING AREAS IN ITS LEVEL/PACKAGES/LAYOUTS WHICH
* IS HARDER TO MAINTAIN
IF SY-SUBRC = 0.
REFRESH ME->CHARACTERISTICS.
REFRESH ME->KEYFIGURES.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
ES_RETURN-MESSAGE = 'DO NOT USE MULTI-PLANNING AREAS'.
APPEND ES_RETURN TO ES_RETURN_T.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
RETURN_STRUCTS = ES_RETURN_T.
ENDIF.
* CHECK THE PLANNING LEVEL
CALL FUNCTION 'API_SEMBPS_PLEVEL_GETDETAIL'
EXPORTING
I_AREA = ME->PLANNING_AREA
I_PLEVEL = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN
TABLES
ETK_CHA = ETK_CHA
ETK_CHASEL = ETK_CHASEL
ETK_KYF = ETK_KYF.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCT = ES_RETURN.
* CHECK TO SEE IF THE SAME NUMBER OF CHARACTERISTICS EXISTS IN LEVEL
DESCRIBE TABLE ME->CHARACTERISTICS LINES LINES1.
DESCRIBE TABLE ETK_CHA LINES LINES2.
IF LINES1 <> LINES2.
* ERROR OUT THE MISSING CHARACTERISTICS FROM THE PLANNING LEVEL
LOOP AT ME->CHARACTERISTICS INTO CHARACTERISTIC_WA.
READ TABLE ETK_CHA WITH KEY CHANM = CHARACTERISTIC_WA-CHANM
TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
CONCATENATE 'Missing characteristic ' CHARACTERISTIC_WA-CHANM
' from planning level ' CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ES_RETURN_T.
ENDIF.
ENDLOOP.
ENDIF.
* CHECK TO SEE IF EVERY CHARACTERISTIC IS AVAIABLE FOR SELECTION IN
* PACKAGE
READ TABLE ETK_CHA WITH KEY PACKSEL = SPACE TRANSPORTING NO FIELDS.
IF SY-SUBRC = 0.
* ERROR OUT THE CHARACTERISTICS THAT ARE NOT AVAILABLE FOR PACKAGE
* SELECTIONS
LOOP AT ETK_CHA INTO ETK_CHA_WA WHERE PACKSEL = SPACE.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
CONCATENATE 'Characteristic ' ETK_CHA_WA-CHANM
' needs to be available for selection in planning level '
CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ES_RETURN_T.
ENDLOOP.
ENDIF.
* CHECK TO SEE IF THE SAME NUMBER OF KEYFIGURES EXISTS IN LEVEL
DESCRIBE TABLE ME->KEYFIGURES LINES LINES1.
DESCRIBE TABLE ETK_KYF LINES LINES2.
IF LINES1 <> LINES2.
* ERROR OUT THE MISSING KEYFIGURES FROM THE PLANNING LEVEL
LOOP AT ME->KEYFIGURES INTO KEYFIGURES_WA.
READ TABLE ETK_KYF WITH KEY KYFNM = KEYFIGURES_WA-KYFNM
TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
CONCATENATE 'Missing keyfigure ' KEYFIGURES_WA-KYFNM
' from planning level ' CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ES_RETURN_T.
ENDIF.
ENDLOOP.
ENDIF.
* CHECK THE PLANNING LAYOUT
CALL FUNCTION 'API_SEMBPS_LAYOUT_GETDETAIL'
EXPORTING
I_AREA = ME->PLANNING_AREA
I_PLEVEL = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
I_LAYOUT = CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
IMPORTING
E_SUBRC = E_SUBRC
E_LEADCOL_COMPL = E_LEADCOL_COMPL
TABLES
ETK_HEAD_INFO = ETK_HEAD_INFO
ETK_ROW_INFO = ETK_ROW_INFO
ETK_COL_INFO = ETK_COL_INFO
ETK_RETURN = ETK_RETURN.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
EXPORTING
E_SUBRC = E_SUBRC
RETURN_STRUCTS = ETK_RETURN.
* MAKE SURE THAT HEADER AREA IS EMPTY AS ALL THE DATA READ IS IN LEAD
* COLUMNS ONLY
IF NOT ETK_HEAD_INFO[] IS INITIAL.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
CONCATENATE 'Header area must be empty in layout '
CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ES_RETURN_T.
ENDIF.
* MAKE SURE THAT LAYOUT TYPE IS KEY FIGURES IN DATA COLUMNS
IF NOT E_LEADCOL_COMPL IS INITIAL.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
CONCATENATE 'Layout ' CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
' must be of type "Key Figs in data columns"'
INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ES_RETURN_T.
ENDIF.
* CHECK FOR THE SAME NUMBER OF CHARACTERISTICS IN LEAD COLUMNS OF LAYOUT
* AND IN PLANNING AREA
DESCRIBE TABLE ME->CHARACTERISTICS LINES LINES1.
DESCRIBE TABLE ETK_ROW_INFO LINES LINES2.
IF LINES1 <> LINES2.
* ERROR OUT THE MISSING CHARACTERISTICS FROM THE PLANNING LEVEL
LOOP AT ME->CHARACTERISTICS INTO CHARACTERISTIC_WA.
READ TABLE ETK_ROW_INFO WITH KEY CHANM = CHARACTERISTIC_WA-CHANM
TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
CLEAR ES_RETURN.
ES_RETURN-TYPE = 'E'.
CONCATENATE 'Missing characteristic ' CHARACTERISTIC_WA-CHANM
' from planning layout ' CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
INTO ES_RETURN-MESSAGE.
APPEND ES_RETURN TO ES_RETURN_T.
ENDIF.
ENDLOOP.
ENDIF.
* IF MESSAGES ARE AVAILBLE FROM CUSTOM CHECKS THROW EXCEPTION
IF NOT ES_RETURN_T[] IS INITIAL.
CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
EXPORTING
RETURN_STRUCTS = ES_RETURN_T.
ENDIF.
ENDMETHOD. "VALIDATE_PLANNING_OBJECTS
ENDCLASS. "CL_SEMBPS_DATA_ACCESSOR IMPLEMENTATION
* CLASS CL_SEMBPS_DATA_ACCESS_FACTORY DEFINITION
CLASS CL_SEMBPS_DATA_ACCESS_FACTORY DEFINITION.
PUBLIC SECTION.
CLASS-METHODS CREATE_DATA_ACCESSOR
IMPORTING
PLAN_AREA TYPE UPC_AREA-AREA
CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T
DDIC_STRUCTURE_NAME TYPE DD02L-TABNAME OPTIONAL
EXPORTING
O_DATA_ACCESSOR TYPE REF TO CL_SEMBPS_DATA_ACCESSOR
CHANGING
TRANSACTION_DATA_TABLE TYPE STANDARD TABLE OPTIONAL
RAISING
CX_SEM_BPS_DATA_ACCESS .
CLASS-METHODS GET_PLANNING_AREA_SPECS
IMPORTING
PLANNING_AREA TYPE UPC_AREA-AREA
EXPORTING
TRANSACTION_DATA_STRUCT TYPE REF TO DATA
KEYFIGURES TYPE UPC_YS_API_KYFPRO_T
FIELDCATALOG TYPE LVC_T_FCAT
CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T
RAISING
CX_SEM_BPS_DATA_ACCESS .
PRIVATE SECTION.
CLASS-DATA PLAN_AREA_CACHE TYPE PLAN_AREA_STRUCT_CACHE_T .
CLASS-METHODS CREATE_DYNAMIC_STRUCTURE
IMPORTING
PLANNING_AREA TYPE UPC_AREA-AREA
EXPORTING
TRANSACTION_DATA_STRUCT TYPE REF TO DATA
KEYFIGURES TYPE UPC_YS_API_KYFPRO_T
FIELDCATALOG TYPE LVC_T_FCAT
CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T
RAISING
CX_SEM_BPS_DATA_ACCESS .
ENDCLASS. "CL_SEMBPS_DATA_ACCESS_FACTORY DEFINITION
* CLASS CL_SEMBPS_DATA_ACCESS_FACTORY IMPLEMENTATION
CLASS CL_SEMBPS_DATA_ACCESS_FACTORY IMPLEMENTATION.
METHOD CREATE_DATA_ACCESSOR.
DATA: TRANSACTION_DATA_STRUCT TYPE REF TO DATA.
DATA: FIELDCATALOG TYPE LVC_T_FCAT.
IF TRANSACTION_DATA_TABLE IS SUPPLIED
AND DDIC_STRUCTURE_NAME IS SUPPLIED AND
NOT DDIC_STRUCTURE_NAME IS INITIAL.
* RETRIEVE FIELD CATALOG OF THE DDIC STRUCTURE TO PROVIDE
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
I_STRUCTURE_NAME = DDIC_STRUCTURE_NAME
CHANGING
CT_FIELDCAT = FIELDCATALOG
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
GET REFERENCE OF TRANSACTION_DATA_TABLE INTO
TRANSACTION_DATA_STRUCT.
ELSE.
* GENERATE INTERNAL TABLE AND ITS FIELD CATALOG DYNAMICALLY
CALL METHOD CL_SEMBPS_DATA_ACCESS_FACTORY=>GET_PLANNING_AREA_SPECS
EXPORTING
PLANNING_AREA = PLAN_AREA
IMPORTING
TRANSACTION_DATA_STRUCT = TRANSACTION_DATA_STRUCT
FIELDCATALOG = FIELDCATALOG.
ENDIF.
* CREATE DATA ACCESSOR
CREATE OBJECT O_DATA_ACCESSOR
EXPORTING
PLANNING_AREA = PLAN_AREA
IT_FIELDCATALOG = FIELDCATALOG
TRANSACTION_DATA_TABLE = TRANSACTION_DATA_STRUCT
CHARACTERISTIC_SELECTION = CHARACTERISTIC_SELECTION.
ENDMETHOD. "CREATE_DATA_ACCESSOR
METHOD GET_PLANNING_AREA_SPECS.
DATA: PLAN_AREA_CACHE_WA TYPE PLAN_AREA_STRUCT_CACHE.
FIELD-SYMBOLS: <TD_TAB_DEFINITION> TYPE STANDARD TABLE.
READ TABLE PLAN_AREA_CACHE
WITH TABLE KEY PLANNING_AREA = PLANNING_AREA
INTO PLAN_AREA_CACHE_WA.
* CREATE INTERNAL TABLE REFLECTING THE PLANNING AREA AND CACHE IT
* TO AVOID TOO MANY CALLS TO CREATION OF DYNAMIC INTERNAL TABLES
* SAP HAS RESTRICTED DEVELOPERS FROM CREATING
IF SY-SUBRC <> 0.
CLEAR PLAN_AREA_CACHE_WA.
CALL METHOD
CL_SEMBPS_DATA_ACCESS_FACTORY=>CREATE_DYNAMIC_STRUCTURE
EXPORTING
PLANNING_AREA = PLANNING_AREA
IMPORTING
TRANSACTION_DATA_STRUCT =
PLAN_AREA_CACHE_WA-TRANSACTION_DATA_TABLE
KEYFIGURES = PLAN_AREA_CACHE_WA-KEYFIGURES
FIELDCATALOG = PLAN_AREA_CACHE_WA-FIELDCATALOG
CHARACTERISTICS = PLAN_AREA_CACHE_WA-CHARACTERISTICS.
PLAN_AREA_CACHE_WA-PLANNING_AREA = PLANNING_AREA.
INSERT PLAN_AREA_CACHE_WA INTO TABLE PLAN_AREA_CACHE.
ENDIF.
FIELDCATALOG[] = PLAN_AREA_CACHE_WA-FIELDCATALOG.
CHARACTERISTICS[] = PLAN_AREA_CACHE_WA-CHARACTERISTICS[].
KEYFIGURES[] = PLAN_AREA_CACHE_WA-KEYFIGURES[].
ASSIGN PLAN_AREA_CACHE_WA-TRANSACTION_DATA_TABLE->*
TO <TD_TAB_DEFINITION>.
* CREATE A NEW REFERENCE
CREATE DATA TRANSACTION_DATA_STRUCT LIKE
<TD_TAB_DEFINITION>.
ENDMETHOD. "GET_PLANNING_AREA_SPECS
METHOD CREATE_DYNAMIC_STRUCTURE.
DATA: ES_RETURN TYPE BAPIRET2.
DATA: E_SUBRC TYPE SY-SUBRC.
DATA: MESSAGE TYPE STRING.
CALL FUNCTION 'API_SEMBPS_AREA_GETDETAIL'
EXPORTING
I_AREA = PLANNING_AREA
IMPORTING
E_SUBRC = E_SUBRC
ES_RETURN = ES_RETURN
TABLES
ETK_CHAPRO = CHARACTERISTICS
ETK_KYFPRO = KEYFIGURES.
IF E_SUBRC <> 0.
MESSAGE = ES_RETURN-MESSAGE.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
EXPORTING MESSAGE = MESSAGE.
ENDIF.
READ TABLE CHARACTERISTICS TRANSPORTING NO FIELDS
WITH KEY CHANM = CL_SEMBPS_DATA_ACCESSOR=>C_MULTIPLAN_AREA.
IF SY-SUBRC = 0.
MESSAGE = 'DO NOT USE MULTI-PLANNING AREAS'.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
EXPORTING MESSAGE = MESSAGE.
ENDIF.
DATA: CHAR_WA TYPE UPC_YS_API_CHAPRO.
DATA: KEYFIG_WA TYPE UPC_YS_API_KYFPRO.
DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
DATA: RETURN TYPE BAPIRET2.
DATA: DETAILS TYPE BAPI6108.
* CHARACTERISTIC FIELDCATALOG
LOOP AT CHARACTERISTICS INTO CHAR_WA.
WA_FIELDCATALOG-INTTYPE = CHAR_WA-INTTP.
WA_FIELDCATALOG-FIELDNAME = CHAR_WA-CHANM.
WA_FIELDCATALOG-DATATYPE = CHAR_WA-DATATP.
WA_FIELDCATALOG-INTLEN = CHAR_WA-INTLEN.
WA_FIELDCATALOG-DECIMALS = CHAR_WA-DECIMALS.
WA_FIELDCATALOG-OUTPUTLEN = CHAR_WA-OUTPUTLEN.
CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
EXPORTING
INFOOBJECT = CHAR_WA-CHANM
IMPORTING
DETAILS = DETAILS
RETURN = RETURN.
IF RETURN-TYPE = 'E'.
MESSAGE = RETURN-MESSAGE.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
EXPORTING MESSAGE = MESSAGE.
ENDIF.
WA_FIELDCATALOG-CONVEXIT = DETAILS-CONVEXIT.
APPEND WA_FIELDCATALOG TO FIELDCATALOG.
ENDLOOP.
* KEYFIGURE FIELDCATALOG
LOOP AT KEYFIGURES INTO KEYFIG_WA.
WA_FIELDCATALOG-INTTYPE = KEYFIG_WA-INTTP.
WA_FIELDCATALOG-FIELDNAME = KEYFIG_WA-KYFNM.
WA_FIELDCATALOG-DATATYPE = KEYFIG_WA-DATATP.
WA_FIELDCATALOG-INTLEN = KEYFIG_WA-DIGITS.
WA_FIELDCATALOG-DECIMALS = KEYFIG_WA-DECIMALS.
WA_FIELDCATALOG-DD_OUTLEN = KEYFIG_WA-OUTPUTLEN.
CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
EXPORTING
INFOOBJECT = KEYFIG_WA-KYFNM
IMPORTING
DETAILS = DETAILS
RETURN = RETURN.
IF RETURN-TYPE = 'E'.
MESSAGE = RETURN-MESSAGE.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
EXPORTING MESSAGE = MESSAGE.
ENDIF.
WA_FIELDCATALOG-CONVEXIT = DETAILS-CONVEXIT.
APPEND WA_FIELDCATALOG TO FIELDCATALOG.
ENDLOOP.
* AVOID TOO MANY CALLS TO THIS FUNCTION MODULE
IF NOT FIELDCATALOG[] IS INITIAL.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = FIELDCATALOG
IMPORTING
EP_TABLE = TRANSACTION_DATA_STRUCT
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
CASE SY-SUBRC.
WHEN 1.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS EXPORTING
MESSAGE = 'Dynamic table creation failure on subpool'.
WHEN 2.
RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS EXPORTING
MESSAGE = 'Dynamic table creation failure'.
ENDCASE.
ENDIF.
ENDMETHOD. "CREATE_DYNAMIC_STRUCTURE
ENDCLASS. "CL_SEMBPS_DATA_ACCESS_FACTORY IMPLEMENTATION
Look at this link:
<a href="http://help.sap.com/saphelp_nw04/helpdata/en/cf/21ee19446011d189700000e8322d00/frameset.htm">http://help.sap.com/saphelp_nw04/helpdata/en/cf/21ee19446011d189700000e8322d00/frameset.htm</a>
Pls reward points.
Regards,
Ameet -
Execute a string containing a PL/SQL block
Hi,
I would like to build a string containing a PL/SQL block and execute it dynamically. Is there way to do this.
Note - The reason I want to this is because, based on certain table data dictionary views the declaration section of the PL/SQL block that I am building might vary
I tried to use EXECUTE IMMEDIATE, it didn't work, pls let me know if I am missing something.
DECLARE
v_str VARCHAR2(1000);
BEGIN
v_str := 'BEGIN NULL; END';
EXECUTE IMMEDIATE v_str;
END;
/Hi,
Just happened to find it. EXECUTE IMMEDIATE can be used, the bug with my code was I didn't have a ; after the END statement. Corrected code is below, thanks for your time
DECLARE
v_str VARCHAR2(1000);
BEGIN
v_str := 'BEGIN NULL; END;';
EXECUTE IMMEDIATE v_str;
END;
/ -
How to determine if string contains HashSet item using LINQ
Hi,
I know how to iterate through a HashSet to see if an item is contained in a string. But, I can't quite figure out how to do it with LINQ.
Something like if( string.Contains(???))
I would appreciate any help!
Thanks much!!Thanks everyone. I like the examples posted above.
Actually, what I want to know is if any HashSet values can be found in a string using LINQ
HashSet<string> terminals = new HashSet<string>();
terminals.Add("FD4A");
terminals.Add("FD4B");
terminals.Add("FD4C");
//a collection of a bunch of transactions done at various terminals
List<string> transactionList = new List<string>();
foreach (string transaction in transactionList)
foreach (string terminal in terminals)
if (transaction.Contains(terminal) == true)
//this is one of the transactions I want - do something
break;
Thanks much and have a great weekend!! -
Construct a string containing a command
Hi experts
please help me
Is there a way to dynamically construct code, such as:
I'd like to write a method that receives as input a string identifying a node name, and use it as follows:
wdcontext.current<InputNodeName>Element.get<AttributeName><do whatever I want>
OR
Is there a way to construct a string containing a command, and then execute it?
Such as: If I construct the following in a string by concatenating different parts of the string: wdcontext.current<InputNodeName>Element.get<AtributeName>.<do whatever I want>
Can I then pass the resulting string to some function that actually executes it?Hi,
Unfortunately - there is no way to construct the command dynamically so that the command will execute. The parameters that are part of teh command may be dynamic (using Super classes and method overloading).
However, in case you want to write a single method that does all the function calling then what you need to do is:
1.) Make a context attribute that will hold some code (1,2,3 or A,B,C etc)
2.) Create the method that will read this attribute.
3.) After reading the attribute write a switch case or an if statement that will run your command.
Of course for this you will need to know all the required commands at design time.
Thanks.
p256960 -
Want to know how to check for new line character in text file
Hi All,
I`m trying to read data from text file. However I`m not sure whether the data is in 1st line or nth line. Now I`m trying to read the text from the readline. But if text is "" and not NULL then my code fails. So I want to know how to check for new line character and go to next line to find the data. Please help.
Thanks
static int readandwriteFile(Logger logger,String filepath){
BufferedWriter out = null;
BufferedReader in = null;
File fr = null;
int get_count = 0;
try {
if(new File(filepath).exists())
fr= new File(filepath);
System.out.println("FileName: "+fr);
if(fr != null){
in = new BufferedReader(new FileReader(fr));
String text = in.readLine();
if(text != null){
get_count = Integer.parseInt(text);
in.close();
else{
get_count = 0;
else{
out = new BufferedWriter(new FileWriter(filepath));
out.write("0");
out.close();
} //Reading of the row count file ended.
catch(Exception e) {
e.printStackTrace();
finally {
try{ if (in != null) {
in.close();
if (out != null) {
out.close();
catch(Exception e) {
e.printStackTrace();
return get_count;
}You are calling the readline() only once which means you are reading only the first line from the file...
Use a loop (Do-While preferably)
do{
//your code
}while(text == "") -
Hi, I want to know that standard tables for vendor analasys report and sale
Hi, I want to know that standard reports for vendor analasys report and sale order and customer order report...? why most probably we use tables and fetch the fields rather than standard reports >
Hi
This is the sample report for vendor aging:
Std reports Tcodes are:
customer : s_alr_87012178
vendor : s_alr_87012084
Custom designed:
REPORT zfi_customer_ageing
NO STANDARD PAGE HEADING
LINE-COUNT 58
line-size 168
MESSAGE-ID zh_msg.
D A T A B A S E T A B L E S D E C L A R A T I O N
TABLES: kna1, " Customer Master (General)
t001, " Company Codes
rfpdo.
I N T E R N A L T A B L E S D E C L A R A T I O N S *
Internal Table for Customer Open Items Data
DATA: BEGIN OF int_bsid OCCURS 0,
kunnr LIKE bsid-kunnr, " Customer Number
name1 LIKE kna1-name1, " Customer Name
shkzg LIKE bsid-shkzg, " Dr/Cr Indicator
belnr LIKE bsid-belnr, " Document Number
xblnr LIKE bsid-xblnr, " Ref Doc No
blart LIKE bsid-blart, " Document Type
zfbdt LIKE bsid-zfbdt, " Base Line Date
zbd1t LIKE bsid-zbd1t, " Due date1
zbd2t LIKE bsid-zbd2t, " Due Date2
zbd3t LIKE bsid-zbd3t, " Due Date3
waers LIKE bsid-waers, " Currency
dmbtr LIKE bsid-dmbtr, " Amount in Local Curr
END OF int_bsid.
Internal Table for Amounts Sum Up Data
DATA: BEGIN OF int_final OCCURS 0,
kunnr LIKE bsid-kunnr, " Customer Number
name1 LIKE kna1-name1, " Customer Name
total1 LIKE bsid-dmbtr, " Amount in Local Curr
total2 LIKE bsid-dmbtr, " Amount in Local Curr
total3 LIKE bsid-dmbtr, " Amount in Local Curr
total4 LIKE bsid-dmbtr, " Amount in Local Curr
total5 LIKE bsid-dmbtr, " Amount in Local Curr
total6 LIKE bsid-dmbtr, " Amount in Local Curr
total LIKE bsid-dmbtr, " Amount in Local Curr
END OF int_final.
D A T A D E C L A R A T I O N S
DATA : v_flag, " Flag
v_gtotal1 LIKE bsid-dmbtr, " Amount Totals
v_gtotal2 LIKE bsid-dmbtr, " Amount Totals
v_gtotal3 LIKE bsid-dmbtr, " Amount Totals
v_gtotal4 LIKE bsid-dmbtr, " Amount Totals
v_gtotal5 LIKE bsid-dmbtr, " Amount Totals
v_gtotal6 LIKE bsid-dmbtr, " Amount Totals
v_gtotal LIKE bsid-dmbtr, " Amount Totals
v_subtotal1 LIKE bsid-dmbtr, " Amount Totals
v_subtotal2 LIKE bsid-dmbtr, " Amount Totals
v_subtotal3 LIKE bsid-dmbtr, " Amount Totals
v_subtotal4 LIKE bsid-dmbtr, " Amount Totals
v_subtotal5 LIKE bsid-dmbtr, " Amount Totals
v_subtotal6 LIKE bsid-dmbtr, " Amount Totals
v_subtotal LIKE bsid-dmbtr, " Amount Totals
v_date LIKE bsid-zfbdt, " Due Date
v_tage1(4), " Age 30 days
v_tage2(4), " Age 60 days
v_tage3(4), " Age 90 days
v_fir(15), " Column Text1
v_sec(15), " Column Text2
v_thir(15), " Column Text3
v_four(17), " Column Text4
v_fidd(4), " Days field1
v_sedd(4), " Days field2
v_thdd(4), " Days field3
v_fodd(4), " Days field4
v_str TYPE SY-LISEL, " String
v_str1(11), " String
v_tage(3), " String
v_date1(10). " Date field
R A N G E D E C L A R A T I O N S
RANGES: r_date1 FOR bsid-zfbdt, " Date Range 1
r_date2 FOR bsid-zfbdt, " Date Range 2
r_date3 FOR bsid-zfbdt, " Date Range 3
r_date4 FOR bsid-zfbdt. " Date Range 4
S E L E C T I O N S C R E E N *
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_kunnr FOR kna1-kunnr. "Customer account
PARAMETERS: p_bukrs LIKE t001-bukrs. "Co. Code
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: p_allgst LIKE rfpdo-allgstid OBLIGATORY DEFAULT sy-datum.
"Open items at key date
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
PARAMETERS: p_tage1 LIKE rfpdo1-allgfael DEFAULT '30',
p_tage2 LIKE rfpdo1-allgfael DEFAULT '60',
p_tage3 LIKE rfpdo1-allgfael DEFAULT '90',
p_tage4 LIKE rfpdo1-allgfael DEFAULT '120'.
SELECTION-SCREEN END OF BLOCK b3.
A T S E L E C T I O N S C R E E N *
AT SELECTION-SCREEN.
Validate the screen fields
PERFORM validate_flds.
S T A R T O F S E L E C T I O N *
START-OF-SELECTION.
Fetch main data
PERFORM fetch_data.
T O P O F P A G E
Header
TOP-OF-PAGE.
PERFORM header.
E N D O F P A G E
Footer
END-OF-PAGE.
ULINE.
T O P O F P A G E D U R I N G L I N E S E L E C T I O N *
Top of Page in Secondary List
TOP-OF-PAGE DURING LINE-SELECTION.
PERFORM header1.
A T L I N E S E L E C T I O N *
AT LINE-SELECTION.
Perform Line Selections
PERFORM line_selection.
E N D O F S E L E C T I O N
END-OF-SELECTION.
List generation
PERFORM basic_list.
*& Form validate_flds
Validation of Selection Screen fields
FORM validate_flds .
Validate Customer Code
CLEAR kna1-kunnr.
SELECT kunnr UP TO 1 ROWS
INTO kna1-kunnr
FROM kna1
WHERE kunnr IN s_kunnr AND
spras = sy-langu.
ENDSELECT.
IF sy-subrc <> 0.
MESSAGE e000 WITH 'Invalid Customer Code range'(023).
ENDIF.
Validate Company Code
CLEAR t001-bukrs.
SELECT bukrs UP TO 1 ROWS
INTO t001-bukrs
FROM t001
WHERE bukrs = p_bukrs AND
spras = sy-langu.
ENDSELECT.
IF sy-subrc <> 0.
MESSAGE e021. " Invalid Company Code range
ENDIF.
IF ( p_tage1 > p_tage2 ) OR ( p_tage1 > p_tage3 ) OR
( p_tage1 > p_tage4 ).
MESSAGE e999 WITH 'Column 1 greater'(004)
'than Column# 2 or 3 or 4'(005).
ENDIF.
*column 2
IF ( p_tage2 > p_tage3 ) OR ( p_tage1 > p_tage4 ).
MESSAGE e999 WITH 'Column 2 greater'(006)
'than Column# 3 or 4'(007).
ENDIF.
*column3
IF ( p_tage3 > p_tage4 ).
MESSAGE e999 WITH 'Column 3 greater'(008)
'than Column#4'(009).
ENDIF.
ENDFORM. " validate_flds
*& Form fetch_data
Fetching Data from Database Tables
FORM fetch_data .
Date Range Population
r_date1-sign = 'I'.
r_date1-option = 'BT'.
r_date1-low = p_allgst.
r_date1-high = r_date1-low + p_tage1.
APPEND r_date1.
r_date2-sign = 'I'.
r_date2-option = 'BT'.
r_date2-low = r_date1-high + 1.
r_date2-high = r_date1-low + p_tage2.
APPEND r_date2.
r_date3-sign = 'I'.
r_date3-option = 'BT'.
r_date3-low = r_date2-high + 1.
r_date3-high = r_date1-low + p_tage3.
APPEND r_date3.
r_date4-sign = 'I'.
r_date4-option = 'BT'.
r_date4-low = r_date3-high + 1.
r_date4-high = r_date1-low + p_tage4.
APPEND r_date4.
Select the Customer Open Items data from bsid
SELECT l~kunnr
l1~name1
b~waers
b~dmbtr
b~zfbdt
b~zbd1t
b~zbd2t
b~zbd3t
b~belnr
b~xblnr
b~shkzg
b~blart
INTO CORRESPONDING FIELDS OF TABLE int_bsid
FROM knb1 AS l INNER JOIN kna1 AS l1
ON lkunnr = l1kunnr
INNER JOIN bsid AS b
ON lkunnr = bkunnr AND
lbukrs = bbukrs
WHERE l~kunnr IN s_kunnr AND
l~bukrs = p_bukrs and
b~zfbdt le p_allgst.
IF SY-SUBRC <> 0.
MESSAGE i000 WITH 'No Data found'(027).
ENDIF.
Removing the date limit to get the due items in the past
DELETE int_bsid WHERE
( blart NE 'RE' AND blart NE 'KR' ) OR
shkzg NE 'H'.
SORT int_bsid BY kunnr.
ENDFORM. " fetch_data
*& Form header
Display the Report Columns
FORM header .
v_tage1 = p_tage1 + 1.
v_tage2 = p_tage2 + 1.
v_tage3 = p_tage3 + 1.
v_fidd = p_tage1.
v_sedd = p_tage2.
v_thdd = p_tage3.
v_fodd = p_tage4.
MOVE v_fodd0(4) TO v_fodd1(3).
v_fodd+0(1) = space.
CONCATENATE '1 to'(010) v_fidd INTO v_fir.
CONCATENATE v_tage1 ' to '(011) v_sedd INTO v_sec.
CONCATENATE v_tage2 ' to '(011) v_thdd INTO v_thir.
CONCATENATE v_tage3 ' to '(011) space v_fodd INTO v_four.
Standard header
clear: v_date1, v_str, v_str1, v_tage.
write p_allgst to v_date1.
Move p_tage4 to v_tage.
concatenate '>' v_tage text-025 into v_str1.
concatenate
'Summary of Ageing Analysis for Customer Open Invoices as on'(013)
v_date1 into v_str separated by space.
CALL FUNCTION 'Z_STANDARD_HEADER'
EXPORTING
title1 = 'Saudi International Petrochemical Company'(012)
title2 = v_str.
FORMAT COLOR OFF.
WRITE : /1(168) sy-uline.
FORMAT COLOR 1 INTENSIFIED.
WRITE :/1 sy-vline, 13 sy-vline, 49 sy-vline,
50(101) 'Invoices Due For(In Days)'(014) CENTERED,
151 sy-vline, 168 sy-vline .
WRITE :/1 sy-vline, 2(11) 'Customer#'(015) CENTERED,
13 sy-vline ,14(35) 'Customer Name'(016) CENTERED,
49 sy-vline,
50(101) sy-uline,151 sy-vline,
152(16) 'Total'(017) CENTERED,
168 sy-vline.
WRITE : /1 sy-vline,13 sy-vline, 49 sy-vline,
50(16) v_fir CENTERED, 66 sy-vline,
67(16) v_sec CENTERED, 83 sy-vline,
84(16) v_thir CENTERED, 100 sy-vline,
101(16) v_four CENTERED, 117 sy-vline,
118(16) v_str1 centered, 134 sy-vline,
135(16) 'Already Overdue'(018) CENTERED,151 sy-vline,
168 sy-vline.
FORMAT COLOR OFF.
WRITE : /1(168) sy-uline.
ENDFORM. " header
*& Form basic_list
Display the Basic List
FORM basic_list .
NEW-PAGE LINE-SIZE 168.
LOOP AT int_bsid.
CLEAR v_date.
IF int_bsid-zbd3t <> ' '.
v_date = int_bsid-zfbdt + int_bsid-zbd3t.
ELSE.
IF int_bsid-zbd2t <> ' '.
v_date = int_bsid-zfbdt + int_bsid-zbd2t.
ELSE.
v_date = int_bsid-zfbdt + int_bsid-zbd1t.
ENDIF.
ENDIF.
IF int_bsid-zbd1t = ' '.
v_date = int_bsid-zfbdt.
ENDIF.
IF v_date IN r_date1.
int_final-total1 = int_final-total1 + int_bsid-dmbtr.
ELSEIF v_date IN r_date2.
int_final-total2 = int_final-total2 + int_bsid-dmbtr.
ELSEIF v_date IN r_date3.
int_final-total3 = int_final-total3 + int_bsid-dmbtr.
ELSEIF v_date IN r_date4.
int_final-total4 = int_final-total4 + int_bsid-dmbtr.
ELSEif v_date > r_date4-high.
int_final-total5 = int_final-total5 + int_bsid-dmbtr.
ELSEif v_date < p_allgst.
int_final-total6 = int_final-total6 + int_bsid-dmbtr.
ENDIF.
AT END OF kunnr.
v_flag = 1.
ENDAT.
IF v_flag = 1.
int_final-kunnr = int_bsid-kunnr.
int_final-name1 = int_bsid-name1.
int_final-total = int_final-total1 + int_final-total2 +
int_final-total3 + int_final-total4 + int_final-total5 +
int_final-total6.
APPEND int_final.
v_gtotal1 = v_gtotal1 + int_final-total1.
v_gtotal2 = v_gtotal2 + int_final-total2.
v_gtotal3 = v_gtotal3 + int_final-total3.
v_gtotal4 = v_gtotal4 + int_final-total4.
v_gtotal5 = v_gtotal5 + int_final-total5.
v_gtotal6 = v_gtotal6 + int_final-total6.
v_gtotal = v_gtotal + int_final-total.
WRITE: /1 sy-vline,
2 int_final-kunnr COLOR 4 INTENSIFIED ON,
13 sy-vline,
14 int_final-name1 COLOR 4 INTENSIFIED ON,
49 sy-vline.
DATA : v_rem.
v_rem = sy-tabix MOD 2.
IF v_rem NE 0.
FORMAT COLOR 2 INTENSIFIED.
WRITE : 50 int_final-total1 CURRENCY int_bsid-waers,
66 sy-vline,
67 int_final-total2 CURRENCY int_bsid-waers,
83 sy-vline,
84 int_final-total3 CURRENCY int_bsid-waers,
100 sy-vline,
101 int_final-total4 CURRENCY int_bsid-waers,
117 sy-vline,
118 int_final-total5 CURRENCY int_bsid-waers,
134 sy-vline,
135 int_final-total6 CURRENCY int_bsid-waers,
151 sy-vline,
152 int_final-total CURRENCY int_bsid-waers,
168 sy-vline.
ELSE.
WRITE : 50 int_final-total1 CURRENCY int_bsid-waers,
66 sy-vline,
67 int_final-total2 CURRENCY int_bsid-waers,
83 sy-vline,
84 int_final-total3 CURRENCY int_bsid-waers,
100 sy-vline,
101 int_final-total4 CURRENCY int_bsid-waers,
117 sy-vline,
118 int_final-total5 CURRENCY int_bsid-waers,
134 sy-vline,
135 int_final-total6 CURRENCY int_bsid-waers,
151 sy-vline,
152 int_final-total CURRENCY int_bsid-waers,
168 sy-vline.
ENDIF.
FORMAT COLOR OFF.
HIDE int_final.
CLEAR int_final.
v_flag = 0.
ENDIF.
AT LAST.
WRITE : /1(168) sy-uline.
FORMAT COLOR 3 INTENSIFIED.
WRITE : /1 sy-vline, 2(47) 'GRAND TOTAL'(022) CENTERED,
49 sy-vline, 50 v_gtotal1 CURRENCY int_bsid-waers,
66 sy-vline, 67 v_gtotal2 CURRENCY int_bsid-waers,
83 sy-vline, 84 v_gtotal3 CURRENCY int_bsid-waers,
100 sy-vline,101 v_gtotal4 CURRENCY int_bsid-waers,
117 sy-vline,118 v_gtotal5 CURRENCY int_bsid-waers,
134 sy-vline,135 v_gtotal6 CURRENCY int_bsid-waers,
151 sy-vline,152 v_gtotal CURRENCY int_bsid-waers,
168 sy-vline.
HIDE : v_gtotal1,
v_gtotal2,
v_gtotal3,
v_gtotal4,
v_gtotal5,
v_gtotal6,
v_gtotal.
ENDAT.
FORMAT COLOR OFF.
ENDLOOP.
WRITE : /1(168) sy-uline.
ENDFORM. " basic_list
*& Form line_selection
When double clicked on the line display the seconday list
FORM line_selection .
NEW-PAGE LINE-SIZE 206.
Sy-lsind = 1.
DATA : v_rem,v_cnt LIKE sy-tabix.
v_cnt = 0.
SORT int_bsid BY belnr zfbdt.
LOOP AT int_bsid WHERE kunnr EQ int_final-kunnr.
v_rem = v_cnt MOD 2.
CLEAR v_date.
IF int_bsid-zbd3t <> ' '.
v_date = int_bsid-zfbdt + int_bsid-zbd3t.
ELSE.
IF int_bsid-zbd2t <> ' '.
v_date = int_bsid-zfbdt + int_bsid-zbd2t.
ELSE.
v_date = int_bsid-zfbdt + int_bsid-zbd1t.
ENDIF.
ENDIF.
IF int_bsid-zbd1t = ' '.
v_date = int_bsid-zfbdt.
ENDIF.
IF v_rem NE 0.
format color 2 intensified.
WRITE :/1 sy-vline, 2 int_bsid-belnr,
12 sy-vline,13 int_bsid-kunnr,
23 sy-vline,24 int_bsid-name1,
59 sy-vline,60 int_bsid-xblnr,
76 sy-vline,77 int_bsid-zfbdt,
87 sy-vline.
WRITE : 104 sy-vline,121 sy-vline,
138 sy-vline,155 sy-vline,
172 sy-vline, 189 sy-vline,
190 int_bsid-dmbtr CURRENCY int_bsid-waers,
206 sy-vline.
IF v_date IN r_date1.
v_subtotal1 = v_subtotal1 + int_bsid-dmbtr.
WRITE : 88 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEIF v_date IN r_date2.
v_subtotal2 = v_subtotal2 + int_bsid-dmbtr.
WRITE : 105 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEIF v_date IN r_date3.
v_subtotal3 = v_subtotal3 + int_bsid-dmbtr.
WRITE : 122 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEIF v_date IN r_date4.
v_subtotal4 = v_subtotal4 + int_bsid-dmbtr.
WRITE : 139 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEif v_date > r_date4-high.
v_subtotal5 = v_subtotal5 + int_bsid-dmbtr.
WRITE : 156 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEif v_date < p_allgst.
v_subtotal6 = v_subtotal6 + int_bsid-dmbtr.
WRITE : 173 int_bsid-dmbtr CURRENCY int_bsid-waers.
ENDIF.
format color off.
ELSE.
WRITE :/1 sy-vline, 2 int_bsid-belnr,
12 sy-vline,13 int_bsid-kunnr,
23 sy-vline,24 int_bsid-name1,
59 sy-vline,60 int_bsid-xblnr,
76 sy-vline,77 int_bsid-zfbdt,
87 sy-vline.
WRITE : 104 sy-vline,121 sy-vline,
138 sy-vline,155 sy-vline,
172 sy-vline,189 sy-vline,
190 int_bsid-dmbtr CURRENCY int_bsid-waers,
206 sy-vline.
IF v_date IN r_date1.
v_subtotal1 = v_subtotal1 + int_bsid-dmbtr.
WRITE : 88 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEIF v_date IN r_date2.
v_subtotal2 = v_subtotal2 + int_bsid-dmbtr.
WRITE : 105 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEIF v_date IN r_date3.
v_subtotal3 = v_subtotal3 + int_bsid-dmbtr.
WRITE : 122 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEIF v_date IN r_date4.
v_subtotal4 = v_subtotal4 + int_bsid-dmbtr.
WRITE : 139 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEif v_date > r_date4-high.
v_subtotal5 = v_subtotal5 + int_bsid-dmbtr.
WRITE : 156 int_bsid-dmbtr CURRENCY int_bsid-waers.
ELSEif v_date < p_allgst.
v_subtotal6 = v_subtotal6 + int_bsid-dmbtr.
WRITE : 173 int_bsid-dmbtr CURRENCY int_bsid-waers.
ENDIF.
ENDIF.
FORMAT COLOR OFF.
v_cnt = v_cnt + 1.
ENDLOOP.
WRITE : /1(206) sy-uline.
v_subtotal = v_subtotal1 + v_subtotal2 + v_subtotal3
+ v_subtotal4 + v_subtotal5 + v_subtotal6.
FORMAT COLOR 3 INTENSIFIED.
WRITE : /1 sy-vline,
2(85) 'Total'(017) CENTERED CURRENCY int_bsid-waers ,
87 sy-vline,
88 v_subtotal1 CURRENCY int_bsid-waers,
104 sy-vline,
105 v_subtotal2 CURRENCY int_bsid-waers,
121 sy-vline,
122 v_subtotal3 CURRENCY int_bsid-waers,
138 sy-vline,
139 v_subtotal4 CURRENCY int_bsid-waers,
155 sy-vline,
156 v_subtotal5 CURRENCY int_bsid-waers,
172 sy-vline,
173 v_subtotal6 CURRENCY int_bsid-waers,
189 sy-vline,
190 v_subtotal CURRENCY int_bsid-waers,
206 sy-vline.
FORMAT COLOR OFF.
WRITE : /1(206) sy-uline.
CLEAR : v_subtotal,v_subtotal1,v_subtotal2,v_subtotal3,
v_subtotal4,v_subtotal5,v_gtotal1,v_gtotal2,v_gtotal3,
v_gtotal4, v_gtotal5,v_gtotal,v_subtotal6,v_gtotal6.
ENDFORM. " line_selection
*& Form header1
Secondary List Header
FORM header1 .
Standard header
clear: v_date1, v_str, v_str1, v_tage.
write p_allgst to v_date1.
Move p_tage4 to v_tage.
concatenate '>' v_tage text-025 into v_str1.
concatenate
'Details of Ageing Analysis for Customer Open Invoices as on'(024)
v_date1 into v_str separated by space.
CALL FUNCTION 'Z_STANDARD_HEADER'
EXPORTING
title1 = 'Saudi International Petrochemical Company'(012)
title2 = v_str.
FORMAT COLOR 1 intensified.
WRITE :/1(206) sy-uline.
WRITE :/1 sy-vline,12 sy-vline ,
23 sy-vline,59 sy-vline,76 sy-vline,87 sy-vline,
88(101) 'Invoices Due For(In Days)'(014) CENTERED,
189 sy-vline,206 sy-vline.
WRITE : /1 sy-vline, 2(10) 'Doc Number'(021) CENTERED,
12 sy-vline, 13(10) 'Customer#'(015) CENTERED,
23 sy-vline, 24(35) 'Customer Name'(016) CENTERED,
59 sy-vline, 60(16) 'Ref invoice#'(019) CENTERED,
76 sy-vline, 77(10) 'Inv dt'(020) CENTERED,
87 sy-vline, 88(101) sy-uline,
189 sy-vline,190(16) 'Total'(017) CENTERED,
206 sy-vline.
WRITE : /1 sy-vline, 12 sy-vline,
23 sy-vline,59 sy-vline,
76 sy-vline,87 sy-vline,
88(16) v_fir CENTERED, 104 sy-vline,
105(16) v_sec CENTERED, 121 sy-vline,
122(16) v_thir CENTERED, 138 sy-vline,
139(16) v_four CENTERED, 155 sy-vline,
156(16) v_str1 CENTERED,
172 sy-vline,
173(16) 'Already Overdue'(018) CENTERED,
189 sy-vline,
206 sy-vline.
format color off.
WRITE : /1(206) sy-uline.
ENDFORM. " header1
REPORT zfi_vendor_ageing
NO STANDARD PAGE HEADING
LINE-COUNT 58
line-size 168
MESSAGE-ID zh_msg.
Report Name : Vendor Open Items Ageing Report
Purpose : This report displays the Vendor Open Items based on
different Ageing days (Calculated by taking the Base
Line date and the days mentioned in Payment Terms)
M O D I F I C A T I O N L O G
Date | Change Number | Initials | Description
30-Aug-2004 | DTSK900**** | Anji Reddy | Initial
D A T A B A S E T A B L E S D E C L A R A T I O N
TABLES: lfa1, " Vendor Master (General)
t001, " Company Codes
rfpdo.
I N T E R N A L T A B L E S D E C L A R A T I O N S *
Internal Table for Vendor Open Items Data
DATA: BEGIN OF int_bsik OCCURS 0,
lifnr LIKE bsik-lifnr, " Vendor Number
name1 LIKE lfa1-name1, " Vendor Name
shkzg LIKE bsik-shkzg, " Dr/Cr Indicator
belnr LIKE bsik-belnr, " Document Number
xblnr LIKE bsik-xblnr, " Ref Doc No
blart LIKE bsik-blart, " Document Type
zfbdt LIKE bsik-zfbdt, " Base Line Date
zbd1t LIKE bsik-zbd1t, " Due date1
zbd2t LIKE bsik-zbd2t, " Due Date2
zbd3t LIKE bsik-zbd3t, " Due Date3
waers LIKE bsik-waers, " Currency
dmbtr LIKE bsik-dmbtr, " Amount in Local Curr
END OF int_bsik.
Internal Table for Amounts Sum Up Data
DATA: BEGIN OF int_final OCCURS 0,
lifnr LIKE bsik-lifnr, " Vendor Number
name1 LIKE lfa1-name1, " Vendor Name
total1 LIKE bsik-dmbtr, " Amount in Local Curr
total2 LIKE bsik-dmbtr, " Amount in Local Curr
total3 LIKE bsik-dmbtr, " Amount in Local Curr
total4 LIKE bsik-dmbtr, " Amount in Local Curr
total5 LIKE bsik-dmbtr, " Amount in Local Curr
total6 LIKE bsik-dmbtr, " Amount in Local Curr
total LIKE bsik-dmbtr, " Amount in Local Curr
END OF int_final.
D A T A D E C L A R A T I O N S
DATA : v_flag, " Flag
v_gtotal1 LIKE bsik-dmbtr, " Amount Totals
v_gtotal2 LIKE bsik-dmbtr, " Amount Totals
v_gtotal3 LIKE bsik-dmbtr, " Amount Totals
v_gtotal4 LIKE bsik-dmbtr, " Amount Totals
v_gtotal5 LIKE bsik-dmbtr, " Amount Totals
v_gtotal6 LIKE bsik-dmbtr, " Amount Totals
v_gtotal LIKE bsik-dmbtr, " Amount Totals
v_subtotal1 LIKE bsik-dmbtr, " Amount Totals
v_subtotal2 LIKE bsik-dmbtr, " Amount Totals
v_subtotal3 LIKE bsik-dmbtr, " Amount Totals
v_subtotal4 LIKE bsik-dmbtr, " Amount Totals
v_subtotal5 LIKE bsik-dmbtr, " Amount Totals
v_subtotal6 LIKE bsik-dmbtr, " Amount Totals
v_subtotal LIKE bsik-dmbtr, " Amount Totals
v_date LIKE bsik-zfbdt, " Due Date
v_tage1(4), " Age 30 days
v_tage2(4), " Age 60 days
v_tage3(4), " Age 90 days
v_fir(15), " Column Text1
v_sec(15), " Column Text2
v_thir(15), " Column Text3
v_four(17), " Column Text4
v_fidd(4), " Days field1
v_sedd(4), " Days field2
v_thdd(4), " Days field3
v_fodd(4), " Days field4
v_str TYPE SY-LISEL, " String
v_str1(11), " String
v_tage(3), " String
v_date1(10). " Date field
R A N G E D E C L A R A T I O N S
RANGES: r_date1 FOR bsik-zfbdt, " Date Range 1
r_date2 FOR bsik-zfbdt, " Date Range 2
r_date3 FOR bsik-zfbdt, " Date Range 3
r_date4 FOR bsik-zfbdt. " Date Range 4
S E L E C T I O N S C R E E N *
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_lifnr FOR lfa1-lifnr. "Vendor account
PARAMETERS: p_bukrs LIKE t001-bukrs. "Co. Code
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: p_allgst LIKE rfpdo-allgstid OBLIGATORY DEFAULT sy-datum.
"Open items at key date
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
PARAMETERS: p_tage1 LIKE rfpdo1-allgfael DEFAULT '30',
p_tage2 LIKE rfpdo1-allgfael DEFAULT '60',
p_tage3 LIKE rfpdo1-allgfael DEFAULT '90',
p_tage4 LIKE rfpdo1-allgfael DEFAULT '120'.
SELECTION-SCREEN END OF BLOCK b3.
A T S E L E C T I O N S C R E E N *
AT SELECTION-SCREEN.
Validate the screen fields
PERFORM validate_flds.
S T A R T O F S E L E C T I O N *
START-OF-SELECTION.
Fetch main data
PERFORM fetch_data.
T O P O F P A G E
Header
TOP-OF-PAGE.
PERFORM header.
E N D O F P A G E
Footer
END-OF-PAGE.
ULINE.
T O P O F P A G E D U R I N G L I N E S E L E C T I O N *
Top of Page in Secondary List
TOP-OF-PAGE DURING LINE-SELECTION.
PERFORM header1.
A T L I N E S E L E C T I O N *
AT LINE-SELECTION.
Perform Line Selections
PERFORM line_selection.
E N D O F S E L E C T I O N
END-OF-SELECTION.
List generation
PERFORM basic_list.
*& Form validate_flds
Validation of Selection Screen fields
FORM validate_flds .
Validate Vendor Code
CLEAR lfa1-lifnr.
SELECT lifnr UP TO 1 ROWS
INTO lfa1-lifnr
FROM lfa1
WHERE lifnr IN s_lifnr AND
spras = sy-langu.
ENDSELECT.
IF sy-subrc <> 0.
MESSAGE e000 WITH 'Invalid Vendor Code range'(023).
ENDIF.
Validate Company Code
CLEAR t001-bukrs.
SELECT bukrs UP TO 1 ROWS
INTO t001-bukrs
FROM t001
WHERE bukrs = p_bukrs AND
spras = sy-langu.
ENDSELECT.
IF sy-subrc <> 0.
MESSAGE e021. " Invalid Company Code range
ENDIF.
IF ( p_tage1 > p_tage2 ) OR ( p_tage1 > p_tage3 ) OR
( p_tage1 > p_tage4 ).
MESSAGE e999 WITH 'Column 1 greater'(004)
'than Column# 2 or 3 or 4'(005).
ENDIF.
*column 2
IF ( p_tage2 > p_tage3 ) OR ( p_tage1 > p_tage4 ).
MESSAGE e999 WITH 'Column 2 greater'(006)
'than Column# 3 or 4'(007).
ENDIF.
*column3
IF ( p_tage3 > p_tage4 ).
MESSAGE e999 WITH 'Column 3 greater'(008)
'than Column#4'(009).
ENDIF.
ENDFORM. " validate_flds
*& Form fetch_data
Fetching Data from Database Tables
FORM fetch_data .
Date Range Population
r_date1-sign = 'I'.
r_date1-option = 'BT'.
r_date1-low = p_allgst.
r_date1-high = r_date1-low + p_tage1.
APPEND r_date1.
r_date2-sign = 'I'.
r_date2-option = 'BT'.
r_date2-low = r_date1-high + 1.
r_date2-high = r_date1-low + p_tage2.
APPEND r_date2.
r_date3-sign = 'I'.
r_date3-option = 'BT'.
r_date3-low = r_date2-high + 1.
r_date3-high = r_date1-low + p_tage3.
APPEND r_date3.
r_date4-sign = 'I'.
r_date4-option = 'BT'.
r_date4-low = r_date3-high + 1.
r_date4-high = r_date1-low + p_tage4.
APPEND r_date4.
Select the Vendor Open Items data from BSIK
SELECT l~lifnr
l1~name1
b~waers
b~dmbtr
b~zfbdt
b~zbd1t
b~zbd2t
b~zbd3t
b~belnr
b~xblnr
b~shkzg
b~blart
INTO CORRESPONDING FIELDS OF TABLE int_bsik
FROM lfb1 AS l INNER JOIN lfa1 AS l1
ON llifnr = l1lifnr
INNER JOIN bsik AS b
ON llifnr = blifnr AND
lbukrs = bbukrs
WHERE l~lifnr IN s_lifnr AND
l~bukrs = p_bukrs and
b~zfbdt le p_allgst.
IF SY-SUBRC <> 0.
MESSAGE i000 WITH 'No Data found'(027).
ENDIF.
Removing the date limit to get the due items in the past
DELETE int_bsik WHERE
( blart NE 'RE' AND blart NE 'KR' ) OR
shkzg NE 'H'.
SORT int_bsik BY lifnr.
ENDFORM. " fetch_data
*& Form header
Display the Report Columns
FORM header .
v_tage1 = p_tage1 + 1.
v_tage2 = p_tage2 + 1.
v_tage3 = p_tage3 + 1.
v_fidd = p_tage1.
v_sedd = p_tage2.
v_thdd = p_tage3.
v_fodd = p_tage4.
MOVE v_fodd0(4) TO v_fodd1(3).
v_fodd+0(1) = space.
CONCATENATE '1 to'(010) v_fidd INTO v_fir.
CONCATENATE v_tage1 ' to '(011) v_sedd INTO v_sec.
CONCATENATE v_tage2 ' to '(011) v_thdd INTO v_thir.
CONCATENATE v_tage3 ' to '(011) space v_fodd INTO v_four.
Standard header
clear: v_date1, v_str, v_str1, v_tage.
write p_allgst to v_date1.
Move p_tage4 to v_tage.
concatenate '>' v_tage text-025 into v_str1.
concatenate
'Summary of Ageing Analysis for Vendor Open Invoices as on'(013)
v_date1 into v_str separated by space.
CALL FUNCTION 'Z_STANDARD_HEADER'
EXPORTING
title1 = 'Saudi International Petrochemical Company'(012)
title2 = v_str.
FORMAT COLOR OFF.
WRITE : /1(168) sy-uline.
FORMAT COLOR 1 INTENSIFIED.
WRITE :/1 sy-vline, 13 sy-vline, 49 sy-vline,
50(101) 'Invoices Due For(In Days)'(014) CENTERED,
151 sy-vline, 168 sy-vline .
WRITE :/1 sy-vline, 2(11) 'Vendor#'(015) CENTERED,
13 sy-vline ,14(35) 'Vendor Name'(016) CENTERED,
49 sy-vline,
50(101) sy-uline,151 sy-vline,
152(16) 'Total'(017) CENTERED,
168 sy-vline.
WRITE : /1 sy-vline,13 sy-vline, 49 sy-vline,
50(16) v_fir CENTERED, 66 sy-vline,
67(16) v_sec CENTERED, 83 sy-vline,
84(16) v_thir CENTERED, 100 sy-vline,
101(16) v_four CENTERED, 117 sy-vline,
118(16) v_str1 centered, 134 sy-vline,
135(16) 'Already Overdue'(018) CENTERED,151 sy-vline,
168 sy-vline.
FORMAT COLOR OFF.
WRITE : /1(168) sy-uline.
ENDFORM. " header
*& Form basic_list
Display the Basic List
FORM basic_list .
NEW-PAGE LINE-SIZE 168.
LOOP AT int_bsik.
CLEAR v_date.
IF int_bsik-zbd3t <> ' '.
v_date = int_bsik-zfbdt + int_bsik-zbd3t.
ELSE.
IF int_bsik-zbd2t <> ' '.
v_date = int_bsik-zfbdt + int_bsik-zbd2t.
ELSE.
v_date = int_bsik-zfbdt + int_bsik-zbd1t.
ENDIF.
ENDIF.
IF int_bsik-zbd1t = ' '.
v_date = int_bsik-zfbdt.
ENDIF.
IF v_date IN r_date1.
int_final-total1 = int_final-total1 + int_bsik-dmbtr.
ELSEIF v_date IN r_date2.
int_final-total2 = int_final-total2 + int_bsik-dmbtr.
ELSEIF v_date IN r_date3.
int_final-total3 = int_final-total3 + int_bsik-dmbtr.
ELSEIF v_date IN r_date4.
int_final-total4 = int_final-total4 + int_bsik-dmbtr.
ELSEif v_date > r_date4-high.
int_final-total5 = int_final-total5 + int_bsik-dmbtr.
ELSEif v_date < p_allgst.
int_final-total6 = int_final-total6 + int_bsik-dmbtr.
ENDIF.
AT END OF lifnr.
v_flag = 1.
ENDAT.
IF v_flag = 1.
int_final-lifnr = int_bsik-lifnr.
int_final-name1 = int_bsik-name1.
int_final-total = int_final-total1 + int_final-total2 +
int_final-total3 + int_final-total4 + int_final-total5 +
int_final-total6.
APPEND int_final.
v_gtotal1 = v_gtotal1 + int_final-total1.
v_gtotal2 = v_gtotal2 + int_final-total2.
v_gtotal3 = v_gtotal3 + int_final-total3.
v_gtotal4 = v_gtotal4 + int_final-total4.
v_gtotal5 = v_gtotal5 + int_final-total5.
v_gtotal6 = v_gtotal6 + int_final-total6.
v_gtotal = v_gtotal + int_final-total.
WRITE: /1 sy-vline,
2 int_final-lifnr COLOR 4 INTENSIFIED ON,
13 sy-vline,
14 int_final-name1 COLOR 4 INTENSIFIED ON,
49 sy-vline.
DATA : v_rem.
v_rem = sy-tabix MOD 2.
IF v_rem NE 0.
FORMAT COLOR 2 INTENSIFIED.
WRITE : 50 int_final-total1 CURRENCY int_bsik-waers,
66 sy-vline,
67 int_final-total2 CURRENCY int_bsik-waers,
83 sy-vline,
84 int_final-total3 CURRENCY int_bsik-waers,
100 sy-vline,
101 int_final-total4 CURRENCY int_bsik-waers,
117 sy-vline,
118 int_final-total5 CURRENCY int_bsik-waers,
134 sy-vline,
135 int_final-total6 CURRENCY int_bsik-waers,
151 sy-vline,
152 int_final-total CURRENCY int_bsik-waers,
168 sy-vline.
ELSE.
WRITE : 50 int_final-total1 CURRENCY int_bsik-waers,
66 sy-vline,
67 int_final-total2 CURRENCY int_bsik-waers,
83 sy-vline,
84 int_final-total3 CURRENCY int_bsik-waers,
100 sy-vline,
101 int_final-total4 CURRENCY int_bsik-waers,
117 sy-vline,
118 int_final-total5 CURRENCY int_bsik-waers,
134 sy-vline,
135 int_final-total6 CURRENCY int_bsik-waers,
151 sy-vline,
152 int_final-total CURRENCY int_bsik-waers,
168 sy-vline.
ENDIF.
FORMAT COLOR OFF.
HIDE int_final.
CLEAR int_final.
v_flag = 0.
ENDIF.
AT LAST.
WRITE : /1(168) sy-uline.
FORMAT COLOR 3 INTENSIFIED.
WRITE : /1 sy-vline, 2(47) 'GRAND TOTAL'(022) CENTERED,
49 sy-vline, 50 v_gtotal1 CURRENCY int_bsik-waers,
66 sy-vline, 67 v_gtotal2 CURRENCY int_bsik-waers,
83 sy-vline, 84 v_gtotal3 CURRENCY int_bsik-waers,
100 sy-vline,101 v_gtotal4 CURRENCY int_bsik-waers,
117 sy-vline,118 v_gtotal5 CURRENCY int_bsik-waers,
134 sy-vline,135 v_gtotal6 CURRENCY int_bsik-waers,
151 sy-vline,152 v_gtotal CURRENCY int_bsik-waers,
168 sy-vline.
HIDE : v_gtotal1,
v_gtotal2,
v_gtotal3,
v_gtotal4,
v_gtotal5,
v_gtotal6,
v_gtotal.
ENDAT.
FORMAT COLOR OFF.
ENDLOOP.
WRITE : /1(168) sy-uline.
ENDFORM. " basic_list
*& Form line_selection
When double clicked on the line display the seconday list
FORM line_selection .
NEW-PAGE LINE-SIZE 206.
Sy-lsind = 1.
DATA : v_rem,v_cnt LIKE sy-tabix.
v_cnt = 0.
SORT int_bsik BY belnr zfbdt.
LOOP AT int_bsik WHERE lifnr EQ int_final-lifnr.
v_rem = v_cnt MOD 2.
CLEAR v_date.
IF int_bsik-zbd3t <> ' '.
v_date = int_bsik-zfbdt + int_bsik-zbd3t.
ELSE.
IF int_bsik-zbd2t <> ' '.
v_date = int_bsik-zfbdt + int_bsik-zbd2t.
ELSE.
v_date = int_bsik-zfbdt + int_bsik-zbd1t.
ENDIF.
ENDIF.
IF int_bsik-zbd1t = ' '.
v_date = int_bsik-zfbdt.
ENDIF.
IF v_rem NE 0.
format color 2 intensified.
WRITE :/1 sy-vline, 2 int_bsik-belnr,
12 sy-vline,13 int_bsik-lifnr,
23 sy-vline,24 int_bsik-name1,
59 sy-vline,60 int_bsik-xblnr,
76 sy-vline,77 int_bsik-zfbdt,
87 sy-vline.
WRITE : 104 sy-vline,121 sy-vline,
138 sy-vline,155 sy-vline,
172 sy-vline, 189 sy-vline,
190 int_bsik-dmbtr CURRENCY int_bsik-waers,
206 sy-vline.
IF v_date IN r_date1.
v_subtotal1 = v_subtotal1 + int_bsik-dmbtr.
WRITE : 88 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEIF v_date IN r_date2.
v_subtotal2 = v_subtotal2 + int_bsik-dmbtr.
WRITE : 105 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEIF v_date IN r_date3.
v_subtotal3 = v_subtotal3 + int_bsik-dmbtr.
WRITE : 122 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEIF v_date IN r_date4.
v_subtotal4 = v_subtotal4 + int_bsik-dmbtr.
WRITE : 139 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEif v_date > r_date4-high.
v_subtotal5 = v_subtotal5 + int_bsik-dmbtr.
WRITE : 156 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEif v_date < p_allgst.
v_subtotal6 = v_subtotal6 + int_bsik-dmbtr.
WRITE : 173 int_bsik-dmbtr CURRENCY int_bsik-waers.
ENDIF.
format color off.
ELSE.
WRITE :/1 sy-vline, 2 int_bsik-belnr,
12 sy-vline,13 int_bsik-lifnr,
23 sy-vline,24 int_bsik-name1,
59 sy-vline,60 int_bsik-xblnr,
76 sy-vline,77 int_bsik-zfbdt,
87 sy-vline.
WRITE : 104 sy-vline,121 sy-vline,
138 sy-vline,155 sy-vline,
172 sy-vline,189 sy-vline,
190 int_bsik-dmbtr CURRENCY int_bsik-waers,
206 sy-vline.
IF v_date IN r_date1.
v_subtotal1 = v_subtotal1 + int_bsik-dmbtr.
WRITE : 88 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEIF v_date IN r_date2.
v_subtotal2 = v_subtotal2 + int_bsik-dmbtr.
WRITE : 105 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEIF v_date IN r_date3.
v_subtotal3 = v_subtotal3 + int_bsik-dmbtr.
WRITE : 122 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEIF v_date IN r_date4.
v_subtotal4 = v_subtotal4 + int_bsik-dmbtr.
WRITE : 139 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEif v_date > r_date4-high.
v_subtotal5 = v_subtotal5 + int_bsik-dmbtr.
WRITE : 156 int_bsik-dmbtr CURRENCY int_bsik-waers.
ELSEif v_date < p_allgst.
v_subtotal6 = v_subtotal6 + int_bsik-dmbtr.
WRITE : 173 int_bsik-dmbtr CURRENCY int_bsik-waers.
ENDIF.
ENDIF.
FORMAT COLOR OFF.
v_cnt = v_cnt + 1.
ENDLOOP.
WRITE : /1(206) sy-uline.
v_subtotal = v_subtotal1 + v_subtotal2 + v_subtotal3
+ v_subtotal4 + v_subtotal5 + v_subtotal6.
FORMAT COLOR 3 INTENSIFIED.
WRITE : /1 sy-vline,
2(85) 'Total'(017) CENTERED CURRENCY int_bsik-waers ,
87 sy-vline,
88 v_subtotal1 CURRENCY int_bsik-waers,
104 sy-vline,
105 v_subtotal2 CURRENCY int_bsik-waers,
121 sy-vline,
122 v_subtotal3 CURRENCY int_bsik-waers,
138 sy-vline,
139 v_subtotal4 CURRENCY int_bsik-waers,
155 sy-vline,
156 v_subtotal5 CURRENCY int_bsik-waers,
172 sy-vline,
173 v_subtotal6 CURRENCY int_bsik-waers,
189 sy-vline,
190 v_subtotal CURRENCY int_bsik-waers,
206 sy-vline.
FORMAT COLOR OFF.
WRITE : /1(206) sy-uline.
CLEAR : v_subtotal,v_subtotal1,v_subtotal2,v_subtotal3,
v_subtotal4,v_subtotal5,v_gtotal1,v_gtotal2,v_gtotal3,
v_gtotal4, v_gtotal5,v_gtotal,v_subtotal6,v_gtotal6.
ENDFORM. " line_selection
*& Form header1
Secondary List Header
FORM header1 .
Standard header
clear: v_date1, v_str, v_str1, v_tage.
write p_allgst to v_date1.
Move p_tage4 to v_tage.
concatenate '>' v_tage text-025 into v_str1.
concatenate
'Details of Ageing Analysis for Vendor Open Invoices as on'(024)
v_date1 into v_str separated by space.
CALL FUNCTION 'Z_STANDARD_HEADER'
EXPORTING
title1 = 'Saudi International Petrochemical Company'(012)
title2 = v_str.
FORMAT COLOR 1 intensified.
WRITE :/1(206) sy-uline.
WRITE :/1 sy-vline,12 sy-vline ,
23 sy-vline,59 sy-vline,76 sy-vline,87 sy-vline,
88(101) 'Invoices Due For(In Days)'(014) CENTERED,
189 sy-vline,206 sy-vline.
WRITE : /1 sy-vline, 2(10) 'Doc Number'(021) CENTERED,
12 sy-vline, 13(10) 'Vendor#'(015) CENTERED,
23 sy-vline, 24(35) 'Vendor Name'(016) CENTERED,
59 sy-vline, 60(16) 'Ref invoice#'(019) CENTERED,
76 sy-vline, 77(10) 'Inv dt'(020) CENTERED,
87 sy-vline, 88(101) sy-uline,
189 sy-vline,190(16) 'Total'(017) CENTERED,
206 sy-vline.
WRITE : /1 sy-vline, 12 sy-vline,
23 sy-vline,59 sy-vline,
76 sy-vline,87 sy-vline,
88(16) v_fir CENTERED, 104 sy-vline,
105(16) v_sec CENTERED, 121 sy-vline,
122(16) v_thir CENTERED, 138 sy-vline,
139(16) v_four CENTERED, 155 sy-vline,
156(16) v_str1 CENTERED,
172 sy-vline,
173(16) 'Already Overdue'(018) CENTERED,
189 sy-vline,
206 sy-vline.
format color off.
WRITE : /1(206) sy-uline.
ENDFORM. " header1
<b>The below link will give Tables & Relations.</b>
http://www.erpgenie.com/abap/tables.htm
http://goldenink.com/abap/files_in_sap.html
http://abap4.tripod.com/SAP_Tables.html
http://www.geocities.com/sapcircle/Relations.pdf
Regards,
Sree -
How to find out whether the String contains chinese characters
I need to check if the string contains chinese characters in Java. Does anyone know how to do it? thx.
Since Java strings contain UNICODE code points, check the content against the relevant page here - http://www.unicode.org/charts/ .
-
How to use sed on a literal string containing regex meta characters?
I want to delete the lines from a file which match an arbitrary literal string.
The string is contained in a variable, and may itself contain various regex meta characters such as [,],^,$,|, etc
So, my problem is that sed wants to interpret these meta characters itself. For example:
x='abc[xyz$'
sed -i "/$x/d" file
produces a sed error about the unmatched [, and no doubt it wants to interpret the $ too.
(Of course, I could try and change the string $x so that every possible regex meta character was escaped with a \, but that seems immensely cumbersome. Also, can't see a way of using single or double quotes cleverly.)
Sorry if I am being thick about this, but any ideas or alternative methods would be most welcome!frostschutz wrote:
With sed, you have to escape meta characters indivudually. That's just how it works. Of course you could do the escaping using sed as well, by replacing all meta characters (including \ and /) with \character.
If you want to match strings literally, use a different tool. Or do it in Bash.
while read line
do
[ "$line" != "$x" ] && echo "$line"
done < file
In Perl/PCRE instead of escaping indivudually there is \Q...\E but sed does not understand that, and \Q\E does not solve all problems either, if there is a \E in the $x you have to escape it with \E\\E\Q or something like it.
Thank you for your swift reply. Looks like sed can't be much of a friend in these circumstances!
Probably will have to go with the Bash file handling method.
Oh well ... -
I have adobe acrobat 11 reader writer I want to use the pointer symbol on full screen instead of the hand, iwas able to do it on adobe 10 also when in full screen i can't open attachments unless i right click and open it then it boots me out of full screen is there any way i can click on the attacment without going out of full screen
I don't know why the change, but the pointer appears in the same way as it does on the main screen, not a pointer. There does not appear to be anyway to change it. You may want to submit a comment to the Features Requests: Acrobat Feature Requests. I also submitted this as a bug.
As a clarification, your "adobe acrobat 11 reader writer" is not informative. There is Acrobat 11 and Reader 11. Writer is not a product as such. So you have referred to Acrobat in a contradictory manner. In the future, please just indicate Acrobat 11 or Adobe Acrobat 11. -
Just want to know it this small code is right
Hello everyone, im back :P
well, i've been doing exercises, but i don't have the solution yet...so could you tell me if this code is right? thanks.
About the constructors etc..i think its right, but i not sure about the last method ( distanceFromTwoPoints() )
If i'd like to test this class, i would ask for 4 coord. (x1,y1) and (x2, y2)..
And solved the distance between those two points..well
I don't understand..
On that code how can i calculate the distance from two points if i just have x1 and y1, i mean ...when i wrote that boolean method ( if the two points are equal) the the "p" variable reference is pointing to x1 and y1 , right? maybe that boolean method is wrong too, cuz i want to compare (x1, y1 ) with (x2, y2) well....when i wrote :
this.x1 == p.x1 etc both are references to x1 and y1, so returns always true.
Do i need to write a setMethod to change the values ?
Is that code comparing two points? thats all i want to know...if yes, so how can i test it?
public class Point {
private double x1;
private double y1;
public Point(final double x1, final double y1){
this.x1 = x1;
this.y1 = y1;
public double getX1() {
return x1;
public double getY2() {
return y1;
public boolean isEqual(final Point p){
return (this.x1 == p.x1 && this.y1 == p.y1);
public double distanceFrom2Points (int x1, int y2, Point p){
return Math.sqrt((this.x1 - p.x1)*(this.x1 - p.x1) + (this.y1 - p.y1)*(this.y1 - p.y1));
I think this code is just working with two coord. x1 and y1 :S where do i put x2 and y2?
"p" is a reference to the x1 and y1 variables, so where are the x2 and y2?
im confused :P
thankspublic class Point {
private double x;
private double y;
public Point(final double x, final double y){
this.x = x;
this.y = y;
public double getX() {
return x;
public double getY() {
return y;
public boolean isEqual(final Point p){
return (this.x == p.x && this.y == p.y);
public double distanceFrom2Points ( Point p){
return Math.sqrt((this.x - p.x) * (this.x - p.x) + (this.y - p.y) * (this.y - p.y));
public class TestingPoint {
public static void main(String[] args) {
System.out.print("X1: ");
double x1 = Teclado.doubleLido();
System.out.print("Y1: ");
double y1 = Teclado.doubleLido();
//Teclad.intLido() reads from the console, something like:
//Keyboard.intRead(); we use that.
System.out.print("X2: ");
double x2 = Teclado.doubleLido();
System.out.print("Y2: ");
double y2 = Teclado.doubleLido();
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
double distance = p2.distanceFrom2Points(p1.distanceFrom2Points
(x1,x2));
System.out.println("The distance is "+distance);
}the compilation ERROR says: The method distanceFrom2Points(Point) in the type Point is not applicable for the arguments (double, double)
these are the two classes.
What is wrong ?
thanks! -
and I want to know how I can move it to another installaton of firefox (Since I will replace my HDD and delete firefox (obviosly))
All of your Firefox data is stored in the profile folder.
* [[Profiles - Where Firefox stores your bookmarks, passwords and other user data]]
** The ''extensions'' subfolder contains add-ons like extensions and themes (but not plug-ins; plug-ins are third-party software installed in your operating system).
** Some extensions may create data folders (e.g. /adblockplus) or files (e.g. stylish.sqlite) directly under the profile folder.
** The ''prefs.js'' file stores your preferences for Firefox and extensions. -
I want to know how to clear the text area by the push off my next question button and ask a new ques
I want to know how to clear the text area by the push off my next question button and ask a new question - also I want to know how to code in my project to where a user can enter a math question in one border container and the answer enters into the next container
heres my code so far
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" backgroundColor="#1E5C75">
<fx:Script>
<![CDATA[
protected function button1_clickHandler(event:MouseEvent):void
//convert text area into labelid to be identified by actionscript
richTextLabel.text = myArea.text;
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<!--container 1-->
<s:BorderContainer borderWeight="7" x="28" y="10" width="200" height="138">
<s:layout>
<s:VerticalLayout paddingTop="10" paddingBottom="10"
paddingLeft="10" paddingRight="10"/>
</s:layout>
<!--data Entry control-->
<s:TextArea id="myArea" width="153" height="68"/>
<!--end of data entry control-->
<s:Button width="151" label="ask a question" click="button1_clickHandler(event)"/>
</s:BorderContainer>
<!--container2-->
<s:BorderContainer borderWeight="7" x="509" y="10" width="200" height="138">
<s:layout>
<s:VerticalLayout paddingTop="10" paddingBottom="10"
paddingLeft="10" paddingRight="10"/>
</s:layout>
<!--data entry control-->
<!--convert tne data entry control into a label id in actionscript-->
<s:Label id="richTextLabel" width="153" height="68"/>
<s:Button width="151" label="next question" click="button1_clickHandler(event)"/>
</s:BorderContainer>
</s:Application>This is a user to user support forum. We are all iphone users just like you.
You are not addressing Apple here at all.
This is an odd way to ask your fellow iphone users for help. Berating oterh users will not help you.
"it's too fragile"
No it is not. i have never damaged one, nor has anyone I know.
" U loose data when Ur phone is locked"
No you don't. Why do you think this?
"and there is no customer support!!! "
Wrong yet again. Apple has an 800 number and they have many retail stores and they have support articles that you can access using the search bar. Or you can contact them throgh express lane online
"but I will go back with Blackberry "
Please do.
Good ridance
Maybe you are looking for
-
Can't log in with my Apple id password, so can't set new wifi up
Hi, first time on my iPad since new wifi set up, and I now can not get into my iPad to set up the New WiFi keycode, I keep constantly getting the "sign into icloud, enter Apple id password", and I can't get to any settings annoyingly. Now I had not c
-
Error when writing to interface table for HR
We recently did a client copy from Production to our User Testing client. User was trying to enter time via transaction CAT2 but received the following message when attempting to save the timesheet: "Error when writing to interface table for HR" Does
-
IPhoto won't play videos (with QT7), after renaming video files in Finder
Hi folks, My iPhoto9 played video files with Quick time when double clicking the video files in iPhoto. Yesterday I renamed approx 50 video files in Finder (double clicked and renamed them). Now iPhoto won't play them when double clickling. The only
-
New hard drive slower than old one
Hello, my Seagate 120GB 5400rpm drive crashed 6 weeks ago and I made use of the warranty to get a replacement (refurbished) drive. I think this drive is no good because I have noticed a marked decrease in performance: -Upon coming back from sleep mod
-
How to use elliptic curve encryption?
Hi, are there any examples? I tried to get a key generator using KeyPairGenerator.getInstance("EC") but failed. And I also cannot get a cipher using Cipher.getInstance("EC"). Thanks.