除了可以调用子程序之外,在集算器中,还可以进行跨网格调用,即在程序中用call函数运行其它网格中的程序,或是使用其它网格中的计算结果。在这种时候,相当于将整个网格作为一个子程序来执行,在网格中需要用return来返回计算结果,当返回后结束所调用程序的执行,释放资源。例如,网格D:\files\createID.dfx如下:
|
A |
B |
1 |
/create an ID |
|
2 |
|
>size.run(A2=A2+char(65+rand(26))) |
3 |
return A2 |
|
在这里,B2循环在A2中添加字符,随机生成ID,并用return语句返回。与调用子程序时类似,在跨网格调用时,也可以不使用return语句,此时将返回最后一个以=开头的计算格的值。如可以将A3中的代码改为=A2,结果是一样的。需要注意到,在B2中用到了参数size,这是一个网格参数,需要在菜单栏中点击Program>Parameter设置:
跨网格调用时,如果需要使用参数,需要通过所调用的dfx文件中使用的网格参数传入。用call函数跨网格调用的方法,与子程序调用类似:
|
A |
1 |
=call("D:\\files\\createID.dfx",rand(3)+3) |
2 |
=call("createID.dfx",rand(3)+3) |
使用的参数同样写在后面,所不同的是,A2调用网格程序时,直接指定所调用的dfx文件名。A1中的写法,需要注意\用在字符串表达式中是转义符,需要在它前面再添加一个\来表示字符本身。A1和A2调用前面的dfx文件,随机生成3~5个字符的ID,如下:
如果使用A2中的写法,需要保证dfx文件置于集算器的主路径或者寻址路径中。在菜单栏中点击Tool>Options,在选项设定的Environment页面中,可以设定主路径和寻址路径,如:
在上面的设置中,dfx文件置于主路径Main Path中,或者寻址路径Searching Path的任何一个目录中,用call函数调用时,都可以只用文件名,而不用写全路径。
如果是被集成使用时,则需要在配置文件raqsoftConfig.xml中,设置主路径与寻址路径:
<Esproc>
<dfxPathList>
<dfxPath>E:\tools\raqsoft\esProc\demo\Case\Structural</dfxPath>
<dfxPath>D:\files\txt</dfxPath>
</dfxPathList>
<mainPath>D:\files\demo</mainPath>
</Esproc>
在跨网格调用时,也可以使用多个参数,或者返回多个结果。如D:\files\findNames.dfx如下:
|
A |
B |
1 |
/find a PNAME and a CNAME |
|
2 |
=rand(PNames.len())+1 |
=rand(CNames.len())+1 |
3 |
return PNames(A2),CNames(B2) |
|
这个子程序从PNames和CNames分别随机取出1个成员返回。其中PName和CNames是需要传入的网格参数:
在主程序中调用的情况如下:
|
A |
B |
1 |
=create(Product,Customer) |
|
2 |
=5.(call("createID.dfx ",2)) |
=10.(call("createID.dfx ",rand(3)+3)) |
3 |
for 100 |
=call("findNames.dfx",A2,B2) |
4 |
|
>A1.insert(0,B3(1),B3(2)) |
先在A2和B2中调用前面的网格createID.dfx,生成产品名称序列和客户名序列。再在A3中循环,B3中调用网格findNames.dfx,将A2和B2作为参数传入。注意,调用call时使用多个参数时,这些参数值将依次设入dfx的各个参数中,与dfx参数列表中的参数名无关。也就是说,在这里只根据参数的顺序,A2的值赋值给PNames,B2的值赋给CNames。当所调用的程序用return语句返回多个结果时,不必像子程序中的return语句一样用结果构成序列,只需将结果用逗号分隔,数据返回时会自动构成序列。在B3中可以查看最后一次调用网格时,返回的结果如下:
上面这个主网格的效果,是随机生成100条测试数据插入A1中的序表,记录由产品名与客户名随机构成。执行后,A1中的结果如下:
同样,所调用的网格程序中并不要求必须返回结果,如文件D:\files\addRecord.dfx如下:
|
A |
B |
1 |
/add a record |
|
2 |
=Table.len()+1 |
=(rand(1000)+1)*100 |
3 |
>Table.insert(0,A2,PNAME,CNAME,B2) |
|
网格中使用了三个参数,需要分别传入产品名PNAME、客户名CNAME以及使用的序表Table:
在主网格中,调用如下:
|
A |
B |
1 |
=create(OID,Product,Customer,Amount) |
|
2 |
=5.(call("createID.dfx ",2)) |
=10.(call("createID.dfx ",rand(3)+3)) |
3 |
for 100 |
=call("findNames.dfx",A2,B2) |
4 |
|
>call("addRecord.dfx",B3(1),B3(2),A1) |
其中B4中调用了addRecord.dfx,在A1的序表中插入随机记录。执行后,A1的序表中随机生成测试数据如下:
通过跨网格调用,可以使得主网格中的代码更为简洁,使调用网格中的代码得以复用。同时,也可以将一些需要加密的算法放置在单独的网格中,在其它代码中调用。