Newsgroup: it.comp.appl.access
Titolo: Record duplicati

Riformulo il mio quesito, visto che non lo ha capito
quasi nessuno sperando di essere più chiara:
Ho una tbl "proprieta" con 6 campi
1> id proprieta (chiave univoca,contatore)
2>codiceditta (duplicati ammessi, il valore è uguale ad un altra
tbl in cui codice scheda e una chiave numerica univoca)
3>comunecensuario (testo)
4>foglio (numerico)
5>mappale (numerico)
6> subalterno (testo)
Fin qui ci siamo?
vado ad riempire i miei campi tramite una
mask (mskproprieta)  associata ala tbl proprieta
Faccio un esempio:
idproprieta = 1
codiceditta = 1
comunecensuario = padova
foglio = 33
mappale = 16
subalterno = a *
* è possibile che questo campo venga lasciato vuoto
nel senso che non è un dato richiesto come i precedenti 3.
Qualè il problema?
Vorrei che l'operatore venisse avvisato quando
inserendo i dati si verificasse che
nei campi di cui al punto 3,4,5,6 i valori sono uguali a quelli
che sta per andare a salvare, se sceglie per il salvataggio
la routine che si andrà a creare deve prevedere che mi evidenzi
questi due record come record duplicati.
Antonio Biso mi ha suggerito di creare un camposi/no
nella tabella che servirà appunto per tenere nota dei record duplicati.
Credo di essere stata chiara, se così non fosse, sarò
ben lieta di integrare questo post.
--
Debora
P.S. x A.Cara  Adesso il quesito ti è più chiaro?

 ...
  Semplifico ancora:
  Tabella:
PROPRIETA
idProprieta (primary key)
codiceditta (foreing key)
campo1 (text)
campo2 (integer)
campo3 (text)
  Evento 'Prima di aggiornare' della maschera:
' OSS: Uso DAO, ma con poche modifiche
'      potresti utilizzare anche ADO
Dim rst As Recordset, str as String
   str = "SELECT * FROM PROPRIETA WHERE " _
       & "(campo1='" & campo1 & "') " _
       & "AND (campo2=" & campo2 & ") " _
       & "AND ((campo3='" & campo3 & "') " _
            & "OR (campo3 Is Null))"
   Set rst = CurrentDB.OpenRecordset(str, dbopensnapshot)
   With rst
      If Not (.EOF And .BOF) Then
    	    str = "Questi campi risultano duplicati:"
    	    Do Until .EOF
    	    	  str = str & vbCrLf & !idProprieta _
    	    	    	    	 & ", " & !codiceditta _
    	    	    	    	 & ", " & !campo1 _
    	    	    	    	 & ", " & !campo2 _
    	    	    	    	 & ", " & !campo3
    	       .MoveNext
    	    Loop
    	    MsgBox str, vbOkOnly Or vbExclamation, "Record duplicati!"
      End If
   End With
   rst.Close
   Set rst = Nothing
  Questo dovrebbe bastare. (...spero <:->).
  Ciao.
---------------------------------------
http:/
digilander.libero.it/SimonenomiS

 questi due record come record duplicati.
Al tentativo di salvataggio fai questo:
crit = "comunecensuario ='" & nuovocomune & "' AND foglio='"
crit = crit & nuovofoglio & "' AND mappale='" & nuovomappale
crit = crit & "' AND subalterno = '"
crit = crit & iif(isnull(nuovosubalterno),"-",nuovosubalterno)
crit = crit & "' AND campoSì/No = 0"
il criterio ti restituisce l'unico eventuale record duplicato ma mai
salvato. Perchè unico? Perchè, se ad un input precedente ho inserito un
altro duplicato, o l'ho salvato settando il campo Sì/No, o non l'ho salvato
set rst = currentdb.openrecordset(crit)
if rst .recordcount = 0 then
  'fai salvare ok!
  exit sub
end if
msg = "Attenzione, c'è un duplicato. Lo salvo?"
if risposta = NO then
  msg = "Nun te arrabbià! Ok, niente salvataggio!
  'elimina l'inserimento
else
  rst.edit
  rst.fields("CampoSì/No") = -1
  rst.update
end if
DEBORA!
ADESSO FUNZIONA!!!
Antonio

 ha scritto nel messaggio
news:JkEh9.5137$Hc7....@twister1.libero.it...

Creati una query chiamata Query1 che abbia il seguente codice SQL:
SELECT proprieta.*
FROM proprieta
WHERE
(((proprieta.comunecensuario)=[Forms]![mskproprieta]![comunecensuario]) AND
((proprieta.foglio)=[Forms]![mskproprieta]![foglio]) AND
((proprieta.mappale)=[Forms]![mskproprieta]![mappale]) AND
((proprieta.subalterno)=[Forms]![mskproprieta]![subalterno])) OR
(((proprieta.comunecensuario)=[Forms]![mskproprieta]![comunecensuario]) AND
((proprieta.foglio)=[Forms]![mskproprieta]![foglio]) AND
((proprieta.mappale)=[Forms]![mskproprieta]![mappale]) AND
((proprieta.subalterno) Is Null));
Creati una maschera chiamata mskDuplicati con visualizzazione a Maschere
continue che abbia come origine record Query1.
A fronte dell'evento "Prima di aggiornare" della maschera mskproprietà
genera il seguente codice VBA:
Private Sub Form_BeforeUpdate(Cancel As Integer)
        Dim IntNuovo As Integer, strTitolo As String
        Dim IntFinestraMsg As Integer, strMsg As String
        strTitolo = "Record doppio"
        strMsg = "Vuoi registrare ugualmente il nuovo record?"
        IntFinestraMsg = vbYesNo + vbQuestion
If Not IsNull(Me!subalterno) Then
    If DCount("*", "proprieta", "comunecensuario=" & _
        Chr$(34) & Me!comunecensuario & Chr$(34) & _
        " And foglio=" & Me!foglio & _
        " And mappale=" & Me!mappale & _
        " And subalterno=" & Chr$(34) & _
        Me!subalterno & Chr$(34)) = 0 Then Exit Sub
        IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
        If IntNuovo = vbYes Then
            DoCmd.OpenForm "mskDuplicati"
        Else
            Cancel = True
            Me.Undo
        End If
Else
    If DCount("*", "proprieta", "comunecensuario=" & _
        Chr$(34) & Me!comunecensuario & Chr$(34) & _
        " And foglio=" & Me!foglio & _
        " And mappale=" & Me!mappale & _
        " And IsNull(subalterno)") = 0 Then Exit Sub
        IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
        If IntNuovo = vbYes Then
            DoCmd.OpenForm "mskDuplicati"
        Else
            Cancel = True
            Me.Undo
        End If
End If
End Sub
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ben lieta di integrare questo post.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 record.
Non hai seguito tutta la telenovela.
Ad ogni elaborazione, se c'è un duplicato, deve decidere se validarlo. Alle
elaborazioni successive, il record duplicato e validato non deve essere più
considerato...
Antonio

 considerato...
    Bon. Manco mal.


 > > > "Roberto da casa" [...]:
All'apertura del 3d sono rimasta senza parole,
non credevo di trovare queste risposte.
Ringrazio tutti.
Lo so che mi avete risposto tutti
pur di liberarvi di questa palla (IO), vi devo aver
stressato davvero tanto! ;-PPPPPPPPPPPPPPPP
Adesso mi metto subito al lavoro.
Dovevo aggiungere una cosa,ma se lo faccio
come minimo, mi mangiate viva.
--
Debora

 come minimo, mi mangiate viva.
GNAM!
SLURP!
Antonio

 Debora



Sottovoce?
Ok ci provo: Al momento ho provato la tua soluzione,
in pratica è quello che volevo fare io (solo nei sogni),
però una volta che completo l'inserimento dei dati, si è
vero che mi avvisa quando inserisco un duplicato, ma poi
quando vado a fare le stampe non mi compare niente che
mi dice che quel record è un duplicato.
L'ideale sarebbe che al salvataggio mi validasse un campo si/no
che ho già previsto nella tbl.
Ora vado a provare l'altra soluzione.
--
Debora

   Questo dovrebbe bastare. (...spero <:->).
Ottimo, funziona perfettamente, ma come ho detto
a Roberto, manca la validazione di un campo si/no
che faccia da segnalibro, a ricordarmi nelle stampe
e nelle visualizzazioni che quel record è un duplicato.
--
Debora


Forse nella telenovela ti č sfuggito un
particolare. Anzi no, xkč me lo hai fatto
presente tu, ricordi quando dicesti che i record duplicati
non potevo escluderli xkč cmq potevano ripetersi in futuro?
Quindi vanno benissimo le soluziooni di Roberto e Simone,
devono solo essere integrate con una parte di codice che hai scritto tu.
Ossia validare i valori duplicati. Per duplicati intendo quello che era
gia presente nel Db e quello che sto inserendo e vado a salvare.
Al salvataggio quindi devo validare entrambi i record.
--
Debora

 ha scritto nel messaggio
news:LUHh9.5879$Av4.1...@twister2.libero.it...

Ti sconsiglio assolutamente di aggiungere un campo nella tabella proprietà
per flaggare i record doppi; sarebbe un campo calcolato ed è buona norma non
registrare mai in una tabella un campo calcolato (pensa che teatrino sarebbe
ogni volta che aggiungi o cancelli un record doppio); i campi calcolati sono
propri di una query.
Pertanto potresti calcolare il flag di record doppio in una query ed usare
tale query come origine record del tuo report.
Ma la cosa migliore e più elegante è inserire direttamente la segnalazione
in un controllo calcolato del report, che in questo caso tornerebbe ad avere
come origine record la tabella proprietà.
Quindi inserisci nel report, a destra di tutti i controlli associati ai
campi della tabella proprieta, una casella di testo non associata e nella
sua origine controllo scrivi:
=IIf(IsNull([subalterno]);IIf(DCount("*";"proprieta";"comunecensuario=" &
Chr$(34) & [comunecensuario] & Chr$(34) & " And foglio=" & [foglio] & " And
mappale=" & [mappale] & " And IsNull(subalterno)")>1;"Record doppio ";"
");IIf(DCount("*";"proprieta";"comunecensuario=" & Chr$(34) &
[comunecensuario] & Chr$(34) & " And foglio=" & [foglio] & " And mappale=" &
[mappale] & " And subalterno=" & Chr$(34) & [subalterno] &
Chr$(34))>1;"Record doppio ";" "))
Così eviterai qualsiasi problema inerente alla gestione del flag di record
doppio, se non nel report.
