MS Access报告组总计

问题描述

建立数据库以跟踪邻里社区成员身份。对于上下文:邻居被分为十个区域,每个区域又细分为街道级别。每个分区都有一个或多个街道,部分或全部。任何一条街道都可以跨越多个分区。地址是固定的,但家人和我们一起搬进来。成员资格是可选的。设置了几个表来跟踪所有这些情况。无法设置一份特定的报告。 由于在涉及到左联接的条件(“ A左联接B左联接C,其中C.this_column为空”的情况下)时Access的不很拖放查询,我无法获得单个查询完成报告。因此,基本结构为:

  • 用于获取街道名称,地址和区域/分区的标识符的报告查询
  • 查询用于查询居民(如果有)和过去五年的会员身份
  • 定义了两个组级别-分区(每页一个)和街道(每页一个或多个)
  • 复选框反映了每年的会员身份,并且从子查询中拉出,带有必需的“ = IIF(iserror(...”)以容纳空地址。
  • 子区域页脚包含按年份列出的总成员资格的文本框(选中的子框)

问题:我无法让子区域页脚“添加”。为此项目编写的先前报告(一个表,大约60列,每年有新的列)能够做到这一点“ = Sum([checkBox-element-name])”。当我尝试执行同样的操作并运行报表时,我会弹出一个对话框,提示我输入。

出于无奈和蛮力,我想到的最终解决方案是:

  • 设置子查询中的复选框
  • 设置隐藏的文本框以存储每个复选框的值,并带有“运行总和=超出组”
  • 在街道页脚中,隐藏的文本框设置为复选框元素名称显示运行总计)。这些也设置为“运行总和=超出组”。请注意,省略此步骤意味着跨多条街道的子区域只会将最后一条街道传播到子区域页脚
  • 在子区域页脚中,文本框设置为子区域页脚文本框名称-这些正确显示了子区域内所有街道的总数。

现在它可以正常工作了,我讨厌让它保持这种状态。在此过程的每一步都使用表达式生成器,当我尝试使用“ = Sum [element-name]”时,它可以识别每个元素,但仍会弹出一个提示。有什么想法,这是怎么回事,以及我如何能够成功清理此问题?这是在Windows 10 Home上运行的Office Professional 2016。

编辑,为清楚起见::这是对旧数据库的完整重写。较旧的是“一个表,60列,每年增加列”。新的数据库已经标准化,以防止将来出现这种需求。我只提到旧的,因为求和在这里起作用。他们不在新设计中工作。

编辑2:查询详细信息:如果我要用MysqL中的单个查询替换所有查询,则将是这样。请注意,这是冷输入的,实际上没有运行。如果我可以将其移植到MS Access,则将解决我的整个问题。它已经起作用了...直到我引入了对“ end_date为空”的要求-这表明当前居民。处理过去五年中房屋易手的情况。我们只希望将地址与当前居民一起列出一次。

-- house: id,number,address,area,subarea
-- family: id,family_name
-- house_family: house_id,family_id,start_date,end_date (when family moved in/out)
-- membership: house_id,year (family was a member in this house,for this year)

SELECT h.area,h.subarea,h.street,h.number,f.family_name,IF(m4.year IS NULL,'Y','N') 'Year-4',IF(m3.year IS NULL,'N') 'Year-3',IF(m2.year IS NULL,'N') 'Year-2',IF(m1.year IS NULL,'N') 'Year-1',IF(m0.year IS NULL,'N') 'Year-0',FROM house h
     LEFT JOIN house_family hf ON h.id = hf.house_id
     LEFT JOIN family f ON hf.family_id = f.id
     LEFT JOIN membership m4 ON m4.house_id = h.id AND m4.family_id = f.id AND m4.year = YEAR(DATE_SUM(CURDATE(),INTERVAL 4 YEAR))
     LEFT JOIN membership m3 ON m3.house_id = h.id AND m3.family_id = f.id AND m3.year = YEAR(DATE_SUM(CURDATE(),INTERVAL 3 YEAR))
     LEFT JOIN membership m2 ON m2.house_id = h.id AND m2.family_id = f.id AND m2.year = YEAR(DATE_SUM(CURDATE(),INTERVAL 2 YEAR))
     LEFT JOIN membership m1 ON m1.house_id = h.id AND m1.family_id = f.id AND m1.year = YEAR(DATE_SUM(CURDATE(),INTERVAL 1 YEAR))
     LEFT JOIN membership m0 ON m0.house_id = h.id AND m0.family_id = f.id AND m0.year = YEAR(CURDATE())
WHERE hf.end_date IS NULL
GROUP BY h.id

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)