vault backup: 2025-05-12 22:27:41
11
SanPinPLM/ERP接口配置/4.0-other/10.并发用户管理.md
Normal file
@ -0,0 +1,11 @@
|
||||
# 介绍
|
||||
|
||||
在三品PLM系统中, [用户](../../相关操作/0.5-SETOUT/40.用户设置.md)用户设置.md) 可以有无限个,但同时登录在线的用户数量是有上限的,对于当前正在使用系统的用户,可以进行相应的管控
|
||||
|
||||
# 前置要求
|
||||
|
||||
进行管控的用户,必须具备 **企业配置** → **系统安全** → **并发用户*13212445436.png)
|
||||
|
||||
# 操作
|
||||
|
||||
在 **企业配置** 模块中的 **系统安全** 选项内找到 **并发用户** 选项,在此页面能够管控到当前使用系统的所有用户,选择要踢出的用户,点击e-20240713212813997.png)
|
101
SanPinPLM/ERP接口配置/4.0-other/19.对象属性定义.md
Normal file
@ -0,0 +1,101 @@
|
||||
# 介绍
|
||||
|
||||
**对象属性** 指代 **对象分类** 在 **常规属性页面** 中可定义的属性
|
||||
|
||||
325.png)
|
||||
|
||||
# 对象属性
|
||||
|
||||
想要定义 **对象属性**,需要在 **系统设置** → **参数配置** → **系统参数** → **数据定义相关** → **对象属性定义** 中定义
|
||||
|
||||
==文档或物料所能设置的属性,归由 **对象属性定义** 中的 **文档或物料** 管理==
|
||||
|
||||

|
||||
|
||||
双击 **文档或物料** 可以对当前系统中文档或物料的所有相关属性进行设置,对这些对象的常规06115956707.png)
|
||||
|
||||
## 新增自定义对象属性
|
||||
|
||||
如果 **对象属性定义** 中没有所需要的属性,可通过 **新建**e002-17229359177821.jpg)
|
||||
|
||||
在 **对象属性定义界面** 需要填写 **名称** 与 **显示名**,其中名称必须以“usr_”为前缀lip_image002-17229359843532.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)`
|
||||
|
||||
### 多属性映射
|
||||
|
||||
若有多个 **对象属性** 要同步映射到同一个 **对象属性** 中,则可以在表达式中写上多个 **对象属性名称**,获取的内容会通过分隔符进行分隔
|
||||
|
||||

|
||||
|
||||
> 如图,多属性映射情况下,填写两个属性,则按照顺序全部映射,且属性值之间使用分隔符进行分隔
|
||||
>
|
||||
> 
|
||||
>
|
||||
> 如图,多属性映射情况下,只填写了一个属性,则只映射该属性,且忽略分隔符
|
||||
>
|
||||
> 
|
||||
|
||||
### 属性数值计算
|
||||
|
||||
若某一 **对象属性** 需要进行计算,计算后的结果填入到另一 **对象属性** 中,则可以在 **属性数值计算** 中写好算式,系统会将计算后的结果写入到对应的 **对象属性** 中
|
||||
|
||||
前提要求是 ==参与计算的对象属性,与接收结果的对象属性 **值类型** 为 **整数类型** 或 **小数类型**==
|
||||
|
||||

|
||||
|
||||
> 如图,属性数值计算情况下,填写重量后,可以将计算后的结果写入到备注中
|
||||
>
|
||||
> 
|
||||
|
||||
#### **说明**
|
||||
|
||||
若参与计算的对象属性值为空,则接收结果的对象属性会接收到整个算式,如属性B由属性A+10得出,那么当属性A为空时,属性B的值为+10
|
||||
|
||||
在设置 **属性数值计算** 时,请务必检查,不可出现多级计算的情况,即属性B由属性A+10得出,而属性C由属性B-2得出,那么当属性A为空时,属性B的值为+10,属性C的值为+10-2,又因为属性C要求存储整数或小数类型,系统将会出现如下提示
|
||||
|
||||

|
||||
|
||||
相较于 **属性数值计算** 更建议采用 [窗体表单脚本](200.Delphi脚本.md) 来实现属性值的计算
|
||||
|
||||
## 补充
|
||||
|
||||
系统内建的 **对象属性** 在多数情况下是不容许修改的,或者说修改无效,例如物料的 **单位**、**生产类型** 都要求存储数值类型,就算在 **对象属性** 中进行修改调整,也无法生效使用
|
137
SanPinPLM/ERP接口配置/4.0-other/20.自定义对象常规属性.md
Normal file
@ -0,0 +1,137 @@
|
||||
# 介绍
|
||||
|
||||
无论是 **文档** 还是 **物料** 等对象的常规属性,都分有 **内建属性** 与 **自定义物料属性**
|
||||
|
||||
- 内建属性:系统中已经建立的属性,无法修改
|
||||
- 自定义物料属性:自定义物料属性是指用户可以在系统内建属性之外,根据对象特征需要创建其它属性
|
||||
|
||||
**对象常规属性设置** 指设置该对象类型所具备的常规属性,与对应的排版
|
||||
|
||||

|
||||
|
||||
这个面板,与 ==**企业配置** → **对象分类** → 文档或物料中的设置是相同的==
|
||||
|
||||
想要对某一类物料的常规属性及其布局进行修改,需要在 ==**企业配置** → **对象分类** → **物料**== 进行设置,具体的设置方式与 [窗体表单模板制作](../../相关操作/1.0-EDM/175.窗体表单.md#窗体表单模板制作) 方式相似
|
||||
|
||||

|
||||
|
||||
# 前置条件
|
||||
|
||||
==文档或物料所能设置的属性,归由 **对象属性定义** 中的 **文档或物料** 管理==
|
||||
|
||||

|
||||
|
||||
双击 **文档或物料** 可以对当前系统中文档或物料的所有相关属性进行设置,对这些对象的常规属性管理
|
||||
|
||||
想要设置对象的常规属性,前提要求是 **对象属性定义** 中有这个属性
|
||||
|
||||

|
||||
|
||||
## 新增自定义对象属性
|
||||
|
||||
如果 **对象属性定义** 中没有所需要的属性,可通过 **新建** 功能创建出新的对象属性
|
||||
|
||||

|
||||
|
||||
在 **对象属性定义界面** 需要填写 **名称** 与 **显示名**,其中名称必须以“usr_”为前缀,后面输入英文字母,且不能与其他属性同名
|
||||
|
||||

|
||||
|
||||
显示名可以输入中文,比如仓库。另外字段长度表示用户在输入该属性时的最大长度,显示宽度表示界面中输入框的长度,值类型比较常用的有文本类型、整数类型、小数类型、枚举类型
|
||||
|
||||

|
||||
|
||||
## 属性映射
|
||||
|
||||
若某一对象属性的值来源于另一个对象属性,则可以进行属性映射,在 **对象属性定义界面** 点击 **高级** 按钮
|
||||
|
||||
勾选 **属性值来源于以下表达式** 后,在下方的输入栏中填写上要引用的 **对象属性名称**,==用 “ [] ” 包裹==
|
||||
|
||||

|
||||
|
||||
> 如图所示,填写规格后,备注的内容会自动从规格属性中获取
|
||||
>
|
||||
> 
|
||||
|
||||
### 多属性映射
|
||||
|
||||
若有多个 **对象属性** 要同步映射到同一个 **对象属性** 中,则可以在表达式中写上多个 **对象属性名称**,获取的内容会通过分隔符进行分隔
|
||||
|
||||

|
||||
|
||||
> 如图,多属性映射情况下,填写两个属性,则按照顺序全部映射,且属性值之间使用分隔符进行分隔
|
||||
>
|
||||
> 
|
||||
>
|
||||
> 如图,多属性映射情况下,只填写了一个属性,则只映射该属性,且忽略分隔符
|
||||
>
|
||||
> 
|
||||
|
||||
### 属性数值计算
|
||||
|
||||
若某一 **对象属性** 需要进行计算,计算后的结果填入到另一 **对象属性** 中,则可以在 **属性数值计算** 中写好算式,系统会将计算后的结果写入到对应的 **对象属性** 中
|
||||
|
||||
前提要求是 ==参与计算的对象属性,与接收结果的对象属性 **值类型** 为 **整数类型** 或 **小数类型**==
|
||||
|
||||

|
||||
|
||||
> 如图,属性数值计算情况下,填写重量后,可以将计算后的结果写入到备注中
|
||||
>
|
||||
> 
|
||||
|
||||
#### **说明**
|
||||
|
||||
若参与计算的对象属性值为空,则接收结果的对象属性会接收到整个算式,如属性B由属性A+10得出,那么当属性A为空时,属性B的值为+10
|
||||
|
||||
在设置 **属性数值计算** 时,请务必检查,不可出现多级计算的情况,即属性B由属性A+10得出,而属性C由属性B-2得出,那么当属性A为空时,属性B的值为+10,属性C的值为+10-2,又因为属性C要求存储整数或小数类型,系统将会出现如下提示
|
||||
|
||||

|
||||
|
||||
相较于 **属性数值计算** 更建议采用 [窗体表单脚本](200.Delphi脚本.md) 来实现属性值的计算
|
||||
|
||||
# 操作步骤
|
||||
|
||||
确保 **对象属性定义** 中有所需属性
|
||||
|
||||
==选择 **企业配置** → **对象分类** → **物料** → 具体的对象,双击或右键选择属性打开其属性面板==
|
||||
|
||||

|
||||
|
||||
在属性面板中选择 **常规属性**,并右键选择 **自定义界面** 选项
|
||||
|
||||

|
||||
|
||||
弹出的新窗口即为 [自定义控件页面](../../相关操作/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#控件属性设置区) 进行设置
|
||||
|
||||

|
||||
|
||||
添加完成后,会发现页面不太美观,此时可以通过右上角的 [控件对齐区](../../相关操作/1.0-EDM/175.窗体表单.md#控件对齐区) 对其进行调整、美化
|
||||
|
||||
按住 “ Ctrl ” 键不放,用鼠标单击 [属性界面区](#属性界面区) 的不同控件,单击的控件将被选中,单击 [控件对齐区](../../相关操作/1.0-EDM/175.窗体表单.md#控件对齐区) 的对齐按钮,被标记的控件根据单击的按钮类型做相关操作
|
||||
|
||||

|
||||
|
||||
**对齐按钮类型**
|
||||
|
||||
- **第一排**:左对齐、右对齐、上对齐、下对齐(以选择的第一个标签为准)
|
||||
- **第二排**:垂直居中,水平居中,水平最长宽对齐,水平最窄宽对齐
|
||||
- **第三排**:垂直长高对齐、垂直短高对齐、水平指定宽间距、垂直指定高间距
|
||||
- **第四排**:宽增加、高减小、宽减小、高增加
|
||||
|
||||
完成配置后,点击确定即可保存新的常规属性界面
|
||||
|
||||
## 复制界面定义
|
||||
|
||||
上述的操作步骤只能定义单个对象分类的 **常规属性界面**,无论其他分类,还是该分类下已有的子分类,亦或是该分类下新建的子分类,都无法继承当该分类的 **常规属性界面**。而为了让其他分类也具备相同的 **常规属性界面**,可对该分类右键,选择 **复制界面定义** 选项
|
||||
|
||||

|
||||
|
||||
复制后在其他分类上右键,选择 **粘贴界面定义** 即可
|
||||
|
||||
若该分类及其子分类的 **常规属性界面** 要求一致,则可在父分类上右键选择 **粘贴界面定义(所有子)** 即可
|
||||
|
||||

|
86
SanPinPLM/ERP接口配置/4.0-other/200.Delphi脚本.md
Normal file
@ -0,0 +1,86 @@
|
||||
# 介绍
|
||||
|
||||
在窗体表单或对象常规属性中支持 `Delphi` 脚本来实现一些特性化操作
|
||||
|
||||
# 脚本编辑器
|
||||
|
||||
这是一个编辑、检查脚本的窗体
|
||||
|
||||
由主菜单、工具栏、 [控件区](#控件区) 、 [脚本编辑区](#脚本编辑区) 、 [函数/变量区](#函数/变量区) 、 [错误提示区](#错误提示区) 组成,界面如下图:
|
||||
|
||||

|
||||
|
||||
## 布局介绍
|
||||
|
||||
### 文件
|
||||
|
||||
保存或者关闭脚本编辑器
|
||||
|
||||
操作:检查语法正确性
|
||||
|
||||
查找/替换/查找下一个: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.
|
||||
```
|
||||
|
||||
### 函数/变量区
|
||||
|
||||
显示系统支持的变量和函数,双击节点时,在 **脚本编辑区** 的当前光标位置增加变量或函数名称,鼠标移到树节点时,提示信息窗显示变量类型或函数原型,支持节点拖动
|
||||
|
||||

|
||||
|
||||
### 错误提示区
|
||||
|
||||
执行 **保存** 或 **检查语法正确性** 命令时,如果脚本存在错误,则错误信息被显示在 **错误提示区**,双击错信息行时,在 **脚本编辑区** 中对于的错误行用红色背景标记
|
300
SanPinPLM/ERP接口配置/4.0-other/25.编码器设置.md
Normal file
@ -0,0 +1,300 @@
|
||||
# 介绍
|
||||
|
||||
编码器:是一套编码规则在系统中的体现,用于编码的编制与名称规则。使用绑定的编码器编制编码,提高编码效率,确保编码准确与规范(无论是物料编码、文件编号还是文件的命名规则,只要有固定的编制规则,那就都可以用到编码器)
|
||||
|
||||
码段:编码器的功能单位,一个编码器由若干个码段组成,各个码段的值组成完整的编码。每个码段应对应编码规则中的某段含义
|
||||
|
||||
# 前置要求
|
||||
|
||||
进行编码器设置的用户角色必须具备 **系统设置** 中的 **编码管理** 权限(至少具备 **可见、浏览、修改、新增** 权限)
|
||||
|
||||

|
||||
|
||||
# 操作步骤
|
||||
|
||||
1. 新建编码器
|
||||
2. 填写编码名称
|
||||
3. 添加码段
|
||||
4. 定义码段
|
||||
|
||||
## 案例
|
||||
|
||||
以下面两个物料编码规则为例
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
先创建“产品物料编码”,在 **企业配置** 中打开 **编码管理** 页面,右键选择新建 **编码**
|
||||
|
||||

|
||||
|
||||
在弹出的 **编码属性定义界面** 中填写编码的名称
|
||||
|
||||

|
||||
|
||||
填写名称后选择 **码段信息** 进行定义,由于“产品物料编码规则”中,第一个码段是“标识”,是每个编码都相同的码段,其值固定不变
|
||||
|
||||

|
||||
|
||||
故而码段类型选择 **固定字符串**,并在 **取值** 框内输入显示的值即可
|
||||
|
||||

|
||||
|
||||
第二个码段是“大类”,这是需要用户选择的码段
|
||||
|
||||

|
||||
|
||||
故码段类型选择 **枚举**,并在下方 **常规取值** 标签下创建出所有选项
|
||||
|
||||

|
||||
|
||||
上图的 **可取值范围** 列表中,**取值** 列是指该码段之值显示的内容,**含义** 列是指该码段之值的具体含义。
|
||||
|
||||
第三个码段是“小分类”,也是枚举类型的码段
|
||||
|
||||

|
||||
|
||||
但是,此码段提供的选项将受到第二个码段的取值制约。例如,第二个码段选择了“A种类”,那第三个码段将提供“a类”、“b类”和“c类”给用户选择,如果第二个码段选择了“C种类”,第三个码段就提供“g类”、“h类”和“i类”给用户选择。所以需要设置枚举码段的 **取值约束**
|
||||
|
||||
首先,码段类型选择枚举,然后在 **常规取值** 标签下将所有待选项创建出来:
|
||||
|
||||

|
||||
|
||||
然后点击 **取值约束** 标签,点击 **增加约束** 来创建取值约束
|
||||
|
||||

|
||||
|
||||
在弹出的 **取值约束** 窗体中,选择之前创建完成的 **大类** 码段,将以此码段作为约束码段
|
||||
|
||||

|
||||
|
||||
为约束码段选取一个值,形成约束条件,之后按 **确定** 完成
|
||||
|
||||

|
||||
|
||||
设置好一个约束条件之后,将显示在约束条件列表中,并在最下方的表格内列出本码段的所有待选项,勾选这些待选项,作为满足选定的约束条件时,本码段允许的取值
|
||||
|
||||

|
||||
|
||||
像这样把 **大类** 里的每一个值都设置成一个约束条件,并设置相应的允许取值
|
||||
|
||||

|
||||
|
||||
完成这些设置之后点击 **确定** ,完成该码段的创建
|
||||
|
||||
第四个码段是 **产品标识**,是需要用户手动输入的码段
|
||||
|
||||

|
||||
|
||||
故码段类型选择 **用户输入**
|
||||
|
||||

|
||||
|
||||
最后一个码段是流水号,故码段类型选择 **流水号**,注意流水号的位数
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
如此便完成了“产品物料编码”编码器的创建
|
||||
|
||||

|
||||
|
||||
接下来创建“零部件物料编码”
|
||||
|
||||

|
||||
|
||||
第一个字段是“父级物料编码”,意思是码段的值为上一级物料的物料编码
|
||||
|
||||

|
||||
|
||||
故码段类型选择 **父编码**,还可以在 **范围设定** 中设置继承的范围,本例是全部继承:
|
||||
|
||||

|
||||
|
||||
第二个码段是两位数字型的 **流水号**
|
||||
|
||||

|
||||
|
||||
如此便完成了零部件物料编码器的创建:
|
||||
|
||||

|
||||
|
||||
# 扩展
|
||||
|
||||
## 码段类型
|
||||
|
||||
编码器中可选的 **码段类型** 是固定的,包含有:
|
||||
|
||||
- [固定字符串](#固定字符串)
|
||||
- [枚举](#枚举)
|
||||
- [流水号](#流水号)
|
||||
- [日期](#日期)
|
||||
- [员工编号](#员工编号)
|
||||
- [部门编号](#部门编号)
|
||||
- [用户输入](#用户输入)
|
||||
- [当前用户名](#当前用户名)
|
||||
- [模板名称](#模板名称)
|
||||
- [所属产品编码](#所属产品编码)
|
||||
- [所属产品代号](#所属产品代号)
|
||||
- [父零件代号](#父零件代号)
|
||||
- [父零件编码](#父零件编码)
|
||||
- [部门名称](#部门名称)
|
||||
- [模板编码](#模板编码)
|
||||
- [父名称](#父名称)
|
||||
- [父编码](#父编码)
|
||||
- [项目名称](#项目名称)
|
||||
- [项目编码](#项目编码)
|
||||
- [对象属性](#对象属性)
|
||||
- [类别树](#类别树)
|
||||
- [脚本代码](#脚本代码)
|
||||
- [对象分类编码](#对象分类编码)
|
||||
- [附件名称](#附件名称)
|
||||
- [附件编码](#附件编码)
|
||||
- [父对象属性](#父对象属性)
|
||||
|
||||
### 固定字符串
|
||||
|
||||
固定字符串类型的码段,其取值是固定不变的
|
||||
|
||||

|
||||
|
||||
### 枚举
|
||||
|
||||
> 枚举(Enumeration)是一种数据类型,用于定义一组命名的常量值。它允许开发者用更具可读性的符号表示固定的值集合,常用于表示有限且明确的状态或选项。
|
||||
>
|
||||
> 枚举的主要特点:
|
||||
> 命名常量:枚举为每个常量赋予一个名称,提升代码可读性。
|
||||
> 类型安全:枚举变量只能取枚举中定义的值,减少错误。
|
||||
> 有限集合:枚举值通常是固定的,不可随意扩展。
|
||||
>
|
||||
> 例如:表示星期的枚举:SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY
|
||||
|
||||
在编码器中,枚举类码段的取值分有两种情况,即在 **常规取值** 中定义的[局部枚举](#局部枚举),与在整个系统中定义的[系统枚举](#系统枚举)
|
||||
|
||||
#### 局部枚举
|
||||
|
||||
局部枚举即指代在当前编码器中使用的枚举,在 **常规取值** 中进行定义,作用范围是当前编码器,换个编码器就需要重新进行定义
|
||||
|
||||

|
||||
|
||||
##### 取值约束
|
||||
|
||||
取值约束可以用于约束枚举值的取值范围,可理解为:当满足某一条件时,可选择的枚举值为XXX
|
||||
|
||||
设置 **取值约束** 的前提条件是,必须具备其他 **码段**,一个编码器中只有 **枚举类码段** 是没办法设置 **取值约束** 的
|
||||
|
||||
需要用户先添加 **约束**,再设置 **取值范围**,每一条 **约束** 都可以设置对应的 **取值范围**
|
||||
|
||||
例如:设置当“工作周期”码段值为“休息日”时,“星期”码段的值可选择“星期六”或“星期天”
|
||||
|
||||

|
||||
|
||||
#### 系统枚举
|
||||
|
||||
系统枚举即指代在系统中设置的枚举类型,作为范围是整个系统,任意编码器中都可以使用
|
||||
|
||||
在 **系统枚举**一栏中点击“三个点”进行选择,选择后可不用再配置 **常用取值**
|
||||
|
||||

|
||||
|
||||
注意:系统枚举没有 **取值约束**,即便添加约束也不能设置相应的取值范围
|
||||
|
||||

|
||||
|
||||
### 流水号
|
||||
|
||||
**流水号** 类型的码段,是由系统自动进行累加的,可设置其相应的长度与取值范围
|
||||
|
||||
流水号类型可设置为数字型或字母型,若为字母型可设置是否开启大写
|
||||
|
||||
流水号的约束字段与枚举的 [取值约束](#取值约束) 不同,流水号会根据约束字段的不同进行区分累加。例如:以“星期”码段作为约束,那么当周一流水号累加到003时,周二的流水号仍是从001开始,而当周二的流水号累加到010时,周一的流水号会续接周一的流水号,从003开始累加
|
||||
|
||||

|
||||
|
||||
#### 补充
|
||||
|
||||
如果流水号没有设置 **约束码段**,那么当生成编码的时候,可能会出现 **跳码** 现象
|
||||
|
||||
即,现在有编码 `2502240501`,此时要通过编码器生成一个新编码,按理来说会生成 `25022401`,其中末位的两位(` 01 `)是流水码,但是由于没有设置约束码段,在生成编码时,系统校验是否存在开头是 `250224` 的编码,找到 `2502240501` 后,会截取 `0501` 的头两位编码,即 `05`,判断得出已有流水码 `05`,故而生成的新编码会直接从流水 `05` 开始,为 ` 25022406 `
|
||||
|
||||
### 日期
|
||||
|
||||
**日期** 类型的码段,可在 **常规取值** 中设置日期的格式(xxxx年xx月xx日)
|
||||
|
||||

|
||||
|
||||
### 员工编号
|
||||
|
||||
**员工编号** 类型码段不用管其长度与取值的设置,系统会自动获取到当前用户的 [编号](../../相关操作/0.5-SETOUT/40.用户设置.md#编号)
|
||||
|
||||

|
||||
|
||||
### 部门编号
|
||||
|
||||
部门编号类型码段不用管其长度与取值的设置,系统会自动获取到当前用户所在部门的 [部门编号](../../相关操作/0.5-SETOUT/40.用户设置.md#部门编号)
|
||||
|
||||

|
||||
|
||||
### 用户输入
|
||||
|
||||
### 当前用户名
|
||||
|
||||
会获取当前操作的用户的 [用户名](../../相关操作/0.5-SETOUT/40.用户设置.md#用户名)
|
||||
|
||||

|
||||
|
||||
### 模板名称
|
||||
|
||||
获取当前关联的模板的名称
|
||||
|
||||

|
||||
|
||||
### 所属产品编码
|
||||
|
||||
### 所属产品代号
|
||||
|
||||
### 父零件代号
|
||||
|
||||
### 父零件编码
|
||||
|
||||
### 部门名称
|
||||
|
||||
### 模板编码
|
||||
|
||||
### 父名称
|
||||
|
||||
父名称指代BOM中的最大级别的物料的名称
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
### 父编码
|
||||
|
||||
父编码与 [父名称](#父名称) 概念相似 ,指代BOM中的最大级别的物料的物料编码
|
||||
|
||||
### 项目名称
|
||||
|
||||
### 项目编码
|
||||
|
||||
### 对象属性
|
||||
|
||||
需要先选择要关联的对象的类型,以及要关联的属性,并可设置对该值的取值范围。使用时编码器可自动获取对象属性值
|
||||
|
||||

|
||||
|
||||
### 类别树
|
||||
|
||||
### 脚本代码
|
||||
|
||||
### 对象分类编码
|
||||
|
||||
### 附件名称
|
||||
|
||||
### 附件编码
|
||||
|
||||
### 父对象属性
|
41
SanPinPLM/ERP接口配置/4.0-other/40.Excel批量更新文档属性.md
Normal file
@ -0,0 +1,41 @@
|
||||
# 介绍
|
||||
|
||||
所有的文档存在于系统中,都有其 [常规属性](../../相关操作/1.0-EDM/80.文档分类设置.md#常规属性设置)
|
||||
|
||||

|
||||
|
||||
若要修改属性,对文档右键选择 **属性** 即可,但有多个文件想要修改其属性,需要用到批量操作
|
||||
|
||||
> 若要修改多个文件的版本为统一值,则可通过 [修改文档属性调整文档版本](../../相关操作/1.0-EDM/10.文件版本管理.md#修改文档属性调整文档版本) 实现
|
||||
>
|
||||
> 若要修改多个文件的分类为统一值,则可通过 [多个文件批量调整文档分类](../../相关操作/1.0-EDM/80.文档分类设置.md#多个文件批量调整文档分类) 实现
|
||||
|
||||
但若是要修改其他属性值,或属性值不统一的情况,则需要通过Excel来实现批量更新操作
|
||||
|
||||
## 前置要求
|
||||
|
||||
使用 **Excel批量更新文档属性** 功能,需要用户角色至少具备 **系统工具** 的 **Excel批量更新文档属性** 权限
|
||||
|
||||

|
||||
|
||||
# Excel导入模板
|
||||
|
||||
通过 **Excel批量更新文档属性** 需要采用标准的Excel导入模板
|
||||
|
||||
模板要求Excel表中必须具备 **文档名称** 或 **文档编码** 中的一列,这是因为系统需要依据二者中的一个属性去做更新
|
||||
|
||||

|
||||
|
||||
此外,Excel模板要求对标题栏的名称做定义,即文档编码一栏的名称是 **code**,文档名称一栏的名称是 **DocName**,其他要修改的属性名称,可在 **系统设置** → **参数配置** → **系统参数** → **数据定义相关** → **对象属性定义** → **文档** 中查询
|
||||
|
||||

|
||||
|
||||
# 更新操作
|
||||
|
||||
在Excel表中编制完成后,在 **系统设置** → **系统工具** → **文档相关** → **Excel批量更新文档属性** 中,点击浏览上传Excel表
|
||||
|
||||

|
||||
|
||||
需要注意的是,必须要选择 ==**以何种文档属性更新**==,选择后会以此为基准对文档属性进行更新
|
||||
|
||||
> 例如,选择以文档编码做基准进行更新,则系统会匹配系统中文档编码与Excel表中文档编码值相同的文件,然后更新匹配到的文件的其他属性值(若有文档名称,则也会更新文档名称)
|
98
SanPinPLM/ERP接口配置/4.0-other/50.外部邮箱配置.md
Normal file
@ -0,0 +1,98 @@
|
||||
# 介绍
|
||||
|
||||
**系统邮箱**(内部邮箱):用户在系统的邮件模块中,可以通过邮件传递附件,在企业内部,实现资源共享
|
||||
|
||||
**外部邮箱**:通过Internet收发邮件的邮箱,比如:163邮箱、QQ邮箱等
|
||||
|
||||
在系统中配置外部邮箱,能够实现系统在流程、项目流转至参与者时,由公司邮箱自动发送一封邮件到参与者的个人邮箱,或者在PLM客户端中通过个人邮箱收发邮件
|
||||
|
||||
# 公司外部邮箱
|
||||
|
||||
## 前置要求
|
||||
|
||||
进行 **公司外部邮箱配置** 的用户角色必须具备 **系统设置** 中的 **参数配置** 权限
|
||||
|
||||

|
||||
|
||||
## 操作
|
||||
|
||||
打开 ==**系统设置** → **参数配置** → **系统参数** → **邮件相关类** → **企业邮箱账户**==,然后点击 **新建账户** 按钮
|
||||
|
||||

|
||||
|
||||
在 **新建账户** 页面中输入外邮账户及密码(或者是POP3/SMTP或者IMAP/SMTP服务的专用密码)
|
||||
|
||||

|
||||
|
||||
上图中“你的姓名”指得是在PLM中使用该邮箱发送邮件时,所使用的发件人名称
|
||||
|
||||

|
||||
|
||||
填写完账号、密码、姓名后点击 **下一步** 即可。默认情况下系统会自动填写POP3服务器名称、帐号、SMTP服务器名称,如要调整可自行修改,确认无误后点击 **下一步** 即可
|
||||
|
||||

|
||||
|
||||
写服务器端口信息,点击 **测试帐户设置**,如果成功了,就可以点击 **完成**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
最后,在账户管理窗口点击 **确定**
|
||||
|
||||

|
||||
|
||||
如此便完成了公司外部邮箱的配置
|
||||
|
||||
# 个人外部邮箱
|
||||
|
||||
如果只是希望能够接收到系统使用公司外部邮箱发送的通知邮件,那么在用户设置界面的 [Email](../../相关操作/0.5-SETOUT/40.用户设置.md#Email) 中进行设置即可
|
||||
|
||||
若是需要通过系统的邮件功能收发外部邮件,则要配置个人外部邮箱,在 **工作台** → **邮箱** 中进行设置,右键菜单 **收取Internet邮件** → **邮箱帐户设置**,点击 **新建帐户** 进行,后续步骤与 [公司外部邮箱](#公司外部邮箱) 的设置方式一致,此处略过
|
||||
|
||||

|
||||
|
||||
## 接收外部邮件
|
||||
|
||||
Internet邮件进行收发,一般需要通过网页或者OUTLOOK这类邮件客户端工具完成,但在用户绑定个人外部邮箱后,也能够通过三品PLM客户端实现邮件的接收与发送
|
||||
|
||||
在 **工作台** → **邮箱** 中,右键菜单 **收取Internet邮件** → **全部接收/选择特定账号接受**
|
||||
|
||||

|
||||
|
||||
注:三品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#邮件) 或在 **邮件** 功能中设置权限(如下图)
|
||||
|
||||

|
||||
|
||||
### 邮件中添加附件
|
||||
|
||||
在 **工作台** → **邮箱** 中邮件选择 **新建** → **邮件**
|
||||
|
||||

|
||||
|
||||
在 **编写邮件** 界面上,用户可以在收件人处填写系统用户名和Internet邮件地址,中间用分号或者逗号隔开
|
||||
|
||||

|
||||
|
||||
若要添加附件,点击 **添加附件↓** 按钮即可,可选择PLM系统中的文件作为附件,或选择本地电脑上的文件作为附件
|
||||
|
||||

|
||||
|
||||
### 文件生成邮件
|
||||
|
||||
在文档工作区中,选中一个或多个文件,右键选择 **邮件**,系统会自动生成一封邮件,所选中的文件会作为邮件中的附件存在,即 **系统附件**
|
||||
|
||||

|
||||
|
19
SanPinPLM/ERP接口配置/4.0-other/70.列表中隔行显示颜色.md
Normal file
@ -0,0 +1,19 @@
|
||||
# 介绍
|
||||
|
||||
可以在列表中隔行显示出颜色,例如:
|
||||
|
||||

|
||||
|
||||
# 前置要求
|
||||
|
||||
进行设置的用户角色必须具备 **系统设置** 中的 **参数配置** 权限
|
||||
|
||||

|
||||
|
||||
# 操作
|
||||
|
||||
打开 **在工作区里的列表中,采用隔行颜色显示数据** 进行勾选(启用),并选择 **在工作区里列表上,隔行显示的颜色** 即可
|
||||
|
||||
虽然叫“工作区”,但实际上应用范围比较广
|
||||
|
||||

|
19
SanPinPLM/ERP接口配置/4.0-other/75.系统日历设置.md
Normal file
@ -0,0 +1,19 @@
|
||||
# 介绍
|
||||
|
||||
系统日历设置能够对系统中使用的日历进行设置,其主要作用在于设置系统中的常规工作日与特殊工作日,设置好的日历能够与 **工作流**、**项目** 进行关联,工作流和项目在计算各种事件时,将会使用关联的日历
|
||||
|
||||
# 前置要求
|
||||
|
||||
进行设置的用户角色必须具备 **系统设置** 中的 **参数配置** 权限
|
||||
|
||||

|
||||
|
||||
# 操作
|
||||
|
||||
在 **系统设置** → **参数配置** → 搜索 → 搜索“日历” → **系统日历设置** 中,能够对系统的日历进行配置
|
||||
|
||||

|
||||
|
||||
在属性中可对常规工作日进行配置,设置其每周的工作日与工作时间范围
|
||||
|
||||

|
13
SanPinPLM/ERP接口配置/4.0-other/89.用户个人修改密码.md
Normal file
@ -0,0 +1,13 @@
|
||||
# 介绍
|
||||
|
||||
在初始情况下,用户账户登录三品PLM系统是没有密码的,但对于有需求的用户,可以在系统中设置登录密码,以便于在登录时校验是否为当前用户
|
||||
|
||||
要设置个人密码,需要先登录到三品PLM系统中,在系统的左下角的 **开始** 按钮处,可以进行 **修改密码** 操作
|
||||
|
||||

|
||||
|
||||
在 **修改密码窗口** 中,如果当前没有密码,那么旧密码为空即可,输入新密码即可
|
||||
|
||||

|
||||
|
||||
若忘记了自己的密码,可以尝试 [Email验证修改密码](90.重置密码.md#Email验证修改密码) 或者联系 [管理员修改密码](90.重置密码.md#管理员修改密码)
|
21
SanPinPLM/ERP接口配置/4.0-other/90.重置密码.md
Normal file
@ -0,0 +1,21 @@
|
||||
# 介绍
|
||||
|
||||
用户在设置密码后,可能会出现遗忘的情况,此时有两种方式可以为用户重置密码
|
||||
|
||||
## Email验证修改密码
|
||||
|
||||
系统配置了 [公司外部邮箱](50.外部邮箱配置.md#公司外部邮箱) 且 [用户](../../相关操作/0.5-SETOUT/40.用户设置.md) 填写了 [Email](../../相关操作/0.5-SETOUT/40.用户设置.md#Email)
|
||||
|
||||
此时在登录系统时,密码错误选择 **忘记密码**,可以将验证法发送到用户的Email邮箱中,通过验证码重置密码
|
||||
|
||||
## 管理员修改密码
|
||||
|
||||
具备权限的用户可在 **企业配置** → **用户** 中选择用户,右键选择 **设置密码**
|
||||
|
||||

|
||||
|
||||
### 前置要求
|
||||
|
||||
进行参数设置的用户角色必须具备 **企业配置** → **用户** 中的 **修改** 权限
|
||||
|
||||

|
1406
SanPinPLM/ERP接口配置/4.0-other/998.Excel常用函数.md
Normal file
424
SanPinPLM/ERP接口配置/4.0-other/999.Delphi脚本记录.md
Normal 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.
|
||||
```
|
After Width: | Height: | Size: 337 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 314 KiB |
After Width: | Height: | Size: 506 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 371 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 317 KiB |
After Width: | Height: | Size: 361 KiB |
After Width: | Height: | Size: 412 KiB |
After Width: | Height: | Size: 20 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/clip_image004.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/clip_image006.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/clip_image008.jpg
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603151728784.png
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603152019320.png
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603152853325.png
Normal file
After Width: | Height: | Size: 138 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603153929430.png
Normal file
After Width: | Height: | Size: 617 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603154619394.png
Normal file
After Width: | Height: | Size: 237 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603154749096.png
Normal file
After Width: | Height: | Size: 184 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603154934910.png
Normal file
After Width: | Height: | Size: 385 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240603155358364.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240621100850228.png
Normal file
After Width: | Height: | Size: 306 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20240818152224182.png
Normal file
After Width: | Height: | Size: 596 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209111021292.png
Normal file
After Width: | Height: | Size: 431 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209111404277.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209111918467.png
Normal file
After Width: | Height: | Size: 302 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209112109008.png
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209112213084.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209113805159.png
Normal file
After Width: | Height: | Size: 139 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241209113959715.png
Normal file
After Width: | Height: | Size: 349 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241226201048935.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241226201840976.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241226202417865.png
Normal file
After Width: | Height: | Size: 458 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20241226202624092.png
Normal file
After Width: | Height: | Size: 354 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20250110095617475.png
Normal file
After Width: | Height: | Size: 307 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20250110095824603.png
Normal file
After Width: | Height: | Size: 127 KiB |
BIN
SanPinPLM/ERP接口配置/4.0-other/assets/image-20250121151417460.png
Normal file
After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 92 KiB |