Newsgroup: it.comp.appl.access
Titolo: Blocco record con condizione

Ciao a tutti, ho una tabella Trat, che per ogni commessa (Comm)
riporta i trattamenti (Campo2) ordinati progressivamente (nTrat) che
la stessa deve subire. Ora ho una maschera associata alla tabella Trat
da cui filtrando per Campo2 (es.Campo2="PU") ossia per trattamento,
riesco a visualizzare quali siano le commesse che devono subire quel
trattamento; vorrei che però selezionando il campo Iniziato di tale
commesse si andasse a verificare se il trattamento precedente della
stessa commessa ha il campo Effettuato= true, se vero continua,
altrimenti impediscimi di modificare il record corrente. E' possibile?
Grazie
ID	Comm	nTrat	Campo2	Iniziato	Effettuato
41	481	1	PU	No	Sì
45	481	2	VP	No	No
39	502	1	ZC	No	No
43	502	2	PU	No	No
46	502	3	PR	No	No
47	502	4	VP	No	No

47	502	4	VP	No	No
Suppongo che nella maschera in questione tutti i controli associati ai
vari campi abbiano nome "prefissato" con txt (txtID, txtComm ecc.)
Nella routine associata all'evento "Prima di aggiornare" del controllo
txtIniziato scrivi il codice seguente:
' Il controllo viene effettuato solo se il record corrente non
corrisponde al primo trattamento della commessa
If Me.txtnTrat<> DMin("nTrat","Trat","Comm=" & Me.txtComm) Then
   If Nz(Dlookup("Effettuato","Trat","Comm=" & Me.txtComm & " AND
nTrat=" & DMax("nTrat","Trat","Comm=" & Me.txtComm & " AND nTrat<" &
Me.txtnTrat )),"No") = "No" Then
MsgBox "Trattamento precedente non effettuato"
   Docmd.CancelEvent
   EndIf
EndIf
Vincenzo Turturro 
Certificato Eucip Core Level 
ITA 0000-002299 del 14/05/2007 
--------------------------------------------- 
il sito comune di it.comp.appl.access: 
http://www.sitocomune.com
 
--------------------------------------------- 
risorse Access: 
http://www.accessgroup.it
 
--------------------------------------------- 
Il sito comune di it.comp.as400 
http://www.faq400.com
 
---------------------------------------------

 - Mostra testo tra virgolette -
Ciao Vincenzo grazie della tempestività, ho provato la soluzione
proposta e mi viene restituito il seguente errore:
Errore di run-time '3075'
Errore di sintassi (operatore mancante) nell'espressione della query
'Comm=481 And nTrat=',

 - Mostra testo tra virgolette -
c'è nessuno?

'Comm=481 And nTrat=',
Sembra che l'espressione 
DMax("nTrat","Trat","Comm=" & Me.txtComm & " AND nTrat<" & Me.txtnTrat )
restituisca Null ...
Onestamente non l'ho provata (e non ho il tempo di farlo adesso; forse domattina ...)
però mi sembra che dovrebbe funzionare, a patto che per ogni record (tranne quelli di ciascuna commessa con nTrat
minimo) esista almeno un record della stessa commessa con valore di nTrat minore del valore di nTrat del record
corrente.
Mi viene in mente adesso: l'errore si verifica quando stai compilando i campi di un nuovo record ?
Hai provato su record già registrati ?


 - Mostra testo tra virgolette -
Ciao Vincenzo, ti attendevo.
Si ho provato su record già registrati e solo su questi mi servirà, in
quanto effettua solo dei controlli di dati già inseriti.

quanto effettua solo dei controlli di dati già inseriti.
Ho creato la tabella con la stessa struttura di quella che hai
postato, ho creato una maschera ad essa associata ed ho incollato il
codice che ti ho proposto: funziona tutto !
Per la commessa 502, tentando di aggiornare il record con nTrat=2
impostando Iniziato="Sì", questo viene impedito.
Per la commessa 481, tentando di aggiornare il record con nTrat=2
impostando Iniziato="Sì", questo viene consentito.


On 21 Mar, 09:28, "VT @ Work" <V...@Work.it> wrote:

Allora dove sbaglio? ecco il codice del txtIniziato della form:
Private Sub txtIniziato_BeforeUpdate(Cancel As Integer)
If Me.txtnTrat <> DMin("nTrat", "Trat", "Comm=" & Me.txtComm) Then
   If Nz(DLookup("Effettuato", "Trat", "Comm=" & Me.txtComm & " AND
nTrat=" & DMax("nTrat", "Trat", "Comm=" &   Me.txtComm & " AND nTrat<"
& Me.txtnTrat)), "No") = "No" Then
   MsgBox "Trattamento precedente non effettuato"
   DoCmd.CancelEvent
   End If
End If
End Sub
Ma per andare a capo nella seconda if come si fà? Io ho riportato
nell'editor vb tutto su una riga, forse lì l'errore?

nell'editor vb tutto su una riga, forse lì l'errore?
No, l'istruzione va tutta sulla medeisma riga.


On 21 Mar, 10:14, "VT @ Work" <V...@Work.it> wrote:

Grazie, continua però con lo stesso errore e non so perchè.
Saresti così gentile da inviarmi magari l'esempio da te sviluppato
così potrei vedere che c'è di diverso?
Grazie di nuovo

 - Mostra testo tra virgolette -
Grazie risolto

Grazie risolto
Sarebbe cosa buona e giusta sapere come ...


 ---------------------------------------------
Si Hai ragione, perdono.
Ho tolto i doppi apici su
"No") = "No" Then
diventa
If Nz(DLookup("Effettuato", "TratOK", "Comm=" & Me.Comm & " AND
nTrat=" & DMax("nTrat", "TratOK", "Comm=" & Me.Comm & " AND nTrat<" &
Me.nTrat)), False) = False Then
   MsgBox "Trattamento precedente non effettuato"
   DoCmd.CancelEvent
  End If
End If
End Sub
Grazie di nuovo e buona Pasqua

Grazie di nuovo e buona Pasqua
Non si tratta di doppi apici:
la colonna Effettuato è di tipo Boolean, mentre dall'esempio che avevi postato sembrava di tipo testo.
Tu non l'hai detto ed io non ci ho pensato ...


 - Mostra testo tra virgolette -
Ciao Vincenzo, grazie dell'esempio inviatomi.
Comunque forse hai ragione in quanto avevo soltanto detto:
campo Effettuato= true
ambiguo forse.
Grazie di nuovo