【问题标题】:Trigger MS Access function with SAS使用 SAS 触发 MS Access 功能
【发布时间】:2018-05-23 10:12:35
【问题描述】:

我是新手,所以请温柔:)

我的问题是:我能否让 SAS(带有 PC 文件服务器的 9.4)触发 MS ACCESS 中的一个函数,该函数导入 SAS 之前吐出的 .txt 文件?

背景:我继承了一个 Access 数据库(.accdb,使用 2010 版),其源数据来自 SAS。当前的方法是 SAS 吐出 .txt 文件,我(半手动)将其导入数据库。半手动,因为有一个按钮/宏可以导入文件,但我必须打开数据库并按下按钮。我宁愿完全不必干预。

我尝试通过使用 PROC EXPORT(和 PC 文件服务器)和后来的 PROC SQL(通过 libname 分配 Access 数据库)跳过表的导入,直接从 SAS 推送数据。不过相比老办法,在做了压缩和修复之后,数据库的大小仍然是原来的两倍左右。我在网上搜索了如何避免尺寸增加,但没有找到答案。

因此,我想保留 SAS 吐出 .txt 文件的方法,但也让 SAS 在导入文件的数据库中触发 Access 函数。

Access 中的按钮激活此代码:

Private Sub ImportSASDataButton_Click()
Dim Update As Byte
    Update = MsgBox("Have you ran the SAS program that creates the text files?" _
                    , vbYesNo, "Check files have been created")

If Update = vbYes Then ImportTables
Me.CloseFormButton.SetFocus
Me.ImportSASDataButton.Enabled = False
End Sub

如果“YES”激活此代码(这是我希望直接触发的功能):

Function ImportTables()
Dim db As Database
Dim ITables As Recordset

Set db = CurrentDb
Set ITables = db.OpenRecordset("Tables", dbOpenDynaset)

Do Until ITables.EOF
    Call ImportData(ITables![TableName], _
                    ITables![SpecificationName], _
                    ITables![FileName], _
                ITables![DeleteExisting], _
                ITables![Use])
    ITables.MoveNext
Loop
ITables.Close
End Function

【问题讨论】:

  • 您能否以不同的方式触发此操作,始终写入相同的文件名并在启动 Access DB 时运行脚本以自动更新文件/记录?我通常是这样设置的。
  • 可能,或者使用 Richard 描述的 autoexec 宏,但正如我在对 Richard 的评论中所指出的,更新可能需要 5 分钟,并且它也被用作前端来提取报告其他同事,我不希望减慢他们的使用速度。
  • 听起来您已经达到了 Access DB 的极限,需要一个实际的报告和数据库工具。

标签: ms-access sas vba


【解决方案1】:

有几种SAS语句可以启动外部程序,包括

  • %sysexec
  • 呼叫系统
  • 文件名管道

Access 具有命令行开关 /x mymacro,它将在启动时运行特定的宏,或者您可以创建或更新同样在每次启动 Access 时自动运行的 AutoExec 宏。

所以你的 SAS 代码可能看起来像

%Spit;
%sysexec msaccess /x ImportTablesMacro;

【讨论】:

  • 谢谢@Richard。我知道在数据库启动时运行 autoexec 宏,但由于导入可能需要 5 分钟,并且数据库有一个前端被其他同事用来提取各种报告,这不是一个有效的解决方案。我对 %sysexec 的经验有限,所以为了确保我理解正确,要从 SAS 触发代码,应该是 %sysexec ‘PATH’ /x ImportTables; PATH 是访问数据库的路径。它可以按原样触发 ImportTables 函数,写在一个模块中,还是我需要在包含 VBA 代码的 Macros 下创建一个宏?
  • 潜在的用例证明你的数据存储升级到 SQL Server 或 Azure 是合理的。访问权限仍可用于报告和输入前端。
【解决方案2】:

@Richard 向您展示如何从 SAS 调用 Access。如果您无法从 SAS 会话运行命令行(某些系统管理员禁用此功能),您可以编写一个 shell 脚本。

首先调用 SAS 创建 .txt 文件。

然后使用 Richard 描述的方法调用 Access 以运行宏。

【讨论】:

  • 谢谢@DomPazz。我确实能够从我的 SAS 会话中运行命令行。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2013-11-03
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多