Avatar billede jgp Nybegynder
10. juni 2002 - 16:27 Der 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.

Håber i kan hjælpe!

Mvh
JGP
Avatar billede eagleeye Praktikant
10. juni 2002 - 16:35 #1
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.
Avatar billede medions Nybegynder
10. juni 2002 - 16:36 #2
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

//>Rune
Avatar billede eagleeye Praktikant
10. juni 2002 - 16:41 #3
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?
Avatar billede jgp Nybegynder
10. juni 2002 - 16:48 #4
Eagleeye: jeg kan se jeg har fået skrevet forkert der: While løkken bytter om på user'eren i inrs og outrs.

jeg åbner alle mine recors set sådan her: set rs=conn.execute(SQL)

Medions, jeg er ret sikke på det ikke er det, men jeg tjekker det i morgen.

Tak for jeres hjælp, jeg er først tilabge i morgen tidlig

/JGP
Avatar billede eagleeye Praktikant
10. juni 2002 - 16:58 #5
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
Avatar billede tmceu Praktikant
11. juni 2002 - 02:06 #6
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 ?
Avatar billede jgp Nybegynder
11. juni 2002 - 11:53 #7
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.
Avatar billede tmceu Praktikant
11. juni 2002 - 11:56 #8
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.
Avatar billede jgp Nybegynder
11. juni 2002 - 12:01 #9
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?
Avatar billede jgp Nybegynder
11. juni 2002 - 12:05 #10
tmceu: det lyder interesant, jeg kender ikke disse sub-select? Nogle steder hvor jeg kan læse eller se noget om dem?
Avatar billede tmceu Praktikant
11. juni 2002 - 12:09 #11
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.
Avatar billede jgp Nybegynder
11. juni 2002 - 12:31 #12
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.
Avatar billede tmceu Praktikant
11. juni 2002 - 12:39 #13
Juhuu :-)
Avatar billede jgp Nybegynder
11. juni 2002 - 12:42 #14
Tak for jeres hjælp :-)
Avatar billede tmceu Praktikant
11. juni 2002 - 12:47 #15
Det var så lidt :-)
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