Auftragsbuch mit Dataset, Datagridview und XML-Export

  • VB.NET

Es gibt 97 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Zeig mal bitte die Eigenschaften der BindingSource, wie DU es in Post#14 für die Column gemacht hast.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jup.
    Dann probier doch mal zur Datenänderung der aktuell gewählten Zeile:

    VB.NET-Quellcode

    1. Dim DeineSelektierteRow = DirectCast(DirectCast(TblAuftragsbuchBindingSource.Current, DataRowView).Row, DtsAuftragsbuch.TblAuftragsbuchRow)
    2. If DeineSelektierteRow.IstAusgeliefert Then 'keine Ahnung, wie bei Dir diese Boolean-Eigenschaft wirklich heißt
    3. DeineSelektierteRow.Statustext = "Ausgeliefert" 'keine Ahnung, wie bei Dir diese String-Eigenschaft wirklich heißt
    4. DeineSelektierteRow.Prozessdatum = Date.Today 'keine Ahnung, wie bei Dir diese Date-Eigenschaft wirklich heißt
    5. DeineSelektierteRow.Prozesszeit = DateTime.Now.ToString("HH:mm") 'keine Ahnung, wie bei Dir diese Date-Eigenschaft wirklich heißt
    6. End If

    oder für alles:

    VB.NET-Quellcode

    1. Private Sub SetzeAbgeschlossenenAuftragsstatusFürAlleZeilen()
    2. For Each Row In DtsAuftragsbuch.TblAuftragsbuch.Where(Function(x) x.IstAusgeliefert)
    3. Row.Statustext = "Ausgeliefert"
    4. Row.Prozessdatum = Date.Today
    5. Row.Prozesszeit = DateTime.Now.ToString("HH:mm")
    6. Next
    7. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja richtig. Es ging mir ja auch nur darum zu zeigen, wie Du Daten direkt manipulierst, siehe Post#17.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also, mein Ansatz war, zu prüfen, ob bereits eine Checkbox aktiviert war und etwas in Row.Datum drinsteht. Wenn ja, dann diese Zeile nicht ändern, sondern nur die anderen leeren.
    Hierzu fehlt mir allerdings das Wissen, um das umzusetzen.
    Beim Versuch mit einem IF/ELSE habe ich dann aufgegeben.
    Vielleicht kann mich jemand in die richtige Richtung bringen.

    Ein zweites Thema ist der Vergleich von zwei Daten (Datum)
    Mit folgendem Code soll die Spalte "Abweichung" die Differenz ermitteln.
    Bei gleichem Datum steht die 0, bei einem Datum vor dem Lieferwunschdatum kommt die "positive" Differenz. Allerdings bei zu spätem Ausliefern ( eigentlich negativer Wert ) wird ebenfalls eine 0 angezeigt.

    VB.NET-Quellcode

    1. Dim differenz As Long = DateDiff("d", Row.Datum, Row.Lieferdatum)
    2. If Row.Datum < Row.Lieferdatum Then
    3. Row.Abweichung = differenz
    4. ElseIf Row.Datum > Row.Lieferdatum Then
    5. Row.Abweichung = differenz
    6. End If

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

    Ja. Das ist eine lange Zahl: TotalDays. Wenn Du ne "normale" Tagesanzahl haben willst, musst Du entsprechend runden. Denn so ist es eben eine Fließkommazahl. 24 Stunden = 1 TotalDay, 36 Stunden = 1,5 TotalDays und was bei 3 Tagen, 7 Stunden, 13 Minuten, 8 Sekunden und 345 Millisekunden rauskommt, kannst Du entweder selber mal ausrechnen oder Dir durch die TotalDays anzeigen lassen.
    Runden geht z.B. mit Dim WertDerGerundetenZahl = Math.Round(dieZuRundendeZahl, AnzahlDerGewünschtenNachkommastellen)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Schonmal Danke dafür.

    VB.NET-Quellcode

    1. Dim gerundet = Math.Round(Row.Abweichung, 0)
    2. gerundet = (Row.Datum - Row.Lieferdatum).TotalDays


    Ich mache scheinbar etwas falsch. Das "Round" ist rot unterstrichen und meldet mir

    BC30519 Visual Basic AND VB.NET Overload resolution failed because no accessible can be called without a narrowing conversion: : Argument matching parameter 'value' narrows from 'String' to 'Double'..............
    Dass eine Rundungsfunktion zum Runden eine Zahl braucht, sollte schon klar sein. Row.Abweichung riecht aber nach Text/String. Und eine Rundung des Strings "VaporiZed" ergibt … "V"? Also: Nur Zahlen runden. Und "123,32" ist keine Zahl, sondern ein Text.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    petaod schrieb:

    VB.NET-Quellcode

    1. ​Row.Abweichung = Math.Round((Row.Datum - Row.Lieferdatum).TotalDays), 0)

    oder, wenn Abweichung ein String ist:

    VB.NET-Quellcode

    1. Row.Abweichung = (Row.Datum - Row.Lieferdatum).TotalDays).ToString("F0")


    Beide Beispiele bringen leider das gleiche, falsche Ergebnis.

    Da das Problem ja sicherlich, mangels Kenntnissen bei mir liegt, hier nochmal die Datentypen im Dataset.
    Lieferdatum = System.DateTime
    Datum = System.DateTime
    Abweichung = System.Int32

    Vielleicht lässt sich da etwas herleiten, wo ich was falsch mache.
    Danke für Eure Mühen!
    Das falsche Ergebnis? Dann brauchen wir wohl ein paar Beispiele.
    Row.Datum = 04.06.2021 09:52
    Row.Lieferdatum = 03.06.2021 23:59
    Differenz ist knapp 10 Stunden.
    Was soll dann Abweichung sein?

    Row.Datum = 02.06.2021 00:01
    Row.Lieferdatum = 01.06.2021 23:59
    Differenz ist 2 Minuten.
    Was soll dann Abweichung sein?

    Row.Datum = 02.06.2021 23:52
    Row.Lieferdatum = 01.06.2021 00:01
    Differenz ist 1 Tag, 23 Stunden, 51 Minuten.
    Was soll dann Abweichung sein?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Abweichung soll sich im Prinzip nur auf volle Tage unabhängig von der Uhrzeit beziehen. Sprich nur das Datum.
    Der Zeitraum 04.06.2021 0:01 - 04.06.2021 23:59 wäre somit 0 Abweichung und ab 05.06.2021 0:01 dann Abweichung 1.

    Jetzt scheine ich das Problem langsam zu erkennen, es wurden immer die Differenzen inklusive der Uhrzeit berechnet.
    Da habe ich mich missverständlich ausgedrückt.
    Dann kannst Du das leicht lösen: Row.Abweichung = CInt((Row.Datum.Date - Row.Lieferdatum.Date).TotalDays)
    Die Date-Komponente eines Datumswertes gibt das Datum um Mitternacht wieder. So wird aus 04.06.2021 10:20 eben 04.06.2021 00:00

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich bin begeistert. Wieder dem Ziel etwas näher gekommen. Vielen Dank!

    Im Zuge der Euphorie bin ich mal so dreist und komme mit einem weiteren Date-Thema.

    Beim Anlegen eines Auftrages wird per DatetimePicker das aktuelle Datum und die Uhrzeit gezogen.
    Das Festlegen des Lieferwunschdatums erfolgt ebenfalls über einen Datetimepicker. Jetzt kommt mein Problem. Für die Lieferwunschzeit habe ich eine Combobox mit Einträgen von vollen Stunden 8.00 - 18:00.
    Wie kann ich die Uhrzeiten vergleichen, sodass verhindert wird, wenn die aktuelle Uhrzeit 12:00 ist, die Auswahl 11:00 noch möglich ist? Entweder mit einer MSGBox gemeldet wird, dass die Lieferzeit nicht mehr möglich ist oder sogar die Combobox nicht mehr mögliche zeiten ausgraut.

    Ich hoffe, das ist verständlich formuliert

    Gruß Madde
    Das Ausgrauen von ComboBox-Einträgen ist ohne Tricks nicht möglich. Daher geh einen anderen Weg.
    MessageBox: ja, möglich. Dazu müsstest Du den DTP.Value (DateTimePicker-Wert) hernehmen Dim GewählteIstZeit = DeinDTP.Value.ToShortTimeString und das mit dem gewählten ComboBox-Eintrag vergleichen. Als User wäre es aber unnerviger, wenn ich statt ner MessageBox was anderes bekomme:
    Nur die möglichen Einträge. Nachdem der User also einen DTP-Wert festgelegt hat, wird dann nur noch berechnet, welche Lieferzeiten möglich sind und diese werden der leeren ComboBox als mögliche auswählbare Einträge hinzugefügt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Habe es jetzt erstmal mit einer MsgBox gemacht. Allerdings ist es noch nicht ganz sauber. Der Vergleich funktioniert aber es MUSS jetzt aus der Combobox eine Zeit gewählt werden.
    Da die Lieferung auch ohne Zeitvorgabe erfolgen kann, soll die Meldung auch nur kommen, wenn die Wahl in der ComboBox unter der IstZeit liegt.
    Ich vermute, ich könnte das evtl mit DateEingangsdatum.Value.ToShortDateString umsetzen, habe es aber nicht hinbekommen.

    VB.NET-Quellcode

    1. Dim GewählteIstZeit = DateEingangsdatum.Value.ToShortTimeString
    2. If DateLieferdatum.Text > DateEingangsdatum.Text Then
    3. Else
    4. If ComboBoxLieferzeit.Text <= GewählteIstZeit Then
    5. MsgBox("Die angegebene Lieferzeit ist nicht mehr möglich", MsgBoxStyle.Critical, "Fehler")
    6. Return
    7. End If
    8. End If

    Naja, wenn Du in der ComboBox als z.B. ersten Eintrag hast: ---, dann kannst Du das ja auch zum Vergleich hernehmen und dann die Überprüfung ignorieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.