jdscomms
jdscomms

Reputation: 163

Find the highest value within a specified range of values

I have an MS Access form in which I enter a value representing each record's SECTION. I want to then programmatically calculate a value for its SUBSECTION, based on the value of the other subsections under that section.

For example:

So, when I create a new record with section value of 2, for example, I want to:

Any suggestions or recommendations for the best way to approach this? tia

Upvotes: 0

Views: 76

Answers (3)

jdscomms
jdscomms

Reputation: 163

Here's one solution:

Private Sub cmdCreateSubsection_Click()

    If IsNull(Me.txtBoxSection) Then
        MsgBox "Please enter number in the Section Box", vbOKOnly + vbInformation, "Section"
        Me.txtBoxSection.SetFocus
        Exit Sub
    End If
    
    Me.txtBoxSection = CLng(Me.txtBoxSection)
     
    Dim myval As Double
    myval = Nz(DMax("Subsection", "t_subsection_tracker", "Section = " & [Forms]![f_subsection_tracker]![txtBoxSection]), 0)
    
    If myval = 0 Then
        Me.txtBoxSubsection = Me.txtBoxSection
    Else
        Me.txtBoxSubsection = myval + 0.01
    End If
    
    Dim myset As DAO.Recordset
    Set myset = CurrentDb.OpenRecordset("Select * from t_subsection_tracker where ID = -1", dbOpenDynaset)
    myset.AddNew
    myset!Section = Me.txtBoxSection
    myset!Subsection = Me.txtBoxSubsection
    myset.Update
    myset.Close
    Set myset = Nothing

End Sub

Upvotes: 0

Sola Oshinowo
Sola Oshinowo

Reputation: 609

Below is my suggestion.

Lets assume the main table is called table_1, and the section table,is called table_session , also the form for adding records is called frmmainform

  1. On the form,you have the following controls

A. Combo box 1 with row source been list of sections,i.e 1,2,3,etc, this you can name section ,you can have a sql statement below SELECT DISTINCTROW sessionname FROM table_session;

B. Combo box 2, with name subsectionlook(this is to look for the last record of sub section based on the session name chosen in combo box 1 in step A) with row source been a select statement from table_1 like SELECT SELECT Max(subsection) FROM table_1 where sessionname =Forms![frmmainform]![session]

Now we have two combo boxes on the form,and we can pick a session name(from combo box) and the last record from sub section based on the session field in the current form.

Next you create a textbox field named subsection

The final steps will be in the vba code, do the following

Private Sub session_AfterUpdate()

    subsectionlook.requery

Private Sub subsectionlook_AfterUpdate()

    subsection.text= subsectionlook.value +0.01

Upvotes: 0

Gustav
Gustav

Reputation: 55806

If you add an autonumber ID to your table, you can use my RowNumber function from my project VBA.RowNumbers like this:

SELECT 
    Section, 
    Section + RowNumber(CStr([ID]), CStr([Section]))/100 AS SubSection
FROM 
    YourTable
WHERE 
    RowNumber(CStr([ID])) <> RowNumber("", "", True);

Example:

enter image description here

' Builds consecutive row numbers in a select, append, or create query
' with the option of a initial automatic reset.
' Optionally, a grouping key can be passed to reset the row count
' for every group key.
'
' Usage (typical select query having an ID with an index):
'   SELECT RowNumber(CStr([ID])) AS RowID, *
'   FROM SomeTable
'   WHERE (RowNumber(CStr([ID])) <> RowNumber("","",True));
'
' Usage (typical select query having an ID without an index):
'   SELECT RowNumber(CStr([ID])) AS RowID, *
'   FROM SomeTable
'   WHERE (RowNumber("","",True)=0);
'
' Usage (with group key):
'   SELECT RowNumber(CStr([ID]), CStr[GroupID])) AS RowID, *
'   FROM SomeTable
'   WHERE (RowNumber(CStr([ID])) <> RowNumber("","",True));
'
' The Where statement resets the counter when the query is run
' and is needed for browsing a select query.
'
' Usage (typical append query, manual reset):
' 1. Reset counter manually:
'   Call RowNumber(vbNullString, True)
' 2. Run query:
'   INSERT INTO TempTable ( [RowID] )
'   SELECT RowNumber(CStr([ID])) AS RowID, *
'   FROM SomeTable;
'
' Usage (typical append query, automatic reset):
'   INSERT INTO TempTable ( [RowID] )
'   SELECT RowNumber(CStr([ID])) AS RowID, *
'   FROM SomeTable
'   WHERE (RowNumber("","",True)=0);
'
' 2020-05-29. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function RowNumber( _
    ByVal Key As String, _
    Optional ByVal GroupKey As String, _
    Optional ByVal Reset As Boolean) _
    As Long
    
    ' Uncommon character string to assemble GroupKey and Key as a compound key.
    Const KeySeparator      As String = "¤§¤"
    ' Expected error codes to accept.
    Const CannotAddKey      As Long = 457
    Const CannotRemoveKey   As Long = 5
  
    Static Keys             As New Collection
    Static GroupKeys        As New Collection

    Dim Count               As Long
    Dim CompoundKey         As String
    
    On Error GoTo Err_RowNumber
    
    If Reset = True Then
        ' Erase the collection of keys and group key counts.
        Set Keys = Nothing
        Set GroupKeys = Nothing
    Else
        ' Create a compound key to uniquely identify GroupKey and its Key.
        ' Note: If GroupKey is not used, only one element will be added.
        CompoundKey = GroupKey & KeySeparator & Key
        Count = Keys(CompoundKey)
        
        If Count = 0 Then
            ' This record has not been enumerated.
            '
            ' Will either fail if the group key is new, leaving Count as zero,
            ' or retrieve the count of already enumerated records with this group key.
            Count = GroupKeys(GroupKey) + 1
            If Count > 0 Then
                ' The group key has been recorded.
                ' Remove it to allow it to be recreated holding the new count.
                GroupKeys.Remove (GroupKey)
            Else
                ' This record is the first having this group key.
                ' Thus, the count is 1.
                Count = 1
            End If
            ' (Re)create the group key item with the value of the count of keys.
            GroupKeys.Add Count, GroupKey
        End If

        ' Add the key and its enumeration.
        ' This will be:
        '   Using no group key: Relative to the full recordset.
        '   Using a group key:  Relative to the group key.
        ' Will fail if the key already has been created.
        Keys.Add Count, CompoundKey
    End If
    
    ' Return the key value as this is the row counter.
    RowNumber = Count
  
Exit_RowNumber:
    Exit Function
    
Err_RowNumber:
    Select Case Err
        Case CannotAddKey
            ' Key is present, thus cannot be added again.
            Resume Next
        Case CannotRemoveKey
            ' GroupKey is not present, thus cannot be removed.
            Resume Next
        Case Else
            ' Some other error. Ignore.
            Resume Exit_RowNumber
    End Select

End Function

Upvotes: 2

Related Questions