Hej! Har optimerat funktionen lite genom att använda mig en variabel för fält objektet och öppnar recordsetet som dbOpenForwardOnly. Vilket kräver mindre resurer och går snabbare. Hej Andreas! Testa med att skriva Public Function fCompetences och lägg den i en modul. hmm...tyvärr får jag fortfarande #Name som utskrift i Rapporten...jag undrar om jag gör anropet från Expression Builder rätt?? hmm...tyvärr får jag fortfarande #Name som utskrift i Rapporten...jag undrar om jag gör anropet från Expression Builder rätt??Använda VB för att formatera Accessrapport
Jag har skrivit en VB modul som skall slå ihop output från en sql fråga till en sträng. Funktionen i VB modulen ska anropas från Rapporten m.h.a expression Builder. Vet bara inte riktigt hur jag ska göra anropet för att få tillrätt paramater...är inte helt säker på att jag tänkt rätt i min modulkod oxå. Tacksam för hjälp! Monica
Här är koden:
Function fCompetences(manyTable As String, _
OnePrimKey As String, _
fieldConcat As String, _
onePrimType As Integer, _
varIDvalue As Variant) As String
'Returnerar fält från Många-sidan av en en-till-många relation
'i semikolon separerat format.
'manyTable = många-sidan-tabellen
'OnePrimKey = Primärnyckeln på en-sidan-tabellen.
'fieldConcat = Fältet som ska konkateneras.
'onePrimType = primärnyckelns(på en-sidan tabellen) datatyp.
'varIDValue = värdet på primärnyckeln som ska vara i "where-satsen"
'Dim db As Database
Dim RS As Recordset
Dim varConcat As Variant
Dim strCriteria As String, stRSQL As String
varConcat = Null
Set db = CurrentDb
stRSQL = "Select [" & fieldConcat & "] From [" & manyTable & "]"
stRSQL = stRSQL & " Where "
stRSQL = stRSQL & "[" & OnePrimKey & "] = '" & varIDvalue & "'"
Set RS = db.OpenRecordset(stRSQL, dbOpenSnapshot)
With RS
If .RecordCount <> 0 Then
'Konkatenera
Do While Not RS.EOF
varConcat = varConcat & RS(fieldConcat) & ","
.MoveNext
Loop
End If
End With
'Trimma
fCompetences = Left(varConcat, Len(varConcat) - 1)
Exit_fCompetences:
Set RS = Nothing: Set db = Nothing
Exit Function
End FunctionSv: Använda VB för att formatera Accessrapport
Sedan har jag också implementerat BuildCriteria för att skapa vilkoret i WHERE satsen. Vilken datatyp fältet har anger man med onePrimType.
Om fältet är en sträng använder använder man adText = 10. Om det är ett Långt Heltal använder man sig av adLong = 4.
Function fCompetences(manyTable As String, _
OnePrimKey As String, _
fieldConcat As String, _
onePrimType As Integer, _
varIDvalue As Variant) As String
'Returnerar fält från Många-sidan av en en-till-många relation
'i semikolon separerat format.
'manyTable = många-sidan-tabellen
'OnePrimKey = Primärnyckeln på en-sidan-tabellen.
'fieldConcat = Fältet som ska konkateneras.
'onePrimType = primärnyckelns(på en-sidan tabellen) datatyp.
'varIDValue = värdet på primärnyckeln som ska vara i "where-satsen"
Dim db As Database
Dim RS As Recordset
Dim strConcat As String
Dim strSQL As String
Dim fldField As Field
strSQL = "SELECT [" & fieldConcat & "]" & vbCrLf & _
"FROM [" & manyTable & "]" & vbCrLf & _
"WHERE " & BuildCriteria(OnePrimKey, onePrimType, varIDvalue)
Set db = CurrentDb
Set RS = db.OpenRecordset(strSQL, dbOpenForwardOnly)
Set fldField = RS(fieldConcat)
With RS
If .BOF And .EOF Then
fCompetences = Null
Else
'Konkatenera
Do Until .EOF
strConcat = strConcat & fldField & ","
.MoveNext
Loop
'Trimma
fCompetences = Left(strConcat, Len(strConcat) - 1)
End If
End With
Exit_fCompetences:
Set RS = Nothing
Set db = Nothing
Exit Function
End Function
Exempel på en kontrollkälla skulle kuna vara:
=fCompetences("Intressen";"Person";"Intresse";4;[PersonID])
"Intressen" - Tabellen Intressen
"Person" - Fält som anger person (Långt Heltal)
"Intresse" - Fält för intressen som skall koncratineras(Text)
4 - adLong används av BuildCriteria funktionen
[PersonID] - Primär nyckeln i huvudtabellenSv: Använda VB för att formatera Accessrapport
Tack för hjälpen! Jag har ändrat min kod...har dock fortfarande problem att få till mitt anrop. Nu ser det ut så här (från Expression Builder, som är kopplat till ett textfält):
=fCompetences("Competence";"competenceID";"competence";4;[competenceID])
Det enda som skrivs ut i min rapport är #Name.
Vet du/någon vad som är fel?
Tacksam för snabb hjälp!
//MonicaSv: Använda VB för att formatera Accessrapport
Läg till en textruta länka den till competenceID och döp om den till competenceID samt göm den genom att sätta visible=False.Sv: Använda VB för att formatera Accessrapport
//MonicaSv: Använda VB för att formatera Accessrapport
//Monica