Har en ASP-lösning med SP-calls mot en MSSQL-db. Några SP är omfattande och tar kanske upp mot 1 minut innan instruktionerna i SP är klar. Förslagsvis så startar du arbetet via din popup-ruta, sätter sessionens timeout rätt högt så du inte får något felmeddelande. När körningen är klar så skriver du bara ut vad du vill med response.write. Tack Pelle, du är en guru... men jag är en aning svårfattande! Sätt timeouten på sidan så högt, inte sessionen... :) För att hämta det som returneras skriver du:Signal om att SP är klar
Jag skulle vilja ha följande flöde, typ:
1. Användaren trycker på en knapp "Uppdatera db"
2. Ett nytt litet sessionsfönster (typ 250x250pxl) öppnas där en statusbar rullar samt en text "Databasen uppdateras. Uppdateringen kan ta upp mot 2 minuter! Avvakta signal."
3. När SP är klar ska SP returnera felkoden/körningskoden till det lilla sessionsfönstret som ändrar texten till "Uppdateringen slutförd med felkod: XXX" (Dett funkar också helt ok med en MsgBox eller liknande.
Steg 1 är inga problem, inte heller steg 2. Men 3, hur löser jag detta, både från SP's sida som från ASP-koden?
Ytterst tacksam för lite hjälp på vägen.
// PelleSv: Signal om att SP är klar
Du kan till och med när du är klar stänga fönstret när rutinen är klar med:
response.write "<script>window.close();</script>"Sv: Signal om att SP är klar
Min Stored Procedure ser ut så här, t.ex.:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CREATE PROCEDURE iH_USER_Update
@User_Namn varchar (50),
@User_Status varchar (50),
@User_Pwd varchar (50),
@User_FullNamn varchar (50),
@User_Foretag varchar (8),
@User_Roll varchar (50),
@User_Beskr text
AS
BEGIN
/* Steg1: Ändrar poster i register */
UPDATE regUSER_tbl
SET User_Status = @User_Status,
User_Pwd = @User_Pwd,
User_FullNamn = @User_FullNamn,
User_Foretag = @User_Foretag,
User_Roll = @User_Roll,
User_Beskr = @User_Beskr
WHERE User_Namn = @User_Namn
END
GO
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
innan END bör det väl finnas en 'RETURN'-variabel av något slag, men hur?
ASP-koden innehåller ett Call på min SP, och skickar med ett antal värden:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<!--#include file = ../includes/database1_OpenSP.asp-->
<%
'## STARTAR ÄNDRINGEN I db. Allt sköts i sp
spSQL = "EXEC iH_USER_Update @User_Namn='" & Namn
spSQL = spSQL & "', @User_Status='" & Sts
spSQL = spSQL & "', @User_Pwd='" & Pwd
spSQL = spSQL & "', @User_FullNamn='" & replace(FullNamn, "'", "''")
spSQL = spSQL & "', @User_Foretag='" & FtgNr
spSQL = spSQL & "', @User_Roll='" & Roll
spSQL = spSQL & "', @User_Beskr='" & replace(Ant, "'", "''")
spSQL = spSQL & "'"
CnSQL.Execute(spSQL)
CnSQL.Close
%>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Efter Execute-kommandot bör det väl då komma ett RETURN-värde från databasen.. eller?
Denna programmeringsdel fattar jag inte. Om RETURN-värdet ska in i koden/strax efter så innebär det ju att sidan inte visas fullt förrän SP har lämnat sitt RETURN-värde, eller?
Om någon vet någon bra artikel om ASP, SP och RETURN-värden ... så vore jag ytterst tacksam.
//Pelle Sv: Signal om att SP är klar
Gör så att du sätter:
response.buffer = false
Sedan:
response.write "<script type=""text/javascript"">document.body.innerHTML='Uppdaterar databasen, det kan ta upp till 2 minuter, var god vänta.'</script>"
dim intReturn 'Stoppa in ditt returvärde här
'EXEKVERA SQL-KOD
response.write "<script type=""text/javascript"">document.body.innerHTML='Klart! Returkod: " & intReturn & "'</script>"
Det här borde fungerar tror jag... :)Sv: Signal om att SP är klar
set rst = CnSQL.Execute(spSQL)
varde = rst(0)
För att returnera något från din sp som du vill ta hand om skriver du ex:
return 8
Ett annat sätt är att faktiskt skriva en ny select om du vill returnera något speciellt
select sum(x) from tabell
Eller returnera vilket recordid det blev efter en insert
select @@identity