访问-更新导入的数据

时间:2018-08-20 14:46:33

标签: vba ms-access

早晨,数据从 Microsoft Navision 被拉到 Excel ...

enter image description here

然后将这些数据复制到Access中,在其中将其用于生产计划等。将这些数据复制到Access中时,会添加一些额外的列以帮助进行计划和可追溯性,即剪切,折叠,完成。

enter image description here

我想做的是,如果我们再次运行Microsoft Navision报告,并说A3,A5和A12状态都已更改为已完成,将所有这些行粘贴到Access中,状态将根据Prod更改。与该状态相关的订单号。

1 个答案:

答案 0 :(得分:1)

请考虑使用Access中的临时表来定期清除以前的表并导入当前的Excel输出。然后,使用条件IIF逻辑对最终Access表运行一个更新内部联接查询。

下面是三个操作命令,您可以将它们保存为三个单独的查询,并在导入过程中使用DoCmd.OpenQueryCurrentDb.Execute在VBA中一起运行它们。当然要调整为实际名称。

删除临时表中的所有数据

DELETE FROM ExcelTempTable;

附加到临时表

INSERT INTO ExcelTempTable
SELECT * 
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Workbook.xlsx].[SheetName$] AS t;

更新最终表

UPDATE AccessFinalTable a
INNER JOIN ExcelTempTable e ON a.[Production Number] = e.[ProdOrderNo] 
SET a.Finished = IIF(e.Status = 'Finished', True, False),
    a.Folded = IIF(e.Status = 'Folded', True, False),
    a.Cut = IIF(e.Status = 'Cut', True, False);

追加最终表(仅追加新生产编号的记录)

INSERT INTO AccessFinalTable (Col1, Col2, Col3, ...)
SELECT e.Col1, e.Col2, e.Col3, ...
FROM ExcelTempTable e
LEFT JOIN AccessFinalTable a
ON e.[Production Number] = a.[ProdOrderNo] 
WHERE a.[Production Number] IS NULL