Выражение слишком сложное Access 2007, как упростить эту последовательность IIF?

Я запускаю приведенный ниже сложный оператор, чтобы указать значение в столбце «SODist», которое увеличивается для каждого последующего совпадающего значения в поле «SalesOrderNo». Я использую «ID» в качестве автоматического номера для имитации функции «номер строки», но мне нужно увеличить ее до 13 строк. Возможно, есть лучший способ использовать функцию VBA для достижения желаемых результатов?

IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-1)=[SalesOrderNo],IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-9)=[SalesOrderNo],10,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-8)=[SalesOrderNo],9,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-7)=[SalesOrderNo],8,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-6)=[SalesOrderNo],7,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-5)=[SalesOrderNo],6,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-4)=[SalesOrderNo],5,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-3)=[SalesOrderNo],4,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-2)=[SalesOrderNo],3,IIf(DLookUp("[SalesOrderNo]","[Peachtree-Import-Dist]","[ID]=" & [ID]-1)=[SalesOrderNo],2,1))))))))),1) AS SODist

person Mike Dowdal    schedule 26.11.2013    source источник
comment
Является ли [SalesOrderNo] полем Text или полем Number?   -  person Gord Thompson    schedule 26.11.2013
comment
Он определяется как текст.   -  person Mike Dowdal    schedule 26.11.2013
comment
Я загрузил два запроса и модуль из предложения Горда и получаю неопределенную функцию на GetSODist, какой-нибудь совет? Я загрузил их из копирования / вставки.   -  person Mike Dowdal    schedule 26.11.2013
comment
tbur, предоставленный вами модуль почти работает, за исключением того, что он увеличивает 3-строчный заказ до 1,2,1. См. скриншот ниже: screencast.com/t/zJ2CEiQSA   -  person Mike Dowdal    schedule 26.11.2013
comment
Попробуйте снова скопировать и вставить из моего исправленного ответа. (Я изменил один из параметров функции. Не то чтобы это повлияло на вашу проблему с неопределенной функцией, но это вызвало бы проблемы с большими таблицами.) Если у вас работает другой модуль, то я не понимаю, почему мой не работает.   -  person Gord Thompson    schedule 26.11.2013
comment
Я тоже в замешательстве. Единственная разница, которую я вижу в этих двух модулях, заключается в том, что tbur использует static, а вы объявляете переменные. Я что-то упускаю?   -  person Mike Dowdal    schedule 26.11.2013
comment
Вы можете скачать рабочий пример здесь вместе с тестовой таблицей, содержащей чуть более миллиона ряды. Дайте мне знать, если это работает для вас.   -  person Gord Thompson    schedule 26.11.2013
comment
Горд, спасибо! По какой-то причине копирование модуля из вашего .accdb в мой заставило его работать! Это спасатель!   -  person Mike Dowdal    schedule 26.11.2013


Ответы (2)


Вот как я бы к этому подошел:

Я бы создал сохраненный запрос в Access с именем [CountPreviousSalesOrderLines].

PARAMETERS prmID Long, prmSalesOrderNo Text(255);
SELECT COUNT(*) AS n
FROM [Peachtree-Import-Dist]
WHERE SalesOrderNo=[prmSalesOrderNo] AND ID<=[prmID];

Затем я бы добавил в базу данных стандартный модуль, который включал следующую функцию

Option Compare Database
Option Explicit

Public Function getSODist(ID As Long, SalesOrderNo As String) As Long
    Dim cdb As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset

    Set cdb = CurrentDb
    Set qdf = cdb.QueryDefs("CountPreviousSalesOrderLines")
    qdf!prmID = ID
    qdf!prmSalesOrderNo = SalesOrderNo
    Set rst = qdf.OpenRecordset(dbOpenSnapshot)
    getSODist = rst!n
    rst.Close
    Set rst = Nothing
    Set qdf = Nothing
    Set cdb = Nothing
End Function

Для примера данных в [Peachtree-Import-Dist]

ID  SalesOrderNo
--  ------------
 1  001         
 2  001         
 3  001         
 4  001         
 5  002         
 6  003         
 7  003         
 8  003         
 9  002         

запрос

SELECT ID, SalesOrderNo, getSODist(ID,SalesOrderNo) AS SODist
FROM [Peachtree-Import-Dist]

возвращается

ID  SalesOrderNo  SODist
--  ------------  ------
 1  001                1
 2  001                2
 3  001                3
 4  001                4
 5  002                1
 6  003                1
 7  003                2
 8  003                3
 9  002                2

Для лучшей производительности убедитесь, что поле [SalesOrderNo] проиндексировано: Yes (Duplicates OK).

person Gord Thompson    schedule 26.11.2013

Похоже, вы пытаетесь получить текущий счет каждого [SalesOrderNo]. это правильно?

В новом модуле вставьте следующий код:

Function RunningCount(WhatToCount As String) As Integer
Static CountSoFar As Long, var  As String

If var <> WhatToCount Then       '  Is WhatToCount different from the one before?
        CountSoFar = 0
        var = WhatToCount        ' save the value of this one for comparison with the next
End If
    CountSoFar = CountSoFar + 1  ' increment the variable
    RunningCount = CountSoFar    ' return the result to the query
End Function

В запросе вы используете такую ​​функцию:

SODist:RunningCount([SalesOrderNo])

Убедитесь, что запрос сортируется по [SalesOrderNo]

person tbur    schedule 26.11.2013