Toon posts:

[MS Access] Standaard waarde = waarde vorig record

Pagina: 1
Acties:
  • 1.381 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
De titel zegt het eigenlijk al. Ik heb in Access een form en bij het aanmaken van een nieuw record zou standaard de vorige waarde moeten komen zodat die niet telkens opnieuw ingevuld moet worden (het zijn telkens reeksen van 5 tot 20). Ik heb al gezocht bij de eigenschappen van het veld bij Data - Default Value (Expression Builder) maar daar vind ik alleen mathematische functies (constants, operators, functions,...) maar niets dat lijkt op Previous Value of zo. Het lijkt me dat dit mogelijk moet zijn omdat het een vanzelfsprekende functie is. Iemand een idee?

Screenshot:
Afbeeldingslocatie: http://img80.imageshack.us/img80/6017/dbka4.png

Verwijderd

sneltoets ctrl+' ofwel ms knowledge base artikel : How to fill a record with data from a previous record automatically

Verwijderd

Topicstarter
Thanks, maar het werkt niet op die manier, ik heb de volgende stappen gedaan:

Creëren module:
Afbeeldingslocatie: http://img153.imageshack.us/img153/3725/1ck2.png

Setting instellen in de form:
Afbeeldingslocatie: http://img146.imageshack.us/img146/1928/2jj3.png

Setting instellen in het tekstvak:
Afbeeldingslocatie: http://img146.imageshack.us/img146/9489/3qh2.png

Duidelijk maken van waar de standaardwaarde moet komen:
Afbeeldingslocatie: http://img153.imageshack.us/img153/4313/5lr2.png

Als ik dan van design mode naar normal mode switch krijg ik deze fout:
Afbeeldingslocatie: http://img150.imageshack.us/img150/4910/4th3.png

Iemand een idee waarom dit datatype niet gedefinieerd is? Ik heb gewoon copy/paste gedaan.

Ik snap trouwens niet waarom de naam van het tekstvak gelijk moet zijn aan die van de module, op die manier moet je voor elk vak waarin je een standaardwaarde wilt een nieuwe module creëren.

PS: Wat een omslachtig gedoe voor zo'n eenvoudige feature, en dan werkt het niet eens. :/

Verwijderd

vbe->extra->verwijzingen->microsoft DAO 3.6 (of meest recente versie die je ziet staan) object library aanvinken. deze bibliotheek is sinds access 2002 niet meer standaard aangevinkt.

edit:engels:tools->references

[ Voor 8% gewijzigd door Verwijderd op 08-12-2006 14:53 ]


Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 08 december 2006 @ 14:51:
vbe->extra->verwijzingen->microsoft DAO 3.6 (of meest recente versie die je ziet staan) object library aanvinken. deze bibliotheek is sinds access 2002 niet meer standaard aangevinkt.

edit:engels:tools->references
Ok, ik heb het aangevinkt en die error is weg, maar het werkt nog steeds niet. :(

Het is toch als volgt: Als je voor álle velden de voorgaande waarden als default value wilt, dan moet je in de form-eigenschappen dit invullen: =AutoFillNewRecord([Forms]![Customers]), en Customers vervangen door de naam van mijn form (Form 1), zie deze quote:
You can call this function from a form's OnCurrent property event procedure to fill all the fields in a new record using data from the previous record.

Open the Customers form in Design view. Change the OnCurrent property of the form to read as follows:

=AutoFillNewRecord([Forms]![Customers])
Dit werkt, maar ik wil dat slechts enkele velden die waarde overnemen, dan moet ik toch de voorgaande stap negeren en in een nieuw aangemaakte tekstbox dit invullen:
Name: AutoFillNewRecordFields
Visible: No
DefaultValue: CompanyName;ContactName;ContactTitle;Address
Met als default values de namen van de tekstvakken die ik wil, gescheiden door puntkomma's? Zoals hier staat dus:
Note: This sample setting for the text box works only in the Northwind sample database. For your own database, you can set the DefaultValue property with a semicolon-delimited list of control names.

When you go to a new record, the CompanyName, ContactName, ContactTitle, and Address fields are filled in automatically. If you want all fields to automatically be filled in, you can leave the DefaultValue property blank or omit putting the AutoFillNewRecordFields text box on the form.
Als ik dat doe krijg ik een blanco veld. Ik heb al geprobeerd tussen dubbele quotes, tussen brackets en voorafgegaan door de tabelnaam (tussen brackets).

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

't is inderdaad omslachtig en het kán ook simpeler :). Voordeel van Ms methode is dat hij tamelijk generiek is. Wat je fout doet is dat je, als je niet alle velden wilt autofillen, toch ook nog de on_current code moet blijven gebruiken.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
niesje schreef op vrijdag 08 december 2006 @ 21:03:
't is inderdaad omslachtig en het kán ook simpeler :). Voordeel van Ms methode is dat hij tamelijk generiek is. Wat je fout doet is dat je, als je niet alle velden wilt autofillen, toch ook nog de on_current code moet blijven gebruiken.
Dat heb ik ook al geprobeerd, maar zonder resultaat.

Form Properties:
On Current: =AutoFillNewRecord(Forms![Form 2]) (Form 2 = formuliernaam)

Text Box Properties:
Name: AutoFillNewRecordFields
Default Value: Job ID;Quantity;Part ID TTC
Zoals hier opgegeven.

Resultaat: De velden die overgenomen dienen te worden krijgen als waarde #Name? en als ik terug naar de standaard waarde van de textbox ga kijken zijn ze verdwenen.

De bedoeling is zo eenvoudig, maar ik ben er al een halve dag mee bezig. Ik zou de gebruikers de velden die per sessie niet veranderen zelf kunnen laten invullen maar dat kost veel tijd en de kans op fouten neemt flink toe. De VB module werkt goed, maar het gaat fout bij de standaardwaarde van die tekstbox.

Edit: Ik heb nog wat geprobeerd en als ik als standaard waarde ="Job Id" geef werkt het, maar alle drie gaat (nog) niet, ik heb al gebruik gemaakt van ; en AND maar het blijkt dus tussen dubbele quotes te moeten, niet zonder quotes zoals in de MS Help. Eén veld blijkt dus al te werken.

[ Voor 47% gewijzigd door Verwijderd op 08-12-2006 22:33 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

wat heb je ingevuld bij standaardwaarde: de letterlijke tekst of iets als =Jobid;Quantity;etc? In je screendump staat het namelijk fout :). De ms code is misschien krom, maar wel correct. Een andere mogelijkheid is om dat hele extra tekstboxje te vergeten en de functie als volgt te wijzigen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function AutoFillNewRecord(F As Form)
   Dim RS As DAO.Recordset, C As Control
   On Error Resume Next
   
   If Not F.NewRecord Then Exit Function
   Set RS = F.RecordsetClone
   RS.MoveLast
   If Err <> 0 Then Exit Function
   F.Painting = False
   For Each C In F
         If c.tag = "DoeMijOokMaar" Then
                  C = RS(C.ControlSource)
         End If
   Next
   F.Painting = True
End Function

Als je nu bij de eigenschap 'extra info' van een willekeurig textboxje 'DoeMijOokMaar' invult wordt dat control bijgewerkt. :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
niesje schreef op vrijdag 08 december 2006 @ 23:49:
wat heb je ingevuld bij standaardwaarde: de letterlijke tekst of iets als =Jobid;Quantity;etc? In je screendump staat het namelijk fout :). De ms code is misschien krom, maar wel correct.
Ik heb het ingevuld zoals ik het laatst schreef:
code:
1
Job ID;Quantity;Part ID TTC
Wat je in het screenshot ziet is een van mijn probeersels. :)

Alleen "Job Id" werkt (tussen dubbele quotes), het is alsof er slechts één default ingevuld kan worden.
Een andere mogelijkheid is om dat hele extra tekstboxje te vergeten en de functie als volgt te wijzigen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function AutoFillNewRecord(F As Form)
   Dim RS As DAO.Recordset, C As Control
   On Error Resume Next
   
   If Not F.NewRecord Then Exit Function
   Set RS = F.RecordsetClone
   RS.MoveLast
   If Err <> 0 Then Exit Function
   F.Painting = False
   For Each C In F
         If c.tag = "DoeMijOokMaar" Then
                  C = RS(C.ControlSource)
         End If
   Next
   F.Painting = True
End Function

Als je nu bij de eigenschap 'extra info' van een willekeurig textboxje 'DoeMijOokMaar' invult wordt dat control bijgewerkt. :)
Ok, ik denk dat ik het zo zal doen, maar wat bedoel je met de eigenschap 'extra info'? En moet ik dan ook nog iets invullen als default value?

Verwijderd

Topicstarter
Ok, ik was aan het zoeken naar "extra info", maar aangezien ik gebruik maak van een engelstalige versie moet het dus "tag" zijn. Zo gezegd, zo gedaan, maar als ik een nieuw record wil aanmaken krijg ik lege tekstvakken. De VB-module is een letterlijke copy/paste en heb ik gesaved als AutoFillNewRecord. In de tekstboxen die moeten veranderen heb ik bij Properties / Tag DoeMijOokMaar ingevuld.

Ik heb het ook tussen quotes geprobeerd en bij de Form Properties heb ik eens met en eens zonder =AutoFillNewRecord(Forms![Form 1]) geprobeerd. Maar zonder resultaat.

In Default Value heb ik al verschillende dingen geprobeerd, zoals:
AutoFillNewRecord («F»)
AutoFillNewRecord («DoeMijOokMaar»)
AutoFillNewRecord (DoeMijOokMaar)

Maar als ik een nieuw record aanmaak krijg telkens #Error# in mijn tekstvak. DoeMijOokMaar wordt trouwens automatisch tussen dubbele quotes geplaatst, het wordt gezien als een tekst, niet als de waarde uit de module.

Van alle voorgaande zaken heb ik alle combinaties geprobeerd, maar ik krijg steeds een leeg tekstvak (eerste geval) of een error (tweede geval). Het enige dat werkt is wat ik hier beschrijf, maar ik wil het dus niet voor alle velden (het is verwarrend als je telkens alle velden moet aanpassen omdat een deel telkens verandert en een deel zelden verandert).

Verwijderd

de autofillnewrecord is wel een beetje een omweg. misschien beter rechtstreeks de code in het form_current event in de formmodule zelf plaatsen.
wis eerst alle events die je via forms->properties hebt ingevuld
als er al code staat in het formulier kan je dit rechtstreeks via de vbe oproepen, staat die er nog niet kan je dit via de properties->oncurrent->program code oproepen. normaal gesproken kom je dan automatisch in het form_current skelet sub terecht. plaats de volgende code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Form_Current()
  Dim FieldControl  As Control
  Dim TableClone    As DAO.Recordset
  
  If Not Me.NewRecord Then
    Exit Sub
  End If
  Set TableClone = Me.RecordsetClone
  TableClone.MoveLast
  Me.Painting = False
  For Each FieldControl In Me.Controls
    If FieldControl.Tag = "DoeMijOokMaar" Then
      FieldControl.Value = TableClone.Fields(FieldControl.ControlSource)
    End If
  Next
  Me.Painting = True
End Sub
aangezien deze gebeurtenisafhandelaar zich al in de formmodule bevindt, moet een verwijzing naar de form niet als argument doorgegeven worden (zoals bij de functie wel het geval was). voor de zekerheid wijs ik er nog even op dat de tag in de textbox (dus niet in het label) van de velden die je van het vorige record wenst over te nemen de waarde DoeMijOokMaar moet bevatten.

Verwijderd

Topicstarter
Thanks! Nu werkt het! Dit was de bedoeling. :)

[ Voor 93% gewijzigd door Verwijderd op 14-12-2006 16:02 ]

Pagina: 1