【发布时间】:2023-03-16 09:08:02
【问题描述】:
明智的 IT 社区
我有一个查询,其中一些字段用有效数据填充,然后是空白。 这本身不是问题。 当我希望查询中的一个字段用相同的数据填充报表中的多个字段时,就会出现问题。
Tbl 1 = TB_Short_Title。 此表仅包含查询结果中每一行的主数据 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_Editions 该表包含每个短标题具有的每个版本的密钥。 此表包含数据,例如,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 |
Tbl 3 = TB_Eddition_Aide 一个常量表,以整数形式提供 Eddition_Id,以字符串形式提供 Eddition_Txt。该表按数字顺序从 a 到 zz (a=1, b=2,... zz=18278)
关系是: 1 TB_Eddition_Aide!ID_Key 到 许多 TB_Edditions! 版本
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 月开始生效。 报告应显示 5 月、6 月、7 月的版本 Q。
有一个像这样的查询,涵盖了几个月 okt - apr,这个查询涵盖了一年的变化。我想这将是让这个查询工作的相同过程,因为所有数据都按日期排序。
目的是创建一个永远不会返回空白值的查询,并且能够区分每个短标题可能在不同的时间间隔(1 个月、2 个月、3 个月等)有版本更改。一直到60 周)
【问题讨论】:
-
编辑问题以将示例原始数据显示为文本表,而不是图像。我预计这个问题需要一个 VBA 自定义函数。
-
@ June7 新格式编辑为表格。
-
请编辑您的问题以包含用于实现预期结果的 原始 数据 - 这为任何正在为您提供答案的人提供了一些可使用的东西。另外,一年中的其他月份(1-3 月和 11/12 月)呢?
-
@Applecore 这是你想要的吗?我对这种事情很陌生,所以非常感谢任何帮助。
-
不,请发布用于创建输出的实际原始数据 - 这允许我们复制并粘贴到一组表格中,以在发布之前检查所提供的任何答案是否有效。