## Overview
ExecuteBillQuery is the most versatile read API in Kingdee K3 Cloud: given a bill FormId, a comma-separated FieldKeys list and a SQL-like FilterString, it returns bill data page by page. For sales orders the FormId is SAL_SaleOrder; other common FormIds include PUR_PurchaseOrder (purchase order), SAL_OUTSTOCK (sales delivery) and AR_RECEIVABLE (receivable).
### Request essentials
1. Authenticate first with LoginByAppSecret and replay the session cookie on this call.
2. FieldKeys is a comma-separated list of field identifiers; entry-row fields need their entity prefix, e.g. FSaleOrderEntry_FMaterialId.FNumber.
3. For incremental sync, filter on the bill modify time (FModifyDate >= last watermark) and typically require FDocumentStatus = 'C' (approved).
4. Page with StartRow and Limit (keep Limit at or below 2000 rows); when the returned row count is smaller than Limit you have reached the last page.
5. Leave TopRowCount at 0 so pagination is fully controlled by StartRow/Limit.
### Integration advice
When Qeasy syncs Kingdee sales orders it uses FModifyDate as the incremental cursor and composes an idempotency key from FBillNo plus the entry-row sequence before writing to downstream systems, preventing duplicate vouchers in the target.
### Troubleshooting
A FieldKeys entry that does not exist on the bill fails the whole call, so validate identifiers with the online OpenAPI debugger in the Kingdee console first. String literals inside FilterString need doubled single quotes. For secondary-development custom fields, use the identifiers from the BOS designer, and make sure the third-party application has been granted query permission on that bill type — missing grants surface as empty results rather than errors.