补充BOS单据取号及编号定义规则
This commit is contained in:
@@ -4,10 +4,16 @@
|
||||
|
||||
## 数据字典(AD_TABLE / AD_COLUMN / AD_REFBYTABLE)
|
||||
|
||||
### 单据编号定义(AD_SEQUENCE)
|
||||
|
||||
取单号函数为 `Get_SequenceNo('<CODE>', AD_CLIENT_ID)`。默认约定是 `CODE` 取单据 `DOCNO` 字段对应的 `AD_COLUMN.SEQUENCENAME` 值,CODE 的定义在 `AD_SEQUENCE` 表中;第二个参数取单据实际的 `AD_CLIENT_ID`。分析编号规则时,先定位单据及其 `DOCNO` 字段配置,再到 `AD_SEQUENCE` 核实对应定义,特殊业务按目标环境的实际配置和过程逻辑处理。查询 `AD_SEQUENCE` 前先确认表结构和字段含义,不假定关联字段或编号格式。取号只生成 SQL 示例,不通过查询通道调用函数。
|
||||
|
||||
### 通用查询规则
|
||||
|
||||
处理 BOS 业务单据(如零售单、采购单、调拨单、销售单等)时,必须遵循以下查询路径:
|
||||
|
||||
在品小二环境按中文名称或中文描述筛选时,遵守 [中文条件与字符集兼容](./query-and-business-rules.md#中文条件与字符集兼容) 规则:不要直接把中文写入 `LIKE` 或等值条件,改用 `UNISTR` Unicode 转义。直接中文字面量返回 0 行时,先用 `UNISTR` 形式重试。
|
||||
|
||||
#### 用户提供表名称时的对象解析顺序
|
||||
|
||||
用户给出一个表名称,且没有明确要求绕过 BOS 元数据、直接按 Oracle 物理对象查询时,不要立即对该名称执行 `describe` 或数据查询。先确认它是 BOS 逻辑表、BOS 实际表,还是未在 BOS 注册的数据库对象。
|
||||
|
||||
@@ -30,6 +30,21 @@ WHERE BILLDATE = 20260501
|
||||
SELECT * FROM M_RETAIL
|
||||
```
|
||||
|
||||
## 中文条件与字符集兼容
|
||||
|
||||
品小二环境存在已知字符集转换问题:通过 Skill 查询时,中文字符串直接写成 `LIKE '%中文%'`,或直接把中文写入 `=` 等值条件,可能返回 0 行,即使数据库中存在匹配记录。
|
||||
|
||||
查询品小二中的中文值时,优先使用 Oracle `UNISTR` 和 Unicode 转义,将 SQL 中的中文条件保持为 ASCII。例如“零售单”的 Unicode 编码为 `96F6 552E 5355`,应写成:
|
||||
|
||||
```sql
|
||||
SELECT ID, NAME, DESCRIPTION
|
||||
FROM AD_TABLE
|
||||
WHERE DESCRIPTION LIKE '%' || UNISTR('\96F6\552E\5355') || '%'
|
||||
AND ROWNUM <= 20
|
||||
```
|
||||
|
||||
精确匹配同样适用,例如“品小二”可写成 `= UNISTR('\54C1\5C0F\4E8C')`。中文条件直接查询返回 0 行时,先改用 `UNISTR` 形式重试,再判断数据是否确实不存在。对其他 client,如果直接中文字面量已验证可用,不必强制改写;但在需要跨客户复用 SQL,或希望让 SQL 文本保持 ASCII、避免客户端/HTTP/命令行传输转换时,`UNISTR` 也是有帮助的通用兜底。该函数返回 Oracle national character set,面对超大表的 `VARCHAR2` 索引条件时仍应关注执行计划;无论使用哪种写法,仍须遵守生产查询的过滤条件和行数限制。
|
||||
|
||||
## 常用业务对象说明
|
||||
|
||||
当用户使用商品、款号、条码、SKU、库存等业务词时,默认按以下对象理解:
|
||||
@@ -103,7 +118,10 @@ CREATE TABLE TableName (
|
||||
|
||||
- 主表或子表新增记录的主键 `ID` 使用 `get_sequences('<表名称>')` 取值。
|
||||
- 如果目标表存在 `DOCNO` 字段,先查询 `AD_COLUMN` 中该字段是否配置 `SEQUENCENAME` 单据编号生成器。
|
||||
- 如果 `DOCNO` 对应的 `SEQUENCENAME` 有值,则单据编号使用 `Get_SequenceNo('<SEQUENCENAME>', 37)` 取值。
|
||||
- 取单号函数为 `Get_SequenceNo('<CODE>', AD_CLIENT_ID)`。一般情况下,`CODE` 取该单据 `DOCNO` 字段对应的 `AD_COLUMN.SEQUENCENAME` 值,第二个参数取单据实际的 `AD_CLIENT_ID`;这是默认业务约定,特殊业务以目标环境的实际配置和过程逻辑为准。
|
||||
- `CODE` 的定义在 `AD_SEQUENCE` 表中。`AD_COLUMN.SEQUENCENAME` 是单据字段配置的取号 CODE;要理解编号规则,继续到 `AD_SEQUENCE` 核实该 CODE 对应的定义。先确认目标环境的表结构和字段含义,不凭经验假定关联字段或编号格式。
|
||||
- 如果 `DOCNO` 对应的 `SEQUENCENAME` 有值,则生成 `Get_SequenceNo('<SEQUENCENAME>', <单据的 AD_CLIENT_ID>)` 作为单据编号表达式。仅当该单据的 `AD_CLIENT_ID` 确认为 `37` 时,第二个参数才写 `37`;子表使用继承父表的客户 ID。配置为空时不猜测 `CODE`,应继续核实取号逻辑。
|
||||
- 取号函数可能推进编号状态,即使包装在 `SELECT` 中也不得通过 `query` / `qperm` 调用。这里只生成 SQL 示例,不实际取号。
|
||||
- 如果目标表存在 `AD_CLIENT_ID` 字段,默认值使用 `37`。
|
||||
- 如果目标表存在 `AD_ORG_ID` 字段,默认值使用 `27`。
|
||||
- 子表的 `AD_CLIENT_ID` 和 `AD_ORG_ID` 默认取父表记录中对应字段值,不单独写固定值。
|
||||
@@ -119,6 +137,7 @@ SELECT SEQUENCENAME
|
||||
FROM AD_COLUMN
|
||||
WHERE AD_TABLE_ID = (SELECT ID FROM AD_TABLE WHERE NAME = '<表名称>')
|
||||
AND UPPER(DBNAME) = 'DOCNO'
|
||||
AND ROWNUM <= 20
|
||||
```
|
||||
|
||||
## 字段值域映射规则(AD_COLUMN / AD_LIMITVALUE)
|
||||
|
||||
Reference in New Issue
Block a user