Avatar billede jmc Nybegynder
10. oktober 2002 - 16:29 Der er 28 kommentarer og
1 løsning

problematik omkring opdatering

Jeg har en problematik omkring noget opdatering som jeg egentligt gerne kunne tænke mig noget hjælp til.

Jeg vil opdatere et dynamisk antal checkbokse til at være selected.

1. alt foregår i tabellen ved navn relation
2. checkbokse opdatere record ved navn valgt
3. Checkbokse skal opdatere alle records med produkt_id  = request.QueryString("produkt_id")
4. foruden at blive sat til TRUE/FALSE bliver der skrevet et CID som er name på checkboksen i FORM POST.

Her er min kode og jeg ønsker følgende problemer løst. 1. Hvordan kan jeg undgå at skulle slette og oprette alle produkt_id, hver gang der er nye checkbokse (som opdateres og udvides)?
2. Hvordan kan jeg undgå det problem jeg har nu, hvor der opdateres et CID flere gange med samme produkt_id og CID?

<%
Set rs_relation = Server.CreateObject("ADODB.Connection")
rs_relation.Open MM_bst_STRING

'sletter alle records med produkt_id
SQL_d  = "DELETE FROM relation WHERE produkt_id = " & request("produkt_id")
'response.Write(SQL_d)
rs_relation.Execute (SQL_d)

'tilføjer alle CID fra Child - der kunne være nye
SQL_a = "INSERT into relation (produkt_id, CID) SELECT " & request("produkt_id") & ",CID FROM child"
'response.Write(SQL_a)
rs_relation.Execute (SQL_a)

Dim TxtVar, SqlVar
TxtVar = ""

for each element in request.form
TxtVar = TxtVar & element & ","
next
if TxtVar <> "" then
TxtVar = left(TxtVar,len(TxtVar)-1)
else
TxtVar = 0
end if
TxtArray = split(TxtVar,",")


For i = LBound(TxtArray) To UBound(TxtArray)
SqlVar = "UPDATE relation SET produkt_id = " & request("produkt_id") & ", Valgt = TRUE WHERE cid = " & TxtArray(i)
response.Write(SqlVar)
rs_relation.Execute (SqlVar)
Next

response.Redirect("rediger_produkt.asp?produkt_id="&request("produkt_id"))
'response.Redirect("index.asp")
%>

<%
rs_relation.Close()
Set rs_relation = Nothing
%>

her er et eksempel på en udskrevet SQL: UPDATE relation SET produkt_id = 1, Valgt = TRUE WHERE cid = 13UPDATE relation SET produkt_id = 1, Valgt = TRUE WHERE cid = 4UPDATE relation SET produkt_id = 1, Valgt = TRUE WHERE cid = 2UPDATE relation SET produkt_id = 1, Valgt = TRUE WHERE cid = 12

jeg ricikere at bla. at modtage CID=4 og produkt_id, 5 gange eller mere i databasen ?
Avatar billede jmc Nybegynder
11. oktober 2002 - 08:21 #1
er der ingen som har et bud?
eller skal jeg reformulere?
Avatar billede eagleeye Praktikant
11. oktober 2002 - 11:09 #2
Ja kan du evt formulere det på en anden måde.

Man kan godt lave en opdatering af checkbox for flere ID på en gang..:

Sæt dem som er avlgt til true:
"UPDATE xxxx SET kolonne = true WHERE id in(4,5,6,7,8) AND product_ID = 34"

og fjerne kryds hvis de ikke er valgt længere:
"UPDATE xxxx SET kolonne = false WHERE id not in(4,5,6,7,8) AND product_ID = 34"
Avatar billede jmc Nybegynder
11. oktober 2002 - 11:35 #3
problemet ligger også i at der måske er en ny checkboks (da disse opdateres dynamisk) og dette vil give en fejl da den ikke er i databasen. Kan jeg tjekke om alle findes før jeg opdatere og hvis ikke så oprette? og hvordan?
Avatar billede jmc Nybegynder
11. oktober 2002 - 12:35 #4
hvis man nu forudsætter at data sendes fra en liste hvor man kan vælge (til/fra) med CTRL klik. listen bliver udvidet hele tiden eller måske bliver den mindre. Hvordan gør man dette med en SQL?
Avatar billede eagleeye Praktikant
11. oktober 2002 - 18:33 #5
Det kommer an på hvordan du gemmer listen i databasne??  Er der en kolonne til hver eller er der en record til hvert punkt i listen?
Avatar billede eagleeye Praktikant
11. oktober 2002 - 18:34 #6
Normalt mener jeg ikke der kommer fejl hvis man forsøger at opdatere en reocrd som ikke findes, det sker bare ikke noget..
Avatar billede jmc Nybegynder
11. oktober 2002 - 23:14 #7
tabel ralation ser sådan ud:
id (autonum), produkt_id (tal) , cid (tal), valgt (ja/nej)
produkt_id læses fra Query.string og cid er value fra formen, ja/nej er om feltet er valgt ikke ikke i en multiselectable list.
Avatar billede jmc Nybegynder
11. oktober 2002 - 23:15 #8
sorry jeg mener:
tabel relation
det var en slåfejl.
Avatar billede eagleeye Praktikant
11. oktober 2002 - 23:23 #9
Og multiselecten kan ændre størrelse ?? hvordan styres det?
Avatar billede eagleeye Praktikant
11. oktober 2002 - 23:32 #10
Hvis relation tabellen indeholder alle de muligheder som der er i multiselect boxen.. så mener jeg stadig at du kan bruge de to SQL sætninger jeg har vist..  Man får en komma seperet liste med ID i med dem som er valgt.
Avatar billede jmc Nybegynder
11. oktober 2002 - 23:39 #11
men hvis en ID ikke findes skal den oprettes og ikke forbigås, som du skriver kommer det ikke en fejl. cid skal oprettes hvis den ikke findes.
Jeg prøver lige noget...
Avatar billede jmc Nybegynder
12. oktober 2002 - 00:29 #12
dvs. at jeg helt kunne undgå at parse formen men benytte den direkte?
Så dette script kunne reduceres til:

Dim TxtVar, SqlVar
response.write(txtvar)
TxtVar = ""

for each element in request.form
TxtVar = TxtVar & element & ","
next
if TxtVar <> "" then
TxtVar = left(TxtVar,len(TxtVar)-1)
else
TxtVar = 0
end if
TxtArray = split(TxtVar,",")

"UPDATE relation SET valgt = true WHERE cid in(TxtArray) AND product_ID = 34"
Avatar billede jmc Nybegynder
12. oktober 2002 - 00:32 #13
SqlVar = "UPDATE relation SET valgt = True WHERE cid in(TxtArray) AND product_ID = & request("produkt_id")"
rs_relation.Execute (SqlVar)

går i ged, jeg må hellere få nogle timer på øjet...
Avatar billede jmc Nybegynder
12. oktober 2002 - 00:34 #14
SqlVar = "UPDATE relation SET valgt = True WHERE cid in(TxtArray) AND product_ID =" & request("produkt_id")
rs_relation.Execute (SqlVar)

Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.

jeg går i gang imorgen kl. 7.00 igen.
Avatar billede eagleeye Praktikant
12. oktober 2002 - 00:34 #15
Ja hvis det er den som hedder opgaver.. så ka ndu lave det til:

IDlist = Request.form("opgaver")

"UPDATE relation SET valgt = true WHERE id in(" & IDlist & ") AND product_ID = 34"

"UPDATE relation SET valgt = false WHERE id not in(" & IDlist & ") AND product_ID = 34"
Avatar billede eagleeye Praktikant
12. oktober 2002 - 00:35 #16
for det skal være helt perfekt kan man tjekke på om IDlist er tom inden man opdater datasen:


IDlist = Request.form("opgaver")
if IDlist = "" then
  'Ingen valgt sæt alle checkbox til false

  "UPDATE relation SET valgt = false WHERE product_ID = 34"

else
  'Opdater med IDlsit
  "UPDATE relation SET valgt = true WHERE id in(" & IDlist & ") AND product_ID = 34"

  "UPDATE relation SET valgt = false WHERE id not in(" & IDlist & ") AND product_ID = 34"
end if
Avatar billede jmc Nybegynder
12. oktober 2002 - 01:12 #17
Den melder:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.


<%
Set rs_relation = Server.CreateObject("ADODB.Connection")
rs_relation.Open MM_bst_STRING

IDlist = Request.form("form1")
if IDlist = "" then
  'Ingen valgt sæt alle checkbox til false

SqlVar = "UPDATE relation SET valgt = false WHERE product_ID = " & request("produkt_id")
'response.Write(SqlVar)
rs_relation.Execute (SqlVar)

else
  'Opdater med IDlsit
SqlVar = "UPDATE relation SET valgt = True WHERE id in(" & IDlist & ") AND product_ID = "  & request("produkt_id")
'response.Write(SqlVar)
rs_relation.Execute (SqlVar)

SqlVar = "UPDATE relation SET valgt = False WHERE id not in(" & IDlist & ") AND product_ID = "  & request("produkt_id")
'response.Write(SqlVar)
rs_relation.Execute (SqlVar)
end if
Avatar billede eagleeye Praktikant
12. oktober 2002 - 01:15 #18
Hov kolonne hedder cid og ikke id som jeg har skrevet før.:

SqlVar = "UPDATE relation SET valgt = True WHERE id in(" & IDlist & ") AND product_ID = "  & request("produkt_id")

rettes til:
SqlVar = "UPDATE relation SET valgt = True WHERE cid in (" & IDlist & ") AND product_ID = "  & request("produkt_id")

lige ledes for den anden.
Avatar billede jmc Nybegynder
12. oktober 2002 - 08:21 #19
yep det har jeg rettet, men jeg kæmper lige med en fejl:
[Microsoft][ODBC Microsoft Access Driver]
Too few parameters. Expected 1.
line 14
som er: rs_relation.Execute (SqlVar)
Avatar billede eagleeye Praktikant
12. oktober 2002 - 13:02 #20
Prøv at udskrive SQL sætningen lige inden linien:
rs_relation.Execute (SqlVar)

Response.write SqlVar
Response.End          '<------- kan være nødvendig..
Avatar billede jmc Nybegynder
17. oktober 2002 - 08:29 #21
Jeg har godt nok nogle problemer med det. Tak for din tålmodighed.
koden:
Set rs_relation = Server.CreateObject("ADODB.Connection")
rs_relation.Open MM_bst_STRING

IDlist = Request.form("form1")
if IDlist = "" then
  'Ingen valgt sæt alle checkbox til false

SqlVar = "UPDATE relation SET valgt = false WHERE cid in (" & IDlist & ") AND product_ID = "  & request("produkt_id")
'response.Write(SqlVar)
'rs_relation.Execute (SqlVar)
Response.write SqlVar
Response.End
else
  'Opdater med IDlsit
SqlVar = "UPDATE relation SET valgt = True WHERE cid in (" & IDlist & ") AND product_ID = "  & request("produkt_id")
'response.Write(SqlVar)
rs_relation.Execute (SqlVar)

SqlVar = "UPDATE relation SET valgt = False WHERE cid in (" & IDlist & ") AND product_ID = "  & request("produkt_id")
'response.Write(SqlVar)
rs_relation.Execute (SqlVar)
end if

giver udskriften:
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'cid in () AND product_ID = 1'.
Avatar billede jmc Nybegynder
17. oktober 2002 - 12:23 #22
kan du gennemskue hvad går galt,
er det ikke når listen er tom?
Avatar billede jmc Nybegynder
18. oktober 2002 - 11:23 #23
Du kunne ikke besvare hele spørgsmålet øverst, så jeg håber det er ok at du modtager 70 poinst?
Avatar billede eagleeye Praktikant
18. oktober 2002 - 16:40 #24
Den føste IF'es SQL skal rettes så den ikke har IDList med da den netop er tom i det tilfælde og så skal valgt sættes til false ved product_ID:


if IDlist = "" then
  'Ingen valgt sæt alle checkbox til false

SqlVar = "UPDATE relation SET valgt = false WHERE product_ID = "  & request("produkt_id")
'response.Write(SqlVar)


Jeg er ked af jeg ikke har haft tid  til at kigge på det før nu, og jeg kan også første kiggge ind igen en gang i morgen.
Avatar billede jmc Nybegynder
19. oktober 2002 - 11:56 #25
Jeg ved ikke rigtigt hvad jeg gør forkert....

* Den udskriver:
UPDATE relation SET valgt = False WHERE product_id = 1

** Fejlen:
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

*** Koden:
IDlist = Request.form("form1")
if IDlist = "" then
  'Ingen valgt sæt alle checkbox til false

SqlVar = "UPDATE relation SET valgt = False WHERE product_id = "  & request("produkt_id")
'response.Write(SqlVar)

rs_relation.Execute (SqlVar)

Det er mærkeligt at det er en sådan simpel SQL den laver en sådan fejl på da produkt_idét findes i recorden?
Avatar billede eagleeye Praktikant
19. oktober 2002 - 18:26 #26
Normalt betyder den fejl at et kolonnenavn er stavet forkert??

Prøv at sætte [] omkring tabel og kolonnenavn sådan her det kan være der et ord som den ikke kan lide:

SqlVar = "UPDATE [relation] SET [valgt] = False WHERE [product_id] = "  & request("produkt_id")
 
eller måske hvis product_id er defineret som tekst..:

SqlVar = "UPDATE relation SET valgt = False WHERE product_id = '"  & request("produkt_id") & "'"
Avatar billede jmc Nybegynder
20. oktober 2002 - 23:07 #27
nu er der vist hvad at ske noget. Efter lang tids hakken rundt prøvede jeg
IDlist = Request.form
og bingo,
men fejlen er nu, når jeg responser SQL:

UPDATE relation SET valgt = True WHERE cid in (opgaver=5&soegeord=10&symptomer=11&teknisk=13) AND produkt_ID = 1
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 4.

udsnit af form som jeg poster fra.


                    <option value="8"  >bla</option>
                   
                    <option value="9"  >bla bla</option>
                   
                    <option value="10"  >bla bla bla</option>

der er bare value jeg er interesseret i...

skulle:
opgaver=5&soegeord=10&symptomer=11&teknisk=13
ikke være:
5,10,11,13
?

håber du lige hjælpe mig over det sidste med dette script, så skal du nok få de 170. ;o)
Avatar billede jmc Nybegynder
21. oktober 2002 - 00:59 #28
Det køre ikke helt optimalt her et par timer senere:
UPDATE relation SET valgt = True WHERE cid in (3=on&2=on&opgaver=5&soegeord=10&symptomer=11&teknisk=13) AND produkt_ID = 1
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
Avatar billede jmc Nybegynder
21. oktober 2002 - 17:14 #29
AHA

de to SQL efter hindanden. Den første sætter til true den anden til false. Derfor er alle false. Hvis jeg kun bruger den ene bliver alle True og ved den anden sættes alle til false. Valueén sendes til begge SQL er er ens. Det er kun når den er selected at den skal sendes... og opdateres.
Det er nok for vaskeligt at forklare og jeg gider helle ikke at bikse mere med det script. her har du points.
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