HR Data Conversion
Use the HR Conversion process (HRUTZZ01) to convert Human Resource data from a legacy system to BusinessPlus. It uses a spreadsheet concept. Column headings tell the software which data to convert. Information for each table is contained in a file and is processed one at a time for maximum control.
To set aside employee data for testing purposes and not make updates in the conversion process:
Go to Employee Master (HREMEN).
Select the Misc Info tab, then the Employee Information tab.
In Selection Code 2, enter TEST.
To process updates for this employee, delete TEST from the Selection Code 2 field.
Spreadsheets
The conversion spreadsheet gives maximum flexibility to the generic process. Row 1 identifies the information contained in that field column. These names match the column name in the database table and each page's online help field descriptions.
Name the spreadsheet for the table where the data will be inserted, for example, DIRDEP.xls.
The columns do not have to be in a specific order. The process handles special features based on the column heading (row 1).
The columns are color-coded to identify the importance of the data. Red columns must be in the data file to insert or update data. Green columns must be there if inserting data. Gold indicates data needed or recommended to run a payroll. White columns are other optional data. Only red columns are required in the file for processing.
Ensure that each column appears in the upload file only once. If there are duplicate columns, data is not inserted, even if the tail sheet says it was.
There are two tabs on each spreadsheet file, a data tab and a help tab. The help tab describes the field columns and identifies the page and tab where you find the data. It indicates the type of data, length of text fields, how many digits follow the decimal point, and any comments, defaults, and recommendations.
The process deciphers the column heading row. It handles dashes and lower- and upper-case letters to adjust the field name to what it needs to be. If a field name specified is not in the table, the process displays the error but updates or inserts the data for all other columns unless that one wrong column is required (red).
Dates - Eight different date formats are available for use. The only requirement is that all dates within a file use the same format. You specify the format, and the program modifies the date to fit the correct format that the database table accepts.
Numbers/Amounts - The program handles all decimal options. It calculates what type of number the data is, validates that it is a number, then formats it to the correct form to be accepted by the database table. This is on a field-by-field basis. Dollar signs ($) are not permitted.
Phone Numbers - You do not need to format phone numbers in the input file. Formatting is stripped from the data and then added when inserted into the table. The inserted format is (nnn) nnn-nnnn.
Use a delimited file: TAB, COMMA, or PIPE. This is on a file-by-file basis.
If a data file has commas in the numbers or text, COMMA delimited will not work. Use TAB or PIPE delimited format.
If you run the process to update data, a blank cell on the spreadsheet will clear the data in the table field.
Some data fields do not appear in the spreadsheet columns to minimize data clutter. These fields are usually standard data that is the same for all records. If the process does not find that column field name, it takes the preset default. These fields are defined in the spreadsheet field description tab and depend on the database table. You can override the default option by inserting the column into the spreadsheet.
A spreadsheet is sorted based on the red columns specified on the help tab. This is sometimes essential to find data duplication or to be sure data is grouped for processing correctly.
Template
Use the Create the Template job option to create a file that contains the following information about the selected table:
All available columns
Primary Key columns that determine insert and update
Additional required columns
Default values if a column is blank or missing
Fields by data type
When you select the Create the Template checkbox, regular import processing does not occur. Instead, processing creates an additional entry in the job monitor with the Type as Doc and the Desc in the format - table name underscore Template (hr_educinfo_Template).
To access the file, click on the document. A message indicates that the download has started, and a .csv type file appears.
You can access the file in numerous ways, but if you want the data to be in a columnar format, perform the following steps:
Locate the downloaded file in your File Explorer.
Change the extension of the file to .txt.
Open the file using Microsoft Excel.
Select the desired delimiter from the text wizard that appears as a popup.
Click Next.
Click Finish.
Tables
Tables are in update and insertion mode only. No purging of data is done unless specified.
Tables are listed in alphabetical order by Functional Area.
Functional Area - Employee Payroll Assignments
Additional Contributions (hr_addlcont table)
One or more records per employee based on Entity, Employee ID, CDH no, beg, and enddt dates.
SP_FUNCTN is validated in the HR Entity Specific Codes (HRTBCE) hr_hrencode table.
For insertion:
Records are validated in the hr_addltble table based on entity-id, CDH no, beg, and enddt dates. (HRTBCE / Additional Pay)
The ADD_ACTL, AMOUNT, AXP, CD01, INDX_KEY, PRIOR_CALC, and PRO_RATE fields default from the hr_addltble table.
If OVERRIDE = Y, the AXP and AMOUNT fields are overwritten from the hr_slrytble table based on the entity_id, indx_key, beg, and enddt dates.
The AS_OF_DATE is required.
The REC_TYPE, PCN, and POSITION fields are based on the TOEMPPAY field value.
PM_REC_TYPE = PM, PCN = blank, POSITION = blank
AP_REC_TYPE = blank, PCN = blank, POSITION = blank
PP_REC_TYPE from input file
PCN and POSITION from hr_emppay table
Defaults:
ACTION_CD = NEW
APPRV_CD01 = SEND
ENTITY_ID = ROOT
FQ = A
ST = A
OVERRIDE = N
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Additional Taxes (yr_addltax table)
One record per employee based on Entity, Employee ID, CDH number.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Alternate Pay Assignment (HRPYQP) / Distribution (hr_emppay / hr_earndist table)
Works exactly like EMPPAY (EMPPAY).
Defaults other than EMPPAY (EMPPAY):
RECORDFROM = PAYALT
CREATE_WHO and UPDATE_WHO = ROLLEP
Alternate Pay Assignment (HRPYQP) / Distribution (hr_emppay / hr_earndist tables)
Works exactly like EMPPAY (EARNDIST)
Defaults other than EMPPAY (EARNDIST):
MISC = ROLLPA
Benefit Information (hr_beneinfo table)
One or more records per employee based on Entity, Employee ID, benefit plan, and begin and end dates.
Many fields are obtained from the Benefit Plan record in the hr-benetble. When inserting the record, if you want data to come from the hr-benetble, add the column in the spreadsheet and leave the cells blank. If data is found in that column in the spreadsheet, it overrides getting the data from the hr-benetble. The fields are specified in the spreadsheet.
By default, hr_beneinfo record end dates cannot be updated. The HRRL - ROLLOVER common code contains a setting to bypass this restriction.
During UPDATE, if the data file contains the end date column but the date is blank, the existing hr_beneinfo record end date will remain as it is a required field in HR.
When using the DU date type, for this table only, the input file can contain eight digits without the forward slashes, and the data will be formatted as mm/dd/ccyy.
Defaults:
ACTION_CD = ROLL
APPPRV_CD01 = SEND
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
CDH Assignments (hr_cdhassgn table)
One or more records per employee based on Entity, Employee ID, and CDH number.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
RECORDFROM = CDHASSGN
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Direct Deposits (hr_dirdep table)
One or more records per employee based on Entity, Employee ID, and cdh number.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Master (hr_empmstr table)
One record per employee based on Entity and Employee ID.
AUTOA or AUTOC feature works similarly to the page option when producing Employee IDs. Instead of having a value in the ID field, enter either AUTOA or AUTOC as the value, and the Employee ID is generated from a system seed common code.
Option WARN SSN (Associated Description #4 of HRRL/ROLLOVER common code) is used to allow duplicate SSNs with a warning message display.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
NAME = LNAME, FNAME MNAME
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Race Information (hr_emprace table)
One or more records per employee based on Entity and Employee ID.
The table is purged of data and reinserted based on the Employee ID.
Defaults:
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Master & Credential (hr_empmstr and hr_crdholdr tables)
This inserts or updates records in both the hr_empmstr and hr_crdholdr tables.
It uses the EMPMSTR spreadsheet.
For the hr-empmstr table, it follows the rules above for EMPMSTR.
For the hr-crdholdr table, the SSN column must be present for all insertions, and only the information contained in the hr_empmstr table is handled.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
NAME = LNAME, FNAME MNAME
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Mandatory Deductions (hr_mandded table)
One record per employee based on Entity and Employee ID.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
CDH Numbers from HRRQSS (hr_dfltmand table)
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Pay Assignments (HRPYPA) / Distribution (hr_emppay / hr_earndist tables)
One or more records per employee based on Employee ID, pcn number, pay record type, and pay begin date. If this record is for insertion, the UNIQUEID combines those four fields. If the record is for update purposes, the UNIQUEID is retrieved from the record and used.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = WAIT
ENTITY_ID = ROOT
AS_OF_DATE = PAY_BEG
GL_LEDGER = current user GL Ledger
OPTIONCODE = 23
OVERRIDE = N
PY_SEND = based on APPRV_CD01
RATIO_FACT = 1
RATIO_AMT = if RATIO_FACT = 1 thru 4, it is obtained from the hr_pcntble table
RECORDFROM = EMPPAY
UNIQUEID = ID+PCN+RECTYPE+PAY-BEG
CREATE_WHO and UPDATE_WHO = ROLLEP
CREATE_WHEN and UPDATE_WHEN = current date
If any of the default days, hours, or period fields are blank or NULL, the process gets the information from the hr_pcntble record.
If any of the actual days, hours, or period fields are blank or NULL, the process enters zero in these fields so that the Pay Utility Option #1 will calculate these values. You need to run this utility after loading the data.
During insertion, If the STEP column is missing or is blank, the STEP field is populated with the value from the hr_slrytble using the INDX-KEY.
When inserting or updating the hr_emppay table, three fields are interrelated: pcn_fte, tot_fte, and pcn_effort. If pcn_fte is a column in the input record and is not blank or NULL, the FTE field value is retrieved from the HR Employee Master and put into the tot_fte field, then the pcn_fte is divided by the tot_fte, and the value is entered in the pcn_effort field.
Pay Assignments (HRPYPA) / Distribution (hr_emppay / hr_earndist tables)
One or more records per Pay Assignment based on uniqueid above.
If you want to populate this table, the Percent field must be present.
The table is purged of data and reinserted based on the Pay Assignment UNIQUEID.
Defaults:
GL_LEDGER = current user GL Ledger
MISC = ROLLEP
RECTYPE = handled by the process in sequence
ACCOUNT, GL_KEY, and GL_OBJ are obtained by either having the ACCOUNT or the GL_KEY and GL_OBJ. The other fields are looked up in the system.
Retirement Table (hr_mandret table)
One record per employee based on Entity and Employee ID.
Defaults:
ACTION_CD = NEW
APPRV_CD01 = SEND
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
TSA Information (hr_tsainfo table)
One or more records per employee based on Entity, Employee ID, and TSA number.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Functional Area - Humans Resources Tables
Benefit Definitions (hr_benetble table)
One or more records per employee based on Entity, bene-plan = code + type + category, and eff-beg date.
For updating, the EFF-END date cannot be updated and is checked for overlapping between benefit plans. To edit this field, you need to go through the HRUTBU (benefit utility) process.
CBENE-CD04 and DBENE-CD04 are filled automatically if Relate Code #8 on the CDH defines them.
BENE-AGE is determined from the Benefit Code definition (HRTBBE).
For insertion:
Validated from the HRTBCE page: CATEGORY, GROUP-NO, SUB-GROUP, TYPE
Validated from the HRTBHR page: CBENE-FQ, CBENE-ST, DBENE-FQ, DBENE-ST, GENDER, SORT
Validated from the PYUPCC page: CBENE-CDH
Validated from the PYUPDD page: DBENE-CDH
Validated from the HRTBBE page: CODE
Validated from the HRTBVE page: VENDOR-CD
Validated from the drop-down lists: CALC-CODE, CAXP, CLXP, DATE-CALC, DAXP, DLXP
Calculation of Total column/field:
For insertion: EMPLOYEE and EMPLOYER column values are added together. If one or both are blank or missing then a zero is used.
For update: If the EMPLOYEE or EMPLOYER column exists in the input file then the assigned value, zero if blank, is used in the total. If one or both columns are not present in the input file then the existing hr_benetble values are retained and used in the total.
Defaults:
ACTION_CD = NEW
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Job Table (hr_jobtble table)
One record per job based on Entity and job code.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Location Table (hr_loctble table)
One record per location based on Entity and location code.
Defaults:
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
PCN Table (hr_pcntble table)
One record per position / pcn code.
Defaults:
ACTION_CD = ROLL
APPRV_CD01 = SEND
ENTITY_ID = ROOT
PCNAUTO = M
POS_CREATE = 06
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Salary Definitions (hr_slrytble table)
HR-SLRYTBLE-MSTR: One record per Entity, schedule, range, payeffbeg, and payeffend.
HR-SLRYTBLE: One or more records based on hr_slrytble_mstr and step.
If you want the program to insert records into the hr_rangtble if they are not found based on the Entity, schedule, and range, use the option INSERT RANGE (Associated Description #4 of HRRL/ROLLOVER common code). By default, the system is expecting the Range to already exist.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Functional Area - Employee Tracking Records
Awards (hr_awards table)
One or more records per employee based on Entity, Employee ID, award code, and date.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
County Credential Information (hr_cntycred and hr_cntycred_mstr tables)
One or more records per employee based on social security number, credit term, credit type, and document.
The HR-CNTYCRED table is purged of data and reinserted based on the CNTYCRED Master Key field.
The social security number (SSN) must already exist in the Credential Holder (HRCRCD), hr_crdholdr table.
There is no link or checking done with the HR Employee Master because the Credential pages are standalone.
Defaults:
ACTION_CD = ROLL
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Course Units (hr_crseunit table)
One or more records per employee based on Entity, Employee ID, and fiscal year.
If COURSE-NO and CRSE-DATE are present, the process tries to find the record to update it.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Credential Holder Information (hr_crdholdr table)
One record per employee based on social security number.
Defaults:
ACTION_CD = ROLL
Address and phone data are copied from the Employee Master Record based on the Social Security Number.
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Dependent/Beneficiary Benefits (hr_depdbenf table)
One or more records per employee based on Entity, Employee ID, family key, dependent or benefit type, benefit code or type, and begin and end dates.
Defaults/rules:
ACTION_CD - Validated; default is NEW
APPRV_CD01 - Validated; default is SEND
ENTITY_ID - Default is ROOT
ID - Validated in the hr_empmstr table
FAMILY_KEY - Validated in the hr_family table
DPBE_TYPE - Must be either BE or DP
BENECODE - Validated in the hr_bncdtble and must be present if BENETYPE is blank
BENETYPE - Validated in the HR codes and must be present if BENECODE is blank
BEGDT - If left blank, the birthdate is used
ENDDT - Default is 12/31/2050
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Education Information (hr_educinfo table)
One or more records per employee based on Entity, Employee ID, degree, and issue date. If a value is provided in major_cd, it is added to the primary key.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Notes (hr_empnotes table (Insert Only))
One or more records per employee based on Entity and Employee ID.
The table is purged of data and reinserted based on the Employee ID.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Equipment Checklist (hr_equipmnt table (Insert Only))
One or more records per employee based on Entity and Employee ID.
The table is purged of data and reinserted based on the Employee ID.
Equipment Codes are validated.
Fixed Asset (FA) IDs are validated, and a report of missing IDs is generated. The record is still inserted.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
FA_LEDGER = User General Ledger Code
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Evaluation Information (hr_evalinfo table)
One or more records per employee based on Entity, Employee ID, eval_date, eval_type, and position.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Experience Information (hr_exprinfo table)
One or more records per employee based on Entity, Employee ID, experience code, and applied date.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Family and Beneficiary Info (hr_family table)
One or more records per employee based on Entity, Employee ID, and Social Security Number extension.
Defaults/rules:
ACTION_CD - NEW
ENTITY_ID - ROOT
ID - Validated in the hr_empmstr table
FAMILYNAME - Required if inserting a record
SSN_EXT - If blank, the number is generated, and the record is inserted
SAME_ADDR - If Y, the address and phone number are retrieved from the hr_empmstr table
FAMILY_TP - Must be either BENE, BENF, CBRA, DEPN, FAML, or NFAM
MISC_STAT - Validated in the HR codes
RELATION - Required if inserting a record
GENDER - Validated in the HR codes
FAMILY_SSN - Based on HRPY/FAMILY common code and is retrieved from the hr_empmstr if left blank
COUNTRY - Validated in the common codes
COUNTY - Validated in the HR codes
CITY - Validated in the PEUPZP detail table
STATE - Validated in the common codes
ZIP_CODE - Validated in PEUPZP
PHONE_CD - Validated in the common codes
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
FMLA Tracking (hr_fmlatrkg table)
One record per employee based on Entity, Employee ID, fiscal year, start date.
FMLA Start is required for HRUTZZ01 processing of INSERT and UPDATE.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
FMLA Tracking has an additional option called Allow Overlapping Records. If the option is used, then the data file is limited to six records with matching entity-id, employee id, fiscalyr, and fmlastart. The multiples of each column (calendar 2 thru 6 or any other 2-6 column) do not apply.
If there is a 7th duplicate record it will be rejected.
Updates where specific columns 2-6 are desired does not apply. Data for updates is taken from the first of the duplicate rows, essentially the first row in the data file.
The SUMMARY REPORT will show Total Records Read from File being the total records AFTER the grouping of duplicate records.
For instance, a data file with nine rows, seven being duplicates and two being unique will result in a Total Records Read from File like below. Six combined into one record, one record failed, two unique other records for a total of four records counted from the data file.
I 9 Information (hr_i9info table)
One record per employee based on Entity and Employee ID.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Leave Information (hr_leavinfo table)
One or more records per employee based on Entity, Employee ID, leave code, start and end dates.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
License / Certificates (hr_licncert table)
One or more records per employee based on Entity, Employee ID, Issue Date, and License Number.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Skills Table (hr_empskill table (Insert Only))
One or more records per employee based on Entity and Employee ID.
The table is purged of data and reinserted based on the Employee ID.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Employee Supplemental Tracking (hr_emptrac table (Insert Only))
One or more records per employee based on Entity and Employee ID.
The table is purged of data and reinserted based on the Employee ID.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Test Information (hr_emptest table)
One or more records per employee based on Entity, Employee ID, test code, and test date.
Defaults:
ACTION_CD = ROLL
ENTITY_ID = ROOT
CREATE_WHO and UPDATE_WHO = ROLL
CREATE_WHEN and UPDATE_WHEN = current date
Common Code Options
HRRL/ROLLOVER
HRRL/OPTIONS
How to Run the Process (HRUTZZ01)
Before running the process, set up the tail sheet to be archived so you can review it later for statistics, totals, and error reports.
Three questions are asked:
What input file do you want to use?
Which table information do you want to convert?
Do you want to run the conversion in trial mode (debug)?
All other information is taken from the HRRL/ROLLOVER common code. Locate the file you want to use for the conversion. After you select the file, the question field displays the path to the file and is inactive.
The upload may not be able to handle large input files. Check the tail sheet to verify how many records were read, updated, and inserted. If the input file is too large, either split the file into smaller files.
For Trial (Debug) Mode: YES processes all the error checking but does not insert or update the table. NO inserts or updates the table in addition to error checking.