vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Datensatz duplizieren 
Autor: spatzimatzi
Datum: 28.07.14 15:12

Hallo,
möchten unterschiedliche Datensätze duplizieren.
Dabei sollen z.T. umfangreiche Anpassungen am neuen Record vorgenommen werden.
Die Informationen liegen auf einem SQL-Server.

Würdet Ihr die Aktion auf dem Server erledigen oder lieber auf NET-Seite.

Meine Idee ist, den Datensatz zu lesen und in eine DataTable zu schreiben.
Innerhalb der DataTable den Datensatz kopieren und die DataTable dann wieder
in Richtung Datenbank zu schreiben.

Meine Fragen:
1.
Ist meine Vorgehennsweise richtig?

2.
Wie kopiere ich einen kompletten Datensatz?
Ich kenne nur die Neuanlage und dann müsste ich alle einzelnen Felder anprechen.
Das wäre bei mir mit viel Arbeit verbunden.

3.
Sollte man die komplette DataTable kopieren.
Kann ich zum Schreiben den DataAdapter vom Lesen verwenden?

Gruß
spatzimatz
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: spatzimatzi
Datum: 28.07.14 16:04

Hallo,
beim Stöbern im Netz ist mir noch folgende Idee gekommen:
Da der zu kopierende Datensatz sehr viele Felder hat,
würde ich gern wie folgt vorgehen:

1. Lesen des Satzes mit einem einfachen SQL-Script: SELECT * FROM Tabelle
2. Entfernen der Felder, die nicht benötigt werden
Feld mit Timestamp
Feld mit automatischer Datumsvergabe
Schlüsselfeld als Increment-Feld
3. Kopieren des angepassten Datensatzes in ein neues DataSet
4. Anpassung der Feldinhalte
5. Schreiben in die Tabelle der Datenbank

Jetzt meine Fragen:
1. Wie entferne ich die Felder, die ich nicht benötige?
2. Kann man über den CommandBuilder ein Insert-Script erstellen lassen?

Im Moment stehe ich ein wenig auf dem Schlauch.

Gruß
spatzimatzi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: effeff
Datum: 28.07.14 19:13

Also... Es reicht doch, einfach nur bei der Abfrage die Felder zu berücksichtigen, die Du benötigst... gewissermaßen ein "SELECT Vorname, Nachname, Straße, Ort FROM Tabellenname", falls das deutlicher ist...

Aber warum in alles in der Welt willst Du die Daten denn in eine andere Tabelle schreiben?

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: ModeratorDaveS (Moderator)
Datum: 28.07.14 20:44

Es gibt "Select Into"

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: spatzimatzi
Datum: 29.07.14 09:59

Hallo,
warum möchte ich einen Datensatz duplizieren?
Der Anwender soll die Chance haben, einen Datensatz zu duplizieren und dann anzupassen als einen Datensatz komplett mit allen Daten neu anzulegen. Thema: Zeitersparnis
Und da es sich um eine Tabelle (in Zukunft viele Tabellen) mit vielen Spalten handelt, möchte ich nicht jede Spalte explizit auswählen, sondern alle wählen und die nicht benötigten entfernen.
Ein weiterer Vorteil ist, dass bei Tabellenänderung keine Anpassung notwendig ist.

Natürlich habe ich mir auch Gedanken darüber gemacht, ob die Duplizierung auf NET oder direkt auf dem Server stattfinden soll.
Meine Idee ging und geht in Richtung NET, da beim Duplizieren auch direkte Datenanpassungen notwendig sein werden. Und die sind meines Erachtens auf NET-Seite einfacher zu realisieren.

Die Aktion "Duplizieren" soll möglichst ohne viel Script ablaufen.
- Daher das Lesen des komplette Ursprungsatzes mit SELECT * FROM Tabelle WHERE ...
- Entfernen der störenden Spalten
- Kopie ziehen vom gelesenen Datensatz
-- Hier sehe ich nur die Möglichkeit mit NEW: D.h. viel Schreibarbeit und bei Tabellenänderung
-- keine Anpassung notwendig.
-- oder der Ausweg über das Kopieren des DataSet. Einfach, schnell und komplett
- Zurückschreiben der DataSet-Kopie

Ich weiss nicht, ob meine Theorie zu verwirklichen ist. Evtl. bin ich auf dem Holzweg.
Vielleicht gibt es auch einen viel schöneren Weg.

Freue mich über jede Information

Gruß
spatzimatzi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: DotNetErbse
Datum: 29.07.14 14:00

du meinst

Insert into select ??

Mit freundlichen Gr??en
DotNetErbse


[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: DotNetErbse
Datum: 29.07.14 14:02

hi, das kenne ich auch.

Manchmal hat man "Template"-Daten, die werden dann halt dupliziert und dann weiterverarbeitet.
Für den nächsten Fall hat man dann wieder ein Original zum kopieren...

Mit freundlichen Gr??en
DotNetErbse


[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: ModeratorDaveS (Moderator)
Datum: 29.07.14 14:20

Nein. Ich meine Select Into.
FYI:
http://technet.microsoft.com/en-us/library/ms190750(v=sql.105).aspx

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: Rippler
Datum: 29.07.14 15:13

falls du daran festhältst alle Spalten einzulesen:

Brauchst du die störenden Spalten nicht zu löschen, sondern nur
die Spalten in den Steuerelementen anzeigen, die du benötigt.

Falls du ein Listview benutzt kannst du die nicht benötigten Spalten
ausblenden, in dem du die Spaltenbreite auf 0 setzt.

mit Clone kann man einen kompletten Recordset kopieren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: spatzimatzi
Datum: 29.07.14 16:37

Hallo,
habe das Gefühl, wir reden aneinander vorbei.
Zunächst ist mir aufgefallen, das einige Forennutzer die Server-Seite ansprechen, andere hingegen geben Tipps zum Net.
Auch habe ich meinen Wunsch noch nicht richtig dargestellt.
In einer Übersichtsseite (DataGridView) kann man über ein Kontext-Menu Artikel anschauen, bearbeiten löschen und kopieren. Wählt man anschauen, so ist man im Artikel und es stehen weitere Informationen, wie Notizen, Preise und Rabatte zur Verfügung. Diese letztgenannten Infos stehen natürlich nicht in der Tabelle Artikel.
Wählt man im Kontext-Menu "Kopieren", so möchte ich den Stammsatz des Artikels und die vielen abhängigen Datensätze in den Notizen, Rabatten und Preise kopieren.
Der Anwender bekommt eine Dublette. Diese Dublette wird nach dem Kopieren direkt aufgerufen und der Anwender beginnt mit den Veränderungen, die automatisch noch nicht angepasst wurden.

Programmtechnisch könnte ich in den betroffenen Tabelle die Kopien per "NEW" aufnehmen und mit dem DataAdapter updaten.
Leider sind die Tabellen in der Anzahl Spalten sehr gtroß und mit Tabellenänderungen muss auch gerechent werden.
Daher meine Überlegungen mit dem COPY des DataSets.

Wie gesagt: Vielleicht habe ich mich vergaloppiert.

Für Anregungen bin ich dankbar
spatzimatzi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: DotNetErbse
Datum: 29.07.14 16:52

ok, wo liegt der Unterschied? Ist das performanter?

Mit freundlichen Gr??en
DotNetErbse


[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: spatzimatzi
Datum: 29.07.14 17:42

Hallo DotNetErbse,
das mit dem Unterschied habe ich nicht verstanden

Gruß
spatzimatzi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: ModeratorDaveS (Moderator)
Datum: 29.07.14 19:01

Wenn du den Unterschied zwischen Insert Into Select und Select Into meinst dann erfüllen sie unterschiedliche Zwecke. Insert Into Select fügt neue Sätze in eine bestehende Tabelle ein. Select Into legt eine neue Tabelle an. Aber nach deinem letzen Beitrag schätze ich, dass das eher irrelevant ist. Obwohl ich dein Vorhaben leider noch nicht ganz verstanden habe.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: spatzimatzi
Datum: 29.07.14 20:25

Hallo,
möchte das Duplizieren weder mit "Insert Into Select" noch mit "Select Into" durchführen, sondern mit NET-Funktionalität.
#DaveS:
Was möchte ich: Der Anwender soll einen neuen Artikel anlegen mit allen Abhängigkeiten.
Dazu erstellt er ein Template von einem ähnlichen Artikel. Das Template wird dann bearbeitet.

Gruß
spatzimatzi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: DotNetErbse
Datum: 30.07.14 08:02

@Dave:
erst mal herzlichen Dank für die Erklärung, das war mir so nicht klar, weil meine Tabellen immer schon da sind, bevor ich die benutze.

@spatzimatzi:
ja, Du hast Recht, Du solltest die "Duplizierung" über die Objekthierarchie machen.
Benutzt Du einen ORM zwischen Objekten und DB?

Mit freundlichen Gr??en
DotNetErbse


[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: spatzimatzi
Datum: 30.07.14 15:52

Hallo,
irgendwie komme ich nicht weiter und brauche Eure Unterstützung!

Ich hatte ja geschrieben, das ich den zu kopierenden Datensatz komplett lese, Spalten die ich nicht benötige entferne und den Rest in ein neues DataSet (neue Tabelle) kopiere.
Danach wird der Datensatz verändert. RowState steht auf Modified. Alles OK

Danach erzeuge ich mit Hilfe des CommandBuilder ein Update-Script:
UPDATE [tblArtikel] SET [ArtikelNummer] = @p1, [DelFlag] = @p2, [Matchcode] = @p3, ....... [Bemerkung] = @p40 WHERE (([ArtikelIdent] = @p41))

Mit Hilfe des DataAdapter wird ein Update auf diese Tabelle durchgeführt. Alles OK
Nach dem Update ist RowState = Unchanged. Alles OK

Aber ein Änderung auf der DB findet nicht statt! Nichts ist gut!!!!
Es wird keine Fehlermeldung ausgegeben. Ich vermute, das die WHERE-Bedingung nicht erfüllt wird und für den DataAdapter der Fall abgeschlossen ist.

Jetzt meine Frage:
Kann man sich den kompletten Inhalt des Update-Scriptes incl. der Werte (Übersetzung der Variable @p1 bis @p41) ausgeben lassen.
Damit könnte ich dann direkt auf die DB zugreifen und einen Test fahren.
Wenn das nicht möglich ist, kann ich in Erfahrung bringen, welche Werte sich hinter den Variablen @p1 bis @p41 verbergen.

Gruß
spatzimatzi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: Kuno60
Datum: 31.07.14 06:15

Hallo spatzimatzi,

ich habe Ähnliches mal in einem alten Projekt gemacht, wo ich ausgewählte Zeilen in einem DataGridView kopiert und am Ende hinzugefügt habe.

Hier 2 Beispiele, einmal mit DataSet und einmal mit LinqToSql.
Vielleicht nützt es Dir was.

  Dim DB As New DataClasses1DataContext
 
  Private Sub HauptForm_Load(sender As Object, e As EventArgs) Handles _
    MyBase.Load
    Me.ArbeitsstundenTableAdapter.ClearBeforeFill = True
    Me.ArbeitsstundenTableAdapter.Fill(Me.AStdDataSet.Arbeitsstunden)
    Me.ArbeitsstundenBindingSource2.DataSource = DB.Arbeitsstunden
  End Sub
 
  'Für DataSet
  Private Sub ButtonZeilenKopieren1_Click(sender As Object, e As EventArgs) _
    Handles ButtonZeilenKopieren1.Click
    Dim sr = Me.ArbeitsstundenDataGridView1.SelectedRows.Cast(Of _
    DataGridViewRow)()
    For Each r In sr
      Dim satz = DirectCast(r.DataBoundItem, DataRowView)
      Dim z = DirectCast(satz.Row, AStdDataSet.ArbeitsstundenRow)
      Me.ArbeitsstundenTableAdapter.Insert(z.IDAG, z.Datum, z.TypID, z.Stunden, _
        z.ZeitVon, z.ZeitBis, z.Baustelle, z.Info)
    Next
    '-----------------
    'speichern
    Me.ArbeitsstundenTableAdapter.Update(Me.AStdDataSet)
    '-----------------
    Aktualisieren()
  End Sub
 
  'Für LinqToSql
  Private Sub ButtonZeilenKopieren2_Click(sender As Object, e As EventArgs) _
    Handles ButtonZeilenKopieren2.Click
    Dim sr = Me.ArbeitsstundenDataGridView2.SelectedRows.Cast(Of _
    DataGridViewRow)()
    For Each r In sr
      Dim z = DirectCast(r.DataBoundItem, Arbeitsstunden)
      Dim a = New Arbeitsstunden With {.IDAG = z.IDAG, .Datum = z.Datum, .TypID _
        = z.TypID, .Stunden = z.Stunden, .ZeitVon = z.ZeitVon, .ZeitBis = _
        z.ZeitBis, .Baustelle = z.Baustelle, .Info = z.Info}
      DB.Arbeitsstunden.InsertOnSubmit(a) 'hinzufügen
    Next
    '-----------------
    'speichern
    DB.SubmitChanges()
    '-----------------
    Aktualisieren()
  End Sub
 
  Private Sub Aktualisieren()
    'Für DataSet
    Me.ArbeitsstundenTableAdapter.Fill(Me.AStdDataSet.Arbeitsstunden)
    Me.ArbeitsstundenBindingSource1.MoveLast()
    '-----------------------------------------------------------------
    'Für LinqToSql
    DB = New DataClasses1DataContext
    Me.ArbeitsstundenBindingSource2.DataSource = DB.Arbeitsstunden
    Me.ArbeitsstundenBindingSource2.MoveLast()
  End Sub
Ich habe 2 DGV's auf der Form und 2 Buttons.
Alle aufgewählten Zeilen (über RowHeader), werden beim Klick auf einen Button kopiert und am Ende der Tabelle hinzugefügt.

Die neuen Zeilen werden direkt der Datenbank hinzugefügt und gespeichert, erscheinen aber nicht im DGV.
Auch ein BindingSource.Reset hilft da nicht.
Beim DataSet muss die Tabelle neu gefüllt werden und bei LinqToSql muss der Context neu erstellt werden (Sub Aktualisieren), erst dann erscheinen die neuen Daten im DGV.

Wenn Du untergeordnete Tabellen hast, so müssen die entsprechenden Datensätze ebenfalls kopiert werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datensatz duplizieren 
Autor: Franki
Datum: 03.08.14 01:07

spatzimatzi schrieb:
Zitat:


Was möchte ich: Der Anwender soll einen neuen Artikel anlegen

Wie regelst du das denn wenn der Anwender eine komplett neuen Artikel anlegen möchte? Da gibt es ja noch keine Datenbasis, ich vermute, dass du ihm ein Formular mit Eingabefeldern, Auswahlmöglichkeiten usw. bietest wo er seine Daten zum neuen Artikel anlegen kann.

Zitat:


mit allen Abhängigkeiten.
Dazu erstellt er ein Template von einem ähnlichen Artikel.
Das Template wird dann bearbeitet.


Und hier musst du genau so verfahren als wenn es sich um einen komplett neuen Artikel handeln würde. Die Eingabefelder, Auswahlmöglichkeiten kopierst du vom zu duplizierenden Artikel in das Formular als Vorbelegung für den neuen Artikel. Erst wenn der User speichert wird ein neuer Datensatz in die Tabelle(n) geschrieben. Genau so wird auch erst in die DB bei der Neuanlage eines nicht vorhandenen Artikels geschrieben wird.

Was du da versuchst ist zwar schön und gut aber eher kontraprodukiv schon im DBV bzw. der DB beim Aufruf der Duplizierfunktion schon einen neuen Datensatz anlegen zu wollen. Denn es könnten keine Änderungen vom User vorgenommen werden (Artikelnummer muss aber zwingend anders sein) oder der Vorgang abgebrochen werden oder was auch immer.

Beim Duplizieren (was durchaus üblich ist) verfahre ich immer so, dass ich das erst auf die DB los lasse wenn der User speichert. Es bringt keinen Geschwindigkeitsunterschied, ob der User einen Artikel komplett neu erfasst oder er auf einem bereits vorhanden aufbaut in Sachen Performance.

Gruß
Frank




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel