Repository navigation
This release also includes the 2026-10-21 and 2026-10-17 entries in the changelog.
- fix: UDT update and delete reach a 2026.1-created UDT's rows with
{"rowuid": N}, where N is the row'sudt_{tablename}_uidvalue. Verified on play 26.1.5950.0 on a UDT created there, with an OData read-back after every call on rows added for the test: update withrows[].conditions: [{"rowuid": N}]and delete with top-levelconditions: [{"rowuid": N}]each changed exactly the named row. The{"name": ..., "value": ...}condition still fails: 400Invalid Row Uid!on update and a[0] rows deleted ... successfully!no-op on delete, so the delete half of Breaking Changes entry 7 is now re-verified and the entry gives the fix. The service ignoresnameandvaluewhenrowuidis present, the key name is not case-sensitive, and severalrowuidconditions select several rows. Nesting delete'sconditionsinrows[]is still a 400. The Update, Delete, read and full-workflow examples in doc 13 now sendrowuidand read back by the primary key; the Python and C# versions all ran on play. docs/06, docs/01, the task index and the alert header follow. Closes #248 — @mrwuss - fix: What a blank stores depends on the field. A second run on play 26.1.5950.0 found that
null,""and a single space store SQL NULL oninv_mast.extended_descthrough theItemservice, while the same values store an empty string onoe_hdr.delivery_instructionsand leaveoe_hdr.po_nounchanged.extended_descanddelivery_instructionswere each re-run and restored to their original values; the note now gives all three fields. The rawItemcreate gotcha now quotes the error 26.1.5950.0 returns,Column is disabled: unit_id. A third route reads an item whose ID contains/:GET /api/inventory/parts/?$query=ItemId eq '{id}'returns the full part object. Closes #246 — @mrwuss - fix: docs/05 no longer contains a stale second copy of its own body. Lines 2348 to 4667 repeated the page in an older version (the
/pingfamily sweep, the$query"not yet discovered" row), and every heading in them produced a duplicate HTML id. The copy is removed; the page's closing sections (Common Errors, Common Mistakes, Entity API vs Other APIs, Related), which lived only after it, and one forum credit for Felipe Maurer are kept. Closes #240 — @mrwuss - docs: A completed PO's header saves once you add a blank lines-grid row, verified on play 26.1.5950.0: without the row the edit fails with "Save is not enabled." Refs #232 — John Kennedy, Spencer Smith (forum lead), verified @mrwuss
- docs: Transaction API leads from the P21WWUG forum, verified on play 26.1.5950.0. A body wrapped in
"TransactionSet", or one that starts at the transaction, returns HTTP 200 with a 0/0/0Summaryand writes nothing; a body with noNameis an empty HTTP 500. NULL was not stored on the two fields tested:"",nulland a space store an empty string on one and leave the old value on the other.m_invoicesneedsallow_api_to_print_and_reprint_invoiceYand a date range covering the invoice, or it is an empty 500.StrategicPricingLibraryadds a book first withsequence_number0. Closes #231, #238 — Felipe Maurer, Justin Cassidy (forum leads), verified @mrwuss - docs: Interactive session routes and the v1 change, verified on play 26.1.5950.0.
/ui/common/v1/sessions/state,favorites,pingandDELETE /api/ui/admin/session/{id}work once an Interactive session is open. The v1 change under/apiis a 404; without/apiit takes only the v2 body, and the documentedChangeRequestsbody is a silent no-op (Status: 0). AContactcreate withaddress_idjoins an existing address and adds thecontacts_x_ship_tolink; without it P21 creates a new address. Closes #236 — Felipe Maurer, Pat Merlino (forum leads), verified @mrwuss - docs: REST and Data Services leads from the P21WWUG forum, verified on play 26.1.5950.0.
/api/sales/ordersfilters with$queryon PascalCase names and returns lines withextendedproperties=Lines.extendedpropertiesfills REST-family child collections, andUserDefinedFieldscarries the*_udrow; both correct docs/15. Item IDs with/reach thev2/parts/v2/priceandv2/parts/availability?itemId=routes, and batch pricing drops unknown IDs.api/ecommerceGetItemPriceworks as JSON or XML;GetPDFDocumentdid not./data/manifest/v1writes, and/data/erp/views/v1takes$inlinecount, not$count. docs/13 also credits Bryce Byker; docs/15 no longer listsuserdefinedfields/generateas exercised. Closes #234, #235, #239 — Felipe Maurer, Eric Davis, Kevin St Laurent, Chris Goetz, David Levine (forum leads), verified @mrwuss - docs: OData request limits and
POST /$query, verified on play 26.1.5950.0. AGETquery string stops at 8,192 characters (8,193 returns an IIS HTML 404, not an OData error), and a flatorchain stops at 799 terms (Recursion depth exceeded allowed limit.).POST {collection}/$querywith atext/plainbody lifts the first limit; parenthesized groups get past the second.$applyis accepted and silently ignored, likein, which was re-verified. Decimals arrive as JSON numbers at full scale, so parse them as decimals or sendIEEE754Compatible=true. Order lines carry no header status, with a Python and C# program that reads open-order headers and then their lines in$querybatches (3 line requests against 24GETs, same total). Testing corrected one detail:customer_idisEdm.Decimal, not an integer type. Closes #224 — @mrwuss - docs: The
pdfreportDataElement name comes from the definition, verified on play 26.1.5950.0. Crystal report windows such asm_unvoucheredposandm_vendorinvoicereportname their criteria elementCRITERIA.criteria, notTABPAGE_1.*; the copiedTABPAGE_1.tp_1_dw_1returns an empty HTTP 500. Onm_unvoucheredposthe name is not case-sensitive. A table compares the definitions of eight report services. From user feedback, which said a one-tab window repeats its tab name;m_unvoucheredposhas two tabs. Closes #226 — user feedback, verified @mrwuss - docs: Removed the consumer-key scope note from 00 § API Scopes, the task index, the UDT authentication section and
CLAUDE.md; the purchase-receive-vouch recipe and its runbooks now name the OData table allow-list as the reason read-backs use the password login. Closes #163 — @mrwuss