Frage zur Funktion UPDATE

  • Hallo,

    ich möchte gerne innerhalb einer Datenbank den gesamten Inhalt einer Tabelle in eine andere zweite Tabelle schreiben.
    Dabei ist zu wissen das die Zeile in der zweiten Tabelle schon existiert. Deshalb müsste es mit Update gemacht werden.
    Jetzt sind das aber ziehmlich viele Zellen in der Zeile und ich wollte mir nicht die Finger wund schreiben.
    Wenn es hier eine neue Zeile wäre die ich in der zweiten Tabelle eintragen wöllte dann könnte man das mit
    diesen hier machen:

    SQL
    INSERT INTO 'tabelle2' SELECT zelle1, zelle2, zelle3, zelle4, zelle5 FROM 'tabelle1' WHERE zelle1 = '1' ;

    meine Frage wäre gibt es da was vergleichbares für die Updatefunktion?
    Gefunden habe bisher nur dieses hier:

    SQL
    UPDATE 'tabelle2' SET zelle1 = (SELECT zelle1 FROM 'tabelle1' WHERE zelle2 = '2') WHERE zelle1 = '1';

    Aber da bezieht sich das ja nur auf die zelle1 der tabelle 2.
    Wenn ich das nehmen würde müsste ich gefühlte 20.000.000 diesen Befehl schreiben... :S
    Kann mir da jemand was zu schreiben ? ?(

    Gruß Jan

    Einmal editiert, zuletzt von JanausSm (14. Dezember 2011 um 14:30)

  • Vielleicht hilft Dir ja so eine Funktion weiter.
    Wenn Du alle neuen Werte in einem Array hast....

    [autoit]

    Func _ReplaceRecord($TableName, $aValues, $ID) ;Replace Record with ID
    Local $sValues = $ID & ", '" ;Create SQL String for inserting into the table
    For $i = 0 To UBound($aValues) - 1
    $sValues &= $aValues[$i] & "', '"
    Next
    $sValues = StringTrimRight($sValues, 3)

    [/autoit][autoit][/autoit][autoit]

    $Ret = _SQLite_Exec($hDatabase, "INSERT OR REPLACE INTO " & $TableName & " VALUES (" & $sValues & ")")
    If $Ret = $SQLITE_OK Then Return 1
    Return $Ret
    EndFunc ;==>_ReplaceRecord

    [/autoit]


    Gruss Veronesi

  • Und vielleicht kannst Du mit dieser Funktion alle Werte zuerst in ein Array einlesen:

    [autoit]

    Func _GetDataFromID($TableName, $ID) ;Get all Data from ID
    _SQLite_Query($hDatabase, "SELECT * FROM " & $TableName & " WHERE ID=" & $ID, $hQuery)
    _SQLite_FetchData($hQuery, $aQueryAnswer)
    _SQLite_QueryFinalize($hQuery)
    Return $aQueryAnswer
    EndFunc ;==>_GetDataFromID

    [/autoit]

    Gruss, Veronesi

  • Hallo Jan.

    Da ich nicht weiß / nicht verstanden habe, wie die Zeilen in der Tabelle "VORHER" und "NACHHER" aussehen, wäre ich Dir dankbar, wenn Du mal einen Ausschnitt (Beispieldaten) posten würdest.
    "Rot" wie es vorher war im erstens Ausschnitt darstellen
    "Blau" wie es nachher aussehen soll.

    Vielleicht kann man das nämlich auf gar nicht so komplizierten Weg schaffen.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Also ich habe eine Art Haupttabelle in der zu einen Auftrag alle wichtigen informationen drinnen stehen.
    Wenn man dann einen Auftrag aus der Liste doppelt anklickt werden in der Einzelmaske die informationen
    aus der Datenbank geladen. Und da sind wir an dem Punkt.

    Jetzt werden dien Daten des Auftrags aus der Haupttabelle 'auftragsdaten' ' in einer Art Temp tabelle 'temp_auftragsdaten' ' eine Zeile geschrieben.
    Eben mit :

    [autoit]

    Local $LokalSQLElemente = "ID, ID_AUFTRAG, WONUMMER, WE_LAGE_RE, WE_LAGE_LI, WLAN, TVART, STARTZEIT, ENDZEIT, ENDDATUM, FELD_1_LP, FELD_2_LP, FELD_3_LP, FELD_4_LP, FELD_5_LP, FELD_6_LP, FELD_7_LP, FELD_8_LP, UP_S06, UP_S24, UP_S38, UP_K25, UP_K48, VA_S06, VA_S24, VA_S38, VA_K25, VA_K48, MMD_S06, MMD_S24, MMD_S38, MMD_K25, MMD_K48, SNR, TX, RX, abschlusscode_A, abschlusscode_B, abschlusscode_C, TEXTFELD_INDIVIDUELL, TEXTFELD_LP7, TEXTFELD_SQN, TEXTFELD_MATERIAL"

    [/autoit]
    SQL
    _SQLite_Exec($db, "INSERT INTO 'temp_auftragsdaten' SELECT " & $LokalSQLElemente & " FROM auftragsdaten WHERE ID_AUFTRAG = '" & $Eingabe_AuftragsID & "'")


    Wärend der Zeit in der sich das Programm in der Einzelansicht befinden bleiben die Daten in dieser Temptabelle.
    Wenn man nun aus dem Auftrag mit speichern wieder herausgeht wollte ich nun einfach wie vorher beim holen
    aber diesmal in die andere Richtung die Daten wieder rüber schicken innerhalb der Datenbank ohne Code.
    Und da weis ich nicht wies geht.
    Normal stellt man sich hin und macht:

    Beispiel

    SQL
    UPDATE 'tabelle' SET zelle = 'wert' Where ID = 'wert'

    Ich hätte es gerne ähnlich der INSERT INTO Variante vom Anfang gemacht.
    Also:

    SQL
    INSERT INTO 'temp_auftragsdaten' SELECT ID, ID_AUFTRAG, WONUMMER, WE_LAGE_RE, WE_LAGE_LI, WLAN, TVART, STARTZEIT usw... FROM auftragsdaten WHERE ID_AUFTRAG = '" & $Eingabe_AuftragsID & "'")

    Dort entfällt ja die Sache mit dem VALUES
    Das einzigste was ich eben bis jetzt weis ist das hier:

    SQL
    UPDATE 'auftragsdaten'' SET WE_LAGE_RE = (SELECT WE_LAGE_RE FROM 'temp_auftragsdaten' WHERE ID_AUFTRAG = 'wert') WHERE ID_AUFTRAG = 'wert';


    Aber da müsste ich ja alle Werte einzel schreiben.

    Ja und bei Update hab ich sowas nicht gefunden.
    Momentan behelde ich mir so.

    Spoiler anzeigen
    [autoit]

    Global $AUFTRAGS_ID = 1

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite( _Prozess_SQL_UPDATE_Syntax_Bauen('temp_auftragsdaten') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Prozess_SQL_UPDATE_Syntax_Bauen($FuncSQL_Tabellenname="")

    Local $Lokalhinzu = ""

    Local $SQL_Syntax_Anfang = "UPDATE " & $FuncSQL_Tabellenname & " SET "
    Local $Split_SQL_Tab_Spalten = "WE_LAGE_RE, WE_LAGE_LI, WLAN, TVART, STARTZEIT, ENDZEIT, ENDDATUM, FELD_1_LP, FELD_2_LP, FELD_3_LP, FELD_4_LP, FELD_5_LP, FELD_6_LP, FELD_7_LP, FELD_8_LP, UP_S06, UP_S24, UP_S38, UP_K25, UP_K48, VA_S06, VA_S24, VA_S38, VA_K25, VA_K48, MMD_S06, MMD_S24, MMD_S38, MMD_K25, MMD_K48, SNR, TX, RX, abschlusscode_A, abschlusscode_B, abschlusscode_C, TEXTFELD_INDIVIDUELL, TEXTFELD_LP7, TEXTFELD_SQN, TEXTFELD_MATERIAL"
    Local $SQL_Syntax_Mitte = ""

    $Split_SQL_Tab_Spalten = StringReplace($Split_SQL_Tab_Spalten, ",", ",")
    Local $Split_SQL_Tab_Spalten_Anzahl = @extended
    Local $Split_SQL_Tab_Spalten_Array = StringSplit($Split_SQL_Tab_Spalten, ",")
    Local $i=1
    Local $SQL_Syntax=""

    ; Anfang des Syntax´s einfügen
    $SQL_Syntax = $SQL_Syntax_Anfang

    ; alle Spaltewerte in den Syntax einfügen
    While $i <= $Split_SQL_Tab_Spalten_Anzahl + 1

    $Lokalhinzu = ""
    $Lokalhinzu = _Prozess_SQL_Update_mit_Werten_bedienen($i)
    If $Lokalhinzu <> 1 Then $SQL_Syntax = $SQL_Syntax & $Split_SQL_Tab_Spalten_Array[$i] & " = '" & $Lokalhinzu & "', "

    $i+=1
    WEnd

    ; letztes Komma entfernen
    $SQL_Syntax = StringTrimRight($SQL_Syntax, 2)


    ; schliessen des Syntax´s mit einer Klammer
    $SQL_Syntax = $SQL_Syntax & " WHERE ID_AUFTRAG = '" & $AUFTRAGS_ID & "';"

    Return $SQL_Syntax

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Prozess_SQL_Update_mit_Werten_bedienen($Func_Index=0)
    If $Func_Index == 0 Then Return 1

    Select
    Case $Func_Index = 1
    Return "eins"
    Case $Func_Index = 2
    Return "zwei"
    Case $Func_Index = 3
    Return "drei"
    Case $Func_Index = 4
    Return "vier"
    Case $Func_Index = 5
    Return "fünf"
    Case $Func_Index = 6
    Return "sechs"

    [/autoit] [autoit][/autoit] [autoit]

    ; usw...

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case Else
    Return 1
    EndSelect

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]


    Ich hoffe ich konnte mein Problem jetzt etwas besser darstellen.

    Gruß Jan

  • Hast Du schon mal einen solchen Befehl versucht?
    (Funktioniert natürlich nur, wenn die Backup-Tabelle bereits existiert und gleich aufgebaut ist, wie die Master-Tabelle!)

    SQL
    INSERT OR REPLACE INTO [NewTable] SELECT * FROM [OldTable]

    Gruss Veronesi

    Edit:
    Und falls die neue Tabelle noch nicht exisitiert (evtl. das erste mal) hilft folgende Syntax:

    SQL
    CREATE TABLE [NewTable] AS SELECT * FROM [OldTable]

    Einmal editiert, zuletzt von veronesi (14. Dezember 2011 um 11:50)

  • Hallo JanausSm

    Das ist schön, wenn das Problem gelöst ist.
    In dem Fall kannst Du den Thread noch auf gelöst setzen.
    (1. Post editieren => auf gelöst setzen => speichern.)

    Gruss Veronesi