2012-07-03 4 views
3

나는 상태 기준에 따라 다른 종류의 보상 범위를 사용하여 보험 견적을 생성하는 프로그램을 개발했습니다. 이제 '규칙'을 지정하는 기능을 추가하고 싶습니다. 예를 들어 우리는 3 가지 유형의 범위 (UM, BI 및 PD라고 부름)를 가질 수 있습니다. 일부 주에서는 PD가 BI보다 크지 않고 다른 주에서는 BI가 없으면 UM이 존재하지 않도록합니다. 따라서 사용자가이 규칙을 작성할 수있는 기능을 추가하여 견적을 생성 할 때 규칙을 따르고 프로그램이 견적을 생성 할 때 어떠한 주 규정도 위반하지 않도록해야합니다.VB6에서 상충되는 수학 연산자를 감지하는 기능

문제는

나는 사용자가 충돌하는 규칙을 선택할 수 싶지 않아요. 사용자는 VB 수학 연산자 (>, <,> =, < =, =, <>) 중 하나를 선택하고 양쪽에 적용 범위를 설정할 수 있습니다. >은

  • A> B
  • B> C
  • C : 그들은 (한 번에 오직 하나)이 여러 번 할 수있는 그래서 그들은이 같은 규칙의 목록을 끝낼 수 있습니다

마지막으로 본 규칙은 이전에 설정된 규칙과 충돌합니다. 내 솔루션은 사용자가 '목록에 규칙 추가'를 클릭 할 때마다 목록의 유효성을 검사하는 것이 었습니다.

세 번째 목록 항목이 아직 목록에없는 것처럼 가장했으나 사용자가 '규칙 추가'를 클릭하여 목록에 추가했습니다. 유효성 검사 프로세스는 먼저 들어오는 변수가 이미 같은 줄에서 사용되었는지 확인합니다. 그렇지 않은 경우 이미 생성 된 목록에서 들어오는 왼쪽 변수 (이 경우 'C') 만 검색합니다. 발견되면 tmp1을 일치 항목 (tmp1 = 'B') 건너편의 변수와 동일하게 설정합니다. 그런 다음 오른쪽에있는 들어오는 변수 (이 경우 'A')에 대해 동일한 작업을 수행합니다. 그런 다음 tmp2는 A (tmp2 = 'B')에서 가로 지르는 변수와 동일하게 설정됩니다. tmp1과 tmp2가 같으면 들어오는 규칙은 충돌하는 OR이거나 사용 된 연산자와 상관없이 무관합니다. 나는 이것이 3 개의 변수를 가진 확실한 논리라고 확신한다. 그러나 추가 변수를 추가하면 쉽게 유효성 검사를 건너 뛸 수 있다는 것을 알았습니다. 주어진 주마다 10 가지 이상의 보험 보상 유형이있을 수 있습니다. 따라서 3 가지 이상의 변수를 검증 할 수있는 것이 중요합니다.

변수가 여러 개인 경우 음성 검증을 수행하는 통일 된 방법이 있습니까? 어떤 아이디어 나 생각도 환영합니다. 제 설명이 의미가 있기를 바랍니다. 감사합니다.

+0

VB6과 같이 표현의 힘이 제한적이기 때문에 뭔가 모델링하는 것이 고통 스러울 것입니다. 몇 가지 팁. 평등 (= 및 <>)과 상대 연산자 사이에서 규칙을 나눕니다. 관계가 재 배열되기 때문에 오직 하나의 연산자 만이 사용된다. <그 시점에서 주문 B

+0

이것은 내 첫 번째 생각 이었지만 그때 나는 규칙이 주어진 순서를 항상 알지 못한다는 것을 깨달았다. 나는 C와 A가 둘 다 B보다 크지 만 A와 관련된 C의 값은 여전히 ​​모호 할 수 있음을 알 수 있습니다. 이것은 실제로 3 개 이상의 변수를 도입 할 때만 문제가됩니다. – user1457296

+0

다른 규칙 목록을 가지고있는 것과는 별도로 할 수있는 일은 없습니다. –

답변

1

최선의 방법은 일종의 계층 적 규칙 트리입니다. 사용자가 제 규칙을 추가하는 경우 (예를 들어 A> B), 응용 프로그램과 같은 데이터 구조를 만들 수있다 (lowerValues가지도되는 값의리스트 열쇠 리드) 지금

lowerValues['A'] = ['B'] 

사용자 다음 규칙 (B> C)을 추가하면 응용 프로그램은 B가 이미 lowerValues ​​목록 (이 경우 A)에 있는지 확인할 수 있습니다. 그렇게하면, C가 lowerValues ​​[ 'A'] 및 lowerValues ​​첨가된다 'B'가] 역시 생성된다

마지막
lowerValues['A'] = ['B', 'C'] 
lowerValues['B'] = ['C'] 

마지막 규칙이 사용자 (C> A)에 의해 제공 될 때, 응용 프로그램은 C가 lowerValues ​​목록에 있는지 확인합니다. B와 A에 있기 때문에 규칙이 유효하지 않습니다.

희망이 있습니다. VB에서 일종의 매핑이 있는지 기억이 안납니다. Dictionary 개체를 사용해보아야한다고 생각합니다.

이 아이디어를 얻으려면 모든 작업을 내부적으로 간단한 유형으로 변환해야합니다. 따라서, 예를 들어 :

A > B 

는 일반적으로

B <= A 

행운

+0

사실, 사전은 내가 지금하고있는 것에 대한 좋은 대안이 될 것이다. 그러나 정확히 어떻게 4 가지 변수를 고수 할 수 있을까? (* A> = B * B <= C *의 C> D * D = A) 'D'에서 사전에 없을 것 'A'그래서이 검증을 생략 할 수 있지만이 충돌한다. 나는 심볼을 번역하는 아이디어를 좋아한다. 그것은 가능성을 조금 더 열어 줄 수있다. – user1457296

+0

Well D는 이미 낮은 [A]에있을 것이므로 거기에서 충돌을 감지 할 수있다. equals []/notequals []가 필요할 수도있다. 이러한 작업을 추적하십시오 - @ Robson - 당신의 생각과 같지만 =과 <>를 살피기 위해서는 더 많은 작업이 필요합니다. –

1

로 번역 될 수있는이 꽤 어려운 문제입니다. 당신이 실제로 알고 자하는 것은 산술의 집합이 (사실적으로) 산정 된 방정식의 집합이 사실 일 때입니다. 이렇게하려면 산술을 "알고있는"제약 조건 해결사에 필요한 금액이 필요합니다. VB6에서는이를 찾을 수 없지만 하나를 하위 프로세스로 호출 할 수는 있습니다. 규칙이 명제 식 불평등을 통해서만 경우

(AA는 "단 하나의 방법을 쓰기). 둘째, 동어 반복에 대한 제안을 해결하려고합니다 (for Wang's algorithm 어떤을 할 수 있습니다 가능성이 implment에 가벼운 부상을 입 VB6에서).

명제가 동어 반복이 아닌 경우, 이제 불평등 (예 : A> B> C)의 사슬을 그래프로 작성하고주기를 찾으십시오.이 실패는 명제에 불일치가있는 경우입니다 (예 : "A > B 또는 B> Q "), 각각의 결합의 조합에 대해 불평등 사슬을 생성하고 일치하지 않는 것을 버려야합니다. 모두 버리면 세트가 일치하지 않습니다."A와 B "; DeMorgans 정리에 따르면, "A> B 및 B> Q"와 같은 것은 "A가 아니거나 아닙니다"와 같습니다. "A < = B 또는 B < = Q"와 같습니다. 당신은 놀라움을 피하기 위해 탈착식 정상형으로 조건을 줄이기를 원할 수 있습니다.

이러한 불평등에 대한 확고한 결정 절차가 있습니다. 그들은 구현하기가 어렵습니다.

관련 문제