IALweb Homepage
Forum Home Forum Home > MS Office > Microsoft Office > Microsoft Access
  New Posts New Posts RSS Feed - [Risolto] Usare moduli
  FAQ FAQ  Forum Search   Events   Register Register  Login Login


REGISTRATEVI su IALWeb forum!

[Risolto] Usare moduli

 Post Reply Post Reply
Author
Message
bob3m View Drop Down
Veterano
Veterano
Avatar

Joined: 30/Set/2011
Location: Gorizia
Status: Offline
Points: 1412
Post Options Post Options   Thanks (0) Thanks(0)   Quote bob3m Quote  Post ReplyReply Direct Link To This Post Topic: [Risolto] Usare moduli
    Posted: 20/Ott/2011 at 20:37

Salve a tutti,

sono un autodidatta e vedendo esempi, demo, spiegazioni, googlando più o meno l'ho sempre "spuntata" solo che di moduli....

Non trovo un sito dove spieghi bene come si creano e si usano i moduli.

Cioè non capisco se access se li carica da solo tutti i moduli sempre e comunque e poi basta richiamare la funzione in  un punto della form dove serve oppure bisogna indicare di caricare tale funzione prima di usarla, tipo all' evento apertura di una form.

Mi sapreste indicare un sito dove spieghi bene? Oppure con pazienza un anima pia che ha voglia di spiegarmi come creare una funzione e richiamarla?

Grazie a tutti

Massimo

 



Edited by bob3m
Back to Top
Sponsored Links


Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 21/Ott/2011 at 00:19

Credo che tu abbia la necessità di leggere qualche libro al riguardo.
Ve ne sono tanti comunque ti fornisco qualcosa di datato ma che presenta quanto da te richiesto:
http://myfreefilehosting.com/f/7fa8b3bff3_1.53MB
In ogni caso in breve, un modulo è un insieme di varie funzioni (o procedure) che possono avere un ampio interesse e quindi non applicabili magari ad una specifica maschera (o report). Si inseriscono per tipologia o argomento dando un nome significativo al modulo che li contiene. Una funzione può richiamere altre funzioni fornendo o meno parametri. La procedura svolge un determinato compito mentre una funzione restituisce di norma un valore.

Ad esempio un modulo che contiene funzioni di trasformazione a carattere numerico può essere il seguente:


'*********************************************************** *****
'* 
'*  FUNZIONE  :  NUMCIFRE
'*  AUTORI:  Willy 
'*  DATA    :  10  Maggio 1995
'* 
'*  DESCRIZIONE  :  Trasforma  un  valore  numerico  in  cifre 
'* 
'*  SINTASSI  :  C1  =  NUMCIFRE(N1)
'*     C1  =  numero  espresso  in  cifre
'*     N1  =  valore  numerico  da  trasformare    
'*    
'*  ESEMPIO    :  n  =  1250000 
'*    ?    "L'assegno  è  di  lire:  "+STR(n) 
'*    ?    "in  cifre  :  "  +  NUMCIFRE(n) 
'*
'*  NOTE    :  Richiama  funzione  num_chr  e  aggiunge  ad  ogni    
'*         &nbs p;  ciclo  delle  miglia  e  suoi  multipli  10x10x10
'*         &nbs p;   il  relativo  terminatore  letterale. 
'*********************************************************** *****

Function  num_chr(m_1_999  As  Double)  As  String

Static  cifre  As  String
Static  h1,  h2,  h3,  h4  As  Integer
Static  numcalc(35)  As  String
numcalc(1)  =  "UNO"
numcalc(2)  =  "DUE"
numcalc(3)  =  "TRE"
numcalc(4)  =  "QUATTRO"
numcalc(5)  =  "CINQUE"
numcalc(6)  =  "SEI"
numcalc(7)  =  "SETTE"
numcalc(8)  =  "OTTO"
numcalc(9)  =  "NOVE"
numcalc(10)  =  "DIECI"
numcalc(11)  =  "UNDICI"
numcalc(12)  =  "DODICI"
numcalc(13)  =  "TREDICI"
numcalc(14)  =  "QUATTORDICI"
numcalc(15)  =  "QUINDICI"
numcalc(16)  =  "SEDICI"
numcalc(17)  =  "DICIASSETTE"
numcalc(18)  =  "DICIOTTO"
numcalc(19)  =  "DICIANNOVE"
numcalc(20)  =  "VENTI"
numcalc(21)  =  "TRENTA"
numcalc(22)  =  "QUARANTA"
numcalc(23)  =  "CINQUANTA"
numcalc(24)  =  "SESSANTA"
numcalc(25)  =  "SETTANTA"
numcalc(26)  =  "OTTANTA"
numcalc(27)  =  "NOVANTA"
numcalc(28)  =  "VENT"
numcalc(29)  =  "TRENT"
numcalc(30)  =  "QUARANT"
numcalc(31)  =  "CINQUANT"
numcalc(32)  =  "SESSANT"
numcalc(33)  =  "SETTANT"
numcalc(34)  =  "OTTANT"
numcalc(35)  =  "NOVANT"

cifre  =  ""
h1  =  Int(m_1_999  /  100)

If  h1  >  1  Then
    cifre  =  cifre  +  numcalc(h1)  +  "CENTO"
ElseIf  h1  =  1  Then
    cifre  =  cifre  +  "CENTO"
End  If
h2  =  m_1_999  -  (h1  *  100)
If  h2  <  21  And  h2  <>  0  Then
   cifre  =  cifre  +  numcalc(h2)
End  If
If  h2  >  20  Then
   h3  =  Int(h2  /  10)
   h4  =  h2  -  (h3  *  10)
  Select  Case  h4
  '  analizza  se  l'ultima  cifra  è  uno  o  otto  che  iniziano  per  vocale
  '  in  tal  caso  pone  il  suffisso  senza  l'ultima  vocale  (per  decine)
  Case  1,  8
    cifre  =  cifre  +  numcalc(h3  +  26)
    cifre  =  cifre  +  numcalc(h4)
  Case  0
    cifre  =  cifre  +  numcalc(h3  +  18)
  Case  Else
    cifre  =  cifre  +  numcalc(h3  +  18)
    cifre  =  cifre  +  numcalc(h4)
  End  Select
End  If
num_chr  =  cifre
End  Function

Function  numcifre(numero  As  Double)  As  String

Static  cifre_per_numero  As  String
Static  a,  b,  c,  d,  h  As  Double
'  a  =  miliardi
'  b  =  milioni
'  c  =  migliaia
'  d  =  unità
Static  n1,  n2,  n3,  n4  As  Integer
'  n1  =  resto  miliardi
'  n2  =  resto  milioni
'  n3  =  resto  migliaia
'  n4  =  resto  unità

numero  =  Int(numero  +  0.5)

cifre_per_numero  =  ""
If  numero  <  0  Then
      cifre_per_numero  =  cifre_per_numero  +  "MENO"
numero  =  numero  *  (-1)
'  valore  assoluto
End  If
If  numero  =  0  Then
      cifre_per_numero  =  cifre_per_numero  +  "ZERO"
Else
   '  &&  (numero<>0)*
   a  =  Int(numero  /  1000000000)
   n1  =  numero  -  (a  *  1000000000)
   b  =  Int(n1  /  1000000)
   n2  =  numero  -  (b  *  1000000)
   If  n2  >=  1000000000  Then
      n2  =  numero  -  ((a  *  1000000000)  +  (b  *  1000000))
   End  If
   c  =  Int(n2  /  1000)
   d  =  n2  -  (c  *  1000)
   Select  Case  a
   Case  Is  >  1
    h  =  a
    cifre_per_numero  =  cifre_per_numero  +  num_chr(h)
    cifre_per_numero  =  cifre_per_numero  +  "MILIARDI"
   Case  Is  =  1
    cifre_per_numero  =  cifre_per_numero  +  "UNMILIARDO"
   End  Select
   Select  Case  b
   Case  Is  >  1
    h  =  b
    cifre_per_numero  =  cifre_per_numero  +  num_chr(h)
    cifre_per_numero  =  cifre_per_numero  +  "MILIONI"
   Case  Is  =  1
    cifre_per_numero  =  cifre_per_numero  +  "UNMILIONE"
   End  Select
   Select  Case  c
   Case  Is  >  1
    h  =  c
    cifre_per_numero  =  cifre_per_numero  +  num_chr(h)
    cifre_per_numero  =  cifre_per_numero  +  "MILA"
   Case  Is  =  1
    cifre_per_numero  =  cifre_per_numero  +  "MILLE"
   End  Select
   Select  Case  d
   Case  Is  <>  0
    h  =  d
    cifre_per_numero  =  cifre_per_numero  +  num_chr(h)
   End  Select
End  If

numcifre  =  cifre_per_numero
End  Function

'*********************************************************** *****
'*  FUNZIONE  :  EURO 
'*  AUTORI:  Willy*
'*  DATA    :  4  Ottobre  1999
'* 
'*  DESCRIZIONE  :  Converte  un  importo  in  Euro   
'*    
'*  SINTASSI  :  E1  =  EURO(N1) 
'*E1  =  valore  in  euro  di  tipo  double 
'*N1  =  valore  numerico  da  convertire 
'*    
'*  ESEMPIO    :  n  =  1890000
'*?    "Valore  lire  "+STR(n)+"  è    "+STR(euro(n))    
'*    
'*  NOTE    :  Deve  essere  aggiornato  nel  2001    per  variare
'*         &nbs p;   il  valore  del  cambio  in  funzione  di  quello    
'*         &nbs p;   definitivo.
'*********************************************************** *****

Function  euro(lire  As  Double)  As  Double

Static  valore_cambio  As  Double
valore_cambio  =  1936.27
euro  =  lire  /  valore_cambio

End  Function

Scrivi la tua funzione nel modulo se di carattere generale e nella maschera se specifica di questa.
Per richiamarla basta che la richiami con il suo nome e fornisci i parametri richiesti e ti restituirà magari un valore che impiegherai per le tue esigenze.
Questo detto in parole povere e per darti una risposta immediata. In ogni caso anche il web è una fonte notevole di informazioni e puoi documentarti a iosa.
Buon lavoro
 

Willy
Back to Top
65.franco View Drop Down
Utente Onorario
Utente Onorario
Avatar

Joined: 19/Apr/2009
Location: Italy
Status: Offline
Points: 4108
Post Options Post Options   Thanks (0) Thanks(0)   Quote 65.franco Quote  Post ReplyReply Direct Link To This Post Posted: 21/Ott/2011 at 11:13

Ma willy...  gli fai un esempio un po' da paura per un neofita...

Una function più semplice per capire il concetto poteva bastare ... no ?
Sei forte willy.

Ovviamente giusto il consiglio e anche l'esempio.
Se posso aggiungere darei qualche dritta per capire qualche concetto.

Prendiamo un modulo standard.

1) non dimentichiamoci mai di inserire al suo inizio l'istruzione Option Explicit
che constringe a dichiare in modo explicito tutte le variabili utilizzate nel modulo

2) nel modulo possiamo inserire function e sub
ricordiamoci sempre di utilizzare le due routine nel modo convenzionale:
Utiliziamo le function per avere di ritorno un valore
Utiliziamo le Sub per eseguire solo una parte di codice che non dovrà mai restituire un valore.

3) non dimentichiamoci mai di passare nel modo corretto i paramentri alle function che andiamo a scrivere nel modulo.
Vedere sempre il significato di ByVal o ByRef e Optional

A questo punto il più è fatto . Adesso non rimane altro che cercare di semplificare quanto si scrive a livello di codice nei moduli Form.

Il mio consiglio è quello di scrivere sempre meno codice possibile nei form e utilizzare sempre di piu i Moduli.
Se il codice scritto nei moduli delle form è snello sarà più semplice rileggerlo e modificarlo e/o implementarlo in momenti successivi.

Faccio un esempio per farmi capire.
Se a seguito di talune operazioni effettuate su un Form deve scaturire un evento di aggiornamento di records su di una tabella, tutto il codice da scrivere in merito è bene riportarlo dentro ad un modulo invece che nel codice della form.
Esempio di apertura e aggiornamento records di una tabella:


Option Compare Database
Option Explicit

' RIPRISTINO DI UN ID CONTATORE IN UNA TABELLA
' La function determina l'ultimo numero utilizzato dal contatore e
' lo ripristina al volore immediatamente successivo
' Parametri da passare alla function:
' strTbl = nome della tabella dove resettarte il contatore
' strId  = nome del campo (Fileds) Id Contatore da ripristinare
Public Sub changeCounter(ByVal strTbl As String, ByVal strId As String)
Dim rstTbl As New ADODB.Recordset       &am p;am p;am p;nb sp;       ' recordset tbl
Dim lCoRipr As Long         &a mp;a mp;a mp;n bsp;         &a mp;a mp;a mp;n bsp;         ' new contatore reset
' open tbl e determina ultimo Id number
lCoRipr = 1
rstTbl.Open "Select " & strTbl & "." & strId & " From " & strTbl & " Order By " & strTbl & "." & strId & " Desc;", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
' se esiste almeno un record, legge l'ultimo record e salva Id contatore new
If Not rstTbl.EOF Or Not rstTbl.BOF Then lCoRipr = rstTbl.Fields(strId).Value + 1
' close tbl
rstTbl.Close
Set rstTbl = Nothing
' aggiorna Id contatore
rstTbl.Open "Alter Table " & strTbl & " Alter Column " & strId & " Counter(" & lCoRipr & ",1)", CurrentProject.Connection, adOpenKeyset, adOpenKeyset
' close tbl
Set rstTbl = Nothing
End Sub


- come vedi da questo esempio o da quello di willy, eviti in questo modo di portarti dietro del codice nella form e allo stesso modo di poterlo richiamare in un qualsiasi punto del tuo progetto. (prova a pensare di cancellare un form... con esso cancelli anche tutto il codice che contiene e quindi anche delle Sub o Function che invece possono esserti utili anche in altri form e/o contesti)

- puoi richiamare le Sub e le Function sia da codice, da query, da report etc...

Qui mi fermo e ti rimando a quanto detto e illustrato da willy.
Penso che alcune dritte e concetti adesso ti possano essere più chiari dell'utilità dei moduli e di come e quando utilizzarli.
Ovviamente ci sarebbero tantissime cose da aggiungere in merito , vedrai che scoprirai più o meno tutto applicandoti così come già stai facendo.

Buon lavoro, Ciaooo ...

Franco...
Back to Top
bob3m View Drop Down
Veterano
Veterano
Avatar

Joined: 30/Set/2011
Location: Gorizia
Status: Offline
Points: 1412
Post Options Post Options   Thanks (0) Thanks(0)   Quote bob3m Quote  Post ReplyReply Direct Link To This Post Posted: 21/Ott/2011 at 21:31

Grazie per le risposte, siete sempre presenti per un aiuto e questo vi fa onore.

Si, le potenzialità del modulo le so e che mi sfuggono alcune cose.

Di lavoretti in access ne ho fatti ma ovviamente non sapendo usare correttamente i moduli ho aggirato i problemi massacrando le form di codice.

Libri? Ne ho comprati... Uno era a 2 volumi circa 1000 pagine e pagato 120 euro e parla in generale di cosa sono tabelle, form, report, ecc ma molto alla larga con esempi e prove che ti fanno annoiare...

L'altro " La programmazione" pagato 70 euro, stessa cosa e di moduli solo un accenno su cosa possono fare.

Cmq se per caso avete un titolo valido da darmi per la priogrammazione allora coro subito in libreria, perchè dato ad voi sicuramente è un libro OK.

 

Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 10254
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 21/Ott/2011 at 23:31

Vista la tua ...

Originally posted by bob3m bob3m wrote:


Di lavoretti in access ne ho fatti ma ovviamente non sapendo usare correttamente i moduli ho aggirato i problemi massacrando le form di codice.
Libri? Ne ho comprati... Uno era a 2 volumi circa 1000 pagine e pagato 120 euro e parla in generale di cosa sono tabelle, form, report, ecc ma molto alla larga con esempi e prove che ti fanno annoiare...

... puoi risparmiarti i dindini.

Dal momento che sai scrivere il codice e magari non hai (precedentemente) seguito un iter formativo devi riorganizzare il tuo lavoro. Ti consiglio di rivedere le tue procedure e ti dai un obiettivo di riscriverle in  una ottica di riusabilità ed in particolar modo cura la documentazione (come se dovessi presentarle a qualcun altro). Ciò ti renderà maggiormente astratto il problema (in quanto lo hai già risolto) ma avrai l'esigenza di ricercare quegli elementi formali per far capire ad un utente generico quello che hai scritto.  
Già questo ti farà fare un grosso passo avanti.
Dopodichè l'esperienza farà il resto. Nella prima fase l'help ed il web ti saranno di grande aiuto. E poi hai il forum...

Buon lavoro

Willy
Back to Top
bob3m View Drop Down
Veterano
Veterano
Avatar

Joined: 30/Set/2011
Location: Gorizia
Status: Offline
Points: 1412
Post Options Post Options   Thanks (0) Thanks(0)   Quote bob3m Quote  Post ReplyReply Direct Link To This Post Posted: 26/Ott/2011 at 16:21

Scusate se sono ancora qua a chiedere consiglio/aiuto

Se volessi creare una function in un modulo e tanto per fare un esempio scriviamo qualcosa come:


function prova()

public variabile1 ad integer
variabile1=me.testo1+me.testo2

end function

E' corretto?
E se questa function vorrei caricarla/chiamarla/usarla in una maschera, cosa devo mettere?
Nell'evento apertura o caricamento qualcosa come:


nomemodulo.prova

 Testo1 e testo2 sono caselle di testo della maschera.

Sbaglio vero?



Edited by bob3m
Back to Top
65.franco View Drop Down
Utente Onorario
Utente Onorario
Avatar

Joined: 19/Apr/2009
Location: Italy
Status: Offline
Points: 4108
Post Options Post Options   Thanks (0) Thanks(0)   Quote 65.franco Quote  Post ReplyReply Direct Link To This Post Posted: 26/Ott/2011 at 16:51

Fai riferimento alla demo che ho appena postato in questo link
http://www.ialweb.it/forum/forum_posts.asp?TID=15274331& PN=1&TPN=2
Vai alla fine del post e troverai un ampia esposizione della demo.

Troverai il metodo di richiamare una funzione sia da form che da query.

Ovviamente l'argomento è vastissimo, nella demo viene trattato un semplicissimo esempio di calcolo.
 
Se hai bisogno di ulteriori delucidazioni chiedi pure.

Ciaooo ...

Franco...
Back to Top
bob3m View Drop Down
Veterano
Veterano
Avatar

Joined: 30/Set/2011
Location: Gorizia
Status: Offline
Points: 1412
Post Options Post Options   Thanks (0) Thanks(0)   Quote bob3m Quote  Post ReplyReply Direct Link To This Post Posted: 26/Ott/2011 at 18:50

Grazie 65.franco, metto questo "risolto" perchè praticamente mi hai risposto nell'altro post.

Grazie anche a willy55 per i sempre suoi preziosi consigli ed esempi

 

Back to Top
 Post Reply Post Reply
  Share Topic   

Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 10.17
Copyright ©2001-2013 Web Wiz Ltd.

This page was generated in 0,078 seconds.