设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5619|回复: 13
打印 上一主题 下一主题

[模块/函数] 怎样按条件将一条记录拆分为几条记录?求助!

[复制链接]
跳转到指定楼层
1#
发表于 2011-9-23 08:45:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ljp518 于 2011-9-23 08:46 编辑

由于银行控制>=5万元的付款,需要将贷方数>=5万元的付款记录,按姓名拆分成<5万元付款的若干条记录,不知vba函数怎样写,求助各位老师和版主!谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2011-9-23 14:33:16 | 只看该作者
Private Sub Command0_Click()
    Dim rs As ADODB.Recordset
    Dim str As String
    Dim i As Integer
    Dim j As Integer
    Dim rs1 As ADODB.Recordset
    Dim str1 As String

    Set rs = New ADODB.Recordset
    Set rs1 = New ADODB.Recordset

    str = "select * from 表2"
    rs.Open str, CurrentProject.Connection, adOpenKeyset, adLockReadOnly
    str1 = "select * from 表3"
    rs1.Open str1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

    If rs.EOF Then Exit Sub
    rs.MoveLast
    rs.MoveFirst

    Do Until rs.EOF
        j = rs(1) \ 1200
        If j > 0 Then
            For i = 1 To j
                rs1.AddNew
                rs1(1) = 1200
                rs1.Update
            Next i
            If rs(1) - 1200 * j <> 0 Then
                rs1.AddNew
                rs1(1) = rs(1) - 1200 * j
                rs1.Update
            End If

        Else
            rs1.AddNew
            rs1(1) = rs(1)
            rs1.Update
        End If

        rs.MoveNext
    Loop

    DoCmd.OpenTable "表3"

    rs.Close
    rs1.Close
    Set rs = Nothing
    Set rs1 = Nothing

End Sub

用这个拆分记录的函数如何修改为按姓名拆分,请各位老师帮助!谢谢!
3#
发表于 2011-9-23 15:42:37 | 只看该作者
看了下,应该把1200改成49999,表2为源表,表3为目标表
这里不是很懂,rs(1),是改成第N个字段的rs(N)呢?还是改成rs(字段名)?
请高手指教.
4#
 楼主| 发表于 2011-9-23 16:13:48 | 只看该作者
tzh16000 发表于 2011-9-23 15:42
看了下,应该把1200改成49999,表2为源表,表3为目标表
这里不是很懂,rs(1),是改成第N个字段的rs(N)呢?还是改 ...

首先是谢谢关注,再等待高手的出手。。。
5#
发表于 2011-9-23 19:21:07 | 只看该作者
代码都写出来了还求什么指教?{:soso_e128:}
简单注释下吧。
Private Sub Command0_Click()
    Dim rs As ADODB.Recordset
    Dim str As String
    Dim i As Integer
    Dim j As Integer
    Dim rs1 As ADODB.Recordset
    Dim str1 As String
    Set rs = New ADODB.Recordset
    Set rs1 = New ADODB.Recordset
    str = "select * from 表2"
    rs.Open str, CurrentProject.Connection, adOpenKeyset, adLockReadOnly
    str1 = "select * from 表3"
    rs1.Open str1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    '如果不存在记录则跳出。
    If rs.EOF Then Exit Sub
'移动记录集位置,目的在于快速读取数据、
    rs.MoveLast
    rs.MoveFirst
'这一段主要是把记录新增到表3中。
'从这一段来看,表3的字段2跟表2的字段2必须是一样的字段类型。表2为输入,表3为输出。
    Do Until rs.EOF
'获取循环次数,即字段2(字段顺序是从0开始滴)的值除以1200取整
        j = rs(1) \ 1200
        If j > 0 Then
'如果大于1200,则按1200的倍数来执行循环
            For i = 1 To j
'设置rst1的字段2的值为1200
                rs1.AddNew
                rs1(1) = 1200
                rs1.Update
            Next i
'把整除后的余数作为新增记录添加上去。
'其实Else部分可以不写的,因为在前面已经把整除部分追加进去了。
            If rs(1) - 1200 * j <> 0 Then
                rs1.AddNew
                rs1(1) = rs(1) - 1200 * j
                rs1.Update
            End If

        Else
            rs1.AddNew
            rs1(1) = rs(1)
            rs1.Update
        End If
        rs.MoveNext
    Loop
'打开表3,关闭记录集,并释放内存。
    DoCmd.OpenTable "表3"
    rs.Close
    rs1.Close
    Set rs = Nothing
    Set rs1 = Nothing
End Sub
6#
 楼主| 发表于 2011-9-28 09:07:09 | 只看该作者
太感谢roych 版主了,{:soso_e179:}由于这几天忙没有上论坛,本应在第一时间感谢!净拖了5天,真不好意思,表示歉意!
7#
发表于 2011-9-28 15:07:25 | 只看该作者
  1. Private Sub Command2_Click()
  2.     Dim rs As New ADODB.Recordset
  3.     Dim rs1 As New ADODB.Recordset
  4.     Dim rs2 As New ADODB.Recordset
  5.     Dim cnn As New ADODB.Connection
  6.     Dim str As String
  7.     Dim str1 As String
  8.     Dim str2 As String
  9.     Dim x As Double
  10.     Dim y As Double
  11.     Dim curM As Double
  12.     Dim i As Integer

  13.     On Error GoTo Command2_Click_Error

  14.     Set cnn = CurrentProject.Connection
  15.     i = 1
  16.     CurrentDb.Execute "delete * from newtbl"
  17.     Me.Newtbl_子窗体.Requery

  18.     str = "SELECT DISTINCT 记录表.姓名 FROM 记录表"
  19.     rs.Open str, cnn, adOpenKeyset, adLockReadOnly
  20.     Do Until rs.EOF
  21.         y = 50000
  22.         str1 = "SELECT 贷方 FROM 记录表 WHERE 姓名='" & rs.Fields(0) & "' And Not 贷方 Is Null"
  23.         rs1.Open str1, cnn, adOpenKeyset, adLockReadOnly
  24.         x = rs1.Fields(0)

  25.         str2 = "SELECT * FROM Newtbl"
  26.         rs2.Open str2, cnn, adOpenKeyset, adLockOptimistic
  27.         Do Until x <= 0

  28.             If x >= 50000 Then
  29.                 curM = y - i
  30.                 x = x - y + i
  31.             Else
  32.                 curM = x
  33.                 x = x - y
  34.             End If
  35.             i = i + 1
  36.             rs2.AddNew
  37.             rs2.Fields(0) = rs.Fields(0)
  38.             rs2.Fields(1) = curM
  39.             rs2.Update
  40.         Loop
  41.         rs2.Close
  42.         rs1.Close
  43.         rs.MoveNext
  44.     Loop
  45.     rs.Close
  46.     Set rs = Nothing
  47.     Set rs1 = Nothing
  48.     Set rs2 = Nothing
  49.     Set cnn = Nothing
  50.     Me.Newtbl_子窗体.Requery

  51.     On Error GoTo 0
  52.     Exit Sub

  53. Command2_Click_Error:

  54.     MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
  55. End Sub
复制代码
8#
发表于 2011-9-28 21:36:30 | 只看该作者

RE: 怎样按条件将一条记录拆分为几条记录?求助!

ljp518 发表于 2011-9-28 09:07
太感谢roych 版主了,由于这几天忙没有上论坛,本应在第一时间感谢!净拖了5天,真不好意思, ...

不客气。毛主席教导我们,要为人民服务嘛。能解决大家的问题,是我们莫大的荣幸。
9#
 楼主| 发表于 2011-9-30 09:44:35 | 只看该作者
谢谢Henry D. Sy老师的认真负责,值得敬佩的老师!按此程序进行修改。{:soso_e181:}
10#
发表于 2011-9-30 16:37:24 | 只看该作者
再简化下代码
Private Sub Command2_Click()
    Dim rst    As Recordset
    Dim rst1   As Recordset
    Dim i      As Byte
    CurrentDb.Execute "delete * from newtbl"
    Set rst = CurrentDb.OpenRecordset("select * from 记录表 where 贷方>0")
    rst.MoveLast
    rst.MoveFirst
    Set rst1 = CurrentDb.OpenRecordset("newtbl")
    With rst1
        Do Until rst.EOF
            For i = 1 To Int(rst!贷方 / 50000)
               MsgBox rst!姓名
                .AddNew
                !姓名 = rst(1)
                !贷方 = 49999
                .Update
            Next
            .AddNew
            !姓名 = rst(1)
            !贷方 = rst(3) - 49999 * (i - 1)
            .Update
            rst.MoveNext
        Loop
    End With
    rst1.Close
    Set rst1 = Nothing
    rst.Close
    Set rst = Nothing
End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-1 03:00 , Processed in 0.114064 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表