Avatar billede mortenf Nybegynder
16. oktober 2001 - 11:45 Der er 34 kommentarer og
1 løsning

Validering af record

Jeg har en main form indeholdende en subform i datasheet view. Jeg vil gerne lade en bruger opdatere en record i formen, men de enkelte fields skal valideres samlet inden de gemmes i den underliggende tabel.
Når recorden er opdateret, skal den opdaterede record vises i datasheet view\'et.

Hvordan gøres dette bedst?
Avatar billede terry Ekspert
16. oktober 2001 - 11:46 #1
validate the fields in the before update event for the sub form
Avatar billede mortenf Nybegynder
16. oktober 2001 - 11:48 #2
Giver det mig mulighed for at validere alle fields samlet eller kun ét field af gangen?
Avatar billede terry Ekspert
16. oktober 2001 - 11:51 #3
Normally a sub form is used for showing related record such as order details and the main form hold the order information. I have a felling that your sub form is not related and shows a list of all the existing main forms. So I think you will need to place your validate routine in the before update event for the main form. Then in the AFTER UPDATE event you will more than likely have to refresh the form to update the sub form.
Me.refresh does this.
Avatar billede terry Ekspert
16. oktober 2001 - 11:53 #4
In the before update event for the form you can validate ALL fields at once and if you find an invalid field place the cirsor in thhe field me.YourField.setfocud and then set the Cancel parameter to True.

cancel = True
This halts the update
Avatar billede terry Ekspert
16. oktober 2001 - 11:55 #5
If you want to validate each field the you can us eth ebefore update event for the control(field) in the same way.
Avatar billede terry Ekspert
16. oktober 2001 - 11:58 #6
me.YourField.setfocus
Avatar billede mortenf Nybegynder
16. oktober 2001 - 11:59 #7
Der er liiige en information mere: et par af mine fields i subformen er sammensatte - control source refererer til to fields i record. Dvs at fieldene ikke kan opdateres direkte i subformen
Avatar billede terry Ekspert
16. oktober 2001 - 12:06 #8
Not sure I understand what you mean there!

Is the record source for the main form the same as for the sub form?
Read my comment from 11:51:56!
Avatar billede mortenf Nybegynder
16. oktober 2001 - 12:55 #9
Min main form indeholder et par command buttons og subformen med data. Main formen indeholder ikke data fields. Er der andre måder, man kan kombinere et datasheet view med command buttons?

I subformens datasheet view ligger dataene, som brugeren kan redigere. Hvert field er dannet i design view af en textbox. Textboxens Control Source property indeholder linket til fields i det underliggende recordset. For et par af fieldene består Control Sourcen af et sammensat udtryk af to fields i recordset\'et. Når en Control Source indeholder et sammensat udtryk, så kan data i recorden ikke opdateres ved at editere feltet - hverken i form view eller datasheet view.
Avatar billede terry Ekspert
16. oktober 2001 - 13:06 #10
OK I think I undertand your problem. Why cant the user have two fields which are NOT \"sammensat\"?

If you MUST have just one field then you will have to do some VB programming. You have an NBOUND field which shows the values of the other two fields. When your unbound field changes you update the other two fields with this data. This will have to be done in VBA code.
Avatar billede mortenf Nybegynder
16. oktober 2001 - 13:11 #11
... det må du gerne uddybe.
VB er ikke noget problem.
Avatar billede mortenf Nybegynder
16. oktober 2001 - 13:18 #12
.....yderligere, Me.refresh virker fint, hvis det ikke er den første record i datasheet\'et. Den første record opdateres først, når man forlader recorden (clicker på en anden record). Er der et alternativ?
Avatar billede terry Ekspert
16. oktober 2001 - 13:42 #13
mortenf> The \"sammensat\" field is NOT bouns to the database fields is this correct? You therefor want to copy the new value of this \"sammensat\" field to the two fields you used to make the \"sammensat\" field. Is this correct?

If so, then in the After Update event for the FIELD you need to make some code to split the \"sammensat\" field into two.

For example.

Me.field1 = Left(Me.Sammensat, 4)
Me.field2 = Mid(me.sammensat, 5, 6)

or something like that....
Avatar billede mortenf Nybegynder
16. oktober 2001 - 13:46 #14
Det sammensatte field er bound til data base fields vha Control Source \"=[Field1] & \"-\" & [Field2]\"
Avatar billede terry Ekspert
16. oktober 2001 - 13:49 #15
The bit about me.refresh !


I dont understand what youmean withth efirst record, whatis the differenc between the first and the others?

Avatar billede terry Ekspert
16. oktober 2001 - 13:59 #16
you are not allowed to edit the \"sammensatte\" field are you?
Avatar billede mortenf Nybegynder
16. oktober 2001 - 14:09 #17
Korrekt - jeg får en fejl. Jeg har forsøgt mig med at oprette en tilsvarende form med unbound fields, der loades med datasheet recordens værdier. I den nye form redigerer brugeren sine data og disse valideres inden recorden opdateres..... men jeg synes det er besværligt - er der en lettere måde?
Avatar billede terry Ekspert
16. oktober 2001 - 14:13 #18
mortenf> Why MUST you have a \"sammensatte\" field?
Have two fields so the user can alter each field as needed.
I can really say if there is an easier method, as I dont know your requirements. But normally there is one field for each field or you could just as well only have one field in the database IKKE?
Avatar billede mortenf Nybegynder
16. oktober 2001 - 14:20 #19
Jeg har to fields i data basen, hvir det ene repræsenterer et gruppe element og det andet et individuelt element, men brugeren kender kun dette element som et [gruppeField]-[individueltField]..... derfor vil jeg meget gerne vise brugeren det connectede field og ikke to enkeltstående fields.
Opsplitningen i et gruppefield og et individuelt field er valgt, for lettere at kunne foretage søgninger i databasen, da en bruger normalt kun er interesseret i data indenfor den gruppe han tilhører.
Avatar billede terry Ekspert
16. oktober 2001 - 14:31 #20
all I can suggest is that you have an extra field in the database which contains the values of the other two fields. Then you have to code your way out of the problem!
Avatar billede mortenf Nybegynder
16. oktober 2001 - 14:34 #21
Tja, det er nok en god idé.... den metode jeg har prøvet, er ret besværlig.

Har du en forklaring på, hvorfor den første record i et datasheet view ikke opdateres, når man anvender Me.refresh?
Avatar billede terry Ekspert
16. oktober 2001 - 14:37 #22
All fields should work the same!
Avatar billede mortenf Nybegynder
16. oktober 2001 - 14:42 #23
Måske er problemet, at ved refresh flyttes markøren til den første record og dermed opdateres de andre records.

Jeg laver et sammensat field i data basen som repræsenterer de to fields, så slipper jeg forhåbentligt for problemerne med sammensatte fields i forms
Avatar billede terry Ekspert
16. oktober 2001 - 14:44 #24
you shouldnt need to refresh if all your fields are bound (linked) to the database.
Avatar billede mortenf Nybegynder
16. oktober 2001 - 14:55 #25
Jeg har haft brug for refresh, da jeg har forsøgt at anvende en seperat form (med unbound data) til redigering af en record..... men jeg dropper den løsning - det er for besværligt.
Avatar billede mortenf Nybegynder
17. oktober 2001 - 16:11 #26
Jeg har ændret min tabel, så hvert field i formen svarer til ét field i tabellen.

Men af en eller anden grund kan jeg ikke få Me.Refresh til at virke.
Jeg har en meget simpel main form, der kun indeholder en Refresh button og en subform. Subformen indeholder data fra en underliggende tabel.
I et multiuser miljø skal brugeren kunne opdatere ændrede records (ændret af andre brugere) ved f.eks at klikke på refresh. VB koden for refresh knappen i main formen, har jeg prøvet med:
Me.Refresh
Me![fsubForm].Form.Refresh
men ingen af delene opdatere en record, der er ændret af en anden bruger.
Lukker jeg derimod min main form og åbner edn igen, så opdateres evt. ændrede records.

Hvad gør jeg forkert? ...... håber du stadig er der Terry ;-)
Avatar billede mortenf Nybegynder
17. oktober 2001 - 16:53 #27
.... tabellerne ligger på en SQL server
Avatar billede terry Ekspert
17. oktober 2001 - 21:08 #28
Hi mortenf> yes I am here still :o)

Why do you need a sub form?

Do youmean that iys possible for other users to alter the data which you are showing in the form and you wnat to be able to  click the refresh button to read the (måske) updated records?

Try the me.requery method.

But what happens if more than one user alters the same data?
Avatar billede mortenf Nybegynder
18. oktober 2001 - 10:31 #29
Det er godt, at høre fra dig :o)

Jeg vil gerne have en subform i datasheet view, da det er vigtigt for brugeren, at kunne se mange records samtidig.

Flere brugere vil arbejde med databasen samtidig..... og det er vel nærmest det klassiske problem vedr. hvem der har ret til at ændre i en record og hvad sker der, hvis bruger A har ændret en record, mens bruger B er i gang med at ændre den.

Jeg har prøvet med Me.Requery - det gik heller ikke.

Jeg kan maile dig et eksempel på hvad jeg mener, så er det lidt lettere at forklare, hvad jeg gerne vil. Har du mulighed for at arbejde med .adp filer?
Har du erfaring med SQL-server som back-end?

Jeg har prøvet det samme med .mdb database (opdelt i en back-end og en front-end, der linker til tabellerne i back-end)..... og her fungerer det uden problemer. Faktisk er det ikke nødvendigt at kalde Refresh/Requery, da opdateringen sker automatisk.
Avatar billede terry Ekspert
18. oktober 2001 - 11:19 #30
hi morten>
Morten you can show all your records without having a sub form. In the forms properties set the default view to Continuous Forms.

I use SQL-server as a backend almost all the time, so have no problem with that, but we only use Access 97 here so .adp files is out of the question.  I do have Access 2000 on another PC but no access SQL Server from there.

Just out of interest can you place a timer on the sub form and from there call me.requery?

requery should work its just a case of getting it placed in the right event.

You could send me it to look at and I may get some ideas. Also the db if you like

dkTeBrSa@Europe.lego.com



Avatar billede mortenf Nybegynder
18. oktober 2001 - 11:57 #31
Formålet med en Refresh/Requery knap er, at en bruger altid kan opdatere andre brugeres input..... eller som du selv foreslår, kan refresh/requery lægges i en timer event.
En record i en continues eller datasheet sub form kan fint opdateres vha af en Timer for subformen, så jeg har formentligt en reference fejl (fra knappen i main form til min subform), når jeg anvender en knap fremfor en timer til refresh.

Hele opdatering-af-records problemet er to-delt:
1) den ene del er, at bruger A skal kunne se ændringer som Bruger B foretager. Dette kræver, at formen opdateres med de værdier, der står i tabellen.
2) Den anden del er, hvilken bruger har lock\'et en record.

ad 1) Jeg kigger videre på referencen fra Main form knappen til subform.....

ad 2) Jeg vil helst anvende en record-level pessimistic locking, men det ser ud til at SQL serveren som default sætter locking til Optimistic.... hvad er din erfaring?
Avatar billede terry Ekspert
18. oktober 2001 - 12:17 #32
yes if it works with a timer then it looks as though you have a reference problem.

Locking. To be honest I dont think about it. Most of the applications I work with are multi user, but generally the chances of two people altering the same data is very slim. If they do then I hope my error routines catch it.

If you go into the OPtions menu and under the Advanced tab you may be able to alter which locking method is used, I havent played with this myself though.
Avatar billede mortenf Nybegynder
18. oktober 2001 - 14:01 #33
Problemet er løst..... :-) Fejlen var, at mit recordset var baseret på en query og dermed er det åbenbart ikke nok at refreshe formen, men recordset skal refreshes.
Me.Refresh virker fint, hvis recordset refererer direkte til en tabel.

Locking options under Options|Advanced tab er ikke tilgængelig i .adp
Avatar billede terry Ekspert
18. oktober 2001 - 14:03 #34
but how did it work with the timer?
Anyway, it sworking now and thats the important thing.
:o)
Avatar billede mortenf Nybegynder
18. oktober 2001 - 14:25 #35
Det virker med timeren, men det er et problem at ved en opdatering flyttes cursoren til første field i første record (datasheet view)...... det vil ganske sikkert være generende for en bruger, hvis cursoren ofte flyttes (også selvom den flyttes tilbage til det rigtige field) som følge af record refresh.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester