Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [access 2007] problemi query aggiornamento

    Salve,

    utilizzo access 2007 e ho creato un database così strutturato:

    tabella PERSONE
    idP (contatore, KeyPrimaria)
    Nome (testo)
    DaIn (DataOra) La data di iscrizione della Persone
    credmov (valuta)
    Credtemp (valuta)
    datagg (dataOra) la data di aggiornamento movimenti)

    tabella ARTICOLI
    idA (contatore, KeyPrimaria)
    Arti (testo)
    Gia (numerico)
    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)


    Il creditemp è un campo della tabella persone, che mi calcola l'incremento giornaliero del credito di ogni persona di 2.35 euro.
    Aggiorno questo campo con la seguente query di aggiornamento:
    codice:
    codice:
    UPDATE PERSONE 
    SET 
        PERSONE.Creditemp = Nz([Creditemp],0)+(((Int(Now()))-(Int([datagg])))*2.35), 
        PERSONE.datagg = Int(Now())
    WHERE 
        (((PERSONE.datagg)<>Int(Now())))
    Adesso vorrei capire se posso impostare un timer che esegua la query di aggiornamento, una volta al giorno, per esempio, ad un determinato orario.

    Dovrei anche impostare una query che mi aggiorni anche il credMov che praticamente è caratterizzato dai "movimenti" della "persona", che, ad ogni movimento che fa, acquista un oggetto e quindi modifica il suo credito.

    La stessa cosa dovrebbe potersi ottenere con lo scalo di gia(giacenza), ad ogni movimento(acquisto) di una persona.

    Potreste aiutarmi? grazie.

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da mefisto_ax
    Dovrei anche impostare una query che mi aggiorni anche il credMov che praticamente è caratterizzato dai "movimenti" della "persona", che, ad ogni movimento che fa, acquista un oggetto e quindi modifica il suo credito.
    La stessa cosa dovrebbe potersi ottenere con lo scalo di gia(giacenza), ad ogni movimento(acquisto) di una persona.
    Io farei cosi, (Cerco di essere dettagliato)

    Crea una maschera di nome "Mas1"
    ci metti dentro:

    --- CasellaCombinata per selezionare la persona
    - Nome "CCPer"
    - Numero Colonne 2
    - Larghezza colonne 4cm;1cm
    - Righe in elenco 60
    - Larghezza elenco 6
    - Colore Giallo
    - Origine riga "SELECT PERSONE.Nome, PERSONE.idP FROM PERSONE;" ( Senza virgolette )
    - Colonna associata 2

    --- CasellaCombinata per selezionare l'articolo
    - Nome "CCArti"
    - Numero Colonne 2
    - Larghezza colonne 4cm;1cm
    - Righe in elenco 60
    - Larghezza elenco 6
    - Colore Giallo
    - Origine riga "SELECT ARTICOLI.Arti, ARTICOLI.idA FROM ARTICOLI;" ( Senza virgolette )
    - Colonna associata 2

    --- Casella di testo per decidere se accuisto o vendita
    - Nome "TxAV"
    - Colore sfondo giallo
    - Valido se: "a" Or "v" ( ammette solo a oppure v )
    - Messaggio di errore "Scrivi a oppure v"

    --- Casella di testo per la Quantita movimentata
    - Nome "TxQu"
    - Colore sfondo giallo
    - Formato Standard
    - Posizioni decimali Automatiche

    --- Casella di Testo per lanciare la procedura
    - Nome "Gooooo"
    - Origine controllo: ="Go"
    - Colore Verde
    - SuClik: [Routine evento] ( questo dopo verifichi che ci sia ancora )


    ---- Nella maschera metti questo codice che:
    - Aggiunge un record alla tabella MOVIMENTI
    - Aggiorna la Giacenza articoli nella tabella ARTICOLI
    - Aggiorna il credito dei movimenti nella tabella PERSONE
    codice:
    Private Sub Gooooo_Click()
    
    If Nz(Me!CCPer.Value, "") = "" Or Nz(Me!CCArti, "") = "" Or Nz(Me!TxAV.Value, "") = "" Or Nz(Me!TxQu.Value, "") = "" Then
        MsgBox ("Alcuni valori non sono compilati")
        Exit Sub
    End If
    
    Dim Per As Integer
    Dim Art As Integer
    Dim AVe As String
    Dim Qua As Long
    Dim Pre As Long
    Per = Me!CCPer.Value
    Art = Me!CCArti.Value
    AVe = Me!TxAV.Value
    Qua = Me!TxQu.Value
    Pre = DLookup("ARTICOLI.Prez", "ARTICOLI", "ARTICOLI.idA=" & Art)
    
    Dim ssq As String
    
    ' INSERT la riga dei movimenti
    ssq = ""
    ssq = ssq & "INSERT INTO MOVIMENTI ( Quan, Casu, idAM, idPM ) "
    ssq = ssq & "SELECT " & Qua & " AS Quax, '" & AVe & "' AS Casx,  " & Art & "  AS Artx,  " & Per & "  AS Perx;"
        DBEngine(0)(0).Execute ssq
    
    ' Aggiorno la giacenza articoli
    ssq = ""
    ssq = ssq & "UPDATE ARTICOLI SET "
    ssq = ssq & "ARTICOLI.Gia = IIf('" & AVe & "'='a',(ARTICOLI.gia-" & Qua & "),(ARTICOLI.gia+" & Qua & ")) "
    ssq = ssq & "WHERE (((ARTICOLI.idA)=" & Art & "));"
        DBEngine(0)(0).Execute ssq
    
    '  Aggiorno il credito residuo movimenti
    ssq = ""
    ssq = ssq & "UPDATE PERSONE SET "
    ssq = ssq & "PERSONE.credimov = IIf('" & AVe & "'='a',(Nz(PERSONE.credimov)-(" & Qua & "*" & Pre & ")),(Nz(PERSONE.credimov)+(" & Qua & "*" & Pre & "))) "
    ssq = ssq & "WHERE (((PERSONE.idP)=" & Per & "));"
        DBEngine(0)(0).Execute ssq
    
    ssq = ""
    ssq = vbNullString
    
    Me!CCPer.Value = Null
    Me!CCArti.Value = Null
    Me!TxAV.Value = Null
    Me!TxQu.Value = Null
    
    End Sub
    e con questo dovrebbe gia finzionare tutto in modo minimale

    __________________________________________________ ____________________

    Poi se vuoi arricchire aggiungi una serie di caselle di testo che esprimono lo stato attuale del selezionato

    --- Per sapere il IdP della persona
    Nome: quello che vuoi
    Origine Controllo: =[Maschere]![Mas1]![CCPer]

    --- Per sapere DaIn della persona
    Nome: quello che vuoi
    Origine Controllo: =DLookUp("PERSONE.DaIn";"PERSONE";"PERSONE.idP=" & [Maschere]![Mas1]![CCPer])

    --- Per sapere credimov della persona
    Nome: TxCM
    Origine Controllo: =DLookUp("PERSONE.credimov";"PERSONE";"PERSONE.idP =" & [Maschere]![Mas1]![CCPer])

    --- Per sapere Creditemp della persona
    Nome: TxCT
    Origine Controllo: =DLookUp("PERSONE.Creditemp";"PERSONE";"PERSONE.id P=" & [Maschere]![Mas1]![CCPer])

    --- Per sapere CreditoTotale della persona
    Nome: Quello che vuoi
    Origine Controllo: =[TxCM]+[TxCT]

    --- Per sapere datagg della persona
    Nome: Quello che vuoi
    Origine Controllo: =DLookUp("PERSONE.datagg";"PERSONE";"PERSONE.idP=" & [Maschere]![Mas1]![CCPer])




    --- Per sapere IdA dell ARTICOLO
    Nome: Quello che vuoi
    Origine Controllo: =[Maschere]![Mas1]![CCArti]

    --- Per sapere la Gia dell ARTICOLO
    Nome: TxGia
    Origine Controllo: =DLookUp("ARTICOLI.Gia";"ARTICOLI";"ARTICOLI.idA=" & [Maschere]![Mas1]![CCArti])

    --- Per sapere la Prez dell ARTICOLO
    Nome: TxPr
    Origine Controllo: =DLookUp("ARTICOLI.Prez";"ARTICOLI";"ARTICOLI.idA= " & [Maschere]![Mas1]![CCArti])

    __________________________________________________ ____________________________________

    Se vuoi ulteriormente arricchire con lo stato futuro ( dopo il Movimento )

    --- Per sapere il credimov della persona
    Nome Quello che vuoi
    Origine Controllo: =[TxCM]+IIf([TxAV]="a";[TxPr]*[TxQu]*-1;[TxPr]*[TxQu])
    Colore: Arancione

    --- Per sapere il credito totale della persona
    Nome Quello che vuoi
    Origine Controllo: =[TxCM]+[TxCT]++IIf([TxAV]="a";[TxPr]*[TxQu]*-1;[TxPr]*[TxQu])
    Colore: Arancione

    --- Per sapere la Gia degli articoli
    Nome Quello che vuoi
    Origine Controllo: =[TxGia]+IIf([TxAV]="a";[TxQu]*-1;[TxQu])
    Colore: Arancione

    _______________________________________________

    NB; I colori te li ho specificati perla differenza qualitativa fra i controlli
    devi scrivere sui 4 Gialli e cliccare il Verde

    Facci Sapere
    .

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

    Re: [access 2007] problemi query aggiornamento

    Originariamente inviato da mefisto_ax
    Adesso vorrei capire se posso impostare un timer che esegua la query di aggiornamento, una volta al giorno, per esempio, ad un determinato orario.

    Io farei una Miniapplicazione specifica che alla apertura con la macro AutoExec
    ( Che si esegui automaticamente alla apertura )
    - Lancia la query
    - richiude tutto

    Dopo metti questo file nelle operazioni pianificate di Wundows

    __________________________________________________ _
    Un file di Access che contenga
    - Il collegamento alla sola tabella PERSONE
    - Una macro di nome "AutoExec"
    ---- EseguiCodice ---> AggCreTemp ()
    - Un modulo che contenga la funzione AggCreTemp ()
    codice:
    Public Function AggCreTemp()
    
    Dim ssq As String
    
    ssq = ""
    ssq = ssq & "UPDATE PERSONE SET "
    ssq = ssq & "PERSONE.Creditemp = Nz([Creditemp],0)+(((Date())-(Int([datagg])))*2.35), "
    ssq = ssq & "PERSONE.datagg = Date() "
    ssq = ssq & "WHERE "
    ssq = ssq & "(((PERSONE.datagg)<>Date()))"
    ssq = ssq & ";"
    
    DBEngine(0)(0).Execute ssq
    
    '  Aspetto che venga esegiuta la query
    DoEvents
    
    ssq = ""
    ssq = vbNullString
    
    Quit
    
    End Function
    Se vorrai aprire questo file senza eseguirlo dovrai
    farlo tenendo premuto il tasto "Maiusc"

    Non eseguirlo a cavallo della mezzanotte


    NB: Prova a valutare invece di eseguire la query non su Timer bensi
    alla apertura del programma




    .

  4. #4

    [access 2007] query di aggiornamento

    non mi funziona niente e non so neanche perché.

    Non si potrebbe creare una query di aggiornamento tipo:

    codice:
     update Persone set Persone.CredMov = 
    (2.35+(Date()-Persone.[Data arrivo])*2.35)+Sum(IIf([Movimenti].[Causale]="acquisto",[Movimenti].[Quantità]*[ArtB].[Prezzo],0)+IIf([Movimenti].[Causale]="vendita",[Movimenti].[Quantità]*[ArtB].[Prezzo]*-1,0))
    Questa non mi funziona perché mi dice impossibile eseguire una funzione in cui (2.35... espressa come una funzione di aggregazione(l'altra volta abbiamo risolto con group by, ma nelle query di aggiornamento si può usare e come?)

    Infine creare una maschera con i campi di "Persone" e un pulsante che, su clic apre la query di aggiornamento. Che ne dici?

    Per quanto riguarda la mini applicazione, non ho capito, devo fare un file access che abbai solo la tabella persone importata dal mio database?
    Scusami ma sono un poco duro di comprendonio.

    Grazie di tutto!!!

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

    Re: [access 2007] query di aggiornamento

    Originariamente inviato da mefisto_ax
    non mi funziona niente e non so neanche perché........
    Hai seguito pedestremente "passo passo" le istruzioni ( 1/8 h 22.05 )
    io ho appena riprovato e mi da il risultato
    Attento,
    -- Non ingannarti da quegli "#Errore" che leggi nei controlli ( è una demo )
    -- Compila i 4 controlli Gialli
    -- Clik su "Go"
    ----- Ti crea un record sui MOVIMENTI
    ----- Ti varia le Giacenze
    ----- Ti aggiorna i totali di Persona
    -- Tutto in silenzio ( magari non te ne accorgi )
    -- Dove hai incollato il codice che ho postato ???

    Originariamente inviato da mefisto_ax
    ........Non si potrebbe creare una query di aggiornamento tipo:........
    Questo è un altro approccio, ma quella query ( che non ho guardato nel dettaglio )
    ogni volta che la esegui ti ricalcola e riscrive TUTTI i totali in tabella
    è molto meglio riscrivere solamente i variati.
    Prova a ragionare come se tu avessi 3.000.000 di record e 1 solo totale da aggiornare


    Originariamente inviato da mefisto_ax
    Per quanto riguarda la mini applicazione, .......
    Un MiniFile indipendente che fa solo quel lavoro e lo metti nelle operazioni pianificate
    Deve aggiornare la Tabella PERSONE quindi ti serve un collegamento solamente a quella tabella


    .

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.