InfoPath 與 數據庫的通訊
http://www.cnblogs.com/sumh/archive/2008/03/27/1123903.html
一、在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>
posted on 2009-11-07 12:38 gdufo 閱讀(831) 評論(0) 編輯 收藏 所屬分類: OA(Moss+Infopath)