Avviare routine da casella combinata

di il
16 risposte

Avviare routine da casella combinata

Ciao a tutti,
vorrei avviare del codice anzichè da pulsante di comando da casella combinata.
Ho una serie di pulsanti di comando che all'evento SuClic avviano delle singole stampe (lettera, promemoria, invito, ricevuta, ecc.); nel tentativo di non averne tante pensavo come ho fatto in altra occasione (con il vs. aiuto) di riunirle in una combo e all'evento AfterUpdate avviare quanto succede con il pulsante 1, 2, 3 ecc..
Come fare ?
Pensavo di salvare l'azione avviata dal pulsante di comando come una macro e quindi avviarla da combo ma non ho idea se sia possibile farlo e se si come.

Grazie

mazda91

16 Risposte

  • Re: Avviare routine da casella combinata

    Personalmente non userei l'evento AfterUpdate ma DoubleClick, questa è una cosiderazione di esperienza, la combo è fatta per consentire selezione e ripensamento, e forzare la stampa sempre è critica.
    In tutti i casi non spieghi come intendi popolare la combo, ma spero da tabella in modo da rendere flessibili le scelte nel caso siano da implementare....
    Diciamo che se crei una tabella con 2 campi:
    TestoDaVisualizzare
    NomeReport
    Associ la combo a questa tabella che avrà 2 colonne ma la 2°,quella associata al NomeReport con larghezza=0.
    A quel punto su evento scrivi:
    
    Docmd.OpenReport Me!NomeCombo.Column(1)
    Andrai a stampare il Report letto nella 2° colonna che ha indice 1.
  • Re: Avviare routine da casella combinata

    Io imposterei la casella combinata con le seguenti proprietà:
    Tipo origine riga: Elenco valori
    Origine riga: "lettera";"promemoria";"invito";"ricevuta"

    All'evento Dopo aggiornamento (AfterUpdate) associerei una macro con la seguente azione:
    • ApriReport
      Nome report: =[Maschere]![NomeMaschera]![NomeCasellaCombinata]
  • Re: Avviare routine da casella combinata

    Ciao.
    concordo con @Alex sulla scelta "impropria" della combo.
    ti suggerisco questo.
    Listbox popolata come segue :

    Dim doc As Document
    Dim dbs As DAO.Database
    Dim strReport As String
    Set dbs = CurrentDb

    strReport = ""
    For Each doc In dbs.Containers("reports").Documents
    If strReport <> "" Then
    strReport = strReport & ";"
    End If
    strReport = strReport & doc.Name
    Next
    Me.TUALISTBOX.RowSource = strReport

    e su doppio click della listbox :

    Dim varItm As Variant
    Dim ctl As Control
    Set ctl = Me.TUALISTBOX
    For Each varItm In ctl.ItemsSelected
    DoCmd.OpenReport ctl.ItemData(varItm), acViewPreview
    Next varItm

    ovviamente adatta il nome della listbox al nome del controllo che utlizzerai.
    un saluto.
  • Re: Avviare routine da casella combinata

    Mi permetto 2 considerazioni alle proposte di Osvaldo e Goku:
    1) Osvaldo
    L'idea dell'elenco valori funziona, ma è poco pratica, poco flessibile e poco gestibile.
    Chi sviluppa di norma applica il concetto della espandibilità, se scrivi l'elenco in quel modo e domani aggiungi Report che fai...? Apri modifichi a mano, ricompili e distribuisci...? Spero di no...
    Se devi gestire via vba l'elenco.... va da se che deve essere contenuto in qualche posto gestibile...
    Avendo un db... la tabella è la cosa migliore.

    2)Goku
    Se l'esigenza è realmente solo quella di esporre l'elenco completo senza codizioni di User o di altro la tua proposta è concettualmente buona ma suggerisco di semplificarla senza usare codice, inserendo questo predicato SQL nell'origine riga della combo:
    SELECT MsysObjects.Name 
    FROM MsysObjects 
    WHERE (((MsysObjects.Type)=-32764)) 
    ORDER BY MsysObjects.Name;
    L'idea della tabella è una mia deformazione di vedere le cose in modo che si possano gestire senza stravolgere l'applicativo, per questo se si deve condizionare l'elenco in base all'utente, in base alla maschera in cui si trova l'utente, il concetto relazionale delle tabelle è sempre il migliore.

    Ora lascerei al richiedente la scelta.
  • Re: Avviare routine da casella combinata

    @Alex ha scritto:


    Mi permetto 2 considerazioni alle proposte di Osvaldo e Goku:
    1) Osvaldo
    L'idea dell'elenco valori funziona, ma è poco pratica, poco flessibile e poco gestibile.
    Chi sviluppa di norma applica il concetto della espandibilità, se scrivi l'elenco in quel modo e domani aggiungi Report che fai...? Apri modifichi a mano, ricompili e distribuisci...? Spero di no...
    Se devi gestire via vba l'elenco.... va da se che deve essere contenuto in qualche posto gestibile...
    Avendo un db... la tabella è la cosa migliore.

    @Alex ha scritto:


    L'idea della tabella è una mia deformazione di vedere le cose in modo che si possano gestire senza stravolgere l'applicativo, per questo se si deve condizionare l'elenco in base all'utente, in base alla maschera in cui si trova l'utente, il concetto relazionale delle tabelle è sempre il migliore.
    Il tuo principio generale, lo condivido in pieno. Anch'io preferisco abbracciare questa filosofia. Anch'io evito di impostare la proprietà
    Origine elenco: Elenco valori
    ma mi sono limitato ad analizzare il caso specifico, in quanto l'utente aveva n pulsanti da eliminare. Quanti pulsanti ci dovevano poi essere sulla sua maschera? Da questo punto di vista, il mio contributo mi sembra pertinente. È vero poi, quando tu dici "...e se domani voglio altri report e il numero dei report comincia a giganteggiare...?"...OK, direi preferibile la via dei valori in tabella...e penso che si possa gestire anche con le macro...bla bla bla...lasciamo scegliere a mazda91.
  • Re: Avviare routine da casella combinata

    Grazie a tutti per le risposte,
    devo precisare che le stampe sono relative non a report ma a documenti word che vengono creati dll'evento Clic dei vari pulsanti. Per cui adesso mi trovo con alcuni pulsanti che avviano le singole stampe e per non avere tante cose in giro ho fatto così:
    1* creato uma maschera con una struttura a schede (2) dove inserisco i dati relativi all'ANAGRAFE, una seconda scheda dove metto i dati relativi alla spedizione;
    2* con un pulsante chiamato STAMPE avvio un'altra maschera dove ho messo i pulsanti che avviano le stampe. L'idea sarebbe quella di eliminare la maschera delle stampe e tutti i pulsanti e avviarne le azioni da una combo o list che sia. La combo la popolerei con i nomi dei singoli documenti.
    Magari non è possibile realizzarla con queste caratteristiche.
    Grazie
  • Re: Avviare routine da casella combinata

    Tutto è fattibile ma se ci dai le informazioni a rate generi solo confusione.
    I file di Word dove sono ?
    li popoli via codice ?
    Hai dei template che usi

    Contiuo a sostenere l'idea della tabella ma sospetto che tu non abbia colto.
  • Re: Avviare routine da casella combinata

    Eccomi,
    permettetemi una precisazione: sono ricorso alla generazione di un testo word perchè i report creati da access non mi consentono (o forse sono io che non so farlo) l'introduzione di testo oltre ai dati. Vale a dire, fin quando devo fare - per esempio - dei biglietti di augurio metto giù un modello con qualche abbellimento e poi ci pianto COGNOME-NOME-INDIRIZZO e la cosa è fatta. Nel momento in cui però al report vuoi agguingerci un pò più di testo come per esempio una lettera d'invito commerciale nella quale c'è parecchio testo e poi anche dati con i report non c'è verso.
    Allora cosa ho fatto, ho creato i documenti word di cui parlavo e che (anche grazie a voi) riesco a far girare via codice, poi salvo i singoli doc dove vuole l'utente. Il problema nasce dal fatto che l'applicazione così mi rischia via via di diventare sempre più piena di pulsanti ecc. ecc..
    Ecco perchè vorrei snellirla.
    Circa la proposta di Alex (tabella da implementare con future aggiunte) la trovo splendida e in parte la uso ora quando dal tasto VAI-A-STAMPE comando l'apertura di una maschera nella quale di volta in volta aggiungo quanto realizzo. MI chiedevo, però, non sarebbe meglio eliminarla e mettere tutte le procedure di avvio della stampa in una combo ?
    Grazie e buon fine settimana a tutti.

    mazda91
  • Re: Avviare routine da casella combinata

    Bene, era lo scenario che ti ho prospettato fin dall'inizio.
    Ritengo tu abbia tutti gli elementi tecnici per provare a costruire il tutto, poi se non funziona lo vediamo...
  • Re: Avviare routine da casella combinata

    Ciao a tutti,
    posto che la condizione della tabella è quella ottimale, sopratutto per gli aggiornamenti, vorrei comunque imparare a usare la combo. Dite che non sarà possibile usarla ?
    Grazie

    mazda91
  • Re: Avviare routine da casella combinata

    Mi pare che iniziamo a friggere aria...!

    Si può fare, inizia a buttare giù qualche cosa con i suggerimenti ricevuti e poi se non va ne riparliamo.
  • Re: Avviare routine da casella combinata

    Dunque,
    questo è il codice che sto usando

    Private Sub STAMPE_AfterUpdate()
    Select Case Me!STAMPE.Value
    Case Is = "INVITO"
    DoCmd.OpenFunction Me.Comando144
    Case Is = "RICEVUTA"
    DoCmd.OpenFunction Me.Comando170
    End Select
    End Sub

    Mi restituisce l'errore:
    Errore di run time 2498 - Tipi di dati dell'espressione errato per uno degli argomenti
    L'errore avviene per entrambe le selezioni.
    Perchè ??
    grazie
  • Re: Avviare routine da casella combinata

    Dopo svariate prove non sono riuscito a trovare il perchè dell'errore.
    Mi sa che senza il vs. aiuto non ne vengo fuori.
  • Re: Avviare routine da casella combinata

    Ho aggiornato (dopo ulteriori prove) il codice in ...

    Private Sub Elenco175_AfterUpdate()
    Select Case Me!Elenco175.Value
    Case Is = "Autorizzazione al ritiro"
    DoCmd.OpenFunction = Me.Comando144
    Case Is = "Intimazione al ritiro e notifica"
    DoCmd.OpenFunction = Me.Comando170
    End Select
    End Sub

    continuo a trovare errori, stavolta ho:
    Errore di compilazione: Argomento non facoltativo
    l'errore è riferito alla prima riga mentre invece dal debug mi evidenzia
    DoCmd.Openfunction

    Non capisco perchè.
Devi accedere o registrarti per scrivere nel forum
16 risposte