| icTableName | input | character | |
| icPrepare | input | character | Progress for each statement defining what record(s) must be copied. |
| icFieldList | input | character | Comma seperated list of field names to update. This list should always contain at least one field of every unique index defined on the updated table. |
| icFieldListDataTypes | input | character | |
| icUpdateValue | input | character | chr(2) seperated list of values to write to the fields of icFieldList. The same value(s) will be written to each record to update. |
| ihClass | input | handle | |
| icUserLogin | input | character | |
| oiReturnStatus | output | integer | Return status of the method. |
QadFinancials
if transaction = no
then do:
<M-17 run ErrorMessage
(input 'No transaction was started before writing to the database.':U (icMessage),
input '' (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
assign oiReturnStatus = -3.
return.
end.
assign oiReturnStatus = -98
vgDebugTime = etime
viFields = num-entries(icFieldList).
create temp-table vhCopyTable in widget-pool "non-persistent".
vhCopyTable:create-like(icTableName).
vhCopyTable:temp-table-prepare("z":U + icTableName).
vhCopyBuffer = vhCopyTable:default-buffer-handle.
vhCopyBuffer:buffer-create().
create buffer vhTargetBuffer for table icTableName in widget-pool "non-persistent".
if can-do(vcDisableLoadTriggersFor,icTableName)
then vhTargetBuffer:disable-load-triggers(false).
create buffer vhBuffer for table icTableName in widget-pool "non-persistent".
create query vhQuery in widget-pool "non-persistent".
vhQuery:forward-only = yes.
vhQuery:set-buffers(vhBuffer).
assign vlFcOk = vhQuery:query-prepare (icPrepare) no-error.
if vlFcOk
then assign vlFcOk = vhQuery:query-open() no-error.
if not vlFcOk
then do:
publish "Logging.DatabaseAccess"
("read ":U + icTableName + chr(10) +
icPrepare + chr(10) + "FAILED":U, ?).
<M-18 run ErrorMessage
(input #T-2'Invalid database query ($1).':255(88)T-2# (icMessage),
input icPrepare (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
assign oiReturnStatus = -3.
return.
end.
vhQuery:get-first(no-lock).
do while not vhQuery:query-off-end:
vhCopyBuffer:buffer-copy(vhBuffer).
do viFieldCount = 1 to viFields:
assign vhField = ?.
assign vhCopyField = vhCopyBuffer:buffer-field(entry(viFieldCount,icFieldList))
vhField = vhBuffer:buffer-field(entry(viFieldCount,icFieldList)) no-error.
if vhField = ?
then do:
<M-19 run ErrorMessage
(input 'Invalid field ':U + entry(viFieldCount,icFieldList) (icMessage),
input '' (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
assign oiReturnStatus = -3.
return.
end.
case vhField:data-type:
when "character":U
then assign vhCopyField:buffer-value = entry(viFieldCount,icUpdateValue,chr(2)).
when "date":U
then assign vhCopyField:buffer-value = date(entry(viFieldCount,icUpdateValue,chr(2))).
when "decimal":U
then assign vdAB =
(if entry(viFieldCount,icUpdateValue,chr(2)) begins "Sequence:":U
then <M-16 GetNextDecimalValue
(input substring(entry(viFieldCount,icUpdateValue,chr(2)),10,-1,'CHARACTER':U) (icsequence)) in Progress>
else decimal(entry(viFieldCount,icUpdateValue,chr(2))))
vhCopyField:buffer-value = vdAB.
when "integer":U
then assign viFcCount2 =
(if entry(viFieldCount,icUpdateValue,chr(2)) begins "Sequence:":U
then <M-15 GetNextValue (input substring(entry(viFieldCount,icUpdateValue,chr(2)),10,-1,'CHARACTER':U) (icSequence)) in Progress>
else integer(entry(viFieldCount,icUpdateValue,chr(2))))
vhCopyField:buffer-value = viFcCount2.
when "logical":U
then assign vhCopyField:buffer-value = (entry(viFieldCount,icUpdateValue,chr(2)) = "true":U).
otherwise do:
return.
end.
end case.
end.
vhTargetBuffer:buffer-create().
vhTargetBuffer:buffer-copy(vhCopyBuffer).
publish "Logging.DatabaseAccess"
("create ":U + icTableName, vhTargetBuffer).
assign viReadCount = viReadCount + 1.
vhQuery:get-next(no-lock).
end.
publish "Logging.DatabaseAccess"
("read ":U + icTableName + chr(10) +
icPrepare + chr(10) +
"Record count=":U + string(viReadCount) + chr(10) +
"time(ms)=" + string(etime - vgDebugTime), ?).
assign oiReturnStatus = (if viReadCount = 0 then -4 else 0).
finally:
if vhQuery <> ?
then do:
vhQuery:query-close().
delete object vhQuery.
end.
if vhCopyTable <> ?
then delete object vhCopyTable.
if vhTargetBuffer <> ?
then delete object vhTargetBuffer.
if vhBuffer <> ?
then delete object vhBuffer.
end finally.