1 脚本语言... 4

1.1 介绍说明... 4

1.2 应用场景... 4

2 语法介绍... 5

2.1 类型... 5

2.2 运算... 5

2.3 控制... 6

2.4 内置函数... 7

2.5 自定义函数... 7

2.6 注释... 7

3 内置函数... 8

3.1 显示提示函数... 8

3.2 输入控制函数... 8

3.3 参数访问函数... 9

3.4 界面控件操作函数... 10

3.5 表格控件操作函数... 12

3.5.1 常用模块中表格的名称... 14

3.5.2 例一：设置报表中第 2 行以及 res_id 列的颜色和背景色... 14

3.6 单据操作函数... 15

3.6.1 例一：激活用户自定义菜单 1. 15

3.7 菜单操作函数... 16

3.7.1 例一：主窗口中隐藏掉业务处理的菜单项目... 17

3.8 打印模板脚本函数... 17

3.9 数据库操作函数... 18

3.9.1 例一：遍历显示 app_para里面的内容... 19

3.9.2 例二：多个sql嵌套执行... 19

3.9.3 例三：报表打印的时候进行记录定位... 20

3.10 更多函数... 21

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

4.1 相关参数... 26

4.2 函数清单... 26

4.2.1 main. 26

4.2.2 func_gopage. 26

4.2.3 func_gorow. 26

4.2.4 func_gorow_blank. 26

4.2.5 before_draw_obj() 27

4.2.6 func_cal_row_height() 27

4.3 例子... 27

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

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

4.3.3 打印单据日期格式的转变... 28

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

4.3.5 利用 Auto_Adjust_Detail_Height 变量自动调整明细的行高度... 28

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

4.3.7 利用print_cal_obj_height调整明细的行高度... 29

4.3.8 物资单据打印如何打印产品图片... 29

4.3.9 物资单据中如何打印客户所在城市... 29

4.3.10 工资单据打印的时候如何打印公司名称... 30

4.4 其它参考... 30

5 导航界面的定义... 31

5.1 相关函数... 31

5.2 例子程序... 32

6 应用函数... 33

6.1 公共函数... 33

6.2 人力资源系统... 33

6.3 进销存系统... 34

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

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

6.4 统计报表... 35

7 物资单据的事件... 37

7.1 函数清单... 37

7.1.1 create_voucher 37

7.1.2 func_show. 37

7.1.3 init_row. 37

7.1.4 cell_change. 37

7.1.5 obj_change. 37

7.1.6 func_before_print 37

7.1.7 func_after_print 37

7.1.8 int func_before_save() 37

7.1.9 func_after_check. 38

7.1.10 adjust_row. 38

7.2 例：如何设定物资默认数量... 38

7.3 例：如何限定打印只打印一次... 38

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

7.5 例：入库单中，要求必须输入批次编号，否则不允许保存... 39

7.6 例：用脚本控制单价列不允许修改... 40

7.7 例：如何控制明细折扣 不允许小于 85%.. 40

8 报表中脚本... 41

8.1 例子... 41

9 数据脚本... 42

9.1 func_def_lmt 函数... 42

9.2 func_def_imp 暂时不用... 42

9.3 func_query.. 42

10 一些使用脚本的例子... 43

10.1 工资单的四舍五入... 43

10.2 自定义员工工号... 43

10.3 主窗口启动的时候能不能窗口化,不要最大化的... 43

10.4 宿舍管理显示人员的电话和手机号码... 44

10.5 如何把客户的价格体系名称打印在现款销售单上... 45

10.6 如何把业务员的电话号码打印在销售单上... 45

10.7 如何自己定义年休标准规则... 46

10.8 输入进价后，系统自动形成参考售价... 46

10.9 出库单怎么设置成单据审核后才能打印... 47

10.10 自定义保险标准的计算方法... 47

10.11 用脚本修改报表中检索条件的文本... 48

10.12 工分录入编辑中取工号和部门... 48

10.13 如何在销售按单据报表中体现 净利润 = 毛利润-（费用一 + 费用二）... 49

# 1 脚本语言

## 1.1 介绍说明

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

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

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

## 1.2 应用场景

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

打印模板的控制

单据的控制（进销存）

界面的调整

权限的特殊控制

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

# 2 语法介绍

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

## 2.1 类型

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

num 类型是高精度的数值类型。

## 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 取消
log_all_para |  |  | 显示所有的变量 |  |

## 3.2 常用基本函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
run_line | S | S | 执行一个语句 | 要执行的语句 | 执行的结果
|  |  | int main() { string l,s; int i; l = '"abc"+"def"'; s=run_line(l); msg(s); l = '1+2*3'; i=run_line(l); msg(i); return 1; }; 上面的代码会输出 abcdef 和 7
dt_get_name | SS | S | 获取字典对应字典意义 | 字典标识,字典取值编码 | 字典意义
dt_get_code | SS | S | 获取字典意义对应的字典编码 | 字典标识,字典意义 | 字典编码
dt_get_ext | SSS | S | 获取字典对应扩展信息 | 字典标识,字典取值编码，要返回的扩展列 | 扩展信息
fen_to_yuan | S | S | 字符表达的分转换为元 | 字符表达的分 | 字符表达的元
one_cap | SI | S | 取得金额其中一位的大写 | 大写数值 | 大写表达
one_digit | SI | S | 取得金额其中一位的小写 | 字符表达的元，位数 | 小写表达
| 例子： one_digit("123.45",1,s) 返回 5 one_digit("123.45",3,s) 返回 3 one_digit("123.45",5,s) 返回 1 one_digit("123.45",6,s) 返回
one_digit_ext | SIS | S | 取得金额其中一位的小写，如是最左边前面 1 位返回货币标识 | 字符表达的元，位数，货币标识 | 小写表达
| 例子： one_digit_ext("123.45",1,s,"$") 返回 5 one_digit_ext("123.45",3,s,"$") 返回 3 one_digit_ext("123.45",5,s,"$") 返回 1 one_digit_ext("123.45",6,s,"$") 返回 $
money_cap | S | S | 取得金额的大写 | 金额 | 大写表达
num_dec_cut | SI | S | 数字四舍五入 | 串,小数位数 | 结果字符串
num_2_grp | S | S | 转换数值用分组方式表达 123456.78 => 123，456.78 | 要转换的数值 | 转换后数值
num_to_cap | S | S | 转换数值为大写 123=> 壹百贰拾叁 | 要转换的数值 | 大写表达
fmt_date | SS | S | 格式化日期 | 标准日期 yyyymmddhhmiss,格式化串 | 格式化后的串
fmt_time | SS | S | 格式化时刻 | 标准时刻 hhmiss,格式化串 | 格式化后的串
get_cur_date |  | S | 取当天日期 | 无 | 日期 yyyy-mm-dd
get_cur_date_std |  | S | 取当天日期标准格式 |  | yyyymmdd
get_cur_fmt_date | S | S | 取格式化的当天日期 | 格式化串 | 格式化后的当天日期
get_cur_time |  | S | 取当前时刻 | 无 | 时刻 hh:mi:ss
get_cur_time_std |  | S | 取当前时刻标准格式 |  | 时刻 hhmiss
get_cur_fmt_time | S | S | 取格式化的当前时刻 | 格式化串 | 格式化后的当前时刻
get_cur_month |  | S | 取当天月 | 无 | 月 yyyymm
get_cur_year |  | 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
get_week_id_num | SSI | I | 获取日期范围内某周几的出现次数 | 开始日期，结束日期，要检测的周几 1-7 | 出现次数
例子： num6 = get_week_id_num('20120701','20120728',6); //返回 4
is_date_valid | S | I | 盘点一个日期是否合法 | 标准日期 yyyymmdd | 合法 1,非法 0
std_inp_date | S | S | 从一个输入的串中取出日期 | 输入串 | 标准日期 yyyymmdd
std_inp_time | S | S | 从一个输入的串中取出时刻 | 输入串 | 标准时刻 hhmiss
date_add | SI | S | 根据开始日期和相差天数计算结果日期 | 开始日期，相差天数 | 结果日期
month_add | SI | S | 根据开始月份和相差月数计算结果月份 | 开始月份，相差月数 | 结果月份
date_nl | S | S | 根据公历日期获得农历日期 | 公历日期 yyyymmdd | 农历日期 yyyymmdd
date_gl | S | S | 根据农历日期获得公历日期 | 农历日期 yyyymmdd | 公历日期 yyyymmdd
nl |  | S | 获得回车字符串 例子： string res; res = "AAA"; res = res + nl(); res = res + "abc"; |  | 回车字符串
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_pos | SS | I | 返回串 2 在串 1 中的位置 | 串 1，串 2 | 位置,开始位置为 0，未找到返回-1
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 | 结果
str_to_num_str | S | S | 去掉字符串中不是数值的字符，比如逗号 | 串 | 结果字符串
system | S | I | 执行外部程序 | 外部程序 |
shell | S | I | 执行外部程序 | 外部程序 |
call_dll_func | SS | I | 调用 dll 里面的函数 | Dll 名，函数标识 |
call_func | 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 | 检查是否有函数执行错误信息 | 如果有会弹出信息 |
str_trim_right | S | S | 去掉字符串右边空格 | 串 | 结果字符串
str_trim_left | S | S | 去掉字符串左边空格 | 串 | 结果字符串
str_trim | S | S | 去掉字符串 2 边空格 | 串 | 结果字符串

## 3.3 界面控件操作函数

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

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
gui_list_inp_all |  |  | 显示当前窗口所有输入控件 |  |
gui_list_inp | S |  | 显示指定名称控件包含的输入控件内容 | 控件的名称 |
gui_list_all |  |  | 显示当前窗口所有控件 |  |
gui_list | S |  | 显示指定名称控件包含的控件内容 | 控件的名称 |
gui_hide | S |  | 隐藏一个控件 | 控件的名称 |
gui_show | S |  | 显示一个控件 | 控件的名称 |
gui_focus | S |  | 光标定位到指定的控件 | 控件的名称 |
gui_disable | S |  | 使得一个控件不可操作 | 控件的名称 |
gui_enable | S |  | 使得一个控件允许操作 | 控件的名称 |
gui_disable_edit | S |  | 使得一个控件不可编辑 | 控件的名称（限于文本输入框、多行输入框） |
gui_enable_edit | S |  | 使得一个控件允许编辑 | 控件的名称（限于文本输入框、多行输入框） |
gui_set_val | SS |  | 设置指定控件的内容 | 控件的名称，要设置的值 |
gui_get_val | S |  | 获取指定控件的内容 | 控件的名称 | 指定控件的内容
gui_set_text | SS |  | 设置指定控件的标签 | 控件的名称，要设置的标签 |
gui_get_text | S |  | 获取指定控件的标签 | 控件的名称 | 指定控件的标签
gui_set_text、gui_get_text 和 gui_set_val、gui_get_val 的区别在于 text 相关的函数访问的是显示的标签，val 相关的是值，对于编辑框控件这 2 组是一致的，但对于 CheckBox 这样的就有区别，CheckBox 的 val 为 0 或者 1，text 则表示上面显示的内容
gui_set_x | SI |  | 设置控件的横坐标 | 控件的名称,x |
gui_set_y | SI |  | 设置控件的纵坐标 | 控件的名称,y |
gui_set_w | SI |  | 设置控件的宽度 | 控件的名称,宽度 |
gui_set_h | SI |  | 设置控件的高度 | 控件的名称,高度 |
gui_set_font_size | SI |  | 设置控件的字体大小 | 控件的名称,字体大小(一般标准为 9) |
gui_set_font_name | SS |  | 设置控件的字体名称 | 控件的名称, 字体名称 |
gui_set_font_color | SI |  | 设置控件的字体颜色 | 控件的名称,字体颜色 |
| 例子：单据里设置新建按钮字体颜色 gui_set_font_color('SpeedButton_Create',0x0000ff);
gui_set_bg_color | SI |  | 设置控件的背景颜色 | 控件的名称,背景颜色 |
| 例子：单据里设置功能条背景颜色 gui_set_bg_color('Panel_Func',0xff0000);
gui_get_x | S | I | 获取控件的横坐标 | 控件的名称 | x
gui_get_y | S | I | 获取控件的纵坐标 | 控件的名称 | y
gui_get_w | S | I | 获取控件的宽度 | 控件的名称 | 宽度
gui_get_h | S | I | 获取控件的高度 | 控件的名称 | 高度
gui_set_parent | SS | I | 改变控件的上级区域 | 控件的名称，目标控件的名称 Exam: gui_set_parent('Label15','Panel5'); |
gui_trigger_change | S | I | 触发一个控件内容改变了的处理事件 | 控件的名称 Exam: gui_trigger_change (‘Edit_Name’) |
attr_enter |  | I | 进入属性管理域 | 这 2 个函数比较特别。主要用于支持访问一些特殊的区域，比如报表的条件、单据的自定义扩展属性等，需要访问这部分区域的控件前，应先调用 attr_enter，把控制区指向属性区，访问完之后再调用 attr_leave，把控制区设回主窗口
attr_leave |  | 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 表格控件操作函数

表格在很多地方出现，如单据的明细、报表数据、管理界面中的列表等，下面这组函数用于操作表格。可以增加列、获取单元格的数据、设置单元格的数据、调整单元格的位置和宽度。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
下面这组函数用于操作表格
grid_hide_col | SS |  | 隐藏列 | 表格的名称,列名 |
grid_set_col_width | SSI |  | 设置列宽 | 表格的名称,列名，宽度 |
grid_get_col_width | SS |  | 获取列宽 | 表格的名称,列名 |
grid_set_row_height | SII |  | 设置行高 | 表格的名称,行号，高度 |
grid_get_row_height | SI |  | 获取行高 | 表格的名称,行号 |
grid_set_col_pos | SSI |  | 设置列位置 | 表格的名称,列名，位置 |
grid_get_col_pos | SS |  | 获取列位置 | 表格的名称,列名 | 列位置（-1 表示无法获得）
grid_add_row_num | SI | I | 增加行 | 表格的名称,要增加的行数 |
grid_del_row | SI | I | 删除行 | 表格的名称,要删除的行 |
grid_clear_row | SI | I | 清空行 | 表格的名称,要清除内容的行 |
grid_add_col_str | SSS |  | 增加字符型列 | 表格的名称,列名，标题 |
grid_add_col_num | SSS |  | 增加数值型列 | 表格的名称,列名，标题，是否字符 |
grid_add_col | SSSI |  | 增加列 | 表格的名称,列名，标题，是否字符 |
grid_row_num | S | I | 获取记录数 | 表格的名称 | 行记录数
grid_col_num | S | I | 获取列数 | 表格的名称 | 列记录数
grid_cur_row | S | I | 获取当前行号 | 表格的名称 | 行记录号
grid_cur_col | SI | I | 设置当前列号 | 表格的名称，列号 | 当前列
grid_set_cur_row | SI | I | 设置当前行号 | 表格的名称，行号 | 当前行
grid_ set_cur_col | S | I | 获取当前列号 | 表格的名称 | 列记录号
grid_set_v | SSIS | I | 设置单元内容 | 表格的名称，列名，行，内容 |
grid_get_v | SSI | S | 获取单元内容 | 表格的名称，列名，行 | 内容
grid_mark_sum | SS | I | 标记一个列显示合计数 | 表格的名称，列名 |
grid_unmark_sum | SS | I | 设置一个列不显示合计数 | 表格的名称，列名 |
grid_get_col_sum | SS | S | 获得一列的合计值 | 表格的名称，列名 | 合计
grid_mark_readonly | SS | I | 标记一个列只能读 | 表格的名称，列名 |
grid_unmark_readonly | SS | I | 设置一个列可以写 | 表格的名称，列名 |
grid_set_col_align_left | SS | I | 设置一个列左对齐 | 表格的名称，列名 |
| 例：grid_set_col_align_left('MG_Item','res_id');
grid_set_col_align_right | SS | I | 设置一个列右对齐 | 表格的名称，列名 |
| 例：grid_set_col_align_right('MG_Item','res_id');
grid_set_col_align_middle | SS | I | 设置一个列中对齐 | 表格的名称，列名 |
| 例：grid_set_col_align_middle('MG_Item','res_id');
grid_set_col_picklist | SSS | I | 设置一个列输入为下拉选择模式 | 表格的名称，列名，下拉项目（用逗号分开） |
| 例：grid_set_col_picklist('MG_Item','note_info','2a,33b,c,d,e,,');
grid_set_col_picklist_dict | SSS | I | 设置一个列输入为下拉选择模式 | 表格的名称，列名，下拉项目使用的数据字典标识 |
| 例：grid_set_col_picklist_dict('MG_Item','note_info','bool');
grid_set_row_color | SII | I | 设置行颜色 | 表格的名称、行号、颜色 |
grid_set_col_color | SSI | I | 设置列颜色 | 表格的名称、列名、颜色 |
grid_set_cell_color | SSII | I | 设置单元格颜色 | 表格的名称、列名、行号、颜色 |
grid_set_row_bgcolor | SII | I | 设置行背景颜色 | 表格的名称、行号、背景颜色 |
grid_set_col_bgcolor | SSI | I | 设置列背景颜色 | 表格的名称、列名、背景颜色 |
grid_set_cell_bgcolor | SSII | I | 设置单元格背景颜色 | 表格的名称、列名、行号、背景颜色 |

### 3.4.1 常用模块中表格的名称

单据中明细表格： MG_Item

报表中数据表格： MG

管理界面（左边是索引树，右边是列表）：MG

### 3.4.2 例一：设置报表中第 2 行以及 res_id 列的颜色和背景色

int load_over()

{

grid_set_row_color('MG',2,0xff0000);

grid_set_row_bgcolor('MG',2,0x00ff00);

grid_set_col_color('MG','res_id',0xff0000);

grid_set_col_bgcolor('MG','res_id',0x0000ff);

return 1;

};

## 3.5 输入控制函数

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

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

例子：

inp_clear();

inp_def_dict('msex','性别', 'sex');

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

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

inp_para();

num inp_num;

inp_num=inp_get_val('mnum')

## 3.6 参数访问函数

这部分函数可以用来访问参数。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
下面这组函数是局部的，只能访问本次脚本调用涉及的参数，调用 para_set 设置的参数在下次执行的时候是无效的。
para_set | SS | I | 设置参数值 | 变量名称，值 |
para_get | S | S | 获取参数值 | 变量名称 | 值
para_defined | S | I | 判断参数是否定义了 | 要显示的内容 | 1 定义了 0 没有
下面这组函数是全局的，用于支持设置访问自定义的参数。调用 user_para_set 设置的参数在下次执行的时候用 user_para_get 访问。
user_para_set | SS | I | 设置参数值 | 变量名称，值 |
user_para_get | S | S | 获取参数值 | 变量名称 | 值
user_para_defined | S | I | 判断参数是否定义了 | 要显示的内容 | 1 定义了 0 没有
下面这组函数是全局的，用于支持设置访问公共的参数。比如企业名称等
pub_para_get | S | S | 获取参数值 | 变量名称 | 值
pub_para_defined | S | I | 判断参数是否定义了 | 要显示的内容 | 1 定义了 0 没有

## 3.7 单据操作函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
v_mark_sum | S |  | 标记一个列显示合计数（这个函数主要用于支持单据扩展的列显示合计） | 列标识 |
v_mark_col_readonly | SI |  | 标记一个列是否只读 | 列标识，只读标志（只读为 1，否则为 0） |
v_set_print_format_id | S |  | 指定打印采用的打印模版编号 | 打印模版编号 |
vr_add_res 仅用于进销存商贸物资单据 | SS |  | 增加物资 这个函数仅在物资单据中有效 | 产品编号，数量 |
vr_set_price_group 仅用于进销存商贸物资单据 | S |  | 设置当前的价格体系 | 价格体系编号 |
vr_init_main_res_ui_pos 仅用于进销存商贸物资单据 |  |  | 重新计算排列主物资控件的位置，这个函数主要用于脚本控制隐藏主物资的控件后重新调整位置 |  |
例子： int create_voucher() { gui_hide('ScrollBox_Main_Res_Ref_Voucher_No'); gui_hide('ScrollBox_Main_Res_Unit_Type'); vr_init_main_res_ui_pos(); return 1; };
attr_get_val | S | S | 获取单据扩展属性的值 | 属性标识 | 属性值
attr_set_val | SS | I | 设置单据扩展属性的值 | 属性标识，属性值 |
系统提供了 4 个菜单，供脚本扩展功能。默认是不显示的，可以通过 v_show_user_menu 进行激活，此时可以通过点击单据名称或者按 ctrl+1 组合键进行弹出，点击后调用相应的脚本功能函数 func_user_menu_1 …. func_user_menu_4 这 4 个菜单只有在单据编辑状态下才可以使用
v_show_user_menu | IS |  | 显示指定的菜单项 | 编号 1-4，标题 |
v_hide_user_menu | I |  | 隐藏指定的菜单项 | 编号 1-4 |

### 3.7.1 例一：激活用户自定义菜单 1

int func_user_menu_1()

{

msg('menu 1 clicked');

return 1;

};

int func_user_menu_2()

{

msg('menu 2 clicked');

return 1;

};

int create_voucher()

{

v_show_user_menu(1,'this is menu 1');

v_show_user_menu(2,'this is menu 2');

return 1;

};

## 3.8 菜单操作函数

菜单操作函数主要在主界面根据需要调整菜单。

在调用函数进行菜单项目操作前，先要调用menu_use设定需要操作的菜单名字，如果不调用该函数，则默认为当前窗口的主菜单。窗口中能操作的菜单名可以用menu_list显示出来。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
下面这组函数用于操作菜单
menu_list_item |  |  | 列出所有菜单项目 |  |
menu_hide_item | S |  | 隐藏一个项目 | 菜单项目名 |
menu_show_item | S |  | 显示一个项目 | 菜单项目名 |
menu_enable_item | S |  | 使一个项目不可以点击 | 菜单项目名 |
menu_disable_item | S |  | 使一个项目允许点击 | 菜单项目名 |
menu_set_text | SS |  | 设置一个菜单的文本 | 菜单项目名，要显示的文本 |
menu_move_item | SSI |  | 转移一个菜单项目 | 要移动的项目名，目标项目名，目标位置 |
menu_add_exe | SISSS |  | 增加一个菜单，点击后执行一个程序 | 父菜单名字(root 表示主菜单)，在父菜单位置，菜单名字，菜单中文，执行程序 |
menu_add_dll | SISSSS |  | 增加一个菜单，点击后执行一个动态库里的函数 | 父菜单名字(root 表示主菜单)，在父菜单位置，菜单名字，菜单中文，动态库，函数 |
menu_add_func | SISSS |  | 增加一个菜单，点击后执行一个系统函数 | 父菜单名字(root 表示主菜单)，在父菜单位置，菜单名字，菜单中文，系统函数 |
menu_add_csp | SISSS |  | 增加一个菜单，点击后执行一个脚本的 main 函数 | 父菜单名字(root 表示主菜单)，在父菜单位置，菜单名字，菜单中文，脚本标识 |
例子：在主窗口脚本里定义以下脚本，用于在系统功能菜单下增加一个菜单项，点击后执行 a_csp 的脚本里的 main 函数 int main() { //menu_list_item(); menu_add_csp('N_Top_System',0,'item_run_a_csp','执行一个脚本 a_csp','a_csp'); return 1; }; 另外编写脚本 a_csp 如下（配置管理=>脚本工具，输入以下内容后另存为 a_csp）： int main() { msg('hello,world,a_csp'); return 1; };
menu_add_file | SISSS |  | 增加一个菜单，点击后打开一个文件 | 父菜单名字(root 表示主菜单)，在父菜单位置，菜单名字，菜单中文，关联文件 |
menu_set_hot_key | SSII |  | 设置菜单热键 | 菜单名称，字母，是否需要 ctrl，是否需要 alt |
例子： menu_set_hot_key('tbx_Tbx_Gui_Plan_Adm','T',1,0); //ctrl+T menu_set_hot_key('tbx_Tbx_Gui_Plan_Adm','T',0,1); //alt+T menu_set_hot_key('tbx_Tbx_Gui_Plan_Adm','F5',0,1); //alt+F5 menu_set_hot_key('tbx_Tbx_Gui_Plan_Adm','F9',0,0); //F9
menu_trigger_click | S | I | 触发执行一个菜单的功能 | 菜单名称 |
例子： menu_trigger_click ('tbx_Tbx_Gui_Plan_Adm');
menu_use | S |  | 指定要操作的菜单 | 菜单名字 |
menu_list |  |  | 显示所有的菜单名字 |  |

### 3.8.1 例一：主窗口中隐藏掉业务处理的菜单项目

系统功能的主窗口脚本里面设置下面的代码，点执行即可（下次登录系统会自动执行）：

int main()

{

//menu_list();

//menu_list_item();

menu_hide_item('inv_buss');

return 1;

};

## 3.9 打印模板脚本函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
print_get_cp_sum | S |  | 获取指定字段当前打印页的合计（本函数只能在打印脚本里使用） | 列标识 | 合计
print_get_sum | S |  | 获取指定字段所有记录的合计（本函数只能在打印脚本里使用） | 产品编号，数量 | 合计
get_pub_pict | S |  | 获取公共图片 | 图片标示 |
select_printer | S |  | 设置默认的打印机 | 打印机名称 |
print_cal_obj_height | S | I | 计算完整打印某单元格需要的高度（宽度按照模版设计） | 对象标识 | 高度

## 3.10 数据库操作函数

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

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
db_run | S | I | 执行一个 sql 语句 | 要执行的语句 | 无
db_go_head |  | I | 指向第一条记录 | 无 | 无
db_next |  | I | 指向下一条记录 | 无 | 无
db_go_row | I | I | 指向某一条记录 | 记录偏移（第一条为 0） | 有错 0,无错 1
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_seek | SS… | I | 根据指定字段和字段的值查找记录 | 是否找到 | 找到了返回 1 未找到返回 0
db_show | S | I | 在界面上显示数据 | 窗口标题 |
db_select_area | I | I | 选择一个工作区 | 工作区 0-5 | 无
db_select_dbio | S | I | 根据名称选择数据内容 | 数据集合的名称 |

### 3.10.1 例一：遍历显示 app_para 里面的内容

int main()

{

//msg('hello,world');

int n,id;

string v1,v2;

db_run('select para_id,para_value from app_para');

n = db_row_count();

//msg(n);

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

{

v1=db_res(0);

v2=db_res(1);

dbg('row '+ id + ' :' + v1+ ' , '+v2);

db_next();

};

return 1;

};

### 3.10.2 例二：多个 sql 嵌套执行

int test()

{

return 1;

};

int main()

{

//msg('hello,world');

int n,id,n2;

string v1,v2;

db_select_area(0);

db_run('select para_id,para_value from app_para');

n = db_row_count();

//msg(n);

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

{

db_select_area(0);

v1=db_res(0);

v2=db_res(1);

dbg('row '+ id + ' :' + v1+ ' , '+v2);

db_select_area(1);

db_run("select note_info from app_para where para_id='" + v1 + "'");

n2 = db_row_count();

if(n2>0)

{

dbg('note_info is ' + db_res(0));

};

db_select_area(0);

db_next();

};

return 1;

};

### 3.10.3 例三：报表打印的时候进行记录定位

判断是否包含了cpu_s产品

int main()

{

db_select_dbio("data");

if(db_seek("res_id","cpu_s"))

{

msg("cpu_s finded");

};

db_select_dbio("-");

return 1;

};

# 4 打印脚本的事件

## 4.1 相关参数

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

本页记录数 cp_row_num

总页数 page_count

当前页码 page_id

当前记录号 record_id

记录总数 record_count

打印份号 print_copy_id

head 区域高度 head_height

detail 区域高度 detail_height

summary 区域高度 summary_height

footer 区域高度 footer_height

title 区域高度 title_height

bottom 区域高度 bottom_height

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

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

## 4.2 函数清单

### 4.2.1 main

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

### 4.2.2 func_gopage

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

### 4.2.3 func_gorow

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

### 4.2.4 func_gorow_blank

这个函数在打印以下空白的时候用到，可以指定一个或多个字段内容为 以下空白，直接做一个赋值语句，如res_name='以下空白'，以下空白只有在固定行数打印的情况下才有效。

### 4.2.5 before_draw_obj()

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

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

### 4.2.6 func_cal_row_height()

该函数在计算明细行高的时候调用，可以用来自动调整行高。

## 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 打印单据日期格式的转变

单据日期格式的改变：

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

利用 v_voucher_date_std 进行格式转化，对应的对象类型设置为计算型，表达式设置如下即可：

fmt_date(v_voucher_date_std,"yyyy 年 mm 月 dd 日")

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

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.5 利用 Auto_Adjust_Detail_Height 变量自动调整明细的行高度

//在打印脚本的 main 函数里给 Auto_Adjust_Detail_Height 赋值为 1 即可。

//这种方式也可以直接在报表的基本属性里面进行设置

int main()

{

Auto_Adjust_Detail_Height = 1;

return 1;

};

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

int func_cal_row_height()

{

if(strlen(d_res_name)>=16)

row_height_add=400;

return 1;

};

### 4.3.7 利用 print_cal_obj_height 调整明细的行高度

//下面例子中 detail_height 为模版明细区域的高度，d_vr_res_info 为要判断高度的对象标识

//该例子可以直接作用于往来报表=》客户对账明细报表的动态调整

int func_cal_row_height()

{

int h;

h = print_cal_obj_height('d_vr_res_info');

if(h > detail_height)

row_height_add=h - detail_height;

return 1;

};

### 4.3.8 物资单据打印如何打印产品图片

系统提供了根据产品编号提取产品图片的脚本函数。物资单据打印时明细包含了 res_id 参数（产品编号），我们可以用 get_res_pict 来获得照片。

具体做法：在物资单据的打印模板里添加一个图片对象，在照片文件指定为 get_res_pict(res_id) 即可。

### 4.3.9 物资单据中如何打印客户所在城市

系统在打印物资单据时没有输出客户所在城市信息给打印模块，因此无法直接引用。但可以利用客户编号去获得客户所在城市信息（函数 get_eba_info），然后利用 dt_get_name 转换为中文。

脚本代码如下：

int main()

{

string city_id,city_name;

city_id=get_eba_info(v_eba_id,'city_id');

city_name = dt_get_name('addr_city',city_id);

v_eba_city=city_name;

return 1;

};

### 4.3.10 工资单据打印的时候如何打印公司名称

默认的工资单打印的时候明细里没有公司编号和名称，可以利用部门编号取出公司编号，再进一步获得公司名称。

先定义一个 gz_row_corp 的字段，然后在 func_gorow 函数中进行赋值。

int func_gorow()

{

string r_corp_id;

r_corp_id=dt_get_ext('dept',m_dept_id,'company_id');

gz_row_corp = dt_get_name('emp_company',r_corp_id);

return 1;

};

## 4.4 其它参考

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

# 5 导航界面的定义

## 5.1 相关函数

说明：

颜色可以用 0xaabbcc 这种方式表示，6 位 16 进制，和 RGB 的对照关系 0xBBGGRR。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
nag_clear_base |  | I | 通知系统开始导航自定义处理 |  |
nag_set_bg_color | I | I | 设置导航背景色 | 颜色值 |
nag_set_bg_img | S | I | 设置背景图 | 背景图文件名 |
nag_group_add | IIS | I | 添加一个分组 | X 坐标，Y坐标，组名字 |
nag_group_del | S | I | 删除一个分组 | 组名字 |
nag_group_set_img_file | SS | I | 设置分组的图标文件 | 组名字，图形文件名 |
nag_ico_add | SIISS | I | 添加一个图标功能 | 组名字，X坐标，Y坐标，功能名称，函数标识 |
nag_ico_del | SS | I | 删除一个图标功能 | 组名字，功能名称 |
nag_ico_set_img_file | SSS | I | 设置图标功能相关的图形文件 | 组名字，功能名称，图形文件名 |
nag_label_add | SIISS | I | 添加一个标签功能 | 组名字，X坐标，Y坐标，功能名称，函数标识 |
nag_label_del | SS | I | 删除一个标签功能 | 组名字，功能名称 |
nag_line | SIIIIIIII | I | 画线 | 组名称， x1,y1,x2,x2, 颜色，宽度，画线方式，是否画箭头(0不画，1画箭头指向目标，2双向画) | 画线方式：1：直线 2：弧线 3：直角连接 4：直接连接弯头光滑处理

系统支持的函数清单可以用下面的 sql 语句进行查询获得：

select * from mup_sys_func

## 5.2 例子程序

int main()

{

gui_set_w("this",700);

gui_set_h("this",450);

nag_clear_base();

nag_set_bg_color(0xd1f2f3);

nag_group_add(100,60,'日常事务');

nag_ico_add('日常事务',400,100,'工作日志','Tbx_Gui_Notebook_Adm');

nag_ico_set_img_file('日常事务','工作日志','3.jpg');

nag_line('日常事务',200,200,300,300,0xa0f200,3,4,2);

nag_group_add(20,100,'更多功能');

nag_group_set_img_file('更多功能','2.ico');

nag_line('更多功能',110,200,300,100,0xa0f200,3,4,2);

return 1;

};

# 6 应用函数

## 6.1 公共函数

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
get_user_id |  | S | 获取登陆的操作员编号 |  | 操作员编号
get_user_name |  | S | 获取登陆的操作员姓名 |  | 操作员姓名
get_user_emp_id |  | S | 获取登陆的操作员对应的员工工号 |  | 操作员工编号
is_user_in_group | S | I | 判断登录的操作员是否在指定组里 | 组名字 | 0 不在 1 在
get_voucher_file | IS | S | 获取单据的文件 本函数可供在打印模版里调用意打印单据中的图片。单据模版中单据流水标识为 v_voucher_id | 单据流水，文件类型 | 文件名
check_a_user_pwd | SS | I | 验证用户名和密码是否正确 | 用户名，密码 | 1 正确 0 失败

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

string uid;

uid=get_user_id();

dbg(uid);

int v;

v = is_user_in_group(‘A 分组’)

## 6.2 人力资源系统

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
get_emp_pict | S | S | 获取员工对应的图片文件 | 员工编号 | 图片文件名
get_emp_info | SS | S | 获得员工指定信息 | 员工编号，列名 哪些列名可以通过在sql工具里面执行下面的语句看到： select * from emp where 1=2 | 列信息
get_emp_desc | SS | S | 获得员工指定描述信息 | 员工编号，描述信息类型 | 描述信息
get_emp_dept_id | S | S | 获得员工所在部门编号 | 员工编号 | 部门编号
get_emp_company_id | S | S | 获得员工所在公司编号 | 员工编号 | 公司编号
gen_emp_id | SI | S | 生成一个新的员工编号 | 前缀，后续编号长度 | 新的员工编号
例子： string eid; eid = gen_emp_id(‘201112’,3);
wage_get_degree_va | SS | N | 这个函数获取指定级别的某工资科目的值(该值在级别工资里预先定义好) | 级别，工资科目 | 以元为单位的值

## 6.3 进销存系统

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
get_res_pict | S | S | 获取产品对应的图片文件 | 产品编号 | 图片文件名
get_res_info | SS | S | 获得产品指定信息 | 产品编号，列名 哪些列名可以通过在sql工具里面执行下面的语句看到： select * from res where 1=2 | 列信息
get_res_desc | SS | S | 获得产品指定描述信息 | 产品编号，描述信息类型 | 描述信息
get_res_factor_num | SS | S | 获得产品折算数量 | 产品编号，标准数量 | 折算数量
get_res_num | SS | S | 获得产品当前存量 | 产品编号，仓库编号（设为*获取所有存量） | 数量
get_eba_info | SS | S | 获得客户指定信息 | 客户编号，列名 哪些列名可以通过在sql工具里面执行下面的语句看到： select * from eba where 1=2 | 列信息
get_eba_mem_card_info | SS | S | 获得会员卡指定信息 | 会员卡编号，列名 哪些列名可以通过在sql工具里面执行下面的语句看到： select * from eba_mem_card where 1=2 | 列信息
get_sup_info | SS | S | 获得供应商指定信息 | 供应商编号，列名 哪些列名可以通过在sql工具里面执行下面的语句看到： select * from sup where 1=2 | 列信息
get_eba_attr | SS | S | 获得客户自定义属性信息 | 客户编号，自定义属性名 | 自定义属性信息
get_sup_attr | SS | S | 获得供应商自定义属性信息 | 供应商编号，自定义属性名 | 自定义属性信息
get_eba_group_price | SS | S | 获取指定价格体系的价格 | 产品编号，价格体系编号 | 价格
have_eba_group_price | SS | I | 判断是否在某价格体系中定义了 | 产品编号，价格体系编号 | 1：定义了 0：未定义
get_res_eba_map_code | SS | S | 获取系统中指定产品在某企业内的编码 | 产品编号，企业编码 | 指定产品在某企业内的编码

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

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

m_res_ext_1 = get_res_info(m_res_id,'ext_1')

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

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

res_ext_1 = get_res_info(res_id,'ext_1')

## 6.4 统计报表

下面这部分函数只应用于统计报表的 rep_change 函数里面，用于干预设定选择报表变化了的时候提取报表的数据条件。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
rep_para_set | SS | I | 设置参数值 | 变量名称，值 |
rep_para_get | S | S | 获取参数值 | 变量名称 | 值
rep_para_defined | S | I | 判断参数是否定义了 | 要显示的内容 | 1 确定 0 取消
rep_para_list |  | I | 显示报表参数 |  |

# 7 物资单据的事件

调用函数前传入的参数： change_col_id 明细当前的列记录号

change_row_id 明细当前的行记录号

## 7.1 函数清单

### 7.1.1 create_voucher

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

### 7.1.2 func_show

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

### 7.1.3 init_row

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

### 7.1.4 cell_change

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

### 7.1.5 obj_change

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

### 7.1.6 func_before_print

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

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

### 7.1.7 func_after_print

该函数在打印后调用。

### 7.1.8 int func_before_save()

该函数在保存前调用。

### 7.1.9 func_after_check

该函数在审核后调用。

### 7.1.10 adjust_row

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

## 7.2 例：如何设定物资默认数量

采购单据中的数量,能不能设置默认值为1？

单据脚本的init_row函数里面加一句 inp_num=1; 如下：

int init_row()

{

inp_num=1;

return 1;

};

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

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

int func_before_print()

{

can_print=1;

if(print_process_times>1)

can_print=0;

//show_v_para();

return 1;

};

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

在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.5 例：入库单中，要求必须输入批次编号，否则不允许保存

int func_before_save()

{

int id,r_num;

string r_res_id,r_batch_no;

//can_save=1;

r_num = grid_row_num('MG_Item');

//msg(r_num);

for(id=1;id<r_num;id++)

{

r_res_id=grid_get_v('MG_Item','res_id',id);

r_batch_no=grid_get_v('MG_Item','batch_no',id);

//msg(r_res_id);

if(r_res_id=='') break;

if(r_batch_no=='' || r_batch_no=='-')

{

can_save=0;

warn('行'+ id + '批号不能为空');

warn(r_res_id);

return 0;

};

};

return 1;

};

## 7.6 例：组装单中，如何在保存前自动设置主物资批次日期为第一条明细记录的批次日期？

在 func_before_save ()里面加以处理。

int func_before_save()

{

string item_date,s_date;

item_date = grid_get_v('MG_Item','produce_date',1); //取出第一条明细的日期

s_date = std_inp_date(item_date); //格式化处理

gui_set_val('MDate_Main_Res_Produce_Date',s_date); //设置到主物资批次日期控件

return 1;

};

## 7.7 例：用脚本控制单价列不允许修改

int create_voucher()
{
grid_mark_readonly('MG_Item','inp_price');
return 1;
};

## 7.8 例：如何控制明细折扣 不允许小于 85%

int cell_change()

{

num v;

if(change_col=='discount')

{

v = discount;

if(v<85)

{

discount=85;

};

};

return 1;

};

## 7.9 例：销售发货单里显示客户资料里的备注

int obj_change()

{

string eba_id;

if(change_obj=='ComboBox_Ext_Eba_Id')

{

eba_id=gui_get_val(change_obj);

gui_set_val('Edit_Note',get_eba_info(eba_id,'note_info'));

};

return 1;

};

# 8 报表中脚本

报表中的功能菜单下有一个记录管理列表脚本定义的功能。

## 8.1 例子

问：我在采购订单扩展了合同编号，在报表里也定义了合同编号一栏，如何把数据显示出来。

假设合同编号属性编码统一定义为 hth。

在销售报表中定位到销售订单明细报表，然后在功能菜单下点记录管理列表脚本定义。点击初始化，修改 show_row_ext 函数如下，然后保存，再次点击提取报表即可。

int show_row_ext()

{

string s;

s='select attr_val from ebs_v_attr where voucher_id='+voucher_id+" and attr_id='hth'";

db_run(s);

if(db_row_count()>0)

hth=db_res(0);

return 1;

};

# 9 数据脚本

数据脚本用来使用脚本查询数据并展示。

## 9.1 func_def_lmt 函数

用于定义检索条件

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
def_lmt_dict | SSS | I | 定义字典型提取条件 | 参数标识、名称、字典标识 |
def_lmt_str | SS | I | 定义字符型提取条件 | 参数标识、名称 |
def_lmt_date | SS | I | 定义日期型提取条件 | 参数标识、名称 |
def_lmt_month | SS | I | 定义月份型提取条件 | 参数标识、名称 |

## 9.2 func_def_imp 暂时不用

## 9.3 func_query

该函数在点击查询按钮的时候调用，用于执行脚本并显示结果。

函数名 | 参数格式 | 返回类型 | 函数功能 | 参数意义 | 返回值
lmt_checked | S | I | 判断一个参数是否选择了 | 参数标识 | 1 选择了 0 没选择
lmt_val | S | S | 获得参数值 | 参数标识 | 参数值

# 10 一些使用脚本的例子

## 10.1 工资单的四舍五入

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

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

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

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

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

## 10.2 自定义员工工号

问：工号的生成，可以自定义不？比如，现在是4位nnnn，我想定义成YYYY-nnn。

员工资料管理=》功能=》员工卡片编辑辅助脚本定义=》初始化

然后修改 func_create_rec 函数

int func_create_rec()

{

string eid,yid;

yid = get_cur_year();

yid = yid + '-';

eid = gen_emp_id(yid,3);

gui_set_val('Edit_Emp_Id',eid);

return 1;

};

## 10.3 主窗口启动的时候能不能窗口化,不要最大化的

系统功能=》主窗口脚本定义=》初始化

然后修改 main 函数如下：

注意 gui_set_w 系列函数中 ‘this’ 参数标识当前窗口

int main()

{

gui_set_w('this',1000);

gui_set_h('this',800);

gui_set_x('this',300);

gui_set_y('this',200);

return 1;

};

## 10.4 宿舍管理显示人员的电话和手机号码

St.-,De-,Hr：请教个问题，我想在宿舍管理里面显示人员的电话和手机号码，要如何弄？

打开 宿舍管理=》功能=》记录管理列表脚本定义，复制下面的脚本进去，点刷新就可以看到相关数据。

int load_ext()

{

grid_add_col_str('MG_Detail','phone_no','联系电话');

grid_set_col_width('MG_Detail','phone_no',140);

grid_set_col_pos('MG_Detail','phone_no',2);

grid_add_col_str('MG_Detail','mobile','移动电话');

grid_set_col_width('MG_Detail','mobile',140);

grid_set_col_pos('MG_Detail','mobile',3);

return 1;

};

int show_detail_row_ext()

{

string emp_id;

int id;

id=para_get('detail_row_id');

emp_id=grid_get_v('MG_Detail','emp_id',id);

if(emp_id=='') return 1;

db_run("select telephone,mobile from emp where emp_id='"+emp_id+"'");

if(db_row_count()>0)

{

grid_set_v('MG_Detail','phone_no',id,db_res(0));

grid_set_v('MG_Detail','mobile',id,db_res(1));

}

return 1;

};

## 10.5 如何把客户的价格体系名称打印在现款销售单上

小陈陈：我是想要把 价格体系 的数据打印出来 在现款销售 有可能吗？

打印脚本里面加上以下代码就可以（设置打印模板上体系名称字段标识为 d_price_group_name ）。

int main()

{

db_run("select b.name from eba a,eba_price_group b where a.eba_id='" + v_eba_id + "' and a.price_group_id=b.price_group_id");

if(db_row_count()>0)

d_price_group_name=db_res(0);

else

d_price_group_name="未指定";

return 1;

};

## 10.6 如何把业务员的电话号码打印在销售单上

杨清云：在商贸软件中的单据中，打印格式里我设置了一个字段，想要显示为业务员的电话号码，使用什么脚本查找绑定好这个员工的联系电话呢？

打印脚本里面加上以下代码就可以（设置打印模板上体系名称字段标识为 v_emp_ telephone ）。

int main()

{

db_select_area(1);

db_run("select telephone from app_emp where emp_id='" + v_emp_id + "'");

if(db_row_count()>0)

v_emp_telephone=db_res(0);

else

v_emp_telephone="";

db_select_area(0);

return 1;

};

## 10.7 如何自己定义年休标准规则

浮天风:企业年休标准比较特殊，有什么办法可以解决？

员工年休标准功能菜单下脚本定义里面定义，可以参考下面的脚本进行修改

int show_row_ext()

{

int i_curr_hire_age_month;

i_curr_hire_age_month=curr_hire_age_month;

if(i_curr_hire_age_month<12)

com_std_days=1;

else

if(i_curr_hire_age_month<24)

com_std_days=2;

else

com_std_days=3;

return 1;

};

## 10.8 输入进价后，系统自动形成参考售价

环球水泵：我想在产品资料里面，输入进价后，系统自动形成参考售价，比如成本价*系数

商品资料管理界面 功能菜单 最下面的编辑界面脚本里面定义以下代码，修改了参考进价后按一下 f9 会自动修改参考售价

int func_f9_call()

{

num ival,sval;

ival = gui_get_val('Edit_In_Ref_Price');

//msg(ival);

sval = ival * 1.2;

//msg(sval);

gui_set_val('Edit_Out_Ref_Price',sval);

//gui_list_inp_all();

return 1;

};

## 10.9 出库单怎么设置成单据审核后才能打印

悟道(neil)：怎么设置成单据审核后才能打印啊？

出库单据的操作菜单下=》参数及配置=》脚本定义=》初始化，修改func_before_print函数保存后就可以了。

int func_before_print()

{

//can_print=1;

if(v_state=='A')

can_print=0;

return 1;

};

## 10.10 自定义保险标准的计算方法

保险类型定义中可以设定自己定义的计算方法，用于在标准输入界面中自动计算。

int func_auto_cal()

{

num a,b,c,d;

a = gui_get_val('Edit_Wage_Base_Amount');

if(a<1300)

b = 1300;

else

if(a>4500)

b = 4500;

else

b = a;

//msg(b);

gui_set_val('Edit_Base_Amount',b);

c = b * 0.2;

d = c*0.1;

gui_set_val('Edit_Company_Amount',c);

gui_set_val('Edit_Emp_Amount',d);

//msg(a);

return 1;

};

## 10.11 用脚本修改报表中检索条件的文本

例一：

int load_ext()

{

attr_enter();

//gui_list_all();

gui_set_text('chk_top_edt_id','sads');

attr_leave();

return 1;

};

例二：

有什么办法能改“明细扩展X”这标签名吗？

int load_ext()

{

attr_enter();

//gui_list_all();

gui_set_text('chk_vr_item_ext_1','扩展1改了');

gui_set_text('chk_vr_item_ext_2','扩展2改了');

attr_leave();

return 1;

};

int show_row_ext()

{

return 1;

};

int main()

{

return 1;

};

## 10.12 工分录入编辑中取工号和部门

麦兜儿：工分录入中想通过脚本做些判断，每个员工对应的部门可以获取到么 ？

int func_f9_call()

{

//gui_list_all();

string emp_id,dept_id;

emp_id = gui_get_val('ComboBox_Ext_Emp_Id');

msg(emp_id);

dept_id=dt_get_ext('emp',emp_id,'dept_id');

msg(dept_id)

return 1;

};

## 10.13 如何在销售按单据报表中体现 净利润 = 毛利润-（费用一 + 费用二）

1、利用报表功能菜单下列表扩展字段定义扩展一列 净利润（标识设置为 net_profit）

2、打开报表功能菜单下记录管理列表脚步定义，点初始化，在 show_row_ext 函数中加入一句：net_profit = profit - item_fee_1 - item_fee_2; 保存就可以了。

int show_row_ext()

{

net_profit = profit - item_fee_1 - item_fee_2;

return 1;

};