Find Previous Record field data, or better suggestion

Anonymous
2020-01-13T19:45:54+00:00

I am trying to find the previous record value/field in a query to apply conditional formatting to my form. I have been researching using LAG function, but just can't make it work for what I need or am just not doing it right. 

What I have is a form that lists(and more): 

SERIES - TITLE

Series1 - Title1

Series1 - Title2

Series2 - Title3

Series3 - Title4

Series3 - Title5

Series3 - Title6

and I want to add a conditional format to hide the series values that repeat from the record above to show: 

SERIES - TITLE

Series1 - Title1

            - Title2

Series2 - Title3

Series3 - Title4

            - Title5

            - Title6

I tried to use the LAG Function, but dont think i'm adding it correctly.

Then i also found the below code but that just returns #NAME in the field. 

Function PrevRecVal(F As Form, Keyname As String, KeyValue, FieldNameToGet As

String)

End Function

    Dim RS As Recordset

On Error GoTo Err_PreRecVal

    'The default value is zero

    PrevRecVal = 0

    'Get the form recordset.

    Set RS = F.RecordsetClone

    'Find the current record.

    Select Case RS.Fields(ID).Type

        'Find using numeric data type key value?

        Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, DB_DOUBLE, DB_BYTE

            RS.FindFirst "[" & KeyName & "]=" & KeyValue

        'Find using date data type key value?

    Case DB_DATE

            RS.FindFirst "[" & KeyName & "]=#" & KeyValue & "#"

    Case DB_DATE

            RS.FindFirst "[" & KeyName & "]='" & KeyValue & "'"

    Case Else

            MsgBox "Error: Invalid key field data type!"

    End Select

        'Move to the previous record.

        RS.MovePrevious

        'Return the result

        PrevRecVal = RS(SeriesID)

Bye_PrevRecVal:

        Exit Function

Err_PrevRecVal:

        Resume Bye_PrevRecVal

        End Function

(in the control source of the field to show the previous record)

= PrevRecVal([Form],"SeriesID",[SeriesID],"SeriesID"

can anyone tell me 1)which one is better to use(above code or a lag function), 2)what im doing wrong or how to add a lag function if that is what i need here, 3)is there a better/easier solution you can suggest instead?Help! THANK YOU!

Microsoft 365 and Office | Access | For home | Windows

Locked Question. This question was migrated from the Microsoft Support Community. You can vote on whether it's helpful, but you can't add comments or replies or follow the question.

0 comments No comments
Answer accepted by question author
Anonymous
2020-01-15T22:31:40+00:00

Let's confine it to one table to start with:

SELECT T1.SeriesID,

IIF(COUNT(*) = 1,T1.Title,"") AS Title,

IIF(COUNT(*) = 1,T1.SeriesPart,"") AS SeriesPart,

FROM TitleT AS T1 INNER JOIN TitleT AS T2

ON T2.SeriesID = T1.SeriesID

AND T2.Title <= T1.Title

GROUP BY T1.SeriesID, T1.Title, T1.SeriesPart

ORDER BY T1.SeriesID, T1.Title;

If that returns the correct result table then you can add the SeriesT table to the query and return the Series column rather than the SeriesID:

SELECT SeriesT.Series,

IIF(COUNT(*) = 1,T1.Title,"") AS Title,

IIF(COUNT(*) = 1,T1.SeriesPart,"") AS SeriesPart,

FROM SeriesT INNER JOIN (TitleT AS T1 INNER JOIN TitleT AS T2

ON T2.SeriesID = T1.SeriesID AND T2.Title <= T1.Title)

ON SeriesT.SeriesID = T1.SeriesID

GROUP BY SeriesT.Series, T1.Title, T1.SeriesPart

ORDER BY SeriesT.Series, T1.Title, T1.SeriesPart;

You can of course include the SeriesID and TitleID columns in the SELECT and GROUP BY clauses if you wish, but usually these would be surrogate keys with arbitrary values of no semantic significance.

Was this answer helpful?

1 person found this answer helpful.
0 comments No comments

48 additional answers

Sort by: Newest
  1. Anonymous
    2020-01-28T22:21:16+00:00

    Hi Moses, there is actually no need for an extra table, 2 queries etc. it can be done with 1 simple select query and a simple modification to an existing query. Also doesn't appear the output is exactly as you originally requested with these modifications... but anyways... glad my method (and of course Gustav's function) got you a result you are happy with. Good luck with the rest of your project.

    Was this answer helpful?

    0 comments No comments
  2. Anonymous
    2020-01-28T20:44:52+00:00

    By golly I think we got it! 

    Thanks to some brute force and Ken's super helpful adjustments I was able to figure out how to get this working with 1 extra table 2 queries and a module. In case anyone else has a similar issue here are my queries...

    QRY 1(ModQ): (pulls all the data from 3 tables and groups by universe over series)

    SELECT TitleT.TitleID, SeriesT.Series, TitleT.SeriesPart, UniverseT.Universe, TitleT.UniverseOrder, IIf(IsNull([UniverseT].[Universe]),[SeriesT].[Series],[UniverseT].[Universe]) AS Grouping, RowNumber(CStr([TitleT].[TitleID])) AS IDS, IIf([Grouping]=DLookUp("[Grouping]","TitleTempT","[IDS]=" & [IDS]-1),"",[Grouping]) AS UniGroup, TitleT.TItle

    FROM UniverseT RIGHT JOIN (SeriesT RIGHT JOIN TitleT ON SeriesT.SeriesID = TitleT.SeriesID) ON UniverseT.UniverseID = TitleT.UniverseID

    WHERE (((RowNumber("","",True))=0)) AND (((UniverseT.Universe) Is Not Null)) OR (((SeriesT.Series) Is Not Null))

    ORDER BY IIf(IsNull([Universe]),[Series],[Universe]), TitleT.UniverseOrder, SeriesT.Series, TitleT.SeriesPart, TitleT.Title;

    QRY2(ModAppQ): 

    INSERT INTO TitleTempT ( TitleID, Universe, Series, Title, IDS, Grouping )

    SELECT ModQ.TitleID, ModQ.Universe, ModQ.Series, ModQ.Title, ModQ.IDS, IIf(IsNull([Universe]),[Series],[Universe]) AS Grouping

    FROM ModQ;

    Form record source ModQ, on Form Open: 

    Dim dbs As DAO.Database

    Set dbs = CurrentDb

    dbs.Execute "DELETE * FROM TitleTempT"

    ' Execute runs both saved queries and SQL strings

    dbs.Execute "ModAppQ", dbFailOnError

    THANK YOU FOR ALL THE HELP!!!

    Ken, I am still intrigued by your earlier suggestion and will be playing with that set up as well, this was just better for what i wanted in this instance. :)

    Was this answer helpful?

    0 comments No comments
  3. Anonymous
    2020-01-28T14:04:15+00:00

    done TY

    Was this answer helpful?

    0 comments No comments
  4. Anonymous
    2020-01-28T14:03:57+00:00

    not quite Ken, that lists all series and all universes... so some titles were duplicated. see image below... one example is the airbender1, 2, & 3 titles were repeated, once for the series airbender and again for universe avatar because they have both. they should be listed in the Grouping as avatar and order by the universeorder. basically ignore the series if there is a universe to sort by instead. 

    Was this answer helpful?

    0 comments No comments