icAction | input | character | SAVE SAVEDRAFT DRAFT VALIDATE |
ilReturnDataset | input | logical | Indication whether the logic should return the official dataset of the object that has just been created/modified. |
ilPartialUpdate | input | logical | Indication whether the input dataset is a full object or only a partial one. |
icPartialUpdateExceptionList | input | character | Comma separated list with fields that need to be skipped in the test logic for partial update. Fields in the list are specified as t<table>.<field>. |
opPrimaryKey | output | longchar | |
opRowid | output | longchar | |
oiDraftInstance | output | integer | |
ocPrimaryKeyName | output | character | The name of the field(s) in the primary key of the object. Normally this is the name of the object ID of the main table. (like creditor_ID) |
ozObjectRepresentation | output | dataset-handle | The dataset containing the official representation of the object dataset. It should always be passed by-reference, meaning, the dataset handle should be created before the call. |
oiReturnStatus | output | integer | Return status of the method. |
/* ================================================================================================== */ /* As this class has got a dataset in the class tables but CB does not provide the option to indicate */ /* in this case which table is the primary and as such we cannot return a dataset for this method by */ /* using the default mechanism in the ancestor-class. */ /* Therefore we define a local handle to the dataset in this class, fill it in the processing and */ /* then assign the the inheritted one after the ancestor-code again */ /* ================================================================================================== */ assign vlReturnCInvoiceInstanceData = ilReturnDataset vhBCInvoiceInstanceData = ? ilReturnDataset = false vlAllowOverAllocationPVO = true. <ANCESTOR-CODE> /* ========================================================================================================== */ /* vhBCInvoiceInstanceDatafill is filled in the called methods from the ancestor-code when requested and now */ /* we use it to assign the inheritted output param that is a handle with the structure of the class dataset */ /* ========================================================================================================== */ if vlReturnCInvoiceInstanceData = true and valid-handle (vhBCInvoiceInstanceData) then do : /* ========================================================================================================= */ /* Copy the main fields of the main table of the CInvoice-instance (stored in vhBCInvoiceInstanceData) into */ /* tCInvoiceAPM (belonging to dataset BCInvoiceAPMatchingO) that will then be copied into the output dataset */ /* Note that there can be multiple records in the input and thus also in vhBCInvoiceInstanceData */ /* ========================================================================================================= */ if can-find (first tCInvoiceCIAPM) and valid-handle(vhBCInvoiceInstanceData) THEN COPYBLOCK: DO : /* Build up the buffer and the query for going through the dataset-handle */ assign vhtCInvoiceBuffer = vhBCInvoiceInstanceData:get-buffer-handle("tCInvoice":U) no-error. if error-status:error or valid-handle(vhtCInvoiceBuffer) = false then Leave COPYBLOCK. Create query vhtCInvoiceQuery in widget-pool "non-persistent":U. vhtCInvoiceQuery:add-buffer(vhtCInvoiceBuffer) no-error. if error-status:error or valid-handle(vhtCInvoiceBuffer) = false then Leave COPYBLOCK. vhtCInvoiceQuery:query-prepare("for each " + vhtCInvoiceBuffer:name ) no-error. if error-status:error or valid-handle(vhtCInvoiceBuffer) = false then Leave COPYBLOCK. /* Open the query and get the first one */ vhtCInvoiceQuery:query-open() no-error. if error-status:error or valid-handle(vhtCInvoiceBuffer) = false then Leave COPYBLOCK. vhtCInvoiceQuery:get-first() no-error. /* Cycle through all records in the query */ do while valid-handle(vhtCInvoiceBuffer) and valid-handle(vhtCInvoiceQuery) and vhtCInvoiceBuffer:available : /* Release tCInvoiceCIAPM to make sure we really find the one we need */ release tCInvoiceCIAPM. /* Find the associated tCInvoiceCIAPM based upon CInvoice_ID or based upon CInvoiceReference */ if vhtCInvoiceBuffer::CInvoice_ID <> 0 and vhtCInvoiceBuffer::CInvoice_ID <> ? then Find tCInvoiceCIAPM where tCInvoiceCIAPM.tiCInvoice_ID = vhtCInvoiceBuffer::CInvoice_ID no-error. if vhtCInvoiceBuffer::CInvoiceReference <> "":U and vhtCInvoiceBuffer::CInvoiceReference <> ? and not available tCInvoiceCIAPM then Find tCInvoiceCIAPM where tCInvoiceCIAPM.tcCInvoiceReference = vhtCInvoiceBuffer::CInvoiceReference no-error. if vhtCInvoiceBuffer::CInvoicePostingYear <> 0 and vhtCInvoiceBuffer::CInvoicePostingYear <> ? and vhtCInvoiceBuffer::tcJournalCode <> "" and vhtCInvoiceBuffer::tcJournalCode <> ? and vhtCInvoiceBuffer::CInvoiceVoucher <> 0 and vhtCInvoiceBuffer::CInvoiceVoucher <> ? and not available tCInvoiceCIAPM then Find tCInvoiceCIAPM where tCInvoiceCIAPM.tiCInvoicePostingYear = vhtCInvoiceBuffer::CInvoicePostingYear and tCInvoiceCIAPM.tcJournalCode = vhtCInvoiceBuffer::tcJournalCode and tCInvoiceCIAPM.tiCInvoiceVoucher = vhtCInvoiceBuffer::CInvoiceVoucher no-error. /* Update the associated tCInvoiceCIAPM based upon the dataset-handle */ if available tCInvoiceCIAPM then do: assign tCInvoiceCIAPM.tiCInvoice_ID = vhtCInvoiceBuffer::CInvoice_ID tCInvoiceCIAPM.tcCInvoiceReference = vhtCInvoiceBuffer::CInvoiceReference tCInvoiceCIAPM.tcCreditorCode = vhtCInvoiceBuffer::tcCreditorCode tCInvoiceCIAPM.ttCInvoiceDate = vhtCInvoiceBuffer::CInvoiceDate tCInvoiceCIAPM.ttCInvoicePostingDate = vhtCInvoiceBuffer::CInvoicePostingDate tCInvoiceCIAPM.tcCInvoiceCurrencyCode = vhtCInvoiceBuffer::tcCurrencyCode tCInvoiceCIAPM.tcCInvoicePaymentCondCode = vhtCInvoiceBuffer::tcNormalPaymentConditionCode tCInvoiceCIAPM.ttCInvoiceDiscountDueDate = vhtCInvoiceBuffer::CInvoiceDiscountDueDate tCInvoiceCIAPM.ttCInvoiceDueDate = vhtCInvoiceBuffer::CInvoiceDueDate tCInvoiceCIAPM.tcCInvoiceControlGLCode = vhtCInvoiceBuffer::tcControlGLCode tCInvoiceCIAPM.tcCInvoiceCostCentreCode = vhtCInvoiceBuffer::tcCostCentreCode tCInvoiceCIAPM.tcCInvoiceDivisionCode = vhtCInvoiceBuffer::tcDivisionCode tCInvoiceCIAPM.tcCInvoiceRemark = vhtCInvoiceBuffer::CInvoiceCommentNote tCInvoiceCIAPM.tdCInvoiceHoldAmountTC = vhtCInvoiceBuffer::CInvoiceHoldAmountTC tCInvoiceCIAPM.tcCInvoiceTSMNumber = vhtCInvoiceBuffer::CInvoiceTSMNumber tCInvoiceCIAPM.tiCinvoiceVoucher = vhtCinvoiceBuffer::CinvoiceVoucher tCInvoiceCIAPM.tiCInvoicePostingYear = vhtCInvoiceBuffer::CInvoicePostingYear tCInvoiceCIAPM.tcJournalCode = vhtCInvoiceBuffer::tcJournalCode. if tCInvoiceCIAPM.tcCInvoiceReferenceInt = "":U or tCInvoiceCIAPM.tcCInvoiceReferenceInt = ? then assign tCInvoiceCIAPM.tcCInvoiceReferenceInt = string(vhtCInvoiceBuffer::CInvoicePostingYear) + "/":U + vhtCInvoiceBuffer::tcJournalCode + "/":U + string(vhtCInvoiceBuffer::CInvoiceVoucher,"999999999":U). end. /* if available(tCInvoiceCIAPM) */ /* Get the next record in the query */ vhtCInvoiceQuery:get-next() no-error. end. /* do while valid-handle(vhtCInvoiceBuffer) */ END. /* COPYBLOCK */ /* clean the query-handle */ if valid-handle(vhtCInvoiceQuery) then delete object vhtCInvoiceQuery no-error. /* Create a new dataset like the class-dataset and with the same data in it: the output dataset and the input dataset of this method needs to have the same structure as the class-dataset */ ozObjectRepresentation:copy-dataset(dataset BCInvoiceAPMatchingO:handle, /* handle to the class dataset that contains tCInvoiceCIAPM and from which to copy */ true, /* Append-mode */ false, /* Replace-mode */ false, /* Loose-copy-mode; it relaxes the requirement that the metaschema for the source and target temp-tables be the same */ "":U, /* pairs-list; comma-separated list of the target and source temp-table pairs to be copied */ false, /* Current-only: copy only the current record of every table? */ "":U). /* Name-prefix: optional character expression used as the prefix for naming the target ProDataSet */ /* Delete the object with the dataset of BCInvoice (vhBCInvoiceInstanceDataCIJE) as we have copied it already and thus no longer need it */ delete object vhBCInvoiceInstanceData. end. /* if valid-handle (vhBCInvoiceInstanceData) */ /* ============================================================================================================================== */ /* If there is only a single invoice record in the input and in the output tables and this single invoice record was not saved */ /* succesfully (meaning field CInvoice_ID in it is empty) then we set the global returnstatus of this method to a negative value */ /* to indicate an error occured. The fact that normally the global returnstatus does not reflect the individual invoices is */ /* because every invoice can be tackled in a single transaction. */ /* The request that when a single invoice-record is passed the global return status reflects the one of that invoice came from */ /* QXtend as they only look at the global return status to check if errors occured. */ /* Note we only set oiReturnStatus here as the error-messages are already created */ /* ============================================================================================================================== */ if oiReturnStatus >= 0 and can-find (first tFcMessages) then do : find first tCInvoiceCIAPM no-lock no-error. if available tCInvoiceCIAPM and (tCInvoiceCIAPM.tiCInvoice_ID = 0 or tCInvoiceCIAPM.tiCInvoice_ID = ?) and not can-find (first btCInvoiceCIAPM where rowid(btCInvoiceCIAPM) <> rowid(tCInvoiceCIAPM)) then do: if can-find(first tFcMessages where tFcMessages.tcFcType <> 'W':U) then assign oiReturnStatus = -1. else assign oiReturnStatus = 1. end. /* if available tCInvoiceCIAPM and */ end. /* if oiReturnStatus >= 0 and */