2015-09-04 194 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将数据从宽格式转换为长格式,并且这样工作起来更容易)。

相关问题