向Tally发送XML请求获取磁盘公司列表时遇Starting From公式错误
解决Tally XML请求中"Starting From"公式错误问题
问题描述
向Tally发送XML请求获取磁盘上的公司列表时,只要包含起始日期(Starting From)字段,就会收到错误提示:Cannot understand Bad formula! 'Starting From'。移除该字段后能正常返回结果,但业务逻辑必须包含这个字段,需要解决此公式错误。
原请求XML代码:
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>DATA</TYPE> <ID>CA_COMPANY</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:xml</SVEXPORTFORMAT> </STATICVARIABLES> <TDL> <TDLMESSAGE> <REPORT ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <FORM>CA_COMPANY</FORM> </REPORT> <FORM ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <PART>CA_COMPANY</PART> <XMLTAG>COMPANIES</XMLTAG> </FORM> <PART ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <LINE>CA_COMPANY</LINE> <REPEAT>CA_COMPANY:CA_COMPANYCOLLECTION</REPEAT> <SCROLLED>Vertical</SCROLLED> </PART> <LINE ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <FIELDS> CA_NAME,CA_STARTINGFROM </FIELDS> <XMLTAG>COMPANY</XMLTAG> </LINE> <FIELD ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_NAME"> <SET>$NAME</SET> <XMLTAG>NAME</XMLTAG> </FIELD> <FIELD ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_STARTINGFROM"> <TYPE>Date</TYPE> <SET>$STARTINGFROM</SET> <XMLTAG>STARTINGFROM</XMLTAG> </FIELD> <COLLECTION ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANYCOLLECTION"> <TYPE>COMPANYONDISK</TYPE> <NATIVEMETHOD>NAME</NATIVEMETHOD> <NATIVEMETHOD>STARTINGFROM</NATIVEMETHOD> </COLLECTION> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
解决方案
错误的核心原因是Tally的COMPANYONDISK集合不支持直接调用STARTINGFROM原生方法,该集合仅暴露有限的原生属性,STARTINGFROM不在其中。要获取公司的起始日期,需通过COMPANY对象而非COMPANYONDISK访问该字段。
修改后的XML请求代码如下:
<ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>DATA</TYPE> <ID>CA_COMPANY</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:xml</SVEXPORTFORMAT> </STATICVARIABLES> <TDL> <TDLMESSAGE> <REPORT ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <FORM>CA_COMPANY</FORM> </REPORT> <FORM ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <PART>CA_COMPANY</PART> <XMLTAG>COMPANIES</XMLTAG> </FORM> <PART ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <LINE>CA_COMPANY</LINE> <REPEAT>CA_COMPANY:CA_COMPANYCOLLECTION</REPEAT> <SCROLLED>Vertical</SCROLLED> </PART> <LINE ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANY"> <FIELDS> CA_NAME,CA_STARTINGFROM </FIELDS> <XMLTAG>COMPANY</XMLTAG> </LINE> <FIELD ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_NAME"> <SET>$NAME</SET> <XMLTAG>NAME</XMLTAG> </FIELD> <FIELD ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_STARTINGFROM"> <TYPE>Date</TYPE> <!-- 使用COMPANY对象的STARTINGFROM属性 --> <SET>##COMPANY:$NAME.STARTINGFROM</SET> <XMLTAG>STARTINGFROM</XMLTAG> </FIELD> <COLLECTION ISMODIFY="NO" ISFIXED="NO" ISINITIALIZE="NO" ISOPTION="NO" ISINTERNAL="NO" NAME="CA_COMPANYCOLLECTION"> <TYPE>COMPANYONDISK</TYPE> <NATIVEMETHOD>NAME</NATIVEMETHOD> <!-- 移除STARTINGFROM原生方法,因为COMPANYONDISK不支持 --> </COLLECTION> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>
修改说明
- 移除集合中的
STARTINGFROM原生方法:从CA_COMPANYCOLLECTION的<NATIVEMETHOD>标签里删掉STARTINGFROM,因为COMPANYONDISK集合不提供这个属性的直接访问。 - 修改字段的SET公式:将
CA_STARTINGFROM字段的<SET>值从$STARTINGFROM改为##COMPANY:$NAME.STARTINGFROM,通过公司名称关联到COMPANY对象,进而获取其起始日期属性。
这样修改后,XML请求就能正确获取到公司的起始日期,同时避免公式错误。
内容的提问来源于stack exchange,提问作者Ammar Haider
相关产品推荐
相关产品推荐

