Save函数

Save函数负责保存表单内容,包括订单和订单明细,其代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

Dim e As RequestEventArgs = args(0)
'
保存订单
Dim
dr As DataRow = DataTables("订单").SQLFind("订单编号='" & e.PostValues("订单编号") & "'")
Dim
nms() As String = {"客户","日期"}  '""
If
dr IsNot Nothing Then
    For Each nm As String In nms
        If e.PostValues.ContainsKey(nm) Then
            dr(nm)= e.PostValues(nm)
        End If
   
Next

End
If
dr
.Save()
'
保存明细
Dim
valid As Boolean '用于判断用户是否 输入了订单明细数据
nms
= New String() {"产品","数量","单价" }
For
Each nm As String In nms
    If e.PostValues.ContainsKey(nm) Then
        valid = True
'
如果 输入了订单明细数据,valid变量设置为True
    End
If

Next
If
valid Then '如果提交了订单明细数据
    Dim sr As DataRow
    If e.PostValues.ContainsKey("DetailID") Then
'
如果传递了订单明细主键
        sr = DataTables(
"
订单明细").SQLFind("[_Identify]=" & e.PostValues("DetailID"))
        If sr Is Nothing  Then 
'
多用户环境,必须考虑其他用户删除此明细的可能,避免程序报错
            Return ""
        End If
    Else
        sr = DataTables(
"
订单明细").SQLAddNew() '增加一个订单明细
        sr(
"
订单编号") = dr("订单编号")
    End If
    For Each nm As String  In nms
        sr(nm) = e.PostValues(nm)
    Next
    sr.Save() 
'
必须保存,而且必须在最后保存,因为用SQLAddNew增加的行,一旦保存,就不能再引用此行
End If

上述代码很好理解,只是需要注意第23行代码,通过判断PostValues集合中是是否包括DetailID,来判断出用户是编辑明细,还是新增明细。
你要是不记得DetailID是怎么来的,请回头看一下Edit函数的代码。
另外代码还采取了措施,避免保存空的订单明细,用户必须给订单明细至少输入一列的内容,此明细才会被保存。

SQLAddNew和主键

用SQLAddNew增加行的时候,并没有真正在后台数据库增加行,直到用代码保存此行,此行才会写入后台数据库,保存之后,此行不能再访问。
这带来一个问题,如果表使用的是自动增量型主键,那么行的主键只能在保存后生成,但是SQLAddNew增加的行在保存后又无法再访问,所以我们是无法获取新增行的主键 值。
如果你需要获取行的主键,请使用DataTable的AddNew方法增加行,保存之后,会自动生成行的主键,还可以继续访问此行,获取包括主键在内的所有列的数据。
 


本页地址:http://www.foxtable.com/mobilehelp/topics/0134.htm