DataMuseum.dk

Presents historical artifacts from the history of:

MIKADOS

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about MIKADOS

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦7bcedbf97⟧ TextFile

    Length: 68256 (0x10aa0)
    Types: TextFile
    Notes: Mikados_K
    Names: »LIMPLANL.K«

Derivation

└─⟦6c21327e0⟧ Bits:30008986 LINIMATIC K-FILER (IKKE HELT UPTODTATE)
    └─⟦this⟧ »LIMPLANL.K« 

Mikados K File

PROGRAM LIMPLANL;
(*$D-*)
(*RESSOURCE- OG ORDRE-PLANLÆGNING*)
(*$L-*)
CONST MAXRECSIZE=1000;
(*@@*)
      PROGRAMNR=8;
TYPE
PARMARRAY=PACKED ARRAY (1..39) OF CHAR;
NIVEAU=(MENIG,SERGENT,LØJTNANT,KAPTAJN,MAJOR,OBERST,GENERAL,HSM,UMULIUS);
POSTADR=0..MAXRECSIZE;
COMMBUF =ARRAY (POSTADR) OF INTEGER;(*commbuf(0)=filnr,resten er posten*)
POINTREC=^COMMBUF;
NAME    =STRING(10);
PCB     =^INTEGER;
MESSAGETYPE=(ÅBEN,LUK,LÆSPOST,LÆSPOSTX,NÆSTE,NÆSTEX,SLET,SLETX,GEMPOST,
             INDSÆT,INITIER,UTILMELD,UAFMELD,PTILMELD,PAFMELD,STOPSYS,        
             RETURNHEAD,RETURNSTAT);                                    
MESSAGE =RECORD
           KOMMANDO:MESSAGETYPE;
           INFO,IREC:INTEGER 
         END;
AR=ARRAY (-4..-4) OF INTEGER;
VAR    PARM:^PARMARRAY;
       USERNIVEAU:NIVEAU;
       F:STRING(18);
       QUQ:^INTEGER;
       IER,IREC,STATUSER,MODE,REMUSERS,
       FILNR,I:INTEGER;
       FNAVN,REGNAVN,DESCNAVN:STRING(18);
       SEMAFOR:NAME;
       FILEINIT:BOOLEAN;
       SNYD:AR;
       CPPCB:PCB;
       COMREC:POINTREC;
       BESKED:MESSAGE;
(*$P*)
(*$L-*)
PROCEDURE D(FRA,NR:INTEGER);
VAR I:INTEGER;
BEGIN
  GOTOXY(1,FRA);
  FOR I:=1 TO NR DO WRITE(' ':79);
  GOTOXY(1,FRA)
END;
PROCEDURE NONEXIST(S:STRING);
BEGIN
  D(23,1);
  WRITE(S,' findes ikke, RETURN ');
  READLN;D(23,1) 
END;
PROCEDURE BAD(IDENT,STATUS:INTEGER);
BEGIN
  D(23,1);
  WRITE('BAD',IDENT:5,STATUS:5);
  READLN
END;
(*$P*)
PROCEDURE ALLOCA(VAR ADDRESS:POINTREC;LENGTH:INTEGER;
                 VAR STATUS:INTEGER);
EXTERNAL;
PROCEDURE DEALLO(ADDRESS:POINTREC;VAR STATUS:INTEGER);
EXTERNAL;
PROCEDURE SENDM(RECEIVER:PCB;VAR CONTENTS:MESSAGE;
                LENGTH:INTEGER;VAR STATUS:INTEGER);
EXTERNAL;
PROCEDURE RECEIV(VAR SENDER:PCB;VAR CONTENTS:MESSAGE;
                 VAR LENGTH:INTEGER);
EXTERNAL;
PROCEDURE RESERV(RESOURCE:NAME;EXCLUSIVE,WAIT:BOOLEAN;
                 VAR STATUS:INTEGER);
EXTERNAL;
PROCEDURE RELEAS(RESOURCE:NAME;VAR STATUS:INTEGER);
EXTERNAL;
(*$IRESPRINT*)
(*$P*)
(*$IUDFØR*)
(*$IFISFPROC*)
(*$P*)
PROCEDURE REGVEDL;
CONST MAXFELTER=20;
(*@@*)
TYPE
NFELT=^FELTBESKRIVELSE;
SKÆRMPOS=RECORD
   X,Y:INTEGER
END;
FTYPE=(HELTAL,DOBBTAL,REEL,TEKST);
VTYPE=(HINTERVAL,DINTERVAL,RINTERVAL,DATO,CPR);
BESKRIVELSESTYPE=(FELTDESC,VALIDESC);
FELTBESKRIVELSE=RECORD
   NÆSTEVAL:NFELT;
   FELTNAVN:STRING(8);
   CASE DESCTYPE:BESKRIVELSESTYPE OF
   FELTDESC:
  (INDPOS,UDPOS:SKÆRMPOS;
   KIKKENIVEAU,ÆNDRENIVEAU:NIVEAU;
   EDITERING:INTEGER;
   LEDETEKST,FØLGETEKST:STRING;
   INDEKS,
   LÆNGDE,
   HÆGTE,
   FORAN0:INTEGER;
   CASE FELTTYPE:FTYPE OF
   REEL:(DEC:INTEGER);
   HELTAL,DOBBTAL,TEKST:());
   VALIDESC:
  (CASE VALIDITETSTYPE:VTYPE OF
      HINTERVAL:(MIN,MAX:INTEGER);
      DINTERVAL:(MIN1,MIN2,MAX1,MAX2:INTEGER);
      RINTERVAL:(RMIN,RMAX:REAL);
      DATO,CPR:())
END;
ARAR=PACKED ARRAY (-11..-10) OF CHAR;
RAR=ARRAY (0..0) OF REAL;
LONGINT = ARRAY (1..2) OF INTEGER;
(*@@EVT. TOTAL POSTERKLÆRING,FLERE POSTER*)
(*$P*)
(*$L+*)
RESSPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  TSATSF,
  SAMOMS,
  SAMOMSSÅ,
  SAMDB,
  SAMDBSÅ,
  KØBSPRIS,
  SALGSPRI            :REAL;
  NR,
  AFDELNR,
  PRODTIM,
  VEDLTIM,
  OPSTILT,
  OVERTIM,
  REPTIME,
  TOTALTI,
  PRODTIMS,
  VEDLTIMS,
  OPSTILTS,
  OVERTIMS,
  REPTIMES,
  TOTALTIS,                    
  RESSTYPE           :INTEGER;
  DATOFLEV           :LONGINT;
  HYLDENR            :INTEGER;
  BETEGN             :PACKED ARRAY (1..10) OF CHAR
END;
REGRPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  GRUPNR,
  NR                 :INTEGER 
END;
EMNEPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  ÅRSFORBR,
  NETTOVÆG,
  BRUTTOVÆ,
  SAMSALG,
  DÆKBID,
  DÆKBIDSÅ,
  SAMSALGS          :REAL;
  NR,
  FORMNR            :INTEGER;
  KUNDENR           :LONGINT;
  MASKINE           :INTEGER;
  TILDATO           :LONGINT;
  MATNR,
  SVIND,
  SMELTTIL,
  STKHSA,
  STKHBA            :INTEGER;
  BEMÆRK,
  BETEGN,
  ALTERNP           :PACKED ARRAY (1..30) OF CHAR;
  TEGNNR            :PACKED ARRAY (1..20) OF CHAR
END;
OPERPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  TILLÆG            :REAL;
  NR,
  GRUPPE,
  REBELAS           :INTEGER;
  BETEGN            :PACKED ARRAY (1..30) OF CHAR
END;
PRODPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  KRSTK,    (*SAMLET TIMESATS FOR ALLE RESSOURCER*)
  REAANTAL          :REAL;
  ORDRENR,
  SEKVENSN,
  OPERANR,
  STARTTID,
  OPERAFSL,
  STKH,
  RESS1,
  RESS2,
  RESS3,
  RESS4,
  RESS5,
  EMNENR,
  VARIGHED          :INTEGER 
END;
ORDRPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  ANTALBES,
  SALGSPRI,
  MATOMK,
  LØNOMK,
  MASKINOM,
  SMEOMK,
  MATFORB           :REAL;
  NR                :INTEGER;
  KUNDENR           :LONGINT;
  EMNENR            :INTEGER;
  REGDATO           :LONGINT;
  ØNSKLEV,
  BEKRÆLEV          :INTEGER;
  KUNDORDR          :PACKED ARRAY (1..16) OF CHAR;
  INITIALE          :PACKED ARRAY (1..4) OF CHAR 
END;
REBEPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  NR,
  STARTDAG,
  ORDRENR,
  EMNENR,
  OPERANR,  
  SEKVNR,
  VARIGHED,
  GRUPPE,
  STTIME          :INTEGER 
END;
UGEDPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  UGENR,
  ARBDAGNR        :INTEGER 
END;
ARBEPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  NR               :INTEGER;
  DATO             :LONGINT;
  UGENR, 
  ARBTIMER         :INTEGER 
END;
SYSRPOST=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  AKKTIME          :ARRAY (1..9) OF REAL;
  NR               :INTEGER;
  DAGSDATO,                 
  PERSTDAT         :LONGINT;
  ARBTIMDA,         
  ORDRENR          :INTEGER 
END;
PLANPESC=RECORD
  AA:ARAR;
  A:AR;
  AAA:RAR;
  RESSOURCE,
  ORDRE,
  EMNENR,
  STARTUGE,
  LINIENR,
  UGE,
  DAG,
  TIME,
  VARIGHED,
  FRALINIE,
  TILLINIE,
  ØLEVUGE,
  OPTION,
  AFDELING,
  GRUPPE,
  FAKTOR          :INTEGER 
END;
REBEXTRA=RECORD
  PLANLAGT:BOOLEAN;
  BETEGN:PACKED ARRAY (1..10) OF CHAR;
  BEKRÆLEV,
  ØNSKLEV:INTEGER;
  ANTALBES:REAL
END;
VAR FELT:NFELT;
    PICTURE:ARRAY (1..MAXFELTER) OF NFELT;
  (*PRODPLAN:BOOLEAN;*)
    OPTION,LINES,
    UDE,ANTLINE,PSTARTDAG,DIRECTION,HUSK,HUSKTID,
    I,J,ANTALFELTER:INTEGER;
    LINE:STRING;
    RESS:RESSPOST;
    RESSGRUP:REGRPOST;
    EMNE:EMNEPOST;
    OPERA:OPERPOST;
    PROD:PRODPOST;
    ORDRE:ORDRPOST;
    REBELAST:REBEPOST;
    SYSTEM:SYSRPOST;
    UGEDAG:UGEDPOST;
    ARBEDAG:ARBEPOST;
    POST:PLANPESC;
    DAGSDATO,
    LONGNUL:LONGINT;
    CH:CHAR;
    NEJ,JA,JAOGNEJ:SET OF CHAR;
(*$P*)
FUNCTION QJN(S:STRING):CHAR;
VAR CH:STRING(1);
BEGIN
  REPEAT
    D(23,1);
    WRITE(S,' J/N ');
    CH:='J';
    EDIT(CH)
  UNTIL CH(1) IN JAOGNEJ;
  QJN:=CH(1);
  D(23,1) 
END;
PROCEDURE ERROR(VAR REC:AR);
VAR CH:STRING(1);
    I:INTEGER;
BEGIN
  D(23,1);
                                                                     (*$R-*)
  WRITE('FEJL I REGISTER ',REC(-3),' FEJLKODE ',IER,' RETURN');      (*$R+*)
  CH:=' ';EDIT(CH);
  IF CH='Æ' THEN BEGIN IER:=0;EXIT(ERROR) END;
  ICLOSE(SYSTEM.A);    
  ICLOSE(RESS.A);    
  ICLOSE(RESSGRUP.A);    
  ICLOSE(EMNE.A);    
  ICLOSE(OPERA.A);   
  ICLOSE(ORDRE.A);    
  ICLOSE(PROD.A); 
  ICLOSE(REBELAST.A);
  ICLOSE(UGEDAG.A);
  ICLOSE(ARBEDAG.A);
  EXIT(REGVEDL)
END;
PROCEDURE CHECK0(VAR REC:AR);
BEGIN
  IF IER<>0 THEN ERROR(REC)
END;
(*$P*)
(*$L-*)
(*$IRLÆSDESC*)
(*$P*)
(*$IMOVETOLI*)
(*$P*)
(*$L+*)
PROCEDURE RESSPLAN;
VAR CH:STRING(1);
    CHECKOK:BOOLEAN;
    SKEMA:PACKED ARRAY (1..52) OF CHAR;
    REBENR:ARRAY (1..20) OF INTEGER;
    REBELIN:ARRAY (1..20) OF REBEPOST;
    REBXTRA:ARRAY (1..20) OF REBEXTRA;
 
PROCEDURE RESSBILLEDE(FRA,TIL:INTEGER); (*FRA=0 => ALLE + HOVED*)
VAR I,AKTWEEK,AKTDAG,
    REST,C:INTEGER;
    ESC:PACKED ARRAY (1..2) OF CHAR;
    CH:CHAR;
BEGIN
  ESC:=' N';ESC(1):=CHR(27);
  IF FRA=0 THEN
  BEGIN
    CLEARSCREEN;
    SKEMA:='ü                                                  ü';
    WRITE('Ressource:',RESS.NR:5,' ':5);
    ARBEDAG.NR:=PSTARTDAG;
    GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
    AKTWEEK:=0;
    FOR I:=1 TO 25 DO
    BEGIN
      IF AKTWEEK<>ARBEDAG.UGENR THEN
      BEGIN
        SKEMA(2*I-1):='ü';
        AKTWEEK:=ARBEDAG.UGENR;
        WRITE(ARBEDAG.UGENR MOD 100:2)
      END
      ELSE WRITE(' ':2);
      NEXTREC(ARBEDAG.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(ARBEDAG.A)
    END;
    WRITELN(' Leveres');
    WRITE('Nr Ordre Betegnelse ');
    ARBEDAG.NR:=PSTARTDAG;
    GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
    AKTDAG:=0;
    AKTWEEK:=0;
    FOR I:=1 TO 25 DO
    BEGIN
      IF AKTWEEK<>ARBEDAG.UGENR THEN
      BEGIN AKTDAG:=0; AKTWEEK:=ARBEDAG.UGENR END;
      IF AKTDAG<5 THEN
      BEGIN
        AKTDAG:=AKTDAG+1;
        WRITE(AKTDAG:2)
      END
      ELSE WRITE(' ':2);
      NEXTREC(ARBEDAG.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(ARBEDAG.A)
    END;
    WRITELN(' Uge  ant');
    FRA:=1
  END;
  FOR I:=FRA TO TIL DO
  WITH REBELIN(REBENR(I)),REBXTRA(REBENR(I)) DO
  BEGIN
    GOTOXY(1,I+2);
    WRITE(I:2,ORDRENR:6,' ',BETEGN,SKEMA);
    IF (STARTDAG-PSTARTDAG) IN (.0..24.) THEN
    BEGIN
      GOTOXY(21+2*(STARTDAG-PSTARTDAG),I+2);
      IF STTIME>4 THEN WRITE(' ');
      IF STARTDAG-PSTARTDAG+(VARIGHED-1) DIV 8<26 THEN
        REST:=VARIGHED
      ELSE
        REST:=200-(STARTDAG-PSTARTDAG)*8;
      CASE STTIME MOD 4 OF
      0:BEGIN C:=40;REST:=REST-1 END;
      2:CASE VARIGHED OF
        1:BEGIN C:=36;REST:=REST-1 END;
        2:BEGIN C:=38;REST:=REST-2 END;
        OTHERWISE BEGIN C:=46;REST:=REST-3 END;
      3:IF VARIGHED=1 THEN BEGIN C:=34;REST:=REST-1 END
        ELSE BEGIN C:=42;REST:=REST-2 END;
      OTHERWISE C:=0;
      IF C>0 THEN
      BEGIN
        CH:=CHR(C);
        WRITE(ESC,CH)
      END;
      CH:=CHR(47);
      WHILE REST>3 DO
      BEGIN
        WRITE(ESC,CH);
        REST:=REST-4
      END;
      CASE REST OF
      1:C:=33;
      2:C:=37;
      3:C:=39;
      OTHERWISE C:=0;
      IF C>0 THEN
      BEGIN
        CH:=CHR(C);
        WRITE(ESC,CH)
      END 
    END;
    GOTOXY(72,I+2);
    IF BEKRÆLEV>0 THEN
      WRITE(BEKRÆLEV MOD 100:2,'!')
    ELSE
      WRITE(ØNSKLEV MOD 100:2,' ');
    WRITE(ANTALBES:5:-2)
  END
END;
(*$P*)
PROCEDURE GETBELAST;
BEGIN
  REBELAST.NR:=POST.RESSOURCE;
  REBELAST.STARTDAG:=PSTARTDAG;
  REBELAST.ORDRENR:=0;
  NEXTREC(REBELAST.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(REBELAST.A);
  IER:=0;
  ANTLINE:=0;
  UDE:=0; (*FLYTTET TIL ANDEN RESSOURCE*)
  WHILE (IER=0) AND (REBELAST.NR=POST.RESSOURCE) AND
        (REBELAST.STARTDAG-PSTARTDAG<25) AND (ANTLINE<20) DO
  BEGIN
    ANTLINE:=ANTLINE+1;
    REBENR(ANTLINE):=ANTLINE;
(*$R-*)
    MOVELEFT(REBELAST.A(1),REBELIN(ANTLINE).A(1),18);
(*$R+*)
    EMNE.NR:=REBELAST.EMNENR;
    GETREC(EMNE.A);CHECK0(EMNE.A);
    MOVELEFT(EMNE.BETEGN(1),REBXTRA(ANTLINE).BETEGN(1),10);
    ORDRE.NR:=REBELAST.ORDRENR;
    ORDRE.EMNENR:=REBELAST.EMNENR;
    GETREC(ORDRE.A);CHECK0(ORDRE.A);
    REBXTRA(ANTLINE).BEKRÆLEV:=ORDRE.BEKRÆLEV;
    IF ORDRE.BEKRÆLEV>0 THEN
      REBXTRA(ANTLINE).ØNSKLEV:=ORDRE.BEKRÆLEV 
    ELSE
      REBXTRA(ANTLINE).ØNSKLEV:=ORDRE.ØNSKLEV;
    REBXTRA(ANTLINE).ANTALBES:=ORDRE.ANTALBES;
    REBXTRA(ANTLINE).PLANLAGT:=FALSE;
    NEXTREC(REBELAST.A)
  END;
  IF NOT (-IER IN (.0,2,9.)) THEN ERROR(REBELAST.A)
END;
(*$P*)
PROCEDURE ÆSTART;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(5));IF LINIENR>ANTLINE THEN EXIT(ÆSTART);
  LÆSFELT(PICTURE(6));
  IF UGE IN (.1..20.) THEN
  BEGIN
    IF UGE>ANTLINE THEN EXIT(ÆSTART);
    IF UGE<LINIENR THEN UGE:=UGE-1;
    WITH REBELIN(REBENR(LINIENR)) DO
    IF UGE=0 THEN
    BEGIN
      STARTDAG:=PSTARTDAG;
      STTIME:=1
    END
    ELSE
    BEGIN
      STARTDAG:=REBELIN(REBENR(UGE)).STARTDAG+
                REBELIN(REBENR(UGE)).VARIGHED DIV 8;
      STTIME:=REBELIN(REBENR(UGE)).STTIME+
              REBELIN(REBENR(UGE)).VARIGHED MOD 8;
      IF STTIME>8 THEN
      BEGIN
        STARTDAG:=STARTDAG+1;
        STTIME:=STTIME-8
      END
    END;
    IF UGE>LINIENR THEN
    BEGIN
      HUSK:=REBENR(LINIENR);
      FOR I:=LINIENR TO UGE-1 DO REBENR(I):=REBENR(I+1);
      REBENR(UGE):=HUSK;
      RESSBILLEDE(LINIENR,UGE)
    END
    ELSE
    BEGIN
      HUSK:=REBENR(LINIENR);
      FOR I:=LINIENR DOWNTO UGE+2 DO REBENR(I):=REBENR(I-1);
      REBENR(UGE+1):=HUSK;
      RESSBILLEDE(UGE+1,LINIENR)
    END
  END
  ELSE
  BEGIN
    LÆSFELT(PICTURE(7));
    LÆSFELT(PICTURE(8));
    WITH REBELIN(REBENR(LINIENR)) DO
    BEGIN
      HUSKTID:=8*STARTDAG+STTIME;
      UGEDAG.UGENR:=UGE;
      GETREC(UGEDAG.A);IF IER=-6 THEN EXIT(ÆSTART);CHECK0(UGEDAG.A);
      STARTDAG:=UGEDAG.ARBDAGNR+DAG-1;
      STTIME:=TIME;
      IF HUSKTID<8*STARTDAG+STTIME THEN DIRECTION:=1 ELSE DIRECTION:=-1;
      HUSKTID:=8*STARTDAG+STTIME;
      I:=LINIENR;
      IF ((I=1) AND (DIRECTION=-1))
         OR ((I=ANTLINE) AND (DIRECTION=1)) THEN DIRECTION:=0;
      HUSK:=REBENR(I);
      WHILE DIRECTION*HUSKTID>
      DIRECTION*(REBELIN(REBENR(I+DIRECTION)).STARTDAG*8+
                REBELIN(REBENR(I+DIRECTION)).STTIME) DO 
      BEGIN
        REBENR(I):=REBENR(I+DIRECTION);
        I:=I+DIRECTION;
        IF ((I=1) AND (DIRECTION=-1))
           OR ((I=ANTLINE) AND (DIRECTION=1)) THEN DIRECTION:=0
      END;
      REBENR(I):=HUSK;
      IF I<LINIENR THEN RESSBILLEDE(I,LINIENR) ELSE RESSBILLEDE(LINIENR,I)
    END
  END
 END
END; 
(*$P*)
PROCEDURE ÆVARIG;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(5));IF LINIENR>ANTLINE THEN EXIT(ÆVARIG);
  VARIGHED:=REBELIN(REBENR(LINIENR)).VARIGHED;
  LÆSFELT(PICTURE(9));
  REBELIN(REBENR(LINIENR)).VARIGHED:=VARIGHED;
  RESSBILLEDE(LINIENR,LINIENR)
 END
END;
(*$P*)
PROCEDURE ÆRESS;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(5));IF LINIENR>ANTLINE THEN EXIT(ÆRESS);
  HUSK:=POST.RESSOURCE;
  LÆSFELT(PICTURE(1));
  RESS.NR:=POST.RESSOURCE;
  POST.RESSOURCE:=HUSK;
  GETREC(RESS.A);IF IER=-6 THEN EXIT(ÆRESS) ELSE CHECK0(RESS.A);
  REBELIN(REBENR(LINIENR)).NR:=RESS.NR;
  HUSK:=REBENR(LINIENR);
  FOR I:=LINIENR TO ANTLINE-1 DO REBENR(I):=REBENR(I+1);
  REBENR(ANTLINE):=HUSK;
  D(ANTLINE+2,1);
  ANTLINE:=ANTLINE-1;
  UDE:=UDE+1;
  RESSBILLEDE(LINIENR,ANTLINE)
 END
END;
(*$P*)
PROCEDURE SEKVUDL;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(10));IF FRALINIE>ANTLINE THEN EXIT(SEKVUDL);
  IF FRALINIE=0 THEN
  BEGIN
    TILLINIE:=ANTLINE;
    REBELIN(REBENR(1)).STARTDAG:=PSTARTDAG;
    REBELIN(REBENR(1)).STTIME:=1;
    FRALINIE:=1
  END;
  LÆSFELT(PICTURE(11));IF TILLINIE>ANTLINE THEN EXIT(SEKVUDL);
  I:=FRALINIE;
  IF FRALINIE<TILLINIE THEN
  BEGIN
    WHILE I<TILLINIE DO
    BEGIN
      WITH REBELIN(REBENR(I)) DO
      HUSKTID:=STARTDAG*8+
               STTIME+
               VARIGHED;
      WITH REBELIN(REBENR(I+1)) DO
      BEGIN
        STARTDAG:=(HUSKTID-1) DIV 8;
        STTIME:=(HUSKTID-1) MOD 8 +1
      END;
      I:=I+1
    END;
    RESSBILLEDE(FRALINIE,TILLINIE)
  END
  ELSE
  BEGIN
    WHILE I>TILLINIE DO
    BEGIN
      WITH REBELIN(REBENR(I)) DO
      HUSKTID:=STARTDAG*8+
               STTIME;
      WITH REBELIN(REBENR(I-1)) DO
      BEGIN
        HUSKTID:=HUSKTID-VARIGHED;
        STARTDAG:=(HUSKTID-1) DIV 8;
        STTIME:=(HUSKTID-1) MOD 8 +1
      END;
      I:=I-1
    END;
    RESSBILLEDE(TILLINIE,FRALINIE)
  END;
 END
END;
(*$P*)
PROCEDURE CHECKPLAN;
VAR K,THISSTART,THISSLUT,LASTSTART,LASTSLUT,DIFF:INTEGER;
    PRODLINE:ARRAY (1..50) OF ARRAY (1..4) OF INTEGER;
 
PROCEDURE NU(ORDRE,EMNE,OPERA:INTEGER);
BEGIN
  D(24,1);
  WRITE('Nu behandles:  Ordre',ORDRE:5,' Emne',EMNE:5,' Operation',OPERA:5)
END;
 
BEGIN   (*CHECKPLAN*)
  CHECKOK:=TRUE;
  FOR I:=1 TO ANTLINE+UDE DO
  WITH REBELIN(REBENR(I)) DO
  IF NOT REBXTRA(REBENR(I)).PLANLAGT THEN
  BEGIN
    NU(ORDRENR,EMNENR,OPERANR);
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVNR;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    IF STARTDAG*8+STTIME<PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000 THEN
    BEGIN
      (*OPERATIONEN ER LAGT TIDLIGERE, CHECK FORANLIGGENDE OPERATIONER*)
      PROD.SEKVENSN:=0;
      PROD.OPERANR:=0;
      J:=0;
      NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE PROD.OPERANR<>OPERANR DO
      BEGIN
        J:=J+1;
        PRODLINE(J,1):=PROD.SEKVENSN;
        PRODLINE(J,2):=PROD.OPERANR;
        PRODLINE(J,3):=PROD.STARTTID;
        PRODLINE(J,4):=PROD.VARIGHED;
        NEXTREC(PROD.A);CHECK0(PROD.A)
      END;
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      WHILE J>0 DO
      BEGIN
        THISSTART:=PRODLINE(J,3) MOD 1000*8+PRODLINE(J,3) DIV 1000;
        THISSLUT:=THISSTART+PRODLINE(J,4);
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT<DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF>0 THEN
          J:=0
        ELSE
        BEGIN
          NU(PROD.ORDRENR,PROD.EMNENR,PRODLINE(J,2));
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          FOR K:=I+1 TO ANTLINE+UDE DO
          WITH REBELIN(REBENR(K)) DO
          IF (ORDRENR=PROD.ORDRENR) AND
             (EMNENR=PROD.EMNENR) AND
             (SEKVNR=PRODLINE(J,1)) AND
             (OPERANR=PRODLINE(J,2)) THEN
          BEGIN
            STARTDAG:=(LASTSTART-1) DIV 8;
            STTIME:=(LASTSTART-1) MOD 8+1;
            REBXTRA(REBENR(I)).PLANLAGT:=TRUE
          END
        END;
        J:=J-1;
        (*CHECK FRA I+1 TIL ANTLINE+UDE OM DENNE PROD ER PÅ PLANLÆGNINGSSIDEN,
          DEN SKAL I SÅ FALD HAVE ÆNDRET TIDEN, PLANLAGT:=TRUE, SORTERES IND
          PÅ PLADS SOM I ÆSTART*)
      END;
      IF J=0 THEN
      BEGIN
        ARBEDAG.NR:=(LASTSTART-1) DIV 8;        (*!*)
        GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
        IF ARBEDAG.DATO(1)*10000.0+ARBEDAG.DATO(2)<
           DAGSDATO(1)*10000.0+DAGSDATO(2) THEN
        BEGIN
          GOTOXY(1,23);
          WRITE('Startdato ligger før dagsdato, RETURN ');
          READLN;
          CHECKOK:=FALSE;
          EXIT(CHECKPLAN)
        END
      END
    END;
    IF STARTDAG*8+STTIME+VARIGHED>PROD.STARTTID MOD 1000*8+PROD.VARIGHED+
                                  PROD.STARTTID DIV 1000                 THEN
    BEGIN
      (*OPERATIONEN SLUTTER SENERE END PLANLAGT, CHECK EFTERFØLGENDE*)
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE (IER=0) AND (PROD.ORDRENR=ORDRENR) AND (PROD.EMNENR=EMNENR) DO
      BEGIN
        THISSTART:=PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000;
        THISSLUT:=THISSTART+PROD.VARIGHED;
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT>DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF<0 THEN
          IER:=-1
        ELSE
        BEGIN
          NU(PROD.ORDRENR,PROD.EMNENR,PROD.OPERANR);
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          FOR K:=I+1 TO ANTLINE+UDE DO
          WITH REBELIN(REBENR(K)) DO
          IF (ORDRENR=PROD.ORDRENR) AND
             (EMNENR=PROD.EMNENR) AND
             (SEKVNR=PROD.SEKVENSN) AND
             (OPERANR=PROD.OPERANR) THEN
          BEGIN
            STARTDAG:=(LASTSTART-1) DIV 8;
            STTIME:=(LASTSTART-1) MOD 8+1;
            REBXTRA(REBENR(I)).PLANLAGT:=TRUE
          END;
        (*CHECK FRA I+1 TIL ANTLINE+UDE OM DENNE PROD ER PÅ PLANLÆGNINGSSIDEN,
          DEN SKAL I SÅ FALD HAVE ÆNDRET TIDEN, PLANLAGT:=TRUE, SORTERES IND
          PÅ PLADS SOM I ÆSTART*)
          NEXTREC(PROD.A)
        END
      END;
      IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IF IER<>-1 THEN
      BEGIN
        ARBEDAG.NR:=(LASTSLUT-1) DIV 8;
        GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
        IF ARBEDAG.UGENR>REBXTRA(REBENR(I)).ØNSKLEV THEN
        BEGIN
          IF QJN('Skal leveringsuge rykkes') IN JA THEN
          BEGIN
            REBXTRA(REBENR(I)).ØNSKLEV:=ARBEDAG.UGENR;
            IF REBXTRA(REBENR(I)).BEKRÆLEV>0 THEN
              REBXTRA(REBENR(I)).BEKRÆLEV:=ARBEDAG.UGENR
          END
          ELSE
          BEGIN
            CHECKOK:=FALSE;
            EXIT(CHECKPLAN)
          END
        END
      END
    END
  END
  ELSE
    REBXTRA(REBENR(I)).PLANLAGT:=FALSE
END;
(*$P*)
PROCEDURE UDFPLAN;
VAR K,THISSTART,THISSLUT,LASTSTART,LASTSLUT,DIFF:INTEGER;
    PRODLINE:ARRAY (1..50) OF ARRAY (1..4) OF INTEGER;
 
PROCEDURE NU(ORDRE,EMNE,OPERA:INTEGER);
BEGIN
  D(24,1);
  WRITE('Nu behandles:  Ordre',ORDRE:5,' Emne',EMNE:5,' Operation',OPERA:5)
END;
 
PROCEDURE DESERVER(VAR RESSNR:INTEGER);
BEGIN
  IF RESSNR>0 THEN
  WITH REBELAST DO
  BEGIN
    RESS.NR:=RESSNR;
    GETREC(RESS.A);CHECK0(RESS.A);
    IF RESS.RESSTYPE>0 THEN 
    BEGIN
      NR:=RESSNR;
      GOTOXY(52,24);WRITE('Ressource',NR:5);
      ORDRENR:=PROD.ORDRENR;
      EMNENR:=PROD.EMNENR;
      OPERANR:=PROD.OPERANR;
      SEKVNR:=PROD.SEKVENSN;
      STARTDAG:=PROD.STARTTID MOD 1000;
      STTIME:=PROD.STARTTID DIV 1000;
      VARIGHED:=PROD.VARIGHED;
      GETRECX(A);CHECK0(A);
      DELETE(A);CHECK0(A)
    END
  END
END;
(*$P*)
PROCEDURE RESERVER(VAR RESSNR:INTEGER);
BEGIN
  IF RESSNR>0 THEN
  WITH REBELAST DO
  BEGIN
    RESS.NR:=RESSNR;
    GETREC(RESS.A);CHECK0(RESS.A);
    IF RESS.RESSTYPE>0 THEN 
    BEGIN
      NR:=RESSNR;
      GOTOXY(52,24);WRITE('Ressource',NR:5);
      ORDRENR:=PROD.ORDRENR;
      EMNENR:=PROD.EMNENR;
      OPERANR:=PROD.OPERANR;
      SEKVNR:=PROD.SEKVENSN;
      STARTDAG:=PROD.STARTTID MOD 1000;
      STTIME:=PROD.STARTTID DIV 1000;
      VARIGHED:=PROD.VARIGHED;
      INSERT(A);CHECK0(A)
    END
  END
END;
(*$P*)
 
BEGIN
  CHECKOK:=TRUE;
  FOR I:=1 TO ANTLINE+UDE DO
  WITH REBELIN(REBENR(I)) DO
  IF NOT REBXTRA(REBENR(I)).PLANLAGT THEN
  BEGIN
    NU(ORDRENR,EMNENR,OPERANR);
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVNR;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    DESERVER(PROD.RESS1);
    DESERVER(PROD.RESS2);
    DESERVER(PROD.RESS3);
    IF STARTDAG*8+STTIME<PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000 THEN
    BEGIN
      (*OPERATIONEN ER LAGT TIDLIGERE, CHECK FORANLIGGENDE OPERATIONER*)
      PROD.SEKVENSN:=0;
      PROD.OPERANR:=0;
      J:=0;
      NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE PROD.OPERANR<>OPERANR DO
      BEGIN
        J:=J+1;
        PRODLINE(J,1):=PROD.SEKVENSN;
        PRODLINE(J,2):=PROD.OPERANR;
        PRODLINE(J,3):=PROD.STARTTID;
        PRODLINE(J,4):=PROD.VARIGHED;
        NEXTREC(PROD.A);CHECK0(PROD.A)
      END;
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      WHILE J>0 DO
      BEGIN
        THISSTART:=PRODLINE(J,3) MOD 1000*8+PRODLINE(J,3) DIV 1000;
        THISSLUT:=THISSTART+PRODLINE(J,4);
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT<DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF>0 THEN
          J:=0
        ELSE
        BEGIN
          NU(ORDRENR,EMNENR,PRODLINE(J,2));
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          PROD.ORDRENR:=ORDRENR;
          PROD.EMNENR:=EMNENR;
          PROD.SEKVENSN:=PRODLINE(J,1);
          PROD.OPERANR:=PRODLINE(J,2);
          GETRECX(PROD.A);CHECK0(PROD.A);
          DESERVER(PROD.RESS1);
          DESERVER(PROD.RESS2);
          DESERVER(PROD.RESS3);
          PROD.STARTTID:=(LASTSTART-1) DIV 8+((LASTSTART-1) MOD 8+1)*1000;
          RESERVER(PROD.RESS1);
          RESERVER(PROD.RESS2);
          RESERVER(PROD.RESS3);
          FOR K:=I+1 TO ANTLINE+UDE DO
          WITH REBELIN(REBENR(K)) DO
          IF (ORDRENR=PROD.ORDRENR) AND
             (EMNENR=PROD.EMNENR) AND
             (SEKVNR=PROD.SEKVENSN) AND
             (OPERANR=PROD.OPERANR) THEN
          BEGIN
            STARTDAG:=(LASTSTART-1) DIV 8;
            STTIME:=(LASTSTART-1) MOD 8+1;
            REBXTRA(REBENR(I)).PLANLAGT:=TRUE
          END;
          PUTREC(PROD.A);CHECK0(PROD.A)
        END;
        J:=J-1
        (*CHECK FRA I+1 TIL ANTLINE+UDE OM DENNE PROD ER PÅ PLANLÆGNINGSSIDEN,
          DEN SKAL I SÅ FALD HAVE ÆNDRET TIDEN, PLANLAGT:=TRUE, SORTERES IND
          PÅ PLADS SOM I ÆSTART*)
      END
    END;
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVNR;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    IF STARTDAG*8+STTIME+VARIGHED>PROD.STARTTID MOD 1000*8+PROD.VARIGHED+
                                  PROD.STARTTID DIV 1000                 THEN
    BEGIN
      (*OPERATIONEN SLUTTER SENERE END PLANLAGT, CHECK EFTERFØLGENDE*)
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      NEXTRECX(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE (IER=0) AND (PROD.ORDRENR=ORDRENR) AND (PROD.EMNENR=EMNENR) DO
      BEGIN
        THISSTART:=PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000;
        THISSLUT:=THISSTART+PROD.VARIGHED;
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT>DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF<0 THEN
          IER:=-1
        ELSE
        BEGIN
          NU(PROD.ORDRENR,PROD.EMNENR,PROD.OPERANR);
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          DESERVER(PROD.RESS1);
          DESERVER(PROD.RESS2);
          DESERVER(PROD.RESS3);
          PROD.STARTTID:=(LASTSTART-1) DIV 8+((LASTSTART-1) MOD 8+1)*1000;
          RESERVER(PROD.RESS1);
          RESERVER(PROD.RESS2);
          RESERVER(PROD.RESS3);
          FOR K:=I+1 TO ANTLINE+UDE DO
          WITH REBELIN(REBENR(K)) DO
          IF (ORDRENR=PROD.ORDRENR) AND
             (EMNENR=PROD.EMNENR) AND
             (SEKVNR=PROD.SEKVENSN) AND
             (OPERANR=PROD.OPERANR) THEN
          BEGIN
            STARTDAG:=(LASTSTART-1) DIV 8;
            STTIME:=(LASTSTART-1) MOD 8+1;
            REBXTRA(REBENR(I)).PLANLAGT:=TRUE
          END;
          PUTREC(PROD.A);CHECK0(PROD.A);
        (*CHECK FRA I+1 TIL ANTLINE+UDE OM DENNE PROD ER PÅ PLANLÆGNINGSSIDEN,
          DEN SKAL I SÅ FALD HAVE ÆNDRET TIDEN, PLANLAGT:=TRUE, SORTERES IND
          PÅ PLADS SOM I ÆSTART*)
          NEXTRECX(PROD.A)
        END
      END;
      IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A) 
    END;
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVNR;
    PROD.OPERANR:=OPERANR;
    GETRECX(PROD.A);CHECK0(PROD.A);
    PROD.STARTTID:=STARTDAG+1000*STTIME;
    PROD.VARIGHED:=VARIGHED;
    IF PROD.RESS1=POST.RESSOURCE THEN PROD.RESS1:=NR;
    IF PROD.RESS2=POST.RESSOURCE THEN PROD.RESS2:=NR;
    IF PROD.RESS3=POST.RESSOURCE THEN PROD.RESS3:=NR;
    RESERVER(PROD.RESS1);
    RESERVER(PROD.RESS2);
    RESERVER(PROD.RESS3);
    PUTREC(PROD.A);CHECK0(PROD.A);
    ORDRE.NR:=ORDRENR;
    ORDRE.EMNENR:=EMNENR;
    GETRECX(ORDRE.A);CHECK0(ORDRE.A);
    ORDRE.BEKRÆLEV:=REBXTRA(REBENR(I)).ØNSKLEV;
    PUTREC(ORDRE.A);CHECK0(ORDRE.A)
  END
END;
(*$P*)
PROCEDURE AFSLUT;
BEGIN
  IF QJN('Ønskes check og ændringer foretaget') IN JA THEN
  BEGIN
    GETRECX(SYSTEM.A);CHECK0(SYSTEM.A);
    CHECKPLAN;
    IF CHECKOK THEN 
    BEGIN
      UDFPLAN;
      GETBELAST;
      RESSBILLEDE(0,ANTLINE)
    END
    ELSE CH(1):='5';
    PUTREC(SYSTEM.A);CHECK0(SYSTEM.A)
  END
END;
(*$P*)
BEGIN (*RESSPLAN*)
 CHECKOK:=FALSE;
 REPEAT
  LÆSFELT(PICTURE(1));
  IF POST.RESSOURCE=0 THEN EXIT(RESSPLAN);
  RESS.NR:=POST.RESSOURCE;
  GETREC(RESS.A);IF NOT (-IER IN (.0,6.)) THEN ERROR(RESS.A);
  IF IER=-6 THEN BEGIN NONEXIST('Ressourcen'); EXIT(RESSPLAN) END;
  GETBELAST;
  RESSBILLEDE(0,ANTLINE);
  REPEAT
    D(23,2);
    WRITELN('Ændring af 1: Starttid 2: Varighed 3: Ressource',
            '           Vælg 1-6');
    WRITE('4: Sekventiel udlægning  5: Check plan  6: Afslut');
    REPEAT
      CH:='1';
      GOTOXY(75,23);
      EDIT(CH)
    UNTIL CH(1) IN (.'1'..'6'.);
    CASE CH(1) OF
    '1':ÆSTART;
    '2':ÆVARIG;
    '3':ÆRESS;
    '4':SEKVUDL;
    '5':BEGIN CHECKPLAN;RESSBILLEDE(0,ANTLINE) END;
    '6':AFSLUT
    END
  UNTIL CH(1)='6'
 UNTIL POST.RESSOURCE=0
END;
(*$P*)
PROCEDURE ORDREPLAN;
VAR CH:STRING(1);
    CHECKOK:BOOLEAN;
    SKEMA:PACKED ARRAY (1..52) OF CHAR;
    REBXTRA:ARRAY (1..20) OF REBEXTRA;
    ORDENR:ARRAY (1..20) OF INTEGER;
    ORDELIN:ARRAY (1..20) OF PRODPOST;
 
PROCEDURE ORDBILLEDE(FRA,TIL:INTEGER); (*FRA=0 => ALLE + HOVED*)
VAR I,AKTWEEK,AKTDAG,STARTDAG,STTIME,
    REST,C:INTEGER;
    ESC:PACKED ARRAY (1..2) OF CHAR;
    CH:CHAR;
BEGIN
  ESC:=' N';ESC(1):=CHR(27);
  IF FRA=0 THEN
  BEGIN
    CLEARSCREEN;
    SKEMA:='ü                                                  ü';
    WRITE('Ordrenr  :',ORDRE.NR:5,' ':5);
    ARBEDAG.NR:=PSTARTDAG;
    GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
    AKTWEEK:=0;
    FOR I:=1 TO 25 DO
    BEGIN
      IF AKTWEEK<>ARBEDAG.UGENR THEN
      BEGIN
        SKEMA(2*I-1):='ü';
        AKTWEEK:=ARBEDAG.UGENR;
        WRITE(ARBEDAG.UGENR MOD 100:2)
      END
      ELSE WRITE(' ':2);
      NEXTREC(ARBEDAG.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(ARBEDAG.A)
    END;
    WRITELN(' Leveres');
    WRITE('Nr Opera Betegnelse ');
    ARBEDAG.NR:=PSTARTDAG;
    GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
    AKTDAG:=0;
    AKTWEEK:=0;
    FOR I:=1 TO 25 DO
    BEGIN
      IF AKTWEEK<>ARBEDAG.UGENR THEN
      BEGIN AKTDAG:=0; AKTWEEK:=ARBEDAG.UGENR END;
      IF AKTDAG<5 THEN
      BEGIN
        AKTDAG:=AKTDAG+1;
        WRITE(AKTDAG:2)
      END
      ELSE WRITE(' ':2);
      NEXTREC(ARBEDAG.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(ARBEDAG.A)
    END;
    WRITELN(' Uge  ant');
    FRA:=1
  END;
  FOR I:=FRA TO TIL DO
  WITH ORDELIN(ORDENR(I)),REBXTRA(ORDENR(I)) DO
  BEGIN
    STARTDAG:=STARTTID MOD 1000;STTIME:=STARTTID DIV 1000;
    GOTOXY(1,I+2);
    WRITE(I:2,OPERANR:6,' ',BETEGN,SKEMA);
    IF (STARTDAG-PSTARTDAG) IN (.0..24.) THEN
    BEGIN
      GOTOXY(21+2*(STARTDAG-PSTARTDAG),I+2);
      IF STTIME>4 THEN WRITE(' ');
      IF STARTDAG-PSTARTDAG+(VARIGHED-1) DIV 8<26 THEN
        REST:=VARIGHED
      ELSE
        REST:=200-(STARTDAG-PSTARTDAG)*8;
      CASE STTIME MOD 4 OF
      0:BEGIN C:=40;REST:=REST-1 END;
      2:CASE VARIGHED OF
        1:BEGIN C:=36;REST:=REST-1 END;
        2:BEGIN C:=38;REST:=REST-2 END;
        OTHERWISE BEGIN C:=46;REST:=REST-3 END;
      3:IF VARIGHED=1 THEN BEGIN C:=34;REST:=REST-1 END
        ELSE BEGIN C:=42;REST:=REST-2 END;
      OTHERWISE C:=0;
      IF C>0 THEN
      BEGIN
        CH:=CHR(C);
        WRITE(ESC,CH)
      END;
      CH:=CHR(47);
      WHILE REST>3 DO
      BEGIN
        WRITE(ESC,CH);
        REST:=REST-4
      END;
      CASE REST OF
      1:C:=33;
      2:C:=37;
      3:C:=39;
      OTHERWISE C:=0;
      IF C>0 THEN
      BEGIN
        CH:=CHR(C);
        WRITE(ESC,CH)
      END 
    END;
    GOTOXY(72,I+2);
    IF BEKRÆLEV>0 THEN
      WRITE(BEKRÆLEV MOD 100:2,'!')
    ELSE
      WRITE(ØNSKLEV MOD 100:2,' ');
    WRITE(ORDRE.ANTALBES:5:-2)
  END
END;
(*$P*)
PROCEDURE GETPROD;
BEGIN
  PROD.ORDRENR:=POST.ORDRE;
  PROD.EMNENR:=POST.EMNENR;
  PROD.SEKVENSN:=0;
  PROD.OPERANR:=0;
  NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
  IER:=0;
  UDE:=0;
  ANTLINE:=0;
  WHILE (IER=0) AND (PROD.ORDRENR=POST.ORDRE) AND (PROD.EMNENR=POST.EMNENR)
    AND (PROD.STARTTID MOD 1000-PSTARTDAG<25) AND (ANTLINE<20) DO
  BEGIN
   IF PROD.STARTTID MOD 1000>=PSTARTDAG THEN
   BEGIN
    ANTLINE:=ANTLINE+1;
    ORDENR(ANTLINE):=ANTLINE;
(*$R-*)
    MOVELEFT(PROD.A(1),ORDELIN(ANTLINE).A(1),42);
(*$R+*)
    OPERA.NR:=PROD.OPERANR;
    GETREC(OPERA.A);CHECK0(OPERA.A);
    MOVELEFT(OPERA.BETEGN(1),REBXTRA(ANTLINE).BETEGN(1),10);
    REBXTRA(ANTLINE).BEKRÆLEV:=ORDRE.BEKRÆLEV;
    IF ORDRE.BEKRÆLEV>0 THEN
      REBXTRA(ANTLINE).ØNSKLEV:=ORDRE.BEKRÆLEV 
    ELSE
      REBXTRA(ANTLINE).ØNSKLEV:=ORDRE.ØNSKLEV;
    REBXTRA(ANTLINE).PLANLAGT:=FALSE;
   END;
   NEXTREC(PROD.A)
  END;
  IF NOT (-IER IN (.0,2,9.)) THEN ERROR(PROD.A)
END;
(*$P*)
PROCEDURE ÆSTART;
VAR GSTTIME,STTIME,DIFF:INTEGER;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(5));IF LINIENR>ANTLINE THEN EXIT(ÆSTART);
  LÆSFELT(PICTURE(6));
  IF UGE IN (.1..20.) THEN
  BEGIN
    IF (UGE>ANTLINE) OR
       (UGE=LINIENR) OR (UGE>LINIENR+1) OR (UGE<LINIENR-1) THEN EXIT(ÆSTART);
    STTIME:=ORDELIN(ORDENR(UGE)).STARTTID DIV 1000+
            ORDELIN(ORDENR(UGE)).STARTTID MOD 1000*8;
    DIFF:=ORDELIN(ORDENR(UGE)).VARIGHED-
          ORDELIN(ORDENR(LINIENR)).VARIGHED;
    IF DIFF*(UGE-LINIENR)<0 THEN STTIME:=STTIME+DIFF
  END
  ELSE
  BEGIN
    LÆSFELT(PICTURE(7));
    LÆSFELT(PICTURE(8));
    UGEDAG.UGENR:=UGE;
    GETREC(UGEDAG.A);IF IER=-6 THEN EXIT(ÆSTART);CHECK0(UGEDAG.A);
    DIFF:=UGEDAG.ARBDAGNR+DAG-1;
    IF (DIFF<PSTARTDAG) OR (DIFF>PSTARTDAG+25) THEN EXIT(ÆSTART);
    STTIME:=DIFF*8+TIME;
    GSTTIME:=ORDELIN(ORDENR(LINIENR)).STARTTID DIV 1000+
             ORDELIN(ORDENR(LINIENR)).STARTTID MOD 1000*8;
    IF (STTIME>GSTTIME) AND (LINIENR<ANTLINE) THEN
    BEGIN
      IF STTIME>ORDELIN(ORDENR(LINIENR+1)).STARTTID DIV 1000+ 
                ORDELIN(ORDENR(LINIENR+1)).STARTTID MOD 1000*8 THEN
         STTIME:=ORDELIN(ORDENR(LINIENR+1)).STARTTID DIV 1000+ 
                 ORDELIN(ORDENR(LINIENR+1)).STARTTID MOD 1000*8;
      DIFF:=ORDELIN(ORDENR(LINIENR+1)).STARTTID DIV 1000+ 
            ORDELIN(ORDENR(LINIENR+1)).STARTTID MOD 1000*8+
            ORDELIN(ORDENR(LINIENR+1)).VARIGHED-STTIME-
            ORDELIN(ORDENR(LINIENR)).VARIGHED;
      IF DIFF<0 THEN STTIME:=STTIME+DIFF
    END;
    IF (STTIME<GSTTIME) AND (LINIENR>1) THEN
    BEGIN
      IF STTIME<ORDELIN(ORDENR(LINIENR-1)).STARTTID DIV 1000+ 
                ORDELIN(ORDENR(LINIENR-1)).STARTTID MOD 1000*8 THEN
         STTIME:=ORDELIN(ORDENR(LINIENR-1)).STARTTID DIV 1000+ 
                 ORDELIN(ORDENR(LINIENR-1)).STARTTID MOD 1000*8;
      DIFF:=ORDELIN(ORDENR(LINIENR-1)).STARTTID DIV 1000+ 
            ORDELIN(ORDENR(LINIENR-1)).STARTTID MOD 1000*8+
            ORDELIN(ORDENR(LINIENR-1)).VARIGHED-STTIME-
            ORDELIN(ORDENR(LINIENR)).VARIGHED;
      IF DIFF>0 THEN STTIME:=STTIME+DIFF
    END
  END;
  ORDELIN(ORDENR(LINIENR)).STARTTID:=
            (STTIME-1) DIV 8+((STTIME-1) MOD 8+1)*1000;
  ORDBILLEDE(LINIENR,LINIENR)
 END
END; 
(*$P*)
PROCEDURE ÆVARIG;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(5));IF LINIENR>ANTLINE THEN EXIT(ÆVARIG);
  VARIGHED:=ORDELIN(ORDENR(LINIENR)).VARIGHED;
  LÆSFELT(PICTURE(9));
  IF (LINIENR<ANTLINE) AND
     (VARIGHED>ORDELIN(ORDENR(LINIENR)).VARIGHED) THEN
            IF (ORDELIN(ORDENR(LINIENR+1)).STARTTID DIV 1000+ 
                ORDELIN(ORDENR(LINIENR+1)).STARTTID MOD 1000*8+
                ORDELIN(ORDENR(LINIENR+1)).VARIGHED)<
               (ORDELIN(ORDENR(LINIENR)).STARTTID DIV 1000+
                ORDELIN(ORDENR(LINIENR)).STARTTID MOD 1000*8+ 
                                         VARIGHED) THEN EXIT(ÆVARIG);
  IF (LINIENR>1) AND
     (VARIGHED<ORDELIN(ORDENR(LINIENR)).VARIGHED) THEN
            IF (ORDELIN(ORDENR(LINIENR-1)).STARTTID DIV 1000+ 
                ORDELIN(ORDENR(LINIENR-1)).STARTTID MOD 1000*8+
                ORDELIN(ORDENR(LINIENR-1)).VARIGHED)>
               (ORDELIN(ORDENR(LINIENR)).STARTTID DIV 1000+
                ORDELIN(ORDENR(LINIENR)).STARTTID MOD 1000*8+ 
                                         VARIGHED) THEN EXIT(ÆVARIG);
  ORDELIN(ORDENR(LINIENR)).VARIGHED:=VARIGHED;
  ORDBILLEDE(LINIENR,LINIENR)
 END
END;
(*$P*)
PROCEDURE SEKVUDL;
VAR THISSTART,THISSLUT,LASTSTART,LASTSLUT,DIFF:INTEGER;
BEGIN
 WITH POST DO
 BEGIN
  LÆSFELT(PICTURE(10));IF FRALINIE>ANTLINE THEN EXIT(SEKVUDL);
  IF FRALINIE=0 THEN
  BEGIN
    TILLINIE:=ANTLINE;
    ORDELIN(ORDENR(1)).STARTTID:=PSTARTDAG+1000;
    FRALINIE:=1
  END;
  LÆSFELT(PICTURE(11));IF TILLINIE>ANTLINE THEN EXIT(SEKVUDL);
  I:=FRALINIE;
  IF FRALINIE<TILLINIE THEN
  BEGIN
    WHILE I<TILLINIE DO
    BEGIN
      WITH ORDELIN(ORDENR(I)) DO
      HUSKTID:=STARTTID MOD 1000*8+
               STARTTID DIV 1000+
               VARIGHED;
      ORDELIN(ORDENR(I+1)).STARTTID:=(HUSKTID-1) DIV 8 +
                                     ((HUSKTID-1) MOD 8+1)*1000;
      I:=I+1
    END;
    LASTSTART:=HUSKTID;
    LASTSLUT:=ORDELIN(ORDENR(TILLINIE)).VARIGHED+LASTSTART;
    I:=TILLINIE+1;
    WHILE I<=ANTLINE DO
    WITH ORDELIN(ORDENR(I)) DO
    BEGIN
      THISSTART:=STARTTID MOD 1000*8+STARTTID DIV 1000;
      THISSLUT:=THISSTART+VARIGHED;
      DIFF:=LASTSTART-THISSTART;
      IF LASTSLUT-THISSLUT>DIFF THEN DIFF:=LASTSLUT-THISSLUT;
      IF DIFF>0 THEN
      BEGIN
        LASTSTART:=THISSTART+DIFF;
        LASTSLUT:=THISSLUT+DIFF;
        STARTTID:=(LASTSTART-1) DIV 8+((LASTSTART-1) MOD 8+1)*1000;
        I:=I+1
      END
      ELSE I:=ANTLINE+1
    END;
    ORDBILLEDE(FRALINIE,ANTLINE)
  END
  ELSE
  BEGIN
    WHILE I>TILLINIE DO
    BEGIN
      WITH ORDELIN(ORDENR(I)) DO
      HUSKTID:=STARTTID MOD 1000*8+STARTTID DIV 1000;
      WITH ORDELIN(ORDENR(I-1)) DO
      BEGIN
        HUSKTID:=HUSKTID-VARIGHED;
        STARTTID:=(HUSKTID-1) DIV 8 +        
                  ((HUSKTID-1) MOD 8+1)*1000
      END;
      I:=I-1
    END;
    LASTSTART:=HUSKTID;
    LASTSLUT:=ORDELIN(ORDENR(TILLINIE)).VARIGHED+LASTSTART;
    I:=TILLINIE-1;
    WHILE I>0 DO
    WITH ORDELIN(ORDENR(I)) DO
    BEGIN
      THISSTART:=STARTTID MOD 1000*8+STARTTID DIV 1000;
      THISSLUT:=THISSTART+VARIGHED;
      DIFF:=LASTSTART-THISSTART;
      IF LASTSLUT-THISSLUT<DIFF THEN DIFF:=LASTSLUT-THISSLUT;
      IF DIFF<0 THEN
      BEGIN
        LASTSTART:=THISSTART+DIFF;
        LASTSLUT:=THISSLUT+DIFF;
        STARTTID:=(LASTSTART-1) DIV 8+((LASTSTART-1) MOD 8+1)*1000;
        I:=I-1
      END
      ELSE I:=0
    END;
    ORDBILLEDE(1,FRALINIE)
  END;
 END
END;
(*$P*)
PROCEDURE CHECKPLAN;
VAR STARTDAG,STTIME,K,THISSTART,THISSLUT,LASTSTART,LASTSLUT,DIFF:INTEGER;
    PRODLINE:ARRAY (1..50) OF ARRAY (1..4) OF INTEGER;
 
PROCEDURE NU(OPERA:INTEGER);
BEGIN
  D(24,1);
  WRITE('Nu behandles:  Operation',OPERA:5)
END;
 
BEGIN (*CHECKPLAN*)
  CHECKOK:=TRUE;
  WITH ORDELIN(ORDENR(1)) DO
  BEGIN
    STARTDAG:=STARTTID MOD 1000;
    STTIME:=STARTTID DIV 1000;
    NU(OPERANR);
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVENSN;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    IF STARTDAG*8+STTIME<PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000 THEN
    BEGIN
      (*OPERATIONEN ER LAGT TIDLIGERE, CHECK FORANLIGGENDE OPERATIONER*)
      PROD.SEKVENSN:=0;
      PROD.OPERANR:=0;
      J:=0;
      NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE PROD.OPERANR<>OPERANR DO
      BEGIN
        J:=J+1;
        PRODLINE(J,1):=PROD.SEKVENSN;
        PRODLINE(J,2):=PROD.OPERANR;
        PRODLINE(J,3):=PROD.STARTTID;
        PRODLINE(J,4):=PROD.VARIGHED;
        NEXTREC(PROD.A);CHECK0(PROD.A)
      END;
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      WHILE J>0 DO
      BEGIN
        THISSTART:=PRODLINE(J,3) MOD 1000*8+PRODLINE(J,3) DIV 1000;
        THISSLUT:=THISSTART+PRODLINE(J,4);
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT<DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF>0 THEN
          J:=0
        ELSE
        BEGIN
          NU(PRODLINE(J,2));
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF
        END;
        J:=J-1
      END;
      IF J=0 THEN
      BEGIN
        ARBEDAG.NR:=(LASTSTART-1) DIV 8;        (*!*)
        GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
        IF ARBEDAG.DATO(1)*10000.0+ARBEDAG.DATO(2)<
           DAGSDATO(1)*10000.0+DAGSDATO(2) THEN
        BEGIN
          GOTOXY(1,23);
          WRITE('Startdato ligger før dagsdato, RETURN ');
          READLN;
          CHECKOK:=FALSE;
          EXIT(CHECKPLAN)
        END
      END
    END;
  END;
  WITH ORDELIN(ORDENR(ANTLINE)) DO
  BEGIN
    STARTDAG:=STARTTID MOD 1000;
    STTIME:=STARTTID DIV 1000;
    NU(OPERANR);
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVENSN;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    IF STARTDAG*8+STTIME+VARIGHED>PROD.STARTTID MOD 1000*8+PROD.VARIGHED+
                                  PROD.STARTTID DIV 1000                 THEN
    BEGIN
      (*OPERATIONEN SLUTTER SENERE END PLANLAGT, CHECK EFTERFØLGENDE*)
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE (IER=0) AND (PROD.ORDRENR=ORDRENR) AND (PROD.EMNENR=EMNENR) DO
      BEGIN
        THISSTART:=PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000;
        THISSLUT:=THISSTART+PROD.VARIGHED;
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT>DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF<0 THEN
          IER:=-1
        ELSE
        BEGIN
          NU(PROD.OPERANR);
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          NEXTREC(PROD.A)
        END
      END;
      IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IF IER<>-1 THEN
      BEGIN
        ARBEDAG.NR:=(LASTSLUT-1) DIV 8;
        GETREC(ARBEDAG.A);CHECK0(ARBEDAG.A);
        IF ARBEDAG.UGENR>REBXTRA(ORDENR(ANTLINE)).ØNSKLEV THEN
        BEGIN
          IF QJN('Skal leveringsuge rykkes') IN JA THEN
          FOR I:=1 TO ANTLINE DO
          BEGIN
            REBXTRA(ORDENR(I)).ØNSKLEV:=ARBEDAG.UGENR;
            IF REBXTRA(ORDENR(I)).BEKRÆLEV>0 THEN
              REBXTRA(ORDENR(I)).BEKRÆLEV:=ARBEDAG.UGENR
          END
          ELSE
          BEGIN
            CHECKOK:=FALSE;
            EXIT(CHECKPLAN)
          END
        END
      END
    END
  END
END;
(*$P*)
PROCEDURE UDFPLAN;
VAR STARTDAG,STTIME,K,THISSTART,THISSLUT,LASTSTART,LASTSLUT,DIFF:INTEGER;
    PRODLINE:ARRAY (1..50) OF ARRAY (1..4) OF INTEGER;
 
PROCEDURE NU(OPERA:INTEGER);
BEGIN
  D(24,1);
  WRITE('Nu behandles:  Operation',OPERA:5)
END;
 
PROCEDURE DESERVER(VAR RESSNR:INTEGER);
BEGIN
  IF RESSNR>0 THEN
  WITH REBELAST DO
  BEGIN
    RESS.NR:=RESSNR;
    GETREC(RESS.A);CHECK0(RESS.A);
    IF RESS.RESSTYPE>0 THEN 
    BEGIN
      NR:=RESSNR;
      GOTOXY(31,24);WRITE('Ressource',NR:5);
      ORDRENR:=PROD.ORDRENR;
      EMNENR:=PROD.EMNENR;
      OPERANR:=PROD.OPERANR;
      SEKVNR:=PROD.SEKVENSN;
      STARTDAG:=PROD.STARTTID MOD 1000;
      STTIME:=PROD.STARTTID DIV 1000;
      VARIGHED:=PROD.VARIGHED;
      GETRECX(A);CHECK0(A);
      DELETE(A);CHECK0(A)
    END
  END
END;
(*$P*)
PROCEDURE RESERVER(VAR RESSNR:INTEGER);
BEGIN
  IF RESSNR>0 THEN
  WITH REBELAST DO
  BEGIN
    RESS.NR:=RESSNR;
    GETREC(RESS.A);CHECK0(RESS.A);
    IF RESS.RESSTYPE>0 THEN 
    BEGIN
      NR:=RESSNR;
      ORDRENR:=PROD.ORDRENR;
      EMNENR:=PROD.EMNENR;
      OPERANR:=PROD.OPERANR;
      SEKVNR:=PROD.SEKVENSN;
      STARTDAG:=PROD.STARTTID MOD 1000;
      STTIME:=PROD.STARTTID DIV 1000;
      VARIGHED:=PROD.VARIGHED;
      INSERT(A);CHECK0(A)
    END
  END
END;
(*$P*)
 
BEGIN
  FOR I:=1 TO ANTLINE DO
  WITH ORDELIN(ORDENR(I)) DO
  BEGIN
    STARTDAG:=STARTTID MOD 1000;
    STTIME:=STARTTID DIV 1000;
    NU(OPERANR);
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVENSN;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    DESERVER(PROD.RESS1);
    DESERVER(PROD.RESS2);
    DESERVER(PROD.RESS3);
    IF (STARTDAG*8+STTIME<PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000)
       AND (I=1) THEN
    BEGIN
      (*OPERATIONEN ER LAGT TIDLIGERE, CHECK FORANLIGGENDE OPERATIONER*)
      PROD.SEKVENSN:=0;
      PROD.OPERANR:=0;
      J:=0;
      NEXTREC(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE PROD.OPERANR<>OPERANR DO
      BEGIN
        J:=J+1;
        PRODLINE(J,1):=PROD.SEKVENSN;
        PRODLINE(J,2):=PROD.OPERANR;
        PRODLINE(J,3):=PROD.STARTTID;
        PRODLINE(J,4):=PROD.VARIGHED;
        NEXTREC(PROD.A);CHECK0(PROD.A)
      END;
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      WHILE J>0 DO
      BEGIN
        THISSTART:=PRODLINE(J,3) MOD 1000*8+PRODLINE(J,3) DIV 1000;
        THISSLUT:=THISSTART+PRODLINE(J,4);
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT<DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF>0 THEN
          J:=0
        ELSE
        BEGIN
          NU(PRODLINE(J,2));
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          PROD.ORDRENR:=ORDRENR;
          PROD.EMNENR:=EMNENR;
          PROD.SEKVENSN:=PRODLINE(J,1);
          PROD.OPERANR:=PRODLINE(J,2);
          GETRECX(PROD.A);CHECK0(PROD.A);
          DESERVER(PROD.RESS1);
          DESERVER(PROD.RESS2);
          DESERVER(PROD.RESS3);
          PROD.STARTTID:=(LASTSTART-1) DIV 8+((LASTSTART-1) MOD 8+1)*1000;
          RESERVER(PROD.RESS1);
          RESERVER(PROD.RESS2);
          RESERVER(PROD.RESS3);
          PUTREC(PROD.A);CHECK0(PROD.A)
        END;
        J:=J-1
      END
    END;
    STARTDAG:=STARTTID MOD 1000;
    STTIME:=STARTTID DIV 1000;
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVENSN;
    PROD.OPERANR:=OPERANR;
    GETREC(PROD.A);CHECK0(PROD.A);
    IF (STARTDAG*8+STTIME+VARIGHED>PROD.STARTTID MOD 1000*8+PROD.VARIGHED+
                                  PROD.STARTTID DIV 1000) AND (I=ANTLINE) THEN
    BEGIN
      (*OPERATIONEN SLUTTER SENERE END PLANLAGT, CHECK EFTERFØLGENDE*)
      LASTSTART:=STARTDAG*8+STTIME;
      LASTSLUT:=LASTSTART+VARIGHED;
      NEXTRECX(PROD.A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A);
      IER:=0;
      WHILE (IER=0) AND (PROD.ORDRENR=ORDRENR) AND (PROD.EMNENR=EMNENR) DO
      BEGIN
        THISSTART:=PROD.STARTTID MOD 1000*8+PROD.STARTTID DIV 1000;
        THISSLUT:=THISSTART+PROD.VARIGHED;
        DIFF:=LASTSTART-THISSTART;
        IF LASTSLUT-THISSLUT>DIFF THEN DIFF:=LASTSLUT-THISSLUT;
        IF DIFF<0 THEN
          IER:=-1
        ELSE
        BEGIN
          NU(PROD.OPERANR);
          LASTSTART:=THISSTART+DIFF;
          LASTSLUT:=THISSLUT+DIFF;
          DESERVER(PROD.RESS1);
          DESERVER(PROD.RESS2);
          DESERVER(PROD.RESS3);
          PROD.STARTTID:=(LASTSTART-1) DIV 8+((LASTSTART-1) MOD 8+1)*1000;
          RESERVER(PROD.RESS1);
          RESERVER(PROD.RESS2);
          RESERVER(PROD.RESS3);
          PUTREC(PROD.A);CHECK0(PROD.A);
          NEXTRECX(PROD.A)
        END
      END;
      IF NOT (-IER IN (.0..2,9.)) THEN ERROR(PROD.A) 
    END;
    PROD.ORDRENR:=ORDRENR;
    PROD.EMNENR:=EMNENR;
    PROD.SEKVENSN:=SEKVENSN;
    PROD.OPERANR:=OPERANR;
    GETRECX(PROD.A);CHECK0(PROD.A);
    PROD.STARTTID:=STARTTID;
    PROD.VARIGHED:=VARIGHED;
    RESERVER(PROD.RESS1);
    RESERVER(PROD.RESS2);
    RESERVER(PROD.RESS3);
    PUTREC(PROD.A);CHECK0(PROD.A);
    IF I=ANTLINE THEN
    BEGIN
      ORDRE.NR:=ORDRENR;
      ORDRE.EMNENR:=EMNENR;
      GETRECX(ORDRE.A);CHECK0(ORDRE.A);
      ORDRE.BEKRÆLEV:=REBXTRA(ORDENR(I)).ØNSKLEV;
      PUTREC(ORDRE.A);CHECK0(ORDRE.A)
    END
  END
END;
(*$P*)
PROCEDURE AFSLUT;
BEGIN
  IF QJN('Ønskes check og ændringer foretaget') IN JA THEN
  BEGIN
    GETRECX(SYSTEM.A);CHECK0(SYSTEM.A);
    CHECKPLAN;
    IF CHECKOK THEN
    BEGIN
      UDFPLAN;
      GETPROD;
      ORDBILLEDE(0,ANTLINE)
    END
    ELSE CH(1):='4';
    PUTREC(SYSTEM.A);CHECK0(SYSTEM.A)
  END
END;
(*$P*)
BEGIN (*ORDREPLAN*)
 CHECKOK:=FALSE;
 REPEAT
  LÆSFELT(PICTURE(2));
  IF POST.ORDRE=0 THEN EXIT(ORDREPLAN);
  LÆSFELT(PICTURE(3));
  ORDRE.NR:=POST.ORDRE;
  ORDRE.EMNENR:=POST.EMNENR;
  GETREC(ORDRE.A);IF NOT (-IER IN (.0,6.)) THEN ERROR(ORDRE.A);
  IF IER=-6 THEN BEGIN NONEXIST('Ordren'); EXIT(ORDREPLAN) END;
  GETPROD;
  ORDBILLEDE(0,ANTLINE);
  REPEAT
    D(23,2);
    WRITELN('Ændring af 1: Starttid 2: Varighed             ',
            '           Vælg 1-5');
    WRITE('3: Sekventiel udlægning  4: Check plan  5: Afslut');
    REPEAT
      CH:='1';
      GOTOXY(75,23);
      EDIT(CH)
    UNTIL CH(1) IN (.'1'..'5'.);
    CASE CH(1) OF
    '1':ÆSTART;
    '2':ÆVARIG;
    '3':SEKVUDL;
    '4':BEGIN CHECKPLAN;ORDBILLEDE(0,ANTLINE) END;
    '5':AFSLUT
    END
  UNTIL CH(1)='5'
 UNTIL POST.ORDRE=0
END;
(*$P*)
PROCEDURE UDLÆGORDRE;
VAR VARIGHED,TIDSFORB,ØLEVDAG,DAGE,TIMER,STARTTIME,STARTDAY :INTEGER;
 
PROCEDURE RESERVER(VAR RESSNR:INTEGER);
BEGIN
  IF RESSNR<0 THEN
  WITH RESSGRUP DO
  BEGIN
    GRUPNR:=-RESSNR;
    NR:=0;
    REBELAST.GRUPPE:=GRUPNR;
    NEXTREC(A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(A);
    IF GRUPNR=-RESSNR THEN RESSNR:=NR 
  END 
  ELSE REBELAST.GRUPPE:=0;
  IF RESSNR>0 THEN
  WITH REBELAST DO
  BEGIN
    RESS.NR:=RESSNR;
    GETREC(RESS.A);CHECK0(RESS.A);
    IF RESS.RESSTYPE>0 THEN 
    BEGIN
      NR:=RESSNR;
      ORDRENR:=PROD.ORDRENR;
      EMNENR:=PROD.EMNENR;
      OPERANR:=PROD.OPERANR;
      SEKVNR:=PROD.SEKVENSN;
      STARTDAG:=PROD.STARTTID MOD 1000;
      STTIME:=PROD.STARTTID DIV 1000;
      VARIGHED:=PROD.VARIGHED;
      INSERT(A);CHECK0(A)
    END
  END
END;
(*$P*)
BEGIN  (*UDLÆGORDRE*)
  REPEAT
    LÆSFELT(PICTURE(2));
    IF POST.ORDRE=0 THEN EXIT(UDLÆGORDRE);
    LÆSFELT(PICTURE(3));
    ORDRE.NR:=POST.ORDRE;
    ORDRE.EMNENR:=POST.EMNENR;
    GETRECX(ORDRE.A);IF NOT (-IER IN (.0,6.)) THEN ERROR(ORDRE.A);
    IF IER=-6 THEN
      NONEXIST('Ordren')
    ELSE
    BEGIN
      IF ORDRE.BEKRÆLEV<>0 THEN
      BEGIN
        D(23,1);
        WRITE('Ordren er allerede udlagt');
        READLN
      END
      ELSE
      WITH PROD DO
      BEGIN
        ORDRE.BEKRÆLEV:=-1;
        TIDSFORB:=0;
        ORDRENR:=ORDRE.NR;
        EMNENR:=ORDRE.EMNENR;
        SEKVENSN:=0;
        OPERANR:=0;
        NEXTREC(A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(A);
        IER:=0;
        WHILE (IER=0) AND (ORDRENR=ORDRE.NR) AND (EMNENR=ORDRE.EMNENR) DO
        BEGIN
          TIDSFORB:=TIDSFORB+PROD.VARIGHED;
          OPERA.NR:=PROD.OPERANR;
          GETREC(OPERA.A);CHECK0(OPERA.A);
          TIDSFORB:=TIDSFORB+ROUND(OPERA.TILLÆG);
          NEXTREC(A)
        END;
        IF NOT (-IER IN (.0,2,9.)) THEN ERROR(A);
        UGEDAG.UGENR:=ORDRE.ØNSKLEV;
        GETREC(UGEDAG.A);CHECK0(UGEDAG.A);
        ØLEVDAG:=UGEDAG.ARBDAGNR;
        DAGE:=TIDSFORB DIV 8;
        TIMER:=TIDSFORB MOD 8;
        STARTTIME:=1;
        STARTDAY:=ØLEVDAG-DAGE;
        IF TIMER>0 THEN
        BEGIN
          STARTDAY:=STARTDAY-1;
          STARTTIME:=9-TIMER
        END;
        ORDRENR:=ORDRE.NR;
        EMNENR:=ORDRE.EMNENR;
        SEKVENSN:=0;
        OPERANR:=0;
        NEXTRECX(A);IF NOT (-IER IN (.0..2,9.)) THEN ERROR(A);
        IER:=0;
        WHILE (IER=0) AND (ORDRENR=ORDRE.NR) AND (EMNENR=ORDRE.EMNENR) DO
        BEGIN
          OPERA.NR:=PROD.OPERANR;
          GETREC(OPERA.A);CHECK0(OPERA.A);
          GOTOXY(1,24);
          WRITE('Nu behandles operation ',OPERA.BETEGN,OPERA.NR:5);
          IF STARTDAY>=PSTARTDAG THEN
            PROD.STARTTID:=1000*STARTTIME+STARTDAY
          ELSE
            PROD.STARTTID:=1000+PSTARTDAG;
          RESERVER(PROD.RESS1);
          RESERVER(PROD.RESS2);
          RESERVER(PROD.RESS3);
          PUTREC(A);CHECK0(A);
          STARTTIME:=STARTTIME+VARIGHED+ROUND(OPERA.TILLÆG);
          STARTDAY:=STARTDAY+STARTTIME DIV 8;
          STARTTIME:=STARTTIME MOD 8;
          IF STARTTIME=0 THEN
          BEGIN
            STARTDAY:=STARTDAY-1;
            STARTTIME:=8
          END; 
          NEXTRECX(A)
        END;
        IF NOT (-IER IN (.0,2,9.)) THEN ERROR(A);
        D(24,1)
      END;
      PUTREC(ORDRE.A);CHECK0(ORDRE.A)
    END
  UNTIL POST.ORDRE=0
END;
(*$P*)
PROCEDURE MAINTAIN;
VAR CH:CHAR;
BEGIN (*MAINTAIN*)
  REPEAT
    LÆSFELT(PICTURE(4));
    UGEDAG.UGENR:=POST.STARTUGE;
    GETREC(UGEDAG.A);IF NOT (-IER IN (.0,6.)) THEN ERROR(UGEDAG.A);
    IF IER=0 THEN
    BEGIN
      ARBEDAG.NR:=UGEDAG.ARBDAGNR;
      GETREC(ARBEDAG.A);IF NOT (-IER IN (.0,6.)) THEN ERROR(ARBEDAG.A);
      IF (DAGSDATO(1)*10000.0+DAGSDATO(2))>
         (ARBEDAG.DATO(1)*10000.0+ARBEDAG.DATO(2)) THEN IER:=-6
    END
  UNTIL IER=0;
  PSTARTDAG:=UGEDAG.ARBDAGNR;
  CASE OPTION OF
  1:RESSPLAN;
  2:ORDREPLAN;
  3:UDLÆGORDRE
  END
END;
(*$P*)
BEGIN (*REGVEDL*)
  LONGNUL(1):=0;
  LONGNUL(2):=0;
  JA:=(.'J','j'.);
  NEJ:=(.'N','n'.);
  JAOGNEJ:=JA+NEJ;
  CLEARSCREEN;
  LÆSDESC;
  MODE:=3;(*SKRIV*)
  (*$R-*)
  RESS.A(-4):=0;    
  RESSGRUP.A(-4):=0;    
  EMNE.A(-4):=0;    
  OPERA.A(-4):=0;   
  SYSTEM.A(-4):=0;
  PROD.A(-4):=0;             
  ORDRE.A(-4):=0;            
  REBELAST.A(-4):=0;
  UGEDAG.A(-4):=0;
  ARBEDAG.A(-4):=0;
  UGEDAG.A(-3):=21;
  ARBEDAG.A(-3):=22;
  RESS.A(-3):=4;    
  RESSGRUP.A(-3):=3;    
  EMNE.A(-3):=2;    
  OPERA.A(-3):=6;   
  SYSTEM.A(-3):=9;
  PROD.A(-3):=14;     
  ORDRE.A(-3):=10;    
  REBELAST.A(-3):=15;
  (*$R+*)
  (*@@EVT. ÅBNING AF ANDRE ANDRE DATAFILER*)
  IOPEN(SYSTEM.A); CHECK0(SYSTEM.A); 
  IOPEN(ORDRE.A);     CHECK0(ORDRE.A);   
  IOPEN(REBELAST.A);  CHECK0(REBELAST.A);   
  IOPEN(PROD.A);      CHECK0(PROD.A);    
  IOPEN(UGEDAG.A);    CHECK0(UGEDAG.A);
  IOPEN(ARBEDAG.A);   CHECK0(ARBEDAG.A);
  IOPEN(RESS.A);      CHECK0(RESS.A);
  IOPEN(RESSGRUP.A);  CHECK0(RESSGRUP.A);    
  IOPEN(EMNE.A);      CHECK0(EMNE.A);      
  IOPEN(OPERA.A);     CHECK0(OPERA.A);     
  SYSTEM.NR:=0;
  GETREC(SYSTEM.A);CHECK0(SYSTEM.A);
  DAGSDATO:=SYSTEM.DAGSDATO;
  SYSTEM.NR:=1;
  POST.STARTUGE:=0;
  REPEAT
    CLEARSCREEN;
    GOTOXY(1,10);
    WRITELN('0 Færdig');
    WRITELN('1 Ressourceplanlægning');
    WRITELN('2 Ordreplanlægning');
    WRITELN('3 Udlægning af ordre');
    LÆSFELT(PICTURE(13));
    OPTION:=POST.OPTION;
    IF OPTION>0 THEN MAINTAIN
  UNTIL OPTION=0;
 
  ICLOSE(RESS.A);    
  ICLOSE(RESSGRUP.A);    
  ICLOSE(EMNE.A);    
  ICLOSE(OPERA.A);   
  ICLOSE(ORDRE.A);    
  ICLOSE(PROD.A); 
  ICLOSE(REBELAST.A);
  ICLOSE(UGEDAG.A);
  ICLOSE(ARBEDAG.A);
  ICLOSE(SYSTEM.A);
  CLEARSCREEN 
END;
(*$P*)
BEGIN
  SEMAFOR:='ALLOCOMBUF';
  I:=ORD(PARM^(1))-48;
  USERNIVEAU:=MENIG;
  WHILE I>0 DO
  BEGIN
    USERNIVEAU:=SUCC(USERNIVEAU);
    I:=I-1
  END;                                                                 (*$R-*)
  SNYD(-3):=0;
  FOR I:=6 DOWNTO 2 DO SNYD(-3):=10*SNYD(-3)+ORD(PARM^(I))-48;
  IF PARM^(7)='-' THEN SNYD(-3):=-SNYD(-3);                            (*$R+*)
  UDFØR(PTILMELD,SNYD);
  UDFØRT(PTILMELD,SNYD);
  IF IER<>0 THEN BAD(1,IER);
(*@@TILPASSES*)
  DESCNAVN:='PLANPESC:P2:05:J';
  IF RESPRINT THEN
  BEGIN
    REGVEDL; 
    FREEPR
  END;
  UDFØR(PAFMELD,SNYD);
  UDFØRT(PAFMELD,SNYD);
  IF IER<>0 THEN BAD(2,IER);
  FNAVN:='       ';
  FOR I:=1 TO 7 DO FNAVN(I):=PARM^(I);
  CHAIN('HOVED   *1',FNAVN,QUQ);
  IF IORESULT<>0 THEN WRITELN('IORESULT ',IORESULT)
END.

Full view