Förklara lite mer vad du vill göra med den kopierade raden ?
strSql = "Update [tabell] set [column] = '"&strString&"' where [colum] = '"&strString&"'"
??
17 svar · 378 visningar · startad av Calippo
Nån som vet hur man smidigast kopierar ett recordset i en databas? Har en tabell med typ 200 st fält, både text och tal.
Jag vill kunna kopiera en rad och modifiera den efteråt.
(recordset.clone metoden fungerar tydligen inte eftersom den uppdaterar alla sina kopior)
Förklara lite mer vad du vill göra med den kopierade raden ?
strSql = "Update [tabell] set [column] = '"&strString&"' where [colum] = '"&strString&"'"
??
Jo, det är så att jag har en tabell med en massa data om tex en bilmodell. Om det är så att man vill lägga till en snarlik bilmodell så har man ju inte nån större lust o fylla i alla 200 fält igen, utan jag vill ta en kopia på en befintlig bilmodell och sen bara justera datan i den lite....
En vanlig sql kod med insert funkar ju bra om man har några enstaka fält i databasen, men jag har ju 200 st så det blir ju en jäkla lång sql-sats isåfall...
Gör såhär.
Välj de fälten som du tänker fylla i med t.ex. Checkboxar.
Hämta det fältet som är mest likt det du skall lägga in.
Loopa ut svaren i gömda textfält. Och fyll i det du valde att du skulle fylla i. På så sätt så kommer ju det att kopieras utan att du behöver fylla i en massa i onödan.
Problemet är inte hur jag ska få in datan, utan hur jag ska göra det med så lite kod som möjligt.
Ungefär som när man klonar ett recordset:
Dim rs1, rs2, f
Set rs1 = CreateObject("ADOCE.Recordset.3.1")
rs1.open "MSysTables"
Set f = rs1.Fields(0)
Msgbox f.Value, ,f.Name
Set rs2 = rs1.Clone
Set f = rs2.Fields(0)
Msgbox f.Value, ,f.Name
Nackdelen med den koden är att när man uppdatera ett recordset så uppdateras alla klonade....
ehh, 200 fält i en tabell låter mycket, jag skulle nog lagt dem i flera tabeller och joinat ihop dem, för att till fullo använda relationsdatabasens möjligheter... sorry, inget svar på din fråga men en liten funderare bara =)
Japp, jag håller med dig att det är många fält i en tabell.
Har importerat in all data från en excelfil och pga tidsbrist inte hunnit göra en kod som splittar upp fälten i flera tabeller...
Dim objConn, strSql, i, intId, Rs, intColumns
intId = CInt(Request.Form("id"))
' id:t som är likt det som du skall lägga in
intColums = 44
'hur många kolumner du har i databasen
objConn = databaskoppling
strSql = "Select * From [Tabell] where"
Set Rs = objConn.Execute(strSql)
Do Until Rs.Eof
i = 1
For i to intColumns
Response.Write "<input type=""text"" name="""&i&""" value="""&Rs(i)&"""><br>"
Next
Rs.MoveNext
Loop
Sedan får du ändra det du vill ändra
och skicka tillbaka använd då en for each loop när du tar emot med request.form
Behöver samma funktion!
Testade med
KOD]Select * Into TABELL1 from TABELL1 WHERE Id = " & Request("Id")[
och fick error - Tabell1 är både källa samt mål.
Hör av dig om du har fått det att funka!
JPS; Exakt vad är du ute efter?
INSERT INTO tabell SELECT * FROM tabell WHERE Id = " & Request("Id")
@nders - Jag är ute efter samma funktion som Calippo.
Ville bara säga att jag hade testat Select * Into utan att lyckas!
Provade Engine^ förslag men det blir fel på primärnyckel och relationer. Mitt Id är unikt - någon ide?
Du får specificera vilka fält du vill kopiera då i så fall, dvs alla utom räknarvärdet.
INSERT INTO tabell (fält1, fält2, fält3) SELECT fält1, fält2, fält3 FROM tabell WHERE ID = 1
Mvh
tja... du får lov att ange alla kolumner... :l
INSERT INTO tabell(k1, k2, k3, ..., k[i]n[/i]) SELECT k1, k2, k3, ..., k[i]n[/i] WHERE Id = " & Request("Id")
Men med dina 200 kolumner så låter det som en dum lösning. Utveckla Nickemannens lösning.
Hade hoppats på en enklare lösning :-( då även jag har nästan 200 st fält och det blir en sjutusans sql-sats av det!
Dim strSQL, objRS, objConn, lngNewID
objConn = [i]databaskoppling[/i]
strSQL = "INSERT INTO tabell (namn) VALUES ('bla')"
objConn.Execute strSQL
strSQL = "SELECT Max(Id) AS lngNewID FROM tabell"
Set objRS = objConn.Execute (strSQL)
lngNewID = objRS("lngNewID")
strSQL = "SELECT * FROM tabell WHERE Id = " & Request("Id")
Set objRS = objConn.Execute (strSQL)
For i = 0 To objRS.Fields.Count
If NOT objRS.Fields(i).Name = "Id" Then
strSQL = "UPDATE tabell SET " & objRS.Fields(i).Name & " = '" & objRS.Fields(i) & "' WHERE Id = " & lngNewID
objConn.Execute strSQL
End If
Next
Den här metoden kanske fungerar... testa ;)
Provade ditt exempel men får Typblandningsfel i villkorsuttryck då jag har olika fält typer?
Jag har själv gjort en liknande process där en post först skapas och där efter uppdateras all data. Jag hade redan skrivit en SQL-sats för UPDATE så då slipper jag skriva en Insert-sats.
Dessutom blir det mindre att hålla koll på om något databasfält skulle ändras.
Tackar för ditt exempel. :birp
Ok, du kanske måste ändra till
For i = 0 To objRS.Fields.Count
If NOT objRS.Fields(i).Name = "Id" Then
Select Case VarType(objRS.Fields(i))
Case 6, 8
strValue = "'" & objRS.Fields(i).Value & "'"
Case 7
strValue = "#" & objRS.Fields(i).Value & "#"
Case Else
strValue = objRS.Fields(i).Value
End Select
strSQL = "UPDATE tabell SET " & objRS.Fields(i).Name & " = " & strValue & " WHERE Id = " & lngNewID
objConn.Execute strSQL
End If
Next
Otestat från min sida men jag hoppas att det kan fungera... :)