2012-03-01 98 views
2

我被卡住了,需要幫助/建議。我非常肯定,我不是第一個遇到這個問題,但我似乎無法在網上找到答案。Access 2007:將值插入數據庫的交叉表視圖

我們正在收集來自許多工廠的各種數據。這主要是預測年度高峯產量等數據。每年重複收集數據。

我們目前保持這個數據在Excel中,它具有以下結構的軌道:

Factory | 2010 | 2011 | 2012 | .. 
---------------------------------- 
A  | 20 | 30 | 28 | .. 
B  |  | 39 | 55 | .. 

在這個例子中B工廠剛剛起步的生產在2011年。如果我們收集的資料額外的一年,我們只需添加一列即可。如果預測數據發生變化,我們只需輸入新值並丟失舊值。你可以想象這種工作方式有其侷限性:表格對於缺失數據變得相當稀疏。舊值不能追溯。沒有提及價值的來源。

爲了滿足我們對更好系統的需求,我把我古老的數據庫知識運用起來。在Access 2007年,我創建了以下結構:

表:工廠

FacID | FactoryName 
--------------------- 
1  | A 
2  | B 

表:來源

SouID | Source | SourceDate 
--------------------------------- 
1  | DocumentX | Sep. 2009 
2  | DocumentY | Jan. 2010 

表:參數

ParID | FacID | SouID | ParamType  | Year | Value 
------------------------------------------------------ 
1  | 1  | 1  | PeakProduction | 2010 | 20 
2  | 1  | 1  | PeakProduction | 2011 | 30 
3  | 1  | 1  | PeakProduction | 2012 | 28 
4  | 2  | 1  | PeakProduction | 2011 | 39 
5  | 2  | 2  | PeakProduction | 2012 | 55 

對於每一個新的數據收集我們只是添加一個新的源文件並追加參數表。通過這種方式,我們總是可以恢復到舊數據。此外,如果收集更多年份,則無需向任何表格添加額外的列。

雖然實際的設置比較複雜,但上面的例子足以說明我遇到的問題:要將數據輸入到數據庫中,我希望有一個類似於原始Excel工作表佈局的單一表單,即:

Factory | 2010 | 2011 | 2012 | 
------------------------------ 
A  |  |  |  | 
B  |  |  |  | 

當然,這種形式將有一定的下拉菜單來選擇源文件和參數類型(在該示例中「PeakProduction」)。

我的問題:使用交叉表查詢很容易根據數據庫中的現有數據創建此類視圖,但是不允許輸入新值。我能做些什麼來做這件事,以及如何做?

我應該重新考慮我的數據庫的設計嗎?我應該使用VBA嗎? Access數據庫與Excel工作表連接?

謝謝!

+0

這是幾乎從來沒有一個好主意,複製從Excel東西在任何數據庫前端,但是,這裏是一個想法:http://wiki.lessthandot.com/index.php/Crosstabs,_forms_and_updating – Fionnuala 2012-03-01 13:28:24

+0

交叉表查詢不是爲允許數據輸入而設計的,通常是因爲視圖可能來自多個表,並且您必須滿足所有索引等,或者您不會在一個交叉表查詢中顯示所有表字段 – 2012-03-01 13:32:47

+0

你是Remou提供的鏈接。它爲我的問題演示了一個優雅的解決方案,它可以很好地用於手動輸入有限的數據集。但是,將Excel數據表中的大型數據集複製/粘貼到Access表單似乎並不直接。 – Rutger 2012-03-05 09:42:04

回答

0

如果您正在處理標準化爲表格的二維數據,那麼用戶維護使用Access時會出現問題。我的方法是使用適當的工具來完成這項工作,在這種情況下,它看起來像Excel。我有一個用於數據錄入的Excel電子表格模板。用戶將數據輸入到該數據中。然後在VBA中,我打開電子表格作爲嵌入對象,檢索單元格內容並將其插入到表格中。像下面的東西。

dim myRec as recordset 
dim xlApp as Excel.application 
dim xlWrksht as Excel.worksheet 


set myRec=currentdb.openrecordset("NameOfTable") 
set xlApp=createobject("Excel.Application") 
set xlWrksht=xlApp.Open("PathOfWorksheet").Worksheets("WorksheetNumber") 

myrec.addnew 
myrec.fields("NameOfFields")=xlWrkSht.cells(1,"A") 
...... 
myRec.update 
+0

非常感謝Chris,我正在實施您的解決方案。看起來很有前途,也是最好的前進方式! – Rutger 2012-03-05 09:43:26