2009-10-27 3 views
4

이것은 다소 복잡하므로 나와 함께 참아주십시오.변수가 포함 된 수식의 데이터베이스 저장

고용주는 일련의 변수에서 작업 반복을 계산하는 시스템을 구축해야합니다.

프로젝트의 각 작업에는 작업 완료 ("반복") 횟수를 계산하는 데 사용되는 특정 수식이 있습니다. 수식은 상수, 변수 (숫자 입력, 작업은 공급 업체 수 또는 해외 직원 수와 관련 될 수 있으며이 값은 프로젝트마다 다를 수 있음) 및/또는 시간 (예 : 한 달에 한 번, 분기마다 한 번, 6 개월에 한 번, 한 해에 한 번)

나중에이 계산식을 저장할 수 있도록 데이터베이스를 설계하려면 어떻게해야합니까?

예제 공식 :
공급 업체 당 월 1 회.
고객 당 공급 업체 당 1/4로 두 번.
6 명의 공급 업체 한 달에 한 번.

테크 스택의 SQLServer, .NET 3.5 C#을 2005

+0

내가 대답은 아마이 공식이 득점하는 방법을 사치에 따라 달라집니다 생각합니다. 그들은 항상 매우 구체적인 형식을 따르고 있습니까? Z 당 Y 당 X? 멋진 예외가있을 수 있습니까? Z 당 Y 당 X를 제외하고 A의 경우는 D 당 C 당 B입니다. B 당 A (X - (Y * Z))와 같이 더 복잡 할 수 있습니까? –

+3

이것은 자신 만의 규칙 엔진을 구축하는 첫 걸음이되었습니다. – APC

+0

@Brian Schroth 예외가 없습니다. A를 제외하고 Z 당 Y와 같은 X를 사용할 수 있습니다. 그러나 수식은 B 당 A 당 (X- (Y * Z))와 같을 수 있습니다. –

답변

7

NCalc (Codeplex) 파서를 SQLCLR에 포함시키고 수식을 표에 저장할 수 있습니다.

+0

이것은 내가 끝내었던 것입니다. 감사합니다! –

+1

바로 위에 !! :-) SQLCLR에 NCalc를 추가 했습니까? – Nestor

+0

설명을 추가하여 SQLCLR에 추가하십시오. –

0

는이 수식을 정의 동사/플레이스 홀더를 사용하는 VARCHAR 열을 처리하는 데 사용할 동사/플레이스 홀더의 세트를 정의 만들 수?

이러한 동사/자리 표시자는 다음 프로그램에서 공식을 처리하여 기술적으로 수행하려는 작업을 처리하는 데 사용됩니다.

그래서 :
공급 업체 당 개월 수에 따라 일단 : 고객 당 공급 당 분기에 두 번/공급 업체
이 될 수
1/MONTH :
2/QUARTER/공급 업체/고객

제한된 수의 수식 템플릿 만 처리하면되지만 그렇지 않으면 엉망이됩니다.

매우 유연 할 필요가 없다면이 접근법이 효과적 일 수 있지만, 완전히 융통성을 발휘하려면 스스로 만든 보고서 유형으로 이동하는 것이 훨씬 더 복잡합니다.

0

이 기법에 대해 어떻게 생각하십니까? (사용의 JScript)

Evaluate a formula at runtime

using System; 

namespace CodeFreezer.CodeSamples 
{ 
    public static class ExpressionEvaluator 
    { 
     /// <summary> 
     /// Evaluate 
     /// Evaluate a math expression 
     /// </summary> 
     /// <param name="expression">Expression to evaluate</param> 
     /// <returns>result</returns> 
     public static double Evaluate(string expression) 
     { 
      if (String.IsNullOrEmpty(expression)) throw new ArgumentNullException("expression"); 

      return Convert.ToDouble(Microsoft.JScript.Eval.JScriptEvaluate(expression, Microsoft.JScript.Vsa.VsaEngine.CreateEngine())); 
     } 
    } 
} 
+0

나는 그것을 고려할 것입니다. 확실하지 않은 표현을 실행하는 것은 위험합니다. 여기 사람들이 당신이 여기에서 달리고 싶지 않은 DB에 물건을 넣지 못하도록하기 위해 보안이 추가로 필요하다고 생각합니다. –

3

내가 이런 식으로 저장할 것 : 업체 당

당 한 달에 한 번.

(* month supplier)

공급 업체 당 고객 당 2 회.

(* 2 (* quarter (* supplier customer)))

6 개 공급 업체마다 한 번씩.

(* month (/ (+ supplier 5) 6))

쉽게 분석 할 수 있습니다. 구문 분석을 한 후에는 사용자가 찾은 식별자 목록을 제시하고 사용자에게 값을 제공하도록 요청합니다.

0

일부 동적 SQL은 어떻습니까?

  1. 수식 (프로 시저 또는 sql 스크립트) 라이브러리를 사용하여 테이블을 작성하여 사례를 포괄 할 수 있습니다. 수식 매개 변수의 경우 '# 반복 횟수 # 여기'와 같은 자리 표시자를 사용하십시오. 수식 열은 nvarchar (max) - 문자열입니다.

  2. 실행할 각 단계 지점과 사용할 매개 변수 목록에 대해 작업 단계 테이블을 작성하십시오.

  3. 동적 매개 변수 스크립트 (텍스트)를 실제 매개 변수로 교체합니다 (검색 & 대체).

  4. 사용하여 기능을 실행 sp_executesql을 N'my_funcion_text_here '

관련 문제