有客户需要把手工做的交货计划转移到系统里面录入,录入销售订单完成后,就开始根据实际生产计划做一个月的分批交货计划回传给客户,要求锁定星期天不可安排交货 提供给客户的解决方案思路: 1. 启用销售单据的自定义单据BJ改名:B7.交货记录(销售模块第7个启用的单据) 2. 增加5个表头附加扩展属性定义【khjc:客户简称】,【pcksrq:开始日期】,【pcjsrq:结束日期】,【yfts1:开始月天数】,【yfts2:结束月天数】 3. 增加31个单据明细附加扩展属性定义的交付日期列【jfrq01~jfrq31】 4. 新增一个不进行库存管理的产品资料【料号:原材料号,品名:品名】用来替代单据标题行 5. 显示方案把料号,品名,明细自定义列1-5,31个明细附加扩展列和备注列的标题名改为空 ,脚本定义录入开始日期回车后,自动添加这个产品到第一行 6. 默认开始日期为今年第一天20240101,脚本限定没有修改这个开始日期之前不能引用上级单据 BJ单据脚本 int init_test() { return 1; }; int create_voucher() { grid_mark_readonly('MG_Item','vr_item_ext_2') grid_mark_readonly('MG_Item','vr_item_ext_3') grid_mark_readonly('MG_Item','vr_item_ext_4') grid_mark_readonly('MG_Item','vr_item_ext_5') gui_set_val("date_pcksrq",'20240101'); //设置初始交付日期,以便限定此日期不能引用订单 return 1; }; int 锁定星期天的交付日期() { int i; string v_pcrq; for(i=1;i<=31;i++); //循环获取排产日期列 { v_pcrq = str_get_sub(grid_get_v("MG_Item",'jfrq'+fmt_int(i,"%02d"),1),0,8); //获取所有交付日期 grid_unmark_readonly('MG_Item','jfrq'+fmt_int(i,"%02d"),1) //解锁所有交付日期 if(get_week_id(v_pcrq) == '7') //当交付日期为星期天时,锁定该日期列 { grid_mark_readonly('MG_Item','jfrq'+fmt_int(i,"%02d"),1) } }; return 1; }; int func_show() { 锁定星期天的交付日期() gui_disable("edit_khjc"); gui_disable("date_pcjsrq"); gui_disable("edit_yfts1"); gui_disable("edit_yfts2"); gui_create_button("ScrollBox_Base","Switch_on13",925,7,75,22,"1.引用订单","call_csp.voucher.BJ.switchon13"); return 1; }; int cell_change() { int i,j; string v_jfrq; j = change_row_id; num ext1,ext2,ext3,ext5,v_pcsl,v_pcrq,inpnum,rq01,rq02,rq03,rq04,rq05,rq06,rq07,rq08,rq09,rq10,rq11,rq12,rq13,rq14,rq15; num rq16,rq17,rq18,rq19,rq20,rq21,rq22,rq23,rq24,rq25,rq26,rq27,rq28,rq29,rq30,rq31 for(i=1;i<=31;i++); { v_jfrq = 'jfrq'+fmt_int(i,"%02d") if(change_col == v_jfrq) { ext1 = vr_item_ext_1 ext2 = vr_item_ext_2 ext3 = vr_item_ext_3 ext5 = vr_item_ext_5 inpnum = inp_num rq01 = jfrq01; rq02 = jfrq02; rq03 = jfrq03; rq04 = jfrq04; rq05 = jfrq05; rq06 = jfrq06; rq07 = jfrq07; rq08 = jfrq08; rq09 = jfrq09; rq10 = jfrq10; rq11 = jfrq11; rq12 = jfrq12; rq13 = jfrq13; rq14 = jfrq14; rq15 = jfrq15; rq16 = jfrq16; rq17 = jfrq17; rq18 = jfrq18; rq19 = jfrq19; rq20 = jfrq20; rq21 = jfrq21; rq22 = jfrq22; rq23 = jfrq23; rq24 = jfrq24; rq25 = jfrq25; rq26 = jfrq26; rq27 = jfrq27; rq28 = jfrq28; rq29 = jfrq29; rq30 = jfrq30; rq31 = jfrq31; inp_num = rq01+rq02+rq03+rq04+rq05+rq06+rq07+rq08+rq09+rq10+rq11+rq12+rq13+rq14+rq15+rq16+rq17+rq18+rq19+rq20+rq21+rq22+rq23+rq24+rq25+rq26+rq27+rq28+rq29+rq30+rq31 vr_item_ext_4 = rq01+rq02+rq03+rq04+rq05+rq06+rq07+rq08+rq09+rq10+rq11+rq12+rq13+rq14+rq15+rq16+rq17+rq18+rq19+rq20+rq21+rq22+rq23+rq24+rq25+rq26+rq27+rq28+rq29+rq30+rq31 vr_item_ext_5 = ext2 - ext3 - inp_num if(ext2 - ext3 - inp_num < '0') { v_pcrq = grid_get_v('MG_Item',v_jfrq,1) v_pcsl = grid_get_v('MG_Item',v_jfrq,j) msg('第【'+j+'】行,交付日期【'+v_pcrq+'】输入的交付数量【'+v_pcsl+'】超过待交付数:【'+ext5+'】,请重新输入交付数量!') return 0; } } }; //change_col,change_col_id,change_row_id return 1; }; int 生成交付日期() //按照开始日期生成最近1个月的所有日期到明细第一行 { string m_ksrq,m_jsrq,m_ny1,m_ny2,m_ny,m_yf1,m_yf2,m_rq1,m_rq2,m_yfts1,m_yfts2,m_jsrq,m_jhts1,m_jhts2,m_jsrq1,m_jsrq2,v_jfrq,v_jfrq1,v_jfrq2,v_jfrq3; num m_ny1,m_yf1,m_rq1,m_yfts1,m_yfts2,m_ksrq,m_ksrq1,m_jhts1,m_jhts2,m_yfts1,m_yfts2; m_ksrq = gui_get_val("date_pcksrq") //获取开始日期 m_ny1 = str_get_sub(m_ksrq,0,6); //获取开始年月 m_ny2 = month_add(m_ny1,'1'); //获取结束年月(开始年月的下月) m_yf1 = str_get_sub(m_ksrq,4,2); //获取开始月份 m_yf2 = str_get_sub(m_ny2,4,2); //获取结束月份 m_rq1 = str_get_sub(m_ksrq,6,2); //获取开始日期 m_jsrq = fmt_int(m_rq1-1,"%02d") //获取结束日期 m_yfts1 = get_month_days(m_yf1) //获取开始月份天数 m_jhts1 = m_yfts1 - m_rq1 + 1 //获取开始月份实际天数 gui_set_val("edit_yfts1",m_jhts1); //赋值开始月天数 if(m_rq1 == '01') //当开始月日期为1号的时候,结束日期为当月最后一天 { m_jsrq1 = str_get_sub(m_ksrq,0,6)+get_month_days(m_yf1) //获取结束日期(开始年月+当月天数 gui_set_val("date_pcjsrq",m_jsrq1); //赋值结束日期 gui_set_val("edit_yfts2",'0'); //赋值结束月天数 }if(m_rq1 != '01'){ //当开始日期不是1号的时候,结束日期为开始月的次月(开始月日期-1天) m_jsrq2 = str_get_sub(m_ny2,0,6)+m_jsrq //获取结束日期(结束年月+结束日期) gui_set_val("date_pcjsrq",m_jsrq2); //赋值结束日期 m_yfts2 = get_day_between(m_ny2+'01',m_jsrq2)+1 //获取结束月份天数(结束月份1号到结束日期的天数差+1) gui_set_val("edit_yfts2",m_yfts2); //赋值结束月的实际天数 } int i,k,j,m_jhts1,m_jhts2; for(j=1;j<=31;j++); //排产日期赋值前先清空已赋值的内容,以便修改开始日期的时候实时更新最新的排产日期 { grid_set_v("MG_Item",'jfrq'+fmt_int(j,"%02d"),1,'') //清空第一行的31列排产日期 }; m_yfts1 = gui_get_val("edit_yfts1") //获取开始月的实际天数 m_yfts2 = gui_get_val("edit_yfts2") //获取结束月的实际天数 for(k=1;k<=m_yfts1;k++); //开始月的排产日期列循环赋值 { k = fmt_int(k,"%02d") //开始月的实际天数补足2位数 v_jfrq = m_ksrq - 1 + k //获取动态交付日期(开始日期-1+开始月实际天数) grid_set_v("MG_Item",'jfrq'+fmt_int(k,"%02d"),1,v_jfrq+'('+get_week_id(v_jfrq)+')') //填充开始月的实际日期到交付日期 grid_unmark_readonly('MG_Item','jfrq'+fmt_int(k,"%02d")) //解除所有交付日期列的锁定 if(get_week_id(v_jfrq) == '7') //当交付日期为星期天时(锁定排产日期为星期天的列) { grid_mark_readonly('MG_Item','jfrq'+fmt_int(k,"%02d")) //锁定交付日期为星期天的列 }; } for(i=1;i<=m_yfts2;i++); //结束月的交付日期列循环赋值 { v_jfrq1 = fmt_int(i,"%02d") //获取2位数的动态日期 v_jfrq2 = m_yfts1 + i //获取动态交付日期(结束年月+结束月实际天数) v_jfrq2 = fmt_int(v_jfrq2,"%02d") //获取动态交付日期(结束年月+结束月实际天数) v_jfrq3 = m_ny2+v_jfrq1 //获取完整的动态年月日 if(m_rq1 != '01') //当开始月日期不是1号的时候,对结束月的交付日期赋值 { grid_set_v("MG_Item",'jfrq'+v_jfrq2,1,v_jfrq3+'('+get_week_id(v_jfrq3)+')') //结束月的交付日期赋值 grid_unmark_readonly('MG_Item','jfrq'+v_jfrq2) //解除所有交付日期列的锁定 if(get_week_id(v_jfrq3) == '7') //当交付日期为星期天时(锁定交付日期为星期天的列) { grid_mark_readonly('MG_Item','jfrq'+v_jfrq2) //锁定交付日期为星期天的列 }; } }; return 1; }; int obj_change() { if(change_obj == "ComboBox_Ext_Eba_Id") { string m_kh; m_kh = gui_get_val("ComboBox_Ext_Eba_Id") db_run("select easy_code from eba where eba_id = '" + m_kh + "'"); gui_set_val("edit_khjc",db_res(0)); }; if(change_obj == "date_pcksrq") //当修改开始日期的时候自动计算结束日期(按照一个月的天数) { if(grid_find("MG_Item","res_id","") == '1') //当第一行为空的时候自动生成日期标题行,单据默认标题行在显示方案改为空 { vr_add_res_ext('原材料号','1',"vr_item_ext_1:"+'筐数'+';'+"vr_item_ext_2:"+'订单数量'+';'+"vr_item_ext_3:"+'已排产数'+';'+"vr_item_ext_4:"+'排产合计'+';'+"vr_item_ext_5:"+'待排产数'+';'+"note_info:"+'备注'); } 生成交付日期() //修改开始日期的时候,实时更新所有交付日期 }; //change_obj return 1; }; int init_row() { string sql,v_inp_num,v_res_id,v_yydjbh,v_refid; int i,rc;rc = grid_find("MG_Item","res_id",""); if(grid_get_v("MG_Item","res_id",1) != '原材料号') { msg('没有修改开始日期,请修改开始日期后再引用上级单据!') grid_del_row("MG_Item",1) //删除引用的明细 return 0; }else{ for(i=1;i<rc;i++); { v_res_id = grid_get_v("MG_Item","res_id",i); //获取产品编号 v_yydjbh = grid_get_v("MG_Item","ref_voucher_no",i); //获取产品编号 v_refid = grid_get_v("MG_Item","ref_item_id",i); //获取产品编号 v_inp_num = grid_get_v("MG_Item","inp_num",i); //获取订单数量 grid_set_v("MG_Item","vr_item_ext_2",i,v_inp_num) //赋值订单数量到明细自定义列1 grid_set_v("MG_Item","vr_item_ext_2",1,'订单数量') //赋值第一行的明细自定义列1为【订单数量】 //获取订单数量 sql = "select inp_num from ebs_vr_item a left join " sql = sql + "ebs_v c on a.voucher_id = c.voucher_id where voucher_no= '"+v_yydjbh+"' and res_id = '" + v_res_id + "' and item_id = '" + v_refid+ "'" db_run(sql); grid_set_v("MG_Item","vr_item_ext_2",i,db_res(0)) grid_set_v("MG_Item","vr_item_ext_2",1,'订单数量') //已排产数量合计 sql = "select res_id,ref_voucher_no,ref_item_id,sum(inp_num) inp_num from ebs_vr_item a left join " sql = sql + "ebs_v c on a.voucher_id = c.voucher_id " sql = sql + " left join ebs_vr p on a.voucher_id = p.voucher_id where voucher_type = 'BJ' and res_id = '" + v_res_id + "' and " sql = sql + " ref_voucher_no = '" + v_yydjbh + "'and ref_item_id = '" + v_refid+ "'" sql = sql + " and a.voucher_id < " + v_voucher_id + " group by res_id,ref_voucher_no,ref_item_id" db_run(sql); grid_set_v("MG_Item","vr_item_ext_3",i,db_res(3)); grid_set_v("MG_Item","vr_item_ext_3",1,'已排产数'); } 生成交付日期() }; 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() { //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,checked_update; //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,checked_update,duplicate; return 1; }; int switchon13() { if(gui_get_val("date_pcksrq") != '20240101') { gui_trigger_click("Popu_Select_Ass_Voucher");//打开单据引用 }else{ msg('请先选择或修改【开始日期】后再引用【订单明细】') return 0; }; return 1; }; int main() { return 1; }; |