2010-04-15 3 views
2

Access 2007은 새로운 표현이 복잡하다는 것을 알려줍니다. 그것은 우리가 10 개의 서비스 수준을 가졌었지만 지금은 19 명이 있습니다. 큰! 나는이 질문을 SuperUser에 물었고, 누군가 내가 여기서 시험해 보라고 제안했다. 제안은 기능으로 전환하는 것입니다. 그러나 어디에서 시작해야하는지, 기능이 어떻게 보이는지는 확실하지 않습니다.식 표현 문제 : 너무 복잡하여 함수로 변환하는 방법은 무엇입니까?

내 표현은 [PriceCharged] 필드에서 우리 서비스의 비용을 확인한 다음 클라이언트가 작업 할 때 각 동료가 얼마나 많은 수익을 얻었는지 계산할 때 적절한 HOURS [Servicelevel]을 할당하는 것입니다. [EstimatedTime] 필드는 각 동료가 실제로 작업 한 시간을 저장합니다.

[EstimatedTime]/[ServiceLevel]*[PriceCharged] 

아래는 내 COST를 HOURS 식으로 분석 한 것입니다. 나는 그것들을 다른 줄에 써서 읽기 쉽게 만들었습니다.이 게시물의 길이만큼 연기하지 마십시오. 결국 모든 정보가 동일합니다. 아래 권장

많은 감사, 마이크

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))))))))))))))))))) 

UPDATE (16/04/10 그리니치 표준시 14시 46분)

나는 새 테이블을 구축했습니다. 이제는 표현식을 제거하고 원래의 SELECT 쿼리에 새 테이블을 사용하는 문제입니다. 그러나, 나는 이것이 어떻게 행해지는지 전혀 분명하지 않습니다.

DLookUP 예제를 사용하여 PRICECHARGED 필드가있는 원래 쿼리를 유지하고 PRICECHARGED를 참조하고 해당 SERVICELEVEL (시간)을 사용하여 행을 채우는 아래의 예제를 사용하는 새로운 DLookUp 필드를 포함하는 것이 상상됩니다.

원본 SELECT 쿼리에서 모든 계산이 해당 쿼리 (표현식, 표현식 후)에서 발생했기 때문에 최종 쿼리 결과가 HOURS 및 REVENUE가있는 동료 목록 이었기 때문에 혼란스러워졌습니다. 비용). DlookUp 프로세스를 관리하기 위해 중간에 다른 쿼리가 필요하다는 느낌이 들었습니다.

`모든 길 찾기 나지도를 매우 높이 평가합니다.

최종 업데이트. 위에서 언급 한 다른 테이블을 추가하여 새 테이블에서 '고정'테이블의 필드로 적절한 링크를 생성했습니다. Voila. 그것은 매력을 작동 시켰고, 아무 것도하지 않고 충돌을 일으키거나 오류 경고를 내게했습니다. 내가 생각했던 것보다 쉬웠다. 왜 내가 전에 이런 식으로 관리하지 않았는지 나는 이해하지 못한다.

다시 한 번 감사드립니다, 마이크

+0

@Mike @ 테이블 구조와 쿼리를 게시하십시오. 우리는 당신을 더 잘 도울 수 있습니다. –

답변

3

나는 이것이 작동하는 방식을 바꾸고 요금을 부과하는 가격으로 서비스 레벨을 별도의 테이블에 유지할 것을 제안합니다. 비즈니스를 변경해야하는 경우 신속하게 변경할 수 있습니다.

표는 "ServiceLevel"및 "PriceCharged"와 같이 단순한 두 열일 것입니다. 그런 다음 쿼리 링크에서 테이블에 연결하십시오.

그러나 신속한 확인을 위해 청구 된 가격은 1105 즉 목록에 없습니다. 이 함수는 null을 리턴 할 것이고, 그 결과 표현식이 실패 할 수도있다.

편집 :이 액세스의 중첩 된 IIF 문의 최대 수처럼 보이는 주변 검색을 조금 후

는 전에 잘 작동하지만 지금은 그렇지 않습니다 따라서 왜 10입니다. 당신의 유일한 선택처럼 보이는 것은 그것이 처음에 있었던 방법에 그것을 재 설계하는 것입니다!

+0

다른 테이블은 훌륭하지만, 불행하게도 이것은 내가 할 수있는 한 최선을 다하는 '잠긴'데이터베이스입니다 - 따라서 끔찍한 표현입니다. 내가 처리해야하는 필드는 시간에 대한 텍스트 필드이거나 최상의 통화 필드입니다. 내 새 테이블을 그들과 연결시키는 것은 변덕 스러울 수 있습니다. 어떤 아이디어? – RocketGoal

2

는 테이블에 모든 데이터를 넣고을 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

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

Cost 그 값이 사용 100 곳이 시간을 돌려 것이다 귀하의 계산.

MS Access의 장점은 dLookup이 코드, 보고서 및 쿼리에서 계산할 때와 동일한 위치에있을 수 있다는 것입니다. 당신은 정말 인생을 만들고있어

"SELECT Hours From CostHours Where Cost" = & CostVariable

+0

DLookUp 함수는 어디에 있습니까? COSTHOURS 테이블에 연결된 테이블에 있습니까? 또는 SELECT 쿼리에서 사용할 수 있습니까? 어리석은 질문일지도 모르지만 나는 물어야한다. – RocketGoal

+0

대답을 편집하여 대답 –

+0

downvote 경우 왜 그렇게했는지 설명하십시오 –

3

대신의을 DLookup

, 당신은 자신을 위해 정말 열심히, 정말,뿐만 아니라 SQL 문에서이 작업을 수행 할 수 있습니다.

PriceCharged 및 Hours 열이있는 PriceToHours 테이블을 만듭니다. 표현식의 표 데이터와 일치하도록 적절한 행을 입력하십시오. 이제 테이블을 주 데이터 테이블에 가입시켜 PriceCharged에서 시간을 가져 오십시오. 이 정보가 나중에 변경되면 표의 데이터를 간단히 업데이트하십시오. 이것은 훨씬 더 투명하며 (쿼리 표현식에 숨겨진 데이터는 없음) 향후 값이 변경 될 때 추가 프로그래머 시간이 필요하지 않습니다.

+0

위의 주석을 참조하십시오. 사용 된 필드는 누군가가 시간 필드에 'foo'를 넣고 PriceCharged 필드에 10 만 개를 넣을 수있게합니다. 디. 나는 많은 것을 제한하거나 강제 할 수 없기 때문에 그것이 내가있는 곳으로 도착한 이유이며, 그것은 혼란 스럽습니다 ... 아니면 도전해야합니다! – RocketGoal

관련 문제