Проблема с выражением доступа: она слишком сложная, так как мне включить ее в функцию? - PullRequest
2 голосов
/ 15 апреля 2010

Access 2007 говорит мне, что мое новое выражение слишком сложное. Раньше он работал, когда у нас было 10 уровней обслуживания, а сейчас у нас 19! Большой! Я задал этот вопрос в SuperUser , и кто-то предложил мне попробовать его здесь. Я предлагаю включить его в функцию, но я не уверен, с чего начать и как будет выглядеть функция.

Мое выражение проверяет стоимость наших услуг в поле [PriceCharged], а затем назначает соответствующие ЧАСЫ [Уровень обслуживания], когда я выполняю расчет, чтобы определить, сколько ВЫРАБОТКИ сделал каждый коллега, работая на клиента. В поле [EstimatedTime] хранится фактическое количество часов работы каждого коллеги.

[EstimatedTime]/[ServiceLevel]*[PriceCharged]

Ниже приведено выражение моего СТОИМОСТИ к ЧАСАМ. Я поместил их в разные строки, чтобы их было легче читать - пожалуйста, не откладывайте на длину этого поста, в конце концов, это все та же информация.

Большое спасибо, Майк

ServiceLevel: IIf([pricecharged]=100(COST),6(HOURS),
IIf([pricecharged]=200 Or [pricecharged]=210,12.5,
IIf([pricecharged]=300,19,
IIf([pricecharged]=400 Or [pricecharged]=410,25,    
IIf([pricecharged]=500,31,
IIf([pricecharged]=600,37.5,
IIf([pricecharged]=700,43,
IIf([pricecharged]=800 Or [pricecharged]=810,50,
IIf([pricecharged]=900,56,
IIf([pricecharged]=1000,62.5,
IIf([pricecharged]=1100,69,
IIf([pricecharged]=1200 Or [pricecharged]=1210,75,
IIf([pricecharged]=1300 Or [pricecharged]=1310,100,
IIf([pricecharged]=1400,125,
IIf([pricecharged]=1500,150,
IIf([pricecharged]=1600,175,
IIf([pricecharged]=1700,200,
IIf([pricecharged]=1800,225,
IIf([pricecharged]=1900,250,0)))))))))))))))))))

ОБНОВЛЕНИЕ (16/04/10 14:46 GMT)

Я создал новую таблицу, как рекомендовано ниже. Теперь нужно удалить мое выражение и заставить исходный запрос SELECT использовать новую таблицу. Однако я не совсем понимаю, как это делается.

Используя пример DLookUP, я представляю себе, что сохраняю исходный запрос, в котором у меня есть поле PRICECHARGED, включаю новое поле DLookUp, которое использует приведенный ниже пример для ссылки на PRICECHARGED, и заполняю строки соответствующим SERVICELEVEL (часы).

Я запутался в этом моменте, потому что в моем исходном запросе SELECT все вычисления происходили в этом запросе (выражения после выражения), что означало, что конечным результатом моего запроса был список коллег с HOURS и REVENUE (Стоимость ) против их имени. У меня такое ощущение, что мне нужен еще один запрос в середине для управления процессом DlookUp.

`Любые направления или дорожная карта очень ценятся.

Окончательное обновление. Добавил другую таблицу, как упоминалось выше, создал соответствующие ссылки из новой таблицы на поле в «fixed» таблице. Вуаля. Это сработало, и я не делал ничего, что могло привести к сбою или предупреждению об ошибке. Это было проще, чем я думал. Я не понимаю, почему я не справился с этим раньше.

Еще раз спасибо, Майк

Ответы [ 3 ]

3 голосов
/ 15 апреля 2010

Вы делаете жизнь очень, очень, очень тяжелой для себя.

Создание таблицы PriceToHours с колонками PriceCharged и Hours. Поместите в него соответствующие строки, чтобы они соответствовали табличным данным в вашем выражении. Теперь присоедините эту таблицу к вашей основной таблице данных, чтобы получить часы от PriceCharged. Когда эта информация изменится в будущем, просто обновите данные в таблице. Это намного прозрачнее (данные не скрываются в выражении запроса) и не требует дополнительного времени программиста, когда значения изменятся в будущем.

3 голосов
/ 15 апреля 2010

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

Таблица будет так же проста, как два столбца и «ServiceLevel» и «PriceCharged». Затем в вашем запросе ссылку на вашу таблицу.

Однако, для быстрой проверки, что произойдет в указанной цене, скажем, 1105, то есть в списке нет? Функция, возможно, вернет ноль, что приведет к сбою выражения, может быть, это его вызывает?

EDIT ::

После небольшого поиска кажется, что максимальное число вложенных операторов IIF в доступе равно 10, поэтому раньше он работал нормально, а сейчас нет. Похоже, ваш единственный вариант - изменить дизайн на первый план!

2 голосов
/ 15 апреля 2010

Поместите все данные в таблицу и сделайте dLookup! Вот таблица с названием CostHours

Cost  Hours
----  ------
100 6
200 12.5
210 12.5
300 19
400 25
410 25
500 31
600 37.5
700 43
800 50
810 50
900 56
1000    62.5
1100    69
1200    75
1210    75
1300    100
1310    100
1400    125
1500    150
1600    175
1700    200
1800    225
1900    250

А чтобы узнать часы от стоимости, вот краткая справка

dLookup ("Hours", "CostHours", "Cost=" & 100)

Это вернет часы, где Cost равно 100. Используйте это значение в своих расчетах.

Прелесть MS Access в том, что dLookup может находиться там же, где вы выполняете свои вычисления - в коде, в отчете, в запросе.

Вместо DLookup вы можете сделать это и в выражении SQL

"SELECT Hours From CostHours Where Cost" = & CostVariable

...