Newsgroup: it.comp.appl.access
Titolo: espressione in casella di testo passata via codice vba

Saluti
ho una maschera che mostra alcuni campi di una tabella.
Nella maschera c'è una casella di testo (CaellaTesto01) che ha questa epressione nella sua proprietà RecordSource:
=Somma(IIf([Controllato]=Falso;1;0))
 
in pratica "conta" quanti sono i record che NON presentano il flag Controllato
(campo presente nella Tabella, presente pure nella maschera)
 
L'espressione funziona correttamente.
 
Ora però vorrei governarla da VBA.
 
Vorrei cioè far "passare" da codice quella stessa espressione (per governare anche su quale campo fare il conteggio)
 
all'evento apertura della maschera io ho messo
 
Me.CasellaTesto01.RecorsSource ="=Somma(IIf([Controllato]=Falso;1;0))"
 
ma il debug avverte errore 2438, Errore di sintassi nell'espressione.
 
Ho provato a mettere apici, apici doppi, usare la funzione in inglese (sum)
ma nulla da fare.
 
Come potrei riuscire nell'intento?
 
Vi ringrazio anticipatamente
 
Guido

Ciao, 
il problema è nei ; usa ,
Mat.

Il problema grave è che un controllo di tipo textbox non ha proprietà RecordSource anche scritta bene... figurati scritta male....
Se assegni un valore già elaborato devi usare la proprietà Value. 
Poi virgola e punto virgola....
@ALEX

Che intendesse controlsource?
Mat.

Da quello che scrive... sarebbe evidente... mi chiedo perché non fare un pezzetto in più e leggere la guida per non scrivere cose sbagliate proprio come domanda..?
 
In ogni caso questa tecnica è assolutamente sbagliata... se è un Unbound Control... si lascia la formula/espressione esattamente li dove era ... se è statica, se dovesse essere dinamica tanto vale usare la Value property su evento condizionante... Current o altro...
 
@ALEX


Intanto mi scuso
è mia cura ceracre di porre la domanda il piu corretta possibile per non ingenerare problemi di comprensione.
A volte, per i non esperti (di access) come il sottoscritto, si pongono alcuni problemi proprio in ordine al modo di porre la domanda.
Si cerca di vedere cosa offre la rete sulla questione prima di disturbare il gruppo; spesso non si trova proprio per il modo stesso di fare la domanda...(spesso...non si sa cosa chiedere...sarà proprio questa la domanda giusta?).
 
Nel mio caso ho continuato a scrivere e pensare Recor(s)Source quando il mio intento era proprio quello di indicare ControlSource.
 
qualcuno l'ha colto.
 
Ma l'errore resta il mio.
 
Colgo invece l'invito a leggere più approfonditamente la Guida, utilizzando in ogni caso anche i suggerimenti che mi hai dato
 
Grazie!

Il giorno sabato 28 gennaio 2017 22:32:32 UTC+1, @Alex ha scritto:

eccomi
 
ho provato ad utilizzare la proprietà value (e non controlSoource) della casella di testo via VBA.
 
all'evento "apertura" della maschera, ho inserito il codice
 
Me.CasellaTesto01.Value = "=Somma(IIf([Controllato]=Falso;1;0))"
 
In questo caso, una volta aperta la maschera, la casella di testo (ma fin li c'ero arrivato anche io) riportava esattamente quello che avevo scritto...e cioè
Somma(IIf([Controllato]=Falso;1;0))
 
Allora ho pensato che i doppi apici non andavano bene e li ho eliminati
 
Me.CasellaTesto01.Value = Somma(IIf([Controllato]=Falso;1;0))
 
 
...ma il compilatore si arrabbia, con quei punti e virgole...
 
Allora come da altro suggerimento ho eliminato i punti e virgola sostituendo con le virgole
 
 
Me.CasellaTesto01.Value = Somma(IIf([Controllato]=Falso,1,0))
 
..niente, Sub o Function non definita.
 
 
La metto in inglese? Tipo sum?
 
Me.CasellaTesto01.Value = Sum(IIf([Controllato]=Falso,1,0))
 
..niente, Sub o Function non definita.
 
 
Non so veramente che pesci pigliare per passare questa espressione.
 
Ovviamente se scrivo
Me.CasellaTesto01.Value = 20+15
 
in casella viene mostrato un bel 35...
 
Credo sia proprio la modalità con cui scrivo che non è corretta.
 
D'altra parte mi serve governarla perchè a volte è il campo Controllato che dovrà essere la condizione di conteggio, altre voltè sarà il campo Inviato, piuttosto che Compilato...
 
Sono proprio tabula rasa in questo momento
 
 
un saluto ed un grazie
 
Guido
 
 
 

 Me.CasellaTesto01.Value = "=Somma(IIf([Controllato]=Falso;1;0))"
 
Prova con
 
Me!CasellaTesto01.ControlSource = "=Sum(IIf(Controllato=False,1,0))"
 
o
 
Me!CasellaTesto01.ControlSource = "=Abs(Sum(Controllato=False))"
 
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 

Karl ovviamente funziona il tuo suggerimento... ma diventa inutile sostituirlo all'inserimento nella proprietà ControlSource a designtime...
Lui ha espresso un'esigenza diversa e ritengo che questo metodo non dia nessun valore aggiunto rispetto all'uso standard nella struttura.
 
Ovviamente poi ognuno si complica la vita come vuole.
 
@ALEX

 Ovviamente poi ognuno si complica la vita come vuole.
 
Non ho letto tutta la discussione solo l'ultimo post dove scrive:
 
 > D'altra parte mi serve governarla perchè a volte è il campo
 > Controllato che dovrà essere la condizione di conteggio, altre voltè
 > sarà il campo Inviato, piuttosto che Compilato...
 
Per questo la mia risposta come cambiare l'origine controllo da codice. 
Dopo 10 millione di post si sa che la gente lavora in ca. 1 millione di 
modi diversi con Access. E perché no? ;-)
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 


Grazie intanto per il suggerimento che proverò subito.
Solo non riesco (per ignoranza mia si intende) a capire cosa intenda Alex.
 
C'è quindi una alternativa al "governo da codice" dell'espressione da passare alla casella di testo?
 
Non deve comunque essere una espressione "statica" perchè il Controllato verrà di volta in volta cambiato a seconda del tipo di Maschera che aprirò (o meglio..del diverso record source che ha la maschera, essendo la maschera utilizzata in molti ambiti)
 
Gazie in ogni caso anticipatamente a tutti
 

Il giorno lunedì 30 gennaio 2017 23:30:22 UTC+1, Karl Donaubauer ha scritto:

Ho provato. funziona. Grazie
 
Sono però veramente curioso, ove fosse possibile, di capire l'alternativa specialmente per il fatto che  "questo metodo non dia nessun valore aggiunto rispetto all'uso standard nella struttura."
 
Per "uso standard nella struttura" intendiamo "scrivere il testo dell'espressione  nella finestra proprietà alla voce Dati - Origine Controllo"?
Ma se faccio così perdo il governo di chi voler "contare".
 
O per "uso standard nella struttura" intendiamo altro?
 
Da qui si capisce la mia ignoranza ma anche la mia voglia di capirne un po' di più per evitare di complicarmi inutilmente la vita.
 
Grazie in ogni caso a tutti quanti!
 
 

La funzione da usare potrebbe essere DSum(...) e la si esegue su eventi adatti... a seconda di quando è opportuno aggiornarli... Current o altro evento...
Questa soluzione  ovviamente si applica alla proprietà VALUE direttamente.
 
Questo se lavori in maschera singola... in continua si esegue nelle Query. 
 
Tuttavia questo richiede più codice, più attenzione.
Se devi semplificare e rendere flessibile il lavoro la soluzione migliore invece potrebbe essere una funzione che ha il vantaggio di essere aggiornata atomaticamente come la soluzione del generatore.
 
Function NomeFunction() as tipo valore
....
End function
 
Nella proprietà OrigineControllo si assegnato la funzione:
=NomeFunzione()
 
Le soluzioni possibili sono molte... e come dice Karl sicuramente anche quella proposta lo è, ma se ti capiterà di scrivere un'espressione complessa che non funziona e vorrai fare debug allora ti ricorderai di questi suggerimenti. 
 
@ALEX


Chiarissimo.
Grazie ancora a tutti!
 
Guido