写薪资计算心得
做薪资录入功能心得;
知识点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映射);
浙公网安备 33010602011771号