Office中国论坛/Access中国论坛

标题: 【求助】执行查询后,子窗体temp表得不到查询中指定列的数据 [打印本页]

作者: 紫风    时间: 2016-1-18 10:41
标题: 【求助】执行查询后,子窗体temp表得不到查询中指定列的数据
本帖最后由 紫风 于 2016-1-18 10:50 编辑

    主窗体 cbo线路 刷新后,需要执行查询"qry库存"(这是个联合查询,应该没有问题吧?),然后将查询到的特定字段值给到表"tbl明细temp",代码如下,好像哪里出问题了,麻烦大家帮忙看一下,谢谢!

    If IsNull(DLookup("[单号]", "tbl出库", strfilter)) Then
        DoCmd.OpenQuery "qry库存"
        stemp = "select [qry库存].[货物],[qry库存].[城市],[qry库存].[品牌],[qry库存].[库存数] from [qry库存] where 线路= ' " & Me.cbo线路 & " '"
        DoCmd.RunSQL "Delete [tbl明细temp].* FROM [tbl明细temp]"
        DoCmd.RunSQL "insert into tbl明细temp(货物,城市,品牌,预出数) values(stemp.[货物],stemp.[城市],stemp.[品牌],stemp.[库存数])"
        
    End If
   
    Me.frm明细chd.Requery


作者: roych    时间: 2016-1-18 11:23
本帖最后由 roych 于 2016-1-18 11:27 编辑

If IsNull(DLookup("[单号]", "tbl出库", strfilter)) Then
        DoCmd.OpenQuery "qry库存"
'-----选择查询是不需要打开的。
        stemp = "select [qry库存].[货物],[qry库存].[城市],[qry库存].[品牌],[qry库存].[库存数] from [qry库存] where 线路= ' " & Me.cbo线路 & " '"
'-----这句用来干什么不清楚。如果是用来创建查询请先建立,如果已存在则请定义QueryDef,再以此语句来设置SQL。
        DoCmd.RunSQL "Delete [tbl明细temp].* FROM [tbl明细temp]"
        DoCmd.RunSQL "insert into tbl明细temp(货物,城市,品牌,预出数) values(stemp.[货物],stemp.[城市],stemp.[品牌],stemp.[库存数])"
'这句绝对是有问题的。如果需要使用查询的值,请使用ADO【当然,也可以在打开查询后复制查询的值,不过并不比上面的方法方便】.
'如果需要使用窗体的值,请修改查询语句。

    End If
   
    Me.frm明细chd.Requery

-------------------------------
好了,不说了。简单的解决办法是:
1、以库存为源建立一个查询,条件为:Me.cbo线路,假定为“库存子窗体查询”
2、将该查询绑定到一个子窗体中。
3、创建一个追加查询,条件设置为子窗体的值。大体语句如下:
  1. INSERT INTO  tbl明细temp(货物,城市,品牌,预出数)
  2. SELECT [Forms]![frm主窗体][库存子窗体]![货物] AS 货物, [Forms]![frm主窗体][库存子窗体]![城市]  AS 城市, [Forms]![frm主窗体][库存子窗体]![品牌] AS 品牌 [Forms]![frm主窗体][库存子窗体]![预出数]  AS 预出数
  3. FROM 库存子窗体查询;
复制代码
注:用values也是可以的,不过需要考虑到文本和数字的区别。"INSERT INTO  tbl明细temp(货物,城市,品牌,预出数)  values(' " & [Forms]![frm主窗体][库存子窗体]![货物] &"',"………………

作者: 紫风    时间: 2016-1-18 12:14
roych 发表于 2016-1-18 11:23
If IsNull(DLookup("[单号]", "tbl出库", strfilter)) Then
        DoCmd.OpenQuery "qry库存"
'-----选 ...

谢谢 ROYCH 版主!
库存是列出来了,但是代码只能将库存的第一行数据插入到temp表中。
详细说:
就是列出了49行库存,每行是不同的城市,但是追加到temp表中的数据都只是第一行城市的库存,而且重复49次了……
作者: roych    时间: 2016-1-18 12:20
紫风 发表于 2016-1-18 12:14
谢谢 ROYCH 版主!
库存是列出来了,但是代码只能将库存的第一行数据插入到temp表中。
详细说:

是的。这个代码里只能将第一行追加进去。如果有多行的话,请将子窗体的数据源作为查询的数据源,重新建立一个追加查询。
不过我觉得你的数据库逻辑应该是有问题的。
作者: 紫风    时间: 2016-1-21 15:13
roych 发表于 2016-1-18 12:20
是的。这个代码里只能将第一行追加进去。如果有多行的话,请将子窗体的数据源作为查询的数据源,重新建立 ...

版主,库存我列出来也插入到temp表里了,但是主窗体里有个me.单号,但是列出的库存不会有这个单号,我想插入temp表时也将主窗体的单号插入进去,可以实现吗?
代码如下,麻烦帮看看,谢谢!
Private Sub cbo线路_AfterUpdate()
    Dim strfilter As String
        strfilter = "[单号] = '" & Me.单号 & "'"
        If IsNull(DLookup("[单号]", "tbl出库", strfilter)) Then
            Me.Form.Refresh
            DoCmd.SetWarnings False
            DoCmd.RunSQL "Delete [tbl明细temp].* FROM [tbl明细temp]"
            DoCmd.RunSQL "insert into tbl明细temp SELECT [qry库存].[货物],[qry库存].[城市],[qry库存].[品牌],[qry库存].[库存数] AS [预出数] FROM [qry库存]"
            DoCmd.SetWarnings True
               
        Else
            Exit Sub
        End If
        
        Me.frm明细chd.Requery
            
End Sub

作者: roych    时间: 2016-1-21 15:49
引用过去就好了,像我在2L的SQL语句那样。
作者: 紫风    时间: 2016-1-21 15:57
roych 发表于 2016-1-21 15:49
引用过去就好了,像我在2L的SQL语句那样。

谢谢版主的意见,可以2L的不是只能插入一行记录吗?我是要将查询出来的所有库存记录都插入TEMP表哦……
等于就是:
在TEMP表每插入一行,temp.单号=[forms]![主窗体].[单号],每行的单号都和主窗体的单号相同,而其它如货物、品牌、城市、数量那些,就都根据查询出来的库存来。
作者: roych    时间: 2016-1-21 16:08
本帖最后由 roych 于 2016-1-21 16:19 编辑
紫风 发表于 2016-1-21 15:57
谢谢版主的意见,可以2L的不是只能插入一行记录吗?我是要将查询出来的所有库存记录都插入TEMP表哦……
...

INSERT INTO  tbl明细temp(货物,城市,品牌,预出数)
SELECT [Forms]![frm主窗体]![货物] AS 货物,  库存子窗体查询.城市, 库存子窗体查询.品牌 [Forms]![frm主窗体]库存子窗体查询.预出数
FROM 库存子窗体查询;
---这里假定库存子窗体查询是一个查询
可能你不太理解吧。由于前面那段代码没有涉及到查询数据源的数据,所以只有1条记录。像上面的代码就不可能只有1条记录了,——除非查询数据源只有1条记录。[attach]57923[/attach]
好好理解里面的查询语句吧。。。。最后说一句,如果需要 解决问题,应该上传附件,而不是一味地贴代码。

作者: 紫风    时间: 2016-1-21 16:35
roych 发表于 2016-1-21 16:08
INSERT INTO  tbl明细temp(货物,城市,品牌,预出数)
SELECT [Forms]![frm主窗体]![货物] AS 货物,  库存 ...

谢谢版主!我明白了,一直以为SELECT都是只能从一个表或查询里拿数据……原来还可以这样的。
问题解决了,万分感谢!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3