📄 clsshujuguanli.cs
字号:
//===========================================================================
// Smarclient FPMS Demo Project a sample project for SmartClient technology.
// Smarclient FPMS Demo is designed and implemented bases Microsoft Application Block tech.
// Author: SFPMS Team, Date 2004-11
// Vision 1.0
// Revison History ZWJ,XCY 2004-11-21
//=============================================================================
using System;
using System.Collections;
using System.Data;
using System.Configuration;
using System.Windows.Forms;
using Microsoft.ApplicationBlocks.SmartClient.Offline;
using JSW.Tool;
using JSW.FPMS.Tool;
namespace JSW.FPMS.Xiang.ShuJu
{
/// <summary>
/// clsShuJuGuanLi:数据管理类,管理数据载入,数据存放和数据同步等。
/// 并且提供对FPMS系统数据的访问接口。
/// MVC中的Model
/// </summary>
public class clsShuJuGuanLi
{
#region 成员变量区域
//乡数据
private Hashtable xiangShuJu = null;
//MOAB引用
private OfflineBlockBuilder lixianKongZhi = null;
//需求数据是否变化
private bool xuqiuShiFouBianHua = false;
//数据文件路径
private string shujuWenJianLuJing = "shuju.xml";
private string peizhiWenJianLuJing = "peizhi.xml";
#endregion
#region 私有方法区域
/// <summary>
/// 数据集合之间的比较大小
/// </summary>
/// <param name="ShuJu1"></param>
/// <param name="ShuJu2"></param>
/// <returns>true是相同,false是不同</returns>
private bool ShuJuJiHeBiJiao(DataSet ShuJu1,DataSet ShuJu2)
{
if(ShuJu1.Tables.Count == ShuJu2.Tables.Count && ShuJu1.Tables.Count == 0 )
{
return true;
}
//忽略的具体的值判断,都默认为不同的。
return false;
}
#endregion
#region 公有方法区域
/// <summary>
/// 构造器
/// </summary>
public clsShuJuGuanLi()
{
//初始化
xiangShuJu = new Hashtable();
//MOAB实例
lixianKongZhi = OfflineBlockBuilder.Instance;
//2004-11-22 He
this.shujuWenJianLuJing = ConfigurationSettings.AppSettings[clsChangLiang.WENJIAN_LUJING] + "\\" + shujuWenJianLuJing;
this.peizhiWenJianLuJing = ConfigurationSettings.AppSettings[clsChangLiang.WENJIAN_LUJING] + "\\" + peizhiWenJianLuJing;
}
/// <summary>
/// 把数据载入到内存中
/// </summary>
public void ZaiRuShuJu()
{
try
{
//从数据文件中载入数据,并且分割为基本数据和需求数据
DataSet shuJu = new DataSet();
shuJu.ReadXml(shujuWenJianLuJing);
DataSet jibenShuJu =new DataSet();
DataSet xuqiuShuJu =new DataSet();
for(int Loop=0;Loop<shuJu.Tables.Count;Loop++)
{
DataTable shujuBiao = shuJu.Tables[Loop];
if(shujuBiao.TableName.Equals("XuQiu"))//如果是需求数据
{
xuqiuShuJu.Merge(shujuBiao);
}
else //如果是基本数据
{
jibenShuJu.Merge(shujuBiao);
}
}
xiangShuJu.Add(clsChangLiang.SHUJU_JIBENSHUJU,jibenShuJu);
xiangShuJu.Add(clsChangLiang.SHUJU_XUQIU,xuqiuShuJu);
}
catch(Exception e)
{
if( e.GetType() == typeof(System.IO.DirectoryNotFoundException))
{
clsRiZhiChuLi.JiLuRiZhi("数据路径错误,不能找到数据文件的路径:"+e.Message);
}
//如果出现异常,意味着基础数据环境可能发生了问题,初始化数据环境
xiangShuJu.Add(clsChangLiang.SHUJU_JIBENSHUJU,new DataSet());
xiangShuJu.Add(clsChangLiang.SHUJU_XUQIU,new DataSet());
}
try
{
//从配置文件中载入配置信息
DataSet peizhiXinXi = new DataSet();
peizhiXinXi.ReadXml(peizhiWenJianLuJing);
xiangShuJu.Add(clsChangLiang.SHUJU_PEIZHIXINXI,peizhiXinXi);
}
catch(Exception e)
{
if( e.GetType() == typeof(System.IO.DirectoryNotFoundException))
{}
//如果出现异常,意味着基础数据环境可能发生了问题,初始化数据环境
xiangShuJu.Add(clsChangLiang.SHUJU_PEIZHIXINXI,new DataSet());
}
}
/// <summary>
/// 重新发送数据 初始化时将XML文件为提交的数据重新提交
/// zhangwj 11-22
/// </summary>
public System.Data.DataSet ChongXinFaSong()
{
//数据合法性判断
if(this.HuoDeShuJu(clsChangLiang.SHUJU_PEIZHIXINXI).Tables.Count <1 ||
this.HuoDeShuJu(clsChangLiang.SHUJU_XUQIU).Tables.Count<1 )
{
return new DataSet();
}
//构造发送数据集
System.Data.DataSet dsxinFaSong = ChuangJianShuJuJi() ;
System.Collections.Hashtable table = new Hashtable() ;
string lieMing ="" ;
for (int i=0;i<dsxinFaSong.Tables["ShuJu"].Columns.Count;i++)
table.Add(dsxinFaSong.Tables["ShuJu"].Columns[i].ColumnName,"") ;
//将未提交数据导入到发送数据集中
DataSet shuJu = this.HuoDeShuJu(clsChangLiang.SHUJU_XUQIU);
for (int i=0;i<shuJu.Tables["XuQiu"].Rows.Count;i++)
{
if (shuJu.Tables["XuQiu"].Rows[i]["Bianhao"].ToString().Trim()=="-1")
{
System.Data.DataRow xinHang = dsxinFaSong.Tables["ShuJu"].NewRow() ;
for (int j=0;j<shuJu.Tables["XuQiu"].Columns.Count;j++)
{
lieMing = shuJu.Tables["XuQiu"].Columns[j].ColumnName;
if (table.ContainsKey(lieMing))
{
xinHang[lieMing] = shuJu.Tables["XuQiu"].Rows[i][lieMing].ToString() ;
}
}
dsxinFaSong.Tables["ShuJu"].Rows.Add(xinHang) ;
}
}
return dsxinFaSong ;
}
/// <summary>
///数据存入到本地文件中
/// </summary>
public void CunRuShuJu()
{
try
{
//检查文件路径是否存在,如果没有生成新的文件路径,2004-11-22
if(!System.IO.Directory.Exists(ConfigurationSettings.AppSettings[clsChangLiang.WENJIAN_LUJING]))
{
System.IO.Directory.CreateDirectory(ConfigurationSettings.AppSettings[clsChangLiang.WENJIAN_LUJING]);
}
//存入配置信息数据到peizhi.xml
HuoDeShuJu(clsChangLiang.SHUJU_PEIZHIXINXI).WriteXml(this.peizhiWenJianLuJing);
//存入所有数据信息到shuju.xml
DataSet jibenShuJu = HuoDeShuJu(clsChangLiang.SHUJU_JIBENSHUJU);
DataSet xuqiuShuJu = HuoDeShuJu(clsChangLiang.SHUJU_XUQIU);
//2004-11-22,he
DataSet zongShuJu = new DataSet();
zongShuJu.Merge(xuqiuShuJu);
zongShuJu.Merge(jibenShuJu);
zongShuJu.WriteXml(this.shujuWenJianLuJing);
}
catch(Exception e)
{
if( e.GetType() == typeof(System.IO.DirectoryNotFoundException) ||
e.GetType() == typeof(System.IO.FileNotFoundException) )
{
clsRiZhiChuLi.JiLuRiZhi("数据路径错误"+e.Message);
}
}
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="ShuJuJian">数据键值</param>
/// <param name="ShuJu">需要更新的数据</param>
public void ShuJuGengXin(string ShuJuJian)
{
//从本地缓存的参考数据中获得最近的县数据
DataSet xianShuJu = lixianKongZhi.ReferenceDataCache.Retrieve(ShuJuJian) as DataSet;
if(xianShuJu == null)
{
return;
}
bool bianHua = false;
lock(this)
{
//如果最新的参考数据不等同于已有的数据,则保存最新的数据。
if(!ShuJuJiHeBiJiao(xianShuJu,HuoDeShuJu(ShuJuJian)))
{
xiangShuJu.Remove(ShuJuJian);
xiangShuJu.Add(ShuJuJian,xianShuJu);
//clsRiZhiChuLi.JiLuRiZhi("数据"+ShuJuJian+"发生了更新");
//zhangwj 11-22 每次更新存入文件
CunRuShuJu();
bianHua = true;
}
//处理需求变化队列
if(bianHua && ShuJuJian.Equals(clsChangLiang.SHUJU_XUQIU))
{
xuqiuShiFouBianHua = true;//变化
}
else if(!bianHua && ShuJuJian.Equals(clsChangLiang.SHUJU_XUQIU))
{
xuqiuShiFouBianHua = false;//没有变化
}
}
}
/// <summary>
/// 获得相应的数据
/// </summary>
/// <param name="ShuJuJian">数据种类键值</param>
/// <returns>数据</returns>
public DataSet HuoDeShuJu(string ShuJuJian)
{
lock(this)
{
//是否有该键值
if(!this.xiangShuJu.ContainsKey(ShuJuJian))
{
return null;
}
//获得相应的值
IDictionaryEnumerator jiHe = xiangShuJu.GetEnumerator();
while ( jiHe.MoveNext() )
{
if(jiHe.Key.Equals(ShuJuJian) )
{
break;
}
}
//返回数据
return (jiHe.Value as DataSet);
}
}
/// <summary>
/// 需求数据是否变化
/// </summary>
/// <returns>true 变化;false 没有变化</returns>
public bool XuQiuBianHua()
{
return xuqiuShiFouBianHua;
}
/// <summary>
/// 是否需要等待数据刷新
/// </summary>
/// <returns>true:需要数据刷新 false:不需要数据刷新</returns>
public bool ShiFouXuYaoXiaZai()
{
DataSet jibenShuJu = this.HuoDeShuJu(clsChangLiang.SHUJU_JIBENSHUJU);
DataSet peizhiXinXi = this.HuoDeShuJu(clsChangLiang.SHUJU_PEIZHIXINXI);
if(jibenShuJu.Tables.Count == 0 || peizhiXinXi.Tables.Count==0)
{
return true;
}
return false;
}
/// <summary>
/// 添加一个新得需求
/// </summary>
/// <param name="xinXuQiu"></param>
/// <returns></returns>
public DataSet XuQiuTianJian(DataTable xinXuQiu)
{
lock(this)
{
DataSet shuJu = this.HuoDeShuJu(clsChangLiang.SHUJU_XUQIU);
DataSet xinShuJu = null;
if(shuJu.Tables.Count <1 )
{
xinShuJu = new DataSet();
xinXuQiu.TableName="XuQiu";
xinShuJu.Merge(xinXuQiu);
}
else
{
//zhangwi 11-23 将原来只构造系统数据改为根据xinXuQiu中数据构造,同时增加一个BiaoHao列
xinShuJu = shuJu;
string lieMing = "" ;
//将xinShuJu.Tables["XuQiu"]中的所有列保存到HashTable中
System.Collections.Hashtable table = new Hashtable() ;
for (int i=0;i<xinShuJu.Tables["XuQiu"].Columns.Count;i++)
table.Add(xinShuJu.Tables["XuQiu"].Columns[i].ColumnName,"") ;
for (int i=0;i<xinXuQiu.Columns.Count;i++)
{
lieMing = xinXuQiu.Columns[i].ColumnName ;
if (!table.ContainsKey(lieMing))
{
System.Data.DataColumn xinLie= new DataColumn() ;
xinLie.ColumnName = lieMing ;
xinLie.AllowDBNull = true ;
xinShuJu.Tables["XuQiu"].Columns.Add(xinLie) ;
}
}
//增加编号列
if (!table.ContainsKey("BianHao"))
{
System.Data.DataColumn xinLie= new DataColumn() ;
xinLie.ColumnName = "BianHao" ;
xinLie.AllowDBNull = true ;
xinShuJu.Tables["XuQiu"].Columns.Add(xinLie) ;
}
DataRow xinHang = xinShuJu.Tables["XuQiu"].NewRow();
for (int i=0;i<xinXuQiu.Columns.Count;i++)
{
lieMing = xinXuQiu.Columns[i].ColumnName ;
if (!xinXuQiu.Rows[0].IsNull(lieMing))
xinHang[lieMing] = xinXuQiu.Rows[0][lieMing].ToString() ;
}
xinHang["BianHao"]="-1";
xinShuJu.Tables["XuQiu"].Rows.Add(xinHang);
}
this.xiangShuJu.Remove(clsChangLiang.SHUJU_XUQIU);
this.xiangShuJu.Add(clsChangLiang.SHUJU_XUQIU,xinShuJu);
//zhangwj 11-22 每次更新存入文件
CunRuShuJu();
return xinShuJu;
}
}
/// <summary>
/// 构造界面数据集
/// 包括两个DataTable: JieGou 界面元素描述 ; ShuJu 存放界面中得到的数据
/// 其中:JieGou的DataTable为从服务器端得到的配置dataTable ,
/// ShuJu 的DataTable 列名为结构DataTable 中的ShuJuXiangKJM的值
/// </summary>
/// <returns></returns>
public System.Data.DataSet ChuangJianShuJuJi()
{
System.Data.DataSet ret = new System.Data.DataSet() ;
//JieGou
System.Data.DataSet fuWuQiMiaoShu = HuoDeShuJu(clsChangLiang.SHUJU_PEIZHIXINXI) ;
ret.Tables.Add(fuWuQiMiaoShu.Tables["PeiZhi"].Copy()) ;
//ShuJu
System.Data.DataTable shuJuDatable = new System.Data.DataTable("ShuJu") ;
System.Data.DataColumn xinlie ;
for (int i=0;i<fuWuQiMiaoShu.Tables["PeiZhi"].Rows.Count;i++)
{
xinlie = new System.Data.DataColumn() ;
xinlie.ColumnName = fuWuQiMiaoShu.Tables["PeiZhi"].Rows[i]["ShuJuXiangKJM"].ToString().Trim() ;
shuJuDatable.Columns.Add(xinlie) ;
}
ret.Tables.Add(shuJuDatable) ;
fuWuQiMiaoShu = HuoDeShuJu(clsChangLiang.SHUJU_JIBENSHUJU) ;
ret.Tables.Add(fuWuQiMiaoShu.Tables["XinXiDian"].Copy()) ;
ret.Tables.Add(fuWuQiMiaoShu.Tables["XuQiuFenLei"].Copy()) ;
return ret ;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -