Mehrere Werte in einem einzigen Wert speichern und auch wieder auslesen

  • VB.NET

Es gibt 60 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    @xtts02:: Warum so kompliziert, und so untypisiert? probierma:

    VB.NET-Quellcode

    1. <Flags()> Enum Wochentage
    2. Kein = 0
    3. Montag = 1
    4. Dienstag = 2
    5. Mittwoch = 4
    6. Donnerstag = 8
    7. Freitag = 16
    8. Samstag = 32
    9. Sonntag = 64
    10. End Enum
    11. Dim _AlleWochenTage As Wochentage() = DirectCast([Enum].GetValues(GetType(Wochentage)), Wochentage())
    12. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
    13. Me.ListBox1.DataSource = _AlleWochenTage
    14. Me.ListBox1.SelectionMode = SelectionMode.MultiSimple
    15. End Sub
    16. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    17. Dim wts = Wochentage.Kein
    18. For Each indx As Integer In ListBox1.SelectedIndices
    19. wts = wts Or _AlleWochenTage(indx)
    20. Next
    21. MessageBox.Show(wts.ToString)
    22. End Sub
    probiers aus - enum.Tostring ist nett!
    Danke VB1963,

    Dein Beispiel hat mir den Knoten gelöst und meine Frage eigentlich schon beantwortet. Ich habs für mich mal ausprobiert und es funktioniert. Vom Prinzip her wusste ich, dass es eine logische Verknüpfung sein muss, aber an das einfache "AND" hatte ich dabei nicht gedacht. Vielen Dank für den Tipp. Und sorry Leute, dass ich nicht auf jede Eurer Posts reagiert habe.

    VB.NET-Quellcode

    1. <Flags()>
    2. Public Enum WochenTage
    3. No = 0
    4. Montag = 1
    5. Dienstag = 2
    6. Mittwoch = 4
    7. Donnerstag = 8
    8. Freitag = 16
    9. Samstag = 32
    10. Sonntag = 64
    11. End Enum
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. 'Test Enumeration
    14. Dim WochenTagSammlungWert As Integer = 12 'Mittwoch Donnerstag
    15. If (WochenTagSammlungWert And WochenTage.Montag) = WochenTage.Montag Then MsgBox("montag")
    16. If (WochenTagSammlungWert And WochenTage.Dienstag) = WochenTage.Dienstag Then MsgBox("Dienstag")
    17. If (WochenTagSammlungWert And WochenTage.Mittwoch) = WochenTage.Mittwoch Then MsgBox("Mittwoch")
    18. If (WochenTagSammlungWert And WochenTage.Donnerstag) = WochenTage.Donnerstag Then MsgBox("Donnerstag")
    19. If (WochenTagSammlungWert And WochenTage.Freitag) = WochenTage.Freitag Then MsgBox("Freitag")
    20. If (WochenTagSammlungWert And WochenTage.Samstag) = WochenTage.Samstag Then MsgBox("Samstag")
    21. If (WochenTagSammlungWert And WochenTage.Sonntag) = WochenTage.Sonntag Then MsgBox("Sonntag")
    22. End Sub


    Jedoch werde ich dennoch bei meiner allerersten "If-Then" Version bleiben, da der Code nicht wirklich weniger ist und ich mir diese ENUM-Geschichte zudem noch spare.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Jedoch werde ich dennoch bei meiner allerersten "If-Then" Version bleiben, da der Code nicht wirklich weniger ist und ich mir diese ENUM-Geschichte zudem noch spare.

    Wenn du meine "irrelevante" Frage beantworten würdest, was du mit den Werten weiter machst, dann könntest du einen Tipp bekommen, wie du diese ganzen If-Abfragen sparen kannst. Denn 7 Mal MessageBox willst du ja wohl nicht rausgeben...
    da du was mathematisches wolltest hier mal ein ansatz:



    die matrix folgt der von dir numerisch vorgegebenen reihenentwicklung. je mehr tage deine zahl bilden desto größer wird die matrix.
    über determinanten kannst du die koeffizienten-matrix lösen.
    a,b,c,d,e,f,g sind die anzahl der tage die anderen werte sind deine codierungswerte für die wochentage.
    prophetisch, odr?

    sonne75 schrieb:

    Aber gut, du bist ja bekannt dafür, dass du gar keine Lösungen haben willst...
    naja - wenigstens haben die anneren was davon gehabt.
    Es gibt übrigens eine einfachere Möglichkeiten als "And", aber das mögen die nachgucken, die sich für interessieren.
    MsgBox deswegen:

    dive26 schrieb:

    'Test Enumeration
    Auch wenn ich immer noch der Meinung bin, dass es für die Frage nicht relevant ist wie die Daten eingegeben werden und was danach mit denen geschieht, habe ich Dir mal einen Screenshot erstellt, wo Du siehst, wie man die Daten eingibt und wie diese BEIM EINGEBEN angezeigt werden.

    Die Daten selbst werden später in einer eigenen (NOCH ZU SCHREIBENDEN) Routine auf den aktuellen Tag angewandt. Happy-Hour Funktion müsste jedem der schon mal in einem Lokal war etwas sagen.

    Zum Beispiel wird jeden Montag und Dienstag zwischen 20:00 und 22:30 auf die Preisebene X umgeschaltet (sprich ein spezieller - meist günstigerer Preis berechnet). In meiner Anwendung wird es beliebig viele Preisebenen geben und beliebig viele Happy-Hour Zeitkonstellationen.

    Ich hoffe, ich konnte Deine Frage nach dem Warum beantworten.

    LG Roland


    PS:
    Es gibt übrigens eine einfachere Möglichkeiten als "And", aber das mögen die nachgucken, die sich für interessieren.
    Ich übersetze einmal wie ich Deine Posts auffasse, ErfinderdesReases: Man stellt hier eine Frage um zu lernen. Deine Antwort ist "lerne zuerst" ?!
    Ich kann mir schon vorstellen, dass es einem Profi nerven muss wenn immer wieder die selben "doofen" Fragen gestellt werden ... aber solche Antworten nützen ja keinem.
    Bilder
    • happyhour.jpg

      241,8 kB, 800×600, 111 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    @dive26

    Die Frage ist, warum willst du überhaupt alle If-Abfragen einzeln auswerten?
    Sorry, die Frage verstehe ich nicht ganz.


    Er hat sich bei den meisten seiner Threads so benommen ;) Einfach Erfahrungswert.
    Entschuldige, ich hinterfrage einerseits sehr viel und möchte aber andererseits immer rasch zu einer Lösung meines Problems kommen. Dass ich dann wieder den (für mich) einfacheren Weg einschlage, anstatt die programmiertechnisch korrekte Lösung zu wählen wird mitunter von einigen hier als unhöflich aufgefasst. Auch die österreichische Schreibweise die ich oft an den Tag lege liest sich vielleicht negativer als es eigentlich sein soll. Wenn das so ist, dann bitte ich vielmals um Entschuldigung.

    Ich habe ganz zu Beginn auch schon einmal geschrieben, dass ich kein Profiprogarmmierer bin und dass ich den einfachsten Weg gehe, solange das Endergebnis das ist was ich mir vorstelle. Dass sehr viele Harangehensweisen von mir noch an das VB6 angelehnt sind und bei einigen von Euch das Grauen aufsteigen lässt, dass gebe ich natürlich zu.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    dive26 schrieb:

    an das einfache "AND" hatte ich dabei nicht gedacht.
    Du meinst wahrscheinlich Or.
    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!
    Mir sagt dein Screenshot nicht viel in Bezug auf meine Frage, was du mit dem Wissen, welche Tage in dieser Zahl gespeichert wurden, genau anfangen willst (im Code). Was soll dann passieren? Wird ein Flag "günstiger Preis" damit aktiviert, wenn heutiger Tag ein günstiger Tag ist? Dann brauchst du doch überhaupt nicht alle Tage zu überprüfen, sondern nur, ob heutiger Tag in diesem Gesamtwert enthalten ist.
    Es ist dann genau eine If-Abfrage, wenn ja, günstiger Preis, wenn nein, nicht. Oder?

    @RodFromGermany
    Da er VB1963 angesprochen hat, der ihm als Einziger "And" für Abfrage geliefert hat (alle anderen haben ihm die Zusammensetzung vom Wert geliefert, den hat er aber schon, er will ihn auseinandernehmen), würde ich sagen, dass er "And" meint - zur Abfrage, ob heutiger Tag enthalten ist.
    @Sonne,

    Der Gastronom soll verschiedene Zeiten definieren können in denen dann auf eine andere Preisebene umgeschaltet wird.

    Du kannst Dir das so vorstellen:

    1. Tischbuchung wird geöffnet
    2. Es wird abgefragt (eigene Routine), ob zu diesem Zeitpunkt gerade eine Happy-Hour Zeit aktiv ist und welche Preisebene aktiviert werden soll.
    3. Das Programm nimmt für diese Buchung also den in Punkt 2 definierten Preisbereich

    So kann der Gastronom z.B. einstellen, dass am Montag und Dienstag jeweils in der Zeit zwischen 20:00 und 22:00 die Preisebene XY aktiviert werden soll, in der definiert ist, dass alle Preise einer bestimmten Artikelgruppe um 10% günstiger sind.

    .. oder dass alle Preise für alle Artikel, ausgenommen eine bestimmte Artikelgruppe den beim Artikel hinterlegten Preis 2 verwendet ..

    Also sehr viele Kombinationsmöglichkeiten.


    Wird ein Flag "günstiger Preis" damit aktiviert
    So in der Art, nur viel Umfangreicher. Es wird ein (meist) günsigerer Preis anhand von Preisebenendefinitionen aktiviert. In den Preisebenendefinitionen ist hinterlegt auf welche Artikel sich die Preismodifikation bezieht und ob einer der bei den Artikel hinterlegten Fixpreise (Preis1-6) oder ein auf Basis Prozentminderung (Preis1-Prozente) bezieht.


    Ich hoffe ich konnte es verständlich erklären.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Der Wochentag wirkt sich aber wohl genau so aus, wie ich sagte: wenn heute enthalten, dann Flag für weitere Bearbeitung setzen. Somit brauchst du exakt eine Abfrage, ob heute enthalten ist. Für weitere Sachen brauchst du andere Daten, welche Uhrzeiten enthalten sind und ob JETZT da drin enthalten ist. Usw. Immer das gleiche Schema, aber für diese Frage nach Wochentag brauchst du keine 7 Abfragen.
    Immer das gleiche Schema, aber für diese Frage nach Wochentag brauchst du keine 7 Abfragen.
    Das ist richtig.

    Die 7 If-Abfragen brauchte ich nur um die Anzeige in der Spalte "Wochentag" zu generieren. (siehe Screenshot)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    mir ist allerdings immer noch nicht klar, warum du die tage verschlüsseln willst?!?!?
    wenn ich das richtig sehe können ja maximal 7 tage ausgewählt werden. wenn du die sieben tage einfach als string übergibts erzeugt das noch lange kein speicherproblem.
    oder du umgehst das ganze und machst ne select case-abfrage für die jeweiligen checkboxes.

    VB.NET-Quellcode

    1. Select Case CheckBox1.Checked
    2. Case True
    3. ...
    4. Case False
    5. ...
    6. End Select


    und wegen deinen mobilen geräten:

    auf dem mobilteil lass den kellner nur die tischnummer und die bestellten artikel eingeben. dann wird noch die aktuelle systemzeit und tag ermittelt. und nur dass wird an das hauptgerät gesendet und dann dort geprüft ob happy-hour ist oder nicht. und wenn der gast bezahlöen will, ruft gas mobile gerät einfach nur den rechnungsbetrag aus dem hauptgerät ab.
    das ist nicht mahl 1MB an daten, was da umherschwirrt und ggf. temporär auf dem mobilen gerät gespeichert werden muss.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „affrop“ ()

    Hallo Leute,

    vielen Dank für Eure zahlreichen Anregungen. Ich habe es jetzt komplett anders gelöst, also keinen Sammelwert mehr. Für jeden Tag habe ich ein eigenes Boolean Datenfeld erstellt. Wenn man alle (geplanten) Funktionen global betrachte ist das nun der einfachste Mittelweg.

    Hier der Code für die Deklaration der Structur, die Anzeige der Daten im Listview und eine Funktion die ermittelt ob gerade Happy-Hour ist oder nicht. Der Rückgabewert ist 0 wenn keine Happy-Hour ist oder anderfalls einen Integerwert, der die zu verwendende Preisebene angibt.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Serializable()> _
    2. Public Structure HappyHourStructure
    3. Dim Nummer As Integer
    4. Dim Preisebene As Integer
    5. Dim Startzeit As DateTime
    6. Dim Endzeit As DateTime
    7. Dim Montag As Boolean
    8. Dim Dienstag As Boolean
    9. Dim Mittwoch As Boolean
    10. Dim Donnerstag As Boolean
    11. Dim Freitag As Boolean
    12. Dim Samstag As Boolean
    13. Dim Sonntag As Boolean
    14. Dim aktiv As Boolean
    15. End Structure
    16. Public MaxHappyHourAnzahl As Integer = 101
    17. Public HappyHour(MaxHappyHourAnzahl) As HappyHourStructure 'maximale Artikelanzahl fix 100
    18. Public TempHappyHourStruct As HappyHourStructure
    19. <Serializable()> _
    20. Public Structure ArtikelGruppenStructure
    21. Dim Nummer As String
    22. Dim Name As String
    23. Dim Zusatzinfo As String
    24. Dim Steuersatz As Double
    25. Dim Bondrucker As String
    26. Dim Lieferant As String
    27. End Structure
    28. Public MaxArtikelGruppenEver As Long = 200
    29. Public Artikelgruppen(MaxArtikelGruppenEver) As ArtikelGruppenStructure 'maximale Artikelanzahl in der Entwicklungszeit 10001
    30. Public TempArtikelgruppenStruct As ArtikelGruppenStructure
    31. ''' <summary>
    32. ''' Übergibt 0 wenn keine Happy-Hour besteht und falls doch die Nummer der Preisebene auf die umgeschaltet werden soll
    33. ''' </summary>
    34. ''' <returns></returns>
    35. ''' <remarks></remarks>
    36. Public Function IstGeradeHappyHour() As Integer
    37. Dim TagStimmtSchon As Boolean
    38. For i As Integer = 1 To MaxHappyHourAnzahl - 1
    39. If HappyHour(i).aktiv = True Then
    40. TagStimmtSchon = False
    41. If HappyHour(i).Montag = True And Now.DayOfWeek = 1 Then TagStimmtSchon = True
    42. If HappyHour(i).Dienstag = True And Now.DayOfWeek = 2 Then TagStimmtSchon = True
    43. If HappyHour(i).Mittwoch = True And Now.DayOfWeek = 3 Then TagStimmtSchon = True
    44. If HappyHour(i).Donnerstag = True And Now.DayOfWeek = 4 Then TagStimmtSchon = True
    45. If HappyHour(i).Freitag = True And Now.DayOfWeek = 5 Then TagStimmtSchon = True
    46. If HappyHour(i).Samstag = True And Now.DayOfWeek = 6 Then TagStimmtSchon = True
    47. If HappyHour(i).Sonntag = True And Now.DayOfWeek = 7 Then TagStimmtSchon = True
    48. If Now.ToShortTimeString >= HappyHour(1).Startzeit And _
    49. Now.ToShortTimeString <= HappyHour(1).Endzeit And TagStimmtSchon = True Then
    50. 'Happy-Hour aktiv
    51. Return HappyHour(i).Preisebene
    52. Exit For
    53. End If
    54. End If
    55. Next i
    56. Return 0
    57. End Function
    58. ''' <summary>
    59. ''' Zeigt die Daten der einzelnen Happy-Hour Zeiteinstellungen im Listview an
    60. ''' </summary>
    61. ''' <remarks></remarks>
    62. Public Sub ZeigeHappyHourInListView()
    63. With ListView_HappyHour
    64. .Clear()
    65. .Columns.Add("ID", 30, HorizontalAlignment.Center)
    66. .Columns.Add("Wochentag", 110, HorizontalAlignment.Left)
    67. .Columns.Add("Startzeit", 60, HorizontalAlignment.Center)
    68. .Columns.Add("Endzeit", 60, HorizontalAlignment.Center)
    69. .Columns.Add("Preisebene", 130, HorizontalAlignment.Left)
    70. .Columns.Add("aktiv", 40, HorizontalAlignment.Center)
    71. End With
    72. ListView_HappyHour.Items.Clear()
    73. For i As Integer = 1 To MaxHappyHourAnzahl - 1
    74. With ListView_HappyHour.Items.Add(HappyHour(i).Nummer)
    75. .UseItemStyleForSubItems = False
    76. If HappyHour(i).Preisebene <> 0 Then
    77. Dim WochenTag As String = ""
    78. If HappyHour(i).Montag = True Then WochenTag += "Mo "
    79. If HappyHour(i).Dienstag = True Then WochenTag += "Di "
    80. If HappyHour(i).Mittwoch = True Then WochenTag += "Mi "
    81. If HappyHour(i).Donnerstag = True Then WochenTag += "Do "
    82. If HappyHour(i).Freitag = True Then WochenTag += "Fr "
    83. If HappyHour(i).Samstag = True Then WochenTag += "Sa "
    84. If HappyHour(i).Sonntag = True Then WochenTag += "So "
    85. WochenTag = Trim(WochenTag)
    86. .SubItems.Add(WochenTag)
    87. .SubItems.Add(HappyHour(i).Startzeit)
    88. .SubItems.Add(HappyHour(i).Endzeit)
    89. .SubItems.Add(Preisebenen(HappyHour(i).Preisebene).Bezeichnung)
    90. .SubItems.Add(BoolToJaNein(HappyHour(i).aktiv))
    91. Else
    92. .SubItems.Add("")
    93. .SubItems.Add("")
    94. .SubItems.Add("")
    95. .SubItems.Add("")
    96. .SubItems.Add("")
    97. End If
    98. End With
    99. Next i
    100. End Sub



    Danke und LG
    Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Der Gastronom soll verschiedene Zeiten definieren können in denen dann auf eine andere Preisebene umgeschaltet wird.

    Du kannst Dir das so vorstellen:

    1. Tischbuchung wird geöffnet
    2. Es wird abgefragt (eigene Routine), ob zu diesem Zeitpunkt gerade eine Happy-Hour Zeit aktiv ist und welche Preisebene aktiviert werden soll.
    3. Das Programm nimmt für diese Buchung also den in Punkt 2 definierten Preisbereich

    So kann der Gastronom z.B. einstellen, dass am Montag und Dienstag jeweils in der Zeit zwischen 20:00 und 22:00 die Preisebene XY aktiviert werden soll, in der definiert ist, dass alle Preise einer bestimmten Artikelgruppe um 10% günstiger sind.

    .. oder dass alle Preise für alle Artikel, ausgenommen eine bestimmte Artikelgruppe den beim Artikel hinterlegten Preis 2 verwendet ..

    Also sehr viele Kombinationsmöglichkeiten.
    Also für solch eine Anwendung brauchst du die Wochentage nicht zu kodieren um die ausgewählten Tage in einem Byte zu speichern. Eine Kodierung ist nur dann sinnvoll, wenn der durch die Kodierung eingesparte Speicherplatz deutlich größer ist, als der Platz den dein Programm zum codieren/dekodieren benötigt.
    Das ist so ähnlich wie ein Programm, das ich mir kürzlich heruntergeladen hatte: Das selbstextrahierende Zip war größer als das entpackte Programm :D
    Du sagst, du willsts dir nicht unnötig schwer machen und deshalb auf Enums verzichten. Du erziehlst aber gerade das exakte Gegenteil, es gibt nichts einfacheres als Enums, schon gar nicht das. Zudem sind Enums schneller, weil sie auf Basisoperationen deiner CPU basieren und sie sind bis zu 32 (64) Werten ohne Mehraufwand beliebig erweiterbar.