Newsgroup: it.comp.appl.access
Titolo: Consigli tecnici su recordset e  Funzioni

Buongiorno a tutti. 
In una form ho una routine che richiama tre Funzioni.
Le tre funzioni sono in un modulo a parte, dichiarate come Public Function.
Per capirci, la routine della form la chiamiamo semplicemente MiaRoutine.
 
MiaRoutine chiama la 1^ funzione che apre due tabelle A e B e restituisce il calcolo. 
La riga successiva di MiaRoutine chiama la 2^ funzione che torna ad aprire gli stessi recordset A e B. Restituisce il calcolo, e la riga successiva chiama la 3 ^ Funzione che torna ad aprire i recordset A e B. 
 Il consiglio che chiedo è : Chiudere al termine delle funzioni i Recordset con il comando .close (come avviene adesso) ?
O meglio lasciarle aperte per non rallentare il Db una volta che i dati sono corposi?.... ma d'altra parte potrebbero esserci altre complicazioni?
 
Un'altra sub domanda: quanti argomenti si possono inserire in una funzione?
C'è un limite? 
Grazie

Darti una risposta coerente e completa non è così semplice, sarebbe semplice darti una risposta sbrigativa...
 
La prima cosa che mi viene da dirti è che è assurdo APRIRE 3 Volte lo stesso oggetto, perdi 3 volte il tempo... ma per questoci sarebbe da vedere il codice.
Come mai hai 3 Funzioni e non solo 1...?
 
Possono le Funzioni 2 e 3 essere richiamate in modo Indipendente...? 
se NO allora non servono, se SI allora si potrebbero migliorare consentendo eventualmente la possibilità di accettare come Parametro il Recordset come Opzione.
Un esempio:
 
Public Function NomeSecondaFunzine(Param1 As Integer, Param2 As String, Optional rsExternal) As String
    Dim rs   As DAO.Recordset
    If Not isMissing(rsExternal) Then
       Set rs=rsExternal
    Else
       Set rs=CurrentDb.OpenRecordset(.....)
    End If
   ... quì usi il tuo RS...
End Function
 
In questo modo se una volta chie chiami la 1° passi alla 2° il RS già puntato, non serve riaprirlo... 
 
Per gli argomenti... cosa vuoi sapere di preciso...?
Puoi inserire tutti gli argomenti che servono... se sono 152 credo ci sia un possibile errore di progettazione della funzione, anche perchè ad esempio le funzioni supportano Array o ParamArray nonchè variabili di Tipo...
 
@Alex


perchè 3 e non 1 sola?
sei costretto per qualche motivo?
cosa succette se il programma ti crasha dopo che hai richiamato solo la 
prima delle 3?
 
aprendo una sola volta e chiudendola alla fine avresti a disposizione le 
transazioni per evitare inconsistenze nel caso sopra
 
BFS
 


Grazie ad entrambi per la risposta. Ho tre funzioni separate perchè sono tutte e 3 complesse. Quindi per fare chiarezza soprattutto in sede di manutenzione.  Questo codice era all'interno di MiaRoutine che già è abbastanza corposa quindi ho deciso di "fare pulizia".
MiaRoutine passa attualmente 9 argomenti (variabili) delle quali attende risposta. Ma alla fine saranno 22.
Mi sa che devo approfondire questo discorso "Array". Mai usato.  Come si comporta? 
 
Per quanto riguarda i recordset aperti, ora provo a non chiuderli. 
Vediamo che succede....  (temo la posizione del puntatore. magari dovrò aggiungere qualche riga tipo rs.movefirst....)

Il giorno venerdì 19 febbraio 2021 alle 09:21:15 UTC+1 BFS ha scritto:

 è vero FB, Le transazioni. Dovrei usarle. La ho usate una vita fa e ho dimenticato della loro esistenza. 

Mi pare che prima di pensare alle transazioni, sempre utili, tu debba dare una linea di coerenza al codice... altrimenti con le transazioni peggiori la confusione.
 
Non ho capito cosa significa lasciare aperti i Recordset..., detta così viste le premesse lascia adito a pensare ci sia della nebbia.
 
Vedi tu...
 
@Alex


Lasciare aperti i recordset = Non usare il comando .close
è proprio i fulcro della domanda iniziale:
 
Esempio di come funziona adesso:
MiaRoutine chiama la Funzione1
La funzione apre i recordset  rsAnagrafica e rsCollaboratori 
.... restituisce i valori a MiaRoutine. 
rsAnagrafica.close 
rsCollaboratori.close
 
MiaRoutine chiama la Funzione2
'Sono costretto a rinominare i recordset, perchè me lo chiede Access, (forse perchè non ho usato set rs = Nothing)
apre rsAnagrafica2 e rsCollaboratori2
...la funzione 2 restituisce i risultati
rsAnagrafica2.close 
rsCollaboratori2.close
...e cosi la Funzione 3
Mi chiedevo se non fosse più corretto aprire i recordset nella prima funzione
e chiuderli alla fine della 3^.
 
 

Purtroppo Mario quello che hai detto non ha alcun senso in termini
 di scrittura di codice.
Non è sbagliato in senso assoluto che ogni funzione sia
 indipendente ed istanzi gli oggetti dedicati.
L'errore sta nel non avere la visione d'insieme e capire che nel
 tuo caso è sbagliato per come lo hai descritto.
 
Le funzioni non si spezzano perché sono lunghe ma si spezzano se
 una parte di esse può essere richiamata anche da altre parti...
 altrimenti spezzarle è proprio sbagliato.
Quindi prima cosa, devi razionalizzare tecnicamente cosa fare.
Se la soluzione è veramente spezzare la funzione in 3 devi
 ottimizzarla e  come ti ho scritto sopra puoi passare il
 recordset aperto come parametro e ti ho anche indicato
 come...
 
Hai tutti gli elementi per chiudere.
 
@Alex
 
 
 
 
-- 
@Alex
 
 
----Android NewsGroup Reader----
https://piaohong.s3-us-west-2.amazonaws.com/usenet/index.html
 

 
 
Ok grazie
 

 
 
Mi sembra un'interpretazione molto riduttiva del concetto di funzione
Dire che  "..si spezzano se una parte di esse può essere richiamata 
anche da altre parti.." dove sta scritto?
E pure se fosse scritto da quelche parte, sarebbe comunque sbagliato
Perche' anche la separazione di una funzione sterminata in tante piu' 
brevi al solo scopo di un mantenimento migliore del codice, e' una 
ragione piu' che valida per farlo
 

Roberto... serve sempre capire con chi stai parlando... mi pare
 che l'op non abbia una base così formata da comprendere tutte le
 nozioni tecniche approfondite... motivo per cui ho
 alleggerito.
Se però vuoi dare la tua visione TECNICA completa io ti ascolto
 volentieri e di sicuro capisco quello che vorresti spiegare... e
 magari replico.
 
Aspetto.
 
Grazie


   
Veramente l'ho gia' data
Migliorare la manutenibilita' del programma separando il codice 
contenuto all'interno unica funzione in piu' funzioni, e' di per se' una 
buona ragione tecnica
 
 
 
 
 

Veramente l'ho gia' dataMigliorare la manutenibilita' del
 programma separando il codice contenuto all'interno unica
 funzione in piu' funzioni, e' di per se' una buona ragione
 tecnica
 
Certo, condivido... 



Alex...se invece lo dicevo io non andava bene perché non sono abbastanza formato? 
va be.... non importa! :-)

Alex...se invece lo dicevo io non andava bene perché non sono
 abbastanza formato? va be.... non importa! :-)
 
Scusa ma se hai detto tu di non saper usare bene parametri e
 funzioni ... questo per me equivale ad una non completa
 formazione di base e conseguente difficoltà ad entrare su
 concetti più tecnici.
Peraltro evidente dalle considerazioni fatte.
 
Quindi a parte sentirsi offesi in modo non necessario ma per il
 quale mi scuso ugualmente, fammi capire jn concreto dove ho
 sbagliato nel considerarti NON PIENAMENTE FORMATO...?


Spiego meglio.
Il concetto di divisione per dare leggibilità è funzionale ma non applicabile prescindere oltre che essere soggettivo.
Non è soggettivo invece il.concetto di spezzare la dove parte del codice può essere richiamato da altre parti.
Diciamo che tutto si può mettere in discussione, soprattutto se non si entra nel merito concreto delle cose, ma è poco sostenibile dimostrare che scrivere 50 volte lo stesso codice sia una cosa particolarmente sensata...
Invece si può tranquillamente sostenere che una funzione complessa sia più fruibile se lasciata intera, come anche che spezzandola sia più leggibile.
Se la funzione al suo interno utilizza ad esempio OGGETTI, come nel tuo caso, serve fare un ragionamento prima di valutarne la spazzatura... soggettivamente.
Da quello che hai esposto risulta indiscutibile che non fosse funzionale.
 
Quindi, se un concetto lo esprime una persona che ha visione tecnica d'insieme assume un valore, se lo esprime chi ha lacune di base ne assume un'altro e questo è normale senza sentirsi offesi.
 
Quindi se vuoi postare per intero le 3 funzioni e spiegarci i motivi che ti hanno indotto a spezzarle capiamo meglio anche se lo hai fatto con logica corretta o se sia da rivedere, basta che non ti offendi se poi ti si danno indicazioni reali.
 
Saluti
@Alex


c'è anche da dire che il problema della chiarezza nella visualizzazione 
e gestione delle funzioni molto "lunghe" sarebbe risolvibile con un 
editor un po' più recente.
quello di access è pressochè uguale da 20 anni.
 
esempio con editor di altri linguaggi un while end con dentro 50 righe 
che so che non toccherò mai più lo si può "comprimere" in una riga unica 
espandibile al bisogno
idem per blocchi if then else end
funzioni chilometriche si possono quindi ridurre a poche righe, quelle 
salienti
 
 
BFS
 
 
 
 

 BFS
 
Infatti la reputo una cosa sicuramente da considerare ma per nulla di sostanza.
Da dire che Notepad++ è meglio dell'editor del VBA... e questo la dice lunga.
 
@Alex
 

Mario Pug expressed precisely :

Dopo aver letto tutto il thread mi vien da dire che con acqua e
chiacchiere non si fan frittelle.
È molto complicato per te mettere on line tutto il codice con le tre
funzioni, spogliando l'intero database di quello che non necessita alla
circostanza?
 
Bruno



 valida per farlo
 
È un'arresa della mente alla procedura.
 
Se vi sono porzioni di codice che verranno richiamate da altre
procedure è cosa giusta e opportuna.
Diversamente se sono sezioni di calcolo valide solo per la
procedura in corso, perché non usare delle subroutine?
 
Bruno


Alex non hai sbagliato affatto a considerarmi non pienamente formato! Non hai di che scusarti poiché io non mi sono affatto offeso! Mi è solo sembrato bizzarro che una mia argomentazione, al netto della mia formazione, oggettivamente,  sia stata considerata discutibile, quando la stessa, detta da un altro più accreditato, sia diventata accettabile o addirittura giusta,  anche alla luce delle considerazioni di BF, sull'obsoleto editor di access che non consente "raggruppamenti di codice". 
Io nella vita mi occupo d'altro. Programmo per passione. Se mi capita un cliente faccio il lavoro. Non c'è stato mai nulla che non sia riuscito a fare con Access, (certo, anche grazie a questo forum, dagli anni 90!) Ma non mi considero certo formato, quindi non mi offendo giustamente lo insinua. 
Però voglio ribadire il concetto. 
Non trovo sbagliato lasciare che una funzione si occupi di fare il suo mestiere: cioè restituire risultati, quando la sub routine è lunga, tortuosa e piena di Select case e if annidati, se lo scopo è quello di avere una manutenzione più intellegibile.
Pace e bene a tutti :-)


Ribadisco Alex, nessuna offesa. Alla fine, per altri motivi, ho dovuto integrare tra loro le funzioni poiché i dati di una venivano sfruttati dall'altra. Per cui una volta creata un'unica funzione ho aperto un solo Recordset. 


Non e' una resa, ma un "..improvvisare, adattarsi, e raggiungere lo 
scopo.." (cit. Gunny)
Che intendi con 'subroutine' ?
Se e' una Function() di Access, allora e' quello che dicevo pure io
 
 
 

 Pace e bene a tutti :-)
 
A te.
@Alex

on 22-02-21, RobertoA supposed :

Non sai che cos'è una subroutine!?!?!?!?!?!?!?!?
 
Vatti a vedere GoSub... Return nell'Help e... vergognati!
 
Bruno