Eval e Operatori di confronto in forma Stringa [RISOLTO]

di il
24 risposte

Eval e Operatori di confronto in forma Stringa [RISOLTO]

Salve a tutti,

Obbiettivo:

  • Eseguire controlli di validità per testare congruità tra Unità di Misura e la Quantità d'Imballo 
    • ottenere True or False come risultato del confronto per validare l'operazione 
  • Non creare Variabili o Costanti nel codice VBA 
    • impostare/modificare il tipo di confronto senza dover ogni qualvolta implementare il codice VBA 
    • implementare con nuove Unità di Misura senza dover ogni qualvolta implementare il codice VBA

Tabella: 

      

Nella tabella vengono configurate le Unità di Misura e per ogni elemento viene indicata la regola per validare se la quantità di Imballo e coerente con l'unità di misura.


Esempio:

Il prodotto Caramelle quando viene venduto si avrà: (Questa impostazione è VALIDA)

ProdottoQuantità VendutaUnità di MisuraImballoTot.Quantità in Pezzi
CARAMELLE2Ct612

Letteralmente sarà: Venduto 2 Cartoni da 6 di Caramelle pari a 12 Pezzi


Se l'operatore in fase di Vendita cambia l'Unità di Misura oppure la quantitàdi Imballo si deve verificare se i due valori sono congruenti 

Esempio:

Il prodotta Caramelle viene venduto in questo modo: (Questa impostazione NON è VALIDA

ProdottoQuantità VendutaUnità di MisuraImballoTot.Quantità in Pezzi
CARAMELLE2Nr48

Letteralmente sarà: Venduto 2 Pezzi (a numero) con imballo da 4 pari a 8 Pezzi … questo è un modo errato di operare
In questo caso doveva essere impostato, se si vuole vendere a pezzi sfusi in quanto l'imballo non è più integro, in questo modo:

ProdottoQuantità VendutaUnità di MisuraImballoTot.Quantità in Pezzi
CARAMELLE8Nr18

e Letteralmente sarà: Venduto 8 Pezzi con Imballo da 1 pari a 8 pezzi sfusi.


Controllo di Validità e di Congruenza tra Unità di Misura e Quantità di Imballo:

Dalla Tabella di cui sopra ho in una Stringa ( UmReg ) l'Operatori e le Quantità per effettuare il controllo di Congruenza
L'idea è quella di utilizzare la function Eval per Validare se per quell'Unità di misura è stato utilizzato un Imballo coerente:

Dalla FORM Me.DocImb contiene la quantità per imballo e Me.UmReg contiene la stringa di Validazione presente in Tabella 
---------------------------------------------------------------------------------------------------------------------------

Utilizzo di Eval con Replace per sostituire la virgola con il punto

If Not Eval(Replace(Me.DocImb, ",", ".") & Me.UmReg) Then
   MsgBox "Quantità Imballo incongruente con unità di misura", vbCritical, "Error"
   Cancel = True
End If
---------------------------------------------------------------------------------------------------------------------------
OPPURE :
Utilizzo di Eval con Str per sostituire la virgola con il punto

If Not Eval(Str(Me.DocImb) & Me.UmReg) Then
   MsgBox "Quantità Imballo incongruente con unità di misura", vbCritical, "Error"
   Cancel = True
End If

Per l'esempio di cui sopra, l'espressione risultante in Eval sarà:

Per la Vendita con Ct da 6 : L'Unità di Misura Ct richiede un valore di Imballo > di 1

Eval( 6 > 1 )	Restituisce True e pertanto Unità di Misura e Imballo sono Congruenti		


Per la vendita con Nr da 4 : L'Unità di Misura Nr richiede un valore di Imballo = 1 (vendita a pezzi)

Eval( 4 = 1 )	Restituisce Falso e pertanto Unità di Misura e Imballo non sono Congruenti e si emette l'errore

ohi ohi… la spiegazione è un po' lunga ma mi auguro che si possa capire… ;-) 

RISULTATO:

  • Con una sola IF e una Riga di Codice si esegue il controllo su tutte le possibili Unità di Misura  per qualsiasi Imballo che può essere impostato/modificato dall'operatore
  • Non è stato necessario impostare variabile e/o costanti nel codice VBA
  • E' sufficiente memorizzare nella Tabella la Stringa il confronto da effettuare per Validare l'uso corretto dell'Unità di Misura 
  • Nel caso in cui è necessario implementare nella Tabelle nuove Unità di Misura, non è necessario implementare anche il Codice Vba

DOMANDA:

  1. In questo caso l'utilizzo della function Eval è un approccio valido? ci sono alternative migliori?
  2. Nel caso di Unità di Misura che richiedono l'uso dei Decimali ho pensato di utilizzare o il Replace o la Str per convertire la virgola di separazione decimali con il punto in quanto la function Eval non può accettare le Virgole. Tra il Replace e la Str qual'è l'approccio migliore?

Grazie !!!

24 Risposte

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    Letteralmente sarà: Venduto 2 Pezzi (a numero) con imballo da 4 pari a 8 Pezzi … questo è un modo errato di operare

    Sei sicuro? Nel mondo reale si fa questo ed altro.

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - By65Franco ha scritto:


    Eseguire controlli di validità per testare congruità tra Unità di Misura e la Quantità d'Imballo

    Stavo chiedendomi se non ci sia un errore di fondo: verificare la congruità, deriva dal fatto che l'operatore possa imputare anche la quantità dell'imballo… Ma questa non può essere decisa al momento. Sarà prestabilita.

    Mi viene da proporti l'approccio usato nel mio gestionale (che non è farina del mio sacco, s'intenda):

    1. definisci un unità di misura di default per ciascun articolo. Questa sarà quella che ti permette di fare il "movimento" unitario" per la caramella
    2. definisci unità di misura alternative, che altro non saranno che un rapporto con l'UM di default. Ne tuo caso avrai per le caramelle la unità Ct che avrà rapporto con Nr pari a 6.

    Così facendo, tutti i movimenti verranno conteggiati in Nr, ma l'operatore dovrà aver cura solamente di impostare correttamente Qta e UM. Poi i conti li fai tu in bae al rapporto che imposti. Ti fai una tabella in cui relazioni gli articoli con tutte le su possibili UM ed il relativo coefficiente ed il gioco è fatto.

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - sihsandrea ha scritto:


    Letteralmente sarà: Venduto 2 Pezzi (a numero) con imballo da 4 pari a 8 Pezzi … questo è un modo errato di operare

    Sei sicuro? Nel mondo reale si fa questo ed altro.

    Ciao, 
    se Vendi a Nr (Numero) oppure Pz a Pezzi, si intende una vendita sfusa e pertanto si intende sempre e comunque Pezzi Sfusi.
    Quindi avere una vendita o acquisto con Um = Nr si intende che l'imballo del prodotto sarà a numero e non un imballo maggiore di 1

    Se vendo o acquisto 2 quantità di prodotto che ha un Imballo da 6 pezzi, allora Um sarà > 1 e si indica il cartone, il cluster o il blister di enne pezzi. Pertanto 2 quantità vendute con imballo da 6 , sarà 2 x Ct da 6 = 12 pezzi.

    L'Um determina la quantità minima di vendita del prodotto o di acquisto, quindi un prodotto può esse acquistato con imballo da 12 e venduto a numero (pezzi sfusi) oppure con un sotto imballo da 3 se nel cartone i prodotti sono confezionati a cluster o a blister, fardelli etc etc … Questo corrisponde alla quantità minima di acquisto e quantità minima di vendita. Spesso possono anche non coincidere se l'etichettatura del prodotto lo permette.
    Per Esempio: un fardello di acqua minerale è confezionato da 6 e può essere venduto anche singolo oppure in confezioni bipack.
    Pertanto la vendita a fardella sarà: 1 x Ct da 6 = 6 pezzzi oppure per vendita sfusa; 1 x Nr da 1 = 1 pezzo. 
    Quindi in quest'ultimo caso avere 1 x Ct da 1 non ha nessun senso in quanto la confezione a cartone non è da 1 ma da 6 pezzi.


    Però a parte questo che non è l'oggetto del Thread, il quesito è se per un confronto numerico dove l'operatore e la quantità di confronto sono posti in una stringa, la function Eval è consona allo scopo oppure esistono approcci e/o tecniche diverse e/o migliori? 

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    Sulla carta va bene ma nel mondo reale no.

    A volte capita di fare colli misti.  O di vendere in pz quello che è in cf…

    Soprattutto se parliamo di peso o volume capita spesso.

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    Sempre a titolo esemplificativo…

    Imballo da 6 confezioni di cornetti.

    Ricevi un collo danneggiato, al controllo hai una cf di cornetti rotta, accetti i 5 pacchi e rifiuti il pezzo danneggiato.

    Al carico devo forzare la tua regola, chi ha venduto deve fare nota di credito per una cf, forzando l'imballo.

    Se metti un controllo del genere rischi di non fare lavorare cliente e fornitore. Poi dovrei caricare la nota di credito e ri-forzare quel controllo.

    Quindi, ok la cortesia di calcolarmi imballo e confezione ma devo sempre forzare l'inserimento. Consiglio da capelli bianchi. Poi fai come meglio credi.

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - By65Franco ha scritto:


    Però a parte questo che non è l'oggetto del Thread, il quesito è se per un confronto numerico dove l'operatore e la quantità di confronto sono posti in una stringa, la function Eval è consona allo scopo oppure esistono approcci e/o tecniche diverse e/o migliori? 

    Scusa Franco, non entro nel merito del mondo reale, saprai tu quali casistiche devi prendere in considerazione e come…!

    Cerco tuttavia di capire perchè usi EVAL… dagli esempi che hai portato non ne trovo il motivo…!

    Che 6>1 VERO mi pare banale…

    Che 4=1 FALSO altrettanto

    Quindi puoi farmi chiarezza sul motivo che ti spinge ad usare un VALUTATORE di espressioni…?

    Se riesci a portare esempi più concreti con la parte di codice valorizzata da un Debug.Print… io non comprendo i contenuti dell'espressione passata ad EVAL ad esempio…

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - By65Franco ha scritto:


    DOMANDA:

    1. In questo caso l'utilizzo della function Eval è un approccio valido? ci sono alternative migliori?
    2. Nel caso di Unità di Misura che richiedono l'uso dei Decimali ho pensato di utilizzare o il Replace o la Str per convertire la virgola di separazione decimali con il punto in quanto la function Eval non può accettare le Virgole. Tra il Replace e la Str qual'è l'approccio migliore?

    1) Puoi fare come meglio credi

    2) i decimali li trovi solo nei prodotti a peso o volume, lasciali con la virgola. Per gli imballi dai un range di tolleranza.

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    Dimenticavo..

    Se trunc(pezzi / pezzi x confezione) <> (pezzi / pezzi per confezione) c'è qualcosa di strano…

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - @Alex ha scritto:


    03/07/2023 - By65Franco ha scritto:


    Però a parte questo che non è l'oggetto del Thread, il quesito è se per un confronto numerico dove l'operatore e la quantità di confronto sono posti in una stringa, la function Eval è consona allo scopo oppure esistono approcci e/o tecniche diverse e/o migliori? 

    Scusa Franco, non entro nel merito del mondo reale, saprai tu quali casistiche devi prendere in considerazione e come…!

    Cerco tuttavia di capire perchè usi EVAL… dagli esempi che hai portato non ne trovo il motivo…!

    Che 6>1 VERO mi pare banale…

    Che 4=1 FALSO altrettanto

    Quindi puoi farmi chiarezza sul motivo che ti spinge ad usare un VALUTATORE di espressioni…?

    Se riesci a portare esempi più concreti con la parte di codice valorizzata da un Debug.Print… io non comprendo i contenuti dell'espressione passata ad EVAL ad esempio…

    Ciao @Alex,
    si certo, vediamo se mi spiego meglio e con meno parole…. ;-)

    - Per ogni prodotto si ha un Unità di Misura e la Quantità di Imballo
    - Il test da effettuare deve validare se i valori Unità di Misura e Quantità Imballo sono coerenti tra di loro
    - Le regole per validare la coerenza sono memorizzate in un campo Stringa nella tabella Unità di Misura e si chiama UmReg (regola per l'unità di misura)
    Questa è la Tabella dove a  destra c'è la colonna Regole di validità
     

    Esempio Immisione Corretta
    Quantità OrdineUm ImballoEsito Quantità OrdineUm Imballo
    1Nr1Corretto 1Nr1
    6Nr6Errato 6Ct6
    3Ct12Corretto 3Ct12
    3Ct1Errato 3Nr1
    1Ct1Errato 1Nr1
    Etc etc…    Etc etc…  

    Ho pensato di utilizzare Eval per non creare delle Costanti o Variabili a Codice Vba e una funzione apposita per effettuare il test di validità nell'uso corretto tra Um e Qtà Imballo

    Con Eval controllo quanto segue:

    IF Eval( Imballo & RegolaValidità)  che restituisce Vero o Falso

    Sulla base dell' UM prendo da tabella la regola di validità corrispondente e la confronto con l'imballo immesso nel documento
    Le informazioni che provengono dalla Tabella Unità di Misura sono sempre disponibili nel recordset della Form in quanto è presente la Join nella Select del recordset. Quindi quando vado a testare se Um immessa è corretta, per essa ho già nella Form anche il campo UmReg (Regole di Validità) (Ovviamente l'imballo viene automaticamente proposto nella riga di Immissione ed è possibile modificarlo a proprio piacimento)

    Esempio:

    Nella prima riga di esempio sopra riportata abbiamo Um = Nr e Imballo = 1 La regola di Validità per l'unità di misura Nr è “=1”
    L'espressione in Eval sarà: 
    IF Eval( Imballo &  RegolaValidità )  che diventa :  IF Eval( 1=1 ) ….. quindi restituisce True (immissione Corretta)

    Nella seconda riga di esempio sopra riportata abbiamo Um = Nr e Imballo = 6 La regola di Validità per l'unità di misura Nr è “=1”
    L'espressione in Eval sarà: 
    IF Eval( Imballo &  RegolaValidità )  che diventa :  IF Eval( 6=1 ) ….. quindi restituisce False (immissione Errata non coerente)

    Nella terza riga di esempio sopra riportata abbiamo Um = Ct e Imballo = 12 La regola di Validità per l'unità di misura Nr è “>1”
    L'espressione in Eval sarà: 
    IF Eval( Imballo  &  RegolaValidità )  che diventa : IF Eval( 6>1 ) ….. quindi restituisce True (immissione Corretta)

    Nella quarta riga di esempio sopra riportata abbiamo Um = Ct e Imballo = 1La regola di Validità per l'unità di misura Nr è “>1”
    L'espressione in Eval sarà: 
    IF Eval( Imballo &  RegolaValidità )  che diventa :  IF Eval( 1>1 ) ….. quindi restituisce False (immissione Errata non Coerente)


    Con questo metodo, là dove occorre, scrivo solo una riga di codice per validare l'uso corretto tra Um e Qtà Imballo
    In più modificando la regola di validità nella tabella Unità di Misura, non devo più toccare o modificare il codice Vba, anche quando si aggiungono nuove Unità di misura in Tabella o se si vogliono modificare le regole di Validità già esistenti.

    Pertanto tutto il codice che serve è solo una If e la valutazione con Eval.
    Secondo te è valido come approccio, che ne pensi ?


    P.S. per rispondere anche agli altri intervenuti…. Così facendo si ha la possibilità di configurare nella Tabella Unità di Misura qualsiasi tipo di regola che meglio soddisfa le varie e variopinte necessità… Nulla di scritto fisso a programma, massima flessibilità se si vuole o meno controllare la coerenza nell'uso di una Unità di Misura per la sua Quantità di Imballo.
    Pertanto ognuno le regole se la farà e le userà a sua immagine e somiglianza, in quanto sarà sufficiente modificare l'espressione di convalida nella Tabella Um. 

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - sihsandrea ha scritto:


    Letteralmente sarà: Venduto 2 Pezzi (a numero) con imballo da 4 pari a 8 Pezzi … questo è un modo errato di operare

    Sei sicuro? Nel mondo reale si fa questo ed altro.

    Ciao, 
    ;-) non hai letto bene ;-)

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - Sgrubak ha scritto:


    03/07/2023 - By65Franco ha scritto:


    Eseguire controlli di validità per testare congruità tra Unità di Misura e la Quantità d'Imballo

    Stavo chiedendomi se non ci sia un errore di fondo: verificare la congruità, deriva dal fatto che l'operatore possa imputare anche la quantità dell'imballo… Ma questa non può essere decisa al momento. Sarà prestabilita.

    Mi viene da proporti l'approccio usato nel mio gestionale (che non è farina del mio sacco, s'intenda):

    1. definisci un unità di misura di default per ciascun articolo. Questa sarà quella che ti permette di fare il "movimento" unitario" per la caramella
    2. definisci unità di misura alternative, che altro non saranno che un rapporto con l'UM di default. Ne tuo caso avrai per le caramelle la unità Ct che avrà rapporto con Nr pari a 6.

    Così facendo, tutti i movimenti verranno conteggiati in Nr, ma l'operatore dovrà aver cura solamente di impostare correttamente Qta e UM. Poi i conti li fai tu in bae al rapporto che imposti. Ti fai una tabella in cui relazioni gli articoli con tutte le su possibili UM ed il relativo coefficiente ed il gioco è fatto.

    Ciao,

    si si, è proprio quello che accade:

    • Inserire Prodotto per la riga del documento
    • Viene proposta per default, secondo il tipo di documento, una delle possibili Unità di Misura e Quantità di Imballo: 
      • Um e Imballo di Vendita per movimenti di cessione
      • Um e Imballo di Acquisto per movimenti in entrata da fornitori etc…
    • Immettere la quantità desiderata del movimento 
    • Sarà possibile modificare UM l'unità di misura se occorre
    • Sarà possibile modificare Quantità di Imballo se occorre
    • Nella Tabella dei movimenti verrà memorizzato il valore UM e IMBALLO così come è stato proposto per default oppure se modificato dall'operatore
    • Sarà possibile, abblencando l'UM ‘unità di misura’, reperire nuovamente i valori di default di UM e Qtà Imballo originali

    In ultima considerazione, ovviamente l'imballo e la quantità di vendita o acquisto sono condizionate al Prezzo imputato al prodotto.
    Infatti possiamo avere o prezzo Singolo o prezzo ad imballo etc etc etc…


    Lo scopo è quello di avere visivamente una lettura coerente dell'informazioni della riga documento (almeno una logica e il significato corretto di quanto esposto su di essa) e quindi un minimo di controlli che portano a scrivere correttamente e con senso compiuto una riga documento. ;-)

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    Adesso mi è chiaro, ora entra in gioco la questione sollevata prima con cui in senso assoluto posso concordare ma se nel tuo caso copre tutte le tue possibilità, direi che EVAL è l'unica soluzione, certo non puoi fare spezzature artistiche/di necessità.

    Tieni presente che non serve il codice per fare questo controllo, lo puoi inserire direttamente nella proprietà RegoleValidazione.

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - sihsandrea ha scritto:


    Sempre a titolo esemplificativo…

    Imballo da 6 confezioni di cornetti.

    Ricevi un collo danneggiato, al controllo hai una cf di cornetti rotta, accetti i 5 pacchi e rifiuti il pezzo danneggiato.

    Al carico devo forzare la tua regola, chi ha venduto deve fare nota di credito per una cf, forzando l'imballo.

    Se metti un controllo del genere rischi di non fare lavorare cliente e fornitore. Poi dovrei caricare la nota di credito e ri-forzare quel controllo.

    Quindi, ok la cortesia di calcolarmi imballo e confezione ma devo sempre forzare l'inserimento. Consiglio da capelli bianchi. Poi fai come meglio credi.

    Ciao, non hai letto bene … 

    Con la configurazione della Tabella Unità di Misura e Regole di Validità, si specifica e si valida come deve essere utilizzata una Unità di Misura.
    Non si va ad incidere sul corretto o scorretto uso di un documento che rimane flessibile sia per gestire vendite ad imballo che per vendite sfusi, a sotto imballi etc… Quello che comanda sarà sempre il Prezzo a cosa è rapportato.
    Pertanto si valida solo il corretto abbinamento tra Um e Imballo … quindi l'operatore non potrà mai scrivere Um = Nr e Imballo = 24… se vuole scrivere una vendita a Numero (pezzi sfusi) dovrà scrivere semplicemente venduti 24 x Nr da 1 …. e non 1 x  Nr da 24 - Letteralmente se si legge non avrebbe nessun senso logico.  ;-) 

    Ma ad ogni modo quello che interessa è il controllo di coerenza tra Um e Qtà di Imballo, per il resto non porta a nessun limite ed e non incide sulla flessibilità di utilizzo dello strumento. Puoi realizzare qualsiasi tipi di vendita o di acquisto usando Um e Imballo più coerenti allo scopo… quindi nessuna limitazione alla fantasia e/o altro.   

     Consiglio da capelli bianchi. Poi fai come meglio credi.

    ;-)   … ho passato 40 anni nei settori Horeca, Cash Carry, Ingrossi, Supermercati, Enoteche e etc etc… per prodotti Food, non Food, Beverage etc… con prodotti a Pezzi per Imballo e sotto Imballi, a Peso calibrato e a Peso Variabile, con calo Peso e Sfridi etc etc etc… 
    Ambienti As400 e km e Km e Km di Analisi e Codice scritto … a metterlo tutto in fila non so quante volte ci si fa il giri del mondo ;-))
    Penso che un po' di esperienza di averla pure io ;-)  ma mille grazie per le info che sono sempre utili al confronto e conoscenza…. in questi settori non si finisce mai di imparare.
    Grazie pe l'attenzione!!!

  • Re: Eval e Operatori di confronto in forma Stringa [RISOLTO]

    03/07/2023 - @Alex ha scritto:


    Adesso mi è chiaro, ora entra in gioco la questione sollevata prima con cui in senso assoluto posso concordare ma se nel tuo caso copre tutte le tue possibilità, direi che EVAL è l'unica soluzione, certo non puoi fare spezzature artistiche/di necessità.

    OK… grazie… è che sono prolisso sia nel parlare che nello scrivere e quando viene esposto un concetto con troppe parole si perde facilmente il filo ed è difficile comprendere… sono anche capace di sintesi, ma raramente ;- )

    03/07/2023 - @Alex ha scritto:


    Tieni presente che non serve il codice per fare questo controllo, lo puoi inserire direttamente nella proprietà RegoleValidazione.

    Si anche questo è vero, è pur sempre una funzione e come tale si può passare anche nelle proprietà… Ok !!!


    Una ultima considerazione… Eval nella stringa che deve valutare non ammette i caratteri VIRGOLA.
    Per sostituire in un numero la Virgola con il Punto, secondo te è meglio utilizzare il Replace oppure la Str ?

    Grazie mille!!!

Devi accedere o registrarti per scrivere nel forum
24 risposte