以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  查询表直接操作  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=42239)

--  作者:bm
--  发布时间:2013/11/6 19:42:00
--  查询表直接操作

哪位高手帮忙优化下代码。Tables("窗口1_Table3")是查询表。(二个表查询的)

Tables("窗口1_Table3").Fill("Select {车辆费用}.[_Identify],业务编号,客户,{车辆费用}.作业日期,关单号,{车辆费用}.箱型箱量,[流向_提箱点],[流向_门点],[流向_还箱点],支出项目,金额,收款人,{车辆费用}.审核号,{车辆费用}.审核日期,审核 From {业务大表} Inner JOIN {车辆费用} ON {车辆费用}.[业务编号] = {业务大表}.[编号] WHERE {车辆费用}.[_Identify] Is Null","ZHANG",True)
总感觉这么做属于非主流。

 

If e.form.controls("收款人").value = "" Then
     messagebox.show("请输入或选择收款人.")
    Return
End If
If Tables("窗口1_Table3").Current Is Nothing Then
MessageBox.Show("无数据!")
Return
End If
Dim sum As Double = Tables("窗口1_Table3").Compute("Sum(金额)")
  Dim Result As DialogResult
  Result = MessageBox.Show("确认审核.金额为" & sum, "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
   If Result = DialogResult.Yes Then
    Dim drs As List(Of DataRow) = DataTables("窗口1_Table3").Select("")
         For Each dr As DataRow In drs
           Dim zn As String = dr("审核")
           If  zn =True Then
             MessageBox.Show("包含已审核,审核失败.")
            Return
            Exit For
           End If
         Next
      
       Tables("已审核费用").Filter = ""
       Tables("已审核费用").Sort = ""
       With Tables("已审核费用")
         .Position = .Rows.Count - 1
       End With

         Dim d As Date = Date.Today
         Dim y As Integer = d.Year
         Dim m As Integer = d.Month
         Dim Days As Integer = Date.DaysInMonth(y,m)
         Dim fd As Date = New Date(y,m,1)
         Dim ld As Date = New Date(y,m,Days)
         Dim bh As String = "CL" & Format(d,"yyMM")
         Dim idx As Integer
         Dim max As String
         Dim dr8 As DataRow = DataTables("编号").DataRows(0)
         max = dr8("车辆审核号")
         If  max > "" Then
             If max.StartsWith(bh) Then
             idx = CInt(max.Substring(6,3)) + 1
             Else
             idx = 1
             End If
          Else
             idx = 1
          End If
            dr8("车辆审核号")=bh & Format(idx,"000")
            dr8.save()
            Dim r As Row = Tables("已审核费用").AddNew
            r("审核号") = dr8("车辆审核号")
            r("类别")= "支出"
            r("审核金额")= sum
            r("摘要")= "出车费运费及代付费用"
            r("科目")= "业务支出"
            r("收付款人")= e.form.controls("收款人").value
            r.Save()
    Dim ids As String
    For Each dr1 As DataRow In DataTables("窗口1_Table3").DataRows
        ids = ids & "," & dr1("_Identify")
            dr1("审核") = True
            dr1("审核号")= r("审核号")
            dr1("审核日期") = Date.Today
    Next
    ids= ids.Trim(",")
    Dim dt1 As DataTable
    Dim cmd1 As New SQLCommand
    cmd1.C
    cmd1.CommandText = "Select [_Identify],审核,审核号,审核日期 From {车辆费用} Where [_Identify] In (" & ids & ")"
    dt1 = cmd1.ExecuteReader(True)
    For Each d2 As DataRow In dt1.DataRows
    d2("审核") = True
    d2("审核号")= r("审核号")
    d2("审核日期") = Date.Today
    Next
    dt1.Save()
   End If


--  作者:有点甜
--  发布时间:2013/11/6 20:00:00
--  
 无从下手图片点击可在新窗口打开查看
--  作者:bm
--  发布时间:2013/11/6 20:35:00
--  希望再看看

就是 表a 是要进行批量操作的。表b不需要。

但是只看表a不完整。

SQLTable只能是一个表生成(但是如果用一个表内容不完整),所以只能用SQLQuery

但是SQLQuery是不能保存的。

所以

第一步,只能通过代码生成SQLQuery(这样看的就比较清楚)

第二部,批量操作代码生成的SQLQuery。(但是只是表面操作成功了。)

第三部,通过批量操作SQLCommand,改变数据库。(根据表a的[_Identify]列)

这样做是不是太繁琐。有没有更好的办法


--  作者:bm
--  发布时间:2013/11/6 20:39:00
--  用了一段时间没有出现错误
但是感觉相当非主流。能不能有其他办法
[此贴子已经被作者于2013-11-6 20:39:37编辑过]

--  作者:有点甜
--  发布时间:2013/11/6 20:51:00
--  
为什么一定要连接两个表?一个表A,一个关联表表A.表B,这样也基本满足需求的。

如果要用查询表,保存只能是自己取值和保存值了。

--  作者:bm
--  发布时间:2013/11/6 20:54:00
--  

用关联表也可以生成SQLTable的吗?

批量操作有很多条的。一个一个太麻烦了

 

[此贴子已经被作者于2013-11-6 20:56:10编辑过]

--  作者:有点甜
--  发布时间:2013/11/6 20:58:00
--  
 表A和表B,数据才完整。表A表B关联以后,数据不也就完整了么。虽然这样显示不太直观,但操作方便。
--  作者:bm
--  发布时间:2013/11/6 21:04:00
--  

如果表b有100多条,表a只有10几条。表a不要操作。表b全部要操作。那不是相当麻烦而且是要批量的奥。

而且还要

Tables("已审核费用").Filter = ""
       Tables("已审核费用").Sort = ""
       With Tables("已审核费用")
         .Position = .Rows.Count - 1
       End With

         Dim d As Date = Date.Today
         Dim y As Integer = d.Year
         Dim m As Integer = d.Month
         Dim Days As Integer = Date.DaysInMonth(y,m)
         Dim fd As Date = New Date(y,m,1)
         Dim ld As Date = New Date(y,m,Days)
         Dim bh As String = "CL" & Format(d,"yyMM")
         Dim idx As Integer
         Dim max As String
         Dim dr8 As DataRow = DataTables("编号").DataRows(0)
         max = dr8("车辆审核号")
         If  max > "" Then
             If max.StartsWith(bh) Then
             idx = CInt(max.Substring(6,3)) + 1
             Else
             idx = 1
             End If
          Else
             idx = 1
          End If
            dr8("车辆审核号")=bh & Format(idx,"000")
            dr8.save()
            Dim r As Row = Tables("已审核费用").AddNew
            r("审核号") = dr8("车辆审核号")
            r("类别")= "支出"
            r("审核金额")= sum
            r("摘要")= "出车费运费及代付费用"
            r("科目")= "业务支出"
            r("收付款人")= e.form.controls("收款人").value
            r.Save()
    Dim ids As String
 

[此贴子已经被作者于2013-11-6 21:07:09编辑过]

--  作者:bm
--  发布时间:2013/11/7 0:18:00
--  
简单点讲。就是直接在查询表编辑数据(只是为了看到)。然后通过SQLCommand。直接改变后天数据。可行伐。会不会容易造成错误。有没有其他方法
--  作者:狐狸爸爸
--  发布时间:2013/11/7 8:35:00
--  

如果不想写SQL语句来保存修改,那么表A、表B和查询表都加载,将查询表的AllowEdit属性设置为True,设置查询表的DataColchanged事件,捕获用户所做的修改,然后在表A、表B中找出对应的行写入用户做出的修改,最后保存表A和表B即可。