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

时间:2018-07-20 07:28:45

标签: sql excel-vba parameter-passing database-connection ibm-midrange

我已经在互联网上搜索了数小时,试图弄清是否有可能实现以下目标:
要直接从Excel中选择AS400查询记录。

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

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

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

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

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

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

我希望这个例子有意义。

编辑-新示例

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

我想如果可以将参数传递给AS400,这是可行的。然后,AS400使用此参数作为查询中存储记录的标准来运行查询。这意味着,如果参数为Customer B,则无法通过来自AS400的查询再次访问来自客户A的数据。

任何想法都非常感激:)

2 个答案:

答案 0 :(得分:7)

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

要在Excel中启动MS查询,请转到“数据”标签,然后选择“来自其他来源”->“ Microsoft Query”。

enter image description here

将显示您的ODBC连接列表。选择所需的一个,然后选择“确定”。

enter image description here

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

enter image description here

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

enter image description here

MS Query返回结果时,请单击“ SQL按钮”旁边的按钮,以将结果返回到电子表格。好像是一扇小门。

在这里,只要您想刷新查询,就可以在Excel中的数据表上单击鼠标右键,然后选择“刷新”。或者,您可以转到功能区上的“数据”选项卡,然后选择“刷新”。

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

要随时编辑查询,请右键单击Excel中的表,然后转到“表外部数据属性”:

enter image description here

然后单击“连接属性”图标(在下面突出显示)

enter image description here

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

只需插入一个简单的“?”即可声明参数。代替您的文字。

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

select *
from users
where user_id = 'hambone'

只需将其更改为:

select *
from users
where user_id = ?

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

enter image description here

让我知道这是否有帮助或不清楚。

-编辑7/23/2018-

要跟进您的最新编辑,可以处理您描述的情况,希望在此情况下可以对值进行过滤,或者如果没有给出值,则不使用过滤器。当您向用户提供多个过滤器选项并且您希望空格代表“无过滤器”时,您会看到很多东西,这显然与SQL的工作方式相反。

但是,您可以修改SQL使其仍然起作用:

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

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

根据RDBMS的不同,您可能还需要使用数据类型(例如,对于数字,您可能不得不说? = 0而不是? is null甚至是文本? = '')。 / p>

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

enter image description here

答案 1 :(得分:-1)

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