将 GL 交易批量加载到 Exact Online

Mass loading GL transactions into Exact Online

出于性能测试的原因,我想将许多总帐交易加载到 Exact Online 中。我通过在使用 OAuth 进行身份验证后发布交易来使用 REST API 交易及其行。

但是,这非常慢并且涉及大量网络往返。我需要加载 180.000 个交易行。在 Exact Online 中是否有其他方法可以大量加载数据?

将大量数据加载到 Exact Online 的最佳方法是使用 XML API。您可以在验证后自己使用 HTTP POST,也可以使用如下脚本。请更改您要加载的交易数量和每笔交易行数的变量:

local remark Specify the division code here:

local define DIVISION_CODE "868035"

local remark Originating General Ledger account:

local define GL_ACT_CODE_FROM "8000"

local remark Target General Ledger account:

local define GL_ACT_CODE_TO "8001"

local remark Journal

local define JOURNAL_CODE "90"

local remark Number of GL entries to generate:

local define CNT_TXN_HEADERS "5"

local remark Number of lines per GL entry:

local define CNT_TXN_LINES "50"

use ${DIVISION_CODE}

create or replace table settings@inmemorystorage
as
select '<?xml version="1.0" encoding="utf-8"?>'
       || chr(13)
       || '<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-XML.xsd">'
       fileprefix
,      chr(13)
       || '</eExact>'
       filepostfix
from   dual@datadictionary

insert into UploadXMLTopics
( topic
, payload
, division_code
, orig_system_reference
)
select 'GLTransactions' topic
,      stg.fileprefix
       || chr(13)
       || '<GLTransactions>'
       || xml
       || chr(13)
       || '</GLTransactions>'
       || stg.filepostfix
       filecontents
,      '${DIVISION_CODE}' division_code
,      'GLTransactions\SAMPLE.xml'
       filename
from   ( select listagg
                ( chr(13)
                  || '<GLTransaction>'
                  || chr(13)
                  || '<Journal code="'
                  || txn_journalcode
                  || '" />'
                  || chr(13)
                  || '<Date>'
                  || substr(xmlencode(trunc(sysdate)), 1, 10)
                  || '</Date>'
                  || chr(13)
                  || xmlsource
                  || chr(13)
                  || xmltarget
                  || chr(13)
                  || '</GLTransaction>'
                  , ''
                  ) xml
          from    ( select trunc(sysdate) txn_date
                    ,      '${JOURNAL_CODE}' txn_journalcode
                    ,      listagg
                           ( chr(13)
                             || '<GLTransactionLine line="'
                             || id
                             || '" >'
                             || chr(13)
                             || '<Date>'
                             || substr(xmlencode(trunc(sysdate)), 1, 10)
                             || '</Date>'
                             || chr(13)
                             || '<GLAccount code="'
                             || xmlencode('${GL_ACT_CODE_FROM}')
                             || '" />'
                             || chr(13)
                             || '<Description>'
                             || xmlencode('Transaction offset #' || id)
                             || '</Description>'
                             || '<Amount>'
                             || '<Currency code="EUR" />'
                             || '<Value>'
                             || -1
                             || '</Value>'
                             || '</Amount>'
                             || chr(13)
                             || '</GLTransactionLine>'
                             , ''
                           )
                           xmlsource
                    ,      listagg
                           ( chr(13)
                             || '<GLTransactionLine line="'
                             || id
                             || '" >'
                             || chr(13)
                             || '<Date>'
                             || substr(xmlencode(trunc(sysdate)), 1, 10)
                             || '</Date>'
                             || chr(13)
                             || '<GLAccount code="'
                             || xmlencode('${GL_ACT_CODE_TO}')
                             || '" />'
                             || '<Description>'
                             || xmlencode('Transaction #' || id)
                             || '</Description>'
                             || chr(13)
                             || '<Amount>'
                             || '<Currency code="EUR" />'
                             || '<Value>'
                             || 1
                             || '</Value>'
                             || '</Amount>'
                             || chr(13)
                             || '</GLTransactionLine>'
                             , ''
                           )
                           xmltarget
                    from   range(${CNT_TXN_LINES})@datadictionary txnlines
                    group
                    by     txn_date
                    ,      txn_journalcode
                    )
         join  range(${CNT_TXN_HEADERS})@datadictionary txnheaders
       )
join   settings@inmemorystorage stg
on     1=1
where  xml is not null

local remark Check outcome:

select * from UploadXMLTopics

XML API 的性能各不相同,但通常在办公时间速度较慢。我刚刚测试过;如图所示,上传 500 个交易行需要 15 秒(debet/credt x 5 x 50,如脚本中所指定)。通过使用部门 ID,您可以加载多个部门以生成公司间职位。此脚本需要 Exact Online 组合或 XML 驱动程序以及 invantive sql,但与手动 HTTP POSTS 类似。