Record

di il
23 risposte

Record

Salve,
in una maschera ho due caselle text1 e text2 (formato numerico) nelle quali inserisco le letture del contatore gas mensilmente per calcolare poi la differenza.
Vorrei che nel mese successivo nella casella text2 venisse riportato automaticamente il valore precedente della text1 senza doverlo digitare.
Quale può essere la procedura più semplice per risolvere il problema?
Grazie

23 Risposte

  • Re: Record

    Access-mente parlando non ha senso concepire una tabella/maschera così.
    Sarebbe più giusto avere una tabella (con relativa maschera) LettureGas avente i seguenti campi:
    IDLettura (Contatore, chiave primaria)
    Data
    Lettura

    Poi occorre creare una query così:
    1) Crea una nuova query in visualizzazione struttura e importa la tabella LettureGas
    2) Trascina nella griglia tutti i campi (uno per uno). A IDLettura imposta Ordinamento Crescente
    3) Nella 4a colonna della griglia, in corrispondenza di Campo scrivi così:
    Differenza: [Lettura]-DLookUp("[Lettura]";"LettureGas";"[IDLettura]=" & [IDLettura]-1)
    4) Salva la query con nome
    5) Apri la query e vedrai tutti i valori corretti nell'ultima colonna

    A sinistra dei due-punti (:) ho scritto Differenza, si può scrivere qualcosaltro come intestazione di colonna.

    Piccoli inconvenienti a questa soluzione:
    A) I valori sul campo IDLettura devono essere tutti integralmente sequenziali (cioè non deve ad esempio mancare il 5 dalla sequenza 1,2,3,4,6,7,8......)
    B) Il valore sul primo record in corrispondenza di Differenza non appare.
  • Re: Record

    Fermo restando su ciò che ti ha suggerito osvaldo
    questa penso che potrebbe essere una soluzione ideale da impostare come origine di controllo sul campo per farti il calcolo =[campodifferenza]-[campo2]-[campo1]
  • Re: Record

    Grazie Osvaldo per la risposta,
    tuttavia non mi ritrovo.
    La tabella creata(sin dall'inizio) riporta i seguenti campi:
    ID(crescente)
    Letturagas1
    Letturagas2
    Diffgas
    e su questa tabella ho creato una query nella cui quinta colonna ho sistemato il codice che mi hai fornito(ovviamente con i miei nomi), aprendo la query nell'ultima colonna appare un -30?????? (letturagas1=30 letturagas2=29)
    Ho creato comunque la maschera dalla query ma il problema è sempre lo stesso, voglio che nel nuovo record nella casella di testo letturagas2 appaia 30 e così di seguito per ogni nuovo record.
    E' chiaro che al primo inserimento dati nella casella di cui sopra non apparirà nulla.....
    PS Anche le indicazioni di Markez ( che ringrazio) non mi portano lontano.
    Grazie e buona serata
  • Re: Record

    silene ha scritto:


    La tabella creata(sin dall'inizio) riporta i seguenti campi:
    ID(crescente)
    Letturagas1
    Letturagas2
    Diffgas
    E' proprio l'impostazione di partenza che è sbagliata. Le tabelle non si usano per fare calcoli.
    I campi Letturagas2 e Diffgas sono inutili, aggiungerei dannosi.
    Il tuo compito di utente è quello di inserire soltanto UNA volta la lettura (nel campo Lettura).
    Il campo Data può essere utile per completezza (se ti sta antipatico non lo mettere),
    l'ID contatore indispensabile per utilizzare la query successiva (quella che ho costruito io).
    La Differenza è un calcolo (opportunamente impostato) che deve occuparsene Access di fare. Siccome non si può fare direttamente nella tabella, una query serve a fare questo.
  • Re: Record

    Infatti il calcolo differenza viene fatto nella maschera ( poi memorizzato nella tabella).
    Nel report creato prendo il valore differenza e lo utilizzo per calcolare il consumo.
    Ma il problema rimane:passando al record successivo desidero che nella maschera automaticamente appaia nel secondo campo il valore che nel record precedente era nel primo campo.
    Ti chiedo(se non è troppo) di fare una prova per verificare....
    Saluti
  • Re: Record

    Mi sento forte di quello che ti ho detto, sia sulla struttura campi di tabella/maschera, in quanto logica base di Access. Sia sulla query che ho costruito e testato correttamente.
    Devi smembrare la tua tabella e ripensarla come ti ho detto io.
    Poi costruisci una maschera su questa nuova tabella per inserire UNA sola lettura per Data.

    Quello che tu vorresti sulla maschera, in tempo reale, subito dopo l'inserimento della Lettura, è la Differenza già calcolata. Prova a creare un campo indipendente sulla maschera e dentro scrivici questo:
    =[Lettura]-DLookUp("[Lettura]";"LettureGas";"[IDLettura]=" & [IDLettura]-1)
    L'ho appena testato e funziona.

    Sia chiaro che un campo così concepito non può essere aggiunto sulla tabella: è sbagliato concettualmente.
  • Re: Record

    Ciao Osvaldo,
    ho creato una casella di testo nella maschera inserendo nel controllo quanto suggerisci.
    Mi restituisce un valore improbabile.
    A questo punto rinuncio, mi tengo la maschera così com'è ed inserisco manualmente il valore della letturagas1 precedente nella casella di testo letturagas2. E tutto funziona.
    Peccato non lo credevo un problema si tosto.
    Grazie comunque e buona notte.
  • Re: Record

    Io spero di aver frainteso la domanda... perchè la risposta è banale...!

    Nella proprietà DEFAULTVALUE(Valore Predefinito) della Text scrivi la funzione DLAST(...) che va a chiamare l'ultimo valore immesso nella Tabella relativa al campo di cui vuoi il valore.

    Saluti
  • Re: Record

    silene ha scritto:


    ho creato una casella di testo nella maschera inserendo nel controllo quanto suggerisci.
    Mi restituisce un valore improbabile.
    Ma ti sei preoccupato di smontare la tua tabella/maschera, riorganizzare tutti i dati come ti ho detto e poi crei la casella di testo indipendente nella maschera?

    IDLettura | Data | Lettura
    1 | 10/1/2012 | 10
    2 | 12/2/2012 | 33
    3 | 9/3/2012 | 41
    4 | 15/4/2012 | 55
    5 | 10/5/2012 | 60
    6 | 11/6/2012 | 68

    Questa deve essere la tua tabella LettureGas. Nè un campo di più, nè un campo di meno. La maschera idem con in più il campo indipendente Differenza con la sintassi che avevo scritto (quella con = davanti). Come puoi notare, il valore 33 (Lettura) non deve apparire, nè essere inserito, più di una volta (a meno che non sei andato un mese in vacanza e non hai consumato gas), tutto il resto ci pensa il campo Differenza.
    Ripeto è importantissimo che IDLettura abbia valori Crescenti e non deve mancare alcun numero progressivo, altrimenti quella sintassi nel campo indipendente non funziona. Anzi, ti consiglio di impostare sulla maschera, la proprietà Ordina per: IDLettura, così sei sempre sicuro che la maschera è ordinata su quel campo e non su altri, anche questo è indispensabile per la riuscita della formula nel campo Differenza.
    Io ho ricostruito tutto da zero, testato e funziona.
  • Re: Record

    Ciao Osvaldo,
    avevo pensato di chiudere la discussione ma la cosa mi appassiona, pertanto....
    Nel DB non metto le date perchè non sono essenziali, mi basta il periodo di lettura.
    I miei campi sono ID letturagasnew letturagasold diffgas e vorrei che nella maschera ad ogni nuovo record appaia il seguente( come esempio):
    ID letturagasnew letturagasold diffgas
    1 4000 3000 1000
    2 4800 4000 800
    3 5000 4800 200
    .. .... ... .....
    Ho provato tutti i suggerimenti ma niente...
    Ho provato, adattandola, la seguente funzione pubblica sulla maschera ma inutilmente....
    Function LeggiLetturaPrec(ByVal Id As Variant)
    Dim strSql As String
    Dim rs As Object
    If IsNull(Id) Then
    LeggiLetturaPrec = 0
    Exit Function
    End If
    strSql = "Select Top 1 Lettura " & _
    "From Gestionecopie " & _
    "Where IdCopie<" & Id & " " & _
    "Order By IdCopie Desc"

    Set rs = CurrentDb.OpenRecordset(strSql)
    If rs.EOF = False Then
    LeggiLetturaPrec = rs!Lettura
    Else
    LeggiLetturaPrec = 0
    End If
    rs.Close
    Set rs = Nothing
    End function
  • Re: Record

    Buona giornata, silene;
    pensavo di non intervenire, ma visto che la cosa Ti appasiona, Ti propongo un'alternativa alla soluzione di Osvaldo, che peraltro mi sembrava assolutamente adeguata.

    Considerando che la Tua necessità è quella di avere in maschera tutti i campi da Te indicati, nella "Tabella", che ho chiamato "Letture", mantieni pure tutti i Tuoi campi.
    Struttura la Query in questo modo:
    Campo ----------Tabella
    ID ----------------Letture
    letturagasnew --Letture
    diffgas: [letturagasnew]-DLookUp("[letturagasnew]";"Letture";"[ID]=" & [ID]-1)
    letturagasold: [letturagasnew]-[diffgas]

    Premetto che l'ho testata, mi pare rispetti le Tue esigenze.

    Costruisci la Tua maschera su questa Query.
    Anche se non è necessario ho dichiarato i campi [Id], [letturagasold] e [diffgas]:
    Abilitato ..... No
    Bloccato ..... Si

    In realtà avrei preferito utilizzare:
    Valore predefinito ... DLast (...)
    Ma non sono riuscito a trovare la quadra; ho provato con DLast(espr, dominio[, criteri])
    ma, per il momento, la funzione non ne vuol sapere di funzionare. Con più calma cercherò di capire il perchè.

    Spero di essere stato esaustivo.

    Cordiali saluti e buon fine settimana.

    Giuseppe
  • Re: Record

    Scusa Silene, ma hai visto quanto è inutilmente lungo tutto il tuo tracciato in codice (non ci capisco niente)?
    Tu hai dei campi letturagasnew e letturagasold che sono ridondanti. Access non ha bisogno di sentirsi ripetere un valore del genere, se lo va a pescare da solo e se la calcola da solo la differenza. Leggevo da qualche parte una specie di filosofia generale dell'informatica che in sostanza dice che il computer, finchè può fare tutto lui, che così sia.
    Mi sta pure bene che non ti interessa il campo Data, ma scommetto che
    NON HAI MAI PROVATO LA SOLUZIONE CHE HO PROPOSTO IO.
    Ma non vedi che con una più semplice istruzione tutto gira a meraviglia? Se vuoi ti spiego il significato:

    =[Lettura]-DLookUp("[Lettura]";"LettureGas";"[IDLettura]=" & [IDLettura]-1)
    = è un segno obbligatorio
    [Lettura] significa prendi il valore corrente dal campo Lettura
    - (meno) tutto quel casino che sta scritto dopo che significa:
    DLookUp significa vai a prendere il valore da
    1° campo: dal campo [Lettura]
    2° campo: della tabella "LettureGas"
    3° campo: che sta nella posizione corrente di IDLettura diminuito di 1 (confesso che la sintassi non l'ho capita nemmeno io, ma l'ho rubata da un sito dove ho trovato una citazione pertinente a questo problema)

    Ti dico che FUNZIONA!!!

    Ho capito che non ti va di smembrare tabella, maschera e tutto quello che hai già digitato fino ad ora. Invece un bel campo Data ti aiuterebbe proprio in questo: a recuperare tutti i valori in corrispondenza di questo o quel mese.
    OK, non distruggere tutto il tuo lavoro, ma prova per lo meno a ricopiarlo nella struttura che ti ho proposto e guarda il risultato finale. Il discorso iniziale sulla query non serve più, come vedi te la puoi cavare con un semplice campo indipendente nella maschera.

    Sulla scia di quello che ho detto, mi è venuta un'altra idea, molto più vicina al tuo quadro mentale: forse tu volevi vedere nella maschera, in un solo colpo d'occhio LetturaGasOld, LetturaGasNew e Differenza. Allora, fermi restando i campi della tabella (con un solo LetturaGasNew e senza Differenza), nella maschera devi creare 2 campi indipendenti:
    1) crea un campo indipendente LetturaGasOld e scrivici dentro
    =DLookUp("[Lettura]";"LettureGas";"[IDLettura]=" & [IDLettura]-1)
    salva questo campo ponendo la Proprietà
    Nome elemento: LetturaGasOld
    2) crea un altro campo indipendente Differenza e scrivici dentro
    =[LetturaGasNew]-[LetturaGasOld]
    salva questo campo ponendo la Proprietà
    Nome elemento: Differenza

    L'ho testato e funziona. Questo quadro mi sembra molto vicino a te. Sia chiaro però che, mentre stai digitando in maschera il LetturaGasNew, potrai vedere aggiornarsi i campi LetturaGasOld e Differenza soltanto dopo essere uscito dal campo LetturaGasNew.
    Che ne dici?
  • Re: Record

    Mamma mia qui ho da lavorare parecchio!
    Vi ringrazio comunque.
    Poi vi saprò dire ...vostra pazienza permettendo.
    Buon fine settimana
  • Re: Record

    OPERAZIONE RIUSCITA!
    Premessa per Osvaldo: la tua soluzione è stata da me provata ma con interpretazione non evidentemente corretta dal momento che non girava.
    Di conseguenza ho eliminato il DB e ne ho creati due seguendo rispettivamente le tue indicazioni e quelle di GiuseppeMN aggiungendo anche campi simili ma riferiti alla Luce.
    Risultato: i due data base funzionano perfettamente (in entrambi i campi si aggiornano all'uscita dal campoLetturagasnew /letturalucenew).
    Ora vedrò quale scegliere ma sin d'ora vi ringrazio entrambi per la competenza dimostrata. Grazie.
    Per il discorso sul DLast mi pare che esso funzioni ma sull'identico campo del record successivo.
    Ma non è finita.
    Poichè ho aggiunto alla query una nuova tabella succede che la maschera non è più editabile.Che bisogna fare?
    Buona serata

    PS poichè devo produrre l'elemento cartaceo ho pensato di stampare direttamente la maschera senza ricorrere ad un report( cosa,pare, non molto semplice nel mio caso)
Devi accedere o registrarti per scrivere nel forum
23 risposte