基于控件名称而不是控件源(字段)的 MS Access 计算

Posted

技术标签:

【中文标题】基于控件名称而不是控件源(字段)的 MS Access 计算【英文标题】:MS Access calculation based on a control name rather than a control source (field) 【发布时间】:2016-06-06 13:02:14 【问题描述】:

我正在创建一个基于动态 SQL 查询(存储过程)的 MS Access 报告,该查询根据当前日期输出字段,这意味着它在运行时提供的字段会根据查询时的当前日期而变化跑。

我创建了一个 vba 脚本,该脚本使用 SQL 服务器用于输出字段的相同计算来动态更改 Access 报告的控制源(这似乎工作正常),但是我现在想创建一些基于总和的计算这些动态控件的值,但我似乎无法在计算中使用控件名称(而不是控件源)。

例如

我的 SQL 查询目前有一个(动态)字段输出,称为“201606 P”,还有静态字段“Person”和“Project”。 MS Access 报告已打开。 MS Access vba 脚本执行与 SQL 查询中相同的计算,并将名为“Date1P”的控件更改为具有“201606 P”的控件源。 报表按人分组,我想计算每个人的“201606 P”字段的总和。 我的 sum 'unbound' 文本框控件的控件源为“=Sum([Date1P])”,其中 Date1P 是我要在组中求和的控件的名称,而不是查询中提供的字段. Access 打开时会显示一个参数框,询问 [Date1P] 的值。

我能否只使用另一个控件的名称而不是该控件的控件源(在运行查询之前我无法知道)来计算一个控件?

我是否应该解决它并编写更多脚本以动态插入总和字段的控制源?

【问题讨论】:

感谢到目前为止大家的投入,您已经帮助确认了我已经怀疑的内容,但是目前还没有人回答我是否可以在另一个计算控件中使用计算控件的名称。 【参考方案1】:

如果你打开一个基于源的记录集,你可以在VBA中按索引引用字段,例如:

MyValue = rs.Fields(8).Value + rs.Fields(2).Value / 100

【讨论】:

做这样的事情是我的第一直觉,但是 SQL 查询目前需要 15-20 秒才能提供结果,如果我必须打开结果的记录集来执行此操作,这并不意味着查询将被执行两次?一次作为记录集,然后再次填充报告中的字段? 在让报告“挂起”30 秒的加载时间后,我的用户会愤怒地退出...【参考方案2】:

我想我明白你在问什么并看到了问题。

我认为最简单的解决方案 - 看到您已经在代码中执行了类似的操作 - 是更改 Sum 文本字段的 ControlSource。我假设您的 Summation 控件的名称是“Sum of Date1P”

在您的代码中,在您的脚本将名为“Date1P”的控件更改为具有“201606 P”的控件源之后。

添加代码行

me.[Sum Of Date1P].ControlSource = "=Sum([201606 P])"

【讨论】:

这是我现在使用的“解决方法”,但是我有 18 个动态字段来自动控制每条记录的控制源,以及列标签标题和三个“总计”计算框来动态为每个列设置控制源。 (18 个列 x 在每个列中设置 5 个脚本(动态)控制源 = 大量代码...)说代码现在有点笨拙是轻描淡写! @TimB 如果您使用的是 SQL 存储过程,将输出字段更改为可在报告中原样使用的固定命名字段似乎更容易。这不是最简单的解决方案吗?您有权访问存储过程吗?你能发布那个 SQL 吗? 我使用了 Ullas 在这里建议的动态 sql:***.com/questions/36646883/… 不确定是否修复 sql 输出列名称,因为它是动态 sql 查询的一部分(根据提供给动态的记录创建列通过上一个静态查询进行查询)也无法跟踪由计算差异引起的任何(明显)错误以过滤列/记录以从 SQL 输出并在前端完成以计算动态列标签和控制来源。你会这样吗? 我不知道您的报告是什么样的,但您似乎需要动态字段用于报告标题/分组,但您需要固定字段名称来汇总字段。如果您想绕过所有编码,我看到的唯一解决方案是修改您的动态 SQL 以包含固定的命名字段(以及) @TimB - 你可以为你的过程发布 SQL 吗?【参考方案3】:

您可以根据需要尝试此 SQL - 您应该会在我们的报告查询中看到一个名为“TotalsP”的新字段。 将总计字段的控制源更改为“TotalsP”字段 - 分组总和字段将为“=Sum([TotalsP])”

我想我把所有的逗号和引号都排好了。

declare @sql as varchar(max); 
select @sql = 'SELECT Person, Project, [Total P], [Total TS], 
' + stuff(( select distinct ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then PlanHours end), 0) as [' + [SortDate] + ' P],'
' + stuff(( select distinct ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then PlanHours end), 0) as [TotalsP]' 
+ ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then TimesheetHours end), 0) as [' + [SortDate] + ' TS]' 
from qryPTGTimesheetsCombinedAllUnionPrepTotalsTIM for xml path('')), 1, 1, ''); 
select @sql += ' FROM qryPreviousStaticQueryThatProvidesRecords GROUP BY Person, Project, [Total P], [Total TS];'; PRINT @sql; exec(@sql);

【讨论】:

不幸的是,这段代码引发了错误:Line 22 Incorrect syntax near ' + '.【参考方案4】:

好的 - 我想我找到了缺少的引号和逗号 - 我添加了两个新列 TotalsByDateP - 应该是你想要的

declare @sql as varchar(max); 
select @sql = 'SELECT Person, Project, [Total P], [Total TS], 
' + stuff(( select distinct ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then PlanHours end), 0) as [' + [SortDate] + ' P]' 
+ ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then TimesheetHours end), 0) as [' + [SortDate] + ' TS]',
' + stuff(( select distinct ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then PlanHours end), 0) as [TotalsByDateP]' 
+ ',ISNULL(max(case [SortDate] when ''' + [SortDate] + ''' then TimesheetHours end), 0) as [TotalsByDateTS]' 
from qryPreviousStaticQueryThatProvidesRecords for xml path('')), 1, 1, ''); 
select @sql += ' FROM qryPreviousStaticQueryThatProvidesRecords GROUP BY Person, Project, [Total P], [Total TS];'; PRINT @sql; exec(@sql);

如果运行正常,请告诉我

如果是这样,您应该会在我们的报告查询中看到一个名为“TotalsByDateP”的新字段将总计字段的控制源更改为“TotalsByDateP”字段 - 分组总和字段将为“=Sum([TotalsByDateP])

【讨论】:

非常感谢您回顾这个!明天早上我会先测试它并报告。

以上是关于基于控件名称而不是控件源(字段)的 MS Access 计算的主要内容,如果未能解决你的问题,请参考以下文章

访问包含基于字段的条件格式文本

如何在 MS-Access 的表单上显示 Web 浏览器控件中的表格字段内容?

MS访问Treeview控件加载缓慢,我需要使用ADO而不是DAO吗?

具有不同字段名称和 JavaScript 控件名称的 DevExpress 控件

MS Access ComboBox.Column - 使用名称而不是索引?

访问中的文本框字段名称