|
Registriert seit: 5. Sep 2007 18 Beiträge |
#10
Also das ganze ist ein Tool für meinen Arbeitgeber zur Planung von Schichtplänen, leider ist die Sache schon soweit fotgeschritten das es jetzt nicht so einfach ist hier ein paar Codefetzen hinzuwerfen
Also das Stringgrid ist so aufgebaut Kostenstelle Arbeitsplatzgruppe Name Personnummer Schicht 1.1 2.1 3.1 4.1 .....das ganze für 4 Wcohen im Testmodus sind 45 Mitarbeiter eingepflegt der Record dafür sieht so aus
Delphi-Quellcode:
dann get es weiter mit einen "Übersteuern" Record
type
TData = record Name : String[20]; Vorname : String[15]; Personalnummer : String[15]; Kostenstelle : String[15]; Arbeitsplatzgruppe : String[16]; Ersthelfer : Boolean; Vorarbeiter : Boolean; Leiharbeiter : Boolean; Username : String[20]; Telefonnummer : String[20]; Meister : Boolean; Schicht : String[60]; StartSchicht : String[2]; Start_Date : String[20]; ErlaubteKST : String[255]; EinsatzMoeglichkeit : String[255]; end; wird benötigt um Änderungen im Schitplan anzuzeigen und nicht die eigentlichen Schicht abändern zu müssen so das der einzelne Mitarbeiter immer im gleichen Rhythmus bleibt
Delphi-Quellcode:
type
TChangeData = record SchichtTyp : String[5]; Datum : TDateTime; Personalnummer : String[15]; Kostenstelle : String[15]; Arbeitsplatzgruppe : String[15]; Wochenweise : Boolean; end; type TUebersteuern = record Daten : Array [1..100000] of TChangeData; Count :integer; end; die function um die schichten zu berechnen sieht so aus
Delphi-Quellcode:
function GetSchicht(Mitarbeiter:TData;KW:Integer;Year:Integer;Datum:TDateTime;Weekly:Boolean):String;
var SchichtSystem :String; EinzelSchicht :String; EinzelSchichtTag :String; i,x :integer; // savepos :integer; SchichtList :TStringList; ErrechnetesDatum :TDateTime; EndDatum :TDateTime; Tagessumme :Integer; y :Integer; //5tagesansicht übersteuert in wochenansicht q :Integer; SaveDate :Tdatetime; SaveSchicht :String; tagecounter :Integer; begin if mitarbeiter.Schicht='' then exit; SchichtList:= TStringList.Create; //+++++++Schichtsystem des Mitarbeiters suchen++++++++++ for i:=1 to Settings.SchichtenCount do begin if Mitarbeiter.Schicht=settings.Schichten[i].Name then begin SchichtSystem:=settings.Schichten[i].Reihenfolge; break; end; end; //+++++++Schichtsystem auseinander flücken for i:=1 to Length(SchichtSystem) do begin if SchichtSystem[i]<>';' then begin EinzelSchicht:=EinzelSchicht+SchichtSystem[i]; end else begin SchichtList.Add(EinzelSchicht); //main_window.ListBox1.Items.Add(EinzelSchicht) ; EinzelSchicht:=''; end; end; //Anfangschichtsystem finden mit x vergleichen gegen hinterlegten string x:=StrtoInt(Mitarbeiter.StartSchicht)-1; //################################## Ansicht Tageweise/Wochenweise ################################# //################################## Ansicht Tageweise/Wochenweise ################################# //Tage pro schicht ermitteln und ab startdatum rechnen Tagessumme:=0; ErrechnetesDatum:=0; if Weekly=true then Datum:=StartOfAWeek(Year, KW, 1); //noch end datum eintragen errechtet aus der kw while ErrechnetesDatum <= Datum do begin EinzelSchichtTag:=SchichtList.Strings[x]; EinzelSchichtTag:=StringReplace(EinzelSchichtTag,'N','', [rfReplaceAll]); EinzelSchichtTag:=StringReplace(EinzelSchichtTag,'S','', [rfReplaceAll]); EinzelSchichtTag:=StringReplace(EinzelSchichtTag,'F','', [rfReplaceAll]); EinzelSchichtTag:=StringReplace(EinzelSchichtTag,'W','', [rfReplaceAll]); Tagessumme:=Tagessumme+StrToInt(EinzelSchichtTag); ErrechnetesDatum:=StrToDate(Mitarbeiter.Start_Date)+Tagessumme; if pos('F',SchichtList.Strings[x])>0 then result:='F';//'Frühschicht'; if pos('S',SchichtList.Strings[x])>0 then result:='S';//'Spätschicht'; if pos('N',SchichtList.Strings[x])>0 then result:='N';//'Nachtschicht'; if pos('W',SchichtList.Strings[x])>0 then result:='.';//'Wochenende'; inc(x); if x> SchichtList.Count-1 then x:=0; end; //++++++++++++++++++++++++++++Wochenende setzten++++++++++++++++++++++++++++++ if Weekly=false then if DayOfTheWeek(Datum)>5 then result:='.'; ///// //++++++++++++++++++++++++++++Wochenende setzten++++++++++++++++++++++++++++++ //##############################Übersteuern Start################################# //################################################################################ for y:=1 to Uebersteuern.Count do begin if Uebersteuern.Daten[y].Personalnummer=Mitarbeiter.Personalnummer then begin if Uebersteuern.Daten[y].Wochenweise=true then begin if weekly=true then //ansicht in KW begin if (Uebersteuern.Daten[y].Datum=StartOfAWeek(Year, KW, 1)) then result:=Uebersteuern.Daten[y].SchichtTyp; end else begin //ansicht Tageweise buchung alle 5 arbeitstage! if (Uebersteuern.Daten[y].Datum<=Datum) and (Uebersteuern.Daten[y].Datum+4>=Datum) then result:=Uebersteuern.Daten[y].SchichtTyp; end; end else begin //tagesansicht if weekly=false then begin if Uebersteuern.Daten[y].Datum=Datum then result:=Uebersteuern.Daten[y].SchichtTyp; end else begin //wochenasicht gucken ob 5 gleiche einträge vorhanden sind if Uebersteuern.Daten[y].Datum=Datum then begin SaveDate:=StartOfTheWeek(Uebersteuern.Daten[y].Datum); SaveSchicht:=Uebersteuern.Daten[y].SchichtTyp; tagecounter:=0; q:=1; //nochmal die daten durchsuchen für einträge in gleicher woche mit gleicher schicht while q<=Uebersteuern.Count do begin if (Uebersteuern.Daten[q].Personalnummer=Mitarbeiter.Personalnummer) then begin if (Uebersteuern.Daten[q].Datum=SaveDate+tagecounter) and (Uebersteuern.Daten[q].SchichtTyp=SaveSchicht) then begin inc(tagecounter); q:=0; if tagecounter>4 then break; end end; inc(q) end; if tagecounter>4 then result:=SaveSchicht; end; end; end; end; end; //##############################Übersteuern Ende################################## //sollte der Starttermin vor dem aktuellen datum liegen in der vergangenheit if weekly=true then if StartOfAWeek(Year, KW, 1) <StrToDate(Mitarbeiter.Start_Date) then result:='xxx'; if weekly=false then if Datum <StrToDate(Mitarbeiter.Start_Date) then result:='xxx'; SchichtList.Free; end; |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |