////脚本用于统计实际加班打卡数据与加班单申请的数据进行对比,而得到实际的加班数据 int add_row_id() { int i,rowCount; grid_add_col_num("MG","item_id","行号");///统计考勤日帐行数行号 rowCount = grid_row_num("MG"); for(i=1;i<rowCount;i++) { grid_set_v("MG","item_id",i,i); } } int create_table_new(string tableName) { add_row_id(); string sql,colName; int i,db_col_count; colName = grid_get_col_name("MG",1); db_run_process("if object_id('" + tableName + "') is not null drop table " + tableName); db_run_process("create table " + tableName + " (" + colName + " nvarchar(100))"); db_select_area(1); grid_to_db("MG"); db_set_field_name(0,colName); db_col_count = db_field_count(); for(i=1;i<db_col_count;i++) { colName = db_field_name(i); db_select_area(2); db_run_process("alter table " + tableName + " add " + colName + " nvarchar(100)" ); db_select_area(1); //db_set_field_name(i,colName); } db_set_table_name(tableName); db_batch_insert(); db_run("commit"); } int calc_jiaban_new() { string sql,emp_id,emp_id_db,class_date_MG,class_date_db,班次编号,tmpTable; int count,class_date_min,class_date_max,i,class_date,count_db,m,加班折算分钟数,平时加班分钟数合计; int 周末加班分钟数合计,节假日加班分钟数合计,加班单分钟数,isFind; int 合计分钟数,加班分钟数,数值三,星期六,加班单开始时间,加班单结束时间,加班单差异分钟数; int 实际打卡分钟数,实际加班单开始分钟数,UR; int dbRowCount,j,strPos; num 数值五,数值六,小时数,分钟数,实际打卡时间,xss,fzs,打卡实际时间; num times,begTime; tmpTable = "tempTable" + get_user_id(); create_table_new(tmpTable);//创建临时表 class_date_min = gui_get_val("DateTimePicker_Date_Beg"); class_date_max = gui_get_val("DateTimePicker_Date_End"); sql = "select a.*, b.times, b.beg_time from " + tmpTable + " a "; sql += "left join ( select sum(minutes) + sum(hours) * 60 as times, emp_id, " sql += "overtime_date, max(beg_time) as beg_time from timer_overtime where overtime_date >= '"; sql += class_date_min + "' and overtime_date <= '" + class_date_max + "'"; sql += "group by emp_id, overtime_date) b "; sql += "on a.emp_id = b.emp_id and a.class_date = b.overtime_date order by CAST(item_id AS int)"; db_select_area(1); db_run(sql); dbRowCount = db_row_count(); if(dbRowCount<1) { return 0; } for(i=0;i<dbRowCount;i++) { db_go_row(i) 平时加班分钟数合计=0; 周末加班分钟数合计=0; 节假日加班分钟数合计=0; 加班单分钟数=0; emp_id = db_res_ext("emp_id"); class_date_MG = db_res_ext("class_date"); 加班折算分钟数 = to_int(db_res_ext("factor_overtime_minute")); 合计分钟数 = to_int(db_res_ext("total_minute")); 加班分钟数 = to_int(db_res_ext("overtime_minute")); 星期六 = get_week_id(class_date_MG); 打卡实际时间 = to_float(str_replace(db_res_ext("off_time_3"),":","")); 实际打卡时间 = db_res_ext("off_time_3"); tip("正在处理的总数据" + dbRowCount + "条 , 正在运行第" + i + "行数据"); 班次编号 = db_res_ext("class_id"); times = db_res_ext("times"); begTime = db_res_ext("beg_time"); if(times != "" || begTime != "") { 加班单分钟数 = to_int(db_res_ext("times")); 加班单开始时间 = fmt_date(second_to_date(date_to_second("20220505" + db_res_ext("beg_time"))),"hhmi"); if(fmt_date(second_to_date(date_to_second("20220505" + db_res_ext("beg_time"))+(加班单分钟数*60)),"hhmi")=="0000") { 加班单结束时间 = 2400; } else { 加班单结束时间 = fmt_date(second_to_date(date_to_second("20220505" + db_res_ext("beg_time"))+(加班单分钟数*60)),"hhmi"); }; 小时数 = str_get_sub_n(实际打卡时间,strlen(实际打卡时间)-5,2); fzs = str_get_sub_n(实际打卡时间,strlen(实际打卡时间)-2,2) if(fzs >= 30) { 分钟数 = 30; } else { 分钟数 = 0; }; 实际打卡分钟数=小时数 * 60 + 分钟数 if(加班单开始时间 < 1000) { 实际加班单开始分钟数 = str_get_sub_n(加班单开始时间,strlen(加班单开始时间)-4,2) * 60 / 10; } else { 实际加班单开始分钟数 = str_get_sub_n(加班单开始时间,strlen(加班单开始时间) - 4,2) * 60; }; 加班单差异分钟数= 实际打卡分钟数 - 实际加班单开始分钟数; //dbg(实际打卡时间+" "+小时数+" "+分钟数+" "+实际打卡分钟数+" "+实际加班单开始分钟数+" "+加班单差异分钟数); strPos = str_pos("AE,AD,AK,AL,AM,AN,AO,Aw,Az,BC,BH,BJ,BL,BN,BO,BR,RA,RD,RE",班次编号) //周末班次添加 if(strPos >=0 && 加班折算分钟数 <= 加班单分钟数 ) { 周末加班分钟数合计 = 加班折算分钟数; } else if(str_pos("Ay,AF",班次编号) >-1 && 加班折算分钟数<=加班单分钟数 ) //节假日班次添加 { 节假日加班分钟数合计 = 加班折算分钟数; } else if(strPos >= 0 && 加班折算分钟数 > 加班单分钟数 && 加班单分钟数 >= 0) { 周末加班分钟数合计 = 加班单分钟数; } else if(str_pos("AF,Ay",班次编号) >= 0 && 加班折算分钟数 > 加班单分钟数 && 加班单分钟数 >= 0) //节假日班次添加 { 节假日加班分钟数合计 = 加班单分钟数; } else if(打卡实际时间 < 加班单结束时间 && 打卡实际时间 > 加班单开始时间) { 平时加班分钟数合计 = 加班折算分钟数 + 加班单差异分钟数; } else if(打卡实际时间 < 加班单结束时间 && 打卡实际时间 < 加班单开始时间) { 平时加班分钟数合计 = 加班折算分钟数; } else { 平时加班分钟数合计 = 加班折算分钟数 + 加班单分钟数; }; db_set_value_ext("n1",加班单分钟数); db_set_value_ext("n2",平时加班分钟数合计); db_set_value_ext("n3",周末加班分钟数合计); db_set_value_ext("n4",节假日加班分钟数合计); } else { if(str_pos("AE,AD,AK,AL,AM,AN,AO,Aw,Az,BC,BH,BJ,BL,BN,BO,BR,RA,RD,RE",班次编号) >= 0 && 加班单分钟数 > 1)////周末班次添加 { 周末加班分钟数合计=加班折算分钟数; } else if(str_pos("AF,Ay",班次编号) >= 0 && 加班单分钟数 > 1) //节假日班次添加 { 节假日加班分钟数合计 = 加班折算分钟数; } else if(str_pos("AA,AAA,AB,AC,AH,AI,AR,As,BA,BB,BD,BE,BF,BG,BI,BK,BM,BP,BQ,BS,RS,RB,RC",班次编号) >= 0 )//平时班次添加 { 平时加班分钟数合计 = 加班折算分钟数; } else { 周末加班分钟数合计 = 0; 节假日加班分钟数合计 = 0; }; db_set_value_ext("n2",平时加班分钟数合计); db_set_value_ext("n3",周末加班分钟数合计); db_set_value_ext("n4",节假日加班分钟数合计); //grid_set_v("MG","n5",i,数值五); //grid_set_v("MG","n6",i,数值六); } num aa; aa = 合计分钟数 - 加班分钟数; ///"数值五"统计每天的是实际出勤天数 strPos = str_pos("AA,AAA,AB,AC,AH,AI,AR,BA,BB,BD,BE,BF,BG,BI,BK,BM,BP,BQ,BS,RS,RB,RC",班次编号);//平时班次添加 if(strPos >=0 && aa < 480) { 数值五 = num_dec_cut(aa /480,2 ); } else if(strPos >=0 && aa >= 480) { 数值五 = 1; } else if(班次编号 == "As") { 数值五 = num_dec_cut(aa /1200,2 ); } else { 数值五 = 0; }; //dbg(合计分钟数+" ' "+ 加班分钟数 +" ' "+num_dec_cut (aa /480,2 )) ///"数值六"是统计周六实际出勤天数; 数值三 = 周末加班分钟数合计;//grid_get_v("MG","n3",i); //dbg(数值三); strPos = str_pos("AD,AE,AK,AL,AM,AN,AO,Aw,Az,BC,BH,BJ,BL,BN,BO,BR,RA,RD,RE",班次编号);//周末班次添加 if(strPos >=0 && 星期六 == "6" && 数值三 < 480) { 数值六 = num_dec_cut(数值三 /480,2 ); } else if(strPos >= 0 && 星期六 == "6" && 数值三 >= 480) { 数值六 = 1; } else if( 班次编号 == "As" && 星期六 == "6") { 数值六 = num_dec_cut(数值三/1200,2 ); } else { 数值六 = 0; }; db_set_value_ext("n5",数值五); db_set_value_ext("n6",数值六); //dbg(i + "-" + 加班单分钟数 + "-" + 平时加班分钟数合计+"-"+周末加班分钟数合计+"-"+节假日加班分钟数合计+"-"+数值五+"-"+数值六); j = db_res_ext("item_id"); grid_set_v("MG","n1",j,加班单分钟数); grid_set_v("MG","n2",j,平时加班分钟数合计); grid_set_v("MG","n3",j,周末加班分钟数合计); grid_set_v("MG","n4",j,节假日加班分钟数合计); grid_set_v("MG","n5",j,数值五); grid_set_v("MG","n6",j,数值六); } db_drop_field("times"); db_drop_field("beg_time"); //db_show(); //return 0; db_select_area(2); db_run_process("delete from " + tmpTable + ""); db_select_area(1); db_set_table_name(tmpTable); db_batch_insert(); grid_cal_sum("MG"); db_select_area(2); sql = "update timer_list set timer_list.n1 = " + tmpTable + ".n1, timer_list.n2 = " + tmpTable + ".n2, "; sql += "timer_list.n3 = " + tmpTable + ".n3, timer_list.n4 = " + tmpTable + ".n4, timer_list.n5 = " + tmpTable + ".n5, "; sql += "timer_list.n6 = " + tmpTable + ".n6 from " + tmpTable + " where "; sql += "timer_list.emp_id in (select emp_id from " + tmpTable + ") and timer_list.emp_id = " + tmpTable + ".emp_id "; sql += "and timer_list.class_date = " + tmpTable + ".class_date"; db_run_process(sql); db_run_process("if object_id('" + tmpTable + "') is not null drop table " + tmpTable); db_run("commit"); tip('操作完成!'); } 以下脚本是用于服务器定时运行任务---按时间段自动运行脚本,使考勤日帐里面及时得到企业想需要的考勤结果 int main() { string cur_date; cur_date =get_last_date(get_cur_date_std()); call_dll_func("timer_app.dll","Timer_Gui_List_Adm"); //call_func("Timer_Gui_List_Adm"); change_to_win("考勤台账明细管理"); gui_set_val("DateTimePicker_Date_Beg",cur_date); gui_set_val("DateTimePicker_Date_End",cur_date); gui_set_val("CheckBox_Process_Result","0"); gui_trigger_click("SpeedButton_Fetch_Limit"); change_to_win("考勤台账明细管理"); shell("D:\hrm_setup\plugin\do.exe");//自动运行程序放置路径 //gui_trigger_click("clac_jiaban");//日帐新建按钮"加班计算"在列表里面新建(加班计算脚本单独新建) gui_trigger_click("calc_jiaban_new");//日帐新建按钮"加班计算"在列表里面新建(加班计算脚本单独新建) db_run("commit"); gui_trigger_click("SpeedButton_Return"); return 1; }; 目前的问题是,自动运行上述脚本,服务器会出错,自动停止i。单独在考勤日帐里面运行脚本或者执行脚本,都能够正常运行,不会出现任何问题 |