diff --git a/onboarding/ja-jp/ja-as-cicd.md b/onboarding/ja-jp/ja-as-cicd.md new file mode 100644 index 0000000..a6353f1 --- /dev/null +++ b/onboarding/ja-jp/ja-as-cicd.md @@ -0,0 +1,10 @@ +--- +uid: as-cicd +title: Analysis Services CI/CD with Azure DevOps and Tabular Editor +author: Daniel Otykier +updated: 2021-10-04 +--- + +# Analysis Services CI/CD with Azure DevOps and Tabular Editor + +(WIP) \ No newline at end of file diff --git a/onboarding/ja-jp/ja-boosting-productivity-te3.md b/onboarding/ja-jp/ja-boosting-productivity-te3.md new file mode 100644 index 0000000..b5d905b --- /dev/null +++ b/onboarding/ja-jp/ja-boosting-productivity-te3.md @@ -0,0 +1,15 @@ +# Tabular Editor 3で生産性を向上させる + +
+ +このセクションでは、Tabular Editor 3とその主な機能に素早く慣れることができるよう、もっとも生産的な方法で何かを成し遂げる方法に重点を置いた記事を多数掲載しています。 + +以下は記事の概要と、それぞれの記事で学べることです。 + +- [テーブルのインポートとデータモデリング](ja-importing-tables-data-modeling.md):この記事では、テーブルのインポート、テーブルスキーマの更新、リレーションシップの可視化と編集の方法について説明します。 +- [リフレッシュ・プレビュー・クエリ](ja-refresh-preview-query.md):この記事では、リフレッシュのスケジュールを設定する方法について説明します。この記事では、リフレッシュ操作をスケジュールする方法、テーブルデータをプレビューする方法、ピボットグリッドを使用して要約されたデータを表示する方法、DAXクエリーを作成および実行する方法、Tabular Editor 3の統合版である [VertiPaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer/) を使用する方法について説明しています。 +- [creating-and-testing-dax](ja-creating-and-testing-dax.md):この記事では、Tabular Editor 3の強力なDAXエディターを紹介し、メジャー、計算列、計算テーブルなどのDAX計算をモデルにすばやく追加および編集する方法を示します。 +- [dax-script-introduction](ja-creating-and-testing-dax.md):この記事では、DAXスクリプト機能を使用して、複数のメジャーの定義を1つのDAXスクリプトにまとめ複雑なビジネス・ロジックを記述、維持、およびテストする方法を説明します。 +- [bpa](ja-bpa.md): この記事では、ベストプラクティス・アナライザーの詳細と、カスタマイズ可能なベストプラクティスルールを設定し、モデルのコード品質を向上させる方法について説明します。 +- [cs-scripts-and-macros](ja-cs-scripts-and-macros.md):この記事では、Tabular Editor 3におけるC#スクリプトの概念、スクリプトレコーダー、およびUIに統合可能な再利用可能マクロとしてスクリプトを保存する方法について紹介します。 +- [パーソナライジング-TE3](ja-personalizing-te3.md):この記事では、Tabular Editor 3で利用できる幅広い設定オプションとプリファレンスを紹介し、ツールをニーズに合わせて調整できるようにします。 diff --git a/onboarding/ja-jp/ja-bpa.md b/onboarding/ja-jp/ja-bpa.md new file mode 100644 index 0000000..6b5b531 --- /dev/null +++ b/onboarding/ja-jp/ja-bpa.md @@ -0,0 +1,104 @@ +# ベストプラクティスアナライザーでコード品質を向上させる + +ここまでで、Tabular Object Model(TOM)が比較的複雑なデータ構造であり、多くの異なるタイプのオブジェクトとプロパティを持つことはすでにご存じでしょう。これらのプロパティに割り当てるべき最適な値は必ずしも明確でなく、多くの場合、特定のユースケースやモデル設計に依存します。Tabular Editorの**Best Practice Analyzer**はTOMを継続的にスキャンし、定義可能なベストプラクティスルールに違反がないかどうかを調べます。これにより、オブジェクトのプロパティが常に理想的な値に設定されているかどうかを確認できます。 + +ベストプラクティス・アナライザーで確認できること。 + +- **DAX式** 特定のDAX関数または構成要素が使用されたときに警告するルールを作成します。 +- **書式設定** 書式文字列や説明などを指定するよう促すルールを作成します。 +- **命名規則** 特定のタイプのオブジェクト(キー列、隠し列など)が特定の名前パターンにしたがっているかどうかをチェックするルールを作成します。 +- **パフォーマンス** 計算列の数を減らすことを推奨するなど、モデルのパフォーマンスに関連するさまざまな側面をチェックするルールを作成します。 + +Best Practice Analyzerは、モデルの完全なメタデータにアクセスでき、より高度なシナリオのためにVertiPaq Analyzerの統計にもアクセスできます。 + +> [!NOTE]。 +> Tabular EditorにはBPAルールが付属していません。最初に独自のルールを定義するか、[Power BI CAT Team が推奨するルール](https://powerbi.microsoft.com/en-ca/blog/best-practice-rules-to-improve-your-models-performance/) のような標準的なルールセットを使用する必要があります。 + +## ベストプラクティスルールの管理 + +モデルに適用するルールを追加、削除、または修正するには、「ツール > BPAルールの管理...」メニュー オプションを使用します。 + +![BPAマネージャー](../../images/bpa-manager.png) + +このUIには2つのリストがあります。一番上のリストは、現在ロードされているルールの**コレクション**を表します。このリストでコレクションを選択すると、そのコレクション内で定義されているすべてのルールが下のリストに表示されます。モデルがロードされると、以下の3つのルール・コレクションが表示されます。 + +* **現在のモデル内のルール** **Rules within the current model**: 名前が示すように、これは、現在のモデル内で定義されたルールのコレクションです。ルール定義は、Modelオブジェクトのアノテーションとして保存されます。 +* **ローカルユーザーのルール** **Rules for local user**: これらは `%LocalAppData%TabularEditor3 FilterBPARules.json` ファイルに格納されているルールです。これらのルールは、現在ログインしているWindowsユーザーがTabular Editorにロードするすべてのモデルに適用されます。 +* **Rules on the local machine**: これらのルールは `%ProgramData%TabularEditorTabularPARules.json` に格納されます。これらのルールは、現在のマシンでTabular Editorにロードされるすべてのモデルに適用されます。 + +同じルール(IDによる)が複数のコレクションにある場合、優先順位は上から下になります。つまり、モデル内で定義されたルールは、ローカルマシンで定義された同じIDのルールよりも優先されます。これにより、たとえば、モデル特有の慣習を考慮に入れて、既存のルールを上書きできます。 + +リストの上部には、**(Effective rules)**という特別なコレクションが表示されます。このコレクションを選択すると、現在ロードされているモデルに実際に適用されるルールのリストが表示され、前述のように、同一のIDを持つルールの優先順位が尊重されます。下のリストには、ルールがどのコレクションに属しているかが表示されます。また、より高い優先順位のコレクションに同じIDのルールが存在する場合、そのルールの名前は打ち消されることに注意してください。 + +![ルールの上書き](../../images/rule-overrides.png) + +## コレクションの追加 + +ルールコレクションは、特定のモデルに追加できます。ネットワーク共有にルールファイルがある場合、そのファイルをルールコレクションとして現在のモデルに含めることができます。ファイルの場所への書き込み権限があれば、そのファイルからルールを追加/変更/削除することもできます。この方法で追加されたルール・コレクションは、モデル内で定義されたルールよりも優先されます。このようなコレクションを複数追加した場合、それらを上下に移動して、相互の優先順位を制御できます。 + +「追加...」ボタンをクリックすると、新しいルール・コレクションをモデルに追加できます。これには、以下のオプションがあります。 + +![ベストプラクティスルールコレクションの追加](../../images/add-rule-file.png) + +* **Create new Rule File** **Create new Rule File**: 指定された場所に新しい空の .jsonファイルが作成され、その後ルールを追加できます。ファイルを選択する際、相対的なファイルパスを使用するオプションがあることに注意してください。これは、現在のモデルと同じコードリポジトリにルールファイルを保存したい場合に便利です。ただし、相対的なルール・ファイルの参照は、モデルがディスクからロードされたときにのみ機能することに注意してください(Analysis Servicesのインスタンスからモデルをロードするときには作業ディレクトリが存在しないため)。 +* **ローカル・ルール・ファイルを含める** **Include local Rule File**: ルールを含む .jsonファイルをすでに持っていて、それをモデルに含めたい場合はこのオプションを使用します。ここでも、相対ファイルパスを使用するオプションがあり、ファイルがモデルのメタデータへ近い場所にある場合は有効です。ファイルがネットワーク共有(または一般に、現在ロードされているモデル・メタデータが存在する場所とは異なるドライブ)にある場合、絶対パスを使用してのみインクルードできます。 +* **Include Rule File from URL**: このオプションでは、有効なルールセット(json形式)を返すHTTP/HTTPS URLを指定できます。これは、オンラインソースのルール、たとえば [BestPracticeRules GitHub サイト](https://github.com/TabularEditor/BestPracticeRules) の [標準 BPA ルール](https://raw.githubusercontent.com/TabularEditor/BestPracticeRules/master/BPARules-standard.json) を含めたい場合に便利です。オンラインソースから追加されたルールコレクションは、読み取り専用になります。 + +## コレクション内のルールを修正する + +画面の下部では、現在選択されているコレクション内のルールを追加、編集、クローン、削除できます(コレクションが保存されている場所への書き込み権限がある場合)。さらに、"Move to... "ボタンを使用すると、選択したルールを別のコレクションに移動またはコピーすることができ、複数のルールのコレクションを簡単に管理できます。 + +## ルールの追加 + +コレクションに新しいルールを追加するには、**New rule...**ボタンをクリックします。これにより、ベストプラクティスルールエディターが表示されます(以下のスクリーンショットを参照)。 + +![BPAルールエディタ](../../images/bpa-rule-editor.png) + +新しいルールを作成する場合、以下の詳細を指定する必要があります。 + +- **名前**: ルールの名前。Tabular Editorのユーザーに表示されます。 +- **ID**:ルールの内部ID。ルールの内部ID。ルールコレクション内で一意である必要があります。異なるコレクション間で複数のルールが同じIDを持つ場合、最も優先順位の高いコレクション内のルールのみが適用されます。 +- 重要度**。厳しさはTabular EditorのUIでは使用されませんが、[Tabular Editorのコマンドラインインターフェース](xref:command-line-options)でベストプラクティス分析を実行する場合、ルール違反がどのくらい「厳しい」かをこの数値で決定します。 + - 1 = 情報のみ + - 2 = 警告 + - 3(またはそれ以上)= エラー +- **カテゴリ**。ルールを論理的にグループ化し、ルール管理を容易にするため、使用されます。 +- **説明** (オプション): ルールの目的を説明するために使用します。ベストプラクティス・アナライザーのビューにツールチップとして表示されます。説明フィールドでは、以下のプレースホルダー値を使用して、より文脈に沿ったメッセージを提供できます。 + - object%` は、現在のオブジェクトへの完全修飾されたDAXリファレンスを返します(該当する場合)。 + - objectname%` は、現在のオブジェクトの名前のみを返します。 + - objecttype%` は現在のオブジェクトのタイプを返します。 +- **Applies to**: ルールを適用するオブジェクトの種類を選択します。 +- **Expression**: Dynamic LINQ](https://dynamic-linq.net/expression-language) 検索式を入力します。(**Applies to** ドロップダウンで選択したオブジェクト タイプのうち)ルールに違反するオブジェクトに対して `true` と評価されるはずの式です。Dynamic LINQ式は、選択されたオブジェクトタイプで利用可能なTOMプロパティだけでなく、幅広い標準.NETメソッドとプロパティにアクセスできます。 +- **最小限の互換性レベル**。一部のTOMプロパティは、すべての互換性レベルでは使用できません。汎用ルールを作成する場合は、このドロップダウンを使用して、ルールが適用されるべきモデルの最小互換性レベルを指定します。 + +ルールがディスク上のルールコレクションに保存されると、上記のすべてのプロパティが JSON 形式で保存されます。JSONファイルを編集することで、ルールの追加・編集・削除を行うことができます。また、ルールに `FixExpression` プロパティを指定することも可能です。これは、ルール違反修正するため、モデルに適用される[C#スクリプト](xref:cs-scripts-and-macros)を生成するために使用される文字列です。 + +## ベストプラクティス・アナライザー・ビューの使用 + +Tabular Editorは、ベストプラクティスルール違反を**Best Practice Analyzer**ビューに表示します。また、メインウィンドウの下部にあるステータスバーでルール違反の件数を確認できます。ビューにフォーカスを当てるには、**表示 > ベストプラクティス アナライザー** メニューオプションを使用するか、ステータスバーの「# BP issues」ボタンをクリックします。 + +ベストプラクティス・アナライザー・ビュー](~/images/best-practice-analyzer-view.png) + +ベストプラクティス アナライザー ビュー**には、違反のオブジェクトを持つすべてのルールのリストが表示されます。各ルールの下には、違反しているオブジェクトのリストが表示されます。リスト内のオブジェクトをダブルクリックすると、**TOM Explorer**でそのオブジェクトに移動できます。 + +![アイテムオプション](../../images/bpa-options.png) + +オブジェクトを右クリックすると、上記のようないくつかのオプションが表示されます。これらは以下の通りです。 + +- オブジェクトに移動する**。オブジェクトへ移動**:オブジェクトをダブルクリックして、**TOM Explorer**でそのオブジェクトに移動するのと同じです。 +- オブジェクトを無視する**。オブジェクトに注釈が追加され、ベストプラクティス・アナライザーがそのオブジェクトの特定のルールを無視するように指示します。無視されるルールはIDで指定します。 +- 修正スクリプトを生成する**。このオプションは、ルールに `FixExpression` プロパティが指定されている場合にのみ利用可能です。このオプションを選択すると、Tabular Editorは選択されたルールの `FixExpression` に基づいて新しいC#スクリプトを作成します。 +- **Apply fix**: このオプションは、ルールに `FixExpression` プロパティが指定されている場合にのみ利用可能です。このオプションを選択すると、Tabular Editorはルール違反を自動的に修正するために、選択されたルールの `FixExpression` を実行します。 + +> [!注意]。 +> ベストプラクティス・アナライザーのビューでは、ShiftキーまたはCtrlキーを押しながらオブジェクトを複数選択することができます。 + +上記のオプションは、**Best Practice Analyzerビュー**の上部にあるツールバーボタンとしても利用可能です。さらに、すべてのアイテムの拡大/縮小、無視されたルール/オブジェクトの表示、手動更新(バックグラウンドスキャンが無効な場合に必要、下記参照)を行うためのボタンも用意されています。 + +## ベストプラクティス・アナライザーを無効にする + +場合によっては、ベストプラクティス・アナライザーのバックグラウンドスキャンを無効にできます。たとえば、評価に比較的長い時間のかかるルールがある場合や、非常に大きなモデルを扱っている場合などです。 + +バックグラウンドスキャンは、**Tools > Preferences > Features > Best Practice Analyzer** で、**Scan for Best Practice violations in the background** のチェックを外して無効にできます。 + +なお、バックグラウンドスキャンを無効にしていても、上記のように **Best Practice Analyzer ビュー** の **Refresh** ボタンを使って手動でスキャンを実行することは可能です。 diff --git a/onboarding/ja-jp/ja-creating-and-testing-dax.md b/onboarding/ja-jp/ja-creating-and-testing-dax.md new file mode 100644 index 0000000..d886884 --- /dev/null +++ b/onboarding/ja-jp/ja-creating-and-testing-dax.md @@ -0,0 +1,113 @@ +# メジャーや他の計算オブジェクトを追加する + +Tabular Editor 2.xが2017年初頭にリリースされて以来、メジャー間のDAX式をすばやく修正する機能は、常にツールのもっとも人気のある機能でした。戻る/進むナビゲーション、コピー/ペースト操作、DAX依存性の視覚化、アンドゥ/リドゥのサポートと組み合わせて、このツールは常に、複数の小さな変更を素早く行う能力が重要である、大規模で複雑なデータモデルを扱う人にとって好ましい選択肢となってきました。 + +この点で、Tabular Editor 2.xのユーザーからの唯一の不満は、DAXコードアシスト機能(時に「IntelliSense」と呼ばれる)がないことでした。とくにDAXに100%精通しているわけではない場合(そうである人はほとんどいません!)、DAXコードエディターが構文や関数パラメーターなどを覚えるのを助けてくれるのは非常に便利です。 + +これはすべて、Tabular Editor 3にある新しいDAXコードエディターで対処されます。 + +![複雑なDAX式の編集](../../images/dax-editor-screenshot.png) + +この資料では、メジャーおよびその他の計算オブジェクトを作成する方法、およびこれらのオブジェクトのDAX式を変更する方法について説明します。DAXコード・エディターの多くの機能の詳細については、 を参照してください。 + +## メジャーの追加 + +モデルに [いくつかのテーブルをインポート](ja-importing-tables-data-modeling.md) して [テーブル間のリレーションシップを作成](ja-importing-tables-data-modeling.md) したら、次はビジネス・ロジックを含むいくつかの明示的メジャーを追加する番です。 + +> [!TIP] +> 技術的には、Power BI レポートでデータを視覚化する前に、明示的なメジャーをモデルに追加する必要はありません。しかし、MDXベースのクライアントツール(ExcelやTabular Editor 3のPivot Gridなど)では明示的なメジャーが必要なため、常に追加しておくことがベストプラクティスです。また、[Calculation Groups](https://docs.microsoft.com/en-us/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions) は明示的なメジャーにのみ適用されます。 + +Tabular Editorを使用して新しいメジャーを追加するには、メジャーを追加するテーブルを右クリックし、**Create > Measure** (ALT+1) を選択します。 + +![新しいメジャーの追加](../../images/adding-new-measure.png) + +新しいメジャーを追加すると、そのメジャーの名前を編集できるようになります。メジャーの名前を入力したら、ENTERキーを押します。名前は後で**Properties**ビューで編集するか、**TOM Explorer**でメジャーを選択した状態でF2を押すと、いつでも編集できます。 + +**Expression Editor** ビューは、メジャーのDAX式を指定するために使用されます。コードを入力すると、DAXエディターによってコードの候補が表示され、構文エラーや意味上のエラーが下線表示されることに注意してください。 + +メジャーを追加する![DAXエディタ](../../images/add-measure-edit-dax.png) + +**Expression Editor** の左上隅にあるドロップダウン・ボックスは、現在選択されているオブジェクトのさまざまなDAXプロパティを切り替えるために使用されます。たとえば、Analysis Servicesの新しいバージョンでは、メジャーは[`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/)と同様に `Expression` プロパティを持っています。その他の種類のオブジェクトには、DAXコードを含むさまざまなプロパティがあります。たとえば、[KPI](https://docs.microsoft.com/en-us/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions)には3つの異なるDAXプロパティがあります。Tabular EditorでKPIを追加するには、メジャーを右クリックし、**Create > KPI** を選択します。 + +[KPIの編集](../../images/editing-kpis.png)を選択します。 + +メジャーを非表示にする場合は、右クリックして、**Make invisible** (CTRL+I) オプションを選択するだけです。同様に、**Make visible** (CTRL+U) オプションを選択すると、メジャーを非表示にできます。 + +## その他のメジャーのプロパティ + +`Name`, `Expression`, `Hidden` プロパティに加えて、**Properties** ビューを使用して、**TOM Explorer** で現在選択されているオブジェクトのすべてのプロパティの値を確認および編集できます。メジャーでは、たとえばここで `Format String` を設定できます。詳しくは、[プロパティビュー](xref:properties-view)を参照してください。 + +## 計算されたカラムを追加する + +計算されたカラムを追加するには、カラムを追加したいテーブルを右クリックし、 **Create > Calculated Column** (ALT+2)を選択します。列の名前を付け、上記のメジャーの場合と同様に、**式エディター** を使用してそのDAX式を編集します。 + +> [重要] このオプションはデフォルトでは使用できません。 +> Power BI Desktop モデルに接続している場合、このオプションはデフォルトでは使用できません。これは、[Power BI Desktop がサポートする外部ツールの制限](xref:desktop-limitations) に起因するものです。詳しくはリンクをクリックしてください。 + +> [!注意]を参照してください。 +> 計算列の DAX 式が変更された場合、その列をレポートで使用するには、その列が存在するテーブルをリフレッシュする必要があります。詳しくは を参照してください。 + +## 計算されたテーブルの追加 + +計算テーブルを追加するには、モデルまたは "Tables"フォルダーを右クリックし、**Create > Calculated Table** (ALT+6)を選択します。テーブルに名前を付け、上記のメジャーの場合と同様に、**式エディター** を使用してそのDAX式を編集します。DAX式を変更すると、テーブルの列が自動的に変更されることに注意してください。他のDAX式がテーブルを参照する場合、または列が階層構造で使用される場合、これはカスケード効果を引き起こす可能性があります。 + +> [!重要] このオプションはデフォルトでは使用できません。 +> Power BI Desktop モデルに接続している場合、このオプションはデフォルトでは使用できません。これは、[外部ツールの Power BI Desktop サポートの制限](xref:desktop-limitations) に起因するものです。詳しくはリンクをクリックしてください。 + +> [!注意]を参照してください。 +> 計算テーブルの DAX 式が変更された場合、そのテーブルをレポートで使用する前にリフレッシュする必要があります。詳しくはを参照してください。 + +## 計算グループの追加 + +[計算グループ](https://docs.microsoft.com/en-us/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions)を追加するには、モデルまたは「テーブル」フォルダーを右クリックし、**作成 > 計算グループ** (ALT+7)を選択します。計算グループには名前を付けます。また、デフォルトの**Name**列には、別の名前を考えてください。 + +> [!重要]。 +> このオプションは、互換性レベル1500以上のモデルでのみ利用可能です。 + +計算項目を追加するには、新しく作成した計算グループを右クリックし、**Create > Calculation Item**を選択します。計算項目に名前を付け、上記のメジャーの場合と同様に **Expression Editor** を使用してそのDAX式を編集します。 + +計算項目は、TOM Explorerでドラッグするか、**Properties** ビューで `Ordinal` プロパティを設定することにより、表示順序を変更できます。 + +> [!注意]。 +> 計算項目が追加、名前変更、または計算グループから削除された場合、計算グループをリフレッシュしてからでないと、レポートで使用することができません。詳しくはを参照してください。 + +## 一般的なモデリング操作 + +## コピー/ペースト + +TOMエクスプローラーのすべてのオブジェクトはTabular Editorでコピー&ペーストできます。異なるTabular Editorのインスタンス間、そしてTabular Editor 2.xとTabular Editor 3間でもコピー&ペーストが可能です。おなじみのキーボードショートカットを使用できます。 + +- 編集 > コピー** (CTRL+C) +- 編集 > カット** (CTRL+X) +- 編集 > 貼り付け** (CTRL+V) + +> [!TIP]です。 +> あるテーブルを別のテーブルに置き換え、そのテーブルとの既存のリレーションシップをすべて保持したい場合、テーブルをクリップボードにコピーし、TOMエクスプローラで置き換えたいテーブルを選択して貼り付けます。選択したテーブルをクリップボードにあるテーブルと置き換えるかどうか確認するプロンプトが表示されます。 + +## 元に戻す/やり直し + +Tabular Editorのオブジェクトやプロパティに変更が加えられると、その変更履歴が完全に追跡され、加えられたすべての変更を元に戻すことができます。使い慣れたキーボードショートカットを使用できます。 + +- 編集 > 元に戻す** (CTRL+Z) +- 編集 > やり直し** (CTRL+Y) + +> [!注意]。 +> Tabular Editor 3のすべてのテキストエディタは、独自の取り消し/やり直し履歴を持つため、カーソルが現在テキストエディタ内にある場合、キーボードショートカットはそのエディタ内で入力の取り消し/やり直しを行います。モデルレベルでのアンドゥ/リドゥを実行するには、**Edit**メニューのオプションを使用するか、ユーザーインターフェイスの他の要素(TOM Explorerなど)をクリックして現在のテキストエディターを無効化することができます。 + +## ナビゲーション + +DAXエディター内のオブジェクト参照にカーソルを合わせた状態で右クリックし、**Go to definition** (F12)を選択すると、そのオブジェクトに素早くジャンプできます。もちろん、TOMエクスプローラーを使用してオブジェクト間を移動することもできます。 + +**式エディター**の右上にある矢印ボタンを使用すると、訪問したオブジェクト間を素早く行き来できます。 + +## DAX依存関係 + +オブジェクト間のDAX依存関係を表示するには、**TOM Explorer**でオブジェクトを選択し、右クリックして**Show dependencies** (SHIFT+F12)を選択します。これにより、選択したオブジェクトの依存関係(両方向)を表示するウィンドウが開きます。このウィンドウでオブジェクトをダブルクリックすると、そのオブジェクトにすばやく移動できます。 + +Dax Dependencies And Tom Explorer](../../images/dax-dependencies-and-tom-explorer.png) + +## フォルダーを表示する + +モデルがかなりの数のメジャーを獲得し始めると、表示フォルダーを使用してそれらを整理することが良い習慣となります。Tabular Editorで、ディスプレイ・フォルダーを作成するには、**Properties** ビューで `Display Folder` プロパティを編集するか、またはメジャーを右クリックし**Create > Display Folder** オプションを選択します。 + +また、ディスプレイフォルダー間でオブジェクトをカット/コピー/ペーストしたり、ドラッグ&ドロップすることもできます。 diff --git a/onboarding/ja-jp/ja-cs-scripts-and-macros.md b/onboarding/ja-jp/ja-cs-scripts-and-macros.md new file mode 100644 index 0000000..59f2526 --- /dev/null +++ b/onboarding/ja-jp/ja-cs-scripts-and-macros.md @@ -0,0 +1,133 @@ +# C#スクリプトとマクロの紹介 + +生産性の向上を謳うソフトウェアであれば、ユーザーとのやりとりを**自動化する手段を提供する必要があります。Tabular Editorでは、まさにこの目的のためにC#スクリプトを書くことができます。Tabular EditorのC#スクリプトを使用すると、例えば次のようなことができます。 + +- メジャー、テーブル、計算項目などのTOMオブジェクトの作成を自動化する。 +- TOMエクスプローラーで現在選択されているオブジェクトとのインタラクション +- 複数のオブジェクトに自動的にプロパティを割り当てる +- 監査や文書化のために、さまざまなフォーマットでメタデータをインポートおよびエクスポートする。 + +スクリプトによってモデルのメタデータが変更された場合、TOM ExplorerとPropertiesビューで変更内容をすぐに確認できます。さらに、**スクリプトの変更を取り消す**ことができ、効果的にモデル・メタデータをスクリプト実行前のポイントにロールバックできます。スクリプトの実行に失敗した場合、デフォルトで自動的に変更がロールバックされます。 + +Tabular Editor 3にはシンプルな**script recorder**があり、モデルに変更を加える際にスクリプトコードの行を徐々に追加することで、使用する構文の習得に役立ちます。 + +スクリプトはスタンドアロンファイル(拡張子 `.csx`)として保存でき、Tabular Editorのユーザー間で共有できます。さらに、スクリプトは再利用可能な**マクロ**として保存することができ、スクリプトをTabular Editorのユーザーインターフェイスとより密接に統合させることができます。 + +## スクリプトの作成 + +新しいC#スクリプトを作成するには、**File > New > C# Script** メニューオプションを使用します。このオプションは、Tabular Editorにモデルがロードされていない場合でも利用できることに注意してください。 + +最初のスクリプトには、次のコードを入力します。 + +```csharp +Info("Hello world!"); +``` + +F5キーを押して、コードを実行します。 + +あなたの最初のスクリプト](~/images/first-script.png) + +もし、コードを入力するときに間違えた場合は、シンタックスエラーが **Messages ビュー** に表示されます。 + +- スクリプトをファイルとして保存するには、**ファイル > 保存** (Ctrl+S)を押すだけです。 +- ファイルからスクリプトを開くには、**ファイル > 開く > ファイル...** (Ctrl+O)オプションを使用します。ファイルを開くダイアログは、デフォルトで `.cs` または `.csx` の拡張子を持つファイルを探します。 + +## スクリプトレコーダーの使用 + +C#スクリプトにフォーカスがあるとき、Tabular Editorの**C# Script > Record script** メニューオプションを使用すると、スクリプトレコーダーを起動できます。スクリプトが記録されている間、モデルのメタデータに変更を加えると、スクリプトに追加のコード行が追加されます。記録を停止するまで、スクリプトを手動で編集することはできないので注意してください。 + +![Csharpスクリプトレコーダー](../../images/csharp-script-recorder.png) + +## モデルのメタデータにアクセスする + +現在ロードされているモデル内の特定のオブジェクトにアクセスするためには、Tabular Object Model (TOM) 階層をナビゲートするためのC# 構文を使用する必要があります。この階層のルートは `Model` オブジェクトです。 + +以下のスクリプトは、現在ロードされているモデルの名前を出力します。もし、モデルがロードされていない場合は、警告が表示されます。 + +```csharp +if(Model != null) + Info("現在のモデルの名前は: " + Model.Name); +else + Warning("No model is currently loaded!"); +``` + +`Model` オブジェクトは [Microsoft.AnalysisServices.Tabular.Model](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.model.aspx) クラスのラッパーであり、そのプロパティのサブセットを公開し、便宜上いくつかのメソッドとプロパティを追加しています。 + +特定のメジャーにアクセスするには、そのメジャーの名前と、そのメジャーが存在するテーブルの名前を知っている必要があります。 + +```csharp +var myMeasure = Model.Tables["Internet Sales"].Measures["Internet Total Sales"]; +myMeasure.Description = "The formula for this measure is:" + myMeasure.Expression; +``` + +上記のスクリプトの行1は、"Internet Sales" テーブルの "Internet Total Sales" メジャーを特定し、そのメジャーへの参照を `myMeasure` 変数に格納します。 + +スクリプトの2行目では、ハードコードされた文字列とメジャーの (DAX) 式に基づいて、メジャーの説明を設定しています。 + +Tabular Editorは、TOM ExplorerからC#スクリプトビューにオブジェクトをドラッグ&ドロップすることで、特定のオブジェクトを参照するコードを自動生成できます。 + +ドラッグでオブジェクト参照を生成](~/images/generate-csharp-code.gif) + +Tabular EditorのほとんどのTOMオブジェクト(テーブル、カラム、メジャーなど)は、AMO/TOMクライアントライブラリを直接使用するときに利用できるのと同じプロパティのセットを公開しています。このため、どのプロパティが利用できるかは、[Microsoft's AMO/TOM documentation](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular?view=analysisservices-dotnet) を参照するとよいでしょう。例えば、[こちら](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.measure?view=analysisservices-dotnet#properties) は、利用可能なメジャープロパティのドキュメントです。 + +## 現在の TOM Explorer の選択にアクセスする + +スクリプトを再利用可能にするには、上記のように、モデル内のオブジェクトを名前で直接参照できるだけでは不十分なことがあります。その代わりに、Tabular Editorの**TOM Explorerビュー**で現在選択されているオブジェクトを参照することが有効です。これは `Selected` オブジェクトを使用することで可能になります。 + +```csharp +Info("現在、選択されています。" + Selected.Measures.Count + " メジャー(s)."); +``` + +`Selected` オブジェクトは、それ自体、現在選択されているすべてのオブジェクトのコレクションで、選択されたディスプレイフォルダー内のオブジェクトも含まれます。さらに、`Selected` オブジェクトは複数のプロパティを含んでおり、上記の例で示した `.Measures` プロパティのような特定のオブジェクトタイプを簡単に参照できます。一般的に、これらのプロパティは、複数形(`.Measures`)と単数形(`.Measure`)の両方が存在します。一方、後者は現在選択されているオブジェクトへの参照であり、そのオブジェクトの種類が1つだけ選択されている場合にのみ使用できます。 + +usful-script-snippetsの記事には、`Selected`オブジェクトを使用してさまざまなタスクを実行するスクリプトの例が多数掲載されています。 + +## ユーザーとのインタラクション + +上記の例では、`Info(...)` と `Warning(...)` グローバルメソッドを使って、さまざまなフレーバーでユーザーへのメッセージを表示させることができました。Tabular Editorはこれらのグローバルメソッドに加え、情報を表示したり収集したりするための拡張メソッドや、その他さまざまな一般的なタスクのためのメソッドを多数提供しています。もっともよく使われるものを以下にリストアップします。 + +* `void Output(object value)` - スクリプトの実行を停止し、提供されたオブジェクトに関する詳細な情報を表示する。提供されたオブジェクトがTOMオブジェクトまたはTOMオブジェクトのコレクションである場合、すべてのプロパティの詳細なビューが表示されます。 +* `void SaveFile(string filePath, string content)` - テキストデータをファイルに保存するための便利な方法です。 +* `string ReadFile(string filePath)` - ファイルからテキストデータをロードする便利な方法です。 +* `string ExportProperties(IEnumerable objects, string properties = "...")` - 複数のオブジェクトからプロパティのセットをTSV文字列としてエクスポートするための便利な方法です。 +* `void ImportProperties(string tsvData)` - 複数のオブジェクトに、TSV文字列からプロパティをロードする便利な方法です。 +* `string ConvertDax(dax, useSemicolons)` - DAX式をUS/UKと非US/UKロケールの間で変換します。`useSemicolons` がtrueの場合(デフォルト)、 `dax` 文字列はネイティブのUS/UKフォーマットからnon-US/UKフォーマットに変換されます。つまり、カンマ (リストセパレーター) はセミコロンに、ピリオド (小数点以下のセパレーター) はカンマに変換されます。UseSemicolons` がfalseに設定されている場合は、その逆となります。 +* `void FormatDax(IEnumerable objects, bool shortFormat, bool? skipSpace)` - 与えられたコレクション内のすべてのオブジェクトに対してDAX式をフォーマットします。 +* `void FormatDax(IDaxDependantObject obj)` - スクリプトの実行が完了したとき、あるいは `CallDaxFormatter` メソッドが呼ばれたときに、DAX式のフォーマット用にオブジェクトをキューに入れます。 +* `void CallDaxFormatter(bool shortFormat, bool? skipSpace)` - これまでにキューイングされたオブジェクトに対して、すべてのDAX式をフォーマットします。 +* `void Info(string message)` - 情報メッセージを表示します。 +* `void Warning(string message)` - 警告メッセージを表示する。 +* `void Error(string message)` - エラーメッセージを表示します。 +* `measure SelectMeasure(Measure preselect = null, string label = "...")` - すべてのメジャーのリストを表示し、ユーザが1つを選択するように促します。 +* `T SelectObject(this IEnumerable objects, T preselect = null, string label = "...") ここでT: TabularNamedObject` - 指定されたオブジェクトのリストを表示し、ユーザーに1つを選択するように促します。 +* `IList SelectObjects(this IEnumerable objects, IEnumerable preselect = null, string label = "...") where T: TabularNamedObject` - 提供されたオブジェクトのリストを表示し、ユーザーに任意の数のオブジェクトを選択するように促し、選択されたオブジェクトのリスト(またはキャンセルボタンが押された場合はnull)を返します。 + +## スクリプトをマクロとして保存する + +よく使うスクリプトは再利用可能なマクロとして保存でき、Tabular Editorを起動すると常に利用可能です。さらに、マクロは**TOM Explorerビュー**のコンテキストメニューに自動的に統合され、**Tools > Customize...**オプションを使用して既存またはカスタムのメニューやツールバーにマクロを追加することも可能です。 + +スクリプトをマクロとして保存するには、**C# Script > Save as Macro...** オプションを使用します。 + +新しいマクロを保存](../../images/save-new-macro.png) + +マクロの名前を指定します。たとえば、"My MacrosTest "という名前を付けると、TOM Explorerのコンテキストメニューに "My Macros "というサブメニューができ、このサブメニューの中にスクリプトを呼び出す "Test "というメニューオプションができます。 + +また、マクロによって作成されたメニューオプションの上にカーソルを置くと表示されるツールチップをオプションで指定できます。 + +また、マクロのコンテキストを指定する必要があります。これは、コンテキストメニューでマクロを利用するために選択する必要があるオブジェクトの種類を指定します。 + +最後に、**Macro enabled condition (advanced)** で、(通常は `Selected` または `Model` オブジェクトに基づいて)真/偽に評価されるべき C# 式を指定できます。これにより、現在の選択範囲に基づいて、マクロを有効にするかどうかをより詳細に制御できます。たとえば、以下のような表現が可能です。 + +```csharp +Selected.Measures.Count == 1 +``` + +とすると、ちょうど1つのメジャーが選択されたときだけマクロを有効にできます。 + +## マクロの管理 + +過去に保存したすべてのマクロは、**マクロビュー**に表示できます。このビューを表示するには、メニューオプションの **表示 > マクロ** を使用します。このビューでは、以下のことが可能です。 + +- **Rename a macro** (カーソルを**名前**列に置き、新しい名前を入力するだけ) +- **Delete a macro.**それを選択し、マクロのリストの上にある赤い「X」ボタンをクリックします。 +- **Edit a macro.** リストでマクロをダブルクリックします(リストの「Id」列をダブルクリックします)。これにより、マクロが新しいC#スクリプトビューで開かれ、そこでコードを変更できます。Ctrl+Sを押して、コードの変更を保存します。他のマクロプロパティ(ツールチップ、マクロコンテキストなど)を編集する必要がある場合は、**C# Script > Edit Macro...** メニューオプションを使用します。 diff --git a/onboarding/ja-jp/ja-dax-script-introduction.md b/onboarding/ja-jp/ja-dax-script-introduction.md new file mode 100644 index 0000000..69b763c --- /dev/null +++ b/onboarding/ja-jp/ja-dax-script-introduction.md @@ -0,0 +1,198 @@ +# Using the DAX Scripting feature + +In the [previous article](xref:creating-and-testing-dax), you learned how to add and edit calculated objects such as measures, calculated columns, etc. in your model. + +As your model grows in complexity, you may reach a point in which it starts to become cumbersome to navigate the TOM Explorer or jump back and forth between measures, when authoring and maintaining business logic. It is not uncommon to have long chains of dependencies between measures, and so for that reason, it is sometimes useful to collect all the DAX code making up the business logic, in a single document. + +This is exactly the purpose of the new **DAX script** feature introduced in Tabular Editor 3. + +To use this feature, locate the measures for which you would like to generate a single document, in the TOM Explorer. Multi-select the measures, then right-click and choose **Script DAX**. A new document is created, containing the definition of all the selected measures. You can also generate a DAX script for all measures within a table or all measures within the model, by choosing the table or model object respectively. + +![Dax Script](~/images/dax-script.png) + +Editing objects through a DAX script is slightly different than editing through the **Expression Editor**. With the latter, changes are applied immediately when you navigate to a different object. In a DAX script, however, changes are not applied until you explicitly do so by using the **Script > Apply** (F5) option. If you are connected to an instance of Analysis Services, you can use the **Script > Apply & Sync** (SHIFT+F5) option to simultaneously apply the changes and save the updated model metadata to Analysis Services. + +## Working with DAX script files + +DAX scripts can be saved as text files, using the `.te3daxs` file extension. To save a DAX script as a file, simply use the **File > Save** (Ctrl+S) option. To open a DAX script from a text file, use the **File > Open > File...** (Ctrl+O) option. + +> [!NOTE] +> DAX scripts are not model specific, but since DAX expressions may point to measures, columns and tables defined in the model, there are no guarantees that any DAX script can be applied to any model. DAX scripts are mostly useful for working with several DAX objects within a single document, in the context of a specific data model. + +## DAX script editor + +The DAX script editor has all the capabilities of the DAX editor used elsewhere in Tabular Editor 3. Specifically, auto-complete, auto-formatting, calltips, etc. + +In addition, to easily manage large DAX scripts, two dropdowns are displayed at the top of the DAX script view. The dropdown on the left allows you to jump between objects defined in the script, where as the dropdown on the right allows you to jump between properties on the current object. + +![Dax Script Navigation](~/images/dax-script-navigation.png) + +## Define measures + +If you want to include the definition of a measure that is referenced in the script, but not already defined in the script, you can do so by right-clicking on a measure reference, and choose the "Define Measure" or "Define Measure with dependencies" option. + +![Define Measure With Deps](~/images/define-measure-with-deps.png) + +## Shortcuts + +To apply the script to the model, use the following shortcuts: + +- **F5**: Apply the entire script to the local model metadata +- **Shift+F5**: Apply the entire script to the local model metadata, then save the model metadata back to the source +- **F8**: Apply the currently selected part of the script to the local model metadata +- **Shift+F8**: Apply the currently selected part of the script to the local model metadata, then save the model metadata back to the source + +## DAX objects supported + +Tabular Editor 3 supports editing the following types of objects using a DAX script: + +- Measures (including KPIs) +- Calculated columns +- Calculated tables +- Calculation groups (including calculation items) + +# DAX script syntax + +The syntax for DAX scripts is the following: + +```dax +: +MEASURE 'Table name'[Measure name] = + [] + +COLUMN 'Table name'[Column name] = + [] + +TABLE 'Table name' = + [] + +CALCULATIONGROUP 'Table name'[Column name] + [] + CALCULATIONITEM "Item 1" = + [] + CALCULATIONITEM "Item 2" = + [] + ... + +: + DetailRows = + DisplayFolder = "string" + FormatString = "string" + Description = "string" + Visible = TRUE/FALSE + KpiStatusExpression = + KpiStatusDescription = "string" + KpiStatusGraphic = "string" + KpiTrendExpression = + KpiTrendDescription = "string" + KpiTrendGraphic = "string" + KpiTargetExpression = + KpiTargetDescription = "string" + KpiTargetFormatString = "string" + +: + DisplayFolder = "string" + FormatString = "string" + Description = "string" + Visible = TRUE / FALSE + Datatype = BOOLEAN / DOUBLE / INTEGER / DATETIME / CURRENCY / STRING + +
: + Description = "string" + Visible = TRUE / FALSE + DetailRows = + +: + Description = "string" + Visible = TRUE / FALSE + Precedence = + + + Description = "string" + Ordinal = + FormatString = +``` + +## Example 1: Measure + +As an example, the script below defines the `[Internet Total Sales]` measure on the `'Internet Sales'` table. In addition to the DAX expression of the measure, the script also includes the measure description and format string. + +```dax +---------------------------------- +-- Measure: [Internet Total Sales] +---------------------------------- +MEASURE 'Internet Sales'[Internet Total Sales] = SUM('Internet Sales'[Sales Amount]) + Description = "Returns the sum of all Internet Sales" + FormatString = "\$#,0.00;(\$#,0.00);\$#,0.00" +``` + +## Example 2: Measure with status and target KPI + +The DAX script below defines the `[Internet Current Quarter Sales Performance]` measure, which includes a KPI that has a status and a target expression. The status KPI uses the "Shapes" graphic. + +```dax +-------------------------------------------------------- +-- Measure: [Internet Current Quarter Sales Performance] +-------------------------------------------------------- +MEASURE 'Internet Sales'[Internet Current Quarter Sales Performance] = + IFERROR( + [Internet Current Quarter Sales] / [Internet Previous Quarter Sales Proportion to QTD], + BLANK() + ) + , KpiStatusExpression = + VAR x = [Internet Current Quarter Sales Performance] + RETURN + IF( + ISBLANK( x ), + BLANK(), + IF(x < 1, -1, IF(x < 1.07, 0, 1)) + ) + , KpiStatusGraphic = "Shapes" + , KpiTargetExpression = 1.1 +``` + +## Example 3: Calculation group + +The DAX script below defines the `'Time Intelligence'` calculation group with the `[Period]` column. The calculation group contains 6 calculation items that performs various time calculations. Notice how the `"YoY %"` item applies a different format string. + +```dax +----------------------------------------- +-- Calculation Group: 'Time Intelligence' +----------------------------------------- +CALCULATIONGROUP 'Time Intelligence'[Period] + Description = "Use this table to perform time calculations" + + CALCULATIONITEM "Current" = SELECTEDMEASURE() + Ordinal = 0 + + CALCULATIONITEM "MTD" = TOTALMTD(SELECTEDMEASURE(), 'Calendar'[Date]) + Ordinal = 1 + + CALCULATIONITEM "YTD" = TOTALYTD(SELECTEDMEASURE(), 'Calendar'[Date]) + Ordinal = 2 + + CALCULATIONITEM "PY" = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Calendar'[Date])) + Ordinal = 3 + + CALCULATIONITEM "YoY" = + SELECTEDMEASURE() + - CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Calendar'[Date])) + Ordinal = 4 + + CALCULATIONITEM "YoY %" = + VAR lastYear = + CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Calendar'[Date])) + RETURN + DIVIDE( + SELECTEDMEASURE() - lastYear, + lastYear + ) + FormatString = "Percent" + Ordinal = 5 +``` + +# Next steps + +- @bpa +- @cs-scripts-and-macros +- @personalizing-te3 \ No newline at end of file diff --git a/onboarding/ja-jp/ja-general-introduction.md b/onboarding/ja-jp/ja-general-introduction.md new file mode 100644 index 0000000..aaa2e1d --- /dev/null +++ b/onboarding/ja-jp/ja-general-introduction.md @@ -0,0 +1,115 @@ +--- +uid: general-introduction +title: General introduction and architecture +author: Daniel Otykier +updated: 2021-09-30 +--- + +# General introduction and architecture + +Tabular Editor is a Windows desktop application for developing tabular models. Specifically, the tool lets you edit the Tabular Object Model (TOM) metadata. The tool can load the TOM metadata from a file or from an existing Analysis Services database, and it can also deploy updated TOM metadata to Analysis Services. + +> [!NOTE] +> We use the term **tabular model** to represent both Analysis Services Tabular models as well as Power BI datasets, since Analysis Services Tabular is the data model engine used by Power BI. Similarly, when we use term **Analysis Services**, we mean "any instance of Analysis Services", which could be SQL Server Analysis Services, Power BI Desktop or the Power BI Service XMLA Endpoint. + +## Tabular Object Model (TOM) metadata + +A data model is made up by a number of tables. Each table has one or more columns, and a table may also contain measures and hierarchies. Typically, the data model also defines relationships between tables, data sources containing connection details and table partitions containing data source expressions (SQL or M queries) for loading data, etc. All of this information is collectively called the **model metadata**, and it is stored in a JSON based format known as the **Tabular Object Model (TOM)**. + +- When a tabular model is created using Visual Studio, the JSON representing the TOM metadata is stored in a file called **Model.bim**. +- When a data model is created using Power BI Desktop, the TOM metadata is embedded within the .pbix or .pbit file (since this file format also contains a lot of other details, such as definitions of visuals, bookmarks, etc., which is not related to the data model itself). + +Using a client library called [AMO/TOM](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions), Tabular Editor is able to load and save metadata to and from this JSON based format. In addition, the client library allows Tabular Editor to connect directly to any instance of Analysis Services, in order to obtain the model metadata from an existing database. This is illustrated in the figure below. + +![Architecture](~/images/architecture.png) + +> [!NOTE] +> In the paragraph above, we used the term **database** to represent a model that has been deployed to Analysis Services. Within the Power BI Service the term **dataset** is used to represent the same thing, namely a tabular model. + +Tabular Editor can load model metadata from the following sources: + +- [1] Model.bim files +- [2] Database.json files (see @parallel-development for more information) +- [3] .pbit files (Power BI Template) +- [4] A database on SQL Server Analysis Services (Tabular) +- [5] A database on Azure Analysis Services +- [6] A dataset in a Power BI Premium* Workspace +- [7] A Power BI Desktop report in Import/DirectQuery mode + +*Power BI Premium/Embedded Capacity or Power BI Premium-Per-User is required in order to enable the [XMLA Endpoint](https://docs.microsoft.com/en-us/power-bi/admin/service-premium-connect-tools). The XMLA Endpoint must be enabled for any third party tool to connect to Power BI datasets. + +> [!IMPORTANT] +> Tabular Editor 2.x supports all sources 1-7 above. Tabular Editor 3 supports only some sources depending on which [edition of Tabular Editor 3](xref:editions) you are using. + +Once the model metadata has been loaded in Tabular Editor, the user is free to add/edit/remove **objects** and change **object properties**. Modifications are not saved back to the source until the user explicitly saves the model, either by choosing **File > Save** or by hitting CTRL+S. If the model metadata was loaded from a file source (sources 1-3 above), that file will then be updated. If the model metadata was loaded from Analysis Services (sources 4-7 above), then the changes are saved back to Analysis Services. Note that certain changes may cause objects to enter a state where they can no longer be queried by end-users. For example, if you add a column to a table, you will need to [refresh the table](xref:refresh-preview-query#refreshing-data) before users can query the contents of that table or any measures that dependent on the table. + +> [!WARNING] +> Certain limitations apply when saving model metadata changes back to Power BI Desktop (source 7 above). See @desktop-limitations for more information. + +### TOM objects and properties + +The TOM metadata is made up of **objects** and **properties**. + +Examples of TOM **objects**: + +- Data Sources +- Tables +- Partitions +- Measures +- KPIs +- Columns +- Model Roles + +Examples of TOM **object properties**: + +- `Name` (text) +- `Display Folder` (text) +- `Description` (text) +- `Hidden` (true/false) +- `Summarize By` (one of: None, Sum, Min, Max, ...) + +Most properties are simple values (text, true/false, one-of-selections aka. enums), but properties can also reference other objects (for example, the `Sort By Column` property should reference a column). Properties can also be arrays of objects, such as the `Members` property on the Model Role object. + +Tabular Editor generally uses the same name for objects and properties as those defind in the [Microsoft.AnalysisServices.Tabular namespace](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular?view=analysisservices-dotnet). If you want to learn more about specific TOM objects or properties, always consult the namespace documentation. For example, to learn what the "Summarize By" column property does, first locate the "Column" class in Microsoft's documentation, then expand "Properties" and scroll to "SummarizeBy". You should then get to [this article](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.column.summarizeby?view=analysisservices-dotnet). + +![SummarizeBy on Microsoft's docs](~/images/asdocs-summarizyby.png) + +### Editing property values + +Both versions of Tabular Editor display the object model metadata in a hierarchical view known as the **TOM Explorer** view, which roughly corresponds to the hierarchical structure of the JSON metadata: + +![TOM Explorer](~/images/tom-explorer.png) + +In general, Tabular Editor lets you modify object properties by first selecting an object in the TOM Explorer (you can select multiple objects at once by holding down SHIFT or CTRL), and then simply editing the property value within the **Properties view** (see screenshot below). + +![Properties View](~/images/properties-view.png) + +Tabular Editor does not perform explicit validation of modified property values, except for some basic rules (for example, object names cannot be empty, measure names have to be unique, etc.). It is your responsibility as a tabular model developer to know which properties to set and what values to use. + +If you make a mistake while editing property values, you can always press CTRL+Z (Edit > Undo) to roll back the last property change. + +## Architecture + +As hinted above, Tabular Editor has two different modes of operation: Metadata from file (aka. **file mode**) and metadata from Analysis Services (aka. **connected mode**). In addition, Tabular Editor 3 introduces a hybrid approach called [**workspace mode**](xref:workspace-mode). + +Before proceeding, it is important to understand the differences between these modes: + +- In **file mode**, Tabular Editor loads and saves all model metadata from and to a file on disk. In this mode, Tabular Editor cannot interact with model **data** (that is, table previews, DAX queries, Pivot Grids, and data refresh operations are not enabled). This mode can be used entirely offline, even when no instance of Analysis Services is available. The supported file formats for model metadata are: + - Model.bim (same format used by Visual Studio) + - Database.json (folder structure only used by Tabular Editor) + - .pbit (Power BI Template) +- In **connected mode**, Tabular Editor loads and saves model metadata from and to Analysis Services. In this mode, it is possible to interact with model **data** using Tabular Editor 3 (table previews, DAX queries, Pivot Grids and data refresh). This mode requires connectivity to an instance of Analysis Services. +- In **workspace mode**, Tabular Editor 3 loads model metadata from a file on disk AND deploys the metadata to Analysis Services. On subsequent saves (CTRL+S), updates are saved both to disk and to the connected instance of Analysis Services. It is possible to interact with model **data** similar to **connected mode**. + +### Metadata synchronization + +One of the major benefits of Tabular Editor over the standard tools (Visual Studio, Power BI Desktop), is that model metadata is only saved upon request. In other words, you can make multiple changes to objects and properties without having to wait for any Analysis Services instance to become synchronized between each change. The synchronization of the Analysis Services database is an operation that may take several seconds to complete, depending on the size and complexity of the data model. In Power BI Desktop, this synchronization happens every time the notorious "Working on it" spinner appears on the screen. In Tabular Editor, this only happens when you explicitly save your changes (CTRL+S). + +The downside is, of course, that you have to remember to explicitly save your changes, before you can test the impact of any metadata modifications that were made. + +## Next steps + +- @installation-activation-basic +- @migrate-from-vs +- @migrate-from-desktop +- @migrate-from-te2 \ No newline at end of file diff --git a/onboarding/ja-jp/ja-importing-tables-data-modeling.md b/onboarding/ja-jp/ja-importing-tables-data-modeling.md new file mode 100644 index 0000000..961a4eb --- /dev/null +++ b/onboarding/ja-jp/ja-importing-tables-data-modeling.md @@ -0,0 +1,72 @@ +--- +uid: importing-tables-data-modeling +title: Importing tables and data modeling +author: Daniel Otykier +updated: 2021-10-08 +applies_to: + editions: + - edition: Desktop + partial: TE3 Desktop Edition includes this feature. External tools adding/editing tables, columns and relationships against a Power BI Desktop model is not supported by Microsoft, however. + - edition: Business + - edition: Enterprise +--- +# Importing tables and data modeling + +This article describes how to use the [Table Import Wizard](#table-import-wizard) of Tabular Editor 3, to add new tables to the model. There is also a section on how to [update the table schema](#updating-table-schema) of an existing table. Lastly, we cover how to use the [diagram tool](#working-with-diagrams) to define and edit relationships between tables. + +## Table Import Wizard + +[!include[importing-tables1](~/te3/import-tables.partial.md)] + +# Working with diagrams + +In Tabular Editor 3, **diagrams** are documents that can be used to visualize and edit the relationships between tables in the model. You can create as many diagrams as you want to visualize certain areas of your model. A diagram can be saved as a stand alone file. See for more information. + +> [!NOTE] +> We recommend creating multiple smaller diagrams over few large diagrams. When a diagram contains more than 20 or so tables, it quickly becomes overwhelming and difficult to understand. + +After loading a model in Tabular Editor 3, choose the **File > New > Diagram** menu option to create a new diagram. + +## Adding tables + +Add initial tables to the diagram in any of the following ways: + +- (Multi-)select tables in the TOM Explorer, then right-click and choose **Add to diagram**. +- (Multi-)select tables in the TOM Explorer, then drag the tables over to the diagram +- Use the **Diagram > Add tables...** menu option, and (multi-)select the tables you want to add through the dialog box. + ![Diagram Add Tables](~/images/diagram-add-tables.png) + +To add additional tables to the diagram, use the technique above again, or right-click on an existing table in the diagram and choose one of the following options: +- **Add tables that filter this table**: Adds all tables to the diagram which may, directly or indirectly through other tables, filter the currently selected table. Useful when starting from a fact table. +- **Add all related tables**: Adds all tables to the diagram which are directly related to the currently selected table. Useful when starting from a dimension table. + ![Add Related Tables](~/images/add-related-tables.png) + +Before proceeding, rearrange and resize the tables in the diagram to suit your preferences, or use the **Diagram > Auto-arrange** feature to have Tabular Editor 3 lay out the tables automatically. + +## Modifying relationships using the diagram + +To add a new relationship between two tables, locate the column on the fact table (many-side) of the relationship, and drag that column over to the corresponding column on the dimension table (one-side). Confirm the settings for the relationship and hit **OK**. + +![Create Relationship](~/images/create-relationship.png) + +To edit an existing relationship, right-click on it and choose **Edit relationship**. The right-click menu also contains shortcuts for reversing or deleting a relationship, as shown on the screenshot below. + +![Edit Relationship Diagram](~/images/edit-relationship-diagram.png) + +> [!NOTE] +> You can also create relationships without using a diagram, through the TOM Explorer. Locate the column from which the relationship should start (many-side / fact-table side), right-click and choose **Create > Relationship from**. Specify the destination column in the Create Relationship dialog that appears on the screen. + +## Saving a diagram + +To save a diagram, simply use the **File > Save** (CTRL+S) option. Tabular Editor 3 will prompt you to save the diagram if you close the document or the application while the diagram has unsaved changes. + +> [!TIP] +> The same diagram file can be loaded for different data models. Diagrams reference tables by their names. Any tables not present in the model upon diagram load are simply removed from the diagram. + +> [!NOTE] +> Every time you add or modify a relationship, you will have to run a "calculate" refresh on the data model, before the relationships can be used when querying the model. + +# Next steps + +- @refresh-preview-query +- @creating-and-testing-dax \ No newline at end of file diff --git a/onboarding/ja-jp/ja-index.md b/onboarding/ja-jp/ja-index.md new file mode 100644 index 0000000..f369454 --- /dev/null +++ b/onboarding/ja-jp/ja-index.md @@ -0,0 +1,45 @@ +--- +uid: onboarding-te3 +title: Welcome +author: Daniel Otykier +--- +# Welcome + +
+ +**Thank you for choosing Tabular Editor 3!** + +To help you get the most out of the tool, we have collected all of our onboarding material in this onboarding guide, that we hope you will enjoy. We recommend all new users of Tabular Editor 3 to read through this guide, skipping any topics that they are already familiar with. + +> [!NOTE] +> Some articles in this guide reference Tabular Editor 2, specifically the Command-Line Interface (CLI), for purposes of automated deployment and testing. A standalone CLI application to accompany Tabular Editor 3 is planned for release at a later time. + +As this training material is focused on the Tabular Editor product, we assume that you already have a basic understanding of tabular data modeling (using either Power BI Desktop, Visual Studio or Tabular Editor 2.x). If you are new to tabular data modeling, we highly recommend looking into some of the training material and courses offered by third parties such as [sqlbi.com](https://sqlbi.com). + +**Topics covered in this guide:** + +- @general-introduction + - @installation-activation-basic + - @migrate-from-vs + - @migrate-from-desktop + - @migrate-from-te2 +- @parallel-development + - @optimizing-workflow-workspace-mode + - @powerbi-cicd + - @as-cicd +- @boosting-productivity-te3 + - @importing-tables-data-modeling + - @refresh-preview-query + - @creating-and-testing-dax + - @dax-script-introduction + - @bpa + - @cs-scripts-and-macros + - @personalizing-te3 + +**Additional resources:** + +- [TE3 reference docs](xref:getting-started) +- @downloads +- [Dedicated support (Enterprise Edition customers only)](mailto:support@tabulareditor.com) +- [Community support](https://github.com/TabularEditor/TabularEditor3/issues) +- [Community discussions](https://github.com/TabularEditor/TabularEditor3/discussions) \ No newline at end of file diff --git a/onboarding/ja-jp/ja-installation.md b/onboarding/ja-jp/ja-installation.md new file mode 100644 index 0000000..36201ec --- /dev/null +++ b/onboarding/ja-jp/ja-installation.md @@ -0,0 +1,75 @@ +--- +uid: installation-activation-basic +title: Installation, activation and basic configuration +author: Daniel Otykier +updated: 2021-09-30 +--- + +## Installation + +In order to install Tabular Editor 3, download the latest version from our [downloads page](xref:downloads). + +We recommend downloading the MSI 64-bit installer, which is suitable in most scenarios. Once downloaded, doubleclick the MSI file and go through the installation pages. + +![Install](~/images/install.png) + +## Activating your installation + +The first time you launch Tabular Editor 3 on a new machine, you are prompted to activate the product. + +![Product activation](~/images/product-activation.png) + +### Activating using an existing license key + +Once you purchase a license for Tabular Editor 3, you should receive an e-mail with a 25-character string which is your license key. When prompted, enter the license key and hit "Next >" to activate the product. + +![Enter License Key](~/images/enter-license-key.png) + +> [!NOTE] +> For multi-user license types, you will need to enter your e-mail address in addition to the license key. Tabular Editor 3 will prompt you to do so, if the license key you enter represents a multi-user license. + +### Changing a license key + +When Tabular Editor 3 is activated, you may change your license key in the Help menu by choosing "About Tabular Editor". + +![About Te3](~/images/about-te3.png) + +In the dialog, select "Change license key". Note that this option is only available if no model is loaded in Tabular Editor. IF you already loaded a model you can close it under File > Close model. + +For more details on managing the license keys, see [Registry details](xref:getting-started#registry-details). + +## Basic configuration + +After Tabular Editor 3 is activated, we recommend spending a few minutes familiarizing yourself with the [basic interface](xref:user-interface). In addition, Tabular Editor 3 provides many different configuration options. The default settings are sufficient for most development scenarios, but there are a few important configuration options that you should always review. + +### Check for updates on start-up + +By default, whenever Tabular Editor 3 is launched, the tool will check online to see if a newer version is available. You can control how this update check is performed under **Tools > Preferences > Updates and Feedback**. + +> [!NOTE] +> We recommend always using the latest version of Tabular Editor 3. Our support team will generally assume that you are always using the latest version before submitting a bug report. + +### Opting out of telemetry collection + +Tabular Editor 3 collects anonymous usage data and telemetry, which helps us improve the product. You can opt out at any time by launching Tabular Editor 3 and navigating to **Tools > Preferences > Updates and Feedback**. Uncheck the **Help improve Tabular Editor by collecting anonymous usage data** checkbox to opt out. + +![Collect Telemetry](~/images/collect-telemetry.png) + +### Proxy settings + +If you are on a network with limited Internet connectivity, you can specify the address, username and password of a proxy server under **Tools > Preferences > Proxy Settings**. This is required before Tabular Editor 3 can use any features that rely on outgoing web requests. Specifically, these are: + +- Update checks +- Product activation +- DAX Formatting +- Download of Best Practice Rules from external URLs + +### Other preferences + +In addition to the settings mentioned above, Tabular Editor 3 contains many other settings for controlling various application behavior, allowing you to closely tailor the tool to your needs. To learn more about other these settings, see @preferences. + +## Next steps + +- @migrate-from-vs +- @migrate-from-desktop +- @migrate-from-te2 \ No newline at end of file diff --git a/onboarding/ja-jp/ja-migrate-from-desktop.md b/onboarding/ja-jp/ja-migrate-from-desktop.md new file mode 100644 index 0000000..188881e --- /dev/null +++ b/onboarding/ja-jp/ja-migrate-from-desktop.md @@ -0,0 +1,236 @@ +--- +uid: migrate-from-desktop +title: Migrating from Power BI Desktop +author: Daniel Otykier +updated: 2021-09-30 +--- + +# Migrating from Power BI Desktop + +If you are already familiar with data modeling concepts in Power BI Desktop, this article is intended to help you migrate your data modeling over to Tabular Editor. Thus, we assume you have a solid understanding of concepts such as the Power Query Editor, imported vs. calculated tables, calculated columns, measures, etc. + +## Power BI and Tabular Editor + +Historically, Tabular Editor was designed as a tool for SQL Server Analysis Services (Tabular) and Azure Analysis Services developer. When Power BI first launched, there was no supported way for third party tools to access the Analysis Services instance hosting the Power BI data model, and so the only way to create and edit a Power BI dataset, was through Power BI Desktop. + +This changed in March 2020, when [Microsoft announced the read/write XMLA endpoint in Power BI Premium](https://powerbi.microsoft.com/en-us/blog/announcing-read-write-xmla-endpoints-in-power-bi-premium-public-preview/). A few months later, it even became possible to use third party tools in conjunction with Power BI Desktop, with the [announcement of the External Tools feature](https://powerbi.microsoft.com/en-us/blog/announcing-public-preview-of-external-tools-in-power-bi-desktop/). + +The availability of the XMLA endpoint in Power BI Premium allows data model developers to leverage their existing skills and tools, and it is not a secret that Microsoft is investing heavily in making [Power BI Premium a superset of Analysis Services](https://community.powerbi.com/t5/Webinars-and-Video-Gallery/Power-BI-Premium-as-a-superset-of-Analysis-Services-the-XMLA/m-p/1434121). In other words, the integration of third party tools, community as well as commercial, with Power BI is something that is here to stay. In fact, Amir Netz, CTO of Microsoft Analytics, made a [joint statement](https://powerbi.microsoft.com/en-us/blog/community-tools-for-enterprise-powerbi-and-analysisservices/) with Marco Russo, founder of SQLBI, to affirm this point. + +Here at Tabular Editor ApS, we firmly believe that Tabular Editor 3 is the best tabular data modeling tool available right now, and thanks to the integrations mentioned above, the tool is no longer reserved for SQL Server or Azure Analysis Services developers. + +Before proceeding, it is important to understand that Tabular Editor can be used in conjunction with Power BI in two very different scenarios: + +- **Scenario 1:** Tabular Editor as an External Tool for Power BI Desktop. +- **Scenario 2:** Tabular Editor with the Power BI Premium XMLA Endpoint. + +> [!IMPORTANT] +> You cannot use Tabular Editor to directly load a .pbix file. For more information, see . + +### Scenario 1: Tabular Editor as an External Tool for Power BI Desktop + +Generally, this scenario is intended for self-service analysts and Power BI Desktop users without access to Power BI Premium, to make certain data modeling operations easier (for example, adding and editing measures), and to unlock advanced modeling options not otherwise available (calculation groups, perspectives and metadata translations). + +External tools connect to the Analysis Services model hosted by Power BI Desktop. This allows the tool to make certain changes to the data model. Currently, however, not all types of data modeling operations are supported by Power BI Desktop. It is important to understand this limitation and how Tabular Editor behaves when used as an external tool for Power BI Desktop. See for more information about this. + +The typical workflow in this scenario, is the following: + +1. Open a .pbit or .pbix file in Power BI Desktop +2. Launch Tabular Editor through the External Tools ribbon +3. Switch back and forth between Tabular Editor and Power BI Desktop, depending on what type of change you need to make. For example, you can add and edit measures through Tabular Editor, but you must use Power BI Desktop if you need to add a new table to the model. +4. Whenever you make a change in Tabular Editor, use **File > Save** (CTRL+S) to write the changes back to Power BI Desktop. +5. When you are done making changes, close Tabular Editor. Then, publish or save the report as usual from within Power BI Desktop. + +> [!NOTE] +> As of October 2021, there is a bug in Power BI Desktop that sometimes prevents Desktop from automatically refreshing the field list and visuals to reflect changes made through external tools. When this happens, saving the .pbix file and reopening it, or manually refreshing a table within the model, usually causes the field list and all visuals to update correctly. + +The [modeling limitations](xref:desktop-limitations) that apply to External Tools are only relevant regarding write operations/model modifications. You can still use Tabular Editor 3's connected features to browse the data within the model through table data previews, Pivot Grids or DAX queries, as described later in this guide. + +### Scenario 2: Tabular Editor with the Power BI Premium XMLA Endpoint + +This scenario is for BI professionals in organizations that use Power BI Premium Capacity or Power BI Premium-Per-User workspaces, who intend to replace Power BI Desktop altogether for purposes of dataset development. + +Essentially, the Power BI Premium XMLA Endpoint exposes an instance of Analysis Services (Tabular). In this scenario, Tabular Editor behaves no different than it would when connected to Azure Analysis Services or SQL Server Analysis Services (Tabular). + +The typical workflow in this scenario, is the following: + +1. When first migrating to Tabular Editor, use the XMLA endpoint to open a Power BI dataset in Tabular Editor, then save the model metadata as a file (Model.bim) or folder (Database.json). See @parallel-development for more information. +2. Going forward, open the model metadata in Tabular Editor from the file or folder you saved in step 1. Optionally use [workspace mode](xref:workspace-mode). +3. Apply changes using Tabular Editor. +4. If using workspace mode, changes should be immediately visible in the Power BI service every time you hit Save (CTRL+S) in Tabular Editor. +5. If not using workspace mode or when done making changes, use Tabular Editor's **Model > Deploy...** option to publish the changes to the Power BI service. + +As the model metadata "source of truth" in this scenario, is the file or folder structure stored on disk, this scenario not only enables parallel development with version control integration, but also continuous integration/continuous deployment (CI/CD) using an automated build server such as Azure DevOps. See for more information. + +> [!WARNING] +> As soon as you apply changes to a Power BI dataset through the Power BI service XMLA endpoint, that dataset can no longer be downloaded as a .pbix file. See [Dataset connectivity with the XMLA endpoint](https://docs.microsoft.com/en-us/power-bi/admin/service-premium-connect-tools#power-bi-desktop-authored-datasets) for more information. + +When using Tabular Editor to connect to the dataset through the XMLA endpoint, there are no limitations to the types of write operations/model modifications that can be made. + +The remainder of this article focuses on differences between Power BI Desktop and Tabular Editor for data model development. Some sections only apply to scenario 2, due to the [modeling limitations](xref:desktop-limitations) that apply when using Tabular Editor as an external tool for Power BI Desktop (scenario 1). + +## Tabular Editor 3 user interface + +If you are new to Tabular Editor, we recommend reading through the following resources to understand Tabular Editor 3's user interface: + +- [Getting to know Tabular Editor 3's User Interface](xref:user-interface) +- [TOM Explorer view](xref:tom-explorer-view) +- [Properties view](xref:properties-view) +- [DAX editor](xref:dax-editor) + +## Tabular Editor 3 how-tos + +What follows is a quick walkthrough of how to achieve common tasks in Tabular Editor 3. + +### How to add a measure + +To add a new measure to your model, right-click on the table in the **TOM Explorer** on which you want the new measure to reside, then choose **Create > Measure** (shortcut ALT+1). After the measure is added, you can immediately type the name of the measure. + +![Add Measure](~/images/add-measure.png) + +### How to rename a measure + +If you need to edit the name of the measure (or any other object), simply select the measure and hit F2 (or double-click the measure name). If multiple objects are selected, you will see the Batch rename dialog, that makes it easy to rename multiple objects in one go. + +![Batch Rename](~/images/batch-rename.png) + +> [!WARNING] +> Changing object names in the data model may cause report visuals to stop working, if the visuals relies on one or more of the objects being renamed. External tools cannot access information about Power BI visuals, so Tabular Editor is not able to warn you before an object that is used in a visual is renamed or deleted. + +### How to create a copy of a measure + +In Tabular Editor 3, you can use the familiar Cut (CTRL+X), Copy (CTRL+C) and Paste (CTRL+V) operations to quickly move around and make copies of objects. You can also drag objects between tables and display folders using the **TOM Explorer**. If you make a mistake along the way, you can use the Undo (CTRL+Z) and Redo (CTRL+Y) options (repeatedly) to navigate back and forth through the history of changes applied. + +### How to modify the DAX expression of a measure + +Locate the measure you want to modify in the **TOM Explorer** and select it. You can toggle the display of hidden objects (CTRL+6) and display folders (CTRL+5) using the toolbar buttons near the top of the TOM Explorer. You may also type the partial name of the measure in the search box, to filter the **TOM explorer**. + +Once the measure is selected, you should see the DAX expression of the measure in the **Expression Editor** and various properties such as `Description`, `Format String`, `Hidden`, etc. in the **Properties** grid. + +![Modify Measure](~/images/modify-measure.png) + +To modify the DAX expression, simply place the cursor in the **Expression Editor** and update the DAX code. Hit F6 to automatically format the code. If you select a different object in the TOM Explorer or click the green checkmark button **Expression > Accept** (F5), the expression change is stored locally in Tabular Editor. You can also cancel the modification you made by hitting the red "X", **Expression > Cancel**. If you accidentally hit **Accept**, you can always undo the change by using the **Edit > Undo** (CTRL+Z) option. + +To save your changes back to Power BI Desktop, the Power BI XMLA endpoint, or the file on disk from which the model was loaded, hit **File > Save** (CTRL+S). + +To learn more about the capabilities of the Expression Editor, when writing DAX code, see . + +### How to visualize dependencies between measures + +While a measure is selected in the **TOM Explorer** use the **Measure > Show dependencies** (SHIFT+F12) option. This causes a new window to pop up, visualizing the dependency tree of the DAX expression for that measure. You can switch between viewing both upstream and downstream dependencies. + +![Show Dependencies](~/images/show-dependencies.png) + +Double-clicking on an item in the dependencies view navigate to that object in the **TOM Explorer**. + +### How to change the format string of a measure + +Locate the measure you want to modify in the **TOM Explorer** and select it. You can toggle the display of hidden objects (CTRL+6) and display folders (CTRL+5) using the toolbar buttons near the top of the TOM Explorer. You may also type the partial name of the measure in the search box, to filter the **TOM explorer**. + +Once the measure is selected, locate the `Format String` property in the **Properties** grid, expand it, and set the format string properties according to your preferences. Note the dropdown button at the right of the `Format` property. You may also freely enter a format string in the `Format String` property itself. + +![Format String](~/images/format-string.png) + +### How to modify the DAX expression of multiple measures + +Tabular Editor 3 allows you to select multiple measures in order to create a **DAX Script**, which lets you modify the DAX expression and various properties of all selected measures at once. + +To create a DAX script based on existing measures, simply select the measures in the **TOM Explorer** (hold down the CTLR key to select multiple objects or hold down the SHIFT key to select a range of objects). Then, right click and hit **Script DAX**. + +![Script Dax](~/images/script-dax.png) + +You can add or modify properties such as `Description`, `FormatString`, `Visible`, `DetailRows` and more directly in the script. + +Hit F5 to apply the script to the data model. Note that unlike the **Expression Editor**, navigating to a different object will not automatically apply any changes made to the script. You can still use the **Edit > Undo** (CTRL+Z) option to roll back any changes applied by a DAX script. + +See @dax-script-introduction for more information. + +### How to preview data in a table + +To view the contents of a table (similar to the Data Tab in Power BI Desktop), simply right-click on a table and choose "Preview data". This will open a new tab containing a preview of the table content. You can scroll through all rows of the table, as well as apply sorting or filtering to columns. Unlike Power BI Desktop, you can open as many of these preview tabs as you like and arrange them next to each other in the user interface. The preview also works for tables in [DirectQuery mode](https://docs.microsoft.com/en-us/power-bi/connect-data/desktop-use-directquery) (although the preview will be limited to the first 100 records). + +![Preview Data](~/images/preview-data.png) + +> [!NOTE] +> The **Preview data** feature is only available when Tabular Editor is connected to Power BI Desktop or a dataset in the Power BI XMLA endpoint. + +See @refresh-preview-query for more information. + +### How to add a calculation group + +[Calculation Groups](https://docs.microsoft.com/en-us/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions) are useful for defining and reusing a modified DAX filter context or other type of business logic across all model measures. To add a calculation group using Tabular Editor, simply use the **Model > New Calculation Group** (ALT+7) option. + +![Add Calculation Group](~/images/add-calc-group.png) + +Give the calculation group a name, then, while the Calculation Group is selected in the **TOM Explorer**, add new Calculation Items by using the **Calculation Group Table > Create > Calculation Item** option. You can copy (CTRL+C) and paste (CTRL+V) calculation items to speed up this process for additional items. + +![Add Calc Item](../images/add-calc-item.png) + +### How to add a new table + +To add a new table to a model, use the **Model > Import tables...** option. Tabular Editor's [Import Table Wizard](xref:importing-tables) will guide you through the process. + +> [!NOTE] +> Tabular Editor 3 does not support every data source otherwise supported by Power BI. If your model uses a data source not supported by Tabular Editor, the easiest way to import a new table from the same source is to copy an existing table in Tabular Editor (CTRL+C / CTRL+V), and then modify the partition expression and update the table schema as shown below. For this to work, make sure that the **Tools > Preferences > Schema Compare > Use Analysis Services for change detection** option is enabled. See for more information. + +> [!IMPORTANT] +> This option is not available by default when using Tabular Editor as an external tool, since adding/editing tables through external tools is [not supported by Power BI Desktop](xref:desktop-limitations). + +See @importing-tables-data-modeling for more information. + +### How to modify a Power Query expression on a table + +Power Query (M) expressions that define what is loaded into each table reside in the corresponding table's **Partition**. The partitions can be located in the **TOM Explorer**. When selecting a partition, Tabular Editor displays the M expression for that partition in the **Expression Editor**, allowing you to edit it. After editing and accepting the expression change, you can right-click on the partition in the **TOM Explorer** and choose the **Update table schema...** option in order to detect if the columns imported on the table should be changed, based on the updated Power Query expression. + +![Power Query Update Schema](~/images/power-query-update-schema.png) + +> [!NOTE] +> Currently, Tabular Editor 3 does not perform any validation of the partition expression. For Power Query (M) expressions, this is planned for a later update of Tabular Editor 3. + +> [!IMPORTANT] +> Partition expressions are read-only by default when using Tabular Editor as an external tool, since editing partitions through external tools is [not supported by Power BI Desktop](xref:desktop-limitations). + +If the Power Query expression changes gives rise to any changes on the imported table columns, a dialog that lets you review these changes will show: + +![Apply schema changes](~/images/combine-sourcecolumn-update.png) + +### How to modify a shared Power Query expression + +Shared Expressions are M queries that are not directly used to load data into a table. For example, when you create a Power Query parameter in Power BI Desktop, the M expression for this parameter is stored as a Shared Expression. In Tabular Editor, These can be accessed through the Shared Expressions folder of the **TOM Explorer** and edited just like M queries on partitions. + +![Shared Expression](~/images/shared-expression.png) + +> [!IMPORTANT] +> Shared expressions are read-only by default when using Tabular Editor as an external tool, since editing partitions through external tools is [not supported by Power BI Desktop](xref:desktop-limitations). + +### How to add relationships between tables + +The easiest way to add relationships between two tables is to create a new diagram, add the two tables to the diagram, and then visually dragging a column from one table to another, to indicate the columns that should participate in the relationship. This is similar to how you would create a relationship in Power BI Desktop. + +1. To create a new diagram use the **File > New > Diagram** option. +2. To add tables to the diagram, either drag and drop the tables from the **TOM Explorer** or use the **Diagram > Add tables...** option. +3. Once the tables are added, locate the column on the (many-side) fact table, and drag it over to the corresponding column on the (one-side) dimension table. +4. Confirm the relationship settings and hit "OK". + +![Shared Expression](~/images/create-relationship-through-diagram.gif) + +See [Working with diagrams](xref:importing-tables-data-modeling#working-with-diagrams) for more information. + +> [!IMPORTANT] +> Relationships cannot be modified when using Tabular Editor as an external tool, since editing relationships through external tools is [not supported by Power BI Desktop](xref:desktop-limitations). + +### How to publish to the Power BI Service + +To publish or update a dataset in the Power BI Service, use the **Model > Deploy...** option and use the XMLA endpoint of the workspace, in which you want to publish the dataset. + +If you loaded the model metadata directly from the XMLA Endpoint, you only need to hit **File > Save** (CTRL+S), to update the dataset that was loaded in Tabular Editor. + +> [!NOTE] +> The **Model > Deploy...** option is **not** available in Tabular Editor 3 Desktop Edition, as this edition is only intended to be used as an External Tool for Power BI Desktop. [More information](xref:editions). + +## Next steps + +- +- @parallel-development +- @boosting-productivity-te3 +- \ No newline at end of file diff --git a/onboarding/ja-jp/ja-migrate-from-te2.md b/onboarding/ja-jp/ja-migrate-from-te2.md new file mode 100644 index 0000000..400a01d --- /dev/null +++ b/onboarding/ja-jp/ja-migrate-from-te2.md @@ -0,0 +1,130 @@ +# Tabular Editor 2.xからの移行 + +この記事は、Power BI DatasetまたはAnalysis Services Tabular開発でTabular Editor 2.xの使用経験がある開発者を対象としています。この記事では、Tabular Editor 3の類似点と重要な機能追加をハイライトし、迅速にスピードアップできるようにします。 + +## インストールのサイドバイサイド + +Tabular Editor 3はTabular Editor 2.xと異なる製品コードを持っています。これは、両方のツールを問題なく並べてインストールできることを意味します。実際、両ツールは別々のプログラムフォルダーにインストールされ、その設定も別々のフォルダーに保存されます。つまり、Tabular Editor 2.xとTabular Editor 3間の「アップグレード」「ダウングレード」という言葉は当てはまりません。Tabular Editor 3はまったく別の製品であると考えた方がよいでしょう。 + +## 機能比較 + +機能面では、Tabular Editor 3はいくつかの例外を除き、基本的にTabular Editor 2.xのスーパーセットです。下の表は2つのツールのすべての主要機能を比較したものです。 + +||Tabular Editor 2.x|Tabular Editor 3| +|---|---|---| +|すべてのTOMオブジェクトとプロパティを編集する||| +|一括編集とリネーム||| +|コピー&ペースト、ドラッグ&ドロップに対応||| +|データモデリング操作のアンドゥ/リドゥ||| +|モデルメタデータのディスクへのロード/セーブ||*| +|フォルダに保存||*| +|[daxformatter.com](https://daxformatter.com) integration||| +|高度なデータモデリング(OLS、Perspectives、Calculation Groups、Metadata Translations、など)||*| +|シンタックスハイライトと数式の自動修正||| +|オブジェクト間のDAX依存関係を表示||| +|テーブルのインポートウィザード||| +|デプロイメントウィザード||*| +|ベストプラクティス・アナライザー||| +|C#スクリプトと自動化||| +|Power BI Desktopの外部ツールとしての利用||| +|SSAS/Azure AS/Power BI Premiumに接続する。||*| +|コマンドラインインターフェース||*[Coming soon](xref:roadmap)*| +|高DPI、マルチモニター、テーマ設定に対応したカスタマイズ可能なプレミアム・ユーザー・インターフェイス||| +|IntelliSenseTM ライクな機能を備えたワールドクラスのDAXエディター||| +|オフラインでのDAX構文チェックとカラム/データ型推論||| +|テーブルインポートウィザードとテーブルスキーマの更新チェックを改良し、Power Queryに対応しました。||| +|DAXクエリ、テーブルプレビュー、ピボットグリッド||| +|テーブルの関係を視覚化し、編集するためのダイアグラムを作成||| +|バックグラウンドでのデータリフレッシュ操作の実行||*| +|C#マクロレコーダー||| +|DAXスクリプトを使用して、1つのドキュメントで複数のDAX式を編集する。||| +|[VertiPaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer/)の統合。||| + +**Note:** Tabular Editor 3のどの[エディション](xref:editions)を使用しているかによって制限があります。 + +## 機能の違い + +以下は、重要な機能の違いの概要です。 + +### ユーザーインターフェイス + +Tabular Editor 3を起動して最初に気づくのは、新しいVisual Studio Shellのようなインターフェイスでしょう。このインターフェイスは完全にカスタマイズ可能で、高DPI、マルチモニターをサポートし、テーマの変更も可能です。すべてのインターフェイス要素は別の場所に移動できますので、もしTabular Editor 2.xのインターフェイスレイアウトがお好みでしたら、すぐに**Window**メニューから**Classic layout**を選択してください。 + +しかし、一般的にTabular Editor 2.xに存在するインターフェイス要素はTabular Editor 3でも同じ名前なので、新しいインターフェイスをナビゲートするのは比較的簡単でしょう。いくつかの重要な違いを以下に挙げます。 + +- Tabular Editor 2.xの**Advanced Scripting**タブはなくなりました。Tabular Editor 3では、代わりに**File > New**メニューを使用して*C# Scripts**を作成します。一度に1つのスクリプトで作業できるように制限されていません。また、**Custom Action** は **Macros** に名称が変更されました。 +- **ダイナミックLINQフィルタリング** は、現在TOM Explorer内では使用できません。代わりに、[Dynamic LINQ](https://dynamic-linq.net/expression-language) を使用してオブジェクトを検索する場合は、CTRL+Fキーを押して**検索と置換**ダイアログを表示させる必要があります。 +- **Expression Editor**を閉じた場合は、**TOM Explorer** 内のオブジェクトのアイコンをダブルクリックするか、**View > Expression Editor** メニューオプションを選択することで、元に戻すことができます。 +- Tabular Editor 3のデフォルトレイアウトを使用している場合、**Best Practice Analyzer**は**TOM Explorer**の隣にタブとして配置されます。ここでは、新しい**Data Refresh**ビュー(バックグラウンド更新操作のキューを表示可能)と**Macros**ビュー(以前にC#スクリプトから保存したマクロを管理可能)も表示されます。 +- Tabular Editor 3は新しい**Messages View**にすべてのDAXシンタックスとセマンティックエラーを表示します。デフォルトのレイアウトでは、これはインターフェイスの左下に配置されています。 +- さらに、Tabular Editor 3には**VertiPaq Analyzer**([DAX Studio](https://daxstudio.org/)でお馴染みのもの)が含まれています。 +- 最後に、Tabular Editor 3は**ドキュメント**という概念を導入しており、これはC#スクリプト、DAXスクリプト、DAXクエリー、ダイアグラム、データプレビュー、ピボットグリッドの単なる総称に過ぎません。 + +詳細は、を参照してください。 + +### 新しい DAX エディターとセマンティック機能 + +Tabular Editor 3は独自のDAX解析エンジン(別名「セマンティックアナライザー」)を備えており、モデル内のあらゆるDAXコードのセマンティクスを理解することができるようになったことを意味します。このエンジンは、DAXエディター(コードネーム「Daxscilla」)にも使用されており、構文の強調表示、自動フォーマット、コード補完、コールチップ、リファクタリングなどの機能を実現しています。もちろん、このエディターは高度に設定可能であり、好みのDAXコーディングスタイルに合わせて微調整できます。 + +新しいDAXエディターの詳細については、 を参照してください。 + +さらに、セマンティック アナライザーは、モデル内のすべてのオブジェクトでDAX構文またはセマンティック エラーを継続的に報告します。これは、Analysis Servicesに接続されていない場合でも動作し、非常に高速です。セマンティックアナライザーはまた、Tabular Editor 3がDAX式からデータ型を自動的に推論することを可能にしました。言い換えれば、Tabular Editor 3は計算されたテーブル式からどのカラムが得られるかを自動的に検出するのです。これは、計算テーブルのカラムを手動でマッピングするか、カラムのメタデータを返すためにAnalysis Services依存しなければならなかったTabular Editor 2.xに比べて大きな改善点です。 + +### Power Queryをサポートするテーブルインポートとスキーマアップデート + +Tabular Editor 2.xに対するTabular Editor 3のもう1つの大きな利点は、構造化データソースとPower Query(M)パーティションをサポートすることです。具体的には、「スキーマアップデート」機能がこれらのタイプのデータソースやパーティションに対して機能するようになり、テーブルインポートウィザードでは新しいテーブルをインポートする際に必要なMコードを生成することができるようになったのです。 + +スキーマ比較ダイアログ自体にも多くの改良が加えられており、たとえば、列削除+列挿入の操作を単一列の名前変更操作に簡単にマッピングできます(逆も同様)。また、浮動小数点データ型と小数点のデータ型をどのように扱うかを制御するオプションもあります(たとえば、データソースが浮動小数点データ型を使っていても、常に小数点のデータ型としてインポートしたい場合があります)。 + +詳しくは、を参照してください。 + +### ワークスペース・モード + +このモードではモデルのメタデータはディスク(Model.bimまたはDatabase.json)から読み込まれ、選択したAnalysis Servicesインスタンスにデプロイされます。保存(CTRL+S)を押すたびに、ワークスペース・データベースが同期され、更新されたモデル・メタデータがディスクに保存し直されます。この方法の利点は、Tabular EditorがAnalysis Servicesに接続されているため、以下の[接続された機能](#connected-features)が利用でき、またディスク上のソースファイルを簡単に更新することができる点です。Tabular Editor 2.xでは、データベースからモデルを開き、たまに手動でディスクに保存することを忘れないようにしなければなりませんでした。 + +このアプローチは[並行開発](xref:parallel-development)やバージョン管理システムとのモデルメタデータの統合を可能にするために理想的なものです。 + +詳しくはを参照してください。 + +### 接続された機能 + +Tabular Editor 3には新しい接続機能が多数含まれており、Analysis Servicesのクライアントツールとして使用することができます。これらの機能は、Tabular Editor 3が直接または[ワークスペース・モード](#workspace-mode)機能を使用してAnalysis Servicesに接続されたときに有効になります。 + +新たに接続された機能は以下の通りです。 + +- テーブルデータのプレビュー +- ピボットグリッド +- DAXクエリ +- データリフレッシュ操作 +- VertiPaq Analyzer + +### ダイアグラム + +Tabular Editor 2.xで要望の多かった機能の1つは、テーブル間のリレーションシップをより良く可視化することでした。Tabular Editor 3 では、モデル図を作成できるようになりました。各ダイアグラムは、ダイアグラムに含まれるテーブルの名前と座標を保持するシンプルなJSONファイルです。そして、Tabular Editor 3はテーブルとリレーションシップをレンダリングし、リレーションシップの編集や既存のリレーションシップに基づくテーブルの追加などを簡単に行う機能を提供します。 + +![関連するテーブルを簡単に追加する](../../images/diagram-menu.png) + +詳しくは、[ダイアグラムを使った作業](xref:importing-tables-data-modeling#working-with-diagrams)を参照してください。 + +### C# スクリプトとマクロレコーダー + +Tabular Editor 2.xの**Advanced Scripting**機能は、**C# Scripts**としてTabular Editor 3に引き継がれました。Tabular Editor 3での重要な違いの1つは、1つのスクリプトでの作業に制限されなくなったことです。その代わり、**File > New > C# Script** オプションを使用すると、必要な数のC#スクリプトを作成し、作業できます。Tabular Editor 2.xと同様に、これらのスクリプトは再利用可能なアクションとして保存でき、TOM Explorerの右クリックのコンテキストメニューに直接統合されます。Tabular Editor 3ではこれらのアクションを **Macros** と呼び、マクロを追加できる独自のメニューやツールバーを作成することも可能です。 + +もっとも重要なのは、Tabular Editor 3には**マクロレコーダー**があり、ユーザーのインタラクションからC#コードを自動的に生成するために使用することができることです。 + +> [!注意]。 +> この記事の執筆時点では、Tabular Editor 3のC#スクリプトエディターにはIntelliSenseのような機能は含まれていません。これは後日リリースされる予定です。 + +詳しくは@cs-scripts-and-macrosを参照してください。 + +### DAX スクリプト + +Tabular Editor 2.xから来た人が知っておくべき最後の重要な機能は**DAX Scripting**です。この機能により、複数の計算オブジェクトのDAX式と基本プロパティを一度に編集できるドキュメントを作成できます。計算オブジェクトとは、メジャー、計算カラム、計算テーブルなどです。 + +これは、複数のオブジェクトにまたがる複雑なビジネスロジックをオーサリングする際に非常に便利です。TOM Explorerでオブジェクトを(複数)選択し、右クリックして**Script DAX**オプションを選択すると、選択されたすべてのオブジェクトの定義を含む新しいDAXスクリプトが得られます。DAXスクリプトエディターは、エクスプレッションエディターやDAXクエリエディターと同じDAX機能をもちろん持っています。 + +DAXスクリプトは、**コネクテッド**モードまたは**ワークスペース**モードで作業する場合、更新されたビジネスロジックをすばやく修正およびテストするための非常に強力なツールです(たとえば、下のスクリーンショットに示すようにピボットグリッドと組み合わせて使用する場合など)。SHIFT+F5を押すだけで、スクリプト内のDAX式に基づいてデータベースが更新され、その後、ピボット・グリッドが即座に更新されます。 + +![Dax Scripting And Pivot](../../images/dax-scripting-and-pivot.png) + +詳しくは、@dax-script-introductionをご覧ください。 diff --git a/onboarding/ja-jp/ja-migrate-from-vs.md b/onboarding/ja-jp/ja-migrate-from-vs.md new file mode 100644 index 0000000..64e49a0 --- /dev/null +++ b/onboarding/ja-jp/ja-migrate-from-vs.md @@ -0,0 +1,209 @@ +--- +uid: migrate-from-vs +title: Migrating from Visual Studio +author: Daniel Otykier +updated: 2021-09-30 +--- + +# Migrating from Visual Studio / SQL Server Data Tools + +This article assumes that you are familiar with Tabular model development using [Analysis Services Projects for Visual Studio](https://marketplace.visualstudio.com/items?itemName=ProBITools.MicrosoftAnalysisServicesModelingProjects) (formerly known as SQL Server Data Tools). This is common among developers using SQL Server Analysis Services (Tabular) or Azure Analysis Services. + +- If you have never used Visual Studio for Tabular model development, you can safely skip this topic. +- If you previously used Tabular Editor 2.x for Tabular model development, we recommend you skip directly to the @migrate-from-te2 article. + +## Partial migration + +Tabular Editor 3 contains features that allow you to completely migrate away from Visual Studio for tabular model development. This is in contrast to Tabular Editor 2.x, where some users still preferred using Visual Studio for things like table import, visualization of relationships and preview of data. + +However, as you familiarize yourself with Tabular Editor 3, you might still find it useful to open your tabular models in Visual Studio from time to time. This is possible at any time, since Tabular Editor 3 does not modify the **Model.bim** file format (aka. the [TOM JSON](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions)) used by Visual Studio, thus ensuring compatibility with Visual Studio. + +The only exception is, if you decide to use Tabular Editor's [Save-to-folder](xref:parallel-development#what-is-save-to-folder) feature, as this file format is not supported by Visual Studio. However, you can easily recreate a Model.bim file for use with Visual Studio, using the **File > Save As...** option in Tabular Editor. The opposite conversion can also be performed by loading a Model.bim file in Tabular Editor and then using the **File > Save to Folder...** option. + +### Automating file format conversion + +If you often face the need to convert back and forth between Tabular Editor's (database.json) folder-based format and Visual Studio's (model.bim) file format, consider writing a small Windows command script using [Tabular Editor 2.x CLI](xref:command-line-options) to automate the conversion process. + +# [Model.bim to folder](#tab/frombim) + +To convert from model.bim to database.json (folder-based format): +```cmd +tabulareditor.exe model.bim -F database.json +``` + +# [Folder to model.bim](#tab/fromfolder) + +To convert from database.json (folder-based format) to model.bim: +```cmd +tabulareditor.exe database.json -B model.bim +``` + +*** + +> [!NOTE] +> The command line script above assumes you have [Tabular Editor 2.x](xref:getting-started-te2) installed. The installation location of Tabular Editor 2.x should also be specified as part of your [PATH environment variable](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/path). + +## Integrated Workspace server + +When starting a new Analysis Services (Tabular) project in Visual Studio, you are prompted to choose if you want to use Visual Studio's Integrated workspace server or provide your own instance of Analysis Services. In addition, you must decide the compatibility level of the tabular model (see screenshot below). + +![VS New Project](~/images/vs-new-project.png) + +In contrast, when creating a new model in Tabular Editor, using a workspace server is completely optional (but recommended - see [workspace mode](xref:workspace-mode)). + +Below is the dialog box shown when creating a new model in Tabular Editor 3: + +![New model dialog](~/images/new-model.png) + +If you enable the **Use workspace database** option, Tabular Editor will prompt you for an Analysis Services instance and database name that will be used as as workspace database while working on the model. If you do not enable this option, you will be able to create and work on your model in "offline" mode, which still allows you to add tables, relationships, author DAX expressions, etc. However, you will have to deploy your offline model to an instance of Analysis Services before you can refresh, preview and query the data in the model. + +> [!IMPORTANT] +> Tabular Editor 3 does not provide a feature equivalent to the **Integrated workspace** option of Visual Studio. Essentially, the integrated workspace is an Analysis Services instance managed by Visual Studio. Since Analysis Services is proprietary software from Microsoft, we cannot ship it alongside Tabular Editor 3. Instead, if you would like to run a local instance of Analysis Services for use with Tabular Editor, we recommend that you install [SQL Server Developer Edition](https://www.microsoft.com/en-us/sql-server/sql-server-downloads). + +### Compatibility level requirements + +Tabular Editor lets you choose the following compatibility levels for creating Analysis Services databases: + +- 1200 (Azure Analysis Services / SQL Server 2016+) +- 1400 (Azure Analysis Services / SQL Server 2017+) +- 1500 (Azure Analysis Services / SQL Server 2019+) + +In addition, Tabular Editor lets you choose compatibility levels suitable for Power BI datasets that will be deployed to the Power BI service through the [XMLA endpoint](xref:powerbi-xmla). + +> [!NOTE] +> Tabular Editor does not support compatibility levels below 1200, as these do not use the [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) metadata format. If you plan on migrating development from Visual Studio to Tabular Editor for a model in compatibility level 1100 or 1103, **you must upgrade the compatibility level to at least 1200** before migrating to Tabular Editor. By doing so, you will no longer be able to deploy the model to SQL Server 2014 Analysis Services. + +## Visual Studio projects + +When creating an Analysis Services (Tabular) project in Visual Studio, a number of files are created in the project folder next to the Model.bim file. These files contain project- and user-specific information which is not related to the Tabular Object Model (TOM). The screenshot below shows the files resulting from creating a new tabular project in Visual Studio. + +![VS Project File Structure](~/images/vs-file-structure.png) + +When migrating to Tabular Editor, you only need to bring the Model.bim file, as the concept of "project" does not exist here. Instead, Tabular Editor simply loads the model metadata directly from the Model.bim file. In some cases, a file called the [Tabular Model User Options (tmuo) file](xref:user-options) is created next to the Model.bim file. This file is used by Tabular Editor to store user- and model specific settings, such as whether or not to use a workspace database, (encrypted) user credentials for data sources, etc. + +To keep the "project" directory clean, we therefore recommend to copy the Model.bim file created by Visual Studio into a new directory, before loading the file in Tabular Editor. + +![Te File Structure](~/images/te-file-structure.png) + +If you want to use the [Save-to-folder](xref:parallel-development#what-is-save-to-folder) feature, which is recommended for parallel development and integration with version control systems, now is the time to save the model as a folder from within Tabular Editor (**File > Save To Folder...**). + +![Te Folder Structure](~/images/te-folder-structure.png) + +## Version control + +Tabular Editor does not have any integrated version control of model metadata. However, since all model metadata is stored as simple text (JSON) files on the disk, it is straightforward to include the tabular model metadata in any type of version control system. For this reason, most Tabular Editor users prefer to still keep Visual Studio installed, in order to have access to the [Visual Studio Team Explorer](https://docs.microsoft.com/en-us/azure/devops/user-guide/work-team-explorer?view=azure-devops) or, specifically for git, the new [Git Changes window](https://docs.microsoft.com/en-us/visualstudio/version-control/git-with-visual-studio?view=vs-2019) of Visual Studio 2019. + +> [!NOTE] +> These days, it seems that [git](https://git-scm.com/) is the preferred version control system by most developers. Git integration in Tabular Editor 3 is planned for a future update. + +Once you migrate to Tabular Editor, you do not need to keep the original Tabular model project and supporting files created by Visual Studio. You can still use the Visual Studio Team Explorer or Git Changes window to look at code changes, manage version control branches, perform code check-ins, merges, etc. + +Of course, most version control systems also have their own set of tools that you can use without relying on Visual Studio. For example, git has its command line and many popular tools that integrate directly with the Windows Explorer, such as [TortoiseGit](https://tortoisegit.org/). + +### Save-to-folder and version control + +The main advantage of using the [Save-to-folder](xref:parallel-development#what-is-save-to-folder) option, is that the model metadata is broken out into multiple small files, instead of storing everything in a large JSON document. Many properties in the TOM are arrays of objects (for example tables, measures and columns). Since all such objects have explicit names, their order in the array does not matter. Sometimes it happens that the order is changed during serialization to JSON, and this causes most version control system to indicate that a change was made to the file. However, since this ordering does not have any semantic meaning, we should not bother handling merge conflicts that may arise from this type of change. + +With Save-to-folder serialization, the number of arrays used in the JSON files are greatly reduced, as objects that would otherwise be stored as arrays, are now broken out into individual files stored within a subfolder. When Tabular Editor loads the model metadata from disk, it traverses all these subfolders to ensure all objects are deserialized correctly into the TOM. + +As such, Save-to-folder serialization greatly reduces the chance that merge conflicts are ever encountered, when two or more developers make parallel changes to the same tabular model. + +## UI differences + +This section lists the most important differences between the user interfaces of Tabular Editor 3 and Visual Studio for tabular model development. If you are an avid Visual Studio user, you should feel quite comfortable with Tabular Editor 3's user interface. If you would like a more detailed walkthrough, please see . + +### Tabular Model Explorer vs. TOM Explorer + +In Visual Studio, a hierarchical overview of the model metadata can be found in the **Tabular Model Explorer**. + +![Vs Tom Explorer](~/images/vs-tom-explorer.png) + +In Tabular Editor, this is called the **TOM Explorer** view. In Tabular Editor, all data modeling generally revolves around locating the relevant objects in the TOM Explorer and then performing certain actions by invoking the right-click context menu, by navigating to the main menu, or by editing object properties in the **Properties** view. In Tabular Editor, you can use intuitive operations such as multi-select, drag-drop, copy-paste and undo-redo for all data modeling operations. + +![Vs Tom Explorer](~/images/tom-explorer.png) + +The TOM Explorer in Tabular Editor also has shortcut options for showing/hiding certain types of objects, hidden objects, display folders, and for quickly searching and filtering the metadata hierarchy. + +See @tom-explorer-view for more information. + +### Property Grid + +Both Visual Studio and Tabular Editor include a property grid that allows you to edit most object properties of whatever object is currently selected. Below is a comparison between the Visual Studio property grid (left) and the Tabular Editor property grid (right) for the same measure: + +![Property grid in Visual Studio and Tabular Editor](~/images/property-grid-vs-te.png) + +The two generally work the same way, except that Tabular Editor uses property names that are closely aligned with the TOM object properties. Tabular Editor also adds a number of properties that are not found in the TOM, to make certain modeling operations easier. For example, by expanding the **Translated Names** property, you can compare and edit object name translations across all model cultures. + +### Editing DAX expressions + +In Visual Studio, you can use the formula bar or open a DAX editor window by right-clicking on a measure in the Tabular Model Explorer and choosing "Edit formula". + +Tabular Editor works quite similar, with the formula bar being replaced by the **Expression Editor** view. In addition, if you want to edit the DAX expressions for one or more objects in a standalone document, you can right-click on those objects (measures, calculated columns, calculated tables), and choose **Script DAX**. + +The DAX code editor in Tabular Editor 3 is one of the main reasons for using the tool. You can read more about it [here](xref:dax-editor). + +### Error List vs. Messages View + +In Visual Studio, DAX syntax errors are shown as warnings within the **Error List** (see screenshot below). In addition, measures that have errors are indicated with a warning triangle in the measures grid. + +![Vs Error List](~/images/vs-error-list.png) + +In Tabular Editor, we use the Messages View to consolidate all error, warning and informational messages posted by different sources during model development. Specifically for DAX syntax errors, these are shown as errors in the Messages View, and any measures that have an error are indicated with a red dot in the TOM Explorer (see screenshot below). + +![Te Messages](~/images/te-messages.png) + +In the screenshot above, notice how there are three different message-posting sources: + +- **Analysis Services**: When metadata changes are saved to a connected instance of Analysis Services, the server updates the TOM metadata to indicate if any objects are in an erroneous state. Specifically, the [State](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.measure.state?view=analysisservices-dotnet#Microsoft_AnalysisServices_Tabular_Measure_State) and [ErrorMessage](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.measure.errormessage?view=analysisservices-dotnet#Microsoft_AnalysisServices_Tabular_Measure_ErrorMessage) properties are updated. Tabular Editor displays these error messages in the Messages View. These messages are not shown when Tabular Editor is used offline (i.e. without a connection to Analysis Services). +- **Tabular Editor Semantic Analysis**: In addition, Tabular Editor 3 performs its own semantic analysis of all DAX expressions in the model. Any syntax or semantic errors encountered are reported here. +- **Expression Editor**: Lastly, if any documents are open in Tabular Editor 3, such as the Expression Editor, any DAX syntax or semantic errors encountered in the document are reported here. + +### Previewing table data + +In Visual Studio, tables and their content are displayed in a tabbed view once you load the Model.bim file. In Tabular Editor 3, you can preview table data by right-clicking on a table in the TOM Explorer, and chooseing **Preview Data**. This opens a new document tab that lets you scroll through all rows of the table, as well as filter and sort the columns. It even works for model using DirectQuery! + +Also, you can freely rearrange the documents, to view the content of several tables at once (see screenshot below). + +![Te3 Table Preview](~/images/te3-table-preview.png) + +### Importing tables + +To import new tables with Tabular Editor 3, use the **Model > Import tables...** option. This launches Tabular Editor 3's Import Table Wizard, which guides you through the process of connecting to a data source and selecting tables to import. The process is relatively similar to the legacy table import in Visual Studio. + +One important difference is that Tabular Editor 3 does not include a visual Power Query Editor. You can still edit Power Query (M) expressions as text, but if your model relies heavily on complex data transformation expressed as Power Query queries, you should consider to keep using Visual Studio for purposes of editing the Power Query queries. + +> [!NOTE] +> Performing complex data transformations using Power Query is generally not recommended for enterprise data modeling, due to the increased overhead of data refresh operations. Instead, prepare your data into a star schema using other ETL tools, and store the star schema data in a relational database, such as SQL Server or Azure SQL Database. Then, import tables to your tabular model from that database. + +#### Editing partitions and updating table schema + +In Tabular Editor 3, you can update the schema of a table without forcing a table refresh. Partitions are displayed in the TOM Explorer as individual objects. Click on a partition to edit its expression (M or SQL) in the Expression Editor. + +Once a partition expression has been updated, Tabular Editor can automatically detect if the table schema resulting from the updated expression, is different from the set of columns defined in the model. To perform a schema update, right-click on the partition or table in the TOM Explorer and choose **Update table schema...**. + +For more information about table import and schema updates, see @importing-tables. + +### Visualizing relationships + +Visual Studio includes a diagram tool that lets you visualize and create relationships between tables. + +Tabular Editor 3 also includes a diagram tool, that can be accessed using **File > New > Diagram**. A new diagram document tab will be created, at which point you can add tables from the TOM Explorer by dragging and dropping, or from the **Diagram > Add tables...** menu. + +Once tables have been added to the diagram, you can create relationship between columns simply by dragging from one column to another. + +![Te3 Diagram View](../images/te3-diagram-view.png) + +> [!NOTE] +> For performance reasons, the diagram tool does not inspect the data of the model, nor does it validate the uniqueness or directionality of any relationships you create. It is up to you to ensure that relationships are created correctly. If a relationship has been incorrectly defined, Analysis Services will return an error state which is shown in the **Messages View**. + +### Model deployment + +Tabular Editor lets you easily deploy the model metadata to any instance of Analysis Services. You can invoke Tabular Editor's Deployment Wizard under **Model > Deploy...** or by hitting CTRL+SHIFT+D. + +For more information, see . + +## Next steps + +- @migrate-from-te2 +- @parallel-development +- @boosting-productivity-te3 \ No newline at end of file diff --git a/onboarding/ja-jp/ja-optimizing-workflow-workspace-mode.md b/onboarding/ja-jp/ja-optimizing-workflow-workspace-mode.md new file mode 100644 index 0000000..d43b6f0 --- /dev/null +++ b/onboarding/ja-jp/ja-optimizing-workflow-workspace-mode.md @@ -0,0 +1,21 @@ +--- +uid: optimizing-workflow-workspace-mode +title: Optimizing development workflow using Workspace Mode +author: Daniel Otykier +updated: 2021-10-05 +applies_to: + editions: + - edition: Desktop + none: x + - edition: Business + - edition: Enterprise +--- + +# Optimizing development workflow using Workspace Mode +[!include[workspace-mode](~/te3/workspace-mode.partial.md)] + +# Next steps + +- @powerbi-cicd +- @as-cicd +- @boosting-productivity-te3 \ No newline at end of file diff --git a/onboarding/ja-jp/ja-parallel-development.md b/onboarding/ja-jp/ja-parallel-development.md new file mode 100644 index 0000000..114cdf6 --- /dev/null +++ b/onboarding/ja-jp/ja-parallel-development.md @@ -0,0 +1,187 @@ +--- +uid: parallel-development +title: Enabling parallel development using Git and Save to Folder +author: Daniel Otykier +updated: 2021-09-30 +applies_to: + editions: + - edition: Desktop + none: x + - edition: Business + - edition: Enterprise +--- + +# Enabling parallel development using Git and Save to Folder + +
+ +This article describes the principles of parallel model development (that is, the ability for multiple developers to work in parallel on the same data model) and the role of Tabular Editor in this regard. + +# Prerequisites + +- The destination of your data model must be one of the following: + - SQL Server 2016 (or newer) Analysis Services Tabular + - Azure Analysis Services + - Power BI Premium Capacity/Power BI Premium-per-user with [XMLA read/write enabled](https://docs.microsoft.com/en-us/power-bi/admin/service-premium-connect-tools#enable-xmla-read-write) +- Git repository accessible by all team members (on-premises or hosted in Azure DevOps, GitHub, etc.) + +# TOM as source code + +Parallel development has traditionally been difficult to implement on Analysis Services tabular models and Power BI datasets (in this article, we will call both types of models "tabular models" for brevity). With the introduction of the JSON-based model metadata used by the [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions), integrating model metadata in version control has certainly become easier. + +The use of a text-based file format makes it possible to handle conflicting changes in a graceful way, by using various diff tools that are often included with the version control system. This type of change conflict resolution is very common in traditional software development, where all of the source code resides in a large number of small text files. For this reason, most popular version control systems are optimized for these types of files, for purposes of change detection and (automatic) conflict resolution. + +For tabular model development, the "source code" is our JSON-based TOM metadata. When developing tabular models with earlier versions of Visual Studio, the Model.bim JSON file was augmented with information about who modified what and when. This information was simply stored as additional properties on the JSON objects throughout the file. This was problematic, because not only was the information redundant (since the file itself also has metadata that describes who the last person to edit it was, and when the last edit happened), but from a version control perspective, this metadata does not hold any *semantic meaning*. In other words, if you were to remove all of the modification metadata from the file, you would still end up with a perfectly valid TOM JSON-file, that you could deploy to Analysis Services or publish to Power BI, without affecting the functionality and business logic of the model. + +Just like source code for traditional software development, we do not want this kind of information to "contaminate" our model metadata. Indeed, a version control system gives a much more detailed view of the changes that were made, who made them, when and why, so there is no reason to include it as part of the files being versioned. + +When Tabular Editor was first created, there was no option to get rid of this information from the Model.bim file created by Visual Studio, but that has luckily changed in more recent versions. However, we still need to deal with a single, monolithic file (the Model.bim file) containing all of the "source code" that defines the model. + +Power BI dataset developers have it much worse, since they do not even have access to a text-based file containing the model metadata. The best they can do is export their Power BI report as a [Power BI Template (.pbit) file](https://docs.microsoft.com/en-us/power-bi/create-reports/desktop-templates#creating-report-templates) which is basically a zip file containing the report pages, the data model definitions and the query definitions. From the perspective of a version control system, a zip file is a binary file, and binary files cannot be diff'ed, compared and merged, the same way text files can. This forces Power BI developers to use 3rd party tools or come up with elaborate scripts or processes for properly versioning their data models - especially, if they want to be able to merge parallel tracks of development within the same file. + +Tabular Editor aims to simplify this process by providing an easy way to extract only the semantically meaningful metadata from the Tabular Object Model, regardless of whether that model is an Analysis Services tabular model or a Power BI dataset. Moreover, Tabular Editor can split up this metadata into several smaller files using its Save to Folder feature. + +# What is Save to Folder? + +As mentioned above, the model metadata for a tabular model is traditionally stored in a single, monolithic JSON file, typically named **Model.bim**, which is not well suited for version control integration. Since the JSON in this file represents the [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions), it turns out that there is a straight forward way to break the file down into smaller pieces: The TOM contains arrays of objects at almost all levels, such as the list of tables within a model, the list of measures within a table, the list of annotations within a measure, etc. When using Tabular Editor's **Save to Folder** feature, these arrays are simply removed from the JSON, and instead, a subfolder is generated containing one file for each object in the original array. This process can be nested. The result is a folder structure, where each folder contains a set of smaller JSON files and subfolders, which semantically contains exactly the same information as the original Model.bim file: + +![Save To Folder](~/images/save-to-folder.png) + +The names of each of the files representing individual TOM objects are simply based on the `Name` property of the object itself. The name of the "root" file is **Database.json**, which is why we sometimes refer to the folder-based storage format as simply **Database.json**. + +## Pros of using Save to Folder + +Below are some of the advantages of storing the tabular model metadata in this folder based format: + +- **Multiple smaller files work better with many version control systems than few large files.** For example, git stores snapshots of modified files. For this reason alone, it makes sense why representing the model as multiple smaller files is better than storing it as a single, large file. +- **Avoid conflicts when arrays are reordered.** Lists of tables, measures, columns, etc., are represented as arrays in the Model.bim JSON. However, the order of objects within the array does not matter. It is not uncommon for objects to be reordered during model development, for example due to cut/paste operations, etc. With Save to Folder, array objects are stored as individual files, so the arrays are no longer change tracked, reducing the risk of merge conflicts. +- **Different developers rarely change the same file.** As long as developers work on separate parts of the data model, they will rarely make changes to the same files, reducing the risk of merge conflicts. + +## Cons of using Save to Folder + +As it stands, the only disadvantage of storing the tabular model metadata in the folder based format, is that this format is used exclusively by Tabular Editor. In other words, you can not directly load the model metadata into Visual Studio from the folder based format. Instead, you would have to temporarily convert the folder based format to the Model.bim format, which can of course be done using Tabular Editor. + +## Configuring Save to Folder + +One size rarely fits all. Tabular Editor has a few configuration options that affect how a model is serialized into the folder structure. In Tabular Editor 3, you can find the general settings under **Tools > Preferences > Save-to-folder**. Once a model is loaded in Tabular Editor, you can find the specific settings that apply to that model under **Model > Serialization options...**. The settings that apply to a specific model are stored as an annotation within the model itself, to ensure that the same settings are used regardless of which user loads and saves the model. + +![Configuring Save To Folder](~/images/configuring-save-to-folder.png) + +### Serialization settings + +- **Use recommended settings**: (Default: checked) When this is checked, Tabular Editor uses the default settings when saving a model as a folder structure for the first time. +- **Serialize relationships on from-tables**: (Default: unchecked) When this is checked, Tabular Editor stores relationships as an annotation on the table at the "from-side" (typically the fact table) of the relationship, instead of storing them at the model level. This is useful when in the early development phase of a model, where table names are still subject to change quite often. +- **Serialize perspective membership info on objects**: (Default: unchecked) When this is checked, Tabular Editor stores information about which perspectives an object (table, column, hierarchy, measure) belongs to, as an annotation on that object, instead of storing the information at the perspective level. This is useful when object names are subject to change, but perspective names are finalised. +- **Serialize translations on translated objects**: (Default: unchecked) When this is checked, Tabular Editor stores metadata translations as an annotation on each translatable object (table, column, hierarchy, level, measure, etc.), instead of storing the translations at the culture level. This is useful when object names are subject to change. +- **Prefix file names sequentially**: (Default: unchecked) In cases where you want to retain the metadata ordering of array members (such as the order of columns in a table), you can check this to have Tabular Editor prefix the filenames with a sequential integer based on the object's index in the array. This is useful if you use the default drillthrough feature in Excel, and would like [columns to appear in a certain order in the drillthrough](https://github.com/TabularEditor/TabularEditor/issues/46#issuecomment-297932090). + +> [!NOTE] +> The main purpose of the settings described above, is to reduce the number of merge conflicts encountered during model development, by adjusting how and where certain model metadata is stored. In the early phases of model development, it is not uncommon for objects to be renamed often. If a model already has metadata translations specified, every object rename would cause at least two changes: One change on the object being renamed, and one change for every culture that defines a translation on that object. When **Serialize translations on translated objects** is checked, there would only be a change on the object being renamed, as that object also includes the translated values (since this information would be stored as an annotation). + +### Serialization depth + +The checklist allows you to specify which objects will be serialized as individual files. Note that some options (perspectives, translations, relationships) may not be available, depending on the settings specified above. + +In most cases, it is recommended to always serialize objects to the lowest level. However, there may be special cases where this level of detail is not needed. + +# Power BI and version control + +As mentioned above, integrating a Power BI report (.pbix) or Power BI template (.pbit) file in version control, does not enable parallel development or conflict resolution, due to these files using a binary file format. At the same time, we have to be aware of the current limitations of using Tabular Editor (or other third party tools) with Power BI Desktop or the Power BI XMLA endpoint respectively. + +These limitations are: + +- When using Tabular Editor as an external tool for Power BI Desktop, [not all modeling operations are supported](@xref:desktop-limitations). +- Tabular Editor can extract model metadata from a .pbix file loaded in Power BI Desktop, or directly from a .pbit file on disk, but there is **no supported way to update model metadata in a .pbix or .pbit file outside of Power BI Desktop**. +- Once any changes are made to a Power BI dataset through the XMLA endpoint, [that dataset can no longer be downloaded as a .pbix file](https://docs.microsoft.com/en-us/power-bi/admin/service-premium-connect-tools#power-bi-desktop-authored-datasets). + +To enable parallel development, we must be able to store the model metadata in one of the text-based (JSON) formats mentioned above (Model.bim or Database.json). There is no way to "recreate" a .pbix or .pbit file from the text-based format, so **once we decide to go this route, we will no longer be able to use Power BI Desktop for editing the data model**. Instead, we will have to rely on tools that can use the JSON-based format, which is exactly the purpose of Tabular Editor. + +> [!WARNING] +> If you do not have access to a Power BI Premium workspace (either Premium capacity or Premium-Per-User), you will not be able to publish the model metadata stored in the JSON files, since this operation requires access to the [XMLA endpoint](https://docs.microsoft.com/en-us/power-bi/admin/service-premium-connect-tools). + +> [!NOTE] +> Power BI Desktop is still needed for purpose of creating the visual part of the report. It is a [best practice to always separate reports from models](https://docs.microsoft.com/en-us/power-bi/guidance/report-separate-from-model). In case you have an existing Power BI file that contains both, [this blog post](https://powerbi.tips/2020/06/split-an-existing-power-bi-file-into-a-model-and-report/) ([video](https://www.youtube.com/watch?v=PlrtBm9YN_Q)) describes how to split it into a model file and a report file. + +# Tabular Editor and git + +Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. It is the most popular version control system right now, and it is available through multiple hosted options, such as [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/repos/), [GitHub](https://github.com/), [GitLab](https://about.gitlab.com/) and others. + +A detailed description of git is outside the scope of this article. There are, however, many resources available online if you want to learn more. We recommend the [Pro Git](https://git-scm.com/book/en/v2) book for reference. + +> [!NOTE] +> Tabular Editor 3 does not currently have any integration with git or other version control systems. To manage your git repository, commit code changes, create branches, etc., you will have to use the git command line or another tool, such as the [Visual Studio Team Explorer](https://docs.microsoft.com/en-us/azure/devops/user-guide/work-team-explorer?view=azure-devops#git-version-control-and-repository) or [TortoiseGit](https://tortoisegit.org/). + +As mentioned earlier, we recommend using Tabular Editor's [Save to Folder](#what-is-save-to-folder) option when saving model metadata to a git code repository. + +## Branching strategy + +What follows is a discussion of branching strategies to employ when developing tabular models. + +The branching strategy will dictate what the daily development workflow will be like, and in many cases, branches will tie directly into the project methods used by your team. For example, using the [agile process within Azure DevOps](https://docs.microsoft.com/en-us/azure/devops/boards/work-items/guidance/agile-process-workflow?view=azure-devops), your backlog would consist of **Epics**, **Features**, **User Stories**, **Tasks** and **Bugs**. + +In the agile terminology, a **User Story** is a deliverable, testable piece of work. The User Story may consist of several **Tasks**, that are smaller pieces of work that need to be performed, typically by a developer, before the User Story may be delivered. In the ideal world, all User Stories have been broken down into manageable tasks, each taking only a couple of hours to complete, adding up to no more than a handful of days for the entire User Story. This would make a User Story an ideal candidate for a so-called Topic Branch, where the developer could make one or more commits for each of the tasks within the User Story. Once all tasks are done, you want to deliver the User Story to the client, at which time the topic branch is merged into a delivery branch (for example, a "Test" branch), and the code deployed to a testing environment. + +Determining a suitable branching strategy depends on many different factors. In general, Microsoft recommends the [Trunk-based Development](https://docs.microsoft.com/en-us/azure/devops/repos/git/git-branching-guidance?view=azure-devops) ([video](https://youtu.be/t_4lLR6F_yk?t=232)) strategy, for agile and continuous delivery of small increments. The main idea is to create branches off the "Main" branch for every new feature or bugfix (see image below). Code review processes are enforced through pull requests from feature branches into Main, and using the Branch Policy feature of Azure DevOps, we can set up rules that require code to build cleanly before a pull request can be completed. + +![Trunk Based Development](~/images/trunk-based-development.png) + +### Trunk-based Development + +However, such a strategy might not be feasible in a Business Intelligence development teams, for a number of reasons: + +- New features often require prolonged testing and validation by business users, which may take several weeks to complete. As such, you will likely need a user-faced test environment. +- BI solutions are multi-tiered, typically consisting of a Data Warehouse tier with ETL, a Master Data Management tier, a semantic layer and reports. Dependencies exist between these layers, that further complicate testing and deployment. +- The BI team may be responsible for developing and maintaining several different semantic models, serving different areas of business (Sales, Inventory, Logistics, Finance, HR, etc.), at different maturity stages and at varying development pace. +- The most important aspect of a BI solution is the data! As a BI developer, you don not have the luxury of simply checking out the code from source control, hitting F5 and having a full solution up and running in the few minutes it takes to compile the code. Your solution needs data, and that data has to be loaded, ETL'ed or processed across several layers to make it to the end user. Including data in your DevOps workflows could blow up build and deployment times from minutes to hours or even days. In some scenarios, it might not even be possible, due to ressource or economy constraints. + +There is no doubt that a BI team would benefit from a branching strategy that supports parallel development on any of the layers in the full BI solution, in a way that lets them mix and match features that are ready for testing. But especially due to the last bullet point above, we need to think carefully about how we are going to handle the data. If we add a new attribute to a dimension, for example, do we want to automatically load the dimension as part of our build and deployment pipelines? If it only takes a few minutes to load such a dimension, that would probably be fine, but what if we are adding a new column to a multi-billion row fact table? And if developers are working on new features in parallel, should each developer have their own development database, or how do we otherwise prevent them from stepping on each others toes in a shared database? + +There is no easy answer to the questions above - especially when considering all the tiers of a BI solution, and the different constellations and prefered workflows of BI teams across the planet. Also, when we dive into actual build, deployment and test automation, we are going to focus mostly on Analysis Services. The ETL- and database tiers have their own challenges from a DevOps perspective, which are outside the scope of this article. But before we move on, let us take a look at another branching strategy, and how it could potentially be adopted to BI workflows. + +### GitFlow branching and deployment environments + +The strategy described below is based on [GitFlow by Vincent Driessen](https://nvie.com/posts/a-successful-git-branching-model/). + +![Gitflow](~/images/gitflow.png) + +Implementing a branching strategy similar to this, can help solve some of the DevOps problems typically encountered by BI teams, provided you put some thought into how the branches correlate to your deployment environments. In an ideal world, you would need at least 4 different environments to fully support GitFlow: + +- The **production** environment, which should always contain the code at the HEAD of the master branch. +- A **canary** environment, which should always contain the code at the HEAD of the develop branch. This is where you typically schedule nightly deployments and run your integration testing, to make sure that the features going into the next release to production play nicely together. +- One or more **UAT** environments where you and your business users test and validate new features. Deployment happens directly from the feature branch containing the code that needs to be tested. You will need multiple test environments if you want to test multiple new features in parallel. With some coordination effort, a single test environment is usually enough, as long as you carefully consider the dependencies between your BI tiers. +- One or more **sandbox** environments where you and your team can develop new features, without impacting any of the environments above. As with the test environment, it is usually enough to have a single, shared, sandbox environment. + +We must emphasize that there is really no "one-size-fits-all" solution to these considerations. Maybe you are not building your solution in the Cloud, and therefore do not have the scalability or flexibility to spin up new resources in seconds or minutes. Or maybe your data volumes are very large, making it impractical to replicate environments due to resource/economy/time constraints. Before moving on, also make sure to ask yourself the question of whether you truly need to support parallel development and testing. This is rarely the case for small teams with only a few stakeholders, in which case you can still benefit from CI/CD, but where GitFlow branching might be overkill. + +Even if you do need to support parallel development, you may find that multiple developers can easily share the same development or sandbox environment, without encountering too much trouble. Specifically for tabular models, though, we recommend that developers still use individual [workspace databases](xref:workspace-mode) to avoid "stepping over each others toes". + +## Common workflow + +Assuming you already have a git repository set up and aligned to your branching strategy, adding your tabular model "source code" to the repository is simply a matter of using Tabular Editor to save the metadata to a new branch in a local repository. Then, you stage and commit the new files, push your branch to the remote repository and create a pull request to get your branch merged into the main branch. + +The exact workflow depends on your branching strategy and how your git repositories have been set up. In general, the workflow would look something like this: + +1. Before starting work on a new feature, create a new feature branch in git. In a trunk-based development scenario, you would need the following git commands to checkout the main branch, get the latest version of the code, and create the feature branch from there: + ```cmd + git checkout main + git pull + git checkout -b "feature\AddTaxCalculation" + ``` +2. Open your model metadata from the local git repository in Tabular Editor. Ideally, use a [workspace database](xref:workspace-mode), to make it easier to test and debug DAX code. +3. Make the necessary changes to your model using Tabular Editor. Continuously save the changes (CTRL+S). Regularly commit code changes to git after you save, to avoid losing work and to keep a full history of all changes that were made: + ```cmd + git add . + git commit -m "Description of what was changed and why since last commit" + git push + ``` +4. If you are not using a workspace database, use Tabular Editor's **Model > Deploy...** option to deploy to a sandbox/development environment, in order to test the changes made to the model metadata. +6. When done, and all code has been committed and pushed to the remote repository, you submit a pull request in order to get your code integrated with the main branch. If a merge conflict is encountered, you will have to resolve it locally, using for example the Visual Studio Team Explorer or by simply opening the .json files in a text editor to resolve the conflicts (git inserts conflict markers to indicate which part of the code has conflicts). +7. Once all conflicts are resolved, there may be a process of code review, automated build/test execution based on branch policies, etc. to get the pull request completed. This, however, depends on your branching strategy and overall setup. + +We present more details about how to configure git branch policies, set up automated build and deployment pipelines, etc. using Azure DevOps in the following articles. Similar techniques can be used in other automated build and git hosting environments, such as TeamCity, GitHub, etc. + +# Next steps + +- @powerbi-cicd +- @as-cicd +- @optimizing-workflow-workspace-mode \ No newline at end of file diff --git a/onboarding/ja-jp/ja-personalizing-te3.md b/onboarding/ja-jp/ja-personalizing-te3.md new file mode 100644 index 0000000..f284504 --- /dev/null +++ b/onboarding/ja-jp/ja-personalizing-te3.md @@ -0,0 +1,252 @@ +--- +uid: personalizing-te3 +title: Personalizing and configuring Tabular Editor 3 to suit your needs +author: Daniel Otykier +updated: 2021-09-28 +--- + +# Personalizing and configuring Tabular Editor 3 to suit your needs + +Tabular Editor 3 provides a wide range of configuration options, that allow you to tweak the tool to your specific needs and preferred workflow. In this article, we will guide you through the settings that are most commonly adjusted by individual model developers. + +Most of the settings covered in this article are accessed through the **Tools > Preferences** menu option. Throughout the article, we will list individual settings in the following style, for easy reference: + +***Name of setting* (default value)**
Description of setting. + +# General features + +The first page you will encounter within the **Preferences** dialog is the **Tabular Editor > Features** page (see screenshot below). Below is a short description of the features on this page, and what they are commonly used for: + +![Pref General Features](../images/pref-general-features.png) + +## Power BI + +These settings are mostly useful for developers who use Tabular Editor 3 as an [External Tool for Power BI Desktop](https://docs.microsoft.com/en-us/power-bi/transform-model/desktop-external-tools). + +##### *Allow unsupported modeling operations* (disabled) + +External Tools for Power BI Desktop have some [limitations](xref:desktop-limitations). By default, Tabular Editor 3 will prevent the user from making unsupported changes to the data model. There may be some advanced modeling features which work well, even though they are not supported cf. the previous link. To unlock all Tabular Object Model objects and properties, enable this setting. + +##### *Hide auto date/time warnings* (disabled) + +When the "Auto date/time" setting in Power BI Desktop is enabled, a number of calculated tables are created automatically. Unfortunately, these tables contain DAX code which trigger a warning message by Tabular Editor 3's built-in DAX analyzer. To hide these warnings, enable this setting. + +##### *Line break on first line of DAX* (disabled) + +In Power BI Desktop it is common to insert a line break on the first line of a DAX expression, due to the way the formula bar displays the DAX code. If you often switch back and forth between Tabular Editor and Power BI Desktop, consider enabling this option to have Tabular Editor 3 insert the line break automatically, whenever a DAX expression is edited through the tool. + +## Metadata Synchronization + +These settings controls the behavior of Tabular Editor 3, when model metadata is loaded from a database on an instance of Analysis Services. The settings specify how Tabular Editor 3 should deal with metadata changes applied to the database from outside the application, such as when another user makes a change to the database, or when you make a change to the model through Power BI Desktop while Tabular Editor 3 is used as an external tool. + +##### *Warn when local metadata is out-of-sync with deployed model* (enabled) + +When this is checked, Tabular Editor displays a warning message when you attempt to save changes, while another user or process has made a change to the database since the model metadata was loaded into your instance of Tabular Editor. + +##### *Track external model changes* (enabled) + +This option is only relevant for local instances of Analysis Services (i.e. msmdsrv.exe processes running on the same machine as Tabular Editor). When checked, Tabular Editor starts a trace on Analysis Services and notifies you if external changes are made. + +##### *Refresh local Tabular Object Model metadata automatically* (enabled) + +When the tracing mechanism as described above is enabled, this option allows Tabular Editor to automatically refresh the model metadata when an external change is detected. This is useful if you often switch back and forth between Power BI Desktop and Tabular Editor 3, as this ensures that changes made in Power BI Desktop are automatically sync'ed to Tabular Editor. + +##### *Cleanup orphaned Tabular Editor traces* + +Normally, Tabular Editor 3 should automatically stop and remove any AS traces started due to the settings above. However, if the application was shut down prematurely, the traces may never be stopped. By clicking this button, all AS traces started by any instance of Tabular Editor, on the current instance of Analysis Services, will be removed. + +> [!NOTE] +> The cleanup button is only available when Tabular Editor is connected to an instance of Analysis Services. + +# TOM Explorer settings + +The settings below control various aspects of the TOM Explorer. You can find these settings under **Tabular Editor > TOM Explorer**: + +![Tom Explorer Settings](../images/tom-explorer-settings.png) + +##### *Show full branch* (disabled) + +When filtering the TOM Explorer, by default Tabular Editor 3 shows all items in the hierarchy that matches the filter string, including their parents. If you want to see all child items as well (even though these might not match the filter string), enable this option. + +##### *Always show delete warnings* (disabled) + +If you prefer Tabular Editor 3 to prompt you to confirm all object deletions, enable this setting. Otherwise, Tabular Editor 3 will only prompt you to confirm multi-object deletions, or deletions of objects that are referenced by other objects. + +> [!NOTE] +> All delete operations in Tabular Editor 3 can be undone by hitting CTRL+Z. + +# DAX editor general settings + +Tabular Editor 3's DAX editor is highly configurable, and it is easy to get overwhelmed by the many settings available. This section highlights the most common and important settings. Locate the general settings under **Text Editors > DAX Editor > General**: + +![Dax Editor General](../images/dax-editor-general.png) + +## General + +The *Line numbers*, *Code folding*, *Visible whitespace* and *Indentation guides* settings can be used to toggle various visual feature of the editor. In the screenshot below, all four options have been enabled: + +![Visible Whitespace](../images/visible-whitespace.png) + +##### *Use tabs* (disabled) + +When this is checked, a tab character (`\t`) is inserted whenever the TAB button is hit. Otherwise, a number of spaces corresponding to the *Indent width* setting is inserted. + +##### *Comment style* (slashes) + +DAX supports line comments that use slashes (`//`) or hyphens (`--`). This setting determines which style of comment is used when Tabular Editor 3 generates DAX code, such as when using the DAX script feature. + +## DAX Settings + +These settings determine certain behavior of the DAX code analyzer. The *Locale* setting is simply a matter of preference. All other settings are relevant only when Tabular Editor 3 cannot determine the version of Analysis Services used, as is the case for example when a Model.bim file is loaded directly. In this case, Tabular Editor tries to guess which version the model will be deployed to, based on the compatibility level specified in the model, but depending on the actual version of the deployment target, there may be various DAX language differences, which Tabular Editor cannot determine. If Tabular Editor reports incorrect semantic/syntax errors, you may need to tweak these settings. + +# Auto Formatting + +On the **Text Editors > DAX Editor > Auto Formatting** page, you can find a wide range of settings for controlling how your DAX code is formatted. + +![Auto Formatting Settings](../images/auto-formatting-settings.png) + +##### *Auto format code as you type* (enabled) + +This option will automatically apply certain formatting rules whenever certain keystrokes occur. For example, when a parenthesis is closed, this feature will ensure that everything within the parentheses is formatted according to the other settings on this page. + +##### *Auto-format function calls* (enabled) + +This option specifically controls whether automatic formatting of function calls (that is, spacing between arguments and parentheses), should happen when a parenthesis is closed. + +##### *Auto-indent* (enabled) + +This option automatically indents function arguments when a line break is inserted within a function call. + +##### *Auto-brace* (enabled) + +This option automatically inserts the closing brace or quote whenever an opening brace or quote is entered. + +##### *Wrap selection* (enabled) + +When enabled, this option automatically wraps the current selection with the closing brace, when an opening brace is entered. + +## Formatting rules + +These settings control how DAX code whitespace is formatted, both when auto-formatting occurs, but also when code is manually formatted (using the **Format DAX** menu options). + +##### *Space after functions* (disabled) + +# [Enabled](#tab/tab1) + +```DAX +SUM ( 'Sales'[Amount] ) +``` + +# [Disabled](#tab/tab2) + +```DAX +SUM( 'Sales'[Amount] ) +``` + +*** + +##### *Newline after functions* (disabled) + +Applies only when a function call needs to be broken across multiple lines. + +# [Enabled](#tab/tab3) + +```DAX +SUM +( + 'Sales'[Amount] +) +``` + +# [Disabled](#tab/tab4) + +```DAX +SUM( + 'Sales'[Amount] +) +``` + +*** + +##### *Newline before operator* (enabled) + +Applies only when a binary operation needs to be broken across multiple lines. + +# [Enabled](#tab/tab5) + +```DAX +[Internet Total Sales] + + [Reseller Total Sales] +``` + +# [Disabled](#tab/tab6) + +```DAX +[Internet Total Sales] + + [Reseller Total Sales] +``` + +*** + +##### *Pad parentheses* (enabled) + +# [Enabled](#tab/tab7) + +```DAX +SUM( Sales[Amount] ) +``` + +# [Disabled](#tab/tab8) + +```DAX +SUM(Sales[Amount]) +``` + +*** + +##### *Long format line limit* (120) + +The maximal number of characters to keep on a single line before an expression is broken across multiple lines, when using the **Format DAX (long lines)** option. + +##### *Short format line limit* (60) + +The maximal number of characters to keep on a single line before an expression is broken across multiple lines, when using the **Format DAX (short lines)** option. + +> [!NOTE] +> Most settings above are only in effect when using the (default) built-in DAX formatter. + +## Casings and quotes + +In addition to formatting the DAX code whitespace, Tabular Editor 3 can also fix object references and function/keyword casings. + +##### *Fix measure/column qualifiers* (enabled) + +When this is checked, table prefixes are automatically removed from measure references, and automatically inserted on column references. + +##### *Preferred keyword casing* (default = UPPER) + +This setting allows you to change the casing used for keywords, such as `ORDER BY`, `VAR`, `EVALUATE`, etc. This also applies when a keyword is inserted through the auto-complete feature. + +##### *Preferred function casing* (default = UPPER) + +This setting allows oyu to change the casing used for functions, such as `CALCULATE(...)`, `SUM(...)`, etc. This also applies when a function is inserted through the auto-complete feature. + +##### *Fix keyword/function casing* (enabled) + +When this is checked, casing of keywords and functions is automatically corrected whenever code is auto-formatted or manually formatted. + +##### *Fix object reference casing* (enabled) + +DAX is a case-insensitive language. When this is enabled, references to tables, columns and measures are automatically corrected such that the casing matches the physical name of the referenced objects. This fixup happens whenever code is auto-formatted or manually formatted. + +##### *Always quote tables* (disabled) + +Referencing certain table names do not require surrounding single quotes in DAX. However, if you prefer table references to always be quoted, regardless of the table name, you can check this option. + +##### *Always prefix extension columns* (disabled) + +Extension columns can be defined without a table name. When this is checked, the DAX editor will always add the table prefix to an extension column, even if the table name is blank. In that case, the column reference will look like `''[Extension Column]`. + +# Next steps + +- @boosting-productivity-te3 \ No newline at end of file diff --git a/onboarding/ja-jp/ja-powerbi-cicd.md b/onboarding/ja-jp/ja-powerbi-cicd.md new file mode 100644 index 0000000..04266df --- /dev/null +++ b/onboarding/ja-jp/ja-powerbi-cicd.md @@ -0,0 +1,10 @@ +--- +uid: powerbi-cicd +title: Power BI CI/CD with Azure DevOps and Tabular Editor +author: Daniel Otykier +updated: 2021-10-04 +--- + +# Power BI CI/CD with Azure DevOps and Tabular Editor + +(WIP) \ No newline at end of file diff --git a/onboarding/ja-jp/ja-refresh-preview-query.md b/onboarding/ja-jp/ja-refresh-preview-query.md new file mode 100644 index 0000000..cfc0ed0 --- /dev/null +++ b/onboarding/ja-jp/ja-refresh-preview-query.md @@ -0,0 +1,162 @@ +--- +uid: refresh-preview-query +title: Refreshing, previewing and querying data +author: Daniel Otykier +updated: 2021-09-30 +applies_to: + editions: + - edition: Desktop + partial: Refreshing tables through external tools is currently not supported by Power BI Desktop, even though Tabular Editor 3 Desktop Edition allows this operation. Querying data is fully supported. + - edition: Business + - edition: Enterprise +--- +# Refreshing, previewing and querying data + +When Tabular Editor 3 is connected to an instance of Analysis Services, a number of additional **connected features** are available, allowing you to use Tabular Editor 3 as a client tool for Analysis Services. + +> [!NOTE] +> The phrase "connected to an instance of Analysis Services" means any one of the following: +> +> - Loading a model in [**workspace mode**](xref:workspace-mode) +> - Loading a model directly from SQL Server Analysis Services, Azure Analysis Services or the Power BI XMLA endpoint +> - Using Tabular Editor 3 as an external tool for Power BI Desktop + +In summary, these connected features are: + +- Data refresh operations +- Table data previewing +- PivotGrids +- DAX Querying +- VertiPaq Analyzer + +# Refreshing data + +Tabular Editor does not automatically trigger refresh operations in Analysis Services when changes are made to the data model. This is by design, to ensure that saving metadata changes to Analysis Services does not take too long. Potentially, a refresh operation can take a long time to complete, during which no additional metadata may be updated on the server. Of course, the drawback of this, is that you can make changes using Tabular Editor, which causes the model to enter a state where it is only partly queryable or not queryable at all. Depending on what type of data model change was made, different levels of refresh may be needed. + +In general, the following changes require a full refresh, before the mentioned object can be queried (that is, a data refresh followed by a calculate refresh): + +- Adding a new table to the model +- Adding a new column to a table + +In general, the following changes require a calculate refresh: + +- Changing the DAX expression of a calculated table or calculated column +- Adding or modifying a relationship +- Adding, renaming or removing a calculation item from a calculation group + +Notably, adding, modifying or removing measures from a model does not require any type of refresh (unless the measure is referenced by a calculated column, in which case the table in which that column resides has to be recalculated). + +To initiate a refresh using Tabular Editor, simply right click on the Table or Partition you wish to refresh, navigate to **Refresh table** or **Refresh partition**, and then choose the type of refresh you want to perform. + +![Refresh Table](~/images/refresh-table.png) + +You may also initiate a refresh at the model level through the **Model > Refresh model** menu. Once the refresh operation starts, you will see the text "Data refresh started... View refresh queue". Click on the link or locate the **Data refresh** view through the **View > Data refresh** menu option. This will display a list of all refresh operations (both present and current), displaying the status message returned from Analysis Services including progress counters and duration, and allowing you to cancel an unintended refresh. + +![Data Refresh View2](~/images/data-refresh-view2.png) + +While a refresh is in progress you can continue work on your data model, querying and previewing data or queueing new data refresh operations according to this article. However, you will not be able to save model changes to Analysis Services until the all data refresh operations complete. + +> [!NOTE] +> Currently, [Power BI Desktop does not support refresh operations triggered from external tools](https://docs.microsoft.com/en-us/power-bi/transform-model/desktop-external-tools#data-modeling-operations). For this reason, Tabular Editor 3 hides these options when connected to an instance of Power BI Desktop. You can override this behavior by enabling **Tools > Preferences > Allow unsupported modeling operations**. + +## Supported refresh operations + +Tabular Editor 3 supports refresh operations on different object types. The supported refresh types are shown below: + +- **Model** (Automatic, calculate, full) +- **(Imported) Table** (Automatic, calculate, data only, full) +- **Partition** (Full) +- **Calculated Table** (Calculate) +- **Calculation Group** (Calculate) + +See [Refresh Types](https://docs.microsoft.com/en-us/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request) for more information about the types of refresh operations supported by Analysis Services / Power BI. + +# Previewing table data + +At certain points during DAX authoring and data model development, you may need to inspect the contents of your tables on a row-by-row basis. Of course, you could write a DAX query to achieve this, but Tabular Editor 3 makes that even easier by allowing you to preview table data directly. To do this, right-click on a table and choose the **Preview data** option. + +![Preview Data](~/images/preview-data-big.png) + +You can open multiple such table previews and arrange them anyway you like in the user interface. In addition, you can sort or filter individual columns. There is no practical limit to the number of rows that can be previewed. Tabular Editor simply executes a [`TOPNSKIP`](https://dax.guide/topnskip) DAX query against the model, to return just a small number of records suitable to fill the current view. + +If one or more calculated columns are in an invalid state, those columns contain the text *(Calculation needed)*. You can recalculate the table by right-clicking on the column and choosing the **Recalculate table...** option. + +![Recalculate Table](~/images/recalculate-table.png) + +# Pivot Grids + +After adding or editing DAX measures in a model, it is common for model developers to test these measures. Traditionally, this was typically done using client tools such as Excel or Power BI. With Tabular Editor 3, you can now use **Pivot Grids** which behave much like the famous PivotTables of Excel. The Pivot Grid lets you quickly create summarized views of the data in your model, allowing you test the behavior of your DAX measures when filtering and slicing by various columns and hierarchies. + +To create a new Pivot Grid, use the **File > New > Pivot Grid** option. From here, you can either drag measures, columns and hierarchies from the TOM Explorer into the grid, or you can use the **Pivot Grid > Show fields** menu option to display a popup list of all fields that can be dragged into the Pivot Grid (see screenshot below). + +![Show Fields Pivot](~/images/show-fields-pivot.png) + +As fields are dragged into the Pivot Grid, Tabular Editor generates MDX queries that are sent to Analysis Services, to display the resulting data. In this regard, the behavior is very similar to Pivot Tables in Excel. You can rearrange fields in the Pivot Grid by dragging and dropping, and there are various right-click menu options available for customizing how the data is displayed. + +![Customizing Pivot Grids](../images/customizing-pivot-grids.png) + +The Pivot Grid is automatically refreshed when a change is made to the model or a refresh operation finishes. You can toggle this auto-refresh capability within the **Pivot Grid** menu. + +# DAX Queries + +A more direct way to query the data in your model, is to write a DAX query. Use the **File > New > DAX Query** menu option to create a new DAX query document. You can have multiple DAX query documents open at the same time. + +DAX queries can be saved and loaded to and from standalone files using the `.dax` or `.msdax` file extension. See @supported-files for more information. + +Type your DAX `EVALUATE` query into the editor and hit **Query > Execute** (F5) to send the query to Analysis Services and see the result. By default, Tabular Editor 3 limits the number of rows returned from Analysis Services to 1000, but this can be changed under **Tools > Preferences > Data Browsing > DAX Query**. If a query exceeds this limit, Tabular Editor 3 displays a shortcut that lets you retrieve all records (see screenshot below). + +![Query Rowset Limit](~/images/query-rowset-limit.png) + +> [!WARNING] +> Displaying a large number of records in the query result window could take a while and drastically increase the memory consumed by Tabular Editor 3. + +Tabular Editor 3 uses the same DAX code editor for query editing as for defining DAX expressions on objects. As such, all the features regarding code-completion, auto-formatting, etc. are available. See @dax-editor for more information. In addition, since a DAX query has a slightly different syntax than object expressions, the DAX query editor provides a few more options for common tasks. + +For example, if you right-click on a measure reference, there is an option to **Define measure** as seen on the screenshot below. This option will add a `DEFINE MEASURE` statement at the top of your DAX query, allowing you to easily modify the DAX expression of that measure within the scope of the query. + +![Dax Query Features](~/images/dax-query-features.png) + +In addition, a DAX query can contain multiple `EVALUATE` statements. When that is the case, Tabular Editor 3 displays the result from each such statement on a separate, numbered tab. If you only want to execute a single `EVALUATE` statement, even though your document contains multiple, you can place the cursor somewhere within the statement you want to execute, and then use the **Query > Execute selection** (SHIFT+F5) option. + +A DAX query in Tabular Editor 3 is automatically refreshed when a change is made to the model or a refresh operation finishes. You can toggle this auto-refresh capability within the **Query** menu. + +# Impersonation + +When querying the data in the model, it is sometimes useful to be able to impersonate a specific user or a combination of roles, to see what the behavior of the model from an end user perspective would be. Tabular Editor 3 allows you to impersonate a specific user or one or more roles, by clicking on the **Impersonate...** button. This applies to [Table previews](#previewing-table-data), [Pivot Grids](#pivot-grids) and [DAX queries](#dax-queries). + +> [!NOTE] +> To impersonate a user, Tabular Editor adds the [`EffectiveUserName` property](https://docs.microsoft.com/en-us/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#effectiveusername) to the connection string, when connecting to Analysis Services. To impersonate a role, Tabular Editor adds the [`Roles` property](https://docs.microsoft.com/en-us/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#roles) to the connection string. This only applies to the data view (i.e. the DAX query, the Pivot Grid or the Table Preview) where the impersonation is specified. + +When clicking on the **Impersonation..** button (which can also be found through the **Query**, **Pivot Grid** or **Table Preview** menu, depending on which type of data view is active), a popup allows you to specify either a user, or select one or more roles. + +![Select Impersonation](~/images/select-impersonation.png) + +Once the impersonation is enabled, the **Impersonation..** button is checked, and the impersonation will be applied to the current data view. By clicking on the small arrow next to the **Impersonation..** button, you can view and quickly switch between the 10 most recent impersonations used. + +![Impersonation Dropdown](~/images/impersonation-dropdown.png) + +When auto-refresh is enabled on a data view, changing the impersonation will immediately refresh the view. + +# VertiPaq Analyzer + +Tabular Editor 3 includes a version of the open-source [VertiPaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer/) tool, created by [SQLBI](https://sqlbi.com). VertiPaq Analyzer is useful to analyze VertiPaq storage structures for your Power BI or Tabular data model. + +With Tabular Editor 3, you can collect VertiPaq Analyzer statistics while you are connected to any instance of Analysis Services. You can also export the statistics as a [.vpax file](https://www.youtube.com/watch?v=zRa9y01Ub30), or import statistics from a .vpax file. + +To collect statistics, simply hit the **Collect stats** button in the **VertiPaq Analyzer** view. + +![Vertipaq Analyzer Collect Stats](~/images/vertipaq-analyzer-collect-stats.png) + +Once statistics are collected, VertiPaq Analyzer displays a summary of the model size, number of tables, etc. You can find more detailed statistics on the **Tables**, **Columns**, **Relationships** and **Partitions** tabs. + +Additionally, whenever statistics have been loaded, Tabular Editor 3 will display cardinality and size information as a tooltip when hovering the mouse cursor over objects in the TOM Explorer: + +![Vertipaq Analyzer Stats in TOM Explorer](~/images/vertipaq-analyzer-stats.png) + +...or when hovering the mouse cursor over object references in DAX expressions: + +![Vertipaq Analyzer Stats in a DAX expression](../images/vertipaq-analyzer-stats-dax.png) + +# Next steps + +- @creating-and-testing-dax \ No newline at end of file diff --git a/onboarding/ja-jp/ja-toc.md b/onboarding/ja-jp/ja-toc.md new file mode 100644 index 0000000..8f45f47 --- /dev/null +++ b/onboarding/ja-jp/ja-toc.md @@ -0,0 +1,18 @@ +# [Welcome](index.md) +# @general-introduction +## @installation-activation-basic +## @migrate-from-vs +## @migrate-from-desktop +## @migrate-from-te2 +# @parallel-development +## @optimizing-workflow-workspace-mode +## @powerbi-cicd +## @as-cicd +# @boosting-productivity-te3 +## @importing-tables-data-modeling +## @refresh-preview-query +## @creating-and-testing-dax +## @dax-script-introduction +## @bpa +## @cs-scripts-and-macros +## @personalizing-te3 \ No newline at end of file diff --git a/te2/Ja-jp/ja-Advanced-Filtering-of-the-Explorer-Tree.md b/te2/Ja-jp/ja-Advanced-Filtering-of-the-Explorer-Tree.md new file mode 100644 index 0000000..98f2756 --- /dev/null +++ b/te2/Ja-jp/ja-Advanced-Filtering-of-the-Explorer-Tree.md @@ -0,0 +1,87 @@ +# 高度なオブジェクトフィルタリング + +この記事では、複雑なモデルを操作する際に非常に便利な機能である、Tabular Editorの「フィルター」テキストボックスの使用方法について説明します。 + +## Filtering Mode + +[2.7.4](https://github.com/otykier/TabularEditor/releases/tag/2.7.4)より、Tabular Editorでは、階層内のオブジェクトにどのようにフィルターを適用するか、また検索結果をどのように表示するかを設定できるようになりました。これは、Filterボタンの隣にある3つの右端のツールバーボタンを使ってコントロールします。 + +![image](https://user-images.githubusercontent.com/8976200/46567931-08a4b480-c93d-11e8-96fd-e197e87a0587.png) + +* ![image](https://user-images.githubusercontent.com/8976200/46567944-44d81500-c93d-11e8-91e2-d9822078dba7.png) **Hierarchical by parent**: 検索は、_parent_オブジェクト、つまりテーブルとディスプレイフォルダ(これらが有効な場合)に適用されます。親アイテムが検索条件に一致すると、すべての子アイテムが表示されます。 +* ![image](https://user-images.githubusercontent.com/8976200/46567940-2ffb8180-c93d-11e8-9fba-84fbb79b6bb3.png) **Hierarchical by children**: この検索は、_child_オブジェクト(メジャー、カラム、階層など)に適用されます。親オブジェクトは、検索条件に一致する子オブジェクトを少なくとも1つ持っている場合にのみ表示されます。 +* ![image](https://user-images.githubusercontent.com/8976200/46567941-37bb2600-c93d-11e8-9c02-86502f41bce8.png) **Flat**: 検索はすべてのオブジェクトに適用され、結果はフラットなリストで表示されます。子項目を含むオブジェクトは、引き続き階層的に表示されます。 + +## 簡易検索 + +[Filter]テキストボックスに何かを入力して[Enter]を押すと、オブジェクト名の中で大文字と小文字を区別しないシンプルな検索が行われます。例えば、Filterテキストボックスに「sales」と入力し、「By Parent」フィルタリングモードを使用すると、次のような結果が得られます。 + +![image](https://user-images.githubusercontent.com/8976200/46568002-5f5ebe00-c93e-11e8-997b-7f89dfd92076.png) + +いずれかのテーブルを展開すると、そのテーブルのすべてのメジャー、列、階層、およびパーティションが表示されます。フィルタリングモードを「By Child」に変更すると、結果は次のようになります。 + +![image](https://user-images.githubusercontent.com/8976200/46568016-9f25a580-c93e-11e8-9bc2-c0a16a890256.png) + +[Employee」テーブルは、「sales」という単語を含むいくつかの子項目(この場合は列)を持っているため、リストに表示されていることに注目してください。 + +## ワイルドカード検索 + +テキストボックスに文字列を入力する際、ワイルドカードとして `?` を使用すると任意の1文字を、 `*` を使用すると任意の連続した文字(0文字以上)を表すことができます。しかし、`sales*`と入力すると、名前が "sales" という単語で始まるオブジェクトのみが表示されます(繰り返しますが、これは大文字と小文字を区別しません)。 + +Searching for `sales*` by parent: + +![image](https://user-images.githubusercontent.com/8976200/46568043-19eec080-c93f-11e8-8d81-2a6214bfa572.png) + +Searching for `sales*` by child: + +![image](https://user-images.githubusercontent.com/8976200/46568117-f9733600-c93f-11e8-96ab-f87769b8097c.png) + +フラット検索で `sales*` を検索(情報欄の切り替え [Ctrl]+[F1] で各オブジェクトの詳細情報が表示されます)。 + +![image](https://user-images.githubusercontent.com/8976200/46568118-042dcb00-c940-11e8-82d1-516207450559.png) + +ワイルドカードは文字列のどこにでも入れることができ、必要な数だけ入れることができます。これでもまだ複雑でないなら、続きを読んでください... + +## 動的なLINQ検索 + +[Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions) を使ってオブジェクトを検索することもできます。これは [Best Practice Analyzer rules](/Best-Practice-Analyzer) を作成するときに行うのと同じことです。フィルタボックスでDynamic LINQモードを有効にするには、検索文字列の前に `:` (コロン) を置くだけです。たとえば、名前が "Key" で終わるすべてのオブジェクトを表示するには、次のように記述します (大文字と小文字を区別します)。 + +``` +:Name.EndsWith("Key") +``` + +...そして[Enter]キーを押します。フラット」フィルタリングモードでは、以下のような結果になります。 + +![image](https://user-images.githubusercontent.com/8976200/46568130-33dcd300-c940-11e8-903c-193e1acde0ad.png) + +Dynamic LINQで大文字小文字を区別しない検索を行うには、以下のような方法で入力文字列を変換できます。 + +``` +:Name.ToUpper().EndsWith("KEY") +``` + +下のように、[StringComparison](https://docs.microsoft.com/en-us/dotnet/api/system.string.endswith?view=netframework-4.7.2#System_String_EndsWith_System_String_System_StringComparison_) という引数を与えることもできます。 + +``` +:Name.EndsWith("Key", StringComparison.InvariantCultureIgnoreCase) +``` + +検索対象はオブジェクトの名前に限定されるわけではありません。動的LINQ検索文字列は、オブジェクトのあらゆるプロパティ(およびサブプロパティ)を評価するために、好きなだけ複雑にできます。たとえば、"TODO "という単語を含む式を持つすべてのオブジェクトを検索したい場合、次のような検索フィルターを使用することになります。 + +``` +:Expression.ToUpper().Contains("TODO") +``` + +別の例として、以下では、他の何からも参照されていないモデル内のすべての非表示メジャーが表示されます。 + +``` +:ObjectType="Measure" and (IsHidden or Table.IsHidden) and ReferencedBy.Count=0 +```` + +また、正規表現を使うこともできます。以下は、名前に「Number」または「Amount」という単語が含まれるすべてのカラムを検索します。 + +``` +:ObjectType="Column" and RegEx.IsMatch(Name,"(Number)|(Amount)") +``` + +表示オプション(ツリーの真上にあるツールバーボタン)は、"By Parent" と "By Child" フィルタリングモードを使用した場合の結果に影響を与える可能性があることに注意してください。たとえば、上記のLINQフィルターは列のみを返しますが、表示オプションが現在、列を表示しないように設定されている場合、何も表示されません。 diff --git a/te2/Ja-jp/ja-Advanced-Scripting-and-Dynamic-LINQ-quiz.md b/te2/Ja-jp/ja-Advanced-Scripting-and-Dynamic-LINQ-quiz.md new file mode 100644 index 0000000..ca10281 --- /dev/null +++ b/te2/Ja-jp/ja-Advanced-Scripting-and-Dynamic-LINQ-quiz.md @@ -0,0 +1,100 @@ +# あなたはTabular Editorのプロですか? + +Tabular EditorのAdvanced ScriptingとDynamic LINQフィルター式についての知識をテストしてください。ここにある質問はすべて、たった1行のコードで答えられるかもしれません。 + +これらの機能をはじめて使う場合は、ここで紹介するソリューション(C#版とDynamic LINQ版の両方)に、これらの機能がどのように動作するかについて多くの有用な情報が掲載されていますので、ぜひチェックしてみてください。 + +*** + +#### Question #1) メジャーの総数 + +* モデルのメジャー数はどのように求めますか? + +
C# スクリプト ソリューション
Model.AllMeasures.Count().Output();
説明 Model オブジェクトは TOM tree のルートに相当します。API documentation にあるプロパティのほとんどをサポートし、Tabular Editor 内でのみ利用可能ないくつかの追加プロパティとメソッドを備えています。AllMeasures プロパティは、これらの追加プロパティの 1 つで、利便性を高めるために追加されました。これは、モデル内のすべてのテーブルにわたるすべてのメジャーのコレクションを返すだけです。すべてのコレクション (正確には enumerables) は、強力な .NET LINQ メソッド をサポートしています。Count() はそのようなメソッドの 1 つで、コレクション内の要素の数を単に整数値として返します。それが手に入れば、あとは Output() するだけです。

+ +
Dynamic LINQ solution +
:ObjectType="Measure"
説明: Filterテキストボックスの最初の文字として:'を置くと、動的LINQフィルタリングを有効にします。これが意味するところは、TabularエディターはTOMツリー内のすべてのオブジェクトに対して':'文字の後の式を評価し、式が真と評価されるオブジェクトのみを返すということです。Filterテキストボックスに上記の式を入れると、Tabular EditorはObjectTypeプロパティが「Measure」であるすべてのオブジェクトを表示するようになります。画面下部の検索結果数には、合計でいくつのメジャーがあるのかが表示されます。
+ +*** + +#### Question #2) 式に "TODO "を含むすべてのメジャーを検索する + +* Expression プロパティ内に "TODO" という単語を含むすべてのメジャーを検索する最も簡単な方法は何ですか? + +
C#スクリプトソリューション
Model.AllMeasures.Where(m => m.Expression.Contains("TODO")).Output();
説明:このスクリプトの最初の部分は質問1と同じものです。Where(x => y) は、いわゆる述語に基づいて先行するコレクションをフィルタリングする、もう一つの.NET LINQメソッドです。述語は、特別なC#ラムダ記法 x => y を使って表現されています。矢印の左側で、好きな名前の変数を宣言します。矢印の右側の式は、コレクション内のすべてのオブジェクトに対して評価され、左側の変数を使用して個々のオブジェクトを表します。この式は、ブーリアン値(真または偽)として評価される有効なC#式であれば、どのようなものでも使用できます。したがって、Whereメソッドは、ラムダ式が真と評価されるオブジェクトだけを返すように、コレクションを単純にフィルタリングします。したがって、上記の例では、モデルの個々のメジャーを表す変数の名前として m を使用することを決定しました。しかし、私たちは Expression プロパティが Contains である単語 "TODO" を持つメジャーだけを保持したいのです。理にかなっていますか?


+
+ +
ダイナミックLINQソリューション
:ObjectType="Measure" and Expression.Contains("TODO")
説明:このダイナミックLINQ式の最初の部分は、質問1と同じです。Dynamic LINQでは、andorなどのさまざまな演算子を使って、複雑なロジックを表現することができます。式の後半部分は、メジャーを表す変数を宣言していないことを除けば、上で使用したC#のLambda式と似ていることに注目してください。Dynamic LINQはTOMツリー内のすべてのオブジェクトに対して評価されるので、式にプロパティ名やメソッド名を追加すると、暗黙のうちに現在のオブジェクトに対して評価されることになります。オブジェクトの種類によってプロパティが異なるため、Filter ボックスに無効な式が含まれていてもエラーは発生しません。ただし、Best Practice Analyzer 内で Dynamic LINQ 式を記述する場合、選択したオブジェクト タイプに存在しないプロパティまたはメソッドにアクセスしようとすると、エラーが表示されるようになりました。 +
+ +*** + +#### Question #3) ダイレクトメジャー依存の数を数える + +* 現在選択されているメジャーを直接参照しているメジャーの数を知るにはどうしたらよいのでしょうか。"依存関係の表示" ダイアログに対して、いつでも答えを確認できます。 + +
C# スクリプト ソリューション
Selected.Measure.ReferencedBy.Measures.Count().Output();
説明: Selected.Measure は、エクスプローラ ツリーの現在選択中のメジャーを指します。DAX を通して参照できるすべてのオブジェクト (メジャー、テーブル、列、KPI) は、ReferencedBy プロパティを持ち、これは、前者を直接参照するオブジェクトの特別なコレクションです。LINQ メソッド .OfType<Measure>() を使用して、コレクションをメジャーだけに絞り込むこともできますが、この特定のコレクションには、これを実行する便利なプロパティのセットが含まれています。そのうちの 1 つが、Measures です。


このコレクションには、これを行う便利なプロパティが含まれています。 +
+ +
動的 LINQ ソリューション
:ObjectType="Measure" and DependsOn.Measures.Any(Name="Reseller Total Sales")
説明:現在の選択に基づいて動的 LINQ フィルター式を作成することができないため、代わりにこの例で特定のメジャーを考慮します、 [Reseller Total Sales] です。この例では、"Reseller Total Sales" という名前のメジャーに直接依存しているすべてのオブジェクトが返されます。ここで "ReferencedBy" の代わりに "DependsOn" を使用しているのは、検索フィルタ式がモデル内のすべてのオブジェクトに対して評価されるためです。これは、C# スクリプトで行っていることとは逆で、特定のメジャーに対するハンドルを既に持っており、そのメジャーを参照するメジャーのリストを取得する場合です。 +
+ +*** + +#### Question #4) メジャー依存の数を再帰的に数える + +* もっと深く考えてみましょう。現在選択されているメジャーに再帰的に依存するメジャーの数をどのように取得するのでしょうか。 + +
C# スクリプト ソリューション
Selected.Measure.ReferencedBy.Deep().OfType<Measure>().Count().Output();
ここで、依存関係ツリーを再帰的にトラバースし、直接または他のオブジェクトを介して間接的に元のメジャーを参照するすべてのオブジェクトのコレクションを取得する Deep() メソッドを追加しました。計算された列や RLS 式などが表示されないように、このコレクションを手動で "メジャー" タイプのオブジェクトにフィルタリングする必要があります。

ところで、カウントだけでなく、これらのメジャーのリストを表示したい場合は、次のように記述できます。 +
Selected.Measure.ReferencedBy.Deep().OfType().Output();
Selection.Measure.ReferencedBy.Deep().Output();
+
+
+ +
+動的 LINQ ソリューション
:ObjectType="Measure" and DependsOn.Deep().Any(Name="Reseller Total Sales")
説明: C# を使用して呼び出すことができるすべてのメソッドは、動的 LINQ を使用して呼び出される可能性もあります。つまり、上で行ったように、Deep()メソッドを呼び出して依存関係ツリーを上方に再帰的に走査し、「Reseller Total Sales」という名前のオブジェクトに依存関係を持つすべてのオブジェクトを見つけます。厳密に言うと、これは上記の C# 式と全く同じではありません。なぜなら、"Reseller Total Sales" という名前の非メジャー型オブジェクトも正にヒットしてしまうからです。これを回避するには、メジャーのみを考慮することを明示的に記述するか...
:DependsOn.Deep().Any(Name="Reseller Total Sales" and ObjectType="Measure")
...を使用するか。または、DaxObjectFullName プロパティを使用してヒットを確認できます (列名は完全修飾され、メジャーはモデル全体で一意に命名される必要があります):
:DependsOn.Deep().Any(DaxObjectFullName="[Reseller Total Sales]")
+
+ +*** + +#### Question #5) 関連するディメンジョンをすべてリストアップ + +* ファクト・テーブル`'Reseller Sales'`がある場合、関連するすべてのディメンジョン・テーブルのリストを取得するにはどうすればよいですか? + +
C# script solution +
var t = Model.Tables["Reseller Sales"];
+t.UsedInRelationships.Where(r => r.FromTable == t).Select(r => r.ToTable).Output();
+説明: さて、これは少しトリッキーであり、与えられたテーブルを保持するために変数を使用したため、1 行ではなく 2 行のコードで終わっていることを認めます。素朴なアプローチは、単に t.RelatedTables.Output(); と書くことですが、質問では関連する dimension テーブルのみを出力するように明確に尋ねられたため、与えられたテーブルが「From」側にあるそれらの関係のみを考慮する必要があります。これが t.UsedInRelationships.Where(r => r.FromTable == t) の目的です。しかし、これらのリレーションシップが指すテーブルのリストが欲しいので、各リレーションシップの`ToTable`プロパティを取得するために、このリストを投影する必要があります。これはまさに .Select(r => r.ToTable) が行うことです。お分かりいただけたでしょうか?では、以下のDynamic LINQソリューションをご覧ください。

+ +
Dynamic LINQ solution +
:UsedInRelationships.Any(ToTable=current and FromTable.Name = "Reseller Sales")
+Explanation: この式は、モデル内のすべてのオブジェクトに対して評価されることを念頭に置いて、左から右へと読んでいきましょう。UsedInRelationships は、現在のオブジェクトが参加しているリレーションシップのリストです。この時点で、テーブルやカラムオブジェクトでないものは除外しました。なぜなら、これらはUsedInRelationshipsプロパティを持つ唯一のものだからです。ディメンジョン・テーブルでないものをフィルタリングするために、問題のテーブルから 現在のオブジェクトへの指し示す関係のみを考慮したいと思います。.Any( ... ) は、少なくとも1つのリレーションシップが条件を満たしていれば、trueと評価されます。ToTable=current and FromTable.Name = "Reseller Total Sales" という条件を満たす場合、真と評価されます。特別なキーワードcurrentは、評価されている現在のオブジェクトを指します。我々はこれをリレーションシップのToTableプロパティと同一視しているため、このプロパティはテーブル型のみであるため、検索結果から列を除外しているのです。FromTable.Name = ... は自明です。 +
+ +*** + +#### Question #6) 名前に "Total "と "Amount "が含まれるオブジェクトをすべて探す + +![image](https://user-images.githubusercontent.com/8976200/44931220-c2dd4680-ad15-11e8-9e52-29ec07f1edb6.png) + +Hint: そのための正規表現は次のようになります。 `Total.*Amount` + +
C# script solution +
Model.AllMeasures.Where(m => System.Text.RegularExpressions.Regex.IsMatch(m.Name, "Total.*Amount")).Output();
+Explanation: これは、Advanced Scriptタブで行うには、実はかなり面倒です。厳密に言うと、1 つのビューですべてを表示する場合、実際にはすべてのコレクション (Tables, AllMeasures, AllColumns, AllHierarchies, ...) を検索して、その結果を連結する必要があります。さらに、System.Text.RegularExpressions 名前空間はデフォルトでスコープ内にないため、このスクリプトはそれほどタイピングに適したものではありません。代わりに Dynamic LINQ ソリューションをチェックアウトしてください。
+ +
Dynamic LINQ solution +
:Regex.IsMatch(Name, "Total.*Amount")
+きれいでしょう? +
+ +*** + +#### Question #7) 6と同じですが、大文字・小文字を区別して検索します。 + +
C# script solution +
Model.AllMeasures.Where(m => System.Text.RegularExpressions.Regex.IsMatch(m.Name, "Total.*Amount", RegexOptions.IgnoreCase)).Output();
+ +
Dynamic LINQ solution +
:Regex.IsMatch(Name, "Total.*Amount", "IgnoreCase")
+ +#### 今後もご期待ください diff --git a/te2/Ja-jp/ja-Advanced-Scripting.md b/te2/Ja-jp/ja-Advanced-Scripting.md new file mode 100644 index 0000000..dae6426 --- /dev/null +++ b/te2/Ja-jp/ja-Advanced-Scripting.md @@ -0,0 +1,243 @@ +# アドバンスト・スクリプティング + +本書は、Tabular EditorのAdvanced Scripting機能の紹介です。このドキュメントの情報は変更される可能性があります。また、[Useful script snippets](/Useful-script-snippets) の記事で、Tabular Editorのスクリプト機能を使ってできることの実例をいくつか紹介していますので、ぜひご覧ください。 + +## アドバンスト・スクリプティングとは? + +Tabular EditorのUIの目標は、Tabularモデルの構築時に一般的に必要とされるほとんどのタスクを簡単に実行できるようにすることです。たとえば、複数のメジャーの表示フォルダーを一度に変更するには、エクスプローラー・ツリーでオブジェクトを選択し、ドラッグ・アンド・ドロップすればよいだけです。エクスプローラツリーの右クリックによるコンテキストメニューでは、パースペクティブからのオブジェクトの追加/削除、複数のオブジェクトの名前変更など、多くの作業を便利に行うことができます。 + +しかし、その他の一般的なワークフロータスクは、UIから簡単に実行できないものも多くあります。このため、Tabular Editorは上級ユーザーがC#シンタックスを使用してスクリプトを書き、ロードされたTabularモデル内のオブジェクトをより直接的に操作できるようにする、高度なスクリプトを導入しています。 + +## オブジェクト + +スクリプティング [API](xref:api-index) は `Model` と `Selected` という二つのトップレベルオブジェクトへのアクセスを提供します。前者は Tabular モデル内のすべてのオブジェクトを操作するためのメソッドとプロパティを含んでおり、後者はエクスプローラツリーで現在選択されているオブジェクトのみを公開します。 + +`Model` オブジェクトは [Microsoft.AnalysisServices.Tabular.Model](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.model.aspx) クラスのラッパーで、そのプロパティのサブセットを公開し、トランスレーション、パースペクティブ、オブジェクトコレクションを簡単に操作するためのいくつかのメソッドとプロパティが追加されています。同じことが、Table、Measure、Column などの子孫オブジェクトにもあてはまり、これらはすべて対応するラッパーオブジェクトを持っています。タブラー・エディター・ラッパー・ライブラリーのオブジェクト、プロパティ、メソッドの完全なリストについては、をご覧ください。 + +このラッパーで作業する主な利点は、すべての変更がタブラーエディターのUIから元に戻せることです。スクリプトを実行した後、CTRL+Zを押すだけで、そのスクリプトによって行われたすべての変更が即座に取り消されるのがわかります。さらに、このラッパーは、多くの一般的なタスクをシンプルなワンライナーに変える便利なメソッドを提供します。以下に、いくつかの例を紹介します。読者はすでにC#とLINQにある程度慣れていることが前提です。なぜなら、Tabular Editorsのスクリプト機能のこれらの側面はここではカバーされないからです。C#やLINQに慣れていない方でも、以下の例にはついていけるはずです。 + +## オブジェクトのプロパティを設定する + +あるオブジェクトのプロパティを変更したい場合、当然ながらUIから直接行うのが最も簡単な方法でしょう。しかし、例として、スクリプトを使用して同じことを実現する方法を見てみましょう。 + +'FactInternetSales' テーブルの[Sales Amount]メジャーのFormat Stringを変更する必要があるとします。エクスプローラー・ツリーでメジャーを見つけると、それをスクリプト・エディターにドラッグするだけでよいのです。すると、Tabular Editorによって以下のコードが生成され、Tabularオブジェクト・モデルでこの特定のメジャーを表します。 + +```csharp +Model.Tables["FactInternetSales"].Measures["Sales Amount"] +``` + +右端の括弧の後にドット (.) を追加すると、オートコンプリート・メニューがポップアップ表示され、この特定のメジャーに存在するプロパティおよびメソッドが表示されるはずです。メニューから[フォーマット文字列]を選択するか、または最初の数文字を入力してTabキーを押します。それから、等号の後に「0.0%」を入力します。このメジャーの表示フォルダーも変更します。最終的なコードは以下のようになります。 + +```csharp +Model.Tables["FactInternetSales"].Measures["Sales Amount"].FormatString = "0.0%"; +Model.Tables["FactInternetSales"].Measures["Sales Amount"].DisplayFolder = "New Folder"; +``` + +**注意:** 各行の最後にセミコロン(;)を付けることを忘れないでください。これはC#の要求事項です。これを忘れると、スクリプトを実行しようとしたときに構文エラーメッセージが表示されます。 + +F5キーを押すか、スクリプトエディターの上にある「Play」ボタンを押すと、スクリプトが実行されます。すぐに、エクスプローラツリー内でメジャーが移動し、変更された表示フォルダーが確認できるはずです。Property Gridでメジャーを確認すると、Format String プロパティがそれに応じて変更されていることも確認できるはずです。 + +### 複数のオブジェクトを一度に操作する + +オブジェクト・モデルの多くのオブジェクトは、実際には複数のオブジェクトのコレクションです。たとえば、各テーブル・オブジェクトはMeasuresコレクションを持っています。ラッパーは、これらのコレクションに一連の便利なプロパティとメソッドを公開し、一度に複数のオブジェクトに同じプロパティを簡単に設定できるようにします。これについては、以下で詳しく説明します。さらに、標準的なLINQ拡張メソッドをすべて使用して、コレクション内のオブジェクトをフィルタリングしたりブラウズしたりできます。 + +以下は、もっともよく使われるLINQ拡張メソッドの例です。 + +* `Collection.First([predicate])` オプションの[predicate]条件を満たす、コレクション内の最初のオブジェクトを返します。 +* `Collection.Any([predicate])` コレクションが何らかのオブジェクト(オプションで [predicate]条件を満たす)を含んでいれば真を返します。 +* `Collection.Where([predicate])` コレクション内の任意のオブジェクトを返します。Where(predicate)` 述語の条件でフィルタリングされたオリジナルのコレクションを返す +* `Collection.Select(map)` 指定されたマップにしたがって、コレクション内の各オブジェクトを別のオブジェクトにプロジェクションする +* `Collection.ForEach(action)` コレクション内の各要素に対して指定されたアクションを実行する。 +* `Collection.ForEach(action)` コレクション内の各要素に対して指定されたアクションを実行する。 + +上記の例で、`predicate` はラムダ式であり、入力として1つのオブジェクトを受け取り、出力としてブール値を返す。たとえば、 `Collection` がメジャーのコレクションである場合、典型的な `predicate` は以下のようになります。 + +m => m.Name.Contains("Reseller")` となります。 + +この述語は、メジャーのNameに文字列 "Reseller" が含まれている場合にのみ、trueを返します。より高度なロジックが必要な場合は、中括弧で式を囲み、`return` キーワードを使用します。 + +```csharp +.Where(obj => { + if(obj is Column) { + return false; + } + return obj.Name.Contains("test"); +}) +``` + +上の例に戻ると、 `map` はラムダ式で、入力としてオブジェクトを受け取り、出力として任意のオブジェクトを返します。action` はラムダ式で、1つのオブジェクトを入力として受け取り、値は返しません。 + +他にどのようなLINQメソッドがあるかは、アドバンストスクリプトエディターのインテリセンス機能を使うか、あるいは [LINQ-to-Objects documentation](https://msdn.microsoft.com/en-us/library/9eekhta0.aspx) を参照してください。 + +## **モデル**オブジェクトの操作 + +現在ロードされているTabular Modelの任意のオブジェクトを素早く参照するには、エクスプローラツリーからAdvanced Scriptingエディターにオブジェクトをドラッグ&ドロップします。 + +![Dragging and dropping an object into the Advanced Scripting editor](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/DragDropTOM.gif) + +モデルやその子孫オブジェクトにどのようなプロパティが存在するかの概要については、[TOM documentation](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.model.aspx)を参照してください。さらに、ラッパーオブジェクトによって公開されるプロパティとメソッドの完全なリストについては、を参照してください。 + +## **選択された**オブジェクトを操作する + +しかし、時にはエクスプローラツリーからオブジェクトを選択し、選択されたオブジェクトのみに対してスクリプトを実行したい場合があります。このような場合に `Selected` オブジェクトが役に立ちます。 + +Selected` オブジェクトは、現在選択されているオブジェクトを簡単に識別するためのプロパティを提供し、また、特定のタイプのオブジェクトに選択を限定できます。フォルダーを表示してブラウジングしているときに、エクスプローラツリーで1つ以上のフォルダーが選択されていると、その子項目もすべて選択されているとみなされます。 単一選択の場合は、アクセスしたいオブジェクトのタイプの単数名を使用します。たとえば + +`Selected.Hierarchy` とします。 + +は、ツリーで現在選択されている階層を指します。ただし、選択されている階層は1つだけです。複数選択されている場合は、複数の型名を使用できます。 + +`Selected.Hierarchies` となります。 + +単数形のオブジェクトに存在するすべてのプロパティは、いくつかの例外を除いて、複数形のオブジェクトにも存在します。つまり、上記のLINQ拡張メソッドを使わずに、1行のコードで複数のオブジェクトに対して一度にこれらのプロパティの値を設定することができるのです。たとえば、現在選択されているすべてのメジャーを「Test」という名前の新しい表示フォルダーに移動したいとします。 + +たとえば、現在選択されているすべてのメジャーを「Test」という新しい表示フォルダーに移動したいとします。 + +ツリーで現在選択されているメジャーがない場合、上記のコードは何も行わず、エラーも発生しません。そうでない場合は、選択されたすべてのメジャー (フォルダー内のメジャーも含む。`Selected` オブジェクトには選択されたフォルダー内のオブジェクトも含まれるため)のDisplayFolderプロパティが "Test" に設定されます。Measures` の代わりに単数形の `Measure` を使用すると、現在の選択範囲に正確に1つのメジャーが含まれていない限り、エラーになります。 + +複数のオブジェクトのNameプロパティを一度に設定することはできませんが、まだいくつかのオプションがあります。ある文字列の出現箇所をすべて別の文字列に置き換えるだけなら、 提供されている「âuRename」メソッドを使用できます。 + +```csharp +Selected.Measures + .Rename("Amount", "Value"); +``` + +これにより、現在選択されているすべてのメジャーの名前に出現する「金額」という単語が「値」に置き換えられます。 また、上記のようにLINQ ForEach() メソッドを使用して、より高度なロジックを組み込むことも可能です。 + +```csharp +Selected.Measures + .ForEach(m => if(m.Name.Contains("Reseller")) m.Name += " DEPRECATED"); +``` + +この例では、選択されたすべてのメジャーの名前に、名前に "Reseller" という単語が含まれている場合は、" DEPRECATED" というテキストが追加されます。別の方法として、LINQ 拡張メソッド `Where()` を使用して、`ForEach()` オペレーションを適用する前にコレクションをフィルタリングすることもでき、まったく同じ結果を得ることができます。 + +```csharp +Selected.Measures + .Where(m => m.Name.Contains("Reseller")) + .ForEach(m => m.Name += " DEPRECATED"); +``` + +## ヘルパーメソッド + +スクリプトのデバッグを容易にするため、Tabular Editorは特別なヘルパーメソッドのセットを提供します。内部的には、これらは `[ScriptMethod]`-attributeで装飾された静的メソッドです。この属性によって、スクリプトは名前空間やクラス名を指定することなく、直接メソッドを呼び出すことができます。プラグインも `[ScriptMethod]` 属性を用いて、同様の方法でスクリプト用のパブリックな静的メソッドを公開することができる。 + +2.7.4以降、Tabular Editorは以下のスクリプトメソッドを提供します。これらのいくつかは拡張メソッドとして呼び出すことができることに注意してください。たとえば、`object.Output();` と `Output(object);` は等価です。 + +* `Output(object);`は、スクリプトの実行を停止し、指定されたオブジェクトに関する情報を表示します。スクリプトがコマンドライン実行の一部として実行されている場合、これはコンソールにオブジェクトの文字列表現を書き込みます。 +* `SaveFile(filePath, content);` - convenient way to save text data to a file. +* `ReadFile(filePath);` - ファイルからテキストデータを読み込む便利な方法です。 +* `ExportProperties(objects, properties);` - 複数のオブジェクトから一連のプロパティをTSV文字列としてエクスポートする便利な方法です。 +* `ImportProperties(tsvData);` - TSV文字列から複数のオブジェクトにプロパティをロードする便利な方法です。 +* `CustomAction(name);` - カスタムアクションを名前で呼び出す。 +* `CustomAction(objects, name);` - 指定されたオブジェクトに対してカスタムアクションを実行します。 +* `ConvertDax(dax, useSemicolons);` - は、US/UKとnon-US/UKのロケール間でDAX式を変換します。`useSemicolons` がtrue(デフォルト)の場合、 `dax` 文字列はネイティブのUS/UKフォーマットからnon-US/UKフォーマットに変換される。つまり、カンマ (リストセパレーター) はセミコロンに、ピリオド (小数点以下のセパレーター) はカンマに変換されます。UseSemicolons` がfalseに設定されている場合は、その逆となる。 +* ~~`FormatDax(string dax);`~~ - www.daxformatter.com を使ってDAX式をフォーマットする (非推奨。使わないでください!) +* `FormatDax(IEnumerable objects, bool shortFormat, bool? skipSpace)` - 指定されたコレクション内のすべてのオブジェクトに対してDAX式をフォーマットします。 +* `FormatDax(IDaxDependantObject obj)` - スクリプトの実行が完了したとき、あるいは `CallDaxFormatter` メソッドが呼ばれたときに、DAX 式のフォーマット用にオブジェクトをキューに入れます。 * `CallDaxFormatter(bool shortFormat, bool? skipSpace)` - これまでにキューに入っているすべてのDAX式をフォーマットする。 +* `Info(string);` - コンソールに情報メッセージを書き込みます(スクリプトがコマンドライン実行の一部として実行された場合のみ)。 +* `Warning(string);` - コンソールに警告メッセージを書き込みます(スクリプトがコマンドライン実行の一部として実行された場合のみ)。 +* `Error(string);` - コンソールにエラーメッセージを書き込みます(スクリプトがコマンドライン実行の一部として実行された場合のみ)。 + +### デバッグ用スクリプト + +前述のように、`Output(object);` メソッドを使うと、スクリプトの実行を一時停止し、渡されたオブジェクトに関する情報を表示するダイアログボックスを開くことができます。また、このメソッドを拡張メソッドとして、`object.Output();`として呼び出すこともできます。ダイアログが閉じられると、スクリプトは再開されます。 + +ダイアログは、出力されるオブジェクトの種類によって、4つの異なる方法のうちの1つが表示されます。 + +* 特異なオブジェクト(文字列、int、DateTimesなど、TabularNamedObjectから派生したオブジェクトは除く)は、オブジェクトの `.ToString()` メソッドを呼び出すことで、シンプルなメッセージダイアログとして表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/29941982-9917d0cc-8e94-11e7-9e78-24aaf11fd311.png) + +* 特異なTabularNamedObject(Table、Measure、またはTabular Editorで利用可能なその他のTOM NamedMetadataObjectなど)は、Tree Explorerでオブジェクトが選択されたときと同様にProperty Gridに表示される。オブジェクトのプロパティはグリッドで編集できるが、スクリプト実行の後の時点でエラーが発生した場合、"Rollback on error" が有効になっていれば、編集は自動で元に戻されることは注意。 + +![image](https://user-images.githubusercontent.com/8976200/29941852-2acc9846-8e94-11e7-9380-f84fef26a78c.png) + +* オブジェクトの任意のIEnumerable(TabularNamedObjectsを除く)はリストに表示され、各リストアイテムはIEnumerable内のオブジェクトの `.ToString()` 値とタイプを表示します。 + +![image](https://user-images.githubusercontent.com/8976200/29942113-02dad928-8e95-11e7-9c04-5bb87b396f3f.png) + +* TabularNamedObjectsのIEnumerableはダイアログの左側にオブジェクトのリストを表示し、右側にProperty Gridを表示します。Property Gridはリストで選択されたオブジェクトから入力され、単一のTabularNamedObjectが出力されているときと同様にプロパティを編集できます。 + +![image](https://user-images.githubusercontent.com/8976200/29942190-498cbb5c-8e95-11e7-8455-32750767cf13.png) + +左下にある "Don't show more outputs" チェックボックスをチェックすると、それ以上 `.Output()` を呼び出したときにスクリプトが停止するのを防ぐことができます。 + +## .NETリファレンス + +[Tabular Editor version 2.8.6](https://github.com/otykier/TabularEditor/tree/2.8.6) では、複雑なスクリプトを書くのがとても簡単になりました。新しいプリプロセッサのおかげで、通常のC#ソースコードのように、`using`キーワードを使ってクラス名などを短縮できるようになりました。さらに、Azure Functions で使用する .csx スクリプトと同様に、`#r "<アセンブリ名または DLL パス>"` という構文を使用して、外部アセンブリをインクルードできます。 + +たとえば、以下のスクリプトは期待通りの動作をするようになりました。 + +```csharp +// Assembly references must be at the very top of the file: +#r "System.IO.Compression" + +// Using keywords must come before any other statements: +using System.IO.Compression; +using System.IO; + +var xyz = 123; + +// Using statements still work the way they're supposed to: +using(var data = new MemoryStream()) +using(var zip = new ZipArchive(data, ZipArchiveMode.Create)) +{ + // ... +} +``` + +Tabular Editorはデフォルトで以下の`using`キーワードを適用し、(スクリプトで指定されていなくても)一般的なタスクを簡単に行えるようにします。 + +```csharp +using System; +using System.Linq; +using System.Collections.Generic; +using Newtonsoft.Json; +using TabularEditor.TOMWrapper; +using TabularEditor.TOMWrapper.Utils; +using TabularEditor.UI; +``` + +In addition, the following .NET Framework assemblies are loaded by default: + +- System.Dll +- System.Core.Dll +- System.Data.Dll +- System.Windows.Forms.Dll +- Microsoft.Csharp.Dll +- Newtonsoft.Json.Dll +- TomWrapper.Dll +- TabularEditor.Exe +- Microsoft.AnalysisServices.Tabular.Dll + +## Compiling with Roslyn + +Visual Studio 2017で導入された新しいRoslynコンパイラーを使用してスクリプトをコンパイルしたい場合は、Tabular Editorバージョン2.12.2から、ファイル > プリファレンス > 一般で設定できます。これにより、文字列補間など、より新しいC#言語の機能を利用できます。コンパイラの実行ファイル(`csc.exe`)を格納するディレクトリのパスを指定し、コンパイラのオプションとして言語バージョンを指定するだけで、簡単に設定できます。 + +![image](https://user-images.githubusercontent.com/8976200/92464140-0902f580-f1cd-11ea-998a-b6ecce57b399.png) + +### Visual Studio 2017 + +一般的なVisual Studio 2017 Enterpriseのインストールでは、Roslynコンパイラはここに配置されています。 + +``` +c:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Roslyn +``` + +これには、C# 6.0の言語機能がデフォルトで含まれています。 + +![image](https://user-images.githubusercontent.com/8976200/92464584-a52cfc80-f1cd-11ea-9b66-3b47ac36f6c6.png) + +### Visual Studio 2019 + +一般的な Visual Studio 2019 Community インストールの場合、Roslyn コンパイラはここにあります。 + +``` +c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn +``` + +VS2019に同梱されているコンパイラは、C#8.0の言語機能をサポートしており、コンパイラオプションとして以下を指定することで有効にができます。 + +``` +-langversion:8.0 +``` diff --git a/te2/Ja-jp/ja-Advanced-features.md b/te2/Ja-jp/ja-Advanced-features.md new file mode 100644 index 0000000..327b2cd --- /dev/null +++ b/te2/Ja-jp/ja-Advanced-features.md @@ -0,0 +1,115 @@ +# 高度な機能 + +[機能一覧](/Features-at-a-glance)の記事で紹介した機能に加えて、Tabular Editorは高度な使い方のために以下の機能をサポートしています。 + +## テーブルの置き換え + +バージョン2.7から、テーブルを置き換えられるようになりました。テーブルをコピー(CTRL+C)し、置き換えたいテーブルを選択してからペースト(CTRL+V)します。テーブルを本当に置き換えるのか(「はい」)、新しいテーブルとして挿入するのか(「いいえ」)、または操作を完全にキャンセルするのかを確認するプロンプトが表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/36545892-40983114-17ea-11e8-8825-e8de6fd4e284.png) + +Yesを選択すると、選択したテーブルがクリップボード内のテーブルと置換されます。さらに、そのテーブルを指す、またはテーブルから指すすべてのリレーションシップは、新しいテーブルを使用するように更新されます。この操作を行うには、リレーションシップに含まれるカラムが、元のテーブルと挿入されたテーブルの両方で同じ名前とデータ型を持っている必要があります。 + +## ロールと行レベルのセキュリティ + +バージョン2.1では、エクスプローラツリーにロールが表示されるようになりました。ツリーを右クリックして、新しいロールの作成、既存のロールの削除や複製を行うことができます。エクスプローラツリーでロールを見つけ、プロパティグリッドの「Role Members」プロパティに移動すると、各ロールのメンバーを表示および編集できます。デプロイ時に、[デプロイウィザード](/Advanced-features#deployment-wizard)はデフォルトでロールメンバーをデプロイしないので注意してください。 + +Tabular Editorでロールを扱う最大の利点は、各テーブルオブジェクトに「Row Level Filters」プロパティがあり、すべてのロールに対してそのテーブルで定義されたフィルターを表示および編集できることです。 + +![](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/RLSTableContext.png) + +もちろん、SSMSやVisual StudioのUIと同様に、ある特定のロールの全テーブルに渡ってフィルターを表示することも可能です。 + +![](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/RLSRoleContext.png) + +## テーブル・パーティションを表示 + +TODO + +## DAX式エディター + +TODO + +## スクリプトエディター + +TODO (For now, please view [this article](/Advanced-Scripting)) + +## スクリプト/オブジェクトの参照 + +ドラッグ&ドロップ機能を使用し、以下の方法でオブジェクトをスクリプト出力できます。 + +* 1つまたは複数のオブジェクトを別のWindowsアプリケーション(テキストエディターまたはSSMS)にドラッグする ドラッグされたオブジェクトを表すJSONコードが作成されます。モデル・ノード、テーブル、ロール、またはデータ・ソースをドラッグすると、"createOrReplace" スクリプトが作成されます。 + +* オブジェクト(メジャー、列、テーブル)をDAX式エディターにドラッグすると、該当するオブジェクトへの完全修飾されたDAX参照が挿入されます。 + +* オブジェクトをAdvanced Script Editorにドラッグすると、TOMツリーを介してオブジェクトにアクセスするC#コードが挿入されます。 + +## デプロイメントウィザード + +Tabular Editorにはデプロイメントウィザードがあり、SSDTからデプロイする場合と比較して、既存のデータベースにデプロイする場合の利点があります。デプロイ先のサーバーとデータベースを選択した後、手元のデプロイ用に以下のオプションが用意されています。 + +[デプロイメントウィザード](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/Deployment.png) + +Deployment Connectionsボックスをオフにすると、ターゲットデータベース上のすべてのデータソースが変更されないことを確認します。ターゲットデータベースに存在しないデータソースを持つテーブルがモデルに含まれている場合、エラーが発生します。 + +同様に、"Deploy Table Partitions "を省略すると、テーブル上の既存のパーティションが変更されず、パーティション内のデータはそのまま残されます。 + +ロールのデプロイにチェックを入れると、ターゲットデータベース内のロールはロードしたモデルの内容を反映して更新されますが、"ロールメンバーのデプロイ "にチェックを入れないと、各ロールのメンバーはターゲットデータベース内で変更されません。 + +## メタデータバックアップ + +ご希望により、Tabular Editorは保存(既存のデータベースに接続されている場合)またはデプロイの前に、既存のモデルメタデータのバックアップコピーを自動的に保存できます。これはバージョンコントロールシステムを使用していない場合でも、モデルの以前のバージョンにロールバックする必要がある場合に便利です。 + +この設定を有効にするには、"File" > "Preferences" でチェックボックスを有効にし、メタデータのバックアップを格納するフォルダーを選択します。 + + + +この設定を有効にすると、デプロイメントウィザードを使用したとき、または(ワークスペースの)データベース接続中に「保存」ボタンをクリックしたときに、既存のモデルのメタデータの圧縮(zip)バージョンがこの場所に保存されます。 + +## 式の修正と式の依存関係 + +Tabular Editorは、モデル内のすべてのメジャー、計算カラム、および計算テーブルのDAX式を継続的に解析し、これらのオブジェクトの依存関係ツリーを構築します。この依存関係ツリーは、"File" > "Preferences" で有効にすることができるFormula Fix-up機能に使用されます。式で参照されていたオブジェクトの名前が変更されると、Formula Fix-upによってメジャー、計算カラム、または計算テーブルのDAX式が自動的に更新されます。 + +依存関係ツリーを可視化するには、エクスプローラツリーでオブジェクトを右クリックし、"依存関係を表示... "を選択します。 + +![image](https://cloud.githubusercontent.com/assets/8976200/22482528/b37d27e2-e7f9-11e6-8b89-c503f9fffcac.png) + +## インポート/エクスポート翻訳 + +エクスプローラツリーで1つまたは複数のカルチャーを選択し、右クリックして「Export Translations...」を選択すると後でTabular EditorまたはVisual Studioでインポート可能な.jsonファイルが生成されます。Import Translations...」を選択すると、対応する.jsonファイルがインポートされます。既存の翻訳を上書きするかどうかを選択できます。上書きしない場合、.jsonファイルで定義された翻訳は、指定されたカルチャーの翻訳をまだ持っていないオブジェクトにのみ適用されます。 + +## フォルダーシリアル化 + +この機能により、TFS、SubVersion、Gitなどのファイルベースのソース管理環境で、SSAS Tabular Modelsをより簡単に統合できます。File" > "Save to Folder... "を選択すると、Tabular EditorはModel.bimファイルを分解し、その内容をModel.bim内のJSONの構造に似たフォルダー構造で個別のファイルとして保存します。その後モデルを保存する際、変更されたメタデータを持つファイルのみが扱われます。つまり、ほとんどのバージョン管理システムはモデルに対して行われた変更を簡単に検出でき、単一のModel.bimファイルを扱う場合よりもソースのマージやコンフリクト処理がずっと簡単になるのです。 + +![image](https://cloud.githubusercontent.com/assets/8976200/22483167/5e07ad52-e7fc-11e6-890f-5c0d20fff0cb.png) + +デフォルトでは、オブジェクトはもっとも低いオブジェクト・レベルまでシリアライズされます(つまり、メジャー、カラム、および階層は個別の .jsonファイルとして保存されます)。 + +さらに、Tabular Editorの[コマンドライン構文](xref:command-line-options)は、このフォルダー構造からモデルをロードしてデータベースに直接デプロイすることをサポートしており、継続的インテグレーションワークフローのためのビルドを簡単に自動化できるようになっています。 + +メタデータが個々のファイルに保存される粒度をカスタマイズしたい場合は、「ファイル」→「環境設定」で「フォルダーに保存」タブをクリックします。ここでは、JSONシリアライズする際TOMに渡されるいくつかのシリアライズ・オプションを切り替えることができる。さらに、個々のファイルが生成されるオブジェクトの種類をチェックしたり外したりすることもできます。バージョン管理のシナリオでは、1つのテーブルに関連するすべてを1つのファイルに保存したい場合がありますが、他のシナリオでは、カラムやメジャーに個別のファイルが必要な場合となります。 + +これらの設定は、「フォルダーに保存」機能をはじめて使用したときに、モデル上のアノテーションに保存され、モデルを読み込んでから「保存」ボタンをクリックしたときに設定が再利用されます。新しい設定を適用したい場合は、再度「ファイル > フォルダーに保存...」を使用してください。 + + + +## ユーザー設定ファイル + +Tabular Editorを実行すると、いくつかの追加ファイルがディスクの様々な場所に書き込まれます。以下は、これらのファイルの説明とその内容です。 + +### In %ProgramData%\TabularEditor + +- **BPARules.json** すべてのユーザーが利用できるベストプラクティス・アナライザーのルール。 +- **TOMWrapper.dll** このファイルはTabular Editor内でスクリプトを実行する際に使用されます。また、あなたの.NETプロジェクトで.dllを参照し、ラッパーコードを利用できます。Tabular Editorをアップグレードした後、高度なスクリプトの実行に問題がある場合、このファイルを削除してTabular Editorを再起動してください。 + +- **Preferences.json** このファイルには、"ファイル">"環境設定 "ダイアログで設定したすべての環境設定が保存されます。 + +### In %AppData%\Local\TabularEditor + +- **BPARules.json** 現在のユーザーのみが利用できるベストプラクティス・アナライザーのルール。 +- **CustomActions.json** エクスプローラツリーの右クリックメニューやツールメニューから呼び出すことができる、カスタムスクリプトアクションです。これらのアクションは、「アドバンスト・スクリプト・エディター」タブで作成できます。 + +- **RecentFiles.json** 最近開いた.bimファイルのリストを保存する。このリストの直近の10項目は、「ファイル」→「最近使ったファイル」メニューに表示されます。 + +- **RecentServers.json** 最近開いた.bimファイルのリストを保存する。このリストの直近の10項目は、「ファイル」→「最近使ったファイル」メニューに表示されます。 diff --git a/te2/Ja-jp/ja-Best-Practice-Analyzer-Improvements.md b/te2/Ja-jp/ja-Best-Practice-Analyzer-Improvements.md new file mode 100644 index 0000000..0ca9fb5 --- /dev/null +++ b/te2/Ja-jp/ja-Best-Practice-Analyzer-Improvements.md @@ -0,0 +1,75 @@ +# ベストプラクティス・アナライザーの改善 + +[Tabular Editor 2.8.1](https://github.com/otykier/TabularEditor/releases/tag/2.8.1)では、ベストプラクティスアナライザーが大きく見直されました。 + +最初に気づくのは、Tabular Editorがベストプラクティスの問題数をメインUI内で直接レポートするようになったことです。 + +![image](https://user-images.githubusercontent.com/8976200/53631987-baee5880-3c0b-11e9-9d66-e906cccce2be.png) + +モデルに変更が加えられると、Best Practice Analyzerはバックグラウンドでモデルの問題点をスキャンします。この機能は、[ファイル] > [環境設定]で無効にすることができます。 + +リンクをクリック(またはF10キーを押す)すると、新しく改良されたベストプラクティス・アナライザーのUIが表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/53631947-9eeab700-3c0b-11e9-9217-5739d4de2f88.png) + +以前のバージョンでベストプラクティス・アナライザーを使用されていた方は、まずUIが完全に再設計され、画面上の占有面積が小さくなっていることにお気づきでしょう。これにより、デスクトップの片側にウィンドウをドッキングさせ、もう片側にはメインウィンドウを表示させ、両方を同時に操作できます。 + +ベストプラクティス・アナライザー・ウィンドウは、モデル上のすべての**有効なルール**と、各ルールに違反しているオブジェクトを継続的にリストアップします。リスト内の任意の場所を右クリックするか、ウィンドウ上部のツールバーボタンを使用することで、以下のアクションを実行できます。 + +* **Manage rules...**: 後述する「ルール管理」UIが表示されます。このUIは、メインUIの「ツール > BPAルールの管理...」メニューからもアクセス可能です。 + +* **Go to object...**: このオプションを選択するか、リスト内のオブジェクトをダブルクリックすると、メインUIで同じオブジェクトに移動します。 + +* **Ignore item/items**: リスト内の1つまたは複数のオブジェクトを選択し、このオプションを選択すると、選択したオブジェクトに、ベストプラクティス・アナライザーが今後そのオブジェクトを無視すべきことを示す注釈が適用されます。間違ってオブジェクトを無視した場合、画面上部の「無視を表示」ボタンをトグルしてください。これにより、以前に無視したオブジェクトの無視を解除できます。 + +* **Ignore rule**: リスト内で1つ以上のルールを選択した場合、このオプションは、選択したルールを常に無視することを示す注釈をモデル・レベルに追加します。繰り返しになりますが、「無視を表示」ボタンをトグルすることで、ルールの無視を解除することもできます。 + +* **Generate fix script**: 修正が簡単なルール(オブジェクトに1つのプロパティを設定するだけで問題が解決することを意味します)には、このオプションが有効になっています。クリックすると、C#スクリプトがクリップボードにコピーされます。このスクリプトをTabular Editorの[Advanced Scripting](/Advanced-Scripting) エリアに貼り付けて、実行する前に確認して、修正を適用できます。 + +* **Apply fix**: このオプションは、簡単に修正できるルール以外でも利用できます。スクリプトをクリップボードにコピーしなくとも、即座に実行されます。 + +## ベストプラクティスルールの管理 + +モデルに適用するルールを追加、削除、修正する必要がある場合、そのための新しいUIも用意されています。ベストプラクティス・アナライザーのウィンドウの左上のボタンをクリックするか、メインウィンドウの「ツール > BPAルールの管理」メニューで表示できます。 + +![image](https://user-images.githubusercontent.com/8976200/53632990-2f29fb80-3c0e-11e9-82fe-ee9c921662c7.png) + +このUIには2つのリストがあります。上のリストは、現在ロードされているルールの**コレクション**を表します。このリストでコレクションを選択すると、そのコレクションで定義されているすべてのルールが下のリストに表示されます。デフォルトでは、3つのルール・コレクションが表示されます。 + +* **Rules within the current model**: その名前が示すように、これは現在のモデル内で定義されたルールのコレクションです。ルールの定義は、モデルオブジェクトのアノテーションとして保存されます。 + +* **Rules for the local user**: これらのルールは `%AppData%..\LocalTabularEditorBPARules.json` ファイルに保存されています。これらのルールは、現在ログインしているWindowsユーザーがTabular Editorでロードするすべてのモデルに適用されます。 + +* **Rules on the local machine**: これらのルールは `%ProgramData%TabularEditor FilterBPARules.json` に格納されます。これらのルールは、現在のマシンで Tabular Editor にロードされるすべてのモデルに適用されます。 + +同じルール(IDによる)が複数のコレクションにある場合、優先順位は上から下へ、つまり、モデル内で定義されたルールは、ローカルマシンで定義された同じIDのルールよりも優先されます。これにより、例えば、モデル特有の慣習を考慮に入れて、既存のルールを上書きできます。 + +リストの上部には、**(Effective rules)**という特別なコレクションが表示されます。このコレクションを選択すると、現在ロードされているモデルに実際に適用されるルールのリストが表示され、前述のように、同一のIDを持つルールの優先順位が尊重されます。下のリストには、ルールがどのコレクションに属しているかが表示されます。また、より高い優先順位のコレクションに同じIDのルールが存在する場合、そのルールの名前が削除されることに気づくでしょう。 + +![image](https://user-images.githubusercontent.com/8976200/53633831-74e7c380-3c10-11e9-925e-1419987f5a17.png) + +### コレクションを追加する + +Tabular Editor 2.8.1の新機能は、他のソースからのルールをモデルに含めることができるようになったことです。例えば、ネットワーク共有にあるルールファイルがある場合、そのファイルを現在のモデルのルールコレクションとして含めることができるようになりました。ファイルの場所への書き込み権限があれば、そのファイルからルールの追加、変更、削除を行うことも可能です。この方法で追加されたルール・コレクションは、モデル内で定義されたルールよりも優先されます。このようなコレクションを複数追加した場合、それらを上下に移動して、相互の優先順位を制御できます。 + +「Add...」ボタンをクリックして、新しいルールコレクションをモデルに追加します。これには、以下のオプションがあります。 + +![image](https://user-images.githubusercontent.com/8976200/53634211-7cf43300-3c11-11e9-8fed-7df113264a6f.png) + +* **Create new Rule File**: これにより、指定された場所に新しい空の.jsonファイルが作成され、その後、ルールを追加することができます。ファイルを選択するとき、相対的なファイルパスを使用するオプションがあることに注意してください。これは、現在のモデルと同じコードリポジトリにルールファイルを格納したい場合に便利です。ただし、相対的なルール・ファイルの参照は、モデルがディスクからロードされたときにのみ機能することに注意してください (Analysis Services のインスタンスからモデルをロードするときには作業ディレクトリが存在しないため)。 +* **Include local Rule File**: ルールの入った.jsonファイルがすでにあり、それをモデルに含めたい場合、このオプションを使用します。ここでも、相対ファイル・パスを使用するオプションがあり、ファイルがモデル・メタデータの近い場所にある場合、有効です。ファイルがネットワーク共有(または、一般的には、現在ロードされているモデル・メタデータが存在する場所とは異なるドライブ)にある場合、絶対パスを使用してのみ、そのファイルをインクルードできます。 +* **Include Rule File from URL**: このオプションを使用すると、有効なルール定義(json)を返すHTTP/HTTPS URLを指定できます。これは、例えば[BestPracticeRules GitHub site](https://github.com/TabularEditor/BestPracticeRules)の[標準BPAルール](https://raw.githubusercontent.com/TabularEditor/BestPracticeRules/master/BPARules-standard.json)など、オンラインソースからルールを含める場合に便利です。オンラインソースから追加されたルールコレクションは、読み取り専用になることを注意してください。 + +### コレクション内のルールを変更する + +画面下部では、コレクションが保存されている場所への書き込み権限があれば、現在選択されているコレクション内のルールを追加、編集、クローン、削除できます。また、「Move to...」ボタンにより、選択したルールを別のコレクションに移動またはコピーすることができ、複数のルールのコレクションを容易に管理できます。ルール定義を編集するUIは、以前のバージョンのTabular Editorと変わりませんので、その使い方は[旧Best Practice Analyzerの記事](/Best-Practice-Analyzer#rule-expression-samples)を参照してください。 + +### ルール説明のプレースホルダー + +以前のバージョンと比較した小さな改良点として、ベストプラクティスルールの説明で次のプレースホルダー値を使用できるようになりました。これにより、ベストプラクティスUIにツールチップとして表示される説明文をよりカスタマイズできるようになりました。 + +* `%object%` 現在のオブジェクトに対する完全修飾されたDAXリファレンス(該当する場合)を返します。 +* `%objectname%` は、現在のオブジェクトの名前のみを返します。 +* `%objecttype%` 現在のオブジェクトの型を返します。 + +![image](https://user-images.githubusercontent.com/8976200/53671918-587f7180-3c78-11e9-855f-ed497f2c0c98.png) diff --git a/te2/Ja-jp/ja-Best-Practice-Analyzer.md b/te2/Ja-jp/ja-Best-Practice-Analyzer.md new file mode 100644 index 0000000..5b48930 --- /dev/null +++ b/te2/Ja-jp/ja-Best-Practice-Analyzer.md @@ -0,0 +1,147 @@ +# ベストプラクティス・アナライザー + +> ベストプラクティス・アナライザーは Tabular Editor v. 2.8.1 で全面的に改良されたため、この記事の情報やスクリーンショットの一部は古くなっています[Best-Practice-Analyzer-Improvements.md](Best-Practice-Analyzer-Improvements.md)。Dynamic LINQ (ルール式) に関する情報は、現在も最新です。 + +この[素晴らしい提案](https://github.com/TabularEditor/TabularEditor/issues/39)に触発されて、Tabular Editorのまったく新しい機能であるBest Practice Analyzer (BPA)をご紹介できることを誇りに思います。ツールメニューから「Best Practice Analyzer...」をクリックすると、次のウィンドウが開きます(BPAウィンドウを開いたまま、メインウィンドウでモデルの作業を続けることができます)。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25298153/07cb3ae0-26f3-11e7-84cb-1c27a5911560.png) + +BPAでは、モデルのメタデータにルールを定義し、SSAS Tabularで開発する際に特定の規約やベストプラクティスを推奨できます。 + +上のリストでルールの1つをクリックすると、下のリストで指定されたルールの条件を満たすすべてのオブジェクトが表示されます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25298226/9c036214-26f3-11e7-97ea-03ef82366eb5.png) + +リスト内のオブジェクトをダブルクリックすると、Tabular Editorのメインウィンドウにフォーカスが戻り、エクスプローラツリーでそのオブジェクトが選択されます(「Go to object...」)。また、ルールを完全に無視したり(ルールリストのチェックマークを外すことで可能)、特定のオブジェクトのみを無視するように指定することも可能です。無視はModel.bimファイルのメタデータアノテーションに保存されます。 + +新しいルールを作成するには、Tabular EditorにTabular Modelをロードした状態で、「Add rule...」をクリックするだけです。新しいウィンドウが開き、ルールの名前、説明、条件を指定できます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25298330/4178cbe4-26f4-11e7-97ee-d80c1dbc54ed.png) + +ビジュアルなルールビルダーは、後のリリースで計画されています。今のところ、ルール条件は[Dynamic LINQ式](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions)を使用して指定します。この式では、ドロップダウンで指定したオブジェクトのタイプにあるすべてのプロパティにアクセスすることが可能です。条件を満たすすべてのオブジェクトは、ルールが選択されるとBPA UIに表示されます。 + +デフォルトではこの方法で作成されたルールは、Tabular Editorで「保存」をクリックすると、Modelオブジェクトのメタデータアノテーションに追加され、Model.bimファイルまたは接続されたデータベースに保存されます。ローカルモデル内に保存されたルールを「グローバル」ルールに昇格させることができます。グローバルルールは、%AppData%Local TieTabularEditorフォルダーにある「BPARules.json」というファイルに保存されます。BPARules.jsonを %ProgramData%TabularEditorフォルダーに置くことで、マシン上のすべてのユーザーがルールを利用できるようにすることもできます。 + +ルールIDは常に一意である必要があることに注意してください。モデルメタデータ内のルールが%AppData%または%ProgramData%フォルダー内のルールと同じIDを持つ場合、優先順位は次のようになります。 + +- モデル内にローカル保存されたルール +- AppData%Localフォルダーに保存されたルール +- ProgramData%フォルダーに格納されたルール + +## ルール表現サンプル + +このセクションでは、ルールを定義するために使用できる動的LINQ式の例をいくつか紹介します。ルール式エディターに入力された式は、テキストボックスからフォーカスが外れるたびに評価され、構文エラーがあれば画面の上部に表示されます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25380170/9f01634e-29af-11e7-952e-e10a1f28df32.png) + +ルール式は、TOM内のオブジェクトのパブリックプロパティにアクセスできます。そのタイプのオブジェクトが存在しないプロパティにアクセスしようとした場合、エラーも表示されます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25381302/798bab98-29b3-11e7-931e-789e5286fc45.png) + +"Column "オブジェクトに "Expression" が存在しませんが、ドロップダウンを "Calculated Columns" に切り替えると、上記のステートメントは問題なく動作します。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25380451/87b160da-29b0-11e7-8e2e-c4e47593007d.png) + +Dynamic LINQは、標準的な算術演算子、論理演算子、比較演算子をすべてサポートしており、". "表記を使用すると、すべてのオブジェクトのサブプロパティとメソッドにアクセスすることが可能です。 + +``` +String.IsNullOrWhitespace(Expression) and not Name.StartsWith("Dummy") +``` + +上記のステートメントを計算列、計算テーブル、またはメジャーに適用すると、オブジェクトの名前が "Dummy" というテキストで始まっていない限り、空のDAX式を持つものにフラグが立てられます。 + +LINQを使用すると、オブジェクトのコレクションを操作することもできます。以下の式をテーブルに適用すると、10以上のカラムを持ち、ディスプレイフォルダーに整理されていないテーブルを見つけることができます。 + +``` +Columns.Count(DisplayFolder = "") > 10 +``` + +LINQメソッドを使用してコレクションを反復処理する場合、LINQメソッドの引数として使用される式は常に、コレクション内の項目で評価されます。実際、DisplayFolderは列に対するプロパティであり、Tableレベルには存在しない。 + +ここでは、Adventure Worksの表形式モデルでこのルールが実行されている様子を見ることができます。Reseller」テーブルが違反であると表示され、「Reseller Sales」が表示されないことに注目してください(後者のカラムはDisplay Folderで整理されています)。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25380809/d9d1c3a4-29b1-11e7-839e-29450ad39c8a.png) + +LINQメソッド内で親オブジェクトを参照するには、特別な "outerIt "構文を使用する。このルールをテーブルに適用すると、テーブル名で始まらない名前のカラムを含むものを見つけることができる。 + +``` +Columns.Any(not Name.StartsWith(outerIt.Name)) +``` + +このルールをColumnsに直接適用する方がおそらく理にかなっており、その場合、次のように記述する必要があります。 + +``` +not Name.StartsWith(Table.Name) +``` + +列挙プロパティと比較するには、列挙された値を文字列として渡せばよい。このルールは、名前が "Key" または "ID" で終わり、かつSummarizeByプロパティが "None" に設定されていないすべての列を検索します。 + +``` +(Name.EndsWith("Key") or Name.EndsWith("ID")) and SummarizeBy <> "None" +``` + +## 未使用のオブジェクトを探す + +表形式モデルを構築する場合、高い基数を持つ列を何としても避けることが重要です。典型的な原因は、誤ってモデルにインポートされたシステムのタイムスタンプやテクニカルキーなどです。一般的に、モデルには実際に必要なカラムだけが含まれるようにすべきです。ベストプラクティス・アナライザーが、どのカラムが必要ないかを教えてくれるとしたら、それは素晴らしいことだと思いませんか? + +次のルールは、そのカラムを報告します。 + +- ...が非表示になっている(または親テーブルが非表示になっている)。 +- ...どのDAX式からも参照されていない(モデル内のすべてのDAX式(ドリルスルー式、RLSフィルター式を含む)を考慮する +- リレーションシップがない +- ...他のカラムの "Sort By "カラムとしては使用されません。 +- ...は、階層のレベルとしては使用されません。 + +このBPAルールのDynamic LINQ式は次のとおりです。 + +``` +(IsHidden or Table.IsHidden) +and ReferencedBy.Count = 0 +and (not UsedInRelationships.Any()) +and (not UsedInSortBy.Any()) +and (not UsedInHierarchies.Any()) +``` + +同じ手法で、使用されていないメジャーを見つけることができます。メジャーはリレーションシップに参加できないので、もう少し単純になります。そこで、代わりに、指定されたメジャーを参照するダウンストリーム・オブジェクトが表示されているかどうかも考慮することで、少しスパイスを効かせることができます。つまり、メジャー[A]がメジャー[B]から参照され、メジャー[A]と[B]の両方が非表示であり、他のDAX式がこれら2つのメジャーを参照しない場合、開発者にそれらの両方を削除しても安全であることを知らせる必要があります。 + +``` +(IsHidden or Table.IsHidden) +and not ReferencedBy.AllMeasures.Any(not IsHidden) +and not ReferencedBy.AllColumns.Any(not IsHidden) +and not ReferencedBy.AllTables.Any(not IsHidden) +and not ReferencedBy.Roles.Any() +``` + +## オブジェクトを修正する + +場合によっては、ルールの基準を満たすオブジェクトの問題を自動的に修正することが可能です。たとえば、オブジェクトに単純なプロパティを設定するだけでよい場合です。次のルールの背後にあるJSONを詳しく見てみましょう。 + +```json +{ + "ID": "FKCOLUMNS_HIDDEN", + "Name": "Hide foreign key columns", + "Category": null, + "Description": "Columns used on the Many side of a relationship should be hidden.", + "Severity": 1, + "Scope": "Column", + "Expression": "Model.Relationships.Any(FromColumn = outerIt) and not IsHidden and not Table.IsHidden", + "FixExpression": "IsHidden = true", + "Compatibility": [ + 1200, + 1400 + ], + "IsValid": false +} +``` + +このルールは、リレーションシップで使用されるすべての列 ("Many" / "From" 側)を検索しますが、列またはその親テーブルが非表示になっていない場合です。ユーザは関連 (ディメンジョン)テーブルを使用してデータをフィルタリングする必要があるため、このような列は決して表示しないことをオススメします。したがって、この場合の修正は、列のIsHiddenプロパティをtrueに設定することであり、これはまさに上記の "FixExpression" 文字列が行うことです。これを実際に確認するには、ルールに違反するオブジェクトを右クリックして、「修正スクリプトの生成」を選択します。このスクリプトはAdvanced Script Editorに貼り付けることができ、そこから簡単にコードを確認し、実行できます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25298489/9035bab6-26f5-11e7-8134-8502daaf4132.png) + +スクリプトの実行後、モデルへの変更はいつでも取り消し(CTRL+Z)できることを忘れないでください。 + +この新しいツールに関するフィードバックは大歓迎です。将来的には、Tabular Editorに同梱される普遍的なベストプラクティスのセットを提供し、使い始められるようにする予定です。さらに、ベストプラクティスアナライザーをVisual Studioのプラグインとして利用できるようにする計画も進行中ですので、Tabular Editorを使用していない方でもその恩恵を受けることができます。 + +## 公式ベストプラクティスルール + +Tabular Editorのユーザーに標準的なベストプラクティスのセットを提供するために、新しいGitHub [リポジトリはこちら](https://github.com/TabularEditor/BestPracticeRules)が作成され、コミュニティが貢献できるベストプラクティスルールの公開コレクションとして使用されます。あらゆる種類のTabularモデリングで一般的に実行可能であると判断されたルールは、このリポジトリで定期的に「リリース」に含まれる予定です。後日、Tabular EditorはこれらのルールをGitHubリポジトリから自動的に取得できるようになり、リポジトリからBPARules.jsonファイルを手動でダウンロードする必要がなくなります。 diff --git a/te2/Ja-jp/ja-Command-line-Options.md b/te2/Ja-jp/ja-Command-line-Options.md new file mode 100644 index 0000000..8df1ec2 --- /dev/null +++ b/te2/Ja-jp/ja-Command-line-Options.md @@ -0,0 +1,247 @@ +# Command Line + +Tabular Editorは、コマンドラインから実行してさまざまなタスクを実行することができ、自動ビルドやデプロイメントシナリオなどで有用です。 + +**Note:** TabularEditor.exeはWinFormsアプリケーションなので、Windowsのコマンドプロンプトから直接実行すると、スレッドがすぐにプロンプトに戻ります。このため、コマンドスクリプトなどで問題が発生します。TabularEditor.exeのコマンドラインタスクが完了するのを待つには、常に以下の方法で実行してください。`start /wait TabularEditor ...` を使って実行してください。 + +Tabular Editorで利用できるコマンドラインオプションを表示するには、次のコマンドを実行します。 + +**Windows Command line:** + +```shell +start /wait TabularEditor.exe /? +``` + +**PowerShell:** + +```powershell +$p = Start-Process -filePath TabularEditor.exe -Wait -NoNewWindow -PassThru -ArgumentList "/?" +``` + +Output: +``` +Tabular Editor 2.16.0 (build 2.16.7781.40242) +-------------------------------- +Usage: + +TABULAREDITOR ( file | server database ) [-S script1 [script2] [...]] + [-SC] [-A [rules] | -AX rules] [(-B | -F) output [id]] [-V | -G] [-T resultsfile] + [-D [server database [-L user pass] [-O [-C [plch1 value1 [plch2 value2 [...]]]] + [-P [-Y]] [-R [-M]]] + [-X xmla_script]] [-W] [-E]] + +file Full path of the Model.bim file or database.json model folder to load. +server Server\instance name or connection string from which to load the model +database Database ID of the model to load +-S / -SCRIPT Execute the specified script on the model after loading. + scriptN Full path of one or more files containing a C# script to execute or an inline + script. +-SC / -SCHEMACHECK Attempts to connect to all Provider Data Sources in order to detect table schema + changes. Outputs... + ...warnings for mismatched data types and unmapped source columns + ...errors for unmapped model columns. +-A / -ANALYZE Runs Best Practice Analyzer and outputs the result to the console. + rules Optional path of file or URL of additional BPA rules to be analyzed. If + specified, model is not analyzed against local user/local machine rules, + but rules defined within the model are still applied. +-AX / -ANALYZEX Same as -A / -ANALYZE but excludes rules specified in the model annotations. +-B / -BIM / -BUILD Saves the model (after optional script execution) as a Model.bim file. + output Full path of the Model.bim file to save to. + id Optional id/name to assign to the Database object when saving. +-F / -FOLDER Saves the model (after optional script execution) as a Folder structure. + output Full path of the folder to save to. Folder is created if it does not exist. + id Optional id/name to assign to the Database object when saving. +-V / -VSTS Output Visual Studio Team Services logging commands. +-G / -GITHUB Output GitHub Actions workflow commands. +-T / -TRX Produces a VSTEST (trx) file with details on the execution. + resultsfile File name of the VSTEST XML file. +-D / -DEPLOY Command-line deployment + If no additional parameters are specified, this switch will save model metadata + back to the source (file or database). + server Name of server to deploy to or connection string to Analysis Services. + database ID of the database to deploy (create/overwrite). + -L / -LOGIN Disables integrated security when connecting to the server. Specify: + user Username (must be a user with admin rights on the server) + pass Password + -O / -OVERWRITE Allow deploy (overwrite) of an existing database. + -C / -CONNECTIONS Deploy (overwrite) existing data sources in the model. After the -C switch, you + can (optionally) specify any number of placeholder-value pairs. Doing so, will + replace any occurrence of the specified placeholders (plch1, plch2, ...) in the + connection strings of every data source in the model, with the specified values + (value1, value2, ...). + -P / -PARTITIONS Deploy (overwrite) existing table partitions in the model. + -Y / -SKIPPOLICY Do not overwrite partitions that have Incremental Refresh Policies defined. + -R / -ROLES Deploy roles. + -M / -MEMBERS Deploy role members. + -X / -XMLA No deployment. Generate XMLA/TMSL script for later deployment instead. + xmla_script File name of the new XMLA/TMSL script output. + -W / -WARN Outputs information about unprocessed objects as warnings. + -E / -ERR Returns a non-zero exit code if Analysis Services returns any error messages after + the metadata was deployed / updated. +``` + +## Connecting to Azure Analysis Services + +コマンドのサーバー名の代わりに、任意の有効なSSAS接続文字列を使用できます。次のコマンドは、Azure Analysis Servicesからモデルをロードし、それをModel.bimファイルとしてローカルに保存します。 + +**Windows Command Line:** + +```shell +start /wait TabularEditor.exe "Provider=MSOLAP;Data Source=asazure://northeurope.asazure.windows.net/MyAASServer;User ID=xxxx;Password=xxxx;Persist Security Info=True;Impersonation Level=Impersonate" MyModelDB -B "C:\Projects\FromAzure\Model.bim" +``` + +**PowerShell:** + +```powershell +$p = Start-Process -filePath TabularEditor.exe -Wait -NoNewWindow -PassThru ` + -ArgumentList "`"Provider=MSOLAP;Data Source=asazure://northeurope.asazure.windows.net/MyAASServer;User ID=xxxx;Password=xxxx;Persist Security Info=True;Impersonation Level=Impersonate`" MyModelDB -B C:\Projects\FromAzure\Model.bim" +``` + +Azure Active Directory 認証ではなく、Service Principal (Application ID and Key) を使って接続したい場合は、以下のような接続文字列を使用します。 + +``` +Provider=MSOLAP;Data Source=asazure://northeurope.asazure.windows.net/MyAASServer;User ID=app:@;Password=;Persist Security Info=True;Impersonation Level=Impersonate +``` + +## Automating script changes + +Tabular Editor内でスクリプトを作成し、デプロイ前にこのスクリプトをModel.bimファイルに適用したい場合、コマンドラインオプション「-S」(Script)を使用することができます。 + +**Windows Command Line:** + +```shell +start /wait TabularEditor.exe "C:\Projects\MyModel\Model.bim" -S "C:\Projects\MyModel\MyScript.cs" -D localhost\tabular MyModel +``` + +**PowerShell:** + +```powershell +$p = Start-Process -filePath TabularEditor.exe -Wait -NoNewWindow -PassThru ` + -ArgumentList "`"C:\Projects\MyModel\Model.bim`" -S `"C:\Projects\MyModel\MyScript.cs`" -D `"localhost\tabular`" `"MyModel`"" +``` + +このコマンドは、Model.bimファイルをTabular Editorで読み込み、指定されたスクリプトを適用して、変更されたモデルを新しいデータベース "MyModel" として "localhosttabular" サーバーにデプロイします。サーバー上の同名の既存データベースを上書きする場合は、"-O" (Overwrite) スイッチを使用します。 + +D" (Deploy) スイッチの代わりに "-B" (Build) スイッチを使用すると、変更したモデルを直接デプロイする代わりに、新しいModel.bimファイルとして出力できます。これは、他のデプロイツールを使ってモデルをデプロイしたい場合や、デプロイ前にVisual StudioやTabular Editorでモデルを検査したい場合などに便利です。また、自動ビルドのシナリオで、デプロイ前に修正したモデルをリリースの成果物として保存したい場合にも有用です。 + +## Modifying connection strings during deployment + +以下のような接続文字列を持つData Sourceを含むモデルがあると仮定します。 + +``` +Provider=SQLOLEDB.1;Data Source=sqldwdev;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=DW +``` + +デプロイ時に、この文字列を変更して、UATまたは本番用データベースを指すようにしたい。そのためには、まず接続文字列全体をプレースホルダーの値に変更するスクリプトを使用し、次に-Cスイッチを使用してプレースホルダーと実際の接続文字列を入れ替えるのが最適な方法です。 + +以下のスクリプトを "ClearConnectionStrings.cs "などと呼ばれるファイルに記述する。 + +```csharp +// This will replace the connection string of all Provider (legacy) data sources in the model +// with a placeholder based on the name of the data source. E.g., if your data source is called +// "SQLDW", the connection string after running this script would be "SQLDW": + +foreach(var ds in Model.DataSources.OfType()) + ds.ConnectionString = ds.Name; +``` + +以下のコマンドでTabular Editorにスクリプトの実行を指示し、プレースホルダーの入れ替えを実行できます。 + +**Windows Command Line:** + +```shell +start /wait TabularEditor.exe "Model.bim" -S "ClearConnectionStrings.cs" -D localhost\tabular MyModel -C "SQLDW" "Provider=SQLOLEDB.1;Data Source=sqldwprod;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=DW" +``` + +**PowerShell:** + +```powershell +$p = Start-Process -filePath TabularEditor.exe -Wait -NoNewWindow -PassThru ` + -ArgumentList "Model.bim -S ClearConnectionStrings.cs -D localhost\tabular MyModel -C SQLDW `"Provider=SQLOLEDB.1;Data Source=sqldwprod;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=DW`"" +``` + +上記のコマンドは、Model.bimファイルを "localhosttabular" SSASインスタンスに "MyModel" という新しいSSASデータベースとしてデプロイするものです。デプロイ前に、このスクリプトは、プロバイダー(レガシー)データソースのすべての接続文字列を、プレースホルダーとして使用するデータソースの名前に置き換えるため使用されます。「SQLDW」という名前のデータソースが1つだけあると仮定すると、-Cスイッチによって接続文字列が更新され、「SQLDW」が指定した文字列全体に置き換えられます。 + +このテクニックは、異なる(同一の)ソースからのデータを処理する複数の環境に同じモデルをデプロイしたい場合、たとえば、プロダクション、プレプロダクション、UATデータベースなどのシナリオで有用です。Azure DevOps(下記参照)を使用する場合、実際に使用する接続文字列をコマンドにハードコードするのではなく、変数を使用して保存することを検討してください。 + +## Integration with Azure DevOps + +Azure DevOpsパイプライン内でTabular Editor CLIを使用したい場合、スクリプトで実行されるTabularEditor.exeコマンドに「-V」スイッチを使用する必要があります。このスイッチにより、Tabular Editorはログコマンドを[Azure DevOpsが読める形式](https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md)で出力するようになります。これにより、Azure DevOpsはエラーなどに適切に対応できるようになります。 + +コマンドラインを通じてデプロイメントを実行する場合、未処理のオブジェクトに関する情報がプロンプトに出力されます。自動化されたデプロイメントシナリオでは、たとえば新しいカラムを追加したり、計算テーブルのDAX式を変更したりするときなど、オブジェクトが未処理の状況にビルドエージェントを反応させたい場合があります。この場合、前述の「-V」スイッチに加えて「-W」スイッチを使用することで、この情報を警告として出力することができる。そうすることで、デプロイ完了後Azure DevOpsに「SucceededWithIssues」ステータスが返されます。また、デプロイ成功後にサーバーからDAXエラーが報告された場合、デプロイがステータス「Failed」を返すようにしたい場合は、「-E」スイッチを使用することもできます。 + +Azure DevOpsパイプラインのCommand Line Task内でTabularEditor.exeを実行する場合、`start /wait`は必要ありません。これは、タスクによって生成されたすべてのスレッドが終了するまで、Command Line Taskが完了しないためです。言い換えれば、TabularEditor.exeの呼び出しの後に追加のコマンドがある場合にのみ、`start /wait` を使用する必要があります。TabularEditor.exeからの出力をパイプラインログに正しく戻すには、`/B`スイッチが必要です。 + +```shell +TabularEditor.exe "C:\Projects\My Model\Model.bim" -D ssasserver databasename -O -C -P -V -E -W +``` + +Or with multiple commands: + +```shell +start /B /wait TabularEditor.exe "C:\Projects\Finance\Model.bim" -D ssasserver Finance -O -C -P -V -E -W +start /B /wait TabularEditor.exe "C:\Projects\Sales\Model.bim" -D ssasserver Sales -O -C -P -V -E -W +``` + +下図は、Azure DevOpsでこのようなビルドがどのように見えるかを示しています。 + +![image](https://user-images.githubusercontent.com/8976200/27128146-bc044356-50fd-11e7-9a67-b893fc48ea50.png) + +何らかの理由でデプロイに失敗した場合、「-W」スイッチを使用しているかどうかにかかわらず、Tabular EditorはAzure DevOpsに「Failed」ステータスを返します。 + +Azure DevOpsとTabular Editorの詳細については、このブログシリーズ](https://tabulareditor.github.io/2019/02/20/DevOps1.html) (とくに[第3章](https://tabulareditor.github.io/2019/10/08/DevOps3.html) 以降)をご覧ください。 + +### Azure DevOps PowerShell Task + +コマンドラインタスクの代わりにPowerShellタスクを使いたい場合は、上記のように `Start-Process` コマンドレットを使ってTabularEditor.exeを実行する必要があります。さらに、PowerShellスクリプトのexitパラメーターにプロセスの終了コードを渡して、Tabular Editorで発生したエラーがPowerShellタスクの失敗の原因にしてください。 + +```powershell +$p = Start-Process -filePath TabularEditor.exe -Wait -NoNewWindow -PassThru ` + -argumentList "`"C:\Projects\My Model\Model.bim`" -D ssasserver databasename -O -C -P -V -E -W" +exit $p.ExitCode +``` + +## Running the Best Practice Analyzer + +「-A」スイッチを使用すると、ローカルマシン(%AppData%... \LocalTabularEditor= 3 はエラー(ERROR)を発生させます + +## Performing a data source schema check + +[バージョン 2.8](https://github.com/otykier/TabularEditor/releases/tag/2.8) では、-SC (-SCHEMACHECK) スイッチを使用して、テーブルソースクエリを検証できます。これは [Refresh Table Metadata UI](/Importing-Tables#refreshing-table-metadata) の実行と同等ですが、モデルへの変更は行われませんが、スキーマの相違はコンソールに報告されます。変更されたデータ型とソースに追加されたカラムは、警告としてレポートされます。ソースにない列はエラーとして報告されます。SC(-SCHEMACHECK)スイッチと-S(-SCRIPT)スイッチの両方を指定すると、スクリプトが正常に実行された後にスキーマ チェックが実行されるため、スキーマ チェックが実行される前にデータ ソースのプロパティを変更できます(たとえば、資格情報パスワードを指定するためなど)。 + +また、スキーマチェックを行う際に、テーブルやカラムを特定の方法で処理したい場合は、アノテーションを付けることができます。[詳細はこちら](/Importing-Tables#ignoring-objects)を参照してください。 + +## Command Line output and Exit Codes + +コマンドラインは、使用されたスイッチや実行中遭遇したイベントに応じて、さまざまな詳細を提供します。Exit Codesは [version 2.7.4](https://github.com/otykier/TabularEditor/releases/tag/2.7.4) で導入されました。 + +|Level|Command|Message|Clarification| +|---|---|---|---| +|Error|(Any)|Invalid argument syntax|Tabular Editor CLIに無効な引数が指定されました。| +|Error|(Any)|File not found: ...|| +|Error|(Any)|Error loading file: ...|ファイルが壊れているか、有効な TOM メタデータが JSON 形式で含まれていない。| +|Error|(Any)|Error loading model: ...|提供された Analysis Services インスタンスに接続できない、データベースが見つからない、データベースのメタデータが破損している、またはサポートされている互換性レベルのデータベースでない| +|Error|-SCRIPT|Specified script file not found|| +|Error|-SCRIPT|Script compilation errors:|スクリプトに無効なC#の構文が含まれていました。詳細は以下の行に出力されます。 +|Error|-SCRIPT|Script execution error: ...|スクリプトの実行時に未処理の例外が発生しました。| +|Information|-SCRIPT|Script line #: ...|スクリプト内で `Info(string)` メソッドまたは `Output(string)` メソッドを使用する。| +|Warning|-SCRIPT|Script warning: ...|スクリプト内で `Warning(string)` メソッドを使用する。| +|Error|-SCRIPT|Script error: ...|スクリプト内で `Error(string)` メソッドを使用する。| +|Error|-FOLDER, -BIM|-FOLDER and -BIM arguments are mutually exclusive.|Tabular Editorで、現在ロードされているモデルを一度の実行でフォルダー構造および.bimファイルに保存できない。| +|Error|-ANALYZE|Rulefile not found: ...|| +|Error|-ANALYZE|Invalid rulefile: ...|指定されたBPAルールファイルが破損しているか、有効なJSONを含んでいません。| +|Information|-ANALYZE|... violates rule ...|重大度レベル1以下のルールに対するベストプラクティス・アナライザーの結果。| +|Warning|-ANALYZE|... violates rule ...|重大度レベル2のルールに対するベストプラクティス・アナライザーの結果。| +|Error|-ANALYZE|... violates rule ...|重大度レベル3以上のルールに対するベストプラクティス・アナライザーの結果。| +|Error|-DEPLOY|Deployment failed! ...|Analysis Serviceインスタンスから直接返される失敗の理由(例:データベースが見つからない、データベースのオーバーライドが許可されていない、など)。| +|Information|-DEPLOY|Unprocessed object: ...|デプロイに成功した後、状態が "NoData" または "CalculationNeeded" になっているオブジェクト。W スイッチを使用すると、これらを Level=Warning として扱います。| +|Warning|-DEPLOY|Object not in "Ready" state: ...|デプロイに成功した後、状態が "DependencyError", "EvaluationError" または "SemanticError" であるオブジェクト。Wスイッチを使用した場合、状態「NoData」または「CalculationNeeded」のオブジェクトも含まれます。| +|Warning|-DEPLOY|Error on X:...|デプロイに成功した後に、無効な DAX を含むオブジェクト (メジャー、計算列、計算テーブル、ロール) が表示されます。これらを Level=Error として処理するには、-E スイッチを使用します。| + +Error "レベルの出力に遭遇した場合、Tabular EditorはExit Code = 1を返します。それ以外は0です。 diff --git a/te2/Ja-jp/ja-Custom-Actions.md b/te2/Ja-jp/ja-Custom-Actions.md new file mode 100644 index 0000000..fc740d9 --- /dev/null +++ b/te2/Ja-jp/ja-Custom-Actions.md @@ -0,0 +1,70 @@ +# カスタムアクション + +> [!NOTE] +> この機能は、多次元モデルで利用可能なカスタムアクション機能とは無関係であることに注意してください。 + +たとえば、`Selected`オブジェクトを使って便利なスクリプトを作成し、エクスプローラツリーの異なるオブジェクトに対して何度もスクリプトを実行できるようにしたいとします。スクリプトを実行したいときに "Play "ボタンを押す代わりに、Tabular Editorではスクリプトをカスタムアクションとして保存できます。 + +![image](https://user-images.githubusercontent.com/8976200/33581673-0db35ed0-d952-11e7-90cd-e3164e198865.png) + +カスタムアクションを保存すると、エクスプローラツリーの右クリックコンテキストメニューから直接利用できるようになり、ツリーで選択したオブジェクトに対して簡単にスクリプトを呼び出すことができます。カスタムアクションは必要な数だけ作成できます。バックスラッシュの使用 (\\) を指定すると、コンテキストメニューの中にサブメニュー構造が作成されます。 + +![Custom Actions show up directly in the context menu](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/InvokeCustomAction.png) + +Custom Actionsは%AppData%LocalTabularEditor内のCustomActions.jsonファイルに保存されます。上記の例では、このファイルの内容は次のようになります。 + +```json +{ + "Actions": [ + { + "Name": "Custom Formatting\\Number with 1 decimal", + "Enabled": "true", + "Execute": "Selected.Measures.ForEach(m => m.FormatString = \"0.0\";", + "Tooltip": "Sets the FormatString property to \"0.0\"", + "ValidContexts": "Measure, Column" + } + ] +} +``` + +見ての通り、`Name` と `Tooltip` はアクションが保存されたときに指定された値を取得します。Execute` は、アクションが呼び出されたときに実行される実際のスクリプトです。CustomActions.jsonファイルに構文エラーがあると、Tabular EditorはすべてのCustom Actionの読み込みを完全にスキップします。したがって、Custom Actionとして保存する前に、Advanced Scripting Editor内でスクリプトを正常に実行できることを確認してください。 + +`ValidContexts`プロパティは、アクションが利用できるオブジェクトタイプのリストを保持します。ツリーでオブジェクトを選択する際に、`ValidContexts`プロパティに記載されているタイプとは異なるオブジェクトが含まれていると、コンテキストメニューからそのアクションが非表示になります。 + +## アクションの可用性を制御する + +もし、コンテキストメニューからアクションを呼び出すタイミングをさらにコントロールしたい場合には、`Enabled` プロパティをカスタム式に設定できます。この式は、与えられた選択に対してアクションが利用できるかどうかを示すブール値を返さなければなりません。デフォルトでは、`Enabled` プロパティは "true" という値を持っており、有効なコンテキスト内では常にアクションが有効になることを意味します。このことは、 `Selected` オブジェクトに対して、 `Selected.Measure` や `Selected.Table` のような単数形のオブジェクト参照を使用する際に、現在の選択オブジェクトがそのタイプのオブジェクトを含んでいない場合にはエラーをスローすることになりますので覚えておいてください。このような場合は、 `Enabled` プロパティを使用して、必要なタイプのオブジェクトが1つだけ選択されていることを確認することをオススメします。 + +```json +{ + "Actions": [ + { + "Name": "Reset measure name", + "Enabled": "Selected.Measures.Count == 1", + "Execute": "Selected.Measure.Name == \"New Measure\"", + "ValidContexts": "Measure" + } + ] +} +``` + +これにより、ツリーで1つのメジャーが選択されていない限り、コンテキスト・メニュー項目は無効となります。 + +## カスタムアクションの再利用 + +リリース2.7では、新しいスクリプトメソッド `CustomAction(...)` が導入され、以前に保存されたカスタムアクションを呼び出すことができるようになりました。このメソッドはスタンドアローンのメソッドとして (`Output(...)` と同様) 使用することもできますし、任意のオブジェクトのセットに対して拡張メソッドとして使用することもできます。 + +```csharp +// Executes "My custom action" against the current selection: +CustomAction("My custom action"); + +// Executes "My custom action" against all tables in the model: +CustomAction(Model.Tables, "My custom action"); + +// Executes "My custom action" against every measure in the current selection whose name starts with "Sum": +Selected.Measures.Where(m => m.Name.StartsWith("Sum")).CustomAction("My custom action"); +``` + +カスタムアクションの名前は、コンテキストメニューのフォルダー名も含めてフルネームで指定する必要があることに注意してください。 + +指定した名前のアクションが見つからない場合は、スクリプトを実行するときにエラーが発生します。 diff --git a/te2/Ja-jp/ja-FAQ.md b/te2/Ja-jp/ja-FAQ.md new file mode 100644 index 0000000..864dc7a --- /dev/null +++ b/te2/Ja-jp/ja-FAQ.md @@ -0,0 +1,21 @@ +# よくある質問 + +## Tabular Editorとは何ですか? + +基本的に、Tabular EditorはAnalysis Services Tabular Modelを構成するメタデータを編集するためのUIを提供します。モデルの編集にTabular Editorを使う場合とVisual Studioを使う場合の主な違いは、Tabular Editorは_data_をロードしないことです - _metadata_のみです。つまり、メジャーや表示フォルダーなどを作成および変更する際に、検証や計算が行われないということです。検証や計算は、ユーザーが変更をデータベースに保存することを選択したときにのみ実行されます。これは、Visual Studioでの作業が遅くなりがちな中型から大型のモデルに対して、より良い開発者体験を提供します。 + +さらに、Tabular Editorには多くの[Features](ja-Features-at-a-glance.md)があり、一般的に生産性を高め、特定の作業を容易にできます。 + +## なぜSSAS Tabularにさらに別のツールが必要なのか? + +Analysis Services Tabularで作業する場合、SQL Server Data Tools (Visual Studio), [DAX Editor](https://www.sqlbi.com/tools/dax-editor/), [DAX Studio](https://www.sqlbi.com/tools/dax-studio/), [BISM Normalizer](http://bism-normalizer.com/) や [BIDSHelper](https://bidshelper.codeplex.com/) にすでに慣れているかも知れません。これらはすべて優れたツールで、それぞれ独自の目的を持っています。Tabular Editorはこれらのツールに取って代わるものではなく、むしろこれらのツールを補足するものと考えるべきでしょう。なぜTabular Editorが正当化されるのか、[Features at a glance](ja-Features-at-a-glance.md) articleをご覧ください。 + +## なぜTabular EditorはVisual Studioのプラグインとして利用できないのですか? + +Visual Studio内でTabular Modelsを扱うためのより良いユーザー体験は間違いなく評価されますが、スタンドアロンツールはプラグインよりもいくつかの利点を提供します。まず第一に、Tabular Editorを使うのにVisual Studio/SSDTのインストールは**必要ありません**。Tabular EditorはAMOライブラリのみを必要とし、VSと比較して非常に小さなインストールで済みます。次に、TabularEditor.exeはデプロイ、スクリプトなどのコマンドラインオプションで実行可能で、これは.vsix(プラグイン)プロジェクトでは不可能なことです。 + +また、特筆すべきは、Tabular Editorは[standalone .zip file](https://github.com/otykier/TabularEditor/releases/latest/download/TabularEditor.Portable.zip)としてダウンロードできます。つまり、何もインストールする必要がないのです。言い換えれば、Windowsマシンの管理者権限がなくてもタブラーエディターを実行することができるのです。zipファイルをダウンロードし、解凍してTabularEditor.exeを実行するだけです。 + +## 今後のリリースではどのような機能が予定されていますか? + +現在のロードマップは[こちら](ja-Roadmap.md)でご覧になれます。 diff --git a/te2/Ja-jp/ja-Features-at-a-glance.md b/te2/Ja-jp/ja-Features-at-a-glance.md new file mode 100644 index 0000000..701cbf1 --- /dev/null +++ b/te2/Ja-jp/ja-Features-at-a-glance.md @@ -0,0 +1,87 @@ +# 基本機能 + +以下の記事では、Tabular Editorの最も重要な機能の概要を説明します。 + +## Load/save Model.bim files + +CTRL+Oを押すと、ファイルを開くダイアログが表示され、Tabular Editorに読み込むModel.bimファイルを選択できます。このファイルは互換性レベル1200以上でなければなりません(JSON形式)。CTRL+SはTabular Editorで行った変更をファイルに戻して保存します(Tabular Editorを使用する前にModel.bimファイルをバックアップしておくことをオススメします)。ロードしたモデルをAnalysis Servicesサーバーインスタンスにデプロイする場合は、以下の[デプロイメント](/ja-Features-at-a-glance)をご覧ください。 + +## SSAS Tabularデータベースへの接続/デプロイメント + +CTRL+SHIFT+Oを押すと、すでにデプロイされているTabular DatabaseからTabular Modelを直接開くことができます。サーバーのアドレスを入力し、(オプションで)ユーザー名とパスワードを指定します。OK" を押すと、データベースとサーバーのリストが表示されます。ロードしたいものを選択し、再度 "OK" をクリックします。 + +![](https://github.com/otykier/TabularEditor/blob/master/Documentation/Connect.png) + +このダイアログでは、Azure ASインスタンスの完全な名前 (「azureas://」で始まる) を指定すると、Azure Analysis Servicesインスタンスに接続することもできます。ローカルインスタンス」ドロップダウンを使用して、Power BI DesktopまたはVisual Studio Integrated Workspacesの実行中のインスタンスを参照および接続できます。**Tabular EditorはTOMを通してPower BIモデルに変更を加えることができますが、これはMicrosoftによってサポートされておらず、.pbixファイルを破損する可能性があることに注意してください。自己責任で進めてください!**。 + +データベースがロードされた後、CTRL+Sを押すといつでも、データベースはTabular Editorで行った変更が更新されます。クライアントツール(Excel、Power BI、DAX Studioなど)は、この後すぐにデータベースの変更を見ることができるはずです。モデルへのクエリーを成功させるために、変更内容によってはモデル内のオブジェクトを手動で再計算する必要があることに注意してください。 + +接続したモデルをModel.bimファイルに保存したい場合は、「File」メニューから「Save As...」を選択します。 + +## デプロイメント + +現在ロードされているモデルを新しいデータベースにデプロイしたい場合、またはモデルの変更で既存のデータベースを上書きしたい場合(たとえばModel.bimファイルからロードする場合)、 "Model" > "Deploy..." にあるデプロイメント・ウィザードを使用します。ウィザードは、デプロイメントプロセスをガイドし、デプロイするモデルの領域を選択できます。[詳細はこちら](/Advanced-features#deployment-wizard)を参照してください。 + +## 階層的な表示 + +ロードされたモデルのオブジェクトは、画面左側のエクスプローラツリーに表示されます。デフォルトでは、すべてのオブジェクト・タイプ(可視テーブル、ロール、リレーションシップなど)が表示されます。テーブル、メジャー、カラム、階層のみを表示したい場合は、「表示」メニューから「すべてのオブジェクト・タイプを表示」をオフにします。 + +![image](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/AllObjectTypes.png) + +"テーブル" グループでテーブルを展開すると、デフォルトでは、テーブルに含まれるメジャー、列、および階層がそれぞれの表示フォ ルダに表示されます。このように、エンドユーザがクライアントツールで見るのと同じようにオブジェクトが配置されます。 + +![image2](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/DisplayFolders.png) + +エクスプローラツリーのすぐ上にあるボタンを使って、不可視オブジェクトの切り替え、フォルダー、メジャー、カラム、階層の表示、名前によるオブジェクトのフィルタリングを行うことができます。オブジェクトを選択し、F2キーを押すことで、オブジェクトの名前を変更できます。これは、表示フォルダーの場合も同じです。メジャーまたは計算列をダブルクリックすると、その [DAX式](/Advanced-features#dax-expression-editor) を編集できます。右クリックするとコンテキストメニューが表示され、可視性の設定、パースペクティブインクルージョン、階層への列の追加などの操作に便利なショートカットを利用できます。 + +## プロパティの編集 + +画面右下のプロパティグリッドは、エクスプローラツリーで選択されたオブジェクトのプロパティのほとんどを表示します。複数のオブジェクトを同時に選択した場合、Property Gridでは、選択したオブジェクトのプロパティを同時に編集すできます。これは、たとえば、Format Stringプロパティを設定する際に便利です。Property Gridで設定可能なプロパティの例。 + +* Name(エクスプローラツリーでF2を押すことにより、オブジェクトの名前を直接変更できます) +* Description(説明) +* Display Folder(エクスプローラツリーで直接名前を変更することもできます。) + +選択されたオブジェクトの種類によって、異なるプロパティが存在します。 + +## オブジェクトの複製と名前の一括変更 + +エクスプローラツリーの右クリック コンテキスト メニューを使用すると、メジャーや列を複製できます。複製されたオブジェクトには、名前の末尾に "copy "が付きます。さらに、複数のオブジェクトを選択してエクスプローラツリーで右クリックすると、一括で名前を変更できます。 + +![](https://github.com/otykier/TabularEditor/blob/master/Documentation/BatchRename.png) + +名前の変更にRegExを使用し、オプションで翻訳も同様に名前を変更するかどうかを選択できます。 + +## オブジェクトのドラッグ&ドロップ + +表示フォルダーに整理された多くのメジャー/カラムを持つモデルで作業する場合、Tabular Editorのもっとも便利な機能です。以下のアニメーションをご覧ください。 + +![](https://github.com/otykier/TabularEditor/blob/master/Documentation/DragDropFolders.gif) + +フォルダー全体がドラッグされると、フォルダーの下にあるすべてのオブジェクトの表示フォルダーのプロパティがどのように変更されるかに注目してください。表示フォルダーの構造を変更するために、メジャーや列を1つ1つ確認する必要はありません。見たままが手に入るのです。 + +(これは、翻訳にも有効です) + +## パースペクティブと翻訳を使った作業 + +既存のパースペクティブやトランスレーション(カルチャ)を追加/編集するには、エクスプローラツリーでモデル ノードをクリックし、プロパティ グリッドの一番下にある関連プロパティを探します。また、エクスプローラツリーが[すべてのオブジェクトタイプを表示](/Features-at-a-glance#hierarchical-display)の場合、ツリーの中で直接パースペクティブ、カルチャー、ロールを表示、編集することも可能です。 + +![](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/RolesPerspectivesTranslations.png) + +既存のパースペクティブ、ロール、翻訳を複製するには、右クリックメニューを開き、「複製」を選択します。この操作により、オブジェクトの完全なコピーが作成され、必要に応じて変更できます。 + +パースペクティブや翻訳を「実行中」に表示するには、画面上部のツールバーにある2つのドロップダウンリストを使用します。パースペクティブを選択すると、そのパースペクティブに含まれていないすべてのオブジェクトが非表示になり、翻訳を選択すると、翻訳された名前と表示フォルダーを使用してツリー内のすべてのオブジェクトが表示されます。F2キーを押してオブジェクトや表示フォルダーの名前を変更したり、ツリー内でオブジェクトをドラッグしたりすると、その変更は選択した翻訳にのみ適用されます。 + +## オブジェクトのコンテキストにおける視点/変換 + +ツリーで1つ以上のオブジェクトを選択すると、Property Grid 内に 4 つの特別なプロパティコレクションが表示されます。 + +* **Captions**, **Descriptions** and **Display Folders** は、モデル内のすべてのカルチャーのリストと、各カルチャーで選択されたオブジェクトの翻訳名、説明、表示フォルダーを表示します。 **Perspectives** は、モデル内のすべてのパースペクティブと、選択オブジェクトが各パースペクティブに属しているかどうかが表示されるリストを表示します。 + +これらのコレクションをProperty Gridで使用すると、1つまたは複数のオブジェクトの翻訳とパースペクティブの包含を一度に変更できます。 + +## Undo/Redoのサポート + +Tabular Editorで行った変更は、CTRL+Zで取り消し、その後CTRL+Yでやり直すことができます。取り消せる操作の数に制限はありませんが、Model.bimファイルを開いたり、データベースからモデルをロードすると、スタックがリセットされます。 + +モデルからオブジェクトを削除すると、削除されたオブジェクトを参照しているすべてのトランスレーション、パースペクティブ、リレーションシップも自動的に削除されます(通常 Visual Studioでは、オブジェクトを削除できないというエラーメッセージが表示されます)。間違って削除した場合は、Undo機能を使用して削除したオブジェクトを復元することができ、削除された翻訳、パースペクティブ、リレーションシップも復元されます。Tabular EditorはDAX式の依存関係を検出できますが、別のメジャーまたは計算された列のDAX式で使用されているメジャーまたは列を削除した場合、Tabular Editorは警告を表示しないことに注意してください。 diff --git a/te2/Ja-jp/ja-FormatDax.md b/te2/Ja-jp/ja-FormatDax.md new file mode 100644 index 0000000..9c889d8 --- /dev/null +++ b/te2/Ja-jp/ja-FormatDax.md @@ -0,0 +1,62 @@ +# FormatDaxの非推奨 + +Tabular Editorで利用可能な[ヘルパーメソッド](/Advanced-Scripting.md#helper-methods)の1つである `FormatDax` メソッドはTabular Editor 2.13.0のリリースで非推奨とされました。 + +非推奨になった理由は、https://www.daxformatter.com/ のウェブサービスで、複数のリクエストを連続して行うと負荷が高くなり、その結果、ウェブサービス側で問題が発生するようになったからです。これは、`FormatDax`メソッドがスクリプト内で呼び出されるたびにウェブリクエストを実行するためで、多くの人が以下のようなスクリプトを使用してきました。 + +**やめてくれ!** + +```csharp +foreach(var m in Model.AllMeasures) +{ + // DON'T DO THIS + m.Expression = FormatDax(m.Expression); +} +``` + +これは数十のメジャーを持つ小さなモデルでは問題ありませんが、www.daxformatter.comのトラフィックを見ると、上記のようなスクリプトが数千のメジャーを持つ複数のモデルにわたって、一日に数回でも実行されていることがわかります。 + +この問題に対処するため、Tabular Editor 2.13.0では、上記の構文で `FormatDax` が連続して3回以上呼び出されると警告を表示するようにしました。さらに、それ以降の呼び出しは、各呼び出しの間に5秒の遅延を設けて、スロットルされます。 + +## 代替構文 + +Tabular Editor 2.13.0では、FormatDaxを呼び出す方法が2種類導入されています。上記のスクリプトは、以下のどちらかに書き換えることができます。 + +```csharp +foreach(var m in Model.AllMeasures) +{ + m.FormatDax(); +} +``` + +...いや、単に...: + +```csharp +Model.AllMeasures.FormatDax(); +``` + +これらのアプローチは、すべての www.daxformatter.com の呼び出しを一回のリクエストにまとめます。お好みでグローバルメソッドの構文も使用できます。 + +```csharp +foreach(var m in Model.AllMeasures) +{ + FormatDax(m); +} +``` + +...いや、単に...: + +```csharp +FormatDax(Model.AllMeasures); +``` + +## 詳細はこちら + +技術的には、`FormatDax` は2つのオーバーロードされた拡張メソッドとして実装されています。 + +1) `void FormatDax(this IDaxDependantObject obj)` +2) `void FormatDax(this IEnumerable objects, bool shortFormat = false, bool? skipSpaceAfterFunctionName = null)` となります。 + +上記のオーバーロード#1はスクリプトの実行が完了したとき、あるいは新しい `void CallDaxFormatter()` メソッドの呼び出しが行われたときに、与えられたオブジェクトをフォーマットするためキューに入ります。オーバーロード #2は、単一のWebリクエストで www.daxformatter.com を直ちに呼び出し、列挙可能なすべてのオブジェクトに対してすべてのDAX式をフォーマットします。これらのメソッドのいずれかを、適切と思われる方法で使用できます。 + +新しいメソッドは、文字列の引数を取らないことに注意してください。このメソッドは、提供されたオブジェクトのすべてのDAXプロパティを考慮してフォーマットします (メジャーの場合はExpressionおよびDetailRowsExpressionプロパティ、KPIの場合はStatusExpression、TargetExpression、およびTrendExpressionなどです)。 diff --git a/te2/Ja-jp/ja-Getting-Started.md b/te2/Ja-jp/ja-Getting-Started.md new file mode 100644 index 0000000..b203bb5 --- /dev/null +++ b/te2/Ja-jp/ja-Getting-Started.md @@ -0,0 +1,101 @@ +# はじめに + +## インストール + +[リリースページ](https://github.com/otykier/TabularEditor/releases/latest)から.msiファイルをダウンロードし、.msiのインストールを実行するだけです。 + +## 前提条件 + +なし。 + +> [!NOTE] +> Tabular Editor は [Tabular Object Model](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) を使用して Model.bim ファイルや既存のデータベースとの間でメタデータの読み込みと保存を行います。これは.msiインストーラーに含まれています。[Analysis Services Client Libraries](https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-data-providers)については、マイクロソフト社の公式ドキュメントをご覧ください。 + +## システム要件 + +- **Operating system:** Windows 7, Windows 8, Windows 10, Windows Server 2016, Windows Server 2019 or newer +- **.NET Framework:** [4.6](https://dotnet.microsoft.com/download/dotnet-framework) + +## Tabular Editorでの作業 + +推奨されるワークフローは、通常通りSSDTを使ってテーブルとリレーションシップを設定し、あとはTabular Editorで行うことです。つまり計算列、メジャー、階層、パースペクティブ、トランスレーション、表示フォルダー、その他あらゆる種類の微調整を行います。 + +Model.bimファイルを読み込むには、FileメニューからOpen > From File... オプションを選択するか(CTRL+O)、既存のデータベースをAnalysis ServicesのインスタンスからOpen > From DB... オプションを選択します。後者の場合、サーバー名とオプションの認証情報を入力するよう求められます。 + +![既にデプロイされているTabularモデルへの接続](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/Connect.png) + +これは、新しいAzure Analysis Services PaaSでも機能します。ローカルインスタンス」ドロップダウンを使用して、Power BI DesktopまたはVisual Studio Integrated Workspacesの実行中のインスタンスを参照および接続できます。**Tabular Editor は TOM を通して Power BI モデルに変更を加えることができますが、すべてのモデリング操作が Microsoft によってサポートされているわけではないことに注意してください。[詳細](/Power-BI-Desktop-Integration)**。 + +OK "をクリックすると、サーバー上のデータベースのリストが表示されます。 + +これが、モデルをTabular Editorにロードした後のUIの様子です。 + +![The main UI of Tabular Editor](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/Main%20UI.png) + +画面の左側のツリーには、タブラ・モデル内のすべてのテーブルが表示されます。テーブルを展開すると、テーブル内のすべての列、メジャー、および階層が、表示フォルダーごとにグループ化されて表示されます。ツリーのすぐ上にあるボタンを使って、表示フォルダー、非表示オブジェクト、特定のタイプのオブジェクトを切り替えたり、名前でオブジェクトをフィルタリングしたりできます。ツリー内の任意の場所を右クリックすると、新しいメジャーの追加、オブジェクトの非表示、オブジェクトの複製、オブジェクトの削除など、一般的なアクションを含むコンテキストメニューが表示されます。F2キーを押して現在選択されているオブジェクトの名前を変更したり、複数選択して右クリックすることで複数のオブジェクトの名前を一括で変更できます。 + +![Batch Renaming lets you rename multiple objects simultaneously](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/BatchRename.png) + +メインUIの右上には、DAXエディターがあり、モデル内の任意のメジャーまたは計算列のDAX式を編集するために使用できます。DAX Formatter」ボタンをクリックすると、www.daxformatter.comを通じてコードを自動的にフォーマットできます。 + +右下隅にあるプロパティ・グリッドを使用して、フォーマット文字列、説明、トランスレーション、パースペクティブ・メンバーシップなどのオブジェクトのプロパティを調べたり設定したりできます。表示フォルダーのプロパティもここで設定できますが、ツリー内のオブジェクトをドラッグ&ドロップして表示フォルダーを更新する方が簡単です(CTRLまたはSHIFTで複数のオブジェクトを選択してみてください)。 + +パースペクティブやトランスレーション(カルチャ)を編集するには、ツリーで「モデル」オブジェクトを選択し、プロパティ・グリッドで「モデルのパースペクティブ」または「モデルのカルチャ」プロパティを見つけます。小さな楕円形のボタンをクリックすると、パースペクティブやカルチャを追加、削除、編集するためのコレクションエディターが開きます。 + +![Editing perspectives - click the elipsis button to the right](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/Edit%20Perspectives.png) + +変更をModel.bimファイルに戻して保存するには、保存ボタンをクリックするか、CTRL+Sを押します。既存のTabularデータベースを開いている場合、変更は直接データベースに保存されます。データベースをTabular Editorに読み込んでから変更された場合は、プロンプトが表示されます。CTRL+Zを押せばいつでも変更を取り消すことができます。 + +モデルを別の場所にデプロイしたい場合、"Model" メニューから "Deploy" を選択してください。 + +## デプロイメント + +Tabular Editorにはデプロイメントウィザードがあり、SSDTからデプロイする場合と比較して既存のデータベースにデプロイする場合、いくつかの利点があります。デプロイ先のサーバーとデータベースを選択した後、手元にあるデプロイ用の以下のオプションがあります。 + +![Deployment Wizard](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/Deployment.png) + +" Deploy Connections "ボックスをオフにすると、ターゲットデータベース上のすべてのデータソースが変更されないことを確認します。モデルに、ターゲットデータベースに存在しないデータソースを持つテーブルが1つ以上含まれている場合、エラーが表示されます。 + +同様に、"Deploy Table Partitions "をオフにすると、テーブル上の既存のパーティションは変更されず、パーティション内のデータはそのまま残されます。 + +ロールのデプロイ "にチェックを入れると、ターゲットデータベース内のロールはロードしたモデルの内容に更新されますが、"ロールメンバーのデプロイ "にチェックを入れないと、各ロールのメンバーはターゲットデータベースで変更されません。 + +## コマンドラインの使用方法 + +コマンド ラインを使用して、自動デプロイメントを行うことができます。GUIで利用可能なすべてのデプロイメントオプションは、コマンドラインでも利用可能です。 + +### 展開例 + +`TabularEditor.exe c:\Projects\Model.bim` + +Tabular Editor GUIを開き、指定されたModel.bimファイルをロードします(デプロイは行いません)。 + +`TabularEditor.exe c:\Projects\Model.bim -deploy localhost AdventureWorks` + +指定されたModel.bimファイルをlocalhost上で動作するSSASインスタンスにデプロイし、AdventureWorksデータベースを上書きまたは作成します。GUIはロードされません。 + +デフォルトでは、パーティション、データソース、ロールはターゲットデータベースで上書きされません。この動作は、上記のコマンドに以下のスイッチを1つ以上追加することで変更可能です。 + +* `-P` Overwrite **p**artitions +* `-C` Overwrite **c**onnections (data sources) +* `-R` Overwrite **r**oles +* `-M` Overwrite role **m**embers + +コマンドラインオプションの詳細については、[以下を参照してください。](/ja-Command-line-Options) + +> [!NOTE] +> TabularEditor.exe は Windows Forms アプリケーションなので、コマンドラインから実行するとアプリケーションが別のスレッドで実行され、呼び出し元にすぐに制御が戻されます。これは、バッチジョブの一部としてデプロイメントを実行する場合、ジョブを進める前にデプロイメントが成功するのを待つ必要があり、問題を引き起こす可能性があります。このような問題が発生した場合は、`start /wait` を使用して TabularEditor がその仕事を終えてから呼び出し元に制御を戻してください。 +> `start /wait TabularEditor.exe c:\Projects\Model.bim -deploy localhost AdventureWorks` + +## アドバンスト・スクリプティング + +Tabular Editorでは、C#を使用してロードされたモデルへの変更をスクリプト化できます。これは、一度に多くのオブジェクトにいくつかの変更を適用したい場合に実用的です。アドバンスト・スクリプト・エディターは、2つのオブジェクトにアクセスできます。 + +- `Selected` は、エクスプローラツリーで現在選択されているすべてのオブジェクトを表します。 +- `Model` で、Tabular Object Modelのツリー全体を表します。 + +アドバンスト・スクリプト・エディターには、使い始めに必要なインテリセンス機能がいくつか用意されています。 + +![IntelliSenseにより、Tabular Editorのスクリプトを作成することができます。](https://raw.githubusercontent.com/otykier/TabularEditor/master/Documentation/AdvancedEditor%20intellisense.png) + +アドバンスト・スクリプティングに関する詳しい説明とサンプルは、[こちら](/Advanced-Scripting)を参照してください。 diff --git a/te2/Ja-jp/ja-Importing-Tables.md b/te2/Ja-jp/ja-Importing-Tables.md new file mode 100644 index 0000000..4615d0d --- /dev/null +++ b/te2/Ja-jp/ja-Importing-Tables.md @@ -0,0 +1,149 @@ +# テーブルのインポート + +すでにレガシーデータソースがモデル内にある場合は、それを右クリックして「Import Tables...」を選択できます。Tabular Editorはデータソースで指定されたデータプロバイダと認証情報を使って接続を試みます。成功すれば、データソースからアクセス可能なすべてのデータベース、テーブル、ビューのリストが表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/49701892-35ea3900-fbf2-11e8-951a-8858179426c6.png) + +左側のテーブルまたはビューをクリックすると、右側にデータのプレビューが表示されます。このとき、含めたくない列の選択を解除できます。ただし、[The data import best practice](https://www.sqlbi.com/articles/data-import-best-practices-in-power-bi/) では、常にビューを使用し、タブラーモデルに必要な列のみをビューに含めることを推奨しています。UIには結果のSQLクエリが表示されます。デフォルトでは、Tabular Editorは `SELECT * FROM ...` を使ってテーブル/ビューをインポートしますが、プレビューで任意のカラムをトグルすると、結果のクエリにカラムのリストが明示的に表示されます。`SELECT * FROM ...` に戻すには、右上の "Select all columns" チェックボックスをトグルしてください。 + +複数のテーブル/ビューを選択して、一度にインポートできます。インポート "をクリックすると、選択されたすべてのテーブル/ビューは、メタデータからすべてのカラムが入力された新しいテーブルとしてインポートされます。各テーブルにパーティションが作成され、UIから出力されたSQLクエリが保持されます。 + +これだけです!もうTabular EditorとSSDTの間を行ったり来たりする必要はありません。 + +## レガシーデータソースと構造化データソースの比較に関するメモ + +現在、Tabular EditorにはM(Power Query)式から返されるメタデータを推測する方法がないため、このUIはレガシー(別名、プロバイダー)データソースのみをサポートしています。構造化データソースを使用しなければならない場合でも、一時的なレガシー接続を使用してテーブルスキーマを最初にインポートし(データソースがSQL、OLE DB、ODBCを通してアクセスできると仮定)、インポートしたテーブルのパーティションを手動で切り替えて、構造化データソースを使用することが可能です。WebサービスやAzure Data Lake Storageなどの「エキゾチックな」データソースからデータをインポートする場合、スキーマメタデータは自動的にインポートできませんが、[クリップボードを通じてメタデータ情報を提供するオプションがあります](/Importing-Tables#power-query-data-sources). + +しかし、一般的には、次のようなソースには常にレガシー接続を使用することをお勧めします。 + +* SQL Server databases +* Azure SQL Databases +* Azure SQL Data Warehouse +* Azure Databricks (through ODBC) +* Any relational OLEDB data source +* Any relational ODBC source + +Azure Active Directory with MFAを使用した認証については、こちらをご覧ください。 + +## 既存のデータソースがない場合のインポート + +モデルにまだデータソースが含まれていない場合、"Model" メニューから "Import Tables..." をクリックすることで、テーブルをインポートできます。結果として、UIは以下のようになります。 + +![image](https://user-images.githubusercontent.com/8976200/49702141-74cdbe00-fbf5-11e8-8a88-5bc2a0a6c80d.png) + +選択項目が「新しいデータソースを作成してモデルに追加する」のまま、「次へ」をクリックすると、接続ダイアログのUIが表示されます。このダイアログでは、接続の詳細を指定できます。 + +![image](https://user-images.githubusercontent.com/8976200/49702167-a5adf300-fbf5-11e8-8d06-d6670ad456d4.png) + +「OK」をクリックすると、指定した接続を使用する(レガシー)データソースがモデル内に作成され、上記のインポートページが表示されます。 + +リストの次のオプションである「一時的な接続を使用する」は、モデルに新しいデータソースが追加されません。つまり、モデルをデプロイする前に、新しくインポートされたテーブルのパーティションにデータソースを割り当てる責任があります。 + +最後のオプションである「他のアプリケーションからメタデータを手動でインポートする」は、列のメタデータのリストに基づいて新しいテーブルをインポートしたい場合に使用します。これは、構造化(Power Query)データソースに便利です(下記参照)(/Importing-Tables#power-query-data-sources)。 + +## SQL機能 + +SQL Server以外のデータソース(正確にはNative SQL Clientドライバーを使用しないデータソース)の場合、画面下部付近の2つのドロップダウンボックスに注目してください。 + +![image](https://user-images.githubusercontent.com/8976200/51613859-b952b600-1f24-11e9-8fd7-7c5269aaab26.png) + +テーブルインポートウィザードは、ソーステーブルまたはビューから200行のデータしか取得しないため、"行の削減 "ドロップダウンは、ソースにプレビューデータを照会する際に使用する行削減句を指定できます。"TOP"、"LIMIT"、"FETCH FIRST "など、もっとも一般的な行削減句を選できます。 + +識別子の引用 "ドロップダウンにより、生成されるSQL文におけるオブジェクト名 (カラム、テーブル) の引用方法を指定できます。これは、テーブルを表形式モデルにインポートする際、データプレビューとテーブルパーティションクエリで使用するSQLステートメントの両方に適用されます。デフォルトでは角括弧が使用されていますが、他の一般的な識別子の引用符に変更することもできます。 + +## テーブルのソースを変更する + +インポートページを表示させるもう1つの方法は、既存のテーブル(レガシーデータソースを使用)を右クリックし、「列の選択...」を選択することです。そのテーブルが以前にUIを使用してインポートされていた場合、インポートページには、ソーステーブル/ビューとインポートされた列があらかじめ選択されて表示されるはずです。列を追加・削除したり、モデルで選択したテーブルの代わりに、まったく別のテーブルをインポートすることもできます。テーブルの列が選択解除されたり、インポート元のテーブル/ビューに存在しなくなった場合、モデルから削除されることに注意してください。このような操作は、CTRL+Zでいつでも元に戻すことができます。 + +## テーブルメタデータのリフレッシュ + +バージョン2.8から、Tabular Editorに新しいUI機能が追加され、スキーマドリフトを簡単にチェックすることができるようになりました。つまり、データ型が変更されたカラムや、ソーステーブルやビューに追加または削除されたカラムを検出できます。このチェックは、モデルレベル(レガシーデータソースにのみ適用)、データソースレベル、テーブルレベル、パーティションレベルで実行できます。これは、オブジェクトを右クリックして、"Refresh Table Metadata... "を選択することで実行されます。 + +![image](https://user-images.githubusercontent.com/8976200/49702346-7e582580-fbf7-11e8-9a62-04c6963179e5.png) + +変更は、それぞれのテーブル上のすべてのデータカラムの「ソースカラム」と「データ型」プロパティに基づいて検出されます。何らかの変更が検出された場合、Tabular Editorは上記のUIを表示し、変更の詳細を示します。モデルに適用したくない変更を選択解除できますが、一部の変更は処理エラーを引き起こす可能性があることに注意してください(たとえば、ソーステーブル/ビュー/クエリーに存在しないソースカラムなど)。 + +このメカニズム(およびテーブルのインポートUI)では、ソースからメタデータを照会する際にFormatOnlyフラグが使用されます。つまり、ストアド・プロシージャを使用するテーブル・パーティションを持つことができます。FormatOnly-flagは、ストアドプロシージャが決して直接実行されないようにします。その代わり、サーバーが静的解析を行い、ストアドプロシージャの実行時に返されるであろう結果セットを記述したメタデータのみを返します。RDBMSによっては、ストアドプロシージャでFormatOnly-flagを使用する際に、いくつかの制限があります。SQL Serverをデータソースとして使用する場合のこのトピックに関する詳細については、[この記事](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql?view=sql-server-2017#remarks)を参照してください。 + +### CLIサポート + +コマンドラインから `-SC` フラグを使用して、モデルレベルのスキーマチェックを行うことができます。CLIでスキーマチェックを実行した場合、マッピングの問題のみが報告されることに注意してください。これはモデルに変更を加えることはありません。これはCI/CDパイプラインでTabular Editorを使っている場合に便利です。なぜなら、マッピングの問題はテスト/本番環境にモデルをデプロイした後に問題を引き起こす可能性があるからです。 + +### オブジェクトを無視する + +Tabular Editor 2.9.8では、スキーマチェック/メタデータリフレッシュの対象からオブジェクトを除外できます。これは、除外したいオブジェクトにアノテーションを設定することで制御します。アノテーションの名前には、以下のコードを使用します。アノテーションの値は空白のままでも、"1"、"true"、"yes "のいずれかを設定できます。注釈の値を "0"、"false"、"no "に設定すると、注釈が存在しないかのように、効果的に注釈を無効化します。 + +**Table flags:** + +* `TabularEditor_SkipSchemaCheck`: Tabular Editorがこのテーブルのスキーマチェックを完全にスキップするようにします。 +* `TabularEditor_IgnoreSourceColumnAdded`: Tabular Editorは、このテーブル上のどのテーブルカラムにもマッピングされていない追加カラムを無視します。 +* `TabularEditor_IgnoreDataTypeChange`: Tabular Editorは、テーブルのどのカラムでも、データ型の不一致を無視します。 +* `TabularEditor_IgnoreMissingSourceColumn`: Tabular Editorは、ソースカラムがソースに存在しないように見える場合、インポートされたカラムを無視します。 + +**Column flags:** + +* `TabularEditor_IgnoreDataTypeChange`: Tabular Editorは、この特定のカラムのデータ型の不一致を無視します。 +* `TabularEditor_IgnoreMissingSourceColumn`: Tabular Editorは、この特定のカラムに明らかに欠けているソースカラムを無視します。 + +このフラグは、UIとCLIの両方を通じてスキーマチェックに影響を与えます。 + +### 警告をエラーとして扱う + +デフォルトでは、パーティション・クエリを実行できなかった場合、またはインポートされたテーブルにソース・クエリ内のどの列とも一致しない列が含まれている場合、CLI はエラーを報告します。列のデータ型がソース・クエリの列と一致しない場合、またはソース・クエリにインポートされたテーブルのどの列にもマッピングされていない列が含まれている場合、CLIは警告を報告します。また、同じテーブルの異なるパーティションのソースクエリが同じカラムを返さない場合にも警告が表示されます。 + +Tabular Editorバージョン2.14.1以降では、上記の警告をすべてエラーとして報告するようにCLIの動作を変更できます。これを行うには、**model** レベルに以下のアノテーションを追加します。 + +* `TabularEditor_SchemaCheckNoWarnings`: Tabular Editorがすべてのスキーマチェックの警告をエラーとして扱うようにしました。 + +## Azure Active DirectoryとMFA + +Azure SQL DatabaseまたはAzure Synapse SQLプールからテーブルをインポートする場合、Azure Active Directoryの多要素認証が必要になる可能性があります。残念ながら、.NET Frameworkで使用されるSQL Native Clientプロバイダーでは、この認証はサポートされていません。代わりに、MSOLEDBSQLプロバイダーを使用してください(Analysis Services がテーブルからデータを読み込む際に、ネイティブ クライアントよりも一般的に高速になるという利点もあります)。ローカル・マシンで動作させるには、このドライバーの[最新(x86)バージョン](https://docs.microsoft.com/en-us/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver15)がインストールされていることを確認します。 + +以下は、MFAと連携するためのデータソースのセットアップの手順です。 + +1. 新しいレガシーデータソースを作成し、モデルに追加します。モデル > 新規データソース(レガシー) +2. プロバイダプロパティとして `System.Data.OleDb` を指定し、以下のような接続文字列を使用します(正しいサーバ名、データベース名、ユーザ名を代入してください)。 + +### Synapse SQLプールの場合 + +``` +Provider=MSOLEDBSQL;Data Source=-ondemand.sql.azuresynapse.net;User ID=daniel@adventureworks.com;Database=;Authentication=ActiveDirectoryInteractive +``` + +### Azure SQLデータベースの場合 + +``` +Provider=MSOLEDBSQL;Data Source=.database.windows.net;User ID=daniel@adventureworks.com;Database=;Authentication=ActiveDirectoryInteractive +``` + +3. このソースからテーブルをインポートするには、データソースを右クリックして「テーブルのインポート...」を選択すると、テーブルのインポートウィザードUIが表示され、ソースからのテーブル/ビューのリストが表示されるはずです。Synapse SQLプールの場合、データプレビューを機能させるために、行句として「TOP(NOLOCKなし)」を指定する必要があります。 +4. モデルをAnalysis Servicesにデプロイする際、テーブルデータの更新時にAnalysis Servicesがソースに対して認証を行うために、Service PrincipalのアプリケーションIDやシークレット、SQLアカウントなど、他の認証情報を指定する必要ありまる。これは、TMSLやSSMSを使用してデプロイ後に指定することもできますし、[CI/CDデプロイメントパイプラインの一部](https://tabulareditor.com/2020/06/20/DevOps5.html#creating-your-first-release-pipeline)としてセットアップすることもできます。 + +## スキーマ/メタデータの手動インポート + +テーブルのインポートウィザードでサポートされていないデータソースを使用している場合、メタデータを手動でインポートするオプションがあります。このオプションでは、左側のテーブルスキーマを入力または貼り付けるUIが提供され、列名とデータ型情報が自動的に解析されます。または、右側に各カラム名を手動で入力し、ドロップダウンでデータ型を選択することもできます。いずれにせよ、手動でテーブルを作成し、メインUIから個々のデータカラムを追加するよりも高速になります。完了したら、「インポート!」を押して、テーブル名とパーティション式を調整します。 + +左側のテキストを解析する際、Tabular Editorは特定のキーワードを検索し、情報がどのように構成されているかを判断します。データの解釈はかなり自由なので、たとえばCREATE TABLE SQLスクリプトのカラムリストや、後述するPower Queryの `Table.Schema(...)` 関数の出力を貼り付けることができます。唯一の要件は、テキストの各行がソースデータの1列を表していることです。 + +![image](https://user-images.githubusercontent.com/8976200/70419758-6f07f400-1a66-11ea-838d-9a587c8021ca.png) + +## Power Queryのデータソース + +Power Query/M式の実行や検証を公式にサポートする方法がないため、Tabular EditorはPower Queryデータソースを限定的にサポートしています。2.9.0では、テーブルのインポートウィザードの「他のアプリケーションからメタデータを手動でインポートする」オプションを使用すると、ExcelまたはPower BI DesktopのPower Queryからスキーマをインポートできます。ワークフローは以下の通りです。 + +- まず、モデルにPower Queryのデータソースが含まれていることを確認します。[データソース] > [新規データソース (Power Query)]を右クリックします。SQL Server からデータを読み込む場合は、プロトコルに「tds」を指定し、Database、Server、AuthenticationKind の各プロパティを記入します。 +- ![image](https://user-images.githubusercontent.com/8976200/70418811-6dd5c780-1a64-11ea-8332-d074c6b2d5c2.png) +- 他の種類のデータソースの場合、最初のモデルと最初のいくつかのテーブルをSSDTで作成し、データソースがどのように構成されるべきかを把握し、テーブルを追加するときだけ以下のテクニックを使用する方が簡単かもしれません。 +- Excel または Power BI Desktop内のPower Queryを使用して、ソースデータに接続し、必要な変換を適用します。 +- Power QueryのAdvanced Editorを使って、前回の出力に `Table.Schema(...)` [M function](https://docs.microsoft.com/en-us/powerquery-m/table-schema) を使用するステップを追加します。 + +![image](https://user-images.githubusercontent.com/8976200/70416018-5562ae80-1a5e-11ea-8962-529304ce83f0.png) + +- フル出力プレビューを選択し、クリップボードにコピー(CTRL+A、CTRL+C)して、テーブルのインポートウィザードのスキーマ/メタデータテキストボックスに貼り付けます。 + +![image](https://user-images.githubusercontent.com/8976200/70416817-2e0ce100-1a60-11ea-9e2b-430cecf88d0a.png) + +- 「インポート!」をクリックし、テーブルの適切な名前を指定します。 +- 最後に、Excel/Power BIで使用した、`Table.Schema(...)`関数で修正する前のオリジナルのM式を、新しく作成したテーブル上のパーティションに貼り付けます。M式を修正して、最初のステップで指定したソースを指すようにします。 + +![image](https://user-images.githubusercontent.com/8976200/70418985-dae95d00-1a64-11ea-8bfb-8dda16c33742.png) diff --git a/te2/Ja-jp/ja-Keyboard-Shortcuts.md b/te2/Ja-jp/ja-Keyboard-Shortcuts.md new file mode 100644 index 0000000..d404177 --- /dev/null +++ b/te2/Ja-jp/ja-Keyboard-Shortcuts.md @@ -0,0 +1,64 @@ +# Keyboard Shortcuts + +バージョン2.7.3より、Tabular Editorは以下のキーボードショートカットをサポートするようになりました。 + +|General|Shortcut| +|---|---| +|New model|Ctrl+N| +|Load model from a file|Ctrl+O| +|Load model from a database|Ctrl+Shift+O| +|Save model|Ctrl+S| +|Copy selection|Ctrl+C| +|Cut selection|Ctrl+X| +|Paste|Ctrl+V| +|Undo|Ctrl+Z| +|Redo|Ctrl+Y| +|Select All|Ctrl+A| +|~Launch Deployment Wizard~|~F6~| +|Launch Best Practice Analyzer|F10| + +|Expression Editor|Shortcut| +|---|---| +|Find|Ctrl+F| +|Find and replace|Ctrl+H| +|Go to definition|F12| +|Navigate back|Alt+Left arrow| +|Navigate forward|Alt+Right arrow| +|Format DAX|F6| +|Format DAX (Short lines)|Ctrl+F6| +|Comment lines|Ctrl+Shift+C| +|Uncomment lines|Ctrl+Shift+U| + +|Script Editor|Shortcut| +|---|---| +|Find|Ctrl+F| +|Find and replace|Ctrl+H| +|Run script|F5| + +|Explorer tree|Shortcut| +|---|---| +|Navigate up or down|Up / Down arrow| +|Expand / collapse current node|Right / Left arrow| +|Expand / collapse current node and all subnodes|Ctrl+Right / Left arrow| +|Expand / collapse entire tree|Ctrl+Shift+Right / Left arrow| +|Toggle measures|Ctrl+1| +|Toggle columns|Ctrl+2| +|Toggle hierarchies|Ctrl+3| +|Toggle display folders|Ctrl+4| +|Toggle hidden objects|Ctrl+5| +|Toggle Metadata Columns|Ctrl+F1| +|Toggle Alphabetical Ordering|Ctrl+F2| +|Toggle all object types|Ctrl+F3| +|Filter|Ctrl+F| +|Toggle filter|Ctrl+Shift+F| +|Edit Expression|Enter| +|Navigate back|Alt+Left arrow| +|Navigate forward|Alt+Right arrow| +|Show dependencies|F3| +|Make invisible|Ctrl+I| +|Make visible|Ctrl+U| +|Create new measure|Alt+1| +|Create new calculated column|Alt+2| +|Create new hierarchy|Alt+3| +|Create new data column|Alt+4| +|Create new table|Alt+5| diff --git a/te2/Ja-jp/ja-Maintaining-Calculations-using-Scripting.md b/te2/Ja-jp/ja-Maintaining-Calculations-using-Scripting.md new file mode 100644 index 0000000..a080c0e --- /dev/null +++ b/te2/Ja-jp/ja-Maintaining-Calculations-using-Scripting.md @@ -0,0 +1,21 @@ +# DAXロジックを一貫した方法で維持する + +この記事では、Tabular EditorのAdvanced Scripting機能を使用して、複数のオブジェクトにまたがるDAXロジックを一貫した方法で維持する方法について説明します。Useful Script Snippetsの記事](/Useful-script-snippets) では、同様のロジックを持つ [Custom Actions を使用して多数のメジャーをすばやく生成する方法](/Useful-script-snippets#generate-timeintelligence-measures) をすでに紹介しましたが、これはたとえばタイムインテリジェント計算の作成時に便利なものです。 + +この記事では、このアイデアを発展させて、TSVファイル(Tabulator Separated Values)内で必要なすべての計算を一元的に定義できるスクリプトの「フレームワーク」を作成することにする。TSVファイルを使う利点は、Excelで簡単に編集できるのと同時に、Tabular Editorのスクリプトから簡単にパースして読み込むことができることです。 + +今回は、アドベンチャーワークスのインターネット販売の事実と関連する次元に焦点を当てます。 + +![image](https://user-images.githubusercontent.com/8976200/44193845-85cd5d80-a134-11e8-8f39-2da1380fdc63.png) + +ファクト・テーブルには、7つの単純な `SUM` メジャーとして集約される多数の数値カラムがあります。 + +![image](https://user-images.githubusercontent.com/8976200/44196409-270be200-a13c-11e8-9994-0a8f2fa19e1a.png) + +この記事では、これらを **ベースメジャー** と呼ぶことにします。現実には、基本メジャーの数式はもっと複雑になる可能性がありますが、あとで説明するように、それは一般的には重要ではありません。中心的な考え方は、TSVファイルを使用して、基本メジャーに関連する一連の数式と、計算の外部で適用されるフィルター・コンテキストを定義することです。 + +***TODO*** + +というのも、私たちが作ろうとしている計算が、有効なフィルターのコンテキスト内で評価された1つ以上の基本指標から構築できる限りにおいて、です。 + +***TODO*** diff --git a/te2/Ja-jp/ja-Master-model-pattern.md b/te2/Ja-jp/ja-Master-model-pattern.md new file mode 100644 index 0000000..0816618 --- /dev/null +++ b/te2/Ja-jp/ja-Master-model-pattern.md @@ -0,0 +1,323 @@ +# Master Model Pattern + +組織内に複数のTabularモデルがあり、機能がかなり重複していることは珍しくありません。開発チームにとって、これらのモデルを共有機能で最新の状態に維持することは、苦痛を伴う場合があります。この記事では、これらのモデルをすべて1つの「マスター」モデルにまとめ、それをいくつかの異なるサブセットモデルに部分的にデプロイすることが理にかなっているような状況に適した別のアプローチについて見ていきます。Tabular Editorは、特別な方法でパースペクティブを利用することにより、このアプローチを可能にします(パースペクティブが通常の方法で機能することは可能です)。 + +**免責事項:** この手法は有効ですが、マイクロソフト社のサポートはありませんし、かなりの量の学習、スクリプト作成、ハッキングが必要です。あなたのチームに適した方法かどうか、ご自身で判断してください。 + +簡単のために、AdventureWorksのサンプルモデルを考えてみましょう。 + +![image](https://user-images.githubusercontent.com/8976200/43959290-895c1c96-9cae-11e8-8112-008f54cb400a.png) + +たとえば、何らかの理由で、インターネット販売に関連するすべてを1つのモデルとして配備し、再販に関連するすべてを別のモデルとして配備する必要があるとします。これは、セキュリティ上の理由、パフォーマンス、スケーラビリティ、あるいはあなたのチームが多くの外部顧客にサービスを提供しており、各顧客が共有機能と特定の機能の両方を含む独自のモデルのコピーを必要とするためかもしれません。 + +異なるバージョンごとに1つの開発ブランチを維持する代わりに、ここで紹介する手法では、デプロイ時にモデルをどのように分割するかを示すメタデータを使用して、1つのモデルだけを維持できます。 + +## パースペクティブの活用 + +考え方は非常にシンプルです。デプロイする必要のあるターゲットモデルの数に対応する数の新しいパースペクティブをモデルに追加することから始めます。これらのパースペクティブは、ユーザー指向のパースペクティブと区別するために、一貫した方法で接頭辞を付けることを確認します。 + +![image](https://user-images.githubusercontent.com/8976200/43960154-6b637042-9cb1-11e8-906b-6671bbb9558e.png) + +ここでは、パースペクティブ名のプレフィックスとして ``$`` 記号を使用しています。後で、これらのパースペクティブがどのようにモデルから取り除かれ、エンドユーザーがそれらを見ることがないようにするのかを見ます。これらはモデル開発者のみが使用します。 + +あとは、個々のモデルで必要なすべてのオブジェクトを、これらのパースペクティブに追加するだけです。モデルが必要なオブジェクトを含んでいることを確認するには、Tabular EditorのPerspectiveドロップダウンを使用します。ここに、すべての依存関係がパースペクティブにも含まれていることを確認するために使用できる便利なスクリプトがあります。 + +```csharp +// Look through all hierarchies in the current perspective: +foreach(var h in Model.AllHierarchies.Where(h => h.InPerspective[Selected.Perspective])) +{ + // Make sure columns used in hierarchy levels are included in the perspective: + foreach(var level in h.Levels) { + level.Column.InPerspective[Selected.Perspective] = true; + } +} + +// Loop through all measures and columns in the current perspective: +foreach(var obj in Model.AllMeasures.Cast() + .Concat(Model.AllColumns).Where(m => m.InPerspective[Selected.Perspective]) + .OfType().ToList()) +{ + // Loop through all objects that the current object depends on: + foreach(var dep in obj.DependsOn.Deep()) + { + // Include columns, measure and table dependencies: + var columnDep = dep as Column; if(columnDep != null) columnDep.InPerspective[Selected.Perspective] = true; + var measureDep = dep as Measure; if(measureDep != null) measureDep.InPerspective[Selected.Perspective] = true; + var tableDep = dep as Table; if(tableDep != null) tableDep.InPerspective[Selected.Perspective] = true; + } +} + +// Look through all columns that have a SortByColumn in the current perspective: +foreach(var c in Model.AllColumns.Where(c => c.InPerspective[Selected.Perspective] && c.SortByColumn != null)) +{ + c.SortByColumn.InPerspective[Selected.Perspective] = true; +} +``` + +**説明:** まず、スクリプトは現在のパースペクティブ(画面上部のドロップダウンで現在選択されているパースペクティブ)のすべての階層をループします。そのような階層ごとに、階層レベルとして使用されるすべての列がパースペクティブに表示されることを確認します。次に、スクリプトは、現在のパースペクティブのすべての列とメジャーをループします。これらのオブジェクトのそれぞれについて、メジャー、列、またはテーブル参照の形式をとるすべての DAX 依存関係もパースペクティブに含まれます。DISTINCTCOUNT('Customer'[CustomerId])` などの式は、[CustomerId]列自体と 'Customer' テーブルの両方に依存関係があるものとしてTabular Editorが扱うため、結果として 'Customer' テーブルのすべての列がパースペクティブに含まれることを注意してください。最後に、スクリプトは、「Sort By」列として使用されている列も含まれるようにします。 + +このスクリプトは、今後簡単に呼び出せるよう、モデルレベルのカスタムアクションとして保存しておくことをオススメします。 + +ちなみに、パースペクティブのコピーを作成したい場合は、すでにUIから行うことができます。エクスプローラツリーで「パースペクティブ」ノードをクリックし、プロパティグリッドの省略ボタンをクリックします。 + +![image](https://user-images.githubusercontent.com/8976200/44028910-c7ffab80-9efb-11e8-813a-5b0f5c137bab.png) + +パースペクティブの作成と削除、および既存のパースペクティブのクローンを作成するためのダイアログが表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/44028953-f13c91ca-9efb-11e8-936a-1f0e1d4eb93f.png) + +これを補足するために、少しきれいにする必要がある場合に備えて、パースペクティブからすべての不可視オブジェクトと未使用オブジェクトを削除するスクリプトを紹介します。 + +```csharp +// 現在のパースペクティブのすべての列をループします。 +foreach(var c in Model.AllColumns.Where(c => c.InPerspective[Selected.Perspective])) { + if( + //カラムが非表示の場合(または親テーブルが非表示の場合)。 + (c.IsHidden || c.Table.IsHidden) + + // また、どのようなリレーションでも使用しない: + && !c.UsedInRelationships.Any() + + // また、パースペクティブの他の列のSortByColumnとして使用されることはありません。 + && !c.UsedInSortBy.Any(sb => !sb.IsHidden && sb.InPerspective[Selected.Perspective]) + + // そして、パースペクティブのどの階層にも使用されていない。 + && !c.UsedInHierarchies.Any(h => h.InPerspective[Selected.Perspective]) + + // また、パースペクティブ内の他の可視オブジェクトのDAX式では参照されない。 + && !c.ReferencedBy.Deep().OfType() + .Any(obj => obj.InPerspective[Selected.Perspective] && !(obj as IHideableObject).IsHidden) + + // そして、どの役割からも参照されない。 + && !c.ReferencedBy.Roles.Any() ) + { + // 上記の全てに該当する場合、その列は現在のパースペクティブから削除することができます。 + c.InPerspective[Selected.Perspective] = false; + } +} + +// 現在の視点のすべてのメジャーをループします。 +foreach(var m in Model.AllMeasures.Where(m => m.InPerspective[Selected.Perspective])) { + if( + // メジャーが非表示である場合 (または、親テーブルが非表示である場合)。 + (m.IsHidden || m.Table.IsHidden) + + // また、パースペクティブ内の他の可視オブジェクトのDAX式では参照されない。 + && !m.ReferencedBy.Deep().OfType() + .Any(obj => obj.InPerspective[Selected.Perspective] && !(obj as IHideableObject).IsHidden) + ) + { + // 上記の全てに該当する場合、その列は現在のパースペクティブから削除することができます。 + m.InPerspective[Selected.Perspective] = false; + } +} +``` + +**説明** このスクリプトは、まず、現在選択されているパースペクティブのすべての列をループします。次のすべてが真である場合にのみ、パースペクティブから列を削除します。 + +* 列が非表示(または列の存在するテーブルが非表示)である +* 列はリレーションシップに関与していない +* 列は、パースペクティブ内の他の可視列の SortByColumn として使用されていない +* 列はパースペクティブ内の階層のレベルとして使用されていない +* 列はパースペクティブ内の他の可視オブジェクトの DAX 式で直接的または間接的に参照されていない +* 列は行レベルのフィルター式では使用されていない。 + +メジャーについても同様ですが、以下の基準を満たすメジャーのみを削除するように簡略化しています。 + +* メジャーが非表示である (または、メジャーの存在するテーブルが非表示である) +* メジャーが、パースペクティブ内の他の可視オブジェクトのDAX式で直接的または間接的に参照されていない。 + +もしあなたがモデルの開発に携わっている開発者チームであれば、すでにTabular Editorsの「フォルダーに保存」機能(/Advanced-features#folder-serialization)とGitなどのソース管理環境を使っていることでしょう。ファイル」→「環境設定」→「フォルダーに保存」で「オブジェクトごとにパースペクティブをシリアライズする」オプションを必ずチェックし、パースペクティブ定義で大量のマージ競合が発生しないようにしてください。 +![image](https://user-images.githubusercontent.com/8976200/44029969-935e0efe-9eff-11e8-93de-c1223f7ebe7f.png) + +## よりきめ細かい制御を可能にする + +もうお分かりかと思いますが、スクリプトを使用して、固定された開発者パースペクティブごとに1つのバージョンのモデルを作成する予定です。スクリプトは、指定された開発者パースペクティブに含まれないすべてのオブジェクトをモデルから削除するだけです。しかし、その前に、処理しなければならない状況がいくつかあります。 + +### 非主観的(non-perspective)なオブジェクトを制御する + +パースペクティブ、データソース、ロールなどの一部のオブジェクトは、パースペクティブ自体に含まれることも除外されることもありませんが、それらのどのモデルのバージョンに属するべきかを指定する必要があります。この場合、アノテーションを使用します。たとえば、Adventure Worksのモデルに戻ると、「在庫」と「インターネット運用」のパースペクティブは「$InternetModel」と「$ManagementModel」に、「Reseller Operation」は「$ResellerModel」と「$ManagementModel」に表示させることができます。 +そこで、3つのオリジナル視点それぞれに「DevPerspectives」という新しいアノテーションを追加し、開発者視点の名前をカンマ区切りの文字列として提供することにしましょう。 + +![image](https://user-images.githubusercontent.com/8976200/44032304-01bdcc70-9f07-11e8-9b28-db0912ea1ade.png) + +新しい *user* パースペクティブをモデルに追加するときは、同じアノテーションを追加し、*user* パースペクティブを含めたい開発者パースペクティブの名前を指定するのを忘れないようにしてください。後で最終的なモデルのバージョンをスクリプト化する際に、これらのアノテーションの情報を使用して、必要なパースペクティブを含めることになります。データ・ソースとロールについても、同じことができます。 + +### オブジェクトのメタデータを制御する + +また、同じメジャーでも、異なるモデルのバージョン間で微妙に異なる式やフォーマット文字列を持つべき状況もあるでしょう。この場合も、アノテーションを使用して開発者の視点ごとにメタデータを提供し、最終的なモデルをスクリプトアウトするときにメタデータを適用できます。 + +すべてのオブジェクトプロパティをテキストにシリアライズするもっとも簡単な方法は、おそらく [ExportProperties](/Useful-script-snippets#export-object-properties-to-a-file) スクリプト関数を使う方法でしょう。しかし、この使用例では少しやりすぎなので、アノテーションとして保存したいプロパティを直接指定することにしましょう。以下のスクリプトを作成します。 + +```csharp +foreach(var m in Selected.Measures) { + m.SetAnnotation(Selected.Perspective.Name + "_Expression", m.Expression); + m.SetAnnotation(Selected.Perspective.Name + "_FormatString", m.FormatString); + m.SetAnnotation(Selected.Perspective.Name + "_Description", m.Description); +} +``` + +そして、「メタデータをアノテーションとして保存する」という名前のカスタムアクションとして保存します。 + +![image](https://user-images.githubusercontent.com/8976200/44033695-7a754482-9f0b-11e8-937b-0bc0987ce7cb.png) + +同様に、以下のスクリプトを「Load Metadata from Annotations」というカスタムアクションとして保存します。 + +```csharp +foreach(Measure m in Selected.Measures) { + var expr = m.GetAnnotation(Selected.Perspective.Name + "_Expression"); if(expr == null) continue; + m.Expression = expr; + m.FormatString = m.GetAnnotation(Selected.Perspective.Name + "_FormatString"); + m.Description = m.GetAnnotation(Selected.Perspective.Name + "_Description"); +} +``` + +このアイデアは、開発者の視点ごとに、異なるバージョンを維持したいプロパティのために1つのアノテーションを作成することです。スクリプトで示した以外のプロパティ(Expression、FormatString、Description)を個別に管理する必要がある場合は、スクリプトに追加するだけでよい。他のオブジェクト・タイプでも同じことができますが、メジャーや計算列、パーティション(モデルのバージョンごとに異なるクエリ式を管理する場合など)以外では、おそらく意味がないでしょう。 + +新しいカスタムアクションを使用して、モデルバージョン固有の変更を開発者パースペクティブに適用します(または、手作業でアノテーションを追加します)。たとえば、Adventure Worksのサンプルでは[Day Count]メジャーに $ResellerModelパースペクティブで異なる式を持たせたいので、メジャーに変更を適用し、ドロップダウンで「$ResellerModel」パースペクティブを選択した状態で「アノテーションとしてメタデータを保存」アクションを呼び出します。 + +![image](https://user-images.githubusercontent.com/8976200/44033944-3104e414-9f0c-11e8-9f06-396bf85a0e4f.png) + +上記のスクリーンショットでは、各開発者パースペクティブに対して3つのアノテーションを作成しています。しかし、実際には、プロパティがネイティブの値と異なる開発者パースペクティブに対してのみ、これらのアノテーションを作成する必要があります。 + +## パーティションクエリーの変更 + +同様の手法で、異なるバージョン間のパーティションクエリに変更を加えることができます。たとえば、あるパーティションクエリーの `WHERE` 基準をバージョンによって変えたい場合です。まず、*table* オブジェクトに新しいアノテーションを作成し、各バージョンでパーティションが使用する基本SQLクエリを指定することから始めてみましょう。たとえば、3つのバージョンのうち2つのバージョンで、Productテーブルに含まれるレコードを制限したい場合です。 + +![image](https://user-images.githubusercontent.com/8976200/44736562-69221580-aaa4-11e8-82ee-88388015d30d.png) + +複数のパーティションがあるテーブルの場合、WHERE条件を「プレースホルダー」で指定し、あとで置き換える。 + +![image](https://user-images.githubusercontent.com/8976200/44737015-b3f05d00-aaa5-11e8-9bad-cadd5b4dae35.png) + +各パーティション内のプレースホルダー値を定義します(注意:UIでパーティションアノテーションを編集するには、[Tabular Editor v. 2.7.3](https://github.com/otykier/TabularEditor/releases/tag/2.7.3) 以降を使用する必要があります)。 + +![image](https://user-images.githubusercontent.com/8976200/44737199-2a8d5a80-aaa6-11e8-8813-8189b593da98.png) + +動的パーティション分割のシナリオでは、新しいパーティションを作成するとき、使用するスクリプトに、これらの注釈を含めることを忘れないでください。次のセクションでは、デプロイ時にこれらのプレースホルダー値を適用する方法について説明します。 + +## 異なるバージョンのデプロイ + +最後に、モデルを3つの異なるバージョンとしてデプロイする準備が整いました。残念ながら、Tabular EditorのデプロイメントウィザードUIでは、作成したパースペクティブやアノテーションに基づいてモデルを分割することができません。したがって、モデルを特定のバージョンに分解する追加のスクリプトを作成する必要があります。このスクリプトは、コマンドラインのデプロイの一部として実行することができ、デプロイプロセス全体をコマンドファイル、PowerShell実行ファイル、あるいはビルド/自動デプロイプロセスに統合できます。 + +必要なスクリプトは、次のようなものです。開発者の視点ごとに1つのスクリプトを作成することを考えます。スクリプトをテキストファイルとして保存し、`ResellerModel.cs`のような名前をつけます。 + +```csharp +var version = "`$`ResellerModel"; // TODO: Replace this with the name of your developer perspective + +// パースペクティブの一部でないテーブル、メジャー、列、階層を削除します。 +foreach(var t in Model.Tables.ToList()) { + if(!t.InPerspective[version]) t.Delete(); + else { + foreach(var m in t.Measures.ToList()) if(!m.InPerspective[version]) m.Delete(); + foreach(var c in t.Columns.ToList()) if(!c.InPerspective[version]) c.Delete(); + foreach(var h in t.Hierarchies.ToList()) if(!h.InPerspective[version]) h.Delete(); + } +} + +// アノテーションに基づくユーザー視点と、すべての開発者視点を削除します。 +foreach(var p in Model.Perspectives.ToList()) { + if(p.Name.StartsWith("`$`")) p.Delete(); + + // DevPerspectives "アノテーションを持たない他のすべてのパースペクティブを保持し、同時に + // アノテーションでが指定されていない場合は、アノテーションを持つもの。 + if(p.GetAnnotation("DevPerspectives") != null && !p.GetAnnotation("DevPerspectives").Contains(version)) + p.Delete(); +} + +// アノテーションに基づきデータソースを削除します。 +foreach(var ds in Model.DataSources.ToList()) { + if(ds.GetAnnotation("DevPerspectives") == null) continue; + if(!ds.GetAnnotation("DevPerspectives").Contains(version)) ds.Delete(); +} + +// アノテーションに基づきロールを削除する。 +foreach(var r in Model.Roles.ToList()) { + if(r.GetAnnotation("DevPerspectives") == null) continue; + if(!r.GetAnnotation("DevPerspectives").Contains(version)) r.Delete(); +} + +// アノテーションに基づくメジャーの修正。 +foreach(Measure m in Model.AllMeasures) { + var expr = m.GetAnnotation(version + "_Expression"); if(expr == null) continue; + m.Expression = expr; + m.FormatString = m.GetAnnotation(version + "_FormatString"); + m.Description = m.GetAnnotation(version + "_Description"); +} + +// アノテーションに応じたクエリの分割を設定する。 +foreach(Table t in Model.Tables) { + var queryWithPlaceholders = t.GetAnnotation(version + "_PartitionQuery"); if(queryWithPlaceholders == null) continue; + + // このテーブルのすべてのパーティションをループします。 + foreach(Partition p in t.Partitions) { + + var finalQuery = queryWithPlaceholders; + + // プレースホルダー値をすべて置き換える。 + foreach(var placeholder in p.Annotations.Keys) { + finalQuery = finalQuery.Replace("%" + placeholder + "%", p.GetAnnotation(placeholder)); + } + + p.Query = finalQuery; + } +} + +// TODO: アノテーションに基づき、他のオブジェクトを修正する(該当する場合)... +``` + +**Explanation:** まず、スクリプトの1行目で定義されたパースペクティブの一部ではない、すべてのテーブル、列、メジャー、および階層を削除します。次に、前述の「DevPerspectives」アノテーションを適用した可能性のある追加オブジェクトと、すべての開発者パースペクティ ブそのものを削除します。その後、アノテーションに基づくメジャー式、フォーマット文字列、説明文の変更があれば、それを適用します。最後に、アノテーションで定義されたパーティションクエリーを適用し(ある場合)、プレースホルダーの値をアノテーションされた値に置き換えます(ある場合)。 + +このスクリプトに直接特定のモデルの変更を追加することもできますが、この演習の要点は、Tabular Editorの中から直接複数のモデルを管理する方法です。上記のスクリプトは、どのバージョンをデプロイする場合でも同じです(もちろん、1行目を除きます)。 + +最後に、以下の[コマンドライン構文](/Command-line-Options)を使って、Model.bimファイルをロードし、スクリプトを実行し、変更したモデルを一度にデプロイできます。 + +```sh +start /wait /d "c:\Program Files (x86)\Tabular Editor" TabularEditor.exe Model.bim -S ResellerModel.cs -D localhost AdventureWorksReseller -O -R +``` + +インターネット版や管理版を導入する場合も同様に、対応するスクリプトを用意する必要があります。 + +```sh +start /wait /d "c:\Program Files (x86)\Tabular Editor" TabularEditor.exe Model.bim -S InternetModel.cs -D localhost AdventureWorksInternet -O -R +start /wait /d "c:\Program Files (x86)\Tabular Editor" TabularEditor.exe Model.bim -S ManagementModel.cs -D localhost AdventureWorksManagement -O -R +``` + +これは、Model.bimファイル(または "Save to Folder "機能を使用している場合はDatabase.jsonファイル)のディレクトリ内でコマンドラインを実行していることを想定しています。-Sスイッチは与えられたスクリプトをモデル適用するようTabular Editorに指示し、-Dスイッチはデプロイを実行します。-Oスイッチで既存のデータベースを同名で上書きし、-Rスイッチでターゲットデータベースのロールも上書きすることを指示します。 + +## マスターモデル処理 + +処理専用のサーバーがあり、大量のデータが個々のモデル間で重複している場合、データを分割する前に、まずマスターモデルに処理することが理にかなっている場合があります。このようにすれば、同じデータを何度も個別のモデルに処理することを避けることができます。**ただし、[このセクション](/Master-model-pattern#altering-partition-queries)で示したように、バージョン間でパーティションクエリが変更されたテーブルを処理しないことが前提になります**。 + +1. (オプション - メタデータの変更があった場合)マスターモデルを処理サーバーにデプロイする +2. マスターモデルに対して必要な処理を行う(バージョン固有のパーティションクエリを持つテーブルは処理しない) +3. マスターモデルを各個別モデルに同期させ、同期後に上記のコマンドを使用して個別モデルをストリップダウンし、必要に応じてProcessRecalcを実行します。 +4. (オプション)個別モデルで、バージョン固有のパーティションクエリを持つテーブルを処理する。 + +## ヒントとコツ + +カスタムアノテーションを多用するようになると、特定のアノテーションを持つすべてのオブジェクトをリストアップしたい状況が発生することがあります。そこで、Filter-BoxのDynamic LINQ式が役に立ちます。 + +まず最初に、"$InternetModel_Expression" という名前のアノテーションを追加したすべてのオブジェクトを見つけたい場合を考えてみましょう。Filterテキストボックスに次のように入力し、ENTERを押してください。 + +``` +:GetAnnotation("`$`InternetModel_Expression")<>null +``` + +また、"_Expression "という言葉で終わる注釈を持つすべてのオブジェクトを見つけたい場合は、次のようにします。 + +``` +:GetAnnotations().Any(EndsWith("_Expression")) +``` + +これらの関数は大文字と小文字を区別するので、アノテーションが小文字で書かれていた場合、上記のフィルタでは捕捉できないことに注意してください。 + +また、アノテーションが特定の値を持つオブジェクトを検索することもできます。 + +``` +:GetAnnotation(`$`InternetModel_Description).Contains("TODO") +``` + +## 結論 + +ここで説明したテクニックは、Calendarテーブルやその他の共通ディメンションなど、多くの共有機能を持つ多くの類似したモデルを管理する際に非常に役に立ちます。使用されるスクリプトはTabular Editorのカスタムアクションとしてきれいに再利用でき、実際のデプロイはさまざまな方法で自動化できます。 diff --git a/te2/Ja-jp/ja-Power-BI-Desktop-Integration.md b/te2/Ja-jp/ja-Power-BI-Desktop-Integration.md new file mode 100644 index 0000000..f2e690a --- /dev/null +++ b/te2/Ja-jp/ja-Power-BI-Desktop-Integration.md @@ -0,0 +1,25 @@ +# Power BIデスクトップとの連携 + +2020年7月現在、[Power BI Desktop は External Tools のサポートを追加します](https://docs.microsoft.com/da-dk/power-bi/create-reports/desktop-external-tools)。これにより、DesktopでImportedまたはDirectQueryデータを扱う際に、Tabular Editorで特定のモデリング操作を実行できるようになります。 + +![image](https://user-images.githubusercontent.com/8976200/87296924-dcea3180-c507-11ea-9cf9-2f647d26a2a9.png) + +## 前提条件 + +- 2020年7月版[Power BI Desktop](https://www.microsoft.com/en-us/download/details.aspx?id=58494) (またはそれ以降) +- [最新版 Tabular Editor](https://github.com/otykier/TabularEditor/releases/latest) +- Power BI Desktopのプレビュー機能で [Enhanced Metadata](https://docs.microsoft.com/en-us/power-bi/connect-data/desktop-enhanced-dataset-metadata) を有効化する。 + +また、[automatic date/time](https://docs.microsoft.com/en-us/power-bi/transform-model/desktop-auto-date-time) は **disabled** にすることを強く推奨します(Power BI Desktopの「データ読み込み」での設定)。 + +## 対応するモデリング操作 + +デフォルトでは、Power BI Desktopモデルに接続すると、Tabular Editorは限られた数のオブジェクトとプロパティしか編集できなくなります。これらは以下の通りです。 + +- メジャー(任意のプロパティの追加・削除・編集) +- 計算グループと計算項目(任意のプロパティの追加/削除/編集) +- パースペクティブ(任意のプロパティの追加・削除・編集) +- 翻訳(追加・削除) + - メタデータの変換は、モデル内のどのオブジェクトにも適用できますが、Power BI Desktopはデフォルトのモデル カルチャへの変換をまだサポートしていないことに注意してください。 + +**注意:** Tabular EditorのFile > Preferencesダイアログで "Allow unsupported Power BI features (experimental)" オプションを有効にすると、Tabular Editorは **any** オブジェクトとプロパティを編集できるようになり、Power BI Desktopがサポートしていないモデル変更を引き起こす可能性があり、クラッシュや破損した .pbixファイルを引き起こす可能性があるため、注意が必要です。この場合、Microsoftサポートは対応できませんので、自己責任で使用し、念のため.pbixファイルのバックアップをとっておいてください。 diff --git a/te2/Ja-jp/ja-Roadmap.md b/te2/Ja-jp/ja-Roadmap.md new file mode 100644 index 0000000..b0968b9 --- /dev/null +++ b/te2/Ja-jp/ja-Roadmap.md @@ -0,0 +1,98 @@ +# ロードマップ + +* TMSLまたはDAXへのオブジェクトのスクリプト化(DAX Editorとの互換性) +* DAX式エディターのインテリセンス +* Visual Studio用のプラグインの作成、Tabular Editorの起動 +* Tabular Editorプラグインのアーキテクチャ/開発者向け公開API +* VSTSを用いたビルド、テスト、公開、ドキュメントの自動化 +* [Done]Formula fix-up (i'e., DAX expression when renamed objects) +* [Done]オブジェクトの依存関係を示すUI +* [Done]コマンドラインからのスクリプト変更の可能性 +* [Done]より多くのオブジェクトの読み取り/編集の可能性。オブジェクト名の変更時にDAX式を自動的に修正) +* [Done]オブジェクトの依存関係を表示するUI +* [Done]コマンドラインからのスクリプト変更 +* [Done]より多くのオブジェクトタイプ(テーブル、パーティション、データカラム)を読み込み/編集可能 +* [Done]Source Controlワークフロー統合するためにModel.bimを複数のjsonファイル(たとえば、テーブルごとに1ファイル)に分割 +* [Done]Import/Export Translations(翻訳のインポート/エクスポート + +## TMSLやDAXへのオブジェクトのスクリプト化 + +エクスプローラツリーで1つまたは複数のオブジェクトを選択すると、そのオブジェクトのスクリプトを生成できるようにする必要があります。実際には、オブジェクトを他のテキストエディター(またはSSMS)にドラッグ&ドロップすることですでに可能ですが、エンドユーザーに何が起こっているかをより明確に伝えるために、同様の右クリックオプションがあるべきです。TMSLスクリプト(SSMS用)と[DAX Editor](https://github.com/DaxEditor/)で使用可能なDAXスタイルのコードの両方を生成することが可能であるべきです。 + +今日、メジャーと計算カラムはTabular Editorのインスタンス間でドラッグしてモデル間でコピーできますが、この機能をより良く公開するために、クリップボードまたはファイルから提供されたTMSLの一部をインポートするUIオプションがあるべきです。[this issue](https://github.com/otykier/TabularEditor/issues/69)を参照してください。最後に、標準的なコピー&ペーストのショートカットを有効にする必要があります。 + +## Tabular Editorを起動するためのVisual Studio用プラグインを作成する + +Model.bimファイルが閉じていることを確認し、Model.bimファイルをロードした状態でTabularEditor.exeを起動する、Visual Studioのシンプルなコンテキストメニュー拡張機能です。 + +## DAX式エディターでのインテリセンス + +エクスプレッション・エディターでDAXコードを記述する際、テーブル名、カラム名、メジャー名、関数(およびその引数)を補完するためのオートコンプリートボックスがポップアップ表示されるようにする必要があります。 + +[This issue](https://github.com/otykier/TabularEditor/issues/64)もご参照ください。 + +## Tabular Editorプラグインアーキテクチャ/開発者向け公開API + +C#を使って表形式モデルをスクリプトすることを好む人たちは、 今日すでに、アナリシス・サービスTOM APIを直接使う代わりに、「TOMWrapper.dll」を使うことができます。たとえば、TOMWrapperネームスペースでは、 便利なメソッドやプロパティを利用できるため、パースペクティブやトランスレーションを簡単に操作できます。 + +さらに一歩進んで、開発者向けに、より多くのタブラー・エディターの機能を公開するのもおもしろいでしょう。 + +* DAXオブジェクトのパース +* ベストプラクティス・アナライザーの結果にアクセスする +* Tabular EditorのUI(カスタムUIの有無にかかわらず、Tabular Editorの「プラグイン」を作成可能にすること) + +## VSTSを用いたビルド、テスト、パブリッシング、ドキュメントの自動化 + +VSTSを利用したDevOps、Tabular Editorのソースコード全般のクリーンアップ。 + +## フィックスアップ式 + +モデル・オブジェクトの名前が変更された場合、そのオブジェクトを参照しているすべてのDAX式は、変更された名前を反映するように更新される必要があります。 + +**Update**: 2.2より、この機能は「ファイル」→「環境設定」トグルでオンできるようになりました。 + +## オブジェクトの依存関係を表示するUI + +メジャーまたは計算された列を右クリックすると、ポップアップ ダイアログに依存関係ツリーが表示されるようにする必要があります。選択したオブジェクトに依存するオブジェクト、または選択したオブジェクトに依存するオブジェクトのいずれかを表示できるようにする必要があります。 + +**Update**:2.2より、この機能が利用できるようになりました。オブジェクトを右クリックして、"Show dependencies... "を選択するだけです。 + +## コマンドラインからのスクリプトによる変更 + +今日、コマンドラインから直接モデルをデプロイすることが可能です。同様に、モデル上で実行されるC#スクリプトを含む.csファイルをパイプで渡すことができるはずです。スクリプトの実行後、更新されたモデルを保存またはデプロイすることが可能であるべきです。そのためには、現在のコマンドラインオプションを少し変更する必要があります。 + +**Update**:2.3では、"-S "スイッチを使うことで、コマンドラインからスクリプトを実行することができるようになりました。デプロイは通常通り行われますが、修正したモデルを.bimとして保存したい場合は、"-B "スイッチを使用します。 + +## より多くのオブジェクトタイプの読み取り/編集が可能 + +現在、Tabular EditorではエンドユーザーはTabular Object Modelのオブジェクトのサブセットしか読み、編集することができません。モデルツリー内のすべてのオブジェクトをTabular Editorでアクセスできるようにすることが望まれます。リレーションシップ、KPI、計算テーブル、ロールは直接編集可能であるべきです。データソース、テーブル、データカラム、テーブルパーティションはいくつかの制約のもと編集可能であるべきです(例えば、Tabular Editorが任意のデータソースとクエリーからデータスキーマをフェッチできることを期待してはいけません)。 + +**Update**: 2.1では、多くの新しいオブジェクトタイプがツリーエクスプローラーに直接表示されます。右クリックメニューを使用して、これらのオブジェクトの多く(ロール、パースペクティブ、翻訳)を作成、複製、削除できます。リレーションシップやデータソースの作成/削除のサポートはまだ不足していますが、これは将来のリリースで提供される予定です。 + +**Update**: 2.2より、リレーションシップの作成と削除ができるようになりました。オブジェクトの種類は後ほど紹介します。 + +**Update**: 2.3から、テーブル、パーティション、データカラムの編集が可能になりました。Visual Studioはブランクモデル自体の作成にのみ必要で、他のすべてはTabular Editorで行うことができるようになりました。 + +**Update**: 前回のアップデートが嘘のように!KPIを忘れていました - しかし、バージョン2.4から作成/編集/削除ができるようになりました。 + +## Model.bim を複数の json ファイルに分割する + +Model.bimファイルのレイアウトと構造は、ソース管理およびバージョン管理の目的には恐ろしいものです。タブラーオブジェクトモデル全体が1つのファイルに書き込まれているだけでなく、このファイルには「ModifiedTime」情報が構造上のいたるところに含まれており、ソースコントロールのDIFF操作を無意味なものにしています。 + +Tabular Modelのリリース管理ワークフローを改善するために、Tabular EditorでModel.bimファイルをメジャーや計算カラムなどの個別ファイルを含むフォルダー構造として保存/ロードできるとおもしろいですね。このフォーマットから/へのModel.bimファイルのエクスポート/インポートに利用できるコマンドラインオプションがあるべきで、このフォーマットから直接デプロイが可能であるべきです(Model.bimファイル自体を必要としないケースで)。これらの個々のファイルは、Model.bimファイルと同じJSONを含みますが、"ModifiedTime "の情報は含みません。これにより、バージョン管理システムで簡単に使用でき、複数の開発者が同じモデルで作業できるようになります。 + +**Update**: [Available in 2.2](/Advanced-features#folder-serialization). + +**Update**: 2.3では、パースペクティブとトランスレーションのメタデータを、個々のオブジェクトのアノテーションとして保存するオプションがあります。これは、複数の開発者がいるソース管理シナリオで、開発者が翻訳やパースペクティブメンバーシップなどを変更したときに、多くの編集を受ける単一のファイルを持つことを避けるために便利です。 + +## Power BIとの互換性 + +現在、Power BI DesktopでホストされているモデルにTabular Editorを接続することはすでに可能です。やり方は、[ExcelやSSMSの場合はこちら](http://biinsight.com/connect-to-power-bi-desktop-model-from-excel-and-ssms/)と同じようなものです。この方法で、Power BI Desktopのモデルに表示フォルダーを追加することができ、.pbixファイルを保存して開き直った後でも、実際にPower BIに表示されたままです。ただし、互換性レベルの問題があるようなので、事前に調べておく必要があります。 + +**Update**:2.1より、Tabular EditorはPower BI DesktopとVisual Studio Integrated Workspacesの実行中のインスタンスを検出するようになりました。これらのインスタンスに接続し、通常のインスタンスと同様に変更を加えることができますが、Power BIや統合ワークスペースのモデルを変更するこの方法は、Microsoftによってサポートされていません。 + +## 翻訳のインポート/エクスポート + +これはSSDTの標準機能で、Tabular Editorにもあると便利な機能です。 + +**Update**: [Available in 2.2](/Advanced-features#import-export-translations). diff --git a/te2/Ja-jp/ja-SQL-Server-2017-support.md b/te2/Ja-jp/ja-SQL-Server-2017-support.md new file mode 100644 index 0000000..e616f43 --- /dev/null +++ b/te2/Ja-jp/ja-SQL-Server-2017-support.md @@ -0,0 +1,35 @@ +# SQL Server 2017対応 + +バージョン2.3から、Tabular EditorはSQL Server 2017 (Compatibility Level 1400)もサポートするようになりました。これは、Tabular EditorのUIが、[こちら](https://blogs.msdn.microsoft.com/analysisservices/2017/04/19/whats-new-in-sql-server-2017-ctp-2-0-for-analysis-services/) で説明されている新機能の一部を公開することを意味します。 + +ただし、これらの機能を使用するには、[Tabular Editor の適切なビルド](https://github.com/otykier/TabularEditor/releases/tag/2.5-CL1400) をダウンロードする必要があることに注意してください。これは、SQL Server 2017 / SSDT 17.0向けに新しいクライアントライブラリのセットがMicrosoftから提供されており、これらのライブラリはTabular EditorのSQL Server 2016-ビルドと互換性がないためです。新しいライブラリは、新しい[SSDTのバージョン](https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt)から取得できます(Visual Studio 2015が必要です)。 + +互換性レベル1400の機能が必要ない場合は、SQL Server 2016-ビルドの[Tabular Editor](https://github.com/otykier/TabularEditor/releases/tag/2.5)を使用できます。 + +ここでは、Tabular Editorで新機能がどのように使用されるかを簡単に説明します。 + +## 日付リレーションシップ + +すべてのリレーションシップで、プロパティ・グリッドの「Join on Date Behavior」プロパティが公開されるようになりました。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25297821/9dd46be0-26f0-11e7-92bf-10a921ed20dc.png) + +## バリエーション(列・階層再利用) + +プロパティグリッドの「バリエーション」プロパティを展開することで、カラムにバリエーションを設定できます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25297845/c69ecc5a-26f0-11e7-93af-b7a2a0cc9310.png) + +なお、**Object Level Security** はカラムレベルで指定することも可能です。 + +省略記号ボタンをクリックすると、バリエーションコレクションエディターが開き、ここからPower BIで列や階層を再浮上させる方法を設定できます。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25297884/fd4faf58-26f0-11e7-9a1a-df7a1b05f663.png) + +テーブルレベルで「バリエーションとしてのみ表示」プロパティを「True」に設定することを忘れないでください。 + +![image](https://cloud.githubusercontent.com/assets/8976200/25297917/2c1e4b64-26f1-11e7-8ce6-a62aef2b7d8a.png) + +**詳細行式**は、テーブルおよびメジャーに直接設定できます。ただし、現時点では、構文の強調表示やインテリセンスは使用できません。 + +Hierarchyオブジェクトは、ラグドヒエラルキーに便利な新しい**Hide Members**プロパティを公開します。 diff --git a/te2/Ja-jp/ja-TabularEditor.TOMWrapper.md b/te2/Ja-jp/ja-TabularEditor.TOMWrapper.md new file mode 100644 index 0000000..456f753 --- /dev/null +++ b/te2/Ja-jp/ja-TabularEditor.TOMWrapper.md @@ -0,0 +1,2375 @@ +# TabularEditor.TOMWrapper Reference + +これは、TOMWrapper APIの自動生成されたドキュメントです。特定のクラスやプロパティ、メソッドを探すには、「CTRL+F」または右側のサイドバーをご利用ください。 + +## `AddObjectType` + +```csharp +public enum TabularEditor.TOMWrapper.AddObjectType + : Enum, IComparable, IFormattable, IConvertible + +``` + +Enum + +| Value | Name | Summary | +| --- | --- | --- | +| `1` | Measure | | +| `2` | CalculatedColumn | | +| `3` | Hierarchy | | + +## `CalculatedColumn` + +CalculatedColumn の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.CalculatedColumn + : Column, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDetailObject, ITabularTableObject, IHideableObject, IErrorMessageObject, IDescriptionObject, IAnnotationObject, ITabularPerspectiveObject, IDaxObject, IExpressionObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Dictionary>` | Dependencies | | +| `String` | Expression | CalculatedColumn の Expression を取得または設定します。 | +| `Boolean` | IsDataTypeInferred | CalculatedColumn の IsDataTypeInferred を取得または設定します。 | +| `CalculatedColumn` | MetadataObject | | +| `Boolean` | NeedsValidation | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularNamedObject` | Clone(`String` newName = null, `Boolean` includeTranslations = True) | | +| `TabularNamedObject` | CloneTo(`Table` table, `String` newName = null, `Boolean` includeTranslations = True) | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | + +## `CalculatedTable` + +```csharp +public class TabularEditor.TOMWrapper.CalculatedTable + : Table, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IHideableObject, IDescriptionObject, IAnnotationObject, ITabularObjectContainer, IDetailObjectContainer, ITabularPerspectiveObject, IDaxObject, IDynamicPropertyObject, IErrorMessageObject, IExpressionObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Dictionary>` | Dependencies | | +| `String` | Expression | | +| `Boolean` | NeedsValidation | | +| `String` | ObjectTypeName | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | CheckChildrenErrors() | | +| `Boolean` | Editable(`String` propertyName) | | +| `void` | Init() | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | ReinitColumns() | モデルがDBに保存された後にこのメソッドを呼び出し、変更されたカラムをチェックする(式の変更の場合)。 | + +## `CalculatedTableColumn` + +CalculatedTableColumn の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.CalculatedTableColumn + : Column, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDetailObject, ITabularTableObject, IHideableObject, IErrorMessageObject, IDescriptionObject, IAnnotationObject, ITabularPerspectiveObject, IDaxObject +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Column` | ColumnOrigin | Gets or sets the ColumnOrigin of the CalculatedTableColumn. | +| `Boolean` | IsDataTypeInferred | Gets or sets the IsDataTypeInferred of the CalculatedTableColumn. | +| `Boolean` | IsNameInferred | Gets or sets the IsNameInferred of the CalculatedTableColumn. | +| `CalculatedTableColumn` | MetadataObject | | +| `String` | SourceColumn | Gets or sets the SourceColumn of the CalculatedTableColumn. | + +## `Column` + +Column の基底クラス宣言 + +```csharp +public abstract class TabularEditor.TOMWrapper.Column + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDetailObject, ITabularTableObject, IHideableObject, IErrorMessageObject, IDescriptionObject, IAnnotationObject, ITabularPerspectiveObject, IDaxObject +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Alignment` | Alignment | ColumnのAlignmentを取得または設定します。 | +| `String` | DataCategory | ColumnのDataCategoryを取得または設定します。 | +| `DataType` | DataType | ColumnのDataTypeを取得または設定します。 | +| `String` | DaxObjectFullName | | +| `String` | DaxObjectName | | +| `String` | DaxTableName | | +| `HashSet` | Dependants | | +| `String` | Description | ColumnのDescriptionを取得または設定します。 | +| `String` | DisplayFolder | ColumnのDisplayFolderを取得または設定します。 | +| `Int32` | DisplayOrdinal | ColumnのDisplayOrdinalを取得または設定します。 | +| `String` | ErrorMessage | ColumnのErrorMessageを取得または設定します。 | +| `String` | FormatString | ColumnのFormatStringを取得または設定します。 | +| `PerspectiveIndexer` | InPerspective | | +| `Boolean` | IsAvailableInMDX | Column の IsAvailableInMDX を取得または設定します。 | +| `Boolean` | IsDefaultImage | ColumnのIsDefaultImageを取得または設定します。 | +| `Boolean` | IsDefaultLabel | ColumnのIsDefaultLabelを取得または設定します。 | +| `Boolean` | IsHidden | ColumnのIsHiddenを取得または設定します。 | +| `Boolean` | IsKey | ColumnのIsKeyを取得または設定します。 | +| `Boolean` | IsNullable | ColumnのIsNullableを取得または設定します。 | +| `Boolean` | IsUnique | ColumnのIsUniqueを取得または設定します。 | +| `Boolean` | KeepUniqueRows | ColumnのKeepUniqueRowsを取得または設定します。 | +| `Column` | MetadataObject | | +| `Column` | SortByColumn | ColumnのSortByColumnを取得または設定します。 | +| `String` | SourceProviderType | ColumnのSourceProviderTypeを取得または設定します。 | +| `ObjectState` | State | ColumnのStateを取得または設定します。 | +| `AggregateFunction` | SummarizeBy | ColumnのSummarizeByを取得または設定します。 | +| `Table` | Table | | +| `Int32` | TableDetailPosition | ColumnのTableDetailPositionを取得または設定します。 | +| `TranslationIndexer` | TranslatedDescriptions |このColumnのローカライズされた説明文のコレクション。 | +| `TranslationIndexer` | TranslatedDisplayFolders | このColumnのローカライズされたDisplay Foldersのコレクション。 | +| `ColumnType` | Type | ColumnのTypeを取得または設定します。 | +| `IEnumerable` | UsedInHierarchies | このカラムがレベルとして使用されるすべての階層を列挙します。 | +| `IEnumerable` | UsedInRelationships | この列が参加するすべてのリレーションシップを列挙する(as または ) 。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Delete() | | +| `String` | GetAnnotation(`String` name) | | +| `void` | Init() | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | OnPropertyChanging(`String` propertyName, `Object` newValue, `Boolean&` undoable, `Boolean&` cancel) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `ColumnCollection` + +Column用のコレクションクラスです。一度に複数のオブジェクトにプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.ColumnCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Alignment` | Alignment | | +| `String` | DataCategory | | +| `DataType` | DataType | | +| `String` | Description | | +| `String` | DisplayFolder | | +| `Int32` | DisplayOrdinal | | +| `String` | FormatString | | +| `Boolean` | IsAvailableInMDX | | +| `Boolean` | IsDefaultImage | | +| `Boolean` | IsDefaultLabel | | +| `Boolean` | IsHidden | | +| `Boolean` | IsKey | | +| `Boolean` | IsNullable | | +| `Boolean` | IsUnique | | +| `Boolean` | KeepUniqueRows | | +| `Table` | Parent | | +| `Column` | SortByColumn | | +| `String` | SourceProviderType | | +| `AggregateFunction` | SummarizeBy | | +| `Int32` | TableDetailPosition | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `IEnumerator` | GetEnumerator() | | +| `String` | ToString() | | + +## `Culture` + +Culture の基本クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Culture + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IAnnotationObject, IDynamicPropertyObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | DisplayName | | +| `Culture` | MetadataObject | | +| `String` | Name | | +| `ObjectTranslationCollection` | ObjectTranslations | | +| `String` | StatsColumnCaptions | | +| `String` | StatsColumnDisplayFolders | | +| `String` | StatsHierarchyCaptions | | +| `String` | StatsHierarchyDisplayFolders | | +| `String` | StatsLevelCaptions | | +| `String` | StatsMeasureCaptions | | +| `String` | StatsMeasureDisplayFolders | | +| `String` | StatsTableCaptions | | +| `Boolean` | Unassigned | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Browsable(`String` propertyName) | | +| `TabularNamedObject` | Clone(`String` newName, `Boolean` includeTranslations) | | +| `Boolean` | Editable(`String` propertyName) | | +| `String` | GetAnnotation(`String` name) | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `CultureCollection` + +Cultureのためのコレクションクラス。一度に複数のオブジェクトにプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.CultureCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Model` | Parent | | + + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `CultureConverter` + +```csharp +public class TabularEditor.TOMWrapper.CultureConverter + : TypeConverter + +``` + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | CanConvertFrom(`ITypeDescriptorContext` context, `Type` sourceType) | | +| `Boolean` | CanConvertTo(`ITypeDescriptorContext` context, `Type` destinationType) | | +| `Object` | ConvertFrom(`ITypeDescriptorContext` context, `CultureInfo` culture, `Object` value) | | +| `Object` | ConvertTo(`ITypeDescriptorContext` context, `CultureInfo` culture, `Object` value, `Type` destinationType) | | +| `StandardValuesCollection` | GetStandardValues(`ITypeDescriptorContext` context) | | +| `Boolean` | GetStandardValuesExclusive(`ITypeDescriptorContext` context) | | +| `Boolean` | GetStandardValuesSupported(`ITypeDescriptorContext` context) | | + + +## `Database` + +```csharp +public class TabularEditor.TOMWrapper.Database + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Nullable` | CompatibilityLevel | | +| `Nullable` | CreatedTimestamp | | +| `String` | ID | | +| `Nullable` | LastProcessed | | +| `Nullable` | LastSchemaUpdate | | +| `Nullable` | LastUpdate | | +| `String` | Name | | +| `String` | ServerName | | +| `String` | ServerVersion | | +| `Database` | TOMDatabase | | +| `Nullable` | Version | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `DataColumn` + +DataColumn の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.DataColumn + : Column, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDetailObject, ITabularTableObject, IHideableObject, IErrorMessageObject, IDescriptionObject, IAnnotationObject, ITabularPerspectiveObject, IDaxObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `DataColumn` | MetadataObject | | +| `String` | SourceColumn | Gets or sets the SourceColumn of the DataColumn. | + +## `DataSource` + +DataSource の基底クラス宣言 + +```csharp +public abstract class TabularEditor.TOMWrapper.DataSource + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDescriptionObject, IAnnotationObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | Gets or sets the Description of the DataSource. | +| `DataSource` | MetadataObject | | +| `TranslationIndexer` | TranslatedDescriptions | Collection of localized descriptions for this DataSource. | +| `DataSourceType` | Type | Gets or sets the Type of the DataSource. | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | GetAnnotation(`String` name) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | + +## `DataSourceCollection` + +DataSourceのコレクションクラスです。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.DataSourceCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `Model` | Parent | | + + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `Dependency` + +```csharp +public struct TabularEditor.TOMWrapper.Dependency + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Int32` | from | | +| `Boolean` | fullyQualified | | +| `Int32` | to | | + +## `DependencyHelper` + +```csharp +public static class TabularEditor.TOMWrapper.DependencyHelper + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | AddDep(this `IExpressionObject` target, `IDaxObject` dependsOn, `Int32` fromChar, `Int32` toChar, `Boolean` fullyQualified) | | +| `String` | NoQ(this `String` objectName, `Boolean` table = False) | Removes qualifiers such as ' ' and [ ] around a name. | + +## `DeploymentMode` + +```csharp +public enum TabularEditor.TOMWrapper.DeploymentMode + : Enum, IComparable, IFormattable, IConvertible + +``` + +Enum + +| Value | Name | Summary | +| --- | --- | --- | +| `0` | CreateDatabase | | +| `1` | CreateOrAlter | | + +## `DeploymentOptions` + +```csharp +public class TabularEditor.TOMWrapper.DeploymentOptions + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | DeployConnections | | +| `DeploymentMode` | DeployMode | | +| `Boolean` | DeployPartitions | | +| `Boolean` | DeployRoleMembers | | +| `Boolean` | DeployRoles | | + +Static Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `DeploymentOptions` | Default | | +| `DeploymentOptions` | StructureOnly | | + +## `DeploymentResult` + +```csharp +public class TabularEditor.TOMWrapper.DeploymentResult + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `IReadOnlyList` | Issues | | +| `IReadOnlyList` | Warnings | | + +## `DeploymentStatus` + +```csharp +public enum TabularEditor.TOMWrapper.DeploymentStatus + : Enum, IComparable, IFormattable, IConvertible + +``` + +Enum + +| Value | Name | Summary | +| --- | --- | --- | +| `0` | ChangesSaved | | +| `1` | DeployComplete | | +| `2` | DeployCancelled | | + +## `Folder` + +TreeView内のFolderを表します。TOMのどのオブジェクトにも対応しません。 Folderは、それ自体が他の表示フォルダの中に位置することができるので、IDisplayFolderObjectを実装しています。 Folderは、子オブジェクトを含むことができるので、IParentObjectを実装しています。 + +```csharp +public class TabularEditor.TOMWrapper.Folder + : IDetailObject, ITabularTableObject, ITabularNamedObject, ITabularObject, INotifyPropertyChanged, ITabularObjectContainer, IDetailObjectContainer, IErrorMessageObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `IDetailObjectContainer` | Container | | +| `Culture` | Culture | | +| `String` | DisplayFolder | | +| `String` | ErrorMessage | | +| `String` | FullPath | | +| `TabularModelHandler` | Handler | | +| `Int32` | MetadataIndex | | +| `Model` | Model | | +| `String` | Name | | +| `ObjectType` | ObjectType | | +| `Table` | ParentTable | | +| `String` | Path | | +| `Table` | Table | | +| `TranslationIndexer` | TranslatedDisplayFolders | | +| `TranslationIndexer` | TranslatedNames | | + +Events + +| Type | Name | Summary | +| --- | --- | --- | +| `PropertyChangedEventHandler` | PropertyChanged | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | CheckChildrenErrors() | | +| `void` | Delete() | フォルダを削除しても、子オブジェクトは削除されず、単にフォルダが削除されるだけです。 子フォルダはすべて維持されます(ただし、表示フォルダの階層は上に移動します)。 | +| `IEnumerable` | GetChildren() | | +| `IEnumerable` | GetChildrenByFolders(`Boolean` recursive = False) | | +| `void` | SetFolderName(`String` newName) | | +| `void` | UndoSetPath(`String` value) | | + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Folder` | CreateFolder(`Table` table, `String` path = , `Boolean` useFixedCulture = False, `Culture` fixedCulture = null) | | + +## `FolderHelper` + +```csharp +public static class TabularEditor.TOMWrapper.FolderHelper + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ConcatPath(this `String` path, `String` additionalPath) | | +| `String` | ConcatPath(this `IEnumerable` pathBits) | | +| `IDetailObjectContainer` | GetContainer(this `IDetailObject` obj) | | +| `String` | GetDisplayFolder(this `IDetailObject` folderObject, `Culture` culture) | | +| `String` | GetFullPath(`ITabularNamedObject` obj) | | +| `Boolean` | HasAncestor(this `IDetailObject` child, `ITabularNamedObject` ancestor, `Culture` culture) | | +| `Boolean` | HasParent(this `IDetailObject` child, `ITabularNamedObject` parent, `Culture` culture) | | +| `Int32` | Level(this `String` path) | | +| `String` | PathFromFullPath(`String` path) | | +| `void` | SetDisplayFolder(this `IDetailObject` folderObject, `String` newFolderName, `Culture` culture) | | +| `String` | TrimFolder(this `String` folderPath) | | + +## `Hierarchy` + +Hierarchyの基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Hierarchy + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDetailObject, ITabularTableObject, IHideableObject, IDescriptionObject, IAnnotationObject, ITabularObjectContainer, ITabularPerspectiveObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | Hierarchy の Description を取得または設定します。 | +| `String` | DisplayFolder | Hierarchy の DisplayFolder を取得または設定します。 | +| `PerspectiveIndexer` | InPerspective | | +| `Boolean` | IsHidden | Hierarchy の IsHidden を取得または設定します。 | +| `LevelCollection` | Levels | | +| `Hierarchy` | MetadataObject | | +| `Boolean` | Reordering | 複数のレベルが1つのアクションとして再注文される場合、trueに設定されます。 | +| `ObjectState` | State | HierarchyのStateを取得または設定します。 | +| `Table` | Table | | +| `TranslationIndexer` | TranslatedDescriptions | この Hierarchy のローカライズされた説明文のコレクション。 | +| `TranslationIndexer` | TranslatedDisplayFolders | この階層にローカライズされた表示フォルダのコレクション。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Level` | AddLevel(`Column` column, `String` levelName = null, `Int32` ordinal = -1) | | +| `Level` | AddLevel(`String` columnName, `String` levelName = null, `Int32` ordinal = -1) | | +| `void` | AddLevels(`IEnumerable` columns, `Int32` ordinal = -1) | | +| `void` | CompactLevelOrdinals() | | +| `void` | Delete() | | +| `void` | FixLevelOrder(`Level` level, `Int32` newOrdinal) | | +| `String` | GetAnnotation(`String` name) | | +| `IEnumerable` | GetChildren() | | +| `void` | Init() | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | SetLevelOrder(`IList` order) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `HierarchyCollection` + +Hierarchyのコレクションクラス。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.HierarchyCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `String` | DisplayFolder | | +| `Boolean` | IsHidden | | +| `Table` | Parent | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `HierarchyColumnConverter` + +```csharp +public class TabularEditor.TOMWrapper.HierarchyColumnConverter + : TableColumnConverter + +``` + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | GetStandardValuesExclusive(`ITypeDescriptorContext` context) | | +| `Boolean` | IsValid(`ITypeDescriptorContext` context, `Object` value) | | + +## `IAnnotationObject` + +```csharp +public interface TabularEditor.TOMWrapper.IAnnotationObject + : ITabularObject, INotifyPropertyChanged + +``` + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | GetAnnotation(`String` name) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | + +## `IClonableObject` + +```csharp +public interface TabularEditor.TOMWrapper.IClonableObject + +``` + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularNamedObject` | Clone(`String` newName, `Boolean` includeTranslations) | | + +## `IDaxObject` + +```csharp +public interface TabularEditor.TOMWrapper.IDaxObject + : ITabularNamedObject, ITabularObject, INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | DaxObjectFullName | | +| `String` | DaxObjectName | | +| `String` | DaxTableName | | +| `HashSet` | Dependants | | + +## `IDescriptionObject` + +Objects that can have descriptions +```csharp +public interface TabularEditor.TOMWrapper.IDescriptionObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `TranslationIndexer` | TranslatedDescriptions | | + +## `IDetailObject` + +ディスプレイフォルダに格納可能なオブジェクトを表す。 +例 + +- Measures +- Columns +- Hierarchies +- Folders + +```csharp +public interface TabularEditor.TOMWrapper.IDetailObject + : ITabularTableObject, ITabularNamedObject, ITabularObject, INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | DisplayFolder | | +| `TranslationIndexer` | TranslatedDisplayFolders | | + +## `IDetailObjectContainer` + +表示フォルダーと同様に他のオブジェクトを含むことができるオブジェクトを表す。 + +例: + +- フォルダ +- テーブル + +```csharp +public interface TabularEditor.TOMWrapper.IDetailObjectContainer + : ITabularNamedObject, ITabularObject, INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Table` | ParentTable | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `IEnumerable` | GetChildrenByFolders(`Boolean` recursive = False) | | + +## `IErrorMessageObject` + +エラーメッセージを表示することができるオブジェクト + +```csharp +public interface TabularEditor.TOMWrapper.IErrorMessageObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ErrorMessage | | + +## `IExpressionObject` + +```csharp +public interface TabularEditor.TOMWrapper.IExpressionObject + : IDaxObject, ITabularNamedObject, ITabularObject, INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Dictionary>` | Dependencies | | +| `String` | Expression | | +| `Boolean` | NeedsValidation | | + +## `IHideableObject` + +表示/非表示が可能なオブジェクト + +```csharp +public interface TabularEditor.TOMWrapper.IHideableObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | IsHidden | | + + +## `IntelliSenseAttribute` + +```csharp +public class TabularEditor.TOMWrapper.IntelliSenseAttribute + : Attribute, _Attribute + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | + + +## `ITabularNamedObject` + +```csharp +public interface TabularEditor.TOMWrapper.ITabularNamedObject + : ITabularObject, INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Int32` | MetadataIndex | | +| `String` | Name | | +| `TranslationIndexer` | TranslatedNames | | + +## `ITabularObject` + +```csharp +public interface TabularEditor.TOMWrapper.ITabularObject + : INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Model` | Model | | +| `ObjectType` | ObjectType | | + +## `ITabularObjectCollection` + +```csharp +public interface TabularEditor.TOMWrapper.ITabularObjectCollection + : IEnumerable + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | CollectionName | | +| `TabularModelHandler` | Handler | | +| `IEnumerable` | Keys | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Add(`TabularNamedObject` obj) | | +| `void` | Clear() | | +| `Boolean` | Contains(`Object` value) | | +| `Boolean` | Contains(`String` key) | | +| `ITabularObjectCollection` | GetCurrentCollection() | | +| `Int32` | IndexOf(`TabularNamedObject` obj) | | +| `void` | Remove(`TabularNamedObject` obj) | | + +## `ITabularObjectContainer` + +他のオブジェクトを含むことができるTabularObjectは、このインタフェースを使用する必要がある。 + +```csharp +public interface TabularEditor.TOMWrapper.ITabularObjectContainer + +``` + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `IEnumerable` | GetChildren() | | + +## `ITabularPerspectiveObject` + +個々のパースペクティブで表示/非表示が可能なオブジェクト + +```csharp +public interface TabularEditor.TOMWrapper.ITabularPerspectiveObject + : IHideableObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `PerspectiveIndexer` | InPerspective | | + +## `ITabularTableObject` + +特定のテーブルに属するオブジェクト。 + +```csharp +public interface TabularEditor.TOMWrapper.ITabularTableObject + : ITabularNamedObject, ITabularObject, INotifyPropertyChanged + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Table` | Table | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Delete() | | + +## `KPI` + +KPI の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.KPI + : TabularObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, IDescriptionObject, IAnnotationObject, IDynamicPropertyObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | Gets or sets the Description of the KPI. | +| `Measure` | Measure | Gets or sets the Measure of the KPI. | +| `KPI` | MetadataObject | | +| `String` | StatusDescription | Gets or sets the StatusDescription of the KPI. | +| `String` | StatusExpression | Gets or sets the StatusExpression of the KPI. | +| `String` | StatusGraphic | Gets or sets the StatusGraphic of the KPI. | +| `String` | TargetDescription | Gets or sets the TargetDescription of the KPI. | +| `String` | TargetExpression | Gets or sets the TargetExpression of the KPI. | +| `String` | TargetFormatString | Gets or sets the TargetFormatString of the KPI. | +| `TranslationIndexer` | TranslatedDescriptions | Collection of localized descriptions for this KPI. | +| `String` | TrendDescription | Gets or sets the TrendDescription of the KPI. | +| `String` | TrendExpression | Gets or sets the TrendExpression of the KPI. | +| `String` | TrendGraphic | Gets or sets the TrendGraphic of the KPI. | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Browsable(`String` propertyName) | | +| `Boolean` | Editable(`String` propertyName) | | +| `String` | GetAnnotation(`String` name) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | + +## `Level` + +Levelの基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Level + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDescriptionObject, IAnnotationObject, ITabularTableObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Column` | Column | Gets or sets the Column of the Level. | +| `String` | Description | Gets or sets the Description of the Level. | +| `Hierarchy` | Hierarchy | Gets or sets the Hierarchy of the Level. | +| `Level` | MetadataObject | | +| `Int32` | Ordinal | Gets or sets the Ordinal of the Level. | +| `Table` | Table | | +| `TranslationIndexer` | TranslatedDescriptions | Collection of localized descriptions for this Level. | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Delete() | Deletes the level from the hierarchy. | +| `String` | GetAnnotation(`String` name) | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | OnPropertyChanging(`String` propertyName, `Object` newValue, `Boolean&` undoable, `Boolean&` cancel) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `LevelCollection` + +Levelのコレクションクラスです。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.LevelCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `Hierarchy` | Parent | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Add(`Level` item) | | +| `Boolean` | Remove(`Level` item) | | +| `String` | ToString() | | + +## `LogicalGroup` + +```csharp +public class TabularEditor.TOMWrapper.LogicalGroup + : ITabularNamedObject, ITabularObject, INotifyPropertyChanged, ITabularObjectContainer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Int32` | MetadataIndex | | +| `Model` | Model | | +| `String` | Name | | +| `ObjectType` | ObjectType | | +| `TranslationIndexer` | TranslatedNames | | + +Events + +| Type | Name | Summary | +| --- | --- | --- | +| `PropertyChangedEventHandler` | PropertyChanged | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `IEnumerable` | GetChildren() | | + +## `LogicalTreeOptions` + +```csharp +public enum TabularEditor.TOMWrapper.LogicalTreeOptions + : Enum, IComparable, IFormattable, IConvertible + +``` + +Enum + +| Value | Name | Summary | +| --- | --- | --- | +| `1` | DisplayFolders | | +| `2` | Columns | | +| `4` | Measures | | +| `8` | KPIs | | +| `16` | Hierarchies | | +| `32` | Levels | | +| `64` | ShowHidden | | +| `128` | AllObjectTypes | | +| `256` | ShowRoot | | +| `447` | Default | | + +## `Measure` + +Measure の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Measure + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDetailObject, ITabularTableObject, IHideableObject, IErrorMessageObject, IDescriptionObject, IExpressionObject, IDaxObject, IAnnotationObject, ITabularPerspectiveObject, IDynamicPropertyObject, IClonableObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `DataType` | DataType | メジャーの DataType を取得または設定します。 | +| `String` | DaxObjectFullName | | +| `String` | DaxObjectName | | +| `String` | DaxTableName | | +| `HashSet` | Dependants | | +| `Dictionary>` | Dependencies | | +| `String` | Description | メジャーの説明を取得または設定します。 | +| `String` | DisplayFolder | メジャーの DisplayFolder を取得または設定します。 | +| `String` | ErrorMessage | メジャーの ErrorMessage を取得または設定します。 | +| `String` | Expression |メジャーのExpressionを取得または設定します。 | +| `String` | FormatString | メジャーの FormatString を取得または設定します。 | +| `PerspectiveIndexer` | InPerspective | | +| `Boolean` | IsHidden | メジャーの IsHidden を取得または設定します。 | +| `Boolean` | IsSimpleMeasure |メジャーの IsSimpleMeasure を取得または設定します。 | +| `KPI` | KPI | メジャーの KPI を取得または設定します。 | +| `Measure` | MetadataObject | | +| `Boolean` | NeedsValidation | | +| `ObjectState` | State | メジャーの状態を取得または設定します。 | +| `Table` | Table | | +| `TranslationIndexer` | TranslatedDescriptions | このメジャーに関するローカライズされた説明文のコレクション。 | +| `TranslationIndexer` | TranslatedDisplayFolders | この小節のローカライズされた表示フォルダのコレクション。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Browsable(`String` propertyName) | | +| `TabularNamedObject` | Clone(`String` newName = null, `Boolean` includeTranslations = True) | | +| `TabularNamedObject` | CloneTo(`Table` table, `String` newName = null, `Boolean` includeTranslations = True) | | +| `void` | Delete() | | +| `Boolean` | Editable(`String` propertyName) | | +| `String` | GetAnnotation(`String` name) | | +| `void` | Init() | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | OnPropertyChanging(`String` propertyName, `Object` newValue, `Boolean&` undoable, `Boolean&` cancel) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + + +## `MeasureCollection` + +Measure用のコレクションクラスです。一度に複数のオブジェクトにプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.MeasureCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `String` | DisplayFolder | | +| `String` | Expression | | +| `String` | FormatString | | +| `Boolean` | IsHidden | | +| `Boolean` | IsSimpleMeasure | | +| `KPI` | KPI | | +| `Table` | Parent | | + + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + + +## `Model` + +Model の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Model + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDescriptionObject, IAnnotationObject, ITabularObjectContainer +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `LogicalGroup` | GroupDataSources | | +| `LogicalGroup` | GroupPerspectives | | +| `LogicalGroup` | GroupRelationships | | +| `LogicalGroup` | GroupRoles | | +| `LogicalGroup` | GroupTables | | +| `LogicalGroup` | GroupTranslations | | + + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `IEnumerable` | AllColumns | | +| `IEnumerable` | AllHierarchies | | +| `IEnumerable` | AllLevels | | +| `IEnumerable` | AllMeasures | | +| `String` | Collation | モデルの照合順序を取得または設定します。 | +| `String` | Culture | モデルのCultureを取得または設定します。 | +| `CultureCollection` | Cultures | | +| `Database` | Database | | +| `DataSourceCollection` | DataSources | | +| `DataViewType` | DefaultDataView | モデルのDefaultDataViewを取得または設定します。 | +| `ModeType` | DefaultMode | モデルのDefaultModeを取得または設定します。| +| `String` | Description | モデルのDescriptionを取得または設定します。 | +| `Boolean` | HasLocalChanges |モデルのHasLocalChangesを取得または設定します。 | +| `IEnumerable` | LogicalChildGroups | | +| `Model` | MetadataObject | | +| `PerspectiveCollection` | Perspectives | | +| `RelationshipCollection2` | Relationships | | +| `ModelRoleCollection` | Roles | | +| `String` | StorageLocation | モデルのStorageLocationを取得または設定します。 | +| `TableCollection` | Tables | | +| `TranslationIndexer` | TranslatedDescriptions | この機種に関するローカライズされた説明文のコレクション。 | + + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `CalculatedTable` | AddCalculatedTable() | | +| `Perspective` | AddPerspective(`String` name = null) | | +| `SingleColumnRelationship` | AddRelationship() | | +| `ModelRole` | AddRole(`String` name = null) | | +| `Table` | AddTable() | | +| `Culture` | AddTranslation(`String` cultureId) | | +| `String` | GetAnnotation(`String` name) | | +| `IEnumerable` | GetChildren() | | +| `void` | Init() | | +| `void` | LoadChildObjects() | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | + + +## `ModelRole` + +ModelRole の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.ModelRole + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDescriptionObject, IAnnotationObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | ModelRoleのDescriptionを取得または設定します。 | +| `ModelRole` | MetadataObject | | +| `ModelPermission` | ModelPermission | ModelRoleのModelPermissionを取得または設定します。 | +| `RoleRLSIndexer` | RowLevelSecurity | | +| `TranslationIndexer` | TranslatedDescriptions | この ModelRole のローカライズされた説明文のコレクション。 | + + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularNamedObject` | Clone(`String` newName, `Boolean` includeTranslations) | | +| `void` | Delete() | | +| `String` | GetAnnotation(`String` name) | | +| `void` | InitRLSIndexer() | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + + +## `ModelRoleCollection` + +ModelRoleのコレクションクラスです。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.ModelRoleCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `ModelPermission` | ModelPermission | | +| `Model` | Parent | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `NullTree` + +```csharp +public class TabularEditor.TOMWrapper.NullTree + : TabularTree, INotifyPropertyChanged + +``` + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | OnNodesChanged(`ITabularObject` nodeItem) | | +| `void` | OnNodesInserted(`ITabularObject` parent, `ITabularObject[]` children) | | +| `void` | OnNodesRemoved(`ITabularObject` parent, `ITabularObject[]` children) | | +| `void` | OnStructureChanged(`ITabularNamedObject` obj = null) | | + +## `ObjectOrder` + +```csharp +public enum TabularEditor.TOMWrapper.ObjectOrder + : Enum, IComparable, IFormattable, IConvertible + +``` + +Enum + +| Value | Name | Summary | +| --- | --- | --- | +| `0` | Alphabetical | | +| `1` | Metadata | | + +## `ObjectType` + +```csharp +public enum TabularEditor.TOMWrapper.ObjectType + : Enum, IComparable, IFormattable, IConvertible + +``` + +Enum + +| Value | Name | Summary | +| --- | --- | --- | +| `-2` | Group | | +| `-1` | Folder | | +| `1` | Model | | +| `2` | DataSource | | +| `3` | Table | | +| `4` | Column | | +| `5` | AttributeHierarchy | | +| `6` | Partition | | +| `7` | Relationship | | +| `8` | Measure | | +| `9` | Hierarchy | | +| `10` | Level | | +| `11` | Annotation | | +| `12` | KPI | | +| `13` | Culture | | +| `14` | ObjectTranslation | | +| `15` | LinguisticMetadata | | +| `29` | Perspective | | +| `30` | PerspectiveTable | | +| `31` | PerspectiveColumn | | +| `32` | PerspectiveHierarchy | | +| `33` | PerspectiveMeasure | | +| `34` | Role | | +| `35` | RoleMembership | | +| `36` | TablePermission | | +| `1000` | Database | | + +## `Partition` + +Partitionの基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Partition + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDynamicPropertyObject, IErrorMessageObject, ITabularTableObject, IDescriptionObject, IAnnotationObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `DataSource` | DataSource | | +| `DataViewType` | DataView | PartitionのDataViewを取得または設定します。 | +| `String` | Description | パーティションの説明を取得または設定します。 | +| `String` | ErrorMessage | PartitionのErrorMessageを取得または設定します。 | +| `String` | Expression | | +| `Partition` | MetadataObject | | +| `ModeType` | Mode | Partition の Mode を取得または設定する。 | +| `String` | Name | | +| `String` | Query | | +| `DateTime` | RefreshedTime | | +| `String` | Source | | +| `PartitionSourceType` | SourceType | PartitionのSourceTypeを取得または設定します。 | +| `ObjectState` | State |PartitionのStateを取得または設定します。 | +| `Table` | Table | | +| `TranslationIndexer` | TranslatedDescriptions | このパーティションに関するローカライズされた説明文のコレクション。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Browsable(`String` propertyName) | | +| `Boolean` | Editable(`String` propertyName) | | +| `String` | GetAnnotation(`String` name) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `PartitionCollection` + +Partitionのコレクションクラス。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.PartitionCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `DataViewType` | DataView | | +| `String` | Description | | +| `ModeType` | Mode | | +| `Table` | Parent | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `Perspective` + +Perspectiveの基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Perspective + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDescriptionObject, IAnnotationObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | パースペクティブの説明を取得または設定します。 | +| `Perspective` | MetadataObject | | +| `TranslationIndexer` | TranslatedDescriptions | このパースペクティブのローカライズされた説明文のコレクション。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularNamedObject` | Clone(`String` newName, `Boolean` includeTranslations) | | +| `void` | Delete() | | +| `String` | GetAnnotation(`String` name) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `PerspectiveCollection` + +Perspectiveのためのコレクションクラスです。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.PerspectiveCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Description | | +| `Model` | Parent | | + + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `PerspectiveColumnIndexer` + +```csharp +public class TabularEditor.TOMWrapper.PerspectiveColumnIndexer + : PerspectiveIndexer, IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Column` | Column | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Refresh() | | +| `void` | SetInPerspective(`Perspective` perspective, `Boolean` included) | | + +## `PerspectiveHierarchyIndexer` + +```csharp +public class TabularEditor.TOMWrapper.PerspectiveHierarchyIndexer + : PerspectiveIndexer, IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Hierarchy` | Hierarchy | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Refresh() | | +| `void` | SetInPerspective(`Perspective` perspective, `Boolean` included) | | + +## `PerspectiveIndexer` + +```csharp +public abstract class TabularEditor.TOMWrapper.PerspectiveIndexer + : IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularNamedObject` | TabularObject | | + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Item | | +| `Boolean` | Item | | +| `IEnumerable` | Keys | | +| `Dictionary` | PerspectiveMap | | +| `String` | Summary | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | All() | すべてのパースペクティブにオブジェクトを含む。 | +| `Dictionary` | Copy() | | +| `void` | CopyFrom(`PerspectiveIndexer` source) | | +| `void` | CopyFrom(`IDictionary` source) | | +| `String` | GetDisplayName(`String` key) | | +| `IEnumerator` | GetEnumerator() | | +| `void` | None() | | +| `void` | Refresh() | | +| `void` | SetInPerspective(`Perspective` perspective, `Boolean` included) | | + +## `PerspectiveMeasureIndexer` + +```csharp +public class TabularEditor.TOMWrapper.PerspectiveMeasureIndexer + : PerspectiveIndexer, IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Measure` | Measure | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Refresh() | | +| `void` | SetInPerspective(`Perspective` perspective, `Boolean` included) | | + +## `PerspectiveTableIndexer` + +```csharp +public class TabularEditor.TOMWrapper.PerspectiveTableIndexer + : PerspectiveIndexer, IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Item | | +| `Table` | Table | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `PerspectiveTable` | EnsurePTExists(`Perspective` perspective) | | +| `void` | Refresh() | | +| `void` | SetInPerspective(`Perspective` perspective, `Boolean` included) | | + +## `ProviderDataSource` + +ProviderDataSource の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.ProviderDataSource + : DataSource, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IDescriptionObject, IAnnotationObject, IDynamicPropertyObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Account | ProviderDataSourceのAccountを取得または設定します。 | +| `String` | ConnectionString | ProviderDataSourceのConnectionStringを取得または設定します。 | +| `ImpersonationMode` | ImpersonationMode | ProviderDataSourceのImpersonationModeを取得または設定します。 | +| `DatasourceIsolation` | Isolation | ProviderDataSourceのIsolationを取得または設定します。 | +| `Boolean` | IsPowerBIMashup | | +| `String` | Location | | +| `Int32` | MaxConnections | ProviderDataSourceのMaxConnectionsを取得または設定します。 | +| `ProviderDataSource` | MetadataObject | | +| `String` | MQuery | | +| `String` | Name | | +| `String` | Password | ProviderDataSourceのPasswordを取得または設定します。 | +| `String` | Provider | ProviderDataSource のプロバイダを取得または設定します。 | +| `String` | SourceID | | +| `Int32` | Timeout | ProviderDataSourceのタイムアウトを取得または設定します。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Browsable(`String` propertyName) | | +| `Boolean` | Editable(`String` propertyName) | | +| `void` | Init() | | + +## `Relationship` + +リレーションシップの基底クラス宣言 + +```csharp +public abstract class TabularEditor.TOMWrapper.Relationship + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IAnnotationObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `CrossFilteringBehavior` | CrossFilteringBehavior | リレーションシップの CrossFilteringBehavior を取得または設定します。 | +| `Table` | FromTable | リレーションシップの FromTable を取得または設定します。 | +| `Boolean` | IsActive | リレーションシップのIsActiveを取得または設定します。 | +| `DateTimeRelationshipBehavior` | JoinOnDateBehavior | リレーションシップの JoinOnDateBehavior を取得または設定します。| +| `Relationship` | MetadataObject | | +| `Boolean` | RelyOnReferentialIntegrity | リレーションシップの RelyOnReferentialIntegrity を取得または設定します。 | +| `SecurityFilteringBehavior` | SecurityFilteringBehavior | リレーションシップの SecurityFilteringBehavior を取得または設定します。 | +| `ObjectState` | State | リレーションシップの状態を取得または設定します。 | +| `Table` | ToTable | リレーションシップのToTableを取得または設定します。 | +| `RelationshipType` | Type | リレーションシップのTypeを取得または設定します。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | GetAnnotation(`String` name) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | + + +## `RelationshipCollection` + +リレーションシップのためのコレクションクラス。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.RelationshipCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `CrossFilteringBehavior` | CrossFilteringBehavior | | +| `Boolean` | IsActive | | +| `DateTimeRelationshipBehavior` | JoinOnDateBehavior | | +| `Model` | Parent | | +| `Boolean` | RelyOnReferentialIntegrity | | +| `SecurityFilteringBehavior` | SecurityFilteringBehavior | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `RelationshipCollection2` + +```csharp +public class TabularEditor.TOMWrapper.RelationshipCollection2 + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `CrossFilteringBehavior` | CrossFilteringBehavior | | +| `Boolean` | IsActive | | +| `DateTimeRelationshipBehavior` | JoinOnDateBehavior | | +| `Model` | Parent | | +| `Boolean` | RelyOnReferentialIntegrity | | +| `SecurityFilteringBehavior` | SecurityFilteringBehavior | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `RoleRLSIndexer` + +RoleRLSIndexerは、ある特定のロールに対して、モデル内の全てのテーブルを横断する全てのフィルタを参照するために使用されます。これはTableRLSIndexerとは対照的で、1つの特定のテーブルに対して、モデル内の全てのロールを横断してフィルタを参照するものです。 + +```csharp +public class TabularEditor.TOMWrapper.RoleRLSIndexer + : IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `ModelRole` | Role | | + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Item | | +| `String` | Item | | +| `IEnumerable` | Keys | | +| `Dictionary` | RLSMap | | +| `String` | Summary | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Clear() | | +| `void` | CopyFrom(`RoleRLSIndexer` source) | | +| `String` | GetDisplayName(`String` key) | | +| `IEnumerator` | GetEnumerator() | | +| `void` | Refresh() | | +| `void` | SetRLS(`Table` table, `String` filterExpression) | | + +## `SerializeOptions` + +```csharp +public class TabularEditor.TOMWrapper.SerializeOptions + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | IgnoreInferredObjects | | +| `Boolean` | IgnoreInferredProperties | | +| `Boolean` | IgnoreTimestamps | | +| `HashSet` | Levels | | +| `Boolean` | PrefixFilenames | | +| `Boolean` | SplitMultilineStrings | | + +Static Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `SerializeOptions` | Default | | + + +## `SingleColumnRelationship` + +SingleColumnRelationship の基底クラス宣言。 + +```csharp +public class TabularEditor.TOMWrapper.SingleColumnRelationship + : Relationship, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IAnnotationObject, IDynamicPropertyObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `RelationshipEndCardinality` | FromCardinality | SingleColumnRelationship の FromCardinality を取得または設定する。 | +| `Column` | FromColumn | SingleColumnRelationship の FromColumn を取得または設定する。 | +| `SingleColumnRelationship` | MetadataObject | | +| `String` | Name | | +| `RelationshipEndCardinality` | ToCardinality |SingleColumnRelationship の ToCardinality を取得または設定する。 | +| `Column` | ToColumn | SingleColumnRelationship の ToColumn を取得または設定する。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | Browsable(`String` propertyName) | | +| `void` | Delete() | | +| `Boolean` | Editable(`String` propertyName) | | +| `void` | Init() | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | OnPropertyChanging(`String` propertyName, `Object` newValue, `Boolean&` undoable, `Boolean&` cancel) | | +| `String` | ToString() | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +## `Table` + +Table の基底クラス宣言 + +```csharp +public class TabularEditor.TOMWrapper.Table + : TabularNamedObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable, IHideableObject, IDescriptionObject, IAnnotationObject, ITabularObjectContainer, IDetailObjectContainer, ITabularPerspectiveObject, IDaxObject, IDynamicPropertyObject, IErrorMessageObject + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `IEnumerable` | AllLevels | | +| `ColumnCollection` | Columns | | +| `String` | DataCategory | テーブルの DataCategory を取得または設定します。 | +| `String` | DaxObjectFullName | | +| `String` | DaxObjectName | | +| `String` | DaxTableName | | +| `HashSet` | Dependants | | +| `String` | Description | テーブルの説明を取得または設定します。 | +| `String` | ErrorMessage | | +| `HierarchyCollection` | Hierarchies | | +| `PerspectiveIndexer` | InPerspective | | +| `Boolean` | IsHidden | テーブルのIsHiddenを取得または設定します。 | +| `MeasureCollection` | Measures | | +| `Table` | MetadataObject | | +| `String` | Name | | +| `Table` | ParentTable | | +| `PartitionCollection` | Partitions | | +| `TableRLSIndexer` | RowLevelSecurity | | +| `String` | Source | | +| `PartitionSourceType` | SourceType | | +| `TranslationIndexer` | TranslatedDescriptions | この表のローカライズされた説明文のコレクション。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `CalculatedColumn` | AddCalculatedColumn(`String` name = null, `String` expression = null, `String` displayFolder = null) | | +| `DataColumn` | AddDataColumn(`String` name = null, `String` sourceColumn = null, `String` displayFolder = null) | | +| `Hierarchy` | AddHierarchy(`String` name = null, `String` displayFolder = null, `Column[]` levels) | | +| `Hierarchy` | AddHierarchy(`String` name, `String` displayFolder = null, `String[]` levels) | | +| `Measure` | AddMeasure(`String` name = null, `String` expression = null, `String` displayFolder = null) | | +| `Boolean` | Browsable(`String` propertyName) | | +| `void` | CheckChildrenErrors() | | +| `void` | Children_CollectionChanged(`Object` sender, `NotifyCollectionChangedEventArgs` e) | | +| `TabularNamedObject` | Clone(`String` newName = null, `Boolean` includeTranslations = False) | | +| `void` | Delete() | | +| `Boolean` | Editable(`String` propertyName) | | +| `String` | GetAnnotation(`String` name) | | +| `IEnumerable` | GetChildren() | このテーブル内のすべての列、メジャー、および階層を返します。 | +| `IEnumerable` | GetChildrenByFolders(`Boolean` recursive) | | +| `void` | Init() | | +| `void` | InitRLSIndexer() | | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | OnPropertyChanging(`String` propertyName, `Object` newValue, `Boolean&` undoable, `Boolean&` cancel) | | +| `void` | SetAnnotation(`String` name, `String` value, `Boolean` undoable = True) | | +| `void` | Undelete(`ITabularObjectCollection` collection) | | + +Static Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Char[]` | InvalidTableNameChars | | + + +## `TableCollection` + +Table用のコレクションクラス。複数のオブジェクトに一度にプロパティを設定するための便利なプロパティを提供します。 + +```csharp +public class TabularEditor.TOMWrapper.TableCollection + : TabularObjectCollection, IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection
, IEnumerable
, IList
, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | DataCategory | | +| `String` | Description | | +| `Boolean` | IsHidden | | +| `Model` | Parent | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | ToString() | | + +## `TableExtension` + +```csharp +public static class TabularEditor.TOMWrapper.TableExtension + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `PartitionSourceType` | GetSourceType(this `Table` table) | | + +## `TableRLSIndexer` + +TableRLSIndexerは、モデル内のすべてのロールにおいて、ある特定のテーブルで定義されたすべてのフィルタを参照するために使用されます。これはRoleRLSIndexerとは対照的で、1つの特定のロールの全テーブルに渡ってフィルタをブラウズします。 + +```csharp +public class TabularEditor.TOMWrapper.TableRLSIndexer + : IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Table` | Table | | + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | Item | | +| `String` | Item | | +| `IEnumerable` | Keys | | +| `Dictionary` | RLSMap | | +| `String` | Summary | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Clear() | | +| `void` | CopyFrom(`TableRLSIndexer` source) | | +| `String` | GetDisplayName(`String` key) | | +| `IEnumerator` | GetEnumerator() | | +| `void` | Refresh() | | +| `void` | SetRLS(`ModelRole` role, `String` filterExpression) | | + +## `TabularCollectionHelper` + +```csharp +public static class TabularEditor.TOMWrapper.TabularCollectionHelper + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | InPerspective(this `IEnumerable
` tables, `String` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable` columns, `String` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable` hierarchies, `String` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable` measures, `String` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable
` tables, `Perspective` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable` columns, `Perspective` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable` hierarchies, `Perspective` perspective, `Boolean` value) | | +| `void` | InPerspective(this `IEnumerable` measures, `Perspective` perspective, `Boolean` value) | | +| `void` | SetDisplayFolder(this `IEnumerable` measures, `String` displayFolder) | | + +## `TabularCommonActions` + +複数のオブジェクトを一度に変更するような、Tabularモデル上の一般的な操作のための便利なメソッドを提供します。 例えば、これらのメソッドは、階層レベルや表示フォルダーなどを変更する UI ドラッグ&ドロップ操作を簡単に実行するために使用されます。 + +```csharp +public class TabularEditor.TOMWrapper.TabularCommonActions + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularModelHandler` | Handler | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | AddColumnsToHierarchy(`IEnumerable` columns, `Hierarchy` hierarchy, `Int32` firstOrdinal = -1) | | +| `Level` | AddColumnToHierarchy(`Column` column, `Hierarchy` hierarchy, `Int32` ordinal = -1) | | +| `void` | MoveObjects(`IEnumerable` objects, `Table` newTable, `Culture` culture) | | +| `String` | NewColumnName(`String` prefix, `Table` table) | | +| `String` | NewMeasureName(`String` prefix) | | +| `void` | ReorderLevels(`IEnumerable` levels, `Int32` firstOrdinal) | | +| `void` | SetContainer(`IEnumerable` objects, `IDetailObjectContainer` newContainer, `Culture` culture) | | + +## `TabularConnection` + +```csharp +public static class TabularEditor.TOMWrapper.TabularConnection + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | GetConnectionString(`String` serverName) | | +| `String` | GetConnectionString(`String` serverName, `String` userName, `String` password) | | + +## `TabularCultureHelper` + +```csharp +public static class TabularEditor.TOMWrapper.TabularCultureHelper + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Boolean` | ImportTranslations(`String` culturesJson, `Model` Model, `Boolean` overwriteExisting, `Boolean` haltOnError) | | + +## `TabularDeployer` + +```csharp +public class TabularEditor.TOMWrapper.TabularDeployer + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Deploy(`Database` db, `String` targetConnectionString, `String` targetDatabaseName) | 指定されたデータベースを、指定されたオプションを使用して、指定されたターゲットサーバーおよびデータベースIDにデプロイします。 デプロイに成功した場合、データベース内のオブジェクトに関する DAX エラーのリスト (もしあれば) を返します。 | +| `DeploymentResult` | Deploy(`Database` db, `String` targetConnectionString, `String` targetDatabaseID, `DeploymentOptions` options) | 指定したデータベースを、指定したオプションを用いて指定したターゲットサーバとデータベース ID にデプロイします。 デプロイに成功した場合は、データベース内のオブジェクトに対する DAX エラーのリストを返します。 | +| `String` | GetTMSL(`Database` db, `Server` server, `String` targetDatabaseID, `DeploymentOptions` options) | | +| `void` | SaveModelMetadataBackup(`String` connectionString, `String` targetDatabaseID, `String` backupFilePath) | | +| `void` | WriteZip(`String` fileName, `String` content) | | + +## `TabularModelHandler` + +```csharp +public class TabularEditor.TOMWrapper.TabularModelHandler + : IDisposable + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Dictionary` | WrapperCollections | | +| `Dictionary` | WrapperLookup | | + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularCommonActions` | Actions | | +| `Boolean` | AutoFixup | オブジェクト名 (テーブル、列、メジャー) の変更によって、変更された名前を反映するために DAX 式を自動的に更新 するかどうかを指定します。True に設定すると、モデル内のすべての式が解析され、依存関係ツリーが構築されます。 | +| `Database` | Database | | +| `Boolean` | DelayBuildDependencyTree | | +| `IList>` | Errors | | +| `Boolean` | HasUnsavedChanges | | +| `Boolean` | IsConnected | | +| `Model` | Model | | +| `String` | Status | | +| `TabularTree` | Tree | | +| `UndoManager` | UndoManager | | +| `Int64` | Version | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `IDetailObject` | Add(`AddObjectType` objectType, `IDetailObjectContainer` container) | | +| `void` | BeginUpdate(`String` undoName) | | +| `void` | BuildDependencyTree(`IExpressionObject` expressionObj) | | +| `void` | BuildDependencyTree() | | +| `ConflictInfo` | CheckConflicts() | | +| `IList` | DeserializeObjects(`String` json) | | +| `void` | Dispose() | | +| `void` | DoFixup(`IDaxObject` obj, `String` newName) | オブジェクト "obj" へのすべての参照を "newName" を反映するように変更します。 | +| `Int32` | EndUpdate(`Boolean` undoable = True, `Boolean` rollback = False) | | +| `Int32` | EndUpdateAll(`Boolean` rollback = False) | | +| `Model` | GetModel() | | +| `Boolean` | ImportTranslations(`String` culturesJson, `Boolean` overwriteExisting, `Boolean` ignoreInvalid) | JSON文字列から翻訳を適用します。 | +| `void` | SaveDB() | データベースへの変更を保存します。TOMWrapperにロード(読み込み)されてから、データベースに変更が加えられたかどうかをチェックするのは、ユーザーの責任です。この目的のために、[Handler.CheckConflicts()]を利用することができます。 | +| `void` | SaveFile(`String` fileName, `SerializeOptions` options) | | +| `void` | SaveToFolder(`String` path, `SerializeOptions` options) | | +| `String` | ScriptCreateOrReplace() | Scripts the entire database | +| `String` | ScriptCreateOrReplace(`TabularNamedObject` obj) | Scripts the entire database | +| `String` | ScriptTranslations(`IEnumerable` translations) | | +| `String` | SerializeObjects(`IEnumerable` objects) | | +| `void` | UpdateFolders(`Table` table) | | +| `void` | UpdateLevels(`Hierarchy` hierarchy) | | +| `void` | UpdateObject(`ITabularObject` obj) | | +| `void` | UpdateTables() | | + +Static Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | PROP_ERRORS | | +| `String` | PROP_HASUNSAVEDCHANGES | | +| `String` | PROP_ISCONNECTED | | +| `String` | PROP_STATUS | | + +Static Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularModelHandler` | Singleton | | + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `List>` | CheckErrors(`Database` database) | | +| `List>` | CheckProcessingState(`Database` database) | | + +## `TabularNamedObject` + +TabularObjectはMicrosoft.AnalysisServices.Tabular.NamedMetadataObjectクラスのラッパーのようなものです。 このラッパーは、Tabular Editorで表示および編集可能なすべてのオブジェクトに使用されます。 同じベースクラスが、Tabularモデル内のすべての種類のオブジェクトに使用されます。この基底クラスは(ローカライズされた)名前と説明を編集するためのメソッドを提供します。 + +```csharp +public abstract class TabularEditor.TOMWrapper.TabularNamedObject + : TabularObject, ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging, ITabularNamedObject, IComparable +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Int32` | MetadataIndex | | +| `NamedMetadataObject` | MetadataObject | | +| `String` | Name | | +| `TranslationIndexer` | TranslatedNames | このオブジェクトのローカライズされた名前のコレクション。 | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `TabularNamedObject` | Clone(`String` newName, `Boolean` includeTranslations) | | +| `Int32` | CompareTo(`Object` obj) | | +| `void` | Delete() | | +| `void` | Init() | | +| `void` | Undelete(`ITabularObjectCollection` collection) | 削除操作を取り消すには、ハッキーな回避策が必要です。 派生クラスは、対象のオブジェクトが "所有する" すべてのオブジェクトを更新するように注意する必要があります。例えば、メジャーは、その KPI のラッパー (存在する場合) を更新するように注意する必要があります。 | + +## `TabularObject` + +```csharp +public abstract class TabularEditor.TOMWrapper.TabularObject + : ITabularObject, INotifyPropertyChanged, INotifyPropertyChanging + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `ITabularObjectCollection` | Collection | | +| `TabularModelHandler` | Handler | | + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `MetadataObject` | MetadataObject | | +| `Model` | Model | | +| `ObjectType` | ObjectType | | +| `String` | ObjectTypeName | | +| `TranslationIndexer` | TranslatedDescriptions | | +| `TranslationIndexer` | TranslatedDisplayFolders | | + +Events + +| Type | Name | Summary | +| --- | --- | --- | +| `PropertyChangedEventHandler` | PropertyChanged | | +| `PropertyChangingEventHandler` | PropertyChanging | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Init() | 派生したメンバは、子オブジェクトをインスタンス化するためにこのメソッドをオーバーライドする必要があります。 | +| `void` | OnPropertyChanged(`String` propertyName, `Object` oldValue, `Object` newValue) | | +| `void` | OnPropertyChanging(`String` propertyName, `Object` newValue, `Boolean&` undoable, `Boolean&` cancel) | オブジェクトのプロパティが変更される前に呼び出されます。派生クラスは、変更がどのように処理されるかを制御することができます。 このメソッド内でArgumentExceptionを投げると、UIにエラーメッセージが表示されます。 | +| `Boolean` | SetField(`T&` field, `T` value, `String` propertyName = null) | | + +## `TabularObjectCollection` + +```csharp +public abstract class TabularEditor.TOMWrapper.TabularObjectCollection + : IList, ICollection, IEnumerable, INotifyCollectionChanged, ICollection, IEnumerable, IList, ITabularObjectCollection, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | CollectionName | | +| `Int32` | Count | | +| `TabularModelHandler` | Handler | | +| `Boolean` | IsFixedSize | | +| `Boolean` | IsReadOnly | | +| `Boolean` | IsSynchronized | | +| `T` | Item | | +| `T` | Item | | +| `IEnumerable` | Keys | | +| `NamedMetadataObjectCollection` | MetadataObjectCollection | | +| `String` | Summary | | +| `Object` | SyncRoot | | + +Events + +| Type | Name | Summary | +| --- | --- | --- | +| `NotifyCollectionChangedEventHandler` | CollectionChanged | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Add(`T` item) | | +| `void` | Add(`TabularNamedObject` item) | | +| `Int32` | Add(`Object` value) | | +| `void` | Clear() | | +| `Boolean` | Contains(`T` item) | | +| `Boolean` | Contains(`Object` value) | | +| `Boolean` | Contains(`String` name) | | +| `void` | CopyTo(`T[]` array, `Int32` arrayIndex) | | +| `void` | CopyTo(`Array` array, `Int32` index) | | +| `void` | ForEach(`Action` action) | | +| `ITabularObjectCollection` | GetCurrentCollection() | | +| `String` | GetDisplayName(`String` key) | | +| `IEnumerator` | GetEnumerator() | | +| `Int32` | IndexOf(`TabularNamedObject` obj) | | +| `Int32` | IndexOf(`T` item) | | +| `Int32` | IndexOf(`Object` value) | | +| `void` | Insert(`Int32` index, `T` item) | | +| `void` | Insert(`Int32` index, `Object` value) | | +| `void` | Refresh() | | +| `void` | Remove(`TabularNamedObject` item) | | +| `Boolean` | Remove(`T` item) | | +| `void` | Remove(`Object` value) | | +| `void` | RemoveAt(`Int32` index) | | + +## `TabularObjectComparer` + +```csharp +public class TabularEditor.TOMWrapper.TabularObjectComparer + : IComparer, IComparer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `ObjectOrder` | Order | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `Int32` | Compare(`Object` x, `Object` y) | | +| `Int32` | Compare(`ITabularNamedObject` x, `ITabularNamedObject` y) | | + +## `TabularObjectHelper` + +```csharp +public static class TabularEditor.TOMWrapper.TabularObjectHelper + +``` + +Static Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | GetLinqPath(this `TabularNamedObject` obj) | | +| `String` | GetName(this `ITabularNamedObject` obj, `Culture` culture) | | +| `String` | GetObjectPath(this `MetadataObject` obj) | | +| `String` | GetObjectPath(this `TabularObject` obj) | | +| `String` | GetTypeName(this `ObjectType` objType, `Boolean` plural = False) | | +| `String` | GetTypeName(this `ITabularObject` obj, `Boolean` plural = False) | | +| `Boolean` | SetName(this `ITabularNamedObject` obj, `String` newName, `Culture` culture) | | +| `String` | SplitCamelCase(this `String` str) | | + +## `TabularTree` + +TabularLogicalModelはTreeViewAdvコントロールに表示するためのTabularObject間の関係を制御します。個々のTabularObjectは他のオブジェクトとの論理的な関係(例えば、特定のカルチャーのDisplayFoldersを通して)を知りませんし、気にすることもありません。TabularObjectはTabular Object Modelから直接継承される物理的な関係のみを気にします(例えば、メジャーはテーブルに属する、など)。 + +```csharp +public abstract class TabularEditor.TOMWrapper.TabularTree + : INotifyPropertyChanged + +``` + +Fields + +| Type | Name | Summary | +| --- | --- | --- | +| `Dictionary` | FolderTree | | + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `Culture` | Culture | | +| `String` | Filter | | +| `TabularModelHandler` | Handler | | +| `Model` | Model | | +| `LogicalTreeOptions` | Options | | +| `Perspective` | Perspective | | +| `Int32` | UpdateLocks | | + +Events + +| Type | Name | Summary | +| --- | --- | --- | +| `PropertyChangedEventHandler` | PropertyChanged | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | BeginUpdate() | | +| `void` | EndUpdate() | | +| `IEnumerable` | GetChildren(`ITabularObjectContainer` tabularObject) | このメソッドは、表形式モデルのツリー表現がどのように構成されるべきかというロジックをカプセル化するものである | +| `Func` | GetFolderMutation(`Object` source, `Object` destination) | | +| `Func` | GetFolderMutation(`String` oldPath, `String` newPath) | | +| `void` | ModifyDisplayFolder(`Table` table, `String` oldPath, `String` newPath, `Culture` culture) | 1つのテーブル内のすべてのタブラーオブジェクトのDisplayFolderプロパティを更新します。更新されたパスのサブフォルダに存在するオブジェクトも更新される。 | +| `void` | OnNodesChanged(`ITabularObject` nodeItem) | | +| `void` | OnNodesInserted(`ITabularObject` parent, `ITabularObject[]` children) | | +| `void` | OnNodesInserted(`ITabularObject` parent, `IEnumerable` children) | | +| `void` | OnNodesRemoved(`ITabularObject` parent, `ITabularObject[]` children) | | +| `void` | OnNodesRemoved(`ITabularObject` parent, `IEnumerable` children) | | +| `void` | OnStructureChanged(`ITabularNamedObject` obj = null) | | +| `void` | SetCulture(`String` cultureName) | | +| `void` | SetPerspective(`String` perspectiveName) | | +| `void` | UpdateFolder(`Folder` folder, `String` oldFullPath = null) | | +| `Boolean` | VisibleInTree(`ITabularNamedObject` tabularObject) | | + +## `TranslationIndexer` + +```csharp +public class TabularEditor.TOMWrapper.TranslationIndexer + : IEnumerable, IEnumerable, IExpandableIndexer + +``` + +Properties + +| Type | Name | Summary | +| --- | --- | --- | +| `String` | DefaultValue | | +| `String` | Item | | +| `String` | Item | | +| `IEnumerable` | Keys | | +| `String` | Summary | | +| `Int32` | TranslatedCount | | + +Methods + +| Type | Name | Summary | +| --- | --- | --- | +| `void` | Clear() | オブジェクトの翻訳された値をすべてクリアします。 | +| `Boolean` | Contains(`Culture` culture) | | +| `Dictionary` | Copy() | | +| `void` | CopyFrom(`TranslationIndexer` translations, `Func` mutator = null) | | +| `void` | CopyFrom(`IDictionary` source) | | +| `String` | GetDisplayName(`String` key) | | +| `IEnumerator` | GetEnumerator() | | +| `void` | Refresh() | | +| `void` | Reset() | オブジェクトの翻訳をリセットします。キャプションのトランスレーションが削除され、オブジェクトはすべてのロケールでベース名で表示されます。Display FolderとDescriptionのトランスレ-ションは、オブジェクトの未翻訳の値に設定されます。| +| `void` | SetAll(`String` value) | | diff --git a/te2/Ja-jp/ja-Training-Webinar-for-Tabular-Editor.md b/te2/Ja-jp/ja-Training-Webinar-for-Tabular-Editor.md new file mode 100644 index 0000000..4d37e0f --- /dev/null +++ b/te2/Ja-jp/ja-Training-Webinar-for-Tabular-Editor.md @@ -0,0 +1,30 @@ +# ビデオチュートリアル + +[PowerBI.Tips](https://powerbi.tips/about/)とのコラボレーションにより、Daniel OtykierがTabular Editor Programに関連した4時間のトレーニングを実施します。以下のビデオで、このツールの詳細と、日常の業務での使い方をご覧ください。 + +ウェビナートピックス + +* Tabular Editorの紹介 +* スクリプトの使用 +* ベストプラクティス・アナライザーでデータモデルを見直す +* Azure DevOpsによるモデルのデプロイメント + +## Tabular Editorの紹介 + +[![Intro to Tabular Editor](http://img.youtube.com/vi/c-jZMzsvKnM/0.jpg)](http://www.youtube.com/watch?v=c-jZMzsvKnM "Intro To Tabular Editor") + +## スクリプトの使用 + +[![Intro to Tabular Editor](http://img.youtube.com/vi/EHs5r3XCkO8/0.jpg)](http://www.youtube.com/watch?v=EHs5r3XCkO8 "Intro To Tabular Editor") + +## ベストプラクティス・アナライザーでデータモデルを見直す + +[![Intro to Tabular Editor](http://img.youtube.com/vi/5WnN0NG2nBk/0.jpg)](http://www.youtube.com/watch?v=5WnN0NG2nBk "Intro To Tabular Editor") + +## Azure DevOpsによるモデルのデプロイメント + +[![Intro to Tabular Editor](http://img.youtube.com/vi/fzZgXe3MjhI/0.jpg)](http://www.youtube.com/watch?v=fzZgXe3MjhI "Intro To Tabular Editor") + +Special thanks to PowerBI.Tips for setting up these free webinars. +Visit PowerBI.tips on YouTube - https://www.youtube.com/powerbitips +Visit PowerBI.tips - https://powerbi.tips diff --git a/te2/Ja-jp/ja-Useful-script-snippets.md b/te2/Ja-jp/ja-Useful-script-snippets.md new file mode 100644 index 0000000..908d5f3 --- /dev/null +++ b/te2/Ja-jp/ja-Useful-script-snippets.md @@ -0,0 +1,939 @@ +# 便利なスクリプトスニペット + +ここでは、Tabular Editorの[Advanced Scripting機能](/Advanced-Scripting)を使い始めるための小さなスクリプトスニペットを集めています。これらのスクリプトの多くは[Custom Actions](/Custom-Actions)として保存すると、コンテキストメニューから簡単に再利用できるので便利です'。 + +他のスクリプトを調べたり、自分のスクリプトを投稿したい場合は、[Tabular Editor Scripts repository](https://github.com/TabularEditor/Scripts) に行ってください。 + +*** + +## カラムからメジャーを作成する + +```csharp +// Creates a SUM measure for every currently selected column and hide the column. +foreach(var c in Selected.Columns) +{ + var newMeasure = c.Table.AddMeasure( + "Sum of " + c.Name, // Name + "SUM(" + c.DaxObjectFullName + ")", // DAX expression + c.DisplayFolder // Display Folder + ); + + // Set the format string on the new measure: + newMeasure.FormatString = "0.00"; + + // Provide some documentation: + newMeasure.Description = "This measure is the sum of column " + c.DaxObjectFullName; + + // Hide the base column: + c.IsHidden = true; +} +``` + +このスニペットでは、`
.AddMeasure(, , )` 関数を使用して、テーブル上に新しいメジャーを作成します。DAX式で使用する列の完全修飾名を取得するために、`DaxObjectFullName` プロパティを使用しています: `'TableName'[ColumnName]`. + +*** + +## タイムインテリジェンスメジャーの生成 + +まず、個々のTime Intelligence集計のためのカスタムアクションを作成します。たとえば、次のようになります。 + +```csharp +// Creates a TOTALYTD measure for every selected measure. +foreach(var m in Selected.Measures) { + m.Table.AddMeasure( + m.Name + " YTD", // Name + "TOTALYTD(" + m.DaxObjectName + ", 'Date'[Date])", // DAX expression + m.DisplayFolder // Display Folder + ); +} +``` + +ここでは、`DaxObjectName` プロパティを使用して、DAX式で使用する非限定的な参照を生成します。これを、メジャーに適用する "Time IntelligenceCreate YTD measure" という名前のカスタム・アクションとして保存します。MTD、LY、およびその他必要なものに対して同様のアクションを作成します。次に、新しいアクションとして以下を作成します。 + +```csharp +// Invoke all Time Intelligence Custom Actions: +CustomAction(@"Time Intelligence\Create YTD measure"); +CustomAction(@"Time Intelligence\Create MTD measure"); +CustomAction(@"Time Intelligence\Create LY measure"); +``` + +これは、1つ(または複数)のカスタムアクションを別のアクション内から実行する方法を示しています(循環参照に注意 - Tabular Editorがクラッシュする原因になります)。これを新しいカスタムアクション「Time Intelligence All of the above」として保存すると、1回のクリックですべてのTime Intelligenceメジャーを簡単に生成できるようになります。 + +![image](https://user-images.githubusercontent.com/8976200/36632257-5565c8ca-197c-11e8-8498-82667b6e1049.png) + +もちろん、以下のようにタイムインテリジェンスの計算をすべて1つのスクリプトにまとめてもよい。 + +```csharp +var dateColumn = "'Date'[Date]"; + +// Creates time intelligence measures for every selected measure: +foreach(var m in Selected.Measures) { + // Year-to-date: + m.Table.AddMeasure( + m.Name + " YTD", // Name + "TOTALYTD(" + m.DaxObjectName + ", " + dateColumn + ")", // DAX expression + m.DisplayFolder // Display Folder + ); + + // Previous year: + m.Table.AddMeasure( + m.Name + " PY", // Name + "CALCULATE(" + m.DaxObjectName + ", SAMEPERIODLASTYEAR(" + dateColumn + "))", // DAX expression + m.DisplayFolder // Display Folder + ); + + // Year-over-year + m.Table.AddMeasure( + m.Name + " YoY", // Name + m.DaxObjectName + " - [" + m.Name + " PY]", // DAX expression + m.DisplayFolder // Display Folder + ); + + // Year-over-year %: + m.Table.AddMeasure( + m.Name + " YoY%", // Name + "DIVIDE([" + m.Name + " YoY], [" + m.Name + " PY])", // DAX expression + m.DisplayFolder // Display Folder + ).FormatString = "0.0 %"; // Set format string as percentage + + // Quarter-to-date: + m.Table.AddMeasure( + m.Name + " QTD", // Name + "TOTALQTD(" + m.DaxObjectName + ", " + dateColumn + ")", // DAX expression + m.DisplayFolder // Display Folder + ); + + // Month-to-date: + m.Table.AddMeasure( + m.Name + " MTD", // Name + "TOTALMTD(" + m.DaxObjectName + ", " + dateColumn + ")", // DAX expression + m.DisplayFolder // Display Folder + ); +} +``` + +### 追加プロパティを含む + +新しく作成されたメジャーに追加のプロパティを設定したい場合は、上記のスクリプトを次のように修正します。 + +```csharp +// Creates a TOTALYTD measure for every selected measure. +foreach(var m in Selected.Measures) { + var newMeasure = m.Table.AddMeasure( + m.Name + " YTD", // Name + "TOTALYTD(" + m.DaxObjectName + ", 'Date'[Date])", // DAX expression + m.DisplayFolder // Display Folder + ); + newMeasure.FormatString = m.FormatString; // Copy format string from original measure + foreach(var c in Model.Cultures) { + newMeasure.TranslatedNames[c] = m.TranslatedNames[c] + " YTD"; // Copy translated names for every culture + newMeasure.TranslatedDisplayFolders[c] = m.TranslatedDisplayFolders[c]; // Copy translated display folders + } +} +``` + +*** + +## デフォルトの翻訳を設定する + +すべての(目に見える)オブジェクトにデフォルトの翻訳を適用しておくと便利な場合があります。この場合、デフォルトの翻訳は、オブジェクトのオリジナルの名前/説明/表示フォルダーだけです。この利点は、JSON形式で翻訳をエクスポートするときに、すべての翻訳オブジェクトを含めることができることです。 + +以下のスクリプトは、モデル内のすべてのカルチャをループし、まだ翻訳がないすべての可視オブジェクトに対して、デフォルト値を割り当てます。 + +```csharp +// Apply default translations to all (visible) translatable objects, across all cultures in the model: +foreach(var culture in Model.Cultures) +{ + ApplyDefaultTranslation(Model, culture); + foreach(var perspective in Model.Perspectives) + ApplyDefaultTranslation(perspective, culture); + foreach(var table in Model.Tables.Where(t => t.IsVisible)) + ApplyDefaultTranslation(table, culture); + foreach(var measure in Model.AllMeasures.Where(m => m.IsVisible)) + ApplyDefaultTranslation(measure, culture); + foreach(var column in Model.AllColumns.Where(c => c.IsVisible)) + ApplyDefaultTranslation(column, culture); + foreach(var hierarchy in Model.AllHierarchies.Where(h => h.IsVisible)) + ApplyDefaultTranslation(hierarchy, culture); + foreach(var level in Model.AllLevels.Where(l => l.Hierarchy.IsVisible)) + ApplyDefaultTranslation(level, culture); +} + +void ApplyDefaultTranslation(ITranslatableObject obj, Culture culture) +{ + // Only apply the default translation when a translation does not already exist: + if(string.IsNullOrEmpty(obj.TranslatedNames[culture])) + { + // Default name translation: + obj.TranslatedNames[culture] = obj.Name; + + // Default description translation: + var dObj = obj as IDescriptionObject; + if(dObj != null && string.IsNullOrEmpty(obj.TranslatedDescriptions[culture]) + && !string.IsNullOrEmpty(dObj.Description)) + { + obj.TranslatedDescriptions[culture] = dObj.Description; + } + + // Default display folder translation: + var fObj = obj as IFolderObject; + if(fObj != null && string.IsNullOrEmpty(fObj.TranslatedDisplayFolders[culture]) + && !string.IsNullOrEmpty(fObj.DisplayFolder)) + { + fObj.TranslatedDisplayFolders[culture] = fObj.DisplayFolder; + } + } +} +``` + +*** + +## ハンドリング・パースペクティブ + +このプロパティは、モデル内のすべてのパースペクティブに対してTrue/False値を保持し、指定されたオブジェクトがそのパースペクティブのメンバーであるかどうかを示します。 + +```csharp +foreach(var measure in Selected.Measures) +{ + measure.InPerspective["Inventory"] = true; + measure.InPerspective["Reseller Operation"] = false; +} +``` + +上記のスクリプトでは、選択されたすべてのメジャーが「インベントリ」パースペクティブで表示され、「リセラー業務」パースペクティブで非表示になるようにします。 + +個々のパースペクティブでのメンバーシップの取得/設定に加えて、`InPerspective` プロパティは以下のメソッドもサポートします。 + +* `<>.InPerspective.None()` - すべてのパースペクティブからオブジェクトを削除します。 +* `<>.InPerspective.All()` - すべてのパースペクティブにオブジェクトを含めます。 +* `<>.CopyFrom(string[] perspectives)` - 指定したすべてのパースペクティブ (パースペクティブの名前を含む文字列の配列) にオブジェクトを含めます。 +* `<>.CopyFrom(perspectiveIndexer perspectives)` - 別の `InPerspective` プロパティからパースペクティブインクルージョンをコピーします。 + +後者は、あるオブジェクトから別のオブジェクトにパースペクティブ・メンバシップをコピーするために使用されます。たとえば、ベース・メジャー["Reseller Sales"]があり、現在選択されているすべてのメジャーがこのベース・メジャーと同じパースペクティブに表示されるようにする必要があるとします。以下のスクリプトを実行します。 + +```csharp +var baseMeasure = Model.Tables["Reseller Sales"].Measures["Reseller Total Sales"]; + +foreach(var measure in Selected.Measures) +{ + /* Uncomment the line below, if you want 'measure' to be hidden + from perspectives that 'baseMeasure' is hidden in: */ + // measure.InPerspective.None(); + + measure.InPerspective.CopyFrom(baseMeasure.InPerspective); +} +``` + +この手法は、コードから新しいオブジェクトを生成する場合にも使用できます。たとえば、自動生成されたタイム・インテリジェンス・メジャーが、そのベース・メジャーと同じパースペクティブにのみ表示されるようにしたい場合、前のセクションのスクリプトを以下のように拡張します。 + +```csharp +// Creates a TOTALYTD measure for every selected measure. +foreach(var m in Selected.Measures) { + var newMeasure = m.Table.AddMeasure( + m.Name + " YTD", // Name + "TOTALYTD(" + m.DaxObjectName + ", 'Date'[Date])", // DAX expression + m.DisplayFolder // Display Folder + ); + newMeasure.InPerspective.CopyFrom(m.InPerspective); // Apply perspectives from the base measure +} +``` + +*** + +## オブジェクトのプロパティをファイルに書き出す + +ワークフローによっては、Excelを使って複数のオブジェクトプロパティを一括して編集することがあります。次のスニペットを使って、プロパティの標準的なセットを.TSVファイルにエクスポートし、その後、インポートできます(下記を参照)。 + +```csharp +// Export properties for the currently selected objects: +var tsv = ExportProperties(Selected); +SaveFile("Exported Properties 1.tsv", tsv); +``` + +でき上がった.TSVファイルをExcelで開くと、このようになります。 + +![image](https://user-images.githubusercontent.com/8976200/36632472-e8e96ef6-197e-11e8-8285-6816b09ad036.png) + +最初の列の内容(Object)は、オブジェクトへの参照です。この列の内容が変更されると、その後のプロパティのインポートが正しく行われない場合があります。オブジェクトの名前を変更する場合は、2列目の値(Name)だけを変更します。 + +デフォルトでは、ファイルは TabularEditor.exe が置かれているのと同じフォルダーに保存されます。デフォルトでは、以下のプロパティのみがエクスポートされます(エクスポートされるオブジェクトの種類によって、該当するものがあります)。 + +* Name +* Description +* SourceColumn +* Expression +* FormatString +* DataType + +異なるプロパティをエクスポートするには、`ExportProperties`の2番目の引数として、エクスポートするプロパティ名をカンマで区切ったリストを指定します。 + +```csharp +// Export the names and Detail Rows Expressions for all measures on the currently selected table: +var tsv = ExportProperties(Selected.Table.Measures, "Name,DetailRowsExpression"); +SaveFile("Exported Properties 2.tsv", tsv); +``` + +利用可能なプロパティ名は [TOM API ドキュメント](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.aspx) で見ることができます。これらは、CamelCaseのTabular Editorのプロパティグリッドに表示される名前とほとんど同じで、スペースが取り除かれています(いくつかの例外を除いて、例えば、"Hidden "プロパティはTOM APIでは `IsHidden` と呼ばれています)。 + +プロパティをインポートするには、以下のスニペットを使用します。 + +```csharp +// 指定されたファイルのプロパティをインポートして適用する。 +var tsv = ReadFile("Exported Properties 1.tsv"); +ImportProperties(tsv); +``` + +### インデックス付きプロパティのエクスポート + +Tabular Editor 2.11.0から、`ExportProperties` と `ImportProperties` メソッドがインデックス付きプロパティに対応しました。インデックス付きプロパティとは、プロパティ名に加え、キーを取るプロパティです。一例として、`myMeasure.TranslatedNames`があります。このプロパティは `myMeasure` の名前の翻訳として適用されるすべての文字列のコレクションを表します。C# では、インデックス演算子を使用して、特定のカルチャーの翻訳されたキャプションにアクセスできます。 + +長くなりましたが、Tabularモデル内のオブジェクトの翻訳、パースペクティブ情報、アノテーション、拡張プロパティ、行レベルおよびオブジェクトレベルのセキュリティ情報をすべてエクスポートできるようになりました。 + +たとえば、次のスクリプトは、すべてのモデル・メジャーと、それぞれがどのパースペクティブで表示されるかについての情報を含むTSVファイルを作成します。 + +```csharp +var tsv = ExportProperties(Model.AllMeasures, "Name,InPerspective"); +SaveFile(@"c:\Project\MeasurePerspectives.tsv", tsv); +``` + +TSVファイルをExcelで開くと、このようになります。 + +![image](https://user-images.githubusercontent.com/8976200/85208532-956dec80-b331-11ea-8568-32dbd4cc5516.png) + +そして、上に示したようにExcelで変更を行い、保存を押して、更新された値を `ImportProperties` を使ってTabular Editorにロードし直すことができます。 + +もし、特定のパースペクティブのみをリストアップしたい場合は、`ExportProperties`の呼び出しの第2引数でそれらを指定できます。 + +```csharp +var tsv = ExportProperties(Model.AllMeasures, "Name,InPerspective[Inventory]"); +SaveFile(@"c:\Project\MeasurePerspectiveInventory.tsv", tsv); +``` + +同様に、翻訳、注釈などについても同様です。たとえば、テーブル、カラム、階層、レベル、メジャーに適用されたデンマーク語の翻訳をすべて確認したい場合。 + +```csharp +// Construct a list of objects: +var objects = new List(); +objects.AddRange(Model.Tables); +objects.AddRange(Model.AllColumns); +objects.AddRange(Model.AllHierarchies); +objects.AddRange(Model.AllLevels); +objects.AddRange(Model.AllMeasures); + +var tsv = ExportProperties(objects, "Name,TranslatedNames[da-DK],TranslatedDescriptions[da-DK],TranslatedDisplayFolders[da-DK]"); +SaveFile(@"c:\Project\ObjectTranslations.tsv", tsv); +``` + +*** + +## ドキュメントの作成 + +上記の `ExportProperties` メソッドは、モデルのすべてまたは一部をドキュメント化する場合にも使用できます。以下のスニペットは、タブラーモデルのすべての可視メジャーまたは列からプロパティのセットを抽出し、それをTSVファイルとして保存します。 + +```csharp +// Construct a list of all visible columns and measures: +var objects = Model.AllMeasures.Where(m => !m.IsHidden && !m.Table.IsHidden).Cast() + .Concat(Model.AllColumns.Where(c => !c.IsHidden && !c.Table.IsHidden)); + +// Get their properties in TSV format (tabulator-separated): +var tsv = ExportProperties(objects,"Name,ObjectType,Parent,Description,FormatString,DataType,Expression"); + +// (Optional) Output to screen (can then be copy-pasted into Excel): +// tsv.Output(); + +// ...or save the TSV to a file: +SaveFile("documentation.tsv", tsv); +``` + +*** + +## ファイルからメジャーを生成する + +上記のプロパティのエクスポート/インポートの手法は、モデル内の *既存の* オブジェクトのオブジェクト・プロパティを一括して編集する場合に便利です。一方、まだ存在しないメジャーのリストをインポートする場合はどうでしょうか。 + +既存のタブラー・モデルにインポートするメジャーの名前、説明、およびDAX式を含むTSV (タブ区切りの値)ファイルがあるとします。以下のスクリプトを使用して、ファイルを読み込み、それを行と列に分割し、メジャーを生成できます。また、このスクリプトでは各メジャーに特別なアノテーションが割り当てられ、同じスクリプトを使用して以前に作成されたメジャーを削除できます。 + +```csharp +var targetTable = Model.Tables["Program"]; // Name of the table that should hold the measures +var measureMetadata = ReadFile(@"c:\Test\MyMeasures.tsv"); // c:\Test\MyMeasures.tsv is a tab-separated file with a header row and 3 columns: Name, Description, Expression + +// Delete all measures from the target table that have an "AUTOGEN" annotation with the value "1": +foreach(var m in targetTable.Measures.Where(m => m.GetAnnotation("AUTOGEN") == "1").ToList()) +{ + m.Delete(); +} + +// Split the file into rows by CR and LF characters: +var tsvRows = measureMetadata.Split(new[] {'\r','\n'},StringSplitOptions.RemoveEmptyEntries); + +// Loop through all rows but skip the first one: +foreach(var row in tsvRows.Skip(1)) +{ + var tsvColumns = row.Split('\t'); // Assume file uses tabs as column separator + var name = tsvColumns[0]; // 1st column contains measure name + var description = tsvColumns[1]; // 2nd column contains measure description + var expression = tsvColumns[2]; // 3rd column contains measure expression + + // This assumes that the model does not already contain a measure with the same name (if it does, the new measure will get a numeric suffix): + var measure = targetTable.AddMeasure(name); + measure.Description = description; + measure.Expression = expression; + measure.SetAnnotation("AUTOGEN", "1"); // Set a special annotation on the measure, so we can find it and delete it the next time the script is executed. +} +``` + +この処理を自動化する必要がある場合は、上記のスクリプトをファイルに保存し、以下のように[Tabular Editor CLI](/Command-line-Options) を使用してください。 + +``` +start /wait TabularEditor.exe "" -S "" -B "" +``` + +例えば + +``` +start /wait TabularEditor.exe "c:\Projects\AdventureWorks\Model.bim" -S "c:\Projects\AutogenMeasures.cs" -B "c:\Projects\AdventureWorks\Build\Model.bim" +``` + +...または、すでにデプロイされたデータベースに対してスクリプトを実行したい場合。 + +``` +start /wait TabularEditor.exe "localhost" "AdventureWorks" -S "c:\Projects\AutogenMeasures.cs" -D "localhost" "AdventureWorks" -O +``` + +*** + +## パーティションソースのメタデータからデータカラムを作成する + +**注:** バージョン2.7.2またはそれ以降を使用している場合は、新しい "テーブルのインポート" 機能を必ず試してください。 + +テーブルがOLE DBプロバイダーデータソースに基づくQueryパーティションを使用している場合、以下のスニペットを実行することにより、そのテーブルの列メタデータを自動的にリフレッシュできます。 + +```csharp +Model.Tables["Reseller Sales"].RefreshDataColumns(); +``` + +これは、モデルに新しいテーブルを追加するときに、テーブル上のすべてのデータ・カラムを手動で作成することを避けるために便利です。上記のスニペットは、'Reseller Sales' テーブルのパーティションソースの既存の接続文字列を使用して、パーティションソースがローカルにアクセスできることを想定しています。上記のスニペットは、パーティション・クエリからスキーマを抽出し、ソース・クエリ内の各カラムに対してテーブルにデータ・カラムを追加します。 + +この操作に別の接続文字列を指定する必要がある場合は、このスニペットで指定できます。 + +```csharp +var source = Model.DataSources["DWH"] as ProviderDataSource; +var oldConnectionString = source.ConnectionString; +source.ConnectionString = "..."; // Enter the connection string you want to use for metadata refresh +Model.Tables["Reseller Sales"].RefreshDataColumns(); +source.ConnectionString = oldConnectionString; +``` + +これは、'Reseller Sales' テーブルのパーティションが "DWH" という名前のプロバイダデータソースを使用していると仮定している。 + +*** + +## DAX式のフォーマット + +詳しくは、[FormatDax](/FormatDax)をご覧ください。 + +```csharp +// Works in Tabular Editor version 2.13.0 or newer: +Selected.Measures.FormatDax(); +``` + +代替構文。 + +```csharp +// Works in Tabular Editor version 2.13.0 or newer: +foreach(var m in Selected.Measures) + m.FormatDax(); +``` + +*** + +## テーブルのソースカラムのリストを生成する + +次のスクリプトは、現在選択されているテーブルのソースカラムのリストをきれいにフォーマットして出力します。これは、`SELECT *` を使用するパーティションクエリを明示的なカラムで置き換えたい場合に便利です。 + +```csharp +string.Join(",\r\n", + Selected.Table.DataColumns + .OrderBy(c => c.SourceColumn) + .Select(c => "[" + c.SourceColumn + "]") + ).Output(); +``` + +*** + +## リレーションの自動生成 + +チーム内で特定の命名規則を一貫して使用している場合、スクリプトを使用するとさらに強力な効果を得られることがすぐにわかります。 + +次のスクリプトを1つ以上のファクト・テーブルで実行すると、列名に基づいてすべての関連するディメンジョン・テーブルへのリレーションシップが自動的に作成されます。このスクリプトは、名前パターン `xxxyyyKey` を持つファクト・テーブル列を検索します。ここで xxx はロールプレイで使用するためのオプションの修飾子で、yyyはディメンジョン・テーブル名です。ディメンジョン・テーブルには、`yyyKey` という名前の列が存在し、ファクト・テーブルの列と同じデータ型である必要があります。たとえば、"ProductKey" という名前の列は、Productテーブルの "ProductKey "列と関連付けられます。Key" の代わりに使用する別の列名サフィックスを指定できます。 + +ファクト・テーブルとディメンジョン・テーブルの間にすでにリレーションシップが存在する場合、スクリプトは非アクティブとして新しいリレーションシップを作成します。 + +```csharp +var keySuffix = "Key"; + +// Loop through all currently selected tables (assumed to be fact tables): +foreach(var fact in Selected.Tables) +{ + // Loop through all SK columns on the current table: + foreach(var factColumn in fact.Columns.Where(c => c.Name.EndsWith(keySuffix))) + { + // Find the dimension table corresponding to the current SK column: + var dim = Model.Tables.FirstOrDefault(t => factColumn.Name.EndsWith(t.Name + keySuffix)); + if(dim != null) + { + // Find the key column on the dimension table: + var dimColumn = dim.Columns.FirstOrDefault(c => factColumn.Name.EndsWith(c.Name)); + if(dimColumn != null) + { + // Check whether a relationship already exists between the two columns: + if(!Model.Relationships.Any(r => r.FromColumn == factColumn && r.ToColumn == dimColumn)) + { + // If relationships already exists between the two tables, new relationships will be created as inactive: + var makeInactive = Model.Relationships.Any(r => r.FromTable == fact && r.ToTable == dim); + + // Add the new relationship: + var rel = Model.AddRelationship(); + rel.FromColumn = factColumn; + rel.ToColumn = dimColumn; + factColumn.IsHidden = true; + if(makeInactive) rel.IsActive = false; + } + } + } + } +} +``` + +*** + +## DumpFilters メジャーの作成 + +[この記事](https://www.sqlbi.com/articles/displaying-filter-context-in-power-bi-tooltips/)に触発されて、現在選択されているテーブルに対して[DumpFilters]メジャーを作成するスクリプトを紹介します。 + +```csharp +var dax = "VAR MaxFilters = 3 RETURN "; +var dumpFilterDax = @"IF ( + ISFILTERED ( {0} ), + VAR ___f = FILTERS ( {0} ) + VAR ___r = COUNTROWS ( ___f ) + VAR ___t = TOPN ( MaxFilters, ___f, {0} ) + VAR ___d = CONCATENATEX ( ___t, {0}, "", "" ) + VAR ___x = ""{0} = "" & ___d + & IF(___r > MaxFilters, "", ... ["" & ___r & "" items selected]"") & "" "" + RETURN ___x & UNICHAR(13) & UNICHAR(10) +)"; + +// Loop through all columns of the model to construct the complete DAX expression: +bool first = true; +foreach(var column in Model.AllColumns) +{ + if(!first) dax += " & "; + dax += string.Format(dumpFilterDax, column.DaxObjectFullName); + if(first) first = false; +} + +// Add the measure to the currently selected table: +Selected.Table.AddMeasure("DumpFilters", dax); +``` + +*** + +## キャメルケースからプロパーケースへ + +リレーションデータベースのカラムとテーブルの一般的な命名規則は、キャメルケースです。つまり、名前にはスペースを含まず、個々の単語は大文字で始めます。Tabularモデルでは、テーブルやカラムは隠されることなくビジネスユーザーに見えるので、「より美しい」命名法を使用することが望ましい。次のスクリプトは、CamelCaseの名前をProper Caseに変換します。大文字の連続はそのままにする(頭文字をとる)。たとえば、このスクリプトは次のように変換する。 + +* `CustomerWorkZipcode` to `Customer Work Zipcode` +* `CustomerAccountID` to `Customer Account ID` +* `NSASecurityID` to `NSA Security ID` + +このスクリプトは、すべてのオブジェクト タイプに適用されるカスタム アクションとして保存することを強くオススメします(Relationship、KPI、Table Permissions、Translationsは編集可能な "Name" プロパティがないため、これを除く)。 + +```csharp +foreach(var obj in Selected.OfType()) { + var oldName = obj.Name; + var newName = new System.Text.StringBuilder(); + for(int i = 0; i < oldName.Length; i++) { + // First letter should always be capitalized: + if(i == 0) newName.Append(Char.ToUpper(oldName[i])); + + // A sequence of two uppercase letters followed by a lowercase letter should have a space inserted + // after the first letter: + else if(i + 2 < oldName.Length && char.IsLower(oldName[i + 2]) && char.IsUpper(oldName[i + 1]) && char.IsUpper(oldName[i])) + { + newName.Append(oldName[i]); + newName.Append(" "); + } + + // All other sequences of a lowercase letter followed by an uppercase letter, should have a space + // inserted after the first letter: + else if(i + 1 < oldName.Length && char.IsLower(oldName[i]) && char.IsUpper(oldName[i+1])) + { + newName.Append(oldName[i]); + newName.Append(" "); + } + else + { + newName.Append(oldName[i]); + } + } + obj.Name = newName.ToString(); +} +``` + +*** + +## テーブルとメジャーの依存関係をエクスポートする + +大規模で複雑なモデルがあり、基礎データの変更によって影響を受ける可能性があるメジャーを知りたいとします。 + +以下のスクリプトは、モデルのすべてのメジャーをループし、各メジャーに対して、そのメジャーが直接的および間接的に依存しているテーブルのリストを出力します。このリストは、Tab区切りのファイルとして出力されます。 + +```csharp +string tsv = "Measure\tDependsOnTable"; // TSV file header row + +// Loop through all measures: +foreach(var m in Model.AllMeasures) { + + // Get a list of ALL objects referenced by this measure (both directly and indirectly through other measures): + var allReferences = m.DependsOn.Deep(); + + // Filter the previous list of references to table references only. For column references, let's get th + // table that each column belongs to. Finally, keep only distinct tables: + var allTableReferences = allReferences.OfType
() + .Concat(allReferences.OfType().Select(c => c.Table)).Distinct(); + + // Output TSV rows - one for each table reference: + foreach(var t in allTableReferences) + tsv += string.Format("\r\n{0}\t{1}", m.Name, t.Name); +} + +tsv.Output(); +// SaveFile("c:\\MyProjects\\SSAS\\MeasureTableDependencies.tsv", tsv); // Uncomment this line to save output to a file +``` + +*** + +## 集計の設定(Power BI Datasetのみ) + +[Tabular Editor 2.11.3](https://github.com/otykier/TabularEditor/releases/tag/2.11.3) では、カラムに `AlternateOf` プロパティを設定できるようになり、モデル上で集計テーブルを定義することができるようになりました。この機能は、Power BI Service XMLAエンドポイントを通じて、Power BI Datasets (Compatibility Level 1460以上)で有効です。 + +列の範囲を選択し、以下のスクリプトを実行して、列の `AlternateOf` プロパティを開始させます。 + +```csharp +foreach(var col in Selected.Columns) col.AddAlternateOf(); +``` + +カラムをひとつずつ調べて、ベースカラムに対応させ、それに応じた集計方法(Sum/Min/Max/GroupBy)を設定します。また、この作業を自動化したい場合、集計テーブルのカラムがベーステーブルのカラムと同じ名前であれば、以下のスクリプトを使用することで、カラムのマッピングを行うことができます。 + +```csharp +// ツリーで 2 つのテーブルを選択します (ctrl+click) 。集計テーブルは、カラム数が最も少ないテーブルと仮定する。 +// このスクリプトは、集計テーブルのすべてのカラムに AlternateOf プロパティを設定する。このスクリプトが動作するためには、集約テーブルのカラムはベーステーブルのカラムと同じ名前である必要があります。 + +var aggTable = Selected.Tables.OrderBy(t => t.Columns.Count).First(); +var baseTable = Selected.Tables.OrderByDescending(t => t.Columns.Count).First(); + +foreach(var col in aggTable.Columns) +{ + // スクリプトは、列のデータ型が decimal/double でない限り、要約のタイプを "Group By" に設定する。 + var summarization = SummarizationType.GroupBy; + if(col.DataType == DataType.Double || col.DataType == DataType.Decimal) + summarization = SummarizationType.Sum; + + col.AddAlternateOf(baseTable.Columns[col.Name], summarization); +} +``` + +スクリプトを実行すると、aggテーブルのすべてのカラムに `AlternateOf` プロパティが割り当てられます(以下のスクリーンショットを参照ください)。集約を行うには、ベースとなるテーブルパーティションでDirectQueryを使用しなければならないことに注意してください。 + +![image](https://user-images.githubusercontent.com/8976200/85851134-6ed70800-b7ae-11ea-82eb-37fcaa2ca9c4.png) + +*** + +## アナリシスサービスのクエリ + +バージョン[2.12.1](https://github.com/otykier/TabularEditor/releases/tag/2.12.1)より、Tabular Editorはモデルに対してDAXクエリーを実行したりDAX式を評価するためのヘルパーメソッドを多数提供するようになりました。これらのメソッドは、モデルメタデータがAnalysis Servicesのインスタンスから直接ロードされた場合、たとえば「ファイル > 開く > DBから」オプションを使用した場合、あるいはTabular EditorのPower BI外部ツール統合を使用した場合のみ動作します。 + +以下の方法があります。 + +| Method | Description | +| ------ | ----------- | +| `void ExecuteCommand(string tmslOrXmla, bool isXmla = false)` | このメソッドは、指定されたTMSLまたはXMLAスクリプトを、接続されているAnalysis Servicesのインスタンスに渡します。これは、ASインスタンス上のテーブルのデータをリフレッシュする場合に便利です。このメソッドを使用してモデルのメタデータを変更すると、ローカルモデルのメタデータがASインスタンスのメタデータと同期しなくなり、次にモデルのメタデータを保存しようとしたときにバージョンの衝突の警告が表示される可能性があることに注意してください。XMLAスクリプトを送信する場合は、`isXmla` パラメーターを `true` に設定してください。 | +| `IDataReader ExecuteReader(string dax)` | 接続中の AS データベースに対して、指定された DAX *クエリ* を実行し、結果の [AmoDataReader](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.amodatareader?view=analysisservices-dotnet) オブジェクトを返します。DAX クエリには、1 つ以上の [`EVALUATE`](https://dax.guide/EVALUATE) ステートメントが含まれます。一度に複数のデータリーダーを開くことはできないことに注意してください。万が一、明示的にリーダーを閉じたり処分したりするのを忘れた場合、Tabular Editorが自動的にそれらを閉じます。 | +| `DataSet ExecuteDax(string dax)` | 接続された AS データベースに対して指定された DAX *クエリ* を実行し、クエリから返されたデータを含む [DataSet](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) オブジェクトを返します。DAXクエリは、1つ以上の[`EVALUATE`](https://dax.guide/EVALUATE)ステートメントを含んでいます。結果として得られる DataSet オブジェクトは、 `EVALUATE` ステートメントごとに 1 つの DataTable を含んでいます。非常に大きなデータテーブルを返すことは、メモリ不足などの安定性の問題を引き起こす可能性があるため、推奨されません。 | +| `object EvaluateDax(string dax)` | 接続中の AS データベースに対して指定された DAX *式* を実行し、その結果を表すオブジェクトを返します。DAX式がスカラーの場合、関連する型のオブジェクトが返されます(string、long、decimal、double、DateTime)。DAX式がテーブル値の場合、[DataTable](https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.6)が返されます。| + +このメソッドは `Model.Database` オブジェクトにスコープされていますが、プレフィックスなしで直接実行することも可能です。 + +Darren Gosbellは `ExecuteDax` メソッドを使用してデータ駆動型のメジャーを生成する興味深いユースケースを紹介しています [こちら](https://darren.gosbell.com/2020/08/the-best-way-to-generate-data-driven-measures-in-power-bi-using-tabular-editor/)。 + +もう1つの方法は、テーブルを更新するための再利用可能なスクリプトを作成することです。たとえば、再計算を行うには、次のようにします。 + +```csharp +var type = "calculate"; +var database = Model.Database.Name; +var table = Selected.Table.Name; +var tmsl = "{ \"refresh\": { \"type\": \"%type%\", \"objects\": [ { \"database\": \"%db%\", \"table\": \"%table%\" } ] } }" + .Replace("%type%", type) + .Replace("%db%", database) + .Replace("%table%", table); + +ExecuteCommand(tmsl); +``` + +### Analysis Services エンジンのキャッシュをクリアする + +Tabular Editor 2.16.6またはTabular Editor3.2.3では、次の構文を使用して生のXMLAコマンドをAnalysis Servicesに送信できます。以下の例では、これを使用してASエンジン・キャッシュをクリアする方法を示しています。 + +```csharp +var clearCacheXmla = string.Format(@" + + {0} + +", Model.Database.ID); + +ExecuteCommand(clearCacheXmla, isXmla: true); +``` + +### クエリ結果の可視化 + +また、`Output`ヘルパーメソッドを使用すると、`EvaluateDax`から返されたDAX式の結果を直接視覚化できます。 + +```csharp +EvaluateDax("1 + 2").Output(); // An integer +EvaluateDax("\"Hello from AS\"").Output(); // A string +EvaluateDax("{ (1, 2, 3) }").Output(); // A table +``` + +![image](https://user-images.githubusercontent.com/8976200/91638299-bbd59580-ea0e-11ea-882b-55bff73c30fb.png) + +...または、現在選択されているメジャーの値を返したい場合。 + +```csharp +EvaluateDax(Selected.Measure.DaxObjectFullName).Output(); +``` + +![image](https://user-images.githubusercontent.com/8976200/91638367-6f3e8a00-ea0f-11ea-90cd-7d2e4cff6e31.png) + +そして、より高度な例として、複数のメジャーを一度に選択し評価する方法をご紹介します。 + +```csharp +var dax = "ROW(" + string.Join(",", Selected.Measures.Select(m => "\"" + m.Name + "\", " + m.DaxObjectFullName).ToArray()) + ")"; +EvaluateDax(dax).Output(); +``` + +![image](https://user-images.githubusercontent.com/8976200/91638356-546c1580-ea0f-11ea-8302-3e40829e00dd.png) + +本当に上級者であれば、SUMMARIZECOLUMNSやその他のDAX関数を使って、選択したメジャーをある列でスライスして視覚化できます。 + +```csharp +var dax = "SUMMARIZECOLUMNS('Product'[Color], " + string.Join(",", Selected.Measures.Select(m => "\"" + m.Name + "\", " + m.DaxObjectFullName).ToArray()) + ")"; +EvaluateDax(dax).Output(); +``` + +![image](https://user-images.githubusercontent.com/8976200/91638389-9b5a0b00-ea0f-11ea-819f-d3eee3ddfa71.png) + +スクリプトエディターの上にある「+」アイコンをクリックすると、これらのスクリプトをカスタムアクションとして保存できます。このようにして、Tabular Editorのコンテキストメニューから直接実行したり視覚化したりできる、再利用しやすいDAXクエリのコレクションを手に入れることができます。 + +![image](https://user-images.githubusercontent.com/8976200/91638790-305e0380-ea12-11ea-9d84-313f4388496f.png) + +### データの書き出し + +以下のスクリプトを使用して、DAXクエリを評価し、その結果をファイルにストリームできます(スクリプトはタブ区切りのファイル形式を使用します)。 + +```csharp +using System.IO; + +// This script evaluates a DAX query and writes the results to file using a tab-separated format: + +var dax = "EVALUATE 'Customer'"; +var file = @"c:\temp\file.csv"; +var columnSeparator = "\t"; + +using(var daxReader = ExecuteReader(dax)) +using(var fileWriter = new StreamWriter(file)) +{ + // Write column headers: + fileWriter.WriteLine(string.Join(columnSeparator, Enumerable.Range(0, daxReader.FieldCount - 1).Select(f => daxReader.GetName(f)))); + + while(daxReader.Read()) + { + var rowValues = new object[daxReader.FieldCount]; + daxReader.GetValues(rowValues); + var row = string.Join(columnSeparator, rowValues.Select(v => v == null ? "" : v.ToString())); + fileWriter.WriteLine(row); + } +} +``` + +他にもおもしろい使い方を思いついたら、ぜひ [community scripts repository](https://github.com/TabularEditor/Scripts) で共有することを検討してみてください。ありがとうございました。 + +*** + +## Power Queryのサーバー名とデータベース名の置き換え + +SQL ServerベースのデータソースからデータをインポートするPower BIデータセットには、しばしば次のようなM式が含まれます。Tabular Editorには残念ながらこのような式を「解析」するメカニズムはありませんが、この式のサーバー名とデータベース名を元の値を知らずに別のものに置き換えたい場合、値が二重引用符で囲まれているという事実を利用できます。 + +```M +let + Source = Sql.Databases("devsql.database.windows.net"), + AdventureWorksDW2017 = Source{[Name="AdventureWorks"]}[Data], + dbo_DimProduct = AdventureWorksDW2017{[Schema="dbo",Item="DimProduct"]}[Data] +in + dbo_DimProduct +``` + +次のスクリプトは、二重引用符で囲まれた値の最初の出現箇所をサーバー名で、二重引用符で囲まれた値の2番目の出現箇所をデータベース名で置き換えるものです。どちらの置換値も環境変数から読み込まれる。 + +```csharp +// This script is used to replace the server and database names across +// all power query partitions, with the ones provided through environment +// variables: +var server = "\"" + Environment.GetEnvironmentVariable("SQLServerName") + "\""; +var database = "\"" + Environment.GetEnvironmentVariable("SQLDatabaseName") + "\""; + +// This function will extract all quoted values from the M expression, returning a list of strings +// with the values extracted (in order), but ignoring any quoted values where a hashtag (#) precedes +// the quotation mark: +var split = new Func>(m => { + var result = new List(); + var i = 0; + foreach(var s in m.Split('"')) { + if(s.EndsWith("#") && i % 2 == 0) i = -2; + if(i >= 0 && i % 2 == 1) result.Add(s); + i++; + } + return result; +}); +var GetServer = new Func(m => split(m)[0]); // Server name is usually the 1st encountered string +var GetDatabase = new Func(m => split(m)[1]); // Database name is usually the 2nd encountered string + +// Loop through all partitions on the model, replacing the server and database names from the partitions +// with the ones specified in environment variables: +foreach(var p in Model.AllPartitions.OfType()) +{ + var oldServer = "\"" + GetServer(p.Expression) + "\""; + var oldDatabase = "\"" + GetDatabase(p.Expression) + "\""; + p.Expression = p.Expression.Replace(oldServer, server).Replace(oldDatabase, database); +} +``` + +*** + +## Power QueryのデータソースとパーティションをLegacyに置き換える + +SQL Serverベースのデータソースに対してパーティションにPower Query(M)式を使用するPower BIベースのモデルを使用している場合、残念ながらTabular Editorのデータインポートウィザードの使用やスキーマチェック(インポートしたカラムとデータソースのカラムの比較など)の実行ができなくなります。 + +この問題を解決するには、モデル上で以下のスクリプトを実行し、パワークエリパーティションを対応するネイティブSQLクエリパーティションに置き換え、モデル上にレガシー(プロバイダー)データソースを作成してTabular Editorのデータインポートウィザードで機能させることが可能です。 + +このスクリプトには2つのバージョンがあります。最初のものは、作成されたレガシーデータソース用のMSOLEDBSQLプロバイダーと、ハードコードされたクレデンシャルを使用します。これはローカルで開発する場合に便利です。2つ目は、Azure DevOps上のMicrosoftがホストするビルドエージェントで利用できるSQLNCLIプロバイダーを使用し、環境変数から資格情報とサーバー/データベース名を読み取るもので、Azure Pipeliensへの統合に便利なスクリプトとなっています。 + +Mパーティションから接続情報を読み込み、Azure ADを通じてユーザー名とパスワードの入力を促すMSOLEDBSQL版。 + +```csharp +#r "Microsoft.VisualBasic" + +// This script replaces all Power Query partitions on this model with a +// legacy partition using the provided connection string with INTERACTIVE +// AAD authentication. The script assumes that all Power Query partitions +// load data from the same SQL Server-based data source. + +// Provide the following information: +var authMode = "ActiveDirectoryInteractive"; +var userId = Microsoft.VisualBasic.Interaction.InputBox("Type your AAD user name", "User name", "name@domain.com", 0, 0); +if(userId == "") return; +var password = ""; // Leave blank when using ActiveDirectoryInteractive authentication + +// This function will extract all quoted values from the M expression, returning a list of strings +// with the values extracted (in order), but ignoring any quoted values where a hashtag (#) precedes +// the quotation mark: +var split = new Func>(m => { + var result = new List(); + var i = 0; + foreach(var s in m.Split('"')) { + if(s.EndsWith("#") && i % 2 == 0) i = -2; + if(i >= 0 && i % 2 == 1) result.Add(s); + i++; + } + return result; +}); +var GetServer = new Func(m => split(m)[0]); // Server name is usually the 1st encountered string +var GetDatabase = new Func(m => split(m)[1]); // Database name is usually the 2nd encountered string +var GetSchema = new Func(m => split(m)[2]); // Schema name is usually the 3rd encountered string +var GetTable = new Func(m => split(m)[3]); // Table name is usually the 4th encountered string + +var server = GetServer(Model.AllPartitions.OfType().First().Expression); +var database = GetDatabase(Model.AllPartitions.OfType().First().Expression); + +// Add a legacy data source to the model: +var ds = Model.AddDataSource("AzureSQL"); +ds.Provider = "System.Data.OleDb"; +ds.ConnectionString = string.Format( + "Provider=MSOLEDBSQL;Data Source={0};Initial Catalog={1};Authentication={2};User ID={3};Password={4}", + server, + database, + authMode, + userId, + password); + +// Remove Power Query partitions from all tables and replace them with a single Legacy partition: +foreach(var t in Model.Tables.Where(t => t.Partitions.OfType().Any())) +{ + var mPartitions = t.Partitions.OfType(); + if(!mPartitions.Any()) continue; + var schema = GetSchema(mPartitions.First().Expression); + var table = GetTable(mPartitions.First().Expression); + t.AddPartition(t.Name, string.Format("SELECT * FROM [{0}].[{1}]", schema, table)); + foreach(var p in mPartitions.ToList()) p.Delete(); +} +``` + +環境変数から接続情報を読み取るSQLNCLIバージョン。 + +```csharp +// このスクリプトは、このモデル上のすべてのPower Queryパーティションをレガシーパーティションに置き換え、SQLサーバー名、データベース名、ユーザー名、パスワードを対応する環境変数から読み込みます。このスクリプトは、すべての Power Query パーティションが同じ SQL Server ベースのデータソースからデータをロードすることを想定しています。 + +var server = Environment.GetEnvironmentVariable("SQLServerName"); +var database = Environment.GetEnvironmentVariable("SQLDatabaseName"); +var userId = Environment.GetEnvironmentVariable("SQLUserName"); +var password = Environment.GetEnvironmentVariable("SQLUserPassword"); + +// This function will extract all quoted values from the M expression, returning a list of strings +// with the values extracted (in order), but ignoring any quoted values where a hashtag (#) precedes +// the quotation mark: +var split = new Func>(m => { + var result = new List(); + var i = 0; + foreach(var s in m.Split('"')) { + if(s.EndsWith("#") && i % 2 == 0) i = -2; + if(i >= 0 && i % 2 == 1) result.Add(s); + i++; + } + return result; +}); +var GetServer = new Func(m => split(m)[0]); // Server name is usually the 1st encountered string +var GetDatabase = new Func(m => split(m)[1]); // Database name is usually the 2nd encountered string +var GetSchema = new Func(m => split(m)[2]); // Schema name is usually the 3rd encountered string +var GetTable = new Func(m => split(m)[3]); // Table name is usually the 4th encountered string + +// Add a legacy data source to the model: +var ds = Model.AddDataSource("AzureSQL"); +ds.Provider = "System.Data.SqlClient"; +ds.ConnectionString = string.Format( + "Server={0};Initial Catalog={1};Persist Security Info=False;User ID={2};Password={3}", + server, + database, + userId, + password); + +// Remove Power Query partitions from all tables and replace them with a single Legacy partition: +foreach(var t in Model.Tables.Where(t => t.Partitions.OfType().Any())) +{ + var mPartitions = t.Partitions.OfType(); + if(!mPartitions.Any()) continue; + var schema = GetSchema(mPartitions.First().Expression); + var table = GetTable(mPartitions.First().Expression); + t.AddPartition(t.Name, string.Format("SELECT * FROM [{0}].[{1}]", schema, table)); + foreach(var p in mPartitions.ToList()) p.Delete(); +} +``` diff --git a/te2/Ja-jp/ja-Workspace-Database.md b/te2/Ja-jp/ja-Workspace-Database.md new file mode 100644 index 0000000..43d9115 --- /dev/null +++ b/te2/Ja-jp/ja-Workspace-Database.md @@ -0,0 +1,48 @@ +# ワークスペース・データベースの紹介 + +Tabular Editor 3.0は、Analysis Servicesのインスタンスに展開されたデータベースへの同時接続で、ディスクからロードされたモデルのメタデータの編集をサポートします。このデータベースを_workspace database_と呼びます。今後、Tabular Editorでタブラーモデリングを行う場合は、この方法を推奨します。 + +Save (Ctrl+S) を1回押すだけで、ディスクへの変更の保存とワークスペースデータベースのメタデータの更新を同時に行うことができるため、開発ワークフローが非常にシンプルになります。また、Analysis Servicesから返されたエラーメッセージは、Saveを押すとすぐにTabular Editorに表示されるという利点もあります。ある意味、ワークスペース・データベースが更新されるタイミングをコントロールできることを除けば、SSDT / Visual StudioまたはPower BI Desktopが行う方法に似ています。 + +Model.bimファイルやフォルダー構造からモデルを読み込むと、次のようなプロンプトが表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/58166683-a65db180-7c8a-11e9-9df3-be9a716b3ad1.png) + +* **Yes**: モデルメタデータはディスクからロードされ、すぐにAnalysis Servicesのインスタンスにデプロイされます。その後、Tabular Editorは新しくデプロイされたデータベースに接続します。次に同じモデルをディスクからロードすると、Tabular Editorは自動的に再デプロイされ、データベースに接続されます。 +* **No**: モデルのメタデータは、Analysis Servicesのインスタンスに接続することなく、通常通りディスクからTabular Editorに読み込まれます。 +* **No, don't ask again**: 上記のオプションと同じですが、Tabular Editorは次に同じモデルをロードしたときに再度質問することはありません。 + +## ワークスペース・データベースのセットアップ + +上記のプロンプトで「Yes」オプションを選択すると、Analysis Servicesのインスタンスに対するサーバ名と(オプションの)資格情報の入力を求められます。OK "を押すと、インスタンス上にすでにあるデータベースのリストが表示されます。Tabular Editorは新しいデータベースをデプロイすることを想定しており、Windowsユーザー名と現在の日付と時刻に基づいて新しいデータベースのデフォルト名を提供します。 + +![image](https://user-images.githubusercontent.com/8976200/58179509-a10f5f80-7ca8-11e9-9764-4cb76b9d1a8b.png) + +既存のデータベースをワークスペースのデータベースとして使用する場合は、リストで選択するだけです。**注意警告: 既存のデータベースを選択した場合、ディスクから読み込まれたモデルのメタデータで上書きされます。このため、本番インスタンスにワークスペース・データベースをセットアップすることは推奨されません!**。 + +## ユーザーオプションファイル(.tmuo) + +ファイルシステム内の各モデルのワークスペース設定を追跡するために、Tabular Editor 3.0では.tmuo(Tabular Model User Optionsの略)タイプの新しいファイルを導入し、Model.bimまたはDatabase.jsonファイルの隣に配置されます。 + +.tmuoファイルは、以下の内容を持つ単なるjson文書です。 + +```json +{ + "UseWorkspace": true, + "WorkspaceConnection": "Data Provider=MSOLAP;Data Source=localhost", + "WorkspaceDatabase": "AdventureWorks_WS_Feature123" +} +``` + +ディスクからモデルのメタデータをロードする際、Tabular Editorはロードされたモデルファイルと同じディレクトリに .tmuoファイルがあるかどうかを調べます。.tmuoファイルの名前は次のパターンにしたがっている必要があります。 + +``` +..tmuo +``` + +このファイルにユーザー名が含まれているのは、複数の開発者が並行して開発するワークフローにおいて、お互いのワークスペース・データベースを不注意に上書きしてしまうことを防ぐためです。このファイルが存在し、ファイルの "UseWorkspace" フラグが "true" に設定されている場合、Tabular Editorはディスクからモデルをロードする際に次のステップを実行します。 + +1. .tmuoファイルで指定されたサーバー名とデータベース名を使用して、モデルのメタデータをワークスペース・データベースに配備します(既存のメタデータを上書きします)。 +2. Connect to the newly deployed database in "workspace mode". + +「ワークスペース・モード」では、Save (ctrl+s) を押すと、Tabular Editorは同時にモデルをディスクに保存し、ワークスペース・データベースを更新します。これにより、モデルのメタデータをディスクに保存する際、手動でデータベースをデプロイしたり、File > Save As... やFile > Save to Folder... を実行しなくても、新しいコードのテストやAnalysis Servicesが提供するエラーメッセージを迅速に確認することができるようになりました。 diff --git a/te2/Ja-jp/ja-gdpr-delete.md b/te2/Ja-jp/ja-gdpr-delete.md new file mode 100644 index 0000000..fbba64f --- /dev/null +++ b/te2/Ja-jp/ja-gdpr-delete.md @@ -0,0 +1,3 @@ +# ユーザーデータ削除 + +すべてのユーザー記録の完全なデータ削除をご希望の場合は、gdpr@tabulareditor.com まで電子メールをお送りください。 diff --git a/te2/Ja-jp/ja-importing-tables-from-excel.md b/te2/Ja-jp/ja-importing-tables-from-excel.md new file mode 100644 index 0000000..e1d3f3c --- /dev/null +++ b/te2/Ja-jp/ja-importing-tables-from-excel.md @@ -0,0 +1,64 @@ +# Excelからテーブルをインポートする + +Excelワークシートをテーブルとして表形式モデルに追加する必要がある場合、Tabular Editor 2.xとExcel ODBCドライバーを使用すれば可能です。 + +## 前提条件 + +Tabular Editor 2.xは32ビットのアプリケーションで、多くの人は通常64ビット版のOffice(64ビット版Excel ODBCドライバーを含む)をインストールしています。残念ながら、Tabular Editor 2.xは64ビットドライバーを使用することができず、32ビットドライバーをダウンロードしてインストールしようとすると、すでに64ビット版のOfficeがインストールされている場合はエラーになります。しかし、この回避策を用いることで、64ビット版Officeの隣に32ビット版Excel ODBCドライバーをインストールすることは可能です。 + +1. 32ビット版のドライバーはこちらからダウンロードしてください。https://www.microsoft.com/en-us/download/details.aspx?id=54920 +2. AccessDatabaseEngine.exeを解凍する +3. 中にaceredist.msiファイルがあります。このファイルはコマンドラインで /passiveスイッチを使って実行する必要があります。 + + ```shell + aceredist.msi /passive + ``` + +4. ODBCデータソース(32ビット)の設定(Windowsのスタートボタンから「ODBC」を検索し、下のスクリーンショットのようにプラットフォームに「32/64ビット」と表示されているはず)を見て、インストールを確認します。 + + ![Excel Odbc 32 64](../../images/excel-odbc-32-64.png) + +## ODBCデータソースのセットアップ + +上記のように32ビットODBC Excelドライバーがインストールされていることを確認した後、Tabular Editor 2.xでExcelファイルからテーブルを追加するには、以下の手順が必要です。 + +1. Tabular Editorで、モデルを右クリックし、"Import tables... "を選択、"Next "をクリックする +2. 接続のプロパティ "ダイアログで、"変更... "をクリックします。Microsoft ODBCデータソース "を選択し、"OK "をクリックする。 +3. 接続文字列を使用する」を選択し、「ビルド...」をクリックします。Excel Files "を選び、"OK "を押します。 + ![Odbc Connection Properties Excel](../../images/odbc-connection-properties-excel.png) + +4. テーブルをロードしたいExcelファイルを探し、"OK "をクリックします。すると、次のような接続文字列が生成されるはずです。 + + ```connectionstring + Dsn=Excel Files;dbq=C:\Users\DanielOtykier\Documents\A Beer Dataset Calculation.xlsx;defaultdir=C:\Users\DanielOtykier\Documents;driverid=1046;maxbuffersize=2048;pagetimeout=5 + ``` + +5. "OK"を押すと、Tabular EditorにExcelファイルのワークシートとデータ領域のリストが表示されるはずです。残念ながら、テーブルのインポートウィザードは無効なSQL文を生成するため、現在データをプレビューすることはできません。 + + ![Import Tables Excel](../../images/import-tables-excel.png) + +6. しかし、インポートしたいテーブルにチェックマークを付けることはできます。エラーメッセージを無視して、「インポート」をクリックしてください。 +7. 新しく追加されたテーブルで、パーティションを見つけ、SQLを修正して、空のブラケットとワークシート名の前にあるドットを削除します。変更を適用する(F5を押す)。 + + ![Fix Partition Expressions Excel](../../images/fix-partition-expressions-excel.png) + +8. 次に、パーティション上で右クリックし、"Refresh Table Metadata... "を選択します。これでTabular EditorはODBCドライバを通じてExcelファイルから列のメタデータを読み込むようになりました。 + + ![Refresh Metadata Excel](../../images/refresh-metadata-excel.png) + +9. (オプション)テーブルへのデータ更新にODBCを使用しない場合は、パーティションを入れ替えて、同じワークシートデータをロードするMベースの式を使用する必要があります。これを行うには、テーブルに新しいPowerQueryパーティションを追加します(「パーティション」を右クリックし、「新しいパーティション(Power Query)」を選択します)。レガシー・パーティションを削除します。そして、新しいパーティションM式を次のように設定します。 + + ```M + let + Source = Excel.Workbook(File.Contents(""), null, true), + Customer_Sheet = Source{[Item="",Kind="Sheet"]}[Data], + #"Promoted Headers" = Table.PromoteHeaders(Customer_Sheet, [PromoteAllScalars=true]) + in + #"Promoted Headers" + ``` + + Replace the `` and `` placeholders with their actual values. + +## 結論 + +ExcelファイルからのテーブルのインポートはTabular Editor 2.xでも可能ですが、上記のようにODBC Excelドライバーを使用する必要があり、若干複雑になっています。 diff --git a/te2/Ja-jp/ja-incremental-refresh.md b/te2/Ja-jp/ja-incremental-refresh.md new file mode 100644 index 0000000..e72754c --- /dev/null +++ b/te2/Ja-jp/ja-incremental-refresh.md @@ -0,0 +1,48 @@ +# 増分更新 + +Power BI Serviceでホストされているデータセットでは、1つ以上のテーブルで [Incremental Refresh](https://docs.microsoft.com/en-us/power-bi/connect-data/incremental-refresh-overview) を設定できます。Power BIデータセットでIncremental Refreshを設定・変更するには、[Power BIサービスのXMLAエンドポイントを直接使用する](https://docs.microsoft.com/en-us/power-bi/connect-data/incremental-refresh-xmla)か、後述のようにXMLAエンドポイントに接続したTabular Editorを使用することが可能です。 + +## Tabular Editorでゼロから増分更新を設定する + +1. ワークスペースのPower BI XMLA R/Wエンドポイントに接続し、増分更新を設定するデータセットを開きます。 +2. 増分更新には `RangeStart` と `RangeEnd` パラメーターを作成する必要があります ([追加情報](https://docs.microsoft.com/en-us/power-bi/connect-data/incremental-refresh-configure#create-parameters)) ので、まずTabular Editorで新しいShared Expressionsを2つ追加してみましょう。 + ![Add shared expressions](https://user-images.githubusercontent.com/8976200/121341006-8906e900-c920-11eb-97af-ee683ff40609.png) +3. それぞれ `RangeStart` と `RangeEnd` という名前を付け、`Kind` プロパティを "M" に設定し、式を以下のように設定します(実際に指定する日時の値は、データ更新の開始時にPBIサービスによって設定されるため、重要ではありません)。 + + ```M + #datetime(2021, 6, 9, 0, 0, 0) meta [IsParameterQuery=true, Type="DateTime", IsParameterQueryRequired=true] + ``` + + ![Set kind property](https://user-images.githubusercontent.com/8976200/121342389-dc2d6b80-c921-11eb-8848-b67950e55e36.png) + +4. 次に、増分更新を有効にするテーブルを選択します。 +5. テーブルの`EnableRefreshPolicy`プロパティを "true "に設定します。 + ![Enable Refresh Policy](https://user-images.githubusercontent.com/8976200/121339872-3842c080-c91f-11eb-8e63-a051b34fb36f.png) +6. 残りのプロパティは、必要なインクリメンタルリフレッシュポリシーにしたがって設定します。`SourceExpression` プロパティにM式を指定することを忘れないでください (これは、増分更新ポリシーによって作成されるパーティションに追加される式です。ソースのデータをフィルターするために `RangeStart` と `RangeEnd` パラメーターを使用する必要があります)。データ重複をする可能性があるため、= 演算子は`RangeStart`または`RangeEnd`のいずれかにのみ適用し、両方には適用しないでください。 + ![Configure Properties](https://user-images.githubusercontent.com/45298358/170603450-8232ad55-0b4a-4ead-b113-786a781f94ad.png) +7. モデルの保存 (Ctrl+S). +8. テーブルを右クリックし"Apply Refresh Policy"を選択します。 + ![Apply Refresh Policy](https://user-images.githubusercontent.com/8976200/121342947-78577280-c922-11eb-82b5-a517fbe86c3e.png) + +これで完了です。この時点で、Power BI Serviceが、指定したポリシーに基づいてテーブルのパーティションを自動的に生成していることが確認できるはずです。 + +![Generated Partitions](https://user-images.githubusercontent.com/8976200/121343417-eef47000-c922-11eb-8731-1ac4dde916ef.png) + +次に、パーティション内のデータのリフレッシュを行います。これにはPower BIのサービスを利用することもできますし、[SQL Server Management StudioによるXMLA/TMSL](https://docs.microsoft.com/en-us/power-bi/connect-data/incremental-refresh-xmla#refresh-management-with-sql-server-management-studio-ssms)や、[Tabular Editorのスクリプト](https://www.elegantbi.com/post/datarefreshintabulareditor)を使ってパーティションを一括でリフレッシュすることも可能です。 + +## Modifying existing refresh policies + +Power BI Desktopで設定した既存のリフレッシュポリシーをTabular Editorで変更することもできます。この場合は、上記のステップ6-8を実行するだけです。 + +## Applying refresh policies with `EffectiveDate` + +現在の日付を上書きしながらパーティションを生成したい場合(異なるローリングウィンドウ範囲を生成する目的で)、Tabular Editorの小さなスクリプトを使用して、[EffectiveDate](https://docs.microsoft.com/en-us/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#optional-parameters) パラメーターでリフレッシュポリシーを適用できます。 + +増分更新テーブルを選択した状態で、上記のステップ8の代わりに、Tabular Editorの「アドバンススクリプト」ペインで以下のスクリプトを実行します。 + +```csharp +var effectiveDate = new DateTime(2020, 1, 1); // Todo: replace with your effective date +Selected.Table.ApplyRefreshPolicy(effectiveDate); +``` + +![Use scripts to apply refresh policy](https://user-images.githubusercontent.com/8976200/121344362-f9633980-c923-11eb-916c-44a35cf03a36.png) diff --git a/te2/Ja-jp/ja-toc.md b/te2/Ja-jp/ja-toc.md new file mode 100644 index 0000000..079014a --- /dev/null +++ b/te2/Ja-jp/ja-toc.md @@ -0,0 +1,43 @@ +# はじめに + +## [はじめに](ja-Getting-Started.md) + +## [Power BI Desktopとの連携](ja-Power-BI-Desktop-Integration.md) + +## [テーブルのインポート](ja-Importing-Tables.md) + +## [ビデオチュートリアル](ja-Training-Webinar-for-Tabular-Editor.md) + +## [よくある質問](ja-FAQ.md) + +## [キーボードショートカット](ja-Keyboard-Shortcuts.md) + +# 機能概要 + +## [Basic](ja-Features-at-a-glance.md) + +## [Advanced](ja-Advanced-features.md) + +# アドバンストトピックス + +## [アドバンスト・スクリプティング](ja-Advanced-Scripting.md) + +## [FormatDaxの非推奨](ja-FormatDax.md) + +## [便利なスクリプトスニペット](ja-Useful-script-snippets.md) + +## [カスタムアクション](ja-Custom-Actions.md) + +## [コマンドライン](ja-Command-line-Options.md) + +## [ベストプラクティス・アナライザー](ja-Best-Practice-Analyzer.md) + +## [ベストプラクティス・アナライザー 2.0](ja-Best-Practice-Analyzer-Improvements.md) + +## [アドバンストフィルタリング](ja-Advanced-Filtering-of-the-Explorer-Tree.md) + +## [マスターモデルパターン](ja-Master-model-pattern.md) + +## [増分更新](ja-incremental-refresh.md) + +## [Excelからテーブルをインポートする](ja-importing-tables-from-excel.md) diff --git a/te3/features/ja-jp/ja-csharp-scripts.md b/te3/features/ja-jp/ja-csharp-scripts.md new file mode 100644 index 0000000..1a883d5 --- /dev/null +++ b/te3/features/ja-jp/ja-csharp-scripts.md @@ -0,0 +1,245 @@ +# C# スクリプト + +本書は、Tabular Editor 3のC#スクリプト機能の紹介です。このドキュメントの情報は変更される可能性があります。また、[useful-script-snippets](TabularEditorDocs\te2\Useful-script-snippets.md)の記事で、Tabular Editorのスクリプト機能を使ってできることの実例をいくつか紹介していますので、ぜひチェックしてみてください。 + +## なぜC#スクリプトなのか? + +Tabular EditorのUIの目標は、Tabularモデルの構築時に一般的に必要とされるほとんどのタスクを簡単に実行できるようにすることです。たとえば、複数のメジャーの表示フォルダーを一度に変更するには、エクスプローラー・ツリーでオブジェクトを選択し、ドラッグ・アンド・ドロップすればよいだけです。エクスプローラツリーの右クリックによるコンテキストメニューでは、パースペクティブからのオブジェクトの追加/削除、複数のオブジェクトの名前変更など、多くの作業を便利に行うことができます。 + +しかし、UIから簡単に実行できない一般的なワークフロータスクも多くあります。このため、Tabular EditorはC#スクリプトを提供し、上級ユーザーがC#構文を使用してスクリプトを書き、ロードされたTabularモデル内のオブジェクトをより直接的に操作できるようにしています。 + +> [!NOTE] +> Tabular Editor 3のC#スクリプトエディターでは、まだ IntelliSense(TM) のような機能は有効になっていません。この機能は後のリリースで利用可能になる予定です。詳しくは[@roadmap](TabularEditorDocs\te3\other\roadmap.md)をご覧ください。 + +## オブジェクト + +[スクリプティング API](xref:api-index) は `Model` と `Selected` という2つのトップレベルオブジェクトへのアクセスを提供します。前者はTabularモデル内のすべてのオブジェクトを操作するためのメソッドとプロパティを含んでおり、後者はエクスプローラツリーで現在選択されているオブジェクトのみを公開します。 + +`Model`オブジェクトは [Microsoft.AnalysisServices.Tabular.Model](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.model.aspx) クラスのラッパーで、そのプロパティのサブセットを公開し、トランスレーション、パースペクティブ、オブジェクトコレクションを簡単に操作するためのいくつかのメソッドとプロパティが追加されています。同じことが、テーブル、メジャー、カラムなどの子孫オブジェクトにも適用され、これらはすべて対応するラッパーオブジェクトを持っています。タブラー・エディター・ラッパー・ライブラリーのオブジェクト、プロパティ、メソッドの完全なリストについては、を参照してください。 + +このラッパーで作業する主な利点は、すべての変更がTabular EditorのUIから元に戻せることです。スクリプトを実行した後、CTRL+Zを押すだけで、そのスクリプトによって行われたすべての変更が即座に取り消されるのがわかります。さらに、このラッパーは、多くの一般的なタスクをシンプルなワンライナーに変える便利なメソッドを提供します。以下に、いくつかの例を紹介します。読者はすでにC#とLINQにある程度慣れていることが前提です。なぜなら、Tabular Editorsのスクリプト機能のこれらの側面はここではカバーされないからです。C#やLINQに慣れていない方でも、以下の例にはついていけるはずです。 + +## オブジェクトのプロパティを設定する + +あるオブジェクトのプロパティを変更したい場合、当然ながらUIから直接行うのがもっとも簡単な方法でしょう。しかし、例として、スクリプトを使用して同じことを実現する方法を見てみましょう。 + +FactInternetSales' テーブルの[Sales Amount]メジャーのFormat Stringを変更する必要があるとします。エクスプローラー・ツリーでメジャーを見つけると、それをスクリプト・エディターにドラッグするだけでよいのです。すると、Tabular Editorによって以下のコードが生成され、Tabularオブジェクト・モデルでこの特定のメジャーを表します。 + +```csharp +Model.Tables["FactInternetSales"].Measures["Sales Amount"] +``` + +右端の括弧の後にドット (.) を追加すると、オートコンプリート・メニューがポップアップ表示され、この特定のメジャーに存在するプロパティおよびメソッドが表示されます。メニューから "フォーマット文字列" を選択するか、最初の数文字を入力してTabキーを押すだけです。次に、等号の後に「0.0%」を入力します。このメジャーの表示フォルダーも変更します。最終的なコードは、以下のようになります。 + +```csharp +Model.Tables["FactInternetSales"].Measures["Sales Amount"].FormatString = "0.0%"; +Model.Tables["FactInternetSales"].Measures["Sales Amount"].DisplayFolder = "New Folder"; +``` + +**Note:** 各行の最後にはセミコロン(;)を付けることを忘れないでください。これはC#の必須条件です。これを忘れると、スクリプトを実行しようとしたときに、構文エラーメッセージが表示されます。 + +F5キーを押すか、スクリプトエディターの上にある「再生」ボタンをクリックして、スクリプトを実行します。すぐに、変更された表示フォルダーを反映して、エクスプローラツリー内でメジャーが移動するのを確認できるはずです。プロパティ・グリッドでメジャーを確認すると、Format Stringプロパティがそれに応じて変更されていることも確認できます。 + +### 複数のオブジェクトを一度に操作する + +オブジェクト・モデルの多くのオブジェクトは、実際には複数のオブジェクトのコレクションです。たとえば、各テーブル・オブジェクトはMeasuresコレクションを持っています。ラッパーは、これらのコレクションに一連の便利なプロパティとメソッドを公開し、一度に複数のオブジェクトに同じプロパティを簡単に設定できるようにします。これについては、以下で詳しく説明します。さらに、標準的なLINQ拡張メソッドをすべて使用して、 コレクションのオブジェクトをフィルタリングしたりブラウズしたりできます。 + +以下に、最も一般的に使用されるLINQ拡張メソッドの例をいくつか示します。 + +* `Collection.First([predicate])` オプションの[predicate]の条件を満たす、コレクション内の最初のオブジェクトを返します。 +* `Collection.Any([predicate])` コレクションにオブジェクトが含まれる場合(オプションで[predicate]の条件を満たす場合)、真を返します。 +* `Collection.Where(predicate)` predicateの条件によってフィルタリングされたオリジナルのコレクションを返します。 +* `Collection.Select(map)` 指定されたマップにしたがって、コレクション内の各オブジェクトを別のオブジェクトに投影する。 +* `Collection.ForEach(action)` コレクション内の各要素に対して、指定されたアクションを実行します。 + +上記の例では、 `predicate` はラムダ式であり、1つのオブジェクトを入力として受け取り、ブール値を出力として返す。たとえば、 `Collection` がメジャーのコレクションであれば、典型的な `predicate` は以下のようなものになる。 + +`m => m.Name.Contains("Reseller")` + +このpredicateは、メジャーの名前に文字列 "Reseller" が含まれている場合にのみ、trueを返します。より高度なロジックが必要な場合は、式を中括弧で囲み、`return` キーワードを使用します。 + +```csharp +.Where(obj => { + if(obj is Column) { + return false; + } + return obj.Name.Contains("test"); +}) +``` + +上の例に戻ると、 `map` はラムダ式で、入力としてオブジェクトを受け取り、出力として任意のオブジェクトを返します。action` はラムダ式で、入力としてオブジェクトをひとつ受け取り、出力として値を返しません。 + +## **モデル**オブジェクトの操作 + +現在ロードされているTabular Modelの任意のオブジェクトを素早く参照するには、エクスプローラツリーからC#スクリプトエディタにオブジェクトをドラッグアンドドロップします。 + +![Dragging and dropping an object into the C# script editor](../../../images/drag-object-to-script.gif) + +モデルやその子孫オブジェクトにどのようなプロパティが存在するかの概要については、[TOM documentation](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.model.aspx)を参照してください。さらに、ラッパーオブジェクトによって公開されるプロパティとメソッドの完全なリストについては、を参照してください。 + +## **選択された**オブジェクトを操作する + +しかし、時にはエクスプローラツリーからオブジェクトを選択し、選択されたオブジェクトのみに対してスクリプトを実行したい場合があります。そこで、`Selected`オブジェクトが役に立ちます。 + +Selected` オブジェクトは、現在選択されているものを簡単に識別するための様々なプロパティを提供し、特定のタイプのオブジェクトに選択を限定することもできます。ディスプレイフォルダでブラウジングしているときに、エクスプローラツリーで1つ以上のフォルダが選択されていると、その子アイテムもすべて選択されているとみなされます。 単一選択の場合は、アクセスしたいオブジェクトのタイプを表す単数形の名前を使用します。たとえば、以下のようになります。 + +`Selected.Hierarchy` + +は、ツリー内で現在選択されている階層を参照します。ただし、選択されている階層が1つだけであることが条件です。複数選択可能な場合は、複数形の型名を使用します。 + +`Selected.Hierarchies` + +単数形のオブジェクトに存在するすべてのプロパティは、いくつかの例外を除いて、その複数形にも存在します。つまり、上記のLINQ拡張メソッドを使用せずに、1行のコードで、複数のオブジェクトに対して一度にこれらのプロパティの値を設定できます。たとえば、現在選択されているすべてのメジャーを "Test" という名前の新しい表示フォルダーに移動させたいとします。 + +`Selected.Measures.DisplayFolder = "Test";` + +ツリーで現在どのメジャーも選択されていない場合、上記のコードは何も行わず、エラーも発生しません。そうでない場合は、選択されたすべてのメジャーに対してDisplayFolderプロパティが "Test" に設定されます(`Selected` オブジェクトは選択されたフォルダー内のオブジェクトも含むため、フォルダー内に存在するメジャーも含まれます)。Measures` の代わりに単数形の `Measure` を使用すると、現在の選択範囲に正確に1つのメジャーが含まれていない限り、エラーが発生します。 + +複数のオブジェクトのNameプロパティを一度に設定することはできませんが、いくつかのオプションは用意されています。ある文字列の出現箇所をすべて別の文字列に置き換えるだけなら、提供されている「Rename」メソッドを使えばいい。 + +```csharp +Selected.Measures + .Rename("Amount", "Value"); +``` + +この場合、現在選択されているすべてのメジャーの名前に含まれる "Amount" という単語が "Value" に置き換えられます。 また、上記のようにLINQ ForEach() メソッドを使用して、より高度なロジックを組み込むこともできます。 + +```csharp +Selected.Measures + .ForEach(m => if(m.Name.Contains("Reseller")) m.Name += " DEPRECATED"); +``` + +この例では、選択されたすべてのメジャーの名前に、名前に "Reseller" という単語が含まれている場合は、" DEPRECATED" というテキストが追加されます。別の方法として、LINQ拡張メソッド `Where()` を使用して、`ForEach()` オペレーションを適用する前にコレクションをフィルタリングすることもでき、まったく同じ結果を得ることができます。 + +```csharp +Selected.Measures + .Where(m => m.Name.Contains("Reseller")) + .ForEach(m => m.Name += " DEPRECATED"); +``` + +## ヘルパーメソッド + +Tabular Editorは、特定のスクリプトタスクを簡単に実現するための特別なヘルパーメソッド群を提供します。これらのいくつかは拡張メソッドとして呼び出すことができることに注意してください。たとえば、`object.Output();` と `Output(object);` は等価です。 + +* `void Output(object value)` - は、スクリプトの実行を停止し、指定されたオブジェクトに関する情報を表示します。スクリプトがコマンドライン実行の一部として実行されている場合、これはコンソールにオブジェクトの文字列表現を書き込みます。 +* `void SaveFile(string filePath, string content)` - テキストデータをファイルに保存する便利な方法です。 +* `string ReadFile(string filePath)` - ファイルからテキストデータを読み込む便利な方法です。 +* `string ExportProperties(IEnumerable objects, string properties)` - 複数のオブジェクトから一連のプロパティをTSV文字列としてエクスポートする便利な方法です。 +* `void ImportProperties(string tsvData)` - TSV文字列から複数のオブジェクトにプロパティをロードする便利な方法です。 +* `void CustomAction(string name)` - マクロを名前で呼び出す。 +* `void CustomAction(this IEnumerable objects, string name)` - 指定されたオブジェクトに対してマクロを呼び出す。 +* `string ConvertDax(string dax, bool useSemicolons)` - は、US/UKとnon-US/UKのロケール間でDAX式を変換します。`useSemicolons` がtrue(デフォルト)の場合、 `dax` 文字列はネイティブのUS/UKフォーマットからnon-US/UKフォーマットに変換される。つまり、カンマ (リストセパレーター) はセミコロンに、ピリオド (小数点以下のセパレーター) はカンマに変換されます。UseSemicolons` がfalseに設定されている場合は、その逆となる。 +* `void FormatDax(this IEnumerable objects, bool shortFormat, bool? skipSpace)` - 指定されたコレクション内のすべてのオブジェクトに対して DAX 式をフォーマットします。 +* `void FormatDax(this IDaxDependantObject obj)` - スクリプトの実行が完了したとき、あるいは `CallDaxFormatter` メソッドが呼ばれたときに、DAX式のフォーマット用にオブジェクトをキューに追加します。 +* `void CallDaxFormatter(bool shortFormat, bool? skipSpace)` - これまでにキューイングされたオブジェクトのすべてのDAX式をフォーマットします。 +* `void Info(string)` - コンソールに情報メッセージを書き込みます(スクリプトがコマンドライン実行の一部として実行された場合のみ)。 +* `void Warning(string)` - コンソールに警告メッセージを書き込みます(スクリプトがコマンドライン実行の一部として実行された場合のみ)。 +* `void Error(string)` - コンソールにエラーメッセージを書き込みます(スクリプトがコマンドライン実行の一部として実行された場合のみ)。 +* `T SelectObject(this IEnumerable objects, T preselect = null, string label = "Select object") where T: TabularNamedObject` - 指定されたオブジェクトの1つを選択するよう促すダイアログをユーザに表示する。ユーザがダイアログをキャンセルした場合、このメソッドはnullを返します。 +* `void CollectVertiPaqAnalyzerStats()` - Tabular EditorがAnalysis Servicesのインスタンスに接続されている場合、VertiPaq Analyzerの統計コレクターが実行されます。 +* `long GetCardinality(this Column column)` - VertiPaq Analyzerの統計情報が現在のモデルで利用可能な場合、このメソッドは指定された列のカーディナリティを返します。 + +利用可能なヘルパーメソッドの一覧とその構文については、@script-helper-methodsを参照してください。 + +### デバッグ用スクリプト + +前述のように、`Output(object);` メソッドを使うと、スクリプトの実行を一時停止し、渡されたオブジェクトに関する情報を表示するダイアログボックスを開くことができます。また、このメソッドを拡張メソッドとして、`object.Output();`として呼び出すこともできます。ダイアログが閉じられると、スクリプトは再開されます。 + +ダイアログは、出力されるオブジェクトの種類に応じて、4つの異なる方法のうちの1つで表示されます。 + +- 特異なオブジェクト(文字列、int、DateTimesなど、TabularNamedObjectから派生したオブジェクトは除く)は、オブジェクトの `.ToString()` メソッドを呼び出すことで、シンプルなメッセージダイアログとして表示されます。 + +![image](https://user-images.githubusercontent.com/8976200/29941982-9917d0cc-8e94-11e7-9e78-24aaf11fd311.png) + +- 特異なTabularNamedObject(Table、Measure、またはTabular Editorで利用可能なその他のTOM NamedMetadataObjectなど)は、Tree Explorerでオブジェクトが選択されたときと同様にProperty Gridに表示される。オブジェクトのプロパティはグリッドで編集できるが、スクリプト実行の後の時点でエラーが発生した場合、"Rollback on error" が有効になっていれば、編集は自動的に戻されることに注意。 + +![image](https://user-images.githubusercontent.com/8976200/29941852-2acc9846-8e94-11e7-9380-f84fef26a78c.png) + +- オブジェクトの任意のIEnumerable(TabularNamedObjectsを除く)はリストに表示され、各リストアイテムはIEnumerable内のオブジェクトの `.ToString()` 値とタイプを表示します。 + +![image](https://user-images.githubusercontent.com/8976200/29942113-02dad928-8e95-11e7-9c04-5bb87b396f3f.png) + +- TabularNamedObjectsのIEnumerableはダイアログの左側にオブジェクトのリストを表示し、右側にProperty Gridを表示します。Property Gridはリストで選択されたオブジェクトから入力され、単一のTabularNamedObjectが出力されているときと同様にプロパティを編集できます。 + +![image](https://user-images.githubusercontent.com/8976200/29942190-498cbb5c-8e95-11e7-8455-32750767cf13.png) + +左下にある "Don't show more outputs" チェックボックスをチェックすると、それ以上 `.Output()` を呼び出したときにスクリプトが停止するのを防ぐことができます。 + +## .NETリファレンス + +通常のC#ソースコードと同様に、`using` キーワードを使用してクラス名などを短縮できます。また、Azure Functionsで使用する .csxスクリプトと同様に、`#r "<アセンブリ名または DLL パス>"` という構文で、外部アセンブリをインクルードすることが可能です。 +たとえば、以下のスクリプトは期待通りに動作します。 + +```csharp +// Assembly references must be at the very top of the file: +#r "System.IO.Compression" + +// Using keywords must come before any other statements: +using System.IO.Compression; +using System.IO; + +var xyz = 123; + +// Using statements still work the way they're supposed to: +using(var data = new MemoryStream()) +using(var zip = new ZipArchive(data, ZipArchiveMode.Create)) +{ + // ... +} +``` + +Tabular Editorはデフォルトで以下の`using`キーワードを適用し(スクリプトで指定されていなくても)、一般的な作業を容易にします。 + +```csharp +using System; +using System.Linq; +using System.Collections.Generic; +using Newtonsoft.Json; +using TabularEditor.TOMWrapper; +using TabularEditor.TOMWrapper.Utils; +using TabularEditor.UI; +``` + +また、以下の.NET Frameworkアセンブリがデフォルトでロードされます。 + +- System.Dll +- System.Core.Dll +- System.Data.Dll +- System.Windows.Forms.Dll +- Microsoft.Csharp.Dll +- Newtonsoft.Json.Dll +- TomWrapper.Dll +- TabularEditor.Exe +- Microsoft.AnalysisServices.Tabular.Dll + +## Roslynでのコンパイル + +Visual Studio 2017で導入された新しいRoslynコンパイラーを使用してスクリプトをコンパイルしたい場合は、**Tools > Preferences > Tabular Editor > C# SCripts and Maros**で設定できます。これにより、文字列補間などの新しいC#言語の機能を利用できます。コンパイラの実行ファイル(`csc.exe`)を格納するディレクトリのパスを指定し、コンパイラのオプションとして言語バージョンを指定するだけで、簡単に設定できます。 + +![Custom Compiler Te3](~/images/custom-compiler-te3.png) + +### Visual Studio 2017 + +一般的なVisual Studio 2017 Enterpriseのインストールでは、Roslynコンパイラはここに配置されています。 + +``` +c:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Roslyn +``` + +これには、C# 6.0の言語機能がデフォルトで含まれています。 + +![image](https://user-images.githubusercontent.com/8976200/92464584-a52cfc80-f1cd-11ea-9b66-3b47ac36f6c6.png) + +### Visual Studio 2019 + +一般的な Visual Studio 2019 Community インストールの場合、Roslyn コンパイラはここにあります。 + +``` +c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn +``` + +VS2019に同梱されているコンパイラは、C#8.0の言語機能をサポートしており、コンパイラオプションとして以下を指定することで有効にすることができます。 + +``` +-langversion:8.0 +``` diff --git a/te3/features/ja-jp/ja-dax-debugger.md b/te3/features/ja-jp/ja-dax-debugger.md new file mode 100644 index 0000000..c1264f9 --- /dev/null +++ b/te3/features/ja-jp/ja-dax-debugger.md @@ -0,0 +1,148 @@ +# DAXデバッガー + +> [!NOTE] +> DAXデバッガーはバージョン3.2.0で導入されました。 この記事の情報は、デバッガーの機能追加に伴い変更される可能性があります。 + + + +DAXは比較的複雑な言語であり、使いこなすのが難しいことは周知の事実です。ほとんどのデータモデル開発者は、DAXコードが期待した結果を返さないという状況を経験したことがあるでしょう。このような場合、コードを変数ごとに、関数コールごとに分解すると、何が起こっているのかをよりよく理解できます。 + +これまでは、クライアントツールで実行されたDAXクエリをキャプチャして、[DAX Studio](https://daxstudio.org/)や[SQL Server Management Studio](https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15)でクエリを分解して実行するという面倒で時間のかかる作業が多かったのですが、この「分解」作業が不要になったことでコードの信頼性が向上しました。 + +Tabular Editor 3は**DAXデバッガー**という概念を導入しました。これは、モデルのDAXコードに踏み込むプロセスを、より簡単にするツールです。コンセプトレベルでは、このデバッガーはC#アプリケーションを開発する際にVisual Studioで見られるような従来のIDEデバッガーと似ています。 + +## 前提条件 + +DAXデバッガーは、モデル内のDAXコードを解析し、サブ式や行コンテキストなどを評価するための適切なDAXクエリを生成し、インタラクティブな方法でコードを実行できます。 + +この機能を使用するには、Power BI DesktopやAnalysis Servicesの他のインスタンスから直接モデルメタデータをロードする場合など、Tabular Editor 3が**接続**または**ワークスペースモード**で動作している必要があります。 + +## はじめに + +Tabular Editor 3がAnalysis Servicesのインスタンスに接続されている間、デバッガーは2つの異なる方法のいずれかで起動できます。 + +- ピボットグリッド +- DAXクエリ + +デバッガーを起動すると、デバッグ中のコードに関するコンテキスト情報を提供する新しいビューが多数表示され、現在デバッグされているコードの部分をハイライト表示するDAXスクリプト ビューも表示されます。 + +> [!TIP] +> デバッグセッションを開始する前に、DAXコードを読みやすくするための書式設定を検討してください。 + +## ピボットグリッドによるデバッグ + +1. ピボットグリッドの新規作成 (**File > New > Pivot Grid**) +2. デバッグするメジャーをピボット・グリッドに追加します。以下のいずれかを実行します。 + - TOMエクスプローラからメジャーをドラッグする、または + - TOM Explorer でメジャーを右クリックし、**Add to pivot grid** を選択します。 + - ピボット・グリッドのフィールド・リストからメジャーを選択します (**ピボット・グリッド > フィールドの表示**) +3. (オプション)フィルタ領域、列領域、または行領域で、ピボットグリッドに1つまたは複数の列を追加します。 +4. Pivot Grid内の値セルを右クリックし、**Debug this value**を選択します。 + +![Debug From Pivot](../../../images/debug-from-pivot.png) + +## DAXクエリによるデバッグ + +1. 新しいDAXクエリを作成する (**File > New > DAX Query**). +2. DAXクエリを入力または貼り付けます。これは通常、Power BIのビジュアルによって生成されるような、1つ以上の (明示的な)メジャーを持つ `SUMMARIZECOLUMNS` 呼び出しで構成されるクエリであるべきです。 + +> [!TIP] +> Power BI Desktop の[Performance Analyzer](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-performance-analyzer)を使用すると、ビジュアルで生成されたクエリを取り込むことができます。 + +3. F5を押して、Tabular Editor 3でクエリを実行する。デバッグしたい値を探し、セルを右クリックして、**Debug** を選択します。 + +![Debug From Query](../../../images/debug-from-query.png) + +## デバッグビュー + +デバッガーには、以下のビューがあります(非表示の場合は、**デバッグ > Windows** メニューからアクセスできます)。 + +- Locals +- Watch +- Evaluation Context +- Call Tree + +### Locals + +このビューでは、現在の実行範囲内の列、メジャー、および変数が一覧表示され、それらの値が表示されます。また、現在デバッグされているサブ式の値も表示されます。このリストの値は、別のサブ式に移動するとき、または評価コンテキストが変更されるときに自動的に更新されます。**ローカル値は、常にコールツリーの現在選択されている項目で評価されます。 + +![Locals](../../../images/locals.png) + +### Watch + +このビューでは、現在の評価コンテキスト内で計算される任意のDAX式を入力できます。表式だけでなくスカラー式も入力でき、利用可能なすべてのDAX関数を使用して、現在の評価範囲内の変数を参照できます。ウォッチ値は、異なる部分式に移動したとき、または評価コンテキストが変更されたときに自動的に更新されます。**ウォッチ値は、常に評価コンテキスト・スタックで現在選択されている項目のスコープで評価されます。 + +![Watch](../../../images/watch.png) + +変数、メジャー、サブ式をウォッチビューにすばやく追加するには、コードの一部をハイライトして、ウォッチビューにドラッグするだけです。また、追加したい式の上にカーソルを置き、右クリックして、**Watch this expression**を選択することもできます。 + +![Quick Add To Watch](../../../images/quick-add-to-watch.png) + +ウォッチ式の追加、複製、削除は、ウォッチビューの右クリックコンテキストメニューを使用します。 + +![Watch Context Menu](../../../images/watch-context-menu.png) + +**Generate query** オプションは、下のスクリーンショットでハイライトされている **Value** カラム内のZoomボタンと同じものです。これをクリックすると、デバッガーは新しいDAXクエリ文書を開き、計算のコンテキストと計算自体を定義して、結果をより詳細に調べることができます。これは、以下のように、ウォッチ式がテーブル式の場合にとくに便利です。 + +![Inspect Watch](../../../images/inspect-watch.png) + +### Evaluation Context + +このビューは、現在の部分式のDAX評価コンテキストに関する情報を提供します。例たとえば、 `CALCULATE` 式はコンテキストトランジションを実行したり、評価コンテキストにフィルターを追加したり、あるいは `SUMX` イテレータは行コンテキストを追加するかもしれません。 + +![Evaluation Context](../../../images/evaluation-context.png) + +評価コンテキストスタックの項目をダブルクリックして、その項目にフォーカスを移すことができます。これにより、すべての**Watch**式が新しいコンテキストで再評価されます(つまり、スタックの一番下から、現在フォーカスされている項目までのすべてのコンテキストが再評価されます)。これは、以下のアニメーションで説明されています。また、アクティブな反復処理内の行をページングすることによって、アクティブな行のコンテキストで個々の列の値を検査することができることにも注目してください。 + +![Call Tree](../../../images/navigating-evaluation-context.gif) + +また、外側のフィルターコンテキストから個々のフィルターを切り替えることもできます(たとえば、クエリを生成した[`SUMMARIZECOLUMNS`](https://dax.guide/summarizecolumns)の呼び出しや、ピボットグリッドの指定したフィルターで列をグループ化するなど)。これは、以下のアニメーションで説明されています。このように切り替えたフィルターは、ウォッチとローカルの両方に適用されます。 + +![Call Tree](../../../images/toggle-filters.gif) + +最後に、**Row** 列のZoomボタンをクリックすると、イテレータの最初の1000行を参照し、現在の行コンテキストをその最初の1000行の中の特定の行に設定できます。 + +![Browse Row Contexts](../../../images/browse-row-contexts.png) + +### Call Tree + +このビューには計算全体のアウトラインが表示され、ダブルクリックで簡単にサブ式間を移動できます(ショートカットキーによる移動も可能です)。ツリーには、コンテキストトランジション、イテレーション、行コンテキストに関する情報も表示されます。実行されないコード(たとえば `IF` や `SWITCH` の呼び出しや、イテレータが空のとき)のブランチは、取り消し線が引かれます。 + +![Call Tree](../../../images/call-tree.png) + +コールツリーのアイテム間を移動すると、デバッグDAXスクリプトはコールツリーアイテムに対応するコードを強調表示し、同時に強調表示されたコードに到達するまでの経路を(灰色の背景で)表示します(下図参照)。 + +![Call Tree](../../../images/navigating-call-tree.gif) + +ツリーの移動に伴い、**Locals** ビューの値が更新されることに注意してください。また、式の上にカーソルを置いて右クリックし、**Step into selection** オプション (Ctrl+B) を選択すると、部分式に移動できます。 + +![Step into selection](../../../images/debugger-step-into-selection.png) + +## キーボードショートカット + +コールツリーをすばやく移動するには、次のキーボードショートカットを使用します。 + +- **Step in (F11)** - は、コールツリー内の現在のアイテムの最初の子にステップインします。それ以上の子がない場合は、次の兄弟にジャンプする。 +- **Step out (Shift-F11)** - は、コールツリー内の現在の項目の親にステップアウトします。 +- **Step over (F10)** - は、次の関数パラメーター、算術演算の次の部分式にジャンプするか、現在の関数呼び出しにステップインします(それが自明でない関数の場合)。 +- **Step back (Shift-F10)** - は、前の関数パラメーター、算術演算の前の部分式にジャンプし、現在の項目の前にパラメーターや部分式がない場合は、現在の項目の親にステップアウトします。 +- **Step into selection (Ctrl-B)** - は、カーソル下の式にジャンプします。複数のパスが同じ式につながる場合(たとえば、ある小節が複数の小節とこれらの小節から参照されている場合)、パスを選択するためのダイアログが表示されます。 +- **Next row (F9)** - は、もっとも内側のイテレータの行コンテキストを、イテレータの次の行にシフトします。 +- **Previous row (Shift-F9)** - は、もっとも内側のイテレータの行コンテキストを、イテレータの前の行にシフトします。 + +## 制限事項および既知の問題点 + +現在、DAXデバッガーには以下のような制限があります。 + +- **現在、SQL Server 2016** 上のAnalysis Servicesに対しては、[TREATAS](https://dax.guide/TREATAS/) 関数に対応していないため、デバッグはサポートされていません。 +- DAXクエリーのデバッグでは、DAXテーブル式のサブセットのみがサポートされます(たとえば、[SUMMARIZECOLUMNS](https://dax.guide/summarizecolumns) に依存するクエリーはデバッグ可能ですが、その他のテーブル関数は現在サポートされていません)。Power BIによって生成されたクエリ(Power BI Desktop Performance Analyzerを通じて取得可能)は、一般的にサポートされています。 +- 暗黙のメジャーを含むクエリーや、クエリースコープによる計算は、現在サポートされていません。 +- フィルタリングされたテーブル式から生成されたイテレータの最初の1000行をブラウズするとき、ブラウズウィンドウで選択された行が評価コンテキストスタックの現在の行コンテキストに対応するとは限りません(**Watch** ウィンドウで `CALCULATETABLE('
')` と入力して現在の行コンテキストを調査してください)。 + +上記以外のデバッガーに関する問題が発生した場合は、TE3 Community Support GitHubサイトの[課題追跡](https://github.com/TabularEditor/TabularEditor3/issues)に投稿してください。 + +# Roadmap + +DAXデバッガーは、上記の問題に対処し、より高性能なツールにするため、時間をかけて多くの機能を追加していく予定です。いつものように、フィードバックは大歓迎です。機能要望や一般的な議論については、[Discussions area](https://github.com/TabularEditor/TabularEditor3/discussion)を使用してください。 + +**Happy Debugging!** diff --git a/te3/features/ja-jp/ja-dax-editor.md b/te3/features/ja-jp/ja-dax-editor.md new file mode 100644 index 0000000..36b65b3 --- /dev/null +++ b/te3/features/ja-jp/ja-dax-editor.md @@ -0,0 +1,15 @@ +--- +uid: dax-editor +title: DAX Editor +author: Daniel Otykier +updated: 2021-09-08 +--- +# DAX Editor + + + +## Code assist features + +![Dax Code Assist](~/images/dax-code-assist.png) + +(WIP) diff --git a/te3/features/ja-jp/ja-dax-scripts.md b/te3/features/ja-jp/ja-dax-scripts.md new file mode 100644 index 0000000..f8e2d14 --- /dev/null +++ b/te3/features/ja-jp/ja-dax-scripts.md @@ -0,0 +1,14 @@ +--- +uid: dax-scripts +title: DAX Scripts +author: Daniel Otykier +updated: 2021-09-08 +applies_to: + editions: + - edition: Desktop + - edition: Business + - edition: Enterprise +--- +# DAX Scripts + +(WIP) \ No newline at end of file diff --git a/te3/features/ja-jp/ja-deployment.md b/te3/features/ja-jp/ja-deployment.md new file mode 100644 index 0000000..652bf31 --- /dev/null +++ b/te3/features/ja-jp/ja-deployment.md @@ -0,0 +1,15 @@ +--- +uid: deployment +title: Model deployment +author: Daniel Otykier +updated: 2021-09-08 +applies_to: + editions: + - edition: Desktop + none: x + - edition: Business + - edition: Enterprise +--- +# Model deployment + +(WIP) \ No newline at end of file diff --git a/te3/features/ja-jp/ja-preferences.md b/te3/features/ja-jp/ja-preferences.md new file mode 100644 index 0000000..5d71b80 --- /dev/null +++ b/te3/features/ja-jp/ja-preferences.md @@ -0,0 +1,66 @@ +# Tabular Editor 3 Preferences + +タブラーデータモデルの開発プロセスやワークフローは組織によって大きく異なります。このツールをできるだけ多くのワークフローに適合させるため、Tabular Editor 3は高度なカスタマイズが可能です。ユーザーインターフェイスの外観だけでなく、ウェブプロキシ、アップデートとフィードバック、行数制限、タイムアウト、スキーマ比較の設定など、より高度なトピックについてもカスタマイズが可能です。 + +この記事では、Tabular Editor 3のPreferencesダイアログと、それを通してコントロールできる設定について説明します。 + +環境設定ダイアログにアクセスするには、**Tools > Preferences**に進みます。 + +> [!NOTE] +> すべてのTabular Editorの設定はWindowsユーザープロファイルごとに、`%localappdata%TabularEditor3`フォルダーに保存されます。このフォルダの内容をコピーするだけで、他のマシンに設定を移行することができます。 + +## Tabular Editor > Features + +![image](https://user-images.githubusercontent.com/8976200/104600495-5ad6f300-5679-11eb-9572-af99f0895859.png) + +### Power BI + +- **Allow unsupported editing**: このオプションは、Tabular Editor 3をPower BI Desktopの外部ツールとして使用する場合にのみ関連します。チェックすると、Power BI Desktopのインスタンスに接続したとき、すべてのTOMデータ モデリング プロパティを編集できるようになります。Power BIファイルに誤ってPower BI Desktopでサポートされていない変更を加えないようにするため、一般に、このオプションはチェックしないことをオススメします(xref:desktop-limitations)。 + +### メタデータの同期 + +- **Warn when local metadata is out-of-sync with deployed model(ローカルメタデータがデプロイされたモデルと同期していない場合に警告を出す)**: チェックすると、Analysis Servicesにまだ保存されていないモデルへのローカルな変更を行った場合に、Tabular Editor内に情報バーが表示されます。たとえば、DAXクエリやピボットグリッドが期待した結果を生成しない場合、Analysis Servicesに変更を保存せずにTabular Editorでメジャー式を変更したことが原因です。保存(Ctrl+S)を押すとバーが消えます。情報バーを見るのが面倒な場合は、このチェックを外してください。 +- **Track external model changes(外部モデル変更の追跡)**: Power BI Desktopが外部ツールによるデータモデルの変更を検知できるように、Tabular Editorも検知できるようになりました。つまり、これをチェックした状態で、他のユーザーやアプリケーションが *Analysis Servicesのローカルインスタンス* でモデルに変更を加えた場合、Tabular Editorは通知を受け取ります。 + - **Refresh local Tabular Object Model metadata automatically(ローカルのTabular Object Modelのメタデータを自動的に更新する)**: 上記の通知によって、Tabular Editor内のメタデータを実際に更新したい場合は、このチェックボックスをオンにします。 + +### ベストプラクティス・アナライザー + +- **Scan for Best Practice violations in the background(ベストプラクティス違反のスキャンをバックグラウンドで実施)** チェックされていない場合、違反があるかどうかを確認するために、ベストプラクティス・アナライザー・ツールウィンドウ内から明示的にベストプラクティス分析を実行する必要があります。チェックした場合、変更が加えられるたびに、バックグラウンドスレッドで継続的にスキャンが行われます。非常に大きなモデルや、非常に複雑なベストプラクティスルールを持つモデルの場合、問題が発生します。 + +## Tabular Editor > Updated and Feedback + +![image](https://user-images.githubusercontent.com/8976200/104601469-92926a80-567a-11eb-9499-1d1c8d967c72.png) + +- **Check for updates on start-up(スタートアップ時に更新を確認)**:かなり自明です。パブリックプレビュー期間中にアップデート通知は行われず、下の「アップデートを確認する」ボタンも現時点では機能しません。 +- **Help improve Tabular Editor by collecting anonymous usage data(匿名の使用データを収集し、Tabular Editorの改善に役立てる。)**: データには、個人を特定できるような情報や、お客様のデータモデルの構造や内容に関する情報は一切含まれません。それでもテレメトリーのオプトアウトを希望される場合は、このチェックを外してください。 +- **Send error reports(エラーメッセージの送信)**: クラッシュした場合、Tabular Editorはこれをチェックすると、クラッシュレポートを送信するオプションを表示します。クラッシュレポートはデバッグの際に非常に役立ちますので、差し支えなければチェックしたままにしておいてください。 + +## Data Browsing > Pivot Grid / DAX Query + +![image](https://user-images.githubusercontent.com/8976200/104601874-0df41c00-567b-11eb-8ba1-41a992e5664f.png) + +この設定により、モデルの変更がAnalysis Servicesに保存されたとき、新しいピボットグリッドまたはDAXクエリウィンドウがデフォルトで自動的に更新されるかどうかを指定できます。以下のスクリーンショットにあるように、「Auto-execute」ボタンを切り替えることで、ウィンドウごとにこの動作を変更できます。 + +![image](https://user-images.githubusercontent.com/8976200/104602109-56abd500-567b-11eb-9e8f-32ab58390449.png) + +この機能は、たとえば、メジャーのデバッグを行う際に非常に便利です。あるウィンドウでメジャー式を更新し、別のウィンドウでそのメジャーを使用するピボット・グリッドまたはDAXクエリを開いておきます。CTRL+Sを押すたびに、ピボット・グリッドまたはDAXクエリが自動的に更新され、行った変更の影響が即座に表示されます。 + +## DAX Editor > General + +![image](https://user-images.githubusercontent.com/8976200/104602381-a7233280-567b-11eb-8151-cf810b7cb748.png) + +さて、いよいよ本題に入ります。このページでは、DAXエディターの一般的な構成に関する設定を数多く提供しています。コードの折りたたみ」機能をぜひ試してみてください。 + +- **DAX function documentation(DAX関数ドキュメント)**: この設定は、DAX関数にカーソルがあるときにF12キーを押したときに、デフォルトのWebブラウザで起動するURLを指定するために使用します。私は https://dax.guide を使うことをオススメしますが、Microsoftの公式ドキュメント(ドロップダウンで利用可能)を好む人もいるようです。 + +## DAX Editor > Auto Formatting + +![image](https://user-images.githubusercontent.com/8976200/104602767-084b0600-567c-11eb-88ea-018e3d436f68.png) + +上のスクリーンショットからわかるように、新しいDAXエディターは非常に強力で、入力中に美しく読みやすいDAXコードを作成するのに役立ちます。また、何か期待通りに動作しない場合や、さらなる改善のためのアイデアがある場合は、[フィードバック](https://github.com/TabularEditor3/PublicPreview/issues/new)を提供することを忘れないでください。 + +## DAX Editor > Code Assist + +![image](https://user-images.githubusercontent.com/8976200/104603313-90311000-567c-11eb-853d-6ca6e0f0ed07.png) + +このページでは、コードアシストのもっとも重要な2つの機能であるコールチップ(別名「パラメーター情報」)とオートコンプリートを設定できます。設定は主に、コールチップとオートコンプリートのボックスがどのような状況で画面に表示されるかを制御します。ただし、オートコンプリートについてはどの項目を提案するか、テーブル名を常に引用するか、インクリメンタルサーチなどを制御するための機能があります。 diff --git a/te3/features/ja-jp/ja-roslyn.md b/te3/features/ja-jp/ja-roslyn.md new file mode 100644 index 0000000..bb73dc2 --- /dev/null +++ b/te3/features/ja-jp/ja-roslyn.md @@ -0,0 +1,31 @@ +# Compiling with Roslyn + +Visual Studio 2017で導入された新しいRoslynコンパイラーを使用してスクリプトをコンパイルしたい場合は、**Tools > Preferences > Tabular Editor > C# SCripts and Maros**で設定できます。これにより、文字列補間などの新しいC#言語の機能を利用できます。コンパイラの実行ファイル(`csc.exe`)を格納するディレクトリのパスを指定し、コンパイラのオプションとして言語バージョンを指定するだけで、簡単に設定できます。 + +![Custom Compiler Te3](../../../images/custom-compiler-te3.png) + +## Visual Studio 2017 + +一般的なVisual Studio 2017 Enterpriseのインストールでは、Roslynコンパイラはここに配置されています。 + +``` +c:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Roslyn +``` + +これには、C# 6.0の言語機能がデフォルトで含まれています。 + +![image](https://user-images.githubusercontent.com/8976200/92464584-a52cfc80-f1cd-11ea-9b66-3b47ac36f6c6.png) + +## Visual Studio 2019 + +一般的なVisual Studio 2019 Communityインストールの場合、Roslynコンパイラはここにあります。 + +``` +c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn +``` + +VS2019に同梱されているコンパイラは、C#8.0の言語機能をサポートしており、コンパイラオプションとして以下を指定することで有効にできます。 + +``` +-langversion:8.0 +``` diff --git a/te3/features/ja-jp/ja-security-privacy.md b/te3/features/ja-jp/ja-security-privacy.md new file mode 100644 index 0000000..361ca29 --- /dev/null +++ b/te3/features/ja-jp/ja-security-privacy.md @@ -0,0 +1,52 @@ +# Tabular Editor 3 セキュリティとプライバシー + +このドキュメントはTabular Editor 3のセキュリティとプライバシーに関する考察とその使用について説明しています。以下では、「Tabular Editor」という表現は、商用ツールのTabular Editor 3とオープンソースツールのTabular Editor 2.Xの両方を意味します。何か一方のツールだけを考えるときは、それらの明示的な名前「Tabular Editor 3」または「Tabular Editor 2.X」を使用することにします。 + +## メタデータとデータプライバシー + +すべてのデータとメタデータはTabular Editorがインストールされているクライアントマシンに存在し、すべてのユーザー操作はローカルで実行されます。Tabular Editorの実行と使用にはインターネット接続は必要ありません。 + +とはいえ、さまざまな目的のためにTabular Editorがリモートサービスに接続するシナリオがあります。これらについては、以下で説明します。 + +### アナリシスサービスXMLAプロトコル + +Analysis ServicesインスタンスまたはPower BI Premiumワークスペースとのすべての通信は、[Microsoft Analysis Management Objects (AMO)](https://docs.microsoft.com/en-us/analysis-services/amo/developing-with-analysis-management-objects-amo?view=asallproducts-allversions) クライアントライブラリ、より具体的には、[Tabular Object Model (TOM) extension for AMO](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) の使用によって行われます。これらのクライアントライブラリーはTabular Editorなどのサードパーティーアプリケーションで再配布できるようにMicrosoftから提供されています。ライセンスの詳細については、[AMO EULA](https://go.microsoft.com/fwlink/?linkid=852989)を参照してください。 + +Tabular EditorがAnalysis Servicesのインスタンス(ローカルネットワークまたはクラウド)またはPower BI Premiumワークスペース(クラウド)に接続するとき、この接続は上記のクライアントライブラリを通じて実行されます。設計上、AMOライブラリはユーザーの認証と認可を処理します。Analysis ServicesインスタンスまたはPower BI Premiumワークスペースの管理者権限を持つユーザーのみ、接続が許可されます。これは、SQL Server Management StudioやSQL Server Data ToolsなどのMicrosoftツールを使用する場合と変わりません(接続に同じクライアント ライブラリを使用します)。 + +### Tabular Object Model メタデータ + +AMO/TOMクライアントライブラリーが接続を確立すると、Tabular Editorはユーザーが接続したい特定のAnalysis ServicesデータベースまたはPower BIデータセットのTabular Object Model(TOM)メタデータを完全に要求するようになります。AMO/TOMクライアントライブラリはこのメタデータをプログラム方式でクライアントアプリケーション(Tabular Editor)に提供し、アプリケーションはオブジェクトの名前の変更、説明の追加、DAX式の修正などのメタデータの変更を適用できるようにします。さらに、AMO/TOMクライアントライブラリは、TOMメタデータをJSONベースのフォーマットにシリアライズするメソッドを提供する。Tabular Editorはこの技術を利用して、データモデル構造のバージョン管理のために、ユーザーがモデルのメタデータをローカルのJSONファイルとして保存できるようにしています。 **Note: このようにして作成された JSON ファイルには、実際のデータ・レコードは含まれません。このファイルには、モデルのメタデータ、つまり、テーブル、列、メジャー、DAX式などモデルの構造に関する情報のみが含まれます。** モデルのメタデータは一般的に機密情報とはみなされませんが、この方法で作成されたファイルを必要な機密性で扱うことはTabular Editorのユーザーの責任です(ファイルを第三者と共有しないなど)。 + +**Tabular Editorは、ユーザーがとくにそのためのアクションを起こさない限り、AMO/TOMクライアントライブラリーを通じて取得したモデルのメタデータを収集、公開、共有、転送、その他の方法で公開することはありません。**(たとえば、モデルメタデータのJSONファイルをネットワークの共有ロケーションに保存したり、モデルメタデータをAnalysis ServicesやPower BIワークスペースの別のインスタンスにデプロイすることで) + +### モデルデータの内容 + +以下では、「モデルデータ」とは、Analysis ServicesデータベースまたはPower BIデータセット内に格納された実際のデータレコードを指します。ソースデータベースやデータセットによっては、モデルデータは機密である可能性が非常に高い。 + +ユーザーは接続先のAnalysis ServicesまたはPower BIワークスペースのインスタンスの管理者権限を持っている必要があるため、定義上、ユーザーはAnalysis ServicesデータベースまたはPower BIデータセットのすべてのデータコンテンツにもアクセスできるようになります。Tabular Editorでは、上記のAMOクライアントライブラリを通じてのみデータの取得が可能です。Tabular Editor 3はモデルデータのブラウズとクエリのための機能を提供します。データへのアクセスにどのような技術が使われたとしても、**Tabular Editorは取得したデータをローカルメモリにのみ保存します。Tabular Editorはこのツールで取得したモデルデータを収集、公開、共有、転送、またはその他の方法で公開することはありません**。ユーザーがTabular Editorを通して取得したクエリー結果をコピーまたはエクスポートする場合、コピーまたはエクスポートされたデータをデータの機密性にしたがって取り扱うことはユーザーの責任となります。これは、ExcelやPower BIなどのクライアントツールを使用してAnalysis ServicesデータベースやPower BIデータセットに接続するユーザーが、クエリー結果をコピーするオプションを持っている場合と変わりません。 + +### Web リクエスト + +Tabular Editorは以下の場合に限り、オンラインリソース(Web URL)へのリクエストを実行できます。 + +- **ライセンス認証** Tabular Editor 3の初回起動時、およびその後定期的に、ツールは弊社のライセンスサービスに対してリクエストを実行することがあります。このリクエストにはユーザーが入力したライセンスキー、ユーザーの電子メールアドレス(提供されている場合)、ローカルマシン名、現在のインストールを識別する一方向エンコードハッシュに関する暗号化された情報が含まれます。このリクエストでは、他のデータは送信されません。このリクエストの目的は、インストールで使用されているライセンスキーの有効化と検証、試用制限の実施、およびユーザーが当社のライセンスサービスを通じてTabular Editor 3のインストールを管理できるようにすることです。 +- **アップグレードチェック** Tabular Editor 3を起動するたびに、新しいバージョンのTabular Editor 3が利用可能かどうかを判断するために、当社のアプリケーションサービスにリクエストを行う場合があります。このリクエストにはデータは含まれません。 +- **使用状況テレメトリー** デフォルトでは、Tabular Editor 3はユーザーがツールを操作する際に匿名の使用データを収集し、送信します。このデータには、ユーザーがどのUIオブジェクトを操作したか、またそのタイミングについての情報が含まれます。また、このツールで編集されているTabularデータモデルに関する高レベルの情報も含まれます。この情報は、互換性レベルやモード、テーブル数、サーバーの種類(Analysis Services vs. Power BI vs. Power BI Desktop)などのハイレベルなプロパティにのみ関連します。 **この方法では、個人を特定できるデータは収集されません**, また、Tabular Object Model自体のオブジェクト名やDAX式に関する情報も収集しません。ユーザーはいつでもテレメトリーデータの送信をオプトアウトできます。 +- **エラー報告** 予期せぬエラーが発生した場合、スタックトレースと(匿名化された)エラーメッセージ、およびユーザーから提供された任意の説明を送信します。ユーザーが遠隔測定データの送信をオプトアウトした場合、エラーレポートも送信されません。 +- **DAXフォーマッタの使用**(Tabular Editor 2.xのみ))DAX式はTabular Editorのボタンをクリックするとフォーマットされる場合があります。この場合、DAX式は(それ以外は)www.daxformatter.comウェブサービスに送信されます。ユーザーがこのボタンをはじめてクリックすると、明示的な警告メッセージが表示され、意思を確認するよう求められます。Tabular Editor 3はDAXコードをフォーマットする際にウェブリクエストを実行しません。 +- **ベストプラクティスルールをインポートする。** Tabular Editorには、ユーザーがベストプラクティスルールのリストをJSONベースのフォーマットで取得するためのURLを指定できる機能があります。このタイプのリクエストはURLからJSONデータをダウンロードするだけで、URLへのデータ転送は行われません。 +- **C#スクリプトを使用する。** Tabular Editorでは、自動化のためにC#で書かれたコードを書き、実行できます。このようなスクリプトは、C#言語機能および.NETランタイムを使用して、オンラインリソースに接続する可能性があります。実行されたコードが意図しないデータの共有を引き起こさないようにすることは、常にユーザーの責任です。Tabular Editor ApSは一般的にC#スクリプト機能の使用による損害、損失、漏えいに対して責任を負いません。Tabular Editorはユーザーの明示的なアクションなしにC#スクリプトを実行することはありません。 + +**ライセンス認証サービス、使用状況テレメトリ、エラーレポートを通じて当社が取得した情報は、すべて機密情報として扱われます。当社は、収集したデータをいかなる形でも共有、公表、配布することはありません。** + +> [!NOTE] +> システム管理者は、特定の[ポリシー](https://docs.tabulareditor.com/common/policies.html)を強制することができます。このポリシーは、上記のリストに示された機能の一部または全部を無効にするために使用することができます。 + +## アプリケーションセキュリティ + +Tabular EditorはインストールされるWindowsマシン上で昇格した特権を必要とせず、マシン上の制限されたリソースにもアクセスしません。このルールの例外は、タブラーエディターのインストーラーファイル(.msi)を使う場合です。この場合、ツールに必要な実行ファイルとサポートファイルはデフォルトで `Program Files` フォルダーにコピーされ、通常、昇格権限が必要となります。Tabular EditorのバイナリファイルとインストーラーファイルはKapacity A/S発行のコードサイニング証明書で署名されており、コードが第三者によって改ざんされていないことを保証します。 + +アプリケーションの実行中、外部リソースへのアクセスはすべてAMO/TOMクライアントライブラリまたは前述のウェブリクエストを通じて行われます。 + +C#スクリプト機能により、Tabular Editorは.NETランタイム内で任意のC#コードを実行できます。このようなコードは、ユーザーの明示的な要求があった場合にのみコンパイルされ、実行されます。C#スクリプトは「マクロ」として保存することもでき、これによりユーザーは複数の異なるスクリプトを簡単に管理、実行できます。コードは、ユーザー自身の`%localappdata%`フォルダーに保存され、ユーザーまたはローカルマシンの管理者のみがスクリプトにアクセスできます。実行されたコードが意図しない副作用を引き起こさないようにすることは、常にユーザーの責任です。いかなる場合においてもTabular Editor ApSはC#スクリプトやカスタムアクション/マクロ機能の使用による損害、損失、漏えいに責任を負いません。 diff --git a/te3/features/ja-jp/ja-shortcuts.md b/te3/features/ja-jp/ja-shortcuts.md new file mode 100644 index 0000000..8474112 --- /dev/null +++ b/te3/features/ja-jp/ja-shortcuts.md @@ -0,0 +1,127 @@ +# Keyboard shortcuts + +The following shortcuts are available as of Tabular Editor v. 3.2.2. + +## General + +|Command|Shortcut| +|---|---| +|New model|Ctrl+N| +|Open file|Ctrl+O| +|Load model from a database|Ctrl+Shift+O| +|Save current item|Ctrl+S| +|Save all|Ctrl+Shift+S| +|Exit|Alt+F4| +|Deployment wizard|Ctrl+Shift+D| + +## Edit + +|Command|Shortcut| +|---|---| +|Select All|Ctrl+A| +|Copy|Ctrl+C| +|Cut|Ctrl+X| +|Paste|Ctrl+V| +|Undo|Ctrl+Z| +|Redo|Ctrl+Y| +|Find|Ctrl+F| +|Replace|Ctrl+H| + +## Data modelling + +|Command|Shortcut| +|---|---| +|Properties|F4| +|Edit object name / batch rename|F2| +|Batch rename children|Shift+F2| +|View dependencies|Shift+F12| +|Make invisible|Ctrl+I| +|Make visible|Ctrl+U| +|Create measure|Alt+1| +|Create calculated column|Alt+2| +|Create hierarchy|Alt+3| +|Create data column|Alt+4| +|Create table|Alt+5| +|Create calculated table|Alt+6| +|Create calculation group|Alt+7| +|Accept expression change|F5| + +## TOM Explorer + +|Command|Shortcut| +|---|---| +|Navigate up or down|Up / Down arrow| +|Expand / collapse current node|Right / Left arrow| +|Expand / collapse current node and all subnodes|Ctrl+Right / Left arrow| +|Expand / collapse entire tree|Ctrl+Shift+Right / Left arrow| +|Toggle measures|Ctrl+1| +|Toggle columns|Ctrl+2| +|Toggle hierarchies|Ctrl+3| +|Toggle partitions|Ctrl+4| +|Toggle display folders|Ctrl+5| +|Toggle hidden objects|Ctrl+6| +|Toggle info columns|Ctrl+7| +|Navigate back|Alt+Left arrow| +|Navigate forward|Alt+Right arrow| + +## Text/code editing (general) + +|Command|Shortcut| +|---|---| +|Cut line|Ctrl+L| +|Delete line|Ctrl+Shift+L| +|Copy line|Ctrl+Shift+T| +|Transpose lines|Ctrl+T| +|Duplicate line|Ctrl+D| +|Lowercase line|Ctrl+U| +|Uppercase line|Ctrl+Shift+U| +|Move lines up|Alt+Up arrow| +|Move lines down|Alt+Down arrow| + +## DAX code + +|Command|Shortcut| +|---|---| +|Go to definition|F12| +|Peek definition|Alt+F12] +|Refactor|Ctrl+R| +|Show auto-complete|Ctrl+Space| +|Show calltip|Ctrl+Shift+Space| +|Format DAX|F6| +|Format DAX (Short lines)|Ctrl+F6| +|Comment lines|Ctrl+Shift+K| +|Uncomment lines|Ctrl+Shift+U| +|Toggle comments|Ctrl+/| + +## DAX Query + +|Command|Shortcut| +|---|---| +|Execute query|F5| +|Execute selection|Shift+F5| + +## DAX Script + +|Command|Shortcut| +|---|---| +|Apply script|F5| +|Apply selection|F8| +|Apply script and save model|Shift+F5| +|Apply selection and save model|Shift+F8| + +## DAX Debugger + +|Command|Shortcut| +|---|---| +|Step over|F10| +|Step back|Shift+F10| +|Step in|F11| +|Step out|Shift+F11| +|Next row (innermost row context)|F9| +|Previous row (innermost row context)|Shift+F9| + +## C# Script + +|Command|Shortcut| +|---|---| +|Run script|F5| diff --git a/te3/features/ja-jp/ja-supported-files.md b/te3/features/ja-jp/ja-supported-files.md new file mode 100644 index 0000000..00c834b --- /dev/null +++ b/te3/features/ja-jp/ja-supported-files.md @@ -0,0 +1,11 @@ +# 対応するファイル形式 + +Tabular Editor 3は、さまざまなファイル形式やドキュメントタイプを使用しますが、その中にはAnalysis ServicesやPower BIでは使用されないものもあります。この記事では、これらのファイルタイプの概要とそれぞれの説明を提供します。 + +## サポートファイル + +サポートファイルとは、Analysis ServicesやPower BIでは使用されないファイルです。これらのファイルはすべて、Tabular Editor 3やその他のツールでのさまざまな種類の開発ワークフローをサポートするものです。 + +## Diagram file (.te3diag) + +(WIP) diff --git a/te3/features/ja-jp/ja-user-interface.md b/te3/features/ja-jp/ja-user-interface.md new file mode 100644 index 0000000..deb40e6 --- /dev/null +++ b/te3/features/ja-jp/ja-user-interface.md @@ -0,0 +1,212 @@ +# Tabular Editor 3 のユーザーインターフェイスを知る + +この記事では、Tabular Editor 3のユーザーインターフェイスについて説明します。 + +## ユーザーインターフェイスの基本要素 + +Tabular Editor 3をはじめて起動し、データモデルをロードすると、以下のスクリーンショットのようなインターフェイスが表示されます。 + +![Basic user interface](../../../images/basic-ui.png) + +1. **Title bar**: 現在読み込まれているファイル名、Analysis ServicesデータベースまたはPower BIデータセットが接続されている場合は、その名前が表示されます。 +2. **Menu bar**: メニューバーからTabular Editor 3のさまざまな機能にアクセスできます。すべてのメニュー項目の詳細な説明は[メニュー](#menus)を参照してください。 +3. **Toolbars**: ツールバーからは、よく使う機能に素早くアクセスできます。ツールバーからアクセスできるすべての機能は、メニューからもアクセスできます。ツールバーとそのボタンは、以下の項目でカスタマイズできます。**Tools > Customize...** +4. **TOM Explorer view**: データモデルを表す[Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) メタデータの階層的な表示です。上部のトグルボタンで、表示するオブジェクトをフィルタリングできます。検索ボックスでは、名前でオブジェクトをフィルタリングできます。 +5. **Expression Editor**: エクスプレッションエディターは、TOM Explorerで現在選択されているオブジェクトのDAX、SQL、M式を素早く編集する方法を提供します。エクスプレッションエディターを閉じても、TOM Explorerのオブジェクトをダブルクリックすることで再び表示させることができます。現在選択されているオブジェクトが複数のプロパティを持つ場合、上部のドロップダウンで異なる式プロパティを切り替えることができます(たとえば、KPIにはTarget式、Status式、Trend式があり、これらは同じKPIオブジェクトに属する3つの異なるDAX式です)。 +6. **Properties view**: TOM Explorerで現在選択されているオブジェクト(複数可)で利用可能なすべてのTOMプロパティの詳細表示です。複数のオブジェクトが選択されている場合でも、ほとんどのプロパティはグリッドを通して編集することができる。いくつかのプロパティ("Format String", "Connection String", "Role Members" など)は、プロパティ値セル内の省略記号ボタンをクリックすると、ポップアップダイアログやコレクションエディターを表示させることができるようになっています。 +7. **Messages view**: Tabular Editor 3は、モデル上のDAX式にセマンティックエラーがないか継続的に分析します。そのようなエラーはすべてここに出力されます。さらに、このビューに表示されるメッセージは、C#スクリプトまたはAnalysis Servicesで報告されたエラーメッセージから発生する可能性があります。 +8. **Status bar**: ステータスバーには、現在の選択項目やベストプラクティス・アナライザーの所見など、さまざまな文脈情報が表示されます。 + +さまざまな用途に対応する、追加のビューが多数用意されています。詳しくは、VIEWメニューのセクションを参照してください。 + +## ユーザーインターフェイスのカスタマイズ + +すべてのUI要素は、必要に応じてサイズや配置を変更できます。メインビューから個々のビューをドラッグして、Tabular Editor 3のインスタンスを複数のモニターに分割することも可能です。Tabular Editor 3はアプリケーションを閉じたときにカスタマイズを保存し、次回起動時に自動的に再読み込みします。 + +### 別のレイアウトを選択する + +アプリケーションをデフォルトのレイアウトにリセットするには、**ウィンドウ > デフォルトレイアウト** オプションを選択します。Tabular Editor 2.xのユーザーは、TOM Explorerを画面の左側に配置し、PropertiesビューをExpression Editorの下に配置する**Window > Classic layout**オプションを選択することをオススメします。 + +「ウィンドウ > 現在のレイアウトをキャプチャ...」オプションを使用すると、カスタマイズしたレイアウトを保存して、ウィンドウメニュー内の新しいレイアウトオプションとして利用できるようになり、異なるレイアウト間ですばやく切り替えられるようになります。Window > Manage layouts...**" オプションを使用すると、利用可能なすべてのレイアウトのリストが表示され、レイアウトの名称変更、保存、削除などを行うことができます。レイアウトをディスクに保存する場合、.xmlファイルが作成され、Tabular Editor 3の他のユーザーと共有できます。 + +![Manage Layouts](../../../images/manage-layouts.png) + +### テーマとパレットの変更 + +Tabular Editor 3の外観は、異なるテーマやパレットを選択することにより変更できます。Tabular Editor 3には5種類のテーマ(「スキン」とも呼ばれる)が同梱されており、**Window > Themes** メニューから利用できます。 + +- ベーシックとベジェ(ベクターベース、高DPIディスプレイで効果的) +- ブルー、ダーク、ライト(ラスターベース、高ディップディスプレイには非推奨) + +ベクターベースのテーマ(BasicとBezier)については、**Window > Palette** メニューでテーマに使用する色を変更します。 + +![Palettes](../../../images/palettes.png) + +## メニュー + +以下では、Tabular Editor 3のメニューについて詳しく説明します(WIP)。 + +以下では、カーソルがExpression Editorや以下のスクリーンショットの「DAX Script 1」タブなどのドキュメント内に置かれていることを意味する**アクティブドキュメント**という用語を使用します。アクティブなドキュメントの有無や種類によって、キーボードショートカットやメニュー項目の動作が異なります。 + +![Active Document](../../../images/active-document.png) + +## ファイル + +**ファイル**メニューには、主にモデルのメタデータやサポートファイル、ドキュメントの読み込みや保存を行うためのメニュー項目が含まれています。 + +![File Menu](../../../images/file-menu.png) + +- **New**: サブメニューを開き、空のデータモデルを新規作成したり(Ctrl+N)、新しいDAXクエリーやDAXスクリプト(テキストファイル)、データモデル図(JSONファイル)など、さまざまな [サポートファイル](supported-files.md#supporting-files)を作成できます。サポートファイル(C#スクリプトを除く)は、モデルがすでにTabular Editorにロードされている場合にのみ作成できます。 + +![File Menu New](../../../images/file-menu-new.png) + +> [!IMPORTANT] +> Tabular Editor 3 Desktop Editionは、Poewr BI DesktopのExternal Toolとしてのみ使用できるため、**New > Model...**オプションは使用できません。[詳細](xref:editions)を参照してください。 + +- **Open**: さまざまなソースからデータモデルを読み込むためのオプションと、その他のタイプのファイルを読み込むためのオプションを含むサブメニューを開きます。サブメニューの項目は次のとおりです。 + +![File Menu Open](../../../images/file-menu-open.png) + +- **Model from file...** .bimや.pbitファイルなどのファイルからモデルのメタデータを開くことができます。 +- **Model from DB...** デプロイ済みの表形式モデルからモデルメタデータをロードするために、Analysis ServicesまたはPower BI XMLA接続の詳細を指定するか、Analysis Servicesのローカルインスタンス(Visual StudioのIntegrated WorkspaceサーバーまたはPower BI Desktopなど)に接続します。 +- **Model from folder...** Tabular Editorのいずれかのバージョンを使って保存したフォルダー構造からモデルのメタデータを開く - **File...** は、ファイル名の拡張子に基づいてTabular Editor 3がサポートするあらゆるタイプのファイルを開くことができるダイアログを表示します。詳しくは、[サポートされているファイルの種類](TabularEditorDocs\te3\features\ja-jp\ja-supported-files.md)を参照してください。 + +![Supported File Types](../../../images/supported-file-types.png) + +> [!IMPORTANT] +> Tabular Editor 3 Desktop Edition では、**Open > Model from file...** と **Open > Model from folder...** オプションは使用できず、**Open > File...** ダイアログでは [supporting files] (supported-files.md#supporting-files) のみ開き、メタデータを含むファイルでは開くことができません。 + +- **Revert**: このオプションでは、モデルのメタデータをソースから再ロードし、Tabular Editorで行われた変更のうち、まだ保存されていないものを破棄できます。このオプションは、Tabular Editor 3がPower BI DesktopのExternal Toolとして使用されており、Tabular Editor 3が接続されている間にPower BI Desktopで変更が行われた場合に便利です。逆戻り**を選択すると、Tabular Editor 3は再接続することなくPower BI Desktopからモデルのメタデータを再読み込みできます。 +- **Close**: これにより、アクティブなドキュメント(DAXクエリ、C#スクリプト、データモデル図など)が閉じられます。ドキュメントに未保存の変更がある場合、Tabular Editorは閉じる前に変更を保存するよう促します。 +- **Close model**: これは、現在ロードされているモデルのメタデータをTabular Editorからアンロードします。メタデータに変更を加えた場合、Tabular Editorは閉じる前に変更を保存するよう促します。 +- **Save**: これは、アクティブなドキュメントをソースファイルに戻して保存します。ドキュメントがアクティブでない場合、モデル メタデータをソースに保存します。ソースは、Model.bimファイル、Database.json(フォルダー構造)、接続されているAnalysis Servicesのインスタンス(Power BI Desktopを含む)またはPower BI XMLAエンドポイントである可能性があります。 +- **Save as...** アクティブなドキュメントを新規ファイルとして保存できます。アクティブなドキュメントがない場合、.bim(JSONベース)ファイルを使用してモデルのメタデータを新規ファイルとして保存できます。 +- **Save to folder...** これにより、モデルのメタデータを[フォルダ構造](xref:save-to-folder)として保存できます。 +- **Save all**: 未保存のドキュメントとモデルのメタデータを一括で保存します。 +- **Recent files**: 最近使用したサポートファイルの一覧が表示され、すぐに再オープンできます。 +- **Recent tabular models**: 最近使用したモデルメタデータのファイルまたはフォルダのリストを表示し、これらの中からモデルメタデータを素早く再読み込みすることができます。 + +> [!IMPORTANT] +> Tabular Editor 3 Desktop Editionでは、**Save to folder** と **Recent tabular models** オプションは無効になっています。また、**名前を付けて保存** オプションは、[サポートファイル](supported-files.md#supporting-files)に対してのみ有効です。 + +- **Exit**: Tabular Editor 3アプリケーションをシャットダウンします。アプリケーションをシャットダウンする前に、未保存のファイルやモデルのメタデータを保存するよう促されます。 + +## Edit + +**Edit** メニューには、ドキュメントの編集や、現在読み込まれているモデルのメタデータを変更するためのWindows標準のアプリケーションメニュー項目が含まれています。 + +![Edit Menu](../../../images/edit-menu.png) + +- **Undo**: このオプションは、モデルのメタデータに加えられた最後の変更を取り消します。アクティブなドキュメントがない場合、おなじみのCTRL+Zショートカットがこのオプションに対応します。 +- **Redo**: このオプションは、モデルメタデータに対する最後のアンドゥを取り消します。アクティブなドキュメントがない場合、おなじみのCTRL+Yショートカットがこのオプションに対応します。 +- **Undo typing**: 現在アクティブな文書で最後に行ったテキストの変更を取り消します。アクティブな文書がない場合、このオプションは使用できません。 +- **Redo typing**: 現在アクティブなドキュメント内で最後に取り消した操作を元に戻す。アクティブな文書がない場合、このオプションは使用できません。 +- **Find**: 検索と置換」ダイアログを「検索」タブが選択された状態で表示します。[詳細情報](xref:find-replace#find)を表示します。 +- **Replace**: 検索と置換」ダイアログを「置換」タブが選択された状態で表示します。[詳細情報](xref:find-replace#replace)を表示します。 +- **Cut / Copy / Paste**: これらは、Windowsでおなじみの編集操作です。アクティブなドキュメントがある場合、これらはそのドキュメント内のテキスト選択に適用されます。それ以外の場合、これらのオプションはTOM Explorerのオブジェクトを操作するために使用されることがあります。たとえば、SHIFTキーまたはCTRLキーを押しながらTOM Explorerで小節を選択し、CTRL+CとCTRL+Vを同時に押すと、複数のメジャーを複製できます。 +- **Delete**: アクティブな文書で選択されているテキストを削除し、アクティブな文書がない場合は、TOM Explorer で現在選択されているオブジェクトを削除します。 + +> [!NOTE] +> Tabular Editorは通常、複数のオブジェクトが選択されている場合、または削除されるオブジェクトに依存関係がある場合にのみ、オブジェクト削除のプロンプトを表示します。オブジェクトの削除は、**Undo** オプション (CTRL+Z) を使用することで取り消すことができます。 + +- **Select all**: 現在アクティブなドキュメント内のすべてのテキスト、またはTOM Exporer内の同じ親に属するすべてのオブジェクトを選択します。 +- **Code assist**: このオプションは、DAXコードの編集時に利用可能です。DAXコードの編集に関連するさまざまなコードアシスト機能へのショートカットを提供します。詳細については、[DAXエディタ](dax-editor.md#code-assist-features)を参照してください。 + +## View + +ビュー**メニューは、Tabular Editor 3 UIの異なるビュー間を移動できます。ビューが非表示になっている場合、このメニューでビューのタイトルをクリックすると、ビューの非表示が解除され、フォーカスされるようになります。ビューメニューにはドキュメントが表示されないことに注意してください。ドキュメント間を移動するには、[ウィンドウメニュー](#window)を使用します。 + +![View Menu](../../../images/view-menu.png) + +- **TOM Explorer**: TOM Explorer は、現在ロードされているモデルのメタデータの [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 全体の階層的なビューを提示します。詳しくは @tom-explorer-viewを参照してください。 +- **Best Practice Analyzer**: Best Practice Analyzerは、ベストプラクティス検証のルールを指定することで、モデルの品質を向上させることができます。詳しくは @bpa-view をご覧ください。 +- **Messages**: メッセージビューは、Tabular Editor 3 Semantic Analyzer などの様々なソースからのエラー、警告、情報メッセージを表示します。詳細は @messages-view を参照してください。 +- **Data Refresh**: データリフレッシュ]ビューを使用すると、バックグラウンドで実行されているデータリフレッシュ処理を追跡できます。詳しくは、@data-refresh-viewを参照してください。 +- **Macros**: Macrosビューでは、作成したマクロを管理できます。マクロは、@csharp-scriptsから作成できます。詳しくは、@creating-macrosを参照してください。 +- **VertiPaq Analyzer**: VertiPaq Analyzerビューでは、モデル内のデータに関する詳細な統計情報を収集、インポート、およびエクスポートして、DAXパフォーマンスの向上とデバッグに役立てることができます。VertiPaq AnalyzerはMITライセンスの下、[SQLBI](https://sqlbi.com) の [Marco Russo](https://twitter.com/marcorus) によって作成および保守されています。詳細については、[GitHub プロジェクトページ](https://github.com/sql-bi/VertiPaq-Analyzer) を参照してください。 +- **Expression Editor**: TOM Explorerで現在選択されているオブジェクトのDAX、M、SQL式を編集するための「クイックエディター」です。詳細は @dax-editorを参照してください。 + +## Model + +**モデル**メニューには、モデルオブジェクト(TOM Explorerのルートオブジェクト)のレベルで実行可能なアクションが表示されます。 + +![View Menu](../../../images/model-menu.png) + +- **Deploy...**: Tabular Editor Deploymentウィザードを起動します。詳しくは、@deploymentを参照してください。 + +> [!IMPORTANT] +> Tabular Editor 3 Desktop Editionでは、**Deploy**オプションは使用できません。詳しくは@editionsをご覧ください。 + +- **Import tables...** Tabular Editor 3インポートテーブルウィザードを起動します。詳しくは、@importing-tablesを参照してください。 +- **Update table schema...** 現在選択されているテーブルまたはパーティションについて、現在インポートされているカラムと比較して、データソースにおけるスキーマの変更を検出する。詳細は @importing-tables#updating-table-schemaを参照してください。 +- **Script DAX**: 現在選択されているオブジェクト(または、何も選択されていない場合は、モデル内のすべてのDAXオブジェクト)のDAXスクリプトを生成します。詳細については、@dax-scriptsを参照してください。 +- **Refresh model**: Tabular EditorがAnalysis Servicesのインスタンスに接続されている場合、このサブメニューにはモデルレベルでバックグラウンド更新操作を開始するためのオプションが含まれています。このサブメニューには以下のオプションがあります。詳細は、[Refresh command (TMSL)](https://docs.microsoft.com/en-us/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request)を参照してください。 + - **Automatic (model)**: Analysis Servicesは、リフレッシュするオブジェクトを決定します(「準備完了」状態でないオブジェクトのみ)。 + - **Full refresh (model)**: Analysis Servicesは、モデルのフルリフレッシュを実行します。 + - **Calculate (model)**: Analysis Servicesは、すべての計算テーブル、計算カラム、計算グループ、およびリレーションシップの再計算を実行します。データソースからのデータの読み込みは行われません。 +- **Create [object type]**: モデル**」メニューの残りのショートカットでは、新しいタイプのモデル子オブジェクト(テーブル、データソース、パースペクティブなど)を作成できます。 + +## Tools + +**ツール**メニューには、Tabular Editor 3のプリファレンスやカスタマイズを制御するためのオプションが含まれています。 + +![View Menu](../../../images/tools-menu.png) + +- **Customize...** Tabular Editor3のユーザーインターフェイスレイアウトのカスタマイズダイアログを起動し、ツールバーの新規作成、メニューやツールバーボタンの再配置や編集などを行うことができます。 +- **Preferences...** Tabular Editor 3 Preferencesダイアログを起動します。これはTabular Editorとその機能(アップデートチェック、プロキシ設定、クエリー行数制限、リクエストタイムアウトなど)の他のすべての側面を管理するための中心的なハブです。詳細は @preferencesを参照してください。 + +## Window + +**ウィンドウ**メニューには、アプリケーションのさまざまなビューやドキュメント(総称して*ウィンドウ*)を管理および移動するためのショートカットが用意されています。また、テーマとカラーパレットを制御するための[メニュー項目もあります](#changing-themes-and-palettes)。 + +![View Menu](../../../images/window-menu.png) + +- **New...** このサブメニューは、新しい [サポートファイル](supported-files.md#supporting-files) を作成するためのショートカットを提供するものです。ここでのオプションは、**ファイル > 新規作成**と同じです。 +- **Float** 現在のビューまたはドキュメントをフローティングウィンドウにする。 +- **Pin tab** は、タブをピン留めします。タブをピン留めすると、文書タブの一番左側に表示され、右クリックでピン留めしていないタブだけを閉じるショートカットが利用できます。 + + ![View Menu](../../../images/tab-context-menu.png) + +- **New Horizontal/Vertical Tab Group(新しい横型/縦型タブグループ)**: このオプションは、メイン文書領域を複数のセクション(タブグループ)に分割し、複数の文書を同時に横並びまたは上下に並べて表示するためのものです。 +- **Close All Documents**: Closes all document tabs. You are prompted to save unsaved changes, if any. +- **Reset Window Layout**: Resets all customization applied to the main document area. +- **1..N [document]**: The first 10 open documents are listed here, allowing you to navigate between them. You can also use the CTLR+Tab shortcut to quickly switch between open documents and views, such as shown in the screenshot below: + + ![View Menu](../../../images/ctrl-tab.png) + +- **Windows...**: Opens a dialog listing ALL open documents, allowing you to switch between them or close them individually. + + ![View Menu](../../../images/windows-manager.png) + +- **Capture current layout** / **Manage layouts...** / **Default layout** / **Classic layout**: These menu items were discussed [earlier in this article](#choosing-a-different-layout). +- **Theme** / **Default palette**: These menu items were discussed [earlier in this article](#changing-themes-and-palettes). + +## Help + +The **Help** menu provides shortcuts for online resources and more. + +![View Menu](../../../images/help-menu.png) + +- **Getting Started**: This menu item links to [this article](xref:getting-started). +- **Tabular Editor 3 Docs**: This menu item links to [docs.tabulareditor.com](https://docs.tabulareditor.com/te3). +- **Community Support**: This menu item links to our [public community support site](https://github.com/TabularEditor/TabularEditor3). +- **Dedicated Support**: This menu item lets you send an e-mail directly to our dedicated support hotline. + +> [!NOTE] +> Dedicated support is reserved for Tabular Editor 3 Enterprise Edition customers. All other customers should reach out on the [public community support site](https://github.com/TabularEditor/TabularEditor3) for any technical issues, questions or other product-specific questions. + +- **About Tabular Editor**: Launches a dialog that shows detailed information about the version of Tabular Editor being used as well installation and licensing details. The dialog also lets you change your license key. + +## Dynamic menus (context dependent) + +In addition to the menus mentioned above, other menus may appear at certain times, depending on which UI element currently has focus and which object is currently selected in the TOM Explorer. For example, if you select a Table-object, a **Table** menu will appear, holding the same context-specific shortcut items as when you right-click on that object in the TOM Explorer. + +If you switch the input focus between different types of documents (i.e. DAX queries, Pivot Grids, diagrams, etc.), you should also see a menu representing the type of document currently in focus. That menu will hold items relevant for the current document. For example, when a diagram currently has focus, there will be a **Diagram** menu which has an item for adding tables to the diagram, among others. + +You can change the behavior of these dynamic menus under **Tools > Preferences > User interface**. + +# Next steps + +- [Using the TOM Explorer in Tabular Editor 3](xref:tom-explorer-view) +- @supported-files +- @preferences diff --git a/te3/features/ja-jp/ja-user-options.md b/te3/features/ja-jp/ja-user-options.md new file mode 100644 index 0000000..8cf12a1 --- /dev/null +++ b/te3/features/ja-jp/ja-user-options.md @@ -0,0 +1,62 @@ +--- +uid: user-options +title: User options (.tmuo) file +author: Daniel Otykier +updated: 2021-09-27 +--- +# Tabular Model User Options (.tmuo) File + +Tabular Editor 3 introduces a new JSON based file, to store developer- and model-specific preferences. This file is called the **Tabular Model User Options** file and uses the **.tmuo** file extension. + +When you open a Model.bim or Database.json file in Tabular Editor 3, the file will be created using the name of the file you loaded and your Windows user name. For example, if a user opens a file called `AdventureWorks.bim`, the user options file will be saved as `AdventureWorks..tmuo`, where `` is the Windows user name of the current user. Tabular Editor searches for a file with such a name every time a model is loaded from disk. + +> [!IMPORTANT] +> The **.tmuo** file contains user-specific preferences, and as such it should not be included in a shared version control environment. If you're using Git for version control, make sure to include the `.tmuo` extension in your `.gitignore` file. + +## File content + +Below is an example of the file content: + +```json +{ + "UseWorkspace": true, + "WorkspaceConnection": "provider=MSOLAP;data source=localhost", + "WorkspaceDatabase": "WorkspaceDB_DanielOtykier_20210904_222118", + "DataSourceOverrides": { + "SQLDW": { + "ConnectionString": { + "Encryption": "UserKey", + "EncryptedString": "..." + }, + "PrivacySetting": "NA" + } + }, + "TableImportSettings": { + "SQLDW": { + "ServerType": "Sql", + "UserId": "sqladmin", + "Password": { + "Encryption": "UserKey", + "EncryptedString": "..." + }, + "Server": "localhost", + "Database": "AdventureWorksDW2019", + "Authentication": 0 + } + } +} +``` + +In this example, the JSON properties shown have the following meaning: + +- `UseWorkspace`: Indicates whether Tabular Editor should connect to a workspace database upon loading the model. The workspace database will be overwritten with the metadata of the loaded file/folder structure. When this value is not present, Tabular Editor will prompt the user for whether they want to use a workspace database or not, upon model load. +- `WorkspaceConnection`: Server name of the Analysis Services instance or Power BI XMLA Endpoint to which the workspace database will be deployed. +- `WorkspaceDatabase`: Name of the workspace database to deploy. This should ideally be unique for each developer and model. +- `DataSourceOverrides`: This structure may be used to specify alternative data source properties and credentials which will be used every time the workspace database is deployed. This is useful if the Model.bim file contains data source connection details that you want to override for your workspace database, such as when you want Analysis Services to refresh data from a different source than what is specified in the Model.bim file. +- `TableImportSettings`: This structure is used whenever Tabular Editor's [Import Table or Schema Update](xref:importing-tables) feature is used. The credentials and settings specified here, are used by Tabular Editor when establishing a connection to the source for purposes of browsing available tables/views and updating the imported table schema, when changes have been made to the source. + +All credentials and connection strings in the .tmuo file are encrypted with the Windows User Key. In other words, a .tmuo file containing encrypted data cannot be shared between multiple users. + +## Next steps + +- @workspace-mode \ No newline at end of file