10. juni 2002 - 16:27Der er
12 kommentarer og 3 løsninger
RecordSet updateres løbende??
Jeg har en situation jeg ikke helt kan forklare, håber I måske kan hjælpe mig.
Jeg laver følgende 2 SELECT: inrs = SELECT * FROM input WHERE dato=#6/4/2002# AND [user]=4; outrs = SELECT * FROM input WHERE dato=#6/4/2002# AND [user]=5;
Efter det har jeg en While der løber recordsettet fra den første select igennem: While Not (Inrs.eof Or Inrs.bof) If (Outrs.eof Or Outrs.bof) Then SQL1 = UPDATE input SET [user]=5 WHERE id="&inrs("id")&"; Else SQL1 = UPDATE input SET [user]=5 WHERE id="&inrs("id")&"; SQL2 = UPDATE input SET [user]=5 WHERE id="&outrs("id")&"; conn.Execute(SQL2) outrs.movenext End If conn.Execute(SQL1) inrs.movenext Wend
Hvis jeg køre koden uden at update ind i DB'en, bliver følgende 2 SQL strenge udskrevet: UPDATE input SET [user]=5 WHERE id=3352; UPDATE input SET [user]=4 WHERE id=3353;
Hvis jeg køre koden hvor jeg update DB'en bliver disse SQL strenge udskrevet: UPDATE input SET [user]=5 WHERE id=3352; UPDATE input SET [user]=4 WHERE id=3353; UPDATE input SET [user]=5 WHERE id=3353;
Så vidt jeg kan se, løber den løkken igennem 2 gangen når jeg opdatere ind i DB'en. Dette sker igen så vidt jeg kan se fordi at efter den har kørt den første update, så er der en til record der passer ind i søgekriteriene på inrs-Selecten. Men hvordan kan det være, jeg lavet jo det record set før jeg gik ind i løkken?
I er velkommen til at spørgerløs, da problemet er lidt vanskelgit at forklare.
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
det kommer vel an på hvordan du åbner dit recordset. Hvis du bruger rs.Open inrs, conn, noget her som jeg ikke kan huske.. Så opdater den vist også recordset'et.
Jeg tror det er fordi du skal bruge And, istedet for Or!
While Not (Inrs.eof And Inrs.bof) If (Outrs.eof And Outrs.bof) Then SQL1 = UPDATE input SET [user]=5 WHERE id="&inrs("id")&"; Else SQL1 = UPDATE input SET [user]=5 WHERE id="&inrs("id")&"; SQL2 = UPDATE input SET [user]=5 WHERE id="&outrs("id")&"; conn.Execute(SQL2) outrs.movenext End If conn.Execute(SQL1) inrs.movenext Wend
Jeg sidde og kikker på din kode er kan ikke lige gennemskue hvad du ønsker den skal gøre... Så skriver du den udskriver: UPDATE input SET [user]=4 WHERE... Hvordan kan [user] bliver = 4 når din kode i loopet sætter[user]=5 alle steder?
Ok.. Hvorfor så ikke gøre det af to omgange for hvis du har flere i Outrs end i inrs så får du ikke opdateret alle records i outrs...:
'du laver satdig følgende 2 SELECT: inrs = SELECT * FROM input WHERE dato=#6/4/2002# AND [user]=4; outrs = SELECT * FROM input WHERE dato=#6/4/2002# AND [user]=5;
While Not (Inrs.eof Or Inrs.bof) SQL1 = "UPDATE input SET [user]=5 WHERE id="&inrs("id")&";" conn.Execute(SQL1) inrs.movenext Wend While Not (outrs.eof Or outrs.bof) SQL1 = "UPDATE input SET [user]=4 WHERE id="&outrs("id")&";" conn.Execute(SQL1) outrs.movenext Wend
Hvilken database anvender du ? Det lyder som om det ville være bedre at foretage det hele i databasen i én kørsel, fremfor at hive det ind i ASP og loope det igennem. Laver du noget med dine recordsets udover at opdatere ?
Eagleeye: tak for svaret. Pga. overblik har jeg valg ikke at vise hele koden (350 linie). Umildbart efter den kode jeg viste, har jeg en løkke, der løber outrs igennem efter overnævnte løkke er løbet igennem. På den måde sørger jeg for ikke at 'glemme' nogle records.
Pointen ved at løbe recordsettene igennem på samme tid er at der er flere felter som blive byttet rundt, ikke kune [user] feltet. Den anden løsning med at løbe dem igennem hver for sig, kan så vidt jeg kan se ikke gøre det. I de tilfælde hvor der er en record i Inrs, men ikke outrs, skal den også opfører sig på en bestemt måde.
Bruger du data på ASP siden, eller er det kun for at foretage opdateringen ? Hvis du bruger en database der kan håndtere sub-select, burde du kunne skrive det om til et enkelt SQL statement og lade databasen gøre arbejdet direkte.
tmceu: Access 97 og DB2. Ja, der sker en del med record settene, den orginale og ikke så overskuelige løkke ser sådan her ud, ser sådan her ud (har klippet en del ud stadig) :
For t = 0 to UBound(dato) If blablablabl ElseIf blablabla Elseif blablabla Else While Not (Inrs.eof Or Inrs.bof) If (Outrs.eof Or Outrs.bof) Then SQL1="UPDATE input SET "&swapoutputSQL&", [ansvarlig]="&findAdminID()&", [adminnote]='"&ReplaceSQL(Request.Form("note"))&"'" & strSQLOut&" WHERE id="&Inrs("id")&";" Else SQL1="UPDATE input SET "&swapoutputSQL&", [ansvarlig]="&findAdminID()&", [adminnote]='"&ReplaceSQL(Request.Form("note"))&"', [usernote]='"&Outrs("usernote")&"'" & strSQLOut&" WHERE id="&Inrs("id")&";" SQL2="UPDATE input SET "&swapinputSQL&", [ansvarlig]="&findAdminID()&", [adminnote]='"&ReplaceSQL(Request.Form("note"))&"', [usernote]='"&Inrs("usernote")&"'" & strSQLIn&" WHERE id="&Outrs("id")&";" conn.Execute(SQL2) End If conn.Execute(SQL1) SendMail() Inrs.movenext Wend While Not (Outrs.eof Or Outrs.bof) SQL2="UPDATE input SET "&swapinputSQL&", [ansvarlig]="&findAdminID()&", [adminnote]='"&ReplaceSQL(Request.Form("note"))&"'" & strSQLIn&" WHERE id="&Outrs("id")&";" conn.Execute(SQL2) SendMail() Outrs.movenext Wend End If Next
swapinputSQL, swapoutputSQL, strSQLIn og strSQLOut bliver alle sat inden denne løkke, ud fra bruger-input.
Jeg kender ikke Db'er godt nok til at vide om den slags kan udføres i dem?
Kender ikke nogle gode tutorials lige på stående fod, men for DB2 har IBM lavet nogle fremragende Redbooks som du burde kigge på. Søg eks. på www.ibm.com efter DB2 og Redbook
Et Eksempel på sub-select:
SELECT * FROM Tabel1 WHERE MyID IN (SELECT SomeID FROM Tabel2)
sub-selecten returnerer i dette tilfælde en liste med SomeID fra Tabel2 som bruges i WHERE clausen.
eagleeye og tmceu: Jeg har løst mit problem ved at ligge update-SQL strengene ind i et array og til allersidst løbe det array igennem og affyre SQL'erne. Ikke en specielt fed løsning, men den virker dog.
Jeg vil gerne give jer lidt point for den tid i har brugt, så Tmceu hvis du ligger et svar, så delerne jeg pointne ud.
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.