# `Sp_Check_sPpa` (procedure) > 采购申请单据保存之前数据校验 - **Type:** PROCEDURE - **Deterministic:** NO - **SQL data access:** CONTAINS SQL ## Parameters | # | Mode | Name | Type | |---|---|---|---| | 1 | IN | `sTableName` | `varchar(100)` | | 2 | IN | `sGuid` | `varchar(100)` | | 3 | IN | `sFormGuid` | `varchar(100)` | | 4 | IN | `sLoginId` | `varchar(100)` | | 5 | IN | `sBrId` | `varchar(100)` | | 6 | IN | `sSuId` | `varchar(100)` | | 7 | IN | `iFlag` | `int` | | 8 | OUT | `sCode` | `int` | | 9 | OUT | `sReturn` | `varchar(4000)` | ## Body _Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_Check_sPpa`'`._ ## Narrative **Business context:** 采购管理 → 采购明细 → 采购申请单据 — post-save validator on `purpurchaseapplymaster`/`purpurchaseapplyslave`/`purpurchaseapplydetail`. Same shape as `Sp_Check_sPod` but for the upstream purchase-requisition: re-runs 正算/反算 quantity formulas, enforces 反算公式物料 and 烟包类型 rules, and caps the requested qty against the originating sales-order need. **What it does:** Sets `sCode=1`, `iFlag=0`, clears `sReturn`. Reads `NetMoney`/`NetPrice` precisions. Barriers up front: `iHandIn=1` rows whose `eleproduct.bInverse=0` abort with `sMaterialNotFsgsSq` ("物料不是反算公式物料,请输入申请数量进行计算"); 客服-channel requests with no 烟包类 selected abort with `sTypeSelectCiggrate`. Opens nested cursors over `purpurchaseapplyslave` × `purpurchaseapplydetail` joined to the upstream sales-order / forecast row, dispatches to `Sp_System_ReplaceField` forward formula or the reverse-formula branch (`eleformula.sComputeId`/`sReComputeId`), recomputes `dMaterialsQty`/`dAuxiliaryQty` and the money columns, updates the slave/detail rows. On overruns raises `sPpaSqQtyUpNeed`/`sPpaHsQtyUpNeed`/`sPpaHsSqQtyUpNeed`/`sHsQtyUpSaleOrder`/`sHsSqQtyUpSaleOrder`/`sSqQtyUpSaleOrder`/`sPcaMaterialInOrder`/`sPcaMaterialInCgOrder`. Finally calls `Sp_afterSave_sPpa`. **Invocation:** Status: appears orphaned. The module `采购申请单据` (`192116810113315217105813660`, 采购管理 → 采购明细) binds `Sp_Calc_sPpa` on `sProcName` and the newer `采购申请(新)` (`192116811110216195779824320`) binds `Sp_Calc_sPpa1`, but `Sp_Check_sPpa` itself is not wired as `sSaveProName`/`sSaveProNameBefore` on any module. No other routine references it. xly-src ships `script/标版/30100101/Sp_Check_sPpa.sql` as the install body — the script is in the codebase but the hook is unbound — candidate for maintainer audit.