Newsgroup: it.comp.lang.visual-basic
Titolo: Numero record doppi

Ciao a tutti.Ho aperto un nuovo post perchè la domanda è diversa ma
per chi volesse avere idea completa il post precedente era
http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/99ba9459d75d186f/90553b631a0fd05d?hl=it&lnk=raot#90553b631a0fd05d
Ricapitolo brevemente: Gestione database mdb con VB6 (accesso DAO,
dbgrid + form scheda/inserimento dati).
Il problema era quello di scegliere, nel caso ci fosse un nominativo
già esistente (Cognome e Nome), se continuare con l'inserimento del
dato, o non inserirlo.
Sono riuscito ad impostare un criterio che funziona (quando annullo fa
ciò che deve) ma ha un problema: il messaggio di avviso "contatto
esistente" viene visualizzato sempre (sia con contatto realmente
esistente che con uno nuovo).
Questo perchè la soluzione da super principiante che ho trovato è più
che altro un atrificio che posso permettermi perchè la rubrica non va
in rete ma per ora verrà usata come stand alone che possa girare anche
su penna usb, per tenere in ordine e a portata di mano i contatti di
lavoro anche quando sono in giro.
Funziona così:
Pulsante aggiungi ...cambia caption e diventa annulla...il form di
inserimento viene svuotato e posso inserire i dati...controllo campi
obbligatori...se ok premo salva... a questo punto c'è il controllo
duplicati.
ciò che avviene è che il comando salva va a " validate " e poi
aggiunge di fatto il record. se non confermo il salva o dal controllo
duplicati scelgo no, la sub cancella l'ultimo record che è stato
appena inserito e tutto funziona (anche se non credo sia da nobel)!:)
Il fatto è che fa il controllo duplicati quando ha già inserito il
record, quindi anche se nuovo, lo trova!
Ho pensato che potrei visualizzare il messaggio se la ricerca mi da un
numero di record uguali presenti >1.
Non so però come e se si possa fare. Se qualcuno ha idee..
Per completezza questo è il codice della parte in oggetto
Private Sub cmdsalva_Click()
 'CONTROLLO INSERIMENTO NOME E COGNOME
If Trim(Text2.Text) = "" Or Trim(Text3.Text) = "" Then
  MsgBox "Inserire Cognome e Nome.", vbOKOnly + vbCritical, "Nessun
Nome inserito"
  Exit Sub
End If
 'Controllo duplicati
Dim Rispcontr As Integer
 ------------------------------------------------------------ordsql =
"select * from Foglio1 order by Cognome, Nome"
 ------------------------------------------------------------
Data1.RecordSource = ordsql
 newcogn = DoppioApice(Text2.Text)
 newnome = Text3.Text
criterio = "Cognome = '" & newcogn & "' And Nome = '" & newnome & "'"
Data1.Recordset.FindFirst criterio
 If Not Data1.Recordset.NoMatch Then
 Rispcontr = MsgBox("Nominativo esistente. Continuare?", vbYesNo,
"Controllo duplicati")
  If Rispcontr = vbYes Then
    'Salva le modifiche.
    cmdsalva.Enabled = False
    cmdadd.Caption = "Aggiungi"
    cmdmodif.Caption = "Modifica"
  End If
    If Rispcontr = vbNo Then
       Data1.Recordset.Delete
       cmdadd.Caption = "Aggiungi"
       Data1.Refresh
     Exit Sub
 End If
 End If
End Sub

 ha scritto nel messaggio 
news:1192045147.0...@r29g2000hsg.googlegroups.com...

http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/99ba9459d75d186f/90553b631a0fd05d?hl=it&lnk=raot#90553b631a0fd05d





Private Sub cmdsalva_Click()






 If Not Data1.Recordset.NoMatch Then



End Sub
----------------
no. senza offesa, non e' da nobel. se sei un principiante, hai cominciato a 
lavorarci. senza scherzi, vai bene cosi'. ma continua a ragionare.
hint 1
prima fai la ricerca. non toccare il recordset, e tantomeno il db.
cognome-nome e' una chiave debole. "rossi paolo" ? hmm... l'attaccante, il 
comico, o l'amico tuo?
aggiungi c.f., data nascita, quello che ti pare per renderla univoca.
poi, se uno vuole inserire, form nuovo 'inserimento'.
i campi cognome, nome puoi preimpostarli su quanto gia' sai.
ma ci *deve* essere un pulsante 'annulla', nel qual caso uno puo' ripensarci 
e non ci prova nemmeno a inserire.
se inserisce, tu controlli.
se nome + cognome + c.f. gia' ci sono
msgbox "Prrrrr !"
hint 2
rientrare coi tab, nel codice, e' vitale. ma va fatto a senso, non random.
hth, ciao, a.

 hth, ciao, a.
Grazie innanzitutto per la risposta!
Preciso che la funzione annulla c'è e funziona. Se decido di annullare
il nuovo record,si riporta in "lettura" del database.Non l'avevo
precisato nel primo post.
Adesso provo a riflettere sui tuoi consigli. Cognome e nome sono
deboli, è vero, ma per ora, non avendo sempre la possibilità di avere
una chiave univoca per tutti (immagina chiedere al cliente, fornitore
o chi che sia, codice fiscale o data di nascita, ecc.!! potrei avere
la P.I. di uno puittosto che il c.f. di un altro, ecc..)
Ecco perchè, per ora ho scelto solo di visualizzare un avviso e in
base al tale, scegliere se continuare o no.
Credo così di poter intanto riempire più o meno correttamente il
database...poi se ho tempo posso sempre studiare altre funzionalità
per migliorarne la gestione.

 ha scritto nel messaggio
Grazie innanzitutto per la risposta!
Preciso che la funzione annulla c'è e funziona. Se decido di annullare
il nuovo record,si riporta in "lettura" del database.Non l'avevo
precisato nel primo post.
Adesso provo a riflettere sui tuoi consigli. Cognome e nome sono
deboli, è vero, ma per ora, non avendo sempre la possibilità di avere
una chiave univoca per tutti (immagina chiedere al cliente, fornitore
o chi che sia, codice fiscale o data di nascita, ecc.!! potrei avere
la P.I. di uno puittosto che il c.f. di un altro, ecc..)
Ecco perchè, per ora ho scelto solo di visualizzare un avviso e in
base al tale, scegliere se continuare o no.
Credo così di poter intanto riempire più o meno correttamente il
database...poi se ho tempo posso sempre studiare altre funzionalità
per migliorarne la gestione.
ok. da non-nobel era la confusione fra inserimento e cancellazione, "la sub 
elimina l'ultimo record inserito". anche se funziona, non e' una bella cosa, 
e comunque quasi certamente qualche casino prima o poi lo fa.
per quello dicevo usa un form a parte, caricalo, e poi inserisci il rec solo 
dopo l'ok. scindi sempre i momenti della gestione del db.
quanto ai nomi, l'anagrafica inserita ti servira' a qualcosa, e in quel 
momento avrai bisogno di un altro elemento nella chiave, id o quello che 
sia. ma dovrai poter collegare dati in modo biunivoco. se non hai altri 
elementi gia' dal momento dell'inserimento in anagrafica, la cosa non mi 
sembra molto certa.
ciao, buon lavoro, a. 

 per migliorarne la gestione.
Ti ho risposto anche dall'altra parte.
Ti consiglio di abbandonare al piů presto l'oggetto DataControl e di fare a
mano. Personalmente non neanche mai usato griglie bounded (cioč attaccate
direttamente al database), ma ho sempre caricato la griglia all'inizio e
risalvata io manualmente, ma qui va a gusti.

"Andrea [Work]"

da vb4, sono 10 anni che le uso, dao e ado, e non ho mai avuto problemi.
idem con i txt check option legati al datacontrol.
puo' semplificare molto la vita, almeno per applicazioni non pesantissime. 
ma le griglie le uso solo per scorrere le tabelle, e i controlli bound per 
_poter modificare_ i valori (dove non mi fido degli utenti, i controlli sono 
bloccati, e per modificarli bisogna sbloccarli apposta), eventualmente per 
cancellare la riga.
con il datacontrol l'unico momento davvero critico e' l'inserimento. come in 
access: se uno fa nuovo e scrive un valore, se nella struttura della tabella 
c'e' un valore di default il record direi venga comunque scritto (es id, 
data), anche se uno poi ci ripensa. e non e' bello.
quindi di solito per inserire, se serve un controllo, faccio una query tipo 
le tue, e poi mostro un piccolo form con i dati indispensabili. se da' 
annulla non succede niente. se da' ok controllo che non torni a inserire un 
valore doppio (potrebbe avere modificato il form). se tutto e' ok, 
inserisco, mi posiziono sul record e gli faccio compilare tutti gli altri 
controlli.
ciao, a.

 ciao, a.
Appena posso, provo a seguire i consigli che mi avete dato
Ma il  problema (almeno nel mio piccolo)che non capisco,e che poi ha
generato soluzioni bizzarre quali la cancellazione del record,
consiste nel fatto che la "sequenza salva" funziona in modo anomalo.
cioè: se voglio inserire un novo record, sul form premo aggiungi; il
pulsante salva diventa attivo come anche quello annulla. se annullo lo
fa.
Se salvo, dovrebbe eseguire i controlli, e se tutto è ok passare a
"validate" e chiedere : salvare le modifiche?    SI    NO
Ora sui controlli cosa accade:
Se lascio solo
 'CONTROLLO INSERIMENTO NOME E COGNOME
If Trim(Text2.Text) = "" Or Trim(Text3.Text) = "" Then
  MsgBox "Inserire Cognome e Nome.", vbOKOnly + vbCritical, "Nessun
Nome inserito"
  Exit Sub
End If
Tutto funziona: premuto salva senza aver rispettato la condizione, ho
l'avviso e posso tornare all'inserimento o annullare. Il dato non
viene caricato e non avviene il passaggio a validate! Secondo me è
corretto
Se aggiungo la condizione del duplicato (non la ricopio per brevità),
avviene la stranezza:
Dopo aver verificato la "If trim"..., anzichè passare alla seconda
verifica, quella del duplicato, passa a validate, esegue solo la parte
di istruzioni
criterio = "Cognome = '" & newcogn & "' And Nome = '" & newnome & "'"
Data1.Recordset.FindFirst criterio
mi chiede "salvare le modifiche? SI NO" e se dico SI,aggiunge il
record e poi torna alla sub del pulsante salva, rientrando nella riga
della ricerca,
If Not Data1.Recordset.NoMatch Then     eccetera,
 la esegue (e a questo punto trova il nuovo record che ha appena
caricato e quindi me lo da duplicato anche se non esisteva) e poi,
avendo giustamente trovato il record mi avvisa che il contatto esiste!
Non  capisco questo comportamento e non so cosa studiare per
risolverlo.
Se non ci fosse questo "salto" di codice, la verifica sarebbe
corretta: quindi prima avviso se c'è il duplicato e poi validate..e
quindi vuoi salvare? SI NO
Grazie per la pazienza

 ha scritto
cioč: se voglio inserire un novo record, sul form premo aggiungi;
...butti via il resto e fai come ti ho detto :)
con l'inserimento del datacontrol ci ho discusso invano il primo anno 
cercando un comportamento stabile e univoco.
poi non ho piu' avuto problemi...
ciao, a.

 data), anche se uno poi ci ripensa. e non e' bello.
Con ADO almeno non è necessario il datacontrol per associare un recordset
ad una griglia/textbox ecc.
Comunque con i programmi multiutente non lo userei mai. E comunque l'ho
usato solo nelle prove a scuola in VB5 anni fa :)

"Andrea [Work]"

il dc dao lo usiamo in rete da almeno un paio d'anni, abbastanza 
tranquillamente, con un exe vb6 mio che gestisce una tabella di circa 300k 
righe, collegate ad altrettante immagini (15gb). utenti da 1 a 10 
contemporanei. non e' un uso molto intensivo, ma finora nessuno ha 
incontrato particolari problemi.
ciao, a.