[ DON_steXo @ 05.07.2010. 21:01 ] @
Kako da izmijenim tekst poruke prilikom brisanja recorda? (You are about to delete 1 record(s) ). Uspio sam da u okviru forme na event On Delete postavim msgbox sa opcijama yes i no ali ne ne znam koji kod ide unutar bloka za potvdu brisanja i odustajanje niti kako da sprijecim da se poslije pojavljivanja custom upozorenja pojavi sistemsko upozorenje. Svaki savjet za lakse resenje je dobrodosao.
[ smal @ 05.07.2010. 21:14 ] @
Prvo moraš da na On Load event forme/subforme postaviš sledeće:
Code:
Private Sub Form_Load()
Application.SetOption "Confirm Record Changes", 0
End Sub

pa tek onda na On Delete željni kod. Ja često koristim pitanje u Msgboxu, tj. od korisnika se očekuje da potvrdi da li je zaista siguran da hoće da obriše konkretan record (po šifri, nazivu ilii slično):
Code:
Private Sub Form_Delete(Cancel As Integer)
Dim SID As String
Dim rsc As DAO.Recordset
Set rsc = Me.RecordsetClone

SID = Me.SIFRA.Value

Dim LResponse As Integer
LResponse = MsgBox("Briši stavku: " & SID, vbYesNo + vbQuestion, "Brisanje?")
If LResponse = vbNo Then
DoCmd.CancelEvent
Me.Undo
End If
Set rsc = Nothing
End Sub
[ DON_steXo @ 05.07.2010. 21:20 ] @
Hvala puno! Radi odlicno!

Ako budem imao slicnih pitanja pisem ponovo.
[ Zidar @ 05.07.2010. 21:51 ] @
Access help kaze da se koriste eventi BeforeDelConfirm i AfterDelConfirm. Prilozeni kod se moze cut/paste u bilo koju aplikaciju, i promenite text poruka ako zelite. Jos uvek ce ispod texta biti Yes/No/Cancel. To se moze eliminisati ali zahteva dosta znanja i truda, pa bih radiej ostavio ovako, poruka na srpskom, dugmici yes/No/cancel na engleskom.

Code:


Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
    ' Ovo iskljucuje standardbnu poruku:
    Response = acDataErrContinue
    ' Ovde pravim moju poruku
    If vbYes <> MsgBox("Zelite li da obrisete izabrane rekorde?" _
                        , vbYesNoCancel + vbDefaultButton3) Then
        Cancel = True
        
        'Ovo sam ja dodao, slobodno obrisite ako van se ne dopada ;-)
        MsgBox "Odustali ste od brisanja! Pametno."
        
    Else
    'Ovde je moja poruka o potvrdi brisanja, uklonite je ako vam se ne dopada:
        Cancel = False
        MsgBox "Rekordi ce biti obrisani!"
        
    End If
End Sub


Private Sub Form_AfterDelConfirm(Status As Integer)
'Ovde Access javlja sta se u stvari desilo
'(ceo kod u ovoj proceduri moze da se obrise ako vam smeta)
    Select Case Status
        Case acDeleteOK
            MsgBox "Izabrani rekordi su obrisani."
        Case acDeleteCancel
            'Ovo se desava ako kroz program posaljete Status ovoj proceduri
            MsgBox "Korisnik je obustavio brisanje."
'Ovo pise u HELPu da se desava, ali se ne desava
'            MsgBox "Programmer je obustavio brisanje."
        Case acDeleteUserCancel
        'Ovo se desava ako korsnik obustavi brisanje u Form_BeforeDelConfirm
        'Ovako je po Help-u ali se mni ova poruka nikad ne pojavi:
            MsgBox "Korisnik je obustavio brisanje."
    End Select
End Sub



U prethodnom postu je pokazano kako se koristi Delete event. Delete event javlja se za svaki rekord, pa ako odabrete grupu rekorda za brisanje, Delete event ce se javiti svaki put i pitace vas za svaki rekord pojedinacno da li zelite da ga stvarno obrisete. Zatim, setovanje
Code:
Application.SetOption "Confirm Record Changes", 0
je na nivou aplikacije i moze da utice na druge stvari. Ne kazem da ne treba ovako raditi, ali treba biti svestan sta se u stvari desava.


Evenyti BeforedelConfirm i AfterDelConfirm javljaju se jednom tokom operacije brisanja, za sve rekorde odjednom. Prvo je desi OnDelete, pa onda oNDeleteConfirm. Rekordi su vec obrisani na OnDelete. Kad kaazete No ili Cancel na DelConfirm, tada se u stvari odardi Undo. AfterDelConfirm moze da vam vrati poruku kao sto sam stavio u primeru, a ako ne upisete nikakav kod onda taj event tiho prodje bez poruka.

[ smal @ 05.07.2010. 22:14 ] @
Citat:
Delete event javlja se za svaki rekord, pa ako odabrete grupu rekorda za brisanje, Delete event ce se javiti svaki put i pitace vas za svaki rekord pojedinacno da li zelite da ga stvarno obrisete


E da, to stoji. Doduše, taj kod sam koristio za prilike kada ima veoma malo brisanja, na pr. na kasi gde se unos artikala vrši barkod čitačem, ali je zato bitno da se naglasi koji se artikl briše kada zatreba. U stvari, najbolje bi bila varijanta da, ako je broj stavki za brisanje manji od 4, da pita za naziv svakog recorda ponaosob, a ako se selektuje veći broj stavki, da se brisanje potvrdi samo jednom.

Može li to nekako da se izvede?

[Ovu poruku je menjao smal dana 05.07.2010. u 23:27 GMT+1]
[ banem @ 05.07.2010. 22:34 ] @
Ja to stavim malo jednostavnije, umesto:

Response = acDataErrContinue

ide:

Response = 0

------

Smal, da bi utvrdio koliko zapisa je obeležno, iskoristi npr. ovo:

Function BrObelezenihZapisa() As Long
Dim F As Form
Dim RS As Recordset

Set F = Forms![frmNazivForme]
Set RS = F.RecordsetClone

RS.MoveFirst
RS.Move F.SelTop - 1
BrObelezenihZapisa = F.SelHeight
End Function

Mislim da će raditi ovako. Onda u programu što već imaš samo napravi:

If BrObelezenihZapisa > 3 Then

...itd
[ captPicard @ 06.07.2010. 07:24 ] @
Zašto ne napravite svoju formu za Upite tipa Da/Ne/Odustani?
[ smal @ 06.07.2010. 08:34 ] @
Citat:
banem: Smal, da bi utvrdio koliko zapisa je obeležno, iskoristi npr. ovo:

Kada je funkcija na On Delete, kontrolno pitanje izgleda mora da se pojavljuje za svaki obrisani record, mada lepo izbroji broj recorda, ali zato dosta uspori skrolovanje liste...

U svakom slučaju, hvala za funkciju, ostaviću program kakav je bio, a nju ću iskoristi za neku drugu primenu, već imam ideju :)
[ smal @ 06.07.2010. 11:15 ] @
Citat:
Zidar: Zatim, setovanje
Code:
Application.SetOption "Confirm Record Changes", 0
je na nivou aplikacije i moze da utice na druge stvari. Ne kazem da ne treba ovako raditi, ali treba biti svestan sta se u stvari desava.

Umesto pomenutog koda, može i da se na BeforeDelConfirm stavi
Code:
DoCmd.SetWarnings False

pa na AfterDelConfirm:
Code:
DoCmd.SetWarnings True

U pravu je Zidar. Tako je ipak sigurnije.
[ captPicard @ 06.07.2010. 11:27 ] @
Citat:
smal: Umesto pomenutog koda, može i da se na BeforeDelConfirm stavi
Code:
DoCmd.SetWarnings False

pa na AfterDelConfirm:
Code:
DoCmd.SetWarnings True

U pravu je Zidar. Tako je ipak sigurnije.


Hm, a šta ako se dogodi neka greška tijekom operacije?
[ Zidar @ 06.07.2010. 14:50 ] @
Citat:
Hm, a šta ako se dogodi neka greška tijekom operacije?

Pa stavicemo ERROR handling, bilo koja varijanta da je u pitanju.

Nisam znao da SET Wanings ponistava i poruke o brisanju, mislio sam da je to samo za action queries. Nemam vremena da proverim, ali nemam ni razloga da sumnjam.

U svakom slucaju, lepa diskusija. Sve ideje koje su iznete su dobre. Svaka ideja ima svoju primenu u odredjenoj situaciji. Stos je znati za veci broj opcija i znati kada koju treba primeniti. A ideje se uvek mogu nadgraditi. Ono sto Small radi je veoma interesantno, vredi experimentisati. Intersantno je i pitanje kako prijaviti broj rekorda koji su oznaceni za brisanje. I naravno, sta ako stavri podju naopako, pa nam treba neka komanda tipa Undo. A i zamena za originalni Access msgbox je razuman zahtev.

Ima dakle sta da se radi u ovoj oblasti.

[ normandija @ 13.08.2010. 10:51 ] @
A na koji nacin se moze u obavjestajnom dijalogu promeniti da pise DA/NE umesto Yes/No ?
[ Getsbi @ 13.08.2010. 15:13 ] @
Evo ti jedan .dll fajl koji treba da registruješ i uključiš u VBA reference kao i sve druge biblioteke. Kasnije u VBA kodu, umesto MsgBox........ kooristiš zxzBox........ Ovo sam dobio posredstvom Izonika alijas ZXZ sa foruma koji nažalost više ne radi.

Isprobaj i ovaj drugi fajl.

[Ovu poruku je menjao Getsbi dana 13.08.2010. u 16:26 GMT+1]
[ izonic @ 13.08.2010. 23:43 ] @
Funkciju staviti u neki modul.
Modul mora biti zatvoren pri pokretanju brisanja.

Code:
Option Compare Database
Option Explicit
Const Titl = "Ime vase aplikacije"
Dim K As Single
Dim iResponse As String

Function Brisi_Rekorde() As Boolean
'*******************************************
'Ime:      Brisi_Rekorde  (Function)
'Sadržaj:  Upozorenje pri brisanju rekorda
'Autor:     ZXZ
'Datum:      13.08.2010
'Adresa: Tuzla BiH
'Email:     [email protected]
'Ulazni parametri:
'Izlazni parametri:True/false
'*******************************************
Dim Frm As Form
Dim Broj_Redova As Single

DoCmd.SetWarnings False
Set Frm = Screen.ActiveForm
Broj_Redova = Frm.SelHeight

    If K = 0 Then
    K = Broj_Redova - 1
    iResponse = MsgBox("Brišeš: " & Broj_Redova & " red/(ov)a  ", _
    vbYesNo + vbCritical + vbApplicationModal + vbDefaultButton1, Titl)
    Else
    K = K - 1
    End If
    
Select Case iResponse
    Case vbYes:
      Brisi_Rekorde = False
    Case vbNo:
      Brisi_Rekorde = True
End Select
Izlaz:
Exit Function
Kraj:
End Function


Poziv funkcije sa forme:
Code:
Private Sub Form_Delete(Cancel As Integer)
Cancel = Brisi_Rekorde
End Sub

[ normandija @ 16.08.2010. 09:53 ] @
Citat:

Evo ti jedan .dll fajl koji treba da registruješ i uključiš u VBA reference kao i sve druge biblioteke. Kasnije u VBA kodu, umesto MsgBox........ kooristiš zxzBox........ Ovo sam dobio posredstvom Izonika alijas ZXZ sa foruma koji nažalost više ne radi.

Isprobaj i ovaj drugi fajl.



a de da ukljucim taj .dll ? mislim na koji nacin kako podesiti to ?
[ pmiroslav @ 16.08.2010. 11:36 ] @
Otvoriš neku formu u Design modu pa pritisneš ikonicu Code da ti se otvori Microsoft Visual basic prozor.
U tom prozoru odeš na Tools - References
zatim Browse pa učitaš taj zxz.dll.
[ Getsbi @ 16.08.2010. 15:31 ] @
Ako ćeš biblioteku da koristiš samo za tekući .mdb onda možeš da je staviš u isti folder sa .mdb fajlom i postupiš kako ti je Miroslav rekao. Ako želiš da je koristiš u svim budućim programima i da na nju zaboraviš što se premeštanja i kopiranja tiče, onda je registruj.
Registrovanje:
1. ispod C:\Windows\system32 iskopirati zxz.dll
2. ( Start, Run regsvr32 /s zxz.dll )
[ normandija @ 17.08.2010. 12:15 ] @
Uredu,hvala mnogo na odgovorima ....