Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Consigli tecnici su recordset e Funzioni

121 views
Skip to first unread message

Mario Pug

unread,
Feb 19, 2021, 2:56:00 AM2/19/21
to
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

@Alex

unread,
Feb 19, 2021, 3:19:02 AM2/19/21
to
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

BFS

unread,
Feb 19, 2021, 3:21:15 AM2/19/21
to
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

Mario Pug

unread,
Feb 19, 2021, 5:39:51 AM2/19/21
to
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....)

Mario Pug

unread,
Feb 19, 2021, 5:41:45 AM2/19/21
to
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.

@Alex

unread,
Feb 19, 2021, 7:07:01 AM2/19/21
to
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

Mario Pug

unread,
Feb 19, 2021, 10:06:05 AM2/19/21
to
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^.


Alex

unread,
Feb 19, 2021, 10:15:01 AM2/19/21
to
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

Mario Pug

unread,
Feb 19, 2021, 12:30:33 PM2/19/21
to
Il giorno venerdì 19 febbraio 2021 alle 16:15:01 UTC+1 @Alex ha scritto:
> 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
>

Ok grazie

RobertoA

unread,
Feb 19, 2021, 1:14:12 PM2/19/21
to
Il 19/02/2021 16:14, Alex ha scritto:
> 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
>
>

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

Alex

unread,
Feb 19, 2021, 1:57:13 PM2/19/21
to
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

RobertoA

unread,
Feb 19, 2021, 2:52:44 PM2/19/21
to
Il 19/02/2021 19:57, Alex ha scritto:
> 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
> @Alex
>
>
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





Alex

unread,
Feb 19, 2021, 3:49:45 PM2/19/21
to
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...

Mario Pug

unread,
Feb 20, 2021, 6:05:59 AM2/20/21
to
Alex...se invece lo dicevo io non andava bene perché non sono abbastanza formato?
va be.... non importa! :-)

Alex

unread,
Feb 20, 2021, 7:05:02 AM2/20/21
to
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...?

@Alex

unread,
Feb 20, 2021, 8:41:59 AM2/20/21
to
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

BFS

unread,
Feb 20, 2021, 9:16:29 AM2/20/21
to
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




@Alex

unread,
Feb 20, 2021, 11:19:32 AM2/20/21
to
> 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

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

Bruno Campanini

unread,
Feb 20, 2021, 2:07:06 PM2/20/21
to
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

Bruno Campanini

unread,
Feb 21, 2021, 8:12:41 AM2/21/21
to

Bruno Campanini

unread,
Feb 21, 2021, 8:19:49 AM2/21/21
to
> 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

È 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

Mario Pug

unread,
Feb 22, 2021, 3:27:13 AM2/22/21
to
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 :-)

Mario Pug

unread,
Feb 22, 2021, 3:50:54 AM2/22/21
to
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.

RobertoA

unread,
Feb 22, 2021, 4:38:34 AM2/22/21
to
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



@Alex

unread,
Feb 22, 2021, 4:41:54 AM2/22/21
to
....
> 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....

Il punto focale è proprio questo, non puoi prescindere dal contesto e dalla conoscenza dell'interlocutore quando si fanno affermazioni nel forum, altrimenti si fa "Teoria", che è anche giusto fare... ma la chiamiamo teoria, la pratica è purtroppo ben più articolata e serve adattarsi per farla funzionare bene.

> Pace e bene a tutti :-)

A te.
@Alex

Bruno Campanini

unread,
Feb 22, 2021, 8:24:51 AM2/22/21
to
on 22-02-21, RobertoA supposed :
Non sai che cos'è una subroutine!?!?!?!?!?!?!?!?

Vatti a vedere GoSub... Return nell'Help e... vergognati!

Bruno
0 new messages