09-05-2008 1:32 PM
can any one send any program for uploading data through bapi for any infotype. so that i can understand bapi for infotypes.
09-05-2008 1:44 PM
09-09-2008 10:09 PM
11-11-2008 6:54 AM
hi
just create a message class and text according to the code as follows (copy and paste in se 38)
REPORT ZCHR007_01 NO STANDARD PAGE HEADING MESSAGE-ID ZHR LINE-COUNT 65(8) LINE-SIZE 180.
TABLES : PA0003, P0000,P0006,T005S,T005,T591A. " TABLES REQUIRED
*INTERNAL TABLE AND WORK AREA WITH STRUCTURE ON BASIS FLAT FILE DATA.
TYPES : BEGIN OF x_flat_infotype, "Flat file structure
Screen data
PERNR TYPE PERSNO, "Personal Number
BEGDA TYPE BEGDA, "Begin Date
ENDDA TYPE ENDDA, "End Date
ANSSA TYPE ANSSA, "Address Record Type
STRAS TYPE PAD_STRAS, "House number and street
LOCAT TYPE PAD_LOCAT, "2nd Address Line
PSTLZ TYPE PSTLZ_HR, "Postal Code
ORT01 TYPE PAD_ORT01, "City
ORT02 TYPE PAD_ORT02, "District
STATE TYPE REGIO, "State
land1 TYPE land1, "Country
telnr TYPE telnr, "Telephone Number
wkwng TYPE wkwng, "Company Housing
END OF x_flat_infotype.
TYPES : BEGIN OF x_valid.
INCLUDE TYPE x_flat_infotype. "structure for valid data
TYPES : END OF x_valid.
TYPES : BEGIN OF x_invalid.
INCLUDE TYPE x_flat_infotype. "structure for invalid data
TYPES : error TYPE string, "string to hold error field details
END OF x_invalid,
BEGIN OF x_pernr, "STRUCTURE DECLARATION FOR Personal No
pernr TYPE persno,
END OF x_pernr,
BEGIN OF x_state, "STRUCTURE DECLARATION FOR Region
land1 type land1,
state TYPE regio,
END OF x_state,
BEGIN OF x_land1, "STRUCTURE DECLARATION FOR Country
land1 TYPE land1,
END OF x_land1.
DATA : t_infotype TYPE STANDARD TABLE OF x_flat_infotype INITIAL SIZE 0, "internal table to hold data
t_valid TYPE STANDARD TABLE OF x_valid INITIAL SIZE 0, "internal table to hold valid data
t_invalid TYPE STANDARD TABLE OF x_invalid INITIAL SIZE 0, "internal table to hold invalid data
t_v_final TYPE STANDARD TABLE OF x_valid INITIAL SIZE 0, "internal table to hold valid data
DECLARE IT_BDCDATA INTERNAL TABLE BASED ON BDCDATA STRUCTURE
t_bdcdata TYPE STANDARD TABLE OF bdcdata INITIAL SIZE 0, "internal table to hold BDC data
Work area for the above internal tables
wa_infotype TYPE x_flat_infotype, "work area to hold data
wa_valid TYPE x_valid, "work area to hold valid data
wa_invalid TYPE x_invalid, "work area to hold invalid data
wa_v_final TYPE x_valid, "work area to hold valid data
wa_bdcdata TYPE bdcdata, "work area to hold BDC data
g_file TYPE string, "Variable to hold file name entered by user
g_errfile TYPE string. "Variable to hold file name entered by user
MAINTAINING A BLOCK WITH FLAT FILE AS INPUT
PARAMETER : p_file TYPE fc03tab-pl00_file OBLIGATORY. "variable to hold flat file name during runtime
INITIALIZATION.
PERFORM sub_refreshing_inttables. "Subroutine for refreshing all internal tables
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM sub_get_file USING p_file. "TO SELECT A FILE USING F4 KEY.
START-OF-SELECTION.
PERFORM sub_upload_file. " UPLOADING FILE WITH DATA
PERFORM sub_file_validations. " flat file validations
IF NOT t_valid[] IS INITIAL. "checking for valid data
PERFORM sub_data_updatation. "updation of data depending on selected method
ENDIF.
IF NOT t_invalid[] IS INITIAL.
PERFORM sub_download_error_file. "TO DOWNLOAD ERRROR FILE
ENDIF.
Perform sub_details. "Subroutine for loading details
END-OF-SELECTION.
PERFORM sub_free. "TO Free Memory
&----
*& Form sub_refreshing_inttables
&----
"Subroutine for refreshing all internal tables
----
FORM sub_refreshing_inttables . "REFRESH ALL INTERNAL TABLES
REFRESH : t_infotype,t_valid,t_invalid,t_bdcdata.
ENDFORM. " sub_refreshing_inttables
&----
*& Form sub_get_file
&----
Subroutine for selection a file during runtime
----
-->P_P_FILE Input File
----
FORM sub_get_file USING p_p_file.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
field_name = 'PA_FILE'
CHANGING
file_name = p_p_file.
ENDFORM. " sub_get_file
&----
*& Form sub_upload_file
&----
Subroutine for uploading data into internal table
----
FORM sub_upload_file.
CONSTANTS : lc_ftype TYPE char10 VALUE 'ASC',
lc_fsepe TYPE char01 VALUE 'X'.
g_file = p_file. "STORE FILENAME IN VARIABLE(g_FILE)
IF p_file IS INITIAL. " if file is not selected
MESSAGE i002.
LEAVE LIST-PROCESSING.
ELSE.
CALL FUNCTION 'GUI_UPLOAD' "CALLLING FUNCTION TO UPLOAD THE FILE DATA
EXPORTING
filename = g_file
filetype = lc_ftype
has_field_separator = lc_fsepe
TABLES
data_tab = t_infotype
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17
.
IF sy-subrc <> 0. "message to display is file is not selected
MESSAGE i001.
LEAVE LIST-PROCESSING.
ENDIF.
ENDIF.
ENDFORM. " sub_upload_file
&----
*& Form sub_file_validations
&----
Subroutine for validating required fields in flat file
----
FORM sub_file_validations .
CONSTANTS: lc_anssa1 TYPE char04 VALUE '1', "Constant address type
lc_anssa2 TYPE char04 VALUE '2', "Constant address type
lc_anssa3 TYPE char04 VALUE '3', "Constant address type
lc_anssa4 TYPE char04 VALUE '4', "Constant address type
lc_wkwng1 TYPE char01 VALUE '1', "Constant Company Housing
lc_wkwng2 TYPE char01 VALUE '2'. "Constant Company Housing
DATA : t_pernr TYPE STANDARD TABLE OF x_pernr INITIAL SIZE 0, "INTERNAL TABLE FOR Personal No data
t_state TYPE STANDARD TABLE OF x_state INITIAL SIZE 0, "INTERNAL TABLE FOR Region data
t_land1 TYPE STANDARD TABLE OF x_land1 INITIAL SIZE 0. "INTERNAL TABLE FOR Country data
IF t_infotype IS NOT INITIAL.
validate Personal No
SELECT pernr FROM pa0003 INTO TABLE t_pernr " Extracting Personal No Data FROM TO VALIDATE THE FIELD
FOR ALL ENTRIES IN t_infotype WHERE pernr = t_infotype-pernr.
IF sy-subrc = 0.
SORT t_pernr BY pernr.
ENDIF.
validate Region
SELECT land1 bland FROM t005s INTO TABLE t_state . " Extracting Region DATA FROM TO VALIDATE THE FIELD
IF sy-subrc = 0.
SORT t_state BY land1 state.
ENDIF.
validate Country
SELECT land1 FROM t005 INTO TABLE t_land1 . " Extracting country DATA FROM TO VALIDATE THE FIELD
IF sy-subrc = 0.
SORT t_land1 BY land1 .
ENDIF.
ELSE.
MESSAGE i004.
LEAVE LIST-PROCESSING.
ENDIF.
CLEAR wa_infotype. "clearing data from work area of infotype internal table
LOOP AT t_infotype INTO wa_infotype.
PERFORM sub_valid_nonvalidatefield.
PERFORM sub_startdate_validaion. "Subroutine to validate start date field
PERFORM sub_enddate_validaion. "Subroutine to validate end date field
IF wa_valid-begda GE wa_valid-endda. "If start date is less than or equal to end date
wa_invalid-begda = wa_infotype-begda. "moving start date to invalid workarea of start date
wa_invalid-endda = wa_infotype-endda. "moving start date to invalid workarea of start date
CONCATENATE text-032 wa_invalid-begda
wa_invalid-error INTO wa_invalid-error SEPARATED BY space .
ENDIF.
validate field Address Type of flat file with field in check table
IF wa_infotype-anssa = lc_anssa1 OR wa_infotype-anssa = lc_anssa2
OR wa_infotype-anssa = lc_anssa3 OR wa_infotype-anssa = lc_anssa4 .
wa_valid-anssa = wa_infotype-anssa. "moving Address type from internal table to valid internal table
ELSE.
wa_invalid-anssa = wa_infotype-anssa. "moving Address type from internal table to invalid internal table
CONCATENATE text-033 wa_invalid-anssa
wa_invalid-error INTO wa_invalid-error SEPARATED BY space .
ENDIF.
validate field Personal No of flat file with field in check table
READ TABLE t_pernr WITH KEY pernr = wa_infotype-pernr
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc = 0. "checking for validation of the Personal No
wa_valid-pernr = wa_infotype-pernr. "moving Personal No from internal table to valid internal table
ELSE.
wa_invalid-pernr = wa_infotype-pernr. "moving Personal No from internal table to invalid internal table
CONCATENATE text-030 wa_invalid-pernr
wa_invalid-error INTO wa_invalid-error SEPARATED BY space .
ENDIF.
validate field State of flat file with field in check table
READ TABLE t_state WITH KEY land1 = wa_infotype-land1 STATE = wa_infotype-state
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc = 0. "checking for validation of the State
wa_valid-state = wa_infotype-state. "moving State from internal table to valid internal table
ELSE.
wa_invalid-state = wa_infotype-state. "moving State from internal table to invalid internal table
CONCATENATE text-010 wa_invalid-state
wa_invalid-error INTO wa_invalid-error SEPARATED BY space .
ENDIF.
validate field Country of flat file with field in check table
READ TABLE t_land1 WITH KEY land1 = wa_infotype-land1
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc = 0. "checking for validation of the Country
wa_valid-land1 = wa_infotype-land1. "moving Country from internal table to valid internal table
ELSE.
wa_invalid-land1 = wa_infotype-land1. "moving Country from internal table to invalid internal table
CONCATENATE text-011 wa_invalid-land1
wa_invalid-error INTO wa_invalid-error SEPARATED BY space .
ENDIF.
IF wa_infotype-wkwng = lc_wkwng1 OR wa_infotype-wkwng = lc_wkwng2 .
wa_valid-wkwng = wa_infotype-wkwng. "moving Company Housing from internal table to valid internal table
ELSE.
wa_invalid-wkwng = wa_infotype-wkwng. "moving Company Housing from internal table to invalid internal table
CONCATENATE text-034 wa_invalid-wkwng
wa_invalid-error INTO wa_invalid-error SEPARATED BY space .
ENDIF.
For Invalid data
IF wa_invalid IS NOT INITIAL. "checking all fields data for invalid entries
CONCATENATE text-012
wa_invalid-error INTO wa_invalid-error.
PERFORM sub_invalid_nonvalidatefield.
IF wa_invalid-pernr IS INITIAL.
wa_invalid-pernr = wa_valid-pernr. "Personal No
ENDIF.
IF wa_invalid-begda IS INITIAL.
wa_invalid-begda = wa_valid-begda. "Begin date
ENDIF.
IF wa_invalid-endda IS INITIAL.
wa_invalid-endda = wa_valid-endda. "End Date
ENDIF.
IF wa_invalid-anssa IS INITIAL.
wa_invalid-anssa = wa_valid-anssa. "Address Type
ENDIF.
IF wa_invalid-state IS INITIAL.
wa_invalid-state = wa_valid-state. "State
ENDIF.
IF wa_invalid-land1 IS INITIAL.
wa_invalid-land1 = wa_valid-land1. "Country
ENDIF.
APPEND wa_invalid TO t_invalid. "Appending data to invalid internal table
ELSE.
APPEND wa_valid TO t_valid. "Appending data to valid internal table
ENDIF.
CLEAR wa_valid.
CLEAR wa_invalid.
ENDLOOP.
ENDFORM. " sub_file_validations
&----
*& Form sub_valid_nonvalidatefield
&----
Subroutine for updating non-validated fields into valid work area
----
FORM sub_valid_nonvalidatefield .
wa_valid-stras = wa_infotype-stras. "moving Str&Hou from internal table to valid internal table
wa_valid-locat = wa_infotype-locat. "moving 2nd Address line from internal table to valid internal table
wa_valid-pstlz = wa_infotype-pstlz. "moving Postal Code from internal table to valid internal table
wa_valid-ort01 = wa_infotype-ort01. "moving City from internal table to valid internal table
wa_valid-ort02 = wa_infotype-ort02. "moving District from internal table to valid internal table
wa_valid-telnr = wa_infotype-telnr. "moving Telephone No from internal table to valid internal table
ENDFORM. " sub_valid_nonvalidatefield
&----
*& Form sub_startdate_validaion
&----
"Subroutine to validate start date field
----
FORM sub_startdate_validaion .
*This Funciton module is used for Conversion of date, ie External to
*internal date (like screen conversion)
CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
EXPORTING
date_external = wa_infotype-begda "External date or date given in flat file
IMPORTING
date_internal = wa_valid-begda "Date converted to internal format for conversion
EXCEPTIONS
date_external_is_invalid = 1
OTHERS = 2.
IF sy-subrc <> 0. "If conversion of date fails
wa_invalid-begda = wa_infotype-begda. "moving date from flat file work area to inavlid work area
CONCATENATE text-035 wa_invalid-begda
wa_invalid-error INTO wa_invalid-error SEPARATED BY space. " Adding start date error to error field of invalid internal table
ENDIF.
ENDFORM. " sub_startdate_validaion
&----
*& Form sub_enddate_validaion
&----
"Subroutine to validate end date field
----
FORM sub_enddate_validaion .
*This Funciton module is used for Conversion of date, ie External to
*internal date (like screen conversion)
CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
EXPORTING
date_external = wa_infotype-endda "External date or date given in flat file
IMPORTING
date_internal = wa_valid-endda "Date converted to internal format for conversion
EXCEPTIONS
date_external_is_invalid = 1
OTHERS = 2.
IF sy-subrc <> 0. "If conversion of date fails
wa_invalid-endda = wa_infotype-endda. "moving date from flat file work area to inavlid work area
CONCATENATE text-036 wa_invalid-endda
wa_invalid-error INTO wa_invalid-error SEPARATED BY space. " Adding end date error to error field of invalid internal table
ENDIF.
ENDFORM. " sub_enddate_validaion
&----
*& Form sub_invalid_nonvalidatefield
&----
Subroutine for updating non-validated fields into invalid work area
----
FORM sub_invalid_nonvalidatefield .
wa_invalid-stras = wa_infotype-stras. "moving Str&Hou from internal table to invalid internal table
wa_invalid-locat = wa_infotype-locat. "moving 2nd Address line from internal table to invalid internal table
wa_invalid-pstlz = wa_infotype-pstlz. "moving Postal Code from internal table to invalid internal table
wa_invalid-ort01 = wa_infotype-ort01. "moving City from internal table to invalid internal table
wa_invalid-ort02 = wa_infotype-ort02. "moving District from internal table to invalid internal table
wa_invalid-telnr = wa_infotype-telnr. "moving Telephone No from internal table to invalid internal table
ENDFORM. " sub_invalid_nonvalidatefield
&----
*& Form sub_data_updatation
&----
Subroutine for updation of data depending on selected method
----
FORM sub_data_updatation .
DATA : wa_return_enque TYPE bapireturn1. "variable to store error values
clear wa_return_enque.
LOOP AT t_valid INTO wa_valid. "moving valid data to valid work area
PERFORM sub_bapi_employee_enqueue using wa_return_enque . "Subroutine to lock an employee
IF wa_return_enque-type NE 'E'.
PERFORM sub_bapi_addressempdk_create. "Subroutine to create employee address data
ENDIF.
ENDLOOP.
ENDFORM. " sub_data_updatation
&----
*& Form sub_bapi_employee_enqueue
&----
Subroutine to lock an employee
----
<--P_WA_RETURN_ENQUE wa_return_enque-type
----
FORM sub_bapi_employee_enqueue using p_wa_return_enque LIKE bapireturn1.
*This funciton module is used to lock an employee so that the records
*stored for this person cannot be accessed.
*When an employee is locked, only user who has set lock can access
*records for this employee. Other users are denied access.
CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE'
EXPORTING
number = wa_valid-pernr "Personal number
IMPORTING
return = p_wa_return_enque. "for error values returned
ENDFORM. " sub_bapi_employee_enqueue
&----
*& Form sub_BAPI_ADDRESSEMPDK_CREATE
&----
Subroutine to create employee address data
----
FORM sub_bapi_addressempdk_create.
DATA : wa_data_create TYPE bapireturn1. "variable to store error values
*This function module is used create a Address Data record (0006).
CALL FUNCTION 'BAPI_ADDRESSEMPDK_CREATE'
EXPORTING
employeenumber = wa_valid-pernr "Personal No
validitybegin = wa_valid-begda "Begin Date
validityend = wa_valid-endda "End Date
addresstype = wa_valid-anssa "Address type
streetandhouseno = wa_valid-stras "Street and house address
scndaddressline = wa_valid-locat "2nd address line
city = wa_valid-ort01 "City
district = wa_valid-ort02 "District
postalcodecity = wa_valid-pstlz "Postal Code
state = wa_valid-state "Region(State)
country = wa_valid-land1 "Country
company_apartment = wa_valid-wkwng "Company Housing
telephonenumber = wa_valid-telnr "Telephone No
IMPORTING
return = wa_data_create
employeenumber = wa_valid-pernr
subtype = wa_valid-anssa
validitybegin = wa_valid-begda
validityend = wa_valid-endda.
If error or abend message occurs while uploading data, then moving all the wa_valid fields to wa_invalid fields.
IF wa_data_create-type EQ 'E'
OR wa_data_create-type EQ 'A'.
PERFORM sub_bapi_employee_dequeue. "Subroutine to unlock an employee
wa_invalid-pernr = wa_valid-pernr . "Personal No
wa_invalid-begda = wa_valid-begda . "Begin Date
wa_invalid-endda = wa_valid-endda . "End Date
wa_invalid-anssa = wa_valid-anssa . "Address type
wa_invalid-stras = wa_valid-stras . "Street and house address
wa_invalid-locat = wa_valid-locat . "2nd address line
wa_invalid-ort01 = wa_valid-ort01 . "City
wa_invalid-ort02 = wa_valid-ort02 . "District
wa_invalid-pstlz = wa_valid-pstlz . "Postal Code
wa_invalid-state = wa_valid-state . "Region(State)
wa_invalid-land1 = wa_valid-land1 . "Country
wa_invalid-telnr = wa_valid-telnr . "Telephone No
wa_invalid-wkwng = wa_valid-wkwng . "Company Housing
wa_invalid-error = wa_data_create-message.
APPEND wa_invalid TO t_invalid. "appending wa_invalid to internal table
ELSE.
APPEND wa_valid TO t_v_final. "appending wa_valid to another internal table for the final count of valid records
ENDIF.
CLEAR: wa_invalid, "clearing work area of invalid
wa_valid. "clearing work area of valid
ENDFORM. " sub_BAPI_ADDRESSEMP_CREATE
&----
*& Form sub_bapi_employee_dequeue
&----
Subroutine to unlock an employee
----
FORM sub_bapi_employee_dequeue .
DATA : wa_return_deque TYPE bapireturn1.
*This function module is used to unlock an employee so that the records
*stored for this person can be accessed.
*If an employee is locked using the ENQUEUE method,the user who set the
*lock can access this employee's records.
*Other users are denied access to these records.
CALL FUNCTION 'BAPI_EMPLOYEE_DEQUEUE'
EXPORTING
number = wa_valid-pernr "Personal number
IMPORTING
return = wa_return_deque. "for error values returned
ENDFORM. " sub_bapi_employee_dequeue
&----
*& Form sub_download_error_file
&----
Subroutine to download error file for rectifications
----
FORM sub_download_error_file .
PROVIDE A VARIABLE FOR HOLDING FLAT FILE
CONSTANTS : lc_ftype TYPE char10 VALUE 'ASC',
lc_fsepe TYPE char01 VALUE 'X',
lc_err TYPE char5 VALUE '_err.', "constant to change error file name
lc_period TYPE c VALUE '.'. "constant to change error file name
g_errfile = p_file. "STORE FILENAME IN VARIABLE(l_FILE)
SHIFT g_errfile BY 4 PLACES RIGHT CIRCULAR.
REPLACE lc_period WITH lc_err INTO g_errfile. "lc_err to truncate .txt and lc_period to add _err.txt
SHIFT g_errfile BY 8 PLACES LEFT CIRCULAR.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = g_errfile
filetype = lc_ftype
write_field_separator = lc_fsepe
TABLES
data_tab = t_invalid
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22
.
IF sy-subrc NE 0.
MESSAGE i003.
ENDIF.
ENDFORM. " sub_download_error_file
&----
*& Form sub_details
&----
Subroutine for loading details
----
FORM sub_details .
DATA: l_count_total TYPE i, "variable to count total no of records
l_count_valid TYPE i, "variable to count no of records uploaded
l_count_invalid TYPE i. "variable to count total no of error records
ULINE.
WRITE :/71 text-018 . "title
DESCRIBE TABLE t_infotype LINES l_count_total. "To count no of lines in internal table
WRITE :/,text-019 ,30 text-020, 32 l_count_total,157 text-021,164 text-020, 166 sy-datum.
DESCRIBE TABLE t_v_final LINES l_count_valid. "To count no of lines in internal table
WRITE : text-022,30 text-020,32 l_count_valid,157 text-023,164 text-020, 166 sy-uzeit.
DESCRIBE TABLE t_invalid LINES l_count_invalid. "To count no of lines in internal table
WRITE : text-025,30 text-020,32 l_count_invalid,157 text-024,164 text-020, 166 sy-uname.
WRITE :/,text-026 ,30 text-020 , 40 g_file . "name of the error file
Print if only invalid records exist
IF NOT t_invalid[] IS INITIAL.
WRITE :/,text-027 ,30 text-020 , 40 g_errfile . "variable to count total no of error records
IF t_invalid IS INITIAL.
g_errfile = text-029.
ENDIF.
WRITE 😕 text-028.
ULINE.
WRITE 😕 sy-vline,2 text-030,17 sy-vline, 20 text-031,178 sy-vline. "headings
ULINE.
LOOP AT t_invalid INTO wa_invalid. " to display error details
WRITE 😕 sy-vline,2 wa_invalid-pernr,17 sy-vline ,20 wa_invalid-error,178 sy-vline.
ENDLOOP.
ULINE.
ENDIF.
ENDFORM. " sub_details
&----
*& Form sub_free
&----
To free the memory allocated to internal tables
----
FORM sub_free .
FREE : t_infotype,t_valid,t_invalid,t_bdcdata. "FREE MEMORY ALLOCATED TO VARIOUS INTERNAL TABLES
ENDFORM. " sub_free
04-14-2009 11:13 AM