Access-VBA从一个表写入相应的记录写入另一个表

时间:2015-09-04 09:11:37

标签: vba ms-access

我是Access的新手,我正在尝试构建一个在我工作的地方使用的表单。

我有一个具有如下组合框的主变形。

部门:[主要部门]可能的值(焊接,绘画等)。

Shift:[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代码需要将date转换为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

由于

2 个答案:

答案 0 :(得分:0)

你会发现用tblPersonnel编写一个包含所有那些周列的数据库会导致你编写很多复杂的代码。

你的tblPersonnel有很多列,我称之为“宽格式”。

当您使用数据库时,您需要规范化数据,最终得到一个非常长的数据列表(“​​长格式”)。

最值得欣赏的是:

  1. 用户喜欢处理大数据,因为它可以帮助他们进行数据录入和查看数据但是

  2. 数据库需要将数据存储为长数据才能正常运行。

  3. 更重要的是,获取数据库来转换长数据并将其显示为宽数据然后允许用户编辑它是一场噩梦。不要去那儿!

  4. 我在这里创建了一个视频:https://www.youtube.com/watch?v=kT3WnyYjULk,它讨论了在excel中使用长格式和宽格式数据并演示每种格式的好处。

    它提供的一些内容可能对您有用(并且它演示了值得了解的PowerQuery)。

    重新迭代Gene所说的内容,我认为根据您使用VBA和Access的经验,您应该使用Excel来满足用户的要求。 (但是,请注意,如果您需要稍后在数据库中使用它,您可以随时使用powerquery转换数据并将数据从宽格式转换为长格式 - 并且它更容易像这样工作。)

答案 1 :(得分: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

这次我没有将字段名称翻译成英文。 但是对于寻找相同答案的人来说会很有帮助。

此代码;

+从主窗体中将日期转换为星期数。

+然后转到人员表并根据主窗体和日期上的两个复选框检查是否有匹配的记录。

+然后将结果写入另一个名为ReportPersonnel的表,其中包含主表单的唯一ID。

之后我会更多地增强代码。我将在mainform上创建一个连续的子表单,并在代码之后重新查询子表单。

我创建此代码的原因是;

当用户选择自己的部门时,日期和主表单的转换, 列表将自动以连续形式填充。这就是为什么用户不必手动选择40名人员。

用户将输入有关该人员的更多详细信息。

再次感谢。