前几天在做结账的时候,对数据表DataGridView控件的单列求和纠结了一番。

       如今差点儿养成了习惯,对于一些东西疏于開始的思考,不会先想到百度,这里我是先想到了第一版的机房收费那块的结账求和:

       截取了充值金额片段,代码例如以下:

'读取充值金额
strSQL = "select sum(addmoney) as AddCash from Recharge_Info where UserID='" & Trim(comboOperatorUsername.Text) & "'And date= '" & Format(Date, "yyyy-mm-dd") & "' And status= '" & "未结账" & "'having sum(addmoney) is not null"
Set mrcRecharge = ExecuteSQL(strSQL, MsgText)
If mrcRecharge.EOF = True Then
txtChargeCash.Text = 0
Else
txtChargeCash.Text = mrcRecharge("AddCash").Value '退卡金额
End If

仿照这个,開始我仅仅是简单地像个小白一样像以下这样写:

    strSql = "Select sum(T_Charge.addMoney) From T_Charge Where UserID=@UserID and Date=@Date and status='False'"
Dim parameters As SqlParameter() = {New SqlParameter("@UserID", chargeInfo.UserID),
New SqlParameter("@Date", chargeInfo.ReturnCardDate)} '给sql加入參数
dt = help.ExecuteSelectstrSql,CommandType.Text, parameters)

事实上開始自己也认为这样肯定是不行的,可是详细哪儿不正确?肯定是求和的sql语句!

        经过一番測试,果然不行,提示说“找不到addMoney列”

        于是自己開始茫然了,果断求度娘……

        因为不是亲生的,度娘没有给出想要的答案,差点儿都是和上边的一样。最后还得靠自己。

        经过断点调试,发现问题先从U层表现出来了。

        例如以下:txtChargeMoney.Text = dtAllChargeMoney.Rows(0)("addMoney").ToString()

        这里的txtChargeMoney.Text 收不到值。

        这次更加平静了些,理清思路,换了关键词,包括“VB.net、DatagridView、某列求和”,最终找出了Compute这个关键词!也是这个问题的关键点。

DataTable.Compute方法:

        计算用来传递筛选条件的当前行上的给定表达式。

        语法:Public Function Compute ( expression As String, filter As String ) As Object

        參数:

        expression  类型:System.String,要计算的表达式,能够理解为 “參数须要的聚合函数”。

        filter  类型:System.String,要限制在表达式中进行计算的行的筛选器,可理解为:filter 确定在表达式中使用哪些行。

        返回值  类型:System.Object

        Object ,设置为计算结果。 假设该表达式计算得出 Null,则返回值将为即为 DBNull.Value。

好了,依据以上信息,得出该sql语句应写成:

(D层)strSql = "Select T_Charge.addMoney From T_Charge Where UserID=@UserID and Date=@Date and status='False'"
(U层)txtChargeMoney.Text = dtAllChargeMoney.Compute("sum(addMoney)", "true").ToString()

那么,攻克了单列的求和问题,假设是两列运算之后再求和,该怎么办?如:列a项和列b项之和。

        我们想当然的会觉得:Compute("sum(a * b),但事实上这样是错的!

        正解:在这样的情况下,假定有一个名为“c”的 DataColumn,而且 Expression 属性设置为:"a * b"

        Compute 方法的表达式參数将为:Sum(c)。

小结:遇到问题还是要耐心找出关键点,编程不是一个“着急的活儿”。不断发现问题,解决这个问题,并扩展自己的知识,举一反三才是高速学习的有效途径之中的一个。

一步一步挖出Compute的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  3. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  4. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  5. 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

    阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...

  6. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  7. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  8. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper

    前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ...

  9. 【新手出发】从搭虚拟机开始,一步一步在CentOS上跑起来.Net Core程序

    文章背景 微软6月26号发布core 1.0版本后,园子里关于这方面的文章就更加火爆了,不管是从文章数量还是大家互动的热情来看,绝对是最热门的技术NO.1.我从去年底开始接触.net core到现在也 ...

随机推荐

  1. SetThreadAffinityMask设置线程亲缘性

    The SetThreadAffinityMask function sets a processor affinity mask for the specified thread. DWORD_PT ...

  2. Keli Linux与网络安全(1)——在VMWare中安装Keli系统

    Kali Linux是基于Debian的Linux发行版, 设计用于数字取证和渗透测试.由OffensiveSecurity Ltd维护和资助.最先由Offensive Security的Mati A ...

  3. sql 多条件查询 拼接字符串 改成 普通查询格式

    set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROC [dbo].[usp_SRV_CheckServiceDemandOrder] ) = ...

  4. Java NIO——2 缓冲区

    一.缓冲区基础 1.缓冲区并不是多线程安全的. 2.属性(容量.上界.位置.标记) capacity limit  第一个不能被读或写的元素 position  下一个要被读或写的元素索引 mark ...

  5. html系列教程--元素

    HTML 元素语法 HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容是开始标签与结束标签之间的内容 某些 HTML 元素具有空内容(empty content) 空元素在开始标签 ...

  6. sql server 存储过程、事务,增删改

    CREATE procedure [dbo].[sp_TableSave] @TypeID tinyint, -- 0 新增,1 修改,2 删除 @ID int, ), ), ), @UID int, ...

  7. 我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)

    也许你是只老鸟,也许你的程序编的很精,但是,在你的程序生活,你也许没有注意到一些“常识性”的问题,因为有些时候我们不需要去注意,我们的程序 照样能够运行得飞快,但是如果那天有一个无聊的人问你一个像这样 ...

  8. leetcode Letter Combinations of a Phone Number python

    class Solution(object): def letterCombinations(self, digits): """ :type digits: str : ...

  9. [poco] HttpRequest之post方法

    转自 http://www.cnblogs.com/yuanxiaoping_21cn_com/archive/2012/06/10/2544032.html #import <iostream ...

  10. day9_python学习笔记_chapter12_模块

    1. 名称空间加载顺序: 首先加载内建名称空间,他由__builtin模块中的名字构成.然后加载执行模块的全局名称空间,他会在模块开始执行后变为活动名称空间.如 果在执行期间调用了一个函数,那么将创建 ...