Skip to content

v1.30.0 — UDT rowuid conditions, OData limits, verified REST and Transaction notes

Latest

Choose a tag to compare

@mrwuss mrwuss released this 30 Oct 02:23
· 1 commit to master since this release
8d4bb22

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's udt_{tablename}_uid value. 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 with rows[].conditions: [{"rowuid": N}] and delete with top-level conditions: [{"rowuid": N}] each changed exactly the named row. The {"name": ..., "value": ...} condition still fails: 400 Invalid 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 ignores name and value when rowuid is present, the key name is not case-sensitive, and several rowuid conditions select several rows. Nesting delete's conditions in rows[] is still a 400. The Update, Delete, read and full-workflow examples in doc 13 now send rowuid and 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 on inv_mast.extended_desc through the Item service, while the same values store an empty string on oe_hdr.delivery_instructions and leave oe_hdr.po_no unchanged. extended_desc and delivery_instructions were each re-run and restored to their original values; the note now gives all three fields. The raw Item create 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 /ping family 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/0 Summary and writes nothing; a body with no Name is an empty HTTP 500. NULL was not stored on the two fields tested: "", null and a space store an empty string on one and leave the old value on the other. m_invoices needs allow_api_to_print_and_reprint_invoice Y and a date range covering the invoice, or it is an empty 500. StrategicPricingLibrary adds a book first with sequence_number 0. 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, ping and DELETE /api/ui/admin/session/{id} work once an Interactive session is open. The v1 change under /api is a 404; without /api it takes only the v2 body, and the documented ChangeRequests body is a silent no-op (Status: 0). A Contact create with address_id joins an existing address and adds the contacts_x_ship_to link; 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/orders filters with $query on PascalCase names and returns lines with extendedproperties=Lines. extendedproperties fills REST-family child collections, and UserDefinedFields carries the *_ud row; both correct docs/15. Item IDs with / reach the v2/parts/v2/price and v2/parts/availability?itemId= routes, and batch pricing drops unknown IDs. api/ecommerce GetItemPrice works as JSON or XML; GetPDFDocument did not. /data/manifest/v1 writes, and /data/erp/views/v1 takes $inlinecount, not $count. docs/13 also credits Bryce Byker; docs/15 no longer lists userdefinedfields/generate as 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. A GET query string stops at 8,192 characters (8,193 returns an IIS HTML 404, not an OData error), and a flat or chain stops at 799 terms (Recursion depth exceeded allowed limit.). POST {collection}/$query with a text/plain body lifts the first limit; parenthesized groups get past the second. $apply is accepted and silently ignored, like in, which was re-verified. Decimals arrive as JSON numbers at full scale, so parse them as decimals or send IEEE754Compatible=true. Order lines carry no header status, with a Python and C# program that reads open-order headers and then their lines in $query batches (3 line requests against 24 GETs, same total). Testing corrected one detail: customer_id is Edm.Decimal, not an integer type. Closes #224 — @mrwuss
  • docs: The pdfreport DataElement name comes from the definition, verified on play 26.1.5950.0. Crystal report windows such as m_unvoucheredpos and m_vendorinvoicereport name their criteria element CRITERIA.criteria, not TABPAGE_1.*; the copied TABPAGE_1.tp_1_dw_1 returns an empty HTTP 500. On m_unvoucheredpos the 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_unvoucheredpos has 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