Fertigungs einplanungs problem

11. Dezember 2007 14:27

Hier erst einmal mein C/AL Code

Code:

//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;


Wenn ich jetzt etwas einplane hat er bei der 2ten Machine ein problem, sprich die Daten überschneiden sich, nur leider seh ich den Fehler nicht, jemand ne idee? ;)

Gruß Micha

11. Dezember 2007 14:37

Hi,
da ich gerade nicht die Zeit habe, mich mit dem Problem auf fachlicher Ebene auseinander zu setzen, habe ich mal deinen Quelltext nach NAV-Programmierstandards umformatiert (und z.T. geändert), damit er lesbarer wird.

Schau dir dies doch schon mal in Ruhe an. Sagen dir die Unterschiede etwas?
Code:
//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

Ja klar fallen mir ein paar kleinigkeiten auf die du bei der formatierung geändert hast, find = findset usw usw :-?

funktioniert nicht