MS Access,使用查询名称作为字段默认值

时间:2018-03-27 15:46:18

标签: database ms-access

我的部门使用的软件工具可以使用源自MS Access数据库中的表或查询的自定义组件库。

Table: Components
  ID:   AutoNumber
  Type: String
  Mfg:  String
  P/N:  String
  ...

Query: Resistors
  SELECT Components.*
  FROM Components
  WHERE Components.Type = "Resistors"

Query: Capacitors
  SELECT Components.*
  FROM Components
  WHERE Components.Type = "Capacitors"

这些查询适用于SELECT。但是当用户向查询添加行时,如何确保将正确的值保存到“类型”字段?

1 个答案:

答案 0 :(得分:1)

编辑#2:

不,不能做。遗憾。

编辑#1:

正如所指出的,我可能误解了这个问题。毕竟,这不是一个不稳定的问题,但也许是一个简单的问题?

如果您正在询问如何向表中添加记录,同时确保例如“记录显示在Resistor查询中是否为Resistor”,那么它是一个常规追加查询,指定{{1 } {} Resisitors

例如:

Type

如果您已经尝试过并且遇到问题,可能是因为您使用保留字作为字段名称,虽然它有时会起作用,但可能会以意想不到的方式导致问题。

INSERT INTO Components ( ID, Type, Mfg ) SELECT 123, 'Resistors', 'Company XYZ' 是Access,SQL和VBA都用于特定目的的词。这与您使用TypeSELECT作为字段或表名称的想法相同。 (FROM)。

这是一般应该避免的list of reserved words。 (我意识到它被标记为Access 2007,但列表非常相似,并且很难找到Excel VBA最近的“官方”列表。)

原始答案:

这是一种不可思议的做事方式。数据库的要点是以这样的方式组织,以防止不仅重复数据,而且重复查询和代码

我编写了自己使用的编程规则“如果你做的不止一次,那你做错了。” all

唯一选项是“SELECT SELECT FROM FROM”和“Resistors”吗? (...我希望你没有跟踪电子产品供应商店的库存......)如果有可能的选择,那就更有理由寻找替代方法。

要回答您的问题,请在“查询设计”窗口中不可能返回打开查询的名称。

一些替代选项:

  • 由于@Erik建议,约束到表单上的控件。也许有一个下拉或选项按钮,用户可以选择相关的类型。然后您的查询将如下所示:

    Capacitors

  • 在VBA中,让查询引用变量的值,例如:

    SELECT * FROM Components WHERE Type = 'Forms![YourFormName]![NameOfYourControl]'
    Dim TypeToDel as String
    TypeToDel = "Resistor"

  • 不推荐,但您可以让用户手动输入条件。如果您的查询是这样的:

    DoCmd.RunSQL "SELECT * FROM Components WHERE Type = '" & typeToDel'"

    ...然后每次运行查询时,都会提示:

    img

  • 同样,您可以为选项提供查询提示,可能是单个数字或代码,并让查询选择适当的条件:

    img2

...并在查询条件中包含SELECT * FROM Components WHERE Type = '[Enter the component type]'语句。

IF

请注意,如果您有两个以上的选项,则需要多次使用参数框,并且拼写必须相同。

  • 最后,如果您仍然要为每种组件类型采取单独查询的路径,只要您正在进行单独的查询无论如何,为什么不放一个每个人的静态值(就像你的例子一样):

    SELECT * FROM Components WHERE Type = IIf([Enter 1 for Resistors, 2 for Capacitors, 3 for sharks with frickin' laser beams attached to their heads]=1,'Resistors',IIf([Enter 1 for Resistors, 2 for Capacitors, 3 for sharks with frickin' laser beams attached to their heads]=2,'Capacitors','LaserSharks'));

还有另一个不稳定的答案here,但这只是创造了更多重复的信息(以及更多未来的错误)。

旁注 SELECT * FROM Components WHERE Type = 'Resistor' 是Access&中的保留字。 VBA;你可能最好选择另一个。 (我通常用Type之类的相关字母作为前缀。)

更多信息: