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
详细错误信息:
未将对象引用设置到对象的实例。