11. Dezember 2007 14:27
//Fertigungsgaenge erzeugen mithilfe des Arbeitsplans, der in Produktstammdaten hinterlegt
// Rec49: Produktdaten   (liefert Arbeitsplan)
// Rec61: Arbeitsplan                         (liefert Arbeitsplan)
// Rec : Fertigungsauftraege (62)
// Rec63: Arbeitsgaenge zum Auftrag (zu erzeugen)
END_LETZTER_AG := FruehestPlanTermin - 1;     // Endpunkt des letzten Vorgaenger-Arbeitsganges
                                            // gemaess Arbeitsplan
//  AG_END_LAST                             // Endpunkt Arbeitsgang auf Betriebsmittel
// 1. Pruefe, ob Auftrag noch nicht eingeplant
IF Eingeplant THEN ERROR ('Auftrag schon eingeplant!')
ELSE
BEGIN
  // Arbeitsgaenge einzeln einlasten
  rec63.SETRANGE(FA_Nr,Rec.FA_Nr);
  IF NOT rec63.FIND('-') THEN ERROR('keine Arbeitsgaenge einzulasten (63)');
  // Evtl. vorhandene Einplanung des FA loeschen
    rec64.SETRANGE(FA_Nr,Rec.FA_Nr);
    rec64.DELETEALL;
    rec64.SETRANGE(FA_Nr);
  // Schleife ueber (63) einzulastende Arbeitsgaenge
REPEAT
//
// HIER QUELLTEXT FUER DIE EINLASTUNG EINFUEGEN !!!
//
rec64.RESET;
rec61.RESET;
//Betriebsmittel in BM_Belegnung filtern
rec64.SETRANGE(BM_Nr,rec63.BM_Nr);
rec64.SETCURRENTKEY(Start);
//Dauer im Arbeitsplan filtern
rec61.SETFILTER(AP_Nr,rec63.AP_Nr);
rec61.SETFILTER(AG_Nr,rec63.AG_Nr);
rec61.FIND('-');
// Variable geleert
AG_END_LAST := 0D;
AG_START_NEXT := 0D;
// Datensätze in Betriebsmittelbelegung vorhanden?
IF rec64.FIND('-') THEN
  BEGIN
  // Lücke in Betriebsmittelbelegung suchen
  REPEAT
    AG_END_LAST := rec64.Ende;
    // Gibt es einen nächsten Datensatz?
    IF rec64.NEXT > 0 THEN
      BEGIN
      AG_START_NEXT := rec64.Start ;
      // Berechnung
      Dauer := AG_START_NEXT - (AG_END_LAST);
      END
      // Abbruchbedingung, wenn keine DS vorhanden sind
    ELSE
      BEGIN
      Dauer := -1;
      END
  UNTIL (Dauer >= rec61.AG_Dauer) OR (Dauer = -1);
  // Wenn -1, dann ist das Ende der Tabelle erreicht
  IF Dauer = -1 THEN
    BEGIN
    AG_START_NEXT := AG_END_LAST+1;
   // AG_END_LAST := DMY2DATE( (DATE2DMY(AG_START_NEXT,1)+(rec61.AG_Dauer)),(DATE2DMY(AG_START_NEXT,2)),
   // DATE2DMY(AG_START_NEXT,3));
    AG_END_LAST := AG_START_NEXT+rec61.AG_Dauer;
    END
  // Lücke in der Tabelle gefunden
  ELSE
  BEGIN
    AG_START_NEXT := AG_END_LAST+1;
    //AG_END_LAST := DMY2DATE( (DATE2DMY(AG_START_NEXT,1)+(rec61.AG_Dauer)),(DATE2DMY(AG_START_NEXT,2)),
    //DATE2DMY(AG_START_NEXT,3));
    AG_END_LAST := AG_START_NEXT+rec61.AG_Dauer;
  END
  // Tabelle leer, Einfach einfügen
END
  ELSE
  BEGIN
    AG_START_NEXT := END_LETZTER_AG+1;
    //AG_END_LAST := DMY2DATE( (DATE2DMY(AG_START_NEXT,1)+(rec61.AG_Dauer)),(DATE2DMY(AG_START_NEXT,2)),
    //DATE2DMY(AG_START_NEXT,3));
    AG_END_LAST := AG_START_NEXT+rec61.AG_Dauer;
  END;
rec64.BM_Nr := rec63.BM_Nr;
rec64.FA_Nr := FA_Nr;
rec64.AG_Nr := rec63.AG_Nr;
// START und ENDE hier eintragen !!!
rec64.Start := AG_START_NEXT;
rec64.Ende := AG_END_LAST;
rec64.INSERT;
rec63.Start := rec64.Start;
rec63.Ende  := rec64.Ende;
rec63.MODIFY;
//merken, wann letzter arbeitsgang ende ist
END_LETZTER_AG := rec64.Ende;
UNTIL rec63.NEXT <= 0;  // Schleife ueber Arbeitsgaenge endet
Rec.Eingeplant := TRUE;
MODIFY;
END;
rec49.RESET;
rec61.RESET;
rec63.RESET;
rec64.RESET;
11. Dezember 2007 14:37
//Fertigungsgaenge erzeugen mithilfe des Arbeitsplans, der in Produktstammdaten hinterlegt 
// Rec49: Produktdaten   (liefert Arbeitsplan) 
// Rec61: Arbeitsplan                         (liefert Arbeitsplan) 
// Rec : Fertigungsauftraege (62) 
// Rec63: Arbeitsgaenge zum Auftrag (zu erzeugen) 
END_LETZTER_AG := FruehestPlanTermin - 1;     // Endpunkt des letzten Vorgaenger-Arbeitsganges 
                                            // gemaess Arbeitsplan 
//  AG_END_LAST                             // Endpunkt Arbeitsgang auf Betriebsmittel 
// 1. Pruefe, ob Auftrag noch nicht eingeplant 
IF Eingeplant THEN 
  ERROR('Auftrag schon eingeplant!');
// Arbeitsgaenge einzeln einlasten 
rec63.SETRANGE(FA_Nr,Rec.FA_Nr); 
IF NOT rec63.FINDSET THEN
  ERROR('keine Arbeitsgaenge einzulasten (63)');
// Evtl. vorhandene Einplanung des FA loeschen 
rec64.SETRANGE(FA_Nr,Rec.FA_Nr); 
rec64.DELETEALL; 
rec64.SETRANGE(FA_Nr); 
// Schleife ueber (63) einzulastende Arbeitsgaenge   
REPEAT 
  // 
  // HIER QUELLTEXT FUER DIE EINLASTUNG EINFUEGEN !!! 
  // 
  rec64.RESET; 
  rec61.RESET; 
  //Betriebsmittel in BM_Belegnung filtern 
  rec64.SETRANGE(BM_Nr,rec63.BM_Nr); 
  rec64.SETCURRENTKEY(Start); 
  //Dauer im Arbeitsplan filtern 
  rec61.SETFILTER(AP_Nr,rec63.AP_Nr); 
  rec61.SETFILTER(AG_Nr,rec63.AG_Nr); 
  rec61.FINDFIRST;
  // Variable geleert 
  AG_END_LAST := 0D; 
  AG_START_NEXT := 0D; 
  // Datensätze in Betriebsmittelbelegung vorhanden? 
  IF rec64.FINDSET(FALSE) THEN BEGIN
    // Lücke in Betriebsmittelbelegung suchen 
    REPEAT 
      AG_END_LAST := rec64.Ende; 
      // Gibt es einen nächsten Datensatz? 
      IF rec64.NEXT > 0 THEN  BEGIN
        AG_START_NEXT := rec64.Start ; 
        // Berechnung 
        Dauer := AG_START_NEXT - (AG_END_LAST); 
      END ELSE BEGIN          
        // Abbruchbedingung, wenn keine DS vorhanden sind
        Dauer := -1; 
      END;
    UNTIL (Dauer >= rec61.AG_Dauer) OR (Dauer = -1); 
    // Wenn -1, dann ist das Ende der Tabelle erreicht 
    IF Dauer = -1 THEN BEGIN 
      AG_START_NEXT := AG_END_LAST+1; 
     // AG_END_LAST := DMY2DATE( (DATE2DMY(AG_START_NEXT,1)+(rec61.AG_Dauer)),(DATE2DMY(AG_START_NEXT,2)), 
     // DATE2DMY(AG_START_NEXT,3)); 
      AG_END_LAST := AG_START_NEXT+rec61.AG_Dauer; 
    END ELSE BEGIN
      // Lücke in der Tabelle gefunden
      AG_START_NEXT := AG_END_LAST+1; 
      //AG_END_LAST := DMY2DATE( (DATE2DMY(AG_START_NEXT,1)+(rec61.AG_Dauer)),(DATE2DMY(AG_START_NEXT,2)), 
      //DATE2DMY(AG_START_NEXT,3)); 
      AG_END_LAST := AG_START_NEXT+rec61.AG_Dauer; 
    END;
    // Tabelle leer, Einfach einfügen 
  END ELSE BEGIN
    AG_START_NEXT := END_LETZTER_AG+1; 
    //AG_END_LAST := DMY2DATE( (DATE2DMY(AG_START_NEXT,1)+(rec61.AG_Dauer)),(DATE2DMY(AG_START_NEXT,2)), 
    //DATE2DMY(AG_START_NEXT,3)); 
    AG_END_LAST := AG_START_NEXT+rec61.AG_Dauer; 
  END;
  rec64.BM_Nr := rec63.BM_Nr; 
  rec64.FA_Nr := FA_Nr; 
  rec64.AG_Nr := rec63.AG_Nr; 
  // START und ENDE hier eintragen !!! 
  rec64.Start := AG_START_NEXT; 
  rec64.Ende := AG_END_LAST; 
  rec64.INSERT; 
  rec63.Start := rec64.Start; 
  rec63.Ende  := rec64.Ende; 
  rec63.MODIFY; 
  //merken, wann letzter arbeitsgang ende ist 
  END_LETZTER_AG := rec64.Ende; 
UNTIL rec63.NEXT <= 0;  // Schleife ueber Arbeitsgaenge endet 
Rec.Eingeplant := TRUE; 
MODIFY; 
rec49.RESET; 
rec61.RESET; 
rec63.RESET; 
rec64.RESET; 11. Dezember 2007 14:45
