# `Sp_Check_sSodbecome` (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_sSodbecome`'`._

## Narrative

**Business context:** 订单变更单据 (sales-order change) post-save validator on `salsalesorderbecomemaster`/`salsalesorderbecomeslave`. Cross-checks the chosen 变更类型 (`iBecome`: 0=订单取消, 1=数量变更, 2=数量单价同时变更, 3=单价变更) and 取消子类型 (`iCancel`: 0/1/2/3/4 — controls cost responsibility) against what has already happened on the original order — purchases, work orders, outsourced ops, deliveries, material applications — and refuses combinations that would orphan downstream documents.

**What it does:** Reads `iBecome`/`iCancel` from `salsalesorderbecomemaster`. Aborts with `sTypeNeedCancel` when both are non-zero. For `iBecome=0` (order cancel) + `iCancel=1` (取消-无成本), counts existing rows in `purpurchaseorderdetail`, `mftworkorderslave`, `opsoutsideprocessmaster` (both `192116810113315234963208090` 外购 and `101801153119616594919790770` 工序发外 forms), and `mitproductionapplymaster` joined back via `salsalesorderbecomeslave.sOrderSlaveId`; any hit triggers `sOrderAlreadyPurchased`/`sOrderHaveWorkOrder`/`sOrderHaveWg`/`sOrderHaveFw`/`sOrderHaveLl`. `iCancel=2` checks `saldelivergoodsslave` (`sOrderHaveDelivery`). `iCancel=3` (半成品收费) requires non-zero price and matching qty (`sCancelCost`). `iCancel=4` (质量事故) requires `sSlaveAccidentNo` set (`sCanelNeedQualityNo`). `iBecome=1` requires non-zero qty and untouched price (`sChangeQtyNotZero`). `iBecome=2` requires both non-zero (`sChangePriceNotZero`). `iBecome=3` requires non-zero price and untouched qty (`sChangeProductPriceNotZero`).

**Invocation:** Status: appears orphaned. The module `订单变更单据` (sId `101251240115016233151134120`) is bound to `Sp_Calc_sOrderBgd` for audit but has no `sSaveProName`/`sSaveProNameBefore` hook in the current DB snapshot. No form-master or other-routine caller found. xly-src ships no `Sp_Check_sSodbecome.sql` either. Candidate for maintainer audit on whether the validator was deprecated when the 订单变更 workflow moved to `Sp_Calc_sOrderBgd`.
