实现例如以下结果:
for i:=1 to 5 do
begin
  insert into dd (a) values (1)
  insert into dd (b) values (2)
  insert into dd (c) values (3)end;
for i:=6 to 10 do
begin
  insert into dd (a) values (3)
  insert into dd (b) values (1)
  insert into dd (c) values (2)
end;
for i:=11 to 15 do
begin
  insert into dd (a) values (2)
  insert into dd (a) values (3)
  insert into dd (a) values (1)
end;
说明:5,10,15是一个变量,只代表改变频率,也有可能是6,12,18.
而且一直按此频率往下递增,a 的值呢以三次为一个循环。
for i:=16 to  20 do
begin
  insert into dd (a) values (1)
  insert into dd (b) values (2)
  insert into dd (c) values (3)
end;
for i:=21 to 25 do
begin
  insert into dd (a) values (3)
  insert into dd (b) values (1)
  insert into dd (c) values (2)
end;
for i:=26 to 30 do
begin
  insert into dd (a) values (2)
  insert into dd (a) values (3)
  insert into dd (a) values (1)
end;还有如果最后i可能为28,29,30,31.然后可能重新循环,也可能一直住下循环。说一下意思吧!应该有人做过。这是一个生产企业的排班顺序。每天有3个班,每班8个小时,5天进行一次倒班。
原来上1的,开始上3,上2的,开始上1,上3的,开始上2.
一直往下循环。
但有两种情况,一种情况,到月底时,不管这个班上了几天,下月开始重新倒班。也有可能不考虑月底,一直往下进行。需求就是这样,有做过生产企业MIS的,你们是如何处理班次的?

解决方案 »

  1.   

    procedure  TfrmAssetClean.PB(PL,TS:Integer;qsrq:datetime;YDSFCP:String);
    Var I,J,K :Integer;
    begin
       J:=1;
       for I:=1 to TS do
       begin
        //如果月底要重排,并且当前日期就是月底的话
        if (YDSFCP='Y') and (dateEndOfMonth(floattodatetime(qsrq+I-1)=floattodatetime(qsrq+I-1))) then
        K:=1;
        J:=(k div 5) mod 3;
        Case J mod 3 of
        1:
          begin
            insert into dd (a) values (1);
            insert into dd (b) values (2);
            insert into dd (c) values (3);
          end;
        2:
          begin
            insert into dd (a) values (3);
            insert into dd (b) values (1);
            insert into dd (c) values (2);
          end;
        0:
          begin
            insert into dd (a) values (2);
            insert into dd (b) values (3);
            insert into dd (c) values (1);
          end;
       end;end;
      

  2.   

    其中dateEndOfMonth是一个函数获取某日期的所在月的最后一天
    //得到本月的最后一天
    function dateEndOfMonth(D: TDateTime): TDateTime;
    var
      Year, Month, Day: Word;
    begin
      DecodeDate(D, Year, Month, Day);
      if Month = 12 then
      begin
        Inc(Year);
        Month := 1;
      end else
        Inc(Month);
      Result := EncodeDate(Year, Month, 1) - 1;
    end;