我们在使用平台模型的时候,经常有需要要访问客户端本地资源。打个比方,我们需要导出计算的数据,而等待整个模型的返回特别长,所以可能我们需要边运行,边导出数据。又或者整个的数据结果集非常大,无法单次返回,需要分开成小结果集运行时导出到客户端,而导出数据可以通过ExecSql输出到数据库,也可以是通过ExportFile来导出文件,我们还可以通过WriteFile等文件读写函数来直接操作文件。以及通过封装好的系统或者用户写的TSL函数。
平台提供了两个关键字RDo和RDo2来解决这个问题。RDo和RDo2可以在平台运行模型的时候远端调用客户端的函数运行。
例如:我们在运行的时候要导出一组股票的交易明细数据到客户机上。
Stks:=GetBK(“深证A股;上证A股”);
Day:=Today();
for i:=0 to length(Stks)-1 do
begin
SetSysParam(pn_Stock(),Stks[i]);
if not isTradeDay(Day) then continue;//如果没有交易则下一个
Data:=select DateTimeToStr([“date”]) as“Time”,[“close”],[“vol”] from tradetable DateKey Day to Day+1 of Stks[i] where [“vol”]>0end; //取出时间,收盘价,成交量
RDo2 ExportFile(ftCSV(),“”,”C:\\DataStore\\”+IntToStr(DateToInt(Day))+”\\”+Stks[i]+”.csv”,Data);//导出数据
end;
以上代码为将上证和深证A股的当天的交易明细导出到本地。ExportFile是一个导出的函数,但是在平台上运行的时候导出到的位置是在服务器上,而且需要在服务器上设置权限。而用RDo2则使导出命令在客户端上运行,所以输出会在客户端本地。
由于要对本地文件进行读写,或者调用本地的其他资源,终端为了安全起见,默认禁止了这类远端调用,于是系统左上角会出现如下界面:
系统还会终止模型的运行并且返回出错信息。
用户可以通过菜单进入系统设置,也可以点击进入系统信任中心,界面如下:
信任中心的初始是最高安全性,禁止了远程模型对本地资源的访问。如果我们只需要导出数据到本地或者执行本地的数据库查询语句,那么我们可以选择高安全性,高安全性允许RDO/RDO2执行的函数是ExportFile和ExecSQL。
如果我们还需要从本地导入数据,调用ImportFile函数,则应该设置为中安全性。低安全性则是允许RDo/RDo2调用任何本地函数。而最低安全性则还允许使用SendToClient函数用”do”或者”getdo”命令组成命令串执行,这就可以不需要把命令串封装成函数来执行。
如果信任中心拒绝了调用,系统会自动禁止该调用,并且会有一个禁止掉的提示小窗口。而当信任中心允许调用的时候,如果用户没有进行许可设置,系统依旧会对远程模型的本地资源调用进行安全提示。
我们可以信任某个用户来源的所有的函数的调用,也可以信任该来源函数的调用,还可以仅仅信任该调用(例如信任导出的调用必须导出的文件名都是一致的),我们还可以临时允许该调用或者拒绝该调用。这样下次当调用发生的时候,该信任管理窗口依旧会出现。
对于导入和导出的调用,还有一个信任路径的设置。当设置了信任路径以后,在该信任路径下以及该路径下的子目录下的所有导入/导出命令将会被允许而不再提示。
无论是拒绝还是信任了,在运行信息中总是会显示收到的命令。此外,对于已经设置了信任的调用方式,如果用户需要修改,可以进入系统设置中,打开信任配置文件来修改INI文件,找到相应项目删除掉就可以了。
RDo和RDo2的差异在于RDo2会返回函数的执行结果,因此RDo2是同步执行的方式,一定会等待客户端执行完毕才返回。而RDo则是不返回结果,直接把命令提交给客户端处理,至于执行的正确与否,RDo是不理会的,会出现模型执行完毕了,而客户端的命令仍然在排队执行的情况。
在绝大多数情况下,RDo2会更安全可靠,但是RDo的效率有时候会更高。但是平台会约束RDo送回到客户端的内容的带宽,并且系统也无法保障RDo的执行是否是正确的。
而且有些函数是必须用RDo2的,例如ImportFile,因为不用RDo2,该调用毫无意义。而ExportFile,ExecSQL的调用,有点却不一定需要等待返回,所以也可以采用RDo,但是我们依旧推荐用户使用RDo2,除非用户确实需要使用RDo。
如果RDo2所调用的函数使用了系统参数(客户端执行的函数并不多见),则可以使用With关键字把系统参数带进去。
例如A:=RDo2 LocalFunctionTest() with array(“abcd”:123,”bcd”:234);
而LocalFunctiontest函数的内容则为:
Return GetSysParam(“abcd”)+GetSysParam(“bcd”);
则返回的结果是357
RDo2调用的默认是300秒超时的,也就是说默认情况下当客户端未能在300秒内处理完请求(包括客户端无人响应确认),系统会抛出超时的异常。
如果需要设置超时的时间,可以用TimeOut来设置超时,例如RDo2 ImportFile(ftCsv(),””,”C:\\1.csv”,Data) TimeOut 30; //调用ImportFile函数的超时时间为30秒。
参见RDo,RDo2。