Avatar billede Slettet bruger
14. juli 2009 - 19:14 Der er 23 kommentarer

Lave kopi af post i access

Er det muligt at kopiere en post i en tabel i access, for derefter at ændre et par værdier ?
Avatar billede softspot Forsker
14. juli 2009 - 19:41 #1
Jeg vil tro du kan gøre noget i stil med dette (pseudokode):

INSERT INTO tabel(felt1,felt2,felt3)
SELECT felt1, 'ny værdi', felt3
FROM tabel
WHERE felt1 = 'nøgleværdi'


På denne måde opretter du en ny række på grundlag af en (eller flere, hvis du måtte have det behov) eksisterende række.
Avatar billede Slettet bruger
14. juli 2009 - 21:41 #2
Er vist ikke helt med på hvad du mener. For mig ser det ud som om at jeg så skal skrive hvert eneste felt fra db'en ind i koden, og så skal jeg jo huske at ændre koden, hvis jeg tilføjer et ekstra felt i tabelen.
Og hvorfor er det lige at insert into er før select? Jeg kunne vel ikke få dig til at skrive en lidt mere "færdig" kode så jeg kan se hvad du mener ?
Avatar billede softspot Forsker
14. juli 2009 - 21:49 #3
Det jeg viser dig er en select into, dvs. en insert som baserer sig på et udtræk (fra samme tabel i dette tilfælde).

Hvis du vil have et mere færdigt eksempel, så giv mig noget relevant at arbejde med, så vi ikke sidder og snakker på forskellige grundlag.
Avatar billede softspot Forsker
14. juli 2009 - 21:52 #4
...og med relevant mener jeg naturligvis kode og databasestruktur...
Avatar billede Slettet bruger
14. juli 2009 - 22:02 #5
Her er den kode jeg bruger i øjeblikket, går ud fra det er det du søger. Her henter jeg først posten for derefter at sætte den ind i tabelen igen som en ny post.



strSQL = "SELECT * FROM game_tractors WHERE trcID=" & Request.Querystring("buy") & " AND trcSellPrice>0"
Set rsTractor = ConnMain.Execute(strSQL)
If not (rsTractor.EOF OR rsTractor.BOF) Then

  strSQL = "Insert into game_tractors ("
  strSQL = strSQL & "[trcFarmID], "
  strSQL = strSQL & "[trcName], "
  strSQL = strSQL & "[trcConditionMax], "
  strSQL = strSQL & "[trcCondition], "
  strSQL = strSQL & "[trcDamageHA], "
  strSQL = strSQL & "[trcRepairPriceUnit], "
  strSQL = strSQL & "[trcHorsePower], "
  strSQL = strSQL & "[trcIncreasedHP], "
  strSQL = strSQL & "[trcIncreasedDamage], "
  strSQL = strSQL & "[trcFuelUseHP], "
  strSQL = strSQL & "[trcBuyPrice], "
  strSQL = strSQL & "[trcReadyDate] ) "
  strSQL = strSQL & "Values ("
  strSQL = strSQL & "" & Session("activefarm") & ", "
  strSQL = strSQL & "'" & rsTractor("trcName") & "', "
  strSQL = strSQL & "" & rsTractor("trcConditionMax") & ", "
  strSQL = strSQL & "" & rsTractor("trcCondition") & ", "
  strSQL = strSQL & "" & Replace(rsTractor("trcDamageHA"), ",", ".") & ", "
  strSQL = strSQL & "" & Replace(rsTractor("trcRepairPriceUnit"), ",", ".") & ", "
  strSQL = strSQL & "" & rsTractor("trcHorsePower") & ", "
  strSQL = strSQL & "" & rsTractor("trcIncreasedHP") & ", "
  strSQL = strSQL & "" & Replace(rsTractor("trcIncreasedDamage"), ",", ".") & ", "
  strSQL = strSQL & "" & Replace(rsTractor("trcFuelUseHP"), ",", ".") & ", "
  strSQL = strSQL & "" & rsTractor("trcSellPrice") & ", "
  strSQL = strSQL & "'" & ConvertDate(Dateadd("h",rsTractor("trcDeleveryTimeHours"),Now())) & "' ) "
  ConnMain.Execute(strSQL)

  strSQL2 = "Update game_tractors set "
  strSQL2 = strSQL2 & "[trcUnitCount]=[trcUnitCount]-1 "
  strSQL2 = strSQL2 & "where trcID=" & Request.Querystring("buy") & " "
  ConnMain.Execute(strSQL2)

End If
rsTractor.Close
set rsTractor = Nothing



Men tænkte at man måske kunne lave en direkte kopi af en post for derefter at hen den med denne kode og rette de få felter der skal ændres i.

SQL = "SELECT @@IDENTITY FROM game_tractors"
Set RS = ConnMain.Execute(SQL)
  var_etellerandet = RS(0)
RS.Close
set RS = Nothing
Avatar billede softspot Forsker
14. juli 2009 - 22:31 #6
Umiddelbart ville jeg jo mene du kunne gøre det direkte som jeg indikerede i starten. Nogenlunde således:

strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcReadyDate],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice],Dateadd("h",[trcDeleveryTimeHours],Now()," & _
      "[trcUnitCount]+1)" & _
    "WHERE [trcID] = ? AND [trcSellPrice] > 0"

set cmd = Server.CreateObject("ADODB.Command")

set cmd.ActiveConnection = ConnMain
cmd.CommandText = strSQL
cmd.CommandType = adCmdText

' det antages at activefarm og buy er long integers, ellers skal
' disse parametre konsekvensrettes til de korrekte typer...

cmd.Parameters.Append cmd.CrateCommand("@activefarm", adInteger, adParamInput, 4, Session("activefarm"))

cmd.Parameters.Append cmd.CrateCommand("@id", adInteger, adParamInput, 4, Request.Querystring("buy"))

cmd.Execute


Ovenstående vil kræve at du har adgang til konstanterne for ADO, men det fåes let ved at inkludere nedenstående linie, enten i din global.asa eller i den asp-fil hvor ADO-konstanterne skal benyttes.

<!-- METADATA TYPE="typelib"
    uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

Ovenstående linie skal altså indsættes på samme måde som du indsætter en #include-linie, dvs. udenfor ASP-kode sektioner og sikkert helst i toppen af ASP-filen.

Læs i øvrigt lidt mere om command-objektet i min artikel her på eksperten: http://www.eksperten.dk/guide/1250
Avatar billede softspot Forsker
14. juli 2009 - 22:55 #7
UPS! Der sneg sig lige en syntaksfejl ind i SQL-sætningen. Den skal nok snarere se ud således:

strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcReadyDate],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice],Dateadd("h",[trcDeleveryTimeHours],Now())," & _
      "[trcUnitCount]+1" & _
    "WHERE [trcID] = ? AND [trcSellPrice] > 0"


NB: Der skal muligvis benyttes semikolon i DateAdd-funktionen i stedet for komma til separering af parametre, men det kan du lige selv teste... og ja, det er med vilje at dateadd og now er en del af SQL-sætningen der sendes til databasen, da Access selv understøtter en mængde af de funktioner som også kendes fra VBScript :-)
Avatar billede softspot Forsker
14. juli 2009 - 22:56 #8
Fordømt! Der skal også lige et mellemrum ind før WHERE...
Avatar billede Slettet bruger
14. juli 2009 - 23:16 #9
Kan ikke få det skidt til at virke, får forskellige syntax fejl hele tiden :-(
Vil det være nemmere at lave en kopi uden at tilføje ændringer i samme proces?
Avatar billede softspot Forsker
14. juli 2009 - 23:17 #10
Det ville være hjælpsomt hvis du meddelte hvilke fejl du får...
Avatar billede softspot Forsker
14. juli 2009 - 23:19 #11
Jeg kan da lige se en stor fejl mere i SQL-sætningen i mit foreslag (der mangler en FROM!!?):

strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcReadyDate],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice],Dateadd("h",[trcDeleveryTimeHours],Now())," & _
      "[trcUnitCount]+1 " & _
    "FROM game_tractors " & _
    "WHERE [trcID] = ? AND [trcSellPrice] > 0"
Avatar billede Slettet bruger
14. juli 2009 - 23:25 #12
Hvis jeg bruger den her du har skrivet, så får jeg denne fejl:

Microsoft JET Database Engine error '80040e10'
No value given for one or more required parameters.

Jeg har fjernet adddate og det felt den skal sættes ind i, den giver lidt problemer.


strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice]," & _
      "[trcUnitCount]+1 " & _
    "FROM game_tractors " & _
    "WHERE [trcID] = 1 AND [trcSellPrice] > 0"
Avatar billede softspot Forsker
14. juli 2009 - 23:33 #13
DateAdd skal kaldes med apostroffer i stedet for anførselstegn, dvs.:

strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcReadyDate],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice],Dateadd('h',[trcDeleveryTimeHours],Now())," & _
      "[trcUnitCount]+1 " & _
    "FROM game_tractors " & _
    "WHERE [trcID] = ? AND [trcSellPrice] > 0"

da, den ellers vil bryde ud af VBScript-strengen og skabe en syntaksfejl (my bad - soorwy!)...

Mht. den fejl du få, har du så benyttet hele den stump kode jeg foreslog (dvs. benyttet command-objektet og fået indsat den META-fætter i toppen af siden)?

Fejlen opstår typisk hvis der er et felt som er stavet forkert, så check evt. om der skulle være nogle af felterne jeg har fået ændret på, da mine fede fingre drønede hen over tastaturet for at flikke eksemplet sammen...
Avatar billede Slettet bruger
14. juli 2009 - 23:34 #14
Har rodet lidt mere med det og det her giver følgende fejl:

ADODB.Command error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.




strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice]," & _
      "[trcUnitCount]+1 " & _
    "FROM game_tractors " & _
    "WHERE [trcID] = 1 AND [trcSellPrice] > 0"

set cmd = Server.CreateObject("ADODB.Command")

set cmd.ActiveConnection = ConnMain
cmd.CommandText = strSQL
cmd.CommandType = adCmdText  <<<<------------------Her er fejlen

cmd.Parameters.Append cmd.CrateCommand("@activefarm", adInteger, adParamInput, 4, Session("activefarm"))

cmd.Parameters.Append cmd.CrateCommand("@id", adInteger, adParamInput, 4, Request.Querystring("buy"))

cmd.Execute
Avatar billede softspot Forsker
15. juli 2009 - 00:01 #15
Nu ved jeg ikke lige hvordan resten af din fil ser ud, men hvis du gør følgende i den ASP-side som indeholder overstående kode:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<%
strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice]," & _
      "[trcUnitCount]+1 " & _
    "FROM game_tractors " & _
    "WHERE [trcID] = 1 AND [trcSellPrice] > 0"

set cmd = Server.CreateObject("ADODB.Command")

set cmd.ActiveConnection = ConnMain
cmd.CommandText = strSQL
cmd.CommandType = adCmdText

cmd.Parameters.Append cmd.CrateCommand("@activefarm", adInteger, _
        adParamInput, 4, Session("activefarm"))

' I OG MED DU HAR ÆNDRET DEN SIDSTE PARAMETER I SQL-SÆTNINGEN
' TIL ET ET-TAL, SÅ SKAL DENNE PARAMETER HELLER IKKE SÆTTES!

'cmd.Parameters.Append cmd.CrateCommand("@id", adInteger, _
'        adParamInput, 4, Request.Querystring("buy"))

cmd.Execute

ConnMain.Close
%>
Avatar billede Slettet bruger
15. juli 2009 - 12:06 #16
Nu får jeg følgende fejl:

Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'cmd.CrateCommand'

I denne linie:
cmd.Parameters.Append cmd.CrateCommand("@activefarm", adInteger, _


Kan det være fordi jeg ikke har de rigtige komponenter? Hvis det kan være problemet, så kan jeg lige så godt holde det jeg har, selv om det måske virker lidt patent agtigt, men det virker :)
Avatar billede softspot Forsker
15. juli 2009 - 14:51 #17
Nej, det er fordi jeg har lavet en stavefejl i mit eksempel. Den metode som opretter en parameter hedder CreateParameter og ikke som jeg har skrevet CrateCommand...

Prøv med dette kode:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<%
strSQL = "INSERT INTO game_tractors (" & _
      "[trcFarmID],[trcName],[trcConditionMax]," & _
      "[trcCondition],[trcDamageHA],[trcRepairPriceUnit]," & _
      "[trcHorsePower],[trcIncreasedHP],[trcIncreasedDamage]," & _
      "[trcFuelUseHP],[trcBuyPrice],[trcUnitCount]) " & _
    "SELECT ?,[trcName],[trcConditionMax],[trcCondition]," & _
      "[trcDamageHA],[trcRepairPriceUnit],[trcHorsePower]," & _
      "[trcIncreasedHP],[trcIncreasedDamage],[trcFuelUseHP]," & _
      "[trcSellPrice]," & _
      "[trcUnitCount]+1 " & _
    "FROM game_tractors " & _
    "WHERE [trcID] = 1 AND [trcSellPrice] > 0"

set cmd = Server.CreateObject("ADODB.Command")

set cmd.ActiveConnection = ConnMain
cmd.CommandText = strSQL
cmd.CommandType = adCmdText

cmd.Parameters.Append cmd.CreateParameter("@activefarm", adInteger, _
        adParamInput, 4, Session("activefarm"))

' I OG MED DU HAR ÆNDRET DEN SIDSTE PARAMETER I SQL-SÆTNINGEN
' TIL ET ET-TAL, SÅ SKAL DENNE PARAMETER HELLER IKKE SÆTTES!
'cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, _
'        adParamInput, 4, Request.Querystring("buy"))

cmd.Execute

ConnMain.Close
%>
Avatar billede Slettet bruger
15. juli 2009 - 15:17 #18
Hmm det hjalp ikke meget, nu kommer denne fejl bare.....
Fejlen er i cmd.Execute.

Microsoft JET Database Engine error '80040e10'
No value given for one or more required parameters.
Avatar billede softspot Forsker
15. juli 2009 - 15:25 #19
Kan du slet ikke se at det går fremad?? :D

Umiddelbart lyder det som om Session-variables ikke indeholder nogen værdi, eller at det ikke er et tal, så det skal du lige sikre dig inden du gør noget andet...
Avatar billede Slettet bruger
16. juli 2009 - 23:39 #20
Kan ikke se nogen form for fremskridt...
Session skulle meget gerne indholde et tal ellers ville min test side sæt ikke køre, da den er en del den side jeg arbejder med.

Hvis du ikke lige kan finde en løsning, så tror jeg bare vi stopper, ellers ender det med jeg spilder alt for meget af din tid :-)

Hvis det er må du godt få point for at have gjort et forsøg.!?

Tak for hjælpen indtil nu.
Avatar billede softspot Forsker
16. juli 2009 - 23:50 #21
Det er svært at finde en løsning på noget som jeg ikke har kontrol over, men det burde ikke være den mest umulige opgave at løse. Jeg fornemmer dog at du ikke er voldsom motiveret for at investere ret meget i at få løsningen til at fungere med udgangspunkt i det jeg har foreslået, så jeg tror bare vi skal kalde det et mislykket forsøg...
Avatar billede Slettet bruger
17. juli 2009 - 02:51 #22
Jeg tror nu ikke det er motivation der mangler. Men jeg har meget svært ved at se "logikken" i din kode, og derfor har jeg svært ved at give dig de oplysninger du har brug for, jeg kan derfor heller ikke vurdere om vi er på vej i rigtig eller forkert retning.

Jeg har aldrig set den type kode du bruger i det her tilfælde hvis man ser bort fra din strSQL linier, og så alligevel; Jeg kan f.eks. ikke forstå hvorfor Insert skal før Select eller hvorfor der er et ? efter Select, eller hvorfor der er et ? i denne linie: "WHERE [trcID] = ?". Hvorfor er de der? Hvor får de deres data fra? Det forvirre mig en del...

Håber du blev klogere på hvorfor vi skal kalde det et mislykket forsøg ;-)
Avatar billede softspot Forsker
17. juli 2009 - 08:36 #23
Spørgsmålstegn fungerer som pladsholdere for parametre til SQL-sætningen. Det er en perfekt måde til bla. at undgå evt. SQL-injections og bør være den foretrukne metode til at kalde databasen på, når der er parametre involveret. Lær det! Det er cool når du forstår det... :-)

Prøv i øvrigt at læse den artikel jeg henviser til i indlæg #6, den giver forhåbentlig svar på hvad det er for noget kode jeg laver for at kalde databasen.

Mht. insert into sammen med select, så nævnte jeg tidligere, at dette er en måde hvorpå du kan læse data fra én tabel og i samme operation indsætte disse data i en anden tabel (som så i dette tilfælde er den samme tabel). Så i stedet for først at lave et udtræk som derefter danner grundlag for en indsættelse, slår jeg i tingene sammen og gør begge dele i én operation (dvs. jeg bla. sparer et kald til databasen - og to hvis jeg også kan lave opdateringen i samme hug).

Min motivation for at gøre dette er, at jo flere operationer du kan udføre i databasen på samme tid (dvs. jo færre gange du skal skabe forbindelse og snakke med databasen), desto bedre vil dit system (oftest) performe og det bør være en overvejelse alle der laver webapplikationer gør med det de laver...

Det første du kan gøre er at fortælle mere om hvilke typer felterne trcFarmID og trcID er af. Er det tal-værdier eller hvad?

Den anden ting du kan give mig vished for, er hvilke værdier der rent faktisk ligger i Session("activefarm") og Request.Querystring("buy"). Det er én ting at du siger de indeholder de rigtige værdier, men det er meget lettere for mig at agere, hvis du fortæller mig hvad der rent faktisk ligger i disse variable (det kan du f.eks. finde ud af ved at udskrive dem i forbindelse med at siden udføes og så fortælle mig hvad der udskrives for de to værdier. Data har det med at snyde, og selvom man tror man ved hvad de indeholder, er det bedre med vished...

I bund og grund savner jeg mere indsigt i, hvad det er for oplysninger du baserer dine fejlende tests på, så jeg kan agere mere målrettet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester