2015-09-04 144 views
0

我是Access的新手,我試圖在我工作的地方構建一個表單。Access-VBA從一個表中提取相應的記錄寫入另一個表

我有一個mainform,它具有如下的組合框。

部:[MainDepartment]可能的值(焊接,繪畫,等。)

移位:[MainShift]可能的值(1,2,3)

日期:[MainDate]

我的mainform也有一個唯一的ID字段[ID]並鏈接到tblReportPersonnel。

tblPersonnel

PerID NameSurname Department Week1 Week2 Week3 ... Week52 

123  John Doe Welding  1  2   3  2 

456  James Rod Painting 2  3   1  1 

當用戶選擇日期,移位和部門我想運行VBA代碼從tblPersonnel查找匹配值和寫入的相應值與mainforms id來tblReportPersonnel。

此vba代碼需要將日期轉換爲weeknumber並將其用作列名稱。 我將使用其中一個mainform字段的AfterUpdate事件觸發VBA代碼。 tblReportPersonnel的表結構如下。

tblReportPersonnel

ID PerID 

785 123 

785 872 

785 578 

Private Sub fetch() 
Dim varWeek As String 
varWeek = Format([Forms]![Mainform]![MainDate] - 1, "ww") 
CurrentDb.Execute "SELECT tblPersonnel.[PerID]" 
From Personel 
WHERE (((Personel.varWeek)=[Forms]![MainForm]![MainShift] And ((tblPersonnel.Department)=[Forms]![MainForm]![MainDepartment)); 
End Sub 

感謝

+0

重新考慮你在人事表中做了什麼,做一個快速的規範化搜索。任何時候當你看到一個帶有「week1」,「week2」,「week3」等字段的表格時......通常表示設計不正確的表格結構。使用EmployeeID(FK),WeekNum,WeekValue等表結構可以簡化您的工作。在你的表單上,你已經知道了employeeID,然後計算weekNum,然後運行一個查詢來查找相應的值。 – Gene

+0

我正在進入員工將在52周內工作的班次。 –

+0

我明白了,只是說桌子設計不當。你讓自己變得更加困難,那麼你也是。正確設置表格,它變得更簡單。 – Gene

回答

0

謝謝大家,世衛組織推動我找到自己的答案。

Private Sub Answer() 
On Error GoTo ErrorHandler 
Dim strSQL As String 
Dim rs As DAO.Recordset 
Dim hafta As Integer 
hafta = Format([Forms]![Ana]![Text4] - 1, "ww") 
Debug.Print hafta 

strSQL = "SELECT [Personel].[Sicil no] FROM [Personel] WHERE [Personel].[" & hafta & "] = " & [Forms]![Ana]![Combo25] & " And [Personel].[Bölüm] = '" & [Forms]![Ana]![Combo23] & "'" 

Set rs = CurrentDb.OpenRecordset(strSQL) 
With rs 
If Not .BOF And Not .EOF Then 
    .MoveLast 
    .MoveFirst 
While (Not .EOF) 
    Debug.Print rs![Sicil no] 
    'DoCmd.SetWarnings False 
    DoCmd.RunSQL "INSERT INTO [RaporPersonel] ([ID], [Sicil no]) VALUES ('" & [Forms]![Ana]![Text0] & "' , " & rs![Sicil no] & ")" 
'DoCmd.SetWarnings True 

    .MoveNext 
Wend 
End If 
.Close 
End With 
ExitSub: 
Set rs = Nothing 

Exit Sub 
ErrorHandler: 
    Resume ExitSub 
End Sub 

這次我沒有將字段名翻譯成英文。 但它會對尋找相同答案的人有所幫助。

此代碼;

+將日期從主窗體轉換爲星期數。

+然後轉至人員表並根據mainform和date上的兩個複選框檢查是否存在匹配的記錄。

+然後將結果寫入另一個名爲ReportPersonnel的表格中,並使用主窗體的唯一ID。

之後我會加強代碼。我將在mainform上創建一個連續子表單,並在代碼之後重新查詢子表單。

我創建此代碼的原因是;

當用戶選擇自己的部門,日期和從主窗體 的轉變時,該列表將自動填入連續表單。這就是爲什麼用戶不必手動選擇輪班人員的原因。

並且用戶將輸入關於該人員的更多細節。

再次感謝。

0

你會發現與tblPersonnel有所有這些周列將導致你寫了很多複雜的代碼編寫的數據庫。

你的tblPersonnel有很多列,在我所說的「寬格式」中。

當您使用數據庫時,您需要對數據進行規範化處理,並最終得到非常長的數據列表(「​​長格式」)。

欣賞最重要的事情是:

  1. 用戶喜歡用寬數據工作,因爲它可以幫助他們做數據錄入和查看數據,但

  2. 數據庫需要存儲的數據,只要數據運作良好。

  3. 更重要的是,獲取數據庫來轉換長數據並將其顯示爲寬數據,然後允許用戶編輯它,這是一場噩夢。不要去那兒!

我在這裏創造了一個視頻:https://www.youtube.com/watch?v=kT3WnyYjULk,其中討論了使用在Excel中,寬格式的數據和演示各自的優勢。

它提供的一些內容可能對您有用(並且它演示了PowerQuery,值得了解)。

要重新說明Gene的說法,我想給你的VBA和Access的經驗,你應該使用Excel來滿足你的用戶需求。 (但是,請注意,如果您需要稍後在數據庫中使用它,則可以始終使用powerquery將數據從寬格式轉換爲長格式,並且這樣工作起來更容易)。

相關問題