webForumDet fria alternativet

Kopiera recordset

17 svar · 376 visningar · startad av Calippo

CalippoMedlem sedan aug. 2002536 inlägg
#1

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)

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Förklara lite mer vad du vill göra med den kopierade raden ?

strSql = "Update [tabell] set [column] = '"&strString&"' where [colum] = '"&strString&"'"

??

CalippoMedlem sedan aug. 2002536 inlägg
#3

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...

NickemannenMedlem sedan aug. 20003 575 inlägg
#4

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.

CalippoMedlem sedan aug. 2002536 inlägg
#5

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....

hopparnMedlem sedan nov. 20011 551 inlägg
#6

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 =)

CalippoMedlem sedan aug. 2002536 inlägg
#7

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...

NickemannenMedlem sedan aug. 20003 575 inlägg
#8
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

JPSMedlem sedan nov. 2001101 inlägg
#9

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!

@ndersMedlem sedan juni 200032 969 inlägg
#10

JPS; Exakt vad är du ute efter?

Engine^Medlem sedan dec. 20003 887 inlägg
#11
INSERT INTO tabell SELECT * FROM tabell WHERE Id = " & Request("Id")
JPSMedlem sedan nov. 2001101 inlägg
#12

@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?

@ndersMedlem sedan juni 200032 969 inlägg
#13

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

Engine^Medlem sedan dec. 20003 887 inlägg
#14

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.

JPSMedlem sedan nov. 2001101 inlägg
#15

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!

Engine^Medlem sedan dec. 20003 887 inlägg
#16
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 ;)

JPSMedlem sedan nov. 2001101 inlägg
#17

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

Engine^Medlem sedan dec. 20003 887 inlägg
#18

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... :)

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)