写薪资计算心得

做薪资录入功能心得;

知识点1:在填充gridcontrol时候动态产生列;

在做这个动态产生列的时候,我遇到的问题是,前面上个栏位依次是:员工编号、员工姓名、部门名称,这

三个栏位是固定的,然后后面的工资科目就是不固定的了,这个栏位是从另外一张表中取出来的数据:

但是想的有两种方法:

第一种方法是:在数据库中返回一个数据集,使用 pivot 进行行列转换;

第二种方法是:在程式的数据层进行处理,创建一个零时表。然后创建零时表结构;

最后选择了第二种方法,代码如:

            if (!this.Tables.Contains(TEMP_TABLE_NAME))

            {

                DataTable tempTable = new DataTable(TEMP_TABLE_NAME);

                foreach (DataColumn column in this.WageTemps.Columns)

                {

                    DataColumn dataColumn = new DataColumn();

                    dataColumn.DataType = typeof(string);

                    dataColumn.Caption = column.Caption;

                    dataColumn.ColumnName = column.ColumnName;

                    tempTable.Columns.Add(dataColumn);

                }

                WageDataSet.WageSubjectsRow[] rows = (WageDataSet.WageSubjectsRow[])

WageDataSet.GetCacheData().WageSubjects.Select();

                foreach (WageDataSet.WageSubjectsRow row in rows)

                {

                    DataColumn dataColumn = new DataColumn();

                    dataColumn.DataType = typeof(decimal);

                    dataColumn.Caption = row.Name;

                    dataColumn.ColumnName = row.ID.Trim();

                    tempTable.Columns.Add(dataColumn);

                }

                this.Tables.Add(tempTable);

            }

知识点2:动态向临时表中填充数据;

其实就是两件事情,第一件事情是:找到涉及公式计算的中的员工,第二件事情就是此员工包含哪些科目,

两个foreach 嵌套插入零时表中。公式代码大致如下:

employeeTable = EmployeeDataSet.EmployeesForSearchDataTable.GetByWageSetEmployees(row.ID);

                foreach (EmployeeDataSet.EmployeesForSearchRow employeeRow in employeeTable)

                {

                    string employeeId = employeeRow.EmployeeID;

                    DataRow newRow = tempTable.NewRow();

                    newRow["EmployeeID"] = employeeId;

                    newRow["EmployeeName"] = employeeRow.EmployeeName;

                    newRow["DepartmentID"] = employeeRow.DepartmentID;

                    newRow["DepartmentFullName"] = employeeRow.DepartmentFullName;

                    WageDetailsRow[] wageDetailRows =

                        (WageDetailsRow[])this.WageDetails.Select(string.Format

("EmployeeID='{0}'", employeeId));

                    foreach (WageDetailsRow wageDetailRow in wageDetailRows)

                    {

                        string column = wageDetailRow.WageSubjectID.Trim();

                        newRow[column] = wageDetailRow.Amount.ToString

(Configurations.NumberPrecision);

                    }

                    tempTable.Rows.Add(newRow);

                }

知识点3:动态产生左键菜单;

做左键菜单的时候,使用了devexpress的两个控件:BarManager、PopupMenu

使用MouseUp 叫起事件,然后在每一个列中注册事件ItemClick,代码如下:

        private void AddBarItem(string value, string caption)

        {

            BarButtonItem btnBar = new BarButtonItem();

            btnBar.Caption = caption;

            btnBar.Id = 0;

            btnBar.Name = string.Format("btnBar");

            btnBar.Tag = value;

            btnBar.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler

(this.btnItem_Click);

            this.barManager1.Items.Add(btnBar);

            popupMenu1.AddItem(btnBar);

        }

知识点4:产生单据号;

/// <summary>

        /// 取得单据号

        /// </summary>

        /// <param name="type"></param>

        /// <returns></returns>

        public virtual string GetVoucherNo(VoucherType type)

        {

            MiscDataSet.VoucherTypesDataTable voucherTypes = 

MiscDataSet.GetCachedVoucherTypesDataTable();

            MiscDataSet.VoucherTypesRow row = voucherTypes.FindByVoucherTypeID(type.ToString

());

            if (row == null)

                throw new ArgumentException(String.Format("单据类型:{0}不存在", type), 

"type");

            string separator = row.Separator.Trim();

            if (string.IsNullOrEmpty(separator))

                separator = "-";

            string timeMask = row.TimeMask.Trim().Replace("-", separator);

            // 1. 根据类型 (VoucherType,计算本日应起头的单据号 如 IB-11-08-19) 得到类型编号头

            string timeString = DateTime.Now.Date.ToString(timeMask); // 取得类似 11-08-19 的资

            string voucherNoHeader = string.Format("{0}{1}{2}", row.Header.Trim(), separator, 

timeString);

            // 2. 传入类型编号头到数据库

            // 3. 数据库回传符合类型编号头的数据最大值,或是空值

            string currentMaxID = MiscDataSet.GetVoucherNo(type, voucherNoHeader);

            // 4. 如果是空值,则预设产生 类型编号头 以及 - new string('0', IDLength)

            if (string.IsNullOrEmpty(currentMaxID))

                currentMaxID = string.Format("{0}{1}{2}", voucherNoHeader, separator, new 

string('0', row.IDLength));

            AlphaNumeric.RequiredLength = currentMaxID.Length;

            string maxID = AlphaNumeric.NextKeyCode(currentMaxID, SequenceType.AlphaNumeric);

            return maxID;

        }

知识点5:提交、作废、删除、反作废、审核、反审核;

知识点6:工资科目动态显示;

先把所有的栏位都显示出来,然后把其中要显示的栏位显示出来。

在做的过程当中,遇到了一个问题,在对gridview 中栏位visible设置为false的时候,再次将此栏位

visible设置为true的时候,此?Column还是不显示出来,最后发现没有设置visibleIndex属性。

gridView1.Columns[row.ID.Trim()].VisibleIndex = i++;

                    gridView1.Columns[row.ID.Trim()].Visible = true;

知识点7:用CodeDom做个动态编译;

知识点8:薪资计算(Assembly映射);

posted @ 2011-10-14 22:05  柳叶弯刀  阅读(403)  评论(1)    收藏  举报