2011-08-22 103 views
0

我有一些在Access中創建查詢的問題。 我想要一個查詢,運行後詢問表買家的新記錄的名字和姓氏,然後爲這個買家創建新表(例如約翰史密斯 - 稱爲SmiJoh - 來自Surname的3個字母和來自名稱)。創建表 - 動態名稱的表

任何想法如何做到這一點沒有VBA,只使用SQL?

PS。如果沒有機會使用SQL來完成所有這些操作,那麼是否有可能只使用這個名稱查詢創建表?

+4

這是一個壞主意,即時創建自定義表。爲什麼每個買家需要一張桌子? – Jacob

+0

我在寫作中的錯誤 - 表格將被稱爲買方。所以我的想法是,數據庫的每個用戶只能訪問他的表,並在那裏添加他與他進行交易的客戶,交易成本等等。並且會有一個管理員,它可以訪問MainTable,其中將有所有買家的記錄。 – Amber

+2

同樣的原則仍然適用。將交易放入交易表中,將顧客放入顧客表中,將買家放入買家表中並將其與主鍵/外鍵鏈接起來。 – Jacob

回答

0

您是否嘗試過使用EXEC

DECLARE @Name VARCHAR(6) 
SET @Name = 'SMIJOH' --Query your table name 
EXEC ('CREATE TABLE ' + @Name + ' (ID INT IDENTITY(1,1), etc....)') 
+2

MS Access似乎沒有聲明執行動態查詢,從我聽到的。你發佈的內容很可能是SQL Server的東西,它不適用於MS Access。 –

1

你問你是否可以做這樣的事情與SQL Access中,其中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 

隨着開發Ashish的fOSUserName()函數(Get Login name),這個查詢只返回其中UNAME我的Windows用戶名(漢斯)相匹配的行。

SELECT d.id, d.uname, d.time_only 
FROM discardme AS d 
WHERE d.uname = fOSUserName(); 

我創建基於該查詢,其包括結合於uname其屬性表的數據標籤對這些性質的文本框的一種形式:默認值= fOSUserName();和已啓用否。如果您不希望用戶看到uname值,請在格式選項卡上設置Visible No

您仍然需要鎖定應用程序以防止用戶直接打開表格。但是,您的原始方案也需要爲每個買方創建一個單獨的表格。

如果您設置了需要MDB格式數據庫的ULS(用戶級安全性),則可以使用類似的方法;它在新的ACCDB數據庫格式中不受支持。在這種情況下,VBA CurrentUser()函數將返回Access安全用戶名的名稱。相應地更改查詢:

SELECT d.id, d.uname, d.time_only 
FROM discardme AS d 
WHERE d.uname = CurrentUser(); 

注意,如果沒有ULS,CurrentUser()會給你的默認用戶帳戶的名稱,管理員。

最後考慮你的安全需求。使用Access的Jet/ACE進行數據存儲將爲合作用戶提供指導。但是,無論您是否採用ULS,您都無法完全阻止用戶查看任何數據。如果您的安全要求更嚴格,請將數據存儲移到客戶端 - 服務器數據庫(例如SQL Server)。通過將ODBC鏈接替換爲現有的本機Jet/ACE表的服務器表,您仍然可以將Access應用程序用作前端。