5.6.2跨网格调用

除了可以调用子程序之外,在集算器中,还可以进行跨网格调用,即在程序中用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中的写法,需要注意\用在字符串表达式中是转义符,需要在它前面再添加一个\来表示字符本身。A1A2调用前面的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)

 

 

这个子程序从PNamesCNames分别随机取出1个成员返回。其中PNameCNames是需要传入的网格参数:

 

 

在主程序中调用的情况如下:

 

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))

 

先在A2B2中调用前面的网格createID.dfx,生成产品名称序列和客户名序列。再在A3中循环,B3中调用网格findNames.dfx,将A2B2作为参数传入。注意,调用call时使用多个参数时,这些参数值将依次设入dfx的各个参数中,与dfx参数列表中的参数名无关。也就是说,在这里只根据参数的顺序,A2的值赋值给PNamesB2的值赋给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的序表中随机生成测试数据如下:

 

通过跨网格调用,可以使得主网格中的代码更为简洁,使调用网格中的代码得以复用。同时,也可以将一些需要加密的算法放置在单独的网格中,在其它代码中调用。