Funzione che restiuisce un valore ottenuto da una casella di ripilogo

di il
7 risposte

Funzione che restiuisce un valore ottenuto da una casella di ripilogo

Salve a tutti
avrei bisogno di realizzare una funzione che debba restituire un valore ottenuto aprendo una maschera popup al cui interno ci sia una casella di riepilogo.
Faccio l'esempio concreto:
1.apro un recordset che punta ad un file Excel
2.apro un recordset che punta ad una tabella
3.scorro tutte le righe della rset_excel elaboro i dati che mi servono e li inserisco nel rSet_tabella
4.se un determinato campo del rSet_excel è nullo, allora rSet_excel("categoria") = fn_categoria()
5.la funzione fn_categoria dovrà aprire una maschera popup con una casella di riepilogo che mi permetta di vedere tutte le categorie e selezionare quella più opportuna.
In pratica vorrei realizzare la stessa funzione vba inputbox() solo che invece del solito campo stringa mi deve visualizzare la combobox o la casella di riepilogo.
Grazie a tutti in anticipo

7 Risposte

  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    Ho la sensazione di essere in una logica lontana da Access. Tuttavia puoi rispiegare tutto usando i nomi propri di tabelle, campi…?
  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    Cerco di essere più chiaro:
    è evidente che se mi trovassi all'interno di una maschera, utilizzerei una combobox per selezionare il valore che mi serve.
    Ma se i valori vengono letti, elaborati e accodati da codice vba e un campo letto non presenta nessun valore, come posso far intervenire l'utente per selezionare il valore e far andare avanti il codice?
    per questo avevo pensato ad una funzione che mi apriva una maschera popup al cui interno vi è una combobox che mi fa selezionare il valore da passare al codice vba
  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    Rifaccio la domanda. Esponi chiaramente:
    - nomi propri di tutte le tabelle che entrano in gioco
    - nomi propri di tutti i loro campi con indicazione della chiave primaria
    - le relazioni
    - nomi propri di (eventuali...non ho capito) maschere
    - rispiega tutto passo passo usando i nomi propri
  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    riddik ha scritto:


    Cerco di essere più chiaro:
    è evidente che se mi trovassi all'interno di una maschera, utilizzerei una combobox per selezionare il valore che mi serve.
    Ma se i valori vengono letti, elaborati e accodati da codice vba e un campo letto non presenta nessun valore, come posso far intervenire l'utente per selezionare il valore e far andare avanti il codice?
    per questo avevo pensato ad una funzione che mi apriva una maschera popup al cui interno vi è una combobox che mi fa selezionare il valore da passare al codice vba
    Tecnicamente l'idea è corretta, apri una Form Popup in modalità Sincrona(acDialog) e fai selezionare il dato.
    Non capisco tuttavia il problema nel realizzarlo... ti spiego come faccio io.

    ListBox con il suo Origine dati, da Tabella o Elenco valori... che sia...!
    Essendo al Form acDialog non puoi interagire se non passando un Parametro con Args e leggerlo con OpenArgs oppure un qualche cosa di Public Esterno.
    Quindi se hai un RS e vuoi popolare la Lista con il Recordset, dichiaralo Public in un modulo e su Load
    
    Set Me!NomeLista.Recordset=TuoRecordset
    Su questi aspetti però io non ho capito nulla di come ti muovi... quindi vedrai tu.

    Detto questo nella Form di selezione aperta in modalità Sincrona devi operare sull'evento Unload... sapendo che il codice riprende al Chiamante se e solo se, la Form(acDialog) si chiude, oppure se diventa NON VISIBILE.
    Se la chiudi non potrai accedere ai dati di selezione a meno di salvarli in una variabile Public per poi recuperarli, altrimenti si può sfruttare il forzamento alla proprietà Visible=False per recuperare il valore e poi chiuderla... io uso il 2°.
    La sequenza questa:
    Form/Codice chiamante --->
    
    Dim retVal  As Variant
    DoCmd.OpenForm "NomeForm", , , , , acDialog, "Eventuali Parametri"
    retVal=Forms("NomeForm").ValoreSelezionato
    DoCmd.Close acForm, "NomeForm"
    nella Form di selezione invece
    
    
    Public Function ValoreSelezionato() as Variant
        ValoreSelezionato=Me.NomeListBox.Value
    End Function
    
    Private Sub Form_Unload(Cancel As Integer)
        Cancel = Me.Visible
        Me.Visible = False
    End Sub
    Ovviamente ho omesso gestione errori, il controllo del Selezionato sulla Lista che potrebbe inibire la chiusura e lasciare la Form di selezione Visibile...

    Vedi tu.
  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    Incollo il codice


    Private Sub CaricaExcel_Click()
    Dim fd As Office.FileDialog
    Dim oConn As ADODB.Connection
    Dim oAruba As ADODB.Recordset
    Set oConn = New ADODB.Connection
    Set oAruba = New ADODB.Recordset
    Dim ricerca As Variant
    Dim RsDati As New ADODB.Recordset

    RsDati.ActiveConnection = CurrentProject.Connection
    RsDati.CursorType = adOpenForwardOnly
    RsDati.CursorLocation = adUseServer
    RsDati.LockType = adLockOptimistic
    RsDati.Open "DatiFatture", , , , adCmdTableDirect


    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd

    .AllowMultiSelect = False
    .Title = "SELEZIONARE FILE ZIP FATTURE"
    .ButtonName = "SELEZIONA"
    .InitialFileName = "C:\FATTURE\"
    .InitialView = msoFileDialogViewPreview
    .Filters.Add "File zip", "*.zip", 1
    .Show
    filezip = .SelectedItems(1)
    If InStr(1, filezip, " ") > 0 Then
    newfilezip = Trim(Left(filezip, InStr(1, filezip, " "))) & ".zip"
    Name filezip As newfilezip
    filezip = newfilezip
    End If

    Set wshshell = CreateObject("WScript.shell")
    wshshell.Run "C:\fatture\7z.exe x " & filezip, 3, True

    End With
    NomeFile = Left(filezip, Len(filezip) - 3) & "xls"
    NomeFile = Replace(NomeFile, "Export", "Report")
    oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomeFile & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
    SQL = "SELECT * FROM [FattureRicevute$]"
    oAruba.Open SQL, oConn
    Do While Not oAruba.EOF
    piva = oAruba("P#IVA")
    ricerca = CercaAzienda(oAruba("Nome File")) '*************è una funzione che apre il file xml e cerca la p.iva del cessionario più altri dati e **************************************************************************restituisce un array
    trovato = DLookup("[idcodice]", "fornitori", "[idcodice] = '" & piva & "'") 'controllo se esiste il fornitore
    If IsNull(trovato) Then a = InseriscoFornitore(oAruba("Nome file"), piva) '********è una funzione che apre il file xml e recupera i dati del cedente
    RsDati.AddNew
    RsDati("azienda") = ricerca(1)
    RsDati("numero") = oAruba("numero")
    RsDati("Nome file") = Left(oAruba("Nome file"), InStr(1, oAruba("Nome file"), ".") - 1)
    RsDati("Data ricezione") = oAruba("Data ricezione")
    RsDati("Data documento") = oAruba("Data documento")
    RsDati("Tipo documento") = Trim(Mid(oAruba("Tipo documento"), InStr(1, oAruba("Tipo documento"), "-") + 1))
    RsDati("Fornitore") = oAruba("Fornitore")
    RsDati("PIVA") = oAruba("P#IVA")
    RsDati("Codice Fiscale") = oAruba("Codice Fiscale")
    if isnull(oAruba("Metodo di pagamento") then
    RsDati("Metodo di pagamento") = FUNZIONE CHE APRE POPUP CON CASELLA DI RIEPILOGO DEI METODI DI PAGAMENTO
    ELSE
    RsDati("Metodo di pagamento") = oAruba("Metodo di pagamento")
    END IF
    RsDati("Totale imponibile") = oAruba("Totale imponibile")
    RsDati("Totale escluso IVA") = oAruba("Totale escluso IVA (N1)")
    RsDati("Totale non soggetto IVA") = oAruba("Totale non soggetto IVA (N2)")
    RsDati("Totale non imponibile IVA") = oAruba("Totale non imponibile IVA (N3)")
    RsDati("Totale esente IVA") = oAruba("Totale esente IVA (N4)")
    RsDati("Totale regime del_margine IVA non esposta") = oAruba("Totale regime del_margine/IVA non esposta (N5)")
    RsDati("Totale inversione contabile") = oAruba("Totale inversione contabile (N6)")
    RsDati("Totale IVA assolta in_altro stato UE") = oAruba("Totale IVA assolta in_altro stato UE (N7)")
    RsDati("Totale IVA") = oAruba("Totale IVA")
    RsDati("Totale documento") = oAruba("Totale documento")
    RsDati("Netto a pagare") = oAruba("Netto a pagare")
    RsDati("allegato") = ricerca(2) '************************la funzione CercaAzienda() verifica se il file xml ha un allegato restituisce boolean
    RsDati("DDT") = ricerca(0) '*************************la funzione CercaAzienda() verifica se il file xml ha riferimenti a ddt restituisce boolean
    RsDati.Update
    oAruba.MoveNext
    Loop





    RsDati.Close
    'oAruba.Close
    'oConn.Close
    Set rsadti = Nothing
    Set oAruba = Nothing
    Set oConn = Nothing

    Me.ElencoFatture.Requery
    Kill (filezip)
    Kill (NomeFile)

    End Sub
  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    Cosa significa "Incollo il codice"...?
    Non sei in grado di scrivere una funzione che fa quel lavoro...? Mmmmm
    
    RsDati("Metodo di pagamento") = GetSelection()
    Attenzione che questo genererà Errore.... perchè io non sapendo i VarType ho definito Variant ma il Rs conviene fare la conversione...
    Se è un campo Counter(long) converti in Long... se è stringa converti in Stringa...
    RsDati("Metodo di pagamento") = Clng(GetSelection())
    Poi scrivi una Funzione che apre la Maschera Popup(acDialog)... e va a leggere il dato...
    
    Private Function GetSelection() As Variant
        DoCmd.OpenForm "NomeForm", , , , , acDialog
        GetSelection=Forms("NomeForm").ValoreSelezionato
    End Function
    
    Nella maschera Popup scrivi un metodo Public che restituisce la selezione, e quando viene chiamato chiude la Form
    
    Public Function ValoreSelezionato() as Variant
        ValoreSelezionato=Me.NomeListBox.Value
        Docmd.Close acForm,me.name
    End Function
    
    Private Sub Form_Unload(Cancel As Integer)
        Cancel = Me.Visible
        Me.Visible = False
    End Sub
  • Re: Funzione che restiuisce un valore ottenuto da una casella di ripilogo

    @Alex ha scritto:


    Cosa significa "Incollo il codice"...?
    Non sei in grado di scrivere una funzione che fa quel lavoro...? Mmmmm


    "Incollo il codice " nel senso che ti ho incollato il codice che ho scritto, nel post per fartelo vedere
    cmq il concetto è ben chiaro, mi metto subito all'opera e ti faccio sapere
    Grazie mille prof.
Devi accedere o registrarti per scrivere nel forum
7 risposte