如何动态传递ALTERID获取TALLY XML API最新凭证/库存/客户数据
TALLY XML API 动态获取最新数据方案
问题背景
当前通过TALLY XML API导出凭证、库存项及客户数据时,静态指定ALTERID作为过滤条件,无法自动获取最新更新的数据,需要实现动态传递ALTERID或通过其他方式获取最新数据。
当前静态过滤的请求XML
1. 凭证(VOUCHER)请求
<ENVELOPE> <HEADER>enter code here <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMVOUCHERDATA</ID> </HEADER> <BODY> <DESC> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMVOUCHERDATA"> <TYPE>VOUCHER</TYPE> <FETCH>VOUCHERNUMBER,DATE,ISCANCELLED,PARTYNAME,PARTYLEDGERNAME,PARTYGSTIN,CONSIGNEEGSTIN,LEDGERENTRIES.LIST,ALLLEDGERENTRIES,AMOUNT,VCHSTATUSDATE,EFFECTIVEDATE,ALTERID,MASTERID,VOUCHERKEY,VOUCHERRETAINKEY,GUID,BASICSHIPDOCUMENTNO,BASICFINALDESTINATION,BASICSHIPVESSELNO,EICHECKPOST,BILLOFLADINGNO,BILLOFLADINGDATE,BILLOFLADINGDATE,BASICSHIPPEDBY,IRN,IRNACKDATE,GSTREGISTRATION,VOUCHERTYPENAME,CMPGSTREGISTRATIONTYPE,CMPGSTSTATE,NUMBERINGSTYLE,VCHSTATUSTAXUNIT,GSTNATUREOFRETURN</FETCH> <FILTER>Masterfilter</FILTER> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="Masterfilter">$MASTERID > 829 AND $ALTERID > 1343</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
2. 库存项(STOCKITEM)请求
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMSTOCKITEMCOL</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMSTOCKITEMCOL"> <TYPE>STOCKITEM</TYPE> <FETCH>NAME,GUID,GSTAPPLICABLE,GSTDETAILS.LIST,ALTERID,MRPDETAILS.LIST,BASEUNITS,ISDELETED,OPENINGBALANCE,OPENINGRATE</FETCH> <FILTER>Masterfilter</FILTER> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="Masterfilter">$ALTERID > 1094</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
3. 客户(LEDGER)请求
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMERDATA</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMERDATA"> <TYPE>LEDGER</TYPE> <FETCH>NAME,PARENT,GUID,PARTYGSTIN,BILLCREDITPERIOD,LEDGERMOBILE,LEDGERCOUNTRYISCODE,ISDELETED,ALTERID,EMAIL,PRIORSTATENAME</FETCH> <FILTER>Masterfilter</FILTER> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="Masterfilter">$ALTERID > 32</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
解决方案
1. 动态传递ALTERID参数
通过TALLY的<STATICVARIABLES>定义自定义变量,在请求时动态传入最新的ALTERID阈值,替代静态硬编码数值。
改造后的凭证(VOUCHER)请求
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMVOUCHERDATA</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <!-- 请求时替换为上次导出的最大MASTERID --> <SV_LAST_MASTERID>829</SV_LAST_MASTERID> <!-- 请求时替换为上次导出的最大ALTERID --> <SV_LAST_ALTERID>1343</SV_LAST_ALTERID> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMVOUCHERDATA"> <TYPE>VOUCHER</TYPE> <FETCH>VOUCHERNUMBER,DATE,ISCANCELLED,PARTYNAME,PARTYLEDGERNAME,PARTYGSTIN,CONSIGNEEGSTIN,LEDGERENTRIES.LIST,ALLLEDGERENTRIES,AMOUNT,VCHSTATUSDATE,EFFECTIVEDATE,ALTERID,MASTERID,VOUCHERKEY,VOUCHERRETAINKEY,GUID,BASICSHIPDOCUMENTNO,BASICFINALDESTINATION,BASICSHIPVESSELNO,EICHECKPOST,BILLOFLADINGNO,BILLOFLADINGDATE,BILLOFLADINGDATE,BASICSHIPPEDBY,IRN,IRNACKDATE,GSTREGISTRATION,VOUCHERTYPENAME,CMPGSTREGISTRATIONTYPE,CMPGSTSTATE,NUMBERINGSTYLE,VCHSTATUSTAXUNIT,GSTNATUREOFRETURN</FETCH> <FILTER>Masterfilter</FILTER> </COLLECTION> <!-- 使用静态变量替代硬编码值 --> <SYSTEM TYPE="Formulae" NAME="Masterfilter">$MASTERID > $$SV_LAST_MASTERID AND $ALTERID > $$SV_LAST_ALTERID</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
改造后的库存项(STOCKITEM)请求
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMSTOCKITEMCOL</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT> <!-- 请求时替换为上次导出的最大ALTERID --> <SV_LAST_ALTERID>1094</SV_LAST_ALTERID> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMSTOCKITEMCOL"> <TYPE>STOCKITEM</TYPE> <FETCH>NAME,GUID,GSTAPPLICABLE,GSTDETAILS.LIST,ALTERID,MRPDETAILS.LIST,BASEUNITS,ISDELETED,OPENINGBALANCE,OPENINGRATE</FETCH> <FILTER>Masterfilter</FILTER> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="Masterfilter">$ALTERID > $$SV_LAST_ALTERID</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
改造后的客户(LEDGER)请求
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMERDATA</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT> <!-- 请求时替换为上次导出的最大ALTERID --> <SV_LAST_ALTERID>32</SV_LAST_ALTERID> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMERDATA"> <TYPE>LEDGER</TYPE> <FETCH>NAME,PARENT,GUID,PARTYGSTIN,BILLCREDITPERIOD,LEDGERMOBILE,LEDGERCOUNTRYISCODE,ISDELETED,ALTERID,EMAIL,PRIORSTATENAME</FETCH> <FILTER>Masterfilter</FILTER> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="Masterfilter">$ALTERID > $$SV_LAST_ALTERID</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
使用逻辑:每次请求前,从本地存储或上次导出结果中提取最大的ALTERID(及MASTERID),替换XML中对应静态变量的数值,即可获取自上次导出后更新的数据。
2. 按时间过滤替代方案
若ALTERID逻辑不可靠,可通过数据的修改时间字段过滤,比如凭证的EFFECTIVEDATE/VCHSTATUSDATE,库存项/客户的MODIFIEDDATE字段(需确认TALLY中对应字段)。
示例:凭证按时间过滤的配置
<SYSTEM TYPE="Formulae" NAME="Masterfilter">$EFFECTIVEDATE > $$SV_LAST_SYNC_DATE</SYSTEM>
其中SV_LAST_SYNC_DATE为动态传入的上次同步时间,格式需符合TALLY要求(如DD-MM-YYYY)。
内容的提问来源于stack exchange,提问作者bjss kiriti
相关产品推荐
相关产品推荐

