Calcolo su colonna di campo multivalore con più valori

di il
11 risposte

Calcolo su colonna di campo multivalore con più valori

Buongiorno a tutti, sono nuovo nel forum.
Ho bisogno di risolvere un problema :
ho una maschera chiamata "anagrafiche clienti" e associata una sottomaschera "Servizi" nel quale ho un campo multivalore con più valori, cliccando si apre un'altra maschera di selezione o di visualizzazione dei servizi selezionati suddivisa in 3 colonne, faccio un esempio :

|Id_Servizio (nascosto) | Servizio | Prezzo
9 | Luce | € 9,00
10 | Pulizia | € 15,00
11 | Riparazione | € 20,00

ho fatto diverse prove per esempio a selezionarne 1 ma non ho il codice completo e qui sorge il problema e mi blocco perché nel campo multivalore con più valori ho bisogno di un codice più elaborato che non riesco a trovare una soluzione, mentre nel campo multivalore con valore unico non ho nessun problema, vorrei che viene memorizzato il valore della colonna 3 per poter formulare un calcolo su un totale, potete aiutarmi? qui di seguito un esempio del codice che vorrei completare del campo multivalore con più valori :
__________________________________________________
Private Sub Dettaglio_Servizio_AfterUpdate()

Dim Prezzo As Variant
Prezzo = Me.Dettaglio_Servizio.Column(3) 'che però prende sempre i valori della colonna 1 es. 9; 10; 11
MsgBox (Prezzo)

End Sub
__________________________________________________
Premetto che il codice funzione alla perfezione con il campo multivalore unico, ma non so come procedere in questo caso
Spero sia stato abbastanza chiaro, grazie in anticipo

11 Risposte

  • Re: Calcolo su colonna di campo multivalore con più valori

    Per me sbagli nell'aver scelto il "campo multivalore". Molto meglio la relazione uno-a-molti.
  • Re: Calcolo su colonna di campo multivalore con più valori

    OsvaldoLaviosa ha scritto:


    Per me sbagli nell'aver scelto il "campo multivalore". Molto meglio la relazione uno-a-molti.
    i servizi sono presi da un'altra tabella chiamata elenco_servizi, se faccio una relazione uno-a-molti dovrei creare più record in riferimento ai servizi svolti nell'unico record creato del giorno...
    mentre i servizi rimangono quelli e se mai aggiungere in futuro altri nuovi servizi che compariranno nella casella di riepilogo
  • Re: Calcolo su colonna di campo multivalore con più valori

    Mi sa che tra Anagrafica e Servizi intercorre addirittura una relazione molti-a-molti, con tabella di congiunzione che chiamerei ServiziPersone...con vicino il campo Prezzo.
    Il Prezzo io non ce lo metterei direttamente in tabella Servizi...perchè se nel tempo esso varia, vai a compromettere tutte le "valutazioni prezzo" precedenti.
  • Re: Calcolo su colonna di campo multivalore con più valori

    Il prezzo lo prende da Elenco_Servizi in quanto se varia nel tempo come dici tu non intromette nel incasso presente sulla tabella Servizi
  • Re: Calcolo su colonna di campo multivalore con più valori

    Il discorso del campo Prezzo verrebbe in un secondo momento.
    Trovo che la struttura tabelle è errata. Sei daccordo con me su Anagrafica e Servizi in relazione molti-a-molti, con tabella di congiunzione ServiziPersone ?
    Potresti mostrare tutte le tabelle con le relazioni?
    Se non chiariamo la struttura prima, non è possibile proseguire.
  • Re: Calcolo su colonna di campo multivalore con più valori

    OsvaldoLaviosa ha scritto:


    Il discorso del campo Prezzo verrebbe in un secondo momento.
    Trovo che la struttura tabelle è errata. Sei daccordo con me su Anagrafica e Servizi in relazione molti-a-molti, con tabella di congiunzione ServiziPersone ?
    Potresti mostrare tutte le tabelle con le relazioni?
    Se non chiariamo la struttura prima, non è possibile proseguire.
    Database per un salone di Parrucchiere :

    T_Elenco_Servizi :

    Id_Servizio
    Id_Categoria_Servizio
    Servizio
    Prezzo
    ______________________________
    T_Servizi :

    Id_Cliente
    Data
    Piega (Sì/No)
    Dettaglio_Piega (Casella combinata campo, origine riga da T_Elenco_Servizi, più valori No, nr°colonne 3, colonna associata 1)
    Curativi (Sì/No)
    Dettaglio_Curativi (Casella combinata campo, origine riga da T_Elenco_Servizi, più valori Si, nr°colonne 3, colonna associata 1)
    ....
    Incasso

    ______________________________

    Relazioni :
    T_Anagrafiche_Clienti!ID_Cliente <- T_Servizi!ID_Cliente 1 a molti

    T_Servizi!Dettaglio_Piega - T_Elenco_Servizi!ID_Servizio 1 a molti

    T_Servizi!Dettaglio_Curativi - T_Elenco_Servizi!ID_Servizio 1 a molti

    _____________________________

    Maschere :
    M_Anagrafiche_Clienti!M_Servizi_Sottomaschera

    M_Dettaglio_Piega (Per la scelta del tipo di piega contenente casella di riepilogo Dettaglio_Piega e tasti ok, cancella, annulla)
    Private Sub Annulla_Click()
    Me.Undo
    DoCmd.Close acForm, "Dettaglio_Piega"
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera].Form.Refresh
    End Sub

    Private Sub Cancella_Click()
    Me.Undo
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Dettaglio_Piega] = ""
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Piega] = "No"
    If Not IsNull(Me![Dettaglio_Piega].Column(2)) Then
    Dim PrezzoPrecedente As Variant
    PrezzoPrecedente = Me![Dettaglio_Piega].Column(2)
    If Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] <> 0 Then
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] = Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] - PrezzoPrecedente
    End If
    End If
    DoCmd.Close acForm, "Dettaglio_Piega"
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera].Form.Refresh
    End Sub

    Private Sub Dettaglio_Piega_BeforeUpdate(Cancel As Integer)
    If Me![Dettaglio_Piega] = Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Dettaglio_Piega] Then
    Me!Ok.Enabled = False
    Else
    Me!Ok.Enabled = True
    End If
    End Sub

    Private Sub Dettaglio_Piega_LostFocus()
    If IsNull(Me![Dettaglio_Piega]) Then
    Me!Ok.Enabled = False
    End If
    End Sub

    Private Sub Form_Load()
    If IsNull(Me![Dettaglio_Piega]) Then
    Me!Cancella.Enabled = False
    Me!Ok.Enabled = False
    ElseIf Me![Dettaglio_Piega] = Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Dettaglio_Piega] Then
    Me!Ok.Enabled = False
    Else
    Me!Cancella.Enabled = True
    Me!Ok.Enabled = True

    End If
    End Sub

    Private Sub Ok_Click()
    If IsNull(Me![Dettaglio_Piega]) Then
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Piega] = "No"
    Else
    Dim NuovoPrezzo As Variant
    NuovoPrezzo = Me![Dettaglio_Piega].Column(2)
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Dettaglio_Piega] = Me![Dettaglio_Piega]
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Piega] = "Sì"
    Me.Undo
    If Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] <> 0 And Not IsNull(Me![Dettaglio_Piega].Column(2)) Then
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] = Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] - Me![Dettaglio_Piega].Column(2)
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] = Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] + NuovoPrezzo
    Else
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] = Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera]![Incasso] + NuovoPrezzo
    End If
    End If
    Me.Undo
    DoCmd.Close acForm, "Dettaglio_Piega"
    Forms![M_Anagrafiche_Clienti]![M_Servizi_Sottomaschera].Form.Refresh
    End Sub


    M_Dettaglio_Curativi (Per la scelta dei tipi di servizi contenente casella di riepilogo Dettaglio_Curativi e tasti ok, cancella, annulla)
  • Re: Calcolo su colonna di campo multivalore con più valori

    Mie osservazioni:
    1. Le 2 relazioni ElencoServizi uno-a-molti Servizi non hanno senso.
    2. Le denominazioni delle tabelle depistano le idee a noi altri che ti seguiamo...e forse anche te. Io chiamerei Clienti, Servizi (ex ElencoServizi), ServiziClienti (ex Servizi)
    3. Tutti i campi della tabella ServiziClienti (ex Servizi). Che vuol dire Piega (Sì/No) e Curativi (Sì/No)? Perchè non elenchi direttamente tutti i Servizi e basta?
    3. La scelta dei campi multivalore andrebbe almeno giustificata. Avrebbe senso se i valori sono pochi...tuttavia molti utenti (anch'io ci ho provato) rifuggono volentieri da questo tipo di campo preferendo comunque la relazione uno-a-molti.
    4. Io penserei la tabella ServiziClienti con i seguenti campi:
    IDSC (numerazione automatica, chiave primaria)
    DataServizio
    IDServizio (numerico)
    Prezzo (per ora preferisco metterlo qui. Per renderlo automatico rispetto a un Listino, andrebbe fatto un discorso più ampio, ma molto diverso da come hai cominciato a impostare tu)
    IDCliente (numerico)

    Relazioni:
    Clienti.IDCliente uno-a-molti ServiziClienti.IDCliente
    Servizi.IDServizio uno-a-molti ServiziClienti.IDServizio (secondo la mie nuove denominazioni tabelle)
  • Re: Calcolo su colonna di campo multivalore con più valori

    Le 2 relazioni di ElencoServizi sono state create in automatico, mentre creavo il campo Dettaglio_Piega e Dettaglio_Curativi mentre impostavo il tipo di dati su ricerca gratuita che si collegavano agli ElencoServizi.
    Ho chiamato la tabella Servizi perché ogni cliente giornalmente fa dei servizi e ogni giorno dovrei stampare un report o crearmi un grafico dell'andamento dei clienti e quindi sapere quali servizi spingere di più nel salone.
    Mentre Elenco Servizi l'ho chiamata così perché ogni servizio è suddiviso in diverse categorie ed ha un prezzo che nel tempo posso modificare o aggiungere anche da altri utenti con l'apertura di una form.
    i campi piega e curativi(Sì/No) li ho creati perché se voglio sapere nel dettaglio o modificarli devo cliccare, avere semplificato a schermo il tipo di servizio, ho provato a mettere campo calcolato, ma difficile da gestire perché non è possibile fare modifiche su un click o eseguira codici sopra un campo calcolato, mi sembrava più semplificato la creazione di questi campi.
    Per quanto riguarda i campi non sono stato proprio nel dettaglio specificando esattamente quali ci siano, comunque in ogni tabella è presente un id numerico progressimo ecc...
    Comunque, sono un bel po' arrugginito, sono circa 20 anni che non programmo più ma l'infarinatura ce l'ho, accetto qualsiasi modifica e suggerimento da esperti come voi, mi affido per migliorare la creazione del nuovo database, in quanto ne ho un altro ma molto basilare e un po' difficile da far usare ai miei dipendenti. vorrei semplificargli le cose in modo semplice e con minimi errori o assenza.
  • Re: Calcolo su colonna di campo multivalore con più valori

    A me piacerebbe conoscere una decina di valori dalla tua tabella ElencoServizi. Mi serve capire una certa omogeneità di dati.

    Rileggendo tutto, la discussione si è spostata su "come progettare" le tabelle del database. Siamo ormai fuori tema dal titolo originario. Sarebbe bene aprire un altro thread, magari nella sezione "Progettazione database" in cui descrivi le tue tabelle e chiedi che venga "normalizzato". Puoi anche indicare il link di questa discussione se occorre semplificare alcuni passaggi.
  • Re: Calcolo su colonna di campo multivalore con più valori

    Ti faccio un esempio pratico :
    elenco dei servizi :
    categorie :
    taglio : taglio uomo; taglio Donna; Spuntata; macchinetta... (con relativi Prezzi)
    piega : piega normale; piega mossa; pettinata.... (con relativi Prezzi)
    curativi : fiala anticaduta; shampoo specifico; trattamento .... (con relativi Prezzi)
    colori : castano ; biondo; biondo scuro .... (con relativi Prezzi)
    etc...

    ho una maschera che visualizza il cliente e una sotto maschera strutturata in questa maniera :
    data :... piega : (Sì/No) curativi (Sì/No) colori (Sì/No) prezzo totale €....

    p.s. la piega è solo 1 mentre nei curativi o colori possono essere diversi.
    mettiamo una ipotesi che il cliente torna col figlio o la figlia durante il giorno, devo aggiungere un altro nuovo record sui servizi quindi quando stampo il report il cliente è sempre lo stesso ma ha fatto 2 presenze quindi conta come 2 persone
    se clicco su un servizio es. curativi carica una maschera con i servizi curativi che ho selezionato quindi collegati al record clienti che posso selezionare o modificare che però mi vada in automatico a cambiare il prezzo totale presente nella tabella dei servizi effettuati

    oltre questo c'è la raccolta punti, che comunque in questo non ho problemi, ogni volta che il cliente arriva e aggiungo servizi viene assegnato un punto che al raggiungimento di una soglia di servizi effettuati avrà uno sconto. Ma comunque mi funziona tutto alla perfezione anche se appena risolviamo questo problema cercherò di approfondire meglio e magari riordinare e alleggerire un po' di cose.
    spero che dalla mia descrizione si sia capito qualcosa
    Cosa mi consigli di fare allora?
    mi scuso ma potevo mettere delle immagini ma sono nuovo del forum devo capire ancora come inviarli
  • Re: Calcolo su colonna di campo multivalore con più valori

    maxcastelli78 ha scritto:


    ti faccio un esempio pratico :
    elenco dei servizi :
    categorie :
    taglio : taglio uomo; taglio Donna; Spuntata; macchinetta... (con relativi Prezzi)
    piega : piega normale; piega mossa; pettinata.... (con relativi Prezzi)
    curativi : fiala anticaduta; shampoo specifico; trattamento .... (con relativi Prezzi)
    colori : castano ; biondo; biondo scuro .... (con relativi Prezzi)etc...
    A voler essere super-ortodossi si potrebbe creare una tabella Categorie con i valori (Taglio, Piega, Curativi, Colori). Poi relazione Categorie.Categoria uno-a-molti ElencoServizi.Categoria. Ma questo direi che è marginale.
    Il Prezzo sicuramente non va incluso nella tabella ElencoServizi. Approfondisco dopo.

    maxcastelli78 ha scritto:


    p.s. la piega è solo 1 mentre nei curativi o colori possono essere diversi.
    Anche quando accade ciò, ha senso parlare in generale di MOLTI.

    maxcastelli78 ha scritto:


    mettiamo una ipotesi che il cliente torna col figlio o la figlia durante il giorno, devo aggiungere un altro nuovo record sui servizi quindi quando stampo il report il cliente è sempre lo stesso ma ha fatto 2 presenze quindi conta come 2 persone
    Allora bisogna prevedere ancora un'altra tabella Presenze o Fatture.

    Il tuo scenario tabelle mi ricorda qualcosa di simile con il database NorthWind. In quel caso di parla di Clienti, Ordini (o Fatture), Prodotti e DettagliOrdini.
    Nel tuo caso vedrei l'intero scenario così:
    Clienti uno-a-molti Presenze
    Presenze uno-a-molti DettagliPresenze (ex Servizi)
    Categorie uno-a-molti ElencoServizi
    ElencoServizi uno-a-molti DettagliPresenze

    Il campo Prezzo in base a questo scenario va messo nella tabella DettagliPresenze.

    Se gradisci inserire "automaticamente" un Servizio con relativo Prezzo, bisogna implementare un'altra tabella Listini con i seguenti campi
    IDListino (numerazione automatica, chiave primaria)
    IDServizio (numerico)
    Prezzo
    Periodo o Anno (dipende da che periodicità sono previsti cambiamenti di prezzo nel tempo)

    poi nella tabella DettagliPresenze al posto del campo IDServizio, serve il campo IDListino.
    Relazioni:
    ElencoServizi.IDServizio uno-a-molti Listini.IDServizio
    Listini.IDListino uno-a-molti DettagliPresenze.IDListino
Devi accedere o registrarti per scrivere nel forum
11 risposte