[ timberman @ 30.07.2017. 14:14 ] @
Imam formu u kojoj treba popuniti četiri podatka. Prva dva, šifra i naziv su obavezna, a druga dva nisu. Kada hoću da izađem a nisam uneo obavezne podatke javlja mi grešku "You cannot save the record at this time". Napravio sam deo koji označava nepopunjena polja i poruku. Tu nastaje problem, ja bih da ako se klikne na Yes da se obriše uneseno i vrati na zadnji sačuvani record, a ako se klikne na no da se nastavi sa unosom. Svaka pomoć je dobrodošla.
Code:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim obavezno As Control, EmptyStr$
  For Each obavezno In Me.Controls
    If Right(obavezno.Name, 3) = "_ob" Then
      If IsNull(obavezno.Value) Or obavezno.Value = vbNullString Then
        EmptyStr = EmptyStr & obavezno.Name & ";"
        obavezno.BackColor = RGB(255, 192, 203)
      End If
    End If
  Next
  If EmptyStr <> vbNullString Then
    EmptyStr = Left(EmptyStr, Len(EmptyStr) - 1)
    If MsgBox("Niste popunili neka obavezna polja: " & vbCrLf & EmptyStr & vbCrLf & "Ako želite da prekinete kliknite na Yes", vbExclamation + vbYesNo, "Brisanje artikla") = vbYes Then
    DoCmd.SetWarnings False
    DoCmd.RunCommand acCmdDeleteRecord
    DoCmd.SetWarnings True
    DoCmd.GoToRecord , , acLast
Else
    Me.Undo
End If
  End If
End Sub
[ timberman @ 30.07.2017. 16:39 ] @
U ovom primeru sam zaboravio deo On Error GoTo... ali ništa ni sa njim nisam uspeo...
[ timberman @ 31.07.2017. 10:33 ] @
Ima li neko bilo kakvu ideju, smernicu? Ne mora da bude nastavak mog primera, već samo da obrađuje grešku kad se želi napustiti forma a obavezna polja nisu unesena.
[ Dexxxl @ 02.08.2017. 12:58 ] @
U modul formr dodaj

Code:

Private Sub Form_Error(DataErr As Integer, Response As Integer)

Select Case DataErr
 
Case 3314
If MsgBox("Niste popunili neka obavezna polja: " & vbCrLf & _
"Ako želite da prekinete kliknite na Yes", vbExclamation + vbYesNo, "Brisanje artikla") = vbYes Then
Response = 0
Else
Me.Undo
End If
 
Case Else
 
MsgBox "Greska Br: " & DataErr & vbCr _
   & Err.Description
 
End Select
Response = 0

End Sub


Na slican nacin mozes obraditi i ostale greske
kodove gresaka imas na

http://docs.oracle.com/cd/B10501_01/win.920/a97262/a.htm
[ timberman @ 02.08.2017. 18:44 ] @
Hvala, Dexxxl. Interesuje me sledeće. U Vašem primeru kada se pojavi poruka Ako želite da prekinete kliknite na... klikom i na Yes i na No pojavljuje se greška br. 2169. Da li se ta greška obrađuje u okviru prethodne
Code:
Case 3314
If MsgBox("Niste popunili neka obavezna polja: " & vbCrLf & _
"Ako želite da prekinete kliknite na Yes", vbExclamation + vbYesNo, "Brisanje artikla") = vbYes Then
If DataErr = 2169 Then
...
Else
....
   End If
   Else
Me.Undo
End If


ili posebno
Code:
.
.
.
If MsgBox("Niste popunili neka obavezna polja: " & vbCrLf & _
"Ako želite da prekinete kliknite na Yes", vbExclamation + vbYesNo, "Brisanje artikla") = vbYes Then
Response = 0
Else
Me.Undo
End If
Case 2169
 
.
.
.

 
Case Else
 
MsgBox "Greska Br: " & DataErr & vbCr _
   & Err.Description
.
.
 

Ako je obradim posebno onda se verovatno i na Yes i na No odradi isto, u zavisnosti šta napišem unutar greške 2169. Čini mi se da ovo Me.undo ne odrađuje ono što treba
[ djux66 @ 03.08.2017. 10:14 ] @
Primer koji ti je prikazao Dexxxl isto odrađuje posao, a možeš i ovako da uradiš:

Izdvoji kod koji ti služi za validaciju podataka, i koristi Tag property na TextBox-u da označiš polja koja su obavezna tipa "required".
Za highlight kontrola bih ti preporučio ovaj primer http://www.allenbrowne.com/highlight.html

Code:

Option Compare Database
Option Explicit

Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim message As String
message = "Niste popunili neka obavezna polja: " & Chr(10) & "Ako želite da prekinete kliknite na Yes"

If (IsRecordValid = False) Then
    Cancel = True
    If MsgBox(message, vbExclamation + vbYesNo, "Brisanje artikla") = vbYes Then
        Me.Undo
        DoCmd.GoToRecord , , acLast
    End If
End If

End Sub

Private Function IsRecordValid() As Boolean
 Dim ctl As Control
 Dim isEmpty, isRequired As Boolean
 
 IsRecordValid = True
 
 For Each ctl In Me.Controls
    If (ctl.ControlType = acTextBox) Then
        isEmpty = ctl.Value & "" = ""
        isRequired = ctl.Tag = "required"
        
        If (isEmpty And isRequired) Then
            ctl.SetFocus
            IsRecordValid = False
            Exit For
        End If
        
    End If
    
 Next
End Function

[ timberman @ 03.08.2017. 12:08 ] @
Djux66, i Vaš primer, kao i primer od Dexxxl-a, posle prve poruke Niste popunili neka obavezna polja... bez obzira da li se klikne na Yes ili No izbacuje sledeću poruku kao na slici . Kod Dexxxl-a ispiše da je to poruka 2169 al to je to. Nikako da uspem da sa jednom porukom sa klikom na Yes da prekine a na No da me vrati da popuni ono što treba. Uspem da podesim da mi na Yes prekine, al nikako na No neće da me vrati.
[ djux66 @ 03.08.2017. 13:11 ] @
Primer koji sam ja okačio radi, jedino ako ne koristiš isti primer ili pokušavaš nasilno da zatvoriš formu u toku unosa, u tom slučaju može da se pojavi ovaj error.
U tvom primeru koji si okačio na početku ti pokušavaš na before update event obrišeš record koji još nije ni snimljen, umesto toga koristi:

Cancel = True što sprečava snimanje
i
Me.Undo koji poništava unete podatke
[ timberman @ 03.08.2017. 14:57 ] @
Djux66, verovatno se nismo dobro razumeli. To mi se dešava kada hoću da zatvorim formu na X, kao što vi kažete nasilno, čini mi se da sam to naveo u prvom postu. Ja sam hteo da kada nisu uneseni svi obavezni podaci a klikne se na X da se sa Yes izlazi a sa No vraća da se dovrši unos.
[ djux66 @ 04.08.2017. 08:36 ] @
Onda moraš da napraviš dugme za zatvaranje forme, a da zabraniš korišćenje x tj. close button = no
[ timberman @ 04.08.2017. 11:46 ] @
Hvala, djux66, to sam i uradio, ali sam mislio da može nešto da se uradi sa close button-om. Al pošto ne može, to je to. Hvala još jednom.