CRecordSet - einen Datensatz kopieren



  • Also muss ich auf jeden Fall jedes einzelne Feld bearbeiten, oder?
    Einfach den ganzen Datensatz duplizieren (in die selbe Tabelle) geht dann wohl nicht...

    Der Hintergrund ist, dass sich die Datenstruktur wohl noch mehrfach verändern wird und ich somit jedesmal beispielsweise ein neues Feld im Programm zufügen muss.

    Na, dann werde ich mich wohl an diese Fleißarbeit machen...



  • na oder halt nen SQL script schreiben was du in der konsole deiner DB laufen lässt, ist einfach zu ändern und wieder auszuführen.

    wobei warum willst du alle daten in der gleichen tabelle duplizieren, dann haste die doch mehrfach drin stehen, das macht doch keinen sinn, dann würde ich das mit ner versionskontrolle machen und ner tabelle wo ich die version drin hab, dann kann ich die tabellen entsprechend laden und für den rest defaultwerte setzen und beim zurückschreiben die version erhöhen, so kann dein neues programm automatisch alte tabellen aktualisieren.



  • Das war wohl ein Missverständnis:
    Ich will nicht alle Daten einer Tabelle kopieren, sondern lediglich einen einzelnen Datensatz, wobei bis auf 2 oder 3 alle Felder identisch seion sollen.

    Hintergrund:
    Zu verschiedenen Artikeln sind Produktionsdaten in einer Tabelle hinterlegt (Maschinenprogramm, verschiedene Maschineneinstellungen...).
    Nun haben aber oft mehrere Artikel die selben Produktionsdaten, unterscheiden sich lediglich im Rohmaterial. Um nun nicht für jeden Artikel alle Daten neu eingeben zu müssen, soll ein bestehender Datensatz komplett dupliziert und lediglich die Artikelspezifischen Felder sollen angepasst werden. Unter anderem natürlich auch der Primärschlüssel (Artikelnummer).



  • @AndRo67
    Je nachdem welches Datenbanksystem Du im Einsatz hast, wäre ein Trigger/Stored Procedure eine mögliche Lösung.

    Gruß
    foo



  • Das klingt jetzt aber nicht nach der einfachen Lösung, die ich mir erhofft hatte...

    In einem anderen Datenbanksystem, mit dem ich mal gearbeitet hatte, konnte einfach im aktuellen Datensatz der Primärschlüssel auf den neuen Wert gesetzt werden und dann statt wie bei ODBC mit Edit() und Update() jetzt ein Insert() ausgeführt werden. Dadurch wurde der aktuelle Datensatz mit dem geänderten Primärschlüsselwert als neuer Datensatz geschrieben.
    Aber so einfach scheint es wohl leider nicht zu gehen...

    Ich werde dann wohl die händische Lösung mit Zwischenspeichern der Variablenwerte und Neuschreiben nach AddNew() implementieren.

    Aber auf jeden Fall Danke für die Anregungen... 🙂



  • AndRo67 schrieb:

    Das klingt jetzt aber nicht nach der einfachen Lösung, die ich mir erhofft hatte...

    In einem anderen Datenbanksystem, mit dem ich mal gearbeitet hatte, konnte einfach im aktuellen Datensatz der Primärschlüssel auf den neuen Wert gesetzt werden und dann statt wie bei ODBC mit Edit() und Update() jetzt ein Insert() ausgeführt werden. Dadurch wurde der aktuelle Datensatz mit dem geänderten Primärschlüsselwert als neuer Datensatz geschrieben.
    Aber so einfach scheint es wohl leider nicht zu gehen...

    Ich werde dann wohl die händische Lösung mit Zwischenspeichern der Variablenwerte und Neuschreiben nach AddNew() implementieren.

    Aber auf jeden Fall Danke für die Anregungen... 🙂

    Die Verwaltung der Primärschlüssel handeln verschiedene Datenbanksysteme eben auch verschieden. Weiterhin geht das was du machen willst ja auch nur, wenn du Werte für die einzelnen Spalten hast, die mehrfach vorkommen dürfen. Ich denke, dass wie bereits von CTecS beschrieben das Ganze mittels Skript einfacher umzusetzen ist.



  • Das übersteigt dann aber meinen Horizont als Gelegenheitsprogrammierer doch leider etwas...(errötenderSmiley)

    Variablen zuweisen klappt besser. Daher werde ich es wohl eher auf die "idiotensichere" Weise probieren:

    CString Feld1Wert
    ...
    Feld1Wert = Set.m_Feld1;
    ...
    Set.AddNew();
    Set.m_Primaerschluessel = IrgendeinNeuerWert;
    Set.m_Feld1 = Feld1Wert;
    ...
    Set.Update();
    

    Ist zwar etwas Fleißarbeit und will gepflegt werden, aber da weiß ich wenigstens, was ich tue.. 🤡



  • AndRo67 schrieb:

    Das übersteigt dann aber meinen Horizont als Gelegenheitsprogrammierer doch leider etwas...(errötenderSmiley)

    Variablen zuweisen klappt besser. Daher werde ich es wohl eher auf die "idiotensichere" Weise probieren:

    CString Feld1Wert
    ...
    Feld1Wert = Set.m_Feld1;
    ...
    Set.AddNew();
    Set.m_Primaerschluessel = IrgendeinNeuerWert;
    Set.m_Feld1 = Feld1Wert;
    ...
    Set.Update();
    

    Ist zwar etwas Fleißarbeit und will gepflegt werden, aber da weiß ich wenigstens, was ich tue.. 🤡

    Naja, nur das wird fehlschlagen wenn in der Datenbank hinterlegt ist, dass z.B. das Feld1 keine Wiederholungen zulässt. Wenn du die Datenbank selbst entworfen hast, dann kennst du auch deren Aufbau. Nur generell gesagt geht's nicht so einfach. Welches Datenbankmanagemenntsystem verwendest du denn?



  • AndyDD schrieb:

    Naja, nur das wird fehlschlagen wenn in der Datenbank hinterlegt ist, dass z.B. das Feld1 keine Wiederholungen zulässt. Wenn du die Datenbank selbst entworfen hast, dann kennst du auch deren Aufbau. Nur generell gesagt geht's nicht so einfach. Welches Datenbankmanagemenntsystem verwendest du denn?

    das wird so und so Fehlschlagen weil er auf seinen Primärwert keinen x-belibigen Wert setzen kann, wenns den Wert schon gibt wird jede Datenbank streiken und den Datensatz nicht wegschreiben

    Bau dir doch einfach ein SQL script das du entweder in der zur datenbank gehörenden Oberfläsche oder in ner Datenbankkonsole oder halt über dein Programm ausführen lässt, das ist das einfachste und schnellste, das Script kannst du in sekunden anpassen fals ein Pararmeter dazu kommt oder Weg fällt, so hab ich das auch gemacht um Tabellen und so weiter für ein größeres Projekt automatisch anlegen zu lassen, script liegt dann halt mit im Programmverzeichnis, wem stört das denn

    Zum SQL-Befehl Insert findest du massen Beispiele im Netz



  • CTecS schrieb:

    das wird so und so Fehlschlagen weil er auf seinen Primärwert keinen x-belibigen Wert setzen kann, wenns den Wert schon gibt wird jede Datenbank streiken und den Datensatz nicht wegschreiben

    Ja da hast du Recht. Aber man kann oft einen Wert für ein Autoincrement-Feld vorgeben, der dann tatsächlich auch übernommen wird. Sicher raucht es, wenn es den schon gibt. Generell sollten die Datenbankmanagementsysteme solchen Blödsinn von Haus aus unterbinden.



  • Ich arbeite mit Microsoft SQL-Server 2000 über die ODBC-Schnittstelle (CRecordSet).
    Der Primärschlüssel (Produktcode des zu fertigenden Artikels) ist das einzige Feld, das in der betreffenden Tabelle nicht doppelt vorkommen darf, und beim Versuch mit einem doppelten Schlüssel zu "updaten" kann ich den sich ergebenden Fehler abfangen... Soweit also kein Problem.

    Aber das mit dem SQL-Insert-Befehl schaue ich mir mal an - vielleicht kapiere sogar ich das... 😃
    SQL-Befehle über ODBC absetzen funktioniert jedenfalls...


Anmelden zum Antworten