Verbesserungsvorschlag Auswahl von Periode für DB Abfrage

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Verbesserungsvorschlag Auswahl von Periode für DB Abfrage

    Hallo,
    ich baue gerade ein Tool für unser Controlling.
    Hier ist es unter anderem notwendig, bestimmte Perioden auszuwählen und aus der DB abzufragen.
    Ich habe daher ein Enum erstellt und dieses Enum an eine Combobox (liegt in einem Bindingnavigator) gebunden.
    Klappt soweit auch bestens.
    Nun ist das Enum auf das laufende Jahr beschränkt, was bedeutet, das ich für das letzte Jahr ein neues Enum erstellen muss (genau wie für Folgejahre).
    Habt ihr da eventuell einen Vorschlag, wie ich das ganze etwas dynamischer gestalten könnte?
    Es muss auch für den User übersichtlich bleiben.
    Ich hatte schon überlegt, das Enum ohne das Jahr zu erstellen und für die Jahre ansich eine Liste herzunehmen und an eine weitere Combobox zu binden.

    Was meint ihr?

    Hier mal bisschen Code:
    DeliverPeriodEnum

    C#-Quellcode

    1. public enum DeliverPeriodEnum
    2. {
    3. Januar = 2018001,
    4. Februar = 2018002,
    5. März = 2018003,
    6. April = 2018004,
    7. Mai = 2018005,
    8. Juni = 2018006,
    9. Juli = 2018007,
    10. August = 2018008,
    11. September = 2018009,
    12. Oktober = 2018010,
    13. November = 2018011,
    14. Dezember = 2018012
    15. }


    Bindung an Combobox

    C#-Quellcode

    1. cmbLfPeriod.ComboBox.DataSource = Enum.GetValues(typeof(DeliverPeriodEnum));
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Verstehe ich da jetzt etwas falsch?
    Warum nimmst du kein Calendar Control und lässt den User den Zeitraum angeben?
    Das ist flexibel und trotzdem übersichtlich.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi Sascha,
    das Kalendercontrol hat den Nachteil das ich viel Platz brauche.
    Und das ich dann das ausgewälte Datum umkonvertrieren muss, da ich die Daten anhand der Periode aus der DB lade.
    Die Periode sieht so aus 2018003
    "Hier könnte Ihre Werbung stehen..."
    Da muss ich eben sehen was wichtiger ist. Das ich als programmierer weniger Arbeit habe oder das die usability meiner programms gut ist.
    Ich denke du weist was von beidem dir deine Anwender hoch anrechnen werden oder?

    Doch egal ob du es umkonvertieren musst. Kannst dir ja auch ein eigenes Control bauen was dir das übernimmt und weniger Platz benötigt.
    Ansonsten lass das Enum und befülle die Combobox mit Perioden dynamisch. Ein Enumerator ist hier jedenfalls fehl am Platz.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @MichaHo Um hier flexibel zu sein, würde ich ein Monats-Enum und ein Jahres-Integer verwenden.
    Beide kannst Du dann zu Deinem Wert verknüpfen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Edit: Hab blödsinn geschrieben. Hatte wiedermal nicht richtig gelesen. 8o

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    bin jetzt auf den Vorschlag von @Nofear23m eingegangen und hab einen MonthCalender in ein Contextmenu geworfen.
    Jetzt muss ich nur noch schauen, wie ich den MonthCalender dazu überreden kann IMMER nur die Monate anzzeigen, dann wäre es perfect.

    @RodFromGermany Deine Idee hatte ich vorher verfolgt, allerdings hatte ich dann 2 Comboboxen, 1 fürs Jahr und eine für die Perioden.
    Da ich das Enum ja über cmbLfPeriod.ComboBox.DataSource = Enum.GetValues(typeof(DeliverMonthEnum)); hinzufügen muss
    "Hier könnte Ihre Werbung stehen..."
    Das ist ein DateTimePicker, wo die Eigenschaften CustomFormat auf 'MM-yyyy' und die ShowUpDown auf True eingestellt sind...
    Jetzt brauchst du nur mehr deine Daten aus Value herausziehen...

    VB.NET-Quellcode

    1. Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
    2. Dim [date] = DateTimePicker1.Value
    3. Dim value = [date].Year * 1000 + [date].Month
    4. Debug.WriteLine(String.Format("Periode: {0}", value))
    5. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Hi,
    sorry, war grad im Meeting....
    Die Idee von @VB1963 ist natürlich auch supi.
    Gucke mal gerade wie ich das umsetze und melde mich dann wieder.

    Danke schon mal an Euch alle

    EDIT:
    @VB1963 das klappt bestens, spart Platz und sieht gut aus....

    hab einen dtp im Designer erstellt und eingestellt.
    Hier nur als Code, wie ich den dtp im Designer eingestellt habe.

    C#-Quellcode

    1. DateTimePicker dtPeriod = new DateTimePicker();
    2. dtPeriod.Format = DateTimePickerFormat.Custom;
    3. dtPeriod.CustomFormat = "MMMM-yyyy";
    4. dtPeriod.ShowUpDown = true;
    5. dtPeriod.ValueChanged += new EventHandler(dtPeriod_ValueChanged);


    diesen Füge ich dann dem BindingNavigator zu:

    C#-Quellcode

    1. ToolStripControlHost tsch = new ToolStripControlHost(dtPeriod);
    2. bnLieferungen.Items.Add(tsch);


    und im Value_Changed Ereignis Formatiere ich den Value nochmal um für die Datenbank:

    C#-Quellcode

    1. private void dtPeriod_ValueChanged(object sender, EventArgs e)
    2. {
    3. param.Add("@p1", dtPeriod.Value.ToString("yyyy0MM"));
    4. conSage.FillLf(dsLiefertreue.Lieferung, param);
    5. conSage.FillV(dsLiefertreue.Verspaetet, param);
    6. param.Clear();
    7. }


    so sieht es dann aus:


    Danke Euch
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()