Newsgroup: it.comp.appl.access
Titolo: Controllo unicita' valori campo nchar in progetti adp

Salve a tutti,
                    ho i soliti problemi di adattamento di un db mdb a 
progetto adp.
Nel database avevo un campo denominato N_fabb di tipo testo (es. 050128, 
050129, ...) che avevo indicizzato e messo univoco anche se non era la 
chiave della tabella.
Ora nel progetto adp tale campo è di tipo nchar ma non
riesco a fare in modo che l'utente non inserisca due valori
identici.
Preciso che tale campo viene popolato in una sottomaschera.
A disposizione per ulteriori delucidazioni, ringrazio tutti dell'aiuto ciao 
sabrina 

 ha scritto nel messaggio
news:43e0b966$0$27296$4faf...@reader2.news.tin.it...

Ciao Romana,
perchè non crei un indice Univoco sul campo N_Fabb anche in SQL Server?
Se il campo  è sempre valorizzato e non contiene valori NULL lo puoi fare.
se invece il campo può contenre valori NULL allora puoi ricorrere ad una
vista Indicizzata, che selezioni solo i record con valori diversi da NULL e
su qesta vista crei un indice.
ES:
CREATE VIEW V_NFabbricazioneUnivoco
WITH SCHEMABINDING As
SELECT N_Fab FROM products
WHERE N_Fab is NOT Null
CREATE UNIQUE CLUSTERED
  INDEX [NFab_Index] ON V_NFabbricazioneUnivoco  ([N_Fab])
WITH
    DROP_EXISTING
ON [PRIMARY]
-- 
Cinzia
---------------------------------------
|  
http://www.riolab.org
  |
--------------------------------------->

 ha scritto nel messaggio
news:43e10cf9$0$347$5fc...@news.tiscali.it...

Grazie per l'aiuto ma per me quello che hai scritto è arabo
puoi guidarmi più da vicino??!
Intanto vale la seconda ipotesi nella tabella dove ho i numeri di fabbrica
possono comparire valori null
Tale tabella viene popolata attraverso una sottomaschera
quando l'utente ritiene che gli serva.
La vista indicizzata di cui parli (ammesso che riesco a crearla, perchè non
ho ben capito come devo fare) la dovrei sostituire nella sottomaschera??!!
Io vorrei che dalla maschera di compilazione del campo
quando l'utente inserisce un n°fabbrica già esistente venisse segnalato e
non gli venga permesso replicarlo.
Ciao Sabrina


Ciao Sabrina,
hai sostanzialmente 2 possibilità, la prima è quella che ti ho indicato, in
questo modo deleghi al server SQL il controllo sui duolicati, x cui se
l'utente inserisce un valore duplicato il server quando salvi ti restiuirà
um errore classico di chiave duplicata.
Il modo più semplice per creare  Vista e Indice è farlo da SQL Analizer se
hai  Enterprise Manager, se invece stai usando MSDE e non hai EM puoi  farlo
da Access così:
Vai  su Query
Progetta Vista
Imposti la Vista secondo le necessità (SELECT N_Fab FROM products
WHERE N_Fab is NOT Null
), vai su Menu Query, Selezioni Indici e Crei Un nuovo Indice, gli dai un
nome, selezioni il campo che deve essere univoco (N_fab) e Metti la spunta a
Crea Unique
Chiudi Salvi la vista
Riapri in Struttura la Vista vai su Visualizza -- Proprietà Metti la spunta
a Associa a Schema
Fine
A questo punto hai finito tu non ti devi preoccupare di controllare i
duplicati, ci pensa SQL, le tue maschere rimangono esattamente come sono
adesso.
Il secondo approccio, prevede invece che sia tu a verificare prima di
salvare il record se quel N_Fab esiste già e per farlo sostanzialmente puoi
fare una procedura sul Before_Update della sottomaschera e verifichi se il
numero esite oppure No.
1) Crei una Stored procedure del tipo :
CREATE PROC VerificaNumFabbrica (@NF as integer)
AS
    Select Count(IDProduct) From Products Where N_Fab = @NF
2) Crei una Function nel Form
Function EsisteNF(NF as long) as Boolean
       Dim rs as New Adodb.recordset
On error Goto  EsisteNF_err
        set rs = CurrentProject.Connection.Exeute "VerificaNumFabbrica " &
NF
        if rs.fields(0) = 0 then
            EsisteNF=False
        else
            EsisteNF= true
        end if
EsisteNF_exit:
        rs.close
        set rs= nothing
        exit Funcion
 EsisteNF_err:
    MsgBox(Err.Description)
    resume EsisteNF_exit
end Function
3)Nell'evento Before Update scriverai
    if EsisteNF(me.N_Fab) then
        MsgBox("Attenzione Numero Fabbricazione Già esistemte!; Correggere")
        cancel = true
   end if
Ciao


 ha scritto nel messaggio
news:43e20627$0$331$5fc...@news.tiscali.it...

Ho provato la prima soluzione che mi sembrava la più semplice ma ora non
riesco ad inserire neanche n_fabb
che non esistono dove ho sbagliato?
Mentre creavo la vista l'unica cosa di diverso che ho notato è che dove mi
hai detto di spuntare unique era già spuntato e mi chiede di crearlo
clusterd inoltre quando la riapro associa a schema è già settato
Mi compare il seguente messaggio:
INSERT non riuscita perchè i valori delle seguenti opzioni SET non sono
corretti: 'ARITHABORT'.
Se inserisco un valore che in tabella non è presente e anche quando tento di
duplicarne uno presente.
Stò provando la seconda soluzione ma ho qualche problema con la riga
 set rs = CurrentProject.Connection.Exeute "VerificaNumFabbrica " &
non è che va scritta
 set rs = CurrentProject.Connection.Execute ("VerificaNumFabbrica " &)
Ciao ed infinite grazie

 Ciao ed infinite grazie
Ciao
-- 


Grazie per l'aiuto; ora funziona!!
Ciao e alla prossima
PS: Esiste un manuale su cui potrei studiare le soluzioni che mi hai
proposto cosě magari la prossima volta provo ad arrangiarmi?!
Ciao e ancora grazie

 ha scritto nel messaggio
news:drv8eh$58$1...@fata.cs.interbusiness.it...

Ciao Sabrina,
credo che il manuale migliore siano i Books on Line
http://www.microsoft.com/downloads/details.aspx?FamilyID=a6f79cb1-a420-445f-8a4b-bd77a7da194b&DisplayLang=en
dove trovi anche la versione italiana.
Per questo problema specifico, a suo tempo quando ebbi un problema analogo,
chiesi sul NG di Sql Server (probabilmente fu il mio primo post su un NG)
microsoft.public.it.sql
dove mi furono indicate le diverse soluzioni.
