2016-11-30 6 views
3

Power QueryのM言語の言語仕様を読み、オープンレコードタイプになっています。他のフィールドは、私はそれが何を意味するのかの具体的な理解を持っていないM(Power Query Formula Language)でのオープンレコードタイプの目的と使用

通常の(閉じた状態)レコードを宣言するための方法を、言語仕様から単に

myRecord = [name = "MyName", Age = 30] 

である。(5.4:レコードタイプ) :

myRecordType1 = type [Name = text, Age = number]  // Closed Record _type_ 
myRecordType2 = type [Name = text, Age = number, ...] // Open Record _type_ 

しかし、

myRecord = [Name = "MyName", Age = 30, ...] // Not valid code 

だからそれはそうです、この概念は、カスタムレコードタイプではなく、一般のレコードについてですが、私はそれをどうするか見当がつかない。私はこれを試してみました:

testFunc = (inputArg as myRecordType2) => 1 // Not valid code 

...それが唯一の名前&年齢フィールド、およびオプションの他のフィールドを持つレコードを受け入れ、ない機能を作るかもしれない期待します。それはasキーワードでは動作しないかもしれないが、でもこれがうまくいかないと思った:

testTable = Table.AddColumn(Table.FromRecords({[A=1]}), "newcol", each [Name="MyName", Age=30], type myRecordType1) // Not valid code 

誰かがこのために使用(ケース)を示してもらえますか? 言語仕様で何か迷っていましたか?

+0

以下の回答は、それが少し良くなったことを理解するのに役立ちますが、これがどこにあるのかはまだ分かりません。任意のアイデア/ユースケース? – alazyworkaholic

答えて

3

私の解釈は以下の通りです。どんなコメントも感謝しています(他の考えも)。

種類は値の分類です。プリミティブタイプ(数値、テキストなど)とカスタムタイプ(例:特定のテーブルタイプまたはレコードタイプ。

たとえば、テーブルタイプは列名のセット、 - タイプと任意のキー値です。 テーブルタイプは、最初に指定して、テーブルを作成するときに使用することができます。

Tabeltype = type table[Key = number, Value = text], 
TabletypeWithKey = Type.AddTableKey(Tabeltype,{"Key"},true), 
TableWithKey = #table(TabletypeWithKey, {{1, "A"},{2, "B"}, {3, "C"}}) 

同様に、あなたはレコード型を作成することができます。

ただし、レコードの作成時にレコードタイプを直接使用することはできません。 Value.ReplaceTypeを使用して、型を値に「帰属させる」ことができます。レコード型は閉じられ、オプションのフィールドはありません。 以下のコードの例。

値が特定の型に一致するかどうかを確認することができますが、これはプリミティブ型(キーワード "is"または "as"または "Type.Is"を使用)でのみ行うことができます。

私は以下のコードを作成して、レコードのレコードタイプへの適合性をチェックしました。私の解釈によれば、完全な保証はできません。 現在のところ、何が起きているのかを見ることができるようにクエリがありますが、簡単に関数に変換し、コメントアウトされているコードの下半分の例を使用することができます。

// Mext 2 lines to be decommented to turn the code into a function 
//let 
// fnCheckConformity = (Record1 as record, RecordType as type) as logical => 
let 
    // Next 2 lines to be removed when turning this code into a function 
    Record1 = [x = 1, A = 3, B = 4], 
    RecordType = type [x = number, optional y = text,...], 
    RecordTypeFields = Type.RecordFields(RecordType), 
    ToTable = Record.ToTable(RecordTypeFields), 
    RecordTypeTable = Table.ExpandRecordColumn(ToTable, "Value", {"Optional", "Type"}, {"Optional", "Type"}), 
    RecordTable = Table.FromColumns({Record.FieldNames(Record1),Record.FieldValues(Record1)},{"Record FieldName", "Record FieldValue"}), 
    JoinedTable = Table.Join(RecordTypeTable, "Name", RecordTable, "Record FieldName", JoinKind.FullOuter), 
    ConformityCheck = Table.AddColumn(JoinedTable, "Conform", 
         each if [Optional] = null then Type.IsOpenRecord(RecordType) else 
          if [Optional] then true else 
          if [Record FieldValue] <> null then Value.Is([Record FieldValue], [Type]) else 
          false), 
    Result = List.AllTrue(ConformityCheck[Conform]) 
in 
    Result 
// Add a comma after Result when turning the code above into a function 
/* The code below can be used when turning the code above into a function. 
// Examples: 
    OpenRecordType = type [x = number, optional y = text,...], 
    ClosedRecordType = type [x = number, y = text], 
    RecordA = [x = 1], 
    RecordB = [x = 1, A = 3, B = 4], 
    RecordC = [x = 1, y = "MarcelBeug"], 
// RecordC is ascribed type ClosedRecordType: 
    RecordCTyped = Value.ReplaceType(RecordC, ClosedRecordType), 
    Conformity1 = fnCheckConformity(RecordA, OpenRecordType), // true 
    Conformity2 = fnCheckConformity(RecordA, ClosedRecordType), // false 
    Conformity3 = fnCheckConformity(RecordB, OpenRecordType), // true 
    Conformity4 = fnCheckConformity(RecordB, ClosedRecordType), // false 
    Conformity5 = fnCheckConformity(RecordC, OpenRecordType) // true 
in 
    Conformity5 */ 
1

マルセルの答えは素晴らしいですが、私はもう少しコンテキストを追加することができます。

今日、 "M"のオープンレコードタイプには多くの用途はありません。

のような1つの場所は、「荒れた」テーブルという概念があった場合に便利です。このCSVは、2行、3行、4行のデータが異なる行にあります。 PQエディタ/エクセル/ PowerBIデスクトップ/ powerbi.comに、このCSVをロード

A,B,C 
1,2 
1,2,3 
1,2,3,4 

はおそらく動作しますが、それは、テーブル値に適していないのです。今日の "M"デザインでは、テーブルは基本的に非オプションフィールドを持つ閉じられたレコードのリストです(したがって、テーブルの列よりも多くのフィールドを持つテーブル行を持つことはできません)。

Azure TableやODataのような他のデータソースでも、不揃いのテーブルを使用する可能性があります。今は、いくつかの固定列を持つテーブルとレコード列[Content]または[Open Types]を返します。

関連する問題