Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1

    problemi con tabelle e campi di access 2007

    Salve,

    ho creato un database in access 2007 in cui c'è una tabella PERSONE che è formata dai seguenti attributi:

    id persona (contatore);
    nome (testo);
    cognome (testo);
    credito residuo (valuta);

    ho creato, poi, un'altra tabella ARTICOLI formata dai seguenti attributi:

    id articolo (contatore);
    articolo (testo);
    giacenza iniziale (numerico);
    giacenza istantanea (numerico);
    prezzo (valuta);

    ho creato infine, un'altra tabella MOVIMENTI formata dai seguenti attributi:

    id movimento (contatore);
    tipo movimento (carico o scarico);
    quantità (numerico);
    causale (acquisto, vendita);
    id articolo (numerico, chiave esterna della tabella ARTICOLI);
    id persona (numerico, chiave esterna della tabella PERSONE);

    la tabella PERSONE è collegata 1 a molti con la tabella MOVIMENTI;
    la tabella ARTICOLI è collegata 1 a molti con la tabella MOVIMENTI;

    ogni persona guadagna 2.35 al giorno, quindi alla mezzanotte, si dovrebbe incrementare il campo credito residuo della tabella PERSONE.

    Io pensavo di creare la relativa maschera per la tabella PERSONE e generare un evento nel campo credito residuo, ma non ho idea di quale tipo di evento generare. Forse potrei usare la funzione DMAX ma non so se faccia al caso mio.
    Penso infine che " l'evento " debba crearsi nella tabella, in modo da ripercuotersi nella maschera, ma come? Forse tra le proprietà devo scrivere qualcosa nella riga "valido se" ?

    Proseguendo, una persona compra degli articoli che hanno un prezzo, e quindi il credito residuo della tabella PERSONE deve scalarsi, quando questo avviene, della quantità relativa al prezzo dell'articolo.
    Questo può essere visto come un movimento(tabella MOVIMENTI) e quindi essere registrato come tale, quindi potrei generare un evento di tipo "SU INVIO" in cui all'inserimento di un nuovo movimento si scali, sia il credito residuo, che la giacenza istantanea della tabella ARTICOLI.

    Il linguaggio che potrei usare, penso che debba essere per forza il VBasic, ma io ho più dimestichezza con il linguaggio sql, sarebbe perciò, più facile per me, creare query o qualcosa di simile, per ovviare al problema.

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333

    Re: problemi con tabelle e campi di access 2007

    Stai usando dati rindondanti quindi sei gia in difficolta
    Originariamente inviato da mefisto_ax
    -----tabella PERSONE
    id persona (contatore);
    nome (testo);
    cognome (testo);
    credito residuo (valuta);
    A parer mio il campo "credito residuo" NON devi averlo
    lo sostituisci con la "DataDiInizio"
    -tu dici che ogni persona guadagno 2.35 al giorno quindi in una Vista (Query)ti calcoli
    {[ 2.35 x (DataAttuale - DataDiInizio)] + ( SommaAlgebrica Tabella MOVIMENTI )}
    e il risultato del calcolo diventa il "credito residuo" MA NON NELLA TABELLA

    Lo stesso discorso vale per il campo "giacenza istantanea" della tabella ARTICOLI

    __________________________________________________ ____________

    Quanto detto sopra non è sempre giusto ma dipende dalla situazione.

    Se si trattasse di una banca che deve calcolare il "credito residuo" della FIAT con 2000 movimenti al giorno dal 1925 ( quando è nata la FIAT ? ) allora certamente la tua impostazione sarebbe corretta in quanto il calcolo impiegherebbe delle ore

    Ma se si tratta di un piccolo DB in cui le query si eseguono comunque
    in pochi millisecondi allora ti conviene fare come ti ho consigliato io

    .

  3. #3

    credito residuo

    Grazie per avermi risposto;

    Io dovrei poter visualizzare il credito residuo ogni volta che accedo alla maschera OSPITI, quindi questa operazione dovrebbe andare avanti autonomamente, perché potrebbe anche darsi che io oggi non acquisto niente, ma voglio sapere quanto mi resta.

    Ti faccio poi una domanda stupida, come faccio a creare un nuovo campo partendo da una query ? Nel senso, tu mi dici di considerare DataDiInizio e operare su questo campo facendo le operazioni che mi hai gentilmente consigliato, ma il risultato dove lo metto ?
    "select DataDiInizio
    From Tabella Persone
    Where (la tua operazione?) cosa mi risulta?
    Non ho capito che significa + SommaAlgebrica tabella Movimenti

  4. #4
    ma i 2,35/giorno euro si applicano a tutti gli iscritti indipendentemente dalla loro attività?

  5. #5
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da mefisto_ax
    .... come faccio a creare un nuovo campo partendo da una query ?
    Nel senso, tu mi dici di considerare DataDiInizio ....., ma il risultato dove lo metto ?
    ......
    Non ho capito che significa + SommaAlgebrica tabella Movimenti
    SommaAlgebrica tabella Movimenti è un modo italiano ( non SQL ) per dirti di
    calcolare la:
    -- Somma del Prezzo degli Articoli (accuistati/venduti) x la Quantita

    __________________________________________________ ______________________

    In effetti la domanda di Optime è importante,
    se il 2.35 non e uguale per tutte le persone
    ( oppure se potrebbe cambiare nel tempo per la stessa persona )
    allora va considerato subito

    __________________________________________________ ______________________

    Comunque per rispondere alle domande,
    se tu hai queste 3 tabelle ( Che ho semplificato )


    ----- tabella PERSONE
    idP (contatore, KeyPrimaria)
    Nome (testo)
    DaIn (DataOra) La data di iscrizione/Inizio della Persona

    ----- tabella ARTICOLI
    idA (contatore, KeyPrimaria)
    Arti (testo)
    Prez (valuta)

    ------ tabella MOVIMENTI
    idM (contatore, KeyPrimaria)
    Quan (numerico)
    Casu (NotNull, Valori ammessi solamente "a" oppure "v" ( accuisto / Vendita))
    idAM (numerico, chiave esterna della tabella ARTICOLI.idA)
    idPM (numerico, chiave esterna della tabella PERSONE.idm)

    Con questa Vista riesci a calcolarti il CreditoResiduo di ogni persona
    Ti ho volutamente lasciato tutti i campi per renderla piu comprensibile
    codice:
    SELECT 
    PERSO.idP, 
    PERSO.Nome, 
    ((Date()-[PERSO].[DaIn])*2.35) AS CreRes1, 
    Sum(IIf([MOVIM].[Casu]="v",[MOVIM].[Quan]*[ARTIC].[Prez],0)+IIf([MOVIM].[Casu]="a",[MOVIM].[Quan]*[ARTIC].[Prez]*-1,0)) AS CreRes2, 
    [CreRes1]+[CreRes2] AS CreResTot
    FROM 
    PERSO 
    LEFT JOIN 
    (
    ARTIC 
    RIGHT JOIN 
    MOVIM 
    ON 
    ARTIC.idA = MOVIM.idAM
    ) 
    ON 
    PERSO.idP = MOVIM.idPM
    GROUP BY 
    PERSO.idP, 
    PERSO.Nome, 
    ((Date()-[PERSO].[DaIn])*2.35)
    ;

    Facci Sapere

    .

  6. #6

    ringraziamenti

    ti ringrazio infinitamente per quello che mi hai consigliato, hai centrato esattamente quello che volevo.

    Nella tabella Articoli, però, c'è anche una giacenza che dovrebbe decrementarsi all'acquisto di un bene. Non riesco a capire però come faccio a decrementare la giacenza.

    supponiamo di avere le stesse tabelle di prima.
    Creo un nuovo record nella tabella MOVIMENTI che ha come causale:vendita e vendo num. 2(quantità di MOVIMENTI) di questi articoli.
    Il credito residuo della persona si decrementa come tu mi hai fatto fare, ma la giacenza (attributo della tabella ARTICOLI) non si decrementa di 2.

    Stessa cosa se il movimento invece è un'acquisto che mi permette di ricaricare il mio articolo di una quantità uguale alla quantità acquistata. La giacenza della tabella ARTICOLI dovrebbe incrementarsi. Io ho provato così, ma c'è qualcosa che non va:

    select Articoli.Arti,Articoli.Giacenza,
    Sum(IIf([Movimenti].[Casu]="acquisto",[Movimenti].[Quan]+[Articoli].[Giacenza],0)+IIf([Movimenti].[Casu]="vendita",[Movimenti].[Quan]-[Articoli].[Giacenza]*-1,0)) AS GiacenzaTot

    Il mio problema è che ci sono tanti articoli e nella tabella, in base alle relazioni, compare ad ogni articolo il suo corrispondente movimento. Così invece credo che la query faccia un mix dei movimenti di acquisto e vendita di beni diversi e mi dia un solo numero come risultato.
    tra l'altro mi da un errore in cima dicendomi che non è possibile eseguire una query in cui Articoli.Arti non è un'espressione.

    Sei già stato preziosissimo per me grazie infinite.

  7. #7
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    devi usare lo stesso principio.

    se ho capito beme nella tabella "ARTIC" hai anche il campo GiIn ( Numerico )
    dove registri la giacenza iniziale di ogni articolo.

    Mentre il campo "GiacenzaIstantanea" NON lo devi mettere nella tabella
    perche viene calcolato dalla query
    ____________________________________________
    Per amor della chiarezza
    ----- tabella PERSO
    idP (contatore, KeyPrimaria)
    Nome (testo)
    DaIn (DataOra) La data di iscrizione/Inizio della Persona

    ----- tabella ARTIC
    idA (contatore, KeyPrimaria)
    Arti (testo)
    Prez (valuta)
    GiIn (Numerico) <--- Aggiunto

    ------ tabella MOVIM
    idM (contatore, KeyPrimaria)
    Quan (numerico)
    Casu (NotNull, Valori ammessi solamente "a" oppure "v" ( accuisto / Vendita))
    idAM (numerico, chiave esterna della tabella ARTICOLI.idA)
    idPM (numerico, chiave esterna della tabella PERSONE.idm)


    codice:
    SELECT 
    ARTIC.idA, 
    ARTIC.Arti, 
    ARTIC.GiIn, 
    Sum(IIf([MOVIM]![Casu]="v",[MOVIM]![Quan],0)+IIf([MOVIM]![Casu]="a",[MOVIM]![Quan]*-1,0)) AS SomMov, 
    Nz([GiIn],0)+[SomMov] AS GiIstan
    FROM 
    ARTIC 
    LEFT JOIN 
    MOVIM 
    ON 
    ARTIC.idA = MOVIM.idAM
    GROUP BY 
    ARTIC.idA, 
    ARTIC.Arti, 
    ARTIC.GiIn
    ;

    Una domanda difficile:
    Cosa succede se cambi il prezzo di un articolo ?????

    Prova a verificare i saldi delle PERSONE prima e dopo il cambio del prezzo

    .

  8. #8
    non capisco perché ricalcoliate i saldi e le giacenze partendo ogni volta da zero. ho accumulato un credito? il mio saldo aumenta. ho comprato qualcosa? il mio saldo diminuisce. è stato venduto un articolo? la giacenza diminuisce. è stato rifornito un pezzo? la giacenza risale. è certamente giusto memorizzare il singoli movimenti, ma i saldi e le giacenze vanno tenuti aggiornati!


  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da optime
    ... ma i saldi e le giacenze vanno tenuti aggiornati! ...
    Hai toccato un problema "filosofico",
    Tu dici che le giacenze vanno tenute aggiornate,
    ma a parer mio non c'è miglior aggiornamento che il "ricalcolo"
    istantaneo quando serve. ( senza salvare nulla in tabella )

    Del resto sono cosciente che ogniuno dei 2 metodi ha vantaggi e svantaggi

    A favore del salvataggio in tabella dei totali aggiornati
    --- Maggior rapidita nella esecuzione delle query
    --- Non esiste problema in caso di modifica dei prezzi dei singoli articoli
    ------ ( questo è un gran vantaggio )
    --- eccetera

    Contro il salvataggio in tabella dei totali aggiornati
    --- I dati sono rindondanti
    --- Il DB è denormalizzato
    --- Potremmo avere delle gravi incongruenze nei dati
    ------- ( salvo usare Trigger ma non disponibili in Access )
    --- Maggior peso del DB
    -- eccetera

    Ogni soluzione va valutata,
    ma io tendo per la seconda

    .

  10. #10
    fa' come vuoi. ma ricordati che potresti andare incontro a gravi problemi di performance se ogni volta devi stare a ricalcolare.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.