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

时间:2017-08-10 15:05:39

标签: sas

有没有办法替换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资源管理器中双击数据集时,似乎打开了ViewTable并不是真正的'视图。所以也许我的问题应该修改为,

如何将数据集视为视图?

1 个答案:

答案 0 :(得分:1)

您可以通过创建视图然后打开它来将数据集视为视图。但你误解了观点是什么;具体而言,视图可以锁定数据集,如果它设置为(在某些DBMS中),则它在运行时。 (稍后会详细介绍。)

SAS锁定数据集,不是因为它,而是因为它是正确的,因为它是如何工作的。当处理"在修改基础数据集时如何处理可查看窗口"时,您有三个选择,正确(可能是四个)?

  • 禁止更改
  • 更新视图以反映更改
  • (可能)向用户表明需要刷新
  • 忽略更改,让用户拥有过时信息

ViewTable是一个相当古老的概念 - 并且使用了相当古老的方法。因此,第二种选择是不可能的 - 它不是以可以实时更新的方式运行的东西。第三种情况并非如此:它再次要求SAS知道发生了变化并且能够更新ViewTable窗口,而目前它并没有这样做。现在,ViewTable只是抓取数据并显示给您,然后再也不会检查。选项4很糟糕,因为你现在让用户对什么" true"是的,特别是因为ViewTable实际上允许直接编辑数据(这绝不是我会做的事情,但它是可能的!)。

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

另外,旁注; ViewTable是一个AF应用程序,它实际上不是一个View。 ViewTable意味着"查看表格#34;而不是"从表格中查看"。

至于你如何处理这个问题:不幸的是,写一个视图不会有帮助。请注意:

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在运行任何东西之前关闭所有打开的数据集。