直连数据库存在风险,使用时请谨慎!笔者曾今亲身体验,某个SQL写的有性能问题导致数据库服务器CPU占用率90%+,从而导致PLM服务不可用。
建议优先使用AgileApi的IQuery功能查询数据库。实在满足不了业务要求,公司内部存在擅长数据库性能优化的人员再考虑直连数据库。在功能设计时应充分考虑随着数据量增大后可能出现的性能问题,并在上线前进行充分测试。
如果要连PLM数据库,建议另外创建新用户并授予其AgilePLM_ROLE角色,而不是直接使用agile用户。
第三方系统程序如果要访问PLM的数据建议通过接口而不是直连PLM数据库。上述性能风险是原因之一。还有就是权限难以管控,一旦有了数据库用户,他们想查询任何数据都可以。有一种折衷的办法是视图,建立一个新用户后,仅给他们某个视图的权限。
未经授权和批准绝不能修改或泄漏agile用户密码。agile用户密码修改需要配套修改其他设置,否则Agile系统将无法使用.
由于PLM要兼容各个国家的不同时区。PLM数据库中存的所有时间字段都是零时区时间。查询显示时需要根据当地时区换算。
例如:我们国家属于东8区,取出来之后要+8小时才是实际时间。参考sql如下:
--变更发布时间查询
select C.CHANGE_NUMBER, c.release_date + 8/24 from agile.change c
表说明
-- 物料表
select * from agile.item;
-- 物料视图
select * from agile.ITEM_query;
select * from agile.ITEM_P2_QUERY;
select * from agile.ITEM_P2P3_QUERY;
select * from agile.ITEM_P2P3_QUERY_ALL_REV;
-- 物料历史记录
select i.item_number,t.*
from ITEM_HISTORY t
inner join ITEM i on t.item = i.id
where I.ITEM_NUMBER like '03.08.%'
表结构说明
item_number 物料编码
CLASS 一级分类
SUBCLASS 二级分类
DESCRIPTION 描述(物料名称)
DEFAULT_CHANGE 最新的变更单ID
RELEASE_TYPE 生命周期ID
REV_NUMBER 版本号
表说明:
参考 ItemBom.map.xml
SELECT * FROM agile.bom b;
--工位表(bom字段关联bom表id字段,一个工位一行记录,可能存在超过4000的问题)
select * from REFDESIG t where bom = 72624583;
-- 大文本字段存储表,bom注释(id为物料id,row_id为bom的id)
select * from AGILE_FLEX t where t.text in ('sjj12','sjj');
--PLM物料Bom查询(只查一层)不带工位, BOM注释
SELECT b.*, ic.DESCRIPTION
,l.value AS sub_class_text
,ls.value AS life_cycle
,ip.ITEM_NUMBER AS parent_item_number
,lp.value as parent_life_cycle
FROM agile.bom b
INNER JOIN agile.ITEM_QUERY ip ON b.item = ip.id
INNER JOIN agile.ITEM_QUERY ic ON b.component = ic.id
left JOIN agile.LANGTABLE lp ON ip.RELEASE_TYPE = lp.id AND lp.type = 4450 AND lp.langid = 4
INNER JOIN agile.LANGTABLE l ON ic.SUBCLASS = l.id AND l.type = 4450 AND l.langid = 4
INNER JOIN agile.LANGTABLE ls ON ic.RELEASE_TYPE = ls.id AND ls.type = 4450 AND ls.langid = 4
WHERE NVL(b.CHANGE_OUT, 0) = 0 AND SUBSTR(b.FLAGS, 5, 1) = 1
and ls.value not in ('报废','停产','退市')
and lp.value in ('报废','停产','退市')
and ip.ITEM_NUMBER like '02.88.000026'
and ic.ITEM_NUMBER like '03.%'
表结构说明
ITEM 父物料ID
COMPONENT 子物料ID
ITEM_NUMBER 子物料编码
QUANTITY:子料用量,文本字段。可支持分数,例如:1/6
CHANGE_IN 新增时的变更单ID
CHANGE_OUT:删除时的变更单ID
PRIOR_BOM:如果不为空,代表该行数据变更了另一行数据,值为另一行数据ID。
FIND_NUMBER:查找编号,目前没用起来.
FLAGS,bom分录状态(第5位数为1代表有效)
class表示大类(关口和活动), subclass表示小类(关口, 任务, 计划, 阶段)
subclass=18027:计划(项目),
subclass=18028:阶段,
subclass=18029:任务,
subclass=18401:关口,
业务关系:
计划(项目)包含阶段, 阶段包含任务和关口, 某些任务完成以后, 关口才能打开, 才能进行下一阶段的任务
PARENT_ID:上一层对象的id,比如任务的parent_id会指向阶段,阶段的parent_id指向计划.
ROOT_ID:最上层对象的id,也就是计划的id
status:状态信息-状态。
值的具体含义:(每个环境可能不一样,建议使用statustype)
18516 未开始
18517 进程中
18518 完成
18519 已取消
18540 已取消
18539 已打开
18537 已关闭
18538 审阅中
表说明
-- 价格主表
SELECT * FROM agile.PRICE p;
-- 价格子行
SELECT * FROM agile.priceline pl;
PRICE:对应价格
PRICELINE:对应价格的定价页签数据。也就是价格里面一行,即阶梯价格。当价格新建之后会有一条很多字段都是null与之对应,往定价中新增记录之后会是2条数据。
价格和BOM类似也存在版本管理,在流程中也能对价格进行增删改操作,流程走到发布节点才会生效.
流程中未生效的数据也是存在PRICELINE表的.
PRICE表结构
price_type:价格类型。1:代表量产价,0:为样品价;
price_number:价格编号。相当于物料编码。
owner:创建人。
supplier:对应的供应商。
item:对应的物料。制造商部件型价格这个字段为空。
mfr_part:对应的制造商部件。物料型价格这个为空。
default_change:默认的最新的价格变更
delete_flag:删除标识。0:代表未删除。
flags:状态标识。刚新建时第三位是1。加入变更单之后第4位变为1
part_number:物料型价格这个字段记录物料编码;制造商部件价格这个字段记录:制造商名称::制造商部件编号
price:外键,关联price表ID。
change_in:价格行新增的表更单id,如果是0代表走变更之前就新增好的。如果是空则代表无效数据。
change_out:只要有值代表该行已被删除且流程已发布。流程如果还未发布,则依然会是0。删除别人的行in和out相等。
prior_row:如果该行修改了另一个行,这里记录被操作行id。
flags:状态标识。在变更中新增全为0,变更之前新增第4和第5位为1。不受PCO影响。
quantity:数量
effective_from_date:生效开始日期
effective_end_date:生效结束日期
currency_code:货币代码
material_price:材料价格
表说明:
-- 变更 2473549:EcoBOM
select * from agile.change c where c.CHANGE_NUMBER in ('C0095253');
--变更受影响物件查询
SELECT c.change_number, i.*
FROM AGILE.REV R
INNER JOIN AGILE.ITEM I ON R.ITEM = I.ID
INNER JOIN AGILE.CHANGE C ON R.CHANGE = C.ID
INNER JOIN agile.LANGTABLE l on c.SUBCLASS = l.id and l.type = 4450 and l.langid = 4
WHERE I.CLASS = 10000 AND C.CREATE_DATE > '2018-01-01'
and l.value in ('自制件料号申请与BOM发布流程','ECO-BOM变更流程')
表说明:
--供应商
select * from ORGANIZATION where org_number in ('RM.00652');
MANUFACTURERS:制造商
MANU_PARTS:制造商部件
MANU_BY:制造商和部件关系表
--制造商
select * from agile.MANUFACTURERS b where b.name = '昆晶冷片(深圳)电子有限公司';
--制造商部件
select * from agile.MANU_PARTS p where p.PART_NUMBER in ('1N5242B');
--物料和部件关联关系
select * from agile.MANU_BY b where B.MANU_PART != 0;
表说明:
--缺陷
select * from PSR t where t.status = 2477843;
Attachment:附件表
Floder:文件夹表
agile_objects对象视图,仅有CLASS, SUBCLASS, KEY_FIELD, DESCRIPTION
--大部分数据对象表,但仅有很少字段
select * from agile_objects;
EVENT_HISTORY:事件历史表
前文提到的:
CHANGE_HISTORY:变更历史表
ITEM_HISTORY:物件历史表
PLM中大部分数据对象都会有第二页和第三页。
第二页中存储的是分类中一二级分类的公共字段。对应的表是PAGE_TWO
第三页中存储的是三级分类中特殊字段。对应的表是PAGE_THREE
第二页和第三页跟对象表的关联方式,根据对象表的ID和Class字段去第二页,第三页表中做关联查询。例如:
--第二页
select * from agile.PAGE_TWO t2;
--第三页
select * from agile.PAGE_THREE t2;
--物件关联第二页
select * from item i
inner join page_two p2 on i.id=p2.id and i.class = p2.class
PLM中很多常用对象的第二页,第三页信息已经做了视图,可以直接用视图来查询
每个字段对应的含义或名称请结合PLM管理控制台查询。
对于varchar2 4000以内的内容直接存储在第二页和第三页。但如果超过4000则是存在下面的表中。
-- 大文本存储表,bom注释(id为物料id,row_id为bom的id)
select * from AGILE_FLEX t
inner join bom b on t.row_id = b.id and t.id = b.item
where t.text in ('sjj2','sjj');
多列表选择的值数量比较小时是以",id1,id2,id3,"存储在第二页和第三页中的。但如果超过一定数量这个字段会变成“-1”然后需要从msatt表查询。
listname:列表表
Listentry:列表项
列表项id:entryid
列表项值:entryvalue
列表项之间父子关系:parent_entry
列表项分类:parentid
列表项分类id可以去后台管理系统的“设置-数据设置-列表”中查询
--列表定义表,层叠列表用parent_list链接父子列表
select * from agile.LISTNAME WHERE name like '%物料组%';
--列表子行 父子记录通过parent_entry关联,parentid用于区分不同的列表项
select * from agile.LISTENTRY l where l.parentid in (2477261) and langid in (0,4);
--修复生命周期专用SQL display值应该为0.
select * from agile.listname where id = 301;
update listname set display = 0 where id = 301;
--生命周期查询
select ip.*,lp.value
from agile.ITEM_QUERY ip
INNER JOIN agile.LANGTABLE lp
ON ip.RELEASE_TYPE = lp.id AND lp.type = 4450 AND lp.langid = 4
表说明:
-- plm用户表
select * from agile.AGILEUSER where loginid = 'zhangsan'
-- 用户组
select * from agile.user_group where id = 6039858
CONVERSION:货比转换配置
-- 转换(货币)
select * from agile.CONVERSION c where c.CONV_EFFECTIVE_TO_DATE is null;
表说明:
-- 查询PLM进程扩展
select * from PROPERTYTABLE p
inner join NODETABLE n on p.parentid = n.id
where n.PARENTID = 10025 and p.value like '%PCBCreateItem%'
-- 查询PLM事件程序
select * from agile.PROPERTYTABLE p
inner join agile.NODETABLE n on p.parentid = n.id and propertyid = 885
where n.PARENTID = 2000011631 and p.value like '%CheckSCSupplier%'