智慧IT社区
我有一个查询,其中一些字段填充了有效数据,然后为空白。 这本身并不是问题。 当我希望查询中的一个字段用相同的数据填充报告中的多个字段时,就会出现问题。
表 1 = TB_Short_Title。 该表仅包含查询结果中每一行的主数据 TB_Short_Title!Short_Title = 主键
身份证 | 短_标题 | 超班率 | 替换_间隔 |
---|---|---|---|
1 | 短标题 1 | 12 | www |
2 | 短标题 2 | 6 | 米 |
3 | 短标题 3 | 12 | 米 |
4 | 短标题 4 | 1 | 米 |
Supersessionrate 和 Supersession_Interval 用于计算下一个 ED_Start_Date 和 ED_Expirier_Date
创建短标题的第一个版本后,系统将提示用户使用以下 VBA 输入 Eddition_Txt 和第一个 ED_Start_Date: 注意: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_版本 该表包含每个短标题具有的每个密钥版本。 该表包含以下数据:ED_Start_Date 作为日期、ED_Expirier_Date 作为日期、Eddition 作为整数 TB_Editions!Id = 主键(自动编号)
关系式为: 1 TB_Short_Title!Short_Title 至 许多 TB_版本!Short_Title
身份证 | 短_标题 | 版 | ED_星星_日期 | ED_Expirier_Date |
---|---|---|---|---|
1 | 短标题 1 | 问 | 2021年5月27日 | 2021 年 10 月 11 日 |
2 | 短标题 3 | A | 2021 年 1 月 7 日 | 2022年6月30日 |
3 | 短标题 4 | A | 2021 年 1 月 7 日 | 2021年7月31日 |
4 | 短标题 4 | B | 2021年1月8日 | 2021年8月31日 |
5 | 短标题 4 | C | 2021年1月9日 | 2021年9月30日 |
6 | 短标题 4 | D | 2021年10月1日 | 2021年10月30日 |
7 | 短标题 2 | 交流 | 2021 年 1 月 7 日 | 2021年12月31日 |
8 | 短标题 1 | R | 2021年11月11日 | 2022年2月2日 |
Tbl 3 = TB_Eddition_Aide 一个常量表,提供整数形式的 Eddition_Id 和字符串形式的 Eddition_Txt。该表按数字顺序从 a 到 zz (a=1, b=2,... zz=18278)
关系式为: 1 TB_Eddition_Aide!ID_Key 到 许多TB_版本!版本
TB_Eddition_Aide!ID_Key = 主键
ID_密钥 | 版本_Txt |
---|---|
1 | A |
2 | B |
3 | C |
17 | 问 |
18 | R |
29 | 交流 |
还有
查询结果:
短_标题 | 四月 | 少校 | 君 | 七月 | 八月 | 九月 | 好的 |
---|---|---|---|---|---|---|---|
短标题 1 | 问 | R | |||||
短标题 2 | 交流 | ||||||
短标题 3 | A | ||||||
短标题 4 | A | B | C | D |
查询的S 75e2 QL是:
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 月份,这个查询涵盖了一年的变化。我想象这将是相同的过程来让这个查询工作,因为所有数据都是按日期排序的。
目的是创建一个永远不会返回空白值的查询,并且能够区分每个短标题可能以不同的时间间隔(1 个月、2 个月、3 个月等......一直到 60 周)进行版本更改)
我认为执行此操作的方法是使用自定义 VBA 函数,该函数向查询返回正确的信息。我创建了以下有效的方法:
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
然后您可以创建一个返回您期望的值的查询:
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 的开始日期为 2021 年 11 月 11 日,但您在预期输出中显示的是从 8 月开始的“Short-Title 1”。
您在
TB_Edditions
中使用“Short_Title”作为外键 - 使用 TB_Short_Title
中的主键是正常的。
为了使该查询更加灵活,我建议您使用 VBA 将该查询的
.SQL
更新为所需的年份。