现在正做的考勤系统中需要得到每个月中连续请假3天以上(包括3天)的时间段.用于统计该月中不扣伙食费的天数.想到用for从1号到月底最后一天做个循环,但问题是当找到请假的日期以后怎么使下次循环跳过两天?
如:某人12月6~8号请假,循环到6后判断他请假了,跟着判断6+1,6+2,即7,8号也请假了.则记录这3天请假,但下次循环时怎么让变量跳过7,8而直接从9开始呢?

解决方案 »

  1.   

    var
    i,j:integer;
    begin
    j:=0;
    for i:=开始天数 to 结素天数 do
    begin
    if (请假) then j:=j+1 //用一个变量来记录不就行了
    end;
    if j>3 then showmeeage('大过三天');
    end;不太清楚你数据是怎么存储的,其实一个SQL语句就可以解决的问题.
      

  2.   

    用循环处理很好处理的,楼上的方法就可以了。
    顺便问一下楼上:用一个SQL怎么写?
      

  3.   

    to: hsmserver(撒哈拉之雨的悲伤) 
    数据存储格式为一天一个字符串,例如:1/8,前面的代表出勤类型,后面为出勤时间,我是要找出"连续的"3天,不是某个时间段里面累计超过3天.to:ssq237712(流亡帅哥) 
    具体怎么写,给个例子,谢谢!to:caiso(十年磨一剑)
    那到不必关心,我们这里规定的8小时制度,我只要知道出勤类型为"请假"且时间为8小时就算这天请假.
      

  4.   

    在后台写成存储过程。
    如果检测到 一条记录 (代表请假的)---取出日期给一个日期变量---dateAdd()函数每垒加一天查询一次---如果连续三次都是请假---》我就是这么个意思!
      

  5.   

    简单写了一下,你看看:
    var
      j: integer;
      IsContinous: Boolean;//是否连续请假
      LeaveDate: TDate;//请假开始时间
      d: TDate;//循环变量
    begin
      IsContinous := False;
      d := 月初时间;
      while d <= 月抹时间 do
      begin
        if (请假) then
        begin
          if not IsContinous then//开始连续记录
          begin
            LeaveDate := d;//开始时间
            j := 1;
            IsContinous := True;
          end
          else Inc(j);
        end
        else
        begin
          if IsContinous and (j >= 3) then
            记录请假时间段(LeaveDate, d - 1);
          IsContinous := False;      
        end;
        d := d + 1;
      end;
    end;
      

  6.   

    谢谢 ssq237712(流亡帅哥) !