값은 식을 평가하여 생성되는 데이터입니다. 이 섹션에서는 M 언어의 값 종류에 대해 설명합니다. 각 종류의 값은 리터럴 구문, 해당 종류의 값 집합, 해당 값 집합에 정의된 연산자 집합 및 새로 생성된 값에 지정된 내장 형식과 연결됩니다.
종류
리터럴
Null
null
논리적인
truefalse
숫자
01-11.52.3e-5
Time
#time(09,15,00)
날짜
#date(2013,02,26)
DateTime
#datetime(2013,02,26, 09,15,00)
DateTimeZone
#datetimezone(2013,02,26, 09,15,00, 09,00)
기간
#duration(0,1,30,0)
Text
"hello"
이진
#binary("AQID")
List
{1, 2, 3}
녹음
[ A = 1, B = 2 ]
테이블
#table({"X","Y"},{{0,1},{1,0}})
Function
(x) => x + 1
Type
type { number }type table [ A = any, B = text ]
다음 섹션에서는 각 값 종류에 대해 자세히 설명합니다. 형식 및 형식 설명은 형식에서 공식적으로 정의됩니다. 함수 값은 Functions에 정의됩니다. 다음 섹션에서는 각 값 종류에 대해 정의된 연산자를 나열하고 예제를 제공합니다. 연산자 의미 체계의 전체 정의는 연산자에서 다음과 같습니다.
Null
null 값은 값이 없거나 확정되지 않거나 알 수 없는 상태의 값을 나타내는 데 사용됩니다. null 값은 리터럴을 사용하여 작성됩니다 null. 다음 연산자는 null 값에 대해 정의됩니다.
연산자
결과
x > y
보다 큼
x >= y
크거나 같음
x < y
보다 작음
x <= y
작거나 같음
x = y
같음
x <> y
같지 않음
x ?? y
Coalesce
값의 네이 null 티브 형식은 내장 형식 null입니다.
논리
논리 값은 true 또는 false 값을 갖는 부울 작업에 사용됩니다. 논리 값은 리터럴 및 false.를 사용하여 작성됩니다true. 다음 연산자는 논리 값에 대해 정의됩니다.
연산자
결과
x > y
보다 큼
x >= y
크거나 같음
x < y
보다 작음
x <= y
작거나 같음
x = y
같음
x <> y
같지 않음
x or y
조건부 논리 OR
x ?? y
Coalesce
x and y
조건부 논리 AND
not x
논리 NOT
논리 값(true 및 false)의 네이티브 형식은 내장 형식 logical입니다.
number
숫자 값은 숫자 및 산술 연산에 사용됩니다. 다음은 숫자 리터럴의 예입니다.
3.14 // Fractional number
-1.5 // Fractional number
1.0e3 // Fractional number with exponent
123 // Whole number
1e3 // Whole number with exponent
0xff // Whole number in hex (255)
숫자는 적어도 Double의 전체 자릿수로 표시됩니다(하지만 더 정밀도를 유지할 수 있음). Double 표현은 [IEEE 754-2008]에 정의된 이진 부동 소수점 산술 연산에 대한 IEEE 64비트 배정밀도 표준과 일치합니다. (다음 항목이중 표현의 대략적인 동적 범위는 5.0 x 10324 에서 1.7 x 10308 이고 전체 자릿수는 15-16자리입니다.)
다음 특수 값도 숫자 값으로 간주됩니다.
양수 0 및 음수 0입니다. 대부분의 경우 양수 0과 음수 0은 단순 값 0과 동일하게 동작하지만 특정 연산은 둘을 구분합니다.
양수 무한대(#infinity) 및 음수 무한대(-#infinity). 무한대는 0이 아닌 숫자를 0으로 나누는 등의 연산에 의해 생성됩니다. 예를 들어 양 1.0 / 0.0 수 무한대를 생성하고 음의 -1.0 / 0.0 무한대를 생성합니다.
숫자가 아닌 값(#nan종종 약어 NaN)입니다. NaN은 0으로 나누는 것과 같은 잘못된 부동 소수점 연산에 의해 생성됩니다.
이진 수학 연산은 정밀도를 사용하여 수행됩니다. 전체 자릿수는 피연산자를 반올림할 도메인과 작업이 수행되는 도메인을 결정합니다. 명시적으로 지정된 정밀도가 없는 경우 이러한 작업은 배정밀도를 사용하여 수행됩니다.
수학적 연산 결과가 대상 형식에 비해 너무 작으면 연산 결과는 양의 0 또는 음수 0이 됩니다.
수학 연산 결과가 대상 형식에 비해 너무 크면 연산 결과가 무한대 또는 음의 무한대 상태가 됩니다.
수학 연산이 유효하지 않으면 연산 결과가 NaN이 됩니다.
부동 소수점 연산의 피연산자 중 하나 또는 둘 다 NaN이면 작업의 결과가 NaN이 됩니다.
다음 연산자는 숫자 값에 대해 정의됩니다.
연산자
결과
x > y
보다 큼
x >= y
크거나 같음
x < y
보다 작음
x <= y
작거나 같음
x = y
같음
x <> y
같지 않음
x + y
Sum
x - y
다름
x * y
Product
x / y
몫
x ?? y
Coalesce
+x
단항 더하기
-x
부정
숫자 값의 네이티브 형식은 내장 형식 number입니다.
Time
시간 값은 하루 중 시간의 불투명 표현을 저장합니다. 시간은 24시간 시계에 경과된 100나노초 틱의 수를 계산하는 자정 이후의 틱 수로 인코딩됩니다. 자정 이후의 최대 틱 수는 23:59:59.9999999 시간에 해당합니다.
시간에 대한 리터럴 구문은 없지만 여러 표준 라이브러리 함수를 제공하여 생성합니다. 기본 함수 #time를 사용하여 시간을 생성할 수도 있습니다.
#time(hour, minute, second)
다음을 유지해야 하거나 이유 코드 Expression.Error 가 있는 오류가 발생합니다.
0 ≤ 시간 ≤ 24
0 ≤ 분 ≤ 59
0 ≤ 초 ≤ 59
또한 hour = 24이면 분과 초는 0이어야 합니다.
다음 연산자는 시간 값에 대해 정의됩니다.
연산자
결과
x = y
같음
x <> y
같지 않음
x >= y
크거나 같음
x > y
보다 큼
x < y
보다 작음
x <= y
작거나 같음
x ?? y
Coalesce
다음 연산자는 피연산자 중 하나 또는 둘 다를 날짜로 허용합니다.
연산자
왼쪽 피연산자
오른쪽 피연산자
의미
x + y
time
duration
기간별 날짜 오프셋
x + y
duration
time
기간별 날짜 오프셋
x - y
time
duration
무효화된 기간별 날짜 오프셋
x - y
time
time
날짜 사이의 기간
x & y
date
time
병합된 날짜/시간
시간 값의 네이티브 형식은 내장 형식 time입니다.
날짜
날짜 값은 특정 날짜의 불투명 표현을 저장합니다. 날짜는 0001년 1월 1일부터 그레고리오력의 일반 시대부터 Epoch 이후의 일 수로 인코딩됩니다. epoch 이후의 최대 일 수는 9999년 12월 31일에 해당하는 3652058.
날짜에 대한 리터럴 구문은 없지만 여러 표준 라이브러리 함수가 제공되어 해당 구문을 생성합니다. 기본 함수 #date를 사용하여 날짜를 생성할 수도 있습니다.
#date(year, month, day)
다음을 유지해야 하거나 이유 코드 Expression.Error 가 있는 오류가 발생합니다.
1 ≤ 년 ≤ 9999
1 ≤ 월 ≤ 12
1일 ≤ ≤ 31
또한 선택한 월 및 연도에 대해 날짜가 유효해야 합니다.
다음 연산자는 날짜 값에 대해 정의됩니다.
연산자
결과
x = y
같음
x <> y
같지 않음
x >= y
크거나 같음
x > y
보다 큼
x < y
보다 작음
x <= y
작거나 같음
x ?? y
Coalesce
다음 연산자는 피연산자 중 하나 또는 둘 다를 날짜로 허용합니다.
연산자
왼쪽 피연산자
오른쪽 피연산자
의미
x + y
date
duration
기간별 날짜 오프셋
x + y
duration
date
기간별 날짜 오프셋
x - y
date
duration
무효화된 기간별 날짜 오프셋
x - y
date
date
날짜 사이의 기간
x & y
date
time
병합된 날짜/시간
날짜 값의 네이티브 형식은 내장 형식 date입니다.
DateTime
datetime 값에는 날짜와 시간이 모두 포함됩니다.
datetime에 대한 리터럴 구문은 없지만 여러 표준 라이브러리 함수를 제공하여 생성합니다. 기본 함수 #datetime를 사용하여 Datetime을 생성할 수도 있습니다.
#datetime(year, month, day, hour, minute, second)
다음이 적용되어야 하거나 이유 코드 Expression.Error를 포함하는 오류를 제기합니다. 1 ≤ 년 ≤ 9999에서 오류가 발생합니다.
1 ≤ 월 ≤ 12
1일 ≤ ≤ 31
0 ≤ 시간 ≤ 23
0 ≤ 분 ≤ 59
0 ≤ 초 ≤ 59
또한 선택한 월 및 연도에 대해 날짜가 유효해야 합니다.
다음 연산자는 datetime 값에 대해 정의됩니다.
연산자
결과
x = y
같음
x <> y
같지 않음
x >= y
크거나 같음
x > y
보다 큼
x < y
보다 작음
x <= y
작거나 같음
x ?? y
Coalesce
다음 연산자는 해당 피연산자 중 하나 또는 둘 다를 datetime으로 허용합니다.
연산자
왼쪽 피연산자
오른쪽 피연산자
의미
x + y
datetime
duration
기간별 날짜/시간 오프셋
x + y
duration
datetime
기간별 날짜/시간 오프셋
x - y
datetime
duration
무효화된 기간별 날짜/시간 오프셋
x - y
datetime
datetime
날짜/시간 사이의 기간
datetime 값의 네이티브 형식은 내장 형식 datetime입니다.
DateTimeZone
datetimezone 값에는 datetime 및 표준 시간대가 포함됩니다. 표준 시간대는 UTC에서 오프셋된 시간(분)으로 인코딩됩니다. 이는 날짜/시간의 시간 부분이 UTC(Universal Coordinated Time)에서 오프셋되어야 하는 시간(분)을 계산합니다. UTC의 최소 시간 오프셋 수는 -840이며 UTC 오프셋 -14:00 또는 UTC보다 14시간 이전을 나타냅니다. UTC의 최대 분 오프셋 수는 840이며 UTC 오프셋 14:00에 해당합니다.
datetimezones에 대한 리터럴 구문은 없지만 여러 표준 라이브러리 함수를 제공하여 생성합니다. Datetimezones는 내장 함수 #datetimezone를 사용하여 생성될 수도 있습니다.
다음을 유지해야 하거나 이유 코드 Expression.Error 가 있는 오류가 발생합니다.
1 ≤ 년 ≤ 9999
1 ≤ 월 ≤ 12
1일 ≤ ≤ 31
0 ≤ 시간 ≤ 23
0 ≤ 분 ≤ 59
0 ≤ 초 ≤ 59
-14 ≤ 오프셋 시간 ≤ 14
-59 ≤ 오프셋 분 ≤ 59
또한 날짜는 선택한 월 및 연도에 대해 유효해야 하고, 오프셋 시간 = 14이면 오프셋 분 <= 0이고, 오프셋 시간 = -14이면 오프셋 분 >= 0입니다.
datetimezone 값에 대해 정의된 연산자는 다음과 같습니다.
연산자
결과
x = y
같음
x <> y
같지 않음
x >= y
크거나 같음
x > y
보다 큼
x < y
보다 작음
x <= y
작거나 같음
x ?? y
Coalesce
다음 연산자는 해당 피연산자 중 하나 또는 둘 다를 datetimezone으로 허용합니다.
연산자
왼쪽 피연산자
오른쪽 피연산자
의미
x + y
datetimezone
duration
기간별 Datetimezone 오프셋
x + y
duration
datetimezone
기간별 Datetimezone 오프셋
x - y
datetimezone
duration
무효화된 기간별 Datetimezone 오프셋
x - y
datetimezone
datetimezone
datetimezones 사이의 기간
datetimezone 값의 네이티브 형식은 내장 형식 datetimezone입니다.
기간
기간 값은 100나노초 틱으로 측정된 타임라인에서 두 점 사이의 거리를 불투명하게 표현합니다. 기간의 크기는 양수 또는 음수일 수 있으며 양수 값은 진행률(시간)을 표시하고 음수 값은 진행률을 역방향으로 나타냅니다. 기간에 저장할 수 있는 최소값은 -9,223,372,036,854,775,808틱 또는 10,675,199일 2시간 48분 05.4775808초 이전 시간입니다. 기간에 저장할 수 있는 최대값은 9,223,372,036,854,775,807 틱 또는 10,675,199일 2시간 48분 05.4775807초 앞으로 입니다.
기간 동안 리터럴 구문은 없지만 여러 표준 라이브러리 함수를 제공하여 생성합니다. 기본 함수 #duration를 사용하여 기간을 생성할 수도 있습니다.
레코드 값은 순서가 지정된 필드 시퀀스입니다. 필드는 레코드 내의 필드를 고유하게 식별하는 텍스트 값과 필드 값인 필드 이름으로 구성됩니다. 필드 값은 레코드를 비롯한 모든 종류의 값일 수 있습니다. 다음과 같이 초기화 구문을 사용하여 레코드를 생성할 수 있습니다.
record-expression: [field-listopt] field-list:
field
field,field-list
밭:
field-name=식
field-name:
generalized-identifier
따옴표 붙은 식별자
다음 예제에서는 값이 있는 필드와 값이 있는 x 필드가 있는 y 레코드를 생성합니다2.1
[ x = 1, y = 2 ]
다음 예제에서는 중첩된 레코드 값이 a 있는 필드가 있는 레코드를 생성합니다. 중첩된 레코드에는 값2이 있는 필드가 있습니다b.
[ a = [ b = 2 ] ]
다음은 레코드 식을 평가할 때 유지됩니다.
각 필드 이름에 할당된 식은 연결된 필드의 값을 결정하는 데 사용됩니다.
필드 이름에 할당된 식이 계산될 때 값을 생성하면 결과 레코드의 필드 값이 됩니다.
필드 이름에 할당된 식이 평가할 때 오류가 발생하는 경우 오류가 발생한 사실은 발생한 오류 값과 함께 필드와 함께 기록됩니다. 이후에 해당 필드에 액세스하면 기록된 오류 값으로 오류가 다시 발생합니다.
식은 초기화되는 것을 제외하고 레코드의 모든 필드 값에 해당하는 변수가 병합된 부모 환경과 같은 환경에서만 평가됩니다.
레코드의 값은 해당 필드에 액세스할 때까지 평가되지 않습니다.
레코드의 값은 최대 한 번 평가됩니다.
식의 결과는 빈 메타데이터 레코드가 있는 레코드 값입니다.
레코드 내의 필드 순서는 레코드-이니셜라이저 식에 표시되는 순서로 정의됩니다.
지정된 모든 필드 이름은 레코드 내에서 고유해야 합니다. 그렇지 않으면 오류가 발생합니다. 이름은 서수 비교를 사용하여 비교됩니다.
[ x = 1, x = 2 ] // error: field names must be unique
[ X = 1, x = 2 ] // OK
필드가 없는 레코드를 빈 레코드라고 하며 다음과 같이 작성됩니다.
[] // empty record
필드에 액세스하거나 두 레코드를 비교할 때 레코드 필드의 순서는 중요하지 않지만 레코드 필드가 열거되는 경우와 같은 다른 컨텍스트에서는 중요합니다.
동일한 두 레코드는 필드를 가져올 때 서로 다른 결과를 생성합니다.
Record.FieldNames([ x = 1, y = 2 ]) // [ "x", "y" ]
Record.FieldNames([ y = 1, x = 2 ]) // [ "y", "x" ]
레코드의 필드 수는 함수를 사용하여 Record.FieldCount 확인할 수 있습니다. 예시:
Record.FieldCount([ x = 1, y = 2 }) // 2
Record.FieldCount([]) // 0
레코드 초기화 구문을 [ ]사용하는 것 외에도 값 목록과 필드 이름 또는 레코드 형식 목록에서 레코드를 생성할 수 있습니다. 예시:
Record.FromList({1, 2}, {"a", "b"})
위의 내용은 다음과 같습니다.
[ a = 1, b = 2 ]
다음 연산자는 레코드 값에 대해 정의됩니다.
연산자
결과
x = y
같음
x <> y
같지 않음
x & y
Merge
x ?? y
Coalesce
다음 예제에서는 위의 연산자를 보여 줍니다. 레코드 병합은 필드 이름이 겹치는 경우 오른쪽 피연산자의 필드를 사용하여 왼쪽 피연산자의 필드를 재정의합니다.
[ a = 1, b = 2 ] & [ c = 3 ] // [ a = 1, b = 2, c = 3 ]
[ a = 1, b = 2 ] & [ a = 3 ] // [ a = 3, b = 2 ]
[ a = 1, b = 2 ] = [ b = 2, a = 1 ] // true
[ a = 1, b = 2, c = 3 ] <> [ a = 1, b = 2 ] // true
레코드 값의 네이티브 형식은 필드의 열린 빈 목록을 지정하는 내장 형식 record입니다.
테이블
테이블 값은 순서가 지정된 행 시퀀스입니다. 행은 열 값의 순서가 지정된 시퀀스입니다. 테이블의 형식은 테이블의 모든 행 길이, 테이블 열의 이름, 테이블 열의 형식 및 테이블 키의 구조(있는 경우)를 결정합니다.
테이블에 대한 리터럴 구문은 없지만 테이블을 생성하기 위해 여러 표준 라이브러리 함수가 제공됩니다. 내장 함수 #table를 사용하여 테이블을 생성할 수도 있습니다.
다음 예제에서는 열 이름 목록과 행 목록에서 테이블을 생성합니다. 결과 테이블에는 두 개의 열과 세 개의 type any 행이 포함됩니다.
#table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})
#table 은 전체 테이블 형식을 지정하는 데 사용할 수도 있습니다.
#table(
type table [Digit = number, Name = text],
{{1,"one"}, {2,"two"}, {3,"three"}}
)
여기서 새 테이블 값에는 열 이름과 열 형식을 지정하는 테이블 형식이 있습니다.
다음 연산자는 테이블 값에 대해 정의됩니다.
연산자
결과
x = y
같음
x <> y
같지 않음
x & y
Concatenation
x ?? y
Coalesce
테이블 연결은 같은 이름의 열을 정렬하고 피연산자 테이블 중 하나에만 나타나는 열에 대해 채웁니다 null . 다음 예제에서는 테이블 연결을 보여 줍니다.
Do you want to learn about table types in Business Central? In this module, you'll learn about the different functional table types and their specific characteristics, such as special fields, properties, and linked pages.