Lanciare una funzione

di il
3 risposte

Lanciare una funzione

PRESENTAZIONE
Buona sera a tutti. Mi presento: sono MGM e da qualche giorno sono disoccupato. Quindi sto facendo un lavoro per un'amica che ha un ecommerce.

INTRO
Ad oggi il caricamento su ecommerce lo fa tramite un csv che deriva da un Excel da delirio.
Glielo sto riportando su access perché tra poco cambiera' la piattaforma e le toccherà aggiungere millemila informazioni a quelle che ha ora per ogni riga di Excel.
In pratica le sto facendo una specie di sporco gestionale. Niente di complicato ma la vera menata è che, per consentirle un passaggio smooth dal vecchio Excel al nuovo Access, mi tocca mantenere alcune funzionalità che poi getterà nello sciacquone ma che fino al switch over le servono.

COSA HO ORA
In particolare l'excel utilizza una funzione di trasformazione che converte il codice dei prodotti dei suoi fornitori composto da numeri e lettere un (es.AP123456) in un codice proprietario. Poi con un CONCATENATE mette insieme un prefisso identificativo del fornitore+il codice convertito dalla funzione.
La funzione in VBA già l'avevo fatta in Excel. Semplicemente la lanciavo ad ogni modifica della cella che contiene. Poi in un'altra cella concatenavo il prefisso del fornitore con il convertito dalla funzione.
es: Immaginiamo che sia il record

CELLA B3 = codice prodotto fornitore (es.AP123456)  
CELLA C3= trasf(B3)     --> questo è il lancio della funzione che trasforma B3 nel codice nuovo.
CELLA D3= LM_            --> questo è il prefisso del fornitore
CELLA E3 (risultato) = CONCATENA D3+C3
PROBLEMA
Vi chiedo aiuto perché non riesco a capire, in access, come (da dove) lanciare la funzione in modo che mi trasformi tutti i codici degli oltre 5000 prodotti che ha a magazzino.
Quello che vorrei, alla fine, e' avere una maschera in cui la mia amica inserisca il codice prodotto fornitore + il fornitore e lui si facesse automaticamente la trasformazione scrivendo i valori in una tabella.

COSA HO FATTO
Ho creato la funzione in un modulo. Poi ho creato una [TabellaNuova] dove ci sono: i codici prodotto originali (la cella B3 in excel), il prefisso (D3), il campo che diventerà risultato finale (E3).
(A regime, ovviamente, B3 e D3 li prenderò da altre tabelle apposite).
Per ora me ne frego anche del concatenate perché non riesco proprio a far lanciare la funzione.

Avrei pensato di fare una query. L'ho fatta e ci ho messo semplicemente:

Espr1: [E3]=trasf([TabellaNuova].[B3])


ma mi viene dato un errore "funzione trasf non definita nell'espressione" come se la trasf non fosse legata a niente.
A dire il vero questo mi succede oggi. Ieri sera, quando l'ho creata, qualsiasi valore che io infilassi in "B3", mi andava in palla il debugger dicendomi che gli passavo un nul su nn (vedi oltre).
LA FUNZIONE E' QUESTA

Function TRASF(nn)
Dim x&, l1&, l2, l3$

    nn = UCase(nn)
    l1 = Len(nn)
    For x = 1 To l1
        l2 = Mid(nn, x, 1)
        
        
    If Not IsNumeric(l2) Then l3 = l3 & "-" & l2 ' se non è un numero (è un char), lascia l3 uguale ma mettici il - prima
        
        If IsNumeric(l2) Then
            Select Case l2 ' questo sostituisce i numeri con le lettere
                Case 0: l2 = "A"
                Case 1: l2 = "B"
                Case 2: l2 = "C"
                Case 3: l2 = "D"
                Case 4: l2 = "E"
                Case 5: l2 = "F"
                Case 6: l2 = "G"
                Case 7: l2 = "H"
                Case 8: l2 = "I"
                Case 9: l2 = "J"
            End Select
            l3 = l3 & l2
        End If
    Next x
    TRASF = l3
   
End Function

DOMANDA
Dov'è che sto commettendo la tavanata galattica?

RINGRAZIAMENTI
ringrazio infinitamente chiunque avrà la pazienza e la cortesia di perdere un po' di tempo a rispondermi. Se dovete insultarmi, fatelo piano.

3 Risposte

  • Re: Lanciare una funzione

    Excel e Access sono due applicazioni completamente diverse. Dalla descrizione di alcune celle che hai dato, Access pretende una suddivisione dei dati in maniera omogenea su più tabelle correlate fra loro in base a regole di normalizzazione, relazioni di campi e tante altre belle cose. Occorre:
    1) Avere bene in mente quale sarà il nuovo assetto tabelle.
    2) Per trasferire tutta quella mole di dati, in molti casi anche codificati, occorre una alta conoscenza di codice Visual Basic che scorpori il tutto.

    Un errore fatale che si commette facilmente è quello di pensare che le stesse colonne/righe di Excel possono sempre essere trasferite in colonne/righe di Access. Ciò è vero solo in casi molto semplici e univoci. Dalla presentazione del tuo lavoro non è affatto così.
  • Re: Lanciare una funzione

    A prescindere dal codice, l'errore pare sia nella chiamata.
    Il riferimento non pare corretto.
  • Re: Lanciare una funzione

    Bene. Grazie.
    Come si suol dire, aiutati che iddio t'aiuta. Devo purtroppo dire che Excel fosse diverso da Access lo avevo già sospettato nel lontano 1996 quando mi arrivò la prima copia di Office 3.0, bei tempi.
    Mi sono arrangiato con un po' di sano troubleshooting e debugging con msgbox.
    Come facevo da ragazzo pieno di presunzione.

    Ecco qui: chissà mai che qualche giovine softwarista non incontri lo stesso problema e passi per di qui.

    LANCIARE UNA FUNZIONE CUSTOM DA UNA QUERY CREATA PER EXCEL

    PRIMO: si può tranquillamente creare un campo che sia il risultato di una funzione custom lanciata da una query. Nessun problema. Funziona PRATICAMENTE COME EXCEL (alla faccia). Basta dargli un posto dove infilare il risultato che sia gradito ad Access così come Excel ha le celle.

    SECONDO (errore da dilettante, condivido): verificare che il modulo non si chiami come la funzione: se un modulo si chiama come la funzione Access giustamente non ci capisce più niente. Rinominato il modulo, la funzione viene vista regolarmente e non viene più generato l'errore di "Funzione non definita nell'espressione".

    TERZO: la funzione fa dichiarata Public, altrimenti non viene trovata. In questo è diverso da Excel. Visto il target differente, anche questo era abbastanza ovvio ma bisogna darci di muso.

    INFINE: mettere il contenuto della funzione come nuovo campo calcolato dalla query funziona.

    QUINDI: In Access creare un modulo nuovo, copiare ed incollare la funzione da Excel, verificare che sia Public, salvare il modulo in Access con un nome diverso dalla funzione, creare la vostra query, in modifica aggiungere il campo calcolato che lancia la funzione.

    es:
    CAMPONUOVO: nomefunzionecustom([TabellaCheContieneCampoDaPassareAllaFunzione].[CampoDaPassareAllaFunzione])

    Ad maiora!

    MGM
Devi accedere o registrarti per scrivere nel forum
3 risposte