Tally XML请求无法获取LedgerList数据及TDL流程疑问
Tally数据导出:嵌套Ledger明细实现与TDL组件解析
问题描述
- 从Tally导出数据时,仅能获取发票外层信息,无法提取嵌套的Ledger明细;尝试用
Walk by: Ledger Entries,但LedgerList无法嵌套在Voucher标签内,需实现指定的嵌套输出结构。 - 对TDL中Form、Part、Line的工作流程存在疑问。
当前XML请求代码
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>Export</TALLYREQUEST> <TYPE>Data</TYPE> <ID>DaybookGR</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <EXPLODEFLAG>Yes</EXPLODEFLAG> <CURRENTCOMPANY>${company}</CURRENTCOMPANY> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT> <SVFROMDATE>${fromDate}</SVFROMDATE> <SVTODATE>${toDate}</SVTODATE> </STATICVARIABLES> <TDL> <TDLMESSAGE> <REPORT NAME="DaybookGR"> <FORMS>DaybookGR</FORMS> <TITLE>DaybookGR </TITLE> </REPORT> <FORM NAME="DaybookGR"> <TOPPARTS>DaybookGR</TOPPARTS> <XMLTAG>"TallyGraphs"</XMLTAG> </FORM> <PART NAME="DaybookGR"> <TOPLINES>Daybook Line Title, Daybook Details</TOPLINES> <REPEAT>Daybook Details : GetLedgerCollAmt</REPEAT> <SCROLLED>Vertical</SCROLLED> <COMMONBORDERS>Yes</COMMONBORDERS> </PART> <PART NAME="Ledgerlist Line Title"> <TOPLINES>Ledgerlist Line Title,Ledger Details</TOPLINES> <REPEAT>Ledger Details : GetLedger</REPEAT> <SCROLLED>Vertical</SCROLLED> <COMMONBORDERS>Yes</COMMONBORDERS> </PART> <LINE NAME="Daybook Line Title"> <USE>Daybook Details</USE> <LOCAL>Field : Default : Type : String </LOCAL> <LOCAL>Field : Field Amount : Set as: "Amount"</LOCAL> </LINE> <LINE NAME="Ledgerlist Line Title"> <USE>Ledger Details</USE> <LOCAL>Field : Default : Type : String </LOCAL> <LOCAL>Field : Field Amount : Set as: "Amount"</LOCAL> </LINE> <LINE NAME="Daybook Details"> <LEFTFIELDS>PartyLedgerName</LEFTFIELDS> <RIGHTFIELDS>vchType,VoucherNumber,Amount,Date</RIGHTFIELDS> <XMLTAG>Voucher</XMLTAG> <EXPLODE>Ledgerlist Line Title</EXPLODE> <BELONGSTO>YES</BELONGSTO> </LINE> <LINE NAME="Ledger Details"> <LEFTFIELDS>PartyLedgerName</LEFTFIELDS> <XMLTAG>LedgerList</XMLTAG> </LINE> <FIELD NAME="PartyLedgerName"> <USE>Name Field</USE> <SET>$LedgerName</SET> </FIELD> <FIELD NAME="Date"> <USE>Long Date Field</USE> <SET>$$DDMMYYYYDateFormat:$Date:"-"</SET> </FIELD> <FIELD NAME="VoucherNumber"> <USE>Name Field</USE> <SET>$VoucherNumber</SET> </FIELD> <FIELD NAME="Amount"> <USE>Amount Field</USE> <SET>$Amount</SET> </FIELD> <COLLECTION NAME="AllVouchers" ISMODIFY="No"> <TYPE>Voucher</TYPE> <BELONGSTO>YES</BELONGSTO> </COLLECTION> <COLLECTION NAME="GetLedger" ISMODIFY="No"> <walk>Ledger</walk> <BELONGSTO>YES</BELONGSTO> <FILTER>IsOptionalFilter</FILTER> <FETCH>PartyLedgerName</FETCH> </COLLECTION> <COLLECTION NAME="GetLedgerCollAmt" ISMODIFY="No"> <SourceCOLLECTION>AllVouchers</SourceCOLLECTION> <FILTER>IsOptionalFilter</FILTER> <FETCH>VoucherNumber,LedgerName,Amount,VoucherTypeName,Date</FETCH> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="IsOptionalFilter">NOT $IsOptional</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
预期输出结构
<TALLYGRAPHS> <VOUCHER> <PARTYLEDGERNAME></PARTYLEDGERNAME> <VOUCHERTYPENAME></VOUCHERTYPENAME> <VOUCHERNUMBER></VOUCHERNUMBER> <AMOUNT></AMOUNT> <DATE></DATE> <Ledgerlist>........</Ledgerlist> <Ledgerlist>........</Ledgerlist> </VOUCHER> <VOUCHER> <PARTYLEDGERNAME></PARTYLEDGERNAME> <VOUCHERTYPENAME></VOUCHERTYPENAME> <VOUCHERNUMBER></VOUCHERNUMBER> <AMOUNT></AMOUNT> <DATE></DATE> <Ledgerlist>........</Ledgerlist> <Ledgerlist>........</Ledgerlist> </VOUCHER> </TALLYGRAPHS>
TDL组件工作逻辑
- Form:作为顶层容器,定义导出数据的根XML标签,指定要渲染的核心Part,是整个输出结构的入口。
- Part:用于组织Line元素,可通过
REPEAT绑定数据集合,控制内容的布局(如滚动、边框),是连接Form和Line的中间层。 - Line:负责单个数据项的输出,绑定具体字段并定义XML标签,支持通过
EXPLODE属性嵌套子Line/Part,实现层级数据结构。
嵌套Ledger明细的解决方案
原代码问题分析
GetLedger集合未关联当前Voucher,导致Ledger数据无法和对应发票绑定。EXPLODE使用错误,额外的Ledgerlist Line TitlePart导致层级结构混乱。
修改后的XML请求代码
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>Export</TALLYREQUEST> <TYPE>Data</TYPE> <ID>DaybookGR</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <EXPLODEFLAG>Yes</EXPLODEFLAG> <CURRENTCOMPANY>${company}</CURRENTCOMPANY> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT> <SVFROMDATE>${fromDate}</SVFROMDATE> <SVTODATE>${toDate}</SVTODATE> </STATICVARIABLES> <TDL> <TDLMESSAGE> <REPORT NAME="DaybookGR"> <FORMS>DaybookGR</FORMS> <TITLE>DaybookGR </TITLE> </REPORT> <FORM NAME="DaybookGR"> <TOPPARTS>DaybookGR</TOPPARTS> <XMLTAG>"TallyGraphs"</XMLTAG> </FORM> <PART NAME="DaybookGR"> <TOPLINES>Daybook Details</TOPLINES> <REPEAT>Daybook Details : GetLedgerCollAmt</REPEAT> <SCROLLED>Vertical</SCROLLED> <COMMONBORDERS>Yes</COMMONBORDERS> </PART> <LINE NAME="Daybook Details"> <LEFTFIELDS>PartyLedgerName</LEFTFIELDS> <RIGHTFIELDS>VoucherTypeName,VoucherNumber,Amount,Date</RIGHTFIELDS> <XMLTAG>Voucher</XMLTAG> <!-- 直接嵌套Ledger明细Line --> <EXPLODE>Ledger Details</EXPLODE> <BELONGSTO>YES</BELONGSTO> </LINE> <LINE NAME="Ledger Details"> <LEFTFIELDS>LedgerName, LedgerAmount</LEFTFIELDS> <XMLTAG>LedgerList</XMLTAG> <BELONGSTO>YES</BELONGSTO> </LINE> <FIELD NAME="PartyLedgerName"> <USE>Name Field</USE> <SET>$PartyLedgerName</SET> </FIELD> <FIELD NAME="Date"> <USE>Long Date Field</USE> <SET>$$DDMMYYYYDateFormat:$Date:"-"</SET> </FIELD> <FIELD NAME="VoucherNumber"> <USE>Name Field</USE> <SET>$VoucherNumber</SET> </FIELD> <FIELD NAME="Amount"> <USE>Amount Field</USE> <SET>$Amount</SET> </FIELD> <FIELD NAME="LedgerName"> <USE>Name Field</USE> <SET>$Name</SET> </FIELD> <FIELD NAME="LedgerAmount"> <USE>Amount Field</USE> <SET>$Amount</SET> </FIELD> <COLLECTION NAME="AllVouchers" ISMODIFY="No"> <TYPE>Voucher</TYPE> <BELONGSTO>YES</BELONGSTO> <FILTER>IsOptionalFilter</FILTER> </COLLECTION> <!-- 关联当前Voucher的Ledger集合 --> <COLLECTION NAME="GetLedger" ISMODIFY="No"> <TYPE>LedgerEntry</TYPE> <WALK>Entries</WALK> <BELONGSTO>YES</BELONGSTO> <FETCH>Name, Amount</FETCH> </COLLECTION> <COLLECTION NAME="GetLedgerCollAmt" ISMODIFY="No"> <SourceCOLLECTION>AllVouchers</SourceCOLLECTION> <FETCH>VoucherNumber,PartyLedgerName,Amount,VoucherTypeName,Date</FETCH> <!-- 关联Ledger集合到当前Voucher --> <CHILDOBJECT>GetLedger</CHILDOBJECT> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="IsOptionalFilter">NOT $IsOptional</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
关键修改说明
- 关联Voucher与Ledger:在
GetLedgerCollAmt集合中添加<CHILDOBJECT>GetLedger</CHILDOBJECT>,将Ledger明细绑定到对应Voucher;GetLedger集合使用<WALK>Entries</WALK>遍历当前Voucher的所有Ledger条目。 - 简化层级结构:移除多余的
Ledgerlist Line TitlePart和Line,直接在Daybook DetailsLine中用<EXPLODE>Ledger Details</EXPLODE>嵌套Ledger明细。 - 修正字段绑定:新增
LedgerName和LedgerAmount字段,正确绑定Ledger条目的名称和金额。
验证预期输出
修改后导出的XML将符合需求的嵌套结构:
<TALLYGRAPHS> <VOUCHER> <PARTYLEDGERNAME>...</PARTYLEDGERNAME> <VOUCHERTYPENAME>...</VOUCHERTYPENAME> <VOUCHERNUMBER>...</VOUCHERNUMBER> <AMOUNT>...</AMOUNT> <DATE>...</DATE> <LedgerList> <LEDGERNAME>...</LEDGERNAME> <LEDGERAMOUNT>...</LEDGERAMOUNT> </LedgerList> <LedgerList> <LEDGERNAME>...</LEDGERNAME> <LEDGERAMOUNT>...</LEDGERAMOUNT> </LedgerList> </VOUCHER> <!-- 更多Voucher条目 --> </TALLYGRAPHS>
内容的提问来源于stack exchange,提问作者Abisha
相关产品推荐
相关产品推荐

