tage ermitteln



  • hilfe ich weiss nicht mehr weiter!!!

    ich soll für unsere firma ein kleines programm erstellen, welches versandtage berechnet. der benutzer soll die möglichkeit haben alle werktage als versandtage anzugeben ( also Mo, Mo+Di oder Di+Mi+Do usw.). das programm soll jetzt den heutigen tag ermitten, dann eine bearbitungszeit von X draufschlagen und daraus den nächstmöglichen versandtag vorschlagen.

    wie mach ich das, weiss jemand rat????



  • bitte helft mir!!!!!!!!!!!!



  • 1. include die "DateUtils.hpp"
    2. ermittle den nächstmöglichen Versandzeitpunkt mittels "IncHour(Now(), bearbitungszeit)"
    3. lass dir von diesem versandzeitpunkt mittels "DayOfWeek" den entsprechenden wochentag zurückgeben
    4. nun mußt du nur noch bei dem anwender den nächstmöglichsten versandtag ab dem gerade ermittelten tag raussuchen

    ich hoffe du benutzt BCB6, sonst hast du die DateUtils.hpp nicht.

    p.s.: bei der bearbeitungszeit hab ich die Einheit Stunden angenommen, falls du sie in tagen angeben willst, mußt du statt "IncHour" "IncDay" nehmen



  • irgendwie klappt das nicht 😕
    ich schicke mal den code den ich schon geschrieben hab für ein versandtag
    leider kann man hier nur ein tag auswählen und nicht mehrere.
    Die verladetage wurden vorher mittels ComboBox ausgewählt und in eine ini geschrieben

    TIniFile *User = new TIniFile(ExtractFilePath (Application->ExeName)+ "User.cfg");
    User->ReadString( "Userdata", "Bearbeitungszeit",0);
            try
            {
                int BAZ=User->ReadString( "Userdata", "Bearbeitungszeit",0);
                VTag->Text=User->ReadString( "Userdata", "Versendedatum",0 );
                int Verladedatum = StrToInt(VTag->Text);//2=MO;3=Di;4=Mi;5=Do;6=Fr
                char days[7][10] = {"1", "2", "3", "4", "5", "6", "7" };
                TDateTime DatumZeit = DatumZeit.CurrentDateTime();
                TDateTime jetzt =DateToStr(DatumZeit.DayOfWeek());
                EditHeute->Text=days[DatumZeit.DayOfWeek() - 1];
                int today = StrToInt(EditHeute->Text);
                DIV->Text= IntToStr(Verladedatum-today);
                int n1= (7+StrToInt(DIV->Text)) ;
                int end= n1;
                EditKontrolle->Text= IntToStr(end);
                if(DIV->Text>BAZ-1)
                  {
                   AnsiString Zeit=DateToStr(Now()+end-7);
                   DateTimePicker1->Date=StrToDate(Zeit);
                   }
                   else if(DIV->Text<BAZ)
                    {
                     AnsiString Zeit=DateToStr(Now()+end);
                     DateTimePicker1->Date=StrToDate(Zeit);
                    }
            }
            catch (Exception &exception)
            {
            ;
            }
             delete User;
    


  • vorneweg mal kurz paar fragen:

    wieso schreibst du die daten in eine inifile?
    du hattest im ersten post geschrieben, dass der anwender mehrere werkstage als versandtage auswählen kann, dass kommt in deinem code nicht vor. soll er nun mehrere tage auswählen können oder nicht?

    ich hab das irgendwie so verstanden, das du ein tool erstellen willst, wo der user mehrere versandtage angeben kann und wenn er auf nen button drückt, wird ihm gesagt an welchem nächstmöglichsten termin der versand stattfindet
    lieg ich da richtig?



  • stimmt genau!!
    das mit der ini file ist so, der versandtag/e wird nur einmal angegeben und bei jedem start abgerufen.
    ich habe diesen code für ein Versandtag geschrieben jetzt muss ich ihn umschreiben für mehrere versandtage und das schaffe ich nicht



  • speicher die 5 werktage die der benutzer wählen kann als bool-werte in die ini-file (mit IniFile->WriteBool; beim auslesen dann IniFile->ReadBool;)

    leg die werte beim auslesen in einem bool array ab
    wenn du dann den nächstmöglichsten versandtag hast, fängst du in dem array genau an dieser stelle an zu suchen, bis du einen tag gefunden hast, der true ist (also ein tag der vom user gewählt wurde)

    z.b.
    dein array sieht so aus : VTag {0 0 0 1 1} (user hat also do und fr als versandtag ausgewählt)

    nächstmöglichster termin ist der di
    di kann user nicht, da VTag[1] == 0
    dann gehst du ins nächste feld vom array (VTag[2]), da kann er auch nicht, aber beim nächsten durchlauf (VTag[3] == true (Do)) hast du den nächstmöglichsten termin vom user gefunden
    musst nur aufpassen, wenn du z.b. an einem freitag anfängst (wäre die 4 im array), dass du dann bei 0 im array weitersuchst

    hhhmmm, ich hoffe ich hab das jetzt nicht zu kompliziert erklärt (bin halt nicht der geborene lehrer 😉 )

    noch ein paar tips zu deinem quellcode, ich find den irgendwie kompliziert.

    den nächstmöglichsten liefertag bekommst du doch einfach so:

    int Tag = DayOfWeek(IncHour(Now(), bearbeitungszeit));
    

    da der Montag bei der DayOfWeek-funktion ne 2 representiert, aber bei dem array von dem ich weiter oben gesprochen hab das feld VTag[0] den Montag representiert, wäre es also günstig, wenn man den rückgabewert von DayOfWeek so verändert, das die 0 der Montag ist
    das erreichst du folgendermaßen:

    int Tag = DayOfWeek(IncHour(Now(), bearbeitungszeit)); 
    Tag = Tag - 2;
    if(Tag<0) Tag = 6;
    

    jetzt kannst du bequem das array durchsuchen

    ich hoffe dass hilft


Anmelden zum Antworten