-- 作者:xywl
-- 发布时间:2017/5/4 15:00:00
-- 在Ctrl进入项目时应用窗口无错,正常进入时窗口事件报错
Dim lj As String = e.Form.Controls("TextBox1").value If lj = "" Then MessageBox.Show("请选择要导入的Excel文件,暂时仅支持2003版!", "错误提示", MessageBoxButtons.Ok, MessageBoxIcon.Warning) e.Sender.Enabled = False Return End If If MessageBox.Show("确定要导入商品数据吗?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = 1 Then Dim mg As New Merger mg.SourcePath = lj mg.Format = "excel" \'指定格式 mg.SourceTableName = "个人$" \'指定要合并的表 mg.DataTableName = "个人出库导入" \'指定接收数据的表 mg.Merge() Dim s2 As Integer = 0 For Each r As Row In Tables("个人出库导入").Rows Dim d1 As Row = Tables("当天出库").AddNew() d1("商品编号") = r("ProductCode") d1("订单编号") = r("订单编号") d1("数量") = r("OrderQty") d1("单价") = r("UnitPrice") d1("总价") = r("TotalPrice") d1("收货地址") = r("收货地址") d1("收货人电话") = r("收货人电话") d1("收货人") = r("收货人") d1("出库日期") = Date.today \'d1("可用库存") = r("入库数量") \'d1("提醒数量") = Tables("系统设置").Current("库存提醒数量") \'d1("提醒天数") = Tables("系统设置").Current("到期提醒天数") s2 = s2 + 1 Next For Each dr As Row In Tables("当天出库").Rows If dr("库位") = "" Then Dim d1 As DataRow = DataTables("商品库存").Find("Item = \'" & dr("商品编号") & "\'") If d1 IsNot Nothing Then dr("中文名称") = d1("ChineseBrand") dr("中文描述") = d1("ChineseDescription") End If If d1("可用库存") >= dr("数量") Then d1("可用库存") = d1("可用库存") - dr("数量") d1("实时库存") = d1("实时库存") - dr("数量") d1("待发库存") = d1("待发库存") + dr("数量") dr("可用库存") = d1("可用库存") \'If dr("可用库存") >= 0 Then Dim d2 As DataRow = DataTables("商品库存明细").Find("货品编号 = \'" & dr("商品编号") & "\' and 可用库存 >= " & dr("数量")) If d2 IsNot Nothing Then dr("库位") = d2("货格") d2("可用库存") = d2("可用库存") - dr("数量") d2("实时库存") = d2("实时库存") - dr("数量") d2("待发库存") = d2("待发库存") + dr("数量") dr("剩余库存") = d2("可用库存") \'dr("可用库存") = d1("可用库存") dr("数量") = dr("数量") Else Dim count As Integer = 0 Dim drs As List(Of DataRow) = DataTables("商品库存明细").Select("货品编号 = \'" & dr("商品编号") & "\' AND 可用库存 > 0", "生产日期, _Identify") Dim s As String = "" Dim coun As Integer For i As Integer = 0 To drs.count - 1 Dim dw As DataRow = drs(i) count + = dw("可用库存") Dim sy As Integer = count - dr("数量") \'s &= dw("货格") & "," If sy >= 0 Then coun = i Exit For End If Next \'dr("库位") = s.trim(",") Dim cun As Integer = 0 For j As Integer = 0 To coun Dim dj As DataRow = drs(j) If j = 0 Then dj("可用库存") = dj("可用库存") - dj("可用库存") dj("实时库存") = dj("实时库存") - dj("可用库存") dj("待发库存") = dj("待发库存") + dj("可用库存") dr("库位") = dj("货格") dr("剩余库存") = dj("可用库存") dr("可用库存") = d1("可用库存") dr("数量") = dj("可用库存") cun += dj("可用库存") ElseIf j < coun AndAlso j > 0 Then Dim d3 As Row = Tables("当天出库").AddNew() d3("商品编号") = dr("ProductCode") d3("订单编号") = dr("订单编号") \'d3("数量") = dr("OrderQty") d3("单价") = dr("UnitPrice") d3("总价") = dr("TotalPrice") d3("收货地址") = dr("收货地址") d3("收货人电话") = dr("收货人电话") d3("收货人") = dr("收货人") d3("出库日期") = Date.today dj("可用库存") = dj("可用库存") - dj("可用库存") dj("实时库存") = dj("实时库存") - dj("可用库存") dj("待发库存") = dj("待发库存") + dj("可用库存") d3("库位") = dj("货格") d3("剩余库存") = dj("可用库存") d3("可用库存") = d1("可用库存") d3("数量") = dj("可用库存") cun += dj("可用库存") s2 = s2 + 1 ElseIf j = coun Then Dim d4 As Row = Tables("当天出库").AddNew() d4("商品编号") = dr("ProductCode") d4("订单编号") = dr("订单编号") \'d4("数量") = dr("OrderQty") d4("单价") = dr("UnitPrice") d4("总价") = dr("TotalPrice") d4("收货地址") = dr("收货地址") d4("收货人电话") = dr("收货人电话") d4("收货人") = dr("收货人") d4("出库日期") = Date.today dj("可用库存") = dj("可用库存") - (dr("数量") - cun) dj("实时库存") = dj("实时库存") - (dr("数量") - cun) dj("待发库存") = dj("待发库存") + (dr("数量") - cun) d4("库位") = dj("货格") d4("剩余库存") = dj("可用库存") d4("可用库存") = d1("可用库存") d4("数量") = dr("数量") - cun End If Next End If Else dr("剩余库存") = "" dr("可用库存") = "" dr("库位") = "库存不足" End If End If Next DataTables("当天出库").Save() DataTables("商品库存").Save() DataTables("商品库存明细").Save() MessageBox.Show("导入成功!本次导入了 " & Tables("当天出库").Compute("Sum(数量)") & " 个商品数量,其中新增了 " & s2 & " 种新商品!") With DataTables("个人出库导入") .DataRows.Clear() \'清除所有行 End With DataTables("个人出库导入").Save() e.Form.Controls("TextBox1").value = Nothing e.Form.Controls("Button5").Enabled = False End If
以上代码目的是:导入外部数据时先写入在遍历《当天出库》每一行,假如库位为空,则在《商品库存》中找到这一行 赋值中文名称和中文描述,假如该行<可用库存>大于等于<数量> 则可用库存和实时库存扣减,并把<数量>写入到待发库存。并在《商品库存明细》中找该货品编号而且可用库存大于等于<数量> 找到就把该库位赋值给当前遍历行,再扣减《商品库存明细》中的可用库存和实时库存,并把<数量>写入到待发库存。
如果找不到符合条件的,则遍历商品库存明细中所有该货品编号的行,把可用库存相加,直到所加的总数大于等于<数量> ,再拆分取得这些行,当《当天出库》所遍历行需要《商品库存明细》中若干个库位同时出货才能满足出货时,假如是三个库位同时出货,那么第一个库位和第二个库位有多少库存就出多少库存 (所遍历的《商品库存明细》行按生产日期排序),第三个库位出货等于<数量>- 第一第二个库位所出货量的总和。
等于说原本的《当天出库》中只有一行,现在变成了三行,所以在遍历到第二个库位时,《当天出库》增加一行,并且数量等该库的可用库存,到第三个库位时,再增加一行,数量等于<数量>- 前两库已经出的库存。
这么做,主要是想在删除时把待发的数量还回去。就是下面的代码:
If Tables("商品出库_table1").Current("商品编号") IsNot Nothing AndAlso Tables("商品出库_table1").Current("库位") <> "库存不足" Then Dim dr As DataRow = DataTables("商品库存").Find("Item = \'" & Tables("商品出库_table1").Current("商品编号") & "\'") If dr IsNot Nothing Then dr("可用库存") = dr("可用库存") + val(Tables("商品出库_table1").Current("数量")) dr("实时库存") = dr("实时库存") + val(Tables("商品出库_table1").Current("数量")) dr("待发库存") = dr("待发库存") - val(Tables("商品出库_table1").Current("数量")) End If Dim dr1 As DataRow = DataTables("商品库存明细").Find("货品编号 = \'" & Tables("商品出库_table1").Current("商品编号") & "\' and 货格 = \'" & Tables("商品出库_table1").Current("库位") & "\' ") If dr1 IsNot Nothing Then dr1("可用库存") = dr1("可用库存") + val(Tables("商品出库_table1").Current("数量")) dr1("实时库存") = dr1("实时库存") + val(Tables("商品出库_table1").Current("数量")) dr1("待发库存") = dr1("待发库存") - val(Tables("商品出库_table1").Current("数量"))
DataTables("商品库存").Save() DataTables("商品库存明细").Save() Tables("商品出库_table1").Current.Delete DataTables("当天出库").Save()
我在ctrl进入项目时,应用窗口测试是正常的,但是正常进入 ,导入时就会报错,我把Bin删了也是一样,报.NET Framework 版本:2.0.50727.5485 Foxtable 版本:2017.3.18.1 错误所在事件:窗口,出库导入,Button2,Click 详细错误信息: 未将对象引用设置到对象的实例。
|