Samsara v2.0 打造ERP数据流脚本编程 —— 脚本规范

 

Samsara v2.0 打造MIS数据流脚本编程 —— 脚本规范(初稿)

 

简介:

MIS很大一部份是数据库的编程,例如订单生成到货单、入库单、日志、修改数据库等。

这些操作基本上都是基于表单信息,例如到货单信息来自订单 + 部分界面输入。

以往,使用代码做这中“赋值”非常的麻烦,如果涉及到了数学运算更加麻烦。

例如计算商品售价 = (商品税率+1)*商品到货金额 等等。。。。

现在使用Samrara提供的脚本编程,能够很容易的完成各种复杂并且“无聊”的表单赋值运算。


入门:

一个基于Table2生成Table1的例子:

EXCHANGER TABLE1 T1
{
NUM:COLUMN1 = TABLE2.COLUMN1 * 0.11
NUM:COLUMN2 = TABLE2.COLUMN2 + TABLE2.COLUMN3
COLUMN3 = DEMOTEST
}

这样table1的字段column1/column2/column3就可以通过table2计算出来了。

用户只要给出table2的数据,通过samrara的脚本运算,能够得到需要的table1数据。

脚本规范细则:

Samrara v2.0版本一共包括7大模块,分2类。
数据提供模块:EXCHANGER, SPLITTER, LOADER
流转控制模块:IFER, SWITCHER, CHANNEL
channel为流转组织中心,他对其余6大模块进行组织,完成各种逻辑。



Exchanger

EXCHANGER [TABLENAME] [IDENTIFIER]
{
[COLUMNTYPE:][COLUMNNAME] = [EXPRESSION,]
}

EXCHANGER TABLE1 T1
{
NUM:COLUMN1 
= TABLE2.COLUMN1 + MAX(TABLE3.COLUMN1) + SYS.SERIAL + @TIME
}

功能:
完成各种运算赋值。

后续连接符号:
NEXT


表达式标记:
[TABLENAME].[COLUMNNAME]. 如TABLE1.COLUMN1: 取自表的值
[@MARK]. 如@PERSON: 取自此mark代表的值
SYS.[type].如SYS.SERIAL:取自系统默认值,包括:SYS.NULL/SYS.SERIAL/SYS.DATETIME/SYS.PK.TABLENAME.COLUMNNAME


其他:
COLUMNTYPE = NUM/STR/BOOL/NBOOL.指定表达式的类型,分别对应数字、字符、布尔、数字运算布尔
函数 = MAX/MIN/AVERAGE/COUNT/POWER。。。等。


SPLITER

SPLITER [TABLENAME] [IDENTIFIER]
{
[COLUMNTYPE:][COLUMNNAME] = [EXPRESSION,]
}

SPLITER TABLE1 S1
{
NUM:COLUMN1 
= TABLE1.COLUMN1 / 2,
COLUMN2 
= TABLE2.COLUMN2
}

 

功能:
功能同EXCHANGER。

与EXCHANGER区别:
EXCHANGER是在原数据基础上运算,即原来存在table1,那么在原table1数据基础上进行运算然后返回给TABLE1
SPLITER在元数据基础上运算后生成一个新的副本取代原数据。

后续连接符号:
OLD/NEW/NEXT


其他:
COLUMNTYPE和函数功能同上。


LOADER


LOADER [TABLENAME] [IDENTIFIER]
{
SQL 
= [EXPRESSION],
[COLUMNTYPE]:[COLPARAM] = [EXPRESSION,]
}

LOADER TABLE1 LOAD1
{
SQL 
= SELECT * FROM TABLE1 WHERE COLUMN1 = :COLUMN1,
NUM:COLUMN1 
= TABLE2.COLUMN1 + 12
}


功能:
从数据库装载数据到Samrara进行运算,不需要用户提供。
COLPARAM就是SQL中的参数。

后续标志:
TRUE/FALSE/NEXT


其他:
同上。


MAPPER


MAPPER [IDENTIFIER]
{
[MARK] = [EXPRESSION,]
}

MAPPER MAPPER1
{
STR:@PERSON = TABLE2.COLUMN1 + DEMO
}

功能:
把表达式运算结果赋值到标记,供后续模块使用。提高复用性。

后续标志:
NEXT


其他:
同上。

 

IFER

IFER [IDENTIFIER]
{
[EXPRESSION]
}

IFER I1
{
AND(( TABLE1.COLUMN1 + TABLE1.COLUMN2 ) > MAX(TABLE2.COLUMN1 * TABLE2.COLUMN2))
}

 功能:
根据表达式计算bool结果,然后根据结果控制后续。

后续符号:
TRUE/FALSE

函数包括:
AND / OR / 无. AND表示输入的数据必须全部符合才判真、or则有真则真、无就是每次都判断。

例子:
例如订单子表如果价格>5的,那么生成入库单、否则生成送货单。这个就是无函数。
如果订单子表当所有的到货数量 == 要货数量,那么才订单确认,这个就是AND.


其他:
表达式包括数字bool运算和字符bool运算。表达式参考exchanger




SWITCHER

SWITCHER [IDENTIFIER]
{
[CASE] = [EXPRESSION]
}

SWITCHER SW1
{
CASE1 
= TABLE1.COLUMN1 == 12,
CASE2 
= TABLE1.COLUMN1 > 12,
CASE3 
= TABLE1.COLUMN1 < 12
}

功能:
是更加复杂的if,判断每个case,然后控制后续。

后续符号:
[CASE],用户指定。

函数包括:
AND / OR / 无. 同上。

其他:
表达式包括数字bool运算和字符bool运算。



CHANNEL

CHANNEL [IDENTIFIER]
{
[FROM] = [TO]
}

CHANNEL CHANNEL1
{
EXCHANGER.TABLE1.E1.
NEXT = SPLITER.TABLE1.SP1,

SPLITER.TABLE1.SP1.OLD 
= EXCHANGER.TABLE2.E1,
SPLITER.TABLE1.SP1.NEW 
= EXCHANGER.TABLE2.E2
}

功能:
把各种模块进行组织,达到数据流效果。



高级话题:

Samrara的核心关键字:单流、多流、分流、合流

。一张订单主表对应5张订单子表,那么主表就是单流、子表就是多流。
。如果订单子表到货金额>5,就XXX,否则YYY。这个就是分流。
。当分流后再次汇聚到相同模块,就是合流。

单流和多流概念非常重要,会影响到数据的输出正确性。例如一个刚才的exchanger例子:

EXCHANGER TABLE1 T1
{
NUM:COLUMN1 = TABLE2.COLUMN1 * 0.11
NUM:COLUMN2 = TABLE2.COLUMN2 + TABLE2.COLUMN3
COLUMN3 = DEMOTEST
}

如果用户给出table2的数据有5条,就是多流,那么生成的table1也会有5条数据。再看一个例子:

COLUMN1 = TABLE2.COLUMN1 + TABLE3.COLUMN1

如果用户给出table2数据为1条,table3数据为5条,那么仍然输出5条,其中table2的那条数据重复参与运算5次。

如果用户给出table2数据为3条,table3数据为5条,那么就会报错,因为无法进行流匹配。

再复杂一点,如果用户之前给出了table1的数据,那么重新考虑脚本:

EXCHANGER TABLE1 T1
{
NUM:COLUMN1 = TABLE2.COLUMN1 * 0.11
NUM:COLUMN2 = TABLE2.COLUMN2 + TABLE2.COLUMN3
COLUMN3 = DEMOTEST
}

如果table1 = 1, table2 = 5,报错,因为无法对应。

小结一下:

单流 = 单流 正确
单流 = 多流 错误
单流 = 函数(多流)正确

多流 = 单流 正确
多流 = 多流 正确(流量必须匹配)
多流 = 函数(多流)正确

接下来还会有更加细致的问题。

posted @ 2007-11-21 14:37    阅读(2210)  评论(5编辑  收藏  举报
IT民工