Newsgroup: it.comp.appl.access
Titolo: Parametro in output non passato da una SP SQLserver

Da un programma Access97(FE) eseguo una Stored Procedure di un database SQL7
(BE) utilizzando l'oggetto Command di ADO. Alla SP viene inviato un
parametro input e la stessa deve ritornare un secondo parametro in output.
Quest'ultimo parametro rappresenta l'esito dell'elaborazione.
La SP sicuramente funziona, e se la eseguo richiamandola dal Query Analyzer
di SQL7 in qualsiasi caso mi ritorna la stringa in cui è specificato
l'esisto dell'elaborazione.
Purtroppo se la SP viene eseguita da Access mi ritorna solo l'esito
positivo, mentre non viene ritornato nulla nel caso contrario, cioè quando
la funzione @@Error di SQL7 è > 0 e di conseguenza non posso evidenziare
l'esito dell'elaborazione.
Qualcuno può aiutarmi ?
Grazie
Eugenio
Di seguito riporto la parte essenziale del codice:
--- Codice
VBA ------------------------------------------------------------------------
---------------------
    ...
    ...
    Cmd.CommandText = "EliminaRecords"
    Cmd.CommandType = adCmdStoredProc
    Cmd.Parameters.Append Cmd.CreateParameter("@Cod", adVarChar,
adParamInput, 3, Me!Cod)
    Cmd.Parameters.Append Cmd.CreateParameter("@Msg", adVarChar,
adParamOutput, 250, strMsg)
    Cmd.CommandTimeout = 6000
    Cmd.Execute
    ...
    ...
--- Stored
Procedure ------------------------------------------------------------------
----------------------------
CREATE Procedure EliminaRecords  @Cod varchar(3)
                                                        , @Msg varchar(250)
output
as
...
...
...
Delete
From Tabella
Where Cod = @Cod
Set @Errore = @@Error
If @Errore = 547
   Begin
        Set @Msg = 'Non è possibile cancellare il codice - ' + @Cod + ' - .'
   End


[CUT]
Ciao Eugenio
a prima vista è tutto corretto, ma non vedo dove memorizzi  il valore di
ritorno (o non lo memorizzi ?)
------------------
...
...
...
Cmd.Execute
strMsg=Cmd.Parameters(1)
-----------------
Ciao Giorgio


Ho tralasciato quella parte di codice, dove valorizzo la variabile cosě come
hai fatto tu. Il mio problema č che in Cmd.Parameters(1) viene "ritornata"
una stringa vuota. Ma č vuota solo nel codice VBA, perchč, come dicevo, se
eseguo la SP da QueryAnalyzer la stringa ha un valore.
Sembrerebbe che SQL solo per il fatto di avere un valore <> da 0 in @@Error
non valorizzi @Msg, definito come output.  Ho provato anche a eseguire una
SP che richiama con Execute la SP in questione e in questo nel parametro
@MSG č contenuto un valore.
Grazie
Eugenio


Ciao Eugenio,
č molto strano a me funziona, che sia un problema di versione ADO ?
Prova cosě
---------------------------------------
    Dim Rs As ADODB.Recordset
    Dim Sqltext As String
    ... 'prepari la connessione ecc.
    ...
    Cmd.CommandType = adCmdText
    Sqltext = "DECLARE @Msg varchar(255) " & _
                   "EXEC EliminaRecords '" & Me!Cod & "',@Msg OUTPUT " & _
                   "SELECT @Msg AS Messaggio"
    Cmd.CommandText = Sqltext
    Set Rs = Comm.Execute(Sqltext)
    'Valore di ritorno
    Debug.Print Rs!Messaggio
--------------------------------------
Ciao Giorgio


Grazie, ora proverň.
Nel frattempo ho fatto altre prove e ho verificato che il problema si
genera, perchč nella stessa SP ci sono altre due query di cancellazione di
tabelle che hanno Foreign key con la tabella principale, cioe quella che ho
evidenziato nel codice. Per spiegarmi meglio di seguito espongo il codice
completo della SP.
----------------------------------------------------------------------------
-------------------------------------------------------------
CREATE Procedure CancellaMezzoSpedizione  @Cod varchar(3)
                                        , @Msg varchar(250) output
as
Declare @Errore int
Set @Errore = 0
Begin Transaction
-- Descrizione in Lingua
Delete
From MezziSped_Lingua
Where Cod = @Cod
If @@Error > 0
   Begin
        Set @Msg = 'Non č possibile cancellare la descrizione in lingua del
Mezzo di Spedizione - ' + @Cod + ' - .'
    GoTo ERRORE
End
-- Riferimenti
Delete
From MezziSped_Rifer
Where Cod = @Cod
If @@Error > 0
  Begin
       Set @Msg = 'Non č possibile cancellare i Riferimenti del Mezzo di
Spedizione - ' + @Cod + ' - .'
      GoTo ERRORE
   End
-- Vettore
Delete
From MezziSped
Where Cod = @Cod
Set @Errore = @@Error
If @Errore = 547
   Begin
        Set @Msg = 'Non č possibile cancellare il Mezzo di Spedizione - ' +
@Cod + ' - .'
    GoTo ERRORE
   End
If @Errore > 0
   Begin
        Set @Msg = 'Non č possibile cancellare il Mezzo di Spedizione - ' +
@Cod + ' - .'
    GoTo ERRORE
   End
Commit Transaction
GoTo FINE
ERRORE:
RollBack Transaction
FINE:
----------------------------------------------------------------------------
-------------------------------------------------------------------------
Sicuramente (!) le prime due query di cancellazione non generano errore,
perchč per il momento sono tabelle vuote.
Grazie
Ciao
Eugenio


Purtroppo anche cosě non funziona.
Grazie
Ciao
Eugenio


Ciao Eugenio,
in questo caso il codice VB si interrompe alla riga "Cmd.Execute", hai una
gestione dell'errore ?
-----------------------
    On Local Error Resume Next
    Cmd.Execute
    Debug.Print Comm.Parameters("@Msg")
    On Local Error GoTo 0
------------------------
Ciao Giorgio


Si, la gestione dell'errore esiste, ma non si verifica nessun errore, perchè
la SP funziona. Il problema è solo il parametro che non viene ritornato.
Grazie
Ciao, Eugenio


Ciao Eugenio
simulando la tua Sp io ricevo l'errore
-------------------
L'istruzione DELETE ha generato un conflitto con il vincolo COLUMN REFERENCE
'FK_Sp2_Sp1' nel database 'Prova', tabella 'Sp2', column 'IdCampo1'.
-------------------
ma continuando con il codice mi viene ritornato il parametro di output.
E' evidente che i comportamenti sono differenti ma visto che da Query
Analyzer funziona  l'unica cosa che mi viene in mente è la versione di ADO,
io ho la 2.8 (non so se funziona con SqlServer 7.0).
Che versione utilizzi ?
Ciao Giorgio


La mia versione è la 2.5. Ora provo ad installare la versione che mi hai
segnalato.
Il messaggio che mi esponi lo vedo solo nel caso nella SP ci sia solo una
Delete.
Grazie
Ciao, Eugenio


FUNZIONA !!!
GRANDE GIORGIO!!!
E' proprio un problema di versione. Ho installato la 2.7, perchè è la
versione che avevo disponibile al momento.
Sono poi andato sul sito Microsoft e ho scaricato la versione 2.8, ma prima
di installarla volevo chiederti se si verificano dei problemi con le
applicazioni Access 97, perchè nella pagina compare questa frase:
"This release does not include Microsoft Jet, the Microsoft Jet OLE DB
Provider or ODBC driver, the Desktop Database ODBC Drivers, or the Visual
FoxPro ODBC Driver."
Grazie Giorgio
Ciao
Eugenio

 ha scritto nel messaggio
news:brsba2$cij$1...@lacerta.tiscalinet.it...

Ciao Eugenio,
non ho mai provato ad installare MDAC 2.8 su sistemi con Acc97, ma da quanto
dice il messaggio non è incluso MsJet e (acc97 usa la ves 3.5) e jet ole_db
o ODBC quindi continuerai ad utilizzare quelli esistenti.
Comunque maggiori info su MDAC 2.8 li puoi trovare qui
Release Manifest for MDAC 2.8 (2.80.1022.3)
http://support.microsoft.com/default.aspx?scid=kb;EN-US;828396
Ciao Giorgio


Grazie !
Ciao, Eugenio