Office中国论坛/Access中国论坛

标题: [实在弄不懂了,求高手安慰]关于Insert into select报错。 [打印本页]

作者: 秒弑    时间: 2012-1-20 01:17
标题: [实在弄不懂了,求高手安慰]关于Insert into select报错。
代码很短,如下:
  1. Private Sub Form_Load()
  2. Dim strtime As String
  3. Dim tbl As DAO.TableDef
  4. For Each tbl In CurrentDb.TableDefs
  5.     If Left(tbl.Name, 2) = "行情" Then
  6.         strtime = Right(tbl.Name, 8)
  7.         If IsNull(DLookup("时间", "指数表", "时间='" & strtime & "'")) Then
  8.             DoCmd.SetWarnings False
  9.             DoCmd.RunSQL "insert into 指数表(时间,深主,沪市) select '" & strtime & "',(select sum(最新*A股)/333048.163 from " & tbl.Name & " where 类别 = 'SZ') ,(select sum(最新*A股)/333048.163 from " & tbl.Name & " where 类别 = 'SH')"
  10.         End If
  11.     End If
  12. Next
  13. Me.ChildShow.Form.RecordSource = "指数表"
  14. End Sub
复制代码
报错如下:
[attach]48141[/attach]
程序如下:
[attach]48142[/attach]
作者: Henry D. Sy    时间: 2012-1-20 09:56
[attach]48143[/attach]
  1. Private Sub Form_Load()
  2.     Dim sSQL As String
  3.     Dim dblSZ As Double
  4.     Dim dblHS As Double
  5.     Dim strtime As String
  6.     Dim tbl As DAO.TableDef
  7.     For Each tbl In CurrentDb.TableDefs
  8.         If Left(tbl.Name, 2) = "行情" Then
  9.             dblSZ = Nz(DSum("最新 * A股 / 333048.163", tbl.Name, "类别 = 'SZ'"))
  10.             dblHS = Nz(DSum("最新 * A股 / 333048.163", tbl.Name, "类别 = 'SH'"))
  11.             strtime = Right(tbl.Name, 8)
  12.             If IsNull(DLookup("时间", "指数表", "时间='" & strtime & "'")) Then
  13.                 DoCmd.SetWarnings False
  14.                 sSQL = "insert into 指数表(时间,深主,沪市) values( '" & strtime & "'," & dblSZ & "," & dblHS & ")"
  15.                 CurrentDb.Execute sSQL
  16.             End If
  17.         End If
  18.     Next
  19.     Me.ChildShow.Form.RecordSource = "指数表"
  20. End Sub
复制代码
[attach]48143[/attach]
作者: Henry D. Sy    时间: 2012-1-20 10:01
DoCmd.SetWarnings False
也可以去掉
作者: 秒弑    时间: 2012-1-20 12:17
受教了,再询问下,如何加入判断句,如果"最新"为空值,则计算“昨收 * A股”,否则还是计算“最新 * A股”?
作者: godzhong    时间: 2012-1-20 12:22
用IIf(expr, truepart, falsepart)函数,可以在sql语句中使用的
作者: Henry D. Sy    时间: 2012-1-20 12:33
秒弑 发表于 2012-1-20 12:17
受教了,再询问下,如何加入判断句,如果"最新"为空值,则计算“昨收 * A股”,否则还是计算“最新 * A股” ...

建议建立一个查询,在查询里判断。
然后再dsum这个查询。因为你表中不可能最新都为空吧!
作者: Henry D. Sy    时间: 2012-1-20 12:52
先用查询把数据整理好
  1. Private Sub Form_Load()
  2.     Dim sSQL As String
  3.     Dim dblSZ As Double
  4.     Dim dblHS As Double
  5.     Dim strTime As String
  6.     Dim qdf As DAO.QueryDef
  7.     For Each qdf In CurrentDb.QueryDefs
  8.         If Left(qdf.Name, 1) = "A" Then
  9.             strTime = Right(qdf.Name, 8)
  10.             If IsNull(DLookup("时间", "指数表", "时间='" & strTime & "'")) Then
  11.                 dblSZ = Nz(DSum("深沪", qdf.Name, "类别 = 'SZ'"))
  12.                 dblHS = Nz(DSum("深沪", qdf.Name, "类别 = 'SH'"))
  13.                 sSQL = "insert into 指数表(时间,深主,沪市) values( '" & strTime & "'," & _
  14.                        dblSZ & "," & dblHS & ")"
  15.                 CurrentDb.Execute sSQL
  16.             End If
  17.         End If
  18.     Next
  19.     Me.ChildShow.Form.RecordSource = "指数表"
  20. End Sub
复制代码
[attach]48147[/attach]
作者: 秒弑    时间: 2012-1-20 13:20
因为行情表是每天都有一张,如果每天导入一张新表,那么都要建立一张查询表,操作性会比较麻烦。
请教H版,如果用VBA代码判断。能否实现?
作者: Henry D. Sy    时间: 2012-1-20 21:26
秒弑 发表于 2012-1-20 13:20
因为行情表是每天都有一张,如果每天导入一张新表,那么都要建立一张查询表,操作性会比较麻烦。
请教H版, ...
  1. Private Sub Form_Load()
  2.     Dim sSQL As String
  3.     Dim dblSZ As Double
  4.     Dim dblHS As Double
  5.     Dim strTime As String
  6.     Dim tbl As DAO.TableDef
  7.     Dim qdf As DAO.QueryDef
  8.     Set qdf = CurrentDb.QueryDefs("A")
  9.     For Each tbl In CurrentDb.TableDefs
  10.         If Left(tbl.Name, 2) = "行情" Then
  11.             strTime = Right(tbl.Name, 8)
  12.             If IsNull(DLookup("时间", "指数表", "时间='" & strTime & "'")) Then
  13.                 sSQL = _
  14.                 "SELECT 类别, 昨收, 最新, A股, (IIf(IsNull([最新]),[昨收],[最新]))*[A股]/333048.163 AS 深沪 FROM " _
  15.                      & tbl.Name
  16.                 qdf.SQL = sSQL
  17.                 dblSZ = Nz(DSum("深沪", "A", "类别 = 'SZ'"))
  18.                 dblHS = Nz(DSum("深沪", "A", "类别 = 'SH'"))
  19.                 sSQL = "insert into 指数表(时间,深主,沪市) values( '" & strTime & "'," & _
  20.                        dblSZ & "," & dblHS & ")"
  21.                 CurrentDb.Execute sSQL
  22.             End If
  23.         End If
  24.     Next
  25.     Me.ChildShow.Form.RecordSource = "指数表"
  26.     qdf.Close
  27.     Set qdf = Nothing
  28. End Sub
复制代码
[attach]48160[/attach]
作者: 秒弑    时间: 2012-1-21 00:29
受教了,H版,正是这一句不会写。每次都能跟您学到很多东西。
  1. (IIf(IsNull([最新]),[昨收],[最新]))*[A股]/333048.163 AS 深沪
复制代码

作者: Henry D. Sy    时间: 2012-1-21 10:46
如果能保证“最新”,“昨收”不会同时为Null,则Nz函数可以去掉!




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