我在Access中创建查询时遇到了一些问题。 我想要一个查询,在运行之后会询问表买家的新记录的名称和姓氏,然后为这个买家创建新表(例如,对于John Smith - 称为SmiJoh - 来自Surname的3个字母和来自姓名的3个字母)。
如果没有VBA,只使用SQL,如何做到这一点?
PS。如果没有机会使用SQL完成所有这些操作,是否有可能只查询创建具有此名称的表?
答案 0 :(得分:1)
您询问是否可以使用Access中的SQL执行此类操作,其中table_name是您在语句执行时提供的值。
CREATE TABLE [table_name](
id COUNTER CONSTRAINT pkey PRIMARY KEY,
date_field DATETIME);
不,Access'数据库引擎不允许您使用表名的参数。
但是就像你收到的评论一样,我鼓励你重新考虑你的计划,为每个买家创建一个单独的表格。这将是一个复杂的建立和维护。
使用单个表来保存所有买家的数据。包含一个字段以标识买方。然后使用查询,该查询仅检索buyer_id字段与当前用户的buyer_id匹配的行。使用该查询构建一个表单作为其记录源。这是一个示例表,其中uname字段包含Windows帐户名。
id uname time_only
5018 fred 7:00:00 AM
5063 hans 2:00:00 AM
5072 hans 3:00:00 AM
使用Dev Ashish的fOSUserName()函数(Get Login name),此查询仅返回uname与我的Windows用户名(hans)匹配的行。
SELECT d.id, d.uname, d.time_only
FROM discardme AS d
WHERE d.uname = fOSUserName();
我创建了一个基于该查询的表单,其中包含一个绑定到uname的文本框,其属性表的Data选项卡上包含这些属性:默认值= fOSUserName();和启用否。如果您不希望用户甚至看到uname值,请在“格式”选项卡上设置可见否。
您仍然需要锁定应用程序以防止用户直接打开表。但是,您的原始计划也需要为每个买家创建一个单独的表格。
如果您设置了ULS(用户级安全性),则需要类似的方法,这需要MDB格式db;较新的ACCDB db格式不支持它。在这种情况下,VBA CurrentUser()函数将返回Access安全性用户名的名称。相应地更改查询:
SELECT d.id, d.uname, d.time_only
FROM discardme AS d
WHERE d.uname = CurrentUser();
请注意,如果没有ULS,CurrentUser()将为您提供默认用户帐户Admin的名称。
最后考虑您的安全要求。使用Access'Jet / ACE进行数据存储,这相当于为合作用户提供指导。但是,无论您是否采用ULS,都不能绝对阻止用户查看任何数据。如果您的安全要求更严格,请将数据存储移动到客户端 - 服务器数据库(例如,SQL Server)。通过将ODBC链接替换为现有本机Jet / ACE表的服务器表,您仍然可以将Access应用程序用作前端。
答案 1 :(得分:0)
您是否尝试过使用EXEC
DECLARE @Name VARCHAR(6)
SET @Name = 'SMIJOH' --Query your table name
EXEC ('CREATE TABLE ' + @Name + ' (ID INT IDENTITY(1,1), etc....)')