微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一步一步挖出Compute

前几天在做结账的时候,对数据表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)。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr