vault backup: 2025-05-12 22:27:41

This commit is contained in:
2025-05-12 22:27:41 +08:00
parent 3be067ca50
commit 70e76ba202
69 changed files with 133 additions and 145 deletions

View File

@ -0,0 +1,11 @@
# 介绍
在三品PLM系统中 [用户](../../相关操作/0.5-SETOUT/40.用户设置.md)用户设置.md) 可以有无限个,但同时登录在线的用户数量是有上限的,对于当前正在使用系统的用户,可以进行相应的管控
# 前置要求
进行管控的用户,必须具备 **企业配置****系统安全** → **并发用户*![image-20240713212445436](../../相关操作/1.0-EDM/assets/image-20240713212445436.png)13212445436.png)
# 操作
**企业配置** 模块中的 **系统安全** 选项内找到 **并发用户** 选项,在此页面能够管控到当前使用系统的所有用户,选择要踢出的用户,点击![image-20240713212813997](../../相关操作/1.0-EDM/assets/image-20240713212813997.png)e-20240713212813997.png)

View File

@ -0,0 +1,101 @@
# 介绍
**对象属性** 指代 **对象分类****常规属性页面** 中可定义的属性
![image-20240606112908325](../../相关操作/2.0-PDM/assets/image-20240606112908325.png)325.png)
# 对象属性
想要定义 **对象属性**,需要在 **系统设置****参数配置****系统参数****数据定义相关****对象属性定义** 中定义
==文档或物料所能设置的属性,归由 **对象属性定义** 中的 **文档或物料** 管理==
![image-20240818152224182](assets/image-20240818152224182.png)
双击 **文档或物料** 可以对当前系统中文档或物料的所有相关属性进行设置,对这些对象的常规![image-20240606115956707](../../相关操作/2.0-PDM/assets/image-20240606115956707.png)06115956707.png)
## 新增自定义对象属性
如果 **对象属性定义** 中没有所需要的属性,可通过 **新建**![img](../../相关操作/2.0-PDM/assets/clip_image002-17229359177821.jpg)e002-17229359177821.jpg)
**对象属性定义界面** 需要填写 **名称****显示名**其中名称必须以“usr_”为前缀![img](../../相关操作/2.0-PDM/assets/clip_image002-17229359843532.jpg)lip_image002-17229359843532.jpg)
显示名可以输入中文,比如仓库。另外字段长度表示用户在输入该属性时的最大长度,显示宽度表示界面中输入框的长度,![img](../../相关操作/2.0-PDM/assets/clip_image002-17229360105203.jpg)assets/clip_image002-17229360105203.jpg)
### 值类型
#### 文本类型
字段长度默认为255在数据库中存储的是字符串类型为 `nvarchar(255)`
#### 整数类型
在数据库中存储的是整型,类型为 `int`
#### 小数类型
在数据库中存储的是高精度浮点数,类型为 `decimal(30, 15)`
#### 枚举类型
在数据库中存储的是字符串,类型为 `nvarchar(50)`
#### 时间类型
在数据库中存储的是字符串,类型为 `nvarchar(20)`
#### 布尔类型
在数据库中存储的是整型,类型为 `int`,其中 `1` 代表 `false``2` 代表 `true`
#### 图片类型
在数据库中存储的是整型,类型为 `int`
#### 日期范围
不明,定义失败
#### 多行文本
字段长度默认为255在数据库中存储的是字符串类型为 `nvarchar(255)`
### 多属性映射
若有多个 **对象属性** 要同步映射到同一个 **对象属性** 中,则可以在表达式中写上多个 **对象属性名称**,获取的内容会通过分隔符进行分隔
![image-20241209111918467](assets/image-20241209111918467.png)
> 如图,多属性映射情况下,填写两个属性,则按照顺序全部映射,且属性值之间使用分隔符进行分隔
>
> ![image-20241209112109008](assets/image-20241209112109008.png)
>
> 如图,多属性映射情况下,只填写了一个属性,则只映射该属性,且忽略分隔符
>
> ![image-20241209112213084](assets/image-20241209112213084.png)
### 属性数值计算
若某一 **对象属性** 需要进行计算,计算后的结果填入到另一 **对象属性** 中,则可以在 **属性数值计算** 中写好算式,系统会将计算后的结果写入到对应的 **对象属性**
前提要求是 ==参与计算的对象属性,与接收结果的对象属性 **值类型****整数类型****小数类型**==
![image-20241209113959715](assets/image-20241209113959715.png)
> 如图,属性数值计算情况下,填写重量后,可以将计算后的结果写入到备注中
>
> ![image-20241209113805159](assets/image-20241209113805159.png)
#### **说明**
若参与计算的对象属性值为空则接收结果的对象属性会接收到整个算式如属性B由属性A+10得出那么当属性A为空时属性B的值为+10
在设置 **属性数值计算**请务必检查不可出现多级计算的情况即属性B由属性A+10得出而属性C由属性B-2得出那么当属性A为空时属性B的值为+10属性C的值为+10-2又因为属性C要求存储整数或小数类型系统将会出现如下提示
![image-20250121151417460](assets/image-20250121151417460.png)
相较于 **属性数值计算** 更建议采用 [窗体表单脚本](200.Delphi脚本.md) 来实现属性值的计算
## 补充
系统内建的 **对象属性** 在多数情况下是不容许修改的,或者说修改无效,例如物料的 **单位**、**生产类型** 都要求存储数值类型,就算在 **对象属性** 中进行修改调整,也无法生效使用

View File

@ -0,0 +1,137 @@
# 介绍
无论是 **文档** 还是 **物料** 等对象的常规属性,都分有 **内建属性****自定义物料属性**
- 内建属性:系统中已经建立的属性,无法修改
- 自定义物料属性:自定义物料属性是指用户可以在系统内建属性之外,根据对象特征需要创建其它属性
**对象常规属性设置** 指设置该对象类型所具备的常规属性,与对应的排版
![image-20240606113052207](../../相关操作/2.0-PDM/assets/image-20240606113052207.png)
这个面板,与 ==**企业配置** → **对象分类** → 文档或物料中的设置是相同的==
想要对某一类物料的常规属性及其布局进行修改,需要在 ==**企业配置** → **对象分类****物料**== 进行设置,具体的设置方式与 [窗体表单模板制作](../../相关操作/1.0-EDM/175.窗体表单.md#窗体表单模板制作) 方式相似
![image-20240606112908325](../../相关操作/2.0-PDM/assets/image-20240606112908325.png)
# 前置条件
==文档或物料所能设置的属性,归由 **对象属性定义** 中的 **文档或物料** 管理==
![image-20240818152224182](assets/image-20240818152224182.png)
双击 **文档或物料** 可以对当前系统中文档或物料的所有相关属性进行设置,对这些对象的常规属性管理
想要设置对象的常规属性,前提要求是 **对象属性定义** 中有这个属性
![image-20240606115956707](../../相关操作/2.0-PDM/assets/image-20240606115956707.png)
## 新增自定义对象属性
如果 **对象属性定义** 中没有所需要的属性,可通过 **新建** 功能创建出新的对象属性
![img](../../相关操作/2.0-PDM/assets/clip_image002-17229359177821.jpg)
**对象属性定义界面** 需要填写 **名称****显示名**其中名称必须以“usr_”为前缀后面输入英文字母且不能与其他属性同名
![img](../../相关操作/2.0-PDM/assets/clip_image002-17229359843532.jpg)
显示名可以输入中文,比如仓库。另外字段长度表示用户在输入该属性时的最大长度,显示宽度表示界面中输入框的长度,值类型比较常用的有文本类型、整数类型、小数类型、枚举类型
![img](../../相关操作/2.0-PDM/assets/clip_image002-17229360105203.jpg)
## 属性映射
若某一对象属性的值来源于另一个对象属性,则可以进行属性映射,在 **对象属性定义界面** 点击 **高级** 按钮
勾选 **属性值来源于以下表达式** 后,在下方的输入栏中填写上要引用的 **对象属性名称**==用 “ [] ” 包裹==
![image-20241209111021292](assets/image-20241209111021292.png)
> 如图所示,填写规格后,备注的内容会自动从规格属性中获取
>
> ![image-20241209111404277](assets/image-20241209111404277.png)
### 多属性映射
若有多个 **对象属性** 要同步映射到同一个 **对象属性** 中,则可以在表达式中写上多个 **对象属性名称**,获取的内容会通过分隔符进行分隔
![image-20241209111918467](assets/image-20241209111918467.png)
> 如图,多属性映射情况下,填写两个属性,则按照顺序全部映射,且属性值之间使用分隔符进行分隔
>
> ![image-20241209112109008](assets/image-20241209112109008.png)
>
> 如图,多属性映射情况下,只填写了一个属性,则只映射该属性,且忽略分隔符
>
> ![image-20241209112213084](assets/image-20241209112213084.png)
### 属性数值计算
若某一 **对象属性** 需要进行计算,计算后的结果填入到另一 **对象属性** 中,则可以在 **属性数值计算** 中写好算式,系统会将计算后的结果写入到对应的 **对象属性**
前提要求是 ==参与计算的对象属性,与接收结果的对象属性 **值类型****整数类型****小数类型**==
![image-20241209113959715](assets/image-20241209113959715.png)
> 如图,属性数值计算情况下,填写重量后,可以将计算后的结果写入到备注中
>
> ![image-20241209113805159](assets/image-20241209113805159.png)
#### **说明**
若参与计算的对象属性值为空则接收结果的对象属性会接收到整个算式如属性B由属性A+10得出那么当属性A为空时属性B的值为+10
在设置 **属性数值计算**请务必检查不可出现多级计算的情况即属性B由属性A+10得出而属性C由属性B-2得出那么当属性A为空时属性B的值为+10属性C的值为+10-2又因为属性C要求存储整数或小数类型系统将会出现如下提示
![image-20250121151417460](assets/image-20250121151417460.png)
相较于 **属性数值计算** 更建议采用 [窗体表单脚本](200.Delphi脚本.md) 来实现属性值的计算
# 操作步骤
确保 **对象属性定义** 中有所需属性
==选择 **企业配置****对象分类****物料** → 具体的对象,双击或右键选择属性打开其属性面板==
![image-20240606120613807](../../相关操作/2.0-PDM/assets/image-20240606120613807.png)
在属性面板中选择 **常规属性**,并右键选择 **自定义界面** 选项
![image-20240606120757997](../../相关操作/2.0-PDM/assets/image-20240606120757997.png)
弹出的新窗口即为 [自定义控件页面](../../相关操作/1.0-EDM/170.自定义控件页面.md),左侧的 [树结构区](../../相关操作/1.0-EDM/175.窗体表单.md#树结构区) 即为系统中对象的所有属性,与 [前置条件](#前置条件) 中的设置对应
选择要添加的属性,在 [控件区](../../相关操作/1.0-EDM/175.窗体表单.md#控件区) 中选择标签,然后在 [属性界面区](../../相关操作/1.0-EDM/175.窗体表单.md#属性界面区) 的空白位置上点击,即可将该属性的标签名添加在页面中。然后再选择输入栏并将其添加到页面中
由于 “ 材料名 ” 这个属性其类型为文本,故而控件区中可选择的类型以编辑器、多行文本为主。我们只要根据属性类型选择对应的输入栏添加即可,添加的控件可通过 [控件属性设置区](../../相关操作/1.0-EDM/175.窗体表单.md#控件属性设置区) 进行设置
![image-20240606145055492](../../相关操作/2.0-PDM/assets/image-20240606145055492.png)
添加完成后,会发现页面不太美观,此时可以通过右上角的 [控件对齐区](../../相关操作/1.0-EDM/175.窗体表单.md#控件对齐区) 对其进行调整、美化
按住 “ Ctrl ” 键不放,用鼠标单击 [属性界面区](#属性界面区) 的不同控件,单击的控件将被选中,单击 [控件对齐区](../../相关操作/1.0-EDM/175.窗体表单.md#控件对齐区) 的对齐按钮,被标记的控件根据单击的按钮类型做相关操作
![img](../../相关操作/1.0-EDM/assets/clip_image002-17184995081342.jpg)
**对齐按钮类型**
- **第一排**:左对齐、右对齐、上对齐、下对齐(以选择的第一个标签为准)
- **第二排**:垂直居中,水平居中,水平最长宽对齐,水平最窄宽对齐
- **第三排**:垂直长高对齐、垂直短高对齐、水平指定宽间距、垂直指定高间距
- **第四排**:宽增加、高减小、宽减小、高增加
完成配置后,点击确定即可保存新的常规属性界面
## 复制界面定义
上述的操作步骤只能定义单个对象分类的 **常规属性界面**,无论其他分类,还是该分类下已有的子分类,亦或是该分类下新建的子分类,都无法继承当该分类的 **常规属性界面**。而为了让其他分类也具备相同的 **常规属性界面**,可对该分类右键,选择 **复制界面定义** 选项
![](../../相关操作/2.0-PDM/assets/Pasted%20image%2020240806111903.png)
复制后在其他分类上右键,选择 **粘贴界面定义** 即可
若该分类及其子分类的 **常规属性界面** 要求一致,则可在父分类上右键选择 **粘贴界面定义(所有子)** 即可
![](../../相关操作/2.0-PDM/assets/Pasted%20image%2020240806112323.png)

View File

@ -0,0 +1,86 @@
# 介绍
在窗体表单或对象常规属性中支持 `Delphi` 脚本来实现一些特性化操作
# 脚本编辑器
这是一个编辑、检查脚本的窗体
由主菜单、工具栏、 [控件区](#控件区) 、 [脚本编辑区](#脚本编辑区) 、 [函数/变量区](#函数/变量区) 、 [错误提示区](#错误提示区) 组成,界面如下图:
![image-20240621100850228](assets/image-20240621100850228.png)
## 布局介绍
### 文件
保存或者关闭脚本编辑器
操作:检查语法正确性
查找/替换/查找下一个TXT文本功能
设置:
1. 修改 Tab 键跳转列数:设置缩进列数
2. 工具栏:显示脚本编辑器常用操作
### 控件区
显示源窗体中的编辑控件,双击控件节点时,在 [脚本编辑器](#脚本编辑器) 的当前光标位置增加控件名称,支持节点拖动
### 脚本编辑区
编辑脚本的地方。 编辑时支持模糊匹 **配控件区** 的控件名和 **函数/变量区** 的函数或变量名;
如果文本是控件名,输入 “ . ” 将提示控件支持的属性或方法
按 “ Tab ” 键支持选择文本的定长缩进
按 “ Shift + Tab ” 键支持选择文本的定长反缩进
支持文本搜索、搜索替换功能
使用的脚本为 `Delphi` 脚本,参考代码如下所示,作用为 [多属性值拼接至另一属性中](999.Delphi脚本记录.md#多属性值拼接至另一属性中)
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
var
StringList: TStringList;
begin
// 创建和初始化TStringList
StringList := TStringList.Create;
try
// 如果fedtusr_substrate_id的值不为空则将值添加到StringList中
if fedtusr_substrate_id.Text <> '' then
StringList.Add(fedtusr_substrate_id.Text);
if fedtusr_substrate_id2.Text <> '' then
StringList.Add(fedtusr_substrate_id2.Text);
if fedtusr_substrate_id3.Text <> '' then
StringList.Add(fedtusr_substrate_id3.Text);
if fedtusr_substrate_id4.Text <> '' then
StringList.Add(fedtusr_substrate_id4.Text);
// 转换为逗号分隔的字符串
mmmusr_substrate2.Text := StringList.DelimitedText; // 默认使用逗号作为分隔符
// 如果需要指定其他分隔符可以设置Delimiter属性
// StringList.Delimiter := ';'; // 设置分隔符为分号
// Result := StringList.DelimitedText;
finally
StringList.Free;
end;
end.
```
### 函数/变量区
显示系统支持的变量和函数,双击节点时,在 **脚本编辑区** 的当前光标位置增加变量或函数名称,鼠标移到树节点时,提示信息窗显示变量类型或函数原型,支持节点拖动
![](assets/Pasted%20image%2020250225085445.png)
### 错误提示区
执行 **保存****检查语法正确性** 命令时,如果脚本存在错误,则错误信息被显示在 **错误提示区**,双击错信息行时,在 **脚本编辑区** 中对于的错误行用红色背景标记

View File

@ -0,0 +1,300 @@
# 介绍
编码器:是一套编码规则在系统中的体现,用于编码的编制与名称规则。使用绑定的编码器编制编码,提高编码效率,确保编码准确与规范(无论是物料编码、文件编号还是文件的命名规则,只要有固定的编制规则,那就都可以用到编码器)
码段:编码器的功能单位,一个编码器由若干个码段组成,各个码段的值组成完整的编码。每个码段应对应编码规则中的某段含义
# 前置要求
进行编码器设置的用户角色必须具备 **系统设置** 中的 **编码管理** 权限(至少具备 **可见、浏览、修改、新增** 权限)
![image-20240725211407165](../../相关操作/1.0-EDM/assets/image-20240725211407165.png)
# 操作步骤
1. 新建编码器
2. 填写编码名称
3. 添加码段
4. 定义码段
## 案例
以下面两个物料编码规则为例
![img](../../相关操作/1.0-EDM/assets/clip_image002-17219136390171.jpg)
![img](../../相关操作/2.0-PDM/assets/clip_image004.jpg)
先创建“产品物料编码”,在 **企业配置** 中打开 **编码管理** 页面,右键选择新建 **编码**
![image-20240725212254864](../../相关操作/1.0-EDM/assets/image-20240725212254864.png)
在弹出的 **编码属性定义界面** 中填写编码的名称
![img](../../相关操作/2.0-PDM/assets/clip_image006.jpg)
填写名称后选择 **码段信息** 进行定义,由于“产品物料编码规则”中,第一个码段是“标识”,是每个编码都相同的码段,其值固定不变
![img](../../相关操作/2.0-PDM/assets/clip_image008.jpg)
故而码段类型选择 **固定字符串**,并在 **取值** 框内输入显示的值即可
![img](../../相关操作/1.0-EDM/assets/clip_image010.jpg)
第二个码段是“大类”,这是需要用户选择的码段
![img](../../相关操作/1.0-EDM/assets/clip_image012.jpg)
故码段类型选择 **枚举**,并在下方 **常规取值** 标签下创建出所有选项
![img](../../相关操作/1.0-EDM/assets/clip_image014.jpg)
上图的 **可取值范围** 列表中,**取值** 列是指该码段之值显示的内容,**含义** 列是指该码段之值的具体含义。
第三个码段是“小分类”,也是枚举类型的码段
![img](../../相关操作/1.0-EDM/assets/clip_image016.jpg)
但是此码段提供的选项将受到第二个码段的取值制约。例如第二个码段选择了“A种类”那第三个码段将提供“a类”、“b类”和“c类”给用户选择如果第二个码段选择了“C种类”第三个码段就提供“g类”、“h类”和“i类”给用户选择。所以需要设置枚举码段的 **取值约束**
首先,码段类型选择枚举,然后在 **常规取值** 标签下将所有待选项创建出来:
![img](../../相关操作/1.0-EDM/assets/clip_image018.jpg)
然后点击 **取值约束** 标签,点击 **增加约束** 来创建取值约束
![img](../../相关操作/1.0-EDM/assets/clip_image020.jpg)
在弹出的 **取值约束** 窗体中,选择之前创建完成的 **大类** 码段,将以此码段作为约束码段
![img](../../相关操作/1.0-EDM/assets/clip_image022.jpg)
为约束码段选取一个值,形成约束条件,之后按 **确定** 完成
![img](../../相关操作/1.0-EDM/assets/clip_image024.jpg)
设置好一个约束条件之后,将显示在约束条件列表中,并在最下方的表格内列出本码段的所有待选项,勾选这些待选项,作为满足选定的约束条件时,本码段允许的取值
![img](../../相关操作/1.0-EDM/assets/clip_image026.jpg)
像这样把 **大类** 里的每一个值都设置成一个约束条件,并设置相应的允许取值
![img](../../相关操作/1.0-EDM/assets/clip_image028.jpg)
完成这些设置之后点击 **确定** ,完成该码段的创建
第四个码段是 **产品标识**,是需要用户手动输入的码段
![img](../../相关操作/1.0-EDM/assets/clip_image030.jpg)
故码段类型选择 **用户输入**
![img](../../相关操作/1.0-EDM/assets/clip_image032.jpg)
最后一个码段是流水号,故码段类型选择 **流水号**,注意流水号的位数
![img](../../相关操作/1.0-EDM/assets/clip_image034.jpg)
![img](../../相关操作/1.0-EDM/assets/clip_image036.jpg)
如此便完成了“产品物料编码”编码器的创建
![img](../../相关操作/1.0-EDM/assets/clip_image038.jpg)
接下来创建“零部件物料编码”
![img](../../相关操作/1.0-EDM/assets/clip_image040.jpg)
第一个字段是“父级物料编码”,意思是码段的值为上一级物料的物料编码
![img](../../相关操作/1.0-EDM/assets/clip_image042.jpg)
故码段类型选择 **父编码**,还可以在 **范围设定** 中设置继承的范围,本例是全部继承:
![img](../../相关操作/1.0-EDM/assets/clip_image044.jpg)
第二个码段是两位数字型的 **流水号**
![img](../../相关操作/1.0-EDM/assets/clip_image046.jpg)
如此便完成了零部件物料编码器的创建:
![img](../../相关操作/1.0-EDM/assets/clip_image048.jpg)
# 扩展
## 码段类型
编码器中可选的 **码段类型** 是固定的,包含有:
- [固定字符串](#固定字符串)
- [枚举](#枚举)
- [流水号](#流水号)
- [日期](#日期)
- [员工编号](#员工编号)
- [部门编号](#部门编号)
- [用户输入](#用户输入)
- [当前用户名](#当前用户名)
- [模板名称](#模板名称)
- [所属产品编码](#所属产品编码)
- [所属产品代号](#所属产品代号)
- [父零件代号](#父零件代号)
- [父零件编码](#父零件编码)
- [部门名称](#部门名称)
- [模板编码](#模板编码)
- [父名称](#父名称)
- [父编码](#父编码)
- [项目名称](#项目名称)
- [项目编码](#项目编码)
- [对象属性](#对象属性)
- [类别树](#类别树)
- [脚本代码](#脚本代码)
- [对象分类编码](#对象分类编码)
- [附件名称](#附件名称)
- [附件编码](#附件编码)
- [父对象属性](#父对象属性)
### 固定字符串
固定字符串类型的码段,其取值是固定不变的
![image-20240725215746284](../../相关操作/1.0-EDM/assets/image-20240725215746284.png)
### 枚举
> 枚举Enumeration是一种数据类型用于定义一组命名的常量值。它允许开发者用更具可读性的符号表示固定的值集合常用于表示有限且明确的状态或选项。
>
> 枚举的主要特点:
> 命名常量:枚举为每个常量赋予一个名称,提升代码可读性。
> 类型安全:枚举变量只能取枚举中定义的值,减少错误。
> 有限集合:枚举值通常是固定的,不可随意扩展。
>
> 例如表示星期的枚举SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY
在编码器中,枚举类码段的取值分有两种情况,即在 **常规取值** 中定义的[局部枚举](#局部枚举),与在整个系统中定义的[系统枚举](#系统枚举)
#### 局部枚举
局部枚举即指代在当前编码器中使用的枚举,在 **常规取值** 中进行定义,作用范围是当前编码器,换个编码器就需要重新进行定义
![image-20240725221430867](../../相关操作/1.0-EDM/assets/image-20240725221430867.png)
##### 取值约束
取值约束可以用于约束枚举值的取值范围可理解为当满足某一条件时可选择的枚举值为XXX
设置 **取值约束** 的前提条件是,必须具备其他 **码段**,一个编码器中只有 **枚举类码段** 是没办法设置 **取值约束**
需要用户先添加 **约束**,再设置 **取值范围**,每一条 **约束** 都可以设置对应的 **取值范围**
例如:设置当“工作周期”码段值为“休息日”时,“星期”码段的值可选择“星期六”或“星期天”
![image-20240725224612658](../../相关操作/1.0-EDM/assets/image-20240725224612658.png)
#### 系统枚举
系统枚举即指代在系统中设置的枚举类型,作为范围是整个系统,任意编码器中都可以使用
**系统枚举**一栏中点击“三个点”进行选择,选择后可不用再配置 **常用取值**
![image-20240725223901146](../../相关操作/1.0-EDM/assets/image-20240725223901146.png)
注意:系统枚举没有 **取值约束**,即便添加约束也不能设置相应的取值范围
![image-20240725224207211](../../相关操作/1.0-EDM/assets/image-20240725224207211.png)
### 流水号
**流水号** 类型的码段,是由系统自动进行累加的,可设置其相应的长度与取值范围
流水号类型可设置为数字型或字母型,若为字母型可设置是否开启大写
流水号的约束字段与枚举的 [取值约束](#取值约束) 不同流水号会根据约束字段的不同进行区分累加。例如以“星期”码段作为约束那么当周一流水号累加到003时周二的流水号仍是从001开始而当周二的流水号累加到010时周一的流水号会续接周一的流水号从003开始累加
![image-20240725225337820](../../相关操作/1.0-EDM/assets/image-20240725225337820.png)
#### 补充
如果流水号没有设置 **约束码段**,那么当生成编码的时候,可能会出现 **跳码** 现象
即,现在有编码 `2502240501`,此时要通过编码器生成一个新编码,按理来说会生成 `25022401`,其中末位的两位(` 01 `)是流水码,但是由于没有设置约束码段,在生成编码时,系统校验是否存在开头是 `250224` 的编码,找到 `2502240501` 后,会截取 `0501` 的头两位编码,即 `05`,判断得出已有流水码 `05`,故而生成的新编码会直接从流水 `05` 开始,为 ` 25022406 `
### 日期
**日期** 类型的码段,可在 **常规取值** 中设置日期的格式xxxx年xx月xx日
![image-20240725230348528](../../相关操作/1.0-EDM/assets/image-20240725230348528.png)
### 员工编号
**员工编号** 类型码段不用管其长度与取值的设置,系统会自动获取到当前用户的 [编号](../../相关操作/0.5-SETOUT/40.用户设置.md#编号)
![image-20240725231106322](../../相关操作/1.0-EDM/assets/image-20240725231106322.png)
### 部门编号
部门编号类型码段不用管其长度与取值的设置,系统会自动获取到当前用户所在部门的 [部门编号](../../相关操作/0.5-SETOUT/40.用户设置.md#部门编号)
![](assets/Pasted%20image%2020250219122900.png)
### 用户输入
### 当前用户名
会获取当前操作的用户的 [用户名](../../相关操作/0.5-SETOUT/40.用户设置.md#用户名)
![image-20240529155337941](../../相关操作/1.0-EDM/assets/image-20240529155337941.png)
### 模板名称
获取当前关联的模板的名称
![](assets/Pasted%20image%2020250110101238.png)
### 所属产品编码
### 所属产品代号
### 父零件代号
### 父零件编码
### 部门名称
### 模板编码
### 父名称
父名称指代BOM中的最大级别的物料的名称
![](assets/Pasted%20image%2020250317134006.png)
![](assets/Pasted%20image%2020250317134437.png)
![](assets/Pasted%20image%2020250317140650.png)
### 父编码
父编码与 [父名称](#父名称) 概念相似 指代BOM中的最大级别的物料的物料编码
### 项目名称
### 项目编码
### 对象属性
需要先选择要关联的对象的类型,以及要关联的属性,并可设置对该值的取值范围。使用时编码器可自动获取对象属性值
![](assets/Pasted%20image%2020250110105854.png)
### 类别树
### 脚本代码
### 对象分类编码
### 附件名称
### 附件编码
### 父对象属性

View File

@ -0,0 +1,41 @@
# 介绍
所有的文档存在于系统中,都有其 [常规属性](../../相关操作/1.0-EDM/80.文档分类设置.md#常规属性设置)
![image-20240606113052207](../../相关操作/2.0-PDM/assets/image-20240606113052207.png)
若要修改属性,对文档右键选择 **属性** 即可,但有多个文件想要修改其属性,需要用到批量操作
> 若要修改多个文件的版本为统一值,则可通过 [修改文档属性调整文档版本](../../相关操作/1.0-EDM/10.文件版本管理.md#修改文档属性调整文档版本) 实现
>
> 若要修改多个文件的分类为统一值,则可通过 [多个文件批量调整文档分类](../../相关操作/1.0-EDM/80.文档分类设置.md#多个文件批量调整文档分类) 实现
但若是要修改其他属性值或属性值不统一的情况则需要通过Excel来实现批量更新操作
## 前置要求
使用 **Excel批量更新文档属性** 功能,需要用户角色至少具备 **系统工具****Excel批量更新文档属性** 权限
![image-20241226201048935](assets/image-20241226201048935.png)
# Excel导入模板
通过 **Excel批量更新文档属性** 需要采用标准的Excel导入模板
模板要求Excel表中必须具备 **文档名称****文档编码** 中的一列,这是因为系统需要依据二者中的一个属性去做更新
![image-20241226201840976](assets/image-20241226201840976.png)
此外Excel模板要求对标题栏的名称做定义即文档编码一栏的名称是 **code**,文档名称一栏的名称是 **DocName**,其他要修改的属性名称,可在 **系统设置****参数配置****系统参数****数据定义相关****对象属性定义****文档** 中查询
![image-20241226202417865](assets/image-20241226202417865.png)
# 更新操作
在Excel表中编制完成后**系统设置****系统工具****文档相关****Excel批量更新文档属性**点击浏览上传Excel表
![image-20241226202624092](assets/image-20241226202624092.png)
需要注意的是,必须要选择 ==**以何种文档属性更新**==,选择后会以此为基准对文档属性进行更新
> 例如选择以文档编码做基准进行更新则系统会匹配系统中文档编码与Excel表中文档编码值相同的文件然后更新匹配到的文件的其他属性值若有文档名称则也会更新文档名称

View File

@ -0,0 +1,98 @@
# 介绍
**系统邮箱**(内部邮箱):用户在系统的邮件模块中,可以通过邮件传递附件,在企业内部,实现资源共享
**外部邮箱**通过Internet收发邮件的邮箱比如163邮箱、QQ邮箱等
在系统中配置外部邮箱能够实现系统在流程、项目流转至参与者时由公司邮箱自动发送一封邮件到参与者的个人邮箱或者在PLM客户端中通过个人邮箱收发邮件
# 公司外部邮箱
## 前置要求
进行 **公司外部邮箱配置** 的用户角色必须具备 **系统设置** 中的 **参数配置** 权限
![image-20240614153619837](../../相关操作/1.0-EDM/assets/image-20240614153619837.png)
## 操作
打开 ==**系统设置** → **参数配置****系统参数****邮件相关类****企业邮箱账户**==,然后点击 **新建账户** 按钮
![img](../../相关操作/1.0-EDM/assets/clip_image002-17226891823361.jpg)
**新建账户** 页面中输入外邮账户及密码或者是POP3/SMTP或者IMAP/SMTP服务的专用密码
![img](../../相关操作/1.0-EDM/assets/clip_image002-17226892472982.jpg)
上图中“你的姓名”指得是在PLM中使用该邮箱发送邮件时所使用的发件人名称
![image-20240803205329902](../../相关操作/1.0-EDM/assets/image-20240803205329902.png)
填写完账号、密码、姓名后点击 **下一步** 即可。默认情况下系统会自动填写POP3服务器名称、帐号、SMTP服务器名称如要调整可自行修改确认无误后点击 **下一步** 即可
![img](../../相关操作/1.0-EDM/assets/clip_image002-17226897300633.jpg)
写服务器端口信息,点击 **测试帐户设置**,如果成功了,就可以点击 **完成**
![img](../../相关操作/1.0-EDM/assets/clip_image002-17226897574764.jpg)
![image-20240803205640436](../../相关操作/1.0-EDM/assets/image-20240803205640436.png)
最后,在账户管理窗口点击 **确定**
![img](../../相关操作/1.0-EDM/assets/clip_image002-17226898154915.jpg)
如此便完成了公司外部邮箱的配置
# 个人外部邮箱
如果只是希望能够接收到系统使用公司外部邮箱发送的通知邮件,那么在用户设置界面的 [Email](../../相关操作/0.5-SETOUT/40.用户设置.md#Email) 中进行设置即可
若是需要通过系统的邮件功能收发外部邮件,则要配置个人外部邮箱,在 **工作台****邮箱** 中进行设置,右键菜单 **收取Internet邮件****邮箱帐户设置**,点击 **新建帐户** 进行,后续步骤与 [公司外部邮箱](#公司外部邮箱) 的设置方式一致,此处略过
![img](../../相关操作/1.0-EDM/assets/clip_image002-17226914471601.jpg)
## 接收外部邮件
Internet邮件进行收发一般需要通过网页或者OUTLOOK这类邮件客户端工具完成但在用户绑定个人外部邮箱后也能够通过三品PLM客户端实现邮件的接收与发送
**工作台****邮箱** 中,右键菜单 **收取Internet邮件****全部接收/选择特定账号接受**
![image-20240805105734327](../../相关操作/1.0-EDM/assets/image-20240805105734327.png)
三品PLM接收外部邮件与邮箱客户端不同邮箱客户端可自动接收邮件而三品PLM需要手动选择收取邮件
## 发送外部邮件
### 说明
1. 发送外部邮件必须写Internet邮件地址不能用系统[用户](../../相关操作/0.5-SETOUT/40.用户设置.md)名
2. 若有 **系统附件**,则需要具备该邮件的 [导出](../../相关操作/1.0-EDM/20.文件权限管理.md#导出) 权限
3. 收件人是系统[用户](../../相关操作/0.5-SETOUT/40.用户设置.md)名的话,邮件将作为内部邮件发送
### 前置要求
想要发送外邮,用户必须具备 **邮件****发外邮、发外邮正文、发外邮附件** 权限,可通过 [角色设置邮件权限](../../相关操作/0.5-SETOUT/42.角色设置.md#邮件) 或在 **邮件** 功能中设置权限(如下图)
![](../../相关操作/1.0-EDM/assets/Pasted%20image%2020240805112217.png)
### 邮件中添加附件
**工作台****邮箱** 中邮件选择 **新建****邮件**
![image-20240806090850157](../../相关操作/1.0-EDM/assets/image-20240806090850157.png)
**编写邮件** 界面上用户可以在收件人处填写系统用户名和Internet邮件地址中间用分号或者逗号隔开
![image-20240806091245525](../../相关操作/1.0-EDM/assets/image-20240806091245525.png)
若要添加附件,点击 **添加附件↓** 按钮即可可选择PLM系统中的文件作为附件或选择本地电脑上的文件作为附件
![image-20240806091401340](../../相关操作/1.0-EDM/assets/image-20240806091401340.png)
### 文件生成邮件
在文档工作区中,选中一个或多个文件,右键选择 **邮件**,系统会自动生成一封邮件,所选中的文件会作为邮件中的附件存在,即 **系统附件**
![img](../../相关操作/1.0-EDM/assets/clip_image002-17229072819891.jpg)

View File

@ -0,0 +1,19 @@
# 介绍
可以在列表中隔行显示出颜色,例如:
![](../../相关操作/1.0-EDM/assets/Pasted%20image%2020240723171113.png)
# 前置要求
进行设置的用户角色必须具备 **系统设置** 中的 **参数配置** 权限
![image-20240614153619837](../../相关操作/1.0-EDM/assets/image-20240614153619837.png)
# 操作
打开 **在工作区里的列表中,采用隔行颜色显示数据** 进行勾选(启用),并选择 **在工作区里列表上,隔行显示的颜色** 即可
虽然叫“工作区”,但实际上应用范围比较广
![](../../相关操作/1.0-EDM/assets/Pasted%20image%2020240723171113.png)

View File

@ -0,0 +1,19 @@
# 介绍
系统日历设置能够对系统中使用的日历进行设置,其主要作用在于设置系统中的常规工作日与特殊工作日,设置好的日历能够与 **工作流**、**项目** 进行关联,工作流和项目在计算各种事件时,将会使用关联的日历
# 前置要求
进行设置的用户角色必须具备 **系统设置** 中的 **参数配置** 权限
![image-20240614153619837](../../相关操作/1.0-EDM/assets/image-20240614153619837.png)
# 操作
**系统设置****参数配置** → 搜索 → 搜索“日历” → **系统日历设置** 中,能够对系统的日历进行配置
![image-20250110095617475](assets/image-20250110095617475.png)
在属性中可对常规工作日进行配置,设置其每周的工作日与工作时间范围
![image-20250110095824603](assets/image-20250110095824603.png)

View File

@ -0,0 +1,13 @@
# 介绍
在初始情况下用户账户登录三品PLM系统是没有密码的但对于有需求的用户可以在系统中设置登录密码以便于在登录时校验是否为当前用户
要设置个人密码需要先登录到三品PLM系统中在系统的左下角的 **开始** 按钮处,可以进行 **修改密码** 操作
![](assets/Pasted%20image%2020250331094533.png)
**修改密码窗口** 中,如果当前没有密码,那么旧密码为空即可,输入新密码即可
![](assets/Pasted%20image%2020250331094835.png)
若忘记了自己的密码,可以尝试 [Email验证修改密码](90.重置密码.md#Email验证修改密码) 或者联系 [管理员修改密码](90.重置密码.md#管理员修改密码)

View File

@ -0,0 +1,21 @@
# 介绍
用户在设置密码后,可能会出现遗忘的情况,此时有两种方式可以为用户重置密码
## Email验证修改密码
系统配置了 [公司外部邮箱](50.外部邮箱配置.md#公司外部邮箱) 且 [用户](../../相关操作/0.5-SETOUT/40.用户设置.md) 填写了 [Email](../../相关操作/0.5-SETOUT/40.用户设置.md#Email)
此时在登录系统时,密码错误选择 **忘记密码**可以将验证法发送到用户的Email邮箱中通过验证码重置密码
## 管理员修改密码
具备权限的用户可在 **企业配置****用户** 中选择用户,右键选择 **设置密码**
![](assets/Pasted%20image%2020250210161934.png)
### 前置要求
进行参数设置的用户角色必须具备 **企业配置****用户** 中的 **修改** 权限
![](assets/Pasted%20image%2020250210162109.png)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,424 @@
# 介绍
本笔记用于记录所有编制过的 `Delphi` 脚本,以便于沉淀相关知识
## 多属性值拼接至另一属性中
`fedtusr_substrate_id``fedtusr_substrate_id2``fedtusr_substrate_id3``fedtusr_substrate_id4` 控件中获取值,以逗号为分隔符,按顺序进行拼接,结果输出到 `mmmusr_substrate2` 控件中
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
var
StringList: TStringList;
begin
// 创建和初始化TStringList
StringList := TStringList.Create;
try
// 如果fedtusr_substrate_id的值不为空则将值添加到StringList中
if fedtusr_substrate_id.Text <> '' then
StringList.Add(fedtusr_substrate_id.Text);
if fedtusr_substrate_id2.Text <> '' then
StringList.Add(fedtusr_substrate_id2.Text);
if fedtusr_substrate_id3.Text <> '' then
StringList.Add(fedtusr_substrate_id3.Text);
if fedtusr_substrate_id4.Text <> '' then
StringList.Add(fedtusr_substrate_id4.Text);
// 转换为逗号分隔的字符串
mmmusr_substrate2.Text := StringList.DelimitedText; // 默认使用逗号作为分隔符
// 如果需要指定其他分隔符可以设置Delimiter属性
// StringList.Delimiter := ';'; // 设置分隔符为分号
// Result := StringList.DelimitedText;
finally
StringList.Free;
end;
end.
```
## 属性值添加至另一属性中
`fedtusr_gys` 控件中的值有多个,采取 `;` 进行分隔,现要验证 `fedtusr_shgys` 控件中的值是否存在于 `fedtusr_gys` 控件中,如果不存在,则将其添加进去,并进行排序
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
var
gysList: TStringList;
begin
try
// 初始化 TStringList
gysList := TStringList.Create;
gysList.Delimiter := ';';
gysList.StrictDelimiter := True;
// 将 fedtusr_gys 按分号分隔成列表
gysList.DelimitedText := fedtusr_gys.Text;
if gysList.IndexOf(fedtusr_shgys.Text) = -1 then
begin
// 如果不存在,则添加到 fedtusr_gys 中
gysList.Add(fedtusr_shgys.Text);
gysList.Sort;
// 将列表重新组合成字符串,使用分号分隔
fedtusr_gys.Text := gysList.DelimitedText;
end;
finally
gysList.Free;
end;
end.
```
## 属性值是否被另一属性所包含校验
`fedtusr_gys` 控件中的值有多个,采取 `;` 进行分隔,现要验证 `fedtusr_shgys` 控件中的值是否存在于 `fedtusr_gys` 控件中,如果不存在,则弹窗提示
```delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
var
gysList: TStringList;
begin
try
// 初始化 TStringList
gysList := TStringList.Create;
gysList.Delimiter := ';';
gysList.StrictDelimiter := True;
// 将 fedtusr_gys 按分号分隔成列表
gysList.DelimitedText := fedtusr_gys.Text;
if gysList.IndexOf(fedtusr_shgys.Text) = -1 then
begin
ShowMessage('默认供应商未包含在供应商列表中');
end;
finally
gysList.Free;
end;
end.
```
## 不同属性一致性设置
`fedtDrawId` 的值设置为 `fedtItemCode` 的值
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
begin
//注释:在下面添加您的脚本代码
// 检查 物料编码 是否为空
if Trim(fedtItemCode.Text) <> '' then
begin
// 如果 物料编码 不为空,则将 代号 的值设置为 物料编码 的值
fedtDrawId.Text := fedtItemCode.Text;
end
else
begin
// 如果 物料编码 为空,则清空 代号
fedtDrawId.Text := '';
end;
end.
```
## 执行SQL语句获取查询结果
主要内容为通过 `chiGetFieldValueBySql` 方法去执行 ` SQL ` 语句,通过物料代码去获取指定属性的值,要求是这个物料得先被创建出来,才能正常执行脚本,否则会提示找不到这个物料
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
Var
str: String;
begin
try
// 1. 查询usr_333的值
str := chiGetFieldValueBySql('select usr_333 from pdmitem where itemcode = ''' + fedtItemCode.Text + '''');
// 2. 检查查询结果
if str = '' then
begin
ShowMessage('未找到物料编码: ' + fedtItemCode.Text);
Exit;
end;
// 3. 如果usr_333为1则更新usr_444为1
if str = '1' then
begin
// 执行更新操作
cbxusr_444.checked := false;
// 可选:显示操作成功提示
ShowMessage('已自动将usr_444更新为1');
end;
except
on E: Exception do
ShowMessage('操作失败: ' + E.Message);
end;
end.
```
## 更新是否控件
检验 `cbxusr_333` 控件的值,如果为 `false`,那么 `cbxusr_444` 控件的值必须为 `false`
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
begin
try
// 校验逻辑:当 cbxusr_333 未选中时,强制 cbxusr_444 也未选中
if not cbxusr_333.Checked then
begin
// 如果 cbxusr_444 当前是选中状态,则强制取消选中
if cbxusr_444.Checked then
begin
cbxusr_444.Checked := False;
// 可选:显示提示信息
ShowMessage('已自动将444设为未选中状态因为333未选中');
end;
end;
except
on E: Exception do
ShowMessage('执行脚本时出错: ' + E.Message);
end;
end.
```
## 批量校验控件并进行更新
自动检查并强制更新一组相关联的复选框(CheckBox)控件的状态,确保当某个"启用"复选框未被选中时,其相关联的"影响"复选框也必须处于未选中状态
**脚本核心功能**
- **强制关联逻辑**:当某个"启用"复选框(如cbxusr_01_FIsEnable)未被选中时自动将其关联的3个"影响"复选框(cbxusr_01_FIsAffectPrice、cbxusr_01_FIsAffectPlan、cbxusr_01_FIsAffectCost)设为未选中状态
- **适用范围**处理5组不同的控件组合(01-04和06),每组都有相同的关联关系
**控件命名规则与对应关系**
- **命名模式**`cbxusr_XX_FIsYYYYY`
- `XX`代表业务类型01(仓库)、02(仓位)、03(BOM版本)、04(批号)、06(计划跟踪号)
- `FIsYYYYY`代表功能:
- `FIsEnable`:启用控制
- `FIsAffectPrice`:影响价格
- `FIsAffectPlan`:影响计划
- `FIsAffectCost`:影响出库成本
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
var
ModifiedControls: TStringList;
CurrentForm: TForm; // 添加窗体变量
procedure ProcessControls(EnablePrefix: string);
var
EnableCheckBox: TCheckBox;
AffectCheckBox: TCheckBox;
AffectNames: array[0..2] of string;
AffectControlName: string;
i: Integer;
begin
AffectNames[0] := 'FIsAffectPrice';
AffectNames[1] := 'FIsAffectPlan';
AffectNames[2] := 'FIsAffectCost';
// 通过当前窗体查找组件
EnableCheckBox := TCheckBox(CurrentForm.FindComponent('cbxusr_' + EnablePrefix + '_FIsEnable'));
if Assigned(EnableCheckBox) and not EnableCheckBox.Checked then
begin
for i := 0 to High(AffectNames) do
begin
AffectControlName := 'cbxusr_' + EnablePrefix + '_' + AffectNames[i];
AffectCheckBox := TCheckBox(CurrentForm.FindComponent(AffectControlName));
if Assigned(AffectCheckBox) and AffectCheckBox.Checked then
begin
ModifiedControls.Add(AffectControlName);
AffectCheckBox.Checked := False;
end;
end;
end;
end;
begin
ModifiedControls := TStringList.Create;
try
try
// 获取当前活动窗体
CurrentForm := Screen.ActiveForm;
if not Assigned(CurrentForm) then
begin
ShowMessage('无法获取当前窗体');
Exit;
end;
ProcessControls('01');
ProcessControls('02');
ProcessControls('03');
ProcessControls('04');
ProcessControls('06');
if ModifiedControls.Count > 0 then
begin
ShowMessage(
'以下控件的值已被自动修改为未选中状态:' + #13#10 +
'--------------------------------' + #13#10 +
ModifiedControls.Text + #13#10 +
'--------------------------------' + #13#10 +
'因为对应的Enable控件未选中'
);
end;
except
on E: Exception do
ShowMessage('执行脚本时出错: ' + E.Message);
end;
finally
ModifiedControls.Free;
end;
end.
```
### 进一步优化
**中文语义化输出(核心优化)**
- 新增 `GetControlChineseName` 函数实现控件名称到中文描述的智能转换
- 示例转换:
- `cbxusr_01_FIsEnable` → `启用(仓库)`
- `cbxusr_02_FIsAffectPrice` → `影响价格(仓位)`
- 输出信息从技术性控件名变为业务人员可读的自然语言
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
var
ModifiedControls: TStringList;
CurrentForm: TForm;
// 获取控件的中文描述
function GetControlChineseName(ControlName: string): string;
var
Prefix, Suffix: string;
PrefixDesc, SuffixDesc: string;
begin
// 提取前缀(01/02/03/04/06)和后缀(FIsEnable/FIsAffectPrice等)
Prefix := Copy(ControlName, Pos('_', ControlName) + 1, 2);
Suffix := Copy(ControlName, Pos('_', ControlName) + 4, MaxInt);
// 映射前缀到中文描述
if Prefix = '01' then PrefixDesc := '仓库'
else if Prefix = '02' then PrefixDesc := '仓位'
else if Prefix = '03' then PrefixDesc := 'BOM版本'
else if Prefix = '04' then PrefixDesc := '批号'
else if Prefix = '06' then PrefixDesc := '计划跟踪号'
else PrefixDesc := '未知';
// 映射后缀到中文描述
if Suffix = 'FIsEnable' then SuffixDesc := '启用'
else if Suffix = 'FIsAffectPrice' then SuffixDesc := '影响价格'
else if Suffix = 'FIsAffectPlan' then SuffixDesc := '影响计划'
else if Suffix = 'FIsAffectCost' then SuffixDesc := '影响出库成本'
else SuffixDesc := '未知';
Result := SuffixDesc + '(' + PrefixDesc + ')';
end;
procedure ProcessControls(EnablePrefix: string);
var
EnableCheckBox: TCheckBox;
AffectCheckBox: TCheckBox;
AffectNames: array[0..2] of string;
AffectControlName, EnableControlName: string;
i: Integer;
ChineseDesc: string;
begin
AffectNames[0] := 'FIsAffectPrice';
AffectNames[1] := 'FIsAffectPlan';
AffectNames[2] := 'FIsAffectCost';
EnableControlName := 'cbxusr_' + EnablePrefix + '_FIsEnable';
EnableCheckBox := TCheckBox(CurrentForm.FindComponent(EnableControlName));
if Assigned(EnableCheckBox) and not EnableCheckBox.Checked then
begin
for i := 0 to High(AffectNames) do
begin
AffectControlName := 'cbxusr_' + EnablePrefix + '_' + AffectNames[i];
AffectCheckBox := TCheckBox(CurrentForm.FindComponent(AffectControlName));
if Assigned(AffectCheckBox) and AffectCheckBox.Checked then
begin
ChineseDesc := GetControlChineseName(AffectControlName);
ModifiedControls.Add(ChineseDesc + ' 已被自动修改为未选中状态,因为 ' +
GetControlChineseName(EnableControlName) + ' 未被选中');
AffectCheckBox.Checked := False;
end;
end;
end;
end;
begin
ModifiedControls := TStringList.Create;
try
try
CurrentForm := Screen.ActiveForm;
if not Assigned(CurrentForm) then
begin
ShowMessage('无法获取当前窗体');
Exit;
end;
ProcessControls('01');
ProcessControls('02');
ProcessControls('03');
ProcessControls('04');
ProcessControls('06');
if ModifiedControls.Count > 0 then
begin
ShowMessage(
'以下控件的值已被自动修改:' + #13#10 +
'--------------------------------' + #13#10 +
ModifiedControls.Text + #13#10 +
'--------------------------------'
);
end;
except
on E: Exception do
ShowMessage('执行脚本时出错: ' + E.Message);
end;
finally
ModifiedControls.Free;
end;
end.
```
## 更新枚举选项
`cbxusr_444` 控件的值必须等于 `cbxusr_333` 控件的值(枚举选项用 `.Text` 可以直接获取,直接赋值,但是不能直接设置在控件上)
```Delphi
uses MyClass,Variables,BaseUtil,CommonFunc,DataConst,CFFrm,CFSimplePropFrm,Forms,StdCtrls,Variants,SysUtils,Classes,Controls,Dialogs,
CHostIntf,ProductClas,DocClas,LoginClas,VirtualTrees,CEntClas,PathClas;
begin
cbxusr_444.Text := cbxusr_333.Text;
end.
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB