Newsgroup: it.comp.appl.access
Titolo: sostituzione codice per ottimizzare la prestazione, ma è peggio.

ciao a tutti
 
ho sostituito in una funzione queste righe di codice, 
ma non capisco perchè non è altrettanto performante
come quello iniziale.
grazie
 
**********codice sostituito************
  Dim CheckArray(1 To 3) As String, J As Integer
  Dim X As String
 
  CheckArray(1) = "nColli"
  CheckArray(2) = "Quantità"
  CheckArray(3) = "Prezzo"
 
  X = ""
 
  For J = 1 To 3
  rsCheck.FindFirst CheckArray(J) & " = 0"
 
  X = IIf(Len(campo1 & vbNullString) = 0, ", data Chiusura", "") _
    & IIf(Len(campo2 & vbNullString) = 0, ", Targa", "") _
    & IIf(CheckArray(J) = "nColli", ", n°Colli", "") _
    & IIf(CheckArray(J) = "Quantità", ", Quantità", "") _
    & IIf(CheckArray(J) = "Prezzo", ", Prezzo", "")
 
  Next
 
***********codice iniziale*************
 
Public Function Conf_Chiusura( _
  ByVal campo1 As Variant, _
  ByVal campo2 As Variant) As Boolean
 
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
    & " Where IdCarico =" & fctCriterio_Idc()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  If rsCheck.BOF Then 'se non ci sono record nel recordset
    MsgBox "Non ci sono record.", vbExclamation, "Attenzione!"
    Exit Function
 
  End If
 
  Dim campo3 As Integer, campo4 As Integer, campo5 As Integer
  Dim X As String
 
  rsCheck.FindLast "nColli=0"
  campo3 = IIf(rsCheck.NoMatch, 1, 0)
 
  rsCheck.FindLast "Quantità=0"
  campo4 = IIf(rsCheck.NoMatch, 1, 0)
 
  rsCheck.FindLast "Prezzo=0"
  campo5 = IIf(rsCheck.NoMatch, 1, 0)
 
  X = ""
 
  X = IIf(Nz(campo1, 0) = 0, ", data Chiusura", "") _
    & IIf(Nz(campo2, 0) = 0, ", Targa", "") _
    & IIf(Nz(campo3, 0) = 0, ", n°Colli", "") _
    & IIf(Nz(campo4, 0) = 0, ", Quantità", "") _
    & IIf(Nz(campo5, 0) = 0, ", Prezzo", "")
 
  If (X) <> "" Then
    MsgBox "Attenzione manca:" & Mid(X, 2) & ".", vbExclamation, "Attenzione!"
    Exit Function
 
  End If
 
  Set rsCheck = Nothing
 
Conf_Chiusura = True
End Function
 

 grazie
 
AAAAAAAAAh ! 
 
Ma allora non volevi scrivere codice piu' "corto", ma + veloce !!!!
Scusa ... forse era ovvio e io  non sono molto sveglio. 
Ma me pareva strano, me pareva ! Dicevo : boh. Ma perchè mai ? :-) 
 
Vorrei aiutarti, ma ho bisogno  che  mi  spieghi (bene, con calma e 
dando nulla x scontato. Sono  lento  a  capire)  che DEVI FARE. Che 
DEVE *FARE* quel codice ? 
 
Vedrai che allora qualcosa ci inventiamo. 


Le istruzioni che /incidono/ sono in genere i cicli e le 
aoperture/letture da db.
La differenza che vedo (a parte la apertura del recorset) mi sembra
sia la sostituzione di .findlast con .findfirst + l'uscita di
funzione in caso di recordset vuoto
Nella nuova versione non mi sembra ci sia rsCheck che fine ha fatto?
 
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

     & IIf(CheckArray(J) = "Prezzo", ", Prezzo", "")
 
Queste Implied If (IIf) sono degli assoluti perditempo al pari
delle varie funzioni di Domain (DSum, Dlookup...)
Qui le esegui TRE volte, nel vecchio codice di seguito
esposto, una sola volta.
 
Comunque se vuoi far contenti tutti quelli che come me
non hanno ben inteso quel che vuoi fare, metti in onda
il database... chissà che le cose non vadano meglio.
 
Bruno

 il database... chissà che le cose non vadano meglio.
 
A me piacerebbe solo sapere che C***O deve fare. Solo questo. 


mi restituisce un msgbox per valori mancanti


sigh


Faccio un tentativo
 
Set Rc = me.recordset 
 
ti scorri tutto il recordset (una volta sola, ma tutto)
do while not Rc.eof
 
   if A = 0 then X = X + 1 
   if B = 0 then Y = Y + 1
   if C = 0 then Z = Z + 1
 
   rc.movenext
 
loop 
 
msgbox(A & " " & B & " " & C) 
 
fine 
 
Velocissimo
 
 
 
 
 


Capisci che non e' un problema di /performances/ ma un errore?
Credo che la soluzione te la abbia data B. Campanini ( non so se volendo 
o no)


Il giorno sabato 26 marzo 2016 18:52:08 UTC+1, Bruno Campanini ha scritto:

ciao Bruno
ti è poi arrivato il mio db?

 ti è poi arrivato il mio db?
 
Sono andato a cercarlo solo ora che me l'hai rammentato.
Ho dovuto modificare 20 o forse anche 30 funzioni perché sto
usando Access 2016 a 64bit.
 
Ho visto che hai usato un modulo di classe e un sacco di API;
cose che non ho mai usato e che non conosco.
Comunque vedo di individuare la Form che contiene il codice
oggetto del thread, faccio andare la procedura prendendone
il tempo impiegato poi provo a fare qualche cambiamento per
velocizzarla... non è detto che ci riesca.
 
Bruno


Guarda Bruno che non e' un problema di /performances/
A quanto ho capito la routine ha un bug
 
  ha scritto questo:
"mi restituisce un msgbox per valori mancanti"
 
 



grazie Bruno


ciao Alessandro
se vuoi te lo invio
privatamente


Non programmo piu'
Non ho neanche Access installato


 grazie Bruno
M_ChiusuraCarico, l'unica Form contenente il codice in discussione,
si apre tutta blank, non vengono mostrati nemmeno i controlli
vuoti.
Messaggio di sistema:
"You entered an expression that has no value"
Questo nella versione che mi hai inviato, avendo aggiornato
tutto a 64 bit.
 
Ho creato un nuovo database in Access 2016/64 ed importato tutto
il contenuto del tuo.
La Form "Pannello comandi" non si apre: non trova
"Switchboard Items" che è il proprio Record Source.
Le references ci sono tutte e il Debug non mi segnala
errori di compilazione.
 
Mi sa che tu abbia fatto un database a immagine e somiglianza
dei fiammiferi Minerva: ricordi? quelli che si accendevano
solo sulla loro confezione.
Che Windows e Access stai usando?
 
Bruno

 ac (x=y-1)
 
Perchè hai mai programmato...? ;-)
 
Dai installa la versione pirata... e fai finta di fare il programmatore... ci crediamo di più...!
 
@Alex


SEEEEEEEEEEEEEE !!!!!!! :-)))) 
 
Ma se non fai altro che produrre stranissimi algoritmi per 
"sfrugulliare" i numeri primi ! Al punto che per prenderti 
in giro ti chiamavo il "turbo pallottoliere vivente" !!!!!
 
Alchè : 
un inchino, magister informaticorum. Con sincero rispetto. 
Davvero eh. Finchè si scherza si scherza ma ... 
 


ciao Bruno
Uso
Windows Xp vers 2002 service Pack 3
e Windows 8.1
e A2003

 Dai installa la versione pirata... e fai finta di fare il programmatore... ci crediamo di più...!
 
A dir la verita' quattro istruzioni recentemente le ho messe in fila ma 
non in VBA.


 Davvero eh. Finchè si scherza si scherza ma ...
 
Devi avrer bevuto ;-)


 e A2003
 
Fin dalla prima uscita il passaggio da una versione alla
successiva ha sempre comportato qualche problemino.
Ma qui i problemini mi sembrano problemoni.
 
Io aborro in egual misura le API e i moduli di classe
perché li ritengo un'inutile complicazione, quindi sono
portato con smaccata partigianeria ad attribuire ad essi
il problema di cui si parla.
Complicato anche dai 13 anni che separano le due versioni di Access.
 
Il mio amico @Alex è di tutt'altra idea.
Saltasse fuori avendo smaltito gli eccessi culinari pasquali,
potrebbe senz'altro darti una mano...
 
Bruno


ciao Bruno
ti ho rinviato il db,
prova con quest'ultimo

 prova con quest'ultimo
 
Oh, questo si apre senza problemi e sembra funzionare come si deve!
Un bel dimagrimento però; ti mando il contenuto dei
due database:
https://www.dropbox.com/s/fi9yaq94eh1spjm/ObjectCount.pdf?dl=0
 
 
Ora dimmi, sul secondo, come procedo?
 
Bruno

Bruno Campanini formulated the question :

Ho provato a pasticciarci un po'...
Dal Pannello Comandi si apre solo la scheda Dati Società,
mentre dalla finestra database le 11 Form si aprono tutte.
 
Bruno


ti ho rinviato ancora il programma.
 
Procedi in questo modo:
1-immetti/visualizza Ordini per Cliente
2-seleziona cliente con Ordini, oppure senza Ordini
3-pulsante: "Nuovo Ordine"
4-doppio click su "Data Ordine", puoi inserire la data anche manualmente; chiudi la maschera.
5-seleziona nella maschera dov è posizionato il cursore, un fornitore (prima maschera posta al centro sotto le combo)
6-seleziona un prodotto nella maschera sottostante
7-click sul controllo "data carico", si apre la maschera "Conferma Carico"
8-inserisci una data, ecc. ecc.
9-seleziona "Report conferma Carico" lui ti dirà cosa fare; chiudi la maschera
n.b. tutti i controlli di colore verde sono selezioanbili o con clik o doppio click
10-i controlli sulla prima maschera di destra di "Gestione ordini"
cioè: "Mio Rif", "Ordine", "Data Ordine" aprono dei report
solo quando il quadratino a lato non è piu' rosso.

aggiungo, (sul punto 5)
posso scrivere anche parte centrale di un nome fornitore(se non ricordo il nome esattamente),
poi con doppio click, si apre una piccola maschera "Trova fornitore"
con un'elenco di tutti i fornitori che contengono le lettere inserite nella combo.
e' sufficiente poi fare click sul fornitore scelto per trasferirlo sulla combo.
Non ho potuto fare diversamente perchè la maschera è a visualizzazione maschere continue.  

 Uno sballo!
 
Ma quanto te piaceno 'sti "primoriali" a te ... Uh ! :-) 
Ci "rotoli" sopra, addirittura. 
 
 


Esatto.
Non se se /conosci/ il Cobol.
C'era un /trucchetto/ per azzerare i campi in memoria che si chiamava, 
appunto, "azzeramento a rotolamento".
Solo una volta lo ho visto usare in una procedura sviluppata da team 
IBM. Quando lo ho notato  mi sono alzato ed al grido:
"allora Dio c'e' " sono anado al bar e mi sono fatto un uiscaccio.
La gente intorno mi ha guardato con aria stralunata, ma vaglielo a
spiegare il miracolo.


 solo quando il quadratino a lato non è piu' rosso.
 
Va bene ho fatto tutto... quindi?
Quando e come si verifica il problema all'oggetto del thread?
 
Bruno


Ciao Bruno e grazie per l'aiuto,
 
sostituendo il codice già postato con questo:
 
Public Function Conf_Chiusura( _
  ByVal campo1 As Variant, _
  ByVal campo2 As Variant) As Boolean
 
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
    & " Where IdCarico =" & fctCriterio_Idc()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  If rsCheck.BOF Then 'se non ci sono record nel recordset
    MsgBox "Non ci sono record.", vbExclamation, "Attenzione!"
    Exit Function
 
  End If
 
  Dim CheckArray(1 To 3) As String, J As Integer
  Dim X As String
 
  CheckArray(1) = "nColli"
  CheckArray(2) = "Quantità"
  CheckArray(3) = "Prezzo"
 
  For J = 1 To 3
  rsCheck.FindFirst CheckArray(J) & " = 0"
 
  X = IIf(Len(campo1 & vbNullString) = 0, ", data Chiusura", "") _
    & IIf(Len(campo2 & vbNullString) = 0, ", Targa", "") _
    & IIf(CheckArray(J) = "nColli", ", n°Colli", "") _
    & IIf(CheckArray(J) = "Quantità", ", Quantità", "") _
    & IIf(CheckArray(J) = "Prezzo", ", Prezzo", "")
 
  Next
 
  If (X) <> "" Then
    MsgBox "Attenzione manca:" & Mid(X, 2) & ".", vbExclamation, "Attenzione!"
    Exit Function
 
  End If
 
  Set rsCheck = Nothing
 
Conf_Chiusura = True
End Function
 
perchè invece di funzionare meglio, è addirittura peggio?
in piu' mi piacerebbe avere
un tuo giudizio sul mio db?

francode...@gmail.com
 expressed precisely :

[...]
 
Nell'ultima versione che mi hai inviato, aperta M_ChiusuraCarico
dalla finestra database, quando questa viene chiusa
la funzione Conf_Chiusura() viene eseguita in 0.0078125
secondi... non capisco come tu possa considerarla lenta.
 
Se detta Con_Chiusura() le sostituisco con quella che mi
hai inviato col post al quale sto rispondendo, alla chiusura
di M_ChiusuraCarico mi si presentano due MsgBox:
- Attenzione manca: Prezzo
- Non puoi fare modifiche perché il carico
  l'hai già fatturato
e la Form si chiude.
 
Le due Con_Chiusura() non sono pertanto equivalenti
nell'elaborazione dei parametri e/o nella determinazione
dei risultati.
 
Siccome non ho alcuna voglia di proseguire nei meandri
del tuo programma, ho distrutto i due file e non
intendo più occuparmene.
 
Alla prossima.
Bruno


cmq grazie Bruno