c#的一些技巧

c#的一些技巧 
1.怎样定制VC#DataGrid列标题?  
DataGridTableStyle dgts = new DataGridTableStyle();  
dgts.MappingName = "myTable"; //myTable为要载入数据的DataTable  
DataGridTextBoxColumn dgcs = new DataGridTextBoxColumn();  
dgcs.MappingName = "title_id";  dgcs.HeaderText = "标题ID";  
dgts.GridColumnStyles.Add(dgcs);       
。。。  
dataGrid1.TableStyles.Add(dgts);  

2.检索某个字段为空的所有记录的条件语句怎么写?  
...where col_name is null  

3.如何在c# Winform应用中接收回车键输入?  
设一下form的AcceptButton.  

4.比如Oracle中的NUMBER(15),在Sql Server中应是什么? 
 NUMBER(15):用numeric,精度15试试。 

 5.sql server的应用like语句的存储过程怎样写?  
select * from mytable where haoma like ‘%’ + @hao + ‘%’ 

 6.vc# winform中如何让textBox接受回车键消息(假没没有按钮的情况下)? 
 private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)   {    
 if(e.KeyChar != (char)13)
       return;     
else    //do something; 
 } 

 7.为什么(Int32)cmd.ExecuteScalar()赋值给Int32变量时提示转换无效? 
 Int32.Parse(cmd.ExecuteScalar().ToString()); 

 8.DataSource为子表的DataGrid里怎样增加一个列以显示母表中的某个字段?  在子表里手动添加一个列。  DataColumn dc = new DataColumn("newCol", Type.GetType("System.String");  dc.Expression = "Parent.parentColumnName";  dt.Columns.Add(dc); //dt为子表  

9.怎样使DataGrid显示DataTable中某列的数据时只显示某一部分?
  select ..., SUBSTR(string, start_index, end_index) as ***, *** from ***  

10.如何让winform的combobox只能选不能输入? 
 DropDownStyle 属性确定用户能否在文本部分中输入新值以及列表部分是否总显示。 
 值:  DropDown --- 文本部分可编辑。用户必须单击箭头按钮来显示列表部分。  
 DropDownList --- 用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。   
Simple --- 文本部分可编辑。列表部分总可见。  

11.怎样使winform的DataGrid里显示的日期只显示年月日部分,去掉时间?  
sql语句里加上to_date(日期字段,'yyyy-mm-dd')  

12.怎样把数据库表的二个列合并成一个列Fill进DataSet里?  
dcChehao = new DataColumn("newColumnName", typeof(string));  dcChehao.Expression = "columnName1+columnName2";  dt.Columns.Add(dcChehao);  Oracle:  select col1||col2 from table   sql server:  select col1+col2 from table  

13.如何从合并后的字段里提取出括号内的文字作为DataGrid或其它绑定控件的显示内容?即把合并后的字段内容里的左括号(和右括号)之间的文字提取出来。
  Select COL1,COL2, case   when COL3 like ‘%(%’ THEN substr(COL3, INSTR(COL3, ‘(’ +1, INSTR(COL3,‘)’)-INSTR(COL3,‘(’)-1)  end as COL3  from MY_TABLE 

 14.当用鼠标滚轮浏览DataGrid数据超过一定范围DataGrid会失去焦点。怎样解决?
  this.dataGrid1.MouseWheel+=new MouseEventHandler(dataGrid1_MouseWheel);   private void dataGrid1_MouseWheel(object sender, MouseEventArgs e)   {     this.dataGrid1.Select();   } 

 15.怎样把键盘输入的‘+’符号变成‘A’?  textBox的KeyPress事件中
  if(e.KeyChar == '+')  {    SendKeys.Send("A";    e.Handled = true;  } 

 16.怎样使Winform启动时直接最大化?  
this.WindowState = FormWindowState.Maximized;  

17.c#怎样获取当前日期及时间,在sql语句里又是什么?
  c#: DateTime.Now  sql server: GetDate() 

 18.怎样访问winform DataGrid的某一行某一列,或每一行每一列?  
dataGrid[row,col]  

19.怎样为DataTable进行汇总,比如DataTable的某列值‘延吉'的列为多少? 
 dt.Select("城市='延吉'".Length; 

 20.DataGrid数据导出到Excel后0212等会变成212。怎样使它导出后继续显示为0212? 
 range.NumberFormat = "0000"; 

 21.  
① 怎样把DataGrid的数据导出到Excel以供打印? 
② 之前已经为DataGrid设置了TableStyle,即自定义了列标题和要显示的列,如果想以自定义的视图导出数据该怎么办? 
③ 把数据导出到Excel后,怎样为它设置边框啊?  
④ 怎样使从DataGrid导出到Excel的某个列居中对齐? 
⑤ 数据从DataGrid导出到Excel后,怎样使标题行在打印时出现在每一页?  
⑥ DataGrid数据导出到Excel后打印时每一页显示’当前页/共几页’,怎样实现?  

答:
①  private void button1_Click(object sender, System.EventArgs e) 
 {    
int row_index, col_index;    
row_index = 1;    
col_index = 1;    
Excel.ApplicationClass excel = new Excel.ApplicationClass();    
excel.Workbooks.Add(true);                    
DataTable dt = ds.Tables["table"];                    
foreach(DataColumn dcHeader in dt.Columns)       
 excel.Cells[row_index, col_index++] = dcHeader.ColumnName;              
foreach(DataRow dr in dt.Rows)    
{
      col_index = 0;
          foreach(DataColumn dc in dt.Columns)          
{            excel.Cells[row_index+1, col_index+1] = dr[dc]; 
           col_index++;          
}      
row_index++;      }
      excel.Visible = true;      }  
private void Form1_Load(object sender, System.EventArgs e) 
 {  
    SqlConnection conn = new SqlConnection("server=tao;uid=sa;pwd=;database=pubs";  
    conn.Open();  
    SqlDataAdapter da = new SqlDataAdapter("select * from authors", conn);  
    ds = new DataSet();
    da.Fill(ds, "table"
    dataGrid1.DataSource = ds;  
    dataGrid1.DataMember = "table"; 
 } 

 ②dataGrid1.TableStyles[0].GridColumnStyles[index].HeaderText;//index可以从0~dataGrid1.TableStyles[0].GridColumnStyles.Count遍历。 

 ③ Excel.Range range;  
   range=worksheet.get_Range(worksheet.Cells[1,1],xSt.Cells[ds.Tables[0].Rows.Count+1,ds.Tables[0].Columns.Count]);  
   range.BorderAround(Excel.XlLineStyle.xlContinuous,Excel.XlBorderWeight.xlThin,Excel.XlColorIndex.xlColorIndexAutomatic,null);
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle =Excel.XlLineStyle.xlContinuous;
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight =Excel.XlBorderWeight.xlThin;
   range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex =Excel.XlColorIndex.xlColorIndexAutomatic;
  range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
  range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin;

  ④ range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
  ⑤ worksheet.PageSetup.PrintTitleRows = "$1:$1";
  ⑥ worksheet.PageSetup.CenterFooter = "第&P页 / 共&N页";

  22.当把DataGrid的Cell内容赋值到Excel的过程中想在DataGrid的CaptionText上显示进度,但不显示。WHY?
  ...  dataGrid1.CaptionText = "正在导出:" + (row + 1) + "/" + row_cnt;
  System.Windows.Forms.Application.DoEvents();
  ...  处理当前在消息队列中的所有Windows消息。
  当运行Windows窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。如果在代码中调用DoEvents,则应用程序可以处理其他事件。
  如果从代码中移除DoEvents,那么在按钮的单机事件处理程序执行结束以前,窗体不会重新绘制。通常在循环中使用该方法来处理消息。

  23.怎样从Flash调用外部程序,如一个C#编译后生成的.exe?  fscommand("exec", "应用程序.exe";
  ① 必须把flash发布为.exe
  ② 必须在flash生成的.exe文件所在目录建一个名为fscommand的子目录,并把要调用的可执行程序拷贝到那里。

  24.有没有办法用代码控制DataGrid的上下、左右的滚动?
  dataGrid1.Select();
  SendKeys.Send("{PGUP}";
  SendKeys.Send("{PGDN}";
  SendKeys.Send("{^{LEFT}"; // Ctrl+左方向键
  SendKeys.Send("{^{RIGHT}"; // Ctrl+右方向键

  25.怎样使两个DataGrid绑定两个主从关系的表?
  DataGrid1.DataSource = ds;
  DataGrid1.DataMember = "母表";
  ...  
  DataGrid2.DataSouce = ds;
  DataGrid2.DataMember = "母表.关系名";

  26.assembly的版本号怎样才能自动生成?特别是在Console下没有通过VStudio环境编写程序时。
  关键是AssemblyInfo.cs里的[assembly: AssemblyVersion("1.0.*"],命令行编译时包含AssemblyInfo.cs 

 27.怎样建立一个Shared Assembly?
  用sn.exe生成一个Strong Name:keyfile.sn,放在源程序目录下
  在项目的AssemblyInfo.cs里[assembly: AssemblyKeyFile("..\\..\\keyfile.sn"]
  生成dll后,用gacutil /i myDll.dll放进Global Assembly Cach.

  28.在Oracle里如何取得某字段第一个字母为大写英文A~Z之间的记录?
  select * from table where ascii(substr(字段,1,1)) between ascii('A') and ascii('Z')  29.怎样取得当前Assembly的版本号?
  Process current = Process.GetCurrentProcess();
   FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(current.MainModule.FileName);
  Console.WriteLine(myFileVersionInfo.FileVersion);

  30.怎样制作一个简单的winform安装程序?
  ① 建一个WinForm应用程序,最最简单的那种。运行。
  ② 添加新项目->安装和部署项目,‘模板’选择‘安装向导’。
  ③ 连续二个‘下一步’,在‘选择包括的项目输出’步骤打勾‘主输出来自’,连续两个‘下一步’,‘完成’。
  ④ 生成。
  ⑤ 到项目目录下找到Setup.exe(还有一个.msi和.ini文件),执行。

  31.怎样通过winform安装程序在Sql Server数据库上建表?
  ① [项目]—[添加新项]  类别:代码;模板:安装程序类。
  名称:MyInstaller.cs
  ② 在SQL Server建立一个表,再[所有任务]—[生成SQL脚本]。
  生成类似如下脚本(注意:把所有GO语句去掉):
  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MyTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
  drop table [dbo].[MyTable]
  CREATE TABLE [dbo].[MyTable] (
      [ID] [int] NOT NULL ,
      [NAME] [nchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL
       ON [PRIMARY]  ALTER TABLE [dbo].[MyTable] WITH NOCHECK ADD
       CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
       (          [ID]       ON [PRIMARY]

   ③ [项目]—[添加现有项]。mytable.sql—[生成操作]-[嵌入的资源]。
  ④ 将MyInstaller.cs切换到代码视图,添加下列代码:
  先增加:  using System.Reflection;  using System.IO;
  然后:  private string GetSql(string Name)
   {
     try
     {
       Assembly Asm = Assembly.GetExecutingAssembly();
       Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);            StreamReader reader = new StreamReader(strm);
       return reader.ReadToEnd();
     }
     catch (Exception ex)
     {
       Console.Write("In GetSql:"+ex.Message);
       throw ex;
     }
   }

   private void ExecuteSql(string DataBaseName,string Sql)
   {
   System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
  sqlConn.ConnectionString = "server=myserver;uid=sa;password=;database=master";
  System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConn);
   Command.Connection.Open();
   Command.Connection.ChangeDatabase(DataBaseName); 
  try 
  {
   Command.ExecuteNonQuery();
   }
   finally
   {
   Command.Connection.Close();
   }
   }

  protected void AddDBTable(string strDBName)
   {
       try
       {
           ExecuteSql("master","create DATABASE "+ strDBName);
           ExecuteSql(strDBName,GetSql("mytable.sql");
       }
       catch(Exception ex)
       {
           Console.Write("In exception handler :"+ex.Message);
       }
   }

   public override void Install(System.Collections.IDictionary stateSaver)
   {
       base.Install(stateSaver);
       AddDBTable("MyDB"; //建一个名为MyDB的DataBase
  }

  ⑤ [添加新项目]—[项目类型:安装和部署项目]—[模板:安装项目]—[名称:MySetup]。
  ⑥ [应用程序文件夹]—[添加]—[项目输出]—[主输出]。
  ⑦ 解决方案资源管理器—右键—[安装项目(MySetup)]—[视图]—[自定义操作]。[安装]—[添加自定义操作]—[双击:应用程序文件夹]的[主输出来自***(活动)]。

  32.怎样用TreeView显示父子关系的数据库表(winform)?
  三个表a1,a2,a3, a1为a2看母表,a2为a3的母表。
  a1: id, name
  a2: id, parent_id, name
  a3: id, parent_id, name
  用三个DataAdapter把三个表各自Fill进DataSet的三个表。
  用DataRelation设置好三个表之间的关系。

  foreach(DataRow drA1 in ds.Tables["a1"].Rows)
  {
   tn1 = new TreeNode(drA1["name"].ToString());
   treeView1.Nodes.Add(tn1);
   foreach(DataRow drA2 in drA1.GetChildRows("a1a2")
   {
    tn2 = new TreeNode(drA2["name"].ToString());
    tn1.Nodes.Add(tn2);
    foreach(DataRow drA3 in drA2.GetChildRows("a2a3")
    {
     tn3 = new TreeNode(drA3["name"].ToString());
     tn2.Nodes.Add(tn3);
    }
   }
  }  

33.怎样从一个form传递数据到另一个form?  假设Form2的数据要传到Form1的TextBox。  
在Form2:  
// Define delegate  public delegate void SendData(object sender);  
// Create instance  public SendData sendData;  
在Form2的按钮单击事件或其它事件代码中:
  if(sendData != null) 
  {
   sendData(txtBoxAtForm2);
   }  
  this.Close(); //关闭Form2 

 在Form1的弹出Form2的代码中:
  Form2 form2 = new Form2();
  form2.sendData = new Form2.SendData(MyFunction);  
  form2.ShowDialog(); 
 ==================== 
 private void MyFunction(object sender) 
 {
    textBox1.Text = ((TextBox)sender).Text;
  }  

loading...

 

2006-5-11
企业财务电算化软件设计应注意的若干问题 [转]

 
 
现代电子技术在财经领域的应用――会计电算化,为会计管理开创了一个新时代,使现代财务管理搭上了“信息快车”,彻底摆脱了“会计室里的算盘、钞票、记账”等沉闷印象,财务管理进入了真正的“数字时代”,大大提高了管理水平和管理效率,产生了巨大的经济效益和社会效益。 
 
会计电算化是一项复杂的系统工程,技术性、创造性很强,与其他系统比较,有很大的特殊性,它处理的信息量大,数据要求准确可靠、保存期长,需要严格监控;同时,会计数据要求严格、保密性强,属企业敏感资料。因而,会计电算化对财务管理及其软件设计均有特别的要求:财务管理标准化、规范化;软件设计须具有安全可靠、功能多样性…… 
 
一、财务软件设计对会计工作的要求 
 
 1.增强法制观念,严格执行会计法 
 
会计法是我们开展企业会计工作的法律依据,执行会计法是国家对会计工作的基本要求,所以企业的财务工作必然遵守会计法,遵守国家有关信息安全的法规。只有依法办事,会计工作才受到法律保护,从而为会计电算化的实现提供稳定的法律环境。 
 
 2.会计科目代码化 
 
实行会计科目代码化的优点很多:(1)结构简单易记,便于会计人员使用;(2)便于电脑识别、分类、查验、调用和处理;(3)减少资料储存空间,减少电脑处理资料量,加快运行速度。企业会计科目代码必须采用会计制度规定的科目统一编码,例如现金101,银行存款102……这样既简单明了又便于计算机识别和处理,工作人员也乐于使用。如果缺少了这一重要环节,电脑系统就平添许多复杂内容,计算机不得不逐次识别处理每个会计科目,大大增加了程序设计的难度,而且多占了内存空间,减慢了计算机的运行速度,还会增加出错机会,不符合信息化环境的要求。因此,会计电算化首先要将会计科目代码代。 
 
 3.会计凭证标准化 
 
电算化环境下会计凭证的设计要求:(1)具有通用性――尽可能满足各职能部门对会计核算的要求,力求做到多功能、一单多用、各方共享,提高人机工作效率。以记账凭证设计为例。建议采用集现金收付、银行转账、往来于一身的复式记账凭证,其内容应包括:摘要、科目编码、会计科目、一二级明细目、外币种类、借贷方金额、备注等,这样既适合处理人民币业务,又能处理外币业务,基本满足了会计核算的多方面要求,而且考虑到了未来对外业务发展之需,符合通用、多功能的原则。(2)便于会计人员操作,易于计算机处理。凭证设计的另一个要求是尽可能减少工作人员的书写、输入量,减少人工处理业务方面的时间――在会计实务中,工作人员往往要花大部分时间填写凭证、处理会计资料,效率低、差错多,而电算化管理则要求最大限度地减少人为处理资料的时间,让计算机更多地代替人的劳动,以充分发挥电脑高速、高效的优势。 
 
同样道理,账簿设置、会计报表编制,也要符合标准化的要求,既要兼顾各方面需要,又要方便计算机处理。 
 
 4.会计处理方法制度化 
 
会计电算化系统繁复而涉及面广,不宜经常修改,这就要求会计核算的方法、程序实行制度化。例如,固定资产的折旧方法有平均年限法、工作量法、双倍余额递减法、年数总和法等几种,企业可按实际情况加以选择,但一经确定就不要随意更改,要形成制度化执行。如果会计处理方法更改频繁,一则不符合会计制度要求,二则影响电脑系统正常运作,容易发生差错。如果不慎修改出错,就会导致系统损坏,影响正常会计工作。几年前,英国某信用卡公司就因修改计算机程序出错,致使支付混乱。日常生活中,类似情况是屡有报道。因此,如无法规、制度的变更,一般不要随意更改会计核算方法,以保持会计业务环境相对稳定,保证电算化系统正常运作。 
 
 5.培养复合型人才,提高财务人员的整体素质 
 
综观目前的企业,既懂会计又懂计算机,并有一定英文英础的复合型人才实在太少,这是推行会计电算化的一大障碍。会计人员如果只懂会计,没有电脑知识,就不可能提出很好的会计管理构想去实现电子化;只有既熟悉会计,又具备一定电脑知识的会计专才,才能设计出优良的财务管理方案,让程序设计者去开发适用软件,使电算化发挥最大效能。再者,财务人员如具备一定电脑常识就能最大限度地避免操作错误,降低差错风险,从而保证会计数据安全。为此,企业要做好复合型人才的培训工作,让现职会计人员掌握电脑知识,为实现电算化提供重要条件。 
 
实践证明,企业要顺利实行电算化管理,必须切实做好以上各项基础工作,争取上级领导的大力支持,为落实基础工作提供保证。 
 
二、财务管理系统对软件设计的要求 
 
 1.高起点、高规格开发高质量的软件 
财务系统对企业很重要,准确程度要求高,不允许有半点差错,因而必须从高起点出发,聘请高水平、合资格、有财务软件开发经验的公司和工程人员负责开发,不能聘请不够资质、不合资格、无实践经验的人员开发。否则,会影响系统的质量、进度,甚至会半途而废。例如,广州某企业,因经费不足聘请了一家技术力量较弱的公司负责开发会计系统,由于设计人员水平较低,加之无实践经验、缺乏财务常识,开发出的系统漏洞百出,最终无法使用,给企业造成了损失;同时,严重影响了该单位的电子化进程。因此,财务系统开发,用户必须聘请技术力量雄厚、具备财务软件设计经验的单位和设计人员负责。 
 
 2.做好系统分析工作 
 
软件设计首先要从系统分析着手,目的在于了解财务工作流程,广泛收集必要数据,对相关的各种因素进行详细分析,这是软件设计的基础工作,很重要。对问题的分析是否深入细致、完整透彻,体现了设计人员对将要进行的工作的了解程度,也体现着基础工作准备是否充分,这关系到未来系统的成败,因而要充分重视系统分析工作。系统分析的具体步骤: 
 
 (1)成立专家小组,具体包括:委托方、软件设计人员、会计师、系统使用者、信息安全工程师等组成,为全面开展工作做好准备。 
 
 (2)落实任务,明确基本事项,确定具体要完成哪些工作。 
 
 (3)提出具体要求,包括:明确给出系统的规模;系统应能完成哪些工作;系统工作的步骤和方法:新系统应达到何种质量水平,以及具体的质量控制指标、计划进度等。 
 
 (4)收集、整理数据资料,包括:会计业务分工、业务量、业务处理方法、各类报表、输出结果的时间、数据储存要求等。 
 
 (5)认真编好会计业务流程图。会计业务流程图就是把会计业务的整个过程用图示和文字说明表述出来。这一过程很重要,是系统设计的基础、依据,财务系统就是根据会计业务流程图设计出来的,是会计业务流程的“数字化”。业务流程图质量的好坏直接决定着系统设计的成败。因此,必须认真踏实地做好业务 
流程图的编制工作。 
 
业务流程图须由专家小组编制,其间应重点发挥有实践经验的会计师、具体业务操作者的作用,重视一线员工的意见,尽最大可能满足第一线业务的需要。设计财务系统很重要的一条就是实用、方便操作,要考虑到一线业务的具体情况。只有理论和实践相结合,方便实务操作,财务系统才受使用者欢迎。 
 
业务流程图须同时采用文字说明、图形描述两种形式,以相互补充;有关说明、描述必须详细、周密、完善、步步到位,凡是业务触及到的细节均应详细说明、准确标出,为下一步程序设计工作提供充分依据。 
 
有的单位在开发财务软件系统时,只侧重程序设计环节,忽视业务流程图编制的重要性,结果到了程序设计阶段,不得不中断设计,回过头来抽出大量的人力、物力去临时补上有关业务流程细节,财务系统成了典型的“边设计边施工边补漏的‘三边’工程”。这样既容易出错又拖慢了工程进度,更谈不上周密完善,还会影响系统的设计质量,给企业造成损失。 
 
 (6)编制程序流程图。程序流程图是将系统设计的具体步骤,通过图示符号表示出来,它直观地反映了程序设计的构思过程,体现了整个程序运行的思路,是程序设计的关键一步,直接决定着程序设计质量的高低。同时,绘制好程序流程图非常有利于系统的整体控制。 
 
 (7)对前期基础准备工作进行严格审核。财务系统的设计是以各项优良的前期准备工作为前提的,基础工作显得尤为重要。顾此,在开展程序编写工作之前必须全面审查有关准备工作是否充分,发现问题及时解决;严禁边准备、边设计、边补漏。 
 
 3.程序设计阶段,采用模块化设计 
 
模块化就是把一个复杂的程序分成若干个功能不同的多个部分,各个子模块均有独立功能,可以单独运行;而把各个子模块组合在一起,又能方便地搭配成一个完整的系统。模块化设计是现代程序设计中一种很重要的技巧,有着众多优点: 
 
 (1)便于分工合作,提高效率,提高质量。系统设计时,可以把要做的工作分拆成多个部分,然后分配给不同的人,甚至不同的单位各自开发。这有利于提高效率,提高程序的设计质量。 
 
 (2)便于维护、维修,增强通用性、易读性。 
 
 (3)增强模块的独立性,降低相互之间的依赖程度。即使有某些部分故障,也不致影响系统的整体运行。 
 
 (4)能设计出可绕过障碍区运行的高质量软件――这是模块化设计的最大优点。由于模块之间相对独立,所以即使出现某些非关键性故障,系统依然能安全运行。这一点很重要,因为系统在使用中出现小故障是较常见的现象,如果财务系统具备了这种优点,就能做到不停机维修,不致影响日常业务,这对财务管理特别有意义。反过来,如果系统一有小毛病就会影响日常业务,甚至突然“死机”,就会严重打乱企业的管理秩序,还可能会造成数据丢失,给企业造成损失。所以,能做到小毛病不停机维修,大故障能尽快恢复是财务管理对其软件设计的特殊要求。  
 4.软件设计要有扩展性,以适应企业未来发展 
 
会计电脑系统设计要预计到企业各类业务的发展,要预留足够的扩展空间,以适应业务高层次、多元化发展。某些企业的电算化系统因没有扩展性,致使业务稍有变动,系统就无法适应,延误了日常工作。例如,一些企业的会计系统能处理人民币、港币、美元业务,但对日元、英镑、欧元或其他外币业务就难以适应。随着我国即将加入WTO,企业外币业务必然日益增多,缺乏扩展功能的会计系统将难于满足未来发展要求。因此,会计系统设计一定要有超前意识,要考虑到未来业务发展需要,设计有扩展性、多功能的软件。 
 
要考虑到某些特殊业务的需要。深圳市曾发生过这样一件事,一对从新疆调进该市的夫妇,在为小孩办理入户手续时,因公安局的户籍管理系统只能输入四个汉字以内的姓名,而该小孩是维吾尔族,名字由近十个汉字组成,超出了公安局电脑系统的设计要求,以至无法正常入户,引起了不必要的纠纷。以此为鉴,财务电脑系统应有处理特殊业务的设计,要考虑到特殊业务的需要。 
 
 5.强调面向用户 
 
财务系统的最终使用者是企业,是一线业务人员,所以要特别强调操作简单、方便用户,要设计良好的用户界面,具体操作应尽可能简单易学。在屏幕显示方式上,最好只显示与业务相关的资料,对可有可无的资料,如参考性、辅助性的资料则能省则省。切忌“和盘托出”――有用、暂不需用的资料均显示于屏幕,这样很容易造成操作错误,还会给人“眼花缭乱”的感觉。在目前企业计算机应用水平、管理水平不很高的情况下,“面向用户性”很值得广大设计人员的重视。 
 
 6.试运行 
 
系统完成开发后必须反复测试,证明达到设计要求,才能交付使用;不能边检测、边使用、边补救。 
 
 7.制定应急计划 
 
系统完成设计后,开发方应编制与系统相关的运行文件,并提出有关注意事项,以备在出现意外情况时,有条不紊地采取相应措施。使用单位也应制定自己的应急计划,以备急需。令人担忧的是,不少单位恰恰忽视了这一关键步骤,没有起码的应急计划,假如系统一旦出现故障,后果不堪设想,损失将是巨大的。 
 
 8.加强风险控制,保证信息安全 
 
实现会计电算化,必然解决信息安全问题。由于电子数据高度集中,高度依赖电脑,且受电脑病毒入侵、人为操作失误、机器故障、非法毁损等因素影响,数据很容易被破坏,因此,会计电算化必然加强信息安全管理,一方面制定各种严格的管理制度,加强风险控制,加强管理;另一方面加强对员工的信息安全教育,严禁未经受权人员上机操作;不能连接与业务无关的终端,禁止与互连网连接;采用先进的加密技术,安装“防火墙”,严防电脑病毒入侵,防止人为非法破坏数据。实践证明,严格、有效的管理制度是信息安全的最好保障。 
 
 9.加强对财务系统使用前的审计 
 
财务系统必须确保正确,才能投入使用,这是保证财务数据安全的关键。系统在投入使用前,应组织专家小组进行严格审计、从严检测,并实地模拟运行。只有证明正确无误的系统方可正式投入使用,只有经过“实战”检验的系统才具有可靠性。必须指出的是,财务系统不能边使用、边检测、边维修,这样风险很大,难于保证数据安全。 
 
 ]实行会计电算化,要求财务管理标准化、规范化,而财务软件设计则要符合财务管理的特殊要求。只有相互适应、互相配合,才能设计出安全可靠、多功能、高质量的优秀软件,更好地推进会计电子化工作。财务电算化是大势所趋,是提高企业科学管理水平、增强竞争力的迫切要求――会计师、程序设计人员在这方面有着异常重要的作用,应充分调动他们的积极性、创造性。
loading...

 

2006-4-17
把DataGrid导出到Excel [转]

youedatagrid.datasource=yourgetdatasourcemethord() 

youedatagrid.databind();


Response.Clear();
Response.Buffer=true;
Response.ContentType="application/vnd.ms-excel";
Response.Charset="";
this.EnableViewState=false; 


stringwriter  sw=new  stringwriter();
HtmlTextWriter  htw=new  HtmlTextWriter(sw);
YoueDataGrid.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();

DataGrid导出到Excel的时候,某些数字内容显示不正确,"3.62201E+14"的格式

webform中,在datagrid的itemdatabound事件内

if(e.item.itemtype  ==  ListItemType.Item  ||  e.Item.ItemType  ==  ListItemType.AlternatingItem)
{
e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@";

这样导出就没有问题了


在WinForm内Excel.Range  range  =  (Excel.Range)worksheet.Cells[1,1];
//设置单元格数字内容显示格式
range.NumberFormat  =  Excel.XlParameterDataType.xlParamTypeUnknown;
这样导出就没有问题了。
////////////////////////////////////////////////////////////////////////////////////////
DataGrid输出到Excel并进行格式化处理

在我们把datagrid上的数据导入到excel的时候,如果遇到比较长的数字字符串,比如身份证号码,就会在excel里当成数字看待,并转换成科学计数法的格式,造成数据的丢失,下面这个方法就解决了这个问题,并示例如何进行其它的格式化。

查看例子

OutPutExcel.aspx

<%@ Page language="c#" Codebehind="OutPutExcel.aspx.cs"
 AutoEventWireup="false" Inherits="eMeng.Exam.OutPutExcel" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>OutPutExcel</title>
</HEAD>

<form id="Form1" method="post" runat="server">
<aspataGrid id="DataGrid1" runat="server"></aspataGrid>
<asp:Button id="Button1" runat="server" Text="输出到Excel"></asp:Button>
</form>

</HTML>


OutPutExcel.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace eMeng.Exam
{
/// <summary>
/// OutPutExcel 的摘要说明。
/// </summary>
public class OutPutExcel : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
DataGrid1.DataSource=CreateDataSource();
DataGrid1.DataBind();
}
/// <summary>
/// 创建数据源
/// </summary>
/// <returns>DataView</returns>
ICollection CreateDataSource() 
{

DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("身份证号码", typeof(string)));
dt.Columns.Add(new DataColumn("图书单价",typeof(decimal)));
dt.Columns.Add(new DataColumn("购买数量",typeof(Int32)));
dt.Columns.Add(new DataColumn("总价格",typeof(decimal)));


for (int i = 0; i < 30; i++) 
{
dr = dt.NewRow();

dr[0] = "123456789123456789";
dr[1] = 100 * i /3.0;
dr[2] = i + 5;
dr[3] = (decimal)dr[1] * (Int32)dr[2];
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
/// <summary>
/// 输出到Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button1_Click(object sender, System.EventArgs e)
{
Response.Clear(); 
Response.Buffer= true; 
Response.Charset="GB2312";    
Response.AppendHeader("Content-Disposition","attachment;filename=FileName.xls"
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312";//设置输出流为简体中文
Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
this.EnableViewState = false;    
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad); 
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.DataGrid1.RenderControl(oHtmlTextWriter); 
Response.Write(oStringWriter.ToString());
Response.End();
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@";
e.Item.Cells[3].Attributes.Add("style","vnd.ms-excel.numberformat:¥#,###.00";
}
}
}
}

loading...

 

2006-4-17
javascript配合DataGrid操作常用函数

javascript实现datagrid客户端checkbox列的全选,反选 

/**//* 分页
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    
    使用方法:
    if(e.Item.ItemType == ListItemType.Header)
    {
        ((CheckBox)e.Item.Cells[1].FindControl("chkAll").Attributes.Add("onclick","CheckAll('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');";
    }
*/
function CheckAll(prefix,chkAll,chkSingle)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    var tempObj;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            tempObj.checked = objChkAll.checked;
        }
    }
}
/**//* 分页
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    
    使用方法:
    if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        ((CheckBox)e.Item.Cells[1].FindControl("chkSingle").Attributes.Add("onclick","CheckSingle('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');";
    }
*/
function CheckSingle(prefix,chkAll,chkSingle)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    var tempObj;
    var allCount    = 0;
    var checkCount    = 0;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            if(tempObj.checked)
            {
                checkCount++;
            }
            else
            {
                objChkAll.checked = false;
                //break;
            }
            allCount++;
        }
    }
    if(checkCount != allCount)
    {
        objChkAll.checked = false;
    }
    else
    {
        if(allCount != 0)
        {
            objChkAll.checked = true;
        }
    }
}
/**//*
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    type:1【全选】,2【反选】,3【取消】
    
    使用方法:
    this.btnSelectAll.Attributes.Add("onClick","CheckType('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle',1);";
    this.btnUnSelectAll.Attributes.Add("onClick","CheckType('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle',2);";
    this.btnCancelSelect.Attributes.Add("onClick","CheckType('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle',3);";
*/
function CheckType(prefix,chkAll,chkSingle,type)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    var tempObj;
    var allCount    = 0;
    var checkCount    = 0;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            switch(type)
            {
                case 1:
                    tempObj.checked = true;
                    break;
                case 2:
                    tempObj.checked = !tempObj.checked;
                    break;
                case 3:
                    tempObj.checked = false;
                    break;
            }
            if(tempObj.checked)
            {
                checkCount++;
            }
            allCount++;
        }
    }
    if(checkCount != allCount)
    {
        objChkAll.checked = false;
    }
    else
    {
        if(allCount != 0)
        {
            objChkAll.checked = true;
        }
    }
    window.event.returnValue = false;
    return false;
}

/**//*
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID

    使用方法:
    this.btnDelete.Attributes.Add("onClick","SubmitCheckBox('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');";
*/
function SubmitCheckBox(prefix,chkAll,chkSingle,msg)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    
    var tempObj;
    var allCount    = 0;
    var checkCount    = 0;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            if(tempObj.checked)
            {
                checkCount++;
            }
            allCount++;
        }
    }
    if(allCount == 0) //没有数据
    {
        window.alert("当前没有" + msg + "可供删除";
        window.event.returnValue = false;
        return false;
    }
    else
    {
        if(checkCount == 0)
        {
            window.alert("没有选中要删除的" + msg + "";
            window.event.returnValue = false;
            return false;
        }
        else
        {
            //if(window.confirm("确定要删除当前选中的【" + checkCount.toString() + "】项吗?" == false)
            if(window.confirm("确定要删除当前选中的" + msg + "吗?" == false)
            {
                window.event.returnValue = false;
                return false;
            }
        }
    }


loading...

 

2006-3-22
ADO.NET学习笔记 [转]

操纵dataset
在DataSet中DataRow是其所有数据的基本存放位置,它主要是由一个值数组组成,代表DataTable单独一行。
DataRow中主要包括一下几种信息:1、行中每一列的当前值,2、行中每一列的原始值,3、行状态,4、父行与子行间的链接

初始化一个DataRow:
DataTable dataTable=dataSet.Tables[0];
DataRow newRow=dataTable.NewRow(); //用dataTable生成DataRow可以利用dataTable里面的模式
dataTable.Rows.Add(newRow);

删除行:
DataTable.Rows.Remove(行实例);
DataTable.Rows.RemoveAt(行号);
DataRow.Delete(); //行自身移除

读写DataRow的值:
row["列名"],row[列号]均可引用其中的一个属性
DataColumn a=dataTable.Columns("列名"; //可以获得一个列

对行进行批处理更改:
BeginEdit()开始更改,EndEdit()结束更改,同时将更改结果写入DataSet,CancelEdit(),取消更改
例如:
row.BeginEdit();
对row进行更改
row.EndEdit();

将数据批量加载到DataTable
dataTable.BeginLoadData();
dataTable.LoadDataRow(row1,false); //第二个参数为true时,调用dataTable.AcceptChanges()时接受更改,为false直接添加
……
dataTable.EndLoadData();
使用这种数据加载方式可以在数据加载期间屏蔽所有的数据约束,索引也不会予以维护,极大的加快了数据加载速度

行的版本:
current:当前值
default:根据操作的不同决定行的default值
original:最后一次调用AcceptChanges()之后的值
proposed:调用AcceptChanges()之前被更改的值
例如要获得行的original值:
String oldString=row("FirstName",DataRowVersion.original);

行的状态:
row.RowState获得行的状态,例如删除后变成Deleted,数据存储更新后变为unchanged

六、DataSet导航
在ADO.NET中每个表都保持其相对独立性,允许在行级上导航不同表之间的相关行(向下导航到子行,向上导航的父行)
如DataRow[] invoiceRows=custRow.GetChildRows("Customer_invoice";    //通过关系导航到子行

七、DataView
DataView就时数据视图,为数据库结构提供了外模式的实现。
同时DataView也可以为窗体控件和Web控件提供数据绑定功能,在每一个DataTable中内建了一个DataView为:DataTable.DefaultView();

创建DataView
DataView sortedView=new DataView(dataTable);

对DataView进行排序
dataTable.DefaultView.sort="lastName";
dataTable.DefaultView.sort="lastName,FirstName DESC";

对DataView进行筛选:
1、通过对其中的RowFilter属性设置可以实现筛选
dataTable.DefaultView.RowFilter="Vendor='Rawlings'";
不过筛选表达式只能设置成比较简单的表达式,功能有限,不过可以满足基本的要求。
同样在DataTable里面也可以进行简单的搜索,返回一个DataRow数组,例:
DataRow[] compoundRows=dataTable.select("Vendor='wilson' AND price>20.00)
2、通过RowState来筛选
dataTable.DefaultView.RowStateFilter="DataViewRowState.originalRows"可以筛选出符合要求状态的row

对DataView进行搜索:
相对于DataView使用RowFilter进行筛选得到一个矩形数据集,使用Find、FindRows可以更准确的查找到与特定键相匹配的行
搜索的时候必须首先设置DataView的sort属性:
int found=dataTable.DefaultView.Find("wilson"; //获得行的位置
DataRowView[] rows=dataTable.DefaultView.FindRows("Rawlings" //过得一个row数组

八、更新DB
在DataSet中,每一个DataTable对应着一个DataAdapter,DataAdapter.Update()时,DataTable自动更新。
更新的时候可以使用CommandBuilder自动根据DataSet的变化生成更新的SQL命令
SqlCommandBuilder bldr=new SqlCommandBuilder(dataAdapter);
dataAdapter.Update(custTable);
不过Update接受DataSet参数并不更新DataSet而是更新DataSet中的一个叫"Table"的表
使用CommandBuilder进行更新的时候要注意一下几点:
1、SelectCommand必须有效
2、必须有主码
3、若SelectCommand填充DataTable后架构发生改变,应该在Update()之前调用CommandBuilder.RefreshSchema();
4、更新DB时不受关系、约束或者DataSet中其他表的影响
虽然使用CommandBuilder比较方便,不用自己写更新命令,但自动生成的命令性能不高,这时可以考虑自己编写存储过程或直接使用带参数的sql语句,例如:
String insQry="Insert into Customer(CustomerID) Values (@Customer)";
SqlCommand insCmd=conn.CreateCommand();
insCmd.CommandText=insQry;
SqlParameterCollection insParams=insCmd.Parameters;
insParams.Add("@CustomerID",SqlDbType.UniqueIdentifier,0,"CustomerID";
dataAdapter.InsertCommand=insCmd;
dataAdapter.Update();
在dataAdapter.Update()更新时还可以控制更新的范围:
dataAdapter.Update(invTable.GetChanges(DataRowState.Deleted); //只更新被删除的部分

九、事务
tx=conn.BeginTransaction(IsolationLevel.Serializable);
invDA.SelectCommand.Transaction=tx;
事务操作
tx.Commit();提交 //tx.Rollback();事务回滚

十、数据绑定
简单版本:(对文本框、标签等)
{Controls}.DataBindings.Add("{Property}",{dataSource},"{dataMember}";
其中Property为待绑定的属性,dataSource为DataView或DataTable,dataMember为dataSource其中的某个属性

复杂版本:(对ListBox、ComboBox等)
要分别设置各个属性实现绑定:
DataSource=支持IList的一个对象(DataTable或DataView)
DisplayMember:待显示的DataSource中的一个属性
ValueMember:确定在DataSource中引用哪一个数据行,即实现与DisplayMember的名值对应

DataGrid绑定:
1、可以设置DataSource属性实现静态绑定
2、可以使用SetDataBinding函数实现动态绑定

同时DataGrid支持主控/详细表显示
masterGrid.setDataBinding(customerTable,"";
detailGrid.setDataBinding(customerTable,"Customer_Invoices" //第二个属性要设置成关系约束
这样在主表中选择一行,在子表中就根据主表行中外码在子表中找到相应行

绑定之后,绑定项中就有一个CurrencyManager属性实现游标功能
BindingContext[CustomerTable]返回一个CurrencyManager对象,其中的Position属性可以更改,实现游标的移动。
posted @ 2006-12-11 09:55  疾行者  阅读(1257)  评论(0编辑  收藏  举报