Newsgroup: it.comp.appl.access
Titolo: Valori restituiti da una Routine Function





Ciao a tutti, vacanzieri e non.....


 


mi potete aiutare?


Spiego.


Ho creato la seguente Routine per poterla richiamare nel 
VBA di varie maschere .


 


'-  estrae la DataInizio e DataFine 
della tabella ParamentriDate ------------------


    
Public Function 
Inverno(DataInizio, DataFine)
    Dim Sql As String, RstPar As 
Recordset, dbs As Database
    Dim DataInizio As Date, 
DataFine As Date
    Set dbs = CurrentDb
    
 Sql = "SELECT ParametriDAte.InvInizio, ParametriDate.InvFine FROM 
ParametriDate;"
         Set RstPar = 
dbs.OpenRecordset(Sql, dbOpenDynaset)
        
DataInizio = RstPar!InvInizio
        DataFine 
= RstPar!InvFine
    End Function


 


quando la richiamo con 
Call 
Inverno(DataInizio, DataFine)
 da una maschera qualsiasi, i valori delle 
due date che vengono restituiti sono Null, mentre all'interno dell routine 
sono esatti.


 


-- 
Grazie per l'aiuto.


SG



     Public Function Inverno(DataInizio, DataFine)
prova a afre cosi'
Public Function Inverno(byref DataInizio,byref  DataFine)
E' uso sui NG di scrivere in formato testo. Se puoi evita di
scrivere in "testo formattato"
--
a.cara

 ha scritto nel messaggio 
news:NGnLe.6558$zs....@tornado.fastwebnet.it...

Grazie del suggerimento ma non cambia nulla;
all'interno della routine Inverno le date sono corrette, mentre dopo 
l'istuzione Call .... sono nulle.
Non so' se sia importante ma ho dimenticato di dire che all'interno della 
maschera dalla quale lancio la Call ho due campi caselle di testo non 
associati chiamati appunto DataInizio e DataFine.
Grazie anche del secondo suggerimento, spero che questo messaggio sia 
corretto.
By
SG 

 wrote in message 
news:yBnLe.16397$HM1.4...@twister1.libero.it...





Credo che tu abbia scritto la tua prima funzione...
Quando scrivi:
    Public Function Inverno(DataInizio, DataFine)
DataInizio e DataFine sono i parametri che TU passi alla
funzione, non quelli che la funzione ti restituisce (la quale
comunque non può rendertene più d'uno).
Vediamo se ho capito bene:
tu hai una tabella ParametriDate contenente n record in
ognuno dei quali vi sono, fra gli altri, i campi InvInizio, InvFine.
Con la tua funzione vorresti ottenere per ciascun record
le date InvInizio e InvFine?
E se sì dove vorresti tali date collocate?
Bruno 

 SG
Posta la Funzione che usi in modo completo, il suggerimento
di Alessandro è ineccepibile, ne consegue che devi aver
errato qualche assegnazione.
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
news:yBnLe.16397$
HM1.4...@twister1.libero.it

L'errore che commetti è la doppia assegnazione.
Public Function Inverno(byref DataInizio as date, byref DataFine as
date)
     Dim Sql As String, RstPar As Recordset, dbs As Database
     '-----------------------------------------------------
     ' NON DEVI ASSOLUTAMENTE DICHIARARLE PER LA 2° VOLTA
     'Dim DataInizio As Date, DataFine As Date
     '-----------------------------------------------------
     Set dbs = CurrentDb
      Sql = "SELECT ParametriDAte.InvInizio, ParametriDate.InvFine FROM
ParametriDate;"
          Set RstPar = dbs.OpenRecordset(Sql, dbOpenDynaset)
         DataInizio = RstPar!InvInizio
         DataFine = RstPar!InvFine
End Function
In ogni caso quanto fai è decisamente ANOMALO.
Il Recordset che estrai è formato da N° Records, tutti quelli
della Tabella ParametriDate, ma tu prendi solo quello puntato
dal Bookmark.
Chi ti dice che sia quello giusto....???
Secondo me hai mancato qualche pezzo...!!!


 ha scritto nel messaggio 
news:0a26c97893fbde24ae...@mygate.mailgate.org...


 Grazie per l'aiuto
Personalmente credo tu stia facendo confusione con l'uso
dell'assegnazione di Variabili ed il loro utilizzo...!
 
Io le riscriverei cosě:
Public Function Estate(ByRef DataInizio As Date, ByRef DataFine As Date)
  Dim Sql As String, RstPar As DAO.Recordset, dbs As DAO.Database
 
  Set dbs = CurrentDb
  Sql = "SELECT ParametriDate.EstInizio, ParametriDate.EstFine FROM
ParametriDate;"
  Set RstPar = dbs.OpenRecordset(Sql, dbOpenDynaset)
  DataInizio = RstPar!EstInizio
  DataFine = RstPar!EstFine
  rstPar.Close
  set rstPar=Nothing
  set dbs=Nothing
End Function
Public Function Inverno(ByRef DataInizio As Date, ByRef DataFine As
Date)
  Dim Sql As String, RstPar As DAO.Recordset, dbs As DAO.Database
  Set dbs = CurrentDb
  Sql = "SELECT ParametriDate.InvInizio, ParametriDate.InvFine FROM
ParametriDate;"
  Set RstPar = dbs.OpenRecordset(Sql, dbOpenDynaset)
  DataInizio = RstPar!InvInizio
  DataFine = RstPar!InvFine
  rstPar.Close
  set rstPar=Nothing
  set dbs=Nothing
End Function
Ora il problema č che la dichiarazione delle variabili
DataInizio e DataFine deve essere fatta da dove chiami 
la Funzione.
Dim DI as Date
Dim DF as Date
Call DateParametri.Inverno(DI, DF)
Cosě deve funzionare.
Saluti.


 e non n volte in ogni maschera.
Se devi ricercare 2 campi in una tabella di un solo record
puoi usare altro sistema:
=DlookUp("[InvInizio]","ParametriDate")
=DlookUp("[InvFine]","ParametriDate")
ciascuna nel Control Source di un Text Box.
Se proprio vuoi la funzione te la scrivo.
Ciao
Bruno 

 ha scritto nel messaggio 
news:eGpLe.52919$2U1.2...@news3.tin.it...

Te ne sarei grato.
Thanks
GS

 Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG
 Dim DI as Date
 Dim DF as Date
 Call DateParametri.Inverno(DI, DF)
con queste istruzioni finalmente funge!
Nella maschera avevo già 2 caselle di testo "DataInizio" e "DataFine" non 
associati ma non fungeva...
usando DI e DF e muovendoli nelle 2 caselle di testo è ok
Mi sai dire anche perhè non posso usare le variabili della Function 
(DataInizio e Datafine)?
Cmq Grazie 1000

 errato qualche assegnazione.
Sara' pure stato ineccepibile ma abbastanza "sciocco"
I parametri non erano tipizzati e quindi variant e
quindi byref per default.
Sempre a laura' stai.
Ciao
--
alessandro

 wrote in message
news:W9qLe.6650$
zs....@tornado.fastwebnet.it

Io li ho dichiarati as Data infatti. ;-)
Ti era sfuggita anche la doppia dichiarazione...!!
Le ferie le ho fatte in giugno ormai non ricordo nemmeno
dove sono stato.


 GS
Scusami, ho cambiato idea.
Bruno 

 ha scritto nel messaggio 
news:cCqLe.53026$2U1.2...@news3.tin.it...


 End Function
[...CUT...]
Ciao.
A parte il postare dopo il quoting, a parte la mancata dichiarazione dei
tipi, a parte il recordset aperto ma non chiuso, a parte che non puoi
richiedere due argomenti e poi dichiarare nella routine due variabili con lo
stesso nome degli argomenti, né tentare di assegnare un valore agli
argomenti ...
cosa ci vuoi fare con qs. funzione? Le funzioni hanno dei valori di ritorno,
ma tu non sembri averne bisogno. Perché non usi una Sub?
Mi sembra che tu faccia un po' di confusione sul funzionamento delle Sub e
delle Function, quindi ti farò soltanto degli esempi.
Le Sub fanno qualcosa, le Function oltre a fare qualcosa restituiscono un
valore.
Esempio:
Public Sub CalcolaDoppioDiTre()
    Dim x As Integer, y As Integer
    x = 3
    y = x * 2
    ' questo valore rimane qui, non "esce" dalla routine
End Sub
Public Function CalcolaDoppioDiTre() As Integer
    Dim x As Integer, y As Integer
    x = 3
    y = x * 2
    CalcolaDoppioDiTre = y
    ' invece questo valore viene assegnato al nome della function,
    ' in modo che la function possa essere usata all'esterno come
    ' una qualsiasi variabile
    ' Esempio: miovalore = CalcolaDoppioDiTre
End Function
infatti, mentre la sub è dichiarata semplicemente col suo nome, la function
viene dichiarata "... As Integer" (cioè del tipo del valore di ritorno)
Gli argomenti, sia delle Sub che delle Function, sono quei valori di cui la
routine ha bisogno per funzionare. Sone delle variabili, interne alla
routine ma il cui valore viene assegnato dall'esterno. Il loro valore può
essere manipolato all'interno della routine, ma non si può dichiarare
un'altra variabile all'interno della routine utilizzando lo stesso nome di
un argomento, perché in tal caso la variabile avrà la precedenza
sull'argomento (in quanto la sua durata è inferiore - cioè la sua esistenza
termina appena termina la routine, mentre l'argomento resiste anche
all'esterno)
Esempio:
Public Function CalcolaDoppio(num As Integer) As Integer
    ' ammettiamo che la chiamata sia stata:
    ' txtProva.Text = CalcolaDoppio(6)
    ' in questo momento il valore di num è 6, quindi il doppio sarebbe 12
    Dim num As Integer
    ' ora ho creato un'altra variabile num, che ha la precedenza sulla prima
    ' e il cui valore è 0
    CalcolaDoppio = num * 2
    ' ora ha calcolato il doppio di zero, cioè zero, e l'ho assegnato alla
function,
    ' che quindi restituisce zero.
End Function
La funzione corretta dovrebbe essere:
Public Function CalcolaDoppio(num As Integer) As Integer
    CalcolaDoppio = num * 2
End Function
Nelle Sub e nelle Function puoi anche modificare il valore degli argomenti.
In questo caso, se hai passato l'argomento ByRef (default) anche il valore
originale viene modificato. Non sempre però questo ha senso, e va ponderato
attentamente: se vuoi che il valore originale rimanga inalterato, cioè vuoi
soltanto leggere il valore attuale e fare i calcoli su tale valore, dovresti
passare gli argomenti con la clausola ByVal.
Spero di essere stato chiaro, e ti consiglio di approfondire questo
argomento (scusa il gioco di parole) con un po' di studio. Ciao.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ha scritto nel messaggio 
news:151Z37Z66Z108Y1...@usenet.libero.it...

Ho risolto con l'aiuto di Bruno e dei 2 Alessandro
Grazie cmq
GS