一、在vs中创建表单模板把数据存到数据库中。
新建infopath表单模板:
打开vs2008,新建Project,在Project Types 区中选择 Visual C#àOffice-à2007--àInfoPathFormTemplate ,在Name中填入infopath表单模板的名称,如PurcharForm;如下图:
开始设计表单:
1. 点击右边“设计任务”中的控件,利用控件设计表单;
2. 添加数据源,点击右边“设计任务”中的数据源,选择“管理数据连接”,点击添加按钮,在新建数据源中,选择“仅接收数据”点击下一步,希望从何处接收数据,选择“数据库”,点击下一步,点击“选择数据库”点击新建数据源,然后一直点击下一步。
3. 绑定重复表的数据源,选择要显示的字段。
4. 提交按钮创建规则,选择“使用数据连接提交”,然后选择“提交到宿主环境”。
5. 表单设计好了,开始“检查设计方案”设置兼容性选中“设计一个可在浏览器或InfoPath中可以打开的表单模板”,安全级别选择“完全信任”。
6. 保存模板。
7. 创建信息初始化列表“WFMetaData”,标题“申请单编号确认规则”创建栏“PurcharIDFormat0”值是“P-,yyyyMMddHHmmA”。用这种规则创建计划单编号。
8. Insert -----àLoading 事件,先创建数据源,读取初始化信息,代码如下:
public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
try
{
//取到提交连接的对象,FileSubmitConnection对应的是提交到SharePoint文档库的连接类
FileSubmitConnection osssubmit = (FileSubmitConnection)this.DataConnections["OSSSubmit"];
XPathNavigator fieldFillAuthor = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:制表人", NamespaceManager);
XPathNavigator fieldFillID = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:计划单编号", NamespaceManager);
//根据提交连接的FolderUrl属性可以取到文档库所在的网站集 (有些情况下工作流网站并不在Root站点上,所以不适合此处)
SPSite mysite = new SPSite(osssubmit.FolderUrl);
string PurcharWebName = ConfigurationManager.AppSettings["PurcharWebName"];
//根据提交连接的FolderUrl属性可以取到文档库所在的网站(直接得到当前网站)
using (SPWeb myweb = mysite.OpenWeb(PurcharWebName)) // 实际中需要更改为OpenWeb("/wf/")
{
if (fieldFillAuthor != null)//自动赋值填表人,格式为 "中文显示名(域帐号)"
{
fieldFillAuthor.SetValue(myweb.CurrentUser.Name + "(" + myweb.CurrentUser.LoginName + ")");
}
SPList idList = myweb.Lists["WFMetaData"];
string idFormat = "";
string idFormat2 = "";
foreach (SPListItem item in idList.Items)
{
if (item.Title == "申请单编号确认规则")
{
idFormat = item["PurcharIDFormat0"].ToString().Split(new char[] { ',' })[0];
idFormat2 = item["PurcharIDFormat0"].ToString().Split(new char[] { ',' })[1];
idFormat = idFormat+ DateTime.Now.ToString(idFormat2);
break;
}
}
if (fieldFillID != null) //申请单编号确认规则
{
fieldFillID.SetValue(idFormat);
}
}
}
catch
{ }
填写好信息将信息数据系列化到数据库中,创建了FormSave方法把重复表数据系列化道数据库中和PurcharToDB方法把申请单主数据系列化到数据库中,代码如下:
///<summary>
///把重复表数据序列化至数据库
///</summary>
private void FormSave()
{
// 在此处编写代码。
string strResult = "";
int currentPid = -1;
try
{
//取到提交连接的对象,FileSubmitConnection对应的是提交到SharePoint文档库的连接类
FileSubmitConnection osssubmit = (FileSubmitConnection)this.DataConnections["OSSSubmit"];
//根据提交连接的FolderUrl属性可以取到文档库所在的网站集 (有些情况下工作流网站并不在Root站点上,所以不适合此处)
SPSite mysite = new SPSite(osssubmit.FolderUrl);
//读取列表的记录
string PurcharListName = ConfigurationManager.AppSettings["MEPPurcharListName"];
string PurcharWebName = ConfigurationManager.AppSettings["PurcharWebName"];
//计划单编号
string PurcharID = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:计划单编号", this.NamespaceManager).Value;
using (SPWeb myweb = mysite.OpenWeb(PurcharWebName)) // 实际中需要更改为OpenWeb("/wf/")
{
//存储数据到数据库中
currentPid = PurcharToDB(myweb.CurrentUser.LoginName, myweb.CurrentUser.Name);
//遍历重复表group5中的每一项
XPathNavigator NodeIter = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:group5", this.NamespaceManager);
//定义操作字串
string strBatch = "";
SPList list = myweb.Lists[PurcharListName];
foreach (XPathNavigator myf in NodeIter.SelectChildren(XPathNodeType.Element))
{
//对于重复表中的每一行,到数据库去查找,如果找到就使用Update,找不到就使用New
PurcharData purData = new PurcharData();
purData.ID = -1;
purData.PID = currentPid;
purData.Number = myf.SelectSingleNode("my:序号", NamespaceManager).ValueAsInt;
purData.SBName = myf.SelectSingleNode("my:物资名称", NamespaceManager).Value;
purData.SBType = myf.SelectSingleNode("my:规格型号", NamespaceManager).Value;
purData.Shuliang = (float)myf.SelectSingleNode("my:数量", NamespaceManager).ValueAsDouble;
purData.Address = myf.SelectSingleNode("my:生产厂", NamespaceManager).Value;
purData.GetTime = myf.SelectSingleNode("my:到货时间", NamespaceManager).ValueAsDateTime;
purData.UnitPrice = (float)myf.SelectSingleNode("my:预算单价", NamespaceManager).ValueAsDouble;
purData.Totals = (float)myf.SelectSingleNode("my:预算总价", NamespaceManager).ValueAsDouble;
purData.Notes = myf.SelectSingleNode("my:备注", NamespaceManager).Value;
purData.Results = myf.SelectSingleNode("my:执行情况记录", NamespaceManager).Value;
purData.Created = DateTime.Now;
purData.AuthorId = myweb.CurrentUser.LoginName;
purData.AuthorName = myweb.CurrentUser.Name;
purData.JHDID = PurcharID;
wf_PurcharData wfPurData = new wf_PurcharData();
if (wf_PurcharData.Exists(PurcharID, purData.Number,purData.SBName,purData.SBType))
{
//如果找到了就更新
wfPurData.Update(purData);
}
else
{
//如果没有找到就新增
wfPurData.Add(purData);
}
////下面检查,此次表单编辑,是否删除了记录
// if (!stillExist)
// {//如果老项已经在新的编辑过程中删除了,那么就执行删除Method
// strBatch += "<Method ID='" + MethodId.ToString() + "' Cmd='Delete'><Field Name='ID'>" + item.ID.ToString() + "</Field></Method>";
// }
}
}//using 结束
}
catch{}
}
///<summary>
///将申请单主数据序列化到数据库中
///</summary>
///<param name="userID">域帐号</param>
///<param name="userName">显示名</param>
///<returns></returns>
private int PurcharToDB(string userID, string userName)
{
try
{
XPathNavigator xpath = this.MainDataSource.CreateNavigator();
if (xpath != null)
{
XPathNavigator fieldJHDID = xpath.SelectSingleNode("/my:myFields/my:计划单编号", NamespaceManager);
XPathNavigator fieldZK = xpath.SelectSingleNode("/my:myFields/my:转口", NamespaceManager);
XPathNavigator fieldGC = xpath.SelectSingleNode("/my:myFields/my:国产", NamespaceManager);
XPathNavigator fieldSBXC = xpath.SelectSingleNode("/my:myFields/my:设备现场采购", NamespaceManager);
XPathNavigator fieldWZGN = xpath.SelectSingleNode("/my:myFields/my:物资国内采购", NamespaceManager);
XPathNavigator fieldWZXC = xpath.SelectSingleNode("/my:myFields/my:物资现场采购", NamespaceManager);
XPathNavigator fieldCountry = xpath.SelectSingleNode("/my:myFields/my:项目所在国", NamespaceManager);
XPathNavigator fieldProjectName = xpath.SelectSingleNode("/my:myFields/my:项目名称", NamespaceManager);
XPathNavigator fieldBeginTime = xpath.SelectSingleNode("/my:myFields/my:开工日期", NamespaceManager);
XPathNavigator fieldFillTime = xpath.SelectSingleNode("/my:myFields/my:填表日期", NamespaceManager);
XPathNavigator fieldNumPersonId = xpath.SelectSingleNode("/my:myFields/my:contact/my:Person/my:AccountId", NamespaceManager);
XPathNavigator fieldNumPersonName = xpath.SelectSingleNode("/my:myFields/my:contact/my:Person/my:DisplayName", NamespaceManager);
XPathNavigator fieldFirstPersonId = xpath.SelectSingleNode("/my:myFields/my:contacter/my:Person/my:AccountId", NamespaceManager);
XPathNavigator fieldFirstPersonName = xpath.SelectSingleNode("/my:myFields/my:contacter/my:Person/my:DisplayName", NamespaceManager);
XPathNavigator fieldInitComment = xpath.SelectSingleNode("/my:myFields/my:comment", NamespaceManager);
XPathNavigator fieldTotalsMoney = xpath.SelectSingleNode("/my:myFields/my:合计", NamespaceManager);
Purchar purchar = new Purchar();
purchar.PID = -1;
purchar.JHDID = fieldJHDID.Value;
purchar.ZK = fieldZK.ValueAsBoolean;
purchar.GC = fieldGC.ValueAsBoolean;
purchar.SBXC = fieldSBXC.ValueAsBoolean;
purchar.WZGN = fieldWZGN.ValueAsBoolean;
purchar.WZXC = fieldWZXC.ValueAsBoolean;
purchar.Country = fieldCountry.Value;
purchar.ProjectName = fieldProjectName.Value;
purchar.BeginTime = fieldBeginTime.ValueAsDateTime;
purchar.FillTime = fieldFillTime.ValueAsDateTime;
purchar.FillPersonId = userID;
purchar.FillPersonName = userName;
purchar.NumPersonId = fieldNumPersonId.Value;
purchar.NumPersonName = fieldNumPersonName.Value;
purchar.FirstPersonId = fieldFirstPersonId.Value;
purchar.FirstPersonName = fieldFirstPersonName.Value;
purchar.InitComment = fieldInitComment.Value;
purchar.TotalsMoney = (float)fieldTotalsMoney.ValueAsDouble;//Double 类型
wf_Purchar wfPurchar = new wf_Purchar();
return wfPurchar.Add(purchar);
}
else
{
return -1;
}
}
catch (Exception)
{
return -1;
}
}
9. 提交按钮事件中,调用FormSave()方法,保存到数据库中。
10. 到最后一步了,将它发布到InfoPath Form Services 的 SharePoint 服务器 。
11.上传到管理中心,应用程序管理--àInfoPath Form Services---à配置 InfoPath Form Services----à选中嵌入式SQL身份验证和数据源的身份验证(用户表单模板),
应用程序管理--àInfoPath Form Services---à配置 InfoPath Form Services----à上传表单模板 ,激活到网站集中,
12.新建表单库---〉设置表单库-----〉高级设置---内容类型设置为允许管理内容类型----〉启用了浏览器的文档设置为显示为页面。
内容类型----〉从现有网站内容类型添加------〉添加你上传的表单模板
二、在office中创建表单模板读取数据库中的值。
1. Office ---àMicrosoft office InfoPath 2007-----à设计表单模板---------à空白----------à确定
2. 开始设计表单:
l 点击右边“设计任务”中的控件,利用控件设计表单;
l 添加数据源,点击右边“设计任务”中的数据源,选择“管理数据连接”,点击添加按钮,在新建数据源中,选择“仅接收数据”点击下一步,希望从何处接收数据,选择“数据库”,点击下一步,点击“选择数据库”点击新建数据源,然后一直点击下一步。
l 绑定重复表的数据源,选择要显示的字段。
l 提交按钮创建规则,选择“使用数据连接提交”,然后选择“提交到宿主环境”。
l 表单设计好了,开始“检查设计方案”设置兼容性选中“设计一个可在浏览器或InfoPath中可以打开的表单模板”,安全级别选择“完全信任”。
l 保存模板。
l 工具------à编程-----àLoading事件,添加代码如下:
try
{
// 在此处编写代码。
//数据源关联
AdoQueryConnection myAdoQueryConnection =
(AdoQueryConnection)(this.DataConnections["wf_PurcharData"]);
// 获取查询字段
XPathNavigator wfNum =
CreateNavigator().SelectSingleNode("/my:myFields/my:wfNum",
NamespaceManager);
//字段值
string wfNumID = wfNum.InnerXml;
//使用关键字段进行数据库查询
string tmpConn = myAdoQueryConnection.Command;
myAdoQueryConnection.Command = tmpConn + " " + "where ""JHDID"" = '" + wfNumID + "'";
myAdoQueryConnection.Execute();
}
catch { }
l 设计好表单,如下:
l 预览表单。
l 发布到网络指定的位置。
web.config
在 appSettings节点,connectionStrings节点加上下面这些内容:
<appSettings>
<add key="MEPPurcharListName" value="物质采购申请单" />
<add key="PurcharWebName" value="/wf" />
<add key="gsegc_ConnectionString" value="Password=sa;User ID=sa;Data
Source=litware;Initial Catalog=AD;"/>
<add key="PowerUser" value="administrator" />
<add key="PowerPwd" value="sa" />
<add key="PowerDomain" value="litware" />
</appSettings>
<connectionStrings>
<add name="GSEGC_ConnectionString" connectionString="Password=sa;User
ID=sa;Data Source=litware;Initial Catalog=AD;" providerName="System.Data.SqlClient"/>
<add name="GSEGC_LogConnectionString" connectionString="Password=sa;User
ID=sa;Data Source=litware;Initial Catalog=AD;" providerName="System.Data.SqlClient"/>
</connectionStrings>