注册 登录
编程论坛 VB6论坛

求助:利用VB代码,按照记录先后顺序统计数据

时间旅行者 发布于 2017-07-19 19:41, 3003 次点击
mf1   为显示控件MSFlexGrid名称
db_sjk.mdb  为access数据库
tb_in  为数据表,“商品名称”、“入库数量”、“入库单价”为字段名

数据库链接:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db_sjk.mdb;Persist Security Info=False

求助问题:

利用VB代码,根据出库单mf1.TextMatrix(i, 2)的“商品名称”,mf1.TextMatrix(i, 3)的“数量”,从“tb_in 数据表”中,按照商品入库登记先后顺序,统计同名商品的出库总额,在mf1.TextMatrix(i, 4)显示

出库总额的计算,是按照商品入库登记先后顺序的“入库数量”*“入库单价”(如图例)

只有本站会员才能查看附件,请 登录
19 回复
#2
ZHRXJR2017-07-19 21:48
你的数据表与你需要显示的要求不符,最起码要有“出库数量”
tb_in  为数据表,需要必要的字段:“商品名称”、“入库单价”、“入库数量”、“出库数量”这几个字段名
才能实现你需要的结果,明天给你一个示例。
#3
时间旅行者2017-07-20 12:03
回复 2楼 ZHRXJR
谢谢老师,我是刚接触学习vb,很多都是在仿照一些示例边学边做,期待能得到您的指教
#4
wlrjgzs2017-07-20 14:56
回复 3楼 时间旅行者
放心,这位老师有大把的时间,他会指教你的。
#5
wlrjgzs2017-07-21 14:03
回复 2楼 ZHRXJR
老师,说好的示例呢?其实我也很需要。
#6
xzlxzlxzl2017-07-21 18:42
要按照记录顺序统计,则你必须有一个表征记录顺序的字段,一般是自增长的id或记录时间字段。似乎那种不要任何查询条件的sql语句也能按记录顺序输出,如“select * from tb_in”,不过我总觉得不可靠。
#7
时间旅行者2017-07-21 20:42
回复 6楼 xzlxzlxzl
在使用excel中用vba代码,单纯的以递进的方式查找和计算,可以很轻松的达到效果,由于对vb的语句还不熟悉,所以找不到方法,
#8
时间旅行者2017-07-21 20:43
分享一下vba的查询和统计代码,不知是否能作参考

Sub lqxs()

 Dim arr, j&, i&, brr, aa, sl, je, zje, ca
  Dim d, k, t, tt
  Set d = CreateObject("scripting.dictionary")
  Sheet1.Activate
  [d4:d20].ClearContents
 arr = Sheet4.[a1].CurrentRegion
    For i = 3 To UBound(arr)
    d(arr(i, 2)) = d(arr(i, 2)) & i & ","
    Next
    k = d.keys: t = d.items
    brr = [a1].CurrentRegion
    For i = 4 To UBound(brr)
    If brr(i, 2) <> "" Then
    sl = brr(i, 3)
    zje = 0
    If d.exists(brr(i, 2)) Then
    tt = d(brr(i, 2))
    tt = Left(tt, Len(tt) - 1)
  
    aa = Split(tt, ",")
    For j = 0 To UBound(aa)
    ca = sl - arr(aa(j), 3)
    If ca < 0 Then
    zje = zje + sl * arr(aa(j), 4)
    Exit For
    Else
    zje = zje + arr(aa(j), 3) * arr(aa(j), 4)
    sl = ca
    End If
    Next
    Else
   
    End If
    Cells(i, 4) = zje
    Else
    Exit For
    End If
    Next
    End Sub
#9
ZHRXJR2017-07-23 07:37
回复 3楼 时间旅行者

不好意思,停了二天电,这二天身体又不舒舒,没有及时回复,今天晚上给你。
#10
ZHRXJR2017-07-23 22:06
回复 3楼 时间旅行者
只有本站会员才能查看附件,请 登录

看看,如果可以,联系我。
#11
xyxcc1772017-07-24 07:24
   '建议增加一个字段:出库数量’
        Dim adoCon As ADODB.Connection
        Dim rs As ADODB.Recordset
       set adoCon = New ADODB.Connection
       set rs = New ADODB.Recordset
        adoCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db_sjk.mdb;Persist Security Info=False"
        adoCon.Open()
        Dim strSql As String = "SELECT  商品名称,sum(出库数量),sum(入库单价*出库数量) from tb_in group by 商品名称 order by 商品名称"
        rs.Open(strSql, adoCon, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
        Dim i As Integer
        i = 1
        Do While Not rs.EOF
            mf1.TextMatrix(i, 2) = rs(0).Value
            mf1.TextMatrix(i, 3) = rs(2).Value
            mf1.TextMatrix(i, 4) = rs(3).Value
            rs.MoveNext()
            i = i + 1
        Loop
        rs.Close()
        adoCon.Close()
好长时间动vb了,这是在.net下调试的,试试吧
#12
xyxcc1772017-07-24 07:27
Do While Not rs.EOF
            mf1.TextMatrix(i, 2) = rs(0).Value
            mf1.TextMatrix(i, 3) = rs(1).Value
            mf1.TextMatrix(i, 4) = rs(2).Value
            rs.MoveNext()
            i = i + 1
        Loop
#13
时间旅行者2017-07-29 16:30
回复 10楼 ZHRXJR
感谢老师的帮助,可能我的求助没表达清楚,

比如A商品
入库数据
第一批次入库数量10,金额210
第二批次入库数量12,金额220
第三批次入库数量15,金额200
   .
   .
   .
不断的录入入库数据库

出库金额计算
第一次出库数量8,出库金额就是8*210=1680
第二次出库数量11,出库金额就是2*210(第一批次剩余数量*单价)+9*220(第二批次数量*单价)=2400
第三次出库数量10,出库金额就是3*220(第二批次剩余数量*单价)+7*200(第三批次数量*单价)=2060
   .
   .
   .
不断的录入出库数据库

这样,在做出库记录的时候,就可以同时计算出A商品的实时剩余库存总额(入库总额-出库金额合计)

关键问题是,要根据每次出库数量,在入库数据库中查找到对应的价格,计算出出库金额,以达到先进先出的目的。

(补充,每次出库数量,可能不会等于每个批次的入库数量)

谢谢


[此贴子已经被作者于2017-7-29 17:27编辑过]

#14
时间旅行者2017-07-29 17:29
回复 11楼 xyxcc177
感谢老师的帮助,可能我的求助没表达清楚,

比如A商品
入库数据
第一批次入库数量10,金额210
第二批次入库数量12,金额220
第三批次入库数量15,金额200
   .
   .
   .
不断的录入入库数据库

出库金额计算
第一次出库数量8,出库金额就是8*210=1680
第二次出库数量11,出库金额就是2*210(第一批次剩余数量*单价)+9*220(第二批次数量*单价)=2400
第三次出库数量10,出库金额就是3*220(第二批次剩余数量*单价)+7*200(第三批次数量*单价)=2060
   .
   .
   .
不断的录入出库数据库

这样,在做出库记录的时候,就可以同时计算出A商品的实时剩余库存总额(入库总额-出库金额合计)

关键问题是,要根据每次出库数量,在入库数据库中查找到对应的价格,计算出出库金额,以达到先进先出的目的。

(补充,每次出库数量,可能不会等于每个批次的入库数量)

谢谢
#15
xyxcc1772017-07-29 20:09
Sub outsp()
Dim strsp As String
Dim quantity As Integer
Dim cNum  As String

strsp = "a"  '商品名称
quantity = 3  '数量
cNum="a303"   '出库编号
Call writer_out(strsp, quantity, cNum)

End Sub

Sub writer_out(ByVal mc As String, ByVal sl As Integer, ByVal strNum As String)
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim strCon As String
Dim dj As Double
Dim nCount As Integer
Dim out_quantity As Integer
strCon = "provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\db_sjk.ACCDB;Persist Security Info=False"
cn.Open strCon
Dim strSql As String
 
strSql = "select * from tb_in where 名称='" & mc & "' and 库存量>0 order by id"
rs.Open strSql, cn, adOpenKeyset, adLockOptimistic

Do While Not rs.EOF
  nCount = nCount + rs("库存量").Value
  rs.MoveNext
Loop
  rs.MoveFirst
  If sl > nCount Then
  MsgBox "你出库的数量太大!"
  rs.Clone
  cn.Close
  Exit Sub
  End If
  
Do While True
   If sl <= rs("库存量").Value Then
      dj = rs("单价").Value
      strSql = "insert into tb_out(名称,单价,出库数量,出库编号) values('" & mc & "'," & dj & "," & sl & ",'" & outNum & "')"
       cn.Execute strSql
       rs("出库数量").Value = rs("出库数量").Value + sl
       rs("库存量").Value = rs("入库数量").Value - sl
       rs("出库总额").Value = rs("出库数量").Value * rs("单价").Value
       rs("库存余额").Value = rs("库存量").Value * dj
       rs.Update
       Exit Do
       Else
          dj = rs("单价").Value
          out_quantity = rs("库存量").Value
         strSql = "insert into tb_out(名称,单价,出库数量,出库编号) values('" & mc & "'," & dj & "," & out_quantity & ",'" & strNum & "')"
         cn.Execute strSql
        rs("出库数量").Value = rs("出库数量").Value + out_quantity
         sl = sl - rs("库存量").Value
         rs("库存量").Value = 0
          rs("出库总额").Value = rs("出库数量").Value * rs("单价").Value
          rs("库存余额").Value = rs("库存量").Value * dj
      rs.MoveNext
   End If
Loop
  rs.Update
  rs.Clone
  cn.Close
End Sub
只有本站会员才能查看附件,请 登录
#16
时间旅行者2017-07-30 16:02
回复 15楼 xyxcc177
谢谢老师,我看你的思路是将每次出库数量又插入了入库数据表,如果数据量大,就会造成入库数据表过于庞大。

我的思路是,仅根据当次的出库数量,从入库表中查找数量在批次中的单价,或跨批次的单价,结合数量计算得到出库金额即可,

这样,在增加记录时候,只要调出出库数据表中数量的合计加上当次出库数量,再从入库表中查找数量达到的批次或跨批次的单价,计算得到出库金额

同时可以更方便其他数据的计算,谢谢!!
#17
qq11qq2017-07-30 17:03
谢谢
#18
xyxcc1772017-07-31 05:53
这本不是难题,两个例子结合起来能解决吧。
#19
时间旅行者2017-08-01 14:26
奇怪,本帖怎么会自动结贴呢,谁能解释一下
#20
时间旅行者2017-08-01 18:25
回复 18楼 xyxcc177
谢谢,你给的第二个例子能注释一下吗,把rs.Clone修改成rs.Close,
下面两句也不理解到底是什么意思
strSql = "insert into tb_out(名称,单价,出库数量,出库编号) values('" & mc & "'," & dj & "," & sl & ",'" & outNum & "')"
strSql = "insert into tb_out(名称,单价,出库数量,出库编号) values('" & mc & "'," & dj & "," & out_quantity & ",'" & strNum & "')"

[此贴子已经被作者于2017-8-1 18:36编辑过]

1