访问操作查询因VBA调用而失败,但已成功手动执行

时间:2017-07-13 15:14:01

标签: sql vba ms-access odbc

我在MS Access中有三个不同的INSERT INTO查询。查询正在查询数据库中的ODBC链接表。从Access手动运行时,所有工作正常。所有这些都需要不到1分钟,并返回16,000到3,000条记录。

当我尝试从Access VBA模块执行查询时,其中两个查询工作正常,但在其中一个查询中,execute语句永远不会运行。它没有超时或错误。当我破坏代码时,它总是挂在此特定查询的CurrentDb.Execute strQRY行。

它有很多空字段,因为它之后是另一个查询的UNION-ed。我尝试过更改超时属性并以不同方式调用执行语句,但没有任何帮助。手动执行时,查询在10秒内运行。 VBA和SQL发布在下面:

VBA - 执行方法。首先清除所有记录,然后运行插入查询:

DoCmd.RunSQL "DELETE * FROM " & strTBL
CurrentDb.Execute strQRY

SQL - 所有存储在查询中的名称:

INSERT INTO src_subqry_PDF_Text_Notes
SELECT *
FROM (

     SELECT

        LOGICLIB_MFTXL300.CMPNO,
        Null As VNDNO,
        Null As VNAME,
        Null as NeedXRef,

        Null As BUYER,
        Null As BMNAM,
        LOGICLIB_MFTXL300.[PONO#] As PURCH,
        LOGICLIB_INPOL300.[LINE#] As [LINEN],
        LOGICLIB_MFTXL300.[PROD#] As PRDNO,
        Null As SDESC,
        Null As DESCP,

        Null As PODDT,
        Null As OREDT,
        Null As PORDT,
        Null As RQ3DT,

        Null As ECOST,
        Null As LNCST,
        Null As ACOST,
        Null as NeedOpenCost,
        Null As PCRCD,

        Null As QUANO,
        Null As QUANR,
        Null as NeedQtyOpenBase,
        Null As UTMES,

        Null As P3QOR,
        Null As P3QRC,
        Null as NeedQtyOpenPURCH,
        Null As ORDUM,

        Null as NeedOrderType,
        'Z' As LNTYP,
        Null As LSTAT,
        Null As PSTAT,
        Null As POTYP,
        Null As P1PAP,  
        Null As PAPV1,
        Null As PAPV2,
        Null As PAPV3,
        Null As PAPV4,
        Null As PA1DT,
        Null As PA2DT,
        Null As PA3DT,
        Null As PA4DT,

        Null As POCST,
        Null As POFOB, 
        Null As SHIPV, 
        Null As CARIR, 
        Null As FGTRM, 
        Null As PPHOA, 
        Null As REQNO,                

        Null As VADD1, 
        Null As VADD2, 
        Null As VADDX,
        Null As VACSZ, 
        Null As VPHOA, 
        Null As VAPGL, 
        Null As VMED1, 
        Null As VTXB1, 

        Null As CNAME, 
        Null As ADDR1, 
        Null As ADDR2, 
        Null As ADDRX, 
        Null As CACSZ,  

        [TXSQ#], 
        TXTDT

    FROM
        LOGICLIB_MFTXL300 
        LEFT JOIN LOGICLIB_INPOL300 ON (LOGICLIB_INPOL300.PURCH = LOGICLIB_MFTXL300.[PONO#] AND LOGICLIB_INPOL300.PRDNO = LOGICLIB_MFTXL300.[PROD#])

    WHERE
        PURCH IN (SELECT DISTINCT PURCH FROM LOGICLIB_INPOL100 WHERE(PSTAT <> 'Y'))

    )

谢谢!

2 个答案:

答案 0 :(得分:0)

建议您明确引用7个字段以填充和删除所有Null字段。不需要SELECT * FROM

INSERT INTO src_subqry_PDF_Text_Notes (CMPNO, PURCH, LINEN, PRDNO, LNTYP, [TXSQ#], TXTDT)
    SELECT
        LOGICLIB_MFTXL300.CMPNO,
        LOGICLIB_MFTXL300.[PONO#],
        LOGICLIB_INPOL300.[LINE#],
        LOGICLIB_MFTXL300.[PROD#],
        'Z' AS LNTYP,
        [TXSQ#], 
        TXTDT
    FROM
        LOGICLIB_MFTXL300 
        LEFT JOIN LOGICLIB_INPOL300 ON (LOGICLIB_INPOL300.PURCH = LOGICLIB_MFTXL300.[PONO#] AND LOGICLIB_INPOL300.PRDNO = LOGICLIB_MFTXL300.[PROD#])
    WHERE
        PURCH IN (SELECT DISTINCT PURCH FROM LOGICLIB_INPOL100 WHERE PSTAT <> 'Y')

建议不要在名称中使用标点符号/特殊字符(仅限下划线异常)。更好的是PONONum或PONO_NUM。全部大写也不是首选,因为它更难阅读。

答案 1 :(得分:0)

昨晚有这个工作。我希望这可以帮助任何有类似问题的人。

我认为根本原因是原始SELECT DISTINCT语句中的WHERE子句。我仍然不知道为什么查询仅在通过VBA执行时失败,但我改为在JOIN而不是WHERE子句中添加更多逻辑。

INSERT INTO src_subqry_PDF_Text_Notes (PURCH, CMPNO, LINEN, PRDNO, LNTYP, [TXSQ#], TXTDT)
    SELECT 
        LOGICLIB_INPOL100.PURCH,
        LOGICLIB_MFTXL300.CMPNO,
        LOGICLIB_INPOL300.[LINE#],
        LOGICLIB_MFTXL300.[PROD#],
        'Z' AS LNTYP,
        LOGICLIB_MFTXL300.[TXSQ#], 
        LOGICLIB_MFTXL300.TXTDT
    FROM
        ((LOGICLIB_INPOL100
        LEFT JOIN LOGICLIB_INPOL300 ON (LOGICLIB_INPOL100.PURCH = LOGICLIB_INPOL300.PURCH AND LOGICLIB_INPOL100.CMPNO = LOGICLIB_INPOL300.CMPNO))
        LEFT JOIN LOGICLIB_MFTXL300 ON (LOGICLIB_INPOL300.PURCH = LOGICLIB_MFTXL300.[PONO#] AND LOGICLIB_INPOL300.PRDNO = LOGICLIB_MFTXL300.[PROD#] AND LOGICLIB_INPOL300.CMPNO = LOGICLIB_MFTXL300.CMPNO))
    WHERE
        LOGICLIB_INPOL100.PSTAT <> 'Y' AND LOGICLIB_MFTXL300.[TXSQ#] > 1

感谢June7将SQL简化为显式字段,以便于在线阅读。