Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

如何实现按不同客户代码做逐行累加?

西岭村人  发表于:2009-08-30 11:04:55  
复制

接触ACCESS的时间不长,很多东西都在起步,论坛里很多帖子给了我不少启发,现在我想用自定义函数和ACCESS查询配合,做到按不同客户代码分别逐行累加销售额.也就是下面的效果,但我编的自定义函数总是不成功,恳请各位高人帮忙指点迷津.:

 

客户代码        借方        借方累加

001            10000        10000

001           200000       210000  

001            40000       250000 

002          2000000      2000000   

002          1000000      3000000

003          1700000      1700000 

 

我编的自定义函数是

 

Option Compare Database
Dim temY As Long
Dim Ncode As Long
Dim n As Integer

Ncode = 0

Function temsuma(tem, 客户代码, tabname) As Long

Ncode = Count(客户代码)

For n = 1 To Ncode

If n = 1 Then temY = 0
temsuma = temY + tem
temY = temsuma

End If

Next

n = 1


End Function

我想用的ACCESS查询是

SELECT 销售明细表.ID, 销售明细表.客户代码, 销售明细表.日期, 销售明细表.借方, temsuma([借方],[客户代码],tabname) AS 借方之总计
FROM 销售明细表
GROUP BY 销售明细表.ID, 销售明细表.客户代码, 销售明细表.日期, 销售明细表.借方;

 

点击下载此附件

 

Top
白发学者 发表于:2009-08-30 12:01:54

看“借方累加 查询”是这样吗?

 

 

点击下载此附件

西岭村人 发表于:2009-08-30 15:55:37

非常感谢1楼fjfjb,您的方法已经让我为之惊喜兴奋了,但是此方法只能实现逐日累加,还未能实现逐行累加,如当出现同一客户代码在同一天有多笔交易时,此方法会把同一天的借方发生额累加起来,而不是做到逐行累加,如下面的001客户代码出现的结果就有误:

ID    客户代码      日期           借方        借方累加(正确的应该是逐行累加)      借方累加(错误的是逐日累加)

2    001          2007.11.1      10000        10000                               210000

1    001          2007.11.1     200000       210000                               210000

3    001          2007.12.1      40000       250000                               260000                   

446  001          2007.12.1      10000       260000                               260000  

4    002          2007-12-24   2000000      2000000   

5    002          2007-12-31   1000000      3000000

6    003          2008-1-31    1700000      1700000 

 

另外,在这个表里ID也不一定会是从小到大排序的,所以,按ID来做判断条件也不合适(除非每次按客户代码和日期排序后,再重编ID,那样好象更复杂了)...请帮帮我再想个完美的解决方案,谢谢了!

点击下载此附件

符鸿敏 发表于:2009-08-30 18:06:33

点击下载此附件

 

建议:在表中增加一个 借方累加 字段,在录入数据时,就把借方累加计算并存入表内的字段中。这样就不必使用查询计算了。

在表中缺少累加字段的情况下,用报表的方式就比较容易显示按行累加,如示例。而用查询的方法我还没有做过。

     



符鸿敏 发表于:2009-08-30 18:14:29
表的日期字段最好是包含时间内容,这更利于在每天有超过1笔数据时的排序和更为准确的按每笔数据的累加。

国文 发表于:2009-08-31 01:04:10

此问题也至今仍困惑着我,想了很多办法无法解决。不过我认为应该是有办法解决的,因为现用的财务软件都可以在查询任意明细的时候给出余额列:每一笔发生额对应一笔计算后的余额。

3楼建议在在表中增加一个余额字段,本人而认为不可取,因为余额而是任意的,随着查询条件的变化而变化的,将变化的数字存在表中不太好。

我曾想过先建立一个和原表结构一致的查询,再在查询中增加一个字段,命名为:余额,值为0,再用vba编程的方式把正确的余额值逐行填列到记录中,再把最后的结果设置为数据表的记录源,表现出来,但是到最后一步出错,recordser不能设置为数据表的数据源,该处提示错误:

代码如下,请指正:

    Private Sub Form_Load()
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Dim sglJiner As Single
    Dim sglYuer As Single
    Dim str As String
    Dim SQL As String
   
    str = InputBox("请输入项目编码:")
    With rs
        '取余额
        SQL = "select* from 项目财务信息 where (((项目财务信息.项目Id) = '" & str & "'))"
        .Open SQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
       
        If Not .EOF Then sglYuer= .Fields("余额")
        rs.Close
       
        '设置数据源
        SQL = "SELECT 财务收支明细.发生日期, 财务收支明细.备注 AS 摘要, 收付类别.类别名称 AS 收付类别, 财务收支明细.金额, 0 AS 工程款余额,0 AS 项目总余额, 收付类别.类别ID" _
            & "FROM 项目财务信息 INNER JOIN (收付类别 INNER JOIN (项目信息 INNER JOIN 财务收支明细 ON 项目信息.项目ID = 财务收支明细.项目Id) ON " _
            & "收付类别.类别ID = 财务收支明细.类别Id) ON (项目信息.项目ID = 项目财务信息.项目Id) AND (项目财务信息.项目Id = 财务收支明细.项目Id)" _
            & "WHERE (((项目财务信息.项目Id)='" & str & "'))"
   
        .Open SQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
        .MoveLast’只有期末余额,所以从最后一条记录开始计算,一条一条往前计算
        sglJiner = 0
        Do Until .EOF
            sglJiner=.Fields("金额")

            .Fields("余额") = sglYuer
                sglYuer= sglYuer + sglJiner
            .MovePrevious '朝前移动
        Loop
        Me.RecordSource = SQL  '此处提示错误,不能使用该属性
        Requery
        .Close
        Set rs = Nothing
    End With
End Sub



国文 发表于:2009-08-31 14:30:47

到目前为止,这个问题已经解决了,不过可以叫做曲线救国了,具体方法如下:

1、新建一个表(本地的临时表)叫做表1,与存储所需要的数据的后端表(表2)具有相同的结构,但是在表1增加一个字段:余额,

2、用追加查询把表2中的满足自己要求的数据追加保存在表1中,并可按照自己的要求排序(建议按日期排序),

3、找出期初余额并用recordset通过加减计算把表1中余额字段填充,

4、把表1作为数据表窗体的数据源表现出来,

5、最后不要忘了在关闭数据表窗体的同时把表1的所有数据清除。

这样5步骤实现了会计明细账查询中显示余额及楼主所说的逐行累加,避免了在后端表添加余额字段的不确定性及出错的可能性

当然这样增加了一个表,无形中增加了数据库的对象,对数据库的运行有一定的影响,不过所有的计算都在本地执行,只有查询的时候链接了后端表,个人认为对速度的影响有限。

以上是个人对这个问题的一点浅见。有不妥之处或有更好的方法0请指正,期待好方法。谢谢



西岭村人 发表于:2009-08-31 14:57:00

各位的方法给了我不少启发。我想要是有一个方法能把ID快速重新编号,然后将1楼的方法变通一下,这个问题可能能很好的解决。但是很惭愧...我只是有这个想法,但却不知如何重新编ID。



西岭村人 发表于:2009-08-31 22:24:33
真的很高兴!终于找到方法了.原来只要在1楼的方法上where ..客户名称..日期..然后再多加一个ID判断就可以了!再次多谢各位!

总记录:8篇  页次:1/1 9 1 :