以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]网页版开发关于变量使用的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=147524)

--  作者:huangfanzi
--  发布时间:2020/3/18 18:46:00
--  [求助]网页版开发关于变量使用的问题
昨天因为在服务端用了全局变量来记录用户名导致多用户登录后用户名乱跳的问题,后经老师指导用了Cookie解决了,今天移动版正式让用户使用,服务端不停的报错,我突然想到是不是也是由于变量的使用引起的,请老师看下
手机上有个下单界面:

图片点击可在新窗口打开查看此主题相关图片如下:3.jpg
图片点击可在新窗口打开查看

当多用户几乎同时点下单时,在服务端几乎同时执行了以下代码,好多的变量,是不是我整个思路错了,还一直停留在之前电脑客户端上开发的状态,如果真错了,请老师告诉我应该如何处理,谢谢!
Dim e As RequestEventArgs = args(0)
Dim wb As New WeUI
Dim nms() As String
If e.PostValues("合同类型") = "常规" Then
    nms  = {"公司","工程名称","工程地点","浇注部位","开盘时间","混凝土标号","塌落度","浇注方法","计划方量","需方联系人","需方电话","业务员","业务员电话"} \'不能为空的列名数组,去除运输里程
Else
    nms = {"公司","工程名称","工程地点","浇注部位","开盘时间","混凝土标号","塌落度","浇注方法","计划方量","运输里程","需方联系人","需方电话","业务员","业务员电话"} \'不能为空的列名数组
End If

For Each nm As String In nms
    If e.PostValues.ContainsKey(nm) = False Then \'生成错误提示页
        With wb.AddMsgPage("","msgpage","下单失败", nm & "项目不能为空!")
            .icon = "Warn" \'改变图标
            .AddButton("btn1","返回").Attribute = ""
        End With
        e.WriteString(wb.Build)
        Return ""  \'必须返回
    End If
Next

Dim dr As DataRow = _dt生产任务通知.AddNew()
Dim dr1 As DataRow
dr1 = _dt销售合同.SQLFind("审核 = 1 And 合同 = \'" & e.PostValues("合同") & "\'")
If dr1 IsNot Nothing Then \'如果找到的话
    dr("代码") = dr1("代码")
Else
    With wb.AddMsgPage("","msgpage","下单失败", "意外错误,在销售合同中未找到需方代码,请与管理员联系")
        .icon = "Warn" \'改变图标
        .AddButton("btn1","返回").Attribute = ""
    End With
    e.WriteString(wb.Build)
    Return ""  \'必须返回
End If
dr("录入时间") = Date.Now
dr("录入人") = DecryptText(e.Cookies("username"),"123","123")
dr("发货单位") = "投资有限公司"
dr("接收站") = "投资有限公司"


Dim msg As String = Format(Date.today, "yyyyMMdd")
If scxdbh.ContainsKey(msg) Then \'如果存在这个类别的编号,scxdbh是字典,在全局代码中设置
    scxdbh(msg) = scxdbh(msg) + 1 \'将该类别最大编号加1
Else
    scxdbh.Add(msg,1) \'如果是这个列表的首次编号,则编号等于1
End If
dr("单号") = "SCXD-" &  Format(Date.today, "yyyyMMdd") & "-" &  Format(scxdbh(msg),"000")

nms = New String() {"合同类型","合同","公司","工程名称","工程地点","浇注部位","开盘时间","混凝土标号","塌落度","浇注方法","计划方量","运输里程","车辆及频率","需方联系人","需方电话","其它技术要求","备注","业务员","业务员电话"}  \'重新定义了nms数组,用于增加或减少列
For Each nm As String In nms
    If e.PostValues.ContainsKey(nm) Then
        dr(nm) = e.PostValues(nm)
    End If
Next

If e.PostValues("运输里程") >0 Then
    If e.PostValues("运输里程") >20 Then
        dr("里程单价") = 40 + (e.PostValues("运输里程") - 20) * 2
    ElseIf e.PostValues("运输里程") >10 Then
        dr("里程单价") = 40
    Else
        dr("里程单价") = 30
    End If
End If

\'保存并生成增加成功提示页面
dr.save()
With wb.AddMsgPage("","msgpage","下单成功", "单号:" & dr("单号")) \'生成成功提示页
    Dim htm As String
    If DecryptText(e.Cookies("username"),"123","123") = e.PostValues("业务员") Then
        htm = "Xd_jbxx.htm"
    Else
        htm = "Xd_jbxxplus.htm"
    End If
    .AddButton("btn1","继续下单",htm)
    .AddButton("btn2","返回首页","default.htm")
End With
e.WriteString(wb.Build)


--  作者:有点蓝
--  发布时间:2020/3/19 8:38:00
--  
报什么错误?有没有使用异步函数?
--  作者:huangfanzi
--  发布时间:2020/3/19 9:11:00
--  
昨天报错时,事发突然,为了不影响客户使用,急忙把云服务器上的报错窗口给关了,然后又能用了,后面又报过一次错,又关了,然后就不敢用手机下单了,继续用电脑客户端下单,今天会让客户做个压力测试,叫几人同时下单,到时仔细看看报错内容
我没有用什么异步函数,我现在担心的是整个编程思路错了
我是担心这个问题,因为这些变量在服务器,当A用户执行代码到这一步:
Dim dr As DataRow = _dt生产任务通知.AddNew()
Dim dr1 As DataRow
dr1 = _dt销售合同.SQLFind("审核 = 1 And 合同 = \'" & e.PostValues("合同") & "\'")
If dr1 IsNot Nothing Then \'如果找到的话
    dr("代码") = dr1("代码")

假定这时的合同编号是001,这时,几乎在下一个瞬间,B用户也下单了,他的合同号是002,当A用户继续向下执行代码时,这时A用户的代码中合同号还是001吗?会不会变成002
如果我的编程思路没错,哪就可能某些代码写的不规范,仔细找出来就是了,如果思路错了,哪之前的一个月白费了
[此贴子已经被作者于2020/3/19 9:12:06编辑过]

--  作者:chen37280600
--  发布时间:2020/3/19 9:16:00
--  回复:(huangfanzi)昨天报错时,事发突然,为了不影...
服务器端,请使用SqlAddNew。普通的AddNew,会在联动table的变化。A新建了一行,当前焦点是A,B再新建,那焦点就去了第二行。

如果你的table没有currentChange事件,这个视图里的table行变动,不会对你当前的dr有影响,就不会报错。

但是服务器新增行,不应该与视图table挂钩,否则服务器会不断闪烁加载新行,最终table数量过多内存爆掉。应该用SqlAddNew

--  作者:有点蓝
--  发布时间:2020/3/19 10:03:00
--  
回3楼,函数内部定义的变量是不会有任何冲突的。

_dt销售合同这种表格是怎么生成的?

--  作者:huangfanzi
--  发布时间:2020/3/19 10:21:00
--  
项目事件Initialize
Dim cmd_产品销售合同 As New SQLCommand
cmd_产品销售合同.C
cmd_产品销售合同.CommandText = "S elect * From {产品销售合同} Where [_Identify] Is Null"
_dt产品销售合同 = cmd_产品销售合同.ExecuteReader()

--  作者:chen37280600
--  发布时间:2020/3/19 10:33:00
--  
_dt产品销售合同 = cmd_产品销售合同.ExecuteReader(True) 才可以编辑和保存

版主,其实我有个好奇的事情,我把表通过 .ExecuteReader()临时加载出来后,能对这个dt进行.SQLFind吗?

帮助里只写了可以对加载出来的临时dt里的行修改并保存,并没有说再次使用sqlfind找出未加载到本地的行,再进行编辑保存,会怎样。


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看



[此贴子已经被作者于2020/3/19 10:38:15编辑过]

--  作者:huangfanzi
--  发布时间:2020/3/19 10:37:00
--  
我不用编辑销售合同,只是查找数据后再写入 生产通知表,这个表的加载是有 TRUE的
另外,用SQLFIND本来就是后台查找没加载的记录,你如果已经加载了,哪就用FIND了
[此贴子已经被作者于2020/3/19 10:38:25编辑过]

--  作者:chen37280600
--  发布时间:2020/3/19 11:01:00
--  
我是想问官方是否承认这种用法。因为非官方承认的奇怪用法,有时候当前版本能,但是狐表升级后就会出问题。大规模商用,不能用官方不承认不维护的偏门方法
--  作者:有点蓝
--  发布时间:2020/3/19 11:26:00
--  
可以使用的。但是如果要保存,必须.ExecuteReader(true),才可以