BRESCIANET · docmd => oggetto che è spannometricamente il menu di access a livello di...

33
BRESCIANET.COM Sito didattico - Prof. Sechi Marco Passa al contenuto [ Pannello di Controllo Moderatore ] 3° MODULO - Classe 4N Rispondi al messaggio 14 messaggi • Pagina 1 di 2 1, 2 z Modifica messaggio z Cancella messaggio z Segnala il messaggio z Informazione z Rispondi citando 3° MODULO - Classe 4N di e01692 » 08/03/2010, 10:57 Top z Modifica messaggio z Cancella messaggio z Segnala il messaggio z Informazione z Rispondi citando 3° MODULO - Classe 4N - 08/03/2010 di e01692 » 11/03/2010, 12:41 Ricerca avanzata Cerca… Cerca Cerca qui… Cerca Appunti estemporanei relativi al 3° Modulo - classe 4N obiettivo della programmazione => automatizzare operazioni ripetitive. ALT+f11 => passo al modulo di programmazione Visualizzazione struttura => progettazione della maschera Visualizzazione maschera => utilizzo da parte dell'utente finale spiegato come si spiega la creazione della maschera la programmazione VBA è una programmazione ad oggetti Nella prg ad oggetti non esiste un punto di avvio dell'applicazione ma dipende dagli eventi Un metodo è una piccola porzione di programma che esegue una determinata operazione e che viene attivato da eventi. Un evento è un accadimento che determina l'esecuzione di un metodo di un oggetto. Un oggetto è caratterizzato da proprietà che possono essere impostate in modalità struttura ma anche via codice vba Esempio di codice di un evento Private Sub BtnRichiediNome_MouseMove(Button As Integer, Shift As Integer, X As Single,

Transcript of BRESCIANET · docmd => oggetto che è spannometricamente il menu di access a livello di...

BRESCIANET.COM Sito didattico - Prof. Sechi Marco Passa al contenuto

[ Pannello di Controllo Moderatore ]

3° MODULO - Classe 4N Rispondi al messaggio

14 messaggi • Pagina 1 di 2 • 1, 2 Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N di e01692 » 08/03/2010, 10:57

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 08/03/2010 di e01692 » 11/03/2010, 12:41

Ricerca avanzata

Cerca… Cerca

Cerca qui… Cerca

Appunti estemporanei relativi al 3° Modulo - classe 4N

obiettivo della programmazione => automatizzare operazioni ripetitive. ALT+f11 => passo al modulo di programmazione Visualizzazione struttura => progettazione della maschera Visualizzazione maschera => utilizzo da parte dell'utente finale spiegato come si spiega la creazione della maschera la programmazione VBA è una programmazione ad oggetti Nella prg ad oggetti non esiste un punto di avvio dell'applicazione ma dipende dagli eventi Un metodo è una piccola porzione di programma che esegue una determinata operazione e che viene attivato da eventi. Un evento è un accadimento che determina l'esecuzione di un metodo di un oggetto. Un oggetto è caratterizzato da proprietà che possono essere impostate in modalità struttura ma anche via codice vba Esempio di codice di un evento Private Sub BtnRichiediNome_MouseMove(Button As Integer, Shift As Integer, X As Single,

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N 11/03/2010 di e01692 » 11/03/2010, 12:42

Y As Single) Me.BtnRichiediNome.Caption = "Saluta {" & X & ", " & Y & "]" End Sub me => oggetto contenitore => in un form (maschera) è la maschera stessa. scrivendo il nome dell'oggetto seguito dal punto ottengo un elenco a discesa con le proprietà (o oggetti figli) e i metodi (azioni disponibili)

Ricordarsi di dare alla proprietà name la sigla identificativa dell'oggetto ad esempio lbl => etichetta btn => bottoni lst => listbox chk => checkbox proprietà me.lblcognome.Caption ="xxxxxx" routine abbinata ad un evento del form alcuni eventi hanno dei parametri Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Me.lblNome.Caption = "Coords: X:" & X & ", Y: " & Y Me.btnprova.Caption = "Coords: X:" & X & ", Y: " & Y End Sub Private Sub Form_Load() Me.Caption = InputBox("Che Titolo metto alla maschera: ", "Richiesta", "") End Sub Private Sub Form_Unload(Cancel As Integer) MsgBox "Saluti", vbCritical, "titolo kkkkkk" End Sub Private Sub btnprova_Click() MsgBox "INFO E' BELLA ? ", vbYesNo + vbQuestion, "Richiesta" End Sub

Sapere bene msgbox e Inputbox (guardare help) Msgbox argomento1, [argomento2, argomento3] Argomento1 : è la frase visualizzata Argomento2 : è una combinazioni di costanti (es. vbCritical, VbInformation, vbyesNo, VbQuestion) che modifica le icone del message box ed il numero di pulsanti. Argomento3: titolo del messagebox. Se omesso mette come titolo Microsoft Access esempio con msgbox: Private Sub btnprova_Click() If vbYes = MsgBox("INFO E' BELLA ? ", vbYesNocancel + vbQuestion, "Richiesta") Then MsgBox "BENE - PIU'!!!", vbInformation, "Bonus" Else MsgBox "MALE - MENO!!!", vbCritical, "Penalty" End If End Sub esempio con msgbox: Private Sub btnprova_Click() Risposta = MsgBox("INFO E' BELLA ? ", vbYesNoCancel + vbQuestion, "Richiesta") If vbYes = Risposta Then MsgBox "BENE - PIU'!!!", vbInformation, "Bonus" ElseIf Risposta = vbNo Then MsgBox "MALE - MENO!!!", vbCritical, "Penalty" Else MsgBox "INDECISO!!!", vbExclamation, "Asterisco" End If End Sub x=Inputbox(Arg1,arg2,arg3) => restituisce il valore digitato - se premo su annulla restituisce la stringa vuota Arg1 => frase storica di richiesta arg2 => titolo della maschera arg3 => valore predefinito PROPRIETA DELL'ETICHETTA MsgBox Me.img1.Name esempio nascondo l'mmagine con name= img1 Me.img1.Visible = Not Me.img1.Visible Me.Corpo.BackColor = vbRed Me.btnprova.ForeColor = vbYellow i colori in VBA non usano RGB ma BGR (prima il blu, ... vbred ==> 255 vbblue 16711680 vbgreen => 65280

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 15/03/2010 di e01692 » 15/03/2010, 9:04

in vba il commento è un singolo apice all'inizio

NomeOggetto_NomeEvento([Argomenti dell'evento]) => routine/prg associato ad un certo evento per un certo oggetto Evento LOAD => caricamento della maschera Private Sub Form_Load() DoCmd.Restore End Sub Evento UNLOAD => chiusura della maschera Private Sub Form_Unload(Cancel As Integer) MsgBox "No! non chiudermi!!!!" End Sub docmd => oggetto che è spannometricamente il menu di access a livello di programmazione macro di access => modalità di programmazione per chi non è in grado di scrivere codici VBA (potenzialità limitata rispetto al VBA) docmd.quit => chiude access docmd.close => chiude la maschera corrente docmd.maximize => mette la finestrA attiva a piena pagina docmd.restore => mette la finestrA attiva nella dimensione intermedia docmd.openform => apre una maschera TEXTBOX scrivere Me.txtx = X equivale a Me.txtx.Value = x ' meccanismo di alias poichè value è la propietà predefinita per gli oggetti textbox me.txtx è un oggetto - gli assegnamenti devono essere compatibili (se non esiste qualche meccanismo di alias: soprannome) dim d as date d="Ciao" => errore: tipo incompatibile

d=#01/31/2010# => ok DICHIARAZIONE DI VARIABILI: DIM NomeVariabile as Tipo Byte 1 byte 0 a 2^8-1 Integer 2 byte =>un bit segno e 15 per il numero -2^15 a 2^15-1 Long 4 byte =>un bit segno e 31 per il numero -2^31 a 2^31-1 String variabile da 0 a circa 65000 caratteri boolean 2 byte => è un integer con 0=false <>0 => true , vero double 8 byte single 4 byte variant => 8 byte => tipo variabile che dipende dal primo assegnamento dim x equivale a dim x as variant Date 8 byte => è un double con la parte intera nr gg dal 30/12/1899 e parte frazionaria parte del gg cdbl => converte l'argomento, se possibile, in un tipo double cdbl(#12/30/1899#) => 0 per access cdbl("ciao") => implica un errore di conversione dim x as integer x=10000000000 => errore supera 2^15-1 Option Explicit => istruzione che rende obbligatoria la dichiarazione delle variabili tramite l'istruzione DIM => è buona norma inserire tale istruzione. La dichiarazione delle variabili può avvenire: 1) in testa ad un form => la variabile è visibile all'interno di quel modulo in tutte le routine 2) all'interno di una routine => la variabile è visibile all'interno solo di quella routine - se il nome coincide con una globale questa nasconderà la globale (shadowing) Esempio 1 (HO DICHIARAZIONI NELLE SUB CHE CREANO CONFUSIONE DOVUTE ALL'OMONIMIA): Dim Nome as string ' variabile globale per il form Sub Form_Load pippo End Sub Sub Pippo() Nome="Pippo" ' sta usando la variabile globale nome

Call Pluto ' richiamo la sub Pluto msgbox Nome ' visualizza pippo End Sub Sub Pluto() Dim Nome As String ' shadowing => la variabile locale copre la visibilità sulla ' variabile globale pertanto le istruzioni non influiscono su ' Nome "globale" Nome="Pluto" msgbox Nome ' visualizzerà pluto End Sub Esempio 2 => ottengo due msgbox con "Pluto": Dim Nome as string ' variabile globale per il form Sub Form_Load pippo End Sub Sub Pippo() Nome="Pippo" ' sta usando la variabile globale nome Call Pluto ' richiamo la sub Pluto msgbox Nome ' vedrò pluto End Sub Sub Pluto() Nome="Pluto" msgbox Nome 'vedrò pluto End Sub Modulo => foglio vba contenente routine e variabili di uso globale. Una procedura che uso in molti form/report non verrà scritta in ogni form ma inserita in un modulo Esempio 1: Se scrivo in un modulo Public Sub OrdinaClasse(Classe as string) Istruzioni per ordinare i nominativi End Sub la sub OrdinaClasse è usabile in tutto il mio file MDB Esempio 2: Se scrivo in un modulo Private Sub OrdinaClasse(Classe as string) Istruzioni per ordinare i nominativi End Sub

la sub è usabile solo dentro quel modulo Quando si programma è buona norma non scrivere mai due volte la stessa routine in posti diversi. Si crea un modulo, si inserisce quella routine dichiarandola public e poi la si richiama in tutte le maschere dove serve. In questo modo se devo modificare la procedura opero una sola volta e non devo andare in tutti i form a modificare tutti i duplicati se un modulo si chiama sorgenti avrò che scrivendo in un form sorgenti. => vedo l'elenco delle funzioni e delle variabili dichiarate come public Una variabile che deve essere usata in tutte le maschere (esempio la USERNAME e la PASSWORD) verrà dichiarata in un modulo come public. Una maschera iniziale di autentificazione inizializzera il valore di tale variabile. In base all'utente le maschere sull'evento load valuteranno se abilitare o meno i pulsanti di modifica EVENTO TIMER è un evento tipico del form, si verifica ogni tot millisecondi - i millisecondi sono indicati nella proprietà timerinterval del form - con timerinterval=0 l'evento timer non si verifica mai Me.TimerInterval = 4000 Private Sub Form_Timer() Me.TxtOra = Format(Now, "hh\:mm\:ss") End Sub Ricordatevi Me.TimerInterval = 4000 equivale a TimerInterval = 4000 iF rappresenta l'implementazione della capacità decisionale (basata sulla valutazione di condizioni) di una persona if (true) then msgbox "Verrà sempre eseguito end if

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

equivale a msgbox "Verrà sempre eseguito if (eta >=18) then msgbox "maggiorenne" elseif (eta <14) then msgbox "minorenne" else msgbox "non maggiorenne" end if oppure così ma è ridondante (superfluo) if (eta >=18) then msgbox "maggiorenne" elseif (eta <14) then msgbox "minorenne" elseif (eta <18) and (eta>=14) then msgbox "non maggiorenne" end if ESEMPIO IMPORTANTE Segno di un valore inserito in un textbox If IsNull(TxtValore) Or TxtValore = "" Then MsgBox "Digita qualcosa nella casella di testo" ElseIf IsNumeric(TxtValore) Then If (TxtValore > 0) Then MsgBox "Positivo" ElseIf (TxtValore < 0) Then MsgBox "Negativo" Else MsgBox "Zero" End If Else MsgBox "Non hai digitato un numero" End If TxtValore = "" => stringa vuota (ad esempio se svuoto una casella di testo) IsNull(TxtValore) => vera se txtvalore non ha mai avuto un assegnamento IsNumeric(TxtValore) => vera se l'argomento è un numero - i limiti dell'implementazione di isnumeric portano a valutare come non numerica l'espressione -(-3)

3° MODULO - Classe 4N - 18/03/2010 di e01692 » 22/03/2010, 9:14

Me.TxtOut = Me.TxtOut + Format(Now, "hh.mm.ss") + vbCrLf vbcrlf => invio carriage return line feed x="" x=x & "frase" => accodo ad x la stringa frase y=y+2 => aggiungo 2 a y in questi esempi x e y devono avere un valore iniziale se y contiene il valore nullo y=y+2 => errore x=Nz(x,"") & "Frase" y=Nz(y,0) +2 => se y valeva null => alla fine dell'esecuzione y=2 NZ(arg1,arg2) => funzione che restituisce: - il primo argomento, che è una variabile, se contiene un valore non è nullo - il secondo argomento se il primo argomento, che è una variabile, contiene un valore è nullo che accetta due argomenti - la prima è una variabile mentre il 2° aromento è il valore restituito nel caso la variabile contenga un valore nullo y=NZ(x,b) equivale a y=iif(isnull(x),b,x) I moduli in access servono per inserire le procedure (sub e function) di uso comune in tutto l'applicativo. Per dare la visibilità si usa anteporre la dichiarazione della sub / function con PUBLIC - Se uso Private prima di sub/function la visibilità resta limitata al modulo me.txtCognome uguale a me.txtCognome.text Function RadiceQuadrata(x as long) as single Codice VBA RadiceQuadrata=<Valore da restituire> End function

Se è richiesta una funzione (ad esempio la media tra 3 numeri) function CalcolaMedia(a as long, b as long, c as long) as double Dim s as double s=(a+b+c)/3 CalcolaMedia=s End function equivale a : function CalcolaMedia(a as long, b as long, c as long) as double CalcolaMedia=(a+b+c)/3 End function uso m=calcolaMedia(3,2,1) più precisa function CalcolaMedia(a as long, b as long, c as long) as variant Dim s as variant Dim n as long n=0 ' commento - conto i valori diversi da 0 if a<>0 then n=n+1 if b<>0 then n=n+1 if c<>0 then n=n+1 if n>0 then s=(a+b+c)/n else s = null end if CalcolaMedia=s End function variant è necessario poichè uso NULL uso: m=Nz(CalcolaMedia(0,0,0),0) => alternativa function CalcolaMedia(a as long, b as long, c as long) as double Dim s as variant Dim n as long n=0 ' commento - conto i valori diversi da 0 if a<>0 then n=n+1 if b<>0 then n=n+1 if c<>0 then n=n+1 if n>0 then

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 22/03/2010 di e01692 » 22/03/2010, 9:16

s=(a+b+c)/n else s = 0 end if CalcolaMedia=s End function m=CalcolaMedia(0,0,0)

Function CalcolaIlMinimo(a As Long, b As Long, c As Long) As Long Dim Minimo As Long Minimo = a If Minimo > b Then Minimo = b End If If Minimo > c Then Minimo = c End If CalcolaIlMinimo = Minimo End Function esempio di utilizzo mediante 3 textbox e un pulsante Private Sub BtnCalcolaMinimo_Click() Dim OK As Boolean OK = IsNumeric(Me.txtA) OK = OK And IsNumeric(Me.Txtb) OK = OK And IsNumeric(Me.txtc) If OK Then MsgBox CalcolaIlMinimo(Me.txtA, Me.Txtb, Me.txtc) Else MsgBox "Non hai scritto dei numeri" End If End Sub Non va bene una risposta del tipo (se chiedo una funzione): a=inputbox("Dammi A") b=inputbox("Dammi B") c=inputbox("Dammi C") Minimo = a If Minimo > b Then Minimo = b End If If Minimo > c Then

Minimo = c End If msgbox Minimo controllare se ho inserito qualcosa in un text box If Not ( ISNULL(TxtValore) Or TxtValore = "") Then guardare file \\192.168.1.30\Sechi2009 Passaggio parametri ALGORITMO: procedura con cui trovo una soluzione ad un determinato problema L'algoritmo viene poi implementato tramite un linguaggio in un prg - Gli IF e i for/while consentono l'emulazione delle capacità selettive ed iterative che l'uomo raggiungere per raggiungere una soluzione 1) la finestra immediata (ctrl+G) consente la verifica dei valori durante l'esecuzione (scrivo ad esempio print Nominativo e vedo il contenuto della variabile) 2) Quando clicco a fianco di una linea appare un pallino marrone: breakpoint => se l'esecuzione passa da li il prg si ferma consentendomi di testare i valori delle variabili alla ricerca di errori semantici (di algoritmo): questa operazione si chiama debug 3) nella finestra immediata posso modificare i valori delle variabili mediante delle istruzioni di assegnamento: esempio Nominativo="Mario Rossi" In questo modo le variabili possono assumere valori diversi da quelli generati dall'esecuzione. => utile nelle fasi di test per verificare la correttezza dell'algoritmo in situazioni particolari STACK => elenco delle procedure attiva (non terminate) DEBUG F8 => eseguo un'istruzione alla volta Shift F8 => esegue un'istruzione alla volta e se l'istruzione corrente è una sub/function la esegue in un solo colpo senza entrare nella procedura chiamata F5 => eseguo fino alla fine o fino al prossimo breakpoint La freccia gialla indica l'istruzione corrente. Function FunzioneREF(ByRef a, ByRef b) ' Nel passaggio dei parametri ByREF assicura che le modifiche ad una variabile ' rimangano anche dopo la terminazione della procedura a = a + 1 ' incrementa a b = b - 1 ' decrementa b

End Function Function FunzioneVAL(ByVal a, ByVal b) ' Nel passaggio dei parametri ByVAL assicura che la variabile passata ' come argomento non venga modificata. a = a + 1 b = b - 1 End Function Function Funzione(a, b) ' equivale a FunzioneREF(ByRef a, ByRef b) a = a + 1 b = b - 1 End Function Private Sub BtnParametri_Click() ' QUESTA E' LA PROCEDURA CHIAMANTE O PRINCIPALE Dim a, b, c a = 10 b = 20 c = FunzioneVAL(a, b) MsgBox "Dopo aver eseguito FunzioneByVAL A=" & a & " - B=" & b c = FunzioneREF(a, b) MsgBox "Dopo aver eseguito FunzioneByREF A=" & a & " - B=" & b c = Funzione(a, b) MsgBox "Dopo aver eseguito Funzione - A=" & a & " - B=" & b End Sub Scrivere a=Funzione(parametri) => modifica la variabile A in base al valore restituito da Funzione equivale a Procedura(Parametri,a) Se Function Funzione(parametri) SequenzaAlfa Funzione=valore End Function Sub Procedura(parametri, byref risultato) SequenzaAlfa Risultato=valore End Function ESEMPIO PRATICO:

function F_incrementa(a) a=a+1 F_incrementa=a End Function Sub P_incrementa(a,ByRef b) a=a+1 b=a End sub y=1 a=F_incrementa(y) => in a avrò 2 y=1 P_incrementa(y,a) => in a avrò 2 --------------------------- Utilizzare l'implementazione di un algoritmo con FUNCTION o SUB è puramente personale. Diventa necessario il meccanismo del BYREF con SUB quando il numero di valori che una procedura deve restituire è + di uno Esempio a,b, e c sono i coeff. CalcolaRadiciPolinomioSecondoGrado(a,b,c,x1,x2) CHIAMATE ALLE SUB: SUB Procedure(a) ... END SUB posso scrivere per le chiamate Procedure a oppure Procedure(a) => da un errore se gli argomenti sono + di uno oppure Call Procedure(a) msgbox "Ciao" oppure msgbox("Ciao") CHIAMATE DELLE FUNZIONI Devo usare le parentesi y=Funzione(parametri) risp=msgbox("Oggi è un casino ?",vbyesno)

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 08/04/2010 di e01692 » 08/04/2010, 11:20

risp=msgbox "Oggi è un casino ?",vbyesno => restituisce un errore True And True = True True And False = False False And True = False False And False = False True Or True = True True Or False = True False Or True = True False Or False = False True Xor True = False True Xor False = True False Xor True = True False Xor False = False True EQUIV True = True True EQUIV False = False False EQUIV True = False False EQUIV False = True True Imp True = True True Imp False = False False Imp True = True False Imp False = True EQUIV => inverso di XOR = Uguaglianza NOT (True Or False) And True Esercitazione Lunedi 26/3 e 8 Per l'8 pubblicare le esercitazione IF (tutti) Orali di recupero solo 8/4 e se ci sono volontari il 26/3

FORMAT(N,"00000") => esempio 32 => 00032 s=FORMAT(N,"00000") me.TXT_A=mid(s,1,1) => 1° carattere ...

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 12/04/2010 di e01692 » 12/04/2010, 8:10

me.TXT_E=mid(s,5,1) => 5° carattere Nello script del form dichiaro la variabile globale N nel bottone ESEGUI: n=1 me.timerinterval=1000 '(millisecondi) Private Sub Form_Timer() N = N + 1 Me.Testo1 = Format(N, "00000") End Sub Nel 5 basta ordinare solo 3 numeri

Domanda interrogation function Somma(a as long, b as long) as long somma=a+b End function for i=<valore iniziale> to <valore finale> [step <passo>] istruzioneVBA [exit for] NEXT se in un'iterazione eseguo un exit for il ciclo si interrompe anche se non sono arrivato in fondo con l'iterazione CurrentDB => oggetto che rappresenta il db corrente print currentdb.Name C:\Documents and Settings\Utente1\Documenti\db12.mdb instrrev(currentdb.name,"\") => posizione dell'ultimo \ nel percorso del db corrente - se non esiste "\" restituisce 0 print currentdb.Name C:\Documents and Settings\Utente1\Documenti\db12.mdb print left(currentdb.Name ,instrrev(currentdb.Name,"\"))

C:\Documents and Settings\Utente1\Documenti\ print mid(currentdb.Name ,instrrev(currentdb.Name,"\")+1) db12.mdb print mid(currentdb.Name ,4,1) D mid(s,I,1) => i-esimo carattere della stringa s La sequenza seguente S=currentdb.name For i=len(s) to 1 step -1 If mid(s,I,1)=”\” then Exit for End if Next equivale a: i=instrrev(currentdb.name,"\") Function My_InstrRev(s,c) as long Dim i as long For i=len(s) to 1 step -1 If mid(s,I,1)=c then Exit for End if Next My_InstrRev=i End Function + corretta (restituisce 0 se non esiste c in s): Function My_InstrRev(s,c) as long Dim i as long, p as long p=0 For i=len(s) to 1 step -1 If mid(s,I,1)=c then p=i Exit for End if Next My_InstrRev=p End Function i=my_instrrev(currentdb.name,"\") print instrrev(currentdb.Name,"\") 44 print my_instrrev(currentdb.Name,"\") 44

Queste due sintassi consentono di saltare qualsiasi iterazione se è falsa la condizione (esempio inutile che chiami i volontari se non ho studenti in classe) Do While condizione Codice VBA Loop oppure while condizione Codice VBA wend il for viene usato quando conosco il nr di iterazioni da svolgere => da a il while/wend o DoWhile/Loop for viene usato quando non conosco il nr di iterazioni da svolgere ma mi fermo nel momento in cui una determinata condizione diventa falsa La parte iterativa viene eseguita almeno una volta Do Codice VBA Loop While condizione Do x=inputbox("Dammi un numero (0 per terminare)") While x<>0 oppure x=inputbox("Dammi un numero (0 per terminare)") While x <>0 x=inputbox("Dammi un numero (0 per terminare)") Wend For i=<Valore iniziale> To <ValoreFinale> step <passo> Codice VBA Next è equivalente a: i=<Valore iniziale> While i<=ValoreFinale I=i+[passo] Codice VBA Wend con il FOR non posso implementare tutte le possibilità offerte dal WHILE (non è equipotente). Si noti che il for risulta come sintassi + compatto

me currentdb me.controls => insieme controlli (bottoni, listbox ...) sul contenitore corrente (generalmente un form) me.controls.count => nr di controlli me.controls(i) => i-esimo elemento dell'insieme me.controls For insiemistico: for each <variabileOggetto> in <insieme> x.controltype => proprietà che indica se un oggetto x è un bottone, textbox, radio ... questa sintassi for each <variabileOggetto> in <insieme> codice VBA NEXT è equivalente a: For i = 0 To <NomeInsieme>.Count - 1 codice VBA Next vbCrLf => ritorno a capo (carriage return line feed Ascii(13) - Ascii(10)) Dim x As Control Me.TxtOut = "" For Each x In Me.Controls Me.TxtOut = Me.TxtOut + x.Name + vbCrLf Next equivalente a: Me.TxtOut = "" For i = 0 To Me.Controls.Count - 1 Me.TxtOut = Me.TxtOut + x.Name + vbCrLf Next Le tabelle che iniziano per mSys => sono tabelle di sistema OGGETTI: Application => Applicazione che sto usando => access Application.CurrentProject.AllForms => insieme delle maschere del progetto corrente (file mdb) CurrentDb.TableDefs => insieme delle tabelle correnti CurrentDb.QueryDefs => insieme delle query correnti

currentdb.TableDefs(0).Name => nome della 1° tabella currentdb.TableDefs(0).fields.count => numero di campi della 1° tabella currentdb.TableDefs(0).fields => insieme dei campi della prima tabella currentdb.TableDefs(0).fields(0).name => nome del primo campo della prima tabella un elemento di un insieme può essere raggiunto o con l'indice o con il nome currentdb.TableDefs(0).fields.count oppure currentdb.TableDefs("Studenti").fields.count l'uso dell'indice nell'insieme è adatto ai meccanismi iterativi. elenco delle tabelle che nel nome contengono la lettera a for each x in currentdb.tabledefs if (instr(x.name,"A")>0) then msgbox x.name end if next esempio domanda: elenco dei campi della tabella studenti x=1 => quando ho dei tipi semplici set x=studente => se ho degli oggetti Ricordarsi gli operatori booleani => and or, not, imp , equiv, xor ... Scrittura su file (solo testo) Open "C:\caio.txt" For Output As #1 Print #1, Me.TxtTesto Close #1 1) Apro il file (modalità: input => lettura, output => scrittura) open <nome del file> for <modalità=outout> as #<numero> 2) Scrivo frase nel file agganciato con #<numero> print #<numero>, frase 3) Chiudo il file Lettura su file (solo testo) Open "C:\caio.txt" For Input As #1 Open "C:\caio.txt" For Input As #1 Me.TxtTesto = "" While Not EOF(1) ' end of file Input #1, linea ' legge una frase fino al primo invio che incontra ' vbcrlf ==> ascii 13 + asci 10 ==> Carriage return line feed Me.TxtTesto = Me.TxtTesto + linea + vbCrLf Wend Close #1

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N -15/04/2010 di e01692 » 15/04/2010, 11:41

1) Apro il file (modalità: input => lettura, output => scrittura) open <nome del file> for <modalità=input> as #<numero> 2) Leggo una frase nel file agganciato con #<numero> Input #<numero>, frase ' legge una frase fino al primo invio che incontra 3) Chiudo il file close #<numero> la funzione EOF(<numero>) restituisce vero se sono in fondo al file agganciato da #<numero> la funzione LOF(<numero>) restituisce il numero di caratteri del file agganciato da #<numero>

Open "C:\caio.txt" For Input As #1 strTesto = Input(LOF(1),1) Close #1 è equivalente a Open "C:\caio.txt" For Input As #1 Me.TxtTesto = "" While Not EOF(1) ' end of file Input #1, linea ' legge una frase fino al primo invio che incontra ' vbcrlf ==> ascii 13 + asci 10 ==> Carriage return line feed Me.TxtTesto = Me.TxtTesto + linea + vbCrLf Wend Close #1 il secondo metodo è utile se: - devo fare dei controlli linea per linea - il file è gigantesco (il primo metodo carica l'intero files in memoria) per estrarre gli studenti della 4N Open "C:\elencoLeonardo.txt" For Input As #1 Me.TxtTesto = "" While Not EOF(1) ' end of file Input #1, linea if (instr(linea,"(4N)")>0) then Me.TxtTesto = Me.TxtTesto + linea + vbCrLf end if Wend Close #1 x= Input(nrbyte,1) => legge nrbyte dal file #1

12 and 7 1 => 2^0 => 1° bit da destra 2 => 2^1 => 2° bit da destra 4 => 2^2 8 => 2^3 16 => 2^4 32 => 2^5 64 => 2^6 128 => 2^7 => 8° bit a destra (1° bit a sinistra) 12 => 8+4 =>0*2^7+....1*2^3+1*2^2+0*2^1+0*^2^0 7 => 4+2+1 =>0*2^7+....0*2^3+1*2^2+1*2^1+1*2^0 12 => 00001100 in binario 7 => 00000111 in binario 7 or 12 00001100 OR 00000111 ---------- 00001111 => 8+4+2+1 7 and 12 00001100 OR 00000111 ---------- 00000100 => 4 operazione bit a bit => - traduco i due numeri in base 10 in binario (scomponendoli in somma di potenze di 2) - scrivo i coeff. della somma di potenze (0 e 1) ed ottengo la rappresentazione binaria considerando che 0 => falso e 1 => vero devo confrontare dei due numeri i bit posizionalmente corrispondenti secondo questa regola se i bit nella medesima posizione sono contemporaneamente =1 => and => risultato 1 se i bit nella medesima posizione sono diversi o =0 => and => risultato 1 se i bit nella medesima posizione sono contemporaneamente =0 => or => risultato 0 se i bit nella medesima posizione sono diversi o =1 => or => risultato 1 ottengo una rappresentazione binaria che riconverto in decimale per ogni bit abbino un significato 1° bit => parlo italiano 2° bit => parlo francese 3° bit => parlo russo 4° bit => parlo cinese

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 19/04/2010 di e01692 » 19/04/2010, 8:12

5° bit => parlo ebraico 6° bit => parlo arabo 0101 => registro che uno parla francese e cinese 010101 and 001100 => controllo se parlo una lingua orientale 010101 or 001111 => controllo se parlo una lingua orientale oppure araba 21= 010101 and 32=100000 (maschera) => parla italiano if (21 and 32) <>0 then parlo italiano nel debug (alt F-11) potete provare: print (12 and 7) 4 print (12 or 7) 15 currentdb.execute(comando SQL) => esegue in VBA un comando SQL CurrentDb.Execute ("DROP TABLE Studenti") => elimina la tabella studenti currentdb.TableDefs => insieme delle tabelle

lettura di n elementi for i=1 to N x=InputBox("dammi un numero",0) next il for => usato quante iterazioni devo svolgere preferibile se compatta FOR I=valoreIniziale to ValoreFinale step Passo IstruzFOR NEXT equivalente WHILE se passo>0 I=ValoreIniziale while i<=ValoreFinale IstruzioniFOR i=i+passo wend

se passo<0 I=ValoreIniziale while i>=ValoreFinale IstruzioniFOR i=i-passo wend quindi for i=1 to N x=InputBox("dammi un numero",0) next diventa i=1 while i<=N x=InputBox("dammi un numero",0) i=i+1 wend Esercizio FOR 1 massimo=InputBox("dammi un numero",0) for i=2 to N x=InputBox("dammi un numero",0) if x > massimo then massimo=x end if next Esercizio FOR 2 me.txtout="" for i=1 to N x=InputBox("dammi un numero",0) if x=<B*M and x>=A*M then me.txtout=me.txtout & x & vbcrlf end if next 1,0,1,0 ... A, B, C, A ... 1,2,0 for i=1 to N me.txtout=me.txtout & (i mod 2) & vbcrlf NEXT for i=1 to N if i mod 3 =1 then

Top

Rispondi al messaggio 14 messaggi • Pagina 1 di 2 • 1, 2 Torna a 3° MODULO - Appunti

Chi c’è in linea Visitano il forum: e01692 e 0 ospiti Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group Traduzione Italiana phpBB.it Pannello di Controllo Amministratore

me.txtout=me.txtout & "A" elseif i mod 3 =2 then me.txtout=me.txtout & "B" else me.txtout=me.txtout & "C" end if NEXT for i=1 to N me.txtout=me.txtout & (i mod 3) & vbcrlf NEXT

Prossimo Visualizza ultimi messaggi: Ordina per 6Tutti i messaggi 6Ora di invio 6Crescente Vai

Strumenti di moderazione: 6Blocca argomento Vai

BRESCIANET.COM Sito didattico - Prof. Sechi Marco Passa al contenuto

[ Pannello di Controllo Moderatore ]

3° MODULO - Classe 4N Rispondi al messaggio

14 messaggi • Pagina 2 di 2 • 1, 2 Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 22/04/2010 di e01692 » 22/04/2010, 11:51

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 26/04/2010 di e01692 » 26/04/2010, 8:02

Ricerca avanzata

Cerca… Cerca

Cerca qui… Cerca

Vedere appunti di WORD su combobox listbox Elenco basato su una tabella/query me.lstAlunni.rowsource="SELECT NOMINATIVO FROM STUDENTI" me.lstSesso.rowsource="Maschio;Femmina" listindex => nr riga selezionata => parto da 0 - se non ho selezionato niente vale -1 listcount => nr di righe me.LstElenco.ColumnCount => nr colonne me.LstElenco.boundColumn => colonna che viene usata per pescare i valori da assegnare al combo/list box in altre parole: me.lstelenco.column(me.lstelenco.boundcolumn,me.lstelenco.listindex) coincide con il valore di me.lstelenco con questa sequenza controllo che abbia selezionato una riga If Me.LstElenco.ListIndex >= 0 Then MsgBox (Me.LstElenco.ListIndex) End If

FOR I=valoreIniziale to ValoreFinale step Passo

IstruzFOR NEXT i=<Valore iniziale> While i<=ValoreFinale I=i+[passo] IstruzFOR Wend Questa sintassi è comoda quando devo almeno una volta svolgere la parte iterativa Do Codice VBA Loop While condizione quindi ad esempio se devo leggere una sequenza fino a che non digito 0 Le due formule iterative sono equipotenti e la scelta va fatta sulla base che una determinata iterazione deve essere svolta almeno una volta oppure nessuna (in base alla condizione del while do x=inputbox("Dammi un numero:") Loop While x<>0 equivalente 1 do x=inputbox("Dammi un numero:") Loop Until x=0 equivalente 2 (meno compatta) x=inputbox("Dammi un numero:") while x<>0 x=inputbox("Dammi un numero:") wend ItemsSelected => insieme delle righe selezionate in un listbox Me.TxtOut = "" For Each x In Me.LSTeLENCO.ItemsSelected Me.TxtOut = Me.TxtOut & Me.LSTeLENCO.Column(0, x) Next l'oggetto x contiene la posizione della riga selezionata Exit for => esco dal ciclo anche se non sono arrivato in fondo. value è la proprieta predefinita per i textbox ARRAY

DIM X(3 to 10) as long => array di interi lunghi il primo elemento è x(3) e l'ultimo x(10) dim X(10) as long => array di interi lunghi il primo elemento è x(0) e l'ultimo x(9) Leggo un elenco e lo stampo in ordine inverso for i=0 to 9 x(i)=inputbox("Dammi un numero:") next for i=9 to 0 step -1 msgbox x(i) Next senza array: x1=inputbox("Dammi un numero:") x2=inputbox("Dammi un numero:") x3=inputbox("Dammi un numero:") .. N righe una per ogni lettura Dim PagellaClasse(NrStudenti,NrMaterie) as long => array bidimensionale ARRAY DINAMICI: Dim x() as long => array senza dimensioni redim => aumenta le dimensioni di un array ma azzera i contenuti redim preserve => aumenta le dimensioni di un array ma mantiene i contenuti Lettura di un elenco di lunghezza arbitraria e stampa al rovescio Dim x() As Long Dim n As Long Dim y As Long ' n conteggia l'elenco dei valori letti n = 0 Do y = InputBox("Dammi un numero") If y <> 0 Then n = n + 1 ReDim Preserve x(n) x(n - 1) = y End If Loop While y <> 0 ' stampa rovesciata Me.TxtOut = "" For i = n - 1 To 0 Step -1 Me.TxtOut = Me.TxtOut & x(i) & vbCrLf Next

Nel calcolo della media, del min e del max non sono necessari gli array poichè il risultato finale viene costruito man mano ad ogni iterazione. Altro construtto selettivo (consente di eseguire una sequenza di istruzioni a fronte di n condizioni. Select Case variabile Case valore-1 Istruzioni-1 Case valore-2 Istruzioni-2 … [Case Else istruzioni-else] End Select è equivalente a: if (variabile=valore-1) then Istruzioni-1 elseif (variabile=valore-2) then Istruzioni-2 … [else istruzioni-else] end if esempio select Case eta Case Is < 14 msgbox "Minorenne" case is 12 To 14 msgbox "non maggiorenne" case Else msgbox "maggiorenne" End Select LO SCORRIMENTO DELLE TABELLE Recordset => tipo di oggetto che gestisce un set di record => il risultato di una qry di selezione set rs=currentdb.openrecordset("SELECT NOMINATIVO FROM STUDENTI") openrecordset => metodo del currentdb che associa ad una variabile recordset il risultato di una qry di selezione METODI DEL RECORDSET MOVEFIRST => mi posiziono sul 1° record MOVELAST => mi posiziono sull'ultimo record MOVENEXT => mi posiziono sul prossimo record

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

3° MODULO - Classe 4N - 29/04/2010 di e01692 » 29/04/2010, 9:59

MOVEPREVIOUS => mi posiziono sul precedente record close => dealloco la variabile recordset (la chiudo) eof => proprietà vera se sono in fondo al recordset bof => proprietà vera se sono all'inizio al recordset eof e bof risultano immediatamente veri se il recordset è vuoto i diversi move danno errore se si superano gli estremi del recordset Dim rs As Recordset Set rs = CurrentDb.OpenRecordset("SELECT NOMINATIVO FROM STUDENTI") ' con questo if evito di spostarmi se il record set è ' vuoto : ' Vitale - Bellina Inselvini Zanoni Valenti => scorrimento dall'ultimo al primo If Not rs.EOF Then rs.MoveFirst While Not rs.EOF MsgBox rs("Nominativo") rs.MoveNext Wend rs.Close End If

METODI DEL RECORDSET MOVEFIRST => mi posiziono sul 1° record MOVELAST => mi posiziono sull'ultimo record MOVENEXT => mi posiziono sul prossimo record MOVEPREVIOUS => mi posiziono sul precedente record close => dealloco la variabile recordset (la chiudo) eof => proprietà vera se sono in fondo al recordset bof => proprietà vera se sono all'inizio al recordset eof e bof risultano immediatamente veri se il recordset è vuoto i diversi move danno errore se si superano gli estremi del recordset SCORRIMENTO IN AVANTI Dim rs As Recordset Set rs = CurrentDb.OpenRecordset("SELECT * FROM STUDENTI") ' con questo if evito di spostarmi se il record set è If Not rs.EOF Then

rs.MoveFirst While Not rs.EOF MsgBox rs("Nominativo") rs.MoveNext Wend else msgbox "Non ho studenti!!!" End If rs.Close illustrato i riferimenti. SCORRIMENTO ALL'INDIETRO Dim rs As Recordset Set rs = CurrentDb.OpenRecordset("SELECT * FROM STUDENTI") ' con questo if evito di spostarmi se il record set è If Not rs.BOF Then rs.Movelast While Not rs.BOF MsgBox rs("Nominativo") rs.MovePrevious Wend End If rs.Close Oggetto OLE => nucleo programmabile di un'applicazione. In WIN le applicazioni sono generalmente oggetti OLE => hanno un nucleo programmabile. Gli utenti finali utilizzano un'interfaccia a menu che traduce i movimenti del mouse e le digitazioni da tastiera in sequenze di script che il motore ole interpreta ed esegue. Il vantaggio della strutturazione OLE è che posso automatizzare delle operazioni sfruttando il linguaggio di scripting del motore OLE ospitante oppure appartenente ad una applicazione esterna. DAO ed ADO sono i motori ole che gestiscono i DB - Access utilizza tali motori (ADO nelle versioni recenti di ACCESS) per analizzare i dati contenuti in un db Fatto disegno della struttura ACCESS/ApplicazioneOLE ==> ADO/DAO => DriverDB => DB server/file MDB ------------ NON STUDIARE L'ESEMPIO SUCCESSIVO SVOLTO IN EXCEL Function Leggistudenti() Dim db As DAO.Database Dim ws As Worksheet Set db = DBEngine.OpenDatabase("c:\esempioOK.mdb") Set rs = db.OpenRecordset("select * from studenti") ActiveWorkbook.ActiveSheet.Cells(1, 1) = rs("Nominativo") rs.Close End Function

Top Modifica messaggio Cancella messaggio Segnala il messaggio Informazione Rispondi citando

Re: 3° MODULO - Classe 4N di e01692 » 03/05/2010, 6:31

vedere (facoltativo) questo link per analizzare i livelli OLE anche per pagine WEB dinamiche http://www.brescianet.com/appunti/web_latoserver/asp_sampleG/esempio4.htm --------

ULTERIORI METODI RECORDSET addnew => consente l'aggiunta di un nuovo record update => salva le modifiche sul record corrente edit => consente la modifica del record corrente delete => CANCELLA IL record corrente findfirst => ricerca il primo record che soddisfa la condizione specificata rs("NomeCampo")= rs.fields("NomeCampo")=rs.fields("Nominativo").value => valore di "nomeCampo" del record corrente set rs=currentdb.openrecordset("Studenti") rs.addnew rs("Matricola")=1 rs("Nominativo")="Genovefa Rossi" rs.update set rs=currentdb.openrecordset("Studenti") rs.findfirst "id=1" rs.edit rs("Nominativo")="Genoveffa Rossi" rs.update rs.movefirst msgbox rs("Nominativo") oppure rs.movefirst msgbox rs.fields("Nominativo").value visualizza il nominativo del primo studente Esempio 1 massimo=inputbox for i=2 to N x=inputbox if x>massimo then massimo=x end if

Top

Rispondi al messaggio 14 messaggi • Pagina 2 di 2 • 1, 2 Torna a 3° MODULO - Appunti

Chi c’è in linea Visitano il forum: e01692 e 0 ospiti Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group Traduzione Italiana phpBB.it Pannello di Controllo Amministratore

NEXT Esempio 2 s="" for i=1 to N if s<>"" then s=s &";" ' genero il valore s=s & valoresequenza next me.lista.rowsource=s

Precedente Visualizza ultimi messaggi: Ordina per 6Tutti i messaggi 6Ora di invio 6Crescente Vai

Strumenti di moderazione: 6Blocca argomento Vai