Gustav Brock
Gustav at cactus.dk
Tue Jul 12 09:09:35 CDT 2011
Hi Bill and JC
Right, 255 chars it is.
Further, using a second query you may even look up the full memo should you need it.
This I posted in 2003 but I haven't used it since so it is still not tested in versions later than A97:
Someone (JC?) mentioned this issue recently and I have experienced it too for Access 97 - even if you directly can fill a memo field to 64 K, a query will only retrieve 32 K.
Even worse, if you fill a memo field with, say, the Rich Text Box control you can reach megabyte field content sizes while still only the first 32 K are retrieved.
To circumvent this you may use DLookup to fetch the full content. Now, when the content is smaller than 32 K it is waste of time to pass DLookup; thus DLookup should only be used when necessary.
Here is a method to do that. It is not tested in Access 2000+.
/gustav
<code>
Public Function LookupMemo( _
ByVal strSource As String, _
ByVal strFieldID As String, _
ByVal strFieldMemo As String, _
ByRef lngID As Long, _
ByRef varMemo As Variant) _
As String
' Extracts without truncation to 32768 characters the
' content of a memo field in a query.
'
' Assumes proper wrapping of table/field names containing spaces
' like "[My field name]" and a single field unique numeric key.
'
' Typical usage (SQL):
'
' SELECT
' ID,
' LookupMemo("Table1", "ID", "MemoField", [ID], [MemoField]) AS FullMemo
' FROM
' Table1;
'
' 2003-12-29. Cactus Data ApS, CPH.
' Maximum length of string from memo field when retrieved in a query.
Const clngStrLen As Long = &H8000&
Dim strExpr As String
Dim strDomain As String
Dim strCriteria As String
Dim strMemo As String
Dim lngLen As Long
On Error GoTo Exit_LookupMemo
If Not IsNull(varMemo) Then
lngLen = Len(varMemo)
If lngLen < clngStrLen Then
' The memo field is not truncated.
strMemo = varMemo
ElseIf Len(strSource) > 0 And Len(strFieldID) > 0 And Len(strFieldMemo) > 0 Then
' The memo is probably truncated by the query.
' Lookup the full memo in strSource.
strExpr = strFieldMemo
strDomain = strSource
strCriteria = strFieldID & " = " & lngID & ""
strMemo = vbNullString & DLookup(strExpr, strDomain, strCriteria)
End If
Else
' Return empty string.
End If
LookupMemo = strMemo
Exit_LookupMemo:
Exit Function
Err_LookupMemo:
' Return empty string.
Resume Exit_LookupMemo
End Function
</code>
/gustav
>>> jwcolby at colbyconsulting.com 12-07-2011 15:43 >>>
It never occurred to me to use left(MemoField,255) when I needed to do something like that.
The obvious is sometimes easy to miss.
John W. Colby
www.ColbyConsulting.com
On 7/12/2011 8:51 AM, William Benson (VBACreations.Com) wrote:
> Oh that is good to know! Yes, that will cut out a step or two now and in
> future.
>
> I appreciate the follow up on this!
>
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock
> Sent: Tuesday, July 12, 2011 8:02 AM
> To: accessd at databaseadvisors.com
> Subject: Re: [AccessD] Select Distinct not working on union query- due to
> MEMO field?
>
> Hi Bill
>
> But you are missing the obvious - the DISTINCT is not needed if you use
> UNION and not UNION ALL.
>
> If you don't need memo fields, certainly don't use them. If you have the
> need (for holding text beyond 256 chars) you may in your UNION or DISTINCT
> query use:
>
> LEFT(YourMemoField, 256)
>
> /gustav