Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何用ADO记录集中的值填充记录源?_Vba_Ms Access - Fatal编程技术网

Vba 如何用ADO记录集中的值填充记录源?

Vba 如何用ADO记录集中的值填充记录源?,vba,ms-access,Vba,Ms Access,我正在尝试创建一个记录集,该记录集保存从另一个记录集复制的数据以及另外两列。我以前在一篇文章中提到过这一点。下面的代码中有一个我无法识别的问题 如果你读了我链接的帖子,你已经看到了这个代码。我只更改了将字段附加到记录集中的部分,因为我认为那里的某个地方有错误。它现在看起来和我的代码一模一样,只是名字已经改变了 Dim cpRS作为新的ADODB.Recordset,RS作为DAO.Recordset,cb作为复选框,addr作为字符串 '创建以前显示的结果表的副本 Set cpRS=New AD

我正在尝试创建一个记录集,该记录集保存从另一个记录集复制的数据以及另外两列。我以前在一篇文章中提到过这一点。下面的代码中有一个我无法识别的问题

如果你读了我链接的帖子,你已经看到了这个代码。我只更改了将字段附加到记录集中的部分,因为我认为那里的某个地方有错误。它现在看起来和我的代码一模一样,只是名字已经改变了

Dim cpRS作为新的ADODB.Recordset,RS作为DAO.Recordset,cb作为复选框,addr作为字符串
'创建以前显示的结果表的副本
Set cpRS=New ADODB.Recordset
心肺复苏术
'
.Fields.Append“val0”,adInteger
.Fields.Append“val1”,adInteger
.Fields.Append“val2”,adVarChar,80
.Fields.Append“val3”,adVarChar,80
.Fields.Append“val4”,adVarChar,30
.Fields.Append“val5”,adVarChar,30
.Fields.Append“val6”,adVarChar,10
.Fields.Append“val7”,adVarChar,10
.Fields.Append“val8”,adVarChar,50,adFldIsNullable
.Fields.Append“val9”,adDBTimeStamp
.Fields.Append“val10”,adVarChar,50
.Fields.Append“val11”,adSmallInt
.Fields.Append“val12”,adVarChar,100
.Fields.Append“val13”,adVarChar,255,adFldIsNullable
.Fields.Append“val14”,adVarChar,255,adFldIsNullable
.Fields.Append“val15”,adInteger
.Fields.Append“val16”,adInteger
.Fields.Append“val17”,adSmallInt
.Fields.Append“val18”,adSmallInt
'用于临时目的的新字段
.Fields.Append“val19”,adBoolean
.Fields.Append“val20”,adVarChar,50
.CursorLocation=adUseClient
.开放,adOpenDynamic,ADLOCK乐观,8
以
'通过将筛选器应用于之前使用的同一查询,获取上一个窗口的结果集
Dim argv()作为字符串
作为字符串的Dim argRest
Dim qdef作为DAO.QueryDef
Dim restrictedQuery作为字符串
“在打开此表单时,我将在此处还原的OpenArgs交给您
'删除了代码,但稍后将使用“argv”和“argRest”
'这是上一个表单中使用的查询。我需要一个额外的where子句,所以我不得不重写它。
restrictedQuery=“一些很长的SQL语句,我觉得不需要放在这里,因为它不会造成问题。”&_
“如果我不正确,请告诉我,我将重写它以保护其中的数据”
设置qdef=CurrentDb.CreateQueryDef(“”)
qdef.SQL=restrictedQuery
Set RS=qdef.OpenRecordset
Set RS=CurrentDb.OpenRecordset(restrictedQuery,dbOpenSnapshot)
莫夫拉斯特
先走一步
如果RS.RecordCount=0,则
MsgBox“某些错误文本”,vbOKOnly,“错误标题”
DoCmd.Close acForm,Me.Name
出口接头
如果结束
'使用以前表格中的数据填充新记录集
直到R.EOF为止
“将“旧”记录集的数据放入新记录集,再次缩短,你就明白了
cpRS.AddNew
cpRS.字段(“val1”)=RS(“某些值”)
cpRS.字段(“val2”)=RS(“某些值2”)
'...
'用默认值填充不是来自查询的两列
cpRS.字段(“val19”)=假
cpRS.Fields(“val20”)=“”
更新
下一个
环
设置我。记录集=CPR
RS.Close
设置RS=无
“cpRS.Close-我把这个拿走了
设置cpRS=无
现在有一些奇怪的行为(至少对我来说)。当我调试时,我可以看到ADO记录集被来自DAO记录集的数据填充。没有错误,所有值都是正确的。然而,当表单打开时,只有一些单元格被填充。其余的单元格包含“#Name?”这让我认为a)我为字段设置的数据类型错误,或者b)表单不知道将哪些值放入字段,因为有多个源试图填充它(我想我在不久前已经读过关于这个#Name?错误与那种错误相关联的文章,但是我不确定它,我也不知道双重赋值发生在哪里)

结构大致如下: 表单包含子表单。子表单包含几个文本框,这些文本框中包含我作为控制源添加到ADO记录集中的值的名称。(这是我的前任处理填写表单的方式,我不知道这是否是执行此任务的常用方法。)未设置子窗体的Recordsource,因为我在Form_Load事件(代码来自该事件)中将ADO记录集设置为Recordsource

我希望这是足够的信息来定位问题,否则让我知道,我会尝试提供更多的信息


编辑:我想我应该补充一点,子窗体中正好有一列属于adVarChar类型(代码中的val4)

。ControlSource
是控件属性(如文本框),而不是记录集字段属性

它将记录集字段绑定到表单/报表控件

如果将adodb记录集字段命名为append上的dao字段,则无需更改Controlsource:

.Fields.Append“NameOfDaoField0”,adInteger
或使用

Me.Controls(“MyTextbox”).ControlSource=“valX”
其中valX是字段的附加新名称(本例中为val0、val1等)


在代码中的位置不应该重要。

字段名相等?如果不将Control.ControSource更新为新名称。@ComputerVersteher不,它们不相等!除了我有值的一个字段。因此我不能给字段唯一的名称,对吗?或者我可以在填写ADO后更改它们吗?如果我没有弄错,我需要在
vba中更改名称.Fields.Append“NAME”,键入
statements..ControlSource是一个控件属性(类似于文本框),而不是记录集字段属性。如果将adodb记录集字段命名为Append上的dao字段,则无需对ControlSource进行更改,也无需使用
Me.Controls(“MyTextbox”)。ControlSource=“valX”
在代码中的位置不重要。@ComputerVersteher我无法将您的答案标记为正确,但它起了作用。非常感谢。我甚至不需要更改名称,因为