原创_考勤日帐加班数据统计脚本运用_人力资产
学习.交流
专业源于专注
www. onlyit. cn   
学习交流 文件下载 手册资料 交流QQ群

    

 4  1/1   1  
作者
内容
hong816  [个人空间]
QQ名  浮天风


注册  2010-04-26
发贴数  410
精华贴  1
原创贴  1
来自  
状态  正常

级别  贵宾
#1»发布于2022-09-12 08:56

////脚本用于统计实际加班打卡数据与加班单申请的数据进行对比,而得到实际的加班数据 
 
 
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。单独在考勤日帐里面运行脚本或者执行脚本,都能够正常运行,不会出现任何问题


        




诚信是金!!!!提供onlyit系统服务:人力资源、进销存生产管理、数字化工厂建设等一条龙服务:401698929    13958183550

cathy  [个人空间]


注册  2007-07-18
发贴数  222
精华数  0
原创贴  0
来自  
状态  正常

级别  会员
#2»发布于2022-09-12 11:36

窗体没有创建,自动任务无法click,所以会报错。 
把那些 trigger_click的全部去掉,换个实现方式。


        


qf2016  [个人空间]
QQ名  meng 113779009


注册  2016-01-17
发贴数  2554
精华数  0
原创贴  0
来自  
状态  正常

级别  版主
#3»发布于2022-09-12 21:36

 
1、班次定义界面会增加班次大类 class_type,用来标识该班次是属于普通班次还是周末班次或者是节假日班次。 
2、考勤日帐会增加一个 adjust_flag 标志字段,用来标识该记录是否经过调整处理,默认为0,处理后设置为1。 
3、考勤月帐生成数据时会支持加班分钟数等以及数值1-8按照班次大类进行统计。 
4、后台服务自动执行任务会支持调用存储过程类型的任务。


        


qf2016  [个人空间]
QQ名  meng 113779009


注册  2016-01-17
发贴数  2554
精华数  0
原创贴  0
来自  
状态  正常

级别  版主
#4»发布于2022-09-13 09:01

 
存储过程的处理例子: 
 
if  (object_id('op_timer_list','P') is not null) 
  drop proc op_timer_list 
go 
 
create proc op_timer_list  
as 
  declare @r_emp_id varchar(20),@r_class_date varchar(20),@r_class_id varchar(20) 
  declare @r_list_ot_mi int          --日帐的加班分钟数  
  declare @r_def_type varchar(20)    --班次的大类,从timer_class_def 关联取 class_type 
  declare @r_def_total_mi int        --班次一天上班分钟数,从timer_class_def 关联取 total_minute 
  declare @r_app_ot_mi int           --加班单申请的分钟数 
  declare @result_ot_mi int          --采用的加班分钟数  
  declare @normal_ot_mi int          --平时加班分钟数 
  declare @weekend_ot_mi int         --周末加班分钟数 
  declare @holiday_ot_mi int         --节假日加班分钟数 
         
  --adjust_flag为0表示没处理过 
  declare cursor_list cursor for select a.emp_id,a.class_date,a.class_id,a.overtime_minute, 
    b.class_type,b.total_minute from timer_list a,timer_class_def b 
    where a.class_id=b.class_id 
  --调试阶段先注释掉 and a.adjust_flag=0 
  open cursor_list 
   
  while (1=1) 
  begin 
    fetch next from cursor_list into @r_emp_id,@r_class_date,@r_class_id,@r_list_ot_mi, 
                                     @r_def_type,@r_def_total_mi 
    if (@@FETCH_STATUS!=0) 
      break 
 
    print  '  date ' + @r_class_date + ' emp_id ' + @r_emp_id + ' minu ' + Str(@r_list_ot_mi) 
     
    set @r_app_ot_mi = 0 
    if (@r_list_ot_mi>0) 
      select @r_app_ot_mi = isnull(sum(minutes) + sum(hours * 60 ),0) from timer_overtime where emp_id = @r_emp_id and overtime_date = @r_class_date 
       
    set @result_ot_mi = @r_list_ot_mi 
     
    --如大于登记的加班时间则采用登记的加班时间 
    if (@result_ot_mi > @r_app_ot_mi) 
      set @result_ot_mi = @r_app_ot_mi 
       
    set @normal_ot_mi = 0 
    set @weekend_ot_mi = 0 
    set @holiday_ot_mi = 0 
 
    --周末班次,利用class_type来判断 
    --if ( CHARINDEX(@r_class_id,"AE,AD,AK,AL,AM,AN,AO,Aw,Az,BC,BH,BJ,BL,BN,BO,BR,RA,RD,RE") >0) 
    if (@r_def_type='B') 
      set @weekend_ot_mi = @result_ot_mi   
    --节假日班次,利用class_type来判断 
    --if ( CHARINDEX(@r_class_id,"Ay,AF") >0)  
    if (@r_def_type='C') 
      set @holiday_ot_mi = @result_ot_mi 
 
     set @normal_ot_mi = @result_ot_mi - @weekend_ot_mi - @holiday_ot_mi 
     
    update timer_list set n1=@result_ot_mi, 
                          n2=@normal_ot_mi, 
                          n3=@weekend_ot_mi, 
                          n4=@holiday_ot_mi, 
                          adjust_flag=1 where emp_id=@r_emp_id and class_date=@r_class_date 
  end 
   
  close cursor_list 
  deallocate cursor_list 
go 
 
exec op_timer_list 
go 
 
--int main() 
--{ 
--  db_run("exec op_timer_list"); 
--  return 1; 
--};


附件(登录后才可下载):2209130901_11.sql  说明: 原文件:陈宏op_timer_list.sql   大小:2654 Byte
附件(登录后才可下载):2209130901_12.doc  说明: 原文件:陈宏存储说明.doc   大小:1867776 Byte

        



 4  1/1   1  

登录后方可发贴


[ 电话: 0571-85462761 王先生 QQ: 124520435 加入软件QQ群 - 杭州 - 浙ICP备19051128号-1 网安 33010402003225 ]