回顾与说明
前面我就用了大量的篇幅我讲解了“商品入库”模块,在商品入库模块之中,我们介绍 了与之相关的管理信息系统开发中的一个共性场景,以及这个应用场景中所涉及的缓存、业务处理、票据打印等相关的技术。
可以说,在WinForm篇中的示例代码之中,最有价值的模块就是“商品入库”,在真实的MIS应用场景中,有至少60%的应用与“商品入库”类似。
本文的内容
我们通过“商品入库模块”完成了商品的库操作,系统会写入数据库商品入库明细和商品库存信息,那么这些信息如何查呢,我们得提供“库存信息查询”和“入库记录查询”两个模块。
本文将详细的介绍“库存信息查询”模块实现过程,“库存信息查询”要实现的功能为:根据用户的输入码(拼音简码)和查询选项(是否显示零库存记录)查询商品库存信息(库存表)并显示在界面上,操作员也可以选择把查询结果打印出来。
制做界面
首先,我们需要在UI项目中增加一个WinForm窗体StoreQueryForm拖动控件达到如下效果:
处理查询
接下来我们编写查询相关的代码,先在数据层接口项目中的IProductStoreList的分部类定义IProductStoreList.cs文件中增加如下代码:
1: /// <summary>
2: /// 表接口 IProductStoreList(产品库存)。
3: /// </summary>
4: public partial interface IProductStoreList
5: {
6: /// <summary>
7: /// 查询商品库存。
8: /// </summary>
9: /// <param name="pyCode">拼音码。</param>
10: /// <param name="showZero">是否显示零库存记录。</param>
11: void GetProductStoreList(string pyCode,bool showZero);
12: }
1: public void GetProductStoreList(string pyCode, bool showZero)
2: {
3: Condition condition = this.CreateCondition();
4:
5: if (pyCode.Length > 0)
6: {
7: condition.AddElement("SqlText", "CODE in (select CODE from dbo.PRODUCT where PYCODE like '" + pyCode + "%')", ElementType.SqlCondition);
8: }
9:
10: if (!showZero)
11: condition.AddElement("NUMBER", 0, ElementType.GreaterThan);
12:
13: condition.AddOrderElement("CODE");
14: condition.AddOrderElement("IDN", true);
15: this.Query(condition);
16: }
大家在这地方仔细看一下,因为在商品库存表中没有定义产品的拼音简码,所以我就使用了一个字查询,并以SQL条件的形式写了出来,在实现应用中,应该在产品库存表中增加拼音简码字典,以方便查询。
1: private void btnSearch_Click(object sender, EventArgs e)
2: {
3: IProductStoreList table = DALHelper.DALManager.CreateProductStoreList();
4: table.GetProductStoreList(this.tbSearch.Text, this.cnZero.Checked);
5:
6: decimal sumMoney = decimal.Zero;
7:
8: try
9: {
10: this.Cursor = Cursors.WaitCursor;
11: this.lvInfo.Tag = table;
12:
13: this.lvInfo.BeginUpdate();
14: this.lvInfo.Items.Clear();
15:
16: foreach (IProductStore ps in table.Rows)
17: {
18: decimal money = ps.Price * ps.Number;
19: sumMoney += money;
20: ListViewItem item = new ListViewItem(new string[] { string.Empty, ps.Code, ps.Name, ps.Spec, ps.Unit, ps.Price.ToString("F2"), ps.Number.ToString(), money.ToString("F2") }, 0);
21: this.lvInfo.Items.Add(item);
22: }
23:
24: }
25: finally
26: {
27: this.lvInfo.EndUpdate();
28: this.Cursor = Cursors.Default;
29: }
30:
31: this.lblTip.Text = "汇总:共有记录" + table.Rows.Count + "条,总金额" + sumMoney .ToString("F2")+ "元";
32: }
到这一步,我们就完成了数据查询并且显示在界面上的需求,下一步完成打开导出。
处理打印
把制作好的报表保存在编译目标目录中的Reports文件夹中并取名为商品库存查询报.rdl。
接下来我们修改程序,把报表挂载进来,编写“打印预览”按钮的事件处理代码:
1: private void btnPrint_Click(object sender, EventArgs e)
2: {
3: if (this.lvInfo.Items.Count == 0)
4: {
5: MessageBox.Show("没有需要打印的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
6: return;
7: }
8:
9: if (this.printForm == null)
10: this.printForm = new RDLViewDialog();
11:
12: //
13: System.IO.TextReader textReader = null;
14: try
15: {
16: string fileName = Path.Combine(Application.StartupPath, "Reports\\商品库存查询报表.rdl");
17: textReader = new System.IO.StreamReader(fileName);
18: this.printForm.SourceRdl = textReader.ReadToEnd();
19: }
20: finally
21: {
22: if (textReader != null)
23: textReader.Close();
24: }
25:
26: this.printForm.DataObject = this.lvInfo.Tag;
27: this.printForm.PrintPreview();
28: }
修改程序,控制打印
打印预览:有关本例所涉及的数据表结构请参考一文,有关数据对象模型定义文件、文档、DDL脚本请下载:,本例完整代码下载:。