Flowportal.Net BPM升级小计2

上次BPM升级后,经过几天的使用,只发现了一个升级造成的问题,是在一个新员工招聘入职流程里写了一个C#的步骤来触发其他流程,下图是出错信息:

经过和厂商确认,把原来的写法:“process.CreateTask(owner,datasetPost).Step.Approve();”改写成如下格式后问题解决:BPMTask task = process.CreateTask(owner, datasetPost);
task.Step.Approve();

附上完整的触发流程的C#代码,供大家参考

//把当前的流程保存到数据库
Context.Current.Task.SaveToDB();
if ((String)Context.Current.FormDataSet["FormEmployeeOnBoard.NeedTelephone"]=="Yes")
{
String CurrentUser = (String)Context.Current.FormDataSet["FormEmployeeOnBoard.Requester"];
Member owner = Member.FromAccount(CurrentUser);
//Member owner = Member.FromAccount("troy.cui");
BPMProcess process = BPMProcess.GetProcess("座机电话申请 - Request for Telephone");
FlowDataSet datasetPost = DataSourceManager.LoadDataSetSchema(process.GlobalTableIdentitys);
FlowDataTable table = datasetPost.Tables["FormTelephone"];
FlowDataRow row = table.NewRow();
table.Rows.Add(row);
row["EmployeeID"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.EmployeeID"];
row["DepartmentName"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.DepartmentName"];
row["ChineseName"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.ChineseName"];
row["EnglishName"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.EnglishName"];
row["PositionName"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.PositionName"];
row["Office"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.Office"];
row["LineManager"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.LineManager"];
row["OnBoardDate"] =Context.Current.FormDataSet["FormEmployeeOnBoard.OnBoardDate"];
row["Requester"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.Requester"];
row["RequestDate"] =(DateTime)Context.Current.FormDataSet["FormEmployeeOnBoard.RequestDate"];
row["Remark"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.Remark"];
row["Status"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.Status"];
//使用数据库默认时间
//row["TransDate"] =(DateTime)Context.Current.FormDataSet["FormEmployeeOnBoard.TransDate"];
row["TransIP"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.TransIP"];
row["CreationUser"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.CreationUser"];
row["LastUpdateIP"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.LastUpdateIP"];
//使用数据库默认时间
//row["LastUpdateDate"] =(DateTime)Context.Current.FormDataSet["FormEmployeeOnBoard.LastUpdateDate"];
row["LastUpdateUser"] =(String)Context.Current.FormDataSet["FormEmployeeOnBoard.LastUpdateUser"];
//process.CreateTask(owner,datasetPost);
//自动审批通过第一步 3.5n
//process.CreateTask(owner,datasetPost).Step.Approve();
//自动审批通过第一步 3.5t
BPMTask task = process.CreateTask(owner, datasetPost);
task.Step.Approve();
}

Loading

Flowportal.Net BPM升级小计

第一个安装的Flowportal.Net BPM版本是3.5m,后来本地测试完成之后,正式购买的时候安装了3.5n的版本,年前从官方获得了最新4.0版本的安装文件,因为最新版本是一个全新版本,无法兼容以前的版本,也没测试。不过随着用户反馈的增多,再加上IE9的大量更新,一个问题出现了:原来的版本不能很好地支持IE9。只能考虑在原来的版本基础上升级,昨天晚上从官方客服那边拿到了3.5版的最新版本3.5t,今天上午先从本地测试,下午就停机了一会更新了Live Server。

在本地测试的时候,第一次没升级成功,因为升级的时候,我的IE浏览器、BPM企业管理器都开着呢,所以后来只能从安装文件包中复制所有的文件,然后覆盖到了Flowportal.Net安装文件夹。

这里推荐大家在升级之前备份Flowportal.Net安装文件夹的所有内容,特别是如果你有定制过Website的界面啥的,一定要备份。第二个要备份的是数据库,万一出现问题,还可以恢复回去旧版本。

如果有自己的用户界面定制,推荐大家用一个叫BeyondCompare的软件,直接用文件夹比较,然后很容易就能找出来新版和备份过的旧版本的差别,从而直接使用BeyondCompare进行“左右覆盖”功能。

我因为增加了公司的logo到用户界面,所以设计到2个文件:

1.C:\Program Files\FlowPortal.net\website\controls\PageHeader.ascx
2.C:\Program Files\FlowPortal.net\website\controls\AdminPageHeader.ascx

最后一个我遇到的问题,网页上图片的样式都出现一个蓝色的框,因为这个不好重现错误,后来我自己解决了。在website\style\main.css中增加了一下一句话,设定全局的图片属性。

img{
  border:0;
}

比较仓促,就写这么多吧,当做自己的笔记,以备查用。

Loading

基于Flowportal.Net写自己的应用时使用SqlDataReader遇到的一个问题

在使用Flowportal.Net BPM的时候,因为一个特殊的步骤需要自动根据ERP中的订单状态自动审批,在设计流程的时候,把这个步骤设定为2个处理人的共享任务。其中一个是专门设定的一个系统账号。然后,我创建了一个Winform的程序,自动执行以下的代码:先从BPM数据库中读取出来未处理的当前流程、当前步骤的清单,接着循环判断而去使用单独创建的用户登录到BPM取得共享任务并审批通过,当然了如果判断ERP系统未处理的话,就把只把当前任务取下来作为系统账号的个人任务。

程序的逻辑很清楚了,但是忽略了一个问题,在从BPM数据库读取数据的时候,偷懒是用了SqlDataReader,造成在循环内的BPM更新一直超时。后改为Dataset之后,问题解决。原因是SqlDataReader是读取完毕所有的查询结果后才断开数据库连接,所以在循环内部就会出现已经存在一个数据库连接,造成新建连接冲突。改为Dataset之后,就可以把结果放入Dataset(服务器的内存里),然后关闭对数据库的连接了,这时候那个逐行的循环更新就不会有问题了。

       private void RMA_WarehouseRC_AutoPickupAndApprove()
       {
           GlobalFunction gf = new GlobalFunction();
           //Sql - Get the BPM Request list
           string strsql = "SELECT *";
           strsql += " FROM dbo.BPMInstProcSteps";
           strsql += " where ProcessName = N'RMA' and NodeName = N'Warehouse RC' and FinishAt is null";
           //Share Task
           strsql += " and Share=1";
           //Not Picked up
           strsql += " and OwnerAccount is Null";
           strsql += " Order by TaskID Asc";
           //Search the BPMDB
           SqlConnection connBPMDB = new SqlConnection(ConfigurationManager.ConnectionStrings["BPMDBConnectionString"].ConnectionString);
           SqlCommand mycmd = new SqlCommand(strsql, connBPMDB);
           mycmd.CommandType = CommandType.Text;
           connBPMDB.Open();
           //SqlDataReader drtemp = mycmd.ExecuteReader();
           SqlDataAdapter da = new SqlDataAdapter();
           DataSet ds = new DataSet();
           da.SelectCommand = mycmd;
           da.Fill(ds);
           DataTable dt = new DataTable();
           dt = ds.Tables[0];
           connBPMDB.Close();
           for (int i = 0; i < dt.Rows.Count; i++)
           {
               //Get the Warehouse Receivied Status from ERP LN
               //This update using MSSQL job to update the data
               //Database: WAIBPM 
               //Table: FormRMA
               //Data field: WarehouseReceived
               //Pickup and approve
               if (gf.testread("Select ID from FormRMA where WarehouseReceived = N'Yes' and TaskID= " + Convert.ToInt32(dt.Rows[i]["TaskID"]) + ""))
               {
                   PickupShareTaskandApprove(Convert.ToInt32(dt.Rows[i]["StepID"]));
               }
               //Pickup only
               else
               {
                   PickupShareTask(Convert.ToInt32(dt.Rows[i]["StepID"]));
               }
           }
       }

Loading

Flowportal.Net中审批人的一个例子

好久没更新Flowportal.Net方面的文章了,最近遇到一个实际的需求是有2个多选项(CheckBoxList),当选择其中一个的时候需要Test1.Wang处理,当选择另外一个时需要Test2.Wang处理,当2个都选择的时候,需要Test1.Wang和Test2.Wang同时处理。我的实现方法如下,如果需要更改审批人,只需要修改以下代码中的账号(这里使用的AD账号)。

MemberCollection members = new MemberCollection();
if (Context.Current.FormDataSet.Tables["FormNPNR"].Rows[0]["ItemType801"] != "")
{
members.Add(Member.FromAccount("Test1.Wang"));
}
if (Context.Current.FormDataSet.Tables["FormNPNR"].Rows[0]["ItemType301"] != "")
{
members.Add(Member.FromAccount("Test2.Wang"));
}
return members;

Loading

Flowportal.Net报错String or binary data would be truncated的解决办法

今天在测试开发的一个流程时,当走到一步叫做“Patent Director of Engineering Approval”的步骤,死活报错:“String or binary data would be truncated”,按照这个错误提示,通常来讲这个错误是数据库的表字段长度太短,而添加到此字段的字符长度超过本身定义的长度而造成的。经过不停的调试修改当前步骤涉及到的字段,始终不得解决,反而还造成了流程进入到一个“空白区”,卡在了2个步骤中间,后来只能通过后台修改表BPMInstProcSteps的FinishAt为Null,为避免此问题再次发生,在咨询官方技术人员后,还修改了服务器上的server.config中DTC的设定,开启了事务支持。

附上手工修正的SQL语句:

Update [BPMDB].[dbo].[BPMInstProcSteps] Set FinishAt=Null Where StepID=26403

在排除了本身的流程表单的数据表没问题之后,我重新把目光转回到表BPMInstProcSteps,终于找到原因:其中几个字段长度是30,而流程当前步骤节点名称超过了30。

所以,希望用到Flowportal.Net 3.5版本的朋友,注意你的流程节点的长度。不过把流程节点的字段长度从30增加到50,相对比较安全。

Loading

Windows 2008 计划任务的小问题,害人不浅呀

写了个Windows Form程序来产生XML文件,利用Flowportal.Net的BPM的文件触发流程,在本地和服务器上手工执行都没问题,但是设定了计划任务以后,看到任务历史记录执行成功,文件却怎么也没有生成,害人不浅呀。

看图你就懂了,如果要生成文件啥的,千万要设定这个运行起始位置,别以为它真的是可选项。

因为我用System用户,所以没有登录用户的问题,不过建议你看看这两篇文章:

关于window2008计划任务我想说
Win2008任务计划执行问题

Loading

分享几个Flowportal.Net BPM中的几个有用的Sql语句

第一个要分享的是获取当前的申请状态以及当前的处理人,虽然我们很容易通过BPMInstProcSteps这张表找到FinishAt is Null的记录,但是如果直接用2表的关联查询会有并行流程的问题,另外当你把自己的申请数据独立开来,做跨数据的关联就有些不直观,索性写一个函数GetBPMCurrentStep(@TaskID),使用方法很简单,直接在自己的视图里面使用就行。

USE [WAIWorkflow]
GO
/****** Object:  UserDefinedFunction [dbo].[GetBPMCurrentStep]    Script Date: 05/24/2011 14:34:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[GetBPMCurrentStep](@TaskID nvarchar(50))
RETURNS nvarchar(Max)
AS
BEGIN
    DECLARE @r nvarchar(Max)
    SET @r = ''
    SELECT @r = @r + ',' + NodeName + '('+ OwnerAccount+')'
    FROM [BPMDB].[dbo].[BPMInstProcSteps]
    WHERE TaskID=@TaskID
  AND  [FinishAt] is null
  RETURN STUFF(@r, 1, 1, '')
END

第二个要分享的就是每个申请的摘要信息(下图),这个信息根据用户的需要可能需要增加一些字段或者删除一些字段,但是当更改以后,只对新的申请有效。老的申请只能通过自己写Sql后台运行,其实也不难,把自己的所有申请用到的表列出来,每个流程写一段语句,批量执行就行了。

--更新 NPD 的Task Description
update [BPMDB].[dbo].BPMInstTaskssetDescription = b.WAI_PN + ',' + b.Lester_Number
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormNPD b
where
a.TaskID=b.TaskID
--更新 FormADandEmail 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormADandEmail b
where
a.TaskID=b.TaskID
--更新 FormBaanSession 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormBaanSession b
where
a.TaskID=b.TaskID
--更新 FormComputer 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormComputer b
wherea.TaskID=b.TaskID
--更新 FormEmployeeOnBoard 的Task Description
update [BPMDB].[dbo].BPMInstTasksset
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormEmployeeOnBoard b
where
a.TaskID=b.TaskID
--更新 FormEmployeeResignation 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormEmployeeResignation b
where
a.TaskID=b.TaskID
--更新 FormSeat 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormSeat b
where
a.TaskID=b.TaskID
--更新 FormShortNumber 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName+ ',' + b.Mobile
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormShortNumber b
where
a.TaskID=b.TaskID
--更新 FormTelephone 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormTelephone b
wherea.TaskID=b.TaskID
--更新 FormVPN 的Task Descriptionupdate [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormVPN b
where
a.TaskID=b.TaskID
--更新 FormWirelessCard 的Task Description
update [BPMDB].[dbo].BPMInstTasks
set
Description = b.EmployeeID + ',' + b.ChineseName + ',' + b.EnglishName
from     
  [BPMDB].[dbo].BPMInstTasks a, [WAIWorkflow].[dbo].FormWirelessCard b
where
a.TaskID=b.TaskID

Loading

在Windows 2008 R2环境安装Flowportal.Net BPM的注意事项

由于Windows 2008 R2是64位的操作系统,我们的Flowportal.Net BPM是32位的应用程序,所以安装的时候有一些注意事项。当然了这里我选择的SQL Server也是64位的2008 R2版本。

IIS安装方面,因为我Windows 2008是安装成Enterprise版本,所以要手工安装,通过Role Manager来安装Web Server(IIS)服务,这样.Net 3.5就自动安装完毕了。

安装完整BPM以后,需要设定一下Applciation Pools:32位程序支持以及应用程序池类型,文字介绍就不说了,参考一下截图吧

Loading

最近几周Flowportal.Net的开发应用3点小结

最近几周在使用Flowportal.Net BPM的过程中,遇到了一些问题,相信很多人在开始阶段也会遇到这些问题,整理下来分享给大家。

1、AD集成方面一定要注意IIS里面的Directory Security的验证方式要选择“Integrated Windows Authentication”。同时,Flowportal安装目录下的Server.config要修改如下:如果要取消网页认证的话,把WebLoginEnable修改成False即可。

<webSetting>
<WebLoginEnable>false</WebLoginEnable>
<NTLoginEnable>true</NTLoginEnable>
</webSetting>

2、通过以下操作在邮件中添加审批的按钮

1、在系统表BPMSysSettings中增加一行记录ItemName = ClickToProcessHTTP,ItemValue=http://IP Address/BPM/XMLService/ClickToProcess.aspx

2、在流程的邮件提醒的内容里加入<%=Context.Current.CreateProcessLinks()%>

3、流程的名称不能太长,超过30位就死翘翘了

在使用Flowportal.Net的过程中还遇到不少小问题,但是一般调整一下都可以自行解决。一个比较大的问题,需要提醒大家的就是当大家创建流程的名称时,不要太长,因为系统的默认字段长度只有30位。如果非要用长流程名,请修改BPMInstTasks和BPMInstProcSteps的ProcessName字段长度。

Loading

开始学习BPM业务流程管理软件FlowPortal.net

其实应该在2年前就听说过FlowPortal.net BPM,是老同事Ruiyi推荐的,当时还大概的玩了一下,不过后来公司有足够的人手做.Net开发也就没有继续摸索。因为目前公司的业务需求,从上周开始第二次接触FlowPortal.net BPM,发现以前每次开发Workflow工作流的应用,总要从底层数据库开始,到表单、报表、网页、审批流程…全部都要自己写,就算能重用,重用的只是上次的审批流程代码,很多业务的变化所带来的数据、表单的变化,都需要重来一次。而FlowPortal.net BPM却能带来很省力的快速部署,争取用本周时间内做几个公司内部的应用实例,尽快能正式采购和上线这个应用。

如果您也是做企业内部的.Net开发,也需要做Workflow工作流的应用,有兴趣的话不妨了解一下:FlowPortal.net BPM

Loading