# `Sp_SalesInvoicing_CheckUpdate` (procedure) > 销售对账&开票单据保存后校验 - **Type:** PROCEDURE - **Deterministic:** NO - **SQL data access:** CONTAINS SQL ## Parameters | # | Mode | Name | Type | |---|---|---|---| | 1 | IN | `sGuid` | `varchar(100)` | | 2 | IN | `sFormGuid` | `varchar(100)` | | 3 | IN | `sLoginId` | `varchar(100)` | | 4 | IN | `sBrId` | `varchar(100)` | | 5 | IN | `sSuId` | `varchar(100)` | | 6 | OUT | `sCode` | `int` | | 7 | OUT | `sReturn` | `varchar(4000)` | ## Body _Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_SalesInvoicing_CheckUpdate`'`._ ## Narrative **Business context:** 销售管理 → 销售对账/开票流程 → 销售对账 (`salsalescheckingmaster` / `salsalescheckingslave` / `salsalescheckingchild`); body comment 销售对账&开票单据保存后校验. POST-save validator that enforces the two business rules a 销售对账 must obey before the row can be persisted: every 送货单 (`sSrcNo`) may appear only once, and all lines must come from one and the same customer. It also redistributes the per-child `dProductQty` so each child's allocation cannot exceed the remaining `dProductQty - dCheckingQty` on the source `saldelivergoodsslave`. **What it does:** (1) Aggregates `salsalescheckingslave` by `sSrcNo,sSrcSlaveId` for `sParentId=sGuid` and rejects with localised `sDeliveryNoDuplicate` (送货单号重复选择,请核实删除) if any combination repeats; (2) joins through `saldelivergoodsmaster→elecustomer` and rejects with `sDeliveryNoNeedSameCustomer` if more than one customer is in the basket; (3) for each slave row, opens nested cursors that compute the maximum sellable quantity `MIN(SUM(dProductQty)/MAX(dCoefficient))` over `salsalescheckingchild + saldelivergoodsslave` and rejects with `sOrderProductQtyUp` if the slave qty exceeds it, otherwise re-allocates `dProductQty` across child rows in `iIncrement` order; (4) recomputes `dProductForeignPrice` on return-style rows (`sSrcNo LIKE '%XSTH%'`); (5) chains to `CALL Sp_Check_sSck` for the standard 销售对账 post-save check. **Invocation:** Naming pattern + `(sGuid,sFormGuid,sLoginId,sBrId,sSuId,OUT sCode,OUT sReturn)` signature places this as a `gdsmodule.sSaveProName` POST-save hook on the 销售对账单据 form (module sId `11811781131121915184849572550`) — runs after `BusinessBaseServiceImpl.addUpdateDelBusinessData` persists the bill. No xly-src caller; not referenced from any other proc. The trailing `CALL Sp_Check_sSck` ties it to the same bill family.