如何用相同的数据填充多个报告字段?访问权限

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;

这个returns:

在您的示例数据中,版本 R 有“Short-Title 1”,开始日期为 2021 年 11 月 11 日,但您在预期输出中显示的是从 8 月开始。

您正在使用“Short_Title”作为 TB_Edditions 中的外键 - 使用 TB_Short_Title 中的主键是正常的。

为了使此查询灵活,我建议您使用 VBA 将此查询的 .SQL 更新为所需的年份。

此致,