tDebtorEndUser | input | temp-table | |
icDomainCode | input | character | When the domaincode is filled --> Replicate only to this domain. If the domaincode is empty --> Replicate to all domains in this shared set. |
iiBBusinessRelationID | input | integer | Instance ID of BBusinessRelation when this is already started before. |
ihBBusinessRelationInst | input | handle | |
ilIsKeepInstancesOpen | input | logical | |
oiReturnStatus | output | integer | Return status of the method. |
MAIN_BLOCK: do on error undo, leave: /* ====================== */ /* Check input parameters */ /* ====================== */ if not can-find(first tDebtorEndUser) then return. /* ===================================================================================== */ /* Overtake started instances */ /* ===================================================================================== */ assign viBBusinessRelationMfgEndUserID = iiBBusinessRelationID vhBBusinessRelationMfgEndUserInst = ihBBusinessRelationInst vlIsKeepInstancesOpenBMfgEndUs = ilIsKeepInstancesOpen. /* ================== */ /* Exception Handling */ /* ================== */ assign oiReturnStatus = -98 viLocalReturnStatus = 0 vcListEuMstr = '':U vcEndUserDomainCode = icDomainCode. CONVERTBLOCK: DO: /* ===================================== */ /* Check which records need to be loaded */ /* ===================================== */ for each tDebtorEndUser break by tDebtorEndUser.SharedSet_ID: /* ======================================================================================================== */ /* Check if the Customer End User needs to be replicated to one domain or to all domains of this shared set */ /* If icDomainCode is left blank, all domains for this shared set will be replicated. */ /* ======================================================================================================== */ if first-of(tDebtorEndUser.SharedSet_ID) then do: <Q-2 run DomainBySharedSetDomain (all) (Read) (Cache) (input tDebtorEndUser.SharedSet_ID, (SharedSetId) input 0, (DomainID) input icDomainCode, (DomainCode) output dataset tqDomainBySharedSetDomain) in BDomain > end. /* if first-of(tDebtorEndUser.SharedSet_ID) */ /* =============================================================================================== */ /* Get all Mfg Addresses which are already defined in the database */ /* =============================================================================================== */ <Q-48 run DomainSharedSetForEuMstr (all) (Read) (NoCache) (input tDebtorEndUser.SharedSet_ID, (SharedSetId) input ?, (DomainCode) input tDebtorEndUser.DebtorEndUserCode, (Address) output dataset tqDomainSharedSetForEuMstr) in BDomain > for each tqDomainBySharedSetDomain where tqDomainBySharedSetDomain.tlDomainPropertyIsSetupCompl: /* ============================================================ */ /* Create a list of all teu_mstr records that need to be loaded */ /* ============================================================ */ if can-find(first tqDomainSharedSetForEuMstr where tqDomainSharedSetForEuMstr.tcDomainCode = tqDomainBySharedSetDomain.tcDomainCode and tqDomainSharedSetForEuMstr.tceu_addr = tDebtorEndUser.DebtorEndUserCode) then assign vcListEuMstr = vcListEuMstr + (if vcListEuMstr = '':U then '':U else chr(4)) + tqDomainBySharedSetDomain.tcDomainCode + chr(2) + tDebtorEndUser.DebtorEndUserCode. if length(vcListEuMstr, "CHARACTER") > 30000 then do: /* ========================= */ /* Load the tad_mstr records */ /* ========================= */ <M-86 run DataLoad (input '':U (icRowids), input vcListEuMstr (icPkeys), input '':U (icObjectIds), input '':U (icFreeform), input true (ilKeepPrevious), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturnStatus = 0 then assign viLocalReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave MAIN_BLOCK. assign vcListEuMstr = '':U. end. /* length */ end. /* for each tqDomainBySharedSetDomain: */ end. /* for each tDebtorEndUser */ /* ========================= */ /* Load the teu_mstr records */ /* ========================= */ if vcListEuMstr <> "":U and vcListEuMstr <> ? then do : <M-4 run DataLoad (input '':U (icRowids), input vcListEuMstr (icPkeys), input '':U (icObjectIds), input '':U (icFreeform), input false (ilKeepPrevious), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturnStatus = 0 then assign viLocalReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave MAIN_BLOCK. end. /* if vcListEuMstr <> "":U and */ /* ============================================== */ /* Convert table tDebtorEndUser to table teu_mstr */ /* ============================================== */ for each tDebtorEndUser break by tDebtorEndUser.SharedSet_ID: /* ======================================================================================================== */ /* Check if the Customer End User needs to be replicated to one domain or to all domains of this shared set */ /* If icDomainCode is left blank, all domains for this shared set will be replicated. */ /* ======================================================================================================== */ if first-of(tDebtorEndUser.SharedSet_ID) then do: if tDebtorEndUser.SharedSet_ID = 0 or tDebtorEndUser.SharedSet_ID = ? then do: assign vcMessage = trim(substitute(#T-15'The Shared Set ID for this customer end user (&1) was not filled.':255(69601)T-15#, trim(tDebtorEndUser.DebtorEndUserCode) )) viLocalReturnStatus = -3. <M-6 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 1 (iiSeverity), input '':U (icRowid), input 'QadFin-8187':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> leave CONVERTBLOCK. end. /* if tDebtorEndUser.SharedSet_ID = 0 or */ <Q-7 run DomainBySharedSetDomain (all) (Read) (Cache) (input tDebtorEndUser.SharedSet_ID, (SharedSetId) input 0, (DomainID) input icDomainCode, (DomainCode) output dataset tqDomainBySharedSetDomain) in BDomain > end. /* if first-of(tDebtorEndUser.SharedSet_ID) */ /* ========================================================================= * * Get Address and Contact data of the Mfg Address * * ========================================================================= * * Address can be created newly, or existing one can be reused * * ========================================================================= */ /* First check, if the business relation component contains the address data */ empty temp-table tEndUserAddress. empty temp-table tContact. if viBBusinessRelationMfgEndUserID <> 0 and viBBusinessRelationMfgEndUserID <> ? then do: if not valid-handle(vhBBusinessRelationMfgEndUserInst) then do: <I-72 {bFcOpenInstance &CLASS = "BBusinessRelation"}> assign vlIsBBusRelOpenedHrBMfgEndUsr = true. end. <M-77 run GetAddressWithID (input tDebtorEndUser.Address_ID (iiAddressID), input-output tEndUserAddress (tApiAddress), output viFcReturnSuper (oiReturnStatus)) in BBusinessRelation> if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturnStatus = 0 then assign viLocalReturnStatus = viFcReturnSuper. if viLocalReturnStatus < 0 then leave CONVERTBLOCK. <M-39 run GetContactByAddress (input tDebtorEndUser.Address_ID (iiAddressID), input-output tContact (tApiContact), output viFcReturnSuper (oiReturnStatus)) in BBusinessRelation> if tDebtorEndUser.tc_Status = "C":U then do : <Q-62 run ContactByAddress (all) (Read) (NoCache) (input tDebtorEndUser.Address_ID, (AddressId) output dataset tqContactByAddress) in BBusinessRelation> end. if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturnStatus = 0 then assign viLocalReturnStatus = viFcReturnSuper. if viLocalReturnStatus < 0 then leave CONVERTBLOCK. end. if not can-find(first tEndUserAddress where tEndUserAddress.Address_ID = tDebtorEndUser.Address_ID) then do: /* Get address details */ <Q-3 run AddressById (all) (Read) (NoCache) (input tDebtorEndUser.Address_ID, (AddressID) output dataset tqAddressById) in BBusinessRelation > for each tqAddressById where tqAddressById.tiAddress_ID = tDebtorEndUser.Address_ID: create tEndUserAddress. <M-34 run BufferCopy (input buffer tqAddressById:handle (ihFrom), input buffer tEndUserAddress:handle (ihTo), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave CONVERTBLOCK. end. /* Get contact details */ <Q-36 run ContactByAddress (all) (Read) (NoCache) (input tDebtorEndUser.Address_ID, (AddressId) output dataset tqContactByAddress) in BBusinessRelation > for each tqContactByAddress where tqContactByAddress.tiAddress_ID = tDebtorEndUser.Address_ID: create tContact. <M-71 run BufferCopy (input buffer tqContactByAddress:handle (ihFrom), input buffer tContact:handle (ihTo), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> end. end. find first tEndUserAddress where tEndUserAddress.Address_ID = tDebtorEndUser.Address_ID no-error. if not available tEndUserAddress then do: assign vcMessage = trim(#T-57'Address record not available for this customer Ship-to.':255(69641)T-57#) viLocalReturnStatus = -1. <M-64 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 1 (iiSeverity), input '':U (icRowid), input 'QadFin-686829':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> leave CONVERTBLOCK. end. for each tqDomainBySharedSetDomain where tqDomainBySharedSetDomain.tlDomainPropertyIsSetupCompl: /* ================================================== */ /* Create or update teu_mstr records based on tDebtorEndUser */ /* ================================================== */ find teu_mstr where teu_mstr.eu_addr = tDebtorEndUser.DebtorEndUserCode and teu_mstr.eu_domain = tqDomainBySharedSetDomain.tcDomainCode no-error. if not available teu_mstr then do: if tDebtorEndUser.tc_Status = "D" then next. <M-8 run AddDetailLine (input 'eu_mstr':U (icTable), input '':U (icParentRowid), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper <> 0 then do: assign viLocalReturnStatus = viFcReturnSuper. leave CONVERTBLOCK. end. /* if viFcReturnSuper <> 0 */ end. /* if not available teu_mstr */ else assign teu_mstr.tc_Status = "C":U. assign teu_mstr.eu_addr = tDebtorEndUser.DebtorEndUserCode teu_mstr.eu_domain = tqDomainBySharedSetDomain.tcDomainCode teu_mstr.eu_cm_nbr = tDebtorEndUser.tcDebtorCode teu_mstr.eu_lang = tEndUserAddress.tcLngCode teu_mstr.eu_sort = tEndUserAddress.AddressSearchName teu_mstr.tc_Status = (if tDebtorEndUser.tc_Status = "D":U then tDebtorEndUser.tc_Status else teu_mstr.tc_Status). <Q-67 run ServiceControlByDomain (all) (Read) (NoCache) (input teu_mstr.eu_domain, (DomainCode) output dataset tqServiceControlByDomain) in BMfgServiceControl> find first tqServiceControlByDomain no-lock no-error. <Q-79 run CustomerByDomainAddress (all) (Read) (NoCache) (input teu_mstr.eu_domain, (DomainCode) input tDebtorEndUser.tcDebtorCode, (Address) output dataset tqCustomerByDomainAddress) in BMfgCustomer> find first tqCustomerByDomainAddress no-lock no-error. <Q-68 run GetEndUserControlByDomain (all) (Read) (NoCache) (input teu_mstr.eu_domain, (DomainCode) output dataset tqGetEndUserControlByDomain) in BMfgEndUserControl> find first tqGetEndUserControlByDomain no-lock no-error. assign teu_mstr.eu_trv_um = if available tqServiceControlByDomain then tqServiceControlByDomain.tcsvc_trvl_um else '' teu_mstr.eu_po_reqd = if available tqCustomerByDomainAddress then tqCustomerByDomainAddress.tlcm_po_reqd else no teu_mstr.eu_create_isb = if available tqGetEndUserControlByDomain then tqGetEndUserControlByDomain.tleuc_create_isb else no. for each tContact break by tContact.tc_Status : /* Create an eud_det record for each contact assoicated with the address */ if tContact.tc_Status = "C" then do: /* Get the old contact name (ie one currently stored in db) this allows us to indentify the mfg/pro record correctly to update the name */ /* We need to delete this record as its key value is changing */ /* zjc eB3RegTst1-2636 Begin */ for first tqContactByAddress where tqContactByAddress.tiContact_id = tContact.contact_id: for first teud_det where teud_det.eud_domain = teu_mstr.eu_domain and teud_det.eud_addr = tDebtorEndUser.DebtorEndUserCode and teud_det.eud_sort = tqContactByAddress.tcContactName: if tqContactByAddress.tcContactName <> tContact.ContactName then assign teud_det.tc_status = "D". end. end. /* zjc eB3RegTst1-2636 end */ end. /* Check to see if we have an existing teud_det record for the contact*/ for first teud_det where teud_det.eud_domain = teu_mstr.eu_domain and teud_det.eud_addr = tDebtorEndUser.DebtorEndUserCode and teud_det.eud_sort = tContact.ContactName: if teud_det.tc_status <> "D":U then assign teud_det.tc_status = tContact.tc_status. end. /* Check to see if we have an existing teud_det record for the contact*/ find first teud_det where teud_det.eud_domain = teu_mstr.eu_domain and teud_det.eud_addr = tDebtorEndUser.DebtorEndUserCode and teud_det.eud_sort = tContact.ContactName no-error. /* if we don't have eud_det record for this contact then create one */ /* or if the contact name is changed then create a new eud_det as the preivous one is marked as "D" */ if not available(teud_det) or (available(teud_det) and teud_det.tc_status = "D" and tContact.tc_Status = "C" ) then do: <M-78 run AddDetailLine (input 'eud_det':u (icTable), input teu_mstr.tc_Rowid (icParentRowid), output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> assign teud_det.oid_eud_det = <M-65 GetNextOidValue () in BMfgEndUser> teud_det.eud_ls_type = {&ADDRESSTYPECODESYSTEM-ENDUSER} teud_det.eud_domain = teu_mstr.eu_domain. end. /* assign complex mapping fields */ assign teud_det.eud_domain = teu_mstr.eu_domain teud_det.eud_sort = tContact.ContactName teud_det.eud_title = tContact.ContactTitle teud_det.eud_type = tContact.ContactFunction teud_det.eud_phone = tContact.ContactTelephone teud_det.eud_fax = tContact.ContactFax teud_det.eud_updt = TODAY teud_det.eud_nametype = if tContact.ContactisPrimary then "P" else "" teud_det.eud_addr = tDebtorEndUser.DebtorEndUserCode. end. /* for each tContact */ end. /* for each tqDomainBySharedSetDomain: */ end. /* for each tDebtorEndUser */ end. /* CONVERTBLOCK */ VALIDATEBLOCK: DO: if viLocalReturnStatus < 0 then leave VALIDATEBLOCK. /* ========== */ /* ValidateBC */ /* ========== */ <M-12 run ValidateBC (output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave VALIDATEBLOCK. /* ================== */ /* Additional Updates */ /* ================== */ <M-13 run AdditionalUpdates (output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave VALIDATEBLOCK. /* ======== */ /* DataSave */ /* ======== */ <M-14 run DataSave (output viFcReturnSuper (oiReturnStatus)) in BMfgEndUser> if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper. if viFcReturnSuper < 0 then leave VALIDATEBLOCK. end. /* VALIDATEBLOCK */ end. /* of MAIN_BLOCK */ /* Close components */ if vlIsBBusRelOpenedHrBMfgEndUsr and valid-handle(vhBBusinessRelationMfgEndUserInst) then do: <I-91 {bFcCloseInstance &CLASS = "BBusinessRelation"}> assign vlIsBBusRelOpenedHrBMfgEndUsr = false. end. /* ================== */ /* Exception Handling */ /* ================== */ assign oiReturnStatus = viLocalReturnStatus.
define temp-table ttContext no-undo field propertyQualifier as character field propertyName as character field propertyValue as character index entityContext is primary unique propertyQualifier propertyName index propertyQualifier propertyQualifier. define dataset dsContext for ttContext. define variable vhContextDS as handle no-undo. define variable vhExceptionDS as handle no-undo. define variable vhServer as handle no-undo. define variable vhInputDS as handle no-undo. define variable vhInputOutputDS as handle no-undo. define variable vhOutputDS as handle no-undo. define variable vhParameter as handle no-undo. /* Create context */ create ttContext. assign ttContext.propertyName = "programName" ttContext.propertyValue = "BMfgEndUser". create ttContext. assign ttContext.propertyName = "methodName" ttContext.propertyValue = "ApiReplicateFromFinancials". create ttContext. assign ttContext.propertyName = "applicationId" ttContext.propertyValue = "fin". create ttContext. assign ttContext.propertyName = "entity" ttContext.propertyValue = "1000". create ttContext. assign ttContext.propertyName = "userName" ttContext.propertyValue = "mfg". create ttContext. assign ttContext.propertyName = "password" ttContext.propertyValue = "". /* Create input dataset */ create dataset vhInputDS. vhInputDS:read-xmlschema("file", "xml/bmfgenduser.apireplicatefromfinancials.i.xsd", ?). vhParameter = vhInputDS:get-buffer-handle("tParameterI"). vhParameter:buffer-create(). assign vhParameter::icDomainCode = <parameter value> vhParameter::iiBBusinessRelationID = <parameter value> vhParameter::ihBBusinessRelationInst = <parameter value> vhParameter::ilIsKeepInstancesOpen = <parameter value>. vhParameter = vhInputDS:get-buffer-handle("tDebtorEndUser"). vhParameter:buffer-create(). assign vhParameter::<field-name-1> = <field-value-1> vhParameter::<field-name-2> = <field-value-2> ... /* Connect the AppServer */ create server vhServer. vhServer:connect("-URL <appserver-url>"). if not vhServer:connected() then do: message "Could not connect AppServer" view-as alert-box error title "Error". return. end. /* Run */ assign vhContextDS = dataset dsContext:handle. run program/rpcrequestservice.p on vhServer (input-output dataset-handle vhContextDS by-reference, output dataset-handle vhExceptionDS, input dataset-handle vhInputDS by-reference, input-output dataset-handle vhInputOutputDS by-reference, output dataset-handle vhOutputDS). /* Handle output however you want, in this example, we dump it to xml */ if valid-handle(vhExceptionDS) then vhExceptionDS:write-xml("file", "Exceptions.xml", true). if valid-handle(vhOutputDS) then vhOutputDS:write-xml("file", "Output.xml", true). /* Cleanup */ vhServer:disconnect(). assign vhServer = ?. if valid-handle(vhInputDS) then delete object vhInputDS. if valid-handle(vhOutputDS) then delete object vhOutputDS. if valid-handle(vhExceptionDS) then delete object vhExceptionDS.