[Access] Velden benaderen zonder tekstvak

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

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Ik begin nu een beetje |:( te worden.
Ik heb een rapport waarbij in een tekst bepaalde waardes vervangen moeten worden door waardes in datzelfde record.

Dus bijvoorbeeld
"Mijn naam is {voornaam} {achternaam}"

Het vervangen wil wel, maar zodra ik een veldnaam gebruik waarvan er geen overeenstemmend tekstvak op het rapport staat geeft Access een foutmelding:
"<Kan het veld aantal niet vinden waarnaar wordt verwezen in de expressie.@De veldnaam is onjuist gespeld, de naam van het veld is gewijzigd of het veld is verwijderd.@@1@411730@1>"

Het enige wat ik dus wil is een veld benaderen vanuit de VBA code. Maar ik krijg dit niet voor elkaar :(
Hoe is het mogelijk om bv de recordset van het rapport aan te spreken?

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Gewoon het tekstvak met de waarde op het rapport zetten op met Visible op False, en het werkt wel.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 03 juni 2002 12:49 schreef ATS het volgende:
Gewoon het tekstvak met de waarde op het rapport zetten op met Visible op False, en het werkt wel.
Ja maar het MOET toch ook anders kunnen?
Anders moet ik vrij lomp een stuk of 50/60 velden gaan neerzetten.

Verwijderd

wat je misschien zou kunnen doen (zo kan het tenminste in asp) is 'on error resume next' ergens zetten. Als er een fout in de query is gaat ie gewoon door. (dus bij mij in asp tenminste)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 02-09 19:44

Gerco

Professional Newbie

In een formulier heb je zoiets als RecordsetClone(), misschien in een rapport ook wel?

Dan krijg je een kopie van de onderliggende recordset van dat formulier terug en daar kun je mee doen wat je wilt.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Sjnirk
  • Registratie: Maart 2001
  • Laatst online: 27-03-2025

Sjnirk

Hie vrieve

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function gemiddeldefunctie()
   Dim rst As ADODB.Recordset
   Dim x, i, j As Integer
   Dim selectiequery As String
  Set rst = New ADODB.Recordset
selectiequery = "select * from printer_afdruk_rapport where paprinternr =" & interndoorgeef

rst.Open selectiequery, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
 'Set Reports("documentatie").Recordset = rst
 x = 0
rst.MoveFirst
For i = 1 To rst.RecordCount
  If rst("pafouttief") = True Then
    Else
    x = x + (rst("paeindstand") - rst("pabeginstand"))
    j = j + 1
    
    End If
    rst.MoveNext
 Next i
 rst.MoveLast
gemiddeldefunctie = x / j

End Function

Stukje rapport van een printer overzicht

Bikkelen gebeurt pas na 2:00


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Een recordsetclone() werkt niet bij een rapport.
Ik zal dan toch een aparte recordset moeten maken en die ernaast maken met dezelfde recordsouce. Ik heb het nu maar opgelost met hidden textboxes. Toch blijf ik het belachelijk vinden dat je niet over alle velden kan beschikken.

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Het kán natuurlijk wel anders, en als je 50 of 60 velden wil gebruiken dan kan dat ook wel uit denk ik. Als ik er van uit ga dat je tabel een veld bevat waar een uniek ID in staat, dan kan je het volgende gebruiken (untested code):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Public Function GetValue(ID As Long, Field As String) As Variant
Static rs As Recordset
Static iID as Long

If rs Is Nothing Then
 Set rs=CurrentDb.OpenRecordset("SELECT * FROM MyTabel")
 'als je rapport een seletie gebruikt, dan is het efficienter die ook hier te gebruiken. 
 'Ook als die selectie niet altijd dezelfde is kan je hem met wat moeite wel uit het rapport vissen, 
 'maar dat mag je zelf uitzoeken :-)
End If

If iID<>ID Then
 rs.FindFirst "ID=" & ID
 If Not rs.NoMatch Then
  iID=ID
 End If
End If

If iID=ID Then 'Nog een keer testen voor het geval het record hierboven niet gevonden is. We geven dan een lege string terug.
 GetValue=rs.Fields(Field)
Else
 GetValue=""
End If

End Function

In je rapport kan je nu gewoon de functie GetValue gebruiken met als argument het ID van het record en het veld dat je hebben wil. Dat wordt vervolgens opgezocht (als hij er nog niet was) en teruggegeven.

Het resultaat is een stuk schoner dan 50 of 60 verborgen velden.

HTH

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Zo kan het inderdaad ja. Echter is dit natuurlijk allerminst efficient. Ik gebruik query's met vrij veel left-joins en dat begint redelijk intensief te worden. Ik denk dat de hidden textboxes dan een betere oplossing is.

Maar ik kan met geen mogelijkheid begrijpen waarom de mensen van access niet een mogelijkheid hebben ingebouwd in de trend van
code:
1
user = CurrentRecord.Field("userID")

Het gedoe met recordsets clonen en queries namaken vind ik een beetje dubieus.

Toch bedankt voor de moeite die je hebt genomen :)

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Zoveel velden extra op je rapport is ook niet efficient, en bovendien slecht te onderhouden. De query wordt in de functie maar één keer uitgevoerd als je goed kijkt, dus ik denk dat de performance penalty mee valt, zeker als je resultaatset niet al te groot is. Wel moet je natuurlijk een nette "opruim-aanroep" maken. Volgens mij is er wel een event in het rapport object dat je kan gebruiken (iets als "after layout" ofzo) om de functie een keer met een speciaal argument aan te roepen om je rommel op te ruimen (recordset weggooien). Graag gedaan overigens. Ik heb zelf ook veel aan fora en nieuwsgroepen gehad, dus ik mag wel eens wat terugdoen :)

Er zitten in Access overigens wel meer rare eigenschappen. Het is dan ook niet geschikt om voor grote projecten te gebruiken vind ik...:7

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant

Pagina: 1