dataEvent_record_AfterDeleteRowWithConcurrentAccess

Function called after deleting a row with concurrent access.

Syntax

PUBLIC FUNCTION dataEvent_record_AfterDeleteRowWithConcurrentAccess( 
   errNo INTEGER, 
   errMsg STRING, 
   p_dataT0 record-type)
   RETURNS (INTEGER, STRING)

The function has these parameters:

  1. errNo. This is an SQLCA.SQLCODE error.
  2. errMsg. This is the SQLERRMESSAGE message.
  3. p_dataT0. This is a RECORD containing a row of data. It is defined according to the structure of the database table.
Returns values:
  1. An integer is returned with the SQLCA.SQLCODE error number. Codes are defined as constants in the libdbappSql and libdbappCore libraries. The errors that are relevant to this function are shown in Table 1.
    Table 1. SQLCA.SQLCODE
    Description Constant Value
    Success ERROR_SUCCESS 0
    Failure ERROR_FAILURE -1
    Concurrent access failure ERROR_CONCURRENT_ACCESS_FAILURE -2
    Concurrent access not found ERROR_CONCURRENT_ACCESS_NOTFOUND -3
    Cascade delete error ERROR_DELETE_CASCADE_ROW_USED -4
  2. A string is returned with the SQLERRMESSAGE error message.

Usage

When you select the After Delete Row With ConcurrentAccess property for the creation of the event, a function shell is created. Enter your code in the function.

Use this function to perform some operation, typically a SQL operation, on another table. For example, you could record details about the deleted row of data to a log table. This function is called after deleting a row in the database where access is concurrenta and a table can be locked.

Example: AfterDeleteRowWithConcurrentAccess

This example uses the After Delete Row With ConcurrentAccess code event for the Account table in the OfficeStore demo.

In the example a row of data referenced by the variable p_dataT0 is written to a log table. It is assumed that you have created the log table before saving the row to it.

The log table in the example has the following schema:
  • an "id" field that is auto incremented
  • a "date" timestamp field to record the date and time of the operation
  • a "type" integer field to record the operation (Update/Insert/Delete)
  • a "data" field to record a copy of all field values from the account table
PUBLIC FUNCTION dataEvent_recAccount_AfterDeleteRowWithConcurrentAccess(errNo INTEGER, errMsg STRING, 
            p_dataT0 RECORD LIKE account.*)
    RETURNS (INTEGER, STRING)

    DEFINE log RECORD LIKE log.*
    DISPLAY "dataEvent_recAccount_AfterDeleteRowWithConcurrentAccess (Row scope) is raised"
    LET log.id = NULL
    LET log.date = util.Datetime.getCurrentAsUTC()
    LET log.type = C_ACTION_DELETE
    LET log.data = uniqueKey.account_userid, " email=", l_data.email, 
                    "firstname=", l_data.firstname      
    TRY
        INSERT INTO log VALUES log.*
    CATCH
        LET errNo = ERROR_FAILURE
        LET errMsg = " - AfterDeleteRowWithConcurrentAccess failed to insert log ", log.*
    END TRY
    DISPLAY "dataEvent_recAccount_AfterDeleteRowWithConcurrentAccess (Row scope) is exited"

    RETURN errNo, errMsg
END FUNCTION