【问题标题】:How to populate multiple report fields with same data? MS ACCESS如何使用相同的数据填充多个报告字段?女士访问
【发布时间】: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 这是你想要的吗?我对这种事情很陌生,所以非常感谢任何帮助。
  • 不,请发布用于创建输出的实际原始数据 - 这允许我们复制并粘贴到一组表格中,以在发布之前检查所提供的任何答案是否有效。

标签: sql ms-access report


【解决方案1】:

我认为这样做的方法是使用自定义 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 日的“短标题 1”,但您在预期输出中显示的是从 8 月开始。

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

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

问候,

【讨论】:

  • 我发现了错误:)“开始”中缺少“T”:) 现在我得到一个返回查询,但它只显示版本的 ID 号(整数)。我做错了什么才能得到与你不同的结果?
  • 首先将Debug.Print strSQL 放在Set rsData=db.OpenRecordset 之前的行上,然后查看正在创建的SQL。
  • SQL 字符串看起来不错。但是 fGetEditionText 返回一个整数而不是字符串(字母) 在 TB_Edditions 中,版本值是一个从 TB_Eddition_Aide 派生的整数。有没有办法将该整数值转换为 TB_Eddition_Aide!Eddition_Txt 中对应的字符串值?
  • 您需要修改创建的 SQL 字符串以包含对相关表的连接 - 此信息未在您的原始帖子中指出,该帖子以 TB_Edditions!Eddition 为文本。
  • 我的SQL不是那么强,很抱歉TB_Eddition中的版本不清楚!Eddition是整数。有什么可以帮忙的吗?
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 2014-08-13
  • 2011-12-29
  • 2012-08-29
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多