Как использовать For Next l oop для обновления столбца в VBA Table Access 2007 - PullRequest
0 голосов
/ 01 февраля 2020

У меня сегодня 13 записей (текущий финансовый год) (завтра может быть 25) в таблице.

Поле является числовым полем и не является первичным ключом. Первая запись - 1. Они расположены в указанном порядке, поэтому запись 1 всегда будет 1.

. Поле удаляет число каждый раз, когда в форме устанавливается флажок. Это означает, что дело не развивалось (пока). Я хотел бы изменить нумерацию других записей.

Номера используются для номера дела (другое поле) (используются цифры и буквы).

Пользователь хочет, чтобы остальные номера дела были перенумерованы. когда дело удалено из-за отсутствия развития. Мне просто нужно перенумеровать поле. У меня есть другой код для изменения номеров дел после перенумерации поля.

Как видите, номер дела для записи № 7 был удален, поскольку он не развивался.

Я вручную менял номера, потому что там всего 13 записей. Но к концу финансового года у нас может быть 300 +.

  • Форма = Frm_Current
  • Таблица = Tbl_Data
  • Поле = RecID2 (числовое поле) (не поле первичного ключа)

Это то, что у меня сейчас есть:

Record1 =  1
Record4 =  2
Record5 =  3
Record7 =      
Record8 =  5
Record9 =  6
Record12 = 7 
Record13 = 8

Это то, что я хотел бы видеть:

Record1 =  1
Record4 =  2
Record5 =  3
Record8 =  4
Record9 =  5
Record12 =  6
Record13 =  7

У меня есть такой код, но, конечно, он не работает.

Dim strSQL As String
Dim rs As DAO.Recordset
Dim Rec2Num As Integer
Dim Rec3Num As Integer
Dim EOR As Integer
strSQL = "Tbl_Data"
Set rs = CurrentDb.OpenRecordset(strSQL)
Rec3Num = rs.Fields("RecID2")
For Rec2Num = 0 To EOR
if Rec3Num = 1 Then
Rec3Num = Rec2Num + 1
End If
Next

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Это то, что в другом сценарии ios называется приоритетной нумерацией .

Я сделал для этого функцию, которая принимает текстовое поле , содержащее это число в качестве аргумента :

' Set the priority order of a record relative to the other records of a form.
'
' The table/query bound to the form must have an updatable numeric field for
' storing the priority of the record. Default value of this should be Null.
'
' Requires:
'   A numeric, primary key, typical an AutoNumber field.
'
' 2018-08-31. Gustav Brock, Cactus Data ApS, CPH.
'
Public Sub RowPriority( _
    ByRef TextBox As Access.TextBox, _
    Optional ByVal IdControlName As String = "Id")

    ' Error codes.
    ' This action is not supported in transactions.
    Const NotSupported      As Long = 3246
    Dim Form                As Access.Form
    Dim Records             As DAO.Recordset

    Dim RecordId            As Long
    Dim NewPriority         As Long
    Dim PriorityFix         As Long
    Dim FieldName           As String
    Dim IdFieldName         As String

    Dim Prompt              As String
    Dim Buttons             As VbMsgBoxStyle
    Dim Title               As String

    On Error GoTo Err_RowPriority

    Set Form = TextBox.Parent

    If Form.NewRecord Then
        ' Will happen if the last record of the form is deleted.
        Exit Sub
    Else
        ' Save record.
        Form.Dirty = False
    End If

    ' Priority control can have any Name.
    FieldName = TextBox.ControlSource
    ' Id (primary key) control can have any name.
    IdFieldName = Form.Controls(IdControlName).ControlSource

    ' Prepare form.
    DoCmd.Hourglass True
    Form.Repaint
    Form.Painting = False

    ' Current Id and priority.
    RecordId = Form.Controls(IdControlName).Value
    PriorityFix = Nz(TextBox.Value, 0)
    If PriorityFix <= 0 Then
        PriorityFix = 1
        TextBox.Value = PriorityFix
        Form.Dirty = False
    End If

    ' Disable a filter.
    ' If a filter is applied, only the filtered records
    ' will be reordered, and duplicates might be created.
    Form.FilterOn = False

    ' Rebuild priority list.
    Set Records = Form.RecordsetClone
    Records.MoveFirst
    While Not Records.EOF
        If Records.Fields(IdFieldName).Value <> RecordId Then
            NewPriority = NewPriority + 1
            If NewPriority = PriorityFix Then
                ' Move this record to next lower priority.
                NewPriority = NewPriority + 1
            End If
            If Nz(Records.Fields(FieldName).Value, 0) = NewPriority Then
                ' Priority hasn't changed for this record.
            Else
                ' Assign new priority.
                Records.Edit
                    Records.Fields(FieldName).Value = NewPriority
                Records.Update
            End If
        End If
        Records.MoveNext
    Wend

    ' Reorder form and relocate record position.
    ' Will fail if more than one record is pasted in.
    Form.Requery
    Set Records = Form.RecordsetClone
    Records.FindFirst "[" & IdFieldName & "] = " & RecordId & ""
    Form.Bookmark = Records.Bookmark

PreExit_RowPriority:
    ' Enable a filter.
    Form.FilterOn = True
    ' Present form.
    Form.Painting = True
    DoCmd.Hourglass False

    Set Records = Nothing
    Set Form = Nothing

Exit_RowPriority:
    Exit Sub

Err_RowPriority:
    Select Case Err.Number
        Case NotSupported
            ' Will happen if more than one record is pasted in.
            Resume PreExit_RowPriority
        Case Else
            ' Unexpected error.
            Prompt = "Error " & Err.Number & ": " & Err.Description
            Buttons = vbCritical + vbOKOnly
            Title = Form.Name
            MsgBox Prompt, Buttons, Title

            ' Restore form.
            Form.Painting = True
            DoCmd.Hourglass False
            Resume Exit_RowPriority
    End Select

End Sub

С полной документацией и демонстрацией можно ознакомиться здесь: Последовательные строки в Microsoft Access

Браузер для абзаца 3. Приоритетные номера

(Если у вас нет учетной записи, перейдите по ссылке: прочитайте статью полностью.

Текущий код всегда включен GitHub : VBA.RowNumbers

0 голосов
/ 01 февраля 2020

Это похоже на очень плохую практику; лучшим подходом было бы сохранить исходную нумерацию записей и назначить новый идентификатор для 'развитых случаев' .

. Тем не менее, предполагая, что вышеупомянутый подход не является вариантом, ключ должен гарантировать что вы работаете с упорядоченным набором данных (поскольку по умолчанию MS Access работает с неупорядоченными наборами данных, из-за чего вы не можете гарантировать порядок доступа к записям).

Следовательно, ваш код должен выглядеть примерно так: следующее:

Function RenumberField()
    Dim id As Long
    With CurrentDb.OpenRecordset("select recid2 from Tbl_Data where recid2 is not null order by recid2")
        If Not .EOF Then
            .MoveFirst
            Do Until .EOF
                id = id + 1
                .Edit
                !recid2 = id
                .Update
                .MoveNext
            Loop
        End If
        .Close
    End With
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...