| |
VB.NET - Ein- und UmsteigerDatensatz 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 | |
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
| |
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 | |
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
| |
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)] | |
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)] | |
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.
| |
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 | |
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)] | |
Re: Datensatz duplizieren | | | Autor: spatzimatzi | Datum: 29.07.14 17:42 |
| Hallo DotNetErbse,
das mit dem Unterschied habe ich nicht verstanden
Gruß
spatzimatzi | |
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 | |
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)] | |
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 | |
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.
| |
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
| |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|