AccumulateBenefitCategories

Accumulate Benefit Categories - Cache

Minor Business Rule

Object Name: B0800034

Parent DLL: CHRM

Location: Client/Server

Language: C

Functional Description

Purpose

The purpose of this function is to store all the benefit categories in JDECache, that are processed 

for an employee in Batch Enrollment, R083800. 


Setup Notes and Prerequisites

Records can be Read, Added, Deleted, or Updated to the cache, depending on Cache Action Code, CACTN, 

passed in. The following is a list of the modes used to select cache processing options:

Input

Processing TypeType

============                                  

Cache Get 1

Cache Add 2

Cache Update 3

Cache Delete 4

Cache Delete All 5

Cache Get Next 6

Cache Add/Update 7 (Do Not Use)

Cache End  8

Cache Close Cursor 9


Return errors through Error Message ID, DTAI.


The cache Key is as follows:

JobNumberA   (from next number server X0010)

szBenefitGroupCategory  
  

The data can be accessed using the full key or a partial key using NumberKeys, NKEYS, to distinguish 
between a full or a partial fetch.  JobNumberA must always be part of the key. 


The Cache Cursor, GENLNG must be past to and from the BSFN.


When adding a record always attempt to Get the record first.  If no error is returned then the record 

already exists and it cannot be added.

Special Logic


Technical Specifications

include the header file b0800034.h

    

Declare Variable     

 IDnJDBReturn;

ID          idReturnValue= ER_SUCCESS;

char        szErrorID[11];           

int         iCacheActionCode;

      

Declare Data Structures

  DSD0800034          dsCacheKey;

DSD0800034          dsSaveData;  

Declare pointers

    HUSER               hUser                    = (HUSER) NULL;

HCACHE              hCacheHandle             = (HCACHE) NULL;

Check for NULL pointers, if there are null pointers set error '4363'


Begin Main Processing

 

Initialization Of DS Structure and Save of Workfields  


Initialize the Behavior

If an error occurs initializing the behavior and if cSuppressErrorMessage does not = '1' then 

set error.

  

   iCacheActionCode=atoi(lpDS->szCacheActionCode);


Initialize the Cache 

Call internal function I0800034_InitCache

If no error initializing cache then Process Action code


If iCacheActionCode past in = 1 (Get) then call internal function 

I0800034_CacheGet.
If iCacheActionCode past in = 2 (Add) then call internal function 

 I0800034_CacheAdd.

If iCacheActionCode past in = 3 (Update) then call internal function

I0800034_CacheUpdate.
If iCacheActionCode past in = 4 (Delete) then call internal function

I0800034_CacheDelete.
If iCacheActionCode past in = 5 (Delete All) then call internal function

I0800034_CacheDeleteAll.

If iCacheActionCode past in = 6 (Get Next) then call internal functionI0800034_CacheGetNext.

If iCacheActionCode past in = 7 (Add Update) then call internal function

I0800034_CacheAddUpdate.

If iCacheActionCode past in = 8 (End) then call JDE function

 JdeCacheTerminateAll.

If iCacheActionCode past in = 9 (Close Cursor) then call internal 

Function I0800034_CloseCursor.
If iCacheActionCode = anything else then Error.


Return value of saved fields after cache processing is completed

szErrorMessageID = szErrorID

cSuppressErrorMessage = cSuppressErrorMessage
    szCacheActionCode = dsSaveData.szCacheActionCode

    mnNumberKeys = mnNumberKeys);



Function Clean Up

Free the Behavior

If the pointer szErrorMessageID is not blank and cSuppressErrorMessage does not = '1' then set error.


Internal functions

Function:  I0800034_InitCache   

Initialize cache for Benefit Categories

Declare Variables

JDECM_RESULT       jdeCacheCode = JDECM_PASSED;
Declare structures

DSD0800034dsCacheKey;

JDECMINDEXSTRUCTIndex[1]; 

Main Processing

Initialize output

SzErrorID = ""

Initialize the cache

Setup And Initialize Cache-Keys to Create Cache once

Set Memory, memset(Index, 0x00, sizeof(JDECMINDEXSTRUCT));


Set the number of segments of the key to = '2'

The first segment of the key is mnJobNumberA

Index->CacheKey[0].nOffset = offsetof(DSD0800034, mnJobnumberA);

Index->CacheKey[1].nOffset = offsetof(DSD0800034, szBenefitGroupCategory); 

Set lphCacheHandle = "B0800034", 

If there is an error szErrorID = ERR_INIT_CACHE



Function:  I0800034_CacheGet   

Declare Variables

JDECM_RESULT       jdeCacheCode = JDECM_PASSED;

int   iNumberOfKeys;

    HJDECURSOR     hCursor        =  (HJDECURSOR) NULL;

   DSD0800034dsCacheData;

BOOLbChangedKey;

Main Processing

Initialize output

Set Memory

memset((void *) (lpdsCacheKey),0x00,sizeof(DSD0800034));
memset((void *) (&dsCacheData),0x00,sizeof(DSD0800034));

szErrorID = ""

Initialize Variables  

MathNumericToInt((LPMATH_NUMERIC) &lpDS-
>mnNumberKeys,(LPINT)&iNumberOfKeys);

Open the Cursor if error then szErrorID = "ERR_OPEN_CURSOR"

If no error Reset Cursor 

If iNumberOfKeys = '0' then Fetch the first record

Else fetch the record matching the keys

If there is an error with the fetch then szErrorID = ERR_FETCH_RECORD

if the Cursor does not = NULL then close the cursor



Function:  I0800034_CacheAdd 

Declare Variables

JDECM_RESULT       jdeCacheCode = JDECM_PASSED;
     int iNumberOfKeys;

HJDECURSOR        hCursor      = (HJDECURSOR) NULL;    
ID                idCacheCursor;                       

Main Processing

Initialize output 

SzErrorID = ""

Set the cache with the number or keys = mnNumberKeys

Set the cursor = idCacheCursor

Copy the memory needed the size of DSD0800034


Add the record the size of DSD0800034

If Add fails then szErrorID = ERR_ADD_RECORD



Function:  I0800034_CacheUpdate   

Declare Variables 

int                iNumberOfKeys;
JDECM_RESULT       jdeCacheCode = JDECM_PASSED;

HJDECURSOR        hCursor      = (HJDECURSOR) NULL;  

   DSD0800034dsCacheData;

ID                idCacheCursor;                       
Main Processing

Initialize output

SzErrorID = ""

Set the cache with the number or keys = mnNumberKeys

Set the cursor = idCacheCursor

Set the memory needed the size of DSD0800034


Fetch the record, if record is found Update the record

If there is an error then szErrorID = ERR_UPDATE_RECORD


Close the Cursor



Function:  I0800034_CacheDelete   

Declare Variables

JDECM_RESULT       jdeCacheCode = JDECM_PASSED;

int   iNumberOfKeys;

HJDECURSOR       hCursor       = (HJDECURSOR) NULL;  

Main Processing

Initialize Variables

SzErrorID = ""

Set the cache with the number or keys = mnNumberKeys


If Number Of Keys = 0 Then call internal function I0800034_CacheDeleteAll

else

Initialize the cursor

Set the memory the size of DSD0800034

Fetch the record

If fetch is successful then delete the record

If there is an error deleting then szErrorID = ERR_DELETE_RECORD

If there is an error fetching then szErrorID = ERR_FETCH_RECORD


Close the cursor



Function:  I0800034_CacheDeleteAll   

Declare Variables

JDECM_RESULT       jdeCacheCode = JDECM_PASSED;

int   iNumberOfKeys;

HJDECURSOR       hCursor       = (HJDECURSOR) NULL;  


Main Processing

Initialize input and output

SzErrorID = ""

Copy the memory needed the size of DSD0800034

Set the cache with the number or keys = mnNumberKeys


Open the Cursor

Delete all records

If there is an error on delete then szErrorID = ERR_DELETE_RECORD


 Close Cursor



Function:  I0800034_CacheGetNext   

Notes:Assumption is made this function will be performed until the

Cache Index is no longer equal to the input index. If this function is prematurely ended, the cursor 

will have to be closed using function I0800034_CloseCursor, or memory leaks will result from the 

cursor being left open.

 

Declare Variables

JDECM_RESULTjdeCacheCode = JDECM_PASSED;

intiNumberOfKeys;

BOOLbMatchKey=FALSE;

BOOLbChangedKey;

    HJDECURSOR     hCursor        = (HJDECURSOR) NULL;

    DSD0800034dsCacheData;

    ID                idCacheCursor;                       

Main Processing

Initialize output 

SzErrorID = ""

Set the memory needed the size of DSD0800034

Initialize Variables  

Set the cache with the number or keys = mnNumberKeys


Set cursor for either initial fetch or subsequent fetches

If idCacheCursor = 0L then this is a subsequent search 

Open Cursor

Copy the memory needed the size of DSD0800034
Fetch the Next record

if hCursor does not = NULL then fetch the next record

If idCacheCursor <> 0L fetch the first record

If the fetch was successful 

If iNumberOfKeys > 0 then call I0800034_ChangedKey and check that the keys match
If the keys do not match then szErrorID = ERR_FETCH_RECORD

If hCursor does not = NULL then close the cursor

set idCacheCursor   = 0L



Function:  I0800034_CacheAddUpdate 

DO NOT USE THIS FUNCTION



Function:  I0800034_CloseCursor   

Declare Variables    

HJDECURSOR         hCursor      = (HJDECURSOR) NULL;
Main Processing

If idCacheCursor does not equal 0L then close cursor 

Set idCacheCursor = 0L



Function:  I0800034_ChangedKey   

Test to see if the key matches the key in cache

If it has changed then bChangedKey = True

Else

bChangedKey = FALSE;


End of Internal functions







Data Structure

D0800034 - Accumulate Benefit Categories - Cache

Parameter NameData ItemData TypeReq/OptI/O/Both
mnJobnumberAJOBSMATH_NUMERICREQINPUT

The job number (work station ID) which executed the particular job.

mnNumberKeysNKEYSMATH_NUMERICREQINPUT

The number of keys in an index that will be used to retrieve, delete, or update a record.

szCacheActionCodeCACTNcharREQINPUT

A code that indicates the activity you want to perform. Valid codes:     o Get - Retrieve the cache element     o Add - Add a cache element     o 
Update - Update a cache element     o Delete - Delete a cache element     o Delete All - Delete all cache elements     o Get Next - Retrieve the 
next cache element     o Add/Update - Add a cache element if it does not exist; Update a cache element if it does exist     o Terminate - 
Terminate Cache

cSuppressErrorMessageSUPPScharOPTINPUT

A flag indicating whether or not runtime error messaging will occur when an error message is issued from a business function.        0 = allow 
runtime error message handling.        1 = suppress runtime error message handling.

szErrorMessageIDDTAIcharOPTOUTPUT

A code that identifies and defines a unit of information. It is an alphanumeric code up to 8 characters long that does not allow blanks or 
special characters such as %, &, or +. You create new data items using system codes 55-59. You cannot change the alias.

idCacheCursorGENLNGIDREQBOTH

General purpose ID variable.

szBenefitGroupCategorySBGRcharOPTBOTH

The category of a benefit group. The category is used to group benefit plans according to the type and/or rule. For 
example: MEDICAL Required Medical Selections   DENTAL Optional Dental Selections   LIFE Required Life Ins Selections Valid categories are set up in the Generic 
Rate and Message table (F00191) for system 08/type SG. Associated text for categories is stored in the General Message Detail table 
(F00192). For more information, see program P00191.

Related Functions

None

Related Tables

None