Ordinare sottomaschera su 2 campi in default

di il
5 risposte

Ordinare sottomaschera su 2 campi in default

Ho una maschera SUPPORTImod e una sottomaschera TITOLI-SUPPORTI.
La sottomaschera TITOLI-SUPPORTI contiene vari campi, in particolare Indirizzo e IDTitSupp sui quali, combinatamente, vorrei che normalmente avvenisse l'ordinamento Crescente.

Ho notato che se imposto la proprietà "Ordina per" su 1 o 2 o più campi, normalmente ciò accade, ma se, in visualizzazione maschera, clicco qua e là, decidendo di ordinare (momentaneamente) su un altro campo, l'impostazione "Ordina per" cambia automaticamente in base alla mia ultima scelta di Ordinamento.

Vorrei che la mia prima impostazione, rimanesse come se fosse una impostazione di default che deve rimanere tale ad ogni nuova apertura maschera.

Se non è possibile creare una impostazione di default stabile, so che potrei impostare una macro o codice VBA, tale che Su apertura maschera, la proprietà OrderBy venga impostata come ho indicato prima.
Non ci riesco a farlo su due campi, non ho capito la sintassi corretta.

Se usassi una azione macro, potrei utilizzare l'azione ImpostaValore (che può agire anche sulle proprietà dei controlli), preferirei questa strada.
Altrimenti anche in VBA andrebbe bene, forse dal codice stesso dovrei poter risalire alla sintassi corretta anche per la macro.

5 Risposte

  • Re: Ordinare sottomaschera su 2 campi in default

    Vedi questo:
    Private Sub Form_Load()
        Me.OrderByOn=False
        Me.OrderBy="Dampo1; Campo2"
        Me.OrderByOn=True
    End Sub1
  • Re: Ordinare sottomaschera su 2 campi in default

    Innanzitutto mi stai dicendo che non posso contare su una impostazione di default stabile: Giusto?
    Ma soltanto ricreandola con opportune istruzioni macro o VBA che siano, Su apertura: Giusto?

    Tutto il codice non l'ho capito, soprattutto nelle istruzioni
    Me.OrderByOn=False
    e
    Me.OrderByOn=True

    però l'istruzione centrale mi è tornata utile per ricostruire correttamente l'azione macro ImpostaValore. Se "Su apertura" di una maschera, associo l'azione
    ImpostaValore...
    ...Elemento: [Maschere]![NomeMaschera].[OrderBy]
    ...Espressione: "Campo1, Campo2"
    funziona.

    Funziona su maschera, ma non riesco a farla funzionare su sottomaschera.
    Riscontro vari tipi di errori, sia se:
    1. scrivo a Elemento: [Maschere]![NomeMaschera]![NomeSottomaschera].[OrderBy]
    2. se decido di porre l'attenzione sul controllo NomeSottomaschera con l'azione VaiAControllo (con entrambe le sintassi di Elemento)
    3. non so quale evento impostare dalla sottomaschera se Su attivato, Su attivazione, Su apertura...ecc...

    Caro Alex, lo so di essermi intestardito con le macro, ma quelle le ho digerite meglio e sono riuscito a costruire un groviglio di azioni che girano ottimamente. Purtroppo la sintassi Visual Basic mi disorienta troppo e l'idea di smontare tutto, per ora non mi torna utile.
    Tu continua a rispondermi nel tuo linguaggio più congeniale (VBA), io nel frattempo provvedo a ritradurre tutto nel mio (macro).......sperando che le mie domande siano congrue alla logica generale.
  • Re: Ordinare sottomaschera su 2 campi in default

    La questione dei parametri stabili di DEFAULT è in realtà da chiarire.
    La dove usi MDB o ACCDB avrai sempre quei problemi che hai lamentato e dovrai sempre predisporre il ricaricamento dei dati su LOAD o su UNLOAD come preferisci...!
    Se invece vai ad operare con un MDE questo non accade e quello che scrivi come Default è realmente tale.
    Ora tu non mi hai indicato la modalità con la quale lavori, e, visto quello che hai riscontrato ho dato per scontato usassi MDB/ACCDB.

    Per il resto l'uso di OrdeByOn come dice la guida serve per Attivare/Disattivare la proprietà OrderBy e di conseguenza il suo valore.
    Al fine di avere inconvenienti con le impostazioni a RUNTIME si usa prima di modificare la proprietà, disabilitarla, modificarla ed in fine riabilitarla.
    Stessa cosa si fa con la proprietà FILTER(e relativa FilterOn).

    Per le macro purtroppo io non le uso, quindi su certe cose non sono in grado di darti supporto, ricordavo un baco proprio sulla sintassi [Maschere]... ma non vado oltre proprio per il fatto che
    le evito essendo poco flessibili ed inutili(a parte quelle che ti ho segnalato).
  • Re: Ordinare sottomaschera su 2 campi in default

    I miei database portano l'estensione .mdb (uso Access 2003). Quindi, OK, chiarito questo dilemma.

    "Per il resto l'uso di OrderByOn come dice la guida serve per Attivare/Disattivare la proprietà OrderBy e di conseguenza il suo valore."
    Potresti dirmi il titolo dell'argomento Guida in linea che parla di questo?

    Questa volta, davvero non riesco a ritrovare una sintassi macro coerente su sottomaschera. Ho ripiegato sul tuo codice che sembra funzionare davvero. E ho notato che funziona correttamente proprio includendo le due istruzioni OrderByOn.

    Ora, tu, suggerendomi quel Form_Load(), mi hai lasciato intendere che dovevo applicare tutto il codice all'evento Su caricamento. Ho fatto così e funziona, scrivendo la Routine evento direttamente dalla sottomaschera, presa separatamente. Era giusto fare così? Quei Me. mi hanno insospettito. Se dopo Me. avessi indicato il NomeSottomaschera e applicato l'evento alla maschera principale, avrebbe funzionato lo stesso? Se sì, quale evento era consigliabile prendere in considerazione? Sinceramente non riesco a cogliere le differenze fra le proprietà evento:
    Su apertura, Su caricamento
    Su attivazione, Su attivato.

    Copiando/incollando il tuo codice, nella finestra VBA, ho notato che automaticamente i righi centrali 2 e 3 sono rientrati e che non funzionavano se li portavo allo stesso incolonnamento del rigo 1. E' una questione sostanziale oppure soltanto visivo-estetica?

    Me.OrderBy="Campo1; Campo2"
    C'è qualcosa di sbagliato nella sintassi? Io ho corretto sostituento punto e virgola con virgola e soltanto così funzionava. Del resto, l'attuale proprietà Ordina per, adesso presenta l'elenco campi separati da virgola
    Me.OrderBy="Campo1, Campo2"
    hai sbagliato tu? è indifferente? ho corretto bene?

    Comunque grazie mille, adesso funziona come mi aspettavo.
  • Re: Ordinare sottomaschera su 2 campi in default

    OsvaldoLaviosa ha scritto:


    I miei database portano l'estensione .mdb (uso Access 2003). Quindi, OK, chiarito questo dilemma.

    "Per il resto l'uso di OrderByOn come dice la guida serve per Attivare/Disattivare la proprietà OrderBy e di conseguenza il suo valore."
    Potresti dirmi il titolo dell'argomento Guida in linea che parla di questo?
    Domanda strana... se apri il VBEditor e selezioni dal Menù [VISUALIZZA]--->[VISUALIZZATORE OGGETTI(F2)] si apre un'interfaccia al codice...
    se digiti ORDERBY ti elenca gli Oggetti che supportano questo METODO(Funzione).
    Se selezioni il Metodo ORDERBY membro dell'oggetto FORM ed apri la GUIDA IN LINEA hai l'HELP con le descrizioni.

    OsvaldoLaviosa ha scritto:


    Questa volta, davvero non riesco a ritrovare una sintassi macro coerente su sottomaschera. Ho ripiegato sul tuo codice che sembra funzionare davvero. E ho notato che funziona correttamente proprio includendo le due istruzioni OrderByOn.

    Ora, tu, suggerendomi quel Form_Load(), mi hai lasciato intendere che dovevo applicare tutto il codice all'evento Su caricamento.
    Ho fatto così e funziona, scrivendo la Routine evento direttamente dalla sottomaschera, presa separatamente. Era giusto fare così?
    Si.

    OsvaldoLaviosa ha scritto:


    Quei Me. mi hanno insospettito. Se dopo Me. avessi indicato il NomeSottomaschera e applicato l'evento alla maschera principale, avrebbe funzionato lo stesso?

    Il [Me] è il riferimento ESPLICITO all'oggetto nel quale si scrive il CODICE e vale per una FORM e per un MODULO DI CLASSE.
    Quindi se dall'interno della [MascheraA] voglio far riferimento al controllo [Text1] posso scriverlo in 4 modi:
    
    Me!Text1
    Form!MascheraA!Text1
    Me.Controls("Text1")
    Form!MascheraA.Controls("Text1")
    Come vedi alcune volte uso il PUNTO altre il PUNTOESCLAMATIVO, queste sembrano finezze ma è questione di LINEARITA' nella programmazione.
    Il Punto si usa per accedere a METODI/PROPRIETA'/COLLECTION, mentre il PUNTOVIRGOLA fa riferimento ad OGGETTI.

    Se dalla FORM principale devi andare alla proprietà della SUBFORM la sintassi cambia...
    
    Me!NomeSubForm.Form.OrderBy="...."
    Si aggiunge Form perchè altrimenti il riferimento non è all'oggetto MASCHERA ma alla sua CORNICE...!

    OsvaldoLaviosa ha scritto:


    Se sì, quale evento era consigliabile prendere in considerazione? Sinceramente non riesco a cogliere le differenze fra le proprietà evento:
    Su apertura, Su caricamento
    Su attivazione, Su attivato.
    Gli eventi che citi sono tutti ESTREMAMENTE DIFFERENTI.
    I più usati sono LOAD(Caricamento) e OPEN(Apertura), sono molto diversi ed intervengono in tempi e modi diversi, ad esempio l'evento OPEN si può ANNULLARE
    annullando l'apertura della maschera, il LOAD invece NO.
    Hanno impatto differente anche sulla controllabilità dei dati e del codice istanziato..., ma questo è un passo avanzato.

    Per capire chi viene prima e chi dopo fai delle prove... usando il DEBUG.

    Gli altri 2 invece si usano solo quando fai MULTITASKING su diverse FORM aperte per capire quando una Maschera sta per tornare attiva(si verifica prima che accada)
    e subito dopo che si è attivata.

    OsvaldoLaviosa ha scritto:


    Copiando/incollando il tuo codice, nella finestra VBA, ho notato che automaticamente i righi centrali 2 e 3 sono rientrati e che non funzionavano se li portavo allo stesso incolonnamento del rigo 1. E' una questione sostanziale oppure soltanto visivo-estetica?

    Me.OrderBy="Campo1; Campo2"
    C'è qualcosa di sbagliato nella sintassi? Io ho corretto sostituento punto e virgola con virgola e soltanto così funzionava.
    Questo fa parte dell'aspetto ESTETICo di chi programma, diciamo che i BRAVI SVILUPPATORI usano dare profondità al codice, soprattutto quando ci sono LOOP
    o condizioni per renderlo LEGGIBILE, si chiama INDENTAZIONE e funziona anche se non si usa... quindi devi aver fatto qualche errore...!

    OsvaldoLaviosa ha scritto:


    Del resto, l'attuale proprietà Ordina per, adesso presenta l'elenco campi separati da virgola
    Me.OrderBy="Campo1, Campo2"
    hai sbagliato tu? è indifferente? ho corretto bene?

    Comunque grazie mille, adesso funziona come mi aspettavo.
    No non abbiamo sbagliato ne io ne te...
    La virgola la si usa quando si scrive via CODICE, mentre il PUNTOVIRGOLA se vai a scrivere direttamente nella proprietà... un pò come nelle Funzioni delle Query
    e nelle Funzioni VBA.

    A cappello di tutto, però, vedo delle evidenti LACUNE di base nel tuo bagaglio, che reputo necessarie colmare con qualche testo o con uno studio MIRATO
    allo sviluppo del codice e dei suoi metodi, altrimenti il rischio è che non ci si capisca, e che per ogni cosa serva un MINI-CORSO... ed il FORUM non è il luogo più
    adatto.
Devi accedere o registrarti per scrivere nel forum
5 risposte