如何用相同的数据填充多个报告字段?访问权限
How to populate multiple report fields with same data? MS ACCESS
智慧IT社区
我有一个查询,其中某些字段填充了有效数据,然后为空白。
这本身不是问题。
当我希望查询中的一个字段用相同的数据填充报告中的多个字段时,问题就来了。
表 1 = TB_Short_Title。
此table仅包含查询结果中每一行的主数据
TB_Short_Title!Short_Title = 主键
Id
Short_Title
Supersessionrate
Supersession_Interval
1
Short-Title 1
12
ww
2
Short-Title 2
6
m
3
Short-Title 3
12
m
4
Short-Title 4
1
m
Supersessionrate和Supersession_Interval用于计算下一个ED_Start_Date和ED_Expirier_Date
在创建短标题的第一版时,系统会提示用户输入 Eddition_Txt 和第一个 ED_Start_Date,然后输入 VBA:
注意:VBA包含插入版本的代码,添加下一版本并自动计算ED_Start_Date和ED_Expirier_Date。
Function Ammend_ED(EditionCount As Integer)
Dim FirstEdition As Long
Dim FirstEditionText As String
Dim LastEdition As Long
Dim LastEditionText As String
Dim NewEd As String
Dim varTotal As Integer
Dim NewKey As Long
Dim NewDate As Variant
Me.AllowEdits = True
DoCmd.SetWarnings False
If EditionCount <> 0 Then
DoCmd.GoToRecord , , acFirst
FirstEdition = Me.Eddition.Value
End If
If EditionCount <> 0 Then
DoCmd.GoToRecord , , acLast
LastEdition = Me.Eddition.Value
End If
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
NewEd = UCase(InputBox("Enter new edition", "New Eddition"))
If NewEd <> "" Then
NewKey = Nz(DLookup("ID_Key", "TB_Eddition_Aide", "Edditions_Txt = '" & NewEd & "'"))
If FirstEdition <> 0 Then
FirstEdition = FirstEdition - 1
LastEdition = LastEdition + 1
If FirstEdition < 1 Then
If NewKey < FirstEdition Or NewKey > LastEdition Then
FirstEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & FirstEdition))
LastEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & LastEdition))
MsgBox "Edition " & NewEd & " is not allowed " & vbCrLf & _
"Allowed edition is: " & LastEditionText
Exit Function
End If
Else
If NewKey < FirstEdition Or NewKey > LastEdition Then
FirstEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & FirstEdition))
LastEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & LastEdition))
MsgBox "Edition " & NewEd & " is not allowed " & vbCrLf & _
"Allowed editions are: " & FirstEditionText & " or " & LastEditionText
Me.AllowAdditions = False
Exit Function
End If
End If
End If
Me.Eddition = NewKey
If NewKey > 0 Then
NewDate = InputBox("Enter first Start Date", "First Effective Date", Date)
If StrPtr(NewDate) = 0 Then
Me.AllowAdditions = False
Me.AllowDeletions = True
DoCmd.RunCommand acCmdDeleteRecord
Me.AllowDeletions = False
End If
If NewDate > 0 Then
If IsDate(NewDate) Then
Me!ED_Start_Date.Value = CDate(NewDate)
Me.Dirty = False
NewExpDate = DateAdd(Supersession_Interval, Supersessionrate, NewDate) - 1
Me.ED_Expirier_Date = NewExpDate
DoCmd.SetOrderBy "Eddition ASC,"
End If
End If
End If
End If
DoCmd.Save
DoCmd.SetWarnings True
End Function
Tbl2 2 = TB_Edditions
这个table包含了每个短标题所具有的每个版本的key。
此 table 包含数据,例如 ED_Start_Date 作为日期,ED_Expirier_Date 作为日期,Eddition 作为整数
TB_Edditions!Id = 主键(自动编号)
关系是:
1 TB_Short_Title!Short_Title 至
许多TB_Edditions!Short_Title
Id
Short_Title
Eddition
ED_Star_Date
ED_Expirier_Date
1
Short-Title 1
Q
27-05-2021
10-11-2021
2
Short-Title 3
A
01-07-2021
30-06-2022
3
Short-Title 4
A
01-07-2021
31-07-2021
4
Short-Title 4
B
01-08-2021
31-08-2021
5
Short-Title 4
C
01-09-2021
30-09-2021
6
Short-Title 4
D
01-10-2021
30-10-2021
7
Short-Title 2
AC
01-07-2021
31-12-2021
8
Short-Title 1
R
11-11-2021
02-02-2022
表 3 = TB_Eddition_Aide
一个常量 table,它提供一个 Eddition_Id 作为整数和一个 Eddition_Txt 作为字符串。 table 按数字顺序从 a 到 zz (a=1, b=2,... zz=18278)
关系是:
1 TB_Eddition_Aide!ID_Key 至
许多 TB_Edditions!Edition
TB_Eddition_Aide!ID_Key = 主键
ID_Key
Eddition_Txt
1
A
2
B
3
C
17
Q
18
R
29
AC
还有
查询结果:
Short_Title
apr
maj
jun
jul
aug
sep
okt
Short-Title 1
Q
R
Short-Title 2
AC
Short-Title 3
A
Short-Title 4
A
B
C
D
查询的SQL是:
TRANSFORM First(TB_Eddition_Aide.Edditions_Txt) Edditions_Txt
SELECT TB_Edditions.Short_Title
FROM TB_Eddition_Aide INNER JOIN TB_Edditions ON TB_Eddition_Aide.ID_Key =
TB_Edditions.Eddition
WHERE (((TB_Edditions.ED_Start_Date)>DateSerial([From APR of what year?],3,1)))
GROUP BY TB_Edditions.Short_Title
PIVOT Format([ED_Start_Date],"mmm") In ("apr","maj","jun","jul","aug","sep","okt");
我希望能够生成一个报告,在新版本生效之前用最后一个已知值填充空白字段。
IE。如果我们看一下名为 AKAD 101009 的版本,它表示版本“Q”在 5 月第一次生效,下一版从 8 月 10 日开始生效。
该报告应显示 5 月、6 月、7 月的版本 Q
有一个这样的查询,涵盖月 okt - apr,此查询涵盖一年的变化。我想这将是使此查询正常工作的相同过程,因为所有数据都是按日期排序的。
目标是创建一个永远不会 returns 空白值的查询,并且能够区分每个短标题可能在不同的时间间隔(1 个月、2 个月、3 个月等)进行版本更改。 . 一直到 60 周)
我认为执行此操作的方法是使用自定义 VBA 函数 returns 查询正确的信息。我创建了以下有效的方法:
Public Function fGetEditionText(lngEditionID As Long, lngMonth As Long, lngYear As Long) As String
On Error GoTo E_Handle
Dim db As DAO.Database
Dim rsData As DAO.Recordset
Dim strSQL As String
Const JetDateFmt = "\#mm\/dd\/yyyy\#;;;\N\u\l\l"
Set db = CurrentDb
strSQL = "SELECT EA.Eddition_Txt " _
& " FROM (TB_Short_Title AS T INNER JOIN TB_Edditions AS E ON T.Short_Title=E.Short_Title) " _
& " INNER JOIN TB_Eddition_Aide AS EA ON EA.ID_Key=E.Eddition " _
& " WHERE T.ID=" & lngEditionID _
& " AND E.ED_Start_Date>=" & Format(DateSerial(lngYear, 4, 1), JetDateFmt) _
& " AND E.ED_Start_Date<=" & Format(DateSerial(lngYear, lngMonth + 1, 0), JetDateFmt) _
& " ORDER BY E.ED_Start_Date DESC;"
Set rsData = db.OpenRecordset(strSQL)
If Not (rsData.BOF And rsData.EOF) Then
fGetEditionText = rsData!Eddition_Txt
End If
fExit:
On Error Resume Next
rsData.Close
Set rsData = Nothing
Set db = Nothing
Exit Function
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "fGetEditionText", vbOKOnly + vbCritical, "Error: " & Err.Number
Resume fExit
End Function
然后您可以创建一个查询,returns 您期望的值:
SELECT TB_Short_Title.Short_Title,
fGetEditionText(ID,4,2021) AS Apr,
fGetEditionText(ID,5,2021) AS May,
fGetEditionText(ID,6,2021) AS Jun,
fGetEditionText(ID,7,2021) AS Jul,
fGetEditionText(ID,8,2021) AS Aug,
fGetEditionText(ID,9,2021) AS Sep,
fGetEditionText(ID,10,2021) AS Oct
FROM TB_Short_Title;
在您的示例数据中,版本 R 有“Short-Title 1”,开始日期为 2021 年 11 月 11 日,但您在预期输出中显示的是从 8 月开始。
您正在使用“Short_Title”作为 TB_Edditions
中的外键 - 使用 TB_Short_Title
中的主键是正常的。
为了使此查询灵活,我建议您使用 VBA 将此查询的 .SQL
更新为所需的年份。
此致,
智慧IT社区
我有一个查询,其中某些字段填充了有效数据,然后为空白。 这本身不是问题。 当我希望查询中的一个字段用相同的数据填充报告中的多个字段时,问题就来了。
表 1 = TB_Short_Title。 此table仅包含查询结果中每一行的主数据 TB_Short_Title!Short_Title = 主键
Id | Short_Title | Supersessionrate | Supersession_Interval |
---|---|---|---|
1 | Short-Title 1 | 12 | ww |
2 | Short-Title 2 | 6 | m |
3 | Short-Title 3 | 12 | m |
4 | Short-Title 4 | 1 | m |
Supersessionrate和Supersession_Interval用于计算下一个ED_Start_Date和ED_Expirier_Date
在创建短标题的第一版时,系统会提示用户输入 Eddition_Txt 和第一个 ED_Start_Date,然后输入 VBA: 注意:VBA包含插入版本的代码,添加下一版本并自动计算ED_Start_Date和ED_Expirier_Date。
Function Ammend_ED(EditionCount As Integer)
Dim FirstEdition As Long
Dim FirstEditionText As String
Dim LastEdition As Long
Dim LastEditionText As String
Dim NewEd As String
Dim varTotal As Integer
Dim NewKey As Long
Dim NewDate As Variant
Me.AllowEdits = True
DoCmd.SetWarnings False
If EditionCount <> 0 Then
DoCmd.GoToRecord , , acFirst
FirstEdition = Me.Eddition.Value
End If
If EditionCount <> 0 Then
DoCmd.GoToRecord , , acLast
LastEdition = Me.Eddition.Value
End If
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
NewEd = UCase(InputBox("Enter new edition", "New Eddition"))
If NewEd <> "" Then
NewKey = Nz(DLookup("ID_Key", "TB_Eddition_Aide", "Edditions_Txt = '" & NewEd & "'"))
If FirstEdition <> 0 Then
FirstEdition = FirstEdition - 1
LastEdition = LastEdition + 1
If FirstEdition < 1 Then
If NewKey < FirstEdition Or NewKey > LastEdition Then
FirstEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & FirstEdition))
LastEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & LastEdition))
MsgBox "Edition " & NewEd & " is not allowed " & vbCrLf & _
"Allowed edition is: " & LastEditionText
Exit Function
End If
Else
If NewKey < FirstEdition Or NewKey > LastEdition Then
FirstEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & FirstEdition))
LastEditionText = Nz(DLookup("Edditions_Txt", "TB_Eddition_Aide", "ID_Key = " & LastEdition))
MsgBox "Edition " & NewEd & " is not allowed " & vbCrLf & _
"Allowed editions are: " & FirstEditionText & " or " & LastEditionText
Me.AllowAdditions = False
Exit Function
End If
End If
End If
Me.Eddition = NewKey
If NewKey > 0 Then
NewDate = InputBox("Enter first Start Date", "First Effective Date", Date)
If StrPtr(NewDate) = 0 Then
Me.AllowAdditions = False
Me.AllowDeletions = True
DoCmd.RunCommand acCmdDeleteRecord
Me.AllowDeletions = False
End If
If NewDate > 0 Then
If IsDate(NewDate) Then
Me!ED_Start_Date.Value = CDate(NewDate)
Me.Dirty = False
NewExpDate = DateAdd(Supersession_Interval, Supersessionrate, NewDate) - 1
Me.ED_Expirier_Date = NewExpDate
DoCmd.SetOrderBy "Eddition ASC,"
End If
End If
End If
End If
DoCmd.Save
DoCmd.SetWarnings True
End Function
Tbl2 2 = TB_Edditions 这个table包含了每个短标题所具有的每个版本的key。 此 table 包含数据,例如 ED_Start_Date 作为日期,ED_Expirier_Date 作为日期,Eddition 作为整数 TB_Edditions!Id = 主键(自动编号)
关系是: 1 TB_Short_Title!Short_Title 至 许多TB_Edditions!Short_Title
Id | Short_Title | Eddition | ED_Star_Date | ED_Expirier_Date |
---|---|---|---|---|
1 | Short-Title 1 | Q | 27-05-2021 | 10-11-2021 |
2 | Short-Title 3 | A | 01-07-2021 | 30-06-2022 |
3 | Short-Title 4 | A | 01-07-2021 | 31-07-2021 |
4 | Short-Title 4 | B | 01-08-2021 | 31-08-2021 |
5 | Short-Title 4 | C | 01-09-2021 | 30-09-2021 |
6 | Short-Title 4 | D | 01-10-2021 | 30-10-2021 |
7 | Short-Title 2 | AC | 01-07-2021 | 31-12-2021 |
8 | Short-Title 1 | R | 11-11-2021 | 02-02-2022 |
表 3 = TB_Eddition_Aide 一个常量 table,它提供一个 Eddition_Id 作为整数和一个 Eddition_Txt 作为字符串。 table 按数字顺序从 a 到 zz (a=1, b=2,... zz=18278)
关系是: 1 TB_Eddition_Aide!ID_Key 至 许多 TB_Edditions!Edition
TB_Eddition_Aide!ID_Key = 主键
ID_Key | Eddition_Txt |
---|---|
1 | A |
2 | B |
3 | C |
17 | Q |
18 | R |
29 | AC |
还有
查询结果:
Short_Title | apr | maj | jun | jul | aug | sep | okt |
---|---|---|---|---|---|---|---|
Short-Title 1 | Q | R | |||||
Short-Title 2 | AC | ||||||
Short-Title 3 | A | ||||||
Short-Title 4 | A | B | C | D |
查询的SQL是:
TRANSFORM First(TB_Eddition_Aide.Edditions_Txt) Edditions_Txt
SELECT TB_Edditions.Short_Title
FROM TB_Eddition_Aide INNER JOIN TB_Edditions ON TB_Eddition_Aide.ID_Key =
TB_Edditions.Eddition
WHERE (((TB_Edditions.ED_Start_Date)>DateSerial([From APR of what year?],3,1)))
GROUP BY TB_Edditions.Short_Title
PIVOT Format([ED_Start_Date],"mmm") In ("apr","maj","jun","jul","aug","sep","okt");
我希望能够生成一个报告,在新版本生效之前用最后一个已知值填充空白字段。 IE。如果我们看一下名为 AKAD 101009 的版本,它表示版本“Q”在 5 月第一次生效,下一版从 8 月 10 日开始生效。 该报告应显示 5 月、6 月、7 月的版本 Q
有一个这样的查询,涵盖月 okt - apr,此查询涵盖一年的变化。我想这将是使此查询正常工作的相同过程,因为所有数据都是按日期排序的。
目标是创建一个永远不会 returns 空白值的查询,并且能够区分每个短标题可能在不同的时间间隔(1 个月、2 个月、3 个月等)进行版本更改。 . 一直到 60 周)
我认为执行此操作的方法是使用自定义 VBA 函数 returns 查询正确的信息。我创建了以下有效的方法:
Public Function fGetEditionText(lngEditionID As Long, lngMonth As Long, lngYear As Long) As String
On Error GoTo E_Handle
Dim db As DAO.Database
Dim rsData As DAO.Recordset
Dim strSQL As String
Const JetDateFmt = "\#mm\/dd\/yyyy\#;;;\N\u\l\l"
Set db = CurrentDb
strSQL = "SELECT EA.Eddition_Txt " _
& " FROM (TB_Short_Title AS T INNER JOIN TB_Edditions AS E ON T.Short_Title=E.Short_Title) " _
& " INNER JOIN TB_Eddition_Aide AS EA ON EA.ID_Key=E.Eddition " _
& " WHERE T.ID=" & lngEditionID _
& " AND E.ED_Start_Date>=" & Format(DateSerial(lngYear, 4, 1), JetDateFmt) _
& " AND E.ED_Start_Date<=" & Format(DateSerial(lngYear, lngMonth + 1, 0), JetDateFmt) _
& " ORDER BY E.ED_Start_Date DESC;"
Set rsData = db.OpenRecordset(strSQL)
If Not (rsData.BOF And rsData.EOF) Then
fGetEditionText = rsData!Eddition_Txt
End If
fExit:
On Error Resume Next
rsData.Close
Set rsData = Nothing
Set db = Nothing
Exit Function
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "fGetEditionText", vbOKOnly + vbCritical, "Error: " & Err.Number
Resume fExit
End Function
然后您可以创建一个查询,returns 您期望的值:
SELECT TB_Short_Title.Short_Title,
fGetEditionText(ID,4,2021) AS Apr,
fGetEditionText(ID,5,2021) AS May,
fGetEditionText(ID,6,2021) AS Jun,
fGetEditionText(ID,7,2021) AS Jul,
fGetEditionText(ID,8,2021) AS Aug,
fGetEditionText(ID,9,2021) AS Sep,
fGetEditionText(ID,10,2021) AS Oct
FROM TB_Short_Title;
在您的示例数据中,版本 R 有“Short-Title 1”,开始日期为 2021 年 11 月 11 日,但您在预期输出中显示的是从 8 月开始。
您正在使用“Short_Title”作为 TB_Edditions
中的外键 - 使用 TB_Short_Title
中的主键是正常的。
为了使此查询灵活,我建议您使用 VBA 将此查询的 .SQL
更新为所需的年份。
此致,