ihResultSetBuffer | input | handle | (buffer) handle to the temp-table that must be updated |
icClass | input | character | shortname of the business class from which custom fields must be read |
icTable | input | character | database table name from which custom fields must be read |
icKeyColumn | input | character | name of the column in the result set temp-table that contains the value of primary key of the objects for which custom fields must be read |
icCustomFieldColumn | input | character | name of the column in the result set temp-table where custom field values will be stored |
icCustomBusinessField | input | character | The can be left blank. You can specify here the name of the custom busininess fields if you want the value of just 1 of them. |
oiReturnStatus | output | integer | Return status of the method. |
if oiReturnStatus = 0 then oiReturnStatus = -98. if ihResultSetBuffer:type <> "BUFFER":U then do: <M-13 run SetMessage (input 'Invalid buffer handle ($1)':U (icMessage), input program-name(1) (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'S':U (icType), input 3 (iiSeverity), input '' (icRowid), input 'BLF-259':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input '' (icFcContext), output viFcReturnSuper (oiReturnStatus)) in business> assign oiReturnStatus = -3. return. end. assign vhCustom = ihResultSetBuffer:buffer-field (icCustomFieldColumn) no-error. if vhCustom <> ? then do: viKeyCount = num-entries(icKeyColumn). do viFcCount1 = 1 to viKeyCount: vhKey[viFcCount1] = ihResultSetBuffer:buffer-field (entry(viFcCount1,icKeyColumn)) no-error. if vhKey[viFcCount1] = ? then do: viKeyCount = 0. leave. end. end. end. if viKeyCount = 0 then do: <M-14 run SetMessage (input 'Invalid column name ($1)':U (icMessage), input program-name(1) (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'S':U (icType), input 3 (iiSeverity), input '' (icRowid), input 'BLF-260':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input '' (icFcContext), output viFcReturnSuper (oiReturnStatus)) in business> assign oiReturnStatus = -3. return. end. /* ================================================================= */ /* Retrieve field name of active custom fields. */ /* ================================================================= */ <M-15 run CustomFields (input icTable (icTableName), output vcFieldNames (ocFieldNames), output vcFieldLabels (ocFieldLabels), output viFcReturnSuper (oiReturnStatus)) in business> if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then return. if vcFieldNames = "" then do: if oiReturnStatus = -98 then oiReturnStatus = 0. return. end. assign vlUseSingleItem = false. if icCustomBusinessField <> ? and icCustomBusinessField <> '' then do viFcCount1 = 1 to num-entries(vcFieldNames): if entry(viFcCount1,vcFieldNames) = icCustomBusinessField then do: assign vcFieldNames = icCustomBusinessField vlUseSingleItem = true. leave. end. end. /* ================================================================= */ /* Retrieve field name of primary index fields. */ /* ================================================================= */ <M-16 run BusinessClassActions (input icClass (icClassShortname), input 'START+OPEN':U (icAction), input no (ilSubtransaction), input-output viOpenC (biClassOpenCount), input-output vhBC (bhClassInstanceHandle), input-output viBC (biClassInstanceId), input '' (icDraftReference), output viFcReturnSuper (oiReturnStatus)) in business> if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then return. assign vhFcComponent = vhBC. <M-8 run GetKeyFields (input-output icTable (bcTableName), output vcPKey (ocPrimaryKey), output vcWork (ocAlternateKey), output vcWork (ocObjectID), output vcWork (ocObjectStatus), output viLocalReturn (oiReturnStatus)) in database> <M-17 run BusinessClassActions (input icClass (icClassShortname), input 'CLOSE+STOP':U (icAction), input no (ilSubtransaction), input-output viOpenC (biClassOpenCount), input-output vhBC (bhClassInstanceHandle), input-output viBC (biClassInstanceId), input '' (icDraftReference), output viFcReturnSuper (oiReturnStatus)) in business> if viLocalReturn <> 0 then oiReturnStatus = viLocalReturn. if viLocalReturn < 0 then return. if num-entries(vcPKey) <> viKeyCount then do: <M-18 run SetMessage (input 'Invalid key column ($1)':U (icMessage), input icKeyColumn (icArguments), input '' (icFieldName), input '' (icFieldValue), input 'S':U (icType), input 3 (iiSeverity), input '' (icRowid), input 'BLF-261':U (icFcMsgNumber), input '' (icFcExplanation), input '' (icFcIdentification), input '' (icFcContext), output viFcReturnSuper (oiReturnStatus)) in business> assign oiReturnStatus = -3. return. end. /* ================================================================= */ /* Update all records in resultset. */ /* ================================================================= */ vcWork = "for each ":U + ihResultSetBuffer:name. do viFcCount1 = 1 to viKeyCount: vcWork = vcWork + " by ":U + ihResultSetBuffer:name + ".":U + entry(viFcCount1,icKeyColumn). end. create query vhQuery in widget-pool "non-persistent". vhQuery:forward-only = yes. vhQuery:set-buffers(ihResultSetBuffer). assign vlFcOk = vhQuery:query-prepare (vcWork). if vlFcOk then assign vlFcOk = vhQuery:query-open(). if vlFcOk = no then return. vhQuery:get-first(). DW_block: do while not vhQuery:query-off-end: vlFcOk = yes. do viFcCount1 = 1 to viKeyCount: vcWork = string (vhKey[viFcCount1]:buffer-value). if vcWork = ? then vcWork = "". vcKeyValue = (if viFcCount1 = 1 then "" else vcKeyValue + chr(2)) + vcWork. if vcWork <> "" and vcWork <> "0":U then vlFcOk = no. end. if vcKeyValue <> vcOldValue then do: if vlFcOk then assign vcFieldValues = "". else do: do viFcCount1 = 1 to num-entries(vcPKey): assign vcWork = (if viFcCount1 = 1 then "for each ":U + icTable + " where ":U else vcWork + " and ":U) + icTable + ".":U + entry(viFcCount1,vcPKey) + " = ":U + (if vhKey[viFcCount1]:data-type = "character":U then "'":U + entry(viFcCount1,vcKeyValue,chr(2)) + "'":U else if entry(viFcCount1,vcKeyValue,chr(2)) = "" then "?":U else entry(viFcCount1,vcKeyValue,chr(2))). end. <M-19 run StartPersistence (output vhFcComponent (ohPersistence), output viFcReturnSuper (oiReturnStatus)) in business> if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave DW_block. <M-12 run ReadDirect (input icTable (icTableName), input vcWork (icPrepare), input vcFieldNames (icFieldList), output vcWork (ocValueList), input {&TARGETPROCEDURE} (ihClass), output viFcReturnSuper (oiReturnStatus)) in persistence> if viFcReturnSuper <> 0 then oiReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave DW_block. if vlUseSingleItem = true then assign vcFieldValues = vcWork. else do viFcCount1 = 1 to num-entries(vcFieldNames): assign vcFieldValues = (if viFcCount1 = 1 then "" else vcFieldValues + chr(2)) + entry(viFcCount1,vcFieldNames) + chr(2) + entry(viFcCount1,vcFieldLabels,chr(2)) + chr(2) + entry(viFcCount1,vcWork,chr(2)). end. end. end. vhCustom:buffer-value = vcFieldValues. vhQuery:get-next(). end. vhQuery:query-close(). delete object vhQuery. if oiReturnStatus = -98 then oiReturnStatus = 0.