gefilterte Daten aus Binding Source eportieren (xml)

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Noyne.

    gefilterte Daten aus Binding Source eportieren (xml)

    Hallo,

    schon wieder ich und meine Brillen Datenbank :)
    Ich habe soweit alles fertig als ParentChild View, was bestens funktioniert.
    Jetzt würde ich gerne gefilterte Daten in eine extra XML Datei schreiben, leider weis ich nicht genau wie ich die gefilterten Daten weg schreibe.
    mit:

    VB.NET-Quellcode

    1. Private Sub Archivierung()
    2. Dim archYear As String = InputBox("Welches Jahr soll archiviert werden?", "Archivierung", Now.Year)
    3. Dim _ArchivFile As New FileInfo(datPath & "\OptHart.arc") 'Archivdatei
    4. FassungBindingSource.Filter = "EinkaufJahr = '" & archYear & "'"
    5. OptHartDS.WriteXml(_ArchivFile.FullName)
    6. Reload()
    7. End Sub

    schreibt er mir ja alle Daten des ganzen Datasets weg.
    Wie kann ich nur die gefilterten Daten weg schreiben?
    Vielen Dank
    Grüße
    Michael
    "Hier könnte Ihre Werbung stehen..."
    Hmm... OK, klingt plausibel. wobei ich dann grad mehrere Probleme hab.
    ich muss ja dann auch datatables anlegen, oder? ich benötige ja die Daten gefiltert nach EinkaufJahr in einer neuen Tabelle. Und da haperts.
    Wie ich das filtere und nacher weg schreibe bekomme ich hin, aber die gefilterten datensätze auswählen und in eine neue Tabelle kopieren, schaff ich nicht.
    kannst Du mir nen Link geben wo es als Beispiel gezeigt ist, oder nen kleinen schubs in die richtige Richtung geben?
    Dankeschön
    "Hier könnte Ihre Werbung stehen..."
    ein OptHartDS erstellst du mit dem Schlüsselwort New. Da sind alle Tabellen drin - leer.
    Die Tabellen haben AddXY-Methoden, damit kannst du Datensätze adden.
    in Film VIII in die vier Views auf Video werden Datensätze herumkopiert - prinzipiell musste auch so vorgehen.

    Evtl. kannst du auch die untypisierte DataTable.ImportRow-Methode verwenden - ist vlt. sogar besser, weil dabei auch der Primärschlüssel kopiert wird.
    Die Syntax guck im ObjektBrowser nach, und guck auch auf MSDN - da könnte es auch Codebeispiele geben.
    Kannst deine Versuche auch posten, meist lässt sich was verbessern.
    ObjectBrowser? : VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Hallo,

    hab jetzt versucht das Video VIII auf meine DataSource anzupassen. Allerdings erhalte ich einen Überladungsfehler. Irgendwo verstehe ich das nicht ganz.
    Hier ist erstmal der Teil, den ich bereits erstellt habe:

    VB.NET-Quellcode

    1. Private Sub Archivierung()
    2. Dim tmpOptHartDS As New OptHartDS
    3. Dim _ArchivFile As New FileInfo(datPath & "\OptHart_" & archYear & ".arc") 'Archivdatei
    4. Dim rwHertseller = DirectCast(DirectCast(HerstellerBindingSource.Current, DataRowView).Row, HerstellerRow)
    5. Dim rwNewHerst = tmpOptHartDS.Hersteller.AddHerstellerRow(rwHertseller.Name)
    6. archYear = InputBox("Welches Jahr soll archiviert werden?", "Archivierung", Now.Year)
    7. For Each rowModell In rwHertseller.GetFassungRows
    8. tmpOptHartDS.Fassung.AddFassungRow( _
    9. rowModell.ID, rowModell.HerstellerID, rowModell.Modell, _
    10. rowModell.EinkaufJahr, rowModell.EK, rowModell.UVP, _
    11. rowModell.VK, rowModell.Reduzierung, rowModell.KalkFaktor, _
    12. rowModell.Faktor, rowModell.Bemerkung)
    13. Next
    14. End Sub

    Ich möchte eigentlich alle Datensätze der Tabelle Fassungen in eine neue XML schreiben, deren EinkaufsJahr dem angegeben Jahr entspricht.
    Doch irgendwo hab ich nen Denkfehler.
    Im Video wird ja die Category und deren zugehörigen Artikel kopiert. Bei mir müsste ich ja dann den Hersteller und dessen Fassungen kopieren, allerdings nur die, deren Einkaufsjahr auch dem selektierten entspricht.
    Oder kann ich einfach die Fassungen Tabelle selektieren und die selektierten Datensätze weg schreiben?
    dreh mich grad schwer im Kreis :(
    Danke für Eure Tips
    Grüße
    Michael
    "Hier könnte Ihre Werbung stehen..."
    Super! Vom Prinzip her scheinst du die typisierte Verwendung des typDataset geraffelt zu haben.

    MichaHo schrieb:

    Überladungsfehler
    verstehe ich dann aber nicht, denn die Intellisense gibt doch detailliert vor, welche Datentypen an welche Stelle richtig sind.
    Auch im ObjectBrowser kannst zu nochmal nachgucken, da die "Zusammenfassung" gibt dir doch die exakte Signatur an - das kannste sogar auskopieren und posten.
    Und natürlich ists gänzlich sinnlos, zu versuchen, was anderes anzugeben, als die Methode verlangt - also einen "Überladungsfehler" kann doch nur der erhalten, der noch nicht kapiert hat, dass eine Methode nur die Parameter akzeptieren kann, die sie verlangt.

    Oder aber du lässt das einfach bleiben.
    Zip einfach die komplette aktuelle Dataset-Datei, dann hast du ein perfektes Archiv, und größer als 5MB wird das auch kaum jemals werden.
    OK, hab ich jetzt verstanden und gleich geändert. Mein Code sieht jetzt so aus:

    VB.NET-Quellcode

    1. Private Sub Archivierung()
    2. Dim tmpOptHartDS As New OptHartDS
    3. Dim _ArchivFile As New FileInfo(datPath & "\OptHart_" & archYear & ".arc") 'Archivdatei
    4. Dim rwHertseller = DirectCast(DirectCast(HerstellerBindingSource.Current, DataRowView).Row, HerstellerRow)
    5. Dim rwNewHerst = tmpOptHartDS.Hersteller.AddHerstellerRow(rwHertseller.Name)
    6. archYear = InputBox("Welches Jahr soll archiviert werden?", "Archivierung", Now.Year)
    7. For Each rwFassung In rwHertseller.GetFassungRows
    8. tmpOptHartDS.Fassung.AddFassungRow(rwFassung.HerstellerRow, rwFassung.Modell, _
    9. rwFassung.EinkaufJahr = archYear, rwFassung.EK, rwFassung.UVP, _
    10. rwFassung.VK, rwFassung.Reduzierung, rwFassung.KalkFaktor, _
    11. rwFassung.Faktor, rwFassung.Bemerkung)
    12. Next
    13. Me.Validate()
    14. tmpOptHartDS.WriteXml(_ArchivFile.FullName)
    15. tmpOptHartDS.AcceptChanges()
    16. End Sub


    Allerdings erhalte ich einen Fehler:
    Eine nicht behandelte Ausnahme des Typs "System.Data.StrongTypingException" ist in OptHartDB.exe aufgetreten. Zusätzliche Informationen: Der Wert für Spalte Reduzierung in Tabelle Fassung ist DBNull.

    die Spalte Reduzierung hat aber einen Default Wert 0,00 und die AllowDBNull steht auf true.

    Gebe ich in den entsprechenden Zellen von Reduzierung etwas ein, kommt ein anderer Fehler mit dem ich nichts anfangen kann:

    Eine nicht behandelte Ausnahme des Typs "System.Data.InvalidConstraintException" ist in System.Data.dll aufgetreten. Zusätzliche Informationen: Für ForeignKeyConstraint FK_Hersteller_Fassung müssen die untergeordneten Schlüsselwerte (-6) in der übergeordneten Tabelle vorhanden sein.

    und die Sub Archivierung ist markiert.

    Verstehe ich so, das in der Tabelle Hersteller die Hersteller ID -6 nicht vorhanden ist,oder? Das ist sie aber definitiv.

    Also irgendwie wills net so wirklich :(
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Verstehe ich so, das in der Tabelle Hersteller die Hersteller ID -6 nicht vorhanden ist,oder? Das ist sie aber definitiv.
    im neuen OptHartDS ist sie wohl nicht vorhanden - jdfs. im gezeigten Code fügst du nur die Fassung zu, aber keinen Hersteller.
    Aber wie gesagt: Ein Datenmodell ist dann ein gutes Datenmodell, wenn es sich wie die Wirklichkeit verhält: Ohne Hersteller kann es eine Fassung nicht geben.

    Wie findest du übrigens meinen Vorschlag diese eigentümliche Auszugs-Archiviererei einfach zu lassen?
    Hi, den Vorschlag finde ICH super...
    Meine Frau hatte halt die Idee, Fassungen die es nicht mehr gibt und nach einigen Jahren in der Datenbank nicht mehr benötigt werden in ein Archiv zu schieben und aus der Datenbank zu löschen. Ich denke aber davon soll sie sich verabschieden, in einer Datenbank wird ja eigentlich nichts gelöscht, sondern nur aus der Anzeige ausgeschloßen.
    Ich hatte auch schon die überlegung für jedes EinkaufJahr eine neue Tabelle anzulegen, aber nach 2 Minuten hatte ich das auch verworfen...
    Die Archivierung wird erstmal weg gelassen, Fassungen die sie wirklich nicht mehr benötigt kann sie ja selbst aus der DB löschen und für den Notfall (falsch gelöschte Fassung) gibbet ja immernoch das Backup, was bei jedem Start der Anwendung direkt erstellt wird (wobei ich das noch mit einem Zeitstempel belegen werde, falls Frau was löscht, Speichern drückt und merkt MIST... )
    Ich denke durch das ParentChildView (was für die Übersicht und Eingabe Top ist) entstehen beim Filtern und weiter verarbeiten einige Fehler oder Problemchen.
    Ich geb ihr das Programm erstmal so mit, dann soll sie damit arbeiten und wir schauen mal wie es so klappt....
    Danke für Deine Unterstützung
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Meine Frau...
    (hihi - hab ich mir gedacht, und hab - voll diplomatisch - eine defätistische Bemerkung mir verkniffen)

    Generell entsteht hier die "Journal-Problematik" - also dass alle möglichen Datensätze zeit-behaftet sind, d.h., eine Fassung - sogar ein ganzer Hersteller! - mag iwann nicht mehr existieren.
    Mittm Journal-Pattern kenne ich mich nicht wirklich aus, aber meine erste Idee ist, solche Datensätze mit einer Column Vanished As Date
    auszustatten, und AllowNull=True, sodass man Filter setzen kann, die die obsoleten Datensätze aussortieren.
    Ganz minimal würde ja auch eine simple Boolean-Property Vanished reichen, das wäre besonders einfach zu verarbeiten.
    Heheh... Danke für die Diplomatie :)

    Ähhm, jetzt wirds kompliziert, aber ich verstehe was du meinst... und das wäre sicherlich hilfreich (nur wer setzt den Boolean Wert?)

    Ich glaube mein Problem ist immernoch das ParentChildViwe, denn ich sehe ja links alle Hersteller und rechts alle Modelle des ausgewählten Herstellers.

    Wenn jetzt allerdings Modelle verschiedener Hersteller "abgelaufen" sind, müsste ich ja irgendwie alle auf einmal selektieren, richtig? Und wo zeige ich die dann an? oder gar, wie lösche ich die alle auf einmal? Mit dem Zeitstempel, ginge es wahrscheinlich einfacher, denn das definiert ja das einkaufjahr.

    Alle Modelle Aller Hersteller deren Einkaufjahr = 2001 ist löschen (oder archivieren :-))
    "Hier könnte Ihre Werbung stehen..."
    Ahhh... jetzt fällt langsam der Groschen....

    Also ein ganz anderer Ansatz wie mein Frau eigentlich denkt.Ist dann ja auch kein riesending, wenn der Hersteller mitteilt Modell 0815 gibbet nit mehr, geht sie einfach in den Datensatz und füllt in Spalte "Vanished" oder eben "Verschwunden", "Aussortiert" oder what ever.

    Die saplte könnte ja dann auch eine combobox mit true oder false sein, oder? oder ne checkboxcolum... Das hört sich, je länger ich drüber nachdenke, RICHTIG gut an. BTW wie stelle ich das direkt im designer ein?
    "Hier könnte Ihre Werbung stehen..."
    DataGridViewCheckboxColumns und done.


    stimmt, hab isch grad gemerkt....

    aber wie stelle ich im Designer direkt ein das sobald dort der Haken gesetzt wird der Datensatz "verschwindet" (also ausgeblendet wird)
    "Hier könnte Ihre Werbung stehen..."
    geiler Scheiß... funktioniert wie Bolle :)

    ich könnte aber wetten das mein Frau (wenn sie gleich heim kommt und das Ergebnis sehen will) dann zu mir sagt: "und wenn ich mich da verdückt habe? oder ein Modell wieder da ist? wie krieg ich die zurück?"

    Tja, da müsste ich dann entweder hin fahren und die XML anpassen oder einen Knopp einrichten, den die Bindingsource filter wieder umdreht und nur die aussortierten anzeigt....

    Hmmm.... bau ich besser direkt ein :)

    EDIT: Jetzt verstehe ich auch was Du die ganze Zeit meintest mit archivieren.... ist doch so viel eleganter, einfach alle Fassungen raus die es entweder nicht mehr gibt oder anhand des EinkaufJahr (wenns dann doch gefordert ist) den BindingSource Filter setzen..... Möglichkeiten über Möglichkeiten die viel einfacher sind als das was ich den ganzen Morgen versuche in XML weg zu schreiben....
    Nochmal...geiler scheiß.... Vielen Dank für Deine tatkräftige Unterstützung, solangsam blicke ich wirklich durch :)
    "Hier könnte Ihre Werbung stehen..."
    Für manche Ansichten reichts, im Designer einzurichten, manchmal muss man eben zusätzlich auch eine Checkbox spendieren, die den Filter setzt oder wegnimmt.
    Oder eine Combobox - da kann man dann verschiedene Filter auswählen: unfiltered, not vanished, vanished only.

    prinzipiell alles angelegt im DataExpressions: Filter und berechnete Spalten im Dataset - Tut

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

    Japp, das Tut hab ich schon mehrfach durch, aber mir fehlte immer der Klick im Kopp... verstehe das ganze jetzt aber deutlich besser :)

    EDIT: @ErfinderDesRades muss doch nochmal nerven.
    Habe die Spalte ja zur bestehenden Tabelle hinzugefügt. Wenn ich jetzt einen neuen Datensatz anlege und die bearbeitung abschließe, verschwindet der Datensatz direkt. Ich habe dann in die XML geschaut und dort egsehen das er die Spalte "Aussortiert" nicht mit ins xml schreibt.
    Muss ich da noch was anderes tun? oder die Tabelle neu aufs datagridview ziehen? dann müsste ich alle anpassungen anden spalten neu machen...
    "Hier könnte Ihre Werbung stehen..."

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