| bcPrimaryKey | input-output | character | The primary key value of the main table of the object. In case of a combined primary key, the different values should be separated with chr(2) |
| bcAlternateKey | input-output | character | The alternate key value of the main table of the object. In case of a combined alternate key, the different values should be separated with chr(2) |
| bcRowid | input-output | character | The rowid of the main table record of the object. |
| biObjectId | input-output | integer | Identity field of the main table of the object. |
| ocObjectStatusValues | output | character | chr(2) seperated list of value of object status fields |
| ocObjectStatusFieldNames | output | character | Comma seperated list of field name of object status fields |
| ocPrimaryKeyFieldNames | output | character | List of primary key fields of the main table of the object. This is a comma separated list. |
| ocAlternateKeyFieldNames | output | character | List of alternate key fields (names) of the main table of the object. This is a comma separated list. |
| ocAlternateKeyFieldLabels | output | character | List of alternate key fields (translated labels) of the main table of the object. This is a chr(2) separated list. |
| oiReturnStatus | output | integer | Return status of the method. |
BLF
if oiReturnStatus = 0
then oiReturnStatus = -98.
/* ================================================================= */
/* First get key field names (and convert to business field name) */
/* ================================================================= */
<M-5 run GetKeyFields (input-output vcMainTable (bcTableName),
output ocPrimaryKeyFieldNames (ocPrimaryKey),
output ocAlternateKeyFieldNames (ocAlternateKey),
output vcIdentityName (ocObjectID),
output ocObjectStatusFieldNames (ocObjectStatus),
output viFcReturnSuper (oiReturnStatus)) in business>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
vcPKnames = ocPrimaryKeyFieldNames.
do viFcCount1 = 1 to num-entries(ocPrimaryKeyFieldNames):
entry(viFcCount1,ocPrimaryKeyFieldNames) = "t":U + vcMainTable + ".":U + entry(viFcCount1,ocPrimaryKeyFieldNames).
end.
vcAKnames = ocAlternateKeyFieldNames.
do viFcCount1 = 1 to num-entries(ocAlternateKeyFieldNames):
entry(viFcCount1,ocAlternateKeyFieldNames) = "t":U + vcMainTable + ".":U + entry(viFcCount1,ocAlternateKeyFieldNames).
end.
vcFieldList = "rowid,":U + vcPKnames.
if vcAKnames <> "" then vcFieldList = vcFieldList + ",":U + vcAKnames.
if vcIdentityName <> "" then vcFieldList = vcFieldList + ",":U + vcIdentityName.
if ocObjectStatusFieldNames <> "" then vcFieldList = vcFieldList + ",":U + ocObjectStatusFieldNames.
empty temp-table tBusinessFields.
run value ("appinfo/":U + lc(vcFcComponentName) + "_bf.p":U) (input table tBusinessFields by-reference, input vhFcSuper, output viFcReturnSuper).
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
/* ================================================================= */
/* Get key labels */
/* ================================================================= */
if ocAlternateKeyFieldNames <> ""
then do viFcCount1 = 1 to num-entries(ocAlternateKeyFieldNames):
find first tBusinessFields where
tBusinessFields.tcFcFieldName = entry(viFcCount1,ocAlternateKeyFieldNames) no-error.
assign ocAlternateKeyFieldLabels = ocAlternateKeyFieldLabels
+ (if viFcCount1 = 1 then "" else chr(2))
+ (if available tBusinessFields
then tBusinessFields.tcColumnLabel
else "").
end.
/* ================================================================= */
/* Build query for database access. */
/* ================================================================= */
if bcPrimaryKey = ""
or bcPrimaryKey = ?
then if bcAlternateKey = ""
or bcAlternateKey = ?
or ocAlternateKeyFieldNames = ""
then if bcRowid = ""
or bcRowid = ?
then if biObjectId = 0
or biObjectId = ?
or vcIdentityName = ""
then assign vcDBQuery = "".
else assign vcDBQuery = "for each ":U + vcMainTable + " where ":U + vcMainTable
+ ".":U + vcIdentityName + " = ":U + string(biObjectId)
vcTTQuery = "for each t_o":U + vcMainTable + " where t_o":U + vcMainTable
+ ".":U + vcIdentityName + " = ":U + string(biObjectId).
else assign vcDBQuery = "for each ":U + vcMainTable + " where rowid(":U
+ vcMainTable + ") = to-rowid('":U + bcRowid + "')":U
vcTTQuery = "for each t_o":U + vcMainTable + " where t_o":U
+ vcMainTable + ".tc_Rowid = '":U + bcRowid + "'":U.
else do:
/* Check key names against key values */
if num-entries(ocAlternateKeyFieldNames) <> num-entries(bcAlternateKey,chr(2))
then do:
<M-4 run SetMessage (input 'Invalid key value ($1) for key ($2)':U (icMessage),
input replace (bcAlternateKey,chr(2),'|':U) + chr(2) + ocAlternateKeyFieldNames (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input 'S':U (icType),
input 3 (iiSeverity),
input '' (icRowid),
input 'BLF-302':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in database>
assign oiReturnStatus = -3.
return.
end.
do viFcCount1 = 1 to num-entries(ocAlternateKeyFieldNames):
find first tBusinessFields where
tBusinessFields.tcFcFieldName = entry(viFcCount1,ocAlternateKeyFieldNames) no-error.
if available tBusinessFields
then vcDataType = tBusinessFields.tcDataType.
else vcDataType = "i":U.
vcDBQuery = vcDBQuery
+ " and ":U + vcMainTable + ".":U
+ entry(viFcCount1,vcAKnames) + " = ":U
+ (if vcDataType = "c":U then "'":U else "")
+ (if vcDataType = "t":U
and length(entry(viFcCount1,bcAlternateKey,chr(2)),"CHARACTER":U) = 8
then "date(":U + substring(entry(viFcCount1,bcAlternateKey,chr(2)),5,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcAlternateKey,chr(2)),7,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcAlternateKey,chr(2)),1,4,"CHARACTER":U) + ")":U
else entry(viFcCount1,bcAlternateKey,chr(2)))
+ (if vcDataType = "c":U then "'":U else "").
vcTTQuery = vcTTQuery
+ " and t_o":U + vcMainTable + ".":U
+ entry(viFcCount1,vcAKnames) + " = ":U
+ (if vcDataType = "c":U then "'":U else "")
+ (if vcDataType = "t":U
and length(entry(viFcCount1,bcAlternateKey,chr(2)),"CHARACTER":U) = 8
then "date(":U + substring(entry(viFcCount1,bcAlternateKey,chr(2)),5,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcAlternateKey,chr(2)),7,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcAlternateKey,chr(2)),1,4,"CHARACTER":U) + ")":U
else entry(viFcCount1,bcAlternateKey,chr(2)))
+ (if vcDataType = "c":U then "'":U else "").
end.
vcDBQuery = "for each ":U + vcMainTable + " where":U + substring(vcDBQuery,5,-1,"CHARACTER":U).
vcTTQuery = "for each t_o":U + vcMainTable + " where":U + substring(vcTTQuery,5,-1,"CHARACTER":U).
end.
else do:
/* Check key names against key values */
if num-entries(ocPrimaryKeyFieldNames) <> num-entries(bcPrimaryKey,chr(2))
then do:
<M-12 run SetMessage (input 'Invalid key value ($1) for key ($2)':U (icMessage),
input replace (bcPrimaryKey,chr(2),'|':U) + chr(2) + ocPrimaryKeyFieldNames (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input 'S':U (icType),
input 3 (iiSeverity),
input '' (icRowid),
input 'BLF-303':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in database>
assign oiReturnStatus = -3.
return.
end.
do viFcCount1 = 1 to num-entries(ocPrimaryKeyFieldNames):
find first tBusinessFields where
tBusinessFields.tcFcFieldName = entry(viFcCount1,ocPrimaryKeyFieldNames) no-error.
if available tBusinessFields
then vcDataType = tBusinessFields.tcDataType.
else vcDataType = "i":U.
vcDBQuery = vcDBQuery
+ " and ":U + vcMainTable + ".":U
+ entry(viFcCount1,vcPKnames) + " = ":U
+ (if vcDataType = "c":U then "'":U else "")
+ (if vcDataType = "t":U
and length(entry(viFcCount1,bcPrimaryKey,chr(2)),"CHARACTER":U) = 8
then "date(":U + substring(entry(viFcCount1,bcPrimaryKey,chr(2)),5,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcPrimaryKey,chr(2)),7,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcPrimaryKey,chr(2)),1,4,"CHARACTER":U) + ")":U
else entry(viFcCount1,bcPrimaryKey,chr(2)))
+ (if vcDataType = "c":U then "'":U else "").
vcTTQuery = vcTTQuery
+ " and t_o":U + vcMainTable + ".":U
+ entry(viFcCount1,vcPKnames) + " = ":U
+ (if vcDataType = "c":U then "'":U else "")
+ (if vcDataType = "t":U
and length(entry(viFcCount1,bcPrimaryKey,chr(2)),"CHARACTER":U) = 8
then "date(":U + substring(entry(viFcCount1,bcPrimaryKey,chr(2)),5,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcPrimaryKey,chr(2)),7,2,"CHARACTER":U)
+ ",":U + substring(entry(viFcCount1,bcPrimaryKey,chr(2)),1,4,"CHARACTER":U) + ")":U
else entry(viFcCount1,bcPrimaryKey,chr(2)))
+ (if vcDataType = "c":U then "'":U else "").
end.
vcDBQuery = "for each ":U + vcMainTable + " where":U + substring(vcDBQuery,5,-1,"CHARACTER":U).
vcTTQuery = "for each t_o":U + vcMainTable + " where":U + substring(vcTTQuery,5,-1,"CHARACTER":U).
end.
/* clean up */
empty temp-table tBusinessFields.
/* ================================================================= */
/* Get key values */
/* ================================================================= */
if vcDBQuery = ""
then vcTTQuery = "for each t_o":U + vcMainTable.
/* first check if record is already loaded */
<M-15 run ReadTable (input 't_o':U + vcMainTable (icTableName),
input vcTTQuery (icQuery),
input 'tc_':U + vcFieldList (icFieldNames),
input no (ilConvertToDisplayFormat),
output vcValueList (ocFieldValues),
output viFcReturnSuper (oiReturnStatus)) in database>
if vcValueList = ""
and vcDBQuery <> ""
then do:
/* if not, read from database */
<M-13 run StartPersistence (output vhFcComponent (ohPersistence),
output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
<M-14 run ReadDirect (input vcMainTable (icTableName),
input vcDBQuery (icPrepare),
input vcFieldList (icFieldList),
output vcValueList (ocValueList),
input {&TARGETPROCEDURE} (ihClass),
output viFcReturnSuper (oiReturnStatus)) in persistence>
vcValueList = replace(vcValueList,chr(2),chr(3)).
end.
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
if vcValueList <> ""
and vcValueList <> ?
then do:
bcRowid = entry(1,vcValueList,chr(3)).
bcPrimaryKey = "".
do viFcCount1 = 1 to num-entries(vcPKnames):
if viFcCount1 > 1 then bcPrimaryKey = bcPrimaryKey + chr(2).
bcPrimaryKey = bcPrimaryKey
+ entry(lookup(entry(viFcCount1,vcPKnames),vcFieldList),vcValueList,chr(3)).
end.
bcAlternateKey = "".
if vcAKnames <> ""
then do viFcCount1 = 1 to num-entries(vcAKnames):
if viFcCount1 > 1 then bcAlternateKey = bcAlternateKey + chr(2).
bcAlternateKey = bcAlternateKey
+ entry(lookup(entry(viFcCount1,vcAKnames),vcFieldList),vcValueList,chr(3)).
end.
biObjectId = 0.
if vcIdentityName <> ""
then biObjectId = integer(entry(lookup(vcIdentityName,vcFieldList),vcValueList,chr(3))) no-error.
if ocObjectStatusFieldNames <> ""
then do viFcCount1 = 1 to num-entries(ocObjectStatusFieldNames):
if viFcCount1 > 1 then ocObjectStatusValues = ocObjectStatusValues + chr(2).
ocObjectStatusValues = ocObjectStatusValues
+ entry(lookup(entry(viFcCount1,ocObjectStatusFieldNames),vcFieldList),vcValueList,chr(3)).
entry(viFcCount1,ocObjectStatusFieldNames) = "t":U + vcMainTable + ".":U + entry(viFcCount1,ocObjectStatusFieldNames).
end.
end.
if oiReturnStatus = -98
then oiReturnStatus = 0.