动态创建/更新MS Access中的表

时间:2017-06-27 15:28:12

标签: sql-server ms-access access-vba

编辑:

这就是我所拥有的:一个Access数据库,由3个从SQL Server链接的表组成。我需要通过查询3个源表在这个数据库中创建一个新表。以下是我使用的3个表的示例:

PlanTable1
+------+------+------+------+---------+---------+
| Key1 | Key2 | Key3 | Key4 |  PName  | MainKey |
+------+------+------+------+---------+---------+
|   53 |    1 |    5 |   -1 | Bikes   |  536681 |
|   53 |   99 |   -1 |   -1 | Drinks  |  536682 |
|   53 |   66 |   68 |   -1 | Balls   |  536683 |
+------+------+------+------+---------+---------+

SpTable
+----+---------+---------+
| ID | MainKey | SpName  |
+----+---------+---------+
| 10 |  536681 | Wing1   |
| 11 |  536682 | Wing2   |
| 12 |  536683 | Wing3   |
+----+---------+---------+

LocTable
+-------+-------------+--------------+
| LocID | CenterState |  CenterCity  |
+--- ---+-------------+--------------+
| 10    | IN          | Indianapolis |
| 11    | OH          | Columbus     |
| 12    | IL          | Chicago      |
+-------+-------------+--------------+

您可以看到表格之间的关系。我需要基于这些创建的NewMasterTable看起来像这样:

NewMasterTable
+-------+--------+-------------+------+--------------+-------+-------+-------+
| LocID | PName  | CenterState | Key4 |  CenterCity  | Wing1 | Wing2 | Wing3 |
+-------+--------+-------------+------+--------------+-------+-------+-------+
| 10    | Bikes  | IN          |   -1 | Indianapolis |     1 |     0 |     0 |
| 11    | Drinks | OH          |   -1 | Columbus     |     0 |     1 |     0 |
| 12    | Balls  | IL          |   -1 | Chicago      |     0 |     0 |     1 |
+-------+--------+-------------+------+--------------+-------+-------+-------+

对我来说,困难的部分是使这个新表动态化。将来,可以将行添加到源表中。我需要我的NewMasterTable来反映源的任何更改/添加。如何按照描述构建NewMasterTable?这有什么意义吗?

1 个答案:

答案 0 :(得分:0)

由于Access表是必需的,因此可能唯一的方法是创建一组定期执行的Update和Insert查询。 Access没有内置的“动态”功能,可以监控和更新表格。

首先,创建表格。您可以1)通过自己定义列和约束从头开始手动执行此操作,或者2)创建生成大部分模式的生成表查询(即SELECT ... INTO),然后添加任何其他列,编辑必要的细节并添加适当的索引。

定义并保存更新和插入(以及可选的删除)查询以保持表同步。我不是在这里分享实际代码,因为这超出了我认为的主要问题,需要您需要定义的细节。由于您的键值存在一些模糊性(字段名称和样本数据仍不足以显示精确的关系和约束),因此您可能需要多个更新语句。

  • 特别是,“Wing”列可能需要转换语句。
  • 您可能无法使用单个查询正确更新所有列。我建议不要强迫这样的“人为”要求。实际上,多个查询可以更容易理解和维护。
  • 如果遇到“查询不可更新”错误,您可能需要定义具有适当索引的其他“临时”表,从链接表中进行初始插入,然后更新主表的后续查询来自那些。

最后,我认为这是解决问题的关键,您需要定义一些定期运行“同步”查询的Access表单(或其他代码)。访问表单具有[Timer Interval]属性和定期触发的相应Timer事件。在运行所有查询的Form_Timer子中添加VBA代码。我建议在事务中“包装”这样的VBA并添加适当的错误处理和错误记录等。