第一次给客户设置BOM多级展开后的相关数据关联,脚本有点粗糙,难免有不足之处,望各位大神可以帮忙指出纠正,多谢 我测试用的单据是启用的生产类自定义单据,单据类型【HH】要套用到其他单据,需要把单据脚本中【HH】修改为实际的单据类型 本次分享的完整单据脚本主要包含下列7类: 1. 【新增标签使用动态坐标和宽度,以适应不同显示分辨率和系统字体大小】 2. 【调用产品组成明细,关联成品,主件,子件3部分显示数据】 3. 【数量包含小数的,逢小数进1】 4. 【通过流水号获取主明细编号,提取子件物资对应主物资的产品组成的相关数值,例如定位码】 5. 【通过相关单据编号提取主物资的引用单据流水和明细流水,再根据这2个条件从提取主物资的编号,PO,数量赋值到单据的3个扩展属性和子件物资明细的相关列,避免BOM多级展开之后,鼠标会停留在新生成的下级主物资最后一行,这时必须把鼠标移动到主物资第一行后,在保存的时候才会把第一行的主物资相关数值赋值到主物资明细和子件物资明细的相关列进行关联,使用开头的操作之后,鼠标停留在主物资任意行保存单据的时候都是能准确的把第一行主物资相关数值赋值到主物资明细和子件物资明细的相关行,因为第一行主物资就是引用的上级单据的成品明细】 6. 【主物资作为子件物资时动态调用所在的上级主物资编号和需求量,思路:通过主物资编号作为组成产品编号提取产品组成的产品编号,再通过本单据流水号获取单据主物资明细的主物资编号和数量,然后在产品组成的产品编号和单据主物资编号相同的条件下,把提取到的本单据的主物资编号和数量赋值到主物资明细的自定义列5和4即可】 7. 【按照子件物资编号,主件物资编号,成品编号,订单PO,提取需求单已有制单数量的行并删除后执行单据删除,避免子件物资做重复的需求数,有时客户会先提供原材料和半成品的BOM清单,后面再提供包材BOM清单,所以这时需要先做原材料和半成品的材料需求表,后面再做包材的需求表,此时就需要把生成出来的所有材料需求中已制单的子件物资明细检测出来并删除】 【完整版【HH】单据类型【B3-DY材料需求表】脚本如下】 int init_test() { return 1; }; int 子件物资数量逢小数进一() { int grid_rc,i,count; string tempStr,resultStr,v_zs,v_ws,v_res_id,v_res_name; num v_inp_num,v_ddxql; grid_rc= grid_find('MG_Item','res_name',''); for(i=1;i<grid_rc;i++) { v_ddxql = grid_get_v('MG_Item','vr_item_ext_6',i) //获取明细自定义列6【子件需求量】 v_res_id = grid_get_v('MG_Item','res_id',i) //获取【子件物资编号】 v_res_name = grid_get_v('MG_Item','res_name',i) //获取【子件物资名称】 tempStr=str_replace(v_ddxql,".",","); //字符串替换,把小数点替换成【,】 str_lst_to_db(tempStr); //把整数和小数转为单列数据 count=db_row_count(); //获取列记录数 if(count == 1) //当只有单列整数时 { db_go_head(); v_inp_num = db_res(0); grid_set_v("MG_Item","inp_num",i,v_inp_num); //没有小数的行,数值不用凑整 }; if(count == 2) //当有2列数据时(整数列+小数列) { db_go_head(); v_inp_num = db_res(0); v_inp_num = v_inp_num+1 grid_set_v("MG_Item","inp_num",i,v_inp_num); //有小数的行用整数+1赋值 }; grid_set_v("MG_Item","vr_item_ext_6",i,v_inp_num); //inp_num小数凑整执行完成后更新明细自定义6【子件需求量】,用于下级单据调用 if(v_inp_num == '' || v_inp_num == '0') //检测子件物资明细是否有数量为空的行【不允许有数量为空行,确保需求准确完整】 { dbg('【'+v_res_id+'】【'+v_res_name+'】标准需求量为【空或0】请检查!') can_save=0; } }; return 1; }; int 主件和子件明细相关静态赋值() { string sql,v1,v,v2,v_ext_4,v_ext_1,v_dwm,m_zcgx,v_lsh,v_zcgx,m_zjbh,m_zjsl,m_yydh,m_kh,m_cpbh,m_po,m_ddsl,m_res_id; num v_ddsl,v_inp_num; int count,grid_rc,i,j,k; m_yydh = gui_get_val("Edit_Ass_No");//获取【相关单号】即引用的【上级单据编号】&&【材料需求表固定引用销售订单明细数据】 m_kh = gui_get_text("ComboBox_Ext_Eba_Id") //获取【客户名称】 v_lsh = grid_get_v("MG_Item","voucher_id",1); //获取子件明细第一行的【单据流水号】 //从数据库获取本单据主物资明细第一行的主物资【成品】编号,PO和数量赋值到单据的3个扩展 db_run("select ref_voucher_id,ref_item_id from ebs_vr_item where ref_voucher_no ='"+m_yydh+"' and is_main in('Y')"); //根据【上级单据编号】获取【上级单据流水号】和【上级单据明细流水号】 db_run("select res_id,sub_attr_val_1,inp_num from ebs_vr_item where voucher_id ='"+db_res(0)+"' and item_id ='"+db_res(1)+"'");//获取上级单据明细物资编号,行业属性一【订单PO】和【数量】 m_cpbh = db_res(0) m_po = db_res(1) m_ddsl = db_res(2) gui_set_val("edit_Ext1",m_cpbh); //成品编号赋值到单据扩展一【成品编号】 gui_set_val("edit_Ext2",m_po); //订单PO赋值到单据扩展二【订单PO】 gui_set_val("edit_Ext3",m_ddsl); //订单数量赋值到单据扩展三【成品数量】 grid_rc = grid_find('MG_Item','res_name',''); //获取子件明细记录数 for(i=1;i<grid_rc;i++) { v_zcgx = grid_get_v("MG_Item","main_id",i); //获取主明细编号 v = grid_get_v("MG_Item","vr_item_ext_2",i); //获取明细成品编号 v2 = grid_get_v("MG_Item","res_id",i); //获取明细子件编号 v_ddsl = grid_get_v("MG_Item","vr_item_ext_4",i); //获取明细自定义4【订单数量】列 grid_set_v('MG_Item','attr.cap.1',i,m_po); //主物资PO赋值到明细行业属性一【订单PO】列 grid_set_v('MG_Item','vr_item_ext_3',i,m_po); //主物资PO赋值到明细自定义3【订单PO】列,供下级单据调用 grid_set_v('MG_Item','attr.cap.3',i,m_cpbh); //把成品编号赋值到单据明细行业属性三【成品编码】列 grid_set_v('MG_Item','vr_item_ext_2',i,m_cpbh); //把成品编号赋值到单据明细自定义列2【成品编号】列,供下级单据调用 grid_set_v('MG_Item','ddsl',i,m_ddsl); //把订单数量赋值到子件明细自定义扩展ddsl【订单数量】列 grid_set_v('MG_Item','vr_item_ext_1',i,m_kh); //把客户名称赋值到明细自定义1【客户】列,供下级单据调用 //根据【单据流水号】从数据库获取所有主物资编号,主明细编号,主物资数量赋值到对应的明细物资指定列 db_run("select res_id,main_id,inp_num from ebs_vr_item where is_main in('Y') and voucher_id ='"+v_lsh+"'"); count = db_row_count(); //获取主物资数据记录数 for (j = 0; j < count;j++) { db_go_row(j); //指向主物资明细记录 m_zjbh = db_res(0) //主物资编号 m_zcgx = db_res(1) //主明细编号 m_zjsl = db_res(2) //主物资数量 if(m_zcgx == v_zcgx) //当【主物资主明细编号】等于【明细主明细编号】时 { grid_set_v("MG_Item","vr_item_ext_5",i,m_zjbh); //赋值主物资编号到明细自定义5【主件编号】列 //根据主物资编号,明细子件编号获取产品组成的【明细自定义1】,【明细定位码】等信息赋值到对应明细列 db_run("select ext_1,pcode from res_composing where res_id = '" + m_zjbh + "' and sub_res_id = '" + v2 + "'"); v_ext_1 = db_res(0); //产品组成的【明细自定义1,序号】列 v_dwm = db_res(1); //产品组成的【定位码】列 grid_set_v('MG_Item','vr_item_ext_4',i,m_zjsl); //主物资数量赋值到明细自定义4【主件数量】列 grid_set_v("MG_Item","xh",i,v_ext_1); //产品组成明细自定义1【序号】赋值到明细扩展xh【序号】列,用来按照序号排序,保持和产品组成序号顺序一致,以便提取组成明细后快速核对 grid_set_v("MG_Item","dwm",i,v_dwm); //产品组成明细【定位码】复制到明细扩展dwm【定位码】列,电子主板类半成品BOM专用,也可以用来录入其他物料的加工,组装类说明 }; }; }; // dbg(count) //主物资明细相关列赋值 for(k=1;k<=count;k++) { grid_set_v('MG_Main_Res','vr_item_ext_1',k,m_kh); //把客户名称赋值到主物资明细自定义1【客户】列,以便在下级单据的引用界面显示出来供参考 grid_set_v('MG_Main_Res','vr_item_ext_3',k,m_po); //把订单PO赋值到主物资明细自定义3【订单PO】列,以便和明细子件物资自定义3【订单PO】列保持一致 grid_set_v('MG_Main_Res','attr.cap.1',k,m_po); //把订单PO赋值到主物资的行业属性一【订单PO】列,因为【BOM5级展开之后新生成的下级BOM主物资没有【订单PO】数据 grid_set_v('MG_Main_Res','vr_item_ext_2',k,m_cpbh); //把成品编号赋值到主物资明细自定义2【成品编号】列,供下级单据调用 grid_set_v('MG_Main_Res','attr.cap.3',k,m_cpbh); //把成品编号赋值到主物资行业属性3【成品编号】列,以便在下级单据的引用界面显示出来供参考 grid_set_v('MG_Main_Res','ddsl',k,m_ddsl); //把成品数量赋值到主物资扩展ddsl【订单数量】列,供本单据明细报表参考 grid_set_v('MG_Main_Res','vr_item_ext_4',1,''); //把成品订单数量赋值到主物资明细自定义4【订单数量】列,以便在下级单据的引用界面显示出来供参考 grid_set_v('MG_Main_Res','vr_item_ext_6',k,grid_get_v('MG_Main_Res','inp_num',k)); //把主件需求量赋值到主物资明细自定义6【子件需求量】列,供下级单据调用 }; return 1; } int 主物资对应的上级物资编号和数量动态赋值() { int grid_rc_m,i,count,j,k; string sql,v_inp_num,m_ddsl,m_cpbh,v_res_id,v_cpbh,m_lsh,m_gx,m_zjbh; grid_rc_m= grid_find('MG_Main_Res','res_name',''); //获取主物资明细记录数 m_lsh = grid_get_v('MG_Item','voucher_id',1); //获取子件物资明细第一行的【单据流水号】 for(i=1;i<grid_rc_m;i++) { v_res_id = grid_get_v('MG_Main_Res','res_id',i); //获取主物资编号,用于该主物资作为子件物资时提取主物资编号 //根据主物资编号获取该主物资作为子件物资时从数据库提取对应的产品组成的产品编号 db_run("select res_id from res_composing where sub_res_id = '" + v_res_id + "'"); v_cpbh = db_res(0) //根据【单据流水号】从数据库提取主物资编号和数量 db_run("select res_id,inp_num from ebs_vr_item where is_main in('Y') and voucher_id ='"+m_lsh+"'"); count = db_row_count(); //获取主物资明细记录数 for (j = 0; j < count;j++) { db_go_row(j); //指向主物资明细记录 m_cpbh = db_res(0) //主物资编号 m_ddsl = db_res(1) //主物资数量 //第一行的主物资是成品编号,不会作为子件物资,过滤掉第一行,从第二行开始单据主物资编号等于产品组成的产品编号时【避免提取到共用的同时作为子件物资的主物资编号】 if(i>1 && v_cpbh == m_cpbh) { grid_set_v('MG_Main_Res','vr_item_ext_5',i,m_cpbh); //把符合条件的主物资编号赋值到主物资明细自定义5【主件编号】列,供本单据明细报表参考 grid_set_v('MG_Main_Res','vr_item_ext_4',i,m_ddsl); //把符合条件的主物资数量赋值到主物资明细自定义4【主件数量】列,供本单据明细报表参考 }; }; }; //本脚本意义是为了使主物资,主物资的上级物资和数量,最终的成品编号和数量能关联在同一行,供本单据明细报表参考,其用意和子件明细物资相同,都是为了BOM链相关数据关联在同一行供单据明细报表参考 return 1; }; int 删除已制单的子件明细行() //按照子件物资编号,主件物资编号,成品编号,订单PO,提取需求单已有制单数量的行并删除,避免子件物资做重复的需求数 { //按照物料编号,成品编号,订单PO,订单数量提取需求单已下单数量 string sql,v_res_id,v_cpbh,v_ddpo,v_voucher_id,v_zjbh,v_yxdsl,v_dyh; num m_yxdsl; int i,rc; v_voucher_id = grid_get_v("MG_Item","voucher_id",1); //获取单据子件物资明细第一行的【单据流水号】 rc = grid_find("MG_Item","res_name",""); //获取明细记录数 for(i=1;i<rc;i++); { v_res_id = grid_get_v("MG_Item","res_id",i); //获取【子件物资编号】 v_cpbh = grid_get_v("MG_Item","sub_attr_val_3",i); //获取子件物资行业属性三【成品编号】 v_zjbh = grid_get_v("MG_Item","vr_item_ext_5",i); //获取子件物资的【主件物资编号】 v_ddpo = grid_get_v("MG_Item","sub_attr_val_1",i); //获取子件物资行业属性一【订单PO】 sql = "select res_id,vr_item_ext_5,sub_attr_val_1,sub_attr_val_3,sum(inp_num) inp_num from ebs_vr_item where vr_item_ext_5 = '"+v_zjbh+"'" sql = sql + " and res_id = '" + v_res_id + "' and sub_attr_val_3 = '" + v_cpbh + "' and sub_attr_val_1 = '" + v_ddpo+"'" sql = sql + " and voucher_id < " + v_voucher_id + " group by res_id,vr_item_ext_5,sub_attr_val_1,sub_attr_val_3" db_run(sql); m_yxdsl = db_res(4); //已制单的合计数 grid_set_v("MG_Item","yxdsl",i,m_yxdsl); //赋值已制单的合计数到子件物资明细扩展yxdsl【已制单数量】列 v_yxdsl = grid_get_v("MG_Item","yxdsl",i); //获取子件物资明细扩展yxdsl【已制单数量】列数值 if(v_yxdsl > 0) //已制单数量大于0的子件物资明细行 { grid_del_row('MG_Item',i); //删除已制单数量大于0的子件物资明细行 i--; rc = rc - 1; }; v_dyh = grid_get_v('MG_Item','res_id',1) //获取子件物资明细第一行的子件物资编号 if(v_dyh == '') //当第一行的子件物资编号为空时 { msg('此单没有BOM,请联系BOM管理员!或已做完材料需求表,请删除!') can_save=0; gui_trigger_click("Popu_Erase"); //执行删除单据 }; }; return 1; } int colunreadonly() //解除锁定允许指定的明细列可编辑【根据实际需求增减】 { grid_unmark_readonly('MG_Item','item_emf_process_name') //工序列可编辑【用于审核后更新工序变更】 grid_unmark_readonly('MG_Item','res_id') //子件物资编号可编辑【用于审核后手工快速变更替代料,一般不建议在这里修改】 gui_enable("Edit_Main_Res_Sub_Attr_Val_1") //主物资PO可编辑【用于审核后更新PO#】 gui_enable("Edit_Main_Res_Num") //主物资数量可编辑【用于审核后更新主物资数量】 gui_enable("Edit_Main_Res_Ass_Num") //主物资辅助数量可编辑【用于审核后更新主物资辅助数量】 }; int create_voucher() { //gui_hide("PopupMenu_Item_grid_base_fun") //隐藏明细物资右键【表格功能】 string d; d = get_cur_date_std(); //获取当前日期 gui_set_val("DateTimePicker_Voucher_Date",d); //设置单据日期为当前日期 if(is_user_in_group("材料需求表更新")) //属于【材料需求表更新】操作员分组的操作员登录可以看到这个明细右键控件,用于审核后更新修改 { menu_add_call_str("PopupMenu_Item",1,'colunreadonly','解锁修改','call_csp.voucher.MD.colunreadonly') }; //设置以下明细列不可编辑 grid_mark_readonly('MG_Item','vr_item_ext_6') //从需求量赋值过来的需求量【供需求量小数凑整和下级单据引用过去计算调用】 grid_mark_readonly('MG_Item','vr_item_ext_5') //主件编号,从主物资赋值过来 grid_mark_readonly('MG_Item','vr_item_ext_4') //主件订单数量,从主物资表赋值 grid_mark_readonly('MG_Item','vr_item_ext_3') //订单PO grid_mark_readonly('MG_Item','vr_item_ext_2') //成品编号 grid_mark_readonly('MG_Item','vr_item_ext_1') //客户名称 grid_mark_readonly('MG_Item','attr.cap.1') //PO# grid_mark_readonly('MG_Item','attr.cap.3') //成品编号 grid_mark_readonly('MG_Item','inp_num') //子件物资的需求量 grid_mark_readonly('MG_Item','yxdsl') //已生成的需求单数量 grid_mark_readonly('MG_Item','xh') //用来赋值产品组成明细物资序号的列 grid_mark_readonly('MG_Item','dwm') //用来赋值产品组成定位码的列 grid_mark_readonly('MG_Item','ddsl') //用来赋值成品订单数量的列 grid_mark_readonly('MG_Item','note_info') //明细备注列【所有需要备注的信息添加在产品组成明细备注列,禁止在本单据修改】 grid_mark_sum('MG_Item','yxdsl') //已生成的需求单数量合计数 grid_mark_readonly('MG_Item','item_emf_process_name') //明细工序 return 1; }; int func_show() { call_str('call_prog.djewm_csp'); //调用生成手机扫描单据二维码脚本 gui_set_font_color('SpeedButton_Create',0x0000ff);//新增字体改为红色 gui_set_font_color('SpeedButton_Ask_Check',16711935);//送审字体改为粉色 gui_set_font_color('SpeedButton_Ask_Check_R',32768);//反送审字体改为绿色 gui_set_font_color('SpeedButton_Check',16711808);//审核字体改为紫色 gui_set_font_color('SpeedButton_Check_R',32768);//反审核字体改为绿色 gui_set_font_color("lab_Ext1",0x0000ff);//单据扩展属性一标签改为红色突出显示 gui_set_font_color("lab_Ext2",0x0000ff);//单据扩展属性二标签改为红色突出显示 gui_set_font_color("lab_Ext3",0x0000ff);//单据扩展属性三标签改为红色突出显示 //按照【返回】控件的坐标新增【标签式按钮】 //【尽量调用系统的固定控件坐标值和宽度来设置新增的标签按钮,使其适用于不同显示器分辨率或设置的系统字体大小不同的情况下能动态显示,增强脚本的通用性】 int x,y,w,h,x1; num x,x1,x2,w,x3,x4,x5,x6,x7; x=gui_get_x("ScrollBox_Func_Middle") //横向坐标 x1=gui_get_x("ScrollBox_Func_Right") //横向坐标 y=gui_get_y("SpeedButton_Return") //【返回】控件纵向坐标 w=gui_get_w("SpeedButton_Return") //【返回】控件宽度 h=gui_get_h("SpeedButton_Return") //【返回】控件高度 x2 = 100+x+x1+w x3 = 100+x+x1+w*2+5 x4 = 100+x+x1+w*3+5*2 x5 = 100+x+x1+w*4+5*3 x6 = 100+x+x1+w*5+5*4 x7 = 100+x+x1+w*6+5*5 gui_create_speedbutton("Panel_Func","DJRZ",x2,y,w,h,"单据日志","call_csp.voucher.HH.DJRZ"); gui_set_hint ("DJRZ", '提示:单据保存,送审,审核,反送审,反审核,完成,反完成等操作记录'); gui_create_speedbutton("Panel_Func","DJMX",x3,y,w,h,"明细报表","call_csp.voucher.HH.DJMX"); gui_set_hint ("DJMX", '提示:打开本单据的明细报表,根据筛选字段提取需要的明细表'); gui_create_speedbutton("Panel_Func","XSDDMX",x4,y,w,h,"订单明细","call_csp.voucher.HH.XSDDMX"); gui_set_hint ("XSDDMX", '提示:打开销售订单的明细报表,根据筛选字段提取需要的明细表'); gui_create_speedbutton("Panel_Func","CKBOM",x5,y,w,h,"产品组成","call_csp.voucher.HH.CKCPZC"); gui_set_hint ("CKBOM", '提示:选中主物资行,查看对应主物资编号的产品组成明细'); if(is_user_in_group("材料需求表更新"))//属于【材料需求表更新】操作员分组的操作员登录可以看到这个标签,用于审核后更新修改 { gui_create_speedbutton("Panel_Func","DJJSGX",x6,y,w,h,"审核调整","call_csp.voucher.HH.DJJSGX"); gui_set_hint ("DJJSGX", '提示:点击进行审核后单据调整,用于已被下级单据引用后不能反审核单据的情况下修改相关数据,修改完成后点击【更新】控件即可!'); }; gui_create_speedbutton("Panel_Func","CXTQBDJ",x7,y,w,h,"单据刷新","call_csp.voucher.HH.CXTQBDJ"); gui_set_hint ("CXTQBDJ", '提示:相关基础资料更新后,点击这里刷新一下能看到更新后的基础资料!或快捷键【Ctrl+L】操作'); //【增加流水号控件】 string v_lsh; int x,y,w,h,x1,x2,x3,w1,w2; num x,y,w,h,x1,x2,x3,w1,w2; x=gui_get_x("Edit_Voucher_No") //【单据编号】X坐标 y=gui_get_y("Edit_Voucher_No") //【单据编号】Y坐标 w1=gui_get_w("SpeedButton_Return") //【返回】控件宽度 w=gui_get_w("Edit_Voucher_No") //【单据编号】宽度 h=gui_get_h("Edit_Voucher_No") //【单据编号】高度 x1 = x+w+5 //【流水号】标签X坐标赋值 x2 = x1+w1+5 //【引用订单】标签X坐标赋值 x3 = x2+w1+10 //【BOM表5级展开】标签X坐标赋值 w2 = w-w1 //【BOM表5级展开】标签宽度赋值 v_lsh = grid_get_v('MG_Item','voucher_id',1) //获取单据流水号 gui_create_label("ScrollBox_Base",'l2020',x1,y,v_lsh) //创建【流水号】标签,标签名:【当前单据流水号】 gui_set_font_size("l2020",'14') //设置流水号控件字体大小 gui_set_font_color('l2020',0x008000); //设置流水号控件字体颜色为绿色 //【流水号标签设置完成】 //单据编辑界面用到的【快捷标签】最好是放在【ScrollBox_Base】控件下,这样在单据审核后,这个【快捷标签】也会被自动锁定 gui_create_speedbutton("ScrollBox_Base","YYXSDD",x2,y,w1,h,"引用订单","call_csp.voucher.HH.YYXSDD"); gui_set_hint ("YYXSDD", '提示:引用销售订单明细,或快捷键【F6】操作'); gui_create_speedbutton("ScrollBox_Base","BOM5",x3,y,w2,h,"BOM表5级展开","call_csp.voucher.HH.BOM5"); gui_set_hint ("SpeedButton_Save", '提示:引用销售订单过来之后一定要【先点击【保存】按钮后再点击执行【BOM5级展开】后,再点击保存【2】次即完成材料需求表的相关信息自动填充动作!'); gui_set_hint ("BOM5", '提示:引用销售订单过来之后先保存再点击此控件执行5级展开后,再点击保存【2】次即完成材料需求表的相关信息自动填充动作!'); gui_disable("Edit_Main_Res_Note_Info");//让主物资备注不可操作 gui_disable("Edit_Main_Res_Sub_Attr_Val_1");//让主物资PO不可操作 gui_disable("Edit_Ass_No");//让相关单号【上级单号】不可操作 gui_disable("edit_Ext1");//让单据扩展属性一【成品编号】不可操作 gui_disable("edit_Ext2");//让单据扩展属性二【订单PO】不可操作 gui_disable("edit_Ext3");//让单据扩展属性三【订单数量】不可操作 gui_disable("DateTimePicker_Date_Lmt_Res");//让单据交付期限不可操作 //流水号控件增加完成 return 1; }; int cell_change() { //change_col,change_col_id,change_row_id return 1; }; int obj_change() { //【以下脚本仅用于审核后更新修正PO#和订单量的时候用】 if(change_obj == "Edit_Main_Res_Sub_Attr_Val_1") //当修改主物资的行业属性一【订单PO】单元格的数值回车后 { int i,grid_rows; string mres_po; mres_po = gui_get_val("Edit_Main_Res_Sub_Attr_Val_1") //获取主物资的行业属性一【订单PO】单元格数值 grid_rows = grid_find('MG_Item','res_name',''); //获取子件物资明细记录数 for(i=1;i<grid_rows;i++) { grid_set_v('MG_Item','attr.cap.1',i,mres_po); //主物资的行业属性一【订单PO】单元格数值赋值到子件物资行业属性一【订单PO】列 grid_set_v('MG_Item','vr_item_ext_3',i,mres_po); //主物资的行业属性一【订单PO】单元格数值赋值到子件物资明细自定义3【订单PO】列 } }; if(change_obj == "Edit_Main_Res_Num") //当修改主物资的【数量】单元格的数值回车后 { int i,grid_rows; string v_inp_num; grid_rows = grid_find('MG_Item','res_name',''); //获取子件物资明细记录数 for(i=1;i<grid_rows;i++) { v_inp_num= grid_get_v('MG_Item','inp_num',i); //获取按主物资的【数量】单元格的数值重新生成的子件物资明细inp_num【标准需求量】列 grid_set_v('MG_Item','vr_item_ext_6',i,v_inp_num); //赋值最新的需求量到子件物资明细自定义6【子件需求量】列,供下级单据参考 }; }; //change_obj return 1; }; int init_row() { //把产品组成数量赋值到自定义6列,供执行【子件物资数量逢小数进一】脚本时调用 int i,grid_rows; string v_inp_num; grid_rows = grid_find('MG_Item','res_name',''); for(i=1;i<grid_rows;i++) { v_inp_num= grid_get_v('MG_Item','inp_num',i); grid_set_v('MG_Item','vr_item_ext_6',i,v_inp_num); }; return 1; }; int init_row_cal_sub() { return 1; }; int adjust_row() { return 1; }; int func_before_print() { //can_print=1; return 1; }; int func_before_save() { call_str('call_prog.djewm_csp');//执行生成单据二维码,保存后刷新单据二维码,供手机微信扫描后在微信端查看本单据明细 if(gui_get_val("DateTimePicker_Voucher_Date") > get_cur_date_std()) //当【当前单据日期】大于【当前日期】时,禁止保存单据【后续官方应该会增加这个全局设置】 { msg('单据日期超过当前日期,保存失败,请检查!'); can_save = 0; }; 子件物资数量逢小数进一() 主件和子件明细相关静态赋值() 主物资对应的上级物资编号和数量动态赋值() 删除已制单的子件明细行() grid_sort("MG_Item","xh,res_id")//按照BOM序号和子件物资编号排序 //【增加流水号控件】和【int func_show()】段的设置保持一致,用于单据保存后能刷新【单据流水号】 //【尽量调用系统的固定控件坐标值和宽度来设置新增的标签按钮,使其适用于不同显示器分辨率或设置的系统字体大小不同的情况下能动态显示,增强脚本的通用性】 string v_lsh; int x,y,w,x1; num x,x1,y,w; x=gui_get_x("Edit_Voucher_No") //【单据编号】X坐标 y=gui_get_y("Edit_Voucher_No") //【单据编号】Y坐标 w=gui_get_w("Edit_Voucher_No") //【单据编号】宽度 x1 = x+w+5 //【流水号】标签X坐标赋值 v_lsh = grid_get_v('MG_Item','voucher_id',1) //获取单据流水号 gui_create_label("ScrollBox_Base",'l2020',x1,y,v_lsh) //创建【流水号】标签,标签名:【当前单据流水号】 gui_set_font_size("l2020",'14') //设置流水号控件字体大小 gui_set_font_color('l2020',0x008000); //设置流水号控件字体颜色为绿色 //【流水号标签设置完成】 //can_save=1; return 1; }; int func_before_check() { //can_check=1; return 1; }; int func_after_save() { return 1; }; int func_after_check() { return 1; }; int func_after_print() { return 1; }; int func_before_oper() { //oper_type=save,check,check_r,finish,finish_r,delete,giveup,ask_check,ask_check_r; //func_before_oper函数在保存、打印、审核、反审核等操作前执行,可以利用oper_type判断类型,用can_oper=0拒绝操作。 //can_oper=1; return 1; }; int func_after_oper() { //oper_type=save,check,check_r,finish,finish_r,delete,giveup,ask_check,ask_check_r,duplicate; return 1; }; int DJRZ() { gui_trigger_click("Popu_Print_Log");//打开日志 return 1; }; int DJMX() { call_str("view_rep.vr_item_rep.HH");//打开本单据明细报表 return 1; }; int XSDDMX() { call_str("view_rep.vr_item_rep.BA");//打开销售订单明细报表 return 1; }; int CXTQBDJ() { gui_trigger_click("Popu_Voucher_Reload");//单据刷新 return 1; }; int BOM5() { gui_trigger_click("N_Main_Res_Loop_Expand_To_5");//BOM表5级展开 return 1; }; int YYXSDD() { gui_trigger_click("Popu_Select_Ass_Voucher");//引用销售订单 return 1; }; int DJJSGX() { gui_trigger_click("Popu_Enter_Checked_Edit_Mode");//单据解锁更新 return 1; }; int CKCPZC() { //根据选中的的主物资明细行来调用该主物资的产品组成明细,提取产品组成的相关数据根据【实际需求】修改即可 string v_res_id,v,v1,dqrq,dqsk; dqrq = fmt_date(get_cur_date(),'yyyy年 mm月dd日'); //格式化当前日期,用于显示数据的标题调用,方便保存excel时根据部门,主件编号,查看日期时刻组合成文档名 dqsk = get_serv_time(); //获取格式化后的当前时刻【excel文档名不能包含:所以必须格式化处理】 v_res_id = gui_get_val("Edit_Main_Res_Id_Show"); //获取鼠标选中的主件物资编号 v="select a.ext_4 as 部门,a.ext_3 as 成品编号,a.ext_3 as 成品名称,a.res_id as 主件编号,a.res_id as 主件名称,a.ext_2 as BOM编号,a.ext_1 as 序号,a.sub_res_id as 组成材料编号,"; v=v+"b.res_name as 组成材料名称,b.res_unit_type as 材料单位,a.num as 需求量,a.pcode as 定位码,a.emf_process_id as 工序名称,a.note_info as 备注"; v=v+" from res_composing a,res b where a.sub_res_id=b.res_id and a.res_id='"+v_res_id+"'"; v1="select p.ext_5 as 客户,o.部门,o.成品编号,o.成品名称,c.res_spec as 成品规格,c.res_unit_type as 成品单位,o.主件编号,o.主件名称,p.res_spec as 主件规格,p.res_unit_type as 主件单位," v1=v1+"o.BOM编号,o.序号,o.组成材料编号,o.组成材料名称,d.res_spec as 组成材料规格,o.材料单位,o.需求量,o.定位码,o.工序名称,o.备注 from ( " + v + " ) o left join (select * from res)" v1=v1+" p on o.主件编号 = p.res_id left join (select * from res) d on o.组成材料编号 = d.res_id left join (select * from res) c on o.成品编号 = c.res_id" db_run(v1); db_map("eba","客户","客户"); //根据客户编号转成客户名称 db_map("res","成品名称","成品名称"); //根据成品编号转成成品名称 db_map("res","主件名称","主件名称"); //根据主件编号转换成主件名称 db_map("res_unit_type","成品单位","成品单位"); //根据成品标准单位编号转成成品标准单位名称 db_map("res_unit_type","主件单位","主件单位"); //根据主件物资标准单位编号转成主件物资标准单位名称 db_map("res_unit_type","材料单位","材料单位"); //根据子件物资标准单位编号转成子件物资标准单位名称 db_map("emf_process","工序名称","工序名称"); //根据工序编号转换成工序名称 db_sort_ext('主件编号,序号'); //按主件物资编号,产品组成明细序号排序 db_show('电源部【'+v_res_id+'】BOM清单【'+dqrq+dqsk+'】') //按照指定格式标题名显示数据 return 1; }; int main() { return 1; }; |