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
{
[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
{
[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
{
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
{
[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))
}
{
[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
}
{
[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
}
{
[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,报错,因为无法对应。
小结一下:
单流 = 单流 正确
单流 = 多流 错误
单流 = 函数(多流)正确
多流 = 单流 正确
多流 = 多流 正确(流量必须匹配)
多流 = 函数(多流)正确
接下来还会有更加细致的问题。