1 脚本语言... 3

1.1 介绍说明... 3

1.2 应用场景... 3

2 语法介绍... 4

2.1 类型... 4

2.2 运算... 4

2.3 控制... 5

2.4 内置函数... 6

2.5 自定义函数... 6

2.6 注释... 6

3 内置函数... 7

3.1 显示提示函数... 7

3.2 输入控制函数... 7

3.3 界面控件操作函数... 8

3.4 单据操作函数... 9

3.5 打印模板脚本函数... 10

3.6 数据库操作函数... 10

3.7 更多函数... 11

4 打印脚本的事件... 14

4.1 相关参数... 14

4.2 函数清单... 14

4.2.1 main. 14

4.2.2 func_gopage. 14

4.2.3 func_gorow. 14

4.2.4 before_draw_obj() 14

4.3 例子... 15

4.3.1 如何进行大写金额的套打... 15

4.3.2 打印日期格式的转变... 15

4.3.3 自动根据打印内容长度设置字体大小... 15

4.3.4 根据打印内容长度设置明细的行高度... 16

4.4 其它参考... 16

5 应用函数... 17

5.1 公共函数... 17

5.2 人力资源系统... 17

5.3 进销存系统... 17

6 物资单据的事件... 19

6.1 函数清单... 19

6.1.1 create_voucher 19

6.1.2 func_show. 19

6.1.3 init_row. 19

6.1.4 cell_change. 19

6.1.5 obj_change. 19

6.1.6 func_before_print 19

6.1.7 func_after_print 19

6.1.8 func_after_check. 19

6.1.9 adjust_row. 19

6.2 例：如何限定打印只打印一次... 20

7 一些例子... 21

7.1 工资单的四舍五入... 21

# 1 脚本语言

## 1.1 介绍说明

系统包含了一个脚本引擎，用于增强系统的适应能力，使得使用者在一定程度上能对系统加以定制。

对于学过简单计算机语言的使用者掌握脚本语言并不困难。

了解脚本的应用场合能最大程度地发挥系统的能力，并带来效率的提升。

## 1.2 应用场景

工资的计算公式定义（人力资源）

打印模板的控制

单据的控制（进销存）

随着系统的扩展，将有更多的环节支持脚本。

# 2 语法介绍

解释执行器基本采用 C 的语法。下面是它的功能定义：

## 2.1 类型

int,float,string,采用 string 类型做字符串处理

## 2.2 运算

l 赋值

=

例：

int a,b;

a=5;

b=2*a+3;

l 基本运算

+ - * /

例：

float a,b;

a=5.1;

b=2*a+3*2.3-12/4;

l 判断运算

> == < >= <= !=

例：

判断 a 是否大于 b if(a>b)

判断 a 是否等于 b if(a==b)

判断 a 是否小于 b if(a<b)

判断 a 是否大于等于 b if(a>=b)

判断 a 是否小于等于 b if(a<=b)

判断 a 是否不等于 b if(a!=b)

l 逻辑运算

|| && !

例：

判断 a 大于 3 或者 b 大于 5 if(a>3 || b>5)

判断 a 大于 3 并且或者 b 大于 5 if(a>3 && b>5)

判断非（a 大于 3） if(!(a>3))

## 2.3 控制

l 判断

if(条件)

{

}

else

{

};

if(条件)

{

}

else if(条件)

{

}

else if(条件)

{

}

else

{

};

l 循环

for(id=0;id<num;id++)

{

};

l 循环

do

{

}while(id<3);

l 循环

while(id<3)

{

};

l 选择

switch(变量)

{

case 1:

break;

.

.

.

};

l 其他控制

continue

break

goto test_lab

label test_lab

## 2.4 内置函数

系统定义了一些内置函数，可以直接调用。

## 2.5 自定义函数

int add(int x,int y)

{

return x+y;

};

## 2.6 注释

采用//作为注释

# 3 内置函数

类型标识： S 字符型 I 整数型 F 数值型

## 3.1 显示提示函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
dbg | S |  | 显示变量 | 要显示的变量 |
msg | S |  | 显示提示 | 要显示的内容 |
warn | S |  | 显示警告 | 要显示的内容 |
confirm | S |  | 请确认 | 要显示的内容 | 1 确定 0 取消

## 3.2 输入控制函数

这组函数主要用于在脚本里设定弹出一个输入窗口，让操作员输入一些参数，便于进行后续处理。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
inp_clear |  |  | 清除内容 |  |
inp_get_val |  |  | 获得指定变量的值 | 变量 | 变量值
inp_set_val |  |  | 设置一个变量的值 | 变量标识，变量值 |
inp_def_dict |  |  | 定义一个选择型的变量 | 变量标识，变量意义，字典编号 |
inp_def_string |  |  | 定义一个字符型的变量 | 变量标识，变量意义 |
inp_def_date |  |  | 定义一个日期型的变量 | 变量标识，变量意义 |
inp_def_month |  |  | 定义一个月份型的变量 | 变量标识，变量意义 |
inp_def_int |  |  | 定义一个整数型的变量 | 变量标识，变量意义 |
inp_select |  |  | 选择变量组 | 变量组标识 |
inp_para |  |  | 弹出窗口，输入相关参数 |  |

例子：

inp_def_string('mnum','数量');

inp_def_date('mdate','日期');

inp_para();

inp_num=inp_get_val('mnum')

## 3.3 界面控件操作函数

这组函数主要用于在脚本里设定获取或者修改当前窗口输入控件的内容。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
gui_list_inp_all |  |  | 显示当前窗口所有输入控件 |  |
gui_list_inp | S |  | 显示指定名称控件包含的输入控件内容 | 控件的名称 |
gui_list_all |  |  | 显示当前窗口所有控件 |  |
gui_list | S |  | 显示指定名称控件包含的控件内容 | 控件的名称 |
gui_hide | S |  | 隐藏一个控件 | 控件的名称 |
gui_show | S |  | 显示一个控件 | 控件的名称 |
gui_disable | S |  | 使得一个控件不可操作 | 控件的名称 |
gui_enable | S |  | 使得一个控件允许操作 | 控件的名称 |
gui_set_val | SS |  | 设置指定控件的内容 | 控件的名称，要设置的值 |
gui_get_val | S |  | 获取指定控件的内容 | 控件的名称 | 指定控件的内容
gui_set_x | SI |  | 设置控件的横坐标 | 控件的名称,x |
gui_set_y | SI |  | 设置控件的纵坐标 | 控件的名称,y |
gui_set_w | SI |  | 设置控件的宽度 | 控件的名称,宽度 |
gui_set_h | SI |  | 设置控件的高度 | 控件的名称,高度 |
gui_set_font_size | SI |  | 设置控件的字体大小 | 控件的名称,大小 |
gui_set_font_name | SS |  | 设置控件的字体名称 | 控件的名称, 字体名称 |
gui_get_x | S | I | 获取控件的横坐标 | 控件的名称 | x
gui_get_y | S | I | 获取控件的纵坐标 | 控件的名称 | y
gui_get_w | S | I | 获取控件的宽度 | 控件的名称 | 宽度
gui_get_h | S | I | 获取控件的高度 | 控件的名称 | 高度

例子：这个例子可以用于销售发货单里面，当联系人变化时，从数据库查出该联系人的地址作为目的地址。

int obj_change()

{

//change_obj

int card_id;

string sql;

if(change_obj=='ComboBox_Ext_Linkman')

{

card_id = gui_get_val('ComboBox_Ext_Linkman');

if(card_id>0)

{

sql='select address from eba_card where card_id=' + card_id;

db_run(sql);

if(db_row_count()>0)

gui_set_val('Edit_Aim_Address',db_res(0));

};

};

// gui_list_inp_all();

return 1;

};

## 3.4 单据操作函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
v_mark_sum | S |  | 标记一个列显示合计数（这个函数主要用于支持单据扩展的列显示合计） | 列标识 |
v_mark_col_readonly | SI |  | 标记一个列是否只读 | 列标识，只读标志（只读为 1，否则为 0） |
vr_add_res | SS |  | 增加物资 这个函数仅在物资单据中有效 | 产品编号，数量 |
attr_get_val | S | S | 获取单据扩展属性的值 | 属性标识 | 属性值
attr_set_val | SS | I | 设置单据扩展属性的值 | 属性标识，属性值 |

## 3.5 打印模板脚本函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
print_get_cp_sum | S |  | 获取指定字段当前打印页的合计（本函数只能在打印脚本里使用） | 列标识 | 合计
print_get_sum | S |  | 获取指定字段所有记录的合计（本函数只能在打印脚本里使用） | 产品编号，数量 | 合计
get_pub_pict | S |  | 获取公共图片 | 图片标示 |

## 3.6 数据库操作函数

这组函数主要用于访问数据库操作。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
db_run | S | I | 执行一个 sql 语句 | 要执行的语句 | 无
db_go_head |  | I | 指向第一条记录 | 无 | 无
db_next |  | I | 指向下一条记录 | 无 | 无
db_row_count |  | I | 获得记录数 | 无 | 记录数
db_field_count |  | I | 获得字段数 | 无 | 字段数
db_res | I | S | 获得指定列的值 | 列号 | 字段值
db_add_row |  | I | 添加一行记录 | 无 | 无
db_set_value | IS | I | 设置当前行指定列的值 | 列号,值 | 无
db_drop_field | S | I | 删除指定的列 | 列名 | 无
db_add_field | S | I | 增加一个列 | 列名 | 无
db_map | SSS | I | 数据字典转换 | 字典名,编码列名,名称列名 | 无
db_set_main_sort_id | I | I | 设置第一排序列 | 编号 | 无
db_add_sort_id | I | I | 添加排序列 | 编号 | 无
db_sort |  | I | 排序 | 无 | 无
db_have_error |  | I | 是否有 sql 错误 | 五 | 有错 1,无错 0
db_field_name | I | I | 取字段名 | 字段编号 | 字段名
db_set_table_name | S | I | 设置表的名称 | 表名称 | 无
db_set_field_count | I | I | 设置字段数 | 字段数 | 无
db_set_field_name | IS | I | 设置字段名称 | 编号,字段名 | 无
db_set_field_type | II | I | 设置字段类型 | 编号,字段类型 | 无
db_set_field_caption | IS | I | 设置字段标题 | 编号,字段标题 | 无
db_select_area | I | I | 选择一个工作区 | 工作区 0-5 | 无

## 3.7 更多函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
dt_get_name | SS | S | 获取字典对应字典意义 | 字典标识,字典取值编码 | 字典意义
dt_get_code | SS | S | 获取字典意义对应的字典编码 | 字典标识,字典意义 | 字典编码
fen_to_yuan | S | S | 字符表达的分转换为元 | 字符表达的分 | 字符表达的元
one_cap | SI | S | 取得金额其中一位的大写 | 字符表达的元 | 大写表达
one_digit | SI | S | 取得金额其中一位的小写 | 字符表达的元 | 小写表达
money_cap | S | S | 取得金额的大写 | 字符表达的元 | 大写表达
num_dec_cut | SI | S | 数字四舍五入 | 串,小数位数 | 结果字符串
fmt_date | SS | S | 格式化日期 | 标准日期 yyyymmddhhmiss,格式化串 | 格式化后的串
fmt_time | SS | S | 格式化时刻 | 标准时刻 hhmiss,格式化串 | 格式化后的串
get_cur_date |  | S | 取当天日期 | 无 | 日期 yyyymmdd
get_cur_fmt_date | S | S | 取格式化的当天日期 | 格式化串 | 格式化后的当天日期
get_cur_time |  | S | 取当前时刻 | 无 | 时刻 hhmiss
get_cur_fmt_time | S | S | 取格式化的当前时刻 | 格式化串 | 格式化后的当前时刻
get_cur_month | S | S | 取当天月 | 无 | 月 yyyymm
get_cur_year | S | S | 取当天年 | 无 | 年 yyyy
get_month_days | S | I | 取指定月份的天数 | 月份 yyyymm | 天数
get_year_days | S | I | 取指定年份的天数 | 年份 yyyy | 天数
date_to_second | S | I | 日期转换为秒数 | 标准日期 yyyymmddhhmiss | 秒数
time_to_second | S | I | 时刻转换为秒数 | 标准时刻 hhmiss | 秒数
get_last_month | S | S | 取上一月 | 标准月 yyyymm | 上一月
get_last_year | S | S | 取上一年 | 标准年 yyyy | 上一年
get_next_date | S | S | 取下一天 | 标准日期 yyyymmdd | 下一天
get_last_date | S | S | 取上一天 | 标准日期 yyyymmdd | 上一天
get_month_between | SS | I | 取 2 个日期的月份差 | 开始日期,结束日期 | 月数
get_day_between | SS | I | 取 2 个日期的天数差 | 开始日期,结束日期 | 天数
get_week_id | S | I | 取日期对应的星期 | 标准日期 yyyymmdd | 星期 1-7
is_date_valid | S | I | 盘点一个日期是否合法 | 标准日期 yyyymmdd | 合法 1,非法 0
std_inp_date | S | S | 从一个输入的串中取出日期 | 输入串 | 标准日期 yyyymmdd
std_inp_time | S | S | 从一个输入的串中取出时刻 | 输入串 | 标准时刻 hhmiss
strlen | S | I | 计算字符串的长度 | 字符串 | 长度
strcmp | SS | I | 比较 2 个字符串大小 | 串 1,串 2 | 0 相等,1 大于,-1 小于
strncmp | SSI | I | 比较 2 个字符串前几个字符的大小 | 串 1,串 2,比较长度 | 0 相等,1 大于,-1 小于
str_get_sub | SII | S | 返回部分子串 | 串 1,开始位置(首位为 0),长度 | 结果字符串
str_add_as_num | SS | S | 2 个字符串转为数字相加返回结果字符串 | 串 1,串 2 | 结果字符串
str_sub_as_num | SS | S | 2 个字符串转为数字相减返回结果字符串 | 串 1,串 2 | 结果字符串
str_std_num | SI | S | 字符串数字补齐小数位数 | 串,小数位数 | 结果字符串
lower | S | S | 根据指定串获得一个小写串 | 指定串 | 结果字符串
upper | S | S | 根据指定串获得一个大写串 | 指定串 | 结果字符串
str_cut | SI | S | 字符串截断 | 串,最大长度 | 结果字符串
to_int | S | I | 字符串转整数 | 串 | 结果数
to_float | S | F | 字符串转浮点数 | 串 | 结果数
fmt_float | FS | S | 浮点数转格式字符串 | 数值,格式 | 结果串
fmt_int | IS | S | 整数转格式字符串 | 数值,格式 | 结果串
mod | II | I | 2 个整数取余 | 数值 1,数值 2 | 结果
system | S | I | 执行外部程序 | 外部程序 |
shell | S | I | 执行外部程序 | 外部程序 |
get_ip |  | S | 获取本机 ip 地址 |  | Ip 地址
write_port | SS | I | 写串口并口 | 第一参数如 com1 lpt1 第 2 参数为十进制码串 100,20,255，可用于钱箱控制 write_port(‘LPT1 ‘,’27,112,0,60,255’); |
check_thr_err |  | I | 检查是否有函数执行错误信息 | 如果有会弹出信息 |

# 4 打印脚本的事件

## 4.1 相关参数

下面的参数可以在打印控制脚本中加以引用：

本页记录数 cp_row_num

本页记录数 cp_row_num

总页数 page_count

当前页码 page_id

当前记录号 record_id

记录总数 record_count

总页数 page_count

当前页码 page_id

打印份号 print_copy_id

当前记录号 record_id

记录总数 record_count

本页小计 cp_xxxx 后面的 xxxx 为字段名

打印预览的时候可看到打印时传入的其它参数清单（包括一些合计大写）。

## 4.2 函数清单

### 4.2.1 main

该函数在打印预览的时候调用。

### 4.2.2 func_gopage

该函数在预览指定页的时候调用。

### 4.2.3 func_gorow

该函数在定位一行的时候调用。

### 4.2.4 before_draw_obj()

该函数在打印某个对象前调用，可在函数里通过 to_draw_obj 知道接下来要打印哪个对象。

系统预设值 pp_x（横向偏移），pp_y（纵向偏移），pp_w（宽度），pp_h（高度），pp_font_size 参数，可以修改以上 5 个参数来控制打印的位置和大小。

## 4.3 例子

### 4.3.1 如何进行大写金额的套打

12345.67 元,打印出来的结果是：壹万贰仟叁佰肆拾伍元陆角柒分....可不可以把中间的万仟佰拾元角分去掉?

利用 one_cap 函数可以实现这个功能。

如 v = 123.45

one_cap(v,1) 则返回五

one_cap(v,2) 则返回四

one_cap(v,3) 则返回三

### 4.3.2 打印日期格式的转变

默认打印的参数为 v_print_time，格式为 ‘yyyy-mm-dd hh-mi-ss’，现在需要打印为 ‘yyyy 年 mm 月 dd 日’这种格式：

在模板上增加一个对象 my_print_time，然后在 main 函数里面进行脚本赋值。

int main()

{

string sub;

sub = str_get_sub(v_print_time,0,4);

sub = sub + '年';

sub = sub + str_get_sub(v_print_time,5,2);

sub = sub + '月';

sub = sub + str_get_sub(v_print_time,8,2);

sub = sub + '日';

my_print_time = sub;

return 1;

};

### 4.3.3 自动根据打印内容长度设置字体大小

int before_draw_obj()

{

if(to_draw_obj!='d_res_name')

return 1;

if(strlen(d_res_name)>=30)

pp_font_size=8;

else if(strlen(d_res_name)>=16)

pp_font_size=10;

else

pp_font_size=12;

return 1;

};

### 4.3.4 根据打印内容长度设置明细的行高度

int func_cal_row_height()

{

if(strlen(d_res_name)>=16)

row_height_add=400;

return 1;

};

## 4.4 其它参考

请阅读内置函数里面的打印模板脚本函数。

# 5 应用函数

## 5.1 公共函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
get_user_id |  | S | 获取登陆的操作员编号 |  | 操作员编号
get_user_name |  | S | 获取登陆的操作员姓名 |  | 操作员姓名

例子：取登陆用户编号并显示

string uid;

uid=get_user_id();

dbg(uid);

## 5.2 人力资源系统

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
get_emp_pict | S | S | 获取员工对应的图片文件 | 员工标识 | 图片文件名
get_emp_info | SS | S | 获得员工指定信息 | 员工编号，列名 | 列信息
get_emp_desc | SS | S | 获得员工指定描述信息 | 员工编号，描述信息类型 | 描述信息

## 5.3 进销存系统

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
get_res_pict | S | S | 获取产品对应的图片文件 | 产品标识 | 图片文件名
get_res_info | SS | S | 获得产品指定信息 | 产品编号，列名 | 列信息
get_res_desc | SS | S | 获得产品指定描述信息 | 产品编号，描述信息类型 | 描述信息
get_res_factor_num | SS | S | 获得产品折算数量 | 产品编号，标准数量 | 折算数量
get_eba_info | SS | S | 获得客户指定信息 | 客户编号，列名 | 列信息
get_sup_info | SS | S | 获得供应商指定信息 | 供应商编号，列名 | 列信息
get_eba_attr | SS | S | 获得客户自定义属性信息 | 客户编号，自定义属性名 | 自定义属性信息
get_sup_attr | SS | S | 获得供应商自定义属性信息 | 供应商编号，自定义属性名 | 自定义属性信息
get_eba_group_price | SS | S | 获取指定价格体系的价格 | 产品编号，价格体系编号 | 价格
have_eba_group_price | SS | I | 判断是否在某价格体系中定义了 | 产品编号，价格体系编号 | 1：定义了 0：未定义

例子：物资单据打印主物资扩展属性

打印模板中定义字段m_res_ext_1,然后在main函数里面加：

m_res_ext_1 = get_res_info(m_res_id,'ext_1')

例子：物资单据打印明细物资扩展属性

打印模板中定义字段res_ext_1,然后在func_go_row函数里面加：

res_ext_1 = get_res_info(res_id,'ext_1')

# 6 物资单据的事件

## 6.1 函数清单

### 6.1.1 create_voucher

该函数在新建单据的时候调用。

### 6.1.2 func_show

该函数在显示单据的时候调用。

### 6.1.3 init_row

该函数在增加一行物资的时候调用。

### 6.1.4 cell_change

该函数在单元格里面的内容被修改了的时候调用，利用 change_col 变量可知道被修改的是哪个项目。

### 6.1.5 obj_change

该函数在某些单据表头输入控件的内容被修改了的时候调用，利用 change_obj 变量可知道被修改的是哪个输入控件。

### 6.1.6 func_before_print

该函数在打印前调用，可以用 can_print 参数来决定本次打印是否允许。

相关参数：print_process_times 标识这是第几次打印。

### 6.1.7 func_after_print

该函数在打印后调用。

### 6.1.8 func_after_check

该函数在审核后调用。

### 6.1.9 adjust_row

该函数可以被单据操作菜单下的《运行脚本 adjust_row 函数》功能触发，针对每条记录调用一次。主要用于需要的时候进行批量修改数据。

## 6.2 例：如何限定打印只打印一次

在func_before_print()里面加以判断控制。

int func_before_print()

{

can_print=1;

if(print_process_times>1)

can_print=0;

//show_v_para();

return 1;

};

## 6.3 例：现款采购里，现金记帐科目可不可以根据不同的操作员绑定相应的科目？

在create_voucher()里面加以判断控制。

int create_voucher()

{

string uid;

uid=get_user_id();

//msg(uid);

//gui_list_inp_all();

if(uid=='admin')

gui_set_val('ComboBox_Ext_Mio_Subject_Id','SS3');

else

if(uid=='user1')

gui_set_val('ComboBox_Ext_Mio_Subject_Id','SS2');

return 1;

};

# 7 一些例子

## 7.1 工资单的四舍五入

下面例子中的最后 num_dec_cut 函数对实际应发进行了四舍五入处理，保留一位小数。

应发合计 = 基本工资 + 绩效奖金 + 岗位津贴 + 其它补贴

个人所得税 = cal_tax(应发合计)

实际应发 = 应发合计 - 个人所得税

实际应发 = num_dec_cut(实际应发, 1);