精华内容
下载资源
问答
  • 矢志不渝,致力于发展中文Linux桌面办公系统.pdf
  • 桌面办公系统

    2012-10-09 10:34:04
    将文件夹拖放到你的计算机桌面后,双击打开文件夹。
  • 华为桌面云助力智利Codelco公司建设桌面办公系统.pdf
  • 基于云计算的桌面办公系统的设计.pdf
  • 华为桌面云助力石油打造绿色移动安全办公系统.pdf
  • C#桌面办公应用-工资管理系统系列四 已经好久没写博客了!!!今天就重拾旧业,继续我的博客之旅。 紧接着上面关于C#桌面办公应用-工资管理系统系列一到三的内容,博客接下来可能会有比较多的系列,用于介绍我...

      C#桌面办公应用-工资管理系统系列四

      已经好久没写博客了!!!今天就重拾旧业,继续我的博客之旅。

      紧接着上面关于C#桌面办公应用-工资管理系统系列一到三的内容,博客接下来可能会有比较多的系列,用于介绍我自主开发的针对企业员工的工资进行管理的管理系统。

      上面的系列内容是比较旧的,在后期开发期间,发现前面的系列有些内容讲的不是很好,包括模块设计,系统角色

    权限设计以及系统架构设计等等都不是很好,如今开启新的篇章,又没多少时间去修改前面系列的内容,而且如果真修改起来,估计会是“重写”,故而我会在最后放上一个关于本管理系统的说明文档!!!如果有哪位想要我这个管理系统的话(包括系统源码以及文档),可以加我QQ:1948831260(记得备注:桌面办公应用)私聊我,你可以当做是你的毕业作品或者C#桌面应用的项目练习,我可以考虑出售给你哦大笑。因为毕竟是我自己辛苦开发出来的,所以,物质上的回报我觉得是理所当然的!当然,我的目的主要是在于与诸位交流,共同提升技术。

      废话少说,从本系列开始(即你可以忽略前面三个系列中的某些内容),我将从模块化的角度开始讲解各个模块!

      值得说明的是,本管理系统的目的是开发一套高效的管理企业中相关部门的员工的工资,具体在于管理企业的部门,员工,员工的工资和员工的工资附件等。采用的相关技术有:C# winform技术,基本的SQL操作,图片或者附件的上传、预览、保存,水晶报表的自主研发,数据备份的实现,局域网共享本C/S系统,汇总统计打印报表以及身份证号码验证等技术。

      开发工具:visual studio2008,SQL server2008,服务器用本机代替,当然是可以作为局域网下的服务器的!

      按照上面的想法,首先当然是进行系统的模块划分。具体如下图所示。

      

      下面,就从登录模块开始讲解吧。

       值得说明的是,本系统设置了三种不同类型的用户,包括普通用户(即员工),业务管理员和系统管理员,不同的用户具有的系统权限是不同的。普通用户具有的功能主要有修改密码,查询工资以及打印工资的功能。业务管理员主要是对系统涉及的业务进行全权管理,在开发过程中可以根据需要而设置多个业务管理员。系统管理员则主要是管理系统中另外的两类角色,即超级管理员的职责在于管理普通用户和业务管理员。比如可以在员工入职的时候为其注册一个账号,在其离职时候删除该账号,同理,也可以注册、删除业务管理员,查看并随时更新系统的帮助文档,维护系统的基础数据(即数据字典的管理),对系统涉及的数据进行备份等功能。

      登录模块的话,主要涉及的是用户这个实体,至于这个实体的数据库设计就不说了,在最后的文档有相关介绍,如果想要详细的文档的话,可以加我QQ,我愿意考虑出售给你!(请原谅我的直接,但这系统毕竟是我自主开发的,不太想无偿奉献!只要收获点补偿以激励自己继续前进)。

      首先直接看效果吧!

      

      采用登录名和密码进行登录,后期会采用加密技术实现登录,但目前是没有加密的验证!

      登录成功的主界面如下图:

      

      下一节开始,将介绍本系统的代码层次结构以及登录模块的实现源代码!

      最后,有相关问题或者意见可以评论,希望与诸位共同提高技术!!

     

    展开全文
  • 说实在的,这个桌面办公应用,其实对于小型的企业来说,是很适用的,我需求调研的时候,就是以我所在的公司为例的(当然了,我待的不过是个小公司而已!),对于开发的成果,我让我的主管做了一下鉴定,他也给我...

     C#桌面办公应用-工资管理系统系列十

         这是我自主开发的企业员工工资管理系统第一期系列博文的最后一篇博文了,本篇博文将放置一篇文档,用于介绍我这个桌面办公应用系统实现的整个流程!当然啦,由于时间有限,就只是介绍了一部分而已,把比较关键的地方列了出来!另外还有一份文档是关于这个系统的“毕业设计论文”,就不放上去了,因为,那个是我辛苦花了一个多星期的时间完成的,需要出售的!!!如果有兴趣的博友可以加我QQ联系(1974544863),我可以给你看看一些效果!

         好了,这篇文档主要是介绍了本系统开发的总体业务流程,核心模块,系统总体架构,关键技术以及系统使用时的部分界面!说实在的,这个桌面办公应用,其实对于中小型的企业来说,是很适用的,我在需求调研的时候,就是以我所在的公司为例的(当然了,我待的不过是个小公司而已!),对于开发的成果,我让我的主管做了一下鉴定,他也给我很大的肯定(当然啦,不足之处也还是有滴!);而对于作为毕业设计的系统实现,我觉得那更加是没问题的!!! 

         欢迎到这里来下载:企业员工工资管理系统说明书

         最后,附上我自主开发的这个系统的首页吧!!!大笑


    展开全文
  • C#桌面办公应用-工资管理系统系列六 接前文系列五,本文将讲解自主开发的工资管理系统中的员工管理模块:主要包括“员工初始化信息加载”,“员工信息综合查询与分页查询”,“添加员工”,“修改员工信息”,...

    C#桌面办公应用-工资管理系统系列六

         接前文系列五,本文将讲解自主开发的工资管理系统中的员工管理模块:主要包括“员工初始化信息加载”,“员工信息综合查询与分页查询”,“添加员工”,“修改员工信息”,“删除员工信息”;涉及到的技术包括:对SQL进行增删改操作,综合模糊查询,分页查询,图片的上传预览保存查看技术,18位身份证验证算法的实现与应用技术,将查询得到的结果集绑定到comboBox跟dataGridView中等技术

        若有朋友想索取我这自主开发的工资管理系统源码或者开发文档,可以加我QQ:1948831260进行交流,我愿意视情况出售给你,这个系统也可以当做毕业设计系统!当然了,目的主要还是希望能与诸位交流!

        本文先介绍员工管理模块中的“员工初始化信息加载”,开发步骤是这样的:设计员工model,在数据库建立相应的员工表,设计并实现员工管理初始化界面,初始化查询绑定员工数据到dataGridView中,单击dataGridView中的某一行可以查看改行对应的员工的详细数据。下面将逐个实现该小模块的功能!

        首先是员工表基本字段的建立,如下图所示:

        接着是界面的设计与实现,如下图所示:

        上图即为员工管理中初始化加载时候的界面:第一部分是“分页查询、增删改、综合模糊查询”;第二部分是“员工信息列表-采用dataGridView控件进行展示”;第三部分是“员工详细信息-各种基本控件以及图片展示空间pitureBox”。

        紧接着是“初始化查询绑定员工数据到dataGridView”:主要是窗体的load事件:

     

            //窗体初始化加载事件
            private void frmEmployee_Load(object sender, EventArgs e)
            {
                cmmPage.PageNo = 1;
                cmmPage.PageSize = pageSize;
                try
                {
                    String employeeSQL = "select top "+cmmPage.PageSize+" empId as '员工编号',loginName as '登录用户名',powerName as '用户权限',empName as '员工姓名',age as '年龄',sex as '性别',partName as '所属部门',idCardNo as '身份证号',jobType as '职位类型',jobDate as '入职时间',imagePosition as '图片位置',tb_employee.memo as '备注信息' from tb_employee,tb_powerType,tb_part where tb_employee.powerId=tb_powerType.powerId and tb_employee.partID=tb_part.partID and empId not in (select top "+cmmPage.Start+" empId from tb_employee order by empId)order by empId";
    
                    recordCount= employeeService.getCount("select COUNT(*) from tb_employee");
                    pageCount = commonMessage.getTotalPage(pageSize, recordCount);
    
                    bindPaginationQuery(employeeSQL,cmmPage,recordCount,pageCount,sender, e);
                    this.textBoxCurrentPage.Text = "1";
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("初始化加载员工信息出错: \n" + ex.Message);
                }
            }


        其中,cmmPage是分页工具类的实例,需要在窗体构造函数之后创建,除此之外,还有employeeService也是需要

     

    在窗体构造函数之后创建:

     

            private EmployeeService employeeService = new EmployeeService();
            private CommonMessage commonMessage = new CommonMessage();
            private CommonUtils cmmUtils = new CommonUtils();

        其中,employeeService代码如下,其代码需要调用DBOperate即Dao层的代码和CommonUtils工具类的代码,即所谓的MVC逐层调用!而DBOperate和CommonUtils中因为涉及到我自主开发的核心技术,所以在这里就不在贴出来,当然了,在前面已经有贴出一小部分了!如果你想获取我没贴出来的(还是有很多没贴出来的大笑)代码,可以加我上面提供的QQ与我交流,我愿意出售给你!

     

     

        //员工服务层
        class EmployeeService
        {
            private DBOperate operate = new DBOperate();
            private CommonUtils cmmUtils = new CommonUtils();
    
            /// <summary>
            /// 绑定Sql语句查询的结果到dataGridView中
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="dataGridView"></param>
            public void bindSqlResultToDatagridView(DataGridView dataGridView, String sql)
            {
                operate.BindDataGridView(dataGridView, sql);
                #region MyRegion //设置好datagriview中的列的显示宽度
                dataGridView.Columns[0].Width = 140;
                dataGridView.Columns[1].Width = 160;
                dataGridView.Columns[2].Width = 160;
                dataGridView.Columns[3].Width = 140;
                dataGridView.Columns[4].Width = 140;
                dataGridView.Columns[5].Width = 140;
                dataGridView.Columns[6].Width = 180;
                dataGridView.Columns[7].Width = 180;
                dataGridView.Columns[8].Width = 180;
                dataGridView.Columns[9].Width = 180;
                dataGridView.Columns[10].Width = 120;
                dataGridView.Columns[11].Width = 220;
                #endregion
            }
    
            /// <summary>
            /// //绑定SQL查询语句中的指定列到下拉列表
            /// </summary>
            /// <param name="strTable">数据库表名</param>
            /// <param name="cb">ComboBox对象</param>
            /// <param name="i">指定数据列索引</param>
            public void bindSpecificColumnToComboBox(String strSQL, ComboBox cb)
            {
                operate.BindDropdownlist(strSQL, cb, 0);
            }
    
            /// <summary>
            /// 用于判断指定的字段值 是否已经存在
            /// </summary>
            /// <param name="strSQL">其中sql语句为:select count(columnName) from ...格式</param>
            /// <returns></returns>
            public Boolean isExistSpecificObject(String strSQL)
            {
                Boolean res = false;
                int i = operate.HumanNum(strSQL);
                if (i > 0)
                {
                    res = true;
                }
                return res;
            }
    
            /// <summary>
            /// 根据SQL获取数量值
            /// </summary>
            /// <param name="strSQL"></param>
            /// <returns></returns>
            public int getCount(String strSQL)
            {
                return operate.HumanNum(strSQL);
            }
    
    
            /// <summary>
            /// 保存或者更新(删除,修改)员工信息
            /// </summary>
            /// <param name="strSQL"></param>
            public int saveOrUpdatePart(String strSQL)
            {
                int i = operate.OperateData(strSQL);
                Console.WriteLine("操作的结果: " + i);
                return i;
            }
    
            /// <summary>
            /// 获取指定的数据库某一字段的值
            /// </summary>
            /// <param name="strObjectSQL">查询的SQL--指定了要查询的数据库字段</param>
            /// <param name="fieldNames">数据库字段数组</param>
            /// <returns></returns>
            public String getSpecificColumnValue(String strObjectSQL, String[] fieldNames)
            {
                return operate.GetDatasFromSelectedTable(strObjectSQL, fieldNames)[0];
            }
    
            
            /// <summary>
            ///  根据实际保存时员工相片的名称设置员工的相片的实际保存路径
            /// </summary>
            /// <param name="empPictureStoreName"></param>
            /// <returns>实际保存路径: 项目的debug目录\images\employee</returns>
            public String setEmpImageRealStoreLocation(String empPictureStoreName)
            {
                String empImgStoreDestPath = Application.StartupPath.ToString() + "\\images\\employee\\" + empPictureStoreName;
                return empImgStoreDestPath;
            }
    
            /// <summary>
            /// 读取员工相片
            /// </summary>
            /// <param name="empImageName">数据库存储的员工的相片名:imagePosition</param>
            /// <param name="myImage"></param>
            public void readEmpImage(String empImageName, PictureBox myImage)
            {
                String imageLocation = Application.StartupPath.ToString() + "\\images\\employee\\";
                try
                {
                    String imageRealPath = imageLocation + empImageName;
                    myImage.Image = Image.FromFile(imageRealPath);
                }
                catch (System.Exception ex)
                {
                    String imageRealPath = imageLocation + "default.jpg";
                    myImage.Image = Image.FromFile(imageRealPath);
                    Console.WriteLine("读取员工相片发生异常: " + ex.Message);
                }
            }
    
            /// <summary>
            /// 移除文件夹下指定的相片:当然只有上传了相片的才移除原先的相片
            /// </summary>
            /// <param name="removeImageName"></param>
            public void removeImage(String removeImageName)
            {
                try
                {
                    String empImageLocation = Application.StartupPath.ToString() + "\\images\\employee\\" + removeImageName;
                    File.Delete(@empImageLocation);
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine("移除员工相片发生异常: " + ex.Message);
                }
            }
        }


        在里面,我们可以看到,已经包含了将查询得到的结果集绑定到comboBox跟dataGridView中等技术,当然啦,具体的实现还是Dao那一层代码,即DBOperate类中的代码!

     

        下图是初始化加载员工信息列表时候的效果:

        下面实现:“单击dataGridView中的某一行可以查看改行对应的员工的详细数据”,其实就是dataGridView的cellMouseClick事件,源代码如下:

     

            //鼠标单击事件
            private void dataGridViewEmployeeInfo_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                try
                {
                    textBoxYuanGongDengLuMing.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[1].Value.ToString().Trim();
                    textBoxYuanGongYongHuQuanXian.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[2].Value.ToString().Trim();
                    textBoxYuanGongXingMing.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[3].Value.ToString().Trim();
                    textBoxYuanGongNianNing.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[4].Value.ToString().Trim();
                    textBoxYuanGongXingBie.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[5].Value.ToString().Trim();
                    textBoxYuanGongSuoShuBuMeng.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[6].Value.ToString().Trim();
                    textBoxYuanGongShenFenZheng.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[7].Value.ToString().Trim();
                    textBoxYuanGongZhiWeiLeiXing.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[8].Value.ToString().Trim();
                    dateTimePickerYuanGongRuZhi.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[9].Value.ToString().Trim();
                    textBoxYuanGongBeiZhu.Text = dataGridViewEmployeeInfo.CurrentRow.Cells[11].Value.ToString().Trim();
    
                    //iamgePosition要不是null:没上传图片 要不就是"位置信息"
                    String imagePosition = dataGridViewEmployeeInfo.CurrentRow.Cells[10].Value.ToString().Trim();
                    if (imagePosition=="")
                    {
                        imagePosition = "default.jpg";
                        
                    }
                    employeeService.readEmpImage(imagePosition, EmpPictureBox);
                    
                }
                catch(System.Exception ex)
                {
                    employeeService.readEmpImage("default.jpg", EmpPictureBox);
                    Console.WriteLine("鼠标单击发生异常: " + ex.Message);
                }
            }


        在上面,其实涉及到“C#读取图片并显示在控件pitureBox”技术:

    <span style="color:#ff0000;">employeeService.readEmpImage(imagePosition, EmpPictureBox);</span>

        这是由employeeService服务类中提供的,当然啦,底层的实现还是有DBOperate实现的,即Dao层的代码!

     

        好了,把效果贴出来吧:



        好了,这一文就到这里吧!下来两篇博文就讲讲C#在winform下如何实现分页查询(很有用的哦大笑)、综合模糊查询以及18位身份证号码验证算法的原理以及C#实现!

        欢迎各位与我交流!

    展开全文
  • C#桌面办公应用-工资管理系统系列九 今天介绍介绍一下我自主开发的工资管理系统中的“汇总查询打印”模块,改小模块具有以下的功能:可以汇总统计员工的工资发放明细信息,可以查询指定的某个部门下的某些员工的...

    C#桌面办公应用-工资管理系统系列九

         今天介绍介绍一下我自主开发的工资管理系统中的“汇总查询打印”模块,改小模块具有以下的功能:可以汇总统计员工的工资发放明细信息,可以查询指定的某个部门下的某些员工的工资发放明细信息,并打印成报表!开发的流程为:建立一个用于汇总的数据库表、制作报表、汇总、查询打印!我自己觉得这个功能是相当有趣的,而且在实际的企业中也具有一定的适用性,可以根据企业的需要自主定制相应的报表!若有博友想获取该系统的源码,或者想作为自己的毕业设计的系统实现,可以加我QQ:1948831260进行交流!

         下面以“部门下的员工工资发放明细的汇总统计查询”为例,首先,建立汇总数据库表:tb_employeeSalarySummary

     

         接着,制作企业定制的报表,采用的控件是微软的CrystalReport,即传说中的“水晶报表”。关于其制作过程,我觉得还是需要有技巧的,如果不知道这是个啥玩意,建议还是先去网上了解了解!!日后有时间了再来补充水晶报表的制作!下面是我自主制作的比较简陋的一个“员工工资发放明细”报表

     

         接下来就是重点了,“汇总统计部门下某些或者某个员工的工资发放明细”或者“汇总统计单个员工的工资发放明细”。这个过程,实现起来还是挺辛苦的,由于涉及到“多个表与表之间的关联”,故而,在获取数据的时候,需要根据主外键进行关联,所以获取数据时候需要有一定的时间!

         下面是“汇总部门下员工工资发放明细”的核心代码:

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data;
    using SMS.sevice;
    
    namespace SMS.queryAndSumPrint
    {
        //汇总员工工资
        class SummaryEmployeeSalary
        {
    
            public void QueryPrintSalOfEmpFunc(String strQueryType,String strQueryEmpLoinName)
            {
                try
                {
                    EmployeeService employeeService = new EmployeeService();
                    SalaryPayDetailsService salaryPayDetailsService = new SalaryPayDetailsService();
    
                    //先删除原汇总表的数据
                    String strIsDBExist = "select COUNT(*) from tb_employeeSalarySummary";
                    int dbDataSum = salaryPayDetailsService.getCount(strIsDBExist);
                    if (dbDataSum != 0)
                    {
                        String strDeleteDBData = "Truncate Table tb_employeeSalarySummary";
                        salaryPayDetailsService.saveOrUpdatePart(strDeleteDBData);
                    }
    
    
                    //工资编号的个数     
                    String strGetSalarySQL = "select COUNT(salaryId) from tb_salaryPayDetails";
                    if (strQueryType == "员工查询与统计")
                    {
                        strGetSalarySQL = "select COUNT(salaryId) from tb_salaryPayDetails,tb_employee where tb_salaryPayDetails.empId=tb_employee.empId and tb_employee.loginName='"+strQueryEmpLoinName+"'";
                    }
                    int salaryIdCount = salaryPayDetailsService.getCount(strGetSalarySQL);
                    if (salaryIdCount == 0)
                    {
                        return;
                    }
    
                    //获取工资编号
                    int[] salaryIds = new int[salaryIdCount];
                    String strGetSalaryId = "select salaryId from tb_salaryPayDetails";
                    if (strQueryType == "员工查询与统计")
                    {
                        strGetSalaryId = "select salaryId from tb_salaryPayDetails,tb_employee where tb_salaryPayDetails.empId=tb_employee.empId and tb_employee.loginName='"+strQueryEmpLoinName+"'";
                    }
    
                    String[] tempResult=salaryPayDetailsService.getQueryDataSet(strGetSalaryId, salaryIdCount);
                    for (int i = 0; i < tempResult.Length;i++ )
                    {
                        salaryIds[i]=Convert.ToInt32(tempResult[i]);
                    }
                    
                    //根据工资编号获取   员工编号,员工姓名,所属部门名称,工资年份,工资月份,基本工资类型
                    //奖励金类型,工资备注
                    String[,] empIdNameAndPartName=new String[salaryIdCount,8];
                    String[] infoFields=new String[]{
                        "empId","empName","partName","salYear","salMonth","salaryLevel","rewardType","salMemo"
                    };
                    for (int i = 0; i < salaryIdCount;i++ )
                    {
                        String getInfoSQL = "select tb_employee.empId,empName,partName,salYear,salMonth,salaryLevel,rewardType,tb_salaryPayDetails.salMemo from tb_salaryPayDetails,tb_employee,tb_part where tb_salaryPayDetails.empId=tb_employee.empId and tb_employee.partID=tb_part.partId and salaryId='" + salaryIds[i] + "'";
                        String[] tempInfoResult=salaryPayDetailsService.getSpecificColumnValues(getInfoSQL, infoFields);
                        empIdNameAndPartName[i, 0] = tempInfoResult[0];
                        empIdNameAndPartName[i, 1] = tempInfoResult[1];
                        empIdNameAndPartName[i, 2] = tempInfoResult[2];
                        empIdNameAndPartName[i, 3] = tempInfoResult[3];
                        empIdNameAndPartName[i, 4] = tempInfoResult[4];
                        empIdNameAndPartName[i, 5] = tempInfoResult[5];
                        empIdNameAndPartName[i, 6] = tempInfoResult[6];
                        empIdNameAndPartName[i, 7] = tempInfoResult[7];
                    }
                    
    
                    //根据工资编号获取 工资津贴,罚金,基本工资,奖励金金额,发放总金额
                    Double[,] empSalaryData = new Double[salaryIdCount, 5];
                    String[] salaryFields = new String[]{
                        "salJingTie","salFaJing","salaryAmount","rewardAmount","salSumAmount"
                    };
                    for (int i = 0; i < salaryIdCount; i++)
                    {
                        String getInfoSQL = "select salJingTie,salFaJing,salaryAmount,rewardAmount,salSumAmount from tb_salaryPayDetails,tb_basicSalary,tb_rewardType where tb_salaryPayDetails.salaryLevel=tb_basicSalary.salaryLevel and tb_salaryPayDetails.rewardType=tb_rewardType.rewardType and salaryId='"+salaryIds[i]+"'";
                        String[] tempInfoResult = salaryPayDetailsService.getSpecificColumnValues(getInfoSQL, salaryFields);
                        empSalaryData[i, 0] = Convert.ToDouble(tempInfoResult[0]);
                        empSalaryData[i, 1] = Convert.ToDouble(tempInfoResult[2]);
                        empSalaryData[i, 2] = Convert.ToDouble(tempInfoResult[2]);
                        empSalaryData[i, 3] = Convert.ToDouble(tempInfoResult[3]);
                        empSalaryData[i, 4] = Convert.ToDouble(tempInfoResult[4]);
                    }
                    
                    //根据员工编号和年份 获取  该员工该年总收入
                    Double[,] yearSalaryAmount=new Double[salaryIdCount,1];
                    for (int i = 0; i < salaryIdCount; i++)
                    {
                        String getYearSalary = "select SUM(salSumAmount) from tb_salaryPayDetails where empId='" + empIdNameAndPartName[i, 0] + "' and salYear='" + empIdNameAndPartName[i, 3] + "'";
                        yearSalaryAmount[i, 0] = Convert.ToDouble(salaryPayDetailsService.getQueryDataSet(getYearSalary, 1)[0]);
                    }
                    //Console.WriteLine("dd");
    
                    //开始汇总数据
                    for (int i = 0; i < salaryIdCount; i++)
                    {
                        try
                        {
                            String strInsertSQL = "insert into tb_employeeSalarySummary(salaryId,empId,empName,partName,salaryYear,salaryMonth,salaryJinTie,salaryFaJin,basicSalaryType,basicSalary,rewardType,rewardSalary,salarySumAmount,yearSumAmount,salaryMemo) values('" + salaryIds[i] + "','" + empIdNameAndPartName[i, 0] + "','" + empIdNameAndPartName[i, 1] + "','" + empIdNameAndPartName[i, 2] + "','" + empIdNameAndPartName[i, 3] + "','" + empIdNameAndPartName[i, 4] + "','" + empSalaryData[i, 0] + "','" + empSalaryData[i, 1] + "','" + empIdNameAndPartName[i, 5] + "','" + empSalaryData[i, 2] + "','" + empIdNameAndPartName[i, 6] + "','" + empSalaryData[i, 3] + "','" + empSalaryData[i, 4] + "','" + yearSalaryAmount[i,0] + "','" + empIdNameAndPartName[i, 7] + "')";
                            salaryPayDetailsService.saveOrUpdatePart(strInsertSQL);
                            
    
                        }
                        catch (System.Exception ex)
                        {
                            MessageBox.Show("汇总信息时出错: \n" + ex.Message);
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine("发生异常: " + ex.Message);
                }
            }
        }
    }
    


         其实,会发现,做的最多的是“根据某个外键获取另外的主键所在的表的其它字段信息”,而这在salaryPayDetailService类中已经进行了封装!

     

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using SMS.dbOperation;
    using SMS.utils;
    
    namespace SMS.sevice
    {
        //工资发放明细服务层
        class SalaryPayDetailsService
        {
            private DBOperate operate = new DBOperate();
            private CommonUtils cmmUtils = new CommonUtils();
    
            /// <summary>
            /// 绑定Sql语句查询的结果到dataGridView中
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="dataGridView"></param>
            public void bindSqlResultToDatagridView(DataGridView dataGridView, String sql)
            {
                operate.BindDataGridView(dataGridView, sql);
                #region MyRegion //设置好datagriview中的列的显示宽度
                dataGridView.Columns[0].Width = 120;
                dataGridView.Columns[1].Width = 120;
                dataGridView.Columns[2].Width = 140;
                dataGridView.Columns[3].Width = 160;
                dataGridView.Columns[4].Width = 120;
                dataGridView.Columns[5].Width = 120;
                dataGridView.Columns[6].Width = 120;
                dataGridView.Columns[7].Width = 100;
                dataGridView.Columns[8].Width = 180;
                dataGridView.Columns[9].Width = 120;
                dataGridView.Columns[10].Width = 180;
                dataGridView.Columns[11].Width = 180;
                dataGridView.Columns[12].Width = 180;
                dataGridView.Columns[13].Width = 200;
                #endregion
            }
    
            /// <summary>
            /// 绑定SQL查询语句中的指定列到下拉列表
            /// </summary>
            /// <param name="strSQL">SQL语句:在里面指定需要绑定的数据库表列的名字--select typeName...</param>
            /// <param name="cb">取0</param>
            public void bindSpecificColumnToComboBox(String strSQL, ComboBox cb)
            {
                operate.BindDropdownlist(strSQL, cb, 0);
            }
    
            /// <summary>
            /// 用于判断指定的字段值 是否已经存在
            /// </summary>
            /// <param name="strSQL">其中sql语句为:select count(columnName) from ...格式</param>
            /// <returns></returns>
            public Boolean isExistSpecificObject(String strSQL)
            {
                Boolean res = false;
                int i = operate.HumanNum(strSQL);
                if (i > 0)
                {
                    res = true;
                }
                return res;
            }
    
            /// <summary>
            /// 根据SQL获取数量值
            /// </summary>
            /// <param name="strSQL"></param>
            /// <returns></returns>
            public int getCount(String strSQL)
            {
                return operate.HumanNum(strSQL);
            }
    
            /// <summary>
            /// 保存或者更新(删除,修改)工资发放明细信息
            /// </summary>
            /// <param name="strSQL"></param>
            public int saveOrUpdatePart(String strSQL)
            {
                int i = operate.OperateData(strSQL);
                Console.WriteLine("操作的结果: " + i);
                return i;
            }
    
            /// <summary>
            /// 获取指定的数据库某一字段的值
            /// </summary>
            /// <param name="strObjectSQL">查询的SQL--指定了要查询的数据库字段</param>
            /// <param name="fieldNames">数据库字段数组</param>
            /// <returns></returns>
            public String getSpecificColumnValue(String strObjectSQL, String[] fieldNames)
            {
                return operate.GetDatasFromSelectedTable(strObjectSQL, fieldNames)[0];
            }
    
            /// <summary>
            /// 获取指定的数据库某些字段的值
            /// </summary>
            /// <param name="strObjectSQL">查询的SQL--指定了要查询的数据库字段</param>
            /// <param name="fieldNames">数据库字段数组</param>
            /// <returns></returns>
            public String[] getSpecificColumnValues(String strObjectSQL, String[] fieldNames)
            {
                return operate.GetDatasFromSelectedTable(strObjectSQL, fieldNames);
            }
    
            /// <summary>
            /// 根据SQL语句查询得到的DataSet获取DataSet那一列的所有值
            /// </summary>
            /// <param name="strQuerySQL"></param>
            /// <param name="count">将要获取的列的所有值的个数</param>
            /// <returns></returns>
            public String[] getQueryDataSet(String strQuerySQL,int count)
            {
                String[] results = new String[count];
                DataSet dsResult = operate.GetTable(strQuerySQL);
                dsResult.Dispose();
                if (dsResult.Tables[0].Rows.Count != 0)
                {
                    for (int i = 0; i < count; i++)
                    {
                        results[i] = dsResult.Tables[0].Rows[i][0].ToString().Trim();
                    }
                }
                return results;
            }
        }
    }
    


         下面是前端汇总统计查询界面的制作:

     

         下面是点击“打印”之后打印报表的“报表界面”的制作:需要放置一个crystalReportView的控件

         下面是进入“汇总统计查询初始化加载时候汇总统计部门下员工工资发放明细信息”事件代码:

     

            private void frmPartEmployeeSalarySummary_Load(object sender, EventArgs e)
            {
                try
                {
                    //汇总数据:“无”只是用来标识-这是“部门下员工工资的发放明细打印”
                    summaryEmpSalary.QueryPrintSalOfEmpFunc("全部", "无");
    
                    //加载信息
                    String  strLoadSQL  = "select salaryId as '工资编号',empId as '员工编号',empName as '员工姓名',partName as '所属部门',salaryYear as '工资年份',salaryMonth as '工资月份',salaryJinTie as '工资津贴',salaryFaJin as '罚金',basicSalaryType as '基本工资类型',basicSalary as '基本工资',rewardType as '奖励金类型',rewardSalary as '奖励金金额',salarySumAmount as '发放总金额',yearSumAmount as '改年总收入',salaryMemo as '备注信息' from tb_employeeSalarySummary ";
                    salaryPayDetailsService.bindSqlResultToDatagridView(dataGridViewSalaryPayDetailsInfo, strLoadSQL);
                    dataGridViewSalaryPayDetailsInfo.Columns[14].Width = 200;
    
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine("初始化家在信息出错: " + ex.Message);
                }
            }


          下面是效果图:

     

     

          下面是“打印”事件对应的源代码:

     

            private void buttonSave_Click(object sender, EventArgs e)
            {
                //记录当前列表的行数以及工资编号数组
                int salaryIdCount = 0;
                int[] salaryIds;
    
                try
                {
                    int rows = dataGridViewSalaryPayDetailsInfo.Rows.Count;
                    if (rows == 0)
                    {
                        MessageBox.Show("当前没有可以打印的数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
    
                    if (DialogResult.OK == MessageBox.Show("是否打印上述员工的工资发放明细信息?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation))
                    {
                        salaryIdCount = rows;
                        salaryIds = new int[rows];
                        for (int i = 0; i < rows; i++)
                        {
                            //MessageBox.Show(dataGridViewSalaryPayDetailsInfo.Rows[i].Cells[0].Value.ToString().Trim());
                            salaryIds[i] = Convert.ToInt32(dataGridViewSalaryPayDetailsInfo.Rows[i].Cells[0].Value.ToString().Trim());
                        }
                        frmPrintEmployeeSalary printEmployeeSalary = new frmPrintEmployeeSalary(salaryIdCount, salaryIds);
                        printEmployeeSalary.ShowDialog();
                    }
    
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine("打印发生异常: " + ex.Message);
                }
            }


           特别注意的是,确定打印之后,需要记录有多少行数据以及各行数据对应的“工资编号”是多少,因为这是“主键”,然后在“打印窗体中”,接收这两个参数,下面是打印窗体对应的源代码:

     

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using SMS.dbOperation;
    using SMS.crystalReport;
    using CrystalDecisions.CrystalReports.Engine;
    using System.IO;
    
    namespace SMS.printForm
    {
        public partial class frmPrintEmployeeSalary : Form
        {
            public frmPrintEmployeeSalary(int rows,int[] salaryIds)
            {
                InitializeComponent();
                this.printRows = rows;
                this.printSalaryIds = salaryIds;
            }
    
            DBOperate operate = new DBOperate();
    
            //记录打印的两个数据
            private int printRows;
            private int[] printSalaryIds;
    
            //测试数据
            private void frmPrintEmployeeSalary_Load(object sender, EventArgs e)
            {
    
            }
    
            //加载打印数据
            private void crystalReportViewer1_Load(object sender, EventArgs e)
            {
                string strSQL = "";
                try
                {
                    strSQL = "select * from tb_employeeSalarySummary where salaryId = ";
                    for (int i = 0; i < printRows; i++)
                    {
                        strSQL += "'" + printSalaryIds[i] + "' or salaryId = ";
                    }
    
                    int index=strSQL.LastIndexOf("or");
                    //Console.WriteLine(index);
                    String newStr=strSQL.Substring(0, index);
                    Console.WriteLine("真正的打印语句: "+newStr);
    
                    //strSQL = strSQL.Substring(0, strSQL.LastIndexOf("or salaryId=")).Trim();
    
                    DataSet dsDrivOfPerMsg = operate.GetTable(newStr);
                    //dsDrivOfPerMsg.Dispose();
    
                    //E:\vs2008-workspace\SMS\SMS\bin\Debug
                    String rootPath = Environment.CurrentDirectory;
                    String newPath=rootPath.Substring(0, rootPath.LastIndexOf("bin"));
                    String crystalReportPath = newPath + "crystalReport\\CrystalReportOne.rpt";
                    Console.WriteLine(crystalReportPath);
    <span style="white-space:pre">		</span>//下面四条简洁的语句:将需要打印的数据塞进“打印”窗体中!这个很用的
                    ReportDocument doc = new ReportDocument();
                    doc.Load(crystalReportPath);
                    doc.SetDataSource(dsDrivOfPerMsg.Tables[0]);
                    crystalReportViewer1.ReportSource = doc;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("打印出错信息: \n" + ex.Message);
                }
            }
        }
    }
    


           下面是“查询财物部门”下的员工的工资发放明细信息进行打印!

     

            

          查询得到三条数据,下面点击“打印”,将打印“这三条数据”:

     

         好了,今天介绍到这里吧!

         需要说明的是,我自主的开发的这个工资管理系统的介绍已经接近尾声,当然了,其实还有其他很多功能:比如数据备份,比如基础数据的维护,比如如何查看通过软件查看帮助文档等等,这些我都会在系列10以一个文档进行介绍,有兴趣的博友可以下载浏览,这个管理系统可以作为个人毕业设计时的系统实现,如果觉得可以的话,可以加我QQ,我愿意低价出售给你!不过,还是那句话,主要是为了交流!

     

     

     

     

     

    展开全文
  • C#桌面办公应用-工资管理系统系列七 接前文工资管理系统系列六,本文将介绍C# winform应用程序的查询模块功能。其中,就包括了综合、模糊查询以及分页查询;值得说明的是,综合查询,其实就是多个条件组合起来的...
  • C#桌面办公应用-工资管理系统系列五 接前文系列四,本文将讲解实现工资管理系统的代码的层次结构。主要采用的是MVCS模式的代码层次结构,视图层(V):是各种winform窗体;控制层(C):主要是winform窗体各种控件的...
  • 壹佰网oa协同办公系统服务器+桌面终端 100用户
  • 基于Linux的电力办公桌面操作系统安全性研究.pdf
  • 因为这两个软件都是微软开发的,所以win10上的兼容性很好。微软 待办事项 这个是打开之后的界面 可以把要做的事情添加到待办事项,而且可以设置提醒时间和备注,到时见会自动提醒你。 这个win10...
  • 首先介绍本系统的总体概述以及系统的总体开发过程介绍
  • Linux桌面实现远程办公.pdf
  • 数据库系统应用一:工资管理系统系列三之软件实现
  • 经历了新冠疫情,很多公司萌发了给员工提供远程办公的环境的想法,通过桌面虚拟化的方式,将云桌面服务器部署公司的内部,或者分公司的云桌面服务器集中到总公司。员工通过互联网接入自己的办公桌面,实现移动...
  • php OA办公系统源码,官方完整版10万块源码,现在共享,一键安装,window桌面_普通桌面
  • 系列二:系统的软件功能结构设计以及开发平台开发进度等的介绍
  • 摘 要:针对便携式移动办公的需求,提出了USB 接口的移动存储设备上构建Linux 微型桌面操作系统的方法,分析了整个微型桌面系统的构成,并对构建过程的内核编译、LFS、Squashfs、AUFS、Grub、Initrd、XFCE等关键...
  • 50用户小企业办公桌面云方案

    万次阅读 多人点赞 2018-06-26 14:59:22
    公司决定建设桌面系统替代PC办公。目前市场上的桌面系统主要分为三类:1)拥有独立桌面协议的厂家,如 Citrix、VMware、微软、华为等。这些厂家的特点是有自己的桌面协议,以软件的形式销售桌面虚拟化系统,解决...
  • 桌面办公方案功能简介,云桌面是采用最新的虚拟化技术开发出的一款新型PC 解决方案,它是物理服务器上模拟出虚拟电脑主机,用来替代传统的物理电脑主机运行“操作系统”和“应用软件”,用户可任何有网络的...
  • 换装Linux桌面办公——中标普华Linux桌面2.0版办公应用秀.pdf
  • 由于VMware虚拟化企业虚拟化,用户基础最广泛,估计有超过50%的企业使用了VMware的服务器虚拟化。 因此,基于VMware搭建桌面云(Horizon)也不少数,但是Horizon相对服务器虚拟化来说,其复杂程度高一两个...
  • Linux 桌面系统

    千次阅读 2016-08-30 14:19:00
    简述简单来说,图形界面...Linux发行版提供了相应的桌面系统以方便用户使用,用户可以利用鼠标来操作系统,而且GUI也很友好。Linux桌面环境很多,例如:KDE、GNOME、MATE、Cinnamon、Unity。。。其中,KDE、GNOME最为常
  • 我们通过Horizon系统,IT部门可以数据中心部署虚拟化环境,并将这些环境交付给员工使用。 最终用户可以获得熟悉的个性化环境,并且可以企业或家庭网络的任何地方访问此环境。 将桌面数据全部至于数据中心,...
  • 酷桌面移动办公桌面功能是为满足员工使用iPad用Windows桌面办公设计的。 特点: 1.酷桌面,办公不受苹果所限,移动办公打开熟悉的Windows;桌面在云端,应用在云端,所有软件和操作都在云端桌面,安全保障;IOS手写...
  • 桌面Linux国内日常办公应用的前景探析.pdf
  • CentOS 8构建桌面办公环境

    千次阅读 2020-10-28 23:26:44
    我们可以看看CentOS的桌面环境,有各种菜单命令,比如应用程序菜单,系统菜单等等,添加、删除软件也比较直观,容易操作,打开一个应用程序,下面有类似WIndows的任务栏。整个操作习惯来说,对习惯Windows操作的人员...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,653
精华内容 13,861
关键字:

在桌面办公系统中