Newsgroup: it.comp.appl.access
Titolo: strano comportamento maschera

Salve a tutti.
Questo lo strano comportamento della form:
La apro con:
docmd.openform "frmarticoli"
docmd.gotorecord, , acnewrec
Il controllo IdArticolo con origine Idarticolo della tblarticoli ha
come valore predefinito
Nz(DMax("[idarticolo]"; "[tblarticoli]"); 0) + 1
qui c'è il primo problema: mi dà 142 quando invece l'ultimo idarticolo
è 140.
Se appena entro clicco sul pulsante uscita mi genera il record con
idarticolo 142 e non 141, mentre in un'altra form simile se faccio
così (avviene quando voglio solo variare un record già esistente) il
record non viene creato per cui alla nuova apertura della form l'id è
successivo all'ultimo inserito in tutti i suoi campi.
Ultimo problema sull'evento "prima di aggiornare" del controllo
IdArticolo ho messo:
Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
rst.FindFirst "Idarticolo=" & Me!IdArticolo
If Not rst.NoMatch Then
   Me.Undo
   Me.Bookmark = rst.Bookmark
End If
Set rst = Nothing
questo per variare un record già esistente. Sulle altre form funziona,
qui no.
Qualcuno mi può spiegare perchè queste differenze di comportamento da
una form all'altra dello stesso database?
Grazie.
Giuseppe.

 successivo all'ultimo inserito in tutti i suoi campi.
credo che quel "valore predefinito" Nz(DMax("[idarticolo]";
"[tblarticoli]"); 0) + 1 di fatto valorizzi il record... quindi lo
crei.

 crei.
Infatti credo che all'apertura crei il 141 e la formula ne crea
un'altro che diventa 142.
Giuseppe.


appunto.
Io eviterei la doppia assegnazione... io aggiungerei il record con un
pulsante "nuovo", in cui assegnerei il Nz(....)


Se tolgo dalle proprietà Valore predefinito del controllo idarticolo
nella form
=Nz(DMax("[idarticolo]";"[tblarticoli]");0)+1
passando dalla modalità struttura alla modalità maschera mi esce:
L'indice o la chiave primaria non può contenere un valore null
se salvo comunque le modifiche, quando dalla form "menu articoli"
clicco sul pulsante che mi apre la form:
docmd.openform "frmarticoli"
docmd.gotorecord, , acnewrec
mi esce il seguente errore:
Errore di run-time 2105 - Impossibile passare al record specificato
Ciao.
Giuseppe.


sono certo che il sistema da qualche parte tenta di assegnare il
record... e non trovando idarticolo che è la PK della tabella, va in
errore... devi trovare "dove" assegni il record e evitare tale
attività... altrimenti incorrerai sempre nello stesso errore.


Si infatti è così.
Ho tolto il valore predefinito, al messaggio di errore di run time
vado comunque avanti ed ho la maschera completamente vuota.
Qui se clicco sul pulsante nuovo dove ho messo:
msgBox Nz(DMax("[idarticolo]";"[tblarticoli]"); 0) + 1
mi restituisce il giusto numero.
Solo che non so chi e cosa mi assegna il record.
Devo forse rifare la maschera mettendo i controlli uno ad uno o c'è
qualche altro espediente?
Anche per questo motivo allora non funziona il discorso relativo alla
routine "prima di aggiornare" in cui se digito il numero di un record
già esistente
la form deve posizionarsi sul record corrispondente?
Grazie pablitomf.
Giuseppe.


Trovato!!
Su corrente della maschera c'era:
Me.giacenza = Me.caricato - Nz(Me.scaricato, 0)
Ora è rimasto solo il problema relativo al codice sul controllo
"idarticolo" su evento prima di aggiornare.
Quando digito il numero di un record già esistente non si posiziona
sul record corrispondente ma è come se mi lascia inserire i dati salvo
su conferma dirmi che non è possibile assegnare un valore duplicato
all'IdArticolo.
Il codice è:
Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
rst.FindFirst "Idarticolo=" & Me!IdArticolo
If Not rst.NoMatch Then
   Me.Undo
   Me.Bookmark = rst.Bookmark
End If
Set rst = Nothing
Sulle altre maschere funziona!
Giuseppe.

 Sulle altre maschere funziona!
Ma hai seguito passo passo il codice nel DEBUG?... dov'è che si blocca?



Apro la maschera da un'altra maschera con il seguente codice:
docmd.openform "frmarticoli"
docmd.gotorecord, , acnewrec
si apre la maschera frmarticoli e si posiziona su un nuovo record con
valore idarticolo ultimo+1.
Proprietà maschera:
Ordina al caricamento: si
Immissione dati: no
Consenti aggiunte: si
Consenti eliminazioni: si
Consenti modifiche: si
Tutto uguale ad altre maschere che però funzionano.
Se digito su idarticolo il numero di un record già esistente su invio
anziché spostarsi sul record relativo, si sposta sul controllo
successivo senza che il codice si interrompe. Se tento di confermare o
di uscire dalla maschera perchè non voglio modificare il record
digitato, mi dà il seguente errore:
L'apporto modifiche non è riuscito perchè si è cercato di duplicare i
valori dell'indice, nella chiave primaria o nella relazione, ecc....
Questo problema è uguale alla form "frmanagrafica" mentre in tutte le
altre form simili, digitando il numero idxx nel controllo  idxx si
posiziona correttamente sul idxx corretto con tutti i dati del record.
Ciao.
Giuseppe.

 valori dell'indice, nella chiave primaria o nella relazione, ecc....
vabbè è ovvio... ma mi interessa quello che ti ho chiesto


scusa pablitomf dovrei mettere dei punti di interruzione riga per riga
nel codice afterupdate della casella di controllo idarticolo. E' così?
Quindi eseguire il codice fino a scoprire il problema. Giusto?
Ma non so come si fa?
Scusami ma non sono sicuro di come si fa.
Ho provato così:
Sul codice afterupdate ho messo il pallino rosso alla sinistra di
Set rst = Me.RecordsetClone
poi ho chiuso Vba e ho provato a digitare un idarticolo sul controllo.
Si è aperto Vba e sul pallino rosso è comparsa una freccia gialla e mi
ha evidenziato la stessa riga con lo sfondo blu.
E' così che si fa? E' quindi questa la riga incriminata?
Spero di aver fatto quello che mi chiedi.
Giuseppe.


Si è così che si fa, ma poi devi continuare. La la riga colorata di
giallo è solo quella relativa al pallino rosso (punto di interruzione)
inserito da te... quindi adesso devi proseguire con l'esecuzione del
restante codice, con il tasto F8... ogni pressione di F8 ti passa alla
riga successiva eseguendola.. facendo così, potrai capire, qual'è la
riga che non funge...
Fammi sapere.

 wrote:

La riga gialla è la prima riga indicata come punto di interruzione da
te (pallino rosso)... ora devi proseguire con l'esecuzione del codice
usando il tasto F8... ogni pressione corrisponde all'esecuzione di una
riga (vedrai che le righe si coloreranno di giallo in successione)...
così facendo dovrai capire qual'è la riga che non funziona.
Fammi sapere.


Allora.
Ho messo il puntino rosso su:
Private Sub IDarticolo_BeforeUpdate(Cancel As Integer)
dopo l'invio sul controllo IdArticolo, la riga diventa gialla.
Pigiando F8 mi salta la seconda riga cioè Dim rst As DAO.Recordset
e va sulla terza, lasciando la prima riga con lo sfondo bordò.
Continuando con F8 si sposta prima su rst.FindFirst "Idarticolo=" & Me!
IdArticolo
quindi su
If Not rst.NoMatch Then.
Poi salta le righe
Me.Undo      e    Me.Bookmark = rst.Bookmark
e va su end if
quindi su Set rst = Nothing ed  End Sub.
Ciao Giuseppe.


Perfetto... significa che la IF non è soddisfatta... quindi passaoltre
finendo il codice senza passare per l'Undo e il resto.
ma tu vuoi controllare se il record c'è? e allora perchè non fai :
With rst
     If .NoMatch Then
         ' RECORD NON TROVATO
         .... esegui il codice che vuoi
      Else
         ' RECORD TROVATO
         .... esegui il codice che vuoi
      End If
End With
????

 finendo il codice senza passare per l'Undo e il resto.
Ma se il codice che digito esiste (ed esiste) non è che il problema è
perchè salta
la seconda riga cioè Dim rst As DAO.Recordset ?
Abbi pazienza pablitomf.
Ce la sto mettendo tutta.
Giuseppe.


La seconda riga è una semplice Dichiarazione di variabile, per cui il
debug non la valuta proprio... quindi è normale che la salti
nell'analisi.
Mi sorge un dubbio su questa riga :
rst.FindFirst "Idarticolo=" & Me!IdArticolo
Ma non è che Idarticolo è formato "TESTO" e tu la stai trattando da
numero ?


Nelle proprietà del controllo idarticolo non c'era niente come
formato.
Ho messo numero generico, ed ora qualunque numero digito sulla casella
di controllo scrive sempre 1 e si sposta sul primo record.


no aspè Giuseppe, però devi rispondere alle domande, non ad altro...
quando parlo di formato intendo quello tabellare, non quello del
controllo della maschera...
l'rst va a controllare il recordset non i controlli della form...
il campo "Idarticolo" è formato numerico o testuale?


Scusami. Numerico.

> Scusami. Numerico.
Prova così
Dim strCriteria As String
strCriteria = "Idarticolo=" & Me!IdArticolo
Me.RecordsetClone.FindFirst (strCriteria)
If Me.RecordsetClone.NoMatch Then
    Me.Undo
    MsgBox "Non trovato"
Else
    Me.Undo
    Form.Bookmark = Me.RecordsetClone.Bookmark
End If


Si adesso funziona.
Qual'era il problema?
Grazie.
Giuseppe.

 Giuseppe.
il criterio nell'uso del FindFirst va tra parentesi... 

 >> Prova così

grazie di tutto.
Giuseppe.


Scusami pablimf, ma forse quel giorno avevo le banane agli occhi, ora
quando digito il numero di un codice articolo già esistente mi esce
sempre il msgbox "non trovato".
Giuseppe.


Risolto.
Scusa.
giuseppe.