The below XML request used to fetch voucher data from tally ERP9 Code: <ENVELOPE><HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER><BODY><EXPORTDATA><REQUESTDESC><STATICVARIABLES><SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>20220216</SVFROMDATE>20220216<SVTODATE></SVTODATE></STATICVARIABLES><REPORTNAME>Voucher Register</REPORTNAME></REQUESTDESC></EXPORTDATA></BODY></ENVELOPE> It works fine if the voucher count is less . But when voucher count is approx(14,000) gives error as " Out of memory " Is there any way to fetch voucher report when voucher count is more ? Or Is it possible to split the report into 2 or more parts and fetch the data. Note: I have tried to split the data based on date but 1 day have 14,000 vouchers. How to split further?
Tally doesn't provide pagination. So, need to create your own pagination mechanism. Ex: Paginate by 1,000 Code: <ENVELOPE Action=""> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMVoucherCOL</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY="No" ISFIXED="No" ISINITIALIZE="No" ISOPTION="No" ISINTERNAL="No" NAME="CUSTOMVoucherCOL"> <TYPE>Vouchers</TYPE> <NATIVEMETHOD>MasterId</NATIVEMETHOD> <NATIVEMETHOD>*</NATIVEMETHOD> <COMPUTE>LineIndex : ##vLineIndex</COMPUTE> <COMPUTEVAR>vLineIndex: Number : IF $$IsEmpty:##vLineIndex THEN 1 ELSE ##vLineIndex + 1</COMPUTEVAR> <FILTERS>PaginationFilter</FILTERS> </COLLECTION> <SYSTEM TYPE="Formulae" NAME="PaginationFilter">##vLineIndex <= 1000 AND ##vLineIndex > 0</SYSTEM> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE> } For Second page change PaginationFilter to Code: ##vLineIndex <= 2000 AND ##vLineIndex > 1000 ----------------------------------------------------------------------------------------------------- If you are using C# or python, Tally Connector Library Supports this. Page -1 Code: TCM.Pagination.PaginatedResponse<TCM.Voucher> paginatedResponse = await _tallyService.GetVouchersAsync(new() { RecordsPerPage = 1000,PageNum=1}); var objects = paginatedResponse.Data; Page-2 Code: TCM.Pagination.PaginatedResponse<TCM.Voucher> paginatedResponse = await _tallyService.GetVouchersAsync(new() { RecordsPerPage = 1000,PageNum=2}); var objects = paginatedResponse.Data;
Using above Xml request I could able fetch 500 voucher out of 1000 voucher. So I replaced PHP: <COMPUTEVAR>vLineIndex: Number : IF $$IsEmpty:##vLineIndex THEN 1 ELSE ##vLineIndex + 1</COMPUTEVAR> to PHP: <COMPUTEVAR>vLineIndex: Number : IF $$IsEmpty:##vLineIndex THEN 1 ELSE ##vLineIndex + 0.5</COMPUTEVAR> and able to fetch 1000 voucher. But using same xml request when I tried to fetch vouchers , query returns only 1 out of 2 voucher. Is above request can be modified to work for any number of vouchers?
I didn't understand what issue you are facing One suggestion is Keep Code: <COMPUTEVAR>vLineIndex: Number : IF $$IsEmpty:##vLineIndex THEN 1 ELSE ##vLineIndex + 1</COMPUTEVAR> as is If you want to increase or decrease number of results per page change in Fiter only
Using above query i was able to fetch only 500 vouchers at a time. But as per it should have fetched 1000 voucher.
It will fetch 1,000 vouchers only (unless you changed something like date or any filter). Once post your full xml
I previously asked, "Is there any way to fetch voucher report when voucher count is more?" I changed the XML request you gave me, and it now functions without an Out of Memory issue. Code: <ENVELOPE> <HEADER> <VERSION>1</VERSION> <TALLYREQUEST>EXPORT</TALLYREQUEST> <TYPE>COLLECTION</TYPE> <ID>CUSTOMVoucherCOL</ID> </HEADER> <BODY> <DESC> <STATICVARIABLES> <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE TYPE='Date'>YYYYMMDD</SVFROMDATE> <SVTODATE TYPE='Date'>YYYYMMDD</SVTODATE> </STATICVARIABLES> <TDL> <TDLMESSAGE> <COLLECTION ISMODIFY='No' ISFIXED='No' ISINITIALIZE='No' ISOPTION='No' ISINTERNAL='No' NAME='CUSTOMVoucherCOL'> <TYPE>Voucher</TYPE> <FETCH>ALLLEDGERENTRIES.LIST,BANKALLOCATIONS.LIST,LEDGERENTRIES.LIST</FETCH> </COLLECTION> </TDLMESSAGE> </TDL> </DESC> </BODY> </ENVELOPE>