Werte in Dataset Schreiben

  • VB.NET
  • .NET (FX) 4.0

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von M.Lehmann.

    Werte in Dataset Schreiben

    So da bin ich wieder,
    da ich nichts brauchbares an Infos gefunden habe was das Speichern von einen DataGridView ins csv betrift, habe ich mich jetzt entschlossen das ganze mit einen DataSet zu versuchen.

    So jetzt zu meinen Problem:
    Das Datagridview habe ich mittels Array gefüllt, das hat so ausgesehen:

    VB.NET-Quellcode

    1. DGVWerte.Rows.Add(slave, werte(2), werte(6), werte_A1(0), werte(3), werte(7), werte_A2(0), werte(4), werte(8), werte_A3(0), werte(5), werte(9), werte_A4(0))


    , hat auch alles super funktioniert, nur der Export ins XLS oder CSV war sehr umständlich. oder mit Fehlermeldungen Behaftet w.z.B. "Option Strict On" lässt spätes Binden nicht zu
    wie kann ich jetzt mit dem DataSet machen?
    als Datenbank habe ich Access verwendet und wenn ich das Programm starte, wird mir auch der Beispiel Datensatz den ich in Access eingeben habe im DataGridView angezeigt.

    Leider muss ich zugeben das ich mit Datenbanken eigentlich gar nichts am Hut habe, wäre nett wenn mir jemand dabei helfen könntet.
    :)
    Wie hast Du denn versucht, den Inhalt des typisierten DataSets (tDS) in eine XLS oder gar CSV-Datei zu exportieren? Das unterstützt ein tDS von Haus aus doch gar nicht.

    M.Lehmann schrieb:

    mit Fehlermeldungen Behaftet w.z.B. "Option Strict On" lässt spätes Binden nicht zu
    Mit welchem Code?
    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.
    noch gar nicht weil ich keinen plan habe wie man so was macht, denn eigentlich brauch das auch gar nicht, denn ich brauche eigentlich das ganz in einer sauber formatierten TXT Datei oder in einer CSV Datei.
    Den Fehler erhalte ich bei der Erstellung einer xls Datei, Datagridview ist nicht gebunden, da wird wol der Hund begraben sein.

    VB.NET-Quellcode

    1. Private Sub cmdXmlExport_Click(sender As Object, e As EventArgs) Handles cmdXmlExport.Click
    2. Dim xls_Appl As Excel.Application ' Excel Anwendung
    3. Dim xls_Mappe As Excel.Workbook ' Excel Arbeitsmappe
    4. Dim xls_Blatt As Excel.Worksheet ' Excel Blatt (Tabelle)
    5. Dim Anzahlzeilen As Integer
    6. Try
    7. [b]xls_Appl = New Excel.Application With {.Visible = True} ' Excel Instanz bilden
    8. xls_Mappe = xls_Appl.Workbooks.Add()[/b]
    9. xls_Blatt = CType(xls_Mappe.ActiveSheet, Worksheet)
    10. With DGVWerte
    11. For Spalte As Integer = 0 To .ColumnCount - 1
    12. xls_Blatt.Cells(1, Spalte + 1).Value = .Columns(.Columns(Spalte).DisplayIndex).HeaderText
    13. [b]xls_Blatt.Cells(1, Spalte + 1).Font.Bold = True[/b]
    14. 'xls_Blatt.Cells(1, Spalte + 1).aligent.center = True
    15. Next
    16. Anzahlzeilen = .Rows.Count
    17. If .AllowUserToAddRows = True Then
    18. Anzahlzeilen -= 1 ' Leerzeile abziehen
    19. End If
    20. For Zeile As Integer = 0 To Anzahlzeilen - 1
    21. For Spalte As Integer = 0 To .ColumnCount - 1
    22. xls_Blatt.Cells(Zeile + 2, Spalte + 1).Value = .Rows(Zeile).Cells(.Columns(Spalte).DisplayIndex).Value.ToString
    23. Next
    24. Next
    25. End With
    26. Catch ex As Exception
    27. MsgBox(".. Fehler beim Erstellen .. ! ")
    28. End Try
    29. End Sub


    die Fehler liegen in den Zeilen 8/9/25

    M.Lehmann schrieb:

    Datagridview ist nicht gebunden, da wird wol der Hund begraben sein.
    Jo, täte ich auch denken.
    Die Vorstellung, etwas ins DGV einzutragen ist schon verkehrt herum.
    Eingetragen wird ins Dataset (und was da eingetragen ist, zeigt sich auch im angebundenen DGV).

    Und exportiert wird auch nicht das DGV, sondern das typDataset kann man exportieren.
    Das ist sogar das einfachste, nämlich einfach myTypedDataset.WriteXml(filename).

    Ein geeignetes typDataset erstellst du dir am einfachsten, wenn du im Datenquellen-Fenster auf "Datenquelle zufügen" gehst, und dann auf "aus Datenbank...".
    ok, aber wie bringe ich jetzt meine Daten in das Dataset, das ist ja die eigentlich frage die ich habe.

    zur Erklärung warum für mich eine Datenbank keinen sinn macht, ich will nichts sortieren oder auf dauer speichern oder wieder ins Datagridview von der Datenbank einlesen. ich benötige das Datagridview nur um die gescannten Werte von MODBUS RTU anzeigen zu lassen und geben falls diese dann mittels Datei weiter zugeben.
    Kann aber auch sein das ich das Ganze falsch verstehe, deswegen und nur deswegen will ich das mit Dataset machen, wer weis vielleicht komme ich auf den Geschmack.
    DeinDataSet.DeineDataTable.AddDeineDataTableRow(Wert1, Wert2, Wert3, Wert4, Wert5, ...)
    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.

    M.Lehmann schrieb:

    zur Erklärung warum für mich eine Datenbank keinen sinn macht
    ou, das ist eine neue Information, und ist ausgezeichnet.
    Ohne Datenbank arbeitet es sich mit einem typDataset viel einfacher - hab ich nicht erwähnt, weil üblicherweise wollen die Leuts von ihrer Datenbank nicht lassen.
    Also was man alles mit einem typDataset anstellen kann, kannste auf vier Views-Videos angucken.
    Da wird auch gezeigt, wie man ein typDataset ohne DB designed, und in den BeispielSolutions ist glaub auch meist Speichern und laden mit drinne - wenn nicht, nochma fragen.
    Hallo zusammen,
    VaporiZed: das klappt leider nicht, bekomme immer die meldung "der Wert egal welcher Type kann nicht in DT_WerteDataSet.werteRow konvertiert werden.

    VB.NET-Quellcode

    1. DT_WerteDataSet.Werte.AddWerteRow(1)


    die Datenbank Heist " DT_Werte" in der Form habe ich jetzt DT_WerteDataSet/WerteBindingSource/WerteTableAdapter stehen.
    Hab ich da was vergessen?

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DT_WerteDataSet.Werte". Sie können sie bei Bedarf verschieben oder entfernen.
    5. Me.WerteTableAdapter.Fill(Me.DT_WerteDataSet.Werte)
    6. With dgv
    7. .AllowUserToAddRows = False ' User kann keine Zeilen hinzuf.
    8. .RowHeadersVisible = False ' Überheader ausblenden
    9. .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill ' Spalten füllen das DGV aus
    10. For i As Integer = 0 To 12
    11. .Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    12. .Columns(i).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
    13. Next
    14. End With
    15. End Sub
    16. Private Sub cmdDtFüllen_Click(sender As Object, e As EventArgs) Handles cmdDtFüllen.Click
    17. Dim Daten() As String = {"5", "40", "22", "0", "0", "0", "0", "0", "0", "0", "0", "0"}
    18. Dim varDaten As String
    19. 'DeinDataSet.DeineDataTable.AddDeineDataTableRow(Wert1, ...)
    20. For i As Integer = 0 To Daten.Length - 1
    21. DT_WerteDataSet.Werte.AddWerteRow(varDaten(i))
    22. Next
    23. End Sub
    24. End Class
    Das ist richtig, dass das nicht geht. Das liegt daran, dass das DataSet immer 2 AddWerteRow-Funktionen erzeugt. Eine, bei der eine fertige DataRow übergeben wird und eine, bei der alle Parameter in der DataTable-Spaltenreihenfolge angegeben werden, und zwar mit richtigen Typ. Offensichtlich übergibst Du falsche Wertetypen. Daher die Frage: Welche Spalten von welchem Typ in welcher Reihenfolge hat Deine DataTable? Typen und Reihenfolge musst Du nämlich einhalten. Aber da hilft Dir IntelliSense. Schreib einfach
    DT_WerteDataSet.Werte.AddWerteRow, dann Klammer auf und dann werden die benötigten Parameter angezeigt. Ggf. auf den kleinen Pfeil-nach-unten klicken, falls die Funktionsüberladung angezeigt wird, in der eine fertige DataRow gewollt wird.
    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.
    Vlt sollteste mein Tut doch genauer angucken.
    Da ist sicherlich irgendwo gezeigt, welche Methode du verwenden musst, und dasses davon immer 2 Überladungen gibt, und dass man die Überladung mit den vielen Argumenten wählen muss - nicht diejenige mit nur einem.
    Hmm - nu musst du vmtl. erst noch lernen, was eine Überladung ist - also das sind zwei verschiedene Methoden, aber mit demselben Namen. Und der Compiler erkennt anhand der Argumente, welche Überladung gemeint ist.
    Und so erklärt sich deine Fehlermeldung:
    Du rufst die Überladung mit nur einem Argument auf, und das ist die Überladung, die eine werteRow erwartet - und varDaten(i) ist sicherlich keine werteRow.
    Mehr zu diesen Dingen: Grundlagen: Fachbegriffe
    Das ist ein sehr wichtiges Tutorial, weil ohne Grundlagen und Fachbegriffe redet man zwangsläufig aneinander vorbei - wie es auch hier mit dir VaporiZed geschehen: VaporiZed zeigte dir so gut er kann (er hat ja nicht dein Dataset), die Überladung mit vielen Argumenten, und du tappst promt auf die falsche Überladung - mit nur einem Argument :P

    Ich zeige mal, wie deine cmdDtFüllen_Click() richtig aussehen müsste, vorrausgesetzt, dein gezeigter Code ist ansonsten korrekt und die Anzahl der Strings passt auf die Anzahl der Spalten in deine Dataset-Tabelle:

    VB.NET-Quellcode

    1. Private Sub cmdDtFüllen_Click(sender As Object, e As EventArgs) Handles cmdDtFüllen.Click
    2. 'DeinDataSet.DeineDataTable.AddDeineDataTableRow(Wert1, ...)
    3. DT_WerteDataSet.Werte.AddWerteRow("5", "40", "22", "0", "0", "0", "0", "0", "0", "0", "0", "0")
    4. End Sub

    Guck dir auch das Tut VisualStudio richtig nutzen - das zeigt u.a. wie Intellisense dir beim Code helfen kann.
    Intellisense ist sehr praktisch, weil was Intellisense dir nicht anbietet, das funktioniert meist auch nicht.



    mist - zu spät.
    Aber trotzdem: zieh dir die beiden Tuts rein, das sollte viel helfen zum Verständnis
    OK, danke für den Tip mit dem Kleinen Pfeil.
    War nur etwas mit der Aussage + 1 Überladung iteriert.
    So aber die Daten habe ich aber alle in einen Array und wie bekomme ich diese nun übertragen?
    Mit Daten(0) ... Daten(13), geht es ja auch, aber da muss es doch einen Besser Lösung geben.

    Beim Testen ist mir aufgefallen das die Werte 12 mal angezeigt werden?
    Fehler gefunden... ;( meine Dummheit
    Die vorgeschlagenen Tuts, werde ich mir genauer Anschauen!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „M.Lehmann“ ()

    Nein, leider geht es nicht besser. Wenn man sie erstmal im tDS hat, hat man den Erstimport geschafft. Aber unaufbereitete Daten muss man erstmal eben selber in tDS schaufeln, bevor man die tDS-Früchte ernten kann.
    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.
    Frage noch "Aber unaufbereitete Daten muss man erstmal eben selber in tDS schaufeln",
    wie müssten die Daten denn Ankommen das mann sie komfortabler ins tDS übertragen könnte.
    Denn wie gesagt sie werden über einen BUS eingelesen und wir Sprechen hier von 128 Register.
    Das währe mal ein Fast kompletter Satz von diesen Registern:
    /
    2 0 0 22 0 0 0 8 15 15 15 0 0 23727 0 0 0 0 0 22 0 0 0 23 0 0 0 0 0 0 0 1 0 0 0 0 0 -27536 -27536 1346 1353 22 2006 1995 0 450 0 -1 91 90 13 0 0 20 9000 7000 0 450 24 0 4 -27536 -27536 0 0 31 2 2 0 620 0 -1 0 0 13 0 0 20 9000 7000 0 620 24 0 4 -27536 -27536 0 0 31 2 2 0 620 0 -1 0 0 13 0 0 20 9000 7000 0 620 24 0 4 -27536 -27536 0 0 31 2 2 0 620 0 -1 0 0 13 0 0 20 9000 7000 0 620 24 0 0 1 2 0 18 1 0 231
    /
    Hmm - täte mich mal interessieren, was du wirklich vorhast. Etwa, was es dir bringen soll, solche Zahlenwüsten in einem DGV anzuzeigen.
    Und wie das überhaupt aussehen soll. Soll das DGV dann 128 Spalten haben?
    Und was willst du mit den Zahlen anfangen - editieren?

    Vielleicht muss man sich eine ganz andere Präsentation überlegen.

    Ich weis auch nicht, was ein BUS ist - ist das ein Dingens, was Text-Dateien generiert?
    Oder könnte ein BUS auch Daten direkt in eine DataTable schreiben?
    nein von den insgesamt 163 Register benötige ich zur Anzeige nur 23 Register.
    Mit BUS ist gemeint MODBUS RTU ist so was wie EIB BUS nur ist er Kostenlos.
    was will ich damit, mir die Arbeit vereinfachen.
    Was ist meine Arbeit, ich Programmiere Jalousie-Controller und muss diese auch warten.

    Also es ist so, ich komme zu dem Projekt und Scanne alle Controller ein, anhand der Liste im DataGridView kann ich dann sagen wo es Probleme gibt oder auch nicht, so müsste ich jeden Controller einzeln Scannen und mir dann diesen anschauen und das bei > 50 stück ist das eine menge Zeit die ich dafür benötige.

    Im Anhang siehst einen solchen Scann "ISTP_1 = Ist Position Jalousie Ausgang 1 / ISTW_1 = IST Position Winkel Ausgang 1 / G_A1 Ist die Gruppe zu der der Ausgang zugeordnet ist/ "A1_F" Fehlerstatus pro Ausgang ....ISTP_4 .
    Für mich sind erst einmal die Gruppen und Fehlermeldungen Interessant, da bei einen Fehler wie Kurzschluss der Jeweilige Ausgang auf Gruppe 4 gelegt wird.
    Anhand meiner Planung weis ich dann, das dass nicht Korrekt ist und kann mich dann gezielt um den jeweiligen Controller/Jalousie kümmern.

    Also was da noch dazu kommt ist der Fehler Status, dann ist das Formular komplett.
    Warum Speichern, es ist auch ein nachweis für den Kunden, wenn es zu Reparaturen kommen sollte.

    Was ich mir gedacht habe ist, das mann in einer Datenbank die gescannten Daten Project und Datums abhängig verwalten kann.

    Projekt xyz
    Datum
    Scann mit Zeitstempel

    Hab mal Projekt Daten Dazugeben

    Ich hoffe ich konnte es dir einigermaßen erklären.?
    Bilder
    • Project.png

      139,36 kB, 1.062×422, 97 mal angesehen
    Dateien

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „M.Lehmann“ ()

    M.Lehmann schrieb:

    Mit BUS ist MODBUS RTU ist so was wie EIB BUS nur ist er Kostenlos.
    Ah ja, nee, is klar. Ich nehm immer den Bus der Linie 27, um in die Stadt zu kommen ?(
    Wie kommen denn die Daten per Scan in Dein Programm rein? Alle einzeln oder das Zahlengewirr aus Post#15 auf einmal? Wenn auf einmal, könntest Du an dem Leerzeichen trennen und alle einzelnen Strings (oder in welcher Form kommen die Daten rein?) in Integer umwandeln. Dann wär es m.E. tatsächlich sinnvoll, diese direkt ins DGV einzutragen und somit indirekt in die DataTable.
    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.
    Sie werden Register für Register ein eingelesen.

    VB.NET-Quellcode

    1. res = myProtocol.readInputRegisters(slave, startRdReg, readVals, numRdRegs)
    2. lblResult2.Text = "Result: " & BusProtocolErrors.getBusProtocolErrorText(res) & vbCrLf
    3. If res = BusProtocolErrors.FTALK_SUCCESS Then
    4. lblReadValues.Text = ""
    5. For i = 0 To numRdRegs - 1
    6. lblReadValues.Text = lblReadValues.Text & readVals(i) & " "
    7. Next
    8. End If


    , oder in ein Array.

    M.Lehmann schrieb:

    Was ich mir gedacht habe ist, das mann in einer Datenbank die gescannten Daten Project und Datums abhängig verwalten kann.
    Das kann man wie gesagt viel besser ohne Datenbank, nämlich in einem typisierten Dataset.
    Und dann müsste man sich ein Datenmodell ausdenken, was deine Arbeitswelt richtig modelliert, ich stelle mir da sowas vor mit
    Standorten
    Und jeder Standort hat mehrere Jalousinen
    Und jeder Standort wird mehrmals gescant
    Und jeder Scan hat Datum, die 23 Zahlen + Fehlermeldung (oder besser Status-Meldung - weil kann ja auch mal was funktionieren)
    Vielleicht treten pro Scan auch alle Jalousinen des Standorts auf, oder JalousinController (was immer das sein mag).

    Ja, das ist immer ein Problem: Ich weiss, wie man ein Datenmodell bastelt, und du weisst, wie die Realität aussieht, die im Datenmodell zu modellieren ist.
    Wenn beides zusammenkommt, kann auf sehr elegante Weise eine sehr leistungsfähige Anwendung entstehen.

    Jdfs. anders als mein Vorposter neige ich jetzt doch zum Standard-Verfahren, wo die Daten ins Dataset kommen, und nicht direkt ins DGV.
    Weil dein Bild zeigt die Anlage von Datensätzen, und die Zahlen sind wirklich Werte benamter Eigenschaften, wenn auch komische Namen wie ISTP, G oder A.

    Also was du IMO brauchst ist das im 4-Views-Tut gezeigte KnowHow.
    Und dann müsstest du mal versuchen, ein Datenmodell in einem typDataset anzulegen, und erklären.
    Da könnte man dann drüber reden und überlegen, wie's optimal auszulegen wäre.

    Auf jeden Fall sehe ich schonmal die Tabellen
    Standort und Scan,
    also ein Standort wird offsichtlich öfter mal gescant.
    Welche Daten nun bei einem Scan aufgenommen werden (woraus sich weitere Tabellen ergeben) habich keine Ahnung - da muss iwie ein Datenmodell der technischen Infrastruktur bei rauskommen, vmtl. iwas mit Jalousine, Controller, Ausgang, AusgangTyp, etc...