dataEvent_record_AfterInsertRow
Function called after inserting row.
Syntax
PUBLIC FUNCTION dataEvent_record_AfterInsertRow(
errNo INTEGER,
errMsg STRING,
uniqueKey record-type)
RETURNS (INTEGER, STRING)
The function has these parameters:
errNo
. This is anSQLCA.SQLCODE
error.errMsg
. This is theSQLERRMESSAGE
message.uniqueKey
. This is aRECORD
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.
- 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 - A string with the
SQLERRMESSAGE
error message.
Usage
When you select the After Insert Row property for the creation of the event, a function shell is created. Enter your code in the function.
This function is called after inserting a row in the database. Use this function to perform some operation, typically a SQL operation, on another table. For example, you may need to record details about the inserted row of data in a log table.
Example: After Insert Row
This example uses the After Insert 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
.
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.
# AccountForm.4gl
-- import user-defined functions
IMPORT FGL myAccountFunc
PUBLIC FUNCTION dataEvent_recAccount_AfterInsertRow(errNo INTEGER, errMsg STRING,
uniqueKey recAccount_br_uk_type)
RETURNS (INTEGER, STRING)
DEFINE log RECORD LIKE log.*
DEFINE l_data RECORD LIKE account.*
CALL libdbappCore.log(C_LOG_INFO, "dataEvent_recAccount_AfterInsertRow (Row scope) is raised")
SELECT * INTO l_data.* FROM account WHERE @userid = uniqueKey.account_userid
CALL myAccountFunc.writeDataToLog(l_data,libdbappUI.C_ACTION_INSERT) RETURNING errNo
IF errNo = libdbappCore.ERROR_FAILURE THEN
LET errMsg = " - AfterInsertRow failed to insert log "
END IF
CALL libdbappCore.log(C_LOG_INFO, "dataEvent_recAccount_AfterInsertRow (Row scope) is exited")
RETURN errNo, errMsg
END FUNCTION
For more information on the libdbappCore.log()
function,
go to DBAPPDEBUG and the debug level API.
writeDataToLog
In this section there is an example of the function writeDataToLog
called to write data to a log table.
- 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
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.
# MyAccountFunc.4gl
IMPORT FGL libdbappCore
FUNCTION writeDataToLog(dataRec RECORD LIKE account.*, opType INTEGER)
RETURNS (INTEGER)
DEFINE 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 = libdbappCore.ERROR_FAILURE
END TRY
RETURN errNo
END FUNCTION