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

问题描述 投票:0回答:1

智慧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 周)进行版本更改)

sql ms-access report
1个回答
0
投票

我认为执行此操作的方法是使用自定义 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
更新为所需的年份。

© www.soinside.com 2019 - 2024. All rights reserved.