Access交流中心

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

窗体循环代码问题

KG  发表于:2020-12-29 17:10:23  
复制

各位大佬,


新人求助!!

我建了一个查询窗体,然后设置一个按钮可以复制单个记录里面的某个文件,请教如何自动循环复制每个记录,直到最后一条,感激不尽啊!!

代码循环研究半天没成功,各种报错。用Do until 和Loop,总是在复制文件的地方出错,不是重复的复制第一个,就是只复制一次。


下面是原始的代码和数据库截图:


Private Sub GetMER_Click()
Dim cnn As ADODB.Connection
Dim Visit As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.Open CurrentProject.Connection

Set Visit = New ADODB.Recordset
Visit.Open "select Link1, Link2, Link3, Link4, Link5, Link6 from tbVisit WHERE (IDV=" + Str(Me.IDV) + ")", cnn, adOpenKeyset, adLockReadOnly

Dim GetM As Object
Set GetM = CreateObject("Scripting.FileSystemObject")


If Visit.Fields(5).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(5), "D:\Fluor\MERs\"
End If
If Visit.Fields(4).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(4), "D:\Fluor\MERs\"
End If
If Visit.Fields(3).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(3), "D:\Fluor\MERs\"
End If
If Visit.Fields(2).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(2), "D:\Fluor\MERs\"
End If
If Visit.Fields(1).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(1), "D:\Fluor\MERs\"
End If
If Visit.Fields(0).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(0), "D:\Fluor\MERs\"
End If

Set GetM = Nothing


Visit.Close
Set Visit = Nothing
cnn.Close
Set cnn = Nothing

End Sub



 

Top
vious 发表于:2020-12-30 08:38:35

看不明白,Link1, Link2, Link3, Link4, Link5, Link6的字段是什么内容?

Visit.Open的记录数只有一条吗?

建议发附件吧




西出阳关无故人 发表于:2020-12-30 10:14:37
Private Sub GetMER_Click()
Dim cnn As ADODB.Connection
Dim Visit As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.Open CurrentProject.Connection
dim i
Set Visit = New ADODB.Recordset
Visit.Open "select Link1, Link2, Link3, Link4, Link5, Link6 from tbVisit WHERE (IDV=" + Str(Me.IDV) + ")", cnn, adOpenKeyset, adLockReadOnly

Dim GetM As Object
Set GetM = CreateObject("Scripting.FileSystemObject")
for i=1 to visit.recordcount

If Visit.Fields(5).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(5), "D:\Fluor\MERs\"
End If
If Visit.Fields(4).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(4), "D:\Fluor\MERs\"
End If
If Visit.Fields(3).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(3), "D:\Fluor\MERs\"
End If
If Visit.Fields(2).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(2), "D:\Fluor\MERs\"
End If
If Visit.Fields(1).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(1), "D:\Fluor\MERs\"
End If
If Visit.Fields(0).Value Like "*MER*" Then
GetM.CopyFile Visit.Fields(0), "D:\Fluor\MERs\"
End If

Visit.movenext

next i

Set GetM = Nothing


Visit.Close
Set Visit = Nothing
cnn.Close
Set cnn = Nothing

End Sub


大约是这样循环.



vious 发表于:2020-12-30 10:22:10

应该不是循环的方法问题,我估计更多是Link字段的内容的问题。

图片内容与代码没关系,看不出异常,还是需要提供附件



KG 发表于:2020-12-30 11:13:00

点击下载此附件

非常感谢2位解答!!

@vious  附件已上传,写的差见笑了

涉及的窗体是VisitNotInvoiced

逻辑是根据当前选中的记录,调出对应的Link(文件路径),然后复制文件名含MER的文件到一个固定的文件夹。

窗体一打开就选择了记录,我也不知道该怎么选批量的记录然后获取批量的Link信息

所以笨的想法是自动跳到下个记录然后复制,想来想去也没想出该怎么写。

或者是否可以弄个宏来实现不停的点击直到报错?

请高手指点


@西出阳关无故人  代码试过了不行。还是只复制当前选中的记录。

我试过加入acNext,这样就是一直点,是个笨办法



vious 发表于:2020-12-30 11:37:29

循环体这样写试试

    Do Until Visit.EOF
        For i = 0 To 5
            If Visit.Fields(i).Value Like "*MER*" Then
            GetM.CopyFile Visit.Fields(i).Value, "D:\Fluor\MERs\"
            End If
        Next
        Visit.MoveNext
    Loop
我这里没有附件,不好测试,看看你还报什么样的错



KG 发表于:2020-12-30 11:41:56

没报错但是还是只复制了窗体中选中的记录

打开窗体就已经选中了一条记录,是不是和这个有关系?



KG 发表于:2020-12-30 11:48:03

Visit.Open "select Link1, Link2, Link3, Link4, Link5, Link6 from tbVisit WHERE (IDV=" + Str(Me.IDV) + ")", cnn, adOpenKeyset, adLockReadOnly

是不是和这个代码也有关系?



vious 发表于:2020-12-30 11:48:58
你的

Visit.Open "select Link1, Link2, Link3, Link4, Link5, Link6 from tbVisit WHERE (IDV=" + Str(Me.IDV) + ")", cnn, adOpenKeyset, adLockReadOnly

里面就指定了IDV的值,当然就只有一记录了,多条记录的话,你的where就是改呀



KG 发表于:2020-12-30 11:53:19

请教怎么改,直接去掉不行吧?

还是要针对窗体上的这些记录。

多谢多谢



vious 发表于:2020-12-30 11:58:21

你的窗体数据来源是查询VisitsNotInvoiced

所以你的sql就应该是这样来写 SELECT tbVisit.Link1, tbVisit.Link2, tbVisit.Link3, tbVisit.Link4, tbVisit.Link5, tbVisit.Link6 FROM VisitsNotInvoiced LEFT JOIN tbVisit ON VisitsNotInvoiced.IDV = tbVisit.IDV;

这样你的Visit的记录数就全是你的窗体数据集了



KG 发表于:2020-12-30 12:10:29

感谢感谢,我明白了。

不过这样的话,默认的就都是VisitNotInvoiced的全部数据了。

如果我要窗体上进行筛选呢?比如按"Date From"这个日期字段筛选11月的

主要是想让用的人更加灵活,在窗体上进行条件筛选,然后只复制显示在窗体上的这些记录。

是不是不好实现?



vious 发表于:2020-12-30 12:30:05

好筛选,凡是有条件的格式,都是可以使用字符串来表达的,

使用你个人的筛选条件,或在窗体里有个筛选属性,读取出来加到sql语句里就可以了,

记得结贴



KG 发表于:2020-12-30 13:55:05

抱歉抱歉,最后一个问题。

把条件加进去以后反而一个都不复制了,去掉新加的WHERE条件是可以全部复制的。

然后Visit.Open这部分代码放到Query里面运行又是筛选成功,有数据的,所以这个有点搞不懂。


下面是代码

Private Sub GetMER_Click()
Dim cnn As ADODB.Connection
Dim Visit As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.Open CurrentProject.Connection

Dim i

Set Visit = New ADODB.Recordset
Visit.Open "SELECT tbVisit.Link1, tbVisit.Link2, tbVisit.Link3, tbVisit.Link4, tbVisit.Link5, tbVisit.Link6 FROM VisitsNotInvoiced LEFT JOIN tbVisit ON VisitsNotInvoiced.IDV = tbVisit.IDV WHERE tbVisit.VisStaDate Like  '*2020/12*'", cnn, adOpenKeyset, adLockReadOnly


Dim GetM As Object
Set GetM = CreateObject("Scripting.FileSystemObject")

    Do Until Visit.EOF
        For i = 0 To 5
            If Visit.Fields(i).Value Like "*MER*" Then
            GetM.CopyFile Visit.Fields(i).Value, "D:\Fluor\MERs\"
            End If
        Next
        Visit.MoveNext
    Loop
    
Set GetM = Nothing


Visit.Close

Set Visit = Nothing

cnn.Close

Set cnn = Nothing

End Sub



vious 发表于:2020-12-30 14:06:18

1.不建议过长的open语句,不直观,也不好查看问题,建议增加 字符串sql,先确认sql,再open sql, cnn, adOpenKeyset, adLockReadOnly

2.VisStaDate是日期字段,不建议使用 like ,建议使用 between 并结合DateSerial、 year、month函数使用;




KG 发表于:2020-12-30 15:54:09
改为month函数成功了,感谢感谢!

vious 发表于:2020-12-30 16:33:53
顺便提一句,tbVisit的设计感觉有问题,为何有Link1, Link2, Link3, Link4, Link5, Link6这么多同类型字段,假如哪天因为功能需要再增加一个相同类型的字段,你想像一下你的修改工作量会有多大??

KG 发表于:2021-01-05 13:04:24
请教一下有什么修改建议吗?

vious 发表于:2021-01-12 13:04:29

拆解tbVisit,设计主/子表



KG 发表于:2021-01-21 13:42:37
感谢大佬!!

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