Financial Management Blogs by Members
Dive into a treasure trove of SAP financial management wisdom shared by a vibrant community of bloggers. Submit a blog post of your own to share knowledge.
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member215589
Active Participant

Summary

This document demonstrates how to “Email a BPC Data Manager-Formula Log or Package Log” based on the Data Manager Package Status. It is assumed that reader is proficient in BPC NetWeaver terminology and application navigation.

Author bio

Swetha Sreesailam is a SAP BI/BPC ABAP Professional with 6 years of experience in IT. She is currently working with Deloitte Consulting LLP as SAP BI Consultant. She has worked on different versions of SAP BI and has also worked on SAP ECC implementation projects in the beginning of career. Additionally she has experience in SAP BPC Integration with BI.


Priyanka Singh is an MBA Finance Professional with 6 years of IT experience in SAP BPC. She is currently working with Deloitte Consulting LLP as SAP BPC Consultant. She has worked on different versions of BPC (5.1 MS till EPM 10.0). She has also worked on several BPC implementation projects. Additionally she has experience in SEM-BPS/CPM and SSM.

Table of Content

1. Business Scenario

2. Introduction

3. Step By Step Procedure

3.1 Creating a Process Chain

3.2 Creating DM Package

3.3 Emailing Formula Log or Package Log

3.3.1     Class

3.3.2     Process Type

3.3.3     Process Variant

3.3.4     Building Code Block

4. Execution of Data Manager Package

4.1 Run the Data Manager Package       

4.2 Input Email ID in TO (mandatory) and CC (optional)

4.3 Input the Subject

4.4 Input Mail Message

4.5 Attach Package Log select-“Yes”

4.6 View Status

4.6.1 Data Manager Package Status: ‘Succeed’

4.6.2 Data Manager Package Status: ‘Failed’

5. Check Email

5.1 Succeed

5.2 Failed

6. Appendix


1.     Business Scenario

In a typical business scenario, Users would like to get an Email notification after execution of Data Manager Package with the Log as an attachment. There will be two Logs – ‘Package Log’ and ‘Formula Log’ generated when Data Manager Package is triggered. However through standard BPC 10.0 NW only Package Log can be sent as an attachment during email notification. This whitepaper demonstrates how to “Email a BPC Data Manager-Formula Log or Package Log” based on the Data Manager Package Status.

2.     Introduction

Within this scenario, we will show how to “Email a BPC Data Manager-Formula Log or Package Log” based on the Data Manager Package execution Status. When a Data Manager Package designed to trigger Logic Script is executed then two logs will be generated - Package Log and Formula Log. The Formula Log will hold significant information about the execution when the Data Manager Package Status is ‘Succeed’ and the Package Log holds the failure information when Status is ‘Failed’. Therefore, for Success, Email functionality needs to be configured to send Formula Log and for Failure, Email should be sent with Package Log as an attachment.

This How-To Guide will detail out the steps to-

  1. Adding an Email Task to a DM Package & Process Chain
  2. Emailing Formula Log as an attachment when DM Package Status is ‘Succeed’.
  3. Emailing Package Log as an attachment when DM package status is ‘Failed’.
  4. Append Subject of the Email based on DM Package status-Successful or Error.

The scenario is to execute a Data Manager Package which triggers AllocationLogic Script. During this process the standard allocation process chain needs to be copied and enhanced by adding a process type called ‘BPC: Send Email’. Additionally, ‘Send_Email’ Task has to be added in the DM Package-modify script to trigger the Email with an attachment.

Note# This will not cover the steps as to how to create the Allocation Logic Script.

3.     Step By Step Procedure

3.1 Creating a Process Chain

The Process Chain is created to perform the task of running Logic and sending Email with Log Attachment to the Users based on the Data Manager Package Status.

3.2 Creating DM Package

Create the DM Package with the below parameters.

  • PROMPT:
    • TEXT: Email IDs (TO and CC)
    • TEXT: Subject
    • TEXT: Mail  Message
    • RADIOBUTTON: Attach Package Log (Yes or No)
  • TASK
    • /CPMB/ALLOCATION_LOGIC: Logic Script
    • /CPMB/SEND_EMAIL: Send Email with Attachment

3.3 Emailing Formula Log or Package Log

The below steps will detail the steps to Email Formula Log or Package Log based on the Data Manager Package Status.

The Task /CPMB/SEND_EMAIL include below class, process type and process variant.

3.3.1     Class:

  • CL_UJD_BPC_EMAIL                            Process Type Class for Emailing Log file

3.3.2     Process Type:


3.3.3     Process Variant:

  • /CPMB/SEND_EMAIL                                        BPC: Send email

3.3.4     Building Code Block

To achieve the functionality, “Emailing Package Log when DM package status is Failed/Warnings and Formula Log file when DM package is Successful”, follow the below steps:

  1. Create an Implicit Enhancement option in the method RUN of standard Class CL_UJD_BPC_EMAIL.

Step1: Go to SE24 Transaction Code and enter ‘CL_UJD_BPC_EMAIL’. Click on ‘Display’

Step2: Double click on ‘RUN’ Method

 

Step3.a: Click on ‘Implementation’ button as shown below

Step3.b: Click on Edit-> Enhancement Operations -> ‘Shown Implicit Enhancement Options’.

Step4: Place your cursor on the black arrow line and Click on ‘Create Implementation’ as shown below

  1. b) Copy the code block attached in APPENDIX section which is designed to achieve below functionalities:
    • The code block is restricted to specific DM package using process chain ID.
    • Attachments of Email – Package Log files or Formula Log files
      1. When package status = ‘Failed’, Email Package log with error message.
      2. When package status = ‘Succeed’, Email Formula log with BAdI messages.
    • Modify ‘SUBJECT’ of Email based on Package status.
      1. Add ‘SUCCESSFUL’ to Email subject when status = Succeed.
      2. Add ‘ERROR’ to Email subject when status = Failed.

4.     Execution of Data Manager Package

4.1 Run the Data Manager Package

4.2 Input Email ID in TO (mandatory) and CC (optional)

4.3 Input the Subject

 

4.4 Input Mail Message

4.5 Attach Package Log select-“Yes”


4.6 View Status

4.6.1     Data Manager Package Status: ‘Succeed’

 

Formula Log: When execution of Data Manager Package is successful then Formula Log is filled with success message. . Hence during success Formula Log is sent through email.

4.6.2     Data Manager Package Status: ‘Failed’

Package Log:

Formula Log:

When execution of Data Manager Package fails then Package Log is filled with Error message and Formula Log is empty. Hence during failure Package Log is sent through email.

5.     Check Email

5.1 Succeed

When Data Manager Package Status is ‘Succeed’.

5.2 Failed

When Data Manager Package Status is ‘Failed’

Configuration in transaction SCOT is required to send the Email to respective IDs. This should be done by the system administrator.

6.     Appendix

ENHANCEMENT ZPF_BPC_ENHI_FORMULA_LOG.    "active version
DATA: I_CHAIN_ID
TYPE RSPC_CHAIN.
*- Get the CHAIN ID based on DM package SEQUENCE ID at runtime
SELECT SINGLE CHAIN_ID FROM UJD_STATUS INTO I_CHAIN_ID WHERE LOG_ID = D_INSTANCE_ID.

** Execute the custom logic only for Allocation Process
IF I_CHAIN_ID = '/CPMB/ALLOCATION_EMAIL'.

DATA:   I_NUM_ROWS            TYPE I,
I_FILE_LENGTH        
TYPE I,
I_FILE_LENGTH_2      
TYPE I,
I_MAIL_TO            
TYPE UJ_STRING,
I_MAIL_CC            
TYPE UJ_STRING,
I_MAIL_MESSAGE       
TYPE UJ_STRING,
I_ADDRESS_STR        
TYPE UJ_STRING,
I_ERROR              
TYPE UJ_STRING,
I_TRANS_DATA_STRING  
TYPE UJ_STRING,
I_TRANS_DATA_STRING_2
TYPE UJ_STRING,
I_ATTACH_LOG         
TYPE UJ_STRING,
I_PROPERTY_NAME      
TYPE UJ_STRING,
I_SUBJECT            
TYPE SO_OBJ_DES,
I_ADDRESS            
TYPE ADR6-SMTP_ADDR,
I_TEXT_LENGTH        
TYPE SO_OBJ_LEN,
I_LOG_ID             
TYPE RSPC_LOGID,
I_ATT_DOC_TYPE       
TYPE SOODK-OBJTP,
I_ATT_TITLE          
TYPE SOOD-OBJDES,
I_ATT_TITLE_2        
TYPE SOOD-OBJDES,
*        I_CONTENT             TYPE XSTRING,
I_DOC_CONTENT        
TYPE UJF_DOC-DOC_CONTENT,
L_FILE_CONTENT       
TYPE UJF_DOC-DOC_CONTENT,
L_PROMPT             
TYPE UJ_STRING,
I_DOC_CONTENT_2      
TYPE UJF_T_RECLINE,
IV_PAYLOAD           
TYPE XSTRING,
I_CODEPAGE           
TYPE TCP00-CPCODEPAGE,
I_FILE_NAME          
TYPE UJF_DOC-DOCNAME,
I_FILE_NAME_2        
TYPE UJF_DOC-DOCNAME,
I_DOC_NAME           
TYPE UJF_DOC-DOCNAME,
I_DOC_NAME_2         
TYPE UJF_DOC-DOCNAME,
I_BODYTEXT_ROW       
TYPE SOLI,
I_INSTANCE_ID        
TYPE RSPC_LOGID,
L_INSTANCE           
TYPE UJ_DOCDESC,
I_LOG_NAME           
TYPE UJ_DESC,
I_ENCODING           
TYPE ABAP_ENCODING,
I_ATTCH_LENGTH       
TYPE SOOD-OBJLEN,
I_ATTCH_LENGTH_2     
TYPE SOOD-OBJLEN,
IS_PAYLOAD_MESSAGE   
TYPE /POA/S_EN_PAYLOAD,
IS_DOC_ATTRIBUTES    
TYPE UJF_DOC,
IS_DOC_ATTRIBUTES_2  
TYPE UJF_DOC,
IT_MAIL_MESSAGE      
TYPE BCSY_TEXT,
IS_MAIL_MESSAGE      
LIKE LINE OF IT_MAIL_MESSAGE,
IT_ATTACHMENTS       
TYPE /POA/T_ATTACHMENTS,
IS_ATTACHMENTS       
LIKE LINE OF IT_ATTACHMENTS,
IT_RECIPIENTS        
TYPE /POA/T_EN_RECIPIENTS,
IS_RECIPIENTS        
LIKE LINE OF IT_RECIPIENTS,
IT_LOG_TAB           
TYPE SOLI_TAB,
IT_LOG_TAB_2         
TYPE SOLI_TAB,
IT_MAIL_TO           
TYPE STRING_TABLE,
IT_MAIL_CC           
TYPE STRING_TABLE,
IT_MESSAGE           
TYPE UJ0_T_MESSAGE,
IT_DATA              
TYPE STANDARD TABLE OF X255,
IT_DATA_2            
TYPE STANDARD TABLE OF X255,
IO_DOCUMENT          
TYPE REF TO CL_DOCUMENT_BCS,
IO_FILE_SERVICE_MGR  
TYPE REF TO CL_UJF_FILE_SERVICE_MGR,
IO_SEND_REQUEST      
TYPE REF TO CL_BCS,
IO_EXCEPTION         
TYPE REF TO CX_STATIC_CHECK,
IO_PROPERTY          
TYPE REF TO IF_UJD_PROPERTY,
IO_RECIPIENT         
TYPE REF TO IF_RECIPIENT_BCS,
IO_CONTEXT           
TYPE REF TO IF_UJ_CONTEXT,
IO_SENDER            
TYPE REF TO CL_SAPUSER_BCS,
IO_PAYLOAD           
TYPE REF TO /POA/CL_EN_PAYLOAD,
IO_NOTIF_API         
TYPE REF TO /POA/CL_EN_NOTIFICATION_API.

FIELD-SYMBOLS:
<I_PROPERTY_VALUE>   
TYPE ANY.

CONSTANTS:

LC_DYNAMIC_MODE         TYPE UJ_INTEGER VALUE '0',

LC_SUCCESS_MODE         TYPE UJ_INTEGER VALUE '1',

LC_WARN_MODE            TYPE UJ_INTEGER VALUE '2',

LC_ERROR_MODE           TYPE UJ_INTEGER VALUE '3'.


IO_CONTEXT = CL_UJ_CONTEXT=>GET_CUR_CONTEXT( ).

I_PROPERTY_NAME = UJD0_CS_TASK_PARAMETER-ATTACHLOG.
IO_PROPERTY_LIST->ITEM(
EXPORTING I_NAME = I_PROPERTY_NAME
IMPORTING EO_PROPERTY = IO_PROPERTY ).
ASSIGN IO_PROPERTY->DR_VALUE->* TO <I_PROPERTY_VALUE>.
I_ATTACH_LOG = <I_PROPERTY_VALUE>.

I_PROPERTY_NAME = UJD0_CS_TASK_PARAMETER-MAILTO.
IO_PROPERTY_LIST->ITEM(
EXPORTING I_NAME = I_PROPERTY_NAME
IMPORTING EO_PROPERTY = IO_PROPERTY ).
ASSIGN IO_PROPERTY->DR_VALUE->* TO <I_PROPERTY_VALUE>.
I_MAIL_TO = <I_PROPERTY_VALUE>.

I_PROPERTY_NAME = UJD0_CS_TASK_PARAMETER-MAILCC.
IO_PROPERTY_LIST->ITEM(
EXPORTING I_NAME = I_PROPERTY_NAME
IMPORTING EO_PROPERTY = IO_PROPERTY ).
ASSIGN IO_PROPERTY->DR_VALUE->* TO <I_PROPERTY_VALUE>.
I_MAIL_CC = <I_PROPERTY_VALUE>.

I_PROPERTY_NAME = UJD0_CS_TASK_PARAMETER-MAILMESSAGE.
IO_PROPERTY_LIST->ITEM(
EXPORTING I_NAME = I_PROPERTY_NAME
IMPORTING EO_PROPERTY = IO_PROPERTY ).
ASSIGN IO_PROPERTY->DR_VALUE->* TO <I_PROPERTY_VALUE>.
I_MAIL_MESSAGE = <I_PROPERTY_VALUE>.

I_PROPERTY_NAME = UJD0_CS_TASK_PARAMETER-SUBJECT.
IO_PROPERTY_LIST->ITEM(
EXPORTING I_NAME = I_PROPERTY_NAME
IMPORTING EO_PROPERTY = IO_PROPERTY ).
ASSIGN IO_PROPERTY->DR_VALUE->* TO <I_PROPERTY_VALUE>.
I_SUBJECT = <I_PROPERTY_VALUE>.


SPLIT I_MAIL_TO AT UJD0_C_EMAIL_DELIMITER INTO TABLE IT_MAIL_TO.
SPLIT I_MAIL_CC AT UJD0_C_EMAIL_DELIMITER INTO TABLE IT_MAIL_CC.

CONCATENATE I_MAIL_MESSAGE '' INTO I_BODYTEXT_ROW.
APPEND I_BODYTEXT_ROW TO IT_MAIL_MESSAGE.

IF I_ATTACH_LOG = UJD0_CS_I_BOOL-YES.

*- Select the log file name based on Package status
LO_VARIABLE_LIST = CL_UJD_PACKAGE_CONTEXT=>GET_VARIABLE_LIST( ).
*- Get package status from variable list
L_VARIABLE_NAME = UJD0_CS_TASK_PARAMETER-PACKAGE_STATUS.
LO_VARIABLE_LIST->GET_VARIABLE(
EXPORTING

I_NAMESPACE = UJD0_CS_VARIABLE_NAMESPACE-SYSTEM
I_NAME = L_VARIABLE_NAME
IMPORTING EO_VARIABLE = LO_VARIABLE ).

ASSIGN LO_VARIABLE->DR_VALUE->* TO <L_VARIABLE_VALUE>.
L_PRE_PACK_STATUS = <L_VARIABLE_VALUE>.

IF L_PRE_PACK_STATUS = LC_SUCCESS_MODE.

*- Read Formula Log file name with file path from global variable
I_DOC_NAME =  CL_UJK_MODEL=>G_LOG_PATH.

*- Modify the subject with Package status

   CONCATENATE 'SUCCESSFUL:' I_SUBJECT INTO I_SUBJECT.
ELSE.


CL_UJD_PACKAGE_CONTEXT=>GET_INSTANCE_ID(
IMPORTING E_INSTANCE_ID = I_INSTANCE_ID ).
*- Read Package Log file name based on SEQUENCE id
SELECT SINGLE LOG_FILE FROM UJD_STATUS INTO I_LOG_NAME WHERE LOG_ID = I_INSTANCE_ID.

CONCATENATE UJ00_C_WEB_ROOT IO_CONTEXT->D_APPSET_ID
UJD0_CS_FILE_PATH_SLASH IO_CONTEXT->D_APPL_ID
UJD0_CS_FILE_PATH_SLASH UJ00_C_PRIV_PUBLICATION
UJD0_CS_FILE_PATH_SLASH IO_CONTEXT->DS_USER-USER_ID
UJD0_CS_FILE_PATH_SLASH UJ00_C_TEMPFILES
UJD0_CS_FILE_PATH_SLASH I_LOG_NAME
INTO I_DOC_NAME.


*- Modify the subject with Package status
    CONCATENATE 'ERROR:' I_SUBJECT INTO I_SUBJECT.
ENDIF.


ENDIF.

TRY.
DESCRIBE TABLE IT_MAIL_MESSAGE LINES I_NUM_ROWS.
I_NUM_ROWS = I_NUM_ROWS *
255.

MOVE I_NUM_ROWS TO I_TEXT_LENGTH.
IO_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
I_TYPE =
'RAW'
I_TEXT = IT_MAIL_MESSAGE
I_LENGTH = I_TEXT_LENGTH
I_SUBJECT = I_SUBJECT ).

IO_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
IO_SEND_REQUEST->SET_DOCUMENT( IO_DOCUMENT ).
IO_SENDER = CL_SAPUSER_BCS=>CREATE( SY-UNAME ).
CALL METHOD IO_SEND_REQUEST->SET_SENDER
EXPORTING
I_SENDER = IO_SENDER.

IS_RECIPIENTS-COMMTYPE =
'INT'.
LOOP AT IT_MAIL_TO INTO I_ADDRESS_STR.
CLEAR I_ADDRESS.
I_ADDRESS = I_ADDRESS_STR.
IO_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS ).
IO_SEND_REQUEST->ADD_RECIPIENT(
EXPORTING I_RECIPIENT = IO_RECIPIENT ).
IS_RECIPIENTS-RECIPIENT_ID = I_ADDRESS.
APPEND IS_RECIPIENTS TO IT_RECIPIENTS.
ENDLOOP.


LOOP AT IT_MAIL_CC INTO I_ADDRESS_STR.
CLEAR I_ADDRESS.
I_ADDRESS = I_ADDRESS_STR.
IO_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS ).
IO_SEND_REQUEST->ADD_RECIPIENT(
EXPORTING

I_RECIPIENT = IO_RECIPIENT I_COPY = ABAP_TRUE ).
IS_RECIPIENTS-RECIPIENT_ID = I_ADDRESS.
APPEND IS_RECIPIENTS TO IT_RECIPIENTS.
ENDLOOP.

IF I_DOC_NAME IS NOT INITIAL.

  CL_UJF_FILE_SERVICE_MGR=>FACTORY(
EXPORTING

IS_USER    = IO_CONTEXT->DS_USER
  I_APPSET   = IO_CONTEXT->D_APPSET_ID
RECEIVING R_MANAGER  = IO_FILE_SERVICE_MGR ).

I_FILE_NAME = CL_UJD_UTILITY=>GET_FILENAME_FROM_PATH( I_DOC_NAME ).
I_ATT_TITLE = I_FILE_NAME.

IO_FILE_SERVICE_MGR->GET_DOCUMENT(
EXPORTING

I_DOCNAME          = I_DOC_NAME
I_RETZIP           = ABAP_FALSE
IMPORTING E_DOCUMENT_CONTENT = I_DOC_CONTENT ).

IS_ATTACHMENTS-FILENAME = I_FILE_NAME.
IS_ATTACHMENTS-CONTENT_BINARY = I_DOC_CONTENT.

CALL FUNCTION 'SYSTEM_CODEPAGE'
IMPORTING
CODEPAGE = I_CODEPAGE.

I_ENCODING = I_CODEPAGE.

* Convert xstring to binary table
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
BUFFER        = I_DOC_CONTENT
IMPORTING
OUTPUT_LENGTH = I_FILE_LENGTH
TABLES
BINARY_TAB    = IT_DATA.

CALL METHOD IO_FILE_SERVICE_MGR->GET_DOCUMENT_ATTRIBUTES
EXPORTING
I_DOCNAME              = I_DOC_NAME
IMPORTING
ES_DOCUMENT_ATTRIBUTES = IS_DOC_ATTRIBUTES.

IS_ATTACHMENTS-MIMETYPE = IS_DOC_ATTRIBUTES-DOCTYPE.
IS_ATTACHMENTS-CREATED_ON = IS_DOC_ATTRIBUTES-CREATE_DATE.
IS_ATTACHMENTS-FILESIZE = I_FILE_LENGTH.

APPEND IS_ATTACHMENTS TO IT_ATTACHMENTS.

CALL FUNCTION 'SCMS_BINARY_TO_STRING'
EXPORTING
INPUT_LENGTH = I_FILE_LENGTH
ENCODING     = I_ENCODING
IMPORTING
TEXT_BUFFER  = I_TRANS_DATA_STRING
TABLES
BINARY_TAB   = IT_DATA.

IT_LOG_TAB = CL_DOCUMENT_BCS=>STRING_TO_SOLI(

IP_STRING = I_TRANS_DATA_STRING ).
I_ATTCH_LENGTH = I_FILE_LENGTH.

IO_DOCUMENT->ADD_ATTACHMENT( EXPORTING I_ATTACHMENT_TYPE = I_ATT_DOC_TYPE
I_ATTACHMENT_SUBJECT = I_ATT_TITLE
I_ATTACHMENT_SIZE = I_ATTCH_LENGTH
I_ATT_CONTENT_TEXT = IT_LOG_TAB ).


ENDIF.

CREATE OBJECT IO_PAYLOAD.

WRITE SY-LANGU TO IS_PAYLOAD_MESSAGE-LANGU.
IS_PAYLOAD_MESSAGE-TITLE = I_SUBJECT.
LOOP AT IT_MAIL_MESSAGE INTO IS_MAIL_MESSAGE.
CONCATENATE IS_PAYLOAD_MESSAGE-MESSAGE IS_MAIL_MESSAGE INTO
IS_PAYLOAD_MESSAGE-MESSAGE.
ENDLOOP.
IO_PAYLOAD->ADD_BASIC_MESSAGE( IS_PAYLOAD_MESSAGE ).

IV_PAYLOAD = IO_PAYLOAD->GET_PAYLOAD( ).

CREATE OBJECT IO_NOTIF_API.
CALL METHOD IO_NOTIF_API->PUBLISH
EXPORTING
IT_RECIPIENTS        = IT_RECIPIENTS
IV_FROM_ADDRESS      = SY-UNAME
IV_PAYLOAD           = IV_PAYLOAD
IV_MESSAGE_TYPE      =
'N' "Notification
*         IV_PRIORITY          = '3'
IV_SOURCE_APP        =
'Data Manager'"#EC NOTEXT
*         IV_SOURCE_DOC        = I_INST_ID
*         IV_EXPIRES_ON        =
IV_NOTIFICATION_TYPE =
'DEFAULT_TYPE'
IT_ATTACHMENTS       = IT_ATTACHMENTS.

CATCH CX_STATIC_CHECK  INTO IO_EXCEPTION.

E_PACK_STATUS = UJD0_CS_PACKAGE_STATUS-FAILED.

CALL FUNCTION 'UJ0_CONV_EX2MSG'
EXPORTING
IO_EXCEPTION     = IO_EXCEPTION
IMPORTING
ET_MESSAGE_LINES = IT_MESSAGE.

IO_LOGGER->IF_UJD_LOGGER~ADD_MESSAGE_TABLE( EXPORTING

                                             IT_MESSAGE = IT_MESSAGE ).

CL_UJD_UTILITY=>ADD_MESSAGE_LOG( IT_MESSAGE ).

ENDTRY.

EXIT.
ENDIF.

ENDENHANCEMENT.

11 Comments
Top kudoed authors