客开应用实例讲解
—2024科情客户技术应用提升培训会
客开应用实例讲解
—2024科情客户技术应用提升培训会
深耕医药流通行业多年,精通GSP法规条款,让技术深度融合与业务场
景应用,带领团队参与过多个中大型ERP项目建设,全生命周期的完成
项目实施和管理工作,完成过行业内多个最佳业务实践,高标准的达
到与客户的知识交付与输出。
汪松 科情实施服务中心 高级实施顾问
◼ 重点项目经历:
人福湖北医药集团有限公司
湖北九州通中加医药有限公司
马应龙物流医药有限公司
湖北唐人医药有限公司
武汉健民医药集团
武汉启元医药
目录
C O N T E N T S
01 资料检索方案 02 单据提取方案
03 制作工作流 04 报表和模板
资料检索方案
No.1 资料检索方案
业务场景:
在企业管理中,遵循的原则:用最短的时间,完成相应的工作,提高工作效率。比如在:采购订单
中,选择商品、供应商、客户等等时,对相应的数据,进行检索。使用系统检索方案控件,可以有效提
高工作效率。
资料检索方案,包括不同类的检索方案,如商品、供应商、客户、业务员选择等等。
以【采购订单为例】,选择供应商、采购员、选择商品都属于检索方案的使用案
例。
No.1资料检索方案
以【供应商资料选择】为例。
No.1资料检索方案
【中文名称】资料检索方案
【功能说明】主要为其它控件设置建立检索
方案,光标在控件上,
进行空格+回车、双击或点击 都会
弹出资料检索方案,
方案
【方案】选用公共的资料检索方案
公共
【标题】资料检索方案的标题名称
【多选】是否允许多选
控件
【包含表格】是否以表格的形式显示
【包含树】是否以结构树的形式显示
公共检索方案、本地资料检索方案的区别:
公共检索方案:只要在方案标题栏中,选择
对应的方案ID就可以,属性自动显示;
本地检索方案:需要自己手动填写所有的属
性。
No.1资料检索方案
【方案类型】图表样式分为selector、bill和form三种
类型=selector:一般用于检索资料,如选择机构、选择客户、商品等等
类型=bill:一般用于业务上下游的单据提取,如销售开票单提取销售订单等
类型=form:一般用于弹出form,支持更复杂的业务应用,比如销售选商品就用的此种类型
【不复制字段】不拷贝的字段即不落在数据集上的字段
【过滤】是否设置显示过滤条件
【过滤表达式】设置过滤表达式
【记录数】设置分页(-1默认不分页)
【目标数据集】用于存储数据的目标数据集
【隐藏字段】设置要隐藏字段
【自动显示】当只找到一条记录符合时直接将数据落下不再弹出资料检索窗口
No.1资料检索方案
事件:
【AfterOpen】打开资料检索方案之后触发的事件后事件主要是用于资料选
择完毕后的后继处理,比如关联查询或者返回结果的校验等,可以为空。
【BeforeOpen】打开资料检索方案之前触发的事件,主要是准备sql语句中 →
的一些参数的赋值,没有可以为空。
选择方案之后自动生成,不可编辑
→目标数据集必须选择,否则数据落不下来
→
No.1资料检索方案
隐藏字段的设置方法:
1、将检索方案,选择空,隐藏字段的属性标题,不是灰色字体,就可以修改:
单据提取方案
No.2 单据提取方案
单据提取操作详解:
工作路径:【工作区】---【购销运营】---【采购管理】-【采购订单】
No.2单据提取方案
开发配置:
No.2单据提取方案
在uf_adjBill()函数中:
No.2单据提取方案
提取方案中一般有3个以上的打开参数(至少2个):
打开参数:用于选择待提取的单据,
主数据集打开参数:为主数据集进行数据赋值,
子数据集打开参数:为明细数据集进行数据赋值,可以有多个子数据集,也可以不写。
No.2单据提取方案
各种打开参数的数据展示:
各打开参数直接都是通过主键字段进行数据传递查询的,主键字段来自【打开参数】。
No.2单据提取方案
不赋值字段的设置:
1、在公共函数中选择:
2、公共函数的传参详细介绍:【客开软件,工具菜单栏下的‘维护公共函数’可以查看到】
检索:提取方案得到不赋值字段
制作工作流
No.3 制作工作流
什么是工作流?
针对需要多人审核或参与共同完成的业务单据,在系统中工作方式
定义为工作流。例如销售开票流程:
发起人→责任人审批→打印单据→财务审核→库房发货
发起人 责任人审批 打印单据
财务审核
No.3制作工作流
系统中的工作流:
传统作业:一般采用纸质表单,手工传递的方式,一级一级审批签字,工作效率非常低下,对于统
计报表功能则不能实现。
系统作业:在电脑上填写有关表单,会按照定义好的流程自动往下跑,下一级审批者将会收到相关
资料,并可以根据需要修改、跟踪、管理、查询、统计、打印等,提高效率,实现知识管理,提升
公司核心竞争力。
No.3制作工作流
主要介绍一下,如何把一个表单变成工作流表单的详细步骤。
一个完整的工作流表单,应具备以下几点:
➢ 单据保存成功,可以发起工作流。
➢ 流程审批时,审批人可以看到完整的单据数据。
➢ 单据未执行时,可以进行单据修改。可以保存,可以删除。
➢ 单据修改后,不会生成新的工作流单据。
➢ 保证下游提取的单据是审核完成的。
No.3制作工作流
1、新建工作流
路径:【系统管理区】-【流程管控】-【流程设计】
新建时,可以手动添加节点,也可以引用已有流程进行修改。
引用时需要注意,每个节点对应的表单方法都需要重新选择一下,防止不同表单的父菜单id不
同。
No.3制作工作流
在结束节点添加审批完成回写字段。
代码格式如下:
DBUtil.update(\"update PurOrderMt set IsEnd= 'Y' where entid = :_entid and billno
= :billno\",{billno:wfresult.billNo})
No.3制作工作流
2、工作流实例化
路径:【系统管理区】-【流程管控】-【流程实例】
新建的工作流,需要右键添加后,才可以进行实例化。
审批人,可以根据角色、特定人员、相对人员等多种形式。
No.3制作工作流
3、创建工作流表单
路径:【系统管理区】 -【系统参数】 -【系统设置】-【功能维护】
调用模式:选择WORKFLOW。
参数一:填写工作流id,可以在流程模板设置中查看。
模块:选择和原表单一样的模块。
No.3制作工作流
4、功能授权
工作流表单新增后,需要重新添加菜单,并重新授权方可使用。
No.3制作工作流
5、表单客开代码
1)uf_onload()
目的:待办事宜打开表单时,可以正常展示单据数据
代码示例:
toolbar.visibleItem(\"toolbar.m14\", false);//流程审批功能隐藏
sys_onload();
/*****************以下为客开调整区********************/
if (!Utility.isSpace(form.parameters.billno)) {
//1、通过代办事宜打开,
//通过代办事宜打开,目前单据在线billno为空
uf_loadBill(\"workflow\");
toolbar.visibleItem(\"toolbar.m14\", true);//流程审批功能显示
} else {
if (form.parameters.action == \"billreview\") {
//2、单据再现
//。。。 此处可以扩展单据再现打开的代码
} else {
//3、单据新增
//。。。 此处可以扩展单据新增后的代码,如赋值默认值
}
}
No.3制作工作流
2)uf_save()
目的:删除已存在的工作流、添加待办事宜摘要
代码示例:
if (form.parameters.isworkflow && form.parameters.billno==null){
/删除现有工作流程
if( ds_ddhz.field('billno').value > 0 ){
if(pf_delWFData( ds_ddhz,\"billno\",false) == false){
return;
}
}
//待办事项摘要
pf_setWFInfo(ds_ddhz.field(\"StaffName\").value
,ds_ddhz.field(\"CurrencyName\").value
,Utility.formatFloat(ds_ddmx.field(\"sumTaxAmount\").value,2), 1, ds_ddhz,
ds_ddhz.field(\"Remark\").value);
}
No.3制作工作流
6、单据调整
一个完善的工作流,在审批的过程中,可能会退回发起人进行单据修改,此时就需要有单
据调整的功能。
在系统中,一般使用uf_adjBill()作为系统单据调整的方法。
function uf_adjBill(){
verifyDisabled = true;
try{
ds_ddmx.openEmpty();
var IsSelfBill = form.parameters.advance[\"2pf566q014enslqh\"];
var params = {};
params.IsSelfBill = IsSelfBill;//是否提取本人单据
params.isModPass = isModPass; //审核完单据是否允许修改
params.caozy = form.userinfo.staffid;
params.fz = useFzhy;// 是否显示 服装行业(颜色,尺码)
sel_adjBill.bill.variables = params;
sel_adjBill.bill.sub[0].variables = params;
sel_adjBill.bill.main.notcopyfields = pf_getNoCopyFlds(51);
sel_adjBill.open();
}
finally{
ds_ddmx.update();
verifyDisabled = false;
}
}
No.3制作工作流
7、单据删除
在实际业务中,业务员可能需要对做错的单据进行删除,需要执行一下
步骤:
【单据调整】-【单据删除】。
function uf_delBill(){
if( Utility.isSpace(ds_ddhz.field(\"BillNo\").value)){
return;
}
if (confirm( Utility.getMessage(\"askToDel\") )) {
try{
pf_delWFData(ds_ddhz,\"billno\",true);
alert(Utility.getMessage(\"delete\"));
Bill.add();
}catch(e) {
alert(e.message);
}
}
}
No.3制作工作流
8、添加服务端代码
//服务于工作流中的任务删除
function delete_bill() {
var sqlList = [];
sqlList[sqlList.length] = \"update PurNotesMt set BillState=1 where
billno='\" + billno +\"'\";
//删除WMS接口数据
sqlList[sqlList.length] = \"update WmsInMt set BillState=1 where
billno=\" + billno +\"\";
DBUtil.batchUpdate(sqlList);
return true;
}
此服务端代码名称不可修改,可使用参数只有当前单据id:billno。
报表和模板
No.4报表和模板
在项目实施过程中,客户经常会把一些个性化的
报表移植到系统中。
为了提供提高实施工程师的报表开发能力,以
开发工具,新建一个查询报表,以此演示。
1、新建form表单
路径:【race from studio2.0】-【文件】-
【 新建】
No.4报表和模板
2、维护表单基本属性
模块id,必须维护,不可更改,可在
moduledoc表中查询
表单显示名称,第一次保存前修改,后期不可
更改
表单名称说明
表单id,表单保存后自动生成。
维护sql语句,在代码中进行调用
表单显示大小、位置
No.4报表和模板
3、添加数据集、字段
路径:【race from studio2.0】-【编辑】-【工具】-【数据组件】
在查询中,如果是单页明细的,至少使用2个数据集,如果是双页,就需要
3个数据集。如图
No.4报表和模板
4、添加查询条件
1)添加label控件,用于显示条件名称
2)添加textbox控件,并绑定检索方案,用于显示条件内容。
No.4报表和模板
5、添加明细控件
添加grid控件,并绑定明细数据集。即可显示数据集的字段、数据。
如果是多页,可以先使用tabcontrol1,再填充grid。
No.4报表和模板
6、添加js代码
(1)uf_onload() 用于查询报表的初始化显示
function uf_onload(){
var date = DateUtil.getServerDate();
var str = \"\";
str = date;
str = str.substring(0, 8);
str += \"01\";
ds_main.append();
ds_main.setValue(\"StartDate\", str);
ds_main.setValue(\"EndDate\", date);
textbox2.focus();
}
No.4报表和模板
(2)uf_query() 用于查询数据
function uf_subQry(){
var params = {};
params.StartDate = DsMain.field(\"StartDate\").value;
params.EndDate = DsMain.field(\"EndDate\").value;
params.billstate = DsMain.field(\"BillState\").value;
params.billcode = \"%\" + DsMain.field(\"BillCode\").value;
params.deptid = DsMain.field(\"DeptId\").value;
params.orgid = DsMain.field(\"OrgId\").value;
params.staffid = DsMain.field(\"StaffId\").value;
params.businessid = DsMain.field(\"BusinessId\").value;
params.caozy = DsMain.field(\"caozy\").value;
params.goodsid = DsMain.field(\"GoodsId\").value;
if(index=='N'){//是否单页查询
//全部查询
ds_cgdjhz.open(\"uf_cgdjhz_sql\", \"sql\", params);
ds_djmx.open(\"uf_djmx_sql\", \"sql\", params);
ds_hzhj.open(\"uf_hzhj_sql\", \"sql\", params);
}else{
//显示某页,就查询某页
if(tabcontrol1.getSelectedIndex()=='0'){
ds_hzhj.open(\"uf_hzhj_sql\", \"sql\", params);
ds_cgdjhz.open(\"uf_cgdjhz_sql\", \"sql\", params);
}else if(tabcontrol1.getSelectedIndex()=='1‘){
ds_djmx.open(\"uf_djmx_sql\", \"sql\", params);
}
}
}
if (!uf_check()) return;//起始日期校验
uf_subQry();
var ret;
ret = pf_showWaitBox(uf_subQry);//查询等待提示框
}
No.4报表和模板
(3)uf_reset()用于查询条件重置
function uf_reset(){
if (confirm(Utility.getMessage(\"reset\")))
{
Bill.add();
}
}
(4)添加功能按钮
No.4报表和模板
7、添加功能菜单,查询测试
1)新保存的功能,需要在开发工具表单列表处查询出来,右键注册(提示表单注册成功)
2)添加菜单,找到对应的功能,添加到菜单某个位置。保存。
3)功能授权,新建功能需要授权后,才可以使用。
No.4报表和模板
主页模板,主要服务于企业中高管理层及决策层,对企业经营数据进行汇总呈现,并通过穿透报表的方
式,可以更加直观的透视企业经营过程,ERP管理用数据说话,辅助高层及时完善经营管理方向
No.4报表和模板
主页配置
3.门户配置
3.1 【管理区】
-【门户管理】 】-
【门户设计】-
【门户功能】首先
检查下是否已经更
新了如右功能。
No.4报表和模板
主页配置
3.门户配置
3.2 【管理区】-【门户管理】-【门户设计】 -【门户模板
维护】新增模板,如下图所示(也可自己编写模板格式,代码格
式详见附录):
No.4报表和模板
主页配置
3.门户配置
3.3 【管理区】-【门户管理】-【门户设计】 -【门户桌面】依次建立
多个桌面,服务不同权限管理使用。每一个桌面,对应一个模板。可共用同
一个模板。
No.4报表和模板
主页配置
3.门户配置
3.4 【管理区】-【门户管理】 -【门户设计】 -【桌面分组】新增
桌面分组,如下图所示: 为了演示方便,把所有桌面都配置到一个分
组了(可按权限分组)
No.4报表和模板
主页配置
3.门户配置
3.5 【管理区】-【门户管理】-【门户设计】 -【桌面分配】设置每个桌
面的使用权限,如下图所示为企业桌面。
No.4报表和模板
主页配置
3.门户配置
3.5 在分配桌面同一
服务对象的桌面只能存在
一个,再次创建会提示不
可再分配。同一企业四种
服务对象全部维护时,优
先级:
个人 > 部门 > 机构 > 企
业
No.4
<table width=\"100%\" border=\"1\" height=\"100%\">
报表和模板
<tr>
<td width=\"33%\" valign=\"top\">
</td>
<td width=\"33%\" valign=\"top\">
</td>
<td width=\"33%\" valign=\"top\">
</td>
</tr>
<tr>
<td width=\"33%\" valign=\"top\">
</td>
<td width=\"33%\" valign=\"top\">
</td>
<td width=\"33%\" valign=\"top\">
</td>
</tr>
<tr>
<td width=\"100%\" valign=\"top\" colSpan=\"3\">
</td>
</tr>
<tr>
<td width=\"100%\" valign=\"top\" colSpan=\"3\">
</td>
</tr>
<tr>
<td width=\"100%\" valign=\"top\" colSpan=\"3\">
</td>
</tr>
<tr>
<td width=\"100%\" valign=\"top\" colSpan=\"3\">
</td>
</tr>
</table>