SAS - 覆盖在 ViewTable 中打开的数据集

Posted

技术标签:

【中文标题】SAS - 覆盖在 ViewTable 中打开的数据集【英文标题】:SAS - Overwriting a dataset open in ViewTable 【发布时间】:2017-08-10 15:05:38 【问题描述】:

有没有办法替换当前在 ViewTable 窗口中打开的数据集?

例如,假设我创建了以下数据集:

data the_meaning_of_life;
  is = 2;
run;

我打开它并注意到,哦,drat!,我打错了!我更正了代码并重新运行它。

data the_meaning_of_life;
  is = 42;
run;

然后我收到以下消息,

ERROR: You cannot open WORK.THE_MEANING_OF_LIFE.DATA for output access with member-level
control because WORK.THE_MEANING_OF_LIFE.DATA is in use by you in resource environment
ViewTable Window.

当然有解决方法。在keys 菜单中,我可以绑定

next viewtable:libref.dataset;end;

F 键或在提交按钮前加上它,以便在提交代码之前关闭所有 VT。

我知道我在做一个假设。我假设因为 ViewTable 窗口被称为“ViewTable”,所以它确实是一个视图。

根据SAS,一个视图是

为以后命名和存储的虚拟数据集的定义 采用。视图不包含数据;它仅描述或定义数据 存储在其他地方。

视图应该独立于数据集。在 SAS Explorer 中双击数据集时打开的 ViewTable 似乎不是“真实”视图。所以也许我的问题应该修改为,

如何将数据集作为视图查看?

【问题讨论】:

【参考方案1】:

您可以通过创建视图然后打开它来将数据集视为视图。但是您对视图是什么有误解;具体来说,视图可以锁定数据集,如果它设置为这样做(在某些 DBMS 中),则它正在运行。 (稍后会详细介绍。)

SAS 锁定数据集,不是因为它必须这样做,而是因为考虑到它的工作原理,这是正确的做法。在处理“当底层数据集被修改时如何处理可视化窗口”的问题时,你有三个选择,对吧(可能四个)?

不允许更改 更新视图以反映更改 (也许)向用户表明它需要刷新 忽略更改,让用户拥有过时的信息

ViewTable 是一个非常古老的概念 - 并且使用了非常古老的方法。因此,第二个选择实际上是不可能的——它不是以一种可以实时更新的方式运行的东西。第三个也不是真的:它再次要求 SAS 知道发生了更改并具有更新 ViewTable 窗口的能力,而目前它还没有这样做。现在,ViewTable 只是抓取数据并将其显示给您,然后从不返回。选项 4 不好,因为您现在让用户对什么是“真实”感到困惑,特别是因为 ViewTable 实际上允许直接编辑数据(这不是我会做的事情,但它是可能的!)。

因此 SAS 使用选项 1:锁定表以防止任何更改,因此您知道您拥有当前信息。

另外,附注; ViewTable 是一个 AF 应用程序,它实际上不是一个视图。 ViewTable 的意思是“查看表格”,而不是“从表格中创建视图”。

至于如何处理:不幸的是,编写视图无济于事。请注意:

data class;
  set sashelp.class;
run;

data class_view/view=class_view;
  set class;
run;

运行它,打开视图,然后重新运行第一个数据步骤。是的,您仍然将其锁定!这是因为打开视图实际上是告诉 SAS 锁定视图使用的数据集,原因与上述相同。

你可以做什么:

data class;
  set sashelp.class;
run;

proc print data=class;
run;

您可以整天运行它,它不会有任何问题,因为 proc print 只是一个不会锁定任何东西的静态“视图”。

您也可以使用ODS TAGSETS.TABLEEDITOR,它可能会为您提供一些更有用的东西。

您绝对可以使用keys 选项来关闭您的表格。也许更好的是使用 Enterprise Guide,它有一个很好的选项,告诉 EG 在运行任何东西之前关闭所有打开的数据集。

【讨论】:

我认为存在第四种选择,即更改基础数据集。当然,在访问期间需要锁定数据集,但不能超出此范围。然而,这来自于将视图视为某些条件下的快照。这篇***.com/questions/256700/… 的帖子将视图解释为便利层或抽象。您是说我在双击时看到的 ViewTable 不是快照,而是或类似于select * from <dataset> 这与此完全相似,但这也是视图的含义。我确实提到了第四个选项(忽略更改 - 这就是我的意思,即允许基础数据集的更改但从 UI 的角度忽略它),但这不是 SAS 所做的选择。这是 DB 和 UI 设计中非常常见的问题,并且可以通过多种不同的方式进行处理——所有四个选项都由不同的产品采用。数据库有行级锁定、表级锁定、单元级锁定……各种可能性。 顺便说一句,SAS 工作室不会锁定打开以供查看的表。有时这很方便,但缺点是视图无法反映数据集的更改,这可能会导致混乱(“为什么我的更新不起作用??”)

以上是关于SAS - 覆盖在 ViewTable 中打开的数据集的主要内容,如果未能解决你的问题,请参考以下文章

就是 sas中 经常看到ls=2000,或者lrecl=32767,后面的数是怎么定义的?

ViewTable 不读取数组(IOS)

OLAP 多维数据集在 SAS 9.2 中获得递增的文件夹名称

sas输出之后怎么回去

在给定年份使用不同颜色的SAS覆盖

如何转换要在 R 中打开的 SAS (.sas) 文件? [关闭]