Newsgroup: it.comp.appl.access
Titolo: controllo su maschera 2

Riposto il quesito poichè mi sono accorto che non funziona.
Ho una sottomaschera a foglio dati chiamata "miasotto" con tre campi
"campo1" "campo2" "campo3".
Il "campo2" è numerico e vorrei che quando supera 100 da un messaggio e
annulla l'ultimo record.
Quindi ho inserito nel "piè di pagina maschera" un controllo con
=Somma([campo2])
Ho inserito poi questo codice nella sottomaschera
Private Sub Form_BeforeUpdate(Cancel As Integer)
If somma_per > 100 Then
MsgBox "mmmmmmm"
campo1.SetFocus
DoCmd.RunCommand acCmdUndo
End If
End Sub
Questo codice non funziona perchè mi da il messaggio al successivo
inserimento di record che ha superato 100.
Allora ho scritto questo codice:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim SOMMA As Integer
Dim SOMMA_PER2 As Integer
SOMMA_PER2 = Nz(somma_per)
SOMMA = SOMMA_PER2 + Campo2
If SOMMA > 100 Then
MsgBox "LA PERCENTUALE NON PUO' ESSERE SUPERIORE AL 100%"
campo1.SetFocus
DoCmd.RunCommand acCmdUndo
End If
End Sub
Questo codice va meglio ma poniamo di aver inserito già 100, quando vado a
modificare il dato a 50
il codice entra in fulzione.
Io ho capito il perchè ma non trovo la soluzione.
Qualcuno può aiutarmi?
Grazie Marco

Riposto il quesito poichč mi sono accorto che non funziona.
Il ragionamento mi pare decisamente cervellotico, troppo perfino
per seguirlo tutto...
Domanda, ma se il problema sta solo nell' evitare l' inserimento di
un valore >= 100 in un Controllo/Campo non č molto piů semplice
utilizzare il banalissimo ValidoSe < 100 ?!?
Se invece si tratta di un controllo calcolato ovviamente il test
lo devi mettere sull' evento BeforeUpdate utilizzando CancelEvent
per annullare il salvataggio.
Bye, Ste


Hai ragione cerco di semplificare.
Hai presente il database Northwind con la maschera "Ordini" e la
"sottomaschera ordini".
Io voglio semplicemente il subtotale dell'ordine non superi L. 1.000.000.
Se inserisco quindi un prdotto che fa aumentare l'importo per esempio a
1.100.000 appare un messaggio e viene cancellato l'inserimento.
Anche se in pratica è difficile che un commerciante voglia limitare un
ordinativo questo è solo un esempio che poi applicherò in un altro db.
Spero di essere stato più chiaro.
Ciao
Marco

...

Molto + chiaro, grazie.
Cmq non è poi tanto strana la necessità di limitare l' ordinato
di un cliente, molti gestionali implementano una gestione
della "solvibilità" dei clienti che limita l' importo ordinabile
dagli stessi.
Personalmente lo farei decisamente da VBA, sull' evento BeforeUpdate
della sottomaschera aprirei un bel recordset tipo:
   set rk = db.openrecordset("select sum(nz(Importo,0)) from Dettaglio where
IDOrdine = "  _
                & me.parent.IDOrdine)
da cui:
   Valore = ccur(rk(0))
   if Valore > 1000000 then
      msgbox "Totale Ordine eccessivo!!"
      docmd.CancelEvent
   End If
Non trascurerei la possibilità di lavorare su una tabella temporanea x le
righe,
ti darebbe il modo di gestire tutta la codifica dell' ordine **veramente**
come
una unica transazione.
Bye, Ste


Scusa Stefano
Non ho una profonda conoscenza di vba e non riesco a correggere errori di
sintassi.
Per provare se funziona ho inserito questo codice sulla "sottomaschera
ordini" del db di
northwind ma mi da errore.
Puoi scoprire il motivo?
Te ne sarei grato anche perchč, per me,  č un buon metodo per imparare nuove
cose.
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim db As Database
Dim rk As DAO.Recordset
Dim valore As Integer
Set db = CurrentDb
Set rk = db.OpenRecordset("select sum(nz(PrezzoComplessivo,0)) from
[dettagli ordini] where IDOrdine =" & Me.Parent.IDOrdine)
  valore = CCur(rk(0))
   If valore > 2000000 Then
      MsgBox "Totale Ordine eccessivo!!"
      DoCmd.CancelEvent
   End If
End Sub


Se la stringa ssql viene composta correttamente dovrebbe funzionare,
fai sapere.
Bye, Ste



