DataEvent_record_AfterUpdateRow

Function called after updating row.

Syntax

PUBLIC FUNCTION dataEvent_record_AfterUpdateRow(
   errNo INTEGER, 
   errMsg STRING, 
   uniqueKey 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. uniqueKey. This is a RECORD type defined in the BAM-generated common file (my_entity_common.4gl). It includes the unique key fields from the schema of the database table.
Returns values:
  1. An integer specifying the SQLCA.SQLCODE error number. Codes are defined as constants in the libdbappSql and libdbappCore files in the libdbapp library. If the code is a negative number, an SQL error has occurred. The errors that are relevant in this function are shown in the table.
    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
  2. A string is returned with the SQLERRMESSAGE error message.

Usage

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

This function is called after updating a row in the database. Use this function to perform some operation, typically a SQL operation, on another table. For example, you could record details about the updated row of data in a log table.

Example: After Update Row

This example uses the After Update Row code event for the Account table in the OfficeStore demo.

In the example a row of data is written to a log table with a call to the function writeDataToLog.

The writeDataToLog function references two parameters:
  • The record that stores the row of data from the account table.
  • The operation type of the code event function in a reference to the relevant libdbappUI constant.
The parameters hold values written to the log table.
PUBLIC FUNCTION dataEvent_recAccount_AfterUpdateRow(errNo INTEGER, errMsg STRING, 
                uniqueKey recAccount_br_uk_type)
    RETURNS (INTEGER, STRING)

    DEFINE l_data RECORD LIKE account.*
    
    DISPLAY "dataEvent_recAccount_AfterUpdateRow (Row scope) is raised"

    SELECT * INTO l_data.* FROM account WHERE @userid = uniqueKey.account_userid
    CALL myAccountFunc.writeDataToLog(l_data,libdbappUI.C_ACTION_UPDATE) RETURNING errNo
    IF errNo = libdbappCore.ERROR_FAILURE THEN
       LET errMsg = " - AfterUpdateRow failed to insert log " 
    END IF

    DISPLAY "dataEvent_recAccount_AfterUpdateRow (Row scope) is exited"

    RETURN errNo, errMsg
END FUNCTION

In this section there is an example of the function writeDataToLog called to write data to a log table.

All functions that you would reuse across forms and applications would reside in a module you create. To use these functions in your project, you would import your module into the entity module (for example, AccountForm.4gl) using the IMPORT FGL statement.

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" field to record the operation (Update/Insert/Delete)
  • a "data" field to record a copy of all field values from the account table
FUNCTION writeDataToLog(dataRec, opType) 
  RETURNS (INTEGER)
  DEFINE dataRec RECORD LIKE account.*
  DEFINE opType, errNo INTEGER
  DEFINE recLog RECORD LIKE log.*
  DEFINE t TEXT   
  
  LOCATE t IN MEMORY  
  LET recLog.id = NULL
  LET recLog.date = CURRENT  
  LET recLog.type = opType
  LET t = SFMT("id = %1 email = %2 firstname = %3 lastname = %4  acstatus = %5  addr1 = %6  addr2= %7 
               city = %8  state = %9 zip = %10 country = %11 phone = %12",dataRec.userid, dataRec.email, 
               dataRec.firstname, dataRec.lastname,dataRec.acstatus, dataRec.addr1, dataRec.addr2, 
               dataRec.city,dataRec.state ,dataRec.zip,dataRec.country, dataRec.phone)  
  LET recLog.data = t
  TRY
     INSERT INTO log VALUES (recLog.*)
  CATCH
     DISPLAY "SQL ERROR: ", sqlca.sqlcode
     LET errNo = -1
  END TRY
  RETURN errNo
 
END FUNCTION