• User Attivo

    Forse hai ragione per il timeout...

    
    CREATE PROCEDURE Sp_IMPORT_RM5_Operatore_No_Su_Giro
    
    --Questa procedura viene utlizzata per importare i fattorini che non sono stati assegnati ad alcun viaggio
    --per qualsiasi tipo di motivazione (Ferie, Permesso, Malattia e Training).
    --Viene richiamata da una pagina ASP che a sua volta viene chiamata tramite un .BAT che viene a sua volta
    --richiamato da un pulsantino in Access
    
    
    AS
    
    BEGIN
    
    	set nocount on
    
    	--cancello contenuto della tabella TB_GIRO_RDS a seconda della data che mi  stata passata
    
    	DECLARE @DataRDS datetime
    
    	DECLARE CursorInsertTable1 CURSOR FOR
    	SELECT DISTINCT
    	DataViaggio
    	FROM RM5.dbo.ViaggiEsportatiFleming
    	GROUP BY DataViaggio
    	OPEN CursorInsertTable1
    	FETCH NEXT FROM CursorInsertTable1 INTO @DataRDS
    	WHILE @@FETCH_STATUS = 0
    	   begin
    			
    		DELETE FROM TB_GIRO_RDS WHERE DATA = @DataRDS
    	
    	      FETCH NEXT FROM CursorInsertTable1 INTO @DataRDS
    	
    	   end 	
    	
    	close CursorInsertTable1
    	deallocate CursorInsertTable1
    
    
    	
    	--inserimento nella tabella TB_GIRO_RDS
    
    	DECLARE
    	@UtenteId varchar(10),
    	@Data datetime,
    	@NewId int, -- Nuovo ID
    	@Tabella varchar(50)
    	
    	SET @Tabella = 'TB_UTENTE_NO_SU_GIRO'
    	
    	DECLARE CursorInsertTable CURSOR FOR
    	SELECT DISTINCT
    	DB_COLLABORATORI.dbo.AD_UTENTI.ID, 
    	RM5.dbo.Problemi.Data
    	FROM
    	DB_COLLABORATORI.dbo.AD_UTENTI, RM5.dbo.Problemi 
    	WHERE EXISTS (SELECT RM5.dbo.ViaggiEsportatiFleming.CodProblema FROM RM5.dbo.ViaggiEsportatiFleming WHERE RM5.dbo.ViaggiEsportatiFleming.CodProblema = RM5.dbo.Problemi.Codice)
    	AND (DB_COLLABORATORI.dbo.AD_UTENTI.AREA_ID = 'S00000000J') 
    	AND (DB_COLLABORATORI.dbo.AD_UTENTI.STATO = '1')
    	AND (DB_COLLABORATORI.dbo.AD_UTENTI.ID+Convert(char(10),RM5.dbo.Problemi.Data)) NOT IN
    		(
    		SELECT DISTINCT
    		(RM5.dbo.ViaggiEsportatiFleming.CodAutista+Convert(char(10),RM5.dbo.ViaggiEsportatiFleming.DataViaggio))
    		FROM RM5.dbo.ViaggiEsportatiFleming
    		GROUP BY RM5.dbo.ViaggiEsportatiFleming.CodAutista, RM5.dbo.ViaggiEsportatiFleming.DataViaggio
    		)	    
    	OPEN CursorInsertTable
    	FETCH NEXT FROM CursorInsertTable INTO @UtenteId, @Data
    	WHILE @@FETCH_STATUS = 0
    	   begin
    			
    		EXEC MAKE_UNIQUE_KEY_INT @Tabella, @NewId OUTPUT -- Creo la nuova chiave primaria
    	
    		INSERT INTO TB_UTENTE_NO_SU_GIRO
    		(
    		ID,
    		UTENTE_ID,
    		DATA
    		)
    		VALUES
    		(
    		@NewId,
    		@UtenteId, 
    		@Data
    		)
    	
    	
    	      FETCH NEXT FROM CursorInsertTable INTO @UtenteId, @Data
    	
    	   end 	
    	
    	close CursorInsertTable
    	deallocate CursorInsertTable
    
    END
    
    

    confido in te
    grazie
    ciao


  • User Attivo

    Sicuramente va in timeout da codice...
    La procedura non è proprio semplicissima come esecuzione, fa anche uso di cursori e se i record sono centinaia di migliaia di sicuro non è veloce. Guarda il tempo che ci mette da query analyzer. Li la esegue perchè non esiste timeout. Può impiegarci anche 5 giorni.
    Le cose sono 2. O provi ad ottimizzarla (usa gli indici sui campi where) o la esegui solo da analyzer.
    Se il tempo di esecuzione non è esagerato puoi alzarlo un po via codice.

    server.scriptTimeout=n_secondi (in asp classic)
    Page.Server.ScriptTimeout = 60 (in vb.net)


  • User Attivo

    Non è il timeout ci mette 4 secondi ad eseguire entrambe le procedure...
    Il server però ha molte richieste al giorno, tieni conto che ci sono 150 utenti che lo usano costantemente e fanno decine di richieste al minuto, infatti pare proprio che quando le richieste aumentano vengono inseriti meno record nella tabella e viceversa quando le richieste diminuiscono vengono inseriti + record nella mia tabella.
    Che posso fare!?!?!?
    Come posso dire alla stored procedure "ESEGUI IL MIO CODICE FINO IN FONDO PRIMA DI USCIRE..." !?!?!?

    fammi sapere

    grazie
    ciao


  • User Attivo

    Forse è una questione di permessi

    Sul query analyzer ti logghi come sa? Prova a loggarti con lo stesso utente col quale ti connetti al database e vedi se ti esegue tutta la procedura


  • User Attivo

    Uso lo stesso utente da ambo le parti...
    Sembra quasi che mi serva un ROLLBACK o qualche cosa del genere... che ne dite!?!?

    grazie
    ciao


  • Moderatore

  • User Attivo

    A sto punto non saprei. E' un po difficile capire senza metterci le mani sopra.
    i sintomi sono quelli del timeout ma se mi dici che la stored è veloce non saprei.
    Magari è il webserver che è troppo lento a causa delle troppe connessioni


  • User Attivo

    Pensate ho provato il ROLLBACK e non inserisce nulla nella tabella
    Di seguito il codice che ho inserito come rollback

    
    --al'inizio della procedura ho messo
    BEGIN TRAN 
    
    
    --mentre alla fine della procedura ho messo
    IF (@@ERROR<>0) GOTO on_error
    
    COMMIT TRAN
    RETURN (1)
    
    on_error:
    ROLLBACK TRAN
    RETURN (-1)
    
    

    che dite dovrebbe essere giusto!?
    non so + che fare... qualche suggerimento!?!?!?!?!?!?!?!?

    grazie
    ciao


  • User Attivo

    Io sono convinto che non è un problema di database ma dipende sicuro da qualcosa che sta a monte...
    Se la stored funziona nell'analizyer allora il db non c'entra sicuro.


  • User Attivo

    Cosa mi consigli di guardare!?
    fammi sapere

    grazie
    ciao


  • User Attivo

    Crea una tabella di prova con 1 campo testo.
    Crea una nuova stored che accetti un parametro nvarchar in ingresso e che inserisca il valore nella nuova tabella creata.
    Chiama la stored passandogli il parametro e vedi se inserisce il valore.
    Comincia ad escludere almeno se c'è un problema di comunicazione con il database o se è quella stored a non rispondere.


  • User Attivo

    @FuSioNmAn said:

    Crea una tabella di prova con 1 campo testo.
    Crea una nuova stored che accetti un parametro nvarchar in ingresso e che inserisca il valore nella nuova tabella creata.
    Chiama la stored passandogli il parametro e vedi se inserisce il valore.
    Comincia ad escludere almeno se c'è un problema di comunicazione con il database o se è quella stored a non rispondere.

    Questo lo fa... anche perchè comunque ci sono centinaia di richieste al giorno... sembra che sia solo quando deve inserire un certo numero di dati in 2 tabelle diverse tramite un ciclo sql...
    Comunque abbiamo escluso che sia problema di comunicabilità, cos'altro posso fare!?
    confido in te, grazie
    ciao


  • User Attivo

    Incolla il codice asp della pagina che chiama la stored.
    Tutto il codice asp, non solo dove chiama la stored.


  • User Attivo

    @FuSioNmAn said:

    Incolla il codice asp della pagina che chiama la stored.
    Tutto il codice asp, non solo dove chiama la stored.

    Ecco il codice ASP che mi hai chiesto

    
    <%@ Language=VBScript %>
    <% Response.buffer = true %>
    <html>
    <!-- #INCLUDE FILE="Constants.asp" -->
    <head>
    <link rel="STYLESHEET" type="text/css" href="StyleSheets/styleStampa.css">
    <meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
    
    <meta HTTP-EQUIV="Cache-Control" CONTENT="no_cache">
    <meta HTTP-EQUIV="Pragma" CONTENT="no_cache">
    <meta HTTP-EQUIV="Expires" CONTENT="0">
    
    <script language="javascript" src="js/Utility.js"></script>
    
    </head>
    
    <body>
    
    <%
    
    dim conn
    dim rsImportViaggi
    dim rsImportOperatoriNoSuGiro
    
    Response.expires=0
    Response.CacheControl="private"
    
    Server.ScriptTimeout = 2000
    
    set conn = server.CreateObject("ADODB.Connection")
    conn.Open Session("Connessione")
    
    set rsImportViaggi = server.CreateObject ("ADODB.recordset")
    set rsImportViaggi = conn.Execute ("Sp_IMPORT_RM5_Viaggi_Rds")
    %>
    
    <br><br><br><br>
    <center>
    IMPORT VIAGGI R.D.S. NEL PORTALE<br>AVVENUTO CON SUCCESSO...
    </center>
    
    <%
    set rsImportOperatoriNoSuGiro = server.CreateObject ("ADODB.recordset")
    set rsImportOperatoriNoSuGiro = conn.Execute ("Sp_IMPORT_RM5_Operatore_No_Su_Giro")
    %>
    
    <br><br><br><br>
    <center>
    IMPORT OPERATORI NO SU GIRO NEL PORTALE<br>AVVENUTO CON SUCCESSO...
    </center>
    
    
    <%
    'Chiude rs e conn
    rsImportViaggi.close
    set rsImportViaggi = nothing
    
    rsImportOperatoriNoSuGiro.close
    set rsImportOperatoriNoSuGiro = nothing
    
    conn.Close
    set conn = nothing
    %>
    
    </body>
    </html>
    
    
    

    ciao, ciao


  • User Attivo

    Avanti ragazzi, ma proprio + nessuno mi sa aiutare...!?
    dai forza e coraggio a me è rimasto il problema inrisolto... non vorrete lasciare un povero ragazzo in alto mare!!

    AIUTO!!

    grazie
    ciao