Newsgroup: it.comp.appl.access
Titolo: Access 2003 + form basata su stored procedure con tre parametri

In un ADP ho una form basata sul una stored procedure che prende tre parametri 
in input.
Purtroppo i tre parametri vengono da tre diverse combo e la loro combinazione 
può essere una qualsiasi.
Per questo motivo, ho avuto dei problemi nell'utilizzare direttamente del 
codice SQL, quindi ho fatto ricorso al Dynamic T-SQL per creare dinamicamente 
la stringa di WHERE (che potrebbe anche essere vuota). Ecco di seguito la 
stored procedure:
=================================================
ALTER PROCEDURE dbo.sp_VisualizzaStampantiLogica
(
@IDProgramma int = NULL,
@IDServizio int = NULL,
@IDUfficio int = NULL
)
AS
DECLARE @strWhere nvarchar(1000)
DECLARE @strSQL nvarchar(1000)
SELECT @strWhere = ''
IF @IDProgramma IS NOT NULL
  SELECT @strWhere = @strWhere + '(dbo.tblProgrammi.IDProgramma = ' + CAST(@IDProgramma 
AS nvarchar) + ') AND '
IF @IDServizio IS NOT NULL
  SELECT @strWhere = @strWhere + '(dbo.tblServizi.IDServizio = ' + CAST(@IDServizio 
AS nvarchar) + ') AND '
IF @IDUfficio IS NOT NULL
  SELECT @strWhere = @strWhere + '(dbo.tblUffici.IDUfficio = ' + CAST(@IDUfficio 
AS nvarchar) + ') AND '
IF @strWhere <> ''
  SELECT @strWhere = ' WHERE ' + LEFT(@strWhere, LEN(@strWhere) - 4)
SELECT @strSQL =
  N'SELECT dbo.tblMarche.Marca + '' '' + dbo.tblModelli.Modello AS ModelloStampante, 
dbo.tblStampanti.Codice ' +
  N'FROM dbo.tblProgrammi INNER JOIN dbo.tblServizi ' +
  N'     ON dbo.tblProgrammi.IDProgramma = dbo.tblServizi.IDProgramma ' +
  N'     INNER JOIN dbo.tblUffici ' +
  N'     ON dbo.tblServizi.IDServizio = dbo.tblUffici.IDServizio ' +
  N'     INNER JOIN dbo.tblStampanti ' +
  N'     ON dbo.tblUffici.IDUfficio = dbo.tblStampanti.IDUfficio ' +
  N'     INNER JOIN dbo.tblModelli ' + 
  N'     ON dbo.tblStampanti.IDModello = dbo.tblModelli.IDModello ' +
  N'     INNER JOIN dbo.tblMarche ' +
  N'     ON dbo.tblModelli.IDMarca = dbo.tblMarche.IDMarca ' +
  @strWhere +
  N' ORDER BY dbo.tblMarche.Marca, dbo.tblModelli.Modello, dbo.tblStampanti.Codice'
EXEC sp_executesql @strSQL
=================================================
L'utente filippo non ha alcuna autorizzazione sulle tabelle, mentre ha l'autorizzazione 
SELECT su una valanga di stored procedure, compresa quella sopra riportata.
Per il funzionamento della stored procedure non ci sono problemi se sono 
collegato a SQL Server come utente sa, mentre se provo ad eseguire la form 
con un diverso utente(chiamiamolo filippo), ottengo il seguente errore di 
autorizzazione negata:
"L'autorizzazione SELECT è stata negata per l'oggetto 'tblStampanti', database....., 
proprietario dbo"
Come utente filippo non ho alcun problema ad utilizzare tutte le altre form 
del progetto ADP, ma devo dire che nessuna delle altre stored procedure manda 
in esecuzione una seconda stored procedure, come invece accade in questo 
caso.
Aggiungo che ho anche provato ad assegnare all'utente filippo tutti i diritti 
sulla tblStampanti, ma l'errore si ripresenta di nuovo.
Sembra che la stored procedure sp_executesql venga eseguita con un altro 
profilo, quindi con diverse autorizzazioni.
Potete aiutarmi?
Grazie.
--
PBsoft di Gabriele Bertolucci
www.pbsoft.it
skype: pbsoftsolution

 Potete aiutarmi?
io farei cosě:
------
ALTER PROCEDURE dbo.sp_VisualizzaStampantiLogica
(
@IDProgramma int = NULL,
@IDServizio int = NULL,
@IDUfficio int = NULL
)
AS
SET NOCOUNT ON
SELECT @IDProgramma=IsNull(@IDProgramma,-1),
       @IDServizio=IsNull(@IDServizio,-1),
       @IDUfficio=IsNull(@IDUfficio,-1)
SELECT dbo.tblMarche.Marca + ' ' + dbo.tblModelli.Modello AS
ModelloStampante,
       dbo.tblStampanti.Codice
FROM   dbo.tblProgrammi
 INNER JOIN
       dbo.tblServizi ON dbo.tblProgrammi.IDProgramma =
dbo.tblServizi.IDProgramma
 INNER JOIN
       dbo.tblUffici  ON dbo.tblServizi.IDServizio =
dbo.tblUffici.IDServizio
 INNER JOIN
       dbo.tblStampanti ON dbo.tblUffici.IDUfficio =
dbo.tblStampanti.IDUfficio
 INNER JOIN
       dbo.tblModelli ON dbo.tblStampanti.IDModello =
dbo.tblModelli.IDModello
 INNER JOIN
       dbo.tblMarche ON dbo.tblModelli.IDMarca = dbo.tblMarche.IDMarca
WHERE  @IDProgramma=CASE WHEN @IDProgramma=-1
                    THEN -1 ELSE dbo.tblProgrammi.IDProgramma END
   AND @IDServizio=CASE WHEN @IDServizio=-1
                    THEN -1 ELSE dbo.tblServizi.IDServizio END
   AND @IDUfficio=CASE WHEN @IDUfficio=-1
                    THEN -1 ELSE dbo.tblUffici.IDUfficio END
ORDER BY dbo.tblMarche.Marca,
         dbo.tblModelli.Modello,
         dbo.tblStampanti.Codice
----
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 ALTER PROCEDURE dbo.sp_VisualizzaStampantiLogica
(omissis)
Funziona alla perfezione!!!!
Ti ringrazio tantissimo!!!!
Ma quando č che passi dalle parti di Viareggio cosě ti porto a mangiare del 
buon pesce, cucinato bene?!?!?


 ha scritto nel
messaggio news:44c0d186$0$989$5fc...@news.tiscali.it...
per la cronaca:
la Where proposta inibisce l'eventuale uso degli indici sui campi di filtro,
l'alternativa sarebbe quella di fare 8 stored procedure a seconda delle
condizioni, se hai tabelle con milioni di record puoi percorrere questa
strada.
Personalmente ho delle procedure con 20 parametri di filtro in ingresso dove
l'utente puo selezionare da nessuno a tutti i parametri.
Queste Sp eseguite su tabelle di piccole dimensioni (400.000-500.000 record)
rendono il risultato in 1/4 di secondo.
E' ovvio che non ho considerato l'idea di fare 2^20=1048576 store procedure
per ottimizzare i tempi di esecuzione.
:-)


 buon pesce, cucinato bene?!?!?
guarda che me lo segno :-)


 procedure per ottimizzare i tempi di esecuzione.
Magari sarą una futura ottimizzazione da far pagare oro colato :-)


 Si vede proprio che il tuo target è completamente diverso dal mio.
penso di no :-) quelle sono le righe di 12 anni di database, i primi 8
gestiti con Access e poi convertiti.
