用途
openerp-discovery 是 openerp-cli 的发现层,用于在运行期查询金蝶任意业务对象,无需等领域命令封装。金蝶业务对象上千个,高频对象已有领域命令,其余对象一律走这套三步发现流程。当要查询的对象没有现成领域命令、或不确定 FormId/字段名时使用。
使用前需先读 ../openerp-shared/SKILL.md,了解鉴权、退出码与输出契约。
主要能力
三步发现工作流:
- 找对象 FormId(搜 BOS_ObjectType):
openerp objects --keyword 销售订单
# → 行含 [FID, FName, FSubSystemId],FID 即 FormId(如 SAL_SaleOrder)
- 查该对象的可用字段:
openerp schema SAL_SaleOrder --fields-only
# → 各 entry 的字段 key/中文名/类型/关联对象(lookUpForm)
- 用发现到的字段查数据:
openerp query --form-id SAL_SaleOrder \
--fields "FBillNo,FDate,FCustId.FName,FMaterialId.FNumber,FQty" \
--filter "FBillNo='XSDD000006'" --top 20
objects 命令支持按关键词或子系统过滤:
openerp objects --keyword <名称关键词> # 必须给收敛条件
openerp objects --subsystem <子系统> # 按子系统过滤
openerp objects --keyword 委外 --top 30
schema 命令:
openerp schema <FormId> # 完整元数据
openerp schema <FormId> --fields-only # 精简字段清单(推荐)
发现前先回忆、发现后即沉淀:三步发现前先 ls ~/.config/openerp/object-notes/ 查看该 FormId 有无既往经验;查通后把已验证的字段/过滤/陷阱写回 object-notes/{FormId}.{profile}.md。约定见 ../openerp-shared/SKILL.md §6「对象经验」。
关键规则(实测坐实,务必遵守)
- 字段 key 不要带 entry/分录前缀。ExecuteBillQuery 把表头与分录字段拉平在同一命名空间:用分录字段就直接写它的 key(如 FMaterialId、FQty),不要写 FEntity.FMaterialId / FSaleOrderEntry.FQty(会报“标识为 FEntity 的字段不存在”)。
- 关联字段用点号下钻:FSupplierId.FName、FMaterialId.FNumber、FCustId.FNumber。schema 输出里字段的 lookUpForm 非空即表示它是关联字段,可点号取关联对象的字段。
- 字段名大小写敏感,以 schema 实测为准(同一概念在不同单据可能是 FMaterialId / FMATERIALID / FMaterialID)。
- 查询要带过滤或 --top,避免全表扫描;超过 2000 行用 --page-all。
- 某字段整列为 null:多为无数据权限或字段名拼错 → 回到 schema 核对。
命名陷阱与不支持项
- 即时库存现量用 STK_Inventory(现存量余额对象),不是 STK_InventoryQuery(后者是查询界面,无字段模型)。已封装为
openerp inventory balance list。 - 报表/账表(模型类型 900、GUID 命名,如“销售订单执行明细表/销售明细表”):仍不支持,需 GetSysReportData;或改用对应单据(如 SAL_OUTSTOCK 出库明细)复现。
- 个别对象 QueryBusinessInfo 返回空模型(如车间成本计算 CB_SFCCostCalBill)→ 无可查字段,不能走通用查询。
适用场景
需要查询金蝶中未封装领域命令的业务对象;不确定某对象的 FormId 或字段名;需要探索对象字段结构以构造查询。
限制
报表/账表类对象暂不支持;部分对象返回空模型无法通用查询;查询需带过滤或 --top 以避免全表扫描。