直接从 Excel 中选择 AS400 查询记录

Posted

技术标签:

【中文标题】直接从 Excel 中选择 AS400 查询记录【英文标题】:Choose AS400 query records directly from Excel 【发布时间】:2018-07-20 07:28:44 【问题描述】:

我已经在互联网上搜索了几个小时,试图弄清楚以下是否可能: 。

我还没有找到任何解决方案或说明如何实现这一点,这让我猜测这根本不可能。但是,我还没有看到任何人确认这是不可能的。 所以我的问题是:这可能吗?如果是的话,你能指出我正确的方向,以便我开始学习如何去做吗?

我知道可以从 Excel 运行查询,然后通过 SQL 语句添加参数,但在我的情况下,这会带来一些问题,可以通过在执行查询之前选择记录来避免。

示例: 我有一个包含值 1 和/或 2 的列(我们称之为 ColVal)的查询。在“使用查询”菜单下的 AS400 程序中,然后“选择记录”我可以指定哪些记录查询应包含根据ColVal 中的值运行的时间。这意味着我在运行查询时可以获得三种不同的情况(A、B 和 C):

A) 查询只包含ColVal 中值为1的记录 B) 查询只包含ColVal 中值为2的记录 C) 查询包含ColVal 中的值为 1 或 2 的记录

目标是能够从 Excel 中选择我想要的情况,以绕过打开和使用 AS400 程序。但是,使用情况 C,然后在 Excel 中编辑查询不能使用 SQL 语句来模拟情况 A 或 B,因为这意味着查询仍然包含不需要的记录。

这整个事情归结为以下几点:是否甚至可以从 Excel 运行查询,本质上更改它包含的数据,而不仅仅是将其输出到 Excel?如果可以,那么是否可以将参数传递给 AS400 系统并使用它来创建情境 A、B 或 C?

我希望这个例子有意义。

编辑 - 新示例

假设我有不同的客户 A 和 B。我可以打开 AS400 程序并运行一个查询,其中我指定我只需要客户 A 的数据。然后我可以打开 Excel 并使用过滤器(如 Hambone 所述)查询以确定我要输出哪些记录。但是,如果我想处理来自客户 B 的数据,我必须再次打开 AS400 并使用不同的参数运行查询。我希望能够从 Excel 将我的数据集从客户 A“更改”为 B,而不必将两者都包含在我的记录集中然后过滤掉其中一个。

我想如果您可以将参数传递给 AS400,这是可行的。然后,AS400 使用此参数作为记录应存储在查询中的条件来运行查询。这意味着如果参数是客户 B,那么如果不再次通过 AS400 运行查询,就无法访​​问客户 A 的数据。

非常感谢任何想法:)

【问题讨论】:

我怀疑不是,但是你有例子吗?您如何在实际获取记录之前“选择”记录,或者您的意思是基于标准,类似于 where 子句? @Hambone 感谢您的回复 - 不幸的是,我没有任何示例,这就是为什么我怀疑这是不可能的。除了“选择”之外,我不知道该怎么称呼它。这就像打开 AS400 程序并使用“使用查询”功能,除了它是从 Excel 完成的。我的想法是在 Excel 中构建一个Userform,然后提示用户输入不同的输入。然后将这些输入用作应从 AS400 中的查询中获取记录的条件。这有意义吗? :) 我想我明白了。在这种情况下,我认为您可以将 Microsoft Query 与与 DB2 的 ODBC 连接一起使用。您可能必须执行一些动态 SQL 来容纳可选参数。如果这听起来像是在进行中,并且您需要一个示例,我可能会想出一个。 @Hambone 这听起来很有趣。我已经对 Excel 中的 Power Query 搞砸了,而且我已经有一个有效的 ODBC 连接(至少我认为)。但是,在执行查询之前,我找不到更改查询参数的方法。我只能通过 SQL 语句选择要包含在输出表中的列。如果您可以制作一个示例供我查看,那将非常棒并且非常感谢! :) @Hambone 并且记录在案 - 我没有使用数据库连接或 SQL 的经验。所以如果我不善于解释我的情况或发现,这可能就是原因。不要羞于纠正我或要求更好的解释 - 我渴望学习:) 【参考方案1】:

跟进我的评论,这里是关于如何使用 Microsoft Query 在 MS Excel 中直接运行 ODBC 查询的快速入门。这与您引用的 Power Query 非常不同,因为 MS Query 是 Excel 的标准 - 它不是插件。这是相关的,因为这意味着每个人都拥有它。如果您正在向其他人部署解决方案,这是一个重要的考虑因素。

要在 Excel 中启动 MS Query,请转到数据选项卡,选择“来自其他来源”->“Microsoft Query”。

您的 ODBC 连接列表将出现。选择您想要的,然后选择“确定”。

它可能会或可能不会要求您登录(取决于您使用的 ODBC 连接及其配置方式)。

下一部分很重要。 MS Query 将尝试让您使用其构建器来创建查询。如果您有 SQL,请跳过此部分。这太糟糕了。单击查询向导上的“取消”,然后单击“SQL”按钮输入您自己的 SQL。如果可以,请确保结果集很小(例如在查询中使用 where 1 = 2)。

当 MS Query 返回结果时,单击 SQL 按钮旁边的按钮使其将结果返回到电子表格。它看起来像一扇小门。

从这里,任何时候您想要刷新查询,只需在 Excel 中右键单击数据表并选择“刷新”即可。或者,您可以转到功能区上的数据选项卡并选择“刷新”。

顺便说一下,如果您已链接数据透视表和图表,“全部刷新”选项也会以正确的顺序刷新它们。

要随时编辑您的查询,请右键单击 Excel 中的表格,转到表格 - 外部数据属性:

然后点击连接属性图标(在下方突出显示)

单击第二个选项卡(定义)并直接编辑 SQL。

可以简单地通过插入一个“?”来声明参数。代替你的文字。

换句话说,如果您的查询如下所示:

select *
from users
where user_id = 'hambone'

只需将其更改为:

select *
from users
where user_id = ?

Excel 会在运行查询之前提示您输入用户 ID。从这里,您还可以选择将参数值放在电子表格中的单元格中,并让查询从那里读取它。当您右键单击表格并转到“参数”菜单选项时,您会看到这些。

如果这有帮助或不清楚,请告诉我。

-- 编辑 2018 年 7 月 23 日--

要跟进您的最新编辑,可以处理您描述的场景,您希望能够过滤一个值,或者如果没有给出,则没有过滤器。当您向用户提供多个过滤器选项并且希望空白表示“无过滤器”时,您会经常看到这种情况,这显然与 SQL 的工作方式背道而驰。

但是,您可以破解 SQL 使其仍能正常工作:

select * from activities
where
 (activity = ? or ? is null) and
 (energy = ? or ? is null)

在此示例中,您必须声明四个参数,而不是两个,每个参数两个。

您可能还必须使用数据类型,具体取决于 RDBMS(例如,对于数字,您可能不得不说 ? = 0 而不是 ? is null 甚至是 ? = '' 对于文本)。

这是一个工作示例,其中对上述查询应用了一个过滤器,您可以清楚地看到第二个过滤器没有影响。

【讨论】:

非常感谢您花时间解释这一切。不幸的是,我只能从我的工作场所访问数据库,这意味着我要到星期一才能对此进行测试。我已经有几个这样的表,它们链接到数据库并且能够像你解释的那样被刷新。我没有尝试过的是使用问号来获取参数。我一定会在星期一试试,然后告诉你进展如何:) 我可能做错了,但不幸的是,这似乎并不能解决我的问题。当我按照您的解释插入问号时,它确实会提示输入参数。然后,此参数用于确定要从查询中获取哪些记录。在我的情况下,我需要使用数据库中的该参数再次运行查询。我在我的问题中包含了一个示例,可以更好地解释这一点。再次感谢您的帮助-我希望您仍有一些想法可以尝试:) 我一直在 Excel 中使用这种技术(使用 ODBC 数据源而不是 MS Query),但不使用参数。我通常要么手动编辑带有参数的 SQL 语句,要么如果数据集足够小,则不使用 where 子句运行它,并使用 Excel 过滤器来缩小范围。 @Mike -- 我很感兴趣。有没有办法直接使用不是简单表或视图的 SQL 语句来执行此操作?我也直接通过 ODBC 完成了这项工作,但我从未找到使用复杂查询的方法。或者,您是否选择一个简单的表开始并在事后编辑 SQL?此外,检查参数和“自动刷新 Excel”标志。这很方便。 "选择一个简单的表开始并在事后编辑 SQL" 完全正确 Excel 可能会给出一个对话框说连接已经改变,你同意。然后您可以多次编辑 SQL,它会更新您的表。【参考方案2】:

是的,这是可能的。您需要使用 ODBC 驱动程序连接到 AS400 并检索数据。驱动和文档是Here

【讨论】:

非常感谢 - 这绝对是朝着正确方向迈出的一步。我是一个完整的编码菜鸟,所以我将不得不花一些时间来研究这个。如果我发现您提供的链接解决了我的问题,我会及时接受您的回答:) 这个链接里有很多信息,但我觉得可能有点太高级了,我看不懂。我不知道是否有一种方法可以单独通过 VBA 实现我想要的,或者您是否需要其他程序。可以详细说明一下您如何知道它是可能的吗? :)

以上是关于直接从 Excel 中选择 AS400 查询记录的主要内容,如果未能解决你的问题,请参考以下文章

AS400多成员文件SQL查询

AS400 - 令牌“!”无效

使用C#调用AS400程序并从QTEMP中选择文件

EXCEL VBA 读AS400数据中文乱码问题

来自 QSYS2.SysTables 的查询返回错误“令牌;无效”

在 groupBy 选择后计算总记录数