Aggiornamento e modifica tabelle da maschera

di il
7 risposte

Aggiornamento e modifica tabelle da maschera

Salve a tutti,

sono un neofita di Access e sto strutturando un database per uso personale.

Alla chiusura della maschera frmCampagne (basata sulla tabella lkpCampagne, che contiene anche campi non presenti nella maschera) vorrei aggiornare la tabella lkpGestione:
  • aggiungendo i dati relativi ai record non presenti;
  • aggiornando i dati relativi ai record già presenti.
L'idea è la seguente:
  • creo il recordset rstCampagne, relativo alla maschera frmCampagne
  • vado al primo record
  • per ogni record:
  • controllo se esiste il record relativo nella tabella lkpGestione
  • - se non esiste, eseguo la query di accodamento
  • - se esiste, eseguo una query di modifica (che in questa fase non ho ancora scritto, sostituendola con un messaggio di avvertimento)
  • vado al record successivo, fino alla fine del recordset
Ho scritto il seguente codice (usando come suffisso del NomeCampo il nome della tabella di appartenenza, quindi IdGestione appartiene alla tabella lkpGestioni, DenominazioneCampagna appartiene alla tabella lkpCampagne, etc.):

Private Sub Form_Close()

Dim rstCampagne As DAO.Recordset
Dim intIdGestione As Integer
Dim sqlAggiunta As String
Dim strRisposta As String

Set rstCampagne = Me.Recordset
rstCampagne.MoveFirst

Do While Not rstCampagne.EOF
    intIdGestione = DCount("IdGestione", "lkpGestione", "CampagnaGestione = " & Me.IdCampagna)
    Select Case intIdGestione
        Case Is = 0 'Aggiunta
            sqlAggiunta = "INSERT INTO lkpGestione(CodiceGestione,IVAGestione,ClienteGestione,CampagnaGestione,TipoGestione,DataGestione,FaseGestione,MSISDNGestione,PianoGestione,CausaleGestione,ValoreGestione,FatturaGestione) " & _
                "VALUES (""" & Me.CodiceCampagna & _
                """,""" & Me.IVACampagna & _
                """,""" & Me.ClienteCampagna & _
                """,""" & Me.IdCampagna & _
                """,""" & """Campagna""" & _
                """,""" & Me.FineCampagna & _
                """,""" & 2 & _
                """,""" & Me.MSISDNCampagna & _
                """,""" & """ - """ & _
                """,""" & Me.DenominazioneCampagna & _
                """,""" & 0 & _
                """,""" & 20 & """)"
            CurrentDb.Execute sqlAggiunta
            rstCampagne.MoveNext
        Case Else 'Modifica
            strRisposta = MsgBox("Modifica ?", vbOKCancel)
                If strRisposta = vbCancel then
 			Exit Sub
                End If
                rstCampagne.MoveNext
    End Select
Loop

End Sub
La procedura va subito alla modifica (anche se nella tabella lkpGestioni non esiste un record relativo); nonostante abbia letto alcuni post sugli argomenti utilizzati, non riesco a capire dove sia l'errore (o gli errori)

Vi sarei molto grato se riusciste a chiarirmi le idee ...

7 Risposte

  • Re: Aggiornamento e modifica tabelle da maschera

    Commetti gravi confusioni tra il Recordset e la maschera, sono 2 oggetti completamente distinti...

    In ogni caso dovresti prendere una strada diversa...!
    Hai già il RS basato sulla Tabella [lkpCampagne] che è poi il Recordset di Maschera.
    Apri un secondo RS sulla Tabella [lkpGestione].

    Ora inizi un LOOP sul primo e cerchi nel 2° usando FindFirst la corrispondenza al Primo... se esiste vai in edit se non esiste in AddNew...
    
    Private Sub Form_Close()
    
    Dim rstCampagne As DAO.Recordset
    Dim rstGestione AS Dao.Recordset
    
    Set rstCampagne = Me.Recordset
    Set rstGestione = DbEngine(0)(0).OpenRecordset("lkpGestione")
    rstCampagne.MoveLast:rstCampagne.MoveFirst
    rstGestione.MoveFirst
    
    Do While Not rstCampagne.EOF
        rstGestione.FindFirst "CampagnaGestione = " & rstCampagne!IdCampagna
        If rstGestione.NoMatch then 
    	   rstGestione.AddNew
    	Else
    	   If MsgBox("Modifica ?", vbOKCancel)=vbCancel Then JumpNext
    	   rstGestione.Edit
    	End if
    	rstGestione!CodiceGestione=rstCampagne!CodiceCampagna
    	rstGestione!IVAGestione=rstCampagne!IVACampagna
    	rstGestione!ClienteGestione=rstCampagne!ClienteCampagna
    	' ecc... tutti i campi
    
    JumpNext:
        rstCampagne.MoveNext
    Loop
    
    rstCampagne.close
    rstGestione.close
    set rstCampagne=nothing
    set rstGestione=nothing
    End Sub
    Fai attenzione però che in questa logica manca c'è un grande assente ovvero la PK nella tabella [lkpGestione]... che nella tabella [lkpCampagna] è rappresentato da IdCampagna... quindi un domani non so come farai a riallineare i records...
    Mi spiego meglio se la PK della Tabella [lkpGestione], non la scrivi nella Tabella [lkpCampagna], non so come puoi pensare che le 2 PK siano allineate, quindi non so come puoi pensare che CERCANDOLA per fare Aggiunta o Modifica tu possa trovarla...

    In questo il mio codice non entra, si limilta solo a scrivere tecnicamente corretto quello che hai proposto tu, ma concettualmente ti ho esposto un dubbio tecnico su cui sarebbe bene tu confermassi.
  • Re: Aggiornamento e modifica tabelle da maschera

    Ciao Alex,
    grazie per la tempestiva risposta, che mi fornisce comunque uno spunto di approfondimento su argomenti che ancora non maneggio con la necessaria dimestichezza.

    Preciso meglio la struttura di questa porzione del database:

    La Tabella lkpGestione (PK IdGestione, con campo CampagnaGestione e campo AnaliticoGestione) deve raccogliere i dati (allocati in campi diversi) da:
    • Importazione da file Excel
    • tabella lkpCampagne (PK IdCampagna) ---> lkpGestione.CampagnaGestione = lkpCampagne.IdCampagna
    • tabella lkpAnalitici (PK IdAnalitico) ---> lkpGestione.AnaliticoGestione = lkpAnalitici.IdAnalitico
    Quindi, alla fine, esisterà un solo record (lkpGestione.IdGestione) per ogni IdCampagna o IdAnalitico

    Il codice oggetto della discussione verrà poi utilizzato anche per la parte riguardante l'aggiunta/modifica dei dati di lkpGestione da lkpAnalitici
  • Re: Aggiornamento e modifica tabelle da maschera

    Ok mi era sfuggita la scrittura della Chiave.
    Allora secondo me va bene come ti ho indicato.
  • Re: Aggiornamento e modifica tabelle da maschera

    Ho capito la logica del codice suggerito da Alex (più corretto e anche più elegante).

    Però il Debug, alla riga:
    rstGestione.FindFirst "CampagnaGestione = " & rstCampagne!IdCampagna
    indica l'errore
    3251 "Operazione non supportata per questo tipo di oggetto"
    e blocca l'esecuzione.

    Mi potete suggerire una possibile causa (ed, eventualmente, relativa soluzione)?
  • Re: Aggiornamento e modifica tabelle da maschera

    
    rstGestione.FindFirst "CampagnaGestione = " & rstCampagne("IdCampagna")
    
    Se parliamo di campo stringa servono anche i doppi apici ...
  • Re: Aggiornamento e modifica tabelle da maschera

    La sintassi è corretta se il campo esiste ed è numerico... quindi se non hai altri elementi devi provare a capire facendo Debug.
  • Re: Aggiornamento e modifica tabelle da maschera

    Confermo che il campo esiste ed è intero lungo (PK della tabella lkpCampagne) ...

    Proverò a scandagliare
Devi accedere o registrarti per scrivere nel forum
7 risposte