求助:从Tally系统获取客户联系及地址信息失败,请求排查XML请求代码问题
求助:从Tally系统获取客户联系及地址信息失败,请求排查XML请求代码问题
问题描述
我正在开发一个从Tally系统拉取数据的应用,目前能成功获取客户的姓名、别名、父分类这些基础信息,但联系电话、邮编、国家/州、详细地址这些联系及地址类数据始终无法获取到。
我已经在XML请求的TDL部分指定了相关字段,但返回的结果里完全没有这部分内容。以下是我当前使用的TypeScript代码(包含生成XML请求的逻辑):
export const GET_SUNDRY_DEBTORS_XML = (companyName: string): string => ` <ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>Export</TALLYREQUEST> <TYPE>Collection</TYPE> <ID>Ledger</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVCURRENTCOMPANY>${companyName}</SVCURRENTCOMPANY> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION NAME="SundryDebtors" ISMODIFY="No"> <TYPE>Ledger</TYPE> <FETCH> NAME, PARENT, LEDMAILINGDETAILS.LIST, LEDMAILINGDETAILS.MAILINGNAME, LEDMAILINGDETAILS.PINCODE, LEDMAILINGDETAILS.ADDRESS, LEDMAILINGDETAILS.STATE, LEDMAILINGDETAILS.COUNTRY, CONTACTDETAILS.LIST, CONTACTDETAILS.PHONENUMBER, LANGUAGEALIAS, OPENINGBALANCE </FETCH> <FILTERS> <FILTER>OnlySundryDebtors</FILTER> </FILTERS> </COLLECTION> <SYSTEM TYPE="String" NAME="OnlySundryDebtors"> $$IsGroupEqual:$PARENT:"Sundry Debtors" </SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE> `;
问题排查与解决方案
我结合Tally的TDL(Tally Definition Language)规范,梳理出几个可能导致数据拉取失败的原因,以及对应的修正方案:
1. 核心字段名拼写错误
Tally中邮寄地址的标准父字段名是**LEDGERMAILINGDETAILS**(你当前写的是LEDMAILINGDETAILS,少了末尾的ER),这是很多开发者容易踩的拼写坑,直接导致Tally无法识别你要拉取的地址节点。
2. 重复子项的展开逻辑缺失
LEDGERMAILINGDETAILS和CONTACTDETAILS都属于重复子项(Repeating Sub-Items),仅通过.LIST引用无法完整拉取嵌套的子字段,需要用<EXPLODE>标签强制展开这些集合,让Tally返回所有关联的子数据。
3. 联系电话字段名版本差异
部分Tally版本中,联系电话的字段名是PHONE而非PHONENUMBER,如果你的Tally版本较旧,这个字段名不匹配也会导致数据为空。
修正后的完整TDL代码片段
<TDLMESSAGE> <COLLECTION NAME="SundryDebtors" ISMODIFY="No"> <TYPE>Ledger</TYPE> <!-- 修正字段名拼写,简化重复子项的引用 --> <FETCH> NAME, PARENT, LEDGERMAILINGDETAILS.MAILINGNAME, LEDGERMAILINGDETAILS.PINCODE, LEDGERMAILINGDETAILS.ADDRESS, LEDGERMAILINGDETAILS.STATE, LEDGERMAILINGDETAILS.COUNTRY, CONTACTDETAILS.PHONE, LANGUAGEALIAS, OPENINGBALANCE </FETCH> <!-- 强制展开嵌套的重复子项 --> <EXPLODE>LEDGERMAILINGDETAILS, CONTACTDETAILS</EXPLODE> <FILTERS> <FILTER>OnlySundryDebtors</FILTER> </FILTERS> </COLLECTION> <SYSTEM TYPE="String" NAME="OnlySundryDebtors"> $$IsGroupEqual:$PARENT:"Sundry Debtors" </SYSTEM> </TDLMESSAGE>
额外测试建议
- 如果修正后仍无数据,可以尝试在
<FETCH>中仅保留LEDGERMAILINGDETAILS和CONTACTDETAILS(不带子字段),让Tally返回该节点的所有默认字段,以此确认字段名的正确性。 - 核对Tally版本兼容性:不同版本的Tally在TDL字段名上可能存在细微差异,建议参考对应版本的官方文档确认字段规范。
内容来源于stack exchange
相关产品推荐
相关产品推荐

