# `Sp_AL_SHDCheckSave` (procedure) > 业务单据保存校验 - **Type:** PROCEDURE - **Deterministic:** NO - **SQL data access:** CONTAINS SQL ## Parameters | # | Mode | Name | Type | |---|---|---|---| | 1 | IN | `sFormGuid` | `varchar(100)` | | 2 | IN | `sGuid` | `varchar(100)` | | 3 | IN | `sTableName` | `varchar(100)` | | 4 | IN | `sLoginId` | `varchar(100)` | | 5 | OUT | `sReturn` | `varchar(4000)` | | 6 | IN | `sBrId` | `varchar(100)` | | 7 | IN | `sSuId` | `varchar(100)` | | 8 | OUT | `sCode` | `int` | ## Body _Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_AL_SHDCheckSave`'`._ ## Narrative **Business context:** 送货单 (Delivery) save-time validation + qty redistribution for `saldelivergoodsslavechildren` (the batch-level child of 送货单 slave) — header says 业务单据保存校验. The `AL` prefix and `SHD` token mark this as a customer-specific helper rather than a standard `Sp_Check_s` proc. **What it does:** Rejects the save with localized code `-1` if any product/batch combination (`sProductId`,`sDefineNo`,`sDefineNo2`) appears more than once under the same master. Then for each `sProductId` under `sGuid` it sums the `dProductQty + dGiveQty` on `saldelivergoodsslave`, walks `saldelivergoodsslavechildren` rows in `iOrder` sequence using MySQL session variables (`@dQty`/`@dCheckQty`/`@sProduct`) to compute running totals, and rewrites `dProductQty`/`dUseQty` so the children sum exactly matches the slave-line qty (truncates the last child when the running total would exceed). Finally deletes any child rows whose final `dUseQty<=0`. **Invocation:** Status: appears orphaned. No `gdsmodule.sSaveProName`/`sSaveProNameBefore`/`sDeleteProName` slot in this database references it, no `gdsconfigformmaster.sSqlStr` embeds it, no other routine calls it, and `grep` finds zero call sites in `xly-src`. Candidate for maintainer audit.