Dir*_*ffy 1 sql database-connection parameter-passing excel-vba ibm-midrange
我一直在网上搜索数小时试图找出以下是否可能:
直接从Excel中选择AS400查询记录.
我没有找到任何解决方案或描述如何实现这一点,这让我觉得它根本不可能.但是,我没有看到有人确认这是不可能的.
所以我的问题是:这可能吗?如果是的话,你能指出我正确的方向,以便我开始学习如何去做吗?
我知道可以从Excel运行查询,然后通过SQL语句添加参数,但在我的情况下,这提出了一些问题,可以通过在执行查询之前选择记录来避免这些问题.
示例:
我有一个列(可以调用它ColVal
)的查询,它可以保存值1和/或2.在AS400程序的"使用查询"菜单下,然后"选择记录"我可以指定查询的哪些记录应该包含何时基于其中的值运行ColVal
.这意味着当我运行查询时,我可以得到三种不同的情况(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并使用不同的参数运行查询.我希望能够从Excel中将我的数据集从客户A"更改"到B,而不必在我的记录集中包含这两个数据集,然后过滤掉其中一个.
我想如果你可以将参数传递给AS400,这是可行的.然后,AS400使用此参数作为记录应存储在查询中的条件运行查询.这意味着如果参数是客户B,则无法从客户A访问数据,而无需再次通过AS400运行查询.
任何想法都非常感谢:)
跟进我的评论,这里是一个关于如何使用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'
Run Code Online (Sandbox Code Playgroud)
只需将其更改为:
select *
from users
where user_id = ?
Run Code Online (Sandbox Code Playgroud)
Excel将在运行查询之前提示您输入用户标识.从这里,您还可以选择将参数值放在电子表格的单元格中,并让查询从那里读取.右键单击表格并进入"参数"菜单选项时,您将看到这些.
如果这有帮助或不清楚,请告诉我.
- 编辑7/23/2018 -
要跟进您的最新编辑,可以处理您描述的场景,您希望能够在哪里过滤值,或者如果没有给出,则没有过滤器.当您向用户提供多个过滤器选项时,您会看到很多,并且您希望空白表示"无过滤器",这显然与SQL的工作方式相反.
但是,您可以破解SQL以使其仍然有效:
select * from activities
where
(activity = ? or ? is null) and
(energy = ? or ? is null)
Run Code Online (Sandbox Code Playgroud)
在此示例中,您必须声明四个参数而不是两个参数,每个参数两个.
您可能还必须使用数据类型,具体取决于RDBMS(例如,对于数字而言,您可能需要说? = 0
而不是? is null
甚至? = ''
是文本).
下面是一个工作示例,其中单个过滤器应用于上面的查询,您可以清楚地看到第二个过滤器没有影响.