You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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明细的解决方案

原代码问题分析

  1. GetLedger集合未关联当前Voucher,导致Ledger数据无法和对应发票绑定。
  2. EXPLODE使用错误,额外的Ledgerlist Line Title Part导致层级结构混乱。

修改后的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>

关键修改说明

  1. 关联Voucher与Ledger:在GetLedgerCollAmt集合中添加<CHILDOBJECT>GetLedger</CHILDOBJECT>,将Ledger明细绑定到对应Voucher;GetLedger集合使用<WALK>Entries</WALK>遍历当前Voucher的所有Ledger条目。
  2. 简化层级结构:移除多余的Ledgerlist Line Title Part和Line,直接在Daybook Details Line中用<EXPLODE>Ledger Details</EXPLODE>嵌套Ledger明细。
  3. 修正字段绑定:新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:54:14