Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1

    Store Procedure con tabelle di ritorno

    Salve a tutti è da molto ci sbatto la testa

    Mi sono fatto questa bella procedura che funziona perfettamente

    codice:
    CREATE PROCEDURE GetBestPrice
    	-- Parametri di input della sp
    	@data_da	datetime,
    	@data_a		datetime,
    	@ID_Tipo	int,
    	@ID_Hotel	int,
    	@Numero		numeric(9)
    AS
    BEGIN
    	-- Imposto le variabili della procedura
    	DECLARE @Occupate 	numeric(9)
    	DECLARE @Disponibili 	numeric(9)
    	DECLARE @day		datetime
    	DECLARE @ImportoFB 	money
    	DECLARE @ImportoHB 	money
    	DECLARE @ImportoBB 	money
    	DECLARE @Conta		numeric(9)
    
    	
    	-- Imposto il formato delle date
    	SET DATEFORMAT dmy;
    	SET @Conta = 0
    	
    	-- Creo la tabella temporanea
    	CREATE TABLE #tmp
    	(
    		ID	  numeric, 	-- Contatore
    		Data	  datetime,	-- Giorno trovato
    		ImportoFB money,	-- Pensione Completa
    		ImportoHB money,	-- Mezza Pensione
    		ImportoBB money		-- B&B
    	)
    	-- Prendo il numero di camere Disponibili
    	-- per quel tipo di camera dell'hotel richiesto 
    	SELECT
    		@Disponibili = SUM(Camere.Numero)
    	FROM
    		Camere
    	WHERE
    		Camere.ID_Tipo 		= @ID_Tipo
    		AND Camere.ID_Hotel 	= @ID_Hotel
    	
    	-- Controllo se esistono delle disponibilità per quella camera
    	IF (@Disponibili IS NULL) OR (@Disponibili <= 0)
    	BEGIN
    		GOTO FINE
    	END
    
    	-- Ciclo per ogni giorno del periodo richiesto
    	SET @day = @data_da
    	WHILE @day <= @data_a
    	BEGIN
    		-- Prendo il numero di camere Occupate
    		-- in quel giorno
    		-- per il tipo richiesto
    		-- nell'hotel richiesto
    		SELECT
    			@Occupate = COUNT(Camere.ID_Camera)
    		FROM
    			Prenotazioni INNER JOIN
    			Camere ON Prenotazioni.ID_Camera = Camere.ID_Camera
    		WHERE
    			@day BETWEEN Prenotazioni.Da_Data AND Prenotazioni.A_Data
    			AND Camere.ID_Tipo = @ID_Tipo
    			AND Camere.ID_Hotel = @ID_Hotel
    		GROUP BY
    			Camere.ID_Camera
    
    		-- Controllo il numero di camere Occupate con il numero di camere Disponibili
    		-- PRINT '@Occupate: ' + CAST(@Occupate as varchar(20))
    		-- PRINT '@Disponibili: ' + CAST(@Disponibili as varchar(20))
    		-- PRINT '@Numero: ' + CAST(@Numero as varchar(20))
    		-- PRINT @Occupate + @Numero > @Disponibili
    		
    		IF @Occupate + @Numero > @Disponibili
    			-- Tutte le camere sono state occupate
    			BEGIN
    				-- Svuoto la tabella temporanea e esco
    				DELETE #tmp
    				BREAK
    			END
    		ELSE
    			-- C'è posto...
    			BEGIN
    				-- Prendo il prezzo migliore per quella camere per quel giorno
    				SELECT 
    					Top 1 
    					@ImportoFB = Min(ImportoFB) * @Numero,
    					@ImportoHB = Min(ImportoHB) * @Numero,
    					@ImportoBB = Min(ImportoBB) * @Numero
    				FROM 
    					PREZZI 
    				WHERE 
    					@day between Da_Data and A_Data 
    					AND ID_Tipo = @ID_Tipo 
    					AND ID_Hotel = @ID_Hotel
    
    				-- Controllo che abbia trovato un prezzo per quel periodo
    				IF 	(@ImportoFB IS NULL) AND 
    					(@ImportoHB IS NULL) AND 
    					(@ImportoBB IS NULL)
    					BEGIN
    						-- Non ha trovato nessun prezzo 
    						-- per cui svuoto tutto e esco
    						DELETE #tmp
    						BREAK
    					END
    				ELSE
    					BEGIN
    						-- Inserisco il prezzo nella tabella temporanea
    						INSERT INTO #tmp VALUES(@conta, @day, @ImportoFB, @ImportoHB, @ImportoBB)
    					END
    			END
    		-- Incremento il contatore di righe
    		SET @conta = @conta + 1
    		-- Incremento il contatore dei giorni
    		SET @day = dateadd(day, 1, @day)
    	END
    	
    	FINE:
    	RETURN Select * From #tmp
    END
    GO
    Nella pagina asp la richiamo in questo modo

    codice:
    Set Conn = server.CreateObject("ADODB.Connection")
    conn.connectionstring = connectionstring
    conn.open
    Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = conn
    cmd.CommandText = "GetBestPrice"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter("@data_da",	adDate,		adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@data_a",	adDate,		adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@ID_Tipo",	adInteger,	adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@ID_Hotel",	adInteger,	adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@Numero",	adDouble,	adParamInput)
    cmd.Parameters("@data_da")	= "22/11/2005"
    cmd.Parameters("@data_a")	= dateadd("d", 3, now())
    cmd.Parameters("@ID_Tipo")	= 1
    cmd.Parameters("@ID_Hotel")	= 1045
    cmd.Parameters("@Numero")	= 1
    Set rs = cmd.Execute
    A questo punto mi aspetterei che la store procedure mi ritorni una tabella... invece no??!?

    Perchèèèèèèèèèèèè????

    se la provo sul query analizer funziona perfettamente e la tabella che ritorna è giusta!!!

    Perchè se richiamata dalla pagina asp non ritorna niente????


    UFFFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    Più PILU per tutti!!

  2. #2
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    Hai provato con qualche response.write all'interno del codice?
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  3. #3
    Si per debug ho provato a farmi stampare:
    rs.state che mi ritorna uno 0 (zero, cioè la connessione è chiusa)
    Infatti quando provo a controllare se <%= rs.eof %> mi dà un errore dicendomi che non può controllarlo perchè la connessione è chiusa.
    Più PILU per tutti!!

  4. #4
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    Ma il codice che hai postato per richiamare asp è completo?
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  5. #5
    beh... c'è quello che server

    ovviamente non vi ho inserito la stringa di connessione
    ma che valorizzo prima di aprire la connessione.

    e il vari response.write che mi sono scritto per debuggare il ritorno della store procedure.

    Cmq si lo script è completo a meno che voi notiate che manca qualcosa.
    Più PILU per tutti!!

  6. #6
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    Ma vorrei capire, non ti stampa la tabella? Dà errore? Cos'altro pui aggiungere?
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  7. #7
    In pratica con questo comando Set rs = cmd.Execute m'immagino che l'esecuzione della store procedure ritorni un recordset e che valorizzi la mia variabile rs con questo recorset in modo da ciclarlo per generare una tabella.

    Purtroppo se gli faccio controllare il rs.EOF (If rs.EOF then) mi dà errore mi dice che non può controllare il valore di EOF in quanto l'oggetto è chiuso.

    Suppongo che sia perchè la store procedure non mi ritorna una tabella, non so...

    Però se eseguo la store procedure da query analizer con gli stessi dati che passo via asp mi fa vedere una bella tabellina (recordset) con tutti i suoi dati a posto...
    Più PILU per tutti!!

  8. #8
    magari ho scritto male la Store Procedure...
    Più PILU per tutti!!

  9. #9
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    ASP è un'altra cosa... sposta alla fine del tuo codice la chiusura della connessione e del recordset.
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  10. #10
    Questo tutto il codice della pagina...
    codice:
    <% '-----------------------------------------------------------------------------
    Set rs = Server.CreateObject("ADODB.Recordset")
    Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = conn
    cmd.CommandText = "GetBestPrice"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter("@data_da",	adDate,		adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@data_a",	adDate,		adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@ID_Tipo",	adInteger,	adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@ID_Hotel",	adInteger,	adParamInput)
    cmd.Parameters.Append cmd.CreateParameter("@Numero",	adDouble,	adParamInput)
    cmd.Parameters("@data_da")	= "22/11/2005"
    cmd.Parameters("@data_a")	= dateadd("d", 3, now())
    cmd.Parameters("@ID_Tipo")	= 1
    cmd.Parameters("@ID_Hotel")	= 1045
    cmd.Parameters("@Numero")	= 1
    set rs = conn.execute("sp_Test")
     '----------------------------------------------------------------------------- %>
    conn.state: <%= conn.state %>
    
    rs.state: <%= rs.state %>
    
    <% do while not rs.EOF  %>
    	<%= rs("ID") %> -
    	<% rs.MoveNext %>
    <% loop  %>
    <% set rs = nothing %>
    <% set cmd = nothing %>
    <% set conn = nothing %>
    E questo l'errore:
    ADODB.Recordset (0x800A0E78)
    L'operazione non è consentita se l'oggetto è chiuso.

    E fa riferimento alla riga <% do while not rs.EOF %>
    Più PILU per tutti!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.