Query di aggiornamento su condizione

di il
14 risposte

Query di aggiornamento su condizione

Buongiorno
Premetto di essere neofita, proveniente da workbook pesantemente automaizzati con vba.
Access è un mondo nuovo e il mio cervello ormai è assuefatto al vba per excel, quindi un pò lantano da access.
Il mio problema è questo. Ho 3 tabelle (ANAGRAFICA, MOV_EST) schematizzate in questo modo
LETTERE ANAGRAFICA MOV_EST
ID_LETTERA ID_LETTERA ID_LETTERA
LETTERA VERBALE VERBALE
ESITO_INT ESITO_EST
ESITO_COMP

Gli utenti inseriranno tramite un maschera una lettera contenente un elenco di verbali (campioni) che possono subire vari destini: possono essere esitati internamente (esito_int, IRR, REG), o esternamente (esito_est, IRR, REG), o entrambi. In tutti i casi deve essere definito un esito complessivo (ESITO_COMP, REG, IRR). Ho sviluppato due query di aggiornamento per compilare in modo automatico ESITO_COMP senza l'intervento esterno. La prima da utilizzare se il campione è chiuso solo internamente (non è presente nella tabella MOV_EST)). La seconda aggiorna ESITO_COMP solo se c'è almeno un corrispondenza ID_LETTERA VERBALE fra le tabelle ANAGRAFICA e MOV_EST, e ESITO_EST e ESITO_INT sono compilati.
Ora il mio problema è che voglio creare un unico pulsante che permetta all'utente di definire l'ESITO_COMP, indipendentemente che ci sia stato o meno una movimentazione esterna, a patto di avere gli esiti parziali ( se ci sono) debitamente compilati.
Si possono "concatenare" i risultati delle query con IF then else?
Oppure mi conviene scrivere un codice vba per lavorare sui fogli dati delle maschere?
saluti e grazie per la pazienza.

14 Risposte

  • Re: Query di aggiornamento su condizione

    bfrom ha scritto:


    Ho 3 tabelle (ANAGRAFICA, MOV_EST)
    che sono 2, manca una tabella che presumibilmente è LETTERE
    Usa i tag code quando scrivi quelle cose (il simbolo </> sulla barra di formattazione del messaggio)
    LETTERE------------ANAGRAFICA-----------MOV_EST
    ID_LETTERA         ID_LETTERA           ID_LETTERA
    LETTERA            VERBALE              VERBALE
                       ESITO_INT            ESITO_EST
                       ESITO_COMP
    altrimenti la spaziatura e gli allineamenti sballano e non si capisce nulla. Spero di avere ricostruito giusto.
    Alla prossima puntata entrare nel merito, porta pazienza.
  • Re: Query di aggiornamento su condizione

    Grazie no avevo idea. Hai ricostruito tutto in maniera impeccabile
  • Re: Query di aggiornamento su condizione

    È possibile allegare il db? E' comunque in forma molto embrionale. Ma potrebbe essere più semplice darmi una risposta
  • Re: Query di aggiornamento su condizione

    bfrom ha scritto:


    è possibile allegare il db? E' comunque in forma molto embrionale. Ma potrebbe essere più semplice darmi una risposta
    Non è nello spirito del forum che è pensato appositamente per "discutere" dei problemi.

    Io, sebbene Philcattivocarattere avrebbe esplicitato meglio le 3 tabelle, continuo a non capire le relazioni.

    bfrom ha scritto:


    Gli utenti inseriranno tramite un maschera una lettera contenente un elenco di verbali (campioni) che possono subire vari destini
    Arabo per me questa descrizione. Provo a raccontarla a parole mie:
    1. Una maschera singola compila una Lettera.
    2. Da una Lettera dovrebbero poi derivare molti Verbali.
    3. Sui Destini...cado nel vorticoso inferno dantesco...
  • Re: Query di aggiornamento su condizione

    Hai ragione. Per me è davvero un inferno dantesco. Excel è un foglio di calcolo con dati netti. Access è completamente diverso e non è facile passare da excel a access e viceversa. Perciò portate pazienza.
    Allora
    1) una maschera inserisce una "lettera" in una tabella (LETTERE): in questa lettera che ha un suo identificativo a cui mi rifaccio sempre, sono descritti campioni.
    2)una seconda maschera si inserisce la descrizione dei campioni in un'altra tabella (ANAGRAFICA). In questa tabella oltre una serie di campi qui irrilevanti c'è un esito interno (R, IRR) e un esito complessivo (R, IRR)
    3) uno o più campioni di questa lettera possono essere analizzati da altri enti. In MOV_EST c'è sempre un richiamo alla lettera e i verbali in essa contenuti, che possono avere da zero a n movimenti in esterno ciascuno. Per ciascun movimento c'è sempre un esito esterno (R, IRR).
    Esito interno ed esito esterno ( se ce ne è) di ciascun verbale vengono congiunti nell'esito complessivo per quel verbale. Nello specifico se anche uno degli esiti è IRR allora l'esito complessivo sarà IRR, altrimenti R.
    Ho bisogno di creare un "qualcosa", che capisca se per quel verbale c'è un movimento esterno, se nel caso tutti gli esiti siano compilati, e a questo punto definire l'esito complessivo. Possibilmente per tutti i campioni della lettera o anche uno per volta.
    saluti
  • Re: Query di aggiornamento su condizione

    Le 3 tabelle LETTERE, ANAGRAFICA, MOV_EST hanno tutte un campo IDLettera. Se Lettere.IDLettera (immagino) sarà il campo chiave primaria, nelle altre due dovrebbero essere chiave esterna: giusto?
    E poi hai le relazioni:
    Lettere.IDLettera uno-a-molti Anagrafica.IDLettera
    Lettere.IDLettera uno-a-molti MOV_EST.IDLettera
    Giusto?
    Scusami, sono abituato a manipolare nomi-tabelle preferibilmente al PLURALE ===> ANAGRAFICA e MOV_EST non lo sono e mi depistano le idee!!!
    Poi vedo 2 campi Verbale in 2 tabelle diverse. Perchè?
  • Re: Query di aggiornamento su condizione

    Tutto esatto
  • Re: Query di aggiornamento su condizione

    Non rispondi a questa domanda

    OsvaldoLaviosa ha scritto:


    Poi vedo 2 campi Verbale in 2 tabelle diverse. Perchè?
    Poi (chi ti scrive è il più duro di comprendonio di tutto il forum) io ho bisogno di vedere 3 recordset SIGNIFICATIVI di dati per capire se hai normalizzato correttamente. Io non conosco il tuo campo professionale e quei nomi di campi non mi dicono nulla.
  • Re: Query di aggiornamento su condizione

    Aiutooooo. Cosa è un recordset? Normalizzato?
    Scusami ma sono proprio alle prime armi.
    Io lavoro come chimico e visto che so smanettare con il computer.... mi hanno dato questo incarico.
    Vediamo se riesco a spiegarmi. I campioni arrivano in laboratorio accompagnati da una lettera e sono identificati da un numero di verbale. Li analizziamo e diamo un esito di regolarità o irregolarità. Lo stesso campione può essere inviato ad uno o più enti esterni specializzati in analisi molto complesse che a loro volta definiranno un esito di regolarità o irregolarità. Visto che un campione può avere più movimenti esterni e più esiti ad essi collegati ho pensato di creare un'altra tabella (MOV_EST) dove vado mettere, il verbale legato a quella lettera ID_lettera, il movimento all'ente preposto e l'esito. Il motivo per cui metto verbale nelle tabelle Anagrafica e MOV_EST è perchè il numero di verbale non è univoco. Più uffici con lettere diverse, possono mandare lo stesso numero di verbale. Associando ID_LETTERA con VERVALE riesco a differenziare i campioni.
    Spero di essere stato esaustivo. Quanto a recordset e normalizzazione ho bisogno di un corso accelerato se potete farmelo o altrimenti mi farò una cultura on line. Ho la vaga impressione che per i prossimi sviluppi del database avrò bisogno di ampliare le scarse conoscenze ch mi hanno dato in ufficio.
  • Re: Query di aggiornamento su condizione

    Non sono sicuro al 100%, ma quasi sempre ci azzecco. Secondo me il database NON è normalizzato e manca (credo) di altre tabelle. Non ti spaventare, ci imbattiamo spesso in discussioni che partono (in 4a) per un verso, ma mancano di elementi di base (la normalizzazione può essere uno di questi) che impediscono il sano sviluppo. A ciò aggiungerei che occorre anche mettersi nei panni di chi non è del "tuo" campo professionale e non può conoscere come funziona l'iter tecnico/burocratico di lettere--->campioni--->verbali--->enti--->ecc...Devi descrivere tutto chiaramente (ripeto "per non adetti ai tuoi lavori")
    Miei consigli:
    - studia un po' di normalizzazione di base, quella PRATICA, non quella che potresti trovare in forma "teorica", barbosa e incomprensibile
    - quando apri una discussione devi essere chiaro su nomi propri di tabelle, loro campi, loro significati e tipo dati (testo, numerico, data...)
    - se proprio non ti sei ancora raccapezzato, prova ad aprire una nuova discussione nella sezione "Progettazione database", descrivi tutto dettagliatamente come nel punto precedente da me indicato

    P.S.:
    1. La NORMALIZZAZIONE è l'insieme di regole che stabiliscono una corretta correlazione tra tabelle. Tutti i programmatori di Access (ma anche di altre applicazioni che trattano database) sono abituati a ragionare in questi termini.
    Non occorre studiarla teoricamente (quasi impossibile, anche il sottoscritto non ci ha mai capito nulla), ma basta lasciarsi guidare dal "buon senso". 3 forme normali è sufficiente conoscere.
    2. RECORDSET è una lista di dati, scritta per esempio così:
    tabella Nominativi:
    IDNominativo | Cognome | Nome |Indirizzo
    1 | Laviosa | Osvaldo | Via Bari 10
    2 | Pallino | Pinco | Corso Umberto I 22
    3 | Rossi | Mario | Via Togliatti 13
    ..........................................
  • Re: Query di aggiornamento su condizione

    Se si tratta di prendere e passare verbali qua e la è un conto, ma se invece si tratta di eseguire analisi, validare dati e creare dei rapporti di prova d'analisi, allora ti dico che l'incarico che ti hanno affidato è particolarmente complesso ma non impossibile, a patto però di costruirsi un bagaglio culturale adeguato per progettare un DB relazionale coerente e robusto. Posso esserti d'aiuto con lo schema relazionale che ti allego sotto:
    Si tratta dell'estratto (in realtà molto più complesso) di un sistema relazionale che ho creato per la gestione di un laboratorio chimico. Concentrati sui campi che presentano un significato a te familiare (dato che sei un chimico) per prendere spunto e adattarlo al tuo caso. Ovviamente ci saranno poi da creare un bel pò di query.
    Allegati:
    26735_f0a74463799fee335dfee922e3f98d0c.png
    26735_f0a74463799fee335dfee922e3f98d0c.png
  • Re: Query di aggiornamento su condizione

    Per ora si stratta solo di spostare verbali qua e là, creare delle lettere in word, e poco altro. Questo che vi ho chiesto oggi è il primo scoglio che ho incontrato. Il vero problema è che ancora non sono riuscito a fare il salto da excel ad access. In excel ho sempre ragionato su schemi definiti praticamente lineari a due dimensioni che portano ad unico risultato presente in una cella ben definita. In access le dimensioni cambiano drasticamente e anche cercare un singolo risultato può essere estenuante. In excel avrei cercato in un foglio se c'è il movimento esterno, il suo esito e con una formula di tipo se avrei collegato tutto. Ora invece non so come funziona il vba, non so scorrere i recordset, o i foglio dati di una sotto maschera. Scusate lo sfogo.
    Ora tornando al problema se ho capito bene il risultato di una query è un recordset, non un valore singolo. Come faccio a creare via vba un recordset a partire da una query?. Ho creato 3 query che funzionano benissimo da sole e ora devo unirle secondo uno schema if then endif. Nello specifico
  • Re: Query di aggiornamento su condizione

    Gli ultimi 2 post hanno argomentazioni radicalmente diverse dal titolo iniziale. Mi pare evidente che il problema è alla base (normalizzazione). Per tanto suggerisco a bfrom di aprire una nuova discussione nella sezione "Progettazione database".
    Nel frattempo ho fatto anche una segnalazione ai moderatori.
  • Re: Query di aggiornamento su condizione

    Allora ragazzi.
    Grazie per la segnalazione di recordset e normalizzazione. MI sono fatto una cultura e facendo un pò di modifiche e creandomi due recordset parametrati opportunamente sono riuscito a raggiungere il mio obbiettivo. Perciò per me la discussione è chiusa.
    Questo è il codice
    Private Sub EsitoComplessivo_Click()
        Dim db As Database
        Dim rsint As DAO.Recordset
        Dim rsest As DAO.Recordset
        Dim verb As String
        Dim esest As Long
        Set db = CurrentDb
        'IdUff, idverb, idprot, idua, iduser,ID_LETTERA, VERBALE, ID_UFFICIO, ID_UA, EsitoInterno, EsitoComplessivo
        RicercaAnagEsiti = "Select ID_LETTERA, VERBALE, ID_UFFICIO, ID_UA, EsitoInterno, EsitoComplessivo from ANAGRAFICA Where ID_LETTERA= " & idprot & "AND ID_UA= " & idua & "AND ID_UFFICIO= " & IdUff 'creo query su anagrafica per cercare
        Set rsint = CurrentDb.OpenRecordset(RicercaAnagEsiti, dbOpenDynaset, dbSeeChanges) 'chiamo la query dell'anagrafica filtrata sulla lettera
        RicercaMovEstEsiti = "Select ID_LETTERA, VERBALE, EsitoEsterno from MovimentoEsterno Where ID_LETTERA= " & idprot  'creo query su anagrafica per cercare movimenti eseterni filtrati sulla lettera
        Set rsest = CurrentDb.OpenRecordset(RicercaMovEstEsiti, dbOpenDynaset, dbSeeChanges) 'chiamo la query del movimento esterno filtrata sulla lettera
        Do While Not rsint.EOF 'ciclo su anagrafica per trovare i non esitati
            esint = rsint("EsitoInterno") 'valuto inserimento esito interno
            If IsNull(esint) = True Then GoTo 5 'se è nullo passo al prossimo record
            escomp = rsint("EsitoComplessivo") 'valuto inserimento esito complessivo
            If IsNull(escomp) = True Then  'verifico che non è esitato
                verbint = rsint("VERBALE") 'dichiaro il verbale che cerco
                esest = 1
                If IsNull(rsest.RecordCount) Then GoTo 6
                Do While Not rsest.EOF 'ciclo su movest per trovare i movimenti
                    verbest = rsest("VERBALE") 'dichiaro il verbale trovato
                    If verbest = verbint Then 'se c'è un movimento per quel verbale
                        esesterno = rsest("EsitoEsterno")
                        If IsNull(esesterno) = True Then 'se non è esitato
                            GoTo 5 'allora esci dal ciclo e vai al prossimo campione
                        End If
                        If esesterno = "IRREGOLARE" Then 'se è irregolare
                            esest = esest * -1
                        End If
                        If esesterno = "REGOLARE" Then 'se è irregolare
                            esest = esest * 1
                        End If
                    End If
                    rsest.MoveNext 'cerco altri movimenti esterni per quel verbale
                Loop 'fine ciclo esterni
            End If 'fine esito movimentoesteno
    6
            If esint = "REGOLARE" And esest = 1 Then 'SE è TUTTO POSITIVO REGOLARE
                rsint.Edit
                rsint("EsitoComplessivo") = "REGOLARE"
                rsint.Update
            End If
            If esint = "IRREGOLARE" And esest = 1 Then 'ALTRIMENTI IRREGOLARE
                rsint.Edit
                rsint("EsitoComplessivo") = "IRREGOLARE"
                rsint.Update
            End If
            If esint = "IRREGOLARE" And esest = -1 Then 'ALTRIMENTI IRREGOLARE
                rsint.Edit
                rsint("EsitoComplessivo") = "IRREGOLARE"
                rsint.Update
            End If
    5
            rsint.MoveNext
        Loop 'fine ciclo interni
    End Sub
    saluti e buone feste
Devi accedere o registrarti per scrivere nel forum
14 risposte