From 53ef5c0a886cc7d3c70c224c3e15815ea421de05 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:05:48 +0000 Subject: [PATCH 1/8] New translations (Translated) --- localizedContent/es/.translation-status.json | 261 +++-- .../Semantic-Model/direct-lake-sql-model.md | 49 +- .../es/content/features/ai-assistant.md | 482 ++++----- .../es/content/features/auto-reload.md | 63 +- .../es/content/features/dax-debugger.md | 183 ++-- .../es/content/features/dax-editor.md | 65 +- .../features/dax-optimizer-integration.md | 103 +- .../es/content/features/dax-query.md | 100 +- .../es/content/features/deployment.md | 88 +- .../es/content/features/mcp-server.md | 315 +++--- .../features/metadata-translation-editor.md | 36 +- .../es/content/features/pivot-grid.md | 166 +-- localizedContent/es/content/features/toc.md | 127 +-- .../es/content/features/unsaved-changes.md | 117 ++- .../content/features/views/messages-view.md | 55 +- .../content/features/views/user-interface.md | 269 +++-- .../creating-and-testing-dax.md | 116 +-- .../content/getting-started/installation.md | 147 +-- .../getting-started/personalizing-te3.md | 164 +-- .../getting-started/refresh-preview-query.md | 149 +-- .../es/content/getting-started/toc.md | 92 +- ...Advanced-Filtering-of-the-Explorer-Tree.md | 74 +- .../content/how-tos/deploy-current-model.md | 26 +- .../es/content/how-tos/drag-drop.md | 125 +-- .../content/how-tos/duplicate-batchrename.md | 15 +- .../how-tos/formula-fixup-dependencies.md | 13 +- .../es/content/how-tos/load-save.md | 69 +- .../how-tos/perspectives-translations.md | 22 +- .../how-tos/semantic-bridge-rename-objects.md | 42 +- localizedContent/es/content/how-tos/toc.md | 74 +- localizedContent/es/content/kb/DR002.md | 19 +- .../es/content/references/downloads.md | 139 +-- .../es/content/references/policies.md | 257 ++--- .../es/content/references/preferences.md | 979 ++++++------------ .../es/content/references/release-history.md | 314 +++--- .../references/release-notes/3_27_1_0.md | 110 ++ .../references/release-notes/3_27_1_1.md | 74 ++ .../es/content/references/supported-files.md | 247 +++-- .../content/references/system-requirements.md | 63 +- localizedContent/es/content/references/toc.md | 36 +- .../es/content/references/user-options.md | 176 ++-- .../es/content/security/ai-compliance.md | 296 +++--- .../es/content/security/security-privacy.md | 151 ++- localizedContent/es/content/security/toc.md | 11 +- .../es/content/troubleshooting/toc.md | 16 +- .../es/content/tutorials/new-as-model.md | 108 +- .../es/content/tutorials/new-pbi-model.md | 25 +- .../es/content/whats-new/3-18-0.html | 2 +- .../es/content/whats-new/3-18-1.html | 2 +- .../es/content/whats-new/3-18-2.html | 2 +- .../es/content/whats-new/3-26-0.html | 12 + .../es/content/whats-new/3-26-1.html | 12 + .../es/content/whats-new/3-26-2.html | 11 + .../es/content/whats-new/3-26-3.html | 11 + .../es/content/whats-new/index.html | 20 +- localizedContent/zh/.translation-status.json | 268 ++--- .../Semantic-Model/direct-lake-sql-model.md | 46 +- .../zh/content/features/ai-assistant.md | 487 ++++----- .../zh/content/features/auto-reload.md | 65 +- .../zh/content/features/dax-debugger.md | 193 ++-- .../zh/content/features/dax-editor.md | 65 +- .../features/dax-optimizer-integration.md | 101 +- .../zh/content/features/dax-query.md | 104 +- .../zh/content/features/deployment.md | 76 +- .../zh/content/features/mcp-server.md | 315 +++--- .../features/metadata-translation-editor.md | 30 +- .../zh/content/features/pivot-grid.md | 156 +-- localizedContent/zh/content/features/toc.md | 117 +-- .../zh/content/features/unsaved-changes.md | 133 ++- .../content/features/views/messages-view.md | 53 +- .../content/features/views/user-interface.md | 289 +++--- .../creating-and-testing-dax.md | 100 +- .../content/getting-started/installation.md | 155 +-- .../getting-started/refresh-preview-query.md | 131 +-- .../zh/content/getting-started/toc.md | 76 +- ...Advanced-Filtering-of-the-Explorer-Tree.md | 72 +- .../content/how-tos/deploy-current-model.md | 28 +- .../zh/content/how-tos/drag-drop.md | 127 +-- .../content/how-tos/duplicate-batchrename.md | 11 +- .../how-tos/formula-fixup-dependencies.md | 13 +- .../zh/content/how-tos/load-save.md | 71 +- .../how-tos/perspectives-translations.md | 24 +- .../how-tos/semantic-bridge-rename-objects.md | 32 +- localizedContent/zh/content/how-tos/toc.md | 80 +- .../zh/content/references/downloads.md | 165 +-- .../zh/content/references/policies.md | 252 ++--- .../zh/content/references/preferences.md | 967 ++++++----------- .../zh/content/references/release-history.md | 416 ++++---- .../content/references/release-notes/3_0_3.md | 69 +- .../content/references/release-notes/3_1_2.md | 100 +- .../references/release-notes/3_27_1_0.md | 110 ++ .../references/release-notes/3_27_1_1.md | 74 ++ .../content/references/release-notes/3_3_4.md | 108 +- .../zh/content/references/supported-files.md | 246 ++--- .../content/references/system-requirements.md | 61 +- localizedContent/zh/content/references/toc.md | 40 +- .../zh/content/references/user-options.md | 180 ++-- .../zh/content/security/ai-compliance.md | 298 +++--- .../zh/content/security/security-privacy.md | 147 ++- localizedContent/zh/content/security/toc.md | 9 +- .../zh/content/troubleshooting/toc.md | 14 +- .../zh/content/tutorials/new-as-model.md | 96 +- .../zh/content/whats-new/3-18-0.html | 2 +- .../zh/content/whats-new/3-18-1.html | 2 +- .../zh/content/whats-new/3-18-2.html | 2 +- .../zh/content/whats-new/3-26-0.html | 12 + .../zh/content/whats-new/3-26-1.html | 12 + .../zh/content/whats-new/3-26-2.html | 11 + .../zh/content/whats-new/3-26-3.html | 11 + .../zh/content/whats-new/index.html | 20 +- 110 files changed, 6766 insertions(+), 6776 deletions(-) create mode 100644 localizedContent/es/content/references/release-notes/3_27_1_0.md create mode 100644 localizedContent/es/content/references/release-notes/3_27_1_1.md create mode 100644 localizedContent/es/content/whats-new/3-26-0.html create mode 100644 localizedContent/es/content/whats-new/3-26-1.html create mode 100644 localizedContent/es/content/whats-new/3-26-2.html create mode 100644 localizedContent/es/content/whats-new/3-26-3.html create mode 100644 localizedContent/zh/content/references/release-notes/3_27_1_0.md create mode 100644 localizedContent/zh/content/references/release-notes/3_27_1_1.md create mode 100644 localizedContent/zh/content/whats-new/3-26-0.html create mode 100644 localizedContent/zh/content/whats-new/3-26-1.html create mode 100644 localizedContent/zh/content/whats-new/3-26-2.html create mode 100644 localizedContent/zh/content/whats-new/3-26-3.html diff --git a/localizedContent/es/.translation-status.json b/localizedContent/es/.translation-status.json index 76a8f672d..68decbe89 100644 --- a/localizedContent/es/.translation-status.json +++ b/localizedContent/es/.translation-status.json @@ -15,7 +15,7 @@ "status": "translated" }, "features/ai-assistant.md": { - "sourceHash": "sha256:f408187864a033df9803ec001397d671d7d2661b82c6aefcdae02e4bf77e22fc", + "sourceHash": "sha256:653e705ba399c654e40c36883e8821688545725b1f1657df3133c8f4629b7d7b", "status": "translated" }, "features/ai-audit-log.md": { @@ -23,7 +23,7 @@ "status": "translated" }, "features/auto-reload.md": { - "sourceHash": "sha256:12a094cafa3b8bcd0d1143ab195cd05c04cce7aceda6d897e9c63276420524fe", + "sourceHash": "sha256:1b25013ea7ca0df1506f97af0d79d1da0fe83c27f1fa19f9f8fa73e039c7f9b4", "status": "translated" }, "features/Best-Practice-Analyzer.md": { @@ -207,15 +207,15 @@ "status": "translated" }, "features/dax-debugger.md": { - "sourceHash": "sha256:2edb8f85458de285384d61b1bd055fda7ff1f02e451a601cb555acac25c64f50", + "sourceHash": "sha256:240c1f8e4048f7cf6ab8c97e779b96cb212c203f9200de5b6183be205b89cde9", "status": "translated" }, "features/dax-editor.md": { - "sourceHash": "sha256:b8456895d28fb1c0ac0e2e78432a85e2d85bdf9ae2aa1e2d9c9edb2784e55923", + "sourceHash": "sha256:a2a254e8b33e5325bfef77305993edd6b3cc92ff7f7830e8d1d58eb71415ee08", "status": "translated" }, "features/dax-optimizer-integration.md": { - "sourceHash": "sha256:7f360b8d39e0a763558717f52a112f4e908cd7e30b99c94580b0f478277858f1", + "sourceHash": "sha256:99732043836a08d92b3e06d9215483d6711ec71964f26bb5e38ca466a294391f", "status": "translated" }, "features/dax-package-manager.md": { @@ -223,7 +223,7 @@ "status": "translated" }, "features/dax-query.md": { - "sourceHash": "sha256:43d7d61f433e79310e7af7d7e44e34ffa6f80b49df061b34d91f9285a55131d4", + "sourceHash": "sha256:cfc810bcddec30cd43d0f71a516b57a5cbbe240900a372f9d255b4d508ab7f18", "status": "translated" }, "features/dax-scripts.md": { @@ -231,7 +231,7 @@ "status": "translated" }, "features/deployment.md": { - "sourceHash": "sha256:ccf07d6fb575c9a62fa94e4e5b3ba9e41543a57b1b651441ecdde3eabe98b0f2", + "sourceHash": "sha256:59c740eeb41c5812656c4ecdf7add21b676c2ef38dcda6e8b955e8d08a39b728", "status": "translated" }, "features/hierarchical-display.md": { @@ -247,11 +247,11 @@ "status": "translated" }, "features/mcp-server.md": { - "sourceHash": "sha256:9fbfc101f7c6f4a71721ef6382610bdec5123aa3ddd0f4728ee93852bf4f8196", + "sourceHash": "sha256:11b33ab0816ca299b20337ffce43acefead22d00f79b0e7cad01500f51b2ca0c", "status": "translated" }, "features/metadata-translation-editor.md": { - "sourceHash": "sha256:7dd826b950714972b3429347f09fed22bcdbaf3f149e4f47dc6382ecf26e69e5", + "sourceHash": "sha256:9da3d1822e843167af66095f47aaf417f6868dc20d31ed081cb914e7682e1cbf", "status": "translated" }, "features/perspective-editor.md": { @@ -259,7 +259,7 @@ "status": "translated" }, "features/pivot-grid.md": { - "sourceHash": "sha256:13469e84b4715d3989eb9f9220222807cad8eaa30bb5dc6eb1837da1e13d82ee", + "sourceHash": "sha256:8b5e42ebb25a83fb72a1dd42178826b3e07c9ca59d91e76d2e922efee202d417", "status": "translated" }, "features/refresh-overrides.md": { @@ -299,7 +299,7 @@ "status": "translated" }, "features/Semantic-Model/direct-lake-sql-model.md": { - "sourceHash": "sha256:7f45a897ce4afe418c209f05ba10729e24bba2a60d8710191bfd66051336293b", + "sourceHash": "sha256:73344d63079311e84f9818b64bfc4ee152c34968b77b2096ff54785a3a7a8eb2", "status": "translated" }, "features/Semantic-Model/direct-query-over-as.md": { @@ -375,11 +375,11 @@ "status": "translated" }, "features/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:7dc2adbeda0cb31f2e08f9530d215f40d39da97a305b2d70c361c71377a687cf", + "status": "translated" }, "features/unsaved-changes.md": { - "sourceHash": "sha256:b4276f4a2d3144459dfc5e6fa6f6e71d560547cad60cc6c6227c8a2207fc3651", + "sourceHash": "sha256:f93949808fcb3a5667d510775e7332f7cb5bc9abe646876e577513435792113d", "status": "translated" }, "features/Useful-script-snippets.md": { @@ -423,7 +423,7 @@ "status": "translated" }, "features/views/messages-view.md": { - "sourceHash": "sha256:c444a771025eab4067d298298fa8391fd1e0157c38582320b097f9d2320d4657", + "sourceHash": "sha256:db0847f6ed1bf009751ad3aa4ada7c220f90f78cb4757bb35fa47d7d3c0a4715", "status": "translated" }, "features/views/properties-view.md": { @@ -435,7 +435,7 @@ "status": "translated" }, "features/views/user-interface.md": { - "sourceHash": "sha256:7e6a431584ea6e620b932f5ff895cea2a9a28faecc253b212fe62b033ed833c7", + "sourceHash": "sha256:2227d849e02e4070d711ebfccd5753903cdaf829555cab0d47a2fbb43933add9", "status": "translated" }, "features/Workspace-Database.md": { @@ -463,7 +463,7 @@ "status": "translated" }, "getting-started/creating-and-testing-dax.md": { - "sourceHash": "sha256:326a4af18f1bacea3e4b6a52d44c336bab3495074918c9cf49722d2e579a561f", + "sourceHash": "sha256:836430b3198033ceaa17a90143a25c7d46e8c1142fc98348688d14668eb46ba0", "status": "translated" }, "getting-started/cs-scripts-and-macros.md": { @@ -507,7 +507,7 @@ "status": "translated" }, "getting-started/installation.md": { - "sourceHash": "sha256:ef3f254c8f8def44e84251f71974aec719f3b23b69dd37d3c5bc343b3a53ed8a", + "sourceHash": "sha256:8e3e0f91d19b41b20234ddeb9205f1899488c93dfffe2e3573388426a972e5ce", "status": "translated" }, "getting-started/migrate-from-desktop.md": { @@ -531,15 +531,15 @@ "status": "translated" }, "getting-started/personalizing-te3.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:0e2b6a13cb3a279d40f713d56287aca1a7d6d340ebec4e13842b3d51b42f76d8", + "status": "translated" }, "getting-started/Power-BI-Desktop-Integration.md": { "sourceHash": "sha256:f725405cfbeeb34f15100aa477e813197a3d40640fdcd2de82f2262cf3b41ef8", "status": "translated" }, "getting-started/refresh-preview-query.md": { - "sourceHash": "sha256:3bdec39f290189d4f7a9e60eebcaf4eed6a54db750203a2d1bf692927d4fa5c7", + "sourceHash": "sha256:d0e7a9eb57432d790cdaed210b05766df549b82e124d70f0000358cfd176abf4", "status": "translated" }, "getting-started/sharing-macros-bpa-rules.md": { @@ -547,8 +547,8 @@ "status": "translated" }, "getting-started/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:adf238552f81c08ae51d0b01e45e454d85808fa4cb5f0346102572f8c292fd10", + "status": "translated" }, "getting-started/training-telearn.md": { "sourceHash": "sha256:cba2b907335edf7e1310d6323c063305cbed3c66013758b932d91466394b4d85", @@ -595,7 +595,7 @@ "status": "translated" }, "how-tos/Advanced-Filtering-of-the-Explorer-Tree.md": { - "sourceHash": "sha256:65c40ce723d4b32aff6b4591f2bbc7b92f9efcc4d8f5fee3beeeaf4faf58cd71", + "sourceHash": "sha256:88282c7d6522f7528d4115587a3f6a37c0d26be56435f14d66005adbb0770c79", "status": "translated" }, "how-tos/Advanced-Scripting.md": { @@ -611,15 +611,15 @@ "status": "translated" }, "how-tos/deploy-current-model.md": { - "sourceHash": "sha256:678aaf20d780c1b7489968a3ddd0dc11553f102e5db763a0d545b49e368b5301", + "sourceHash": "sha256:58521385386ec88ac53dd46854e7567f35e5616760dab3bc173cfda4ff3d84b4", "status": "translated" }, "how-tos/drag-drop.md": { - "sourceHash": "sha256:56d2daf749079cedf7edccdd1a6981c5cfc49aadfd04b91a2f7a95f481c2e3b9", + "sourceHash": "sha256:0426f2b83c294640fed1d3a435902ee1221d185985da9b78e3ce35ad7dede0c3", "status": "translated" }, "how-tos/duplicate-batchrename.md": { - "sourceHash": "sha256:c0595217b896e03211f74b7fe747e6f6d9ca610669b0e08fe07ff459e2b39d20", + "sourceHash": "sha256:d3b9138170b47bba94fdedc45130e77ef1d8ffedcb1a4d266f38e6b3b9806591", "status": "translated" }, "how-tos/edit-properties.md": { @@ -631,7 +631,7 @@ "status": "translated" }, "how-tos/formula-fixup-dependencies.md": { - "sourceHash": "sha256:f1b335d4a4c069ac21bdd9c20b0e34ed6442c63307f9d3a1cfdb29e4992daec5", + "sourceHash": "sha256:47edeccaae5f56e9ee945ebb0361b52f61ca0dc746445cb17413f13e5cfdcd1d", "status": "translated" }, "how-tos/import-export-translations.md": { @@ -659,7 +659,7 @@ "status": "translated" }, "how-tos/load-save.md": { - "sourceHash": "sha256:4ac29ac34e1aee8edd2733d947e4519b26dbdef29ba4a372362a644d0488b1c9", + "sourceHash": "sha256:de10907604abecdab5c2b7628b19a6fd4345c1be2ae92a4f0c8b3dd54b342fd4", "status": "translated" }, "how-tos/Master-model-pattern.md": { @@ -671,7 +671,7 @@ "status": "translated" }, "how-tos/perspectives-translations.md": { - "sourceHash": "sha256:65165835a80d24a358493e2af433e6d3833c039846e65fe9977c5d279d0f35f5", + "sourceHash": "sha256:64fcbfd8515d82099b04d79577931bed5fd8e8b440a4e58ef070ff7a17cc367c", "status": "translated" }, "how-tos/powerbi-xmla-pbix-workaround.md": { @@ -771,7 +771,7 @@ "status": "translated" }, "how-tos/semantic-bridge-rename-objects.md": { - "sourceHash": "sha256:888e6e749bc1d666eb315f3186540a12184bc538bfd73ebf97dbf68645c6092e", + "sourceHash": "sha256:3cb819a90b4c798f3f736dda4333bb4ca4757bc37687178bf68e48702389192f", "status": "translated" }, "how-tos/semantic-bridge-serialize.md": { @@ -791,8 +791,8 @@ "status": "translated" }, "how-tos/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:6b2bda5655200d7d8468b139409d10f4024adeb90e0ae3177833c7003df10ec9", + "status": "translated" }, "how-tos/undo-redo.md": { "sourceHash": "sha256:857971043360cef22eb83ee113a0ebbe86160e1250ecfce378e7824e924fcc2d", @@ -995,8 +995,8 @@ "status": "translated" }, "kb/DR002.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:0ad80ebc8cbf3ec27662dffc0210986cbabe8f92810bdb7a33717de8fab16037", + "status": "translated" }, "kb/DR003.md": { "sourceHash": "sha256:b76298c84d8c1269703dba2770d51a6674dfa4f03979e5aa71a53a456575bb49", @@ -1075,7 +1075,7 @@ "status": "translated" }, "references/downloads.md": { - "sourceHash": "sha256:d6f5f62ef64bfef5eab06ef77caad78ee695cd60e12114b7af9774a337063085", + "sourceHash": "sha256:1282a6707c314a8a8f4394fb08390fefb831dcab74679799630ee8d2558df14b", "status": "translated" }, "references/FAQ.md": { @@ -1155,15 +1155,15 @@ "status": "translated" }, "references/policies.md": { - "sourceHash": "sha256:2caab8e0667baf27214a05cd1d8083570418378257a94a739c21abf6060ef5ac", + "sourceHash": "sha256:7a4be238eccce5f3ac219cda6a6824acde17d1d7c36645af7f81cefc5b49a3f2", "status": "translated" }, "references/preferences.md": { - "sourceHash": "sha256:4b727d58249a9c4583c67d0dc40a32ebd45efe9e006f86cf404c53f094e8bcd9", + "sourceHash": "sha256:5d6e1afb9979182cee148aee717272331dc45ac4d34090bee49f433f1a91a9b0", "status": "translated" }, "references/release-history.md": { - "sourceHash": "sha256:78226d0901a9debfe95e062f96697ba023c893852edcf6560dc89296382c0fc1", + "sourceHash": "sha256:216e34e41eb93fb86370730947fc2286cb0d3af22695f0ea6e3bee3a0e6c0bc1", "status": "translated" }, "references/release-notes/3_0_1.md": { @@ -1386,6 +1386,14 @@ "sourceHash": "sha256:0871275249d3bbd3ca332855873c89ed84a476929a2216333724fd61a05bdfc3", "status": "translated" }, + "references/release-notes/3_27_1_0.md": { + "sourceHash": "sha256:c6fc5f3a2f35a2df7ef78a0206485bc8bb3b337a77c75fda7e36ca9648233938", + "status": "translated" + }, + "references/release-notes/3_27_1_1.md": { + "sourceHash": "sha256:431749c4a72f633d7c9d7fbe244f6da012dbaa570a77f50b42df292786498c60", + "status": "translated" + }, "references/release-notes/3_2_0.md": { "sourceHash": "sha256:f80a34035dde22a0619af4ce18d51f59866d2eff27418c893e676f9da877b10c", "status": "translated" @@ -1515,11 +1523,11 @@ "status": "translated" }, "references/supported-files.md": { - "sourceHash": "sha256:b914a46e482200adc4b407c54a40cdc4312d5698ff765fc661d83c4b0333b60a", + "sourceHash": "sha256:93d9b802670030915f59f55702d47df2cfd257de11be8bb0ac18171f58f302a1", "status": "translated" }, "references/system-requirements.md": { - "sourceHash": "sha256:1ca5de3bd3440c895a05b276f9bf93d2a5fe80092b93928712c99994712827d1", + "sourceHash": "sha256:b45a50ff74b9dfc6b6409ef77e6e9d0a4a689617fc4c39903540cb4df21e06a5", "status": "translated" }, "references/TabularEditor.TOMWrapper-h.md": { @@ -1527,11 +1535,11 @@ "status": "translated" }, "references/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:dbc3800f9348e300524d13c2beacfc036c700b0df898692e39929d7b4bfcb440", + "status": "translated" }, "references/user-options.md": { - "sourceHash": "sha256:ad092f6088edad3d3e8bd124c227f618338b081a453118946880a2fdc8dccf9d", + "sourceHash": "sha256:c1c940b4529b30a1be9a016f78877c647519695975505908b58abf3ce615ed86", "status": "translated" }, "references/user-settings-files-te2.md": { @@ -1539,7 +1547,7 @@ "status": "translated" }, "security/ai-compliance.md": { - "sourceHash": "sha256:4c6a93c738e015fe6143730853cffa714e10e80d7911eb6ff5f749dda7a364ad", + "sourceHash": "sha256:7ba0a0711d3c14abb5627dac340e887b63c61b2bc08d10a25bfe4af1eddc1870", "status": "translated" }, "security/gdpr-delete.md": { @@ -1555,8 +1563,8 @@ "status": "translated" }, "security/security-privacy.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:ae9530c71a3a786879ad5d50ac6ff917ae5e7dc0e43cd258413cd7a12ec1c7e3", + "status": "translated" }, "security/terms.md": { "sourceHash": "sha256:90fd51f0cff45e9e16b2c200fc4dc3ccf769b97a3c6afcd09b7a688cfc5b87f0", @@ -1567,8 +1575,8 @@ "status": "copied" }, "security/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:aecf5ca69ba24fc448be9fbff14d4662f5b333222a4ddec6bb6a064575481147", + "status": "translated" }, "toc.yml": { "sourceHash": "sha256:11d5df2671e45efed1baf56cd10c6634fc48f5f34b8f40d5b83456258a929108", @@ -1631,8 +1639,8 @@ "status": "translated" }, "troubleshooting/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:eb90344041259d96a138c386edc99bc3c992c331f293f88539c4deca6fffd323", + "status": "translated" }, "tutorials/calendars.md": { "sourceHash": "sha256:42d5fbcac1800e22943c402afc8cc0ab45ecae62d802ffafb492d37a3e4096b2", @@ -1699,11 +1707,11 @@ "status": "translated" }, "tutorials/new-as-model.md": { - "sourceHash": "sha256:617f37b605f71ee0f770b896db1166d532fa0b21fb5e9c084cccfd12324bcbc9", + "sourceHash": "sha256:aafe64ce672080b50a6cced93d8c852b61559993eac2f36f822441f33286f4b3", "status": "translated" }, "tutorials/new-pbi-model.md": { - "sourceHash": "sha256:01b20064a80073530281396fa9208b87035a900d9ed7f608fb741cfc09302af4", + "sourceHash": "sha256:8503350984bdac5e40c759969b1fb791033bfe39c86aff6addee287ff8030458", "status": "translated" }, "tutorials/powerbi-xmla.md": { @@ -1727,126 +1735,149 @@ "status": "translated" }, "whats-new/3-11-0.html": { - "sourceHash": "sha256:8e741c7bee681e80aef9a0cac12b2c4a08193ba1a64e896f825400209a615dd0", - "status": "translated" + "sourceHash": "sha256:f05c90ee23a66c16c7f7e97f10f44e50bdd772f3049b4d0e75def4e1562c6664", + "status": "copied" }, "whats-new/3-12-0.html": { - "sourceHash": "sha256:1185bd5e0f896cf0241dba6051a1d23f8122df33d35ca629751388ca46e5411b", - "status": "translated" + "sourceHash": "sha256:ac4db83ba7bf38d569d8888e29c900ac98bd8528159db2439b310bcb4613ce33", + "status": "copied" }, "whats-new/3-12-1.html": { - "sourceHash": "sha256:0e1800850f435b7939eaf29d4c05564b315198f49bd8a9539dd180c2289aaca4", - "status": "translated" + "sourceHash": "sha256:05454034ab0295fc27adbd530c98851b2c6d978d1297620c005cbac8723068e2", + "status": "copied" }, "whats-new/3-13-0.html": { - "sourceHash": "sha256:fe072740d52a6d0664d5a54627f904603dca096280c9a0c3e4d67fa0dfa89236", - "status": "translated" + "sourceHash": "sha256:338340ce38e3d4e0c78ca8939e9f682a39a84144c10c7775b2ebd45fd0a013d8", + "status": "copied" }, "whats-new/3-14-0.html": { - "sourceHash": "sha256:516c949f7443084eeb6e3c4c5981e5ff4960ddd65622dd0f34b5b9c47b81431e", - "status": "translated" + "sourceHash": "sha256:0ebf84c1ed96b8df959859fedb4294d14f1a785f7d90c898a23552a840a5d66e", + "status": "copied" }, "whats-new/3-15-0.html": { - "sourceHash": "sha256:21384e1d1473d31ef1d1076640a94dc9f48033a072ae9e56e37b700954319083", - "status": "translated" + "sourceHash": "sha256:be61fe699768f176d186e6121c697e035fabed64aa567550d5e9636e31ee0b5c", + "status": "copied" }, "whats-new/3-16-0.html": { - "sourceHash": "sha256:2ea751dad6a56088eb1e35934df0e3def7ceb65e15877e869778a2c946bbb322", - "status": "translated" + "sourceHash": "sha256:305e03f418ff43c6b4462466e6df3a048aabbdd677da448067f9f63e9d4131da", + "status": "copied" }, "whats-new/3-17-0.html": { - "sourceHash": "sha256:5d0ae23d2d1a98813d3c06f3c50039838fe3b4e024ef3b4d61462469d9d904a3", - "status": "translated" + "sourceHash": "sha256:66246fbfd6abce8bb7bd60f3c922f470b96c4a78315fbf1a9b862db29983b50c", + "status": "copied" }, "whats-new/3-17-1.html": { - "sourceHash": "sha256:5d0ae23d2d1a98813d3c06f3c50039838fe3b4e024ef3b4d61462469d9d904a3", - "status": "translated" + "sourceHash": "sha256:66246fbfd6abce8bb7bd60f3c922f470b96c4a78315fbf1a9b862db29983b50c", + "status": "copied" }, "whats-new/3-18-0.html": { - "sourceHash": "sha256:379bc949c979ed11804eacb3090b760cb0b67f7e10d4a01b1b7e314b1fe98739", - "status": "translated" + "sourceHash": "sha256:11676c6ea80f5de2ee940db6e5e07bfb1c4d654c363ce8172034e56ea09ad766", + "status": "copied" }, "whats-new/3-18-1.html": { - "sourceHash": "sha256:264150226e01169f6dd8569bb48d8c13192aedd54d78d17b51df115ca260c0c9", - "status": "translated" + "sourceHash": "sha256:f38aa0f26bb0eec38c07d2926df761a9237ae36fdb8903b71e4b1a115897ef3c", + "status": "copied" }, "whats-new/3-18-2.html": { - "sourceHash": "sha256:07289f60b049811a09e673f8642fe4dcbc50efddb8ad77718cf55d16e4b69200", - "status": "translated" + "sourceHash": "sha256:3aaee936b3713c578ac67b6bf55cfd638a90fd2d1fdca3b9d06d971af73da0ce", + "status": "copied" }, "whats-new/3-19-0.html": { - "sourceHash": "sha256:264b6c6843e8a6c737c5e88953856e08a9ece0ebd39ac78b2a58cef1b69796db", - "status": "translated" + "sourceHash": "sha256:c97ca1eaa3a079bbe8ee4ce15231468a917535875b99bf94b66dbfe850ea78f1", + "status": "copied" }, "whats-new/3-20-0.html": { - "sourceHash": "sha256:165affb599d769434c2e227fc63aa174509c08ec5a501e357ff028b3bb26bbd7", - "status": "translated" + "sourceHash": "sha256:800086470837f7c0ef96b37778a29897895b6ecc41e8b6aa6127b8dbed13370a", + "status": "copied" }, "whats-new/3-21-0.html": { - "sourceHash": "sha256:0560eecc9d57bfa393d9415121f00a06c9e0692db7bbf924c81fd5e32f99283c", - "status": "translated" + "sourceHash": "sha256:433f0fca243c8efa8f7e643fc432faaedfc6ea9d43c4ddbabed6c55468c15afb", + "status": "copied" }, "whats-new/3-22-0.html": { - "sourceHash": "sha256:d5c122abcc84f8fdea50724e96e35435f1ce4e71e204cbd4b4bf2822dc98bbb1", - "status": "translated" + "sourceHash": "sha256:d8dadb26e6e39ddb632129d367d22c2512cc8b1cb1f0b4ff9261b2158440fa11", + "status": "copied" }, "whats-new/3-22-1.html": { - "sourceHash": "sha256:65af209383626dfef5ecc828f1d6050cf336ff370c7f3b58c2233352ab39ef02", - "status": "translated" + "sourceHash": "sha256:132726eaf4923afa154e884b8084fb50cde7472a2e18de4ec06a1d8b8ee8d990", + "status": "copied" }, "whats-new/3-23-0.html": { - "sourceHash": "sha256:c8a1848ae04394a58fe7146ebfa57ace75dafed1fbe735e6feba8a43d805ac11", - "status": "translated" + "sourceHash": "sha256:57003c0ce3231886266229e77c19fd45b4e0c8a8d816b79d2af5201117f44630", + "status": "copied" }, "whats-new/3-23-1.html": { - "sourceHash": "sha256:258468e5a7e6f2437aa12b410807dceabf6d5b5060c8607ea88b157ee8dc2b8f", - "status": "translated" + "sourceHash": "sha256:792a9676ccb8bbe2dcf7d1df81d3b3307567e1af2cc15567c78415b2e24d4ec8", + "status": "copied" }, "whats-new/3-24-0.html": { - "sourceHash": "sha256:addd6ae83a458d866e21cf5b566afd011b438d822206582320568f2a5efa2c5b", - "status": "translated" + "sourceHash": "sha256:7f944c252f7a8c422aa266d7a6fc28a9c05ae602a41e7846f04249d4fc48ef6a", + "status": "copied" }, "whats-new/3-24-1.html": { - "sourceHash": "sha256:971a290fd477bc5955d7e55e0868b296e8b4016774ca60206f9e04d719a8e273", - "status": "translated" + "sourceHash": "sha256:c43935a7d057dd95816594b369f06182a924aa6a892fad182b0eabe93a7e9501", + "status": "copied" }, "whats-new/3-24-2.html": { - "sourceHash": "sha256:b4c35a93026703f8aa4b295d1bca544dd64c9fbbd0f191e6c484aaed0d501d02", - "status": "translated" + "sourceHash": "sha256:7a5a2de978c00c85cefdbc798ba050b892549dc039334f947ffffbfd8aa9c6a3", + "status": "copied" }, "whats-new/3-25-0.html": { - "sourceHash": "sha256:ecb851a842a1bb429299b338684019c5e58c5a41d49e50f52bde33460e1d17c4", - "status": "translated" + "sourceHash": "sha256:d64545aff7bba1e17aa5ea0c1a64c25699af771f3b12a5ce4d5a1b6e67f8e28c", + "status": "copied" }, "whats-new/3-25-1.html": { - "sourceHash": "sha256:0164edb73af4cbdf606868a921664852b195a2230d52ae4df0b77028c40ea798", - "status": "translated" + "sourceHash": "sha256:a22b5f95bd8281add36952622203e4249a87421aa1f355eb2b8fabea4d52ebd3", + "status": "copied" }, "whats-new/3-25-2.html": { - "sourceHash": "sha256:d698e79f8caf50a91fb5563c900116a4ed42d0259db6412db4cc0e1a44ad7dca", - "status": "translated" + "sourceHash": "sha256:7dd48026b0f54b9bd1a0087c7a3155cda91de983325d1a59280ff75550f39875", + "status": "copied" }, "whats-new/3-25-3.html": { - "sourceHash": "sha256:fa93ee8ef8188bc519bde65fb7c222301d13ac1867b883028505bc3a5a7e76c0", - "status": "translated" + "sourceHash": "sha256:b005281766f013aba39b364a5233f5a3308bef9fc7c98ddf77a6330d625e8878", + "status": "copied" + }, + "whats-new/3-26-0.html": { + "sourceHash": "sha256:e43a553222c48f862abe7993dc460ee413a0b843c62cc0ad18c8ee4669af8cb1", + "status": "copied" + }, + "whats-new/3-26-1.html": { + "sourceHash": "sha256:68c34fd5ab34fb25fbf53b557a43128c142fdbc69895090ebb76be287698b5d4", + "status": "copied" + }, + "whats-new/3-26-2.html": { + "sourceHash": "sha256:9052c24f89a6030cebc66e1dfe7ae2ee4b5dc2f845c6be3f14f02afa04fdc262", + "status": "copied" + }, + "whats-new/3-26-3.html": { + "sourceHash": "sha256:dccf4025abdb99f91e5f04c0a14759b69591e9ffc4253095f6994516954541bb", + "status": "copied" }, "whats-new/generic.html": { - "sourceHash": "sha256:5db66c26cee732683b90bc9374802446f747ffb7ee43cbbcad0e977805871f2c", - "status": "translated" + "sourceHash": "sha256:2b76277d177968724be678e9d085bf68a7a25d3f6071054d57b096853676bd31", + "status": "copied" }, "whats-new/index.html": { - "sourceHash": "sha256:5b9c85b1dffecec8f9912e589adb5fb38de25f01803f8a3618053f6994580251", - "status": "translated" + "sourceHash": "sha256:56e416db8f0fa9adcc561aa6bfd06d25309358bcd08aa1983a71d1667cbaf05e", + "status": "copied" } }, "summary": { - "translated": 449, + "translated": 432, "outdated": 0, - "untranslated": 9, - "copied": 1, + "untranslated": 0, + "copied": 33, "pinned": 0, - "total": 459, - "completionPercent": 98.0, - "failures": 0 + "total": 465, + "completionPercent": 100.0, + "failures": 1 + }, + "failures": { + "how-tos/xmla-as-connectivity.md": { + "error": "link targets 29 -> 28 (missing ['https://learn.microsoft.com/power-bi/enterprise/service-premium-connect-tools#duplicate-workspace-names'], added [])", + "at": "2026-10-23T11:04:25Z", + "sourceHash": "sha256:1327f49f78176015f7f08cd552b754ea50c38b1c375c04b77da2637df323b550" + } } } diff --git a/localizedContent/es/content/features/Semantic-Model/direct-lake-sql-model.md b/localizedContent/es/content/features/Semantic-Model/direct-lake-sql-model.md index 7ede48a87..7799ace35 100644 --- a/localizedContent/es/content/features/Semantic-Model/direct-lake-sql-model.md +++ b/localizedContent/es/content/features/Semantic-Model/direct-lake-sql-model.md @@ -1,6 +1,6 @@ ---- +--- uid: direct-lake-sql-model -title: Direct Lake en modelos semánticos SQL +title: Direct Lake en modelos semánticos de SQL author: Morten Lønskov updated: 2026-10-12 applies_to: @@ -18,56 +18,57 @@ applies_to: --- # Modelos semánticos de Direct Lake - -Los modelos semánticos SQL de Direct Lake se conectan directamente a los Data sources almacenados en [OneLake en Fabric](https://learn.microsoft.com/fabric/onelake/onelake-overview) mediante el punto de conexión SQL. +Los modelos semánticos de Direct Lake en SQL se conectan directamente a las fuentes de datos almacenadas en [OneLake en Fabric](https://learn.microsoft.com/fabric/onelake/onelake-overview) a través del punto de conexión SQL. > [!IMPORTANT] -> A partir de [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md), Tabular Editor 3 es compatible con Direct Lake en OneLake, lo cual se recomienda en la mayoría de los escenarios. Consulta nuestro artículo de [guía de Direct Lake](xref:direct-lake-guidance) para obtener más información. +> A partir de [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md), Tabular Editor 3 admite Direct Lake en OneLake, lo cual se recomienda en la mayoría de los escenarios. Consulta nuestro artículo [Guía de Direct Lake](xref:direct-lake-guidance) para obtener más información. -Tabular Editor 3 puede crear y conectarse a este tipo de modelo. Para ver un tutorial, consulta este artículo de nuestro blog: [Modelos semánticos de Direct Lake: cómo usarlos con Tabular Editor](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/). -Tabular Editor 3 puede crear modelos semánticos de Direct Lake tanto con el punto de conexión SQL de Lakehouse como con el de Datawarehouse. +Tabular Editor 3 puede crear este tipo de modelo y conectarse a él. Para obtener un tutorial sobre este tema, consulta nuestro artículo del blog: [Modelos semánticos de Direct Lake: cómo usarlos con Tabular Editor](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/). +Tabular Editor 3 puede crear modelos semánticos de Direct Lake tanto con el punto de conexión SQL de Lakehouse como con el de Datawarehouse. -Tabular Editor 2 puede conectarse a modelos semánticos de Direct Lake, pero no incluye ninguna funcionalidad integrada para crear nuevas tablas ni modelos semánticos de Direct Lake. Esto debe hacerse manualmente o con un C# Script. +Tabular Editor 2 puede conectarse a modelos semánticos de Direct Lake, pero no dispone de ninguna funcionalidad integrada para crear nuevas tablas ni modelos semánticos de Direct Lake. Esto debe hacerse manualmente o con un script de C#. > [!NOTE] > **Limitaciones de Direct Lake** -> Hay varias limitaciones en cuanto a los cambios que se pueden realizar en un modelo de Direct Lake. Consulta [Direct Lake Considerations and Limitations](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations) para obtener la lista completa. Consulta también [este artículo de SQLBI](https://www.sqlbi.com/blog/marco/2024/04/06/direct-lake-vs-import-mode-in-power-bi/) para obtener una visión general a la hora de elegir entre Direct Lake e Import mode. +> Existen varias limitaciones a los cambios que se pueden realizar en un modelo Direct Lake. Consulte [Consideraciones y limitaciones de Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations) para ver la lista completa. Consulte también [este artículo de SQLBI](https://www.sqlbi.com/blog/marco/2024/04/06/direct-lake-vs-import-mode-in-power-bi/) para obtener una descripción general sobre cómo elegir entre el modo Direct Lake y el modo Importación. -## Crear un modelo de Direct Lake en SQL en Tabular Editor 3 +## Creación de un modelo Direct Lake en SQL en Tabular Editor 3 -La creación de un modelo de Direct Lake en SQL en Tabular Editor 3 (3.15.0 o superior) debe especificarse al crear el modelo en el cuadro de diálogo _Nuevo modelo_, mediante la casilla Direct Lake. +La creación de un modelo Direct Lake en SQL en Tabular Editor 3 (3.15.0 o superior) debe especificarse cuando se cree el modelo en el cuadro de diálogo _Nuevo modelo_, utilizando la casilla de verificación Direct Lake. -![Direct Lake New Model](~/content/assets/images/common/DirectLakeNewModelDialog.png) +![Nuevo modelo Direct Lake](~/content/assets/images/common/DirectLakeNewModelDialog.png) -Usar la casilla garantiza que se establezcan las propiedades y anotaciones específicas de Direct Lake, y también limita la importación de tablas a orígenes compatibles con Direct Lake. +El uso de la casilla de verificación garantiza que se establezcan las propiedades y anotaciones específicas de Direct Lake, además de limitar la importación de tablas a los orígenes compatibles con Direct Lake. > [!NOTE] -> En este momento, los modelos de Direct Lake en SQL usan una intercalación diferente a la de los modelos semánticos de importación habituales de Power BI. Esto puede provocar resultados diferentes al consultar el modelo o al hacer referencia a nombres de objetos en código DAX. -> Para más información, consulta esta entrada del blog de Kurt Buhler: [Modelos con distinción entre mayúsculas y minúsculas en Power BI: consecuencias y consideraciones](https://data-goblins.com/power-bi/case-specific). +> Actualmente, los modelos Direct Lake en SQL utilizan una intercalación diferente a la de los modelos semánticos de importación de Power BI habituales. Esto puede dar lugar a resultados diferentes al consultar el modelo o al hacer referencia a nombres de objetos en el código DAX. +> Para obtener más información, consulta esta entrada del blog de Kurt Buhler: [Modelos que distinguen entre mayúsculas y minúsculas en Power BI: consecuencias y consideraciones](https://data-goblins.com/power-bi/case-specific). > [!IMPORTANT] -> A partir de [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md), se ha eliminado la casilla Direct Lake del cuadro de diálogo Nuevo modelo. Debes [establecer manualmente la intercalación de tu modelo para que coincida con la de tu Fabric Warehouse](xref:direct-lake-guidance#collation) si usas Direct Lake en SQL. +> A partir de [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md), la casilla de verificación Direct Lake se ha eliminado del cuadro de diálogo Nuevo modelo. Debe [establecer manualmente la intercalación en su modelo para que coincida con la de su almacén de Fabric](xref:direct-lake-guidance#collation) si utiliza Direct Lake en SQL. ## Enmarcado de nuevos modelos e importaciones de tablas -Tabular Editor 3 (3.15.0 o superior) enmarca (refresca) automáticamente el modelo en el primer despliegue. Esto garantiza que el modo Direct Lake esté activado; de lo contrario, el modelo volvería automáticamente a DirectQuery. +Tabular Editor 3 (3.15.0 o superior) enmarca (actualiza) automáticamente el modelo en la primera implementación. Esto se hace para garantizar que el modo Direct Lake esté activado; de lo contrario, el modelo recurriría automáticamente a DirectQuery. + +Además, al importar nuevas tablas, Tabular Editor 3 (3.15.0 o superior) enmarca (actualiza) el modelo cuando se guarda la siguiente vez. Esta preferencia se encuentra en **Herramientas > Preferencias > Implementación de modelo > Actualización de datos**. + -Además, al importar nuevas tablas, Tabular Editor 3 (3.15.0 o superior) enmarca (refresca) el modelo la próxima vez que se guarde. Esta preferencia se encuentra en **Herramientas > Preferencias > Implementación de modelo > Actualización de datos**. ## Identificación de un modelo Direct Lake +La barra de título de Tabular Editor 3 muestra el modo de almacenamiento del modelo abierto después del nombre del modelo, como **(Direct Lake)**, **(DirectQuery)** o **(Import)**. Si un modelo contiene una combinación de modos de tabla, la barra de título muestra **(Compuesto)**. El Explorador TOM muestra el tipo y el modo de cada tabla (Importación, DirectQuery, Dual o Direct Lake). Un modelo Direct Lake en SQL no puede contener tablas en modo Importación, DirectQuery o Dual. -La barra de título superior de Tabular Editor muestra qué tipo de modelo está abierto en esa instancia de Tabular Editor. Además, el Explorador TOM muestra el tipo y el modo de cada tabla (Import, DirectQuery, Dual o Direct Lake). Si un modelo contiene una combinación de modos de tabla, la barra de título mostrará "Híbrido". Actualmente, no es posible que un modelo Direct Lake on SQL contenga tablas en modo Import, DirectQuery o Dual. -## Convertir un modelo Direct Lake a Import Mode +## Conversión de un modelo Direct Lake al modo Importación -El siguiente C# Script convierte un modelo existente al modo Import mode. Esto puede ser útil si los requisitos de latencia de datos de tu modelo no requieren Direct Lake, o si quieres evitar las limitaciones de un modelo Direct Lake pero ya has empezado a crear uno en Fabric. +El siguiente script de C# convierte un modelo existente al modo Importación. Esto puede ser útil si los requisitos de latencia de datos de su modelo no precisan Direct Lake o si desea evitar las limitaciones de un modelo Direct Lake, pero ya ha empezado a crear uno dentro de Fabric. -Es posible ejecutar el script cuando Tabular Editor está conectado a un modelo semántico a través del punto de conexión XMLA. Sin embargo, guardar los cambios directamente en el Workspace de Power BI/Fabric no está admitido por Microsoft. Para evitarlo, el enfoque recomendado es usar la opción "Modelo > Implementar...". Esto permite implementar el modelo recién convertido como una nueva entidad en un Workspace. +Es posible ejecutar el script cuando Tabular Editor está conectado a un modelo semántico a través del punto de conexión XMLA. Sin embargo, Microsoft no admite guardar los cambios directamente en el área de trabajo de Power BI/Fabric. Para evitar esto, el enfoque recomendado es usar la opción «Modelo > Implementar...». Esto permite implementar el modelo recién convertido como una nueva entidad en un área de trabajo. > [!NOTE] -> Después de implementar el modelo recién convertido en modo de importación, tendrás que especificar las credenciales para acceder al Lakehouse y actualizar los datos en el modelo. +> Después de implementar el modelo recién convertido al modo de importación, deberá especificar las credenciales para acceder al Lakehouse y actualizar los datos en el modelo. -### Script de C# para convertir un modelo Direct Lake a Import Mode +### Script de C# para convertir el modelo Direct Lake al modo de importación ```csharp // ********************************************************************************** diff --git a/localizedContent/es/content/features/ai-assistant.md b/localizedContent/es/content/features/ai-assistant.md index 2a91a1e68..11a3259e3 100644 --- a/localizedContent/es/content/features/ai-assistant.md +++ b/localizedContent/es/content/features/ai-assistant.md @@ -17,265 +17,269 @@ applies_to: - edition: Enterprise full: true --- - # Asistente de IA -El Asistente de IA es un panel de chat para el desarrollo de modelos semánticos. Explora los metadatos de tu modelo, escribe y ejecuta consultas DAX, genera C# Scripts, ejecuta comprobaciones del Best Practice Analyzer, consulta las estadísticas del Analizador VertiPaq y busca en la base de conocimientos de Tabular Editor. La [configuración de permisos](#permissions-and-consent) controla lo que envía a tu proveedor de IA. El Asistente de IA se ha sometido a pruebas de penetración independientes; consulta el [Centro de confianza de Tabular Editor](https://trust.tabulareditor.com). +El asistente de IA es un panel de chat para el desarrollo de modelos semánticos. Explora los metadatos de su modelo, escribe y ejecuta consultas DAX, genera scripts de C#, explica y corrige los errores de su modelo y de los documentos abiertos, realiza comprobaciones de Best Practice Analyzer, consulta las estadísticas del Analizador VertiPaq y busca en la base de conocimientos de Tabular Editor. La [configuración de permisos](#permissions-and-consent) controla lo que envía a su proveedor de IA. El Asistente de IA se ha sometido a pruebas de penetración independientes; consulte el [Centro de cumplimiento de Tabular Editor](https://trust.tabulareditor.com). + +El Asistente de IA utiliza un modelo de «trae tu propia clave», en el que tú proporcionas una clave de API de uno de los proveedores compatibles y el asistente se ejecuta directamente con la API de ese proveedor. -El Asistente de IA usa un modelo Bring Your Own Key, en el que proporcionas una clave de API de uno de los proveedores compatibles y el asistente se ejecuta directamente contra la API de ese proveedor. +También puedes usar tu propio agente a través del [servidor MCP](xref:mcp-server), sin clave de API. Un agente como Claude Code, GitHub Copilot, el modo agente de VS Code, Codex o Cursor funciona en el modelo abierto con las mismas herramientas y configuraciones de permisos que el chat, excepto por los permisos de sesión y por modelo, que solo se aplican al chat. Consulta [Diferencias entre el servidor MCP y el asistente de IA](#mcp-server-and-ai-assistant-differences). -También puedes usar tu propio agente a través del [servidor MCP](xref:mcp-server), sin clave de API. Un agente como Claude Code, GitHub Copilot, el modo agente de VS Code, Codex o Cursor trabaja sobre el modelo abierto con las mismas herramientas y la misma configuración de permisos que el chat, salvo las autorizaciones de sesión y por modelo, que solo se aplican al chat. Consulta [las diferencias entre el servidor MCP y el Asistente de IA](#mcp-server-and-ai-assistant-differences). -![El panel del Asistente de IA al abrirse por primera vez, con el saludo del asistente que enumera lo que puede hacer (responder preguntas, consultar el modelo, escribir y ejecutar C# Scripts, cambiar el modelo) y lo que no puede hacer, encima de un cuadro de mensajes vacío](~/content/assets/images/ai-assistant/ai-assistant-panel-first-open.png) + +![El panel del Asistente de IA al abrirse por primera vez, con el saludo del asistente que enumera lo que puede hacer (responder a preguntas, consultar el modelo, escribir y ejecutar scripts de C#, cambiar el modelo) y lo que no puede, encima de un cuadro de mensaje vacío](~/content/assets/images/ai-assistant/ai-assistant-panel-first-open.png) ## Primeros pasos -1. Abre **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** -2. Selecciona tu proveedor de IA (en una instalación limpia, el valor predeterminado es **Ninguno (IA deshabilitada)**) y luego introduce tu clave de API -3. Abre el panel del Asistente de IA desde **Vista > Asistente de IA** -4. Escribe mensajes y pulsa **Enter** para iniciar una conversación +1. Abra **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** +2. Seleccione su proveedor de IA (en una instalación nueva, el valor predeterminado es **Ninguno [IA desactivada]**) y, a continuación, introduzca su clave API. +3. Abra el panel del Asistente de IA desde **Vista > Asistente de IA** +4. Escriba un mensaje y pulse **Intro** para iniciar una conversación. > [!TIP] -> La [demo interactiva del Asistente de IA](https://demos.tabulareditor.com/psl/of150vcy?) te guía por la configuración y el uso. +> La [demostración interactiva del asistente de IA](https://demos.tabulareditor.com/psl/of150vcy?) explica cómo configurarlo y usarlo. > [!NOTE] -> Las claves de API se almacenan cifradas en tu equipo local. +> Las claves API se almacenan cifradas en su equipo local. ## Proveedores compatibles -Configura tu proveedor de IA en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA**. Selecciona un proveedor en la lista desplegable (el valor predeterminado es **Ninguno (IA deshabilitada)** hasta que configures uno), introduce tu clave de API y, si lo deseas, reemplaza el modelo predeterminado. +Configure su proveedor de IA en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA**. Seleccione un proveedor en el menú desplegable (el valor predeterminado es **Ninguno (IA desactivada)** hasta que configure uno), introduzca su clave de API y, opcionalmente, anule el modelo predeterminado. -Deja en blanco el campo del modelo para usar el modelo predeterminado del proveedor. OpenAI y Anthropic tienen valores predeterminados; Azure OpenAI y el proveedor personalizado siempre requieren un valor. +Deja el campo del modelo en blanco para usar el modelo predeterminado del proveedor. OpenAI y Anthropic tienen valores predeterminados; Azure OpenAI y el proveedor personalizado siempre necesitan un valor. -| Proveedor | Modelo predeterminado | Configuración necesaria | -| -------------------------------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -| OpenAI | gpt-5.5 | Clave de API. URL base, ID de organización e ID de proyecto opcionales | -| Anthropic | claude-sonnet-4-6 | Clave de API. URL base opcional | -| Azure OpenAI | Ninguno. Se requiere un nombre de implementación | Clave de API, URL del punto de conexión y nombre de la implementación | -| Personalizado (compatible con OpenAI) | Ninguno. Se requiere un nombre de modelo | Clave de API y URL personalizada del punto de conexión | +| Proveedor | Modelo predeterminado | Configuración necesaria | +| -- | -- | -- | +| OpenAI | gpt-5.5 | Clave de API. URL base, ID de organización e ID de proyecto opcionales | +| Anthropic | claude-sonnet-4-6 | Clave de API. URL base opcional | +| Azure OpenAI | Ninguno. Se requiere un nombre de implementación | Clave de API, URL del endpoint y nombre de implementación | +| Personalizado (compatible con OpenAI) | Ninguno. Se requiere un nombre de modelo | Clave de API y URL de endpoint personalizada | -![La página de preferencias del Proveedor de IA con la lista desplegable Elegir proveedor abierta en Ninguno (IA deshabilitada), OpenAI, Anthropic, Azure OpenAI y Personalizado (compatible con OpenAI), y debajo un campo de URL y otro de clave de API](~/content/assets/images/ai-assistant/ai-assistant-provider-preferences.png) +![La página de preferencias del proveedor de IA con el menú desplegable «Elegir proveedor» abierto en «Ninguno» (IA desactivada), «OpenAI», «Anthropic», «Azure OpenAI» y «Personalizado» (compatible con OpenAI), y un campo para la URL y la clave de API debajo](~/content/assets/images/ai-assistant/ai-assistant-provider-preferences.png) ### Elegir un modelo -El modelo activo se muestra en la barra de estado situada encima del cuadro de mensajes, junto a la barra de uso del contexto. Haz clic para abrir un selector con los modelos disponibles para el proveedor configurado; el modelo que elijas se aplicará a partir de la siguiente solicitud. La última entrada, **Preferencias...**, abre **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** para cualquier opción que no aparezca en la lista. Para los proveedores Azure OpenAI y Personalizado, o antes de que se haya recuperado la lista de modelos, el nombre del modelo es un enlace que abre esas preferencias. +El modelo activo se muestra en la barra de estado situada encima del cuadro de mensajes, junto a la barra de uso del contexto. Haz clic en él para abrir un selector que muestra los modelos disponibles para el proveedor configurado; el modelo que elijas se aplicará a partir de la siguiente solicitud. La última entrada, **Preferencias...**, abre **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** para cualquier elemento que no esté en la lista. En el caso de los proveedores Azure OpenAI y Personalizado, o antes de que se haya recuperado la lista de modelos, el nombre del modelo es un enlace que abre dichas preferencias. -![El selector de modelos abierto encima del cuadro de mensajes, con claude-sonnet-5, claude-fable-5-1, claude-fable-5, claude-opus-5, claude-haiku-4-5, claude-opus-4-8 y el claude-sonnet-4-6 activo en negrita, con Preferencias... debajo de un separador](~/content/assets/images/ai-assistant/ui-model-picker.png) +![El selector de modelos abierto encima del cuadro de mensajes, con una lista que incluye claude-sonnet-5, claude-fable-5-1, claude-fable-5, claude-opus-5, claude-haiku-4-5, claude-opus-4-8 y el modelo activo claude-sonnet-4-6 en negrita, con «Preferencias...» debajo de un separador](~/content/assets/images/ai-assistant/ui-model-picker.png) > [!NOTE] -> El indicador de modelo permanece oculto hasta que se hayan configurado un proveedor, una clave de API y un modelo. +> El indicador del modelo permanece oculto hasta que se hayan configurado un proveedor, una clave API y un modelo. ### OpenAI -Selecciona **OpenAI** como proveedor e introduce tu clave de API. Si tu cuenta de OpenAI usa un Organization ID o un Project ID, también debes introducirlos. El nombre del modelo admite cualquier modelo disponible en tu cuenta. +Seleccione **OpenAI** como proveedor e introduzca su clave de API. Si su cuenta de OpenAI utiliza un ID de organización o un ID de proyecto, introdúzcalos también. El nombre del modelo admite cualquier modelo disponible en su cuenta. -![La página de preferencias del Proveedor de IA de una versión anterior, con OpenAI seleccionado, una clave de API oculta, los campos Organization ID y Project ID vacíos y gpt-4o como nombre del modelo](~/content/assets/images/ai-assistant/ai-assistant-openai-config.png) +![La página de preferencias del proveedor de IA de una versión anterior, con OpenAI seleccionado, una clave de API oculta, los campos «ID de organización» e «ID de proyecto» vacíos y «gpt-4o» como nombre del modelo](~/content/assets/images/ai-assistant/ai-assistant-openai-config.png) ### Anthropic -Selecciona **Anthropic** como proveedor e introduce tu clave de API. El nombre del modelo admite cualquier modelo de Anthropic disponible en tu cuenta. +Seleccione **Anthropic** como proveedor e introduzca su clave de API. El nombre del modelo admite cualquier modelo de Anthropic disponible en su cuenta. -![La página de preferencias del Proveedor de IA con Anthropic seleccionado como proveedor, la URL base https://api.anthropic.com, una clave de API oculta y claude-sonnet-4-6 como nombre del modelo](~/content/assets/images/ai-assistant/ai-assistant-anthropic-config.png) +![La página de preferencias del proveedor de IA con Anthropic seleccionado como proveedor, la URL base https://api.anthropic.com, una clave API oculta y claude-sonnet-4-6 como nombre del modelo](~/content/assets/images/ai-assistant/ai-assistant-anthropic-config.png) > [!IMPORTANT] -> Anthropic aplica límites de velocidad de tokens de entrada por minuto (ITPM) en función del nivel de tu cuenta. Una nueva clave de API empieza en el Nivel 1 con 30.000 ITPM para Claude Sonnet 4.x. Una sola solicitud a un modelo grande puede superar este límite. Compra 40 USD o más en créditos de API para alcanzar el Nivel 2 (450.000 ITPM). Consulta la [documentación de límites de velocidad de Anthropic](https://docs.anthropic.com/en/api/rate-limits) para ver todos los detalles de los niveles. +> Anthropic aplica límites de tasa de tokens de entrada por minuto (ITPM) en función del nivel de tu cuenta. Una nueva clave de API comienza en el nivel 1 con 30 000 ITPM para Claude Sonnet 4.x. Una sola solicitud a un modelo grande puede superar este límite. Compra 40 $ o más en créditos de API para alcanzar el nivel 2 (450 000 ITPM). Consulta la [documentación sobre los límites de tasa de Anthropic](https://docs.anthropic.com/en/api/rate-limits) para obtener todos los detalles de los niveles. ### Azure OpenAI -Selecciona **Azure OpenAI** como proveedor y configura estos campos: +Seleccione **Azure OpenAI** como proveedor y configure estos campos: -- **Clave de API**: la clave de acceso de tu recurso de Azure OpenAI -- **Service endpoint**: la URL del recurso, por ejemplo `https://your-resource.openai.azure.com`. El certificado SSL se emite para `*.openai.azure.com`, por lo que una dirección `*.privatelink.openai.azure.com` no supera la validación del certificado -- **Deployment**: el nombre de la implementación que se muestra en la columna **Name** de **Deployments** +- **Clave de API**: la clave de acceso a tu recurso de Azure OpenAI +- **Punto de conexión del servicio**: la URL del recurso, por ejemplo, `https://your-resource.openai.azure.com`. El certificado SSL se emite para «*.openai.azure.com», por lo que una dirección «*.privatelink.openai.azure.com» no supera la validación del certificado. +- **Implementación**: el nombre de la implementación que se muestra en la columna **Nombre** de **Implementaciones** -Azure OpenAI requiere el nombre de la implementación en cada llamada a la API. El nombre se establece al crear la implementación y a menudo coincide con el modelo que sirve, por ejemplo `gpt-4o`, pero puede ser distinto. Si introduces el nombre del recurso o un nombre de modelo que no exista como implementación, la solicitud fallará. +Azure OpenAI requiere el nombre de la implementación en cada llamada a la API. El nombre se establece cuando se crea la implementación y, a menudo, coincide con el modelo al que sirve, por ejemplo, «gpt-4o», pero puede ser diferente. Si introduce el nombre del recurso o un nombre de modelo que no existe como implementación, la solicitud fallará. -Busca el nombre de la implementación en el [portal de Azure AI Foundry](https://ai.azure.com): +Encuentra el nombre de la implementación en el [portal de Azure AI Foundry](https://ai.azure.com): -1. Inicia sesión y selecciona tu recurso de Azure OpenAI -2. Abre **Implementaciones** (o **Modelos + puntos de conexión** si el recurso se ha actualizado a Foundry) -3. Copia el valor de la columna **Nombre** +1. Inicie sesión y seleccione su recurso de Azure OpenAI. +2. Abra **Implementaciones** (o **Modelos + puntos de conexión** si el recurso se ha actualizado a Foundry). +3. Copie el valor de la columna **Nombre**. -Si una implementación creada antes de que tu organización adoptara Azure AI Foundry no aparece en el portal, usa Azure CLI para enumerar las implementaciones: +Si una implementación creada antes de que su organización adoptara Azure AI Foundry no aparece en el portal, enumere las implementaciones con la CLI de Azure: ```bash az cognitiveservices account deployment list --name "" --resource-group "" --output table ``` -Consulta [Crear y desplegar un recurso de Azure OpenAI](https://learn.microsoft.com/azure/ai-foundry/openai/how-to/create-resource#deploy-a-model). +Consulte [Crear e implementar un recurso de Azure OpenAI](https://learn.microsoft.com/azure/ai-foundry/openai/how-to/create-resource#deploy-a-model). -Para errores 403, fallos de SSL o respuestas "DeploymentNotFound", consulta @azure-openai-connection-errors. Para los modelos implementados en Microsoft Foundry, consulta [Uso de Microsoft Foundry](#using-microsoft-foundry). +Para errores 403, fallos de SSL o respuestas «DeploymentNotFound», consulte @azure-openai-connection-errors. Para los modelos implementados en Microsoft Foundry, consulta [Uso de Microsoft Foundry](#using-microsoft-foundry). ### Personalizado (compatible con OpenAI) -El proveedor personalizado se conecta a cualquier LLM que exponga un punto de conexión de API compatible con OpenAI, como un modelo en tu propia máquina o alojado en la red de tu organización. Introduce tu clave de API y la URL del punto de conexión. Con un modelo autoalojado, todos los datos permanecen dentro de tu propia infraestructura y no se envía nada a un proveedor de nube de terceros. Consulta [Uso de un LLM local o de la organización](#using-a-local-or-organizational-llm). +El proveedor personalizado se conecta a cualquier LLM que exponga un punto de conexión de API compatible con OpenAI, como un modelo en tu propio equipo o uno alojado en la red de tu organización. Introduzca su clave de API y la URL del punto de conexión. Con un modelo autoalojado, todos los datos permanecen dentro de su propia infraestructura y no se envía nada a un proveedor de nube externo. Consulte [Uso de un LLM local u organizativo](#using-a-local-or-organizational-llm). -## Uso de un LLM local o de tu organización +## Uso de un LLM local o de la organización -Puedes ejecutar el Asistente de IA con un LLM autoalojado mediante el proveedor Personalizado. Esto mantiene todos los datos dentro de tu propia infraestructura, ya sea un modelo que se ejecuta en tu equipo local o un LLM alojado de forma centralizada dentro de la red de tu organización. En cualquier caso, no se envía ningún dato a un proveedor de nube de terceros. -Estas herramientas alojan modelos con una API compatible con OpenAI, en la estación de trabajo de un desarrollador o en un servidor compartido que actúa como punto de conexión del equipo: +Puedes ejecutar el Asistente de IA con un LLM autoalojado utilizando el proveedor personalizado. De este modo, todos los datos permanecen dentro de su propia infraestructura, ya sea un modelo que se ejecute en su equipo local o un LLM alojado de forma centralizada en la red de su organización. En cualquier caso, no se envían datos a un proveedor de nube externo. +Estas herramientas alojan modelos con una API compatible con OpenAI, en la estación de trabajo de un desarrollador o en un servidor compartido que sirve como endpoint para el equipo: - [Ollama](https://ollama.com): CLI ligera para descargar y ejecutar modelos localmente -- [LM Studio](https://lmstudio.ai): aplicación de escritorio con interfaz gráfica para administrar y ejecutar modelos locales -- [LocalAI](https://localai.io): alternativa autoalojada e impulsada por la comunidad, con amplio soporte para modelos +- [LM Studio](https://lmstudio.ai): aplicación de escritorio con una interfaz gráfica para gestionar y ejecutar modelos locales +- [LocalAI](https://localai.io): alternativa autoalojada e impulsada por la comunidad con amplia compatibilidad con modelos ### Ejemplo: Ollama 1. [Descarga e instala Ollama](https://ollama.com/download) -2. Descarga un modelo, por ejemplo `ollama pull llama3.1` -3. Inicia el servidor de Ollama. Se inicia automáticamente después de la instalación y, de forma predeterminada, usa el puerto 11434 -4. En Tabular Editor, ve a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** -5. Configura **Elegir proveedor** como **Personalizado (compatible con OpenAI)** -6. Establece **Punto de conexión del servicio** en `http://localhost:11434/v1` -7. Establece **Model name** en el modelo que descargaste, por ejemplo `llama3.1` -8. Configura **API Key** con cualquier valor no vacío, por ejemplo `ollama`. Ollama no requiere autenticación, pero el campo no puede quedar en blanco +2. Extraiga un modelo, por ejemplo, «ollama pull llama3.1». +3. Inicie el servidor de Ollama. Se inicia automáticamente después de la instalación, de forma predeterminada en el puerto 11434. +4. En Tabular Editor, vaya a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** +5. Establezca **Elegir proveedor** en **Personalizado (compatible con OpenAI)** +6. Establezca **Punto de conexión del servicio** en `http://localhost:11434/v1` +7. Establezca **Nombre del modelo** como el modelo que ha extraído, por ejemplo, `llama3.1`. +8. Establezca **Clave de API** en cualquier valor que no esté vacío, por ejemplo, «ollama». Ollama no requiere autenticación, pero el campo no puede estar en blanco. ### Ejemplo: LM Studio 1. [Descarga e instala LM Studio](https://lmstudio.ai/download) -2. Descarga un modelo desde la página de búsqueda de modelos del panel izquierdo o con la CLI, por ejemplo `lms get lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` -3. Inicia el servidor de LM Studio desde la página para desarrolladores del panel izquierdo o con `lms server start`. Activa el modo compatible con OpenAI. Si el tamaño del contexto es inferior a 100.000 tokens, súbelo por encima de 100.000 -4. En Tabular Editor, ve a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** -5. Configura **Elegir proveedor** como **Personalizado (compatible con OpenAI)** -6. Establece **Punto de conexión del servicio** en `http://localhost:1234/v1` -7. Establece **Nombre del modelo** en el modelo que descargaste, por ejemplo `lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` -8. En **Clave de API**, introduce cualquier valor no vacío, por ejemplo `lms`. LM Studio no requiere autenticación, pero el campo no puede quedar en blanco +2. Descargue un modelo desde la página de búsqueda de modelos del panel izquierdo o con la CLI; por ejemplo, `lms get lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` +3. Inicie el servidor de LM Studio desde la página de desarrolladores del panel izquierdo o con `lms server start`. Active el modo compatible con OpenAI. Si el tamaño del contexto es inferior a 100 000 tokens, auméntalo por encima de 100 000. +4. En Tabular Editor, vaya a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** +5. Establezca **Elegir proveedor** en **Personalizado (compatible con OpenAI)**. +6. Establezca **Punto de conexión del servicio** en `http://localhost:1234/v1` +7. Establezca **Nombre del modelo** como el modelo que descargó, por ejemplo, `lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` +8. Establezca **Clave de API** en cualquier valor que no esté vacío, por ejemplo, `lms`. LM Studio no requiere autenticación, pero el campo no puede estar en blanco. + > [!NOTE] -> La calidad de las respuestas con modelos locales depende del tamaño del modelo y de tu hardware. Los modelos más grandes suelen ofrecer mejores resultados, pero requieren más RAM y una GPU potente. La invocación de herramientas del Asistente de IA requiere un modelo que admita la llamada a funciones en el formato compatible con OpenAI. +> La calidad de las respuestas con modelos locales depende del tamaño del modelo y de tu hardware. Los modelos más grandes dan mejores resultados y necesitan más RAM y una GPU potente. La llamada a herramientas del asistente de IA requiere un modelo que admita la llamada a funciones en el formato compatible con OpenAI. > [!TIP] -> Usa un modelo con al menos 30 mil millones de parámetros y, preferiblemente, 100 mil millones o más. Qwen3.5-122B-A10B funcionó bien en pruebas internas. +> Utilice un modelo con al menos 30 000 millones de parámetros y, preferiblemente, 100 000 millones o más. Qwen3.5-122B-A10B obtuvo buenos resultados en las pruebas internas. ## Uso de Microsoft Foundry -[Microsoft Foundry](https://ai.azure.com) (antes llamado Azure AI Foundry) te permite desplegar modelos de OpenAI y Anthropic en tu entorno de Azure. Conéctate a estos modelos con el proveedor **OpenAI** o **Anthropic** en Tabular Editor. +[Microsoft Foundry](https://ai.azure.com) (anteriormente Azure AI Foundry) implementa modelos de OpenAI y Anthropic en tu entorno de Azure. Conéctate a estos modelos con el proveedor **OpenAI** o **Anthropic** en Tabular Editor. > [!IMPORTANT] -> No uses el proveedor **Azure OpenAI** para modelos de Microsoft Foundry. Solo funciona con recursos clásicos de Azure OpenAI que usan el parámetro de consulta `api-version`. +> No utilice el proveedor **Azure OpenAI** para los modelos de Microsoft Foundry. Solo funciona con los recursos clásicos de Azure OpenAI que usan el parámetro de consulta `api-version`. ### Modelos de OpenAI en Microsoft Foundry -Configura un modelo de OpenAI desplegado en Microsoft Foundry, como GPT-4o o GPT-5.4-mini: +Configura un modelo de OpenAI implementado en Microsoft Foundry, como GPT-4o o GPT-5.4-mini: -1. En Tabular Editor, ve a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** -2. Selecciona **OpenAI** en **Elegir proveedor** -3. En **URL base**, introduce el punto de conexión de tu recurso de Foundry y añade `/openai/v1` al final, en uno de estos formatos: +1. En Tabular Editor, vaya a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** +2. Establezca **Elegir proveedor** en **OpenAI**. +3. Establezca la **URL base** en el punto de conexión de su recurso de Foundry con `/openai/v1` añadido, en uno de estos formatos: - `https://your-resource.services.ai.azure.com/openai/v1` - `https://your-resource.openai.azure.com/openai/v1` -4. Introduce tu **Clave de API** de Foundry -5. En **Nombre del modelo**, introduce el nombre de tu implementación, por ejemplo `gpt-5.4-mini` +4. Introduzca su **clave de API** de Foundry. +5. Establece **Nombre del modelo** como el nombre de tu implementación, por ejemplo, «gpt-5.4-mini». > [!NOTE] -> El portal de Microsoft Foundry no muestra la URL base. En su lugar, muestra un **URI de destino** con la ruta completa de la API, por ejemplo `https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses`. Para la URL base, usa solo `https://your-resource.services.ai.azure.com/openai/v1`. +> El portal de Microsoft Foundry no muestra la URL base. Muestra un **URI de destino** con la ruta completa de la API, por ejemplo, «https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses». Para la URL base, use solo `https://your-resource.services.ai.azure.com/openai/v1`. ### Modelos de Anthropic en Microsoft Foundry -Para un modelo de Anthropic desplegado en Microsoft Foundry, como Claude Sonnet 4.6: +Para un modelo de Anthropic implementado en Microsoft Foundry, como Claude Sonnet 4.6: -1. En Tabular Editor, ve a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** -2. Configura **Elegir proveedor** como **Anthropic** -3. En **URL base**, introduce el punto de conexión de tu recurso de Foundry y añade `/anthropic` al final, por ejemplo `https://your-resource.services.ai.azure.com/anthropic` -4. Introduce tu **Clave de API** de Foundry -5. En **Nombre del modelo**, introduce el identificador del modelo, por ejemplo `claude-sonnet-4-6` +1. En Tabular Editor, vaya a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** +2. Establezca **Elegir proveedor** en **Anthropic**. +3. Establezca la **URL base** como el punto de conexión de su recurso de Foundry con `/anthropic` añadido, por ejemplo, `https://your-resource.services.ai.azure.com/anthropic` +4. Introduzca su **clave de API** de Foundry. +5. Establezca **Nombre del modelo** como el identificador del modelo, por ejemplo, `claude-sonnet-4-6` > [!NOTE] -> El portal muestra un **URI de destino** como `https://your-resource.services.ai.azure.com/anthropic/v1/messages`. Para la URL base, usa solo la parte hasta `/anthropic` inclusive. +> El portal muestra un **URI de destino** como `https://your-resource.services.ai.azure.com/anthropic/v1/messages`. Para la URL base, usa la parte hasta e incluyendo `/anthropic`. -## Capacidades +## Funcionalidades -En el marco de tus [concesiones de permisos](#permissions-and-consent), el Asistente de IA trabaja con el contexto de tu modelo: +Dentro de tus [concesiones de permisos](#permissions-and-consent), el Asistente de IA trabaja con el contexto de tu modelo: -- **Exploración del modelo**: consulta los metadatos del modelo, incluidas tablas, columnas, medidas, relaciones y sus propiedades -- **Redacción de consultas DAX**: genera consultas DAX, las ejecuta en tu modelo en modo conectado y devuelve los conjuntos de resultados en el chat -- **Generación de C# Scripts**: crea C# Scripts para realizar cambios en el modelo. Según tu configuración, el asistente abre el script en una ventana del editor para que lo ejecutes, o lo ejecuta él mismo; consulta [Permitir que el asistente cambie tu modelo](#letting-the-assistant-change-your-model) -- **Best Practice Analyzer**: ejecuta el análisis de BPA, lista las infracciones de las reglas y crea o modifica reglas de BPA -- **Analizador VertiPaq**: consulta estadísticas de uso de memoria y cardinalidad de columnas -- **Acceso a documentos**: lee y modifica documentos abiertos: consultas DAX, C# Scripts y scripts DAX -- **Búsqueda en la base de conocimientos**: busca en la documentación integrada de Tabular Editor -- **Navegación por la interfaz de usuario**: genera enlaces de acción `te3://` que abren cuadros de diálogo y funcionalidades específicas de Tabular Editor +- **Exploración del modelo**: consulta los metadatos del modelo, incluidas las tablas, las columnas, las medidas, las relaciones y sus propiedades. +- **Escritura de consultas DAX**: genera consultas DAX, las ejecuta en su modelo conectado y devuelve los conjuntos de resultados en el chat. +- **Generación de scripts de C#**: crea scripts de C# para los cambios en el modelo. Dependiendo de su configuración, el asistente abre el script en una ventana del editor para que lo ejecute usted o lo ejecuta él mismo; consulte [Permitir que el asistente cambie su modelo](#letting-the-assistant-change-your-model) +- **Best Practice Analyzer**: ejecuta análisis BPA, enumera las infracciones de las reglas y crea o modifica reglas BPA. +- **Analizador VertiPaq**: consulta las estadísticas de uso de la memoria y la cardinalidad de las columnas. +- **Errores del modelo**: enumera los errores, las advertencias y los mensajes de Analysis Services del modelo, los mismos que muestra la [vista Mensajes](xref:messages-view), con las causas raíz en primer lugar. Se informa al asistente cuando cambian los errores del modelo. +- **Acceso a documentos**: lee y modifica consultas DAX abiertas, scripts de C# y scripts DAX, y lee los errores y advertencias de todos los documentos abiertos, incluidas las Pivot Grids. El documento activo forma parte del contexto del asistente, por lo que puede preguntar «¿Por qué veo este error en esta consulta?». No puede leer ni cambiar la estructura de un Pivot Grid. +- **Búsqueda en la base de conocimientos**: busca en la documentación integrada de Tabular Editor. +- **Navegación por la interfaz de usuario**: genera enlaces de acción «te3://» que abren cuadros de diálogo y funciones específicos de Tabular Editor. -Un agente conectado a través del [servidor MCP](xref:mcp-server) tiene las mismas capacidades, excepto la navegación por la interfaz de usuario. Ambos cambian tu modelo ejecutando un C# Script como un único paso que se puede deshacer. Se diferencian en cómo revisas los cambios y otorgas permisos; consulta [Diferencias entre el servidor MCP y AI Assistant](#mcp-server-and-ai-assistant-differences). +Un agente conectado a través del [servidor MCP](xref:mcp-server) tiene las mismas capacidades, excepto la navegación por la interfaz de usuario. Ambos cambian su modelo ejecutando un script de C# como un único paso que se puede deshacer. Difieren en la forma de revisar los cambios y conceder permisos; consulta [Diferencias entre el servidor MCP y el asistente de IA](#mcp-server-and-ai-assistant-differences). > [!NOTE] -> Cuando el modelo se carga desde un archivo, como un archivo `.bim` o una carpeta TMDL, y no está conectado a Analysis Services o Power BI, se ocultan las herramientas que requieren conexión, como la ejecución de consultas DAX y las estadísticas del Analizador VertiPaq. El asistente sigue escribiendo consultas DAX, pero el botón **Ejecutar** de los artefactos de consulta DAX está desactivado hasta que te conectes. Las estadísticas del Analizador VertiPaq cargadas desde un archivo `.vpax` siguen disponibles. +> Cuando el modelo se carga desde un archivo, como un archivo `.bim` o una carpeta TMDL, y no está conectado a Analysis Services o Power BI, las herramientas que necesitan una conexión permanecen ocultas, incluidas la ejecución de consultas DAX y las estadísticas de VertiPaq Analyzer. El asistente sigue escribiendo consultas DAX, pero la opción **Ejecutar** en los artefactos de consultas DAX está deshabilitada hasta que se conecte. Las estadísticas del Analizador VertiPaq cargadas desde un archivo `.vpax` siguen estando disponibles. ## Permitir que el asistente cambie tu modelo -De forma predeterminada, el asistente escribe un C# Script y lo abre en una ventana del editor, donde puedes leerlo y ejecutarlo. El asistente también puede ejecutar el script por sí mismo cuando seleccionas **Permitir que AI Assistant ejecute C# Scripts directamente** en **Herramientas > Preferencias > Funciones de IA > AI Assistant > Preferencias**. +De forma predeterminada, el asistente escribe un script de C# y lo abre en una ventana del editor, donde puedes leerlo y ejecutarlo. También puede ejecutar el script por sí mismo si selecciona **Permitir que el asistente de IA ejecute scripts de C# directamente** en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Preferencias**. -La configuración está desactivada de forma predeterminada y no está disponible hasta que **Metadatos del modelo** esté establecido en **Lectura/escritura** en **Herramientas > Preferencias > Funciones de IA > Permisos**. +El ajuste está desactivado de forma predeterminada y no está disponible hasta que **Metadatos del modelo** se establezca en **Lectura/Escritura** en **Herramientas > Preferencias > Funciones de IA > Permisos**. -### Qué ocurre cuando el asistente ejecuta un script +### ¿Qué sucede cuando el asistente ejecuta un script? -- Si **Vista previa de cambios** está activada (de forma predeterminada), aparece el [cuadro de diálogo de vista previa](xref:csharp-scripts#run-c-scripts-with-preview) antes de que se apliquen los cambios. **Cancelar** revierte los cambios y envía un Report del rechazo al asistente. Si **Vista previa de cambios** está desactivada, los cambios se aplican sin mostrar ningún cuadro de diálogo. -- Los cambios del script quedan registrados como una única entrada de deshacer: **C# script (AI Assistant)**. El foco permanece en el cuadro de chat, donde **Ctrl+Z** no deshace los cambios del modelo. Para deshacer el C# Script completo, haz clic en el Explorador TOM y pulsa **Ctrl+Z**, o selecciona **Deshacer C# Script (Asistente de IA)** en el menú **Editar**. -- Si el script falla a mitad de la ejecución, el modelo no se modifica y el asistente genera un Report del error. -- No se ejecuta ningún script que acceda a archivos, la red o ensamblados externos. Se abre como un artefacto de script con la insignia **Inseguro** y **Ejecutar** deshabilitado, y la respuesta del asistente indica qué utilizaba el script. +- Si la opción **Vista previa de los cambios** está activada (valor predeterminado), el [cuadro de diálogo de vista previa](xref:csharp-scripts#run-c-scripts-with-preview) aparece antes de que se apliquen los cambios. **Cancelar** los revierte y comunica el rechazo al asistente. Si la opción **Vista previa de los cambios** está desactivada, los cambios se aplican sin que aparezca ningún cuadro de diálogo. +- Los cambios del script constituyen una sola entrada de deshacer, **Script de C# (Asistente de IA)**. El foco permanece en el cuadro de chat, donde **Ctrl+Z** no deshace los cambios en el modelo. Para deshacer todo el script, haga clic en el Explorador TOM y pulse **Ctrl+Z**, o seleccione **Deshacer script C# (Asistente de IA)** en el menú **Editar**. +- Si el script falla a mitad de camino, el modelo no se modifica y el asistente informa del error. +- Si el script se ejecuta correctamente e introduce o resuelve errores DAX, el asistente recibe una lista de esos errores, agrupados por causa raíz. +- Un script que accede a archivos, a la red o a ensamblados externos no se ejecuta. Se abre como un artefacto de script con una insignia de **Inseguro** y la opción **Ejecutar** desactivada, y la respuesta del asistente indica lo que ha utilizado el script. -Si pides un script, por ejemplo: "Escríbeme un script que cambie el nombre de todas las medidas a estilo oración", el asistente lo abre como un documento de script que ejecutas tú mismo, incluso con esta configuración activada. +Si solicita un script, por ejemplo, «Escríbeme un script que cambie el nombre de todas las medidas a mayúscula inicial», el asistente lo abrirá como un documento de script que usted mismo ejecutará, incluso con esta configuración activada. -La [directiva](xref:policies) `DisableCSharpScripts` se aplica en todas las ediciones y desactiva tanto la ejecución directa como los scripts que el asistente te proporciona para que los ejecutes. +La [política](xref:policies) `DisableCSharpScripts` se aplica en todas las ediciones y desactiva tanto la ejecución directa como los scripts que el asistente le proporciona para que los ejecute. -La directiva `BlockUnsafeScripts` requiere la Edición Enterprise y se aplica a todos los scripts de Tabular Editor, incluidos los scripts ejecutados a través del [servidor MCP](xref:mcp-server). Cuando está activada, el asistente aún puede escribir un script que acceda a archivos, a la red o a ensamblados externos, pero el script no se ejecuta y no se abre ningún artefacto para revisarlo. Consulta [Directivas de administrador](xref:csharp-scripts#administrator-policies). +La política `BlockUnsafeScripts` requiere la Edición Enterprise y se aplica a todas las secuencias de comandos de Tabular Editor, incluidas las secuencias de comandos que se ejecutan a través del [servidor MCP](xref:mcp-server). Cuando está activada, el asistente aún puede escribir un script que acceda a archivos, a la red o a ensamblados externos, pero el script no se ejecuta y no se abre ningún artefacto para su revisión. Consulte [Políticas del administrador](xref:csharp-scripts#administrator-policies). ## Conversaciones -El Asistente de IA admite varias conversaciones simultáneas, cada una con su propio historial de mensajes y contexto. +El asistente de IA admite varias conversaciones simultáneas, cada una con su propio historial de mensajes y contexto. -- las conversaciones se conservan entre sesiones y se almacenan localmente en `%LocalAppData%\TabularEditor3\AI\Conversations\` -- los títulos se generan automáticamente tras el primer intercambio, y puedes cambiar el nombre de una conversación -- **Compactación automática**: cuando una conversación se acerca al límite de la ventana de contexto, los mensajes más antiguos se resumen para liberar espacio, después de archivar una instantánea de la conversación completa. El umbral es un porcentaje de la propia ventana de contexto del modelo y se configura en [Compactación del contexto](#context-compaction) +- Las conversaciones se mantienen entre sesiones y se almacenan localmente en `%LocalAppData%\TabularEditor3\AI\Conversations\` +- Los títulos se generan automáticamente después del primer intercambio, y puedes cambiar el nombre de una conversación. +- **Compactación automática**: cuando una conversación se acerca al límite de la ventana de contexto, los mensajes más antiguos se resumen para liberar espacio, después de archivar una instantánea de la conversación completa. El umbral es un porcentaje de la propia ventana de contexto del modelo, establecido en [Compactación del contexto](#context-compaction). ### Eliminar una conversación -**Eliminar conversación** está en el extremo izquierdo de la barra de herramientas del Asistente de IA, junto a **Nueva conversación**. Después de confirmar la solicitud, la conversación y su historial se eliminan del disco y no se pueden recuperar. El botón de cierre de la barra de título del panel, o **Ver > Asistente de IA**, oculta el panel sin eliminar nada. +**Eliminar conversación** se encuentra en el extremo izquierdo de la barra de herramientas del Asistente de IA, junto a **Nueva conversación**. Después de confirmar el mensaje, la conversación y su historial se eliminan del disco y no se pueden recuperar. El botón de cerrar de la barra de título del panel, o **Ver > Asistente de IA**, oculta el panel sin eliminar nada. ## Artefactos -El código que genera el Asistente de IA se abre como un _artefacto_ en una ventana del editor: +El código que genera el asistente de IA se abre como un *artefacto* en una ventana del editor: -- **Scripts de C#**: un editor de C# Script con resaltado de sintaxis, compilación y ejecución +- **Scripts de C#**: un editor de scripts de C# con resaltado de sintaxis, compilación y ejecución - **Consultas DAX**: un editor de consultas DAX con resaltado de sintaxis y ejecución -Los artefactos se van mostrando a medida que la IA los genera, y los artefactos de C# Script incluyen un análisis de seguridad que señala el código inseguro, como el acceso al sistema de archivos o las operaciones de red. +Los artefactos van llegando a medida que la IA los genera, y los artefactos de C# Script incluyen un análisis de seguridad que señala el código no seguro, como el acceso al sistema de archivos o las operaciones de red. -![El panel de AI Assistant muestra un artefacto de C# Script generado con un botón Execute y la explicación del asistente sobre lo que hace el script, además de la advertencia sobre la distinción entre mayúsculas y minúsculas](~/content/assets/images/ai-assistant/ai-assistant-generate-c-sharp-script.png) +![El panel del Asistente de IA muestra un artefacto de C# Script generado con un botón «Ejecutar» y la explicación del asistente sobre lo que hace el script y la advertencia sobre la distinción entre mayúsculas y minúsculas que lo acompaña](~/content/assets/images/ai-assistant/ai-assistant-generate-c-sharp-script.png) -Si **Vista previa de cambios** está activada, al ejecutar un C# Script desde el chat se abre el cuadro de diálogo **Vista previa del script** con una comparación en paralelo de todos los cambios en los metadatos del modelo que realizó el script, donde puedes aceptar o revertir los cambios. Consulta [Ejecutar scripts con vista previa](xref:csharp-scripts#run-c-scripts-with-preview). +Si la opción **Vista previa de los cambios** está activada, al ejecutar un C# Script desde el chat se abrirá el cuadro de diálogo **Vista previa del script** con una comparación en paralelo de todos los cambios en los metadatos del modelo realizados por el script, donde podrás aceptar o revertir los cambios. Consulte [Ejecución de scripts con vista previa](xref:csharp-scripts#run-c-scripts-with-preview). -![El cuadro de diálogo Vista previa del script: cambios en el modelo, con el modelo antes y después uno junto al otro, con la cadena de formato de la medida Internet Total Freight modificada y con una descripción y una carpeta de visualización añadidas, cada una marcada respecto de su valor original](~/content/assets/images/preview-script-changes.png) +![El cuadro de diálogo Vista previa del script - Cambios en el modelo, el modelo antes y después uno al lado del otro, con la cadena de formato de la medida «Internet Total Freight» modificada y una descripción y una carpeta de visualización añadidas, cada una marcada en comparación con su versión original](~/content/assets/images/preview-script-changes.png) ## Instrucciones personalizadas -Las _instrucciones personalizadas_ son conjuntos de instrucciones que guían al Asistente de IA en tareas específicas. El asistente recibe una lista de todas las instrucciones disponibles con su `description`, y carga el texto completo solo de las que son relevantes para tu solicitud, así que procura que las descripciones sean precisas y específicas. Una instrucción cargada sigue en vigor durante el resto de la conversación. +Las *instrucciones personalizadas* son conjuntos de instrucciones que guían al asistente de IA en tareas específicas. El asistente recibe una lista de todas las instrucciones disponibles con su «descripción» y carga el texto completo solo de aquellas que sean relevantes para tu solicitud, así que procura que las descripciones sean precisas y específicas. Una instrucción cargada permanece vigente durante el resto de la conversación. ### Instrucciones personalizadas integradas -El Asistente de IA incluye las siguientes instrucciones personalizadas: +El asistente de IA incluye estas instrucciones personalizadas: -| Instrucción personalizada | Invocar con | Cubre | -| -------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Consulta DAX | `/dax-querying` | Escritura y ejecución de consultas DAX: referencias completas de columnas y medidas, comprobación de valores de filtro, validación y actualización de consultas | -| Modificación del modelo | `/model-modification` | C# Scripts para crear o cambiar objetos del modelo: patrones de la API de TOMWrapper, orden de ejecución, actualizaciones idempotentes, reglas de nomenclatura | -| Diseño del modelo semántico | `/model-design` | Esquema en estrella, relaciones y filtrado cruzado, tablas de fechas, medidas frente a columnas calculadas, grupos de cálculo, nomenclatura | -| Organización del modelo semántico | `/organize-model` | Auditoría y limpieza de los metadatos del modelo: convenciones de nomenclatura, grupos de tablas, carpetas de visualización, columnas ocultas, cadenas de formato, descripciones | -| Optimización del tamaño del modelo semántico | `/optimize-model` | Reducción de la memoria y del tamaño del modelo: medida de VertiPaq, eliminación de columnas, ajuste de tipos de datos, cambios estructurales, límites de SKU | -| Macros | `/macros` | Macros de C# reutilizables para la ventana de macros: contextos de selección, reglas de código genérico | -| Funciones DAX definidas por el usuario | `/udf` | Creación de UDFs de DAX: sintaxis, modos de parámetro `VAL`/`EXPR`, sugerencias de tipo, espacios de nombres, DaxLib | -| Best Practice Analyzer | `/bpa` | Revisión de infracciones y creación de reglas personalizadas mediante expresiones de LINQ Dynamic | +| Instrucción personalizada | Invocar con | Abarca | +| -- | -- | -- | +| Consultas DAX | `/dax-querying` | Escritura y ejecución de consultas DAX: calificación de columnas y medidas, verificación de valores de filtro, validación y actualización de consultas | +| Modificación del modelo | `/model-modification` | Scripts de C# que crean o cambian objetos del modelo: patrones de la API TOMWrapper, orden de ejecución, actualizaciones idempotentes, reglas de nomenclatura | +| Diseño de modelos semánticos | `/model-design` | Esquema estrella, relaciones y filtrado cruzado, tablas de fechas, medidas frente a columnas calculadas, grupos de cálculo, nomenclatura | +| Organización del modelo semántico | `/organize-model` | Auditoría y ordenación de los metadatos del modelo: convenciones de nomenclatura, grupos de tablas, carpetas de visualización, columnas ocultas, cadenas de formato, descripciones | +| Optimización del tamaño del modelo semántico | `/optimize-model` | Reducción de la memoria y el tamaño del modelo: medición de VertiPaq, eliminación de columnas, ajuste de tipos de datos, cambios estructurales, límites de SKU | +| Macros | `/macros` | Macros de C# reutilizables para la ventana Macros: contextos de selección, reglas de código genérico | +| Funciones definidas por el usuario de DAX | `/udf` | Escritura de UDF de DAX: sintaxis, modos de parámetros `VAL`/`EXPR`, sugerencias de tipo, espacios de nombres, DaxLib | +| Best Practice Analyzer | `/bpa` | Revisión de infracciones y redacción de reglas personalizadas como expresiones LINQ Dynamic | -Con la preferencia **Mostrar indicador de instrucciones personalizadas** seleccionada en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Preferencias**, los indicadores situados encima de cada respuesta muestran qué instrucciones influyeron en ella. +Con la opción **Mostrar indicador de instrucciones personalizadas** seleccionada en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Preferencias**, los indicadores situados encima de cada respuesta muestran qué instrucciones la han influido. ### Invocar una instrucción personalizada -Escribe `/` para ver las instrucciones personalizadas disponibles. Empieza tus mensajes con el `/id` de una instrucción para cargarla independientemente del contenido de los mensajes; por ejemplo, `/dax-querying` carga la instrucción de consulta DAX. Un `/id` sin mensajes carga la instrucción sin enviar ninguna solicitud. Una instrucción cargada explícitamente sigue en vigor durante el resto de la conversación, igual que una que el asistente carga por sí solo. +Escriba `/` para ver las instrucciones personalizadas disponibles. Comience su mensaje con el `/id` de una instrucción para cargarla independientemente del contenido del mensaje; por ejemplo, `/dax-querying` carga la instrucción de consulta DAX. Un `/id` sin mensaje carga la instrucción sin realizar una solicitud. Una instrucción cargada explícitamente permanece vigente durante el resto de la conversación, al igual que una que el asistente carga por sí mismo. -### Añade tus propias instrucciones personalizadas +### Añadir sus propias instrucciones personalizadas -Crea una instrucción personalizada colocando un archivo `.md` en `%LocalAppData%\TabularEditor3\AI\CustomInstructions\`. La carpeta se crea la primera vez que se ejecuta el Asistente de IA, con un archivo `example.md` que puedes usar como base. La opción **Abrir carpeta de instrucciones personalizadas** en la barra de herramientas del Asistente de IA la abre. +Cree una instrucción personalizada colocando un archivo `.md` en `%LocalAppData%\TabularEditor3\AI\CustomInstructions\`. La carpeta se crea la primera vez que se ejecuta el asistente de IA, con un archivo «example.md» en ella para copiarlo. **Abrir carpeta de instrucciones personalizadas** en la barra de herramientas del Asistente de IA la abre. -El front matter en YAML que define los metadatos de la instrucción es opcional: +El encabezado YAML que define los metadatos de la instrucción es opcional: ```yaml --- @@ -291,202 +295,202 @@ Your instruction content goes here. This is the text that will be injected into the AI's system prompt when the instruction is activated. ``` -| Campo | Obligatorio | Predeterminado | Descripción | -| --------------- | ----------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| `id` | No | Nombre de archivo sin `.md` | Identificador único; también se usa como `/id` para la invocación explícita | -| `name` | No | `id` con mayúsculas iniciales | Nombre para mostrar en el autocompletado | -| `description` | No | Si no se especifica, se usa `name` | Indica qué cubre la instrucción y cuándo se aplica | -| `priority` | No | 100 | Los valores más altos se inyectan primero cuando hay varias instrucciones personalizadas en vigor | -| `always_inject` | No | false | Si es `true`, siempre se incluye en el prompt del sistema. Este tipo de instrucción no aparece en el autocompletado de `/.` | -| `hidden` | No | false | Si es `true`, no se muestra en el autocompletado de `/command` | +| Campo | Obligatorio | Predeterminado | Descripción | +| -- | -- | -- | -- | +| `id` | No | Nombre de archivo sin `.md` | Identificador único, también utilizado como `/id` para la invocación explícita | +| `name` | No | `id` con mayúscula inicial | Nombre que se muestra en el autocompletado | +| `description` | No | Se recurre a `name` | Indica qué abarca la instrucción y cuándo se aplica | +| `priority` | No | 100 | Los valores más altos se inyectan primero cuando hay varias instrucciones personalizadas activas | +| `always_inject` | No | false | Si es true, se incluye siempre en el «prompt» del sistema. Esta instrucción no se ofrece en el autocompletado `/` | +| `hidden` | No | false | Si es true, no se muestra en el autocompletado de `/command` | -Una instrucción personalizada cuyo `id` coincide con el de una instrucción integrada sustituye la versión integrada. +Una instrucción personalizada cuyo «id» coincide con una instrucción integrada anula la versión integrada. Tabular Editor lee los archivos de la siguiente manera: -- el frontmatter debe comenzar con `---` en la primera línea del archivo y terminar con una línea que contenga `---`. Si no es así, o si no se puede analizar el YAML, todo el archivo se trata como contenido de la instrucción y se aplican todos los valores predeterminados anteriores -- las claves que no estén en la tabla anterior se ignoran. Los archivos de versiones anteriores que aún tengan una sección `triggers:` se cargan sin cambios -- Cualquier `{{version}}` en el cuerpo se reemplaza por la versión del componente de IA de Tabular Editor -- solo se leen los archivos `.md` ubicados directamente en la carpeta; no se buscan subcarpetas +- La materia preliminar debe comenzar con «---» en la primera línea del archivo y terminar con una línea «---». Si no es así, o si no se puede analizar el YAML, todo el archivo se trata como contenido de la instrucción y se aplican todos los valores predeterminados anteriores. +- Las claves que no figuran en la tabla anterior se ignoran. Los archivos de versiones anteriores que aún tienen una sección «triggers:`» se cargan sin cambios. +- `{{version}}` en cualquier parte del cuerpo se sustituye por la versión del componente de IA de Tabular Editor. +- Solo se leen los archivos `.md` que se encuentran directamente en la carpeta; no se buscan subcarpetas. -### Instrucciones personalizadas de tu organización +### Instrucciones personalizadas de tu empresa -Un administrador puede publicar una carpeta de instrucciones personalizadas para todos mediante la [directiva](xref:policies) `AiCustomInstructionsPath`, y la carpeta puede ser un recurso compartido de red de solo lectura. Estas instrucciones se cargan para todos los usuarios, además de las integradas, y funcionan como las demás: aparecen en el autocompletado de `/`, se eligen por su descripción y se invocan con `/id`. +Un administrador puede publicar una carpeta de instrucciones personalizadas para todos con la [política](xref:policies) `AiCustomInstructionsPath`, y la carpeta puede ser un recurso compartido de red de solo lectura. Esas instrucciones se cargan para todos los usuarios además de las integradas y funcionan como las demás instrucciones: se ofrecen en el autocompletado «/», se eligen por su descripción y se invocan mediante «/id». -Cuando el mismo `id` existe en más de un lugar, el orden de prioridad es: +Cuando el mismo «id» existe en más de un lugar, la prioridad es la siguiente: -1. la carpeta de tu organización -2. tu propia carpeta -3. las instrucciones integradas +1. La carpeta de tu organización +2. Tu propia carpeta +3. Las instrucciones integradas -Una directiva independiente, `DisableUserCustomInstructions`, hace que Tabular Editor ignore las instrucciones de tu propia carpeta y deshabilita **Abrir carpeta de instrucciones personalizadas**; las instrucciones integradas y de la organización siguen cargándose. Ambas directivas requieren Tabular Editor 3 Edición Enterprise. +Una política independiente, «DisableUserCustomInstructions», hace que Tabular Editor ignore las instrucciones de su propia carpeta y desactive **Abrir carpeta de instrucciones personalizadas**. Las instrucciones integradas y de la organización siguen cargándose. Ambas políticas requieren Tabular Editor 3 Edición Enterprise. ## Permisos y consentimiento -Establece un nivel de acceso para cada recurso para controlar a qué puede acceder el Asistente de IA, y el [servidor MCP](xref:mcp-server) usa la misma configuración. +Establece un nivel de acceso para cada recurso para controlar a qué puede acceder el Asistente de IA, y el [servidor MCP](xref:mcp-server) utiliza los mismos ajustes. -| Recurso | Qué abarca | Niveles | Predeterminado | -| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | -------------- | -| **Metadatos del modelo** | Nombres de tablas, columnas y medidas, expresiones, descripciones y elementos similares. El permiso de lectura también incluye las estadísticas del Analizador VertiPaq | Denegar / Leer / Escribir | **Leer** | -| **Datos del modelo** | Valores de datos de tu modelo, como los resultados de consultas DAX. Requiere una conexión activa | Denegar / Leer | **Denegar** | -| **Best Practice Analyzer** | Leer enumera las reglas y ejecuta el análisis; Escribir agrega o modifica reglas | Denegar / Lectura / Escritura | **Lectura** | -| **Documentos** | Tus documentos abiertos: consultas DAX, C# Scripts y scripts DAX. Lectura permite ver su contenido; Escritura es necesaria para crearlos o modificarlos | Denegar / Lectura / Escritura | **Escritura** | -| **macros** | Tu biblioteca de macros. Lectura permite listar y leer macros; Escritura se reserva para futuras herramientas de edición de macros | Denegar / Lectura / Escritura | **Escritura** | +| Recurso | Qué abarca | Niveles | Predeterminado | +| -- | -- | -- | -- | +| **Metadatos del modelo** | Nombres de tablas, columnas y medidas, expresiones, descripciones y elementos similares. El permiso de lectura también abarca las estadísticas del Analizador VertiPaq y los mensajes de error y advertencia del modelo | Denegar / Lectura / Escritura | **Lectura** | +| **Datos del modelo** | Valores de datos de tu modelo, como los resultados de las consultas DAX y el texto de los errores devueltos por Analysis Services, que pueden contener valores de datos. Las consultas DAX requieren una conexión en vivo | Denegar / Leer | **Denegar** | +| **Best Practice Analyzer** | Lectura: lee las reglas de las listas y ejecuta el análisis; Escritura: añade o modifica reglas | Denegar / Lectura / Escritura | **Lectura** | +| **Documentos** | Sus documentos abiertos: consultas DAX, scripts de C#, scripts DAX y Pivot Grids. Lectura se refiere a su contenido y a sus errores y advertencias; Escritura es necesaria para crearlos o modificarlos. Los diseños de Pivot Grid no se pueden leer ni modificar | Denegar / Lectura / Escritura | **Escritura** | +| **Macros** | Tu biblioteca de macros. Lectura permite ver las listas y las macros; Escritura está reservado para futuras herramientas de edición de macros | Denegar / Lectura / Escritura | **Escritura** | -**Escritura** (que aparece como **Lectura/Escritura** en las listas desplegables) incluye **Lectura**. +**Escritura** (denominada **Lectura/Escritura** en los menús desplegables) incluye Lectura. > [!NOTE] -> Otorgar acceso a **Datos del modelo** envía valores de datos de tu modelo a tu proveedor de IA. +> Conceder **Datos del modelo** envía los valores de los datos de tu modelo a tu proveedor de IA. Algunos permisos dependen de otros: -- Se requiere **Metadatos del modelo > Escritura** para la [ejecución directa](#letting-the-assistant-change-your-model), que se activa por separado. -- Ejecutar el Best Practice Analyzer requiere **Metadatos del modelo > Lectura**, además de **Best Practice Analyzer > Lectura**. -- Ejecutar una consulta DAX requiere **Metadatos del modelo > Lectura**, además de **Datos del modelo > Lectura**. Una consulta puede leer metadatos mediante las funciones `INFO`, las DMV y los nombres de columna del resultado. +- **Metadatos del modelo > Escritura** es necesario para la [ejecución directa](#letting-the-assistant-change-your-model), que se activa por separado. +- Para ejecutar Best Practice Analyzer, se necesita **Metadatos del modelo > Lectura**, además de **Best Practice Analyzer > Lectura**. +- Para ejecutar una consulta DAX se necesita **Metadatos del modelo > Leer** además de **Datos del modelo > Leer**. Una consulta puede leer metadatos a través de las funciones `INFO`, las DMV y los nombres de las columnas en su resultado. -### Configurar los permisos +### Configuración de las concesiones de permisos -Abre **Herramientas > Preferencias > Funciones de IA > Permisos**, donde cada recurso tiene una lista desplegable con sus niveles disponibles. +Abra **Herramientas > Preferencias > Funciones de IA > Permisos**, donde cada recurso tiene un menú desplegable con sus niveles disponibles. -![Funciones de IA > Preferencias de permisos, un menú desplegable por recurso con su configuración predeterminada](~/content/assets/images/pref-ai-permissions.png) +![Funciones de IA > Preferencias de permisos, un menú desplegable por recurso con su valor predeterminado](~/content/assets/images/pref-ai-permissions.png) -El chat no tiene un nivel independiente de "solicitar" y muestra una [tarjeta de permiso](#permission-cards-in-the-chat) cuando necesita un recurso configurado en **Denegar**. +El chat no tiene un nivel de «solicitud» independiente y muestra una [tarjeta de permisos](#permission-cards-in-the-chat) cuando necesita un recurso configurado como **Denegar**. > [!NOTE] -> A partir de la versión 3.27.0, **Metadatos del modelo**, **Documentos** y **macros** tienen como valor predeterminado Lectura o un nivel superior, y el chat ya no los solicita. De forma predeterminada, solo los resultados de consultas DAX y las ediciones de reglas de Best Practice Analyzer muestran una tarjeta. Establece un recurso en **Denegar** para que vuelva a mostrarse su solicitud. +> A partir de la versión 3.27.0, **Metadatos del modelo**, **Documentos** y **Macros** tienen como valor predeterminado Lectura o superior, y el chat ya no solicita permisos para ellos. De forma predeterminada, solo los resultados de las consultas DAX y las modificaciones de las reglas del Best Practice Analyzer muestran una tarjeta. Establezca un recurso en **Denegar** para que vuelva a aparecer su aviso. > [!NOTE] -> En la Edición Enterprise, los administradores pueden limitar estos permisos mediante una directiva. Consulta @policies. +> En la edición Enterprise, los administradores pueden limitar estos permisos mediante directivas. Consulte @policies. -### Tarjetas de permiso en el chat +### Tarjetas de permisos en el chat -Cuando el asistente necesita un recurso que tu autorización permanente no cubre, aparece una tarjeta de **Permiso necesario** en la conversación. La tarjeta indica lo que el asistente quiere hacer, por ejemplo "La IA quiere acceder a los metadatos de tu modelo semántico", o muestra la consulta DAX que propone ejecutar. +Cuando el asistente necesita un recurso que tu concesión permanente no cubre, aparece una tarjeta de **Permiso requerido** en la conversación. La tarjeta indica lo que el asistente quiere hacer, por ejemplo, «La IA quiere acceder a los metadatos de tu modelo semántico», o muestra la consulta DAX que propone ejecutar. -![Una tarjeta de Permiso requerido en el chat, que muestra la consulta DAX que el asistente quiere ejecutar, con los botones Permitir, Permitir para esta sesión, Permitir para este modelo, Permitir siempre y Denegar](~/content/assets/images/ai-assistant/ai-assistant-generate-consent-dialog.png) +![Una tarjeta de Permiso requerido en el chat, que indica la consulta DAX que el asistente quiere ejecutar, con los botones Permitir, Permitir para la sesión, Permitir para este modelo, Permitir siempre y Denegar](~/content/assets/images/ai-assistant/ai-assistant-generate-consent-dialog.png) -| Botón | Qué hace | -| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Permitir** | Se aplica solo a esta interacción. El asistente puede repetir la misma solicitud mientras termina tu tarea, y después no se recuerda nada | -| **Permitir para esta sesión** | Se aplica hasta que se reinicie Tabular Editor. El permiso se mantiene en memoria y nunca se guarda en disco | -| **Permitir para este modelo** | Se registra en el archivo de [opciones de usuario](xref:user-options) del modelo y se aplica la próxima vez que abras este modelo. Solo se ofrece para **Metadatos del modelo** y **Datos del modelo**, y solo mientras haya un modelo cargado | -| **Permitir siempre** | Aumenta el permiso permanente en la página Permisos, para todos los modelos y todas las sesiones | -| **Denegar** | Deniega esta solicitud. El asistente continúa sin ese acceso, y la tarjeta vuelve a aparecer la próxima vez que lo necesite | +| Botón | Qué hace | +| -- | -- | +| **Permitir** | Se aplica solo a este turno. El asistente puede repetir la misma solicitud mientras termina su tarea, y no se recuerda nada después | +| **Permitir solo para esta sesión** | Se aplica hasta que se reinicie Tabular Editor. El permiso se mantiene en la memoria y nunca se escribe en el disco | +| **Permitir para este modelo** | Se registra en el archivo de [opciones de usuario](xref:user-options) del modelo y se aplica la próxima vez que abra este modelo. Se ofrece solo para **Metadatos del modelo** y **Datos del modelo**, y únicamente mientras haya un modelo cargado | +| **Permitir siempre** | Eleva el nivel de autorización permanente en la página Permisos, para todos los modelos y todas las sesiones | +| **Denegar** | Deniega esta solicitud. El asistente continúa sin ese acceso, y la tarjeta vuelve a aparecer la próxima vez que lo necesite | -**Permitir siempre** nunca reduce un permiso existente; conceder Lectura a un recurso que ya está en Escritura lo mantiene en Escritura. +**Permitir siempre** nunca reduce un permiso existente; si se permite la lectura de un recurso con permiso de escritura, se mantiene el permiso de escritura. ### Detener un turno mientras el permiso está pendiente -La interacción se pausa hasta que respondas a una tarjeta de **Permiso necesario**. **Detener** finaliza la interacción sin respuesta, quita la tarjeta y cuenta la solicitud como denegada. Envía un mensaje nuevo para continuar la conversación. +El turno se pausa hasta que responda a una tarjeta de **Permiso requerido**. **Detener** finaliza el turno sin una respuesta, elimina la tarjeta y considera la solicitud como denegada. Envíe un nuevo mensaje para continuar la conversación. -### Diferencias entre el servidor MCP y el Asistente de IA +### Diferencias entre el servidor MCP y el asistente de IA -El [servidor MCP](xref:mcp-server) usa los mismos cinco permisos, pero no muestra tarjetas de permiso: +El [servidor MCP](xref:mcp-server) utiliza los mismos cinco permisos, pero no muestra tarjetas de permiso: -- los permisos se leen cuando se inicia el servidor y se aplican hasta que se detiene, por lo que los cambios en un permiso solo surten efecto después de reiniciar el servidor -- solo se aplican las subvenciones globales. Las subvenciones otorgadas con **Permitir para este modelo** o **Permitir para la sesión** se aplican solo al chat -- las herramientas de un recurso denegado no aparecen en la lista de herramientas del agente +- Los permisos se leen cuando se inicia el servidor y se aplican hasta que se detiene, por lo que un permiso modificado solo entra en vigor después de reiniciar el servidor. +- Solo se aplican los permisos globales. Los permisos concedidos con **Permitir para este modelo** o **Permitir para la sesión** solo se aplican al chat. +- Las herramientas de un recurso denegado no aparecen en la lista de herramientas del agente. -### Retirar permisos +### Retirar un permiso -Vuelve a establecer un recurso en **Denegar** en la página de Permisos para retirar su concesión. El chat mostrará entonces una tarjeta de permiso la próxima vez que necesite ese recurso. +Vuelve a establecer un recurso como **Denegar** en la página Permisos para retirar su concesión. A continuación, el chat mostrará una tarjeta de permisos la próxima vez que necesite ese recurso. -Reducir una concesión global no elimina una concesión por modelo. Elimina el archivo `.tmuo` del modelo, o la entrada `Permissions` que hay en él, para retirar las concesiones por modelo. Consulta @user-options. +Reducir un permiso global no elimina un permiso por modelo. Elimine el archivo `.tmuo` del modelo, o la entrada `Permissions` que contiene, para retirar los permisos por modelo. Consulte @user-options. ### Registro de auditoría -En la Edición Enterprise, incluidas las licencias de Consultancy y Trial, Tabular Editor escribe un registro local de la actividad de AI Assistant y del [servidor MCP](xref:mcp-server). Registra: +En la Edición Enterprise, incluidas las licencias de consultoría y de prueba, Tabular Editor escribe un registro local de la actividad del Asistente de IA y del [servidor MCP](xref:mcp-server). Registra: - qué permisos se solicitaron y cómo respondiste -- qué herramientas se ejecutaron y si cada una se completó correctamente, falló o fue bloqueada -- el texto completo de cualquier C# Script que el asistente o un agente de MCP haya ejecutado o haya enviado a ejecutar, incluidos los que fallaron durante la ejecución o cuya ejecución fue rechazada +- qué herramientas se ejecutaron y si cada una tuvo éxito, falló o se bloqueó +- el texto completo de cualquier script de C# que el asistente o un agente de MCP haya ejecutado o enviado para su ejecución, incluidos los scripts que hayan fallado en tiempo de ejecución o hayan sido rechazados. -Tus indicaciones, las respuestas del asistente y los valores de datos de tu modelo nunca se registran. Un script que no llega a compilarse no se guarda, y tampoco se guarda el texto de un script que el asistente escribe en un documento para que lo ejecutes tú mismo. **Abrir carpeta de auditoría** en **Herramientas > Preferencias > Funciones de IA** abre la carpeta de registros. +Tus indicaciones, las respuestas del asistente y los valores de los datos de tu modelo nunca se registran. No se guarda un script que no se pueda compilar, ni tampoco el texto de un script que el asistente escriba en un documento para que lo ejecute usted mismo. **Abrir carpeta de auditoría** en **Herramientas > Preferencias > Funciones de IA** abre la carpeta de registros. -Sin una licencia Enterprise, y antes de activar una licencia, no se registra nada, no se crea ninguna carpeta y no se muestra el botón. Consulta @ai-audit-log para ver qué contiene cada registro, dónde se almacenan los archivos y las directivas que los redirigen. +Sin una licencia Enterprise, y antes de que se active una licencia, no se registra nada, no se crea ninguna carpeta y no se muestra el botón. Consulte @ai-audit-log para saber qué contiene cada registro, dónde se almacenan los archivos y qué políticas los redirigen. ## Preferencias -Configura las opciones de visualización y comportamiento del Asistente de IA en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Preferencias**. +Configure las opciones de visualización y comportamiento del Asistente de IA en **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Preferencias**. ### Visualización del chat -| Preferencia | Predeterminado | Descripción | -| --------------------------------------------------------- | -------------- | ---------------------------------------------------------------------------------------------- | -| Mostrar indicador de contexto de selección | Desactivado | Muestra el objeto del modelo seleccionado actualmente en el chat | -| Mostrar indicador de instrucciones personalizadas | Desactivado | Muestra los indicadores de instrucciones personalizadas encima de las respuestas del asistente | -| Mostrar indicador de búsqueda en la base de conocimientos | Desactivado | Muestra el progreso al buscar en la base de conocimientos | +| Preferencia | Valor predeterminado | Descripción | +| -- | -- | -- | +| Mostrar indicador del contexto de la selección | Desactivado | Mostrar el objeto del modelo actualmente seleccionado en el chat | +| Mostrar indicador de instrucciones personalizadas | Desactivado | Mostrar indicadores de instrucciones personalizadas encima de las respuestas del asistente | +| Mostrar indicador de búsqueda en la base de conocimientos | Desactivado | Mostrar el progreso al buscar en la base de conocimientos | -### Compactación de contexto +### Compactación del contexto -| Preferencia | Predeterminado | Descripción | -| ----------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Compactación automática | Activado | Resumir automáticamente los mensajes antiguos al acercarse al límite del contexto | -| Umbral de compactación automática % | 80 | Porcentaje de la ventana de contexto del propio modelo a partir del cual se activa la compactación automática. El campo acepta valores de 25 a 100. Los valores inferiores a 50 se tratan como 50 y los superiores a 90 se tratan como 90 | +| Preferencia | Predeterminado | Descripción | +| -- | -- | -- | +| Compresión automática | Activada | Resume automáticamente los mensajes antiguos al acercarse al límite de contexto | +| Umbral de compactación automática % | 80 | Porcentaje de la ventana de contexto propia del modelo en el que se activa la compactación automática. El campo acepta valores de 25 a 100. Los valores inferiores a 50 se consideran 50 y los valores superiores a 90 se consideran 90 | -### C# Script +### Script de C# -| Preferencia | Predeterminado | Descripción | -| --------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Permitir que el Asistente de IA ejecute C# Scripts directamente | Desactivado | Permite que el asistente ejecute sus C# Scripts por sí solo. Cuando está desactivado, el asistente abre cada script y tú lo ejecutas. No está disponible hasta que **Metadatos del modelo** se configure como **Lectura/escritura** en **Permisos**, y no está disponible en absoluto si se aplica la [directiva](xref:policies) `DisableCSharpScripts`. Consulta [Dejar que el asistente cambie tu modelo](#letting-the-assistant-change-your-model) | -| Previsualizar cambios | Activado | Mostrar el cuadro de diálogo de vista previa de cambios al ejecutar C# Scripts generados por IA desde el chat | +| Preferencia | Valor predeterminado | Descripción | +| -- | -- | -- | +| Permitir que el asistente de IA ejecute C# Scripts directamente | Desactivado | Permite que el asistente ejecute sus C# Scripts por sí mismo. Cuando está desactivada, el asistente abre cada script y tú lo ejecutas. No está disponible hasta que **Metadatos del modelo** se establezca en **Lectura/Escritura** en **Permisos**, y no está disponible en absoluto con la [política](xref:policies) `DisableCSharpScripts`. Consulta [Permitir que el asistente cambie tu modelo](#letting-the-assistant-change-your-model) | +| Vista previa de los cambios | Activada | Muestra el cuadro de diálogo de vista previa de los cambios al ejecutar scripts de C# generados por IA desde el chat | -La opción **Buscar actualizaciones de la base de conocimiento al iniciar** y el botón **Abrir carpeta de auditoría** están en la página **Funciones de IA**, por encima de **AI Assistant**, y ambos también se aplican al servidor MCP. Consulta @preferencias. +**Buscar actualizaciones de la base de conocimientos al iniciar** y el botón **Abrir carpeta de auditoría** se encuentran en la página **Funciones de IA**, encima de **Asistente de IA**, y ambos también se aplican al servidor MCP. Consulte @preferences. -![La página de preferencias de AI Assistant, con los tres indicadores de visualización del chat desactivados (valor predeterminado), Compactación automática seleccionada con un umbral de 80, la opción Permitir que AI Assistant ejecute C# Scripts directamente desactivada y Vista previa de cambios seleccionada](~/content/assets/images/ai-assistant/ai-assistant-preferences.png) +![La página de preferencias del asistente de IA, con los tres indicadores de visualización del chat desactivados (valor predeterminado), «Compactación automática» seleccionada con un umbral de 80, «Permitir que el asistente de IA ejecute C# Scripts directamente» desactivada y «Vista previa de los cambios» seleccionada](~/content/assets/images/ai-assistant/ai-assistant-preferences.png) ## Uso de tokens -Cada mensaje al Asistente de IA consume tokens de entrada. El coste en tokens de un mensaje individual depende del contexto que incluya: +Cada mensaje enviado al asistente de IA consume tokens de entrada. El coste en tokens de un único mensaje depende del contexto que incluya: -- **Prompt del sistema e Instrucciones personalizadas**: se envían con cada mensaje; por lo general, entre 5.000 y 15.000 tokens, según qué Instrucciones personalizadas estén activas -- **Metadatos del modelo**: se recuperan mediante llamadas a herramientas, por etapas. Primero, el asistente obtiene un resumen ligero (nombres de tablas y medidas, relaciones); luego busca objetos relevantes por nombre, descripción o expresión DAX, y recupera los detalles completos solo de las tablas u objetos que requiera la pregunta. Un resultado de una herramienta muy grande se trunca, con indicaciones sobre cómo el asistente puede recuperar el resto +- **Aviso del sistema e instrucciones personalizadas**: se envían con cada mensaje; suelen ser de 5000 a 15 000 tokens, en función de qué instrucciones personalizadas estén activas. +- **Metadatos del modelo**: se obtienen mediante llamadas a herramientas, por etapas. El asistente primero obtiene una descripción general ligera (nombres de tablas y medidas, relaciones), luego busca objetos relevantes por nombre, descripción o expresión DAX y recupera los detalles completos solo para las tablas u objetos que requiere la pregunta. Si el resultado de una herramienta es muy grande, se trunca y se ofrecen indicaciones sobre cómo puede el asistente recuperar el resto. ### Contador de tokens -El contador de tokens está en la barra de estado, encima del cuadro de mensaje, junto al [indicador del modelo activo](#choosing-a-model). La barra muestra utilizados/total en miles de tokens y se colorea en verde, ámbar o rojo a medida que se llena el contexto. Un `±` delante de la cifra significa que todavía no hay un recuento exacto. +El contador de tokens se encuentra en la barra de estado situada encima del cuadro de mensajes, junto al [indicador de modelo activo](#choosing-a-model). La barra indica los tokens usados/totales en miles y se muestra en verde, ámbar o rojo a medida que se va llenando el contexto. Un «±» delante de la cifra significa que aún no se dispone de un recuento exacto. -Pasa el cursor sobre el contador para ver el desglose: +Pasa el cursor por encima del contador para ver un desglose: -| Sección | Qué incluye | -| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Último intercambio** | Lo que costó el intercambio más reciente: entrada nueva, tokens servidos desde la caché de prompts del proveedor, tokens escritos en la caché y salida | -| **Esta conversación (facturada)** | Las mismas cuatro cifras acumuladas en todas las solicitudes de la conversación, incluidas las interacciones de ida y vuelta con las herramientas | -| **Contexto** | Tokens que hay actualmente en la ventana de contexto, frente al tamaño real de la ventana | +| Sección | Qué abarca | +| -- | -- | +| **Último turno** | El coste del intercambio más reciente: entrada nueva, tokens servidos desde la caché de «prompts» del proveedor, tokens escritos en la caché y salida | +| **Esta conversación (facturada)** | Las mismas cuatro cifras acumuladas en cada solicitud de la conversación, incluidos los viajes de ida y vuelta de las herramientas | +| **Contexto** | Tokens actualmente en la ventana de contexto, en comparación con el tamaño real de la ventana | -Una línea dice, por ejemplo, `37,588 input + 131,744 cached · write 37,558 · output 2,866`. Las secciones de caché se omiten para los proveedores que no admiten el almacenamiento en caché de prompts, y también se omite una sección cuando no tiene nada que incluir en el Report. +Una línea dice, por ejemplo, «37 588 de entrada + 131 744 en caché · escritura 37 558 · salida 2866». Las partes relativas a la caché se omiten en el caso de los proveedores que no admiten el almacenamiento en caché de «prompts», y se omite una sección cuando no hay nada que informar. > [!TIP] -> Compara **Último turno** con **Esta conversación (facturada)** para ver cuánto costó una sola pregunta. En una conversación larga, es normal ver una cifra alta en **Esta conversación (facturada)** junto a una cifra pequeña en **Último turno**. +> Compara **Último turno** con **Esta conversación (facturada)** para ver cuánto cuesta una sola pregunta. En una conversación larga, es normal que haya una cifra elevada en **Esta conversación (facturada)** junto a una cifra baja en **Último turno**. ### Ventana de contexto -La barra de uso del contexto, el punto de compactación automática y la longitud máxima de una sola respuesta se basan en la ventana de contexto del modelo seleccionado. Por ejemplo, un modelo con una ventana de un millón de tokens se mide contra un millón de tokens. Si no se conoce la ventana del modelo (un nombre de implementación de Azure OpenAI o Custom, o un equipo en el que nunca se ha recuperado el catálogo de modelos), Tabular Editor usa 200.000 tokens. +La barra de uso del contexto, el punto de compactación automática y la longitud máxima de una sola respuesta utilizan la ventana de contexto del modelo seleccionado. Por ejemplo, un modelo con una ventana de un millón de tokens se mide en relación con un millón de tokens. Si no se conoce la ventana del modelo (un nombre de implementación de Azure OpenAI o personalizado, o un dispositivo en el que nunca se ha recuperado el catálogo de modelos), Tabular Editor utiliza 200 000 tokens. -### Reducir el uso de tokens +### Reducción del uso de tokens -Selecciona objetos específicos en el **Explorador TOM** antes de hacer tu pregunta. Después, el asistente limita su contexto a los objetos seleccionados y no recupera metadatos de todo el modelo; esto es lo que más reduce tanto el uso de tokens como el coste de la API. +Seleccione objetos específicos en el **Explorador TOM** antes de formular su pregunta. A continuación, el asistente limita su contexto a los objetos seleccionados y no recupera los metadatos de todo el modelo, lo que reduce al máximo tanto el uso de tokens como el coste de la API. Otras formas de reducir el uso de tokens: -- Haz preguntas concretas sobre tablas, medidas o columnas específicas. Una instrucción imprecisa como "Establece carpetas de visualización en todas las medidas" obliga al asistente a recuperar metadatos de todo el modelo. Una instrucción específica como "Establece carpetas de visualización en las medidas que he seleccionado" limita el contexto a la selección actual y usa muchos menos tokens -- Inicia una conversación nueva cuando cambies de tema, para evitar que se acumulen historiales largos -- Usa un modelo más pequeño o menos costoso para preguntas exploratorias +- Haga preguntas concretas sobre tablas, medidas o columnas específicas. Una indicación imprecisa como «Establecer carpetas de visualización en todas las medidas» hace que el asistente recupere los metadatos de todo el modelo. Una indicación específica como «Establecer carpetas de visualización en las medidas que he seleccionado» limita el contexto a la selección actual y utiliza muchos menos tokens. +- Iniciar una nueva conversación cuando cambies de tema, para que no se acumulen historiales largos. +- Usar un modelo más pequeño o menos costoso para las preguntas exploratorias. ## Limitaciones -- requiere tu propia clave de API; no se incluye ninguna clave de API -- la calidad de las respuestas depende del proveedor y del modelo que selecciones -- el Asistente de IA no sustituye el conocimiento de DAX ni los fundamentos del diseño de modelos semánticos -- el Asistente de IA no puede acceder a archivos o servicios externos ni buscar en la web -- el Asistente de IA no puede conectarse a servidores MCP externos para ampliar sus propias herramientas. Para usar tu propio agente con Tabular Editor 3, consulta @mcp-server -- el Asistente de IA no puede conectarse a otro modelo desde el chat. Cambia las conexiones del modelo en la interfaz de usuario de Tabular Editor -- el Asistente de IA no puede administrar las preferencias +- Requiere su propia clave de API; no hay ninguna clave de API integrada. +- La calidad de las respuestas depende del proveedor y del modelo que se seleccione. +- El Asistente de IA no sustituye a los conocimientos de DAX ni a los fundamentos del diseño de modelos semánticos. +- El asistente de IA no puede acceder a archivos o servicios externos ni buscar en la web. +- El Asistente de IA no puede conectarse a servidores MCP externos para ampliar sus propias herramientas. Para usar tu propio agente con Tabular Editor 3, consulta @mcp-server +- El Asistente de IA no puede conectarse a un modelo distinto desde el chat. Cambiar las conexiones del modelo en la interfaz de usuario de Tabular Editor +- El asistente de IA no puede gestionar las preferencias. -## Desactivar el Asistente de IA +## Desactivación del asistente de IA -El Asistente de IA es un componente opcional, instalado de forma predeterminada a partir de Tabular Editor 3.27.0. Ejecuta de nuevo el instalador de Tabular Editor 3 y selecciona **Modificar** para incluirlo o excluirlo de una instalación existente. Una actualización mantiene la selección existente; consulta [Actualizaciones y el componente de características de IA](xref:installation-activation-basic#upgrades-and-the-ai-features-component). En la versión portátil, elimina `TabularEditor3.AI.dll` del directorio de instalación para quitar este componente. +El Asistente de IA es un componente opcional que se instala de forma predeterminada a partir de Tabular Editor 3.27.0. Ejecuta de nuevo el instalador de Tabular Editor 3 y selecciona **Modificar** para incluirlo o excluirlo de una instalación existente. Una actualización mantiene la selección existente; consulta [Actualizaciones y el componente de funciones de IA](xref:installation-activation-basic#upgrades-and-the-ai-features-component). En la compilación portátil, elimina `TabularEditor3.AI.dll` del directorio de instalación para quitarlo. -El mismo componente contiene el servidor MCP, por lo que excluirlo o eliminar `TabularEditor3.AI.dll` elimina ambos. Para desactivar solo el chat, mantén el componente y establece la directiva `DisableAiChat`. +El mismo componente contiene el servidor MCP, por lo que, si lo excluyes o eliminas `TabularEditor3.AI.dll`, se eliminarán ambos. Para desactivar solo el chat, mantenga el componente y establezca la política `DisableAiChat`. > [!NOTE] -> Independientemente de si el componente está instalado o no, un administrador del sistema puede desactivar toda la funcionalidad de IA en Tabular Editor 3, incluido el servidor MCP, mediante la [directiva `DisableAi`](xref:policies). `DisableMcpServer` desactiva solo el servidor MCP. Consulta @policies. +> Tanto si el componente está instalado como si no, un administrador del sistema puede desactivar todas las funciones de IA en Tabular Editor 3, incluido el servidor MCP, con la [política «DisableAi»](xref:policies). `DisableMcpServer` desactiva únicamente el servidor MCP. Consulte @policies. diff --git a/localizedContent/es/content/features/auto-reload.md b/localizedContent/es/content/features/auto-reload.md index 6d591eb56..12505463f 100644 --- a/localizedContent/es/content/features/auto-reload.md +++ b/localizedContent/es/content/features/auto-reload.md @@ -2,7 +2,7 @@ uid: auto-reload title: Recarga automática desde el disco author: Morten Lønskov -updated: 2026-09-23 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -12,70 +12,69 @@ applies_to: editions: - edition: Desktop none: true - note: "La Edición de escritorio no puede abrir ni guardar archivos de metadatos del modelo." + note: "Desktop Edition can't open or save model metadata files." - edition: Business full: true - edition: Enterprise full: true --- - # Recarga automática desde el disco -Cuando los archivos de metadatos de un modelo que cargaste desde un archivo o una carpeta cambian en disco, Tabular Editor vuelve a cargar el modelo automáticamente. Si tienes cambios sin guardar, aparecerá un aviso en el que podrás elegir entre recargar o conservar tus cambios. Las fuentes típicas de cambios externos son un agente de IA, un script, otro editor, un `git pull` o un compañero que edita una carpeta compartida. +Cuando los archivos de metadatos de un modelo que ha cargado desde un archivo o una carpeta cambian en el disco, Tabular Editor vuelve a cargar el modelo automáticamente. Si tiene cambios sin guardar, aparecerá un mensaje en el que podrá elegir si desea volver a cargar o conservar sus cambios. Las fuentes típicas de cambios externos son un agente de IA, un script, otro editor, un «git pull» o un compañero que edita una carpeta compartida. -![Diagrama: Archivo > Guardar escribe el modelo de Tabular Editor en los archivos en disco; otra herramienta escribe en los archivos; una recarga automática vuelve a cargar los archivos modificados en Tabular Editor](~/content/assets/images/features/auto-reload-sync.png) +![Diagrama: Archivo > Guardar escribe el modelo en Tabular Editor en los archivos del disco; otra herramienta escribe en los archivos; una recarga automática vuelve a cargar los archivos modificados en Tabular Editor](~/content/assets/images/features/auto-reload-sync.png) > [!NOTE] -> La recarga automática supervisa los archivos y es independiente de **Realizar seguimiento de cambios externos del modelo** y **Actualizar automáticamente los metadatos locales de Tabular Object Model** en [Herramientas > Preferencias > Tabular Editor > Varios](xref:preferences#miscellaneous). Esas opciones usan una traza de Analysis Services para detectar cambios en una base de datos conectada. +> La recarga automática supervisa los archivos y es independiente de **Rastrear cambios externos del modelo** y **Actualizar automáticamente los metadatos locales de Tabular Object Model** en [Herramientas > Preferencias > Tabular Editor > Varios](xref:preferences#tabular-editor--miscellaneous). Esos ajustes utilizan un seguimiento de Analysis Services para detectar cambios en una base de datos conectada. ## Archivos supervisados -| Modelo cargado desde | Archivos supervisados | -| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Un archivo `.bim` | Ese archivo. Se ignoran los demás archivos de la misma carpeta. | -| Una carpeta en formato JSON (Database.json) | Todos los archivos `.json` que estén bajo la raíz del modelo, incluidos los de las subcarpetas. | -| Una carpeta en formato [Tabular Model Definition Language (TMDL)](xref:tmdl) | Todos los archivos `.tmdl` debajo de la raíz del modelo, incluidas las subcarpetas. | -| Una base de datos del Workspace | Los archivos que respaldan el modelo en [modo del área de trabajo](xref:workspace-mode), según las mismas reglas que en las filas anteriores. | -| Una base de datos o Power BI Desktop, fuera del modo del área de trabajo | Ninguno. El modelo no tiene archivos en disco. | -| Una plantilla `.pbit` o un modelo que nunca has guardado | Ninguno. | +| Modelo cargado desde | Archivos supervisados | +|---|---| +| Un archivo `.bim` | Ese archivo. Se omiten otros archivos de la misma carpeta. | +| Una carpeta en formato JSON (Database.json) | Todos los archivos «.json» situados por debajo de la raíz del modelo, incluidas las subcarpetas. | +| Una carpeta en formato [Lenguaje de definición de modelo tabular (TMDL)](xref:tmdl) | Todos los archivos «.tmdl» situados debajo de la raíz del modelo, incluidas las subcarpetas. | +| Una base de datos del área de trabajo | Los archivos que respaldan el modelo en [modo de área de trabajo](xref:workspace-mode), según las mismas reglas que las filas anteriores. | +| Una base de datos o Power BI Desktop, fuera del modo de área de trabajo | Ninguno. El modelo no tiene archivos en el disco. | +| Una plantilla `.pbit` o un modelo que nunca ha guardado | Ninguno. | ## Recargar con cambios sin guardar -Si tienes cambios sin guardar, aparece el aviso **Se detectaron cambios externos** y eliges qué versión conservar, porque Tabular Editor no las fusiona. +Si tiene cambios sin guardar, aparecerá el mensaje **Cambios externos detectados** y podrá elegir qué versión conservar, ya que Tabular Editor no las combina. -![Aviso «Se detectaron cambios externos» con los botones Recargar e Ignorar, con Recargar seleccionado](~/content/assets/images/features/external-changes-prompt.png) +![Mensaje de cambios externos detectados con los botones «Volver a cargar» e «Ignorar», con «Volver a cargar» seleccionado](~/content/assets/images/features/external-changes-prompt.png) -- **Recargar** descarta tus cambios sin guardar y carga la versión en disco. -- **Ignorar** conserva tus cambios. Los archivos en disco conservan los cambios externos y la próxima vez que guardes los sobrescribirás. +- **Volver a cargar** descarta sus cambios sin guardar y carga la versión en disco. +- **Ignorar** conserva sus cambios. Los archivos en el disco conservan los cambios externos, y su próximo guardado los sobrescribe. -Pulsar **Esc** o cerrar el aviso tiene el mismo efecto que **Ignorar**. +Pulsar **Esc** o cerrar el mensaje tiene el mismo efecto que **Ignorar**. > [!WARNING] -> **Recargar** es el botón predeterminado, así que pulsar **Enter** en el aviso también recarga. Una recarga descarta tus cambios sin guardar sin más confirmación, y no puedes deshacerla. +> **Volver a cargar** es el botón predeterminado, por lo que pulsar **Intro** en el mensaje también vuelve a cargar. Al recargar, se descartan los cambios no guardados sin necesidad de confirmación adicional, y no se puede deshacer esta acción. ### Ejemplo -1. Abres un modelo TMDL basado en carpetas y cambias el nombre de una medida. +1. Abres un modelo de carpeta TMDL y cambias el nombre de una medida. 2. Un agente de IA que trabaja en la misma carpeta reescribe cuatro archivos `.tmdl`. -3. Cuando el agente termina de escribir, aparece un único aviso **Se detectaron cambios externos**. -4. Eliges **Recargar**, lo que descarta el cambio de nombre y carga los cambios del agente. El Explorador TOM conserva sus nodos expandidos. +3. Cuando el agente termina de escribir, aparece un mensaje de **Cambios externos detectados**. +4. Elige **Recargar**, lo que descarta el cambio de nombre y carga los cambios del agente. El Explorador TOM mantiene sus nodos expandidos. ## Múltiples escrituras y cambios en segundo plano -Cuando una herramienta reescribe un modelo serializado en una carpeta, cambia muchos archivos en rápida sucesión y Tabular Editor se recarga una sola vez, cuando finalizan las escrituras. +Cuando una herramienta reescribe un modelo serializado en carpetas, cambia muchos archivos en rápida sucesión, y Tabular Editor se vuelve a cargar una vez, cuando finalizan las escrituras. -Si Tabular Editor no es la ventana activa cuando cambian los archivos, la recarga o el aviso se produce cuando vuelves a activarlo. Todos los cambios realizados mientras estaba inactivo generan un único aviso. +Si Tabular Editor no es la ventana activa cuando cambian los archivos, la recarga o el aviso se producen cuando vuelves a él. Todos los cambios realizados mientras estaba inactivo generan un aviso. -## Modo del área de trabajo +## Modo de área de trabajo -En [modo del área de trabajo](xref:workspace-mode), una recarga también vuelve a implementar el modelo en la base de datos de Workspace. +En el [modo de área de trabajo](xref:workspace-mode), una recarga también vuelve a implementar el modelo en la base de datos del área de trabajo. -## Desactivarlo +## Desactivación -La recarga automática está activada de forma predeterminada. Para desactivarla, desmarca **Recargar automáticamente desde el disco (hot reload)** en **Herramientas > Preferencias > Tabular Editor > Varios**. +La recarga automática está habilitada de forma predeterminada y puede desactivarla desmarcando **Recargar automáticamente desde el disco (recarga en caliente)** en **Herramientas > Preferencias > Tabular Editor > Varios**. -![Herramientas > Preferencias > Tabular Editor > Varios, que muestra la opción de recarga automática en Sincronización de metadatos](~/content/assets/images/pref-miscellaneous.png) +![Herramientas > Preferencias > Tabular Editor > Varios, donde se muestra la configuración de recarga automática en Sincronización de metadatos](~/content/assets/images/pref-miscellaneous.png) -Desactívala si un proceso que se ejecuta continuamente también escribe en la carpeta del modelo, como un cliente de sincronización de archivos o un checkout de CI que se actualiza en segundo plano. Cada cambio desencadena una recarga o, si tienes cambios sin guardar, aparece un cuadro de diálogo modal. +Desactívela si un proceso que se ejecuta continuamente también escribe en la carpeta del modelo, como un cliente de sincronización de archivos o una comprobación de CI que se actualiza en segundo plano. Cada cambio activa una recarga o el aviso modal cuando tienes cambios sin guardar. -Con la opción desmarcada, usa **Archivo > Recargar desde el disco** para cargar cambios externos, o **Archivo > Guardar** para sobrescribirlos con el modelo en Tabular Editor. Consulta [Preferencias](xref:preferences#miscellaneous) para ver las demás opciones de esa página. +Con el ajuste desactivado, use **Archivo > Recargar desde el disco** para cargar los cambios externos o **Archivo > Guardar** para sobrescribirlos con el modelo en Tabular Editor. Consulte [Preferencias](xref:preferences#tabular-editor--miscellaneous) para conocer los demás ajustes de esa página. diff --git a/localizedContent/es/content/features/dax-debugger.md b/localizedContent/es/content/features/dax-debugger.md index 3cdf70617..e6f2dd681 100644 --- a/localizedContent/es/content/features/dax-debugger.md +++ b/localizedContent/es/content/features/dax-debugger.md @@ -1,6 +1,6 @@ ---- +--- uid: dax-debugger -title: Depurador de DAX +title: Depurador DAX author: Daniel Otykier updated: 2026-10-12 applies_to: @@ -16,148 +16,139 @@ applies_to: - edition: Enterprise full: true --- - -# Depurador de DAX +# Depurador DAX > [!NOTE] -> El Depurador de DAX se introdujo en la versión 3.2.0. La información de este artículo está sujeta a cambios a medida que añadimos más capacidades al depurador. +> El depurador de DAX se introdujo en la versión 3.2.0. La información de este artículo está sujeta a cambios a medida que añadamos más funciones al depurador. - + -No es ningún secreto que DAX es un lenguaje relativamente complejo y difícil de dominar. La mayoría de los desarrolladores de modelos de datos probablemente han experimentado una situación en la que el código DAX no devolvió el resultado esperado. En este caso, ayuda desglosar el código, variable por variable y llamada a función por llamada a función, para entender mejor qué está pasando. +No es ningún secreto que DAX es un lenguaje relativamente complejo y difícil de dominar. La mayoría de los desarrolladores de modelos de datos probablemente se hayan encontrado en alguna ocasión con una situación en la que el código DAX no devolvía el resultado esperado. En esta situación, resulta útil desglosar el código, variable por variable y llamada a función por llamada a función, para comprender mejor qué está ocurriendo. -Hasta ahora, este «desglose» del código era una tarea tediosa y que llevaba mucho tiempo, y a menudo implicaba capturar consultas DAX ejecutadas por herramientas cliente para poder desglosarlas y ejecutar partes más pequeñas de las consultas en [DAX Studio](https://daxstudio.org/) o [SQL Server Management Studio](https://docs.microsoft.com/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15). +Hasta ahora, este «desglose» del código era una tarea tediosa y que requería mucho tiempo, que a menudo implicaba capturar las consultas DAX ejecutadas por las herramientas cliente para desglosarlas y ejecutar partes más pequeñas de las consultas en [DAX Studio](https://daxstudio.org/) o [SQL Server Management Studio](https://docs.microsoft.com/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15). -Tabular Editor 3 introduce el **Depurador de DAX**, una herramienta que hace que el proceso de depurar paso a paso el código DAX de tu modelo sea mucho, mucho más sencillo. A nivel conceptual, el depurador es similar a los depuradores tradicionales de los IDE, como el que se encuentra en Visual Studio al desarrollar aplicaciones C#. +Tabular Editor 3 introduce el concepto de **depurador de DAX**, una herramienta que facilita mucho el proceso de adentrarse en el código DAX de tu modelo. A nivel conceptual, el depurador es similar a los depuradores de IDE tradicionales, como el que se encuentra en Visual Studio al desarrollar aplicaciones en C#. ## Requisitos previos +El depurador de DAX analiza el código DAX de su modelo y genera consultas DAX adecuadas para evaluar subexpresiones, contextos de fila, etc., lo que le permite recorrer el código de forma interactiva. -El Depurador de DAX analiza el código DAX de tu modelo y genera consultas DAX adecuadas para evaluar subexpresiones, contextos de fila, etc., lo que te permite recorrer el código de forma interactiva. - -Para que esto funcione, Tabular Editor 3 debe operar en modo **conectado** o en **modo del área de trabajo**, como cuando se cargan los metadatos del modelo directamente desde Power BI Desktop o desde cualquier otra instancia de Analysis Services. +Para que esto funcione, Tabular Editor 3 debe operar en **modo conectado** o **modo espacio de trabajo**, como cuando se cargan los metadatos del modelo directamente desde Power BI Desktop o desde cualquier otra instancia de Analysis Services. # Primeros pasos -Mientras Tabular Editor 3 está conectado a una instancia de Analysis Services, el depurador se puede iniciar de una de estas dos maneras: +Mientras Tabular Editor 3 está conectado a una instancia de Analysis Services, el depurador se puede iniciar de dos maneras diferentes: -- Mediante una Pivot Grid +- A través de un Pivot Grid - A través de una consulta DAX -Una vez iniciado el depurador, se muestran varias vistas nuevas que proporcionan información contextual sobre el código que estás depurando, además de una vista de script DAX que resalta la parte que se está depurando en ese momento. +Una vez iniciado el depurador, se le presentan varias vistas nuevas que proporcionan información contextual sobre el código que se está depurando, así como una vista de script DAX que resalta la parte del código que se está depurando en ese momento. > [!TIP] -> Antes de iniciar una sesión de depuración, considera dar formato a tu código DAX para que sea más fácil de leer. - -# Depuración mediante un Pivot Grid - -1. Crea un nuevo Pivot Grid (**Archivo > Nuevo > Pivot Grid**) -2. Agrega la medida que quieras depurar al Pivot Grid. Puedes elegir entre lo siguiente: +> Antes de iniciar una sesión de depuración, plantéate formatear tu código DAX para que sea más fácil de leer. -- Arrastrar una medida desde el Explorador TOM, o -- Hacer clic con el botón derecho en una medida en el Explorador TOM y elegir **Agregar a Pivot Grid**, o -- Seleccionar la medida desde la lista de campos del Pivot Grid (**Pivot Grid > Mostrar campos**) +# Depuración a través de un Pivot Grid -3. (Opcional) Agrega una o varias columnas al Pivot Grid en el área de Filtro, el área de Columnas o el área de Filas. -4. Haz clic con el botón derecho en la celda de valor dentro del Pivot Grid y elige **Depurar este valor**. +1. Cree una nueva Pivot Grid (**Archivo > Nuevo > Pivot Grid**) +2. Añade la medida que quieres depurar al Pivot Grid. Puedes: + - Arrastrar una medida desde el Explorador TOM, o + - Hacer clic con el botón derecho en una medida en el Explorador TOM y elegir **Agregar a Pivot Grid**, o + - Seleccionar la medida de la lista de campos del Pivot Grid (**Pivot Grid > Mostrar campos**) +3. (Opcional) Añada una o más columnas o jerarquías al Pivot Grid en el área de Filtros, el área de Columnas o el área de Filas. +4. Haga clic con el botón derecho en la celda de valor dentro del Pivot Grid y elija **Depurar este valor**. -![Depurar desde tabla dinámica](~/content/assets/images/features/debug-from-pivot.png) +![Depurar desde la tabla dinámica](~/content/assets/images/features/debug-from-pivot.png) -# Depuración mediante una Consulta DAX +# Depuración mediante una consulta DAX -1. Crea una nueva consulta DAX (**Archivo > Nuevo > Consulta DAX**). -2. Escribe o pega la consulta DAX. Normalmente, se trata de una consulta compuesta por una llamada a `SUMMARIZECOLUMNS` con una o varias medidas (explícitas), como la que generan los objetos Visual en Power BI. +1. Cree una nueva consulta DAX (**Archivo > Nuevo > Consulta DAX**). +2. Escriba o pegue la consulta DAX. Por lo general, debería tratarse de una consulta formada por una llamada `SUMMARIZECOLUMNS` con una o más medidas (explícitas), como la generada por los elementos visuales en Power BI. > [!TIP] -> Puedes usar el [Performance Analyzer](https://docs.microsoft.com/power-bi/create-reports/desktop-performance-analyzer) en Power BI Desktop para capturar la consulta generada por los objetos Visual. +> Puede usar el [Analizador de rendimiento](https://docs.microsoft.com/power-bi/create-reports/desktop-performance-analyzer) en Power BI Desktop para capturar la consulta generada por los elementos visuales. -3. Pulsa F5 para ejecutar la consulta en Tabular Editor 3. Localiza el valor que quieras depurar, haz clic con el botón derecho en la celda y elige **Depurar**. +3. Pulse F5 para ejecutar la consulta en Tabular Editor 3. Localice el valor que desea depurar, haga clic con el botón derecho en la celda y elija **Depurar**. -![Depurar desde consulta](~/content/assets/images/features/debug-from-query.png) +![Depurar desde una consulta](~/content/assets/images/features/debug-from-query.png) # Vistas de depuración -El depurador proporciona las siguientes vistas (si están ocultas, puedes acceder a ellas mediante el menú **Depurar > Ventanas**). +El depurador ofrece las siguientes vistas (si están ocultas, se puede acceder a ellas a través del menú **Depurar > Ventanas**). - Variables locales -- Inspección +- Vigilancia - Contexto de evaluación - Árbol de llamadas ## Variables locales +Esta vista enumera las columnas, las medidas y las variables dentro del ámbito de ejecución actual y muestra sus valores. También muestra el valor de la subexpresión actual que se está depurando. Los valores de esta lista se actualizan automáticamente al pasar a una subexpresión diferente o cuando se cambia el contexto de evaluación. **Los valores locales siempre se evalúan en el elemento seleccionado actualmente del árbol de llamadas**. -Esta vista enumera las columnas, las medidas y las variables dentro del ámbito de ejecución actual y muestra sus valores. También muestra el valor de la subexpresión actual que se está depurando. Los valores de esta lista se actualizan automáticamente al avanzar a otra subexpresión o cuando se cambia el contexto de evaluación. **Los valores locales siempre se evalúan en el elemento actualmente seleccionado del árbol de llamadas**. +![Locales](~/content/assets/images/locals.png) -![Variables locales](~/content/assets/images/locals.png) +Puede inspeccionar un valor local haciendo clic en el botón de la lupa dentro de la columna **Valor**. Esto abrirá un cuadro de diálogo emergente que mostrará el valor con más detalles. Esto resulta especialmente útil si el valor inspeccionado es una tabla. -Puede inspeccionar un valor de variables locales haciendo clic en el botón de la lupa dentro de la columna **Valor**. Se abrirá un cuadro de diálogo emergente que muestra el valor con más detalle. Esto es especialmente útil si el valor inspeccionado es una tabla. +![Inspeccionar el valor de las variables locales](~/content/assets/images/inspect-locals.png) -![Inspeccionar valor de variables locales](~/content/assets/images/inspect-locals.png) +Si prefiere inspeccionar el valor de las variables locales en una ventana de consulta DAX separada, puede desactivar la opción **Usar inspector emergente** en **Herramientas > Preferencias > Depurador de DAX > Variables locales**. -Si prefiere inspeccionar el valor de variables locales en una ventana de Consulta DAX independiente, puede desactivar la opción **Usar inspector emergente** en **Herramientas > Preferencias > Depurador de DAX > Variables locales**. +![Ajustes del depurador de Dax](~/content/assets/images/features/dax-debugger-settings.png) -![Configuración del depurador de Dax](~/content/assets/images/features/dax-debugger-settings.png) +## Vigilancia +Esta vista le permite introducir cualquier expresión DAX, que se calculará dentro del contexto de evaluación actual. Puede introducir expresiones escalares y de tabla, así como usar todas las funciones DAX disponibles y hacer referencia a variables dentro del ámbito de evaluación actual. Los valores de observación se actualizan automáticamente al pasar a una subexpresión diferente o cuando se cambia el contexto de evaluación. **Los valores de Observación siempre se evalúan en el ámbito del elemento seleccionado actualmente en la pila del contexto de evaluación**. -## Inspección +![Observar](~/content/assets/images/watch.png) -Esta vista le permite introducir cualquier expresión DAX, que se calculará dentro del contexto de evaluación actual. Puede introducir expresiones escalares y de tabla, puede usar todas las funciones DAX disponibles y hacer referencia a variables dentro del ámbito de evaluación actual. Los valores de seguimiento se actualizan automáticamente al avanzar a otra subexpresión o cuando se cambia el contexto de evaluación. **Los valores de seguimiento siempre se evalúan en el ámbito del elemento actualmente seleccionado en la pila del contexto de evaluación**. +Para añadir rápidamente una variable, una medida o una subexpresión a la vista «Observar», simplemente resalte una parte del código y arrástrela a la vista «Observar». También puede colocar el cursor sobre la expresión que desea añadir, luego hacer clic derecho y elegir **Vigilar esta expresión**: -![Inspección](~/content/assets/images/watch.png) +![Agregar rápidamente a Observar](~/content/assets/images/quick-add-to-watch.png) -Para añadir rápidamente una variable, una medida o una subexpresión a la vista Inspección, simplemente resalte una parte del código y arrástrela a la vista Inspección. También puede colocar el cursor sobre la expresión que quiera añadir; luego haga clic con el botón derecho y elija **Inspeccionar esta expresión**: +Para añadir, duplicar o eliminar expresiones de vigilancia, use el menú contextual que aparece al hacer clic con el botón derecho en la vista de vigilancia: -![Añadir rápidamente a Inspección](~/content/assets/images/quick-add-to-watch.png) +![Menú contextual de Observar](~/content/assets/images/watch-context-menu.png) -Para añadir, duplicar o eliminar expresiones de Inspección, utilice el menú contextual con clic derecho de la vista Inspección: +La opción **Generar consulta** es idéntica al botón de la lupa de la columna **Valor**, resaltado en la captura de pantalla siguiente. Al hacer clic en esta opción, el depurador abrirá un nuevo documento de consulta DAX, que define el contexto del cálculo, así como el cálculo en sí, lo que le permite inspeccionar los resultados con más detalle. Esto resulta especialmente útil cuando la expresión de inspección es una expresión de tabla, como se muestra a continuación: -![Menú contextual de Inspección](~/content/assets/images/watch-context-menu.png) - -La opción **Generar consulta** es idéntica al botón de la lupa de la columna **Valor**, como se resalta en la captura de pantalla siguiente. Al hacer clic en esto, el depurador abrirá un nuevo documento de Consulta DAX, que define tanto el contexto del cálculo como el propio cálculo, lo que te permitirá inspeccionar los resultados con más detalle. Esto resulta especialmente útil cuando la expresión de seguimiento es una expresión de tabla, como se muestra a continuación: - -![Inspeccionar la ventana de inspección](~/content/assets/images/inspect-watch.png) +![Inspeccionar Variables de seguimiento](~/content/assets/images/inspect-watch.png) > [!TIP] -> ¿Cuál es la diferencia entre la vista **Locals** y la vista **Watch**? -> -> - **Locals** muestra los valores de las columnas, medidas, variables y otras subexpresiones relevantes dentro del ámbito de ejecución actual, incluido el valor de la subexpresión seleccionada actualmente en el árbol de llamadas. -> - **Watch** le permite introducir cualquier expresión DAX, que se calculará dentro del contexto de evaluación actual. +> ¿Cuál es la diferencia entre la vista **Locales** y la vista **Observar**? +> - **Locales** muestra los valores de las columnas, las medidas, las variables y otras subexpresiones relevantes, dentro del ámbito de ejecución actual, incluido el valor de la subexpresión seleccionada actualmente en el árbol de llamadas. +> - **Observar** le permite introducir cualquier expresión DAX, que se calculará dentro del contexto de evaluación actual. ## Contexto de evaluación +Esta vista proporciona información sobre el contexto de evaluación DAX de la subexpresión actual. Por ejemplo, una expresión `CALCULATE` podría realizar una transición de contexto o añadir un filtro al contexto de evaluación, o un iterador `SUMX` podría añadir un contexto de fila. -Esta vista proporciona información sobre el contexto de evaluación de DAX de la subexpresión actual. Por ejemplo, una expresión `CALCULATE` puede realizar una transición de contexto o agregar un filtro al contexto de evaluación, o un iterador `SUMX` puede agregar un contexto de fila. +![Contexto de evaluación](~/content/assets/images/evaluation-context.png) -![contexto de evaluación](~/content/assets/images/evaluation-context.png) - -Puede hacer doble clic en un elemento de la pila de contexto de evaluación, para llevar el foco a ese elemento. Esto hará que todas las expresiones de **Watch** se vuelvan a evaluar en el nuevo contexto (es decir, todos los contextos desde la parte inferior de la pila hasta e incluyendo el elemento actualmente enfocado). Esto se ilustra en la animación siguiente. Fíjese también en cómo puede inspeccionar el valor de columnas individuales en el contexto de fila activo desplazándose por las filas dentro de cualquier iteración activa: +Puede hacer doble clic en un elemento de la pila del contexto de evaluación para centrar la atención en ese elemento. Esto hará que todas las expresiones **Vigilar** se vuelvan a evaluar en el nuevo contexto (es decir, todos los contextos desde la parte inferior de la pila hasta el elemento en el que se encuentra el foco actualmente, incluido este). Esto se ilustra en la animación a continuación. Observe también cómo puede inspeccionar el valor de columnas individuales en el contexto de fila activo desplazándose por las filas dentro de cualquier iteración activa: ![Árbol de llamadas](~/content/assets/images/navigating-evaluation-context.gif) -También puedes activar o desactivar filtros individuales del contexto de filtro externo (por ejemplo, las columnas de agrupación en la llamada a [`SUMMARIZECOLUMNS`](https://dax.guide/summarizecolumns) que generó la consulta o los filtros especificados en un Pivot Grid). Esto se ilustra en la animación siguiente. Los filtros activados o desactivados de esta manera se aplicarán tanto a Watch como a Locals. +También puedes activar o desactivar filtros individuales desde el contexto de filtro externo (por ejemplo, agrupar columnas en la llamada [`SUMMARIZECOLUMNS`](https://dax.guide/summarizecolumns) que generó la consulta o los filtros especificados en un Pivot Grid). Esto se ilustra en la animación a continuación. Los filtros activados de esta manera se aplicarán tanto a «Observar» como a «Locales». ![Árbol de llamadas](~/content/assets/images/toggle-filters.gif) -Por último, puede examinar las primeras 1000 filas de cualquier iterador y establecer el contexto de fila actual en una fila específica dentro de esas primeras 1000 haciendo clic en el botón Zoom de la columna **Fila**. +Por último, puede examinar las primeras 1000 filas de cualquier iterador, estableciendo el contexto de fila actual en una fila específica dentro de esas primeras 1000, haciendo clic en el botón Zoom de la columna **Fila**. ![Explorar contextos de fila](~/content/assets/images/browse-row-contexts.png) ## Árbol de llamadas - -Esta vista ofrece un esquema de todo el cálculo y le permite navegar fácilmente entre subexpresiones haciendo doble clic (también puede usar teclas de acceso directo para la navegación). El árbol también proporciona información sobre transiciones de contexto, iteraciones y contextos de fila. Las ramas de código que no se ejecutarán (por ejemplo, en una llamada a `IF` o `SWITCH`, o cuando un iterador está vacío) se muestran tachadas. +Esta vista ofrece un esquema de todo el cálculo y le permite navegar fácilmente entre subexpresiones haciendo doble clic (también puede usar teclas de acceso directo para navegar). El árbol también proporciona información sobre las transiciones de contexto, las iteraciones y los contextos de fila. Las ramas de código que no se ejecutarán (por ejemplo, en una llamada `IF` o `SWITCH`, o cuando un iterador está vacío) aparecen tachadas. ![Árbol de llamadas](~/content/assets/images/call-tree.png) -A medida que navegas entre los elementos del árbol de llamadas, el script de depuración de DAX resaltará el código correspondiente al elemento del árbol de llamadas y, además, indicará (con un fondo gris) la ruta seguida para llegar al código resaltado, como se muestra a continuación: +A medida que navega entre los elementos del árbol de llamadas, el script DAX de depuración resaltará el código correspondiente al elemento del árbol de llamadas, al tiempo que indicará (con un fondo gris) la ruta seguida para llegar al código resaltado, como se muestra a continuación: ![Árbol de llamadas](~/content/assets/images/navigating-call-tree.gif) -Fíjate en cómo se actualizan los valores de la vista **Locals** a medida que navegas por el árbol. También puedes ir a una subexpresión colocando el cursor sobre la expresión, haciendo clic con el botón derecho y seleccionando la opción **Entrar en la selección** (Ctrl+B). +Observe cómo se actualizan los valores de la vista **Locales** a medida que se navega por el árbol. También puede navegar hasta una subexpresión colocando el cursor sobre la expresión, haciendo clic derecho y eligiendo la opción **Entrar en selección** (Ctrl+B). -![Entrar en la selección](~/content/assets/images/debugger-step-into-selection.png) +![Entrar en selección](~/content/assets/images/debugger-step-into-selection.png) ## Predicados escalares -Los predicados escalares usados en los argumentos de filtro de las funciones [`CALCULATE`](https://dax.guide/calculate) o [`CALCULATETABLE`](https://dax.guide/calculatetable) se tratan de forma especial en la vista **Locals**. +Los predicados escalares utilizados en los argumentos de filtro de las funciones [`CALCULATE`](https://dax.guide/calculate) o [`CALCULATETABLE`](https://dax.guide/calculatetable) se tratan de una forma especial, en la vista **Locales**. -Por ejemplo, la siguiente medida usa un predicado escalar para mostrar solo las ventas realizadas en EE. UU. o Canadá. +Por ejemplo, la siguiente medida usa un predicado escalar para mostrar solo las ventas realizadas en EE. UU. o Canadá. ```dax CALCULATE( @@ -166,7 +157,7 @@ CALCULATE( ) ``` -A primera vista, la expresión de la línea 3 parece que devolverá un valor escalar (verdadero/falso). Sin embargo, en DAX, los filtros son tablas. En realidad, el predicado escalar se convierte en una expresión de tabla mediante la función [`FILTER`](https://dax.guide/filter), como se muestra a continuación: +A primera vista, parece que la expresión de la línea 3 devolvería un valor escalar (verdadero/falso). Sin embargo, en DAX, los filtros son tablas. En realidad, el predicado escalar se convierte en una expresión de tabla mediante la función [`FILTER`](https://dax.guide/filter), como se muestra a continuación: ```dax CALCULATE( @@ -178,48 +169,48 @@ CALCULATE( ) ``` -La función `FILTER` es un iterador que recorre la tabla `ALL(Geography[Country Region Code])`, es decir, todos los valores únicos de la columna "Country Region Code" de la tabla "Geography". Los iteradores generan un contexto de filtro para cada fila de la iteración. A continuación, el predicado escalar se evalúa en cada uno de esos contextos de fila. En el caso de la función `FILTER`, solo se conservan las filas en las que el predicado se evalúa como `TRUE`. En este ejemplo, la función `FILTER` devolvería una tabla con 1 columna ("Country Region Code") y 2 filas ("US" y "CA"). +La función `FILTER` es un iterador que recorre la tabla `ALL(Geography[Country Region Code])`, es decir, todos los valores únicos de la columna «Country Region Code» de la tabla «Geography». Los iteradores generan un contexto de filtro para cada fila de la iteración. A continuación, el predicado escalar se evalúa en cada uno de esos contextos de fila. En el caso de la función `FILTER`, solo se conservan las filas para las cuales el predicado se evalúa como `TRUE`. En este ejemplo, la función `FILTER` devolvería una tabla con 1 columna («Country Region Code») y 2 filas («US» y «CA»). -Al depurar un predicado escalar, la vista **Locals** mostrará dos elementos especiales: **(Expresión actual)** y **(Expresión de filtro)**. Se describen a continuación: +Al depurar un predicado escalar, la vista **Locales** mostrará dos elementos especiales, **(Expresión actual)** y **(Expresión de filtro)**. A continuación, se describen: ![Depurar predicados escalares](~/content/assets/images/features/debug-scalar-predicates.png) -En la captura anterior: +En la captura de pantalla anterior: -1. Este es el predicado escalar que se está depurando en este momento. Aunque esta subexpresión parece que debería devolver un valor escalar (verdadero/falso), en realidad devuelve una tabla. -2. **(Expresión actual)**: Este es el valor _escalar_ del predicado cuando se evalúa dentro del _contexto de fila_ actual generado por la función `FILTER`, tal y como se describió anteriormente. En la captura de pantalla, el valor escalar se evalúa como `False`, porque el valor de [Country Region Code] en el contexto de fila actual es "AU", como se puede ver en la vista **Watch** (4). Podemos usar la vista **Contexto de evaluación** (5) para desplazarnos por las filas de la iteración, una por una. -3. **(Expresión de filtro)**: Esta es la expresión de _tabla_ generada por la función `FILTER`, tal y como se describió anteriormente. En la captura de pantalla, se trata de una tabla 1x2 que contiene los valores "US" y "CA". Al hacer clic en el botón de la lupa, se abrirá una ventana emergente que muestra los valores de la tabla en una cuadrícula. -4. Podemos usar la ventana **Watch** para evaluar cualquier expresión DAX dentro del contexto de evaluación actual. En este caso, como tenemos un contexto de fila activo, podemos hacer referencia directamente a columnas del contexto de fila, como `Geography[Country Region Code]`. Podemos ver que el valor actual de esta columna es "AU", por lo que el predicado escalar (2) se evalúa como `False`. -5. Podemos usar la vista **Contexto de evaluación** para desplazarnos por las filas de la iteración, una por una. Esto actualizará los valores de las vistas **Locals** y **Watch** para que reflejen los valores del contexto de fila actual. +1. Este es el predicado escalar que se está depurando actualmente. Aunque esta subexpresión parece una que debería devolver un valor escalar (verdadero/falso), en realidad devuelve una tabla. +2. **(Expresión actual)**: Este es el valor *escalar* del predicado, cuando se evalúa dentro del *contexto de fila* actual generado por la función `FILTER` como se ha descrito anteriormente. En la captura de pantalla, el valor escalar se evalúa como «False», porque el valor de [Country Region Code] en el contexto de fila actual es «AU», como se puede ver en la vista **Watch** (4). Podemos usar la vista **Contexto de evaluación** (5) para desplazarnos por las filas de la iteración una a una. +3. **(Expresión de filtro)**: Esta es la expresión de *tabla* generada por la función `FILTER`, como se ha descrito anteriormente. En la captura de pantalla, se trata de una tabla de 1 x 2 que contiene los valores «US» y «CA». Al hacer clic en el botón de la lupa, se abrirá una ventana emergente que muestra los valores de la tabla en una cuadrícula. +4. Podemos usar la ventana **Observar** para evaluar cualquier expresión DAX dentro del contexto de evaluación actual. En este caso, como tenemos un contexto de fila activo, podemos hacer referencia directamente a las columnas del contexto de fila, como `Geography[Country Region Code]`. Podemos ver que el valor actual de esta columna es «AU», por lo que el predicado escalar (2) se evalúa como «False». +5. Podemos usar la vista **Contexto de evaluación** para desplazarnos por las filas de la iteración, una por una. Esto actualizará los valores en la vista **Locales**, así como en la vista **Observar**, para reflejar los valores en el contexto de fila actual. -## Atajos de teclado +## Accesos directos de teclado -Usa los siguientes atajos de teclado para navegar rápidamente por el árbol de llamadas: +Use los siguientes atajos de teclado para navegar rápidamente por el árbol de llamadas: -- **Step in (F11)**: entra en el primer elemento secundario del elemento actual en el árbol de llamadas. Si no hay más elementos secundarios, salta al siguiente elemento del mismo nivel. -- **Step out (Mayús-F11)**: vuelve al elemento padre del elemento actual en el árbol de llamadas. -- **Step over (F10)**: salta al siguiente parámetro de la función, a la siguiente subexpresión de una operación aritmética, o entra en la llamada a la función actual (si es una función no trivial). -- **Step back (Mayús-F10)**: salta al parámetro anterior de la función, a la subexpresión anterior de una operación aritmética o vuelve al elemento padre del elemento actual si no hay parámetros ni subexpresiones antes del elemento actual. -- **Step into selection (Ctrl-B)**: salta a la expresión situada bajo el cursor. Si varias rutas conducen a la misma expresión (por ejemplo, cuando una medida está referenciada por varias medidas y dichas medidas), un cuadro de diálogo le pedirá que elija la ruta. -- **Next row (F9)**: cambia el contexto de fila de la iteración más interna a la siguiente fila del iterador. -- **Previous row (Mayús-F9)**: cambia el contexto de fila de la iteración más interna a la fila anterior del iterador. +- **Entrar en (F11)**: entra en el primer elemento secundario del elemento actual en el árbol de llamadas. Si no hay más elementos secundarios, salta al siguiente elemento del mismo nivel. +- **Salir de (Mayús+F11)**: sale al elemento primario del elemento actual en el árbol de llamadas. +- **Pasar por encima (F10)**: salta al siguiente parámetro de la función, a la siguiente subexpresión de una operación aritmética o entra en la llamada a la función actual (si se trata de una función no trivial). +- **Paso atrás (Mayús-F10)**: salta al parámetro de función anterior, a la subexpresión anterior de una operación aritmética o sale al elemento principal del elemento actual si no hay parámetros ni subexpresiones antes del elemento actual. +- **Entrar en selección (Ctrl+B)**: salta a la expresión situada bajo el cursor. Si varias rutas conducen a la misma expresión (por ejemplo, cuando varias medidas hacen referencia a una medida y a estas medidas), aparecerá un cuadro de diálogo para que elija la ruta. +- **Siguiente fila (F9)**: desplaza el contexto de fila de la iteración más interna a la siguiente fila del iterador. +- **Fila anterior (Mayús-F9)**: desplaza el contexto de fila de la iteración más interna a la fila anterior del iterador. # Limitaciones y problemas conocidos -Actualmente, el Depurador de DAX tiene las siguientes limitaciones: +Actualmente, el depurador de DAX tiene las siguientes limitaciones: -- **UDFs:** Actualmente no se admiten las funciones definidas por el usuario (UDF). Si se encuentra una UDF en el código que se está depurando, el depurador puede comportarse de forma inesperada. -- Al depurar una Consulta DAX, solo se admite un subconjunto de expresiones de tabla DAX (por ejemplo, se pueden depurar consultas que dependan de [SUMMARIZECOLUMNS](https://dax.guide/summarizecolumns), mientras que actualmente no se admiten otras funciones de tabla). En general, se admiten las consultas generadas por Power BI (que se pueden capturar mediante el Analizador de rendimiento de Power BI Desktop). -- Actualmente no se admiten las consultas que contengan medidas implícitas o cálculos con ámbito de consulta. -- Al examinar las primeras 1000 filas de un iterador que proviene de una expresión de tabla filtrada, la fila seleccionada en la ventana de exploración puede no corresponder siempre al contexto de fila actual en la pila de contexto de evaluación (escribe `CALCULATETABLE('')` en la ventana **Watch** para inspeccionar el contexto de fila actual). +- **UDF:** Actualmente no se admiten las funciones definidas por el usuario (UDF). Si se encuentra una UDF en el código que se está depurando, el depurador puede comportarse de forma inesperada. +- Solo se admite un subconjunto de expresiones de tabla DAX al depurar una consulta DAX (por ejemplo, se pueden depurar las consultas que dependen de [SUMMARIZECOLUMNS](https://dax.guide/summarizecolumns), mientras que otras funciones de tabla no se admiten actualmente). Por lo general, se admiten las consultas generadas por Power BI (que se pueden capturar a través del analizador de rendimiento de Power BI Desktop). +- Actualmente no se admiten consultas que contengan medidas implícitas o cálculos con ámbito de consulta. +- Al explorar las primeras 1000 filas de un iterador que surge de una expresión de tabla filtrada, es posible que la fila seleccionada en la ventana de exploración no siempre corresponda al contexto de fila actual en la pila de contextos de evaluación (escriba «CALCULATETABLE('')» en la ventana **Observar** para inspeccionar el contexto de fila actual). - Actualmente, el depurador solo permite depurar expresiones DAX en medidas. -- Los [cálculos Visual](https://learn.microsoft.com/power-bi/transform-model/desktop-visual-calculations-overview) no se pueden depurar, ya que se definen mediante columnas con alcance de consulta. Actualmente, el depurador no admite objetos con ámbito de consulta. -- Si una medida se modifica mediante un elemento de cálculo en el contexto de filtro, los resultados parciales mostrados en la vista Watch / Locals del depurador pueden ser incorrectos. +- Los [cálculos visuales](https://learn.microsoft.com/power-bi/transform-model/desktop-visual-calculations-overview) no se pueden depurar, ya que se definen mediante columnas con ámbito de consulta. El depurador no admite actualmente objetos de ámbito de consulta. +- Si un elemento de cálculo modifica una medida en el contexto de filtro, los resultados parciales que se muestran en la vista Variables/Locales del depurador pueden ser incorrectos. -Si encuentras un problema con el depurador, distinto de los indicados anteriormente, publícalo en nuestro [seguimiento de incidencias](https://github.com/TabularEditor/TabularEditor3/issues) en el sitio de soporte de la comunidad de TE3 en GitHub. +Si tiene algún problema con el depurador, aparte de los mencionados anteriormente, publíquelo en nuestro [seguidor de problemas](https://github.com/TabularEditor/TabularEditor3/issues) en el sitio de GitHub de asistencia a la comunidad de TE3. # Hoja de ruta -Tenemos previsto añadir muchas más funciones al Depurador de DAX a lo largo del tiempo, para abordar los problemas anteriores y hacer que la herramienta sea aún más completa. Como siempre, los comentarios son más que bienvenidos. Por favor, utilice la [sección de Discusiones](https://github.com/TabularEditor/TabularEditor3/discussion) para solicitar nuevas funciones y para debates generales. +Tenemos previsto añadir muchas funciones adicionales al Depurador de DAX con el tiempo, para solucionar los problemas mencionados anteriormente y para que la herramienta sea aún más potente. Como siempre, los comentarios son más que bienvenidos. Utilice el [área de debates](https://github.com/TabularEditor/TabularEditor3/discussion) para solicitar funciones y participar en debates generales. **¡Feliz depuración!** diff --git a/localizedContent/es/content/features/dax-editor.md b/localizedContent/es/content/features/dax-editor.md index b1eadc577..3e004ce19 100644 --- a/localizedContent/es/content/features/dax-editor.md +++ b/localizedContent/es/content/features/dax-editor.md @@ -1,8 +1,8 @@ ---- +--- uid: dax-editor title: Editor de DAX author: Daniel Otykier -updated: 2026-09-14 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,58 +16,57 @@ applies_to: - edition: Enterprise full: true --- - # Editor de DAX -El **Editor de DAX** es la pieza central de Tabular Editor 3. +El **Editor de DAX** es la pieza central de Tabular Editor 3. -Viene en tres _sabores_ diferentes: +Está disponible en tres *versiones* diferentes: -- **Editor de expresiones** Se utiliza para realizar cambios rápidos en expresiones DAX individuales en los objetos del Explorador TOM. -- **Consulta DAX** (funcionalidad conectada): Se utiliza para escribir consultas DAX y recuperar datos de la instancia conectada de Analysis Services/Power BI. -- **Script DAX:** Se utiliza para ver y editar expresiones DAX y propiedades básicas en varios objetos dentro de un único documento. +- **Editor de expresiones** Se utiliza para realizar cambios rápidos en expresiones DAX singulares en objetos del Explorador TOM. +- **Consulta DAX** (función conectada) Se utiliza para escribir consultas DAX con el fin de recuperar datos de la instancia conectada de Analysis Services / Power BI. +- **Script DAX** Se utiliza para ver y editar expresiones DAX y propiedades básicas en múltiples objetos en un único documento. -Las tres modalidades admiten las mismas operaciones, como [atajos de teclado](xref:shortcuts3#dax-code), resaltado de sintaxis, Code Assist, etc. +Las tres versiones admiten las mismas operaciones en términos de [accesos directos de teclado](xref:shortcuts3#dax-code), resaltado de sintaxis, asistencia de código, etc. ## Funciones de Code Assist -El principal impulsor de la productividad en el Editor de DAX de Tabular Editor 3 son las funciones **Información de parámetros** y **Autocompletar**. En conjunto, se conocen como funciones de **Code Assist** (otros proveedores usan el término "IntelliSense"). +Los principales elementos que favorecen la productividad en el editor DAX de Tabular Editor 3 son sus funciones **Información de parámetros** y **Autocompletar**. En conjunto, se conocen como funciones de **Code Assist** (otros proveedores utilizan el término «IntelliSense»). -**Información de parámetros** ofrece detalles sobre la función DAX y su parámetro en la posición del cursor. La información se muestra en un globo de ayuda sobre el cursor. Pulsa [Esc] para cerrar el globo de ayuda y [Ctrl+Shift+Space] para mostrarlo. +**Información de parámetros** proporciona detalles sobre la función DAX y su parámetro en la posición del cursor. La información se muestra en una información sobre herramientas situada encima del cursor. Pulse [Esc] para cerrar la información sobre herramientas y [Ctrl+Mayús+Espacio] para mostrarla. -**Autocompletar** ofrece sugerencias en función del contexto mientras escribes, en una lista desplegable. Puedes usar el teclado para desplazarte por los elementos de la lista desplegable, y al pulsar [Enter] o [Tab] se insertará el elemento seleccionado en tu código. Puedes pulsar [Esc] para cerrar la lista desplegable y [Ctrl+Space] para abrirla. +**Autocompletar** ofrece sugerencias contextuales mientras escribes, en un cuadro desplegable. Puede usar el teclado para desplazarse por los elementos del menú desplegable y, si pulsa [Intro] o [Tab], se insertará el elemento seleccionado en su código. Puede pulsar [Esc] para cerrar el menú desplegable y [Ctrl+Espacio] para abrirlo. -Estas funciones también se pueden activar desde el menú contextual del editor. +Estas funciones también se pueden activar a través del menú contextual del editor. -Los calltips de DAX se actualizan al alternar entre las opciones de sintaxis con las flechas Arriba/Abajo. +Las sugerencias de llamada de DAX se actualizan a medida que vas pasando por las alternativas de sintaxis utilizando las flechas arriba/abajo. -![Code Assist de Dax](~/content/assets/images/dax-code-assist.png) +![Code Assist de DAX](~/content/assets/images/dax-code-assist.png) -La mayoría de los aspectos de Code Assist se pueden configurar en [**Herramientas > Preferencias > Editores de texto > Editor de DAX > Code Assist**](xref:preferences#dax-editor--code-assist). +La mayoría de los aspectos de la asistencia de código se pueden configurar en [**Herramientas > Preferencias > Editores de texto > Editor de DAX > Asistencia de código**](xref:preferences#text-editors--dax-editor--code-assist). ## Ver la definición -Con el cursor sobre una referencia a un objeto, como una variable o una referencia a una medida, pulsa [Alt+F12] para mostrar un editor en línea con la definición de ese objeto, debajo del cursor. Esto resulta útil cuando desea ver el código DAX de un objeto al que se hace referencia sin salir de la posición actual del documento. +Mientras el cursor esté sobre una referencia de objeto, como una variable o una referencia de medida, presione [Alt+F12] para mostrar un editor insertado con la definición de ese objeto, debajo del cursor. Esto es útil cuando desea ver el código DAX de un objeto referenciado sin abandonar la posición actual en el documento. ![Ver la definición](~/content/assets/images/peek-definition.png) -Usa la tecla Esc para volver a cerrar el panel de Ver la definición. +Use la tecla Esc para volver a cerrar el panel Ver la definición. ## Ir a definición -En lugar de usar Ver la definición, también podemos saltar directamente a la ubicación donde está definido el objeto referenciado. Para ello, pulsa [F12]. Si el objeto referenciado no está definido en el documento actual, esta operación saltará a ese objeto en el Explorador TOM. Si lo necesita, puede volver atrás con [Alt+Flecha izquierda]. +En lugar de echar un vistazo, también podemos ir directamente a la ubicación donde se define el objeto al que se hace referencia. Para ello, pulse [F12]. Si el objeto al que se hace referencia no está definido dentro del documento actual, esta operación saltará a ese objeto en el Explorador TOM. Si es necesario, puedes volver atrás usando [Alt+Flecha izquierda]. ## Definir medida -En los scripts DAX y las consultas DAX, a veces es útil incluir la definición de una medida a la que se hace referencia en otra parte del código. La función **Definir medida** permite hacerlo cuando el cursor está sobre una referencia a una medida. También puede elegir la opción **Definir medida con dependencias** si desea incluir también todas las referencias posteriores a medidas. +En el caso de los scripts DAX y las consultas DAX, a veces resulta útil incluir la definición de una medida a la que se hace referencia en otra parte del código. La función **Definir medida** le permite hacerlo cuando el cursor está sobre una referencia de medida. También puede elegir la opción **Definir medida con dependencias** si desea incluir también todas las referencias de medidas posteriores. ![Definir medida con dependencias](~/content/assets/images/define-measure-with-deps.png) ## Medida en línea -Si desea traer la definición de una medida al documento actual, la función **Medida en línea** permite hacerlo. Haz clic con el botón derecho en una referencia de medida en el editor de DAX y selecciona **Medida en línea**. +Si desea incorporar la definición de una medida al documento actual, la función **Medida en línea** le permite hacerlo. Haga clic con el botón derecho en una referencia de medida en el editor DAX y elija **Medida en línea**. -Una referencia de medida convierte implícitamente la fila actual en un filtro antes de que se evalúe la expresión de la medida. Por tanto, pegar la expresión tal cual cambiaría el resultado. Así, cuando la referencia está dentro de un contexto de fila —por ejemplo, como segundo argumento de un iterador como [`SUMX`](https://dax.guide/sumx) o [`FILTER`](https://dax.guide/filter)—, Tabular Editor envuelve la expresión en línea con [`CALCULATE`](https://dax.guide/calculate) para conservar ese comportamiento: +Una referencia de medida convierte implícitamente la fila actual en un filtro antes de que se evalúe la expresión de la medida. Por lo tanto, pegar la expresión tal cual cambiaría el resultado, de modo que cuando la referencia se encuentra dentro de un contexto de fila, por ejemplo, como el segundo argumento de un iterador como [`SUMX`](https://dax.guide/sumx) o [`FILTER`](https://dax.guide/filter), Tabular Editor envuelve la expresión insertada en [`CALCULATE`](https://dax.guide/calculate) para preservar ese comportamiento: ```dax // Before using inline measure on the [Margin] measure @@ -77,24 +76,24 @@ SUMX ( 'Sales', [Margin] ) SUMX ( 'Sales', CALCULATE ( 'Sales'[Amount] - 'Sales'[Cost] ) ) ``` -El encapsulado solo se agrega cuando puede marcar la diferencia. La expresión se inserta sin encapsular cuando: +El encapsulamiento solo se añade cuando puede marcar la diferencia. La expresión se inserta sin envolver cuando: -- la referencia **no está dentro de un contexto de fila**, incluido cuando ya está dentro de su propio `CALCULATE( ... )` propio -- la expresión de la medida **no lee nada del modelo** (una constante, una referencia a otra medida o una llamada a una función como `TODAY()`). Una referencia a una tabla, una columna, un calendario o una [función definida por el usuario](xref:udfs) sí se considera una lectura del modelo y, por tanto, sí se encapsula -- la expresión **ya realiza la transición por sí misma**, mediante un `CALCULATE( ... )` o `CALCULATETABLE( ... )` sin argumentos de filtro. Con un argumento de filtro, el envoltorio se sigue agregando, porque los argumentos de filtro se evalúan antes de la transición +- La referencia **no está dentro de un contexto de fila**, incluso cuando ya se encuentra dentro de su propio `CALCULATE( ... )`. +- La expresión de la medida **no lee nada del modelo** (una constante, una referencia a otra medida o una llamada a una función como `TODAY()`). Una referencia a una tabla, una columna, un calendario o una [función definida por el usuario](xref:udfs) sí cuenta como lectura del modelo y sí se le aplica el «wrap». +- La expresión **ya realiza la transición por sí misma**, a través de un `CALCULATE( ... )` o `CALCULATETABLE( ... )` sin argumentos de filtro. Con un argumento de filtro, el «wrap» se añade de todos modos, ya que los argumentos de filtro se evalúan antes de la transición. -Si no se puede analizar la expresión de la medida, se agrega el encapsulado, partiendo del principio de que un encapsulado innecesario no hace daño, mientras que uno ausente sí. +Si no se puede analizar la expresión de la medida, se añade el encapsulamiento, partiendo del principio de que un encapsulamiento que no era necesario es inofensivo, mientras que uno que falta no lo es. -## Dar formato a DAX +## Formatear DAX -El Editor de DAX de Tabular Editor 3 formatea automáticamente su código mientras escribe; es decir, corrige las mayúsculas y minúsculas de las funciones y las referencias a objetos, añade la sangría adecuada y los espacios entre paréntesis, etc. Todo esto se puede configurar en [**Herramientas > Preferencias > Editores de texto > Editor de DAX > Formato automático**](xref:preferences#dax-editor--auto-formatting). +El editor DAX de Tabular Editor 3 formatea automáticamente su código mientras escribe, es decir, corrige las mayúsculas y minúsculas de las funciones y las referencias a objetos, añade la sangría adecuada y espacios entre paréntesis, etc. Todo esto se puede configurar en [**Herramientas > Preferencias > Editores de texto > Editor de DAX > Formato automático**](xref:preferences#text-editors--dax-editor--auto-formatting). -Sin embargo, a veces es necesario formatear todo el documento. Puedes hacerlo pulsando [F6] o [Shift+F6] si prefieres saltos de línea más frecuentes. Para las Consultas DAX, también puedes usar [Alt+F6] para reformatear el código y hacer que las comas se coloquen siempre al principio de cada línea, lo cual es útil al depurar. +Sin embargo, a veces es necesario dar formato a todo el documento. Para ello, pulse [F6] o [Mayús+F6] si prefiere saltos de línea más frecuentes. En el caso de las consultas DAX, también puede usar [Alt+F6] para formatear de nuevo el código de forma que siempre se añadan comas al principio de una línea, lo cual resulta útil al depurar. ## Refactorización -Si quieres cambiar el nombre de una variable o de una columna de extensión, puedes usar la opción **Refactor** (Ctrl+R) con el cursor situado sobre la referencia de la variable o de la columna de extensión. Esto seleccionará todas las apariciones de ese objeto, lo que te permite cambiarle el nombre en todas partes de una sola vez. +Si desea cambiar el nombre de una variable o de una columna de extensión, puede usar la opción **Refactorizar** (Ctrl+R) mientras el cursor esté situado en la referencia de la variable o de la columna de extensión. Esto seleccionará todas las instancias de ese objeto, lo que le permitirá cambiarle el nombre en todas partes a la vez. -## Atajos de teclado configurables +## Accesos directos de teclado configurables -El Editor de DAX y los editores de código en general son muy configurables y admiten muchos comandos adicionales para editar código de forma rápida y productiva. Puedes ver todos estos comandos, así como modificar y asignar atajos de teclado en **Herramientas > Preferencias > Tabular Editor > Teclado**. +El Editor de DAX y los editores de código en general son muy configurables y admiten muchos comandos adicionales para editar código de forma rápida y productiva. Puede ver todos estos comandos, así como modificar y asignar atajos de teclado en **Herramientas > Preferencias > Tabular Editor > Teclado**. diff --git a/localizedContent/es/content/features/dax-optimizer-integration.md b/localizedContent/es/content/features/dax-optimizer-integration.md index 0baee3e12..76a885210 100644 --- a/localizedContent/es/content/features/dax-optimizer-integration.md +++ b/localizedContent/es/content/features/dax-optimizer-integration.md @@ -1,8 +1,8 @@ --- uid: dax-optimizer-integration -title: Integración con el Optimizador de DAX +title: Integración del Optimizador de DAX author: Daniel Otykier -updated: 2024-10-30 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,115 +16,114 @@ applies_to: - edition: Enterprise full: true --- - -# Integración con el Optimizador de DAX +# Integración del Optimizador de DAX > [!NOTE] -> Los usuarios de Tabular Editor 3 **Edición Enterprise** pueden obtener acceso gratuito al Optimizador de DAX. [Más información](https://blog.tabulareditor.com/2024/10/31/free-dax-optimizer-access-in-tabular-editor-3/) +> Los usuarios de la **edición Enterprise** de Tabular Editor 3 tienen derecho a acceso gratuito al optimizador de DAX. [Más información](https://blog.tabulareditor.com/2024/10/31/free-dax-optimizer-access-in-tabular-editor-3/) -Tabular Editor 3.18.0 presenta **Optimizador de DAX** como una experiencia integrada. [Optimizador de DAX](https://daxoptimizer.com) es un servicio que le ayuda a optimizar sus modelos tabulares de SSAS/Azure AS y sus modelos semánticos de Power BI/Fabric. La herramienta combina estadísticas del [Analizador VertiPaq](https://www.sqlbi.com/tools/vertipaq-analyzer/) con un análisis estático de su código DAX y proporciona una lista priorizada de recomendaciones para ayudarle a identificar rápidamente posibles cuellos de botella de rendimiento. +Tabular Editor 3.18.0 presenta **DAX Optimizer** como una experiencia integrada. [DAX Optimizer](https://daxoptimizer.com) es un servicio que le ayuda a optimizar sus modelos tabulares de SSAS/Azure AS y sus modelos semánticos de Power BI/Fabric. La herramienta combina las [estadísticas del Analizador VertiPaq](https://www.sqlbi.com/tools/vertipaq-analyzer/) con un análisis estático de su código DAX, proporcionando así una lista de recomendaciones priorizadas para ayudarle a identificar rápidamente posibles cuellos de botella en el rendimiento. > [!IMPORTANT] -> El Optimizador de DAX es un servicio de terceros de pago. Para usar la funcionalidad **Optimizador de DAX** en Tabular Editor 3, necesitará una [cuenta para el Optimizador de DAX](https://www.daxoptimizer.com/free-tour/). +> El Optimizador de DAX es un servicio de terceros de pago. Para utilizar la función **Optimizador de DAX** en Tabular Editor 3, necesitará una [cuenta para el Optimizador de DAX](https://www.daxoptimizer.com/free-tour/). -## Introducción en vídeo +## Introducción en video -Mira cómo Marco Russo, de [SQLBI](https://www.sqlbi.com), presenta la integración del Optimizador de DAX en Tabular Editor 3: +Vea a Marco Russo de [SQLBI](https://www.sqlbi.com) presentar la integración de DAX Optimizer en Tabular Editor 3: - + ## Primeros pasos -Para acceder a esta funcionalidad, vaya al menú **Ver** y elija **Optimizador de DAX**. +Para acceder a esta función, vaya al menú **Ver** y seleccione **DAX Optimizer**. -![Optimizador de DAX](~/content/assets/images/features/dax-optimizer-view-menu.png) +![DAX Optimizer](~/content/assets/images/features/dax-optimizer-view-menu.png) -Aparecerá una nueva vista similar a la de la figura siguiente: +Se le mostrará una nueva vista similar a la de la siguiente imagen: -![Vista del Optimizador de DAX](~/content/assets/images/features/dax-optimizer-view.png) +![Vista de Dax Optimizer](~/content/assets/images/features/dax-optimizer-view.png) -Para conectar Tabular Editor 3 al servicio de Optimizador de DAX, haga clic en **Conectar...** desde el menú **Opciones**. Se te pedirá que introduzcas tus credenciales de Tabular Tools (Optimizador de DAX). +Para conectar Tabular Editor 3 al servicio del Optimizador de DAX, haga clic en **Conectar...** a través del menú **Opciones**. Se le pedirá que introduzca sus credenciales de Tabular Tools (Optimizador de DAX). -Si quieres **desconectarte** o **conectarte con una cuenta diferente**, vuelve a abrir el menú **Opciones** y selecciona la opción **Reconectar...**. Al cancelar el cuadro de diálogo, se desconectará la sesión actual. +Si deseas **desconectar** o **conectarte con una cuenta diferente**, vuelve al menú **Opciones** y elige la opción **Volver a conectar...**. Si cancela el cuadro de diálogo, se desconectará la sesión actual. -Si quieres que Tabular Editor 3 se conecte automáticamente la próxima vez que se inicie la aplicación, puedes marcar la opción **Conectar automáticamente** dentro del menú **Opciones**. Si tienes una cuenta del Optimizador de DAX con varios Workspace en distintas regiones, también puedes elegir a qué región conectarte desde el menú **Opciones**. +Si desea que Tabular Editor 3 se conecte automáticamente la próxima vez que se inicie la aplicación, puede marcar la opción **Conectar automáticamente** en el menú **Opciones**. Si tienes una cuenta de DAX Optimizer con espacios de trabajo en varias regiones, también puedes elegir a qué región conectarte a través del menú **Opciones**. -Por último, el menú **Opciones** también te permite cambiar a una cuenta diferente en [escenarios de grupo](https://docs.daxoptimizer.com/how-to-guides/managing-groups). +Por último, el menú **Opciones** también le permite cambiar a una cuenta diferente en [escenarios de grupo](https://docs.daxoptimizer.com/how-to-guides/managing-groups). -## Explorar Workspaces y modelos +## Exploración de espacios de trabajo y modelos -Una vez conectado, las listas desplegables de la parte superior de la vista se rellenarán con los Workspace existentes, los modelos y las versiones de modelo. Haz tus selecciones de izquierda a derecha (es decir, elige primero el **Workspace**, luego el **Modelo** y después la **Versión**). La vista mostrará un resumen de la versión del modelo seleccionada actualmente, con información como el tamaño del modelo, el número de tablas, el número de medidas, etc. +Una vez establecida la conexión, los menús desplegables de la parte superior de la vista se rellenarán con sus espacios de trabajo, modelos y versiones de modelos existentes. Realice sus selecciones de izquierda a derecha (es decir, elija primero el **Espacio de trabajo**, luego el **Modelo** y, por último, la **Versión**). La vista mostrará un resumen de la versión del modelo seleccionada en ese momento, con información como el tamaño del modelo, el número de tablas, el número de medidas, etc. -![Resumen del modelo](~/content/assets/images/model-overview.png) +![Descripción general del modelo](~/content/assets/images/model-overview.png) > [!NOTE] -> Tabular Editor 3 te permite cargar archivos VPAX para crear nuevos modelos o versiones de modelo en el servicio del Optimizador de DAX. Sin embargo, si necesitas crear o administrar Workspaces, mover o compartir modelos, etc., tendrás que hacerlo a través de la [interfaz web del Optimizador de DAX](https://app.daxoptimizer.com). +> Tabular Editor 3 le permite cargar archivos VPAX para crear nuevos modelos o versiones de modelos en el servicio del Optimizador de DAX. Sin embargo, si necesita crear o gestionar áreas de trabajo, mover o compartir modelos, etc., tendrá que hacerlo a través de la [interfaz web del Optimizador de DAX](https://app.daxoptimizer.com). -Si una versión de modelo aún no se ha analizado, tendrás la opción de iniciar el análisis. Ten en cuenta que, según el plan de tu cuenta, es posible que tengas un número limitado de "ejecuciones" disponibles. +Si una versión del modelo aún no se ha analizado, tendrá la opción de iniciar el análisis. Tenga en cuenta que, dependiendo de su plan de cuenta, es posible que tenga un número limitado de «ejecuciones» disponibles. -Una vez que el análisis haya finalizado, se te mostrará un resumen con el número de incidencias detectadas. La información que se muestra es similar a la que verías en la interfaz web del Optimizador de DAX. +Una vez finalizado el análisis, se te mostrará un resumen con el número de problemas detectados. La información que se muestra es similar a la que vería en la interfaz web del Optimizador de DAX. -Ve a la pestaña **Problemas** o **Medidas** para ver los resultados detallados. Usa los encabezados de las columnas para ordenar y filtrar los resultados. +Vaya a la pestaña **Problemas** o **Medidas** para ver los resultados detallados. Use los encabezados de las columnas para ordenar y filtrar los resultados. -![Problemas del optimizador de Dax](~/content/assets/images/features/dax-optimizer-issues.png) +![Problemas de Dax Optimizer](~/content/assets/images/features/dax-optimizer-issues.png) -## Navegar por problemas y medidas +## Navegar por los problemas y las medidas -Cuando haces doble clic en un problema o una medida en la vista detallada mostrada arriba, se abrirá la vista **Resultados del Optimizador de DAX**, donde se muestra la expresión DAX original de la medida, junto con resaltados de las zonas problemáticas. La lista del lado izquierdo de la pantalla te permite activar o desactivar los problemas que se resaltan. Además, puedes marcar los problemas como **Corregido** o **Ignorado** usando las casillas de verificación de la lista. +Al hacer doble clic en un problema o una medida en la vista detallada que se muestra arriba, accederá a la vista **Resultados del Optimizador de DAX**, donde se muestra la expresión DAX original de la medida, junto con los aspectos destacados de las áreas problemáticas. La lista del lado izquierdo de la pantalla le permite cambiar qué problemas se deben resaltar. Además, puede marcar los problemas como **Corregidos** o **Ignorados** utilizando las casillas de verificación de la lista. -![Resultados del optimizador de Dax](~/content/assets/images/features/dax-optimizer-results.png) +![Resultados del Optimizador de DAX](~/content/assets/images/features/dax-optimizer-results.png) -Haz clic en el botón **Buscar en el Explorador TOM...** situado en la esquina superior derecha de la vista para ir a la medida correspondiente del modelo cargado actualmente. +Haga clic en el botón **Buscar en el Explorador TOM...** en la parte superior derecha de la vista para ir a la medida correspondiente en el modelo cargado actualmente. -Marca la casilla **Seguir el Explorador TOM** para mantener el Explorador TOM sincronizado con la medida seleccionada actualmente en la vista **Resultados del Optimizador de DAX**. +Marque la casilla **Seguir Explorador TOM** para mantener el Explorador TOM sincronizado con la medida seleccionada actualmente en la vista Resultados del Optimizador de DAX. -Cuando haces clic en una referencia a una medida en el panel de código DAX dentro de la vista **Resultados del Optimizador de DAX**, la vista irá a esa medida. Luego puedes usar los botones **Atrás** (Alt+Left) y **Adelante** (Alt+Right) para navegar atrás y adelante entre las medidas que has visitado. +Cuando haga clic en una referencia de medida en el panel de código DAX dentro de la vista **Resultados del Optimizador de DAX**, la vista navegará hasta esa medida. A continuación, puedes usar los botones **Atrás** (Alt+Izquierda) y **Adelante** (Alt+Derecha) para navegar hacia atrás y hacia delante entre las medidas que has visitado. -## Subir modelos y versiones de modelo +## Cargar modelos y versiones de modelos -Para subir estadísticas de VPAX al Optimizador de DAX, asegúrate de que Tabular Editor esté conectado actualmente a una instancia de Analysis Services (SSAS, Azure AS, Power BI Desktop o un punto de conexión XMLA de Power BI/Fabric). Luego, en el menú desplegable de la esquina superior izquierda de la vista **Optimizador de DAX**, selecciona el Workspace. Haz clic en **Subir...** dentro del menú **Opciones**. +Para cargar estadísticas VPAX al Optimizador de DAX, asegúrese de que Tabular Editor esté conectado actualmente a una instancia de Analysis Services (SSAS, Azure AS, Power BI Desktop o punto de conexión XMLA de Power BI/Fabric). A continuación, seleccione el área de trabajo en el menú desplegable situado en la parte superior izquierda de la vista **Optimizador de DAX**. Haga clic en **Cargar...** dentro del menú **Opciones**. -Se mostrará un cuadro de diálogo similar al que se muestra a continuación: +Se te mostrará un cuadro de diálogo similar al que se muestra a continuación: -![Subir Vpax](~/content/assets/images/upload-vpax.png) +![Cargar Vpax](~/content/assets/images/upload-vpax.png) -Aquí puedes elegir si el VPAX debe cargarse como un modelo nuevo dentro del Workspace o si el VPAX contiene estadísticas actualizadas para un modelo existente. +Aquí puede elegir si el VPAX debe cargarse como un nuevo modelo dentro del área de trabajo o si el VPAX contiene estadísticas actualizadas de un modelo existente. -- Para un **modelo nuevo**, debes proporcionar un nombre y elegir si el VPAX debe estar [ofuscado](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) o no (consulta más abajo para obtener más detalles sobre la ofuscación). También debes elegir bajo qué [contrato](https://docs.daxoptimizer.com/glossary/contract) se debe subir el modelo. Esto afecta al número y la frecuencia de [_ejecuciones_](https://docs.daxoptimizer.com/glossary/run) del Optimizador de DAX que podrás realizar posteriormente sobre el modelo. -- Para una **nueva versión del modelo**, debes seleccionar el modelo existente que quieres actualizar. +- Para un **nuevo modelo**, debe proporcionar un nombre y elegir si el VPAX debe [ofuscarse](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) o no (consulte más abajo para obtener más detalles sobre la ofuscación). También debe elegir bajo qué [contrato](https://docs.daxoptimizer.com/glossary/contract) debe cargarse el modelo. Esto afecta al número y a la frecuencia de las [*ejecuciones*](https://docs.daxoptimizer.com/glossary/run) del Optimizador de DAX que puede realizar posteriormente en el modelo. +- Para una **nueva versión del modelo**, debe seleccionar el modelo existente que desea actualizar. -Cuando hagas clic en el botón **Aceptar**, el archivo VPAX se subirá al Optimizador de DAX y podrás empezar a analizar el modelo. +Una vez que haga clic en el botón **Aceptar**, el archivo VPAX se cargará en el Optimizador de DAX y podrá comenzar a analizar el modelo. > [!NOTE] -> Si Tabular Editor 3 no tiene estadísticas del Analizador VertiPaq disponibles, esas estadísticas se recopilarán para el modelo actual antes de subir el archivo VPAX. También volveremos a recopilar automáticamente las estadísticas si la última recopilación es anterior o coincide con la de la última subida del archivo VPAX, para ese modelo en concreto. +> Si no hay estadísticas del Analizador VertiPaq disponibles en Tabular Editor 3, se recopilan estadísticas del modelo actual antes de cargar el archivo VPAX. Las estadísticas también se vuelven a recopilar si la última recopilación es anterior o igual a la última carga de VPAX para el modelo. Las estadísticas de una carga siempre se leen a partir de los datos del modelo. Si no se pueden leer, la carga no se inicia. ### Ofuscación -De forma predeterminada, los archivos VPAX subidos con Tabular Editor 3 se ofuscarán. En **Subir modelo** puedes activar o desactivar la ofuscación para las subidas de modelos nuevos. Las subidas posteriores de versiones del modelo se ofuscarán o no en función de cómo se haya subido la primera versión. También puedes exportar localmente un archivo VPAX ofuscado sin subirlo al Optimizador de DAX desde la vista **Analizador VertiPaq**. En este caso, se genera un archivo de diccionario y se guarda en tu equipo local, junto al archivo .ovpax exportado. Este archivo de diccionario se usa para desofuscar el contenido del archivo .ovpax. +De forma predeterminada, los archivos VPAX cargados mediante Tabular Editor 3 se ofuscarán. En **Cargar modelo** puedes activar o desactivar la ofuscación para las nuevas cargas de modelos. Las siguientes cargas de versiones del modelo se ofuscarán o no en función de la carga de la primera versión. También puedes exportar un archivo VPAX ofuscado localmente sin cargarlo al Optimizador de DAX a través de la vista **VertiPaq Analyzer**. En este caso, se genera un archivo de diccionario que se almacena en tu equipo local, junto al archivo .ovpax exportado. Este archivo de diccionario se utiliza para desofuscar el contenido del archivo .ovpax. -Cuando se suben datos VPAX ofuscados al servicio del Optimizador de DAX a través de la vista **Optimizador de DAX**, Tabular Editor realiza automáticamente el seguimiento de los diccionarios de ofuscación y los guarda en la carpeta `%LocalAppData%\\TabularEditor3\\DaxOptimizer` de tu equipo local. Por ello, al explorar modelos con la característica **Optimizador de DAX** en Tabular Editor 3, los modelos se desofuscan automáticamente si se encuentra un diccionario adecuado en esta carpeta, lo que ofrece una experiencia más fluida al usar la ofuscación. +Cuando los datos VPAX ofuscados se cargan en el servicio del Optimizador de DAX a través de la vista **Optimizador de DAX**, Tabular Editor realiza automáticamente un seguimiento de los diccionarios de ofuscación almacenándolos en la carpeta `%LocalAppData%\TabularEditor3\DaxOptimizer` de su equipo local. Por lo tanto, al explorar modelos con la función **Optimizador de DAX** en Tabular Editor 3, los modelos se desofuscan automáticamente si se encuentra un diccionario adecuado en esta carpeta, lo que proporciona una experiencia más fluida al usar la ofuscación. -Si no se encuentra el diccionario, tendrás la opción de especificar manualmente un archivo de diccionario. +Si no se encuentra el diccionario, tendrá la opción de especificar manualmente un archivo de diccionario. ![Modelo ofuscado](~/content/assets/images/obfuscated-model.png) -Si no se proporciona ningún archivo de diccionario, solo podrás explorar el modelo ofuscado y los resultados del Optimizador de DAX, lo que significa que no podrás ver las expresiones DAX originales ni navegar hasta las medidas correspondientes en el Explorador TOM. +Si no se proporciona ningún archivo de diccionario, solo podrá explorar el modelo ofuscado y los resultados del Optimizador de DAX, lo que significa que no podrá ver las expresiones DAX originales ni navegar hasta las medidas correspondientes en el Explorador TOM. [Más información sobre la ofuscación del Optimizador de DAX](https://docs.daxoptimizer.com/how-to-guides/obfuscating-files). > [!TIP] -> Si quieres explorar un modelo ofuscado a través de la interfaz web del Optimizador de DAX, puedes especificar un diccionario desde la ubicación `%LocalAppData%\\TabularEditor3\\DaxOptimizer`. La interfaz web del Optimizador de DAX realiza la desofuscación en el lado del cliente, por lo que tu diccionario nunca se carga en el servicio del Optimizador de DAX. +> Si quieres explorar un modelo ofuscado a través de la interfaz web del Optimizador de DAX, puedes especificar un diccionario desde la ubicación `%LocalAppData%\TabularEditor3\DaxOptimizer`. La interfaz web del Optimizador de DAX realiza la desofuscación en el lado del cliente, por lo que su diccionario nunca se carga en el servicio del Optimizador de DAX. ### Analizar un modelo -Una vez que se haya cargado un archivo VPAX, espera unos segundos a que el servicio del Optimizador de DAX "verifique" el archivo. Una vez verificado, puedes realizar un "run" del Optimizador de DAX marcando la casilla "Aceptas **consumir 1 run** para analizar este modelo.", y luego haciendo clic en el botón **Analizar** en la vista de **DAX Optimizer**: +Una vez que se haya cargado un archivo VPAX, espere unos segundos a que el servicio del Optimizador de DAX «verifique» el archivo. Una vez verificado, puede realizar una «ejecución» del DAX Optimizer marcando la casilla «Acepta **consumir 1 ejecución** para analizar este modelo» y, a continuación, haciendo clic en el botón **Analizar** en la vista **DAX Optimizer**: -![Análisis del Optimizador de Dax](~/content/assets/images/features/dax-optimizer-analyze.png) +![Análisis de Dax Optimizer](~/content/assets/images/features/dax-optimizer-analyze.png) -El análisis tardará unos minutos en completarse, en función del tamaño del modelo y del número de medidas. Cuando el análisis se complete, verás un resumen de los problemas detectados. +El análisis tardará unos minutos en completarse, dependiendo del tamaño del modelo y del número de medidas. Una vez finalizado el análisis, se le presentará un resumen de los problemas detectados. -## Problemas conocidos y limitaciones +## Problemas y limitaciones conocidos -A continuación se indican los problemas conocidos y las limitaciones de la funcionalidad **Optimizador de DAX**, que esperamos solucionar en versiones futuras: +A continuación se indican los problemas y limitaciones conocidos de la función **Optimizador de DAX**, que esperamos abordar en futuras versiones: -- La vista de **Optimizador de DAX** no muestra cuántos "runs" quedan en un contrato determinado. Como solución alternativa, inicie sesión en https://app.daxoptimizer.com y haga clic en el icono de "relámpago" en la esquina superior derecha para ver cuántos "runs" le quedan por cada contrato. \ No newline at end of file +- La vista del **Optimizador de DAX** no muestra cuántas «ejecuciones» quedan en un contrato determinado. Como solución alternativa, inicia sesión en https://app.daxoptimizer.com y haz clic en el icono del «relámpago» en la esquina superior derecha para ver cuántas «ejecuciones» te quedan por contrato. \ No newline at end of file diff --git a/localizedContent/es/content/features/dax-query.md b/localizedContent/es/content/features/dax-query.md index a4620cb3e..d8b439bc4 100644 --- a/localizedContent/es/content/features/dax-query.md +++ b/localizedContent/es/content/features/dax-query.md @@ -1,8 +1,8 @@ ---- +--- uid: dax-query title: Consultas DAX author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,95 +16,101 @@ applies_to: - edition: Enterprise full: true --- - # Consultas DAX -Tabular Editor incluye una ventana integrada de Consulta DAX para escribir y ejecutar consultas DAX sobre el modelo semántico. +Tabular Editor dispone de una ventana de consultas DAX integrada para escribir y lanzar consultas DAX contra el modelo semántico. -Un caso de uso muy común de las Consultas DAX es la Consulta DAX generada por el [Analizador de rendimiento de Power BI](https://www.sqlbi.com/articles/introducing-the-power-bi-performance-analyzer/), que permite copiar la consulta de cada Visual para solucionar problemas, depurar o realizar un análisis de rendimiento detallado. +Un caso de uso muy extendido de las consultas DAX es la consulta DAX generada por el [analizador de rendimiento de Power BI](https://www.sqlbi.com/articles/introducing-the-power-bi-performance-analyzer/), donde es posible copiar la consulta de cada elemento visual para solucionar problemas, depurar o realizar un análisis detallado del rendimiento. -La ventana puede abrirse mientras estás conectado a un modelo semántico de cualquiera de estas tres formas: +La ventana se puede abrir mientras se está conectado a un modelo semántico de cualquiera de estas tres formas: - el menú **Archivo > Nuevo > Consulta DAX** - el acceso directo de la barra de herramientas -- **Mostrar la Consulta DAX real...** en el menú contextual con clic derecho de una @table-preview, lo que abre un nuevo documento de consulta que contiene la consulta detrás de la vista previa, con el filtro y la ordenación incluidos +- **Mostrar consulta DAX real...** en el menú contextual de una @table-preview, que abre un nuevo documento de consulta que contiene la consulta subyacente a la vista previa, incluidos el filtro y la ordenación. + +![Nueva consulta Dax](~/content/assets/images/features/dax_query_window/create_new_dax_query.png) -![Consulta Dax Nueva](~/content/assets/images/features/dax_query_window/create_new_dax_query.png) +El editor DAX integrado, que tiene en cuenta el contexto, garantiza que solo estén disponibles las dos palabras clave DAX válidas al iniciar una nueva consulta: DEFINE o EVALUATE (pulse Ctrl+Espacio para comprobarlo usted mismo). -El Editor de DAX integrado y con reconocimiento de contexto garantiza que, al iniciar una nueva consulta, solo estén disponibles las dos palabras clave válidas de DAX: DEFINE o EVALUATE (Presione Ctrl+Space para comprobarlo usted mismo) +## Opciones de consulta DAX -## Opciones de Consulta DAX +La ventana de consultas DAX tiene seis opciones de consulta diferentes. -La ventana de consultas de DAX tiene seis opciones de consulta distintas. +![Barra de herramientas de consultas Dax](~/content/assets/images/features/dax_query_window/dax_query_toolbar.png) -![Barra de herramientas de Consulta Dax](~/content/assets/images/features/dax_query_window/dax_query_toolbar.png) -1. **Ejecutar (F5)**: Si hay una selección, ejecuta el DAX seleccionado; de lo contrario, ejecuta la consulta completa en el editor de Consulta DAX. -2. **Ejecutar consulta completa**: Ejecuta la consulta completa en el Editor de Consulta DAX -3. **Ejecutar selección (Mayús+F5)**: Si hay una selección, la ejecuta. De lo contrario, ejecuta la instrucción EVALUATE donde se encuentre el cursor en ese momento. +1. **Ejecutar (F5)**: Si hay una selección, ejecuta el DAX seleccionado; de lo contrario, ejecuta la consulta completa en el editor de consultas DAX. +2. **Ejecutar consulta completa**: Ejecuta la consulta completa en el editor de consultas DAX. +3. **Ejecutar selección (Mayús+F5)**: Si hay una selección, la ejecuta. De lo contrario, ejecuta la instrucción EVALUATE donde se encuentre actualmente el cursor. 4. **Detener**: Este botón cancela la ejecución de la consulta actual. -5. **Ejecutar consulta automáticamente**: Permite hacer un seguimiento del modelo semántico conectado y actualizar los resultados de la consulta cada vez que algo cambie en el modelo. Esto puede ser útil para entender, por ejemplo, cómo cambia el resultado de una medida si la modificas. -6. **Mantener la ordenación y el filtrado**: Permite a los usuarios controlar cómo se mantienen la ordenación y el filtrado en la cuadrícula(s) de resultados al ejecutar consultas. Hay tres preferencias disponibles: +5. **Ejecutar consulta automáticamente**: Permite realizar un seguimiento del modelo semántico conectado y actualizar los resultados de la consulta cada vez que se produce un cambio en el modelo. Esto puede ser útil para comprender, por ejemplo, cómo cambia el resultado de una medida si se modifica. +6. **Mantener ordenación y filtrado**: Permite a los usuarios controlar cómo se mantienen la ordenación y el filtrado en las cuadrículas de resultados al ejecutar consultas. Hay tres preferencias disponibles: - **Nunca**: La ordenación y el filtrado se restablecen cada vez que se ejecuta la consulta. - **Cuando se modifica la consulta**: La ordenación y el filtrado se restablecen solo cuando cambia la estructura de la consulta. - - **Siempre**: La ordenación y el filtrado se conservan mientras las columnas sigan estando en la nueva consulta. + - **Siempre**: La ordenación y el filtrado se mantienen mientras las columnas permanezcan en la nueva consulta. + +Los valores predeterminados de las preferencias «Ejecutar consulta automáticamente» y «Conservar ordenación y filtrado» se pueden configurar en el cuadro de diálogo Preferencias: **Herramientas > Preferencias... > Exploración de datos > Consulta DAX** > Básico. La sección **Mantener los documentos abiertos al cambiar de modelo** de la misma página controla lo que sucede con las consultas DAX abiertas cuando se abre un modelo diferente. Consulte [Cambiar de modelo](#switching-models). + +### Cambiar de modelo + +Cuando abre un modelo diferente, las consultas DAX abiertas permanecen abiertas y se conectan al nuevo modelo. Si se selecciona **Ejecutar automáticamente consultas DAX de forma predeterminada**, la consulta se ejecuta de nuevo con el nuevo modelo; de lo contrario, se ejecuta con el nuevo modelo la próxima vez que la ejecute. Si el nuevo modelo no tiene una base de datos con la que ejecutarse, como un modelo cargado desde un archivo sin una base de datos de área de trabajo, la consulta permanece abierta y no se puede ejecutar. -Los valores predeterminados de las preferencias "Ejecutar consulta automáticamente" y "Mantener la ordenación y el filtrado" se pueden configurar en el cuadro de diálogo de Preferencias: **Herramientas > Preferencias... > Exploración de datos > Consulta DAX** > Básico. +Para cerrar las consultas DAX cuando abra un modelo diferente, desmarque **Mantener abiertas las consultas DAX cuando se abra un modelo diferente** en **Herramientas > Preferencias > Exploración de datos > Consulta DAX**. La opción está seleccionada de forma predeterminada. ### Añadir o actualizar medidas, columnas y tablas con consultas DAX -Tabular Editor (3.12.0 y versiones posteriores) permite agregar o cambiar medidas directamente desde la ventana de Consulta DAX. +Tabular Editor (3.12.0 y versiones posteriores) tiene la capacidad de añadir o cambiar medidas directamente a través de la ventana de consultas DAX. -A partir de Tabular Editor 3.23.0, "Aplicar" y "Aplicar selección" también procesan las instrucciones DEFINE COLUMN y DEFINE TABLE. Tabular Editor creará en el modelo las columnas o tablas calculadas correspondientes, o actualizará sus expresiones si ya existen. +A partir de Tabular Editor 3.23.0, las opciones Aplicar y Aplicar selección también procesan las sentencias DEFINE COLUMN y DEFINE TABLE. Tabular Editor creará las columnas/tablas calculadas correspondientes en su modelo o actualizará sus expresiones si ya existen. -Hay cuatro opciones para aplicar al modelo las medidas, columnas y tablas definidas en la Consulta DAX: +Hay cuatro opciones para aplicar al modelo medidas, columnas y tablas definidas mediante consultas DAX: -![Consulta DAX Aplicar medida](~/content/assets/images/features/dax_query_window/dax_query_apply_measure.png) +![Aplicar medida de consulta Dax](~/content/assets/images/features/dax_query_window/dax_query_apply_measure.png) -La opción "Aplicar" sincroniza la expresión DAX de todas las medidas, columnas o tablas definidas explícitamente en la consulta con la definición del objeto. Se crean las medidas, columnas o tablas que aún no existan. +La opción «Aplicar» sincroniza la expresión DAX de todas las medidas, columnas o tablas definidas explícitamente en la consulta con la definición del objeto. Se crean todas las medidas, columnas o tablas que aún no existan. -"Aplicar medidas y sincronizar" aplica la expresión DAX a la definición de las medidas, columnas o tablas y guarda el modelo. +«Aplicar medidas y sincronizar» aplica la expresión DAX a la definición de las medidas, columnas o tablas y guarda el modelo. -Las opciones "Aplicar selección" y "Aplicar selección y sincronizar" solo aplican las medidas, columnas o tablas incluidas en la selección actual del editor de consultas. +Las opciones «Aplicar selección» y «Aplicar selección y sincronizar» solo aplicarán las medidas, columnas o tablas dentro de la selección actual del editor de consultas. -A diferencia de la [funcionalidad de Script DAX](xref:dax-scripts), de este modo solo puede actualizarse la propiedad de expresión de una medida, ya que la sintaxis de las consultas DAX no permite especificar otras propiedades, como la descripción, la carpeta de visualización, etc. +A diferencia de la [función Script DAX](xref:dax-scripts), solo se puede actualizar de esta manera la propiedad de expresión de una medida, ya que la sintaxis de las consultas DAX no admite la especificación de otras propiedades, como Descripción, Carpeta de visualización, etc. -La opción "Aplicar" también se ha añadido al menú contextual al hacer clic con el botón derecho. +La opción «Aplicar» también se ha añadido al menú contextual que aparece al hacer clic con el botón derecho. -![Consulta Dax Aplicar Clic Derecho](~/content/assets/images/features/dax_query_window/dax_query_apply_measure_right_click.png) +![Aplicar consulta Dax con clic derecho](~/content/assets/images/features/dax_query_window/dax_query_apply_measure_right_click.png) -Los atajos de teclado para estos comandos son: +Los accesos directos para estos comandos son: - Aplicar (F7) - Aplicar medidas y sincronizar (Mayús+F7) - Aplicar selección (F8) - Aplicar selección y sincronizar (Mayús+F8) -## Ejemplo de Consulta DAX +## Ejemplo de consulta DAX -Una Consulta DAX siempre devuelve una tabla de resultados, y la forma más sencilla de crear una es evaluar una tabla dentro del modelo. +Una consulta DAX siempre devuelve una tabla de resultados, y la forma más sencilla de consulta DAX que se puede crear es una que evalúe una tabla dentro del modelo. ```DAX EVALUATE Products ``` -![Consulta Dax Evaluar tabla](~/content/assets/images/features/dax_query_window/evaluate_table.png) +![Consulta Dax: evaluar tabla](~/content/assets/images/features/dax_query_window/evaluate_table.png) -También es posible devolver el valor de una medida, pero se requiere un constructor de tablas {} alrededor del nombre de la medida para convertir el valor escalar en una tabla de 1x1. +También es posible devolver el valor de una medida, pero se requiere un constructor de tablas {} alrededor del nombre de la medida para convertir el valor escalar en una tabla 1x1. ```DAX EVALUATE { [Invoice Lines] } ``` -![Consulta Dax Evaluar medida](~/content/assets/images/features/dax_query_window/evaluate_measure.png) +![Consulta Dax: Evaluar una medida](~/content/assets/images/features/dax_query_window/evaluate_measure.png) -### Varias instrucciones EVALUATE +### Múltiples sentencias EVALUATE -Es perfectamente posible tener varias instrucciones EVALUATE dentro de la misma Consulta DAX. Este tipo de consulta se encuentra con mayor frecuencia en las consultas del Analizador de rendimiento de Power BI. +Es perfectamente posible tener varias sentencias EVALUATE dentro de la misma consulta DAX. Este tipo de consulta se encuentra con mayor frecuencia en las consultas del analizador de rendimiento de Power BI. -Ambas tablas se devuelven en la siguiente instrucción, pero como pestañas separadas en el panel de resultados. +Ambas tablas se devuelven en la siguiente sentencia, pero como pestañas de filas separadas en el panel de resultados. ```DAX EVALUATE @@ -114,21 +120,21 @@ EVALUATE Customers ``` -![Consulta Dax Evaluar varias tablas](~/content/assets/images/features/dax_query_window/multiple_evaluate_table.png) +![Evaluar varias tablas en una consulta Dax](~/content/assets/images/features/dax_query_window/multiple_evaluate_table.png) -## Depuración de Consulta DAX +## Depuración de consultas DAX -Las consultas DAX son uno de los dos lugares donde es posible ejecutar el [Depurador de DAX](xref:dax-debugger); el otro es la Pivot Grid. +Las consultas DAX son uno de los dos lugares donde es posible ejecutar el [Depurador DAX](xref:dax-debugger); el otro es el Pivot Grid. -El Depurador de DAX permite comprender cómo funciona DAX dentro de una sola celda. Para iniciar el depurador, basta con hacer clic con el botón derecho en la celda deseada y elegir "Depurar celda"; esto iniciará el depurador en el contexto de la celda seleccionada. +El depurador de DAX permite comprender cómo funciona DAX dentro de una sola celda. Para iniciar el depurador, simplemente haga clic con el botón derecho en la celda deseada y elija «Depurar celda», lo que iniciará el depurador en el contexto de la celda elegida. -![Consulta Dax Depurador](~/content/assets/images/features/dax_query_window/dax_query_open_dax_debugger.gif) +![Depurador de consultas Dax](~/content/assets/images/features/dax_query_window/dax_query_open_dax_debugger.gif) -## Exportar resultados de la Consulta DAX +## Exportar los resultados de una consulta DAX -Tabular Editor 3, a partir de la versión 3.16.0, incorpora la nueva capacidad de exportar los resultados de una Consulta DAX a CSV o Excel. Tras ejecutar la Consulta DAX, se activa un botón en la barra de herramientas que permite guardar los resultados localmente en formato CSV o Excel. +Tabular Editor 3, a partir de la versión 3.16.0, introduce la nueva función de exportar los resultados de una consulta DAX a CSV o Excel. Después de ejecutar la consulta DAX, se activa un botón en la barra de herramientas que permite a los usuarios guardar los resultados localmente en formato CSV o Excel. > [!TIP] -> Para exportar más de 1001 filas, seleccione "haga clic para obtener todas las filas" después de ejecutar la Consulta DAX +> Para exportar más de 1001 filas, seleccione «Haga clic para obtener todas las filas» después de ejecutar la consulta DAX. -![Consulta Dax Exportar datos](~/content/assets/images/features/dax_query_window/dax_query_export_data.png) +![Exportar datos de una consulta Dax](~/content/assets/images/features/dax_query_window/dax_query_export_data.png) diff --git a/localizedContent/es/content/features/deployment.md b/localizedContent/es/content/features/deployment.md index 4c1202d8a..8f3a7cafa 100644 --- a/localizedContent/es/content/features/deployment.md +++ b/localizedContent/es/content/features/deployment.md @@ -1,6 +1,8 @@ ---- -uid: implementación -title: Implementación del modelo +--- +uid: deployment +title: Implementación de modelo +author: Morten Lønskov +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -15,73 +17,83 @@ applies_to: full: true --- -# Implementación del modelo +# Implementación de modelo -Tabular Editor 3 (Edición Business y Edición Enterprise) puede tomar una copia de los metadatos del modelo semántico cargado actualmente y desplegarla en una instancia de Analysis Services o en el punto de conexión XMLA de Power BI / Fabric. +Tabular Editor 3 (Ediciones Business y Enterprise) puede hacer una copia de los metadatos del modelo semántico cargado actualmente e implementarla en una instancia de Analysis Services o en el punto de conexión XMLA de Power BI / Fabric. -Para realizar una implementación, inicia el **Asistente de implementación** desde la opción de menú **Modelo > Implementar...**. +Para realizar una implementación, inicie el **Asistente de implementación** a través de la opción de menú **Modelo > Implementar...**. > [!NOTE] -> Tabular Editor 3 Edición Business tiene ciertas [limitaciones](xref:editions) con respecto a qué tipo de instancia de Analysis Services, o Workspace de Power BI / Fabric se admite para la conectividad XMLA. Esto también se aplica a la implementación. +> Tabular Editor 3 Business Edition tiene ciertas [limitaciones](xref:editions) en cuanto al tipo de instancia de Analysis Services o de área de trabajo de Power BI / Fabric que se admite para la conectividad XMLA. Esto también se aplica a la implementación. + +## Servidor de destino + +En la página **Servidor de destino**, introduzca un nombre de servidor o elija uno de la lista **Servidor** de servidores recientes. Haga clic con el botón derecho en un servidor de la lista para anclarlo a la parte superior de la lista o eliminarlo. La lista se comparte con **Archivo > Abrir > Modelo desde BD...**. Para obtener más información, consulte [Servidores recientes y anclados](xref:xmla-as-connectivity#recent-and-pinned-servers). ## Opciones de implementación -Después de seleccionar el servidor y la base de datos de destino para la implementación, se muestra una lista de **opciones de implementación**, como se ve en la captura de pantalla siguiente. +Después de seleccionar el servidor de destino y la base de datos que quieres implementar, se te mostrará una lista de **Opciones de implementación**, como se muestra en la siguiente captura de pantalla. ![Opciones de implementación](~/content/assets/images/deployment-options.png) -Son las siguientes: +Estas son: -- **Implementar la estructura del modelo**: Indica que se implementarán los metadatos del modelo. Si desmarcas esta opción, no podrás realizar la implementación (la opción existe por motivos históricos). -- **Implementar orígenes de datos**: Para los modelos que usan orígenes de datos _explícitos_, esta opción indica si se incluirá algún origen de datos de este tipo en la implementación. Desmarcar esta opción puede ser útil si se han modificado una o varias propiedades de un origen de datos y no tiene intención de implementar estas modificaciones. Por ejemplo, si estás implementando metadatos del modelo desde un entorno de desarrollo a un entorno de pruebas, es posible que quieras conservar las cadenas de conexión, etc. del entorno de destino tal como están. Tenga en cuenta que, por lo general, esta opción no está habilitada para los modelos semánticos de Power BI / Fabric, ya que estos modelos usan orígenes de datos _implícitos_, en los que las credenciales las administra el servicio de Power BI y los detalles de conexión se almacenan en las consultas M de las particiones o en las expresiones compartidas del modelo. -- **Implementar particiones de tablas**: Esta opción indica si se deben implementar las particiones de tablas. En algunos casos, la base de datos de destino puede contener particiones que no están presentes en los metadatos del modelo. Desmarcar esta opción evitará que la implementación modifique cualquier partición existente en el servidor de destino. Si esta opción está seleccionada, Tabular Editor sincronizará las particiones del servidor de destino con los metadatos del modelo. Si hay particiones en el servidor de destino que no estén en los metadatos del modelo, se eliminarán (incluidos los datos que contengan). - - **Implementar particiones regidas por las Políticas de actualización incremental**: Cuando la opción **Implementar particiones de tabla** está habilitada, tendrá la opción de evitar implementar particiones regidas por las Políticas de actualización incremental. Esto resulta útil cuando tiene un modelo con particiones que se crean automáticamente mediante la [política de actualización incremental](xref:incremental-refresh-about) y quiere implementar todas las particiones excepto las regidas por la política. -- **Implementar roles del modelo**: Esta opción indica si se deben implementar los roles definidos en el modelo. Al desmarcar esta opción, se mantendrán tal cual los roles existentes en el modelo. Si va a implementar cambios en tablas o columnas del modelo, quizá tenga que revisar la [configuración de RLS u OLS](xref:data-security-about) para asegurarse de que siga siendo válida. - - **Implementar miembros de roles del modelo**: Esta opción indica si se deben implementar los miembros de los roles. Es habitual administrar los miembros de rol directamente en el servidor, en lugar de hacerlo en los metadatos del modelo. Al desmarcar esta opción, se evitará que la implementación modifique los miembros de rol existentes en el servidor de destino. +- **Implementar estructura del modelo**: Indica que se implementarán los metadatos del modelo. Si desmarca esta opción, no podrá realizar la implementación (la opción existe por razones históricas). +- **Implementar orígenes de datos**: para los modelos que utilizan orígenes de datos *explícitos*, esta opción indica si se incluirán dichos orígenes de datos en la implementación. Desmarcar esta opción puede ser útil si se han modificado una o más propiedades de un origen de datos y no tienes intención de implementar estas modificaciones. Por ejemplo, si está implementando metadatos del modelo desde un entorno de desarrollo a un entorno de prueba, es posible que desee conservar las cadenas de conexión, etc., en el entorno de destino tal cual. Tenga en cuenta que esta opción normalmente no está habilitada para los modelos semánticos de Power BI / Fabric, ya que dichos modelos utilizan orígenes de datos *implícitos*, en los que las credenciales son administradas por el servicio Power BI y los detalles de conexión se almacenan en las consultas M de las particiones o en las expresiones compartidas del modelo. +- **Implementar particiones de tabla**: Esta opción indica si deben implementarse las particiones de tabla. En algunos casos, la base de datos de destino puede contener particiones que no están presentes en los metadatos del modelo. Si desmarca esta opción, evitará que la implementación modifique las particiones existentes en el servidor de destino. Si esta opción está marcada, Tabular Editor sincronizará las particiones del servidor de destino con los metadatos del modelo. Si hay particiones en el servidor de destino, pero no en los metadatos del modelo, se eliminarán (incluidos los datos que contengan). + - **Implementar particiones regidas por directivas de actualización incremental**: Cuando la opción **Implementar particiones de tabla** esté habilitada, tendrá la opción de evitar la implementación de particiones que estén regidas por directivas de actualización incremental. Esto es útil cuando tiene un modelo con particiones creadas automáticamente por la [Política de actualización incremental](xref:incremental-refresh-about) y desea implementar todas las particiones excepto las que se rigen por la política. +- **Implementar expresiones compartidas**: Implementa las expresiones compartidas del modelo, como los parámetros de Power Query y las consultas compartidas. Desmárquela para conservar las expresiones compartidas que existen en la base de datos de destino. +- **Implementar roles de modelo**: Esta opción indica si deben implementarse los roles definidos en el modelo. Si desactiva esta opción, los roles existentes en el modelo se mantendrán tal cual. Si está implementando cambios en tablas o columnas del modelo, es posible que tenga que revisar la [configuración de RLS u OLS](xref:data-security-about) para asegurarse de que sigan siendo válidas. + - **Implementar miembros de roles de modelo**: Esta opción indica si deben implementarse los miembros de los roles. Es habitual gestionar los miembros de los roles directamente en el servidor, en lugar de hacerlo en los metadatos del modelo. Si desmarca esta opción, evitará que la implementación modifique cualquier miembro de rol existente en el servidor de destino. +- **Implementar metadatos lingüísticos (sinónimos de preguntas y respuestas, instrucciones de IA y esquema de datos de IA)**: Implementa los metadatos lingüísticos de cada configuración regional del modelo. En Power BI, los metadatos lingüísticos de una cultura contienen sus sinónimos de preguntas y respuestas, así como las instrucciones de IA y el esquema de datos de IA configurados con **Preparar datos para IA** en el servicio Power BI. La opción está seleccionada de forma predeterminada. Desactívala para conservar los metadatos lingüísticos en el modelo semántico de destino cuando vuelvas a implementar sobre él: + - Una cultura presente en ambos modelos obtiene las traducciones del modelo y conserva los metadatos lingüísticos del destino. + - Una cultura que solo existe en el destino se mantiene con sus metadatos lingüísticos y sin sus traducciones. + - Una cultura que solo existe en el modelo se implementa sin metadatos lingüísticos. -## Credenciales del Data source +Tabular Editor no actualiza los metadatos lingüísticos conservados, por lo que un esquema de datos de IA conservado puede enumerar tablas o columnas que el modelo implementado ya no contiene. -De forma predeterminada, Tabular Editor no guarda contraseñas, claves de cuenta ni otros secretos cuando guarda un modelo en disco. Por lo tanto, un modelo cargado desde un archivo puede tener Data source con un secreto faltante. El asistente de implementación lo comprueba antes de realizar la implementación. Un secreto se considera ausente si está vacío o es `********`. El asistente comprueba: +## Credenciales del origen de datos -- un origen de datos del proveedor cuya cadena de conexión contiene una palabra clave de contraseña, como `Password` o `Pwd`, -- un origen de datos del proveedor que suplanta la identidad de una cuenta de Windows específica, -- un origen de datos estructurado que usa autenticación de Windows o de nombre de usuario y contraseña, o una clave de cuenta. +De forma predeterminada, Tabular Editor no guarda contraseñas, claves de cuenta ni otros secretos cuando guarda un modelo en el disco. Por lo tanto, un modelo cargado desde un archivo puede tener orígenes de datos con un secreto faltante. El asistente de implementación comprueba esto antes de realizar la implementación. Un secreto se considera ausente cuando está vacío o es «********». El asistente comprueba: -Para cada secreto ausente, el asistente te pide las credenciales que el servidor debe usar para actualizar el modelo. Tabular Editor almacena lo que introduces, cifrado, como una sobrescritura del Data source en el archivo @user-options y lo usa en la siguiente implementación en lugar de volver a pedírtelo. +- un origen de datos de proveedor cuya cadena de conexión contiene una palabra clave de contraseña, como «Password» o «Pwd», +- un origen de datos del proveedor que suplanta a una cuenta de Windows específica, +- un origen de datos estructurado que utiliza la autenticación de Windows o de nombre de usuario/contraseña, o una clave de cuenta. -Si desmarcas **Implementar Data source**, el asistente ejecuta la misma comprobación en los Data source que ya existen en el destino. Si el servidor no devuelve un secreto que uno de ellos necesita, el asistente lo pide en cada implementación, porque esas respuestas no se almacenan. +Por cada secreto que falte, el asistente le solicitará las credenciales que el servidor debe usar cuando actualice el modelo. Tabular Editor almacena lo que introduce, cifrado, como una anulación de origen de datos en el archivo @user-options, y lo utiliza en la siguiente implementación en lugar de volver a solicitarlo. -Los modelos semánticos de Power BI y Fabric no almacenan credenciales en el modelo. En su lugar, las configuras en el modelo semántico en el servicio de Power BI. +Cuando desmarca **Implementar orígenes de datos**, el asistente realiza la misma comprobación en los orígenes de datos que ya existen en el destino. Si el servidor no devuelve un secreto que uno de ellos necesita, el asistente lo solicitará en cada implementación, ya que estas respuestas no se almacenan. -## Script de implementación +Los modelos semánticos de Power BI y Fabric no almacenan credenciales en el modelo. En su lugar, las estableces en el modelo semántico del servicio Power BI. -Durante la implementación, Tabular Editor genera un [script TMSL de CreateOrReplace](https://learn.microsoft.com/analysis-services/tmsl/createorreplace-command-tmsl?view=asallproducts-allversions), que posteriormente se ejecuta en el motor de Analysis Services. El script CreateOrReplace contiene todos los metadatos necesarios para volver a crear el modelo, incluidas tablas, columnas, medidas, relaciones, perspectivas, traducciones, etc. Si el modelo aún no existe en el servidor de destino, se creará. Si el modelo ya existe, los objetos existentes se reemplazarán por los nuevos metadatos especificados en el script. +## Script de implementación -Si se desmarcó alguna de las opciones de la página **Opciones de implementación**, Tabular Editor usará la definición de metadatos original de esos objetos en el script TMSL generado, conservando así sus definiciones tal cual en el servidor. +Durante la implementación, Tabular Editor genera un [script TMSL CreateOrReplace](https://learn.microsoft.com/analysis-services/tmsl/createorreplace-command-tmsl?view=asallproducts-allversions), que luego se ejecuta en el motor de Analysis Services. El script CreateOrReplace contiene todos los metadatos necesarios para recrear el modelo, incluidas tablas, columnas, medidas, relaciones, perspectivas, traducciones, etc. Si el modelo aún no existe en el servidor de destino, se creará. Si el modelo ya existe, los objetos existentes se sustituirán por los nuevos metadatos especificados en el script. -La última página del Asistente de implementación le permite exportar el script generado, para que pueda revisar los cambios antes de ejecutarlos. +Si desmarcas una opción en la página **Opciones de implementación**, el script TMSL generado mantiene la definición existente de esos objetos en el destino. +La última página del asistente de implementación, **Resumen de implementación**, enumera las opciones seleccionadas. Haz clic en **Script TMSL** para revisar el script generado antes de implementarlo. **Exportar compilación...** ignora las opciones **Implementar expresiones compartidas** e **Implementar metadatos lingüísticos**. ## Impacto de la implementación > [!WARNING] -> Este tipo de implementación es una **implementación solo de metadatos**. Según los tipos de cambios realizados en el modelo, durante la implementación podrían perderse datos importados. En ese caso, puede que tenga que ejecutar una operación de actualización una vez finalizada la implementación. +> Este tipo de implementación es una **implementación solo de metadatos**. Dependiendo de los tipos de cambios realizados en el modelo, los datos importados podrían perderse durante la implementación. En este caso, es posible que deba ejecutar una operación de actualización una vez completada la implementación. -Como regla general, los siguientes cambios se pueden realizar en el modelo sin necesidad de una actualización de datos posterior: +Como regla general, se pueden realizar los siguientes cambios en el modelo sin necesidad de una actualización posterior de los datos: -- Agregar/editar/eliminar medidas y KPIs, incluidas sus expresiones DAX. -- Edición de propiedades como FormatString, Description, DisplayFolder, etc. -- Agregar/editar/quitar traducciones de metadatos, perspectivas y roles de OLS y RLS. +- Añadir/editar/eliminar medidas y KPI, incluidas sus expresiones DAX. +- Editar propiedades como FormatString, Description, DisplayFolder, etc. +- Añadir/editar/eliminar traducciones de metadatos, perspectivas y roles OLS y RLS. -Los siguientes cambios pueden requerir una **actualización de cálculo** antes de poder consultar los objetos: +Los siguientes cambios pueden requerir una **Actualización de cálculo** antes de que se puedan consultar los objetos: -- Agregar/editar columnas calculadas, tablas calculadas y grupos de cálculo -- Agregar/editar relaciones -- Agregar/editar jerarquías +- Añadir/editar columnas calculadas, tablas calculadas y grupos de cálculos +- Añadir/editar relaciones +- Añadir/editar jerarquías - Eliminar columnas/tablas Los siguientes cambios pueden requerir una **actualización completa**: -- Agregar/editar particiones, tablas y columnas +- Añadir/editar particiones, tablas y columnas > [!WARNING] -> Debido al posible impacto de desplegar un modelo semántico de esta manera, recomendamos no usar esta opción para realizar un despliegue en un entorno de producción. Es mejor configurar una [canalización de CI/CD para implementar modelos en entornos de producción](https://blog.tabulareditor.com/category/ci-cd/). \ No newline at end of file +> Debido al impacto potencial de implementar un modelo semántico de esta manera, recomendamos no usar esta opción para realizar una implementación en un entorno de producción. Es mejor configurar una [canalización CI/CD para implementar modelos en entornos de producción](https://blog.tabulareditor.com/category/ci-cd/). \ No newline at end of file diff --git a/localizedContent/es/content/features/mcp-server.md b/localizedContent/es/content/features/mcp-server.md index cfbe819d6..27c5db219 100644 --- a/localizedContent/es/content/features/mcp-server.md +++ b/localizedContent/es/content/features/mcp-server.md @@ -17,67 +17,66 @@ applies_to: - edition: Enterprise full: true --- - # Servidor MCP -Tabular Editor 3 puede actuar como servidor MCP (Model Context Protocol). Los agentes que admiten MCP, como Claude Code, GitHub Copilot, el modo de agente de VS Code, Codex o Cursor, se conectan a la instancia en ejecución para leer, consultar y analizar el modelo semántico que tienes abierto y modificarlo si concedes acceso de escritura. Para empezar, selecciona **Herramientas > Servidor MCP...** y registra tu agente. +Tabular Editor 3 puede actuar como servidor MCP (Protocolo de contexto de modelo). Los agentes que admiten MCP, como Claude Code, GitHub Copilot, el modo agente de VS Code, Codex o Cursor, se conectan a la instancia en ejecución para leer, consultar y analizar el modelo semántico que tienes abierto, y para modificarlo si concedes acceso de escritura. Para empezar, seleccione **Herramientas > Servidor MCP...** y registre su agente. -El servidor MCP no usa ningún proveedor de IA ni clave de API configurados en Tabular Editor, y tu agente usa su propio proveedor y su propia suscripción. +El servidor MCP no utiliza un proveedor de IA ni una clave de API configurados en Tabular Editor, y tu agente utiliza su propio proveedor y su propia suscripción. -El agente trabaja con el modelo que Tabular Editor tiene abierto, incluidos los cambios no guardados. Puede ser un modelo de Power BI Desktop, un proyecto PBIP, una carpeta de TMDL (Tabular Model Definition Language), un archivo `.bim`, una base de datos de Workspace o una conexión en vivo a Analysis Services, Azure Analysis Services o Fabric. El agente usa las mismas herramientas tanto si el modelo está conectado como si está sin conexión, salvo las herramientas que necesitan una conexión en vivo, como las consultas DAX. +El agente trabaja en el modelo que Tabular Editor tiene abierto, incluidos los cambios no guardados. Puede tratarse de un modelo de Power BI Desktop, un proyecto PBIP, una carpeta TMDL (lenguaje de definición de modelo tabular), un archivo `.bim`, una base de datos de área de trabajo o una conexión en tiempo real a Analysis Services, Azure Analysis Services o Fabric. El agente utiliza las mismas herramientas tanto si el modelo está conectado como si está sin conexión, excepto en el caso de las herramientas que necesitan una conexión en tiempo real, como las consultas DAX. -Los cambios del agente pasan por el [wrapper de Tabular Object Model (TOM)](xref:csharp-scripts) y el motor de C# Script, con la misma validación, el mismo ajuste de fórmulas y la misma pila de deshacer que tus propias ediciones. Aparecen como cambios no guardados, marcados en el [Explorador TOM y la vista de propiedades](xref:unsaved-changes), y no se escribe nada en el origen hasta que guardes. +Los cambios del agente pasan por el [envoltorio del Tabular Object Model (TOM)](xref:csharp-scripts) y el motor de scripting de C#, con la misma validación, corrección de fórmulas y pila de deshacer que sus propias modificaciones. Aparecen como cambios sin guardar, marcados en el [Explorador TOM y en la vista Propiedades](xref:unsaved-changes), y no se escribe nada en el origen hasta que guarda. ## Antes de empezar -- Tabular Editor 3.27.0 o posterior, en cualquier edición. -- Tener instalado el componente **Funciones de IA**. Forma parte de la instalación predeterminada a partir de la versión 3.27.0. Consulta @installation-activation-basic si despliegas Tabular Editor de forma centralizada, y @policies si tu administrador ha desactivado las funciones de IA. -- Un agente que admita MCP sobre HTTP con streaming. +- Tabular Editor 3.27.0 o posterior, cualquier edición. +- El componente **Funciones de IA** instalado. Forma parte de la instalación predeterminada a partir de la versión 3.27.0. Consulta @installation-activation-basic si implementas Tabular Editor de forma centralizada y @policies si tu administrador ha desactivado las funciones de IA. +- Un agente que admita MCP a través de HTTP transmitible. -## Inicia el servidor +## Iniciar el servidor -1. Selecciona **Herramientas > Servidor MCP...**. -2. Revisa los permisos. Consulta [Configurar permisos del agente](#set-agent-permissions). +1. Seleccione **Herramientas > Servidor MCP...**. +2. Revise los permisos. Consulte [Establecer permisos del agente](#set-agent-permissions). 3. Haz clic en **Iniciar servidor**. -El cuadro de diálogo muestra la dirección en la que escucha el servidor: `http://127.0.0.1:42100/`, a menos que hayas cambiado el puerto. El indicador de la barra de estado cambia de **MCP detenido** a **MCP iniciado**, con la dirección en su descripción emergente. +El cuadro de diálogo muestra la dirección en la que escucha el servidor: `http://127.0.0.1`, a menos que haya cambiado el puerto. El indicador de la barra de estado cambia de **MCP detenido** a **MCP iniciado**, con la dirección en su información sobre herramientas. -![Cuadro de diálogo del servidor MCP que muestra la dirección URL del servidor, un token de acceso enmascarado y las cinco filas de permisos del agente establecidas en niveles no predeterminados](~/content/assets/images/features/mcp-server/mcp-server-dialog.png) +![El cuadro de diálogo del servidor MCP, que muestra la URL del servidor, un token de acceso enmascarado y las cinco filas de permisos del agente configuradas con niveles distintos de los predeterminados](~/content/assets/images/features/mcp-server/mcp-server-dialog.png) -![El indicador de la barra de estado que muestra MCP iniciado, con su descripción emergente mostrando "El servidor MCP está escuchando en http://127.0.0.1:42100/. Haz clic para abrir el cuadro de diálogo de conexión."](~/content/assets/images/features/mcp-server/status-bar-menu.png) +![El indicador de la barra de estado de MCP que indica «MCP iniciado», con su información sobre herramientas que muestra «El servidor MCP está escuchando en http://127.0.0.1. Haz clic para abrir el cuadro de diálogo de conexión."](~/content/assets/images/features/mcp-server/status-bar-menu.png) -El servidor se ejecuta con o sin un modelo abierto. Si no hay ningún modelo abierto, los resultados de las herramientas lo indican, y puedes abrir un modelo en cualquier momento sin reiniciar el servidor. +El servidor se ejecuta con o sin un modelo abierto. Si no hay ningún modelo abierto, los resultados de la herramienta lo indican, y puedes abrir un modelo en cualquier momento sin reiniciar el servidor. -Haz clic con el botón derecho en el indicador de la barra de estado para iniciar o detener el servidor, copiar una configuración de registro o abrir las preferencias del servidor MCP. Haz clic con el botón izquierdo para abrir el cuadro de diálogo sin iniciar ni detener el servidor. +Haga clic con el botón derecho en el indicador de la barra de estado para iniciar o detener el servidor, copiar una configuración de registro o abrir las preferencias del servidor MCP. Haga clic con el botón izquierdo para abrir el cuadro de diálogo sin iniciar ni detener el servidor. -![El indicador de MCP en la barra de estado con el menú del clic derecho abierto, mostrando Detalles del servidor MCP..., Detener servidor MCP, Copiar configuración de MCP y Preferencias del servidor MCP..., y el submenú Copiar configuración de MCP desplegado con Claude Code, VS Code, Copilot CLI, Codex y Cursor](~/content/assets/images/features/mcp-server/status-bar-context-menu.png) +![El indicador de la barra de estado de MCP con su menú contextual abierto en Detalles del servidor MCP..., Detener el servidor MCP, Copiar la configuración de MCP y Preferencias del servidor MCP..., y el submenú Copiar la configuración de MCP expandido para mostrar Claude Code, VS Code, Copilot CLI, Codex y Cursor](~/content/assets/images/features/mcp-server/status-bar-context-menu.png) ### Preferencias de MCP -Abre **Herramientas > Preferencias > Características de IA > Servidor MCP** para configurar las opciones de inicio, autenticación y puerto del servidor. +Abra **Herramientas > Preferencias > Funciones de IA > Servidor MCP** para configurar las opciones de inicio, autenticación y puerto del servidor. -![Preferencias del servidor MCP, mostrando Habilitar servidor MCP, Iniciar servidor MCP automáticamente, Requerir token de acceso y el puerto](~/content/assets/images/pref-mcp-server.png) +![Preferencias del servidor MCP, que muestran las opciones «Habilitar servidor MCP», «Iniciar servidor MCP automáticamente», «Requerir token de acceso» y el puerto](~/content/assets/images/pref-mcp-server.png) -| Preferencia | Predeterminado | Qué hace | -| ---------------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Habilitar servidor MCP** | Activado | Al desmarcarlo, se detiene el servidor en ejecución y se eliminan el elemento del menú y el indicador de la barra de estado | -| **Iniciar servidor MCP automáticamente** | Desactivado | Inicia el servidor al iniciar Tabular Editor | -| **Requerir token de acceso** | Desactivado | Los agentes deben proporcionar el token de acceso que se muestra en el cuadro de diálogo del servidor. Consulta [Ejecución en un equipo compartido](#running-on-a-shared-machine) | -| **Puerto** | 42100 | El puerto de loopback en el que escucha el servidor, entre 1024 y 49151. Cambiarlo invalida los registros de agentes existentes | +| Preferencia | Valor predeterminado | Qué hace | +| -- | -- | -- | +| **Habilitar servidor MCP** | Activado | Si se desactiva, se detiene un servidor en ejecución y se eliminan el elemento del menú y el indicador de la barra de estado | +| **Iniciar el servidor MCP automáticamente** | Desactivado | Inicia el servidor cuando se inicia Tabular Editor | +| **Requerir token de acceso** | Desactivado | Los agentes deben presentar el token de acceso que se muestra en el cuadro de diálogo del servidor. Consulte [Ejecución en un equipo compartido](#running-on-a-shared-machine) | +| **Puerto** | 42100 | El puerto de bucle invertido en el que escucha el servidor, de 1024 a 49151. Si se cambia, se invalidan los registros de agentes existentes | ## Registra tu agente -En el cuadro de diálogo del servidor, selecciona tu agente en **Exportar configuración** y pega la configuración copiada en tu agente. Solo tienes que registrar cada agente una vez, y la configuración registra el servidor con el nombre `tabular-editor`. +En el cuadro de diálogo del servidor, seleccione su agente en **Exportar configuración** y pegue la configuración copiada en su agente. Registra cada agente una sola vez, y la configuración registra el servidor con el nombre «tabular-editor». -![La lista desplegable de configuración de exportación, expandida para mostrar Claude Code, VS Code, Copilot CLI, Codex y Cursor](~/content/assets/images/features/mcp-server/export-configuration.png) +![El menú desplegable «Exportar configuración», expandido para mostrar Claude Code, VS Code, Copilot CLI, Codex y Cursor](~/content/assets/images/features/mcp-server/export-configuration.png) -**Claude Code**: ejecuta el comando copiado en una terminal: +**Claude Code**: ejecuta el comando copiado en un terminal: ```bash claude mcp add --transport http tabular-editor http://127.0.0.1:42100/ ``` -**VS Code**: añade esto a tu configuración de MCP: +**VS Code**: añade lo siguiente a tu configuración de MCP: ```json { @@ -90,7 +89,7 @@ claude mcp add --transport http tabular-editor http://127.0.0.1:42100/ } ``` -**Copilot CLI**: añade lo siguiente en `~/.copilot/mcp-config.json`: +**CLI de Copilot**: añada a `~/.copilot/mcp-config.json`: ```json { @@ -103,14 +102,14 @@ claude mcp add --transport http tabular-editor http://127.0.0.1:42100/ } ``` -**Codex**: añade lo siguiente en `~/.codex/config.toml`: +**Codex**: añada a `~/.codex/config.toml`: ```toml [mcp_servers.tabular-editor] url = "http://127.0.0.1:42100/" ``` -**Cursor**: añade lo siguiente en `~/.cursor/mcp.json`: +**Cursor**: añada lo siguiente a `~/.cursor/mcp.json`: ```json { @@ -122,209 +121,213 @@ url = "http://127.0.0.1:42100/" } ``` -Cuando está activado **Requerir token de acceso**, la configuración exportada incluye el token en el formato de cada cliente. Copia la configuración del cuadro de diálogo; no la escribas a mano. +Cuando la opción **Requerir token de acceso** está activada, la configuración exportada incluye el token en el formato de cada cliente. Copie la configuración del cuadro de diálogo; no la escriba a mano. -Cualquier otro cliente MCP se conecta a `http://127.0.0.1:42100/` mediante HTTP con streaming. Si **Requerir token de acceso** está activado, envía el token en la cabecera `Authorization: Bearer `. +Cualquier otro cliente MCP se conecta a «http://127.0.0.1» a través de HTTP transmisible. Si la opción **Requerir token de acceso** está activada, envía el token en un encabezado «Authorization: Bearer ». -### Comprueba que ha funcionado +### Comprueba que haya funcionado Pregúntale a tu agente: > ¿A qué modelo estoy conectado en Tabular Editor? -El agente responde con el nombre del modelo, cómo se carga, si tiene cambios sin guardar y su nivel de compatibilidad, o reporta que no hay ningún modelo abierto. No aparece ningún mensaje en Tabular Editor. +El agente responde con el nombre del modelo, cómo se carga el modelo, si tiene cambios sin guardar y su nivel de compatibilidad, o informa de que no hay ningún modelo abierto. No aparece ningún mensaje en Tabular Editor. + +El nombre del modelo que recibe el agente sigue la configuración **Detalle del origen del modelo** en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario**. Con **Solo nombre**, el agente no recibe rutas de archivo ni nombres de servidores, y con **Oculto**, recibe «Modelo cargado» en lugar del nombre del modelo. -## Configurar los permisos del agente +## Establecer permisos del agente -Los permisos controlan qué herramientas recibe un agente, y el [Asistente de IA](xref:ai-assistant) usa los mismos permisos. Configúralos en el cuadro de diálogo **Herramientas > Servidor MCP...** o en **Herramientas > Preferencias > Funciones de IA > Permisos**; ambas opciones modifican la misma configuración. +Los permisos controlan qué herramientas recibe un agente, y el [asistente de IA](xref:ai-assistant) utiliza los mismos permisos. Establézcalos en el cuadro de diálogo **Herramientas > Servidor MCP...** o en **Herramientas > Preferencias > Funciones de IA > Permisos**, ya que ambos modifican la misma configuración. -![La página Permisos de funciones de IA, con un menú desplegable por recurso en su nivel predeterminado](~/content/assets/images/pref-ai-permissions.png) +![La página de permisos de las funciones de IA, con un menú desplegable por recurso en su nivel predeterminado](~/content/assets/images/pref-ai-permissions.png) -Pasa el cursor sobre la etiqueta o la lista desplegable de un permiso para ver qué permite cada nivel. Si un administrador ha limitado un recurso mediante una [directiva](xref:policies), la lista desplegable es de solo lectura e indica la directiva. +Pasa el cursor sobre la etiqueta o el menú desplegable de un permiso para ver qué permite cada nivel. Si un administrador ha limitado un recurso mediante una [política](xref:policies), el menú desplegable es de solo lectura e indica la política. Cada recurso tiene un nivel de acceso: -| Recurso | Predeterminado | Lo que obtiene el agente | -| -------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Metadatos del modelo** | Lectura | Lectura: tablas, columnas, medidas, expresiones, descripciones, relaciones y estadísticas del Analizador VertiPaq. Escritura: la capacidad de modificar el modelo mediante C# Scripts | -| **Datos del modelo** | Denegar | Lectura: resultados de consultas DAX (valores de datos de tu modelo). Requiere una conexión en vivo | -| **Best Practice Analyzer** | Lectura | Lectura: el conjunto de reglas y los resultados del análisis. Escritura: añadir y modificar reglas | -| **Documentos** | Escritura | Lectura: el contenido de tus consultas DAX abiertas, C# Scripts y scripts DAX. Escribir: modificarlos y crear scripts de C# y consultas DAX | -| **Macros** | Escritura | Lectura: tu biblioteca de macros, con nombres, descripciones y código. Escritura: no hay herramientas adicionales en esta versión | +| Recurso | Predeterminado | Lo que obtiene el agente | +| -- | -- | -- | +| **Metadatos del modelo** | Lectura | Lectura: tablas, columnas, medidas, expresiones, descripciones, relaciones, estadísticas del Analizador VertiPaq y los mensajes de error y advertencia del modelo. Escritura: la capacidad de cambiar el modelo mediante scripts de C# | +| **Datos del modelo** | Denegar | Leer: resultados de consultas DAX (valores de datos de su modelo) y el texto de los errores devueltos por Analysis Services, que pueden contener valores de datos. Las consultas DAX necesitan una conexión en tiempo real | +| **Best Practice Analyzer** | Lectura | Lectura: el conjunto de reglas y los resultados del análisis. Escritura: añadir y modificar reglas | +| **Documentos** | Escritura | Lectura: el contenido de tus consultas DAX abiertas, tus scripts de C# y tus scripts DAX, así como los errores y las advertencias de todos los documentos abiertos, incluidas las Pivot Grids. Escritura: modificarlos y crear scripts de C# y consultas DAX. Los diseños de Pivot Grid no se pueden leer ni modificar | +| **Macros** | Escritura | Lectura: tu biblioteca de macros, con nombres, descripciones y código. Escritura: no hay herramientas adicionales en esta versión | -**Escritura** (que aparece como **Lectura/escritura** en las listas desplegables) incluye **Lectura**, y **Datos del modelo** no tiene nivel de **Escritura**. +**Escritura** (denominada **Lectura/Escritura** en los menús desplegables) incluye Lectura, y **Datos del modelo** no tiene nivel de Escritura. -**Documentos** tiene **Escritura** de forma predeterminada, lo que permite a un agente crear pestañas y sobrescribir el contenido de los documentos abiertos: consultas DAX, C# Scripts y scripts DAX. El agente no los ejecuta y el modelo no cambia. Si tienes trabajo sin guardar en esas pestañas, establece **Documentos** en **Lectura**. +El valor predeterminado de **Documentos** es Escritura, lo que permite a un agente crear pestañas y sobrescribir el contenido de las consultas DAX, los C# Scripts y los scripts DAX abiertos. El agente no los ejecuta y el modelo no cambia. Si conserva trabajo sin guardar en esas pestañas, establezca **Documentos** en **Lectura**. -Aumentar estos permisos por encima de sus valores predeterminados le da al agente más acceso: +Si se elevan estos permisos por encima de sus valores predeterminados, el agente tendrá más acceso: -- **Datos del modelo > Leer** envía valores de tu modelo a tu agente y, a través de este, al proveedor del agente. Concédelo cuando el agente necesite contrastar los resultados con valores reales. -- **Metadatos del modelo > Escribir** permite al agente cambiar el modelo mediante C# Scripts. Consulta [Cómo un agente cambia tu modelo](#how-an-agent-changes-your-model) para ver las medidas de protección. +- **Datos del modelo > Lectura** envía valores desde tu modelo a tu agente y, a través de él, al proveedor de tu agente. Conceda este permiso cuando el asistente necesite comparar los resultados con valores reales. +- **Metadatos del modelo > Escritura** permite al agente cambiar el modelo a través de scripts de C#. Consulta [Cómo cambia un agente tu modelo](#how-an-agent-changes-your-model) para conocer las medidas de seguridad. > [!IMPORTANT] -> Los permisos se leen cuando se inicia el servidor, y un agente obtiene su lista de herramientas cuando se conecta. Después de cambiar un permiso, detén el servidor, vuelve a iniciarlo y luego vuelve a conectar el agente. Hasta entonces, el agente conserva los permisos que estaban en vigor cuando se conectó. +> Los permisos se leen cuando se inicia el servidor, y un agente obtiene su lista de herramientas cuando se conecta. Después de cambiar un permiso, detenga e inicie el servidor y, a continuación, vuelva a conectar el agente. Hasta entonces, el agente conserva los permisos que estaban vigentes cuando se conectó. ## Qué puede hacer el agente -Las herramientas del agente dependen de los permisos que le concedas, y la siguiente tabla enumera lo que puedes pedir y el permiso que requiere cada solicitud. - -| Solicitud | Autorización necesaria | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -| Identificar la instancia de Tabular Editor y el modelo que tiene abierto | Ninguna | -| Buscar en la documentación, el blog, los issues y los debates de GitHub de Tabular Editor | Ninguna | -| Consultar la API de scripting: las propiedades, los métodos y las firmas de los objetos del modelo, para la versión de Tabular Editor que estés ejecutando | Ninguna | -| Obtener una visión general de las tablas, el recuento de columnas y medidas, y todas las relaciones | **Metadatos del modelo > Leer** | -| Obtener todos los detalles de los objetos con nombre, incluidas las expresiones, las descripciones, las cadenas de formato y los tipos de datos | **Metadatos del modelo > Leer** | -| Buscar en el modelo por nombre, descripción, expresión DAX o M, cadena de formato o anotación | **Metadatos del modelo > Leer** | -| Obtener el modelo completo. Esto consume muchos tokens, y la descripción de la herramienta advierte al agente | **Metadatos del modelo > Leer** | -| Ver los objetos seleccionados en el Explorador TOM | **Metadatos del modelo > Lectura** | -| Obtener estadísticas del Analizador VertiPaq: tamaños de tablas, cardinalidades de columnas y uso de memoria | **Metadatos del modelo > Lectura** | -| Listar las reglas efectivas del [Best Practice Analyzer](xref:best-practice-analyzer), incluidas las tuyas, y ejecutar el análisis | **Best Practice Analyzer > Lectura** | -| Agregar o cambiar reglas en tu colección local | **Best Practice Analyzer > Escritura** | -| Ejecutar una consulta DAX y obtener filas como resultado. Una consulta devuelve 100 filas de forma predeterminada y como máximo 500 | **Datos del modelo > Lectura** y **Metadatos del modelo > Lectura** | -| Ver las consultas DAX, los C# Scripts y los scripts DAX que tienes abiertos | **Metadatos del modelo > Lectura** | -| Leer el contenido de las pestañas abiertas | **Documentos > Lectura** | -| Editar una pestaña o abrir un nuevo C# Script o una nueva consulta DAX para su revisión | **Documentos > Escritura** | -| Leer tu biblioteca de macros | **macros > Lectura** | -| Cambiar el modelo. Consulta [Cómo un agente cambia tu modelo](#how-an-agent-changes-your-model) | **Metadatos del modelo > Escritura** | - -Selecciona objetos en el Explorador TOM antes de mencionarlos en un prompt; por ejemplo, antes de pedir "dales un formato coherente". - -Antes de que un C# Script o una consulta DAX del agente se abra como documento, Tabular Editor compila el script o valida la consulta contra el modelo abierto y devuelve al agente los errores que encuentre. La validación de consultas DAX requiere que Tabular Editor esté conectado a Analysis Services o Power BI. +Las herramientas del agente dependen de tus concesiones. En la siguiente tabla se indica lo que puedes solicitar y la concesión que necesita cada solicitud. + +| Solicitud | Concesión necesaria | +| -- | -- | +| Identificar la instancia de Tabular Editor y el modelo que tiene abierto | Ninguno | +| Buscar en la documentación de Tabular Editor, el blog, los problemas de GitHub y los debates | Ninguno | +| Buscar en la API de scripting: las propiedades, los métodos y las firmas de los objetos del modelo, para la versión de Tabular Editor que estés ejecutando | Ninguno | +| Obtener una descripción general de las tablas, el número de columnas y medidas de cada una y todas las relaciones | **Metadatos del modelo > Leer** | +| Obtener información completa sobre los objetos con nombre, incluidas las expresiones, las descripciones, las cadenas de formato y los tipos de datos | **Metadatos del modelo > Leer** | +| Buscar en el modelo por nombre, descripción, expresión DAX o M, cadena de formato o anotación | **Metadatos del modelo > Leer** | +| Obtener el modelo completo. Esto utiliza muchos tokens, y la descripción de la herramienta advierte al agente | **Metadatos del modelo > Leer** | +| Ver los objetos seleccionados en el Explorador TOM | **Metadatos del modelo > Leer** | +| Obtener estadísticas del Analizador VertiPaq: tamaños de las tablas, cardinalidades de las columnas y uso de la memoria | **Metadatos del modelo > Lectura** | +| Enumerar las reglas efectivas del [Best Practice Analyzer](xref:best-practice-analyzer), incluidas las tuyas propias, y ejecutar el análisis | **Best Practice Analyzer > Leer** | +| Añadir o cambiar reglas en tu colección local | **Best Practice Analyzer > Escritura** | +| Ejecutar una consulta DAX y obtener filas a cambio. Una consulta devuelve 100 filas de forma predeterminada y, como máximo, 500 | **Datos del modelo > Leer** y **Metadatos del modelo > Leer** | +| Enumerar los errores, las advertencias y los mensajes de Analysis Services del modelo, empezando por las causas raíz | **Metadatos del modelo > Lectura**. El texto de los errores de Analysis Services también necesita **Datos del modelo > Lectura** | +| Enumerar sus consultas DAX abiertas, scripts de C#, scripts DAX y Pivot Grids, con el documento activo y el número de errores y advertencias de cada documento | **Metadatos del modelo > Leer** | +| Leer el contenido de una consulta DAX abierta, un script de C# o un script de DAX | **Documentos > Leer** | +| Leer los errores y las advertencias de un documento abierto, incluidos los errores que devolvió el servidor la última vez que se ejecutó | **Documentos > Leer**. El texto de los errores del servidor también necesita **Datos del modelo > Leer** | +| Editar una consulta DAX abierta, un script de C# o un script de DAX, o abrir un nuevo script de C# o una nueva consulta DAX para revisarlos | **Documentos > Escritura** | +| Leer tu biblioteca de macros | **Macros > Leer** | +| Cambiar el modelo. Consulte [Cómo cambia un agente su modelo](#how-an-agent-changes-your-model) | **Metadatos del modelo > Escritura** | + +Seleccione objetos en el Explorador TOM antes de hacer referencia a ellos en una solicitud, por ejemplo, antes de pedir «formatear estos de forma coherente». Para preguntar sobre un error en una consulta o un script, haga que su pestaña sea el documento activo primero, por ejemplo, antes de preguntar «¿Por qué veo este error en esta consulta?». + +Antes de que un C# Script o una consulta DAX del agente se abra como documento, el Tabular Editor compila el script o valida la consulta con el modelo abierto y devuelve los errores al agente. La validación de consultas DAX requiere que Tabular Editor esté conectado a Analysis Services o a Power BI. > [!NOTE] -> Para consultar datos se necesita una conexión activa, y las estadísticas de VertiPaq requieren una conexión o estadísticas que ya hayas recopilado. La disponibilidad de las herramientas se establece cuando el agente se conecta, así que si conectas el modelo después, vuelve a conectar al agente. +> Para consultar datos se necesita una conexión en tiempo real, y para las estadísticas de VertiPaq se necesita una conexión o unas estadísticas que ya hayas recopilado. La disponibilidad de las herramientas se establece cuando el agente se conecta, por lo que, si conecta el modelo posteriormente, deberá volver a conectar el agente. -## Cómo un agente cambia tu modelo +## Cómo cambia un agente tu modelo -Con **Model metadata > Write**, un agente modifica tu modelo creando un [C# Script](xref:csharp-scripts) en segundo plano. Tabular Editor compila el script, comprueba que sea seguro y lo ejecuta en el modelo abierto. +Con **Metadatos del modelo > Escribir**, un agente cambia su modelo creando un [script de C#](xref:csharp-scripts) en segundo plano. Tabular Editor compila el script, lo comprueba para garantizar su seguridad y lo ejecuta en el modelo abierto. -Un script puede hacer todo lo que permite la API de scripting de C#; por ejemplo, agregar medidas, columnas, grupos de cálculo, perspectivas, traducciones, relaciones y políticas de actualización, o renombrar y dar formato a objetos de forma masiva. Un script ejecutado por un agente tiene estas propiedades: +Un script puede hacer cualquier cosa que admita la API de C# Script, por ejemplo, añadir medidas, columnas, grupos de cálculo, perspectivas, traducciones, relaciones y políticas de actualización, o cambiar el nombre y dar formato a objetos de forma masiva. Un script ejecutado por un agente tiene estas propiedades: -- sus cambios aparecen como una sola entrada de deshacer, **C# Script (MCP)**, y **Ctrl+Z** deshace todo el script. Si un documento tiene el foco, **Ctrl+Z** deshace lo que hayas escrito en el documento. Haz clic primero en el Explorador TOM o selecciona **Deshacer C# Script (MCP)** en el menú **Editar**. Consulta [Deshacer en los editores de texto](xref:undo-redo#undo-in-text-editors). -- si el script genera una excepción a mitad del proceso, se revierten todos sus cambios. -- el agente recibe una lista de todos los objetos que el script agregó, cambió o quitó, además de cualquier salida que haya generado el script. -- los mensajes de `Output`, `Info`, `Warning` o `Error` se devuelven al agente como parte del resultado y no se abre ningún cuadro de diálogo. -- mientras se ejecuta una llamada prolongada, aparece un indicador de **Please wait** y se descartan los clics en Tabular Editor. -- los objetos y propiedades modificados se marcan en el [Explorador TOM y la vista de propiedades](xref:unsaved-changes) hasta que guardes. **Mostrar cambios** filtra ambas vistas para mostrar solo los cambios, y al hacer clic con el botón derecho en **Revert** puedes deshacer una sola propiedad, un solo objeto o toda una rama. +- Sus cambios constituyen una única entrada de deshacer, **Script de C# (MCP)**, y **Ctrl+Z** deshace todo el script. Si un documento tiene el foco, **Ctrl+Z** deshace la escritura en el documento. Haga clic primero en el Explorador TOM o seleccione **Deshacer script de C# (MCP)** en el menú **Editar**. Consulte [Deshacer en editores de texto](xref:undo-redo#undo-in-text-editors). +- Si el script genera una excepción a mitad de su ejecución, se revierten todos sus cambios. +- El agente recibe una lista de todos los objetos que el script ha añadido, modificado o eliminado, además de todo lo que el script ha impreso. Si el script introdujo o resolvió errores DAX, el resultado también los enumera, agrupados por causa raíz. +- Los mensajes de `Output`, `Info`, `Warning` o `Error` se devuelven al agente como parte del resultado, y no se abre ningún cuadro de diálogo. +- Mientras se ejecuta una llamada larga, aparece un indicador de **Espere** y se descartan los clics en Tabular Editor. +- Los objetos y propiedades modificados se marcan en el [Explorador TOM y en la vista Propiedades](xref:unsaved-changes) hasta que se guarden. **Mostrar cambios** filtra ambas vistas para mostrar los cambios, y al hacer clic con el botón derecho en **Revertir** se deshace una sola propiedad, un solo objeto o una rama completa. -![El menú Editar abierto con una única entrada "Deshacer C# Script (MCP)", con el Explorador TOM marcando una medida agregada en verde, una medida modificada en naranja y una medida eliminada tachada en rojo, y la vista de propiedades filtrada para mostrar la única propiedad modificada](~/content/assets/images/features/mcp-server/agent-change-review.png) +![El menú Editar abierto en una sola entrada de Deshacer script de C# (MCP), con el Explorador TOM marcando una medida añadida en verde, una medida modificada en naranja y una medida eliminada tachada en rojo, y la vista Propiedades filtrada para mostrar la única propiedad modificada](~/content/assets/images/features/mcp-server/agent-change-review.png) -El chat del [Asistente de IA](xref:ai-assistant) ejecuta scripts del mismo modo, con un único paso de deshacer y la misma reversión, en la entrada de deshacer **C# Script (AI Assistant)**. Los scripts de agente no tienen cuadro de diálogo de vista previa ni **Cancelar**. Revisa sus cambios después en el Explorador TOM y la vista de propiedades. +El chat del [asistente de IA](xref:ai-assistant) ejecuta los scripts de la misma manera, con el mismo paso único de deshacer y revertir, bajo la entrada de deshacer **Script de C# (asistente de IA)**. Los scripts del agente no tienen cuadro de diálogo de vista previa ni opción de **Cancelar**. Revise sus cambios posteriormente en el Explorador TOM y en la vista Propiedades. ### Operaciones bloqueadas -Estas operaciones se bloquean independientemente de tus permisos: +Estas operaciones están bloqueadas independientemente de sus concesiones: - `ExecuteCommand`, que ejecuta TMSL o XMLA sin procesar, siempre falla en un script ejecutado por un agente. -- Un script de agente que accede al sistema de archivos, hace una solicitud web o hace referencia a un ensamblado externo no se ejecuta. La comprobación es el mismo análisis del script compilado que utiliza la directiva `BlockUnsafeScripts`; consulta [Qué cuenta como mantenerse dentro del modelo](xref:csharp-scripts#what-counts-as-staying-within-the-model) para ver la lista completa. Lo que ocurra con el script depende de tus permisos y políticas: - - Con **Documents > Write**, el script se abre como un documento **Agent script (review)** y el resultado de la herramienta indica al agente que te pida que lo revises y lo ejecutes. - - Sin **Documents > Write**, el script no se ejecuta y no se abre ningún documento. - - Si está establecida la [política](xref:policies) `BlockUnsafeScripts`, el script no se ejecuta y no se abre ningún documento. -- Los asistentes de DAX dentro de un script requieren **Datos del modelo > Leer**, al igual que la herramienta de consultas. +- Un script de agente que accede al sistema de archivos, realiza una solicitud web o hace referencia a un ensamblado externo no se ejecuta. La comprobación es el mismo análisis del script compilado que utiliza la política `BlockUnsafeScripts`; consulte [Qué se considera permanecer dentro del modelo](xref:csharp-scripts#what-counts-as-staying-within-the-model) para ver la lista completa. Lo que sucede con el script depende de sus concesiones y políticas: + - Con **Documentos > Escritura**, el script se abre como un documento **Script de agente (revisión)**, y el resultado de la herramienta indica al agente que usted lo revise y lo ejecute. + - Sin **Documentos > Escritura**, el script no se ejecuta y no se abre ningún documento. + - Con la [política](xref:policies) `BlockUnsafeScripts` establecida, el script no se ejecuta y no se abre ningún documento. +- Los ayudantes de DAX dentro de un script necesitan **Datos del modelo > Leer**, al igual que la herramienta de consultas. -## Tareas de ejemplo +## Ejemplos de tareas -### Corregir infracciones del Best Practice Analyzer +### Corregir las infracciones del Best Practice Analyzer -Abre un modelo y pregunta: +Abra un modelo y pregunte: -> Ejecuta el Best Practice Analyzer y dime qué merece la pena corregir, empezando por lo peor. +> Ejecuta Best Practice Analyzer y dime qué merece la pena corregir, empezando por lo peor. -A continuación, escribe "corrige las infracciones de las cadenas de formato". Si se concede **Metadatos del modelo > Escribir**, el agente escribe un script y lo ejecuta, y los objetos modificados se marcan en naranja en el Explorador TOM. La opción **Mostrar cambios** en la [vista de propiedades](xref:unsaved-changes) muestra los valores anteriores y posteriores de cada propiedad. Haz clic con el botón derecho en **Revertir** sobre cualquier cambio que no quieras y, después, guarda. +Continúe con «corregir las infracciones de la cadena de formato». Si se concede **Metadatos del modelo > Escritura**, el agente escribe un script y lo ejecuta, y los objetos modificados se marcan en naranja en el Explorador TOM. **Mostrar cambios** en la [vista Propiedades](xref:unsaved-changes) muestra los valores anteriores y posteriores de cada propiedad. Haga clic con el botón derecho en **Revertir** en cualquier cambio que no desee y, a continuación, guárdelo. -### Agregar medidas a partir de una especificación +### Agregar medidas desde una especificación -Indícale al agente una especificación, un ticket o una hoja de cálculo con definiciones de medidas: +Indique al agente una especificación, un «ticket» o una hoja de cálculo con definiciones de medidas: -> Añade las medidas de requirements.md a la tabla Sales. Sigue la nomenclatura y las cadenas de formato que ya se usan allí. +> Añada las medidas de requirements.md a la tabla Ventas. Siga las cadenas de nomenclatura y formato que ya se utilizan allí. -El agente lee `requirements.md` en su propio Workspace. +El agente lee `requirements.md` desde su propio espacio de trabajo. ### Verificar los resultados con una consulta -Si se concede **Datos del modelo > Leer**, el agente puede ejecutar DAX para comprobar su trabajo: +Con el permiso **Datos del modelo > Leer** concedido, el agente puede ejecutar DAX para comprobar su trabajo: -> Confirma que la nueva medida Margin % da el mismo total que el cálculo anterior para 2025. +> Confirme que la nueva medida «Margin %» da el mismo total que el cálculo anterior para 2025. Escribe la consulta DAX, la ejecuta y compara los resultados. -### Preparar un script sin ejecutarlo +### Redactar un script sin ejecutarlo -Con **Documentos > Escribir**, el agente puede incluir un C# Script o una consulta DAX en un documento para que lo revises y lo ejecutes tú mismo, por ejemplo, para comprobar un cambio antes de ejecutarlo o para ejecutarlo más adelante en otro modelo: +Con **Documentos > Escribir**, el agente puede introducir un script de C# o una consulta DAX en un documento que usted revisa y ejecuta por su cuenta, por ejemplo, para comprobar un cambio antes de ejecutarlo o para ejecutarlo en otro modelo más adelante: -> Escríbeme un script que renombre todas las medidas a tipo oración, pero no lo ejecutes. +> Escríbeme un script que cambie el nombre de todas las medidas a mayúscula inicial, pero no lo ejecutes. -El script se abre como documento en Tabular Editor, compilado y sometido a comprobaciones de seguridad. Ejecútalo después de leerlo. +El script se abre como un documento en Tabular Editor, compilado y con la seguridad comprobada. Ejecútelo después de leerlo. > [!TIP] -> Revisa y guarda entre tareas para mantener reducido cada conjunto de cambios sin guardar. +> Revisa y guarda entre tareas para que cada conjunto de cambios sin guardar sea pequeño. -## Ejecutar varias instancias +## Ejecución de varias instancias -Cada instancia de Tabular Editor ejecuta su propio servidor en su propio puerto. Para trabajar con dos modelos a la vez, abre cada uno en su propia instancia y conecta un agente a cada instancia. +Cada instancia de Tabular Editor aloja su propio servidor en su propio puerto. Para trabajar en dos modelos a la vez, abra cada uno en su propia instancia y conecte un agente a cada uno. -Para un segundo servidor, inicia la segunda instancia, abre **Herramientas > Servidor MCP...** y haz clic en **Iniciar servidor**. Si el puerto configurado está ocupado, un aviso ofrece el primer puerto libre entre los 20 siguientes; si no hay ninguno libre, aparece un error. También puedes configurar otro puerto en **Herramientas > Preferencia > Funciones de IA > Servidor MCP**. +Para un segundo servidor, inicie la segunda instancia, abra **Herramientas > Servidor MCP...** y haga clic en **Iniciar servidor**. Si el puerto configurado está ocupado, un mensaje le ofrecerá el primer puerto libre de entre los 20 siguientes, o aparecerá un error si no hay ninguno libre. También puede configurar otro puerto en **Herramientas > Preferencias > Funciones de IA > Servidor MCP**. -Registra el segundo puerto en tu agente con su propio nombre y especifica en tus prompts el nombre de la instancia a la que te refieres. +Registra el segundo puerto con tu agente con su propio nombre y nombra la instancia a la que te refieres en tus indicaciones. -## Ejecutar en un equipo compartido +## Ejecución en un equipo compartido -El servidor escucha en `127.0.0.1`, al que otras máquinas no pueden acceder. También rechaza las solicitudes del navegador con un encabezado `Origin` no local. +El servidor se vincula a `127.0.0.1`, a la que otros equipos no pueden acceder. También rechaza las solicitudes del navegador con un encabezado «Origin» no local. -Cuando **Requerir token de acceso** está desactivado, cualquier proceso de la máquina puede conectarse sin credenciales. En un host donde varias personas tienen sesión iniciada a la vez, como un servidor de Remote Desktop o Citrix, eso incluye los procesos de las sesiones de otras personas. +Cuando la opción **Requerir token de acceso** está desactivada, cualquier proceso del equipo puede conectarse sin credenciales. En un host en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un servidor Citrix, eso incluye procesos en las sesiones de otras personas. -Selecciona **Requerir token de acceso** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP** y reinicia el servidor. Los agentes deben presentar entonces el token que se muestra en el cuadro de diálogo del servidor, y las solicitudes que no lo incluyan se rechazan. +Seleccione **Requerir token de acceso** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP** y reinicie el servidor. A continuación, los agentes deben presentar el token que se muestra en el cuadro de diálogo del servidor, y las solicitudes que no lo incluyan se rechazarán. -Selecciona **Regenerar token** (el botón de actualización junto al token) para generar un nuevo token, lo que invalida los registros existentes y reinicia el servidor si está en ejecución. Si el token queda expuesto, regénéralo y vuelve a registrar tus agentes. Los administradores pueden hacer que el token sea obligatorio para todos con la directiva `RequireMcpAccessToken`, que además bloquea esa preferencia. Consulta @policies. +Seleccione **Regenerar token** (el botón de actualización junto al token) para emitir un nuevo token, lo que invalida los registros existentes y reinicia un servidor en ejecución. Si el token queda expuesto, vuelve a generarlo y registra de nuevo a tus agentes. Los administradores pueden hacer que el token sea obligatorio para todos con la directiva `RequireMcpAccessToken`, que también bloquea la preferencia. Consulte @policies. ## Qué sale de tu equipo -Cuando usas el servidor MCP, Tabular Editor no se comunica con ningún proveedor de IA y solo responde a llamadas a herramientas de procesos de tu máquina, a través de una conexión de loopback. La base de conocimiento que consulta el agente es una base de datos local que se incluye con Tabular Editor y se actualiza desde el servicio de Tabular Editor. +Cuando usas el servidor MCP, Tabular Editor no se pone en contacto con ningún proveedor de IA y solo responde a las llamadas de herramientas de los procesos de tu dispositivo, a través de una conexión de bucle invertido. La base de conocimientos que busca el agente es una base de datos local que se incluye con Tabular Editor y que se actualiza desde el servicio de Tabular Editor. -Tu agente envía datos a su proveedor conforme a tu suscripción y a las condiciones de ese proveedor, y la configuración de tu agente controla qué se envía. Con **Datos del modelo** en su valor predeterminado, **Denegar**, el agente no recibe ningún resultado de consultas DAX desde Tabular Editor. Los valores introducidos en la definición del modelo, como una expresión `DATATABLE` o una tabla de **Introducir datos**, son metadatos del modelo y llegan al agente en **Metadatos del modelo > Leer**. +Tu agente envía datos a su proveedor en virtud de tu suscripción y de las condiciones de dicho proveedor, y la configuración de tu agente controla lo que se envía. Con **Datos del modelo** en su valor predeterminado, **Denegar**, el agente no recibe ningún valor de datos de Tabular Editor, y el texto de los errores de Analysis Services se sustituye por una frase fija. Para que el agente no reciba las rutas de los archivos ni los nombres de los servidores, establezca **Detalles del origen del modelo** en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario** en **Solo nombre** u **Oculto**. -Consulta @security-privacy para obtener una visión más amplia, incluido el [Asistente de IA](xref:ai-assistant), que se comunica directamente con un proveedor y se configura por separado. +Consulte @security-privacy para obtener una visión más amplia, incluido el [Asistente de IA](xref:ai-assistant), que llama directamente a un proveedor y se configura por separado. -## Controles de administrador +## Controles del administrador -El servidor MCP está activado de forma predeterminada y cualquier usuario puede desactivarlo. Los administradores pueden usar estas [directivas](xref:policies) para controlar cómo funciona el MCP: +El servidor MCP está activado de forma predeterminada, y cualquier usuario puede desactivarlo. Los administradores pueden usar estas [políticas](xref:policies) para controlar cómo funciona el MCP: -| Directiva | Edición | Qué hace | -| ------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DisableMcpServer` | Todas | Elimina el servidor MCP. El chat del Asistente de IA no se ve afectado | -| `DisableAi` | Todas | Desactiva toda la funcionalidad de IA, incluido el servidor MCP. Con un valor `REG_DWORD` de `1`, el instalador también deja fuera el componente de IA en las instalaciones nuevas y lo elimina al actualizar | -| `RequireMcpAccessToken` | Todas | Fuerza la autenticación por token y bloquea la preferencia | -| `DisableCSharpScripts` | Todos | Impide que un agente ejecute un C# Script y lo inserte en un documento. La redacción de una consulta DAX y cualquier herramienta que solo lea no se ven afectadas | -| `BlockUnsafeScripts` | Enterprise | En Tabular Editor, solo se permiten scripts que se mantengan dentro del modelo. Un script de agente que acceda a archivos, a la red, a otros procesos o a ensamblados externos no se ejecuta, y no se abre ningún documento de revisión | -| Límites de permisos `Max...` y `McpMax...` | Enterprise | Establece un límite para cada recurso. Los límites `Max...` se aplican al Asistente de IA y al servidor MCP. Los límites `McpMax...` se aplican únicamente al servidor MCP y solo pueden reducir el límite `Max...` | -| `AiAuditLogPath`, `AiAuditLogRetentionDays` | Enterprise | Configura la ubicación y la retención del [registro de auditoría](xref:ai-audit-log) | -| `AiProvider` y valores relacionados | Enterprise | Bloquea el proveedor del Asistente de IA. El servidor MCP no se ve afectado | +| Política | Edición | Qué hace | +| -- | -- | -- | +| `DisableMcpServer` | Todas | Elimina el servidor MCP. El chat del asistente de IA no se ve afectado | +| `DisableAi` | Todas | Desactiva todas las funcionalidades de IA, incluido el servidor MCP. Con un valor `REG_DWORD` de `1`, el instalador también deja el componente de IA fuera de las nuevas instalaciones y lo elimina al actualizar | +| `RequireMcpAccessToken` | Todos | Fuerza la autenticación con token y bloquea la preferencia | +| `DisableCSharpScripts` | Todos | Impide que un agente ejecute un script de C# y lo redacte en un documento. La redacción de una consulta DAX y todas las herramientas que solo leen no se ven afectadas | +| `BlockUnsafeScripts` | Enterprise | Permite únicamente los scripts que permanecen dentro del modelo, para cada script en Tabular Editor. Un script de agente que accede a archivos, a la red, a otros procesos o a ensamblados externos no se ejecuta, y no se abre ningún documento de revisión | +| Límites de permisos `Max...` y `McpMax...` | Enterprise | Limitan cada recurso. Los límites «Max...» se aplican al asistente de IA y al servidor MCP. Los límites «McpMax...» se aplican únicamente al servidor MCP y solo pueden reducir el límite «Max...» | +| `AiAuditLogPath`, `AiAuditLogRetentionDays` | Enterprise | Establecen la ubicación y el período de conservación del [registro de auditoría](xref:ai-audit-log) | +| `AiProvider` y valores relacionados | Enterprise | Bloquear el proveedor del asistente de IA. El servidor MCP no se ve afectado | > [!WARNING] -> Sin una licencia Enterprise, cualquier valor de directiva Enterprise impide que se inicien el Asistente de IA y el servidor MCP, y elimina el elemento de menú y el indicador de la barra de estado. Un valor de `BlockUnsafeScripts` también bloquea todos los scripts y las macros, así que implementa directivas Enterprise solo en equipos con licencia Enterprise (consulta [Qué ocurre sin la Edición Enterprise](xref:policies#what-happens-without-enterprise-edition)). +> Sin una licencia Enterprise, cualquier valor de política Enterprise impide que el Asistente de IA y el servidor MCP se inicien y elimina el elemento del menú y el indicador de la barra de estado. El valor `BlockUnsafeScripts` también bloquea todos los scripts y macros, por lo que debe implementar las políticas Enterprise solo en equipos con licencia Enterprise (consulte [Qué sucede sin la Enterprise Edition](xref:policies#what-happens-without-enterprise-edition)). -En la Edición Enterprise, Tabular Editor mantiene un [registro de auditoría](xref:ai-audit-log) local de la actividad del Asistente de IA y del servidor MCP, incluidas todas las herramientas que un agente invocó y el texto completo de cualquier C# Script que ejecutó. Los prompts, las respuestas y los valores de datos no se registran. El botón **Abrir carpeta de auditoría** en el cuadro de diálogo del servidor y en **Herramientas > Preferencias > Características de IA** abre la carpeta del registro. En las ediciones Desktop y Edición Business, no se registra nada y no aparece ninguno de los dos botones. +En la edición Enterprise, Tabular Editor mantiene un [registro de auditoría](xref:ai-audit-log) local de la actividad del Asistente de IA y del servidor MCP, que incluye todas las herramientas a las que ha llamado un agente y el texto completo de cualquier script de C# que haya ejecutado. No se registran las indicaciones, las respuestas ni los valores de los datos. **Abrir carpeta de auditoría** en el cuadro de diálogo del servidor y en **Herramientas > Preferencias > Funciones de IA** abre la carpeta de registros. En las ediciones Desktop y Business, no se registra nada y no aparece ninguno de los dos botones. -Consulta @policies para ver la lista completa, la estructura del Registro y las plantillas administrativas. +Consulta @policies para ver la lista completa, la estructura del registro y las plantillas administrativas. -## Solución de problemas +## Resolución de problemas -| Lo que ves | Qué ocurre | -| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| El agente dice que no tiene herramientas para Tabular Editor | El servidor no está en ejecución, o el agente se conectó antes de que arrancara. Comprueba que la barra de estado muestre **MCP iniciado** y, a continuación, vuelve a conectar el agente | -| El agente no puede ver un permiso que acabas de conceder | Los permisos se leen al iniciar el servidor y la lista de herramientas queda fijada en el momento de la conexión. Detén el servidor y vuelve a iniciarlo; luego vuelve a conectar el agente | -| El agente pierde la conexión tras una pausa larga | El servidor cierra una sesión tras 20 minutos sin solicitudes y sin ningún flujo abierto. Vuelve a conectar el agente | -| El agente reporta que no hay ningún modelo abierto | El servidor se ejecuta de forma independiente de tu modelo. Abre un modelo en Tabular Editor y vuelve a preguntar. No hace falta reiniciar nada | -| El agente no puede ejecutar consultas DAX | De forma predeterminada, **Datos del modelo** está configurado como **Denegar**. Las consultas también necesitan una conexión activa: con un modelo abierto desde el disco, la herramienta de consultas no está disponible, independientemente del permiso concedido | -| Las conexiones se rechazan con un 401 | **Requerir token de acceso** está activada y el agente no está enviando el token. Vuelve a copiar la configuración de registro desde el cuadro de diálogo. Incluye el token | -| El puerto ya está en uso | Otra instancia de Tabular Editor u otra aplicación lo está usando. Acepta el siguiente puerto libre cuando se te pida y actualiza el registro del agente. Si **Iniciar el servidor MCP automáticamente** está activado, un conflicto al iniciar no muestra ningún aviso y el indicador muestra **MCP Stopped** | -| **Herramientas > Servidor MCP...** no aparece en el menú | La opción **Habilitar servidor MCP** está desmarcada en las preferencias, el componente de funciones de IA no está instalado, un administrador ha establecido `DisableMcpServer` o `DisableAi`, o se ha configurado un valor de directiva Enterprise en un equipo que no tiene licencia para ello. Consulta @policies | +| Lo que ves | Lo que está pasando | +| -- | -- | +| El agente dice que no tiene herramientas para Tabular Editor | El servidor no está en funcionamiento o el agente se conectó antes de que lo estuviera. Compruebe que en la barra de estado aparezca **MCP iniciado** y, a continuación, vuelva a conectar el agente | +| El agente no puede ver un permiso que acabas de conceder | Los permisos se leen al iniciar el servidor y la lista de herramientas se fija en el momento de la conexión. Detenga e inicie el servidor y, a continuación, vuelva a conectar el agente | +| El agente pierde la conexión después de un largo descanso | El servidor cierra una sesión después de 20 minutos sin solicitudes ni flujos abiertos. Vuelva a conectar el agente | +| El agente informa de que no hay ningún modelo abierto | El servidor se ejecuta independientemente de tu modelo. Abre un modelo en Tabular Editor y vuelve a preguntar. No es necesario reiniciar nada | +| El agente no puede ejecutar consultas DAX | **Datos del modelo** está configurado como **Denegar** de forma predeterminada. Las consultas también necesitan una conexión en vivo: en el caso de un modelo abierto desde el disco, la herramienta de consultas no está disponible independientemente del permiso. | +| Las conexiones se rechazan con un código 401 | La opción **Requerir token de acceso** está activada y el agente no está enviando el token. Vuelva a copiar la configuración de registro del cuadro de diálogo. Incluye el token | +| El puerto ya está en uso | Otra instancia de Tabular Editor u otra aplicación lo está utilizando. Acepte el siguiente puerto libre en el mensaje y actualice el registro del agente. Si la opción **Iniciar el servidor MCP automáticamente** está activada, un conflicto al iniciar no mostrará ningún mensaje y el indicador indicará **MCP detenido** | +| **Herramientas > Servidor MCP...** no aparece en el menú | La opción **Habilitar servidor MCP** está desactivada en las preferencias, el componente de funciones de IA no está instalado, un administrador ha establecido `DisableMcpServer` o `DisableAi`, o se ha establecido un valor de política Enterprise en un equipo que no tiene licencia para ello. Consulte @policies | -## Pasos a seguir +## Próximos pasos -- @ai-assistant para el modelo completo de permisos y el chat integrado. -- @unsaved-changes para revisar y revertir lo que hizo un agente. -- @csharp-scripts para saber qué puede cambiar un script y, por tanto, un agente. -- @policies para gestionar el servidor a nivel de toda la organización. -- @te-cli-skill si tu agente trabaja con archivos de modelo en un repositorio o una canalización. +- @ai-assistant para conocer el modelo de permisos completo y el chat integrado. +- @unsaved-changes para revisar y revertir lo que ha hecho un agente. +- @csharp-scripts para saber qué puede cambiar un script y, por lo tanto, un agente. +- @policies para gestionar el servidor en toda una organización. +- @te-cli-skill si tu agente trabaja en archivos de modelo en un repositorio o en un pipeline. diff --git a/localizedContent/es/content/features/metadata-translation-editor.md b/localizedContent/es/content/features/metadata-translation-editor.md index 90f1c84a1..4a9e64e10 100644 --- a/localizedContent/es/content/features/metadata-translation-editor.md +++ b/localizedContent/es/content/features/metadata-translation-editor.md @@ -1,8 +1,8 @@ ---- +--- uid: metadata-translation-editor -title: Editor de traducción de metadatos -author: Šarūnas Jučius -updated: 2023-04-18 +title: Metadata Translation Editor +author: Morten Lønskov +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,27 +16,29 @@ applies_to: - edition: Enterprise full: true --- +# Metadata Translation Editor -# Editor de traducción de metadatos +El **Metadata Translation Editor** proporciona una visión general de los nombres, las descripciones y las carpetas de visualización traducidos de los objetos traducibles del modelo. Puede iniciar el Metadata Translation Editor a través del menú **Ver**. Como alternativa, si solo necesita editar ciertas traducciones, selecciónelas en el **Explorador TOM** (mantenga pulsada la tecla CTRL o MAYÚS para seleccionar varias), luego haga clic con el botón derecho y elija **Mostrar en editor de traducción de metadatos**. -El **Editor de traducción de metadatos** ofrece una visión general de los nombres, las descripciones y las carpetas de visualización traducidos de los objetos del modelo que admiten traducción. Puedes iniciar el Editor de traducción de metadatos desde el menú **Ver**. Como alternativa, si solo necesita editar determinadas traducciones, selecciónelas en el **Explorador TOM** (mantenga pulsadas CTRL o SHIFT para seleccionar varias) y, después, haga clic con el botón derecho y elija **Mostrar en el Editor de traducción de metadatos**. +![Metadata Translation Editor](~/content/assets/images/metadata-translation-editor.png) -![Editor de traducción de metadatos](~/content/assets/images/metadata-translation-editor.png) +Utilice los campos de entrada del editor de traducción de metadatos para añadir/eliminar o editar rápidamente las traducciones de los nombres de los objetos, las descripciones y los nombres de las carpetas de visualización para el idioma correspondiente. Las tres primeras columnas del editor le permiten cambiar los nombres predeterminados, las descripciones y los nombres de las carpetas de visualización de los objetos. Puede usar Deshacer (Ctrl+Z) y Rehacer (Ctrl+Y) de la forma habitual. -Use los campos de entrada del Editor de traducción de metadatos para añadir, quitar o editar rápidamente las traducciones de los nombres de los objetos, las descripciones y los nombres de las carpetas de visualización en el idioma correspondiente. Las tres primeras columnas del editor le permiten cambiar los nombres predeterminados, las descripciones y los nombres de carpetas de visualización de los objetos. Puedes usar Deshacer (Ctrl+Z) y Rehacer (Ctrl+Y) de la forma habitual. +Para eliminar una traducción, borre su celda y pulse **Intro**. Al borrar la celda predeterminada **Descripción** o **Carpeta para mostrar**, se vacía esa propiedad. No se puede borrar el **Nombre** predeterminado. Las celdas **Carpeta para mostrar** del modelo, las tablas, los niveles de jerarquía y las perspectivas son de solo lectura. -## Barra de herramientas del Editor de traducción de metadatos +## Barra de herramientas del Metadata Translation Editor -Mientras el Editor de traducción de metadatos está activo, la barra de herramientas asociada ofrece las siguientes opciones: +Mientras el Metadata Translation Editor está activo, la barra de herramientas que lo acompaña ofrece las siguientes opciones: -- ![Editor de traducción de metadatos Nueva traducción](~/content/assets/images/metadata-translation-editor-add-translation.png) **Nueva traducción**: Este botón agrega una nueva traducción al modelo. La traducción se mostrará en el Editor de traducción de metadatos. -- ![Editor de traducción de metadatos Ocultar miembros](~/content/assets/images/perspective-editor-hide-members.png) **Mostrar u ocultar objetos ocultos**: Habilite esta opción si quiere ver todos los objetos en el Editor de traducción de metadatos, incluidos los objetos ocultos. -- ![Editor de traducción de metadatos Ocultar nombres](~/content/assets/images/metadata-translation-editor-name.png) **Mostrar/ocultar nombres**: Desactive esta opción si no quiere ver las columnas de traducción de nombres en el Editor de traducción de metadatos. -- ![Editor de traducción de metadatos Ocultar descripciones](~/content/assets/images/metadata-translation-editor-description.png) **Mostrar/ocultar descripciones**: Desactive esta opción si no quiere ver las columnas de traducción de descripciones en el Editor de traducción de metadatos -- ![Editor de traducción de metadatos Ocultar carpetas de visualización](~/content/assets/images/perspective-editor-folder.png) **Mostrar/ocultar carpetas de visualización**: Desactive esta opción si no quiere ver las columnas de traducción de carpetas de visualización en el Editor de traducción de metadatos +- ![Metadata Translation Editor Nueva traducción](~/content/assets/images/metadata-translation-editor-add-translation.png) **Nueva traducción**: Este botón añade una nueva traducción al modelo. La traducción aparece en el Metadata Translation Editor. +- ![Editor de traducción de metadatos Ocultar miembros](~/content/assets/images/perspective-editor-hide-members.png) **Mostrar/ocultar objetos ocultos**: Habilite esta opción si desea ver todos los objetos en el Editor de traducción de metadatos, incluidos los objetos ocultos. +- ![Metadata Translation Editor Ocultar nombres](~/content/assets/images/metadata-translation-editor-name.png) **Mostrar/Ocultar nombres**: Desactive esta opción si no desea ver las columnas de traducción de nombres en Metadata Translation Editor. +- ![Metadata Translation Editor Ocultar descripciones](~/content/assets/images/metadata-translation-editor-description.png) **Mostrar/ocultar descripciones**: Desactive esta opción si no desea ver las columnas de traducción de descripciones en Metadata Translation Editor. +- ![Editor de traducción de metadatos Mostrar/ocultar carpetas de visualización](~/content/assets/images/perspective-editor-folder.png) **Mostrar/ocultar carpetas de visualización**: Desactive esta opción si no desea ver las columnas de traducción de carpetas de visualización en el Editor de traducción de metadatos. ## Trabajar con muchas traducciones -Si estás trabajando en un modelo con muchas traducciones, puede que no sea práctico mostrarlas todas a la vez. Puedes reorganizar el orden en que se muestran las traducciones en el Editor de traducción de metadatos arrastrando los encabezados de las columnas, lo que facilita comparar traducciones en paralelo. Además, puedes agregar o quitar traducciones desde el editor en cualquier momento mediante el menú contextual al hacer clic con el botón derecho: +Si está trabajando en un modelo con muchas traducciones, puede resultar poco práctico mostrar todas a la vez. Puede reorganizar el orden de visualización de las traducciones en el Metadata Translation Editor arrastrando los encabezados de las columnas, lo que facilita la comparación de las traducciones una al lado de la otra. Además, puedes añadir/eliminar traducciones del editor en cualquier momento, a través del menú contextual que aparece al hacer clic con el botón derecho: -![Columnas del Editor de traducción de metadatos](~/content/assets/images/metadata-translation-editor-columns-bands.png) \ No newline at end of file + +![Columnas del Metadata Translation Editor](~/content/assets/images/metadata-translation-editor-columns-bands.png) \ No newline at end of file diff --git a/localizedContent/es/content/features/pivot-grid.md b/localizedContent/es/content/features/pivot-grid.md index c81afe41b..5c183477d 100644 --- a/localizedContent/es/content/features/pivot-grid.md +++ b/localizedContent/es/content/features/pivot-grid.md @@ -1,8 +1,8 @@ ---- +--- uid: pivot-grid -title: Pivot Grid +title: Pivot Grids author: Daniel Otykier -updated: 2026-05-27 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,53 +16,51 @@ applies_to: - edition: Enterprise full: true --- - -# Pivot Grid +# Pivot Grids > [!NOTE] -> La información de este artículo se aplica a Tabular Editor 3.16.0 o posterior. Asegúrese de estar usando la versión más reciente de Tabular Editor 3 para aprovechar las nuevas funciones y mejoras. +> La información de este artículo se refiere a Tabular Editor 3.16.0 o versiones posteriores. Asegúrese de usar la última versión de Tabular Editor 3 para aprovechar las nuevas características y mejoras. -Al desarrollar modelos semánticos, a menudo puede querer comprobar que sus expresiones DAX devuelven los valores esperados. Tradicionalmente, esto se hacía con herramientas cliente como Excel o Power BI. Con Tabular Editor 3, puede usar **Pivot Grids**, que se comportan de forma muy similar a las conocidas tablas dinámicas de Excel. El Pivot Grid le permite crear rápidamente vistas resumidas de los datos de su modelo, lo que le permite probar el comportamiento de sus medidas DAX al filtrar y segmentar por distintas columnas y jerarquías. +Al desarrollar modelos semánticos, es posible que a menudo desee comprobar que sus expresiones DAX devuelven los valores esperados. Tradicionalmente, esto se hacía utilizando herramientas cliente como Excel o Power BI. Con Tabular Editor 3, puedes utilizar **cuadrículas dinámicas**, que funcionan de forma muy similar a las conocidas tablas dinámicas de Excel. Pivot Grid le permite crear rápidamente vistas resumidas de los datos de su modelo, lo que le permite probar el comportamiento de sus medidas DAX al filtrar y segmentar por varias columnas y jerarquías. ![Ejemplo de Pivot Grid](~/content/assets/images/pivot-grid-example.png) -La captura de pantalla anterior muestra un Pivot Grid con dos medidas, `[Total Net Order Value]` y `[Net Orders]`, segmentado horizontalmente por Año, filtrado a 2021 y 2022, y verticalmente por la jerarquía de productos. Los usuarios de Tabular Editor 3 pueden usar esta función para asegurarse de que las expresiones DAX detrás de las medidas funcionan como se espera y para validar rápidamente los datos del modelo. +La captura de pantalla anterior muestra un Pivot Grid que contiene dos medidas, `[Total Net Order Value]` y `[Net Orders]`, que se segmentan horizontalmente por año, se filtran para 2021 y 2022, y verticalmente por la jerarquía de productos. Los usuarios de Tabular Editor 3 pueden utilizar esta función para asegurarse de que las expresiones DAX subyacentes a las medidas funcionan como se espera y para validar rápidamente los datos del modelo. -De forma predeterminada, el Pivot Grid se actualiza automáticamente cada vez que guarda cambios en el modelo semántico (Ctrl+S). Así, puede iterar rápidamente sobre sus expresiones DAX y ver los resultados en el Pivot Grid sin tener que esperar a que el modelo se actualice: cambie sus medidas, guarde el modelo y verá la nueva definición reflejada directamente en el Pivot Grid. Un buen flujo de trabajo consiste en abrir el Pivot Grid en una ventana independiente mientras trabaja en expresiones DAX en el **Editor de expresiones** o mediante un **Script DAX**. +De forma predeterminada, Pivot Grid se actualiza automáticamente cada vez que guarda los cambios en el modelo semántico (Ctrl+S). De este modo, puede iterar rápidamente en sus expresiones DAX y ver los resultados en el Pivot Grid sin tener que esperar a que el modelo se actualice. Para ello, cambie sus medidas, guarde el modelo y vea directamente la nueva definición de medida reflejada en el Pivot Grid. Un buen flujo de trabajo consiste en abrir el Pivot Grid en una ventana separada mientras se trabaja en las expresiones DAX en el **Editor de expresiones** o utilizando un **Script DAX**. > [!TIP] > Algunas aclaraciones sobre la terminología: -> -> - **Campos** hace referencia a las medidas, KPI, columnas y jerarquías del modelo. En otras palabras, todo lo que se pueda arrastrar al Pivot Grid. -> - Los **KPIs** son un tipo especial de medida que se puede crear en Tabular Editor. Se muestran en el Pivot Grid igual que las medidas, pero con un icono especial para indicar que son KPIs. Cada KPI puede tener hasta 3 valores diferentes (objetivo, tendencia y estado), que se muestran por separado en el Pivot Grid. -> - Las **columnas** del Pivot Grid (como en el término "Área de columnas") no deben confundirse con las columnas del modelo. En el Pivot Grid, las columnas se usan para segmentar los datos horizontalmente, mientras que las filas se usan para segmentar los datos verticalmente. -> - Las **celdas** del Pivot Grid son los puntos de datos individuales donde se cruzan una fila y una columna. Cada celda contiene un único valor, que es el resultado de la expresión DAX de la medida específica, evaluada bajo el contexto de filtro producido por los valores del _Área de filas_ y el _Área de columnas_, en combinación con cualquier filtro aplicado a los campos del _Área de filtros_. +> - **Campos** se refiere a las medidas del modelo, los KPI, las columnas y las jerarquías. En otras palabras, cualquier cosa que se pueda arrastrar al Pivot Grid. +> - Los **KPI** son un tipo especial de medida que se puede crear en Tabular Editor. Se muestran en el Pivot Grid al igual que las medidas, pero con un icono especial para indicar que son KPI. Cada KPI puede tener hasta 3 valores diferentes (objetivo, tendencia y estado), que se muestran por separado en el Pivot Grid. +> - Las **columnas** del Pivot Grid (como en el término «Área de columnas») no deben confundirse con las columnas del modelo. En el Pivot Grid, las columnas se usan para segmentar los datos horizontalmente, mientras que las filas se usan para segmentar los datos verticalmente. +> - Las **celdas** del Pivot Grid son los puntos de datos individuales en los que se cruzan una fila y una columna. Cada celda contiene un único valor, que es el resultado de la expresión DAX de la medida específica, evaluada bajo el contexto de filtro producido por los valores del *Área de filas* y del *Área de columnas*, en combinación con cualquier filtro aplicado a los campos del *Área de filtros*. > [!NOTE] -> Los desarrolladores con experiencia en modelos multidimensionales pueden estar más familiarizados con los términos _Dimensiones_ y _Atributos_. En los modelos semánticos, las _Dimensiones_ se representan mediante _tablas_ del modelo, y los _Atributos_ se representan mediante _columnas_ del modelo. Las _jerarquías_ en un modelo semántico son simplemente una forma de agrupar columnas, como en una jerarquía de calendario: Año > Trimestre > Mes > Día. En los modelos multidimensionales, estas jerarquías antes se llamaban _Jerarquías de atributos_ o _Jerarquías definidas por el usuario_. +> Es posible que los desarrolladores con experiencia en el ámbito multidimensional estén más familiarizados con los términos *Dimensiones* y *Atributos*. En los modelos semánticos, las *dimensiones* están representadas por *tablas* del modelo, y los *atributos* están representados por *columnas* del modelo. Las *jerarquías* en un modelo semántico son simplemente una forma de agrupar columnas, como en una jerarquía de calendario: Año > Trimestre > Mes > Día. Estas jerarquías solían llamarse *Jerarquías de atributos* o *Jerarquías definidas por el usuario* en los modelos multidimensionales. -## Crear un Pivot Grid +## Creación de un Pivot Grid -Puedes crear un Pivot Grid nuevo y vacío desde la opción de menú **Archivo > Nuevo > Nuevo Pivot Grid**. Como alternativa, selecciona una o varias medidas en el **Explorador TOM**, haz clic con el botón derecho o ve al menú **Medida** y selecciona **Agregar al Pivot Grid** para crear un nuevo Pivot Grid con las medidas seleccionadas. +Puede crear un Pivot Grid nuevo y vacío a través de la opción de menú **Archivo > Nuevo > Nuevo Pivot Grid**. Como alternativa, seleccione una o más medidas en el **Explorador TOM**, haga clic derecho o vaya al menú **Medida** y seleccione **Agregar a Pivot Grid**, para crear un nuevo Pivot Grid con las medidas seleccionadas. -![Crear un Pivot Grid desde el Explorador TOM](~/content/assets/images/create-pivot-grid-from-TOM-Explorer.png) +![Crear Pivot Grid desde el Explorador TOM](~/content/assets/images/create-pivot-grid-from-TOM-Explorer.png) -Puedes crear tantos Pivot Grid como quieras. +Puedes crear tantas Pivot Grids como quieras. > [!IMPORTANT] -> La opción de crear un Pivot Grid solo está disponible mientras Tabular Editor 3 esté conectado a una instancia de Analysis Services o al punto de conexión XMLA de Power BI / Fabric. +> La opción de crear un Pivot Grid solo está disponible mientras Tabular Editor 3 está conectado a una instancia de Analysis Services o al punto de conexión XMLA de Power BI / Fabric. -## Diseño del Pivot Grid +## Estructura del Pivot Grid -El Pivot Grid se divide en 4 áreas: **Área de filtros**, **Área de columnas**, **Área de filas** y **Área de datos**. Puedes arrastrar campos desde la **Lista de campos** o el **Explorador TOM** a estas áreas para crear un diseño de Pivot Grid. El **Área de datos** es donde colocas medidas o KPIs, mientras que el **Área de filas** y el **Área de columnas** se usan para segmentar los datos por jerarquías y columnas. El **Área de filtros** se usa para filtrar los datos en función de los valores de columnas o jerarquías. +Pivot Grid se divide en 4 áreas: **Área de filtros**, **Área de columnas**, **Área de filas** y **Área de datos**. Puede arrastrar campos desde la **Lista de campos** o el **Explorador TOM** a estas áreas para crear una estructura de Pivot Grid. El **Área de datos** es donde se colocan las medidas o los KPI, mientras que el **Área de filas** y el **Área de columnas** se utilizan para segmentar los datos por jerarquías y columnas. El **Área de filtros** se utiliza para filtrar los datos en función de los valores de las columnas o las jerarquías. ![Pivot Grid vacío resaltado](~/content/assets/images/empty-pivot-grid-highlighted.png) -La captura de pantalla anterior muestra un diseño de Pivot Grid vacío. Los 4 cuadros vacíos en la parte inferior de la Lista de campos representan las 4 áreas del Pivot Grid. Puedes arrastrar campos de la Lista de campos a estos cuadros de lista para crear un diseño de la Pivot Grid. También puedes arrastrar campos directamente a la Pivot Grid. +La captura de pantalla anterior muestra una estructura de Pivot Grid vacía. Los 4 cuadros vacíos de la parte inferior de la Lista de campos representan las 4 áreas del Pivot Grid. Puede arrastrar campos desde la Lista de campos a estos cuadros de lista para crear una estructura de Pivot Grid. Como alternativa, puede arrastrar campos directamente al Pivot Grid. ## Menú y barra de herramientas de Pivot Grid -De forma predeterminada, cuando la Pivot Grid es la ventana activa en Tabular Editor 3, están disponibles un menú y una barra de herramientas de **Pivot Grid**. El menú contiene las mismas acciones que la barra de herramientas. +De forma predeterminada, cuando una Pivot Grid es la ventana activa en Tabular Editor 3, están disponibles un menú y una barra de herramientas de **Pivot Grid**. El menú contiene las mismas acciones que la barra de herramientas. ![Barra de herramientas de Pivot Grid](~/content/assets/images/pivot-grid-toolbar.png) @@ -70,102 +68,118 @@ De forma predeterminada, cuando la Pivot Grid es la ventana activa en Tabular Ed Estas acciones son: -- **Suplantación...**: Muestra un cuadro de diálogo que te permite especificar un rol o usuario para suplantar a través de la Pivot Grid. Esto es útil cuando quieres probar el comportamiento de tu modelo para distintos usuarios o roles, por ejemplo, cuando se ha aplicado [RLS u OLS](xref:data-security-about) al modelo. -- **Actualizar**: Vuelve a ejecutar la consulta generada por la Pivot Grid. Esto es útil cuando la actualización automática está deshabilitada o si se han realizado cambios en el modelo fuera de Tabular Editor 3. -- **Actualización automática**: Activa o desactiva la actualización automática. Cuando la actualización automática está habilitada, la Pivot Grid se actualizará automáticamente cada vez que guardes cambios en el modelo o cuando finalice una [operación de actualización de datos](xref:data-refresh-view). -- **Borrar filtros**: Borra todos los filtros de la Pivot Grid. -- **Borrar**: Quita todos los campos de la Pivot Grid. -- **Mostrar valores vacíos en columnas**: Activa o desactiva la visualización de valores vacíos en la Pivot Grid para los campos que se agreguen al área de columnas de la Pivot Grid. -- **Mostrar valores vacíos en filas**: Activa o desactiva la visualización de valores vacíos en la Pivot Grid para los campos que se agreguen al área de filas de la Pivot Grid. +- **Suplantación...**: Muestra un cuadro de diálogo que le permite especificar un rol o un usuario para suplantar a través del Pivot Grid. Esto es útil cuando desea probar el comportamiento de su modelo para diferentes usuarios o roles, como cuando se ha aplicado [RLS u OLS](xref:data-security-about) al modelo. +- **Actualizar**: Vuelve a ejecutar la consulta generada por el Pivot Grid. Esto resulta útil cuando la actualización automática está desactivada o si se han realizado cambios en el modelo fuera de Tabular Editor 3. +- **Actualización automática**: Activa o desactiva la actualización automática. Cuando la actualización automática está habilitada, Pivot Grid se actualizará automáticamente cada vez que guarde los cambios en el modelo, o cuando se complete una [operación de actualización de datos](xref:data-refresh-view). +- **Borrar filtros**: Borra todos los filtros del Pivot Grid. +- **Borrar**: Quita todos los campos del Pivot Grid. +- **Mostrar valores vacíos en columnas**: Activa o desactiva si los valores vacíos deben mostrarse en el Pivot Grid, para los campos que se agregan al Área de Columnas del Pivot Grid. +- **Mostrar valores vacíos en filas**: Activa o desactiva la visualización de valores vacíos en el Pivot Grid, para los campos que se añaden al Área de Filas del Pivot Grid. - **Lista de campos**: Activa o desactiva la lista de campos. ## Lista de campos -De forma predeterminada, la Lista de campos se muestra a la derecha de la Pivot Grid. La Lista de campos contiene todos los campos (medidas, KPIs, columnas y jerarquías) disponibles en el modelo. Puedes arrastrar campos de la Lista de campos a la Pivot Grid para crear un diseño. También puedes arrastrar campos entre las distintas áreas de la Pivot Grid para reorganizar el diseño. +De forma predeterminada, la lista de campos se muestra en el lado derecho del Pivot Grid. La lista de campos contiene todos los campos (medidas, KPI, columnas y jerarquías) que están disponibles en el modelo. Puede arrastrar campos de la Lista de campos al Pivot Grid para crear un diseño. También puedes arrastrar campos entre las diferentes áreas del Pivot Grid para reorganizar la estructura. -La Lista de campos se puede acoplar al lado izquierdo o derecho de la Pivot Grid, encima o debajo; también se puede ocultar o desacoplar para que "flote" como una ventana independiente. Si tienes varias Pivot Grids abiertas, cada Pivot Grid tiene su propia Lista de campos. +La propia Lista de campos se puede acoplar al lado izquierdo o derecho del Pivot Grid, por encima o por debajo, se puede ocultar o se puede desacoplar para que «flote» como una ventana independiente. Si tienes varias Pivot Grids abiertas, cada Pivot Grid tiene su propia lista de campos. -Si prefieres que la Lista de campos no se muestre de forma predeterminada, desmarca la opción **Mostrar siempre la lista de campos** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid > Lista de campos**. +Si no desea que la lista de campos se muestre de forma predeterminada, desmarque la opción **Mostrar siempre lista de campos** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid > Lista de campos**. -Puedes cambiar el diseño predeterminado de la Lista de campos en **Herramientas > Preferencias > Exploración de datos > Pivot Grid > Lista de campos > Diseño**. También puedes cambiar el diseño de cualquier Lista de campos: haz clic con el botón derecho en un área vacía de la Lista de campos y selecciona el diseño que desees en el menú contextual. +Puede cambiar el diseño predeterminado de la lista de campos en **Herramientas > Preferencias > Exploración de datos > Cuadrícula dinámica > Lista de campos > Diseño**. También puede cambiar el diseño de cualquier lista de campos haciendo clic con el botón derecho en un área vacía de la lista de campos y eligiendo el diseño deseado en el menú contextual. -![Configuración de la Lista de campos](~/content/assets/images/field-list-settings.png) +![Configuración de la lista de campos](~/content/assets/images/field-list-settings.png) -De forma predeterminada, cualquier campo que agregues al Pivot Grid sigue siendo visible en la Lista de campos. Si quieres ocultar los campos que se agregan al Pivot Grid, puedes desmarcar la opción **Mantener los campos visibles** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid > Lista de campos** (este comportamiento es similar a como funcionaba Pivot Grid antes de Tabular Editor v. 3.16.0). +De forma predeterminada, cualquier campo que añada al Pivot Grid permanece visible en la Lista de campos. Si desea ocultar los campos que se añaden al Pivot Grid, puede desmarcar la opción **Mantener campos visibles** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid > Lista de campos** (este comportamiento es similar al funcionamiento del Pivot Grid antes de Tabular Editor v. 3.16.0). -Si trabajas con un modelo grande y complejo, y esperas que las medidas usadas en el Pivot Grid tarden relativamente en calcularse, puedes activar la opción **Aplazar actualización del diseño** en la parte inferior de la Lista de campos. Esto evita que el Pivot Grid actualice el diseño cada vez que agregas o quitas un campo, lo que puede ser útil si quieres hacer varios cambios en el diseño del Pivot Grid antes de actualizarlo. Pulsa el botón **Actualizar** para aplicar los cambios al Pivot Grid. +Si está trabajando en un modelo grande y complejo y espera que las medidas utilizadas en el Pivot Grid sean relativamente lentas, puede marcar la opción **Aplazar actualización del diseño** en la parte inferior de la Lista de campos. Esto evitará que Pivot Grid actualice el diseño cada vez que añada o elimine un campo, lo que puede ser útil si tiene intención de realizar varios cambios en el diseño de Pivot Grid antes de actualizarlo. Pulse el botón **Actualizar** para aplicar los cambios al Pivot Grid. > [!IMPORTANT] -> Las columnas sin una jerarquía de atributos (IsAvailableIn MDX = false) no se pueden usar en el Pivot Grid y no se muestran en la Lista de campos. +> Las columnas sin una jerarquía de atributos (IsAvailableIn MDX = false) no se pueden usar en el Pivot Grid y no se muestran en la lista de campos. ## Personalización de Pivot Grids -### Agregar campos +### Añadir campos -Hay varias formas de agregar un campo a un Pivot Grid: +Hay varias formas de añadir un campo a un Pivot Grid: **Desde el Explorador TOM:** -- Haz clic con el botón derecho en una o varias _medidas_ y elige **Agregar al Pivot Grid**. -- Haz clic con el botón derecho en una _columna_ o _jerarquía_ y elige cualquiera de las opciones de **Agregar a tabla dinámica** (elige entre filas, columnas o filtros). -- Si una medida, columna o jerarquía ya se muestra en el Pivot Grid, las opciones al hacer clic con el botón derecho te permitirán **Quitar del Pivot Grid**. además, verás opciones para mover columnas o jerarquías entre las distintas áreas del Pivot Grid. -- Todas las opciones anteriores también están disponibles en los menús **Medida**, **Columna** y **Jerarquía** (respectivamente), cuando se seleccionan uno o varios de estos objetos en el Explorador TOM. -- Además de lo anterior, también puedes arrastrar una o varias medidas, columnas o jerarquías desde el Explorador TOM a las áreas del Pivot Grid. +- Haga clic derecho en una o más *medidas* y elija **Agregar a Pivot Grid**. +- Haga clic con el botón derecho en una *columna* o *jerarquía* y elija cualquiera de las opciones **Agregar a tabla dinámica** (elija entre filas, columnas o filtros). +- Si una medida, columna o jerarquía ya se muestra en el Pivot Grid, las opciones del menú contextual le permitirán **Quitar del Pivot Grid**. Además, verá opciones para mover columnas o jerarquías entre las diferentes áreas del Pivot Grid. +- Todas las opciones anteriores también están disponibles a través de los menús **Medida**, **Columna** y **Jerarquía** (respectivamente), cuando se seleccionan uno o más de estos objetos en el Explorador TOM. +- Además de lo anterior, también puede arrastrar una o más medidas, columnas o jerarquías del Explorador TOM a las áreas de Pivot Grid. -![Agregar jerarquía a Pivot Grid desde el Explorador TOM](~/content/assets/images/add-through-tom-explorer.png) +![Añadir una jerarquía a Pivot Grid a través del Explorador TOM](~/content/assets/images/add-through-tom-explorer.png) -**Desde la Lista de campos:** +**Desde la lista de campos:** -- Arrastra un campo desde la Lista de campos al Pivot Grid. -- Arrastra un campo desde la Lista de campos a los cuadros de lista de las áreas, en la parte inferior de la Lista de campos, para agregarlo al Pivot Grid. -- Haz clic con el botón derecho en un campo de la Lista de campos para ver las opciones para añadirlo al Pivot Grid. -- Si un campo ya se muestra en el Pivot Grid, el menú contextual al hacer clic con el botón derecho también incluirá una opción para quitar el campo o moverlo a otra área (solo para campos de columna/jerarquía). -- Al hacer doble clic en un campo, este se añade inmediatamente al Pivot Grid. Las medidas y los KPI se añaden al Área de datos, mientras que las columnas y las jerarquías se añaden al Área de filtros. +- Arrastre un campo de la Lista de campos al Pivot Grid. +- Arrastre un campo de la Lista de Campos a los cuadros de lista de áreas situados en la parte inferior de la Lista de Campos para agregarlo al Pivot Grid. +- Haga clic con el botón derecho en un campo de la Lista de Campos para ver las opciones para agregarlo al Pivot Grid. +- Si un campo ya se muestra en el Pivot Grid, el menú contextual que aparece al hacer clic con el botón derecho también tendrá una opción para quitar el campo o moverlo a un área diferente (solo campos de columna/jerarquía). +- Al hacer doble clic en un campo, este se agregará inmediatamente al Pivot Grid. Las medidas/KPI se añaden al Área de Datos, mientras que las columnas y las jerarquías se añaden al Área de Filtros. -![Agregar mediante la Lista de campos](~/content/assets/images/add-through-field-list.png) +![Añadir a través de la lista de campos](~/content/assets/images/add-through-field-list.png) ### Ajuste de campos -Después de añadir campos al Pivot Grid, puedes ajustar el ancho de las columnas para adaptarlo mejor a su contenido. Al hacer doble clic en el separador del encabezado de una columna, el ancho de la columna se ajustará automáticamente para adaptarse a su contenido. También puedes arrastrar el separador del encabezado de la columna para ajustar el ancho manualmente. Por último, puedes usar las opciones del menú contextual **Mejor ajuste** o **Establecer ancho...** haciendo clic con el botón derecho en el encabezado de la columna. +Después de agregar campos al Pivot Grid, puede ajustar el ancho de las columnas para que se adapten mejor a su contenido. Al hacer doble clic en el separador de un encabezado de columna, se ajustará automáticamente el ancho de la columna para que se adapte al contenido de la columna. También puede arrastrar el separador del encabezado de la columna para ajustar manualmente el ancho de la columna. Por último, puede usar las opciones del menú contextual **Ajustar al contenido** o **Establecer ancho...** haciendo clic con el botón derecho en el encabezado de la columna. -![Mejor ajuste de columnas 2](~/content/assets/images/best-fit-columns-2.png) +![Ajustar al contenido las columnas 2](~/content/assets/images/best-fit-columns-2.png) -Para aplicar un "Mejor ajuste" o establecer un ancho específico en píxeles para todas las columnas del Pivot Grid al mismo tiempo, haz clic con el botón derecho en el encabezado "Valores" y selecciona la opción deseada en el menú contextual. +Para aplicar un «Ajuste óptimo» o establecer un ancho específico en píxeles para todas las columnas del Pivot Grid simultáneamente, haga clic con el botón derecho en el encabezado «Valores» y seleccione la opción deseada en el menú contextual. -De forma predeterminada, los encabezados de campo se expandirán verticalmente para adaptarse al contenido del nombre del campo. Si quieres limitar la altura de los encabezados de campo a una sola fila, puedes desactivar la opción **Ajustar texto en encabezados de campo** en **Herramientas > Preferencias > Pivot Grid > Encabezados de campo**. +De forma predeterminada, los encabezados de campo se expanden verticalmente para adaptarse al nombre del campo. Para limitar los encabezados de campo a una sola fila, desmarque **Ajuste de línea en encabezados de campo** en **Herramientas > Preferencias > Exploración de datos > Cuadrícula dinámica > Encabezados de campo**. -Para cambiar el orden de los campos en el Pivot Grid, puedes arrastrar campos entre las distintas áreas del Pivot Grid. También puedes arrastrar campos dentro de la misma área para cambiar su orden. Para quitar un campo del Pivot Grid, arrástralo de vuelta a la Lista de campos o haz clic con el botón derecho en el campo y elige **Quitar del Pivot Grid** en el menú contextual. +Para cambiar el orden de los campos en el Pivot Grid, puede arrastrar los campos entre las diferentes áreas del Pivot Grid. También puedes arrastrar campos dentro de la misma área para cambiar su orden. Para quitar un campo del Pivot Grid, arrástrelo de nuevo a la Lista de campos o haga clic con el botón derecho en el campo y elija **Quitar del Pivot Grid** en el menú contextual. -Si quieres que las medidas se muestren en filas en lugar de en columnas, arrastra el campo "Valores" del Área de columnas al Área de filas. +Si quieres que las medidas se muestren en filas en lugar de en columnas, arrastra el campo «Valores» del área de columnas al área de filas. ### Reglas de visualización -Puedes añadir reglas de visualización a las celdas de los Pivot Grid, lo cual resulta útil para resaltarlas en función de sus valores; por ejemplo, para detectar mejor los valores atípicos. Para añadir reglas de visualización, haz clic con el botón derecho en cualquier celda del Área de datos del Pivot Grid y elige qué reglas aplicar desde el menú contextual (consulta la captura de pantalla a continuación). +Puede añadir reglas de visualización a las celdas de las tablas dinámicas, lo cual resulta útil para resaltar las celdas según sus valores, por ejemplo, para detectar mejor los valores atípicos. Para añadir reglas de visualización, haga clic con el botón derecho en cualquier celda del Área de Datos del Pivot Grid y elija qué reglas aplicar en el menú contextual (vea la captura de pantalla a continuación). -![Personalizar Pivot Grid](~/content/assets/images/customizing-pivot-grids.png) +![Personalización de Pivot Grids](~/content/assets/images/customizing-pivot-grids.png) -## Persistencia de diseños del Pivot Grid +## Conservar los diseños de Pivot Grid -Al cerrar un Pivot Grid, Tabular Editor te pedirá que guardes el diseño del Pivot Grid. Si decides guardar el diseño, la próxima vez que abras el Pivot Grid se restaurará con el mismo diseño que tenía cuando lo cerraste. También puedes guardar el diseño de un Pivot Grid manualmente pulsando (Ctrl+S) o usando la opción **Archivo > Guardar**, mientras el Pivot Grid sea la ventana activa. +Cuando cierre un Pivot Grid, Tabular Editor le pedirá que guarde el diseño del Pivot Grid. Si decide guardar el diseño, la próxima vez que abra la cuadrícula dinámica, se restaurará con el mismo diseño que tenía cuando la cerró. También puede guardar el diseño de un Pivot Grid manualmente pulsando (Ctrl+S) o utilizando la opción **Archivo > Guardar**, mientras Pivot Grid sea la ventana activa. -La extensión de archivo usada para guardar diseños del Pivot Grid es `.te3pivot`. Es un archivo json sencillo que especifica qué objetos del modelo se muestran en el Pivot Grid y en qué áreas se colocan. Se hace referencia a los objetos por su nombre y su etiqueta de linaje (si existe), por lo que, por lo general, el diseño de Pivot Grid puede restaurarse incluso si el modelo se ha modificado desde que se guardó el diseño. +La extensión de archivo que se utiliza para guardar las estructuras de Pivot Grid es «.te3pivot». Se trata de un archivo json sencillo que especifica qué objetos del modelo se muestran en el Pivot Grid y en qué áreas se colocan. Se hace referencia a los objetos por su nombre y por su etiqueta de linaje (si existe), por lo que, por lo general, el diseño de Pivot Grid se puede restaurar incluso si el modelo se ha modificado desde que se guardó el diseño. > [!NOTE] -> Es posible abrir un diseño de Pivot Grid que se creó en un modelo diferente, pero tenga en cuenta que los campos del diseño pueden no existir en el modelo al que está conectado actualmente. En esos casos, el Pivot Grid mostrará un mensaje de advertencia y se quitarán del diseño los campos que no existan en el modelo. El mensaje de advertencia se puede desactivar en **Herramientas > Preferencias > Exploración de datos > Pivot Grid > Mostrar advertencia si Pivot Grid no coincide con el modelo**. +> Puede abrir una estructura de Pivot Grid que se haya creado en un modelo diferente. Si el diseño utiliza campos que no existen en el modelo al que está conectado, aparece una advertencia y esos campos se eliminan del diseño. Lo mismo sucede cuando un Pivot Grid abierto se mantiene abierto y conectado a un modelo diferente, como se describe en [Cambio de modelos](#switching-models). Para desactivar la advertencia, desmarque **Mostrar advertencia si Pivot Grid no coincide con el modelo** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid**. + +## Cambiar de modelo + +Cuando abre un modelo diferente, los Pivot Grids abiertos permanecen abiertos y se conectan al nuevo modelo. Cada Pivot Grid conserva su estructura de campos, y cualquier campo que el nuevo modelo no contenga se elimina de la estructura. Cuando se eliminan campos, aparece una advertencia: «El modelo que se acaba de abrir no contiene todos los campos utilizados por este Pivot Grid. Los campos que faltan se han eliminado de la estructura». Si el nuevo modelo no tiene datos para explorar, como un modelo cargado desde un archivo sin una base de datos de área de trabajo, Pivot Grid se vacía. + +Si la opción **Actualización automática** está desactivada para un Pivot Grid, la cuadrícula mantiene su diseño y sus valores anteriores hasta que haga clic en **Actualizar** o abra su Lista de campos. En ese momento, se conecta al nuevo modelo y elimina los campos que faltan. + +Si una Pivot Grid abierta tiene campos en su diseño, aparece la confirmación **Las Pivot Grids se volverán a vincular al nuevo modelo** antes de que se abra el nuevo modelo: + +- **Sí** abre el nuevo modelo. +- **Sí, no volver a preguntar** abre el nuevo modelo y desactiva la preferencia **Mostrar advertencia si Pivot Grid no coincide con el modelo**, lo que desactiva tanto esta confirmación como la advertencia sobre los campos eliminados. +- **Cancelar** mantiene el modelo actual cargado con todos los documentos sin cambios. + +Para conservar el diseño original, haga clic en **Cancelar** y guarde una copia del Pivot Grid con **Archivo > Guardar como** antes de cambiar de modelo. + +Desmarque **Mantener las Pivot Grids abiertas cuando se abra un modelo diferente** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid** para cerrar las Pivot Grids cuando abra un modelo diferente. La opción está seleccionada de forma predeterminada. -## Características adicionales +## Funciones adicionales -El Pivot Grid tiene algunas funciones más que conviene conocer: +Pivot Grid tiene algunas funciones más que es útil conocer: -- Si hace clic con el botón derecho en un campo, tendrá la opción **Ir a** ese campo. Esto pone el Explorador TOM en primer plano, con el objeto de modelo equivalente seleccionado. Para las medidas y las columnas calculadas, se enfocará el **Editor de expresiones**, en el que se mostrará la expresión DAX de la medida. -- Si hace clic con el botón derecho en una celda del Pivot Grid, puede seleccionar la opción **Depurar este valor**. Esto iniciará el [**DAX Debugger**](xref:dax-debugger) a partir de la medida específica y el contexto de filtro que generaron el valor de la celda. -- Mientras un Pivot Grid se está **actualizando**, algunos elementos de la barra de herramientas se deshabilitan y las acciones del menú contextual no están disponibles temporalmente. +- Si hace clic con el botón derecho en un campo, tendrá la opción de **Ir a** ese campo. Esto hace que el Explorador TOM pase a primer plano, con el objeto de modelo equivalente seleccionado. En el caso de las medidas y las columnas calculadas, se mostrará el **Editor de expresiones**, con la expresión DAX de la medida. +- Si hace clic con el botón derecho en una celda del Pivot Grid, puede seleccionar la opción **Depurar este valor**. Esto iniciará el [**Depurador de DAX**](xref:dax-debugger) a partir de la medida y el contexto de filtro específicos que produjeron el valor de la celda. +- Mientras un Pivot Grid se está **actualizando**, ciertos elementos de la barra de herramientas están deshabilitados y las acciones del menú contextual no están disponibles temporalmente. ## Limitaciones y problemas conocidos -A continuación se muestra una lista de limitaciones y problemas conocidos de los Pivot Grid en Tabular Editor 3.16.0, que estamos trabajando para resolver en próximas versiones: +A continuación se muestra una lista de limitaciones y problemas conocidos con las Pivot Grids en Tabular Editor 3.16.0, que estamos trabajando para solucionar en futuras versiones: -- Reglas de formato (como conjuntos de iconos, barras de datos, etc.) no se conservan correctamente al guardar un diseño de Pivot Grid como archivo `.te3pivot`. -- Si abre un archivo .te3pivot en un modelo distinto de aquel del que se guardó el diseño, los campos que no existan en el modelo actual se eliminarán del diseño. Al pulsar Guardar (Ctrl+S), se guardará el diseño con esos campos ya eliminados. Es posible que cambiemos este comportamiento en una versión futura para que el archivo .te3pivot no se sobrescriba sin una confirmación explícita. -- Las columnas que usan la propiedad **Agrupar por columnas** (incluidas las columnas de parámetros de campo) no se pueden agregar por sí solas al Área de filas ni al Área de columnas. Al hacerlo, aparece el error _"Column X is part of a composite key, but not all columns of the composite key are included in the expression or its dependent expression"_. Esta es una limitación general de los clientes MDX y también se produce al usar una columna de este tipo en una tabla dinámica de Excel. Para solucionarlo, agrega al Pivot Grid la columna de agrupación relacionada _antes_ de agregar la columna dependiente. Por ejemplo, si `[ProductKey]` está configurado como la columna de agrupación de `[ProductName]`, primero agrega `[ProductKey]` al Área de filas o al Área de columnas y luego agrega `[ProductName]`. -- Aplicar una ordenación ascendente o descendente explícita a una columna del Área de filas o del Área de columnas ordena los valores alfabéticamente como cadenas, independientemente del tipo de datos de la columna. Las fechas con formato de fecha larga (por ejemplo, "4 de mayo de 2024") y los enteros se ordenan de forma lexicográfica, en lugar de cronológicamente o numéricamente. Esta es una limitación de cómo ordenan los clientes MDX, y el mismo comportamiento se produce en una tabla dinámica de Excel conectada al modelo. Para obtener un orden cronológico o numérico, usa la ordenación natural de la columna (no apliques una ordenación explícita) o usa la propiedad **Ordenar por columna** de la columna del modelo para que apunte a una columna con un valor subyacente que se pueda ordenar. \ No newline at end of file +- Las reglas de formato (como los conjuntos de iconos, las barras de datos, etc.) no se conservan correctamente al guardar una estructura de Pivot Grid como archivo «.te3pivot». +- Si abre un archivo `.te3pivot` en un modelo diferente al del que se guardó el diseño, o cambia de modelo mientras está abierto un Pivot Grid guardado, los campos que no existan en el modelo actual se eliminarán del diseño. Si a continuación guarda (**Ctrl+S**), el archivo `.te3pivot` se sobrescribe sin esos campos. +- Las columnas que usan la propiedad **Agrupar por columnas** (incluidas las columnas de parámetros de campo) no se pueden agregar por sí solas al área de filas o al área de columnas. Si lo hace, se produce el error *"La columna X forma parte de una clave compuesta, pero no todas las columnas de la clave compuesta están incluidas en la expresión o en su expresión dependiente"*. Esta es una limitación general de los clientes MDX y también se produce cuando se utiliza una columna de este tipo en una tabla dinámica de Excel. Para evitarlo, agregue la columna Agrupar por relacionada al Pivot Grid *antes* de agregar la columna dependiente. Por ejemplo, si `[ProductKey]` está configurado como la columna «Agrupar por» de `[ProductName]`, añada primero `[ProductKey]` al área de filas o al área de columnas y, a continuación, añada `[ProductName]`. +- Aplicar un orden ascendente o descendente explícito a una columna del área de filas o del área de columnas ordena los valores alfabéticamente como cadenas, independientemente del tipo de datos de la columna. Las fechas con formato de fecha larga (por ejemplo, «4 de mayo de 2024») y los números enteros se ordenan lexicográficamente en lugar de cronológica o numéricamente. Esta es una limitación de cómo ordenan los clientes MDX y el mismo comportamiento se produce en una tabla dinámica de Excel conectada al modelo. Para obtener un orden cronológico o numérico, confíe en el orden natural de la columna (no aplique un orden explícito) o utilice la propiedad **Ordenar por columna** en la columna del modelo para señalar una columna con un valor subyacente que se pueda ordenar. \ No newline at end of file diff --git a/localizedContent/es/content/features/toc.md b/localizedContent/es/content/features/toc.md index 412496b42..cb50ea415 100644 --- a/localizedContent/es/content/features/toc.md +++ b/localizedContent/es/content/features/toc.md @@ -1,119 +1,100 @@ # Interfaz de usuario - ## @user-interface - -## @tom-explorer-view - +## @vista-del-explorador-de-tom ## @properties-view - +## @unsaved-changes ## @bpa-view - -## @data-refresh-view - +## @vista-de-actualización-de-datos ## @find-replace - ## @messages-view - ## @diagram-view -# Características de DAX - +# Funciones de DAX ## @dax-debugger - ## @dax-editor - ## @dax-query - ## @dax-scripts - ## @code-actions - ## @dax-package-manager # Secuencias de comandos y automatización - ## @csharp-scripts - -## Biblioteca de C# Script - -### @csharp-script-library - -### @script-library-beginner - -### @script-library-advanced - -## @script-helper-methods - -## @useful-script-snippets - +## Biblioteca de scripts de C# +### @biblioteca-de-scripts-csharp +### @biblioteca-de-scripts-principiante +### @biblioteca-de-scripts-avanzada +## @métodos-de-ayuda-para-scripts +## @fragmentos-de-script-útiles ## @macros # Análisis y calidad del modelo - -## @best-practice-analyzer - -### @built-in-bpa-rules - +## @analizador-de-buenas-prácticas +### @reglas-bpa-integradas ### @using-bpa - -### @using-bpa-sample-rules-expressions - -## @dax-optimizer-integration +### @uso-de-reglas-y-expresiones-de-ejemplo-del-bpa +## @integración-del-optimizador-de-dax # Exploración de datos y conectividad - ## @import-tables - +## @connectivity +### @connect-sql-server +### @connect-snowflake +### @connect-databricks +### @connect-oracle +### @connect-odbc +### @connect-oledb +### @connect-onelake +### @connect-dataflows +## @table-preview ## @pivot-grid - -## @semantic-model-types - -### @direct-lake-sql-model - +## @tipos-de-modelos-semánticos +### @modelo-sql-direct-lake ### @dq-over-as-limitations -# AI Features - +# Funciones de IA ## @ai-assistant +## @mcp-server +## @ai-audit-log # Funciones avanzadas de modelado - -## @metadata-translation-editor - -## @perspective-editor +## @columnas-calculadas-contexto-usuario +## @editor-traducción-metadatos +## @editor-de-perspectivas # Organización del modelo - -## @hierarchical-display - +## @visualización-jerárquica ## @table-groups -# Implementación y administración del modelo - +# Implementación y gestión de modelos ## [Implementación del modelo](deployment.md) - ## @workspace-databases - ## @workspace-mode - ## @tmdl - ## @save-to-folder - -## @save-with-supporting-files - +## @guardar-con-archivos-de-soporte +## @auto-reload ## @advanced-refresh - ## @refresh-overrides # Línea de comandos e integración - -## @command-line-options - -# Puente semántico para traducciones multiplataforma - +## Tabular Editor CLI (PuPr limitado) +### [Descripción general](xref:te-cli) +### [Instalación y configuración](xref:te-cli-install) +### [Autenticación y conexiones](xref:te-cli-auth) +### [Referencia de comandos](xref:te-cli-commands) +### [Configuración personalizada](xref:te-cli-config) +### [Modo interactivo](xref:te-cli-interactive) +### [Automatización y secuencias de comandos](xref:te-cli-automation) +### [Integración de CI/CD](xref:te-cli-cicd) +### [Resultados legibles por máquina (JSON)](xref:te-cli-findings) +### [Habilidad del agente de IA](xref:te-cli-skill) +### [Migración desde la CLI de TE2](xref:te-cli-migrate) +### [Diferencias de comportamiento y limitaciones conocidas](xref:te-cli-limitations) +## @opciones-de-línea-de-comandos + +# [Semantic Bridge para traducciones multiplataforma](xref:semantic-bridge) ## @semantic-bridge - ## @semantic-bridge-metric-view-object-model - +## @semantic-bridge-metric-view-tabular-translation ## @semantic-bridge-metric-view-validation +## @semantic-bridge-metric-view-fields-and-dimensions diff --git a/localizedContent/es/content/features/unsaved-changes.md b/localizedContent/es/content/features/unsaved-changes.md index 151956774..bf39dee59 100644 --- a/localizedContent/es/content/features/unsaved-changes.md +++ b/localizedContent/es/content/features/unsaved-changes.md @@ -2,7 +2,7 @@ uid: unsaved-changes title: Indicadores de cambios sin guardar author: Daniel Otykier -updated: 2026-09-23 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -17,136 +17,135 @@ applies_to: - edition: Enterprise full: true --- - # Indicadores de cambios sin guardar -Tabular Editor 3 marca los objetos y las propiedades que difieren de la última versión guardada del modelo. Esto incluye los cambios realizados mediante [C# Scripts](xref:csharp-scripts), macros y el [Asistente de IA](xref:ai-assistant). La marca desaparece al guardar, revertir o deshacer el cambio. +Tabular Editor 3 marca los objetos y las propiedades que difieren de la última versión guardada del modelo. Esto incluye cambios procedentes de [C# Script](xref:csharp-scripts), macros y el [Asistente de IA](xref:ai-assistant). La marca desaparece cuando guarda, revierte o deshace el cambio. Los indicadores aparecen en dos lugares: -- En el [Explorador TOM](xref:tom-explorer-view), los objetos modificados se muestran con una fila coloreada y una insignia en el icono: naranja (editado), verde (agregado) y rojo (eliminado). Estos son los colores de la vista de comparación del modelo que se muestra al desplegar. -- En la [vista de propiedades](xref:properties-view), las propiedades modificadas muestran una fila en naranja claro. +- En el [Explorador TOM](xref:tom-explorer-view), los objetos modificados se muestran en una fila de color y con una insignia con un icono: naranja (editado), verde (añadido) y rojo (eliminado). Estos son los colores de la vista de comparación de modelos que se muestra al realizar la implementación. +- En la [vista Propiedades](xref:properties-view), las propiedades modificadas se muestran en una fila de color naranja claro. -![Explorador TOM con medidas editadas, agregadas y eliminadas resaltadas, y la vista de propiedades con la fila de Descripción modificada resaltada](~/content/assets/images/unsaved-changes/overview.png) +![Explorador TOM con medidas modificadas, añadidas y eliminadas resaltadas, y la vista Propiedades con la fila Descripción modificada resaltada](~/content/assets/images/unsaved-changes/overview.png) -Ambas vistas tienen un botón **Mostrar cambios** en la barra de herramientas y un comando **Revertir** en el menú contextual. +Ambas vistas tienen un botón de la barra de herramientas **Mostrar cambios** y un comando **Revertir** al que se accede haciendo clic con el botón derecho. > [!NOTE] -> Los indicadores registran los cambios con respecto al origen desde el que se cargó el modelo o en el que se guardó por última vez. Desplegar el modelo en otra base de datos no las borra. +> Los indicadores hacen un seguimiento de los cambios en relación con el origen desde el que se cargó el modelo o en el que se guardó por última vez. Implementar el modelo en una base de datos diferente no los elimina. ## Indicadores de cambios en el Explorador TOM -Cada objeto del árbol se marca según el cambio que tenga desde el último guardado: +Cada objeto del árbol se marca según su cambio desde la última vez que se guardó: -- Los objetos **editados** muestran una fila en naranja claro y una insignia con un punto naranja. Esto abarca cualquier propiedad modificada, incluidos los cambios en un subobjeto que no tiene nodo en el árbol, como la política de actualización de una tabla o la configuración de `AlternateOf` de una columna. -- Los objetos **agregados** reciben una fila verde claro y una insignia verde con un **+**. Una tabla nueva y todas sus columnas nuevas aparecen en verde. Editar un objeto agregado no hace que pase de verde a naranja. -- Los objetos **eliminados** muestran una fila en rojo claro, un distintivo rojo con **−** y el nombre tachado. Consulta [Objetos eliminados](#deleted-objects). +- Los objetos **editados** se muestran en una fila de color naranja claro y con una insignia de punto naranja. Esto abarca cualquier propiedad modificada, incluidos los cambios en un subobjeto que no tenga ningún nodo en el árbol, como la directiva de actualización de una tabla o la configuración `AlternateOf` de una columna. +- Los objetos **añadidos** se muestran en una fila de color verde claro y con una insignia **+** de color verde. Una nueva tabla y todas sus nuevas columnas aparecen en verde. Editar un objeto añadido no hace que cambie de verde a naranja. +- Los objetos **eliminados** tienen una fila de color rojo claro, una insignia roja **−** y el nombre tachado. Consulte [Objetos eliminados](#deleted-objects). -Las tablas, las carpetas de visualización, los grupos de tablas y el nodo **Modelo** muestran un relleno rayado cuando algo que contienen ha cambiado. La insignia del icono es verde cuando todos los cambios bajo ellos son adiciones, y naranja en caso contrario. +Las tablas, las carpetas de visualización, los grupos de tablas y el nodo **Modelo** se rellenan con un sombreado cuando se ha modificado algo que está por debajo de ellos. Su insignia de icono es verde cuando todo lo que ha cambiado debajo de ellos es una adición, y naranja en caso contrario. -Dentro de una selección, el resaltado de la selección tiene prioridad sobre el color de la fila, y la insignia del icono sigue marcando los objetos modificados. Los distintivos de error y advertencia tienen prioridad sobre el distintivo de cambio. +Dentro de una selección, el resaltado de la selección tiene prioridad sobre el color de la fila y el distintivo del icono sigue marcando los objetos modificados. Las insignias de error y advertencia tienen prioridad sobre la insignia de cambio. > [!TIP] -> Si te cuesta distinguir las filas verdes de las rojas, selecciona **Modo de daltonismo** en el grupo **Accesibilidad**, en **Herramientas > Preferencia > Tabular Editor > Interfaz de usuario**. Los objetos agregados se muestran entonces en verde azulado en lugar de verde, tanto aquí como en la vista de comparación del modelo. +> Si le resulta difícil distinguir las filas verdes de las rojas, seleccione **Modo daltonismo** en el grupo **Accesibilidad** en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario**. Los objetos añadidos aparecen entonces en color turquesa en lugar de verde, tanto aquí como en la vista de comparación de modelos. ### Mostrar cambios -El botón **Mostrar cambios** de la barra de herramientas del Explorador TOM filtra el árbol para mostrar los objetos con cambios no guardados, además de las tablas, carpetas y grupos que los contienen. Mientras el filtro esté activo, el título de la vista muestra **Explorador TOM (Changed)**. +El botón **Mostrar cambios** de la barra de herramientas del Explorador TOM filtra el árbol para mostrar los objetos con cambios sin guardar, además de las tablas, carpetas y grupos que los contienen. Mientras el filtro está activo, el título de la vista dice **Explorador TOM (Modificado)**. -![Explorador TOM con el filtro Mostrar cambios activo, que muestra solo los objetos modificados y sus contenedores](~/content/assets/images/unsaved-changes/tom-explorer-show-changes.png) +![TOM Explorer con el filtro Mostrar cambios activo, mostrando solo los objetos modificados y sus contenedores](~/content/assets/images/unsaved-changes/tom-explorer-show-changes.png) -El filtro se combina con los demás conmutadores de la barra de herramientas y con el cuadro de búsqueda. Por ejemplo, al ocultar columnas con **Ctrl+2** también se ocultan las columnas modificadas en la vista filtrada. +El filtro se combina con los demás botones de activación de la barra de herramientas y con el cuadro de búsqueda. Por ejemplo, ocultar columnas con **Ctrl+2** también oculta las columnas modificadas de la vista filtrada. -## Indicadores de cambios en la vista de propiedades +## Indicadores de cambios en la vista Propiedades -Cuando seleccionas un objeto modificado, las propiedades modificadas se resaltan con la misma fila en color naranja claro. Una fila contraída que contiene un subobjeto, como la fila **KPI** de una medida o la fila **política de actualización** de una tabla, se marca cuando cambia algo dentro del subobjeto. En las filas indexadas, como **Anotaciones**, solo se marca la anotación modificada. Cuando se seleccionan varios objetos, una fila de propiedad se marca si alguno de los objetos seleccionados cambió esa propiedad. +Cuando seleccionas un objeto modificado, las propiedades modificadas se muestran en la misma fila de color naranja claro. Una fila contraída que contiene un subobjeto, como la fila **KPI** de una medida o la fila **Política de actualización** de una tabla, se marca cuando se ha modificado algo dentro del subobjeto. En el caso de las filas indexadas, como **Anotaciones**, solo se marca la anotación modificada. Cuando se seleccionan varios objetos, se marca una fila de propiedades si alguno de los objetos seleccionados ha cambiado esa propiedad. -El botón **Mostrar cambios** de la barra de herramientas de la vista de propiedades oculta las filas sin cambios. Mientras el filtro está activo, el título de la vista es **Propiedades (modificadas)**. +El botón **Mostrar cambios** de la barra de herramientas de la vista Propiedades oculta las filas que no han cambiado. Mientras el filtro está activo, el título de la vista dice **Propiedades (modificadas)**. ![Vista de propiedades con el filtro Mostrar cambios activo, que muestra solo las propiedades modificadas](~/content/assets/images/unsaved-changes/properties-show-changes.png) -## Revertir cambios +## Deshacer cambios -**Archivo > Recargar desde disco** descarta todos los cambios no guardados y vuelve a cargar el modelo desde su origen. Si el modelo se abrió desde un servidor, el comando es **Archivo > Recargar desde el servidor**. **Revertir** deshace los cambios individuales y deja intactos todos los demás cambios no guardados. +**Archivo > Recargar desde el disco** descarta todos los cambios sin guardar y recarga el modelo desde su origen. Para un modelo abierto desde un servidor, el comando es **Archivo > Volver a cargar desde el servidor**. **Revertir** deshace cambios individuales y deja todos los demás cambios sin guardar en su sitio. -Una reversión funciona igual que introducir el valor anterior o volver a crear manualmente el objeto eliminado: Tabular Editor actualiza las referencias DAX y los objetos dependientes, y añade la reversión a la pila de deshacer como un único paso. Para deshacer una reversión, usa **Editar > Deshacer** (**Ctrl+Z**). +Una reversión funciona como si se introdujera el valor anterior o se volviera a crear manualmente el objeto eliminado: Tabular Editor actualiza las referencias DAX y los objetos dependientes, y añade la reversión a la pila de deshacer como un solo paso. Para deshacer una reversión, use **Editar > Deshacer** (**Ctrl+Z**). ### Revertir una sola propiedad -Haz clic con el botón derecho en una fila marcada de la vista de propiedades y elige **Revertir** para restaurar su valor guardado. Los demás cambios no guardados del objeto permanecen intactos. +Haga clic derecho en una fila marcada en la vista Propiedades y elija **Revertir** para restaurar su valor guardado. Los demás cambios sin guardar del objeto se mantienen. -![Vista de propiedades con las filas Descripción y Cadena de formato modificadas y el comando Revertir en el menú contextual](~/content/assets/images/unsaved-changes/revert-property.png) +![Vista de propiedades con las filas «Descripción» y «Cadena de formato» modificadas y el comando «Revertir» al hacer clic con el botón derecho](~/content/assets/images/unsaved-changes/revert-property.png) -**Revertir** solo está habilitado en las filas con cambios no guardados. Con varios objetos seleccionados, **Revertir** en una fila combinada restaura la propiedad en todos los objetos seleccionados que la hayan modificado, como un único paso de deshacer. **Revertir** en una fila contenedora como **Anotaciones** restaura todas sus anotaciones: las anotaciones editadas vuelven a sus valores guardados, las anotaciones agregadas se eliminan y las anotaciones eliminadas se restauran. +**Revertir** solo está habilitado en las filas con cambios sin guardar. Con varios objetos seleccionados, **Revertir** en una fila combinada revierte la propiedad en todos los objetos seleccionados que la hayan cambiado, como un solo paso de deshacer. **Revertir** en una fila de contenedor como **Anotaciones** revierte todas sus anotaciones: las anotaciones editadas vuelven a sus valores guardados, las anotaciones añadidas se eliminan y las anotaciones eliminadas se restauran. ### Revertir un objeto o una rama del modelo -Haz clic con el botón derecho en un objeto marcado del Explorador TOM y elige **Revertir** para devolver el objeto y todo lo que hay debajo de él a su último estado guardado. **Revertir** también está disponible en tablas, carpetas de visualización, grupos de tablas y en el nodo **Modelo** cuando algo debajo de ellos ha cambiado. **Revertir** en el nodo **Modelo** descarta todos los cambios no guardados del modelo, como un único paso de deshacer. +Haga clic derecho en un objeto marcado en el Explorador TOM y elija **Revertir** para devolver el objeto y todo lo que hay debajo de él a su último estado guardado. **Revertir** también está disponible en tablas, carpetas de visualización, grupos de tablas y en el nodo **Modelo** cuando algo situado debajo de ellos ha cambiado. **Revertir** en el nodo **Modelo** descarta todos los cambios sin guardar en el modelo, como un solo paso de deshacer. ![Menú contextual del Explorador TOM en una medida editada con la opción Revertir](~/content/assets/images/unsaved-changes/revert-object.png) -Cuando reviertes un objeto o una rama: +Cuando revierte un objeto o una rama: - Las propiedades editadas vuelven a sus valores guardados. -- Los objetos agregados desde el último guardado se eliminan. -- Los objetos eliminados desde el último guardado se restauran tal como estaban guardados, incluidos el KPI de una medida eliminada o los niveles de jerarquía y las relaciones de una columna eliminada. -- Los objetos de otras partes del modelo conservan sus cambios sin guardar. +- Se eliminan los objetos añadidos desde el último guardado. +- Los objetos eliminados desde el último guardado se restauran tal y como estaban guardados, incluidos el KPI de una medida eliminada o los niveles de jerarquía y las relaciones de una columna eliminada. +- Los objetos situados en otras partes del modelo conservan sus cambios sin guardar. -Si parte de una reversión falla, un mensaje de **Reversión incompleta** enumera los fallos y Tabular Editor aplica el resto. Por ejemplo, no se puede restaurar un objeto eliminado si otro objeto ya usa su nombre y no puede eliminarse. +Si falla parte de una reversión, un mensaje de **Reversión incompleta** enumera los fallos y Tabular Editor aplica el resto. Por ejemplo, un objeto eliminado no se puede restaurar si otro objeto utiliza ahora su nombre y no se puede eliminar. ## Objetos eliminados -Eliminar un objeto no lo quita del Explorador TOM. Hasta que guardes el modelo, el objeto permanece en su sitio con el nombre tachado, una fila de color rojo claro y una insignia roja **−**. Cuando se muestran las columnas de información, la columna **Tipo de objeto** muestra, por ejemplo, **Medida (Eliminada)**. +Eliminar un objeto no lo quita del Explorador TOM. Hasta que guarde el modelo, el objeto permanece en su lugar con el nombre tachado, una fila de color rojo claro y una insignia roja **−**. Cuando se muestran las columnas de información, la columna **Tipo de objeto** indica, por ejemplo, **Medida (eliminada)**. ![Explorador TOM con una medida eliminada tachada en una fila roja](~/content/assets/images/unsaved-changes/deleted-objects.png) -Haz clic con el botón derecho en un objeto eliminado y elige **Restaurar** para devolverlo al estado en que estaba cuando lo eliminaste. Si el objeto tenía cambios sin guardar antes de que lo eliminaras, esos cambios también se restauran y siguen marcados, y puedes revertirlos por separado. Para restaurar varios objetos eliminados en un solo paso, selecciónalos todos y elige **Restaurar**. +Haga clic derecho en un objeto eliminado y elija **Restaurar** para restaurarlo tal y como estaba cuando lo eliminó. Si el objeto tenía cambios no guardados antes de eliminarlo, los cambios también se restauran y permanecen marcados, y puede revertirlos por separado. Para restaurar varios objetos eliminados en un solo paso, selecciónelos todos y elija **Restaurar**. -No puedes editar, cambiar el nombre, arrastrar ni desplegar un objeto eliminado, y nunca es un destino válido para soltar o pegar. Seleccionar un objeto eliminado no selecciona ningún objeto del modelo, por lo que la vista de propiedades no muestra nada y el menú contextual solo incluye **Restaurar**. Una selección que mezcla objetos eliminados y activos no muestra ni **Restaurar** ni los comandos habituales del objeto. +No puede editar, cambiar el nombre, arrastrar ni expandir un objeto eliminado, y nunca es un destino para soltar ni pegar. Al seleccionar un objeto eliminado no se selecciona un objeto del modelo, por lo que la vista Propiedades no muestra nada y el menú contextual solo contiene la opción **Restaurar**. Una selección que combina objetos eliminados y activos no tiene ni **Restaurar** ni los comandos de objetos normales. -Los C# Script acceden a los objetos eliminados seleccionados a través de `Selected.Deleted`, como se describe en [Scripting](#scripting). +Los scripts de C# acceden a los objetos eliminados seleccionados a través de `Selected.Deleted`, como se describe en [Scripting](#scripting). -### Agrupar los objetos eliminados en un solo nodo +### Agrupar objetos eliminados bajo un solo nodo -Si seleccionas **Agrupar objetos eliminados bajo un nodo "Objetos eliminados"** en la sección **Cambios no guardados** de **Herramientas > Preferencias > Tabular Editor > Explorador TOM**, los objetos eliminados de una tabla, jerarquía, rol o grupo de tablas se muestran bajo un único nodo **Objetos eliminados** al final de su contenedor, independientemente de las carpetas de visualización en las que estuvieran. El nodo tiene una fila roja y una insignia de eliminado, y los objetos que contiene aparecen tachados. Haz clic con el botón derecho en el nodo y elige **Restaurar** para restaurar todo lo que contiene en un solo paso. +Si selecciona **Reunir los objetos eliminados bajo un nodo «Objetos eliminados»** en la sección **Cambios no guardados** de **Herramientas > Preferencias > Tabular Editor > Explorador de TOM**, los objetos eliminados de una tabla, una jerarquía, un rol o un grupo de tablas se mostrarán bajo un único nodo **Objetos eliminados** al final de su contenedor, independientemente de las carpetas de visualización en las que se encontraran. El nodo tiene una fila roja y una insignia de «Eliminado», y los objetos que se encuentran debajo están tachados. Haga clic derecho en el nodo y elija **Restaurar** para restaurar todo lo que hay debajo de él en un solo paso. -![Explorador TOM con una medida eliminada bajo un nodo Objetos eliminados al final de su tabla](~/content/assets/images/unsaved-changes/deleted-objects-group.png) +![Explorador TOM con una medida eliminada incluida en un nodo de Objetos eliminados al final de su tabla](~/content/assets/images/unsaved-changes/deleted-objects-group.png) ### Conservar los objetos eliminados entre guardados -De forma predeterminada, los objetos eliminados permanecen visibles hasta que guardas. Para cambiarlo, establece la preferencia **Mantener visibles los objetos eliminados** en una de sus otras dos opciones: +De forma predeterminada, los objetos eliminados permanecen visibles hasta que guarda. Para cambiarlo, establezca la preferencia **Mantener visibles los objetos eliminados** en una de sus otras dos opciones: -- **Nunca**: El Explorador TOM oculta los objetos eliminados inmediatamente. Para restaurarlos, usa **Revertir** en su contenedor o **Editar > Deshacer**. -- **Hasta que se cierre el modelo**: Los objetos eliminados permanecen visibles y se pueden restaurar durante toda la sesión de edición, incluso después de guardar, mientras su eliminación siga en la pila de deshacer. Restaurar un objeto eliminado antes del último guardado lo vuelve a crear y queda marcado como añadido. Un objeto que creaste y eliminaste en la misma sesión aparece solo si lo editaste o guardaste el modelo mientras existía. +- **Nunca**: El Explorador TOM oculta los objetos eliminados inmediatamente. Para restaurarlos, utilice **Revertir** en su contenedor o **Editar > Deshacer**. +- **Hasta que se cierre el modelo**: Los objetos eliminados permanecen visibles y se pueden restaurar durante toda la sesión de edición, incluso después de guardar, mientras su eliminación siga estando en la pila de deshacer. Al restaurar un objeto eliminado antes del último guardado, se vuelve a crear y se marca como añadido. Un objeto que haya creado y eliminado en la misma sesión solo aparecerá si lo editó o si guardó el modelo mientras existía. -## Cuándo se limpian los indicadores +## Cuándo desaparecen los indicadores -Una marca refleja la diferencia actual con respecto al último estado guardado. Guardar el modelo en un archivo, una carpeta o una base de datos borra todas las marcas de una vez. La marca también se borra al revertir el cambio, al deshacer hasta volver al último guardado o al restablecer manualmente una propiedad a su valor guardado. Si deshaces más allá del último guardado, los objetos que se deshicieron se marcan como modificados, y al rehacer un cambio se restaura su marca. +Una marca refleja la diferencia actual con respecto al último estado guardado. Al guardar el modelo en un archivo, una carpeta o una base de datos, se borran todas las marcas a la vez. Una marca también desaparece cuando se revierte el cambio, cuando se deshace hasta el punto del último guardado o cuando se vuelve a asignar manualmente a una propiedad su valor guardado. Si deshaces cambios más allá del último guardado, los objetos deshechos se marcan como modificados, y al rehacer un cambio se restaura su marca. ## Preferencias -La configuración de los indicadores se encuentra en la sección **Cambios no guardados** de **Herramientas > Preferencias > Tabular Editor > Explorador TOM**: +La configuración de los indicadores se encuentra en la sección **Cambios no guardados** en **Herramientas > Preferencias > Tabular Editor > Explorador TOM**: -![Sección de cambios no guardados de la página de preferencias del Explorador TOM](~/content/assets/images/unsaved-changes/preferences.png) +![Sección «Cambios sin guardar» de la página de preferencias del Explorador TOM](~/content/assets/images/unsaved-changes/preferences.png) -- **Marcar objetos con cambios no guardados** (habilitado): Colorea las filas, añade insignias a los iconos de los objetos agregados, editados y eliminados en el Explorador TOM, y aplica un tramado a sus contenedores. No afecta a la visibilidad de los objetos eliminados ni a **Mostrar cambios**. -- **Mantener visibles los objetos eliminados** (Hasta que se guarde el modelo): Cuánto tiempo permanecen los objetos eliminados en el Explorador TOM. Consulta [Mantener los objetos eliminados entre guardados](#keeping-deleted-objects-across-saves). -- **Agrupar objetos eliminados en un nodo "Objetos eliminados"** (deshabilitado): Agrupa los objetos eliminados de un contenedor bajo un único nodo. Consulta [Agrupar los objetos eliminados bajo un único nodo](#gathering-deleted-objects-under-one-node). -- **Marcar propiedades con cambios no guardados en el panel de propiedades** (habilitado): Colorea las filas de las propiedades modificadas en la vista de propiedades. No afecta a **Mostrar cambios** en la vista de propiedades. +- **Marcar objetos con cambios sin guardar** (habilitado): Colorea las filas y coloca insignias en los iconos de los objetos añadidos, editados y eliminados en el Explorador TOM, y sombreada sus contenedores. No afecta a la visibilidad de los objetos eliminados ni a **Mostrar cambios**. +- **Mantener visibles los objetos eliminados** (hasta que se guarde el modelo): cuánto tiempo permanecen los objetos eliminados en el Explorador TOM. Consulte [Mantener los objetos eliminados entre guardados](#keeping-deleted-objects-across-saves). +- **Agrupar los objetos eliminados en un nodo «Objetos eliminados»** (desactivado): enumera los objetos eliminados de un contenedor en un solo nodo. Consulte [Agrupar objetos eliminados bajo un nodo](#gathering-deleted-objects-under-one-node). +- **Marcar las propiedades con cambios sin guardar en el panel «Propiedades»** (habilitado): Colorea las filas de las propiedades modificadas en la vista «Propiedades». No afecta a **Mostrar cambios** en la vista Propiedades. -Consulta @preferences para ver las demás preferencias de esta página. +Consulte @preferences para ver los demás ajustes de esta página. -## Scripts +## Secuencias de comandos -Los [C# Scripts](xref:csharp-scripts) y las macros pueden leer la misma información sobre los cambios y ejecutar las mismas operaciones de reversión mediante estos miembros, que tiene cada objeto del modelo: +Los [scripts de C#](xref:csharp-scripts) y las macros pueden leer la misma información de cambios y ejecutar las mismas operaciones de reversión a través de estos miembros, que todos los objetos del modelo tienen: -- `HasUnsavedChanges` devuelve `true` cuando el objeto, o cualquier elemento por debajo de él, difiere del último estado guardado. En el objeto `Model`, indica si el modelo tiene cambios no guardados. -- `Revert()` revierte el objeto y sus elementos secundarios en un único paso de deshacer. El método también existe en colecciones como `Selected.Measures` y en `Model` para todo el modelo. Si una parte de la reversión falla, lanza una excepción que enumera las partes que no pudo revertir. -- `Revert("PropertyName")` restaura una propiedad a su valor guardado, por ejemplo `Revert("Expression")` o `Revert("Annotations[MyAnnotation]")`. No hace nada si la propiedad no ha cambiado. +- `HasUnsavedChanges` devuelve `true` cuando el objeto, o cualquier elemento por debajo de él, difiere del último estado guardado. En el objeto `Model`, devuelve si el modelo tiene algún cambio sin guardar. +- `Revert()` revierte el objeto y sus elementos secundarios como un solo paso de deshacer. El método también existe en colecciones como `Selected.Measures` y en `Model` para todo el modelo. Si falla alguna parte de la reversión, se produce una excepción que enumera las partes que no se han podido revertir. +- `Revert("PropertyName")` revierte una propiedad a su valor guardado; por ejemplo, `Revert("Expression")` o `Revert("Annotations[MyAnnotation]")`. No hace nada cuando la propiedad no ha cambiado. -Contenedores como las tablas, las jerarquías y los roles tienen una colección `DeletedObjects` que enumera los objetos que se han eliminado de ellos en la sesión actual. Cada entrada tiene `Name`, `ObjectType` y `Parent`, además de un método `Restore()`. `Restore()` en la colección restaura todos los elementos. +Los contenedores, como las tablas, las jerarquías y los roles, tienen una colección `DeletedObjects` que enumera los objetos eliminados de ellos en la sesión actual. Cada entrada tiene un `Name`, un `ObjectType` y un `Parent`, así como un método `Restore()`. `Restore()` en la colección restaura todas las entradas. -`Selected.Deleted` devuelve los objetos eliminados seleccionados en el Explorador TOM. Los objetos eliminados no aparecen en `Selected.Measures`, `Selected.Columns` ni en los otros accesores. +`Selected.Deleted` devuelve los objetos eliminados seleccionados en el Explorador TOM. Los objetos eliminados no aparecen en `Selected.Measures`, `Selected.Columns` ni en los demás métodos de acceso. ```csharp // List the measures with unsaved changes in the selected tables: diff --git a/localizedContent/es/content/features/views/messages-view.md b/localizedContent/es/content/features/views/messages-view.md index 0e5971d9f..a1d9e01f8 100644 --- a/localizedContent/es/content/features/views/messages-view.md +++ b/localizedContent/es/content/features/views/messages-view.md @@ -1,8 +1,8 @@ ---- -uid: vista-de-mensajes +--- +uid: messages-view title: Vista de mensajes author: Daniel Otykier -updated: 2021-09-08 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,34 +16,55 @@ applies_to: - edition: Enterprise full: true --- - # Vista de mensajes -La vista de mensajes en Tabular Editor 3 es una ventana de herramientas que muestra varios tipos de mensajes relacionados con el Dataset actual. +La vista Mensajes de Tabular Editor 3 es una ventana de herramientas que muestra varios tipos de mensajes relacionados con el conjunto de datos actual. > [!TIP] -> Puede hacer doble clic en un mensaje para ir al origen del error en el árbol del modelo o en el editor de scripts. +> Puede hacer doble clic en un mensaje para saltar al origen del error en el árbol del modelo o en el editor de scripts.
- Message View
Figura 1: Ventana de mensajes en Tabular Editor. Ofrece una visión general de todas las advertencias y errores de su Dataset
+ Vista de mensajes +
Figura 1: Ventana de mensajes en Tabular Editor. Proporciona una descripción general de todas las advertencias y los errores de su conjunto de datos
-La vista de mensajes le indicará el origen y el objeto que genera el mensaje. -Se muestran dos tipos de mensajes, errores y advertencias +Los mensajes se agrupan por **Origen**, como el analizador semántico, el editor de expresiones o Analysis Services. Cada fila tiene estas columnas: -- Errores: Esta pestaña muestra cualquier error que impida que su modelo se implemente o se guarde. Por ejemplo, si tiene una expresión no válida en un elemento de cálculo o una dependencia circular en una relación. -- Advertencias: Esta pestaña muestra cualquier advertencia que no concuerda con los estándares, pero que no impide que su modelo pueda utilizarse. Por ejemplo, tener referencias a medidas con nombres totalmente cualificados. -- +| Columna | Muestra | +| -- | -- | +| **Objeto** | El objeto o documento al que pertenece el mensaje. | +| **Tipo** | La gravedad del mensaje: error, advertencia o información. | +| **Mensaje** | El texto del mensaje. | +| **Causado por** | En el caso de un error en cascada, el objeto cuyo error lo causa. En el caso de un error raíz, el número de errores dependientes que provoca. | +| **Línea** y **Columna** | La posición del mensaje en la expresión o en el documento. | -## Copiar mensajes +Los errores son expresiones o estructuras que Analysis Services rechaza, como una expresión no válida en un elemento de cálculo o una dependencia circular. Las advertencias señalan expresiones que funcionan pero que no siguen las prácticas recomendadas, como las referencias de medidas completamente calificadas. -La vista de mensajes permite copiar el mensaje de error con Ctrl+C. +## Errores en cascada y causas raíz + +Cuando una expresión tiene un error, todas las expresiones que hacen referencia a ella también presentan un error, como una medida que falla únicamente porque falla una medida a la que hace referencia. Se trata de *errores en cascada*, y el error al que se remontan es el *error raíz*. + +La columna **Causado por** muestra un valor diferente para cada tipo de error: + +- En un error en cascada, indica el nombre del objeto con el error raíz, seguido de **+N** cuando el error se remonta a más de un error raíz. +- En un error raíz, muestra **+N errores dependientes**, contando los errores que causa directa e indirectamente. -A partir de Tabular Editor 3.23.0, Ctrl+C copia la celda seleccionada de forma predeterminada. Use Ctrl+Shift+C (o Copiar fila en el menú contextual) para copiar a nivel de fila. +Para trabajar con errores en cascada, haga clic derecho en una fila de la vista de mensajes: + +- **Ir a la causa raíz** abre el error raíz en el editor de expresiones con el error resaltado. El comando solo aparece en los errores en cascada. +- **Mostrar errores en cascada** muestra u oculta los errores en cascada. Desactívala para mostrar solo los errores raíz que debes corregir. El ajuste está activado de forma predeterminada y se guarda entre sesiones. + +Un objeto con un error propio y una referencia a un objeto roto muestra dos filas: un error raíz y un error en cascada. Los errores de Analysis Services y los errores en consultas DAX, scripts DAX y Pivot Grids nunca son en cascada. + +## Copiar mensajes +La vista de mensajes permite copiar el mensaje de error con Ctrl+C. + +A partir de Tabular Editor 3.23.0, Ctrl+C copia la celda seleccionada de forma predeterminada. Use Ctrl+Mayús+C (o Copiar fila en el menú contextual) para copiar a nivel de fila. > [!TIP] -> Haga clic con el botón derecho en una celda para elegir Copiar celda / Copiar fila. +> Haga clic con el botón derecho en una celda para elegir **Copiar celda** o **Copiar fila**. El mismo menú incluye las opciones **Ir a la causa raíz** y **Mostrar errores en cascada**. + -![Copia de vista de mensajes](~/content/assets/images/messages-view-copy.png) +![Copiar en la vista de mensajes](~/content/assets/images/messages-view-copy.png) diff --git a/localizedContent/es/content/features/views/user-interface.md b/localizedContent/es/content/features/views/user-interface.md index 3e9b37834..f6ef0aac6 100644 --- a/localizedContent/es/content/features/views/user-interface.md +++ b/localizedContent/es/content/features/views/user-interface.md @@ -16,70 +16,67 @@ applies_to: - edition: Enterprise full: true --- +# Conocer la interfaz de usuario de Tabular Editor 3 -# Conociendo la interfaz de usuario de Tabular Editor 3 - -Este artículo describe la interfaz de usuario de Tabular Editor 3. +Este artículo describe la interfaz de usuario de Tabular Editor 3. ## Elementos básicos de la interfaz de usuario -Con un modelo semántico cargado, Tabular Editor 3 muestra el diseño predeterminado que aparece a continuación. +Con un modelo semántico cargado, Tabular Editor 3 muestra el siguiente diseño predeterminado. ![Interfaz de usuario básica](~/content/assets/images/basic-ui.png) -1. **Barra de título**: Muestra el nombre del archivo cargado actualmente y, si está conectado, la base de datos de Analysis Services o el Dataset de Power BI. -2. **Barra de menús**: La barra de menús te da acceso a todas las funciones de Tabular Editor 3. Consulta [Menús](#menus) para ver una guía detallada de todos los elementos del menú. -3. **Barras de herramientas**: Las barras de herramientas te dan acceso rápido a las funciones más utilizadas. También puedes acceder desde los menús a todas las funciones disponibles en la barra de herramientas. Puedes personalizar las barras de herramientas y sus botones en **Herramientas > Personalizar...** -4. **Vista del Explorador TOM**: Una vista jerárquica de tu modelo de datos, con todos los objetos disponibles. de los metadatos del [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) que representan tu Data model. Los botones de alternancia de la parte superior te permiten filtrar qué objetos se muestran. El cuadro de búsqueda te permite filtrar objetos por nombre. -5. **Editor de expresiones**: El editor de expresiones ofrece una forma rápida de editar cualquier expresión DAX, SQL o M del objeto seleccionado actualmente en el Explorador TOM. Si cierras el editor de expresiones, puedes volver a abrirlo haciendo doble clic en un objeto del Explorador TOM. El menú desplegable de la parte superior te permite cambiar entre distintas propiedades de expresión, en caso de que el objeto seleccionado actualmente tenga más de una (por ejemplo, los KPI tienen Expresiones de objetivo, Expresiones de estado y Expresiones de tendencia, que son 3 expresiones DAX diferentes que pertenecen al mismo objeto KPI). -6. **Vista de propiedades**: Una vista detallada de todas las propiedades TOM disponibles para el/los objeto(s) seleccionados actualmente en el Explorador TOM. La mayoría de las propiedades se pueden editar desde la cuadrícula, incluso cuando hay varios objetos seleccionados. Algunas propiedades (como "Format String", "Connection String" y "Miembros de rol") tienen cuadros de diálogo emergentes o editores de colecciones que puedes abrir haciendo clic en el botón de puntos suspensivos dentro de la celda del valor de la propiedad. -7. **Vista de mensajes**: Tabular Editor 3 analiza continuamente las expresiones DAX de tu modelo para detectar errores semánticos. Cualquier error de este tipo se muestra aquí. Además, los mensajes que se muestran en esta vista pueden provenir de scripts de C# o de mensajes de error generados por Analysis Services. -8. **Barra de estado**: La barra de estado ofrece diversa información contextual sobre la selección actual, los hallazgos de Best Practice Analyzer, etc. Cuando el [servidor MCP](xref:mcp-server) está disponible, un indicador en el extremo derecho muestra **MCP iniciado** o **MCP detenido**; en su información sobre herramientas aparece la dirección en la que está escuchando el servidor. Haz clic para abrir el cuadro de diálogo del servidor MCP, o haz clic con el botón derecho para iniciar o detener el servidor, copiar una configuración de registro para tu agente o ir a la página de preferencias. +1. **Barra de título**: el nombre del archivo cargado, o de la base de datos de Analysis Services o del modelo semántico de Power BI al que está conectado. +2. **Barra de menús**: todas las funciones de Tabular Editor 3. Consulte [Menús](#menus) para ver cada menú. +3. **Barras de herramientas**: las funciones más utilizadas. Todos los comandos de las barras de herramientas también están en los menús. Personalice las barras de herramientas y sus botones en **Herramientas > Personalizar...**. +4. **Vista del Explorador TOM**: un árbol de los objetos del modelo, construido a partir de los metadatos del [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions). Los botones de activación de la parte superior filtran qué tipos de objetos se muestran, y el cuadro de búsqueda filtra los objetos por nombre. +5. **Editor de expresiones**: edita las expresiones DAX, SQL o M del objeto seleccionado en el Explorador TOM. Si lo cierra, haga doble clic en un objeto del Explorador TOM para abrirlo de nuevo. Si el objeto tiene más de una propiedad de expresión, el menú desplegable de la parte superior permite alternar entre ellas. Por ejemplo, un KPI tiene un objetivo, un estado y una expresión de tendencia. +6. **Vista de propiedades**: todas las propiedades TOM de los objetos seleccionados en el Explorador TOM. Puedes editar la mayoría de las propiedades en la cuadrícula, incluso con varios objetos seleccionados. Algunas propiedades, como **Cadena de formato**, **Cadena de conexión** y **Miembros del rol**, abren un cuadro de diálogo o un editor de colecciones desde el botón de puntos suspensivos de la celda de valor. +7. **Vista de mensajes**: errores semánticos detectados por el análisis continuo de las expresiones DAX del modelo, además de mensajes de C# Scripts y errores notificados por Analysis Services. +8. **Barra de estado**: información sobre la selección actual, los resultados de Best Practice Analyzer y mucho más. El elemento de conexión muestra la base de datos y el servidor al que está conectado como `@`, o `:` para Power BI Desktop, y **(Sin conexión)** para un modelo cargado sin conexión. Cuando el [servidor MCP](xref:mcp-server) está disponible, un indicador en el extremo derecho indica **MCP iniciado** o **MCP detenido**, y su información sobre herramientas muestra la dirección en la que escucha el servidor. Haga clic en el indicador para abrir el cuadro de diálogo **Servidor MCP**, o haga clic con el botón derecho en él para iniciar o detener el servidor, copiar una configuración de registro para su agente o abrir la página de preferencias. -El [menú Ver](#view) abre las demás vistas. +El [menú Vista](#view) abre las otras vistas. ## Personalización de la interfaz de usuario -Puedes cambiar el tamaño y reorganizar todos los elementos de la interfaz de usuario, y arrastrar vistas fuera de la ventana principal, por ejemplo a otro monitor. Tabular Editor 3 guarda el diseño al cerrar la aplicación y lo restaura la próxima vez que se inicia. +Puede cambiar el tamaño y reorganizar todos los elementos de la interfaz de usuario, así como arrastrar las vistas fuera de la ventana principal, por ejemplo, a otro monitor. Tabular Editor 3 guarda el diseño cuando cierras la aplicación y lo restaura la próxima vez que la inicies. ### Elegir un diseño diferente -Elige **Ventana > Diseño predeterminado** para restablecer la aplicación al diseño predeterminado, o **Ventana > Diseño clásico** para colocar el Explorador TOM a la izquierda y la vista de propiedades debajo del Editor de expresiones, como en Tabular Editor 2.x. +Seleccione **Ventana > Diseño predeterminado** para restablecer la aplicación al diseño predeterminado, o **Ventana > Diseño clásico** para colocar el Explorador TOM a la izquierda y la vista Propiedades debajo del Editor de expresiones, como en Tabular Editor 2.x. -Para cambiar entre tus propios diseños, guarda el actual con **Ventana > Capturar diseño** y aparecerá como opción en el menú **Ventana**. **Ventana > Diseños...** muestra todos los diseños; ahí puedes aplicarlos, cargarlos, quitarlos y guardarlos. Un diseño guardado en disco es un archivo .xml que puedes compartir con otros usuarios de Tabular Editor 3. +Para cambiar entre sus propios diseños, guarde el actual con **Ventana > Capturar diseño**, y se convertirá en una opción del menú **Ventana**. **Ventana > Diseños...** muestra una lista de todos los diseños, donde puedes aplicarlos, cargarlos, quitarlos y guardarlos. Un diseño guardado en disco es un archivo .xml que puede compartir con otros usuarios de Tabular Editor 3. -![Administrar diseños](~/content/assets/images/manage-layouts.png) +![Gestionar diseños](~/content/assets/images/manage-layouts.png) ### Opciones de acoplamiento de ventanas -Al arrastrar una vista o un documento, los indicadores de acoplamiento muestran dónde puedes acoplarlo. +Cuando arrastra una vista o un documento, los indicadores de acoplamiento muestran dónde puede acoplarlo. ![Opciones de acoplamiento de ventanas](~/content/assets/images/window-docking-options.png) -El lugar donde sueltas la ventana determina cómo se comporta: - -**Acoplamiento como pestaña de documento (indicador central)**: la ventana que sueltes en el indicador central se convierte en una pestaña de documento en el área principal de documentos, junto a documentos como consultas DAX, scripts y diagramas. Pestañas de documentos: +El lugar donde suelte la ventana determina su comportamiento: -- se incluyen al recorrer con **Ctrl+Tab** +**Anclaje de pestañas de documentos (indicador central)**: una ventana que se suelte sobre el indicador central se convertirá en una pestaña de documentos en el área de documentos principal, junto a documentos como consultas DAX, scripts y diagramas. Las pestañas de documentos: +- se incluyen cuando se alterna con **Ctrl+Tab** - no tienen ocultación automática -**Acoplamiento como ventana de herramientas (indicadores de borde)**: la ventana que sueltes en el indicador izquierdo, derecho, superior o inferior se acopla como ventana de herramientas, como el Explorador TOM y la vista de mensajes. Las ventanas de herramientas: - +**Anclaje de ventanas de herramientas (indicadores de borde)**: una ventana que se suelta en el indicador izquierdo, derecho, superior o inferior se ancla como una ventana de herramientas, como el Explorador TOM y la vista Mensajes. Ventanas de herramientas: - no se incluyen en **Ctrl+Tab** -- tienen un icono de chincheta que activa la ocultación automática y contrae la ventana cuando no se está usando -- se pueden acoplar en cualquiera de los lados del área principal de documentos +- Tienen un icono de chincheta que activa la función de ocultación automática, que contrae la ventana cuando no está en uso. +- se acoplan en cualquier lado del área del documento principal > [!TIP] -> El tamaño de una ventana acoplada depende del espacio disponible en el lugar donde la acoples, y puedes cambiar su tamaño arrastrando los divisores entre ventanas. +> El tamaño de una ventana acoplada depende del espacio disponible donde la acoples, y puedes cambiar su tamaño arrastrando los separadores entre ventanas. -### Cambiar temas y paletas +### Cambio de temas y paletas -Elige un tema en **Ventana > Tema**: +Elija un tema en **Ventana > Tema**: -- Los temas Basic y Bezier están basados en vectores y escalan bien en pantallas high-DPI. -- Los temas Blue, Dark y Light están basados en ráster y no escalan bien en pantallas high-DPI. +- Basic y Bezier están basados en vectores y se escalan en pantallas de alta resolución (DPI). +- Azul, Oscuro y Claro se basan en ráster y no se escalan bien en pantallas de alta resolución (DPI). -Para Basic y Bezier, **Ventana > Paleta predeterminada** cambia los colores del tema. +En el caso de Basic y Bezier, **Ventana > Paleta predeterminada** cambia los colores del tema. ![Paletas](~/content/assets/images/palettes.png) @@ -87,55 +84,58 @@ Para Basic y Bezier, **Ventana > Paleta predeterminada** cambia los colores del Esta sección describe cada menú. -El _documento activo_ es el documento en el que está el cursor, como el Editor de expresiones o la pestaña "Script DAX 1" de la siguiente captura de pantalla. Algunos atajos de teclado y elementos de menú dependen de si hay un documento activo y de su tipo. +El *documento activo* es el documento en el que se encuentra el cursor, como el Editor de expresiones o la pestaña «Script DAX 1» en la captura de pantalla siguiente. Algunos atajos y elementos de menú dependen de si un documento está activo y de su tipo. > [!NOTE] -> De forma predeterminada, los menús y las barras de herramientas están bloqueados. Para desbloquearlos, desmarca **Bloquear menús y barras de herramientas** en **Herramientas > Personalizar... > Opciones**. +> Los menús y las barras de herramientas están bloqueados en su lugar de forma predeterminada. Para desbloquearlos, desmarque **Bloquear menús y barras de herramientas** en **Herramientas > Personalizar... > Opciones**. + ![Documento activo](~/content/assets/images/active-document.png) ### Archivo -El menú **Archivo** carga y guarda metadatos del modelo, archivos de soporte y documentos. +El menú **Archivo** carga y guarda los metadatos del modelo, los archivos auxiliares y los documentos. ![Menú Archivo](~/content/assets/images/file-menu.png) -- **Nuevo**: crea un nuevo modelo en blanco (**Ctrl+N**) o un [archivo auxiliar](xref:supported-files#supported-file-types), como una consulta DAX, un Script DAX (archivos de texto) o un diagrama (archivo JSON). Los archivos auxiliares que no sean C# Scripts requieren que haya un modelo cargado. - - ![Menú Archivo: Nuevo](~/content/assets/images/file-menu-new.png) +- **Nuevo**: crea un nuevo modelo en blanco (**Ctrl+N**) o un [archivo de soporte](xref:supported-files#supported-file-types), como una consulta DAX, un script DAX (archivos de texto) o un diagrama (archivo JSON). Los archivos de soporte que no sean scripts de C# requieren un modelo cargado. + + ![Menú Archivo > Nuevo](~/content/assets/images/file-menu-new.png) > [!IMPORTANT] -> **Nuevo > Modelo...** no está disponible en la Edición de escritorio de Tabular Editor 3, ya que esta edición solo puede usarse como herramienta externa para Power BI Desktop. Consulta @editions. +> **Nuevo > Modelo...** no está disponible en la edición Desktop de Tabular Editor 3, que funciona únicamente como herramienta externa para Power BI Desktop. Consulte @editions. -- **Abrir**: carga un modelo desde uno de estos orígenes, o abre cualquier otro tipo de archivo compatible: +- **Abrir**: carga un modelo desde una de estas fuentes o abre cualquier otro archivo compatible: - ![Menú Archivo: Abrir](~/content/assets/images/file-menu-open.png) + ![Menú Archivo > Abrir](~/content/assets/images/file-menu-open.png) - - **Modelo desde archivo...** abre los metadatos del modelo desde un archivo, como un .bim o .pbit. - - **Modelo desde BD...** carga los metadatos de un modelo implementado. Especifica los detalles de conexión de Analysis Services o del punto de conexión XMLA de Power BI, o conéctate a una instancia local, como el servidor de la Workspace Integrada de Visual Studio o Power BI Desktop. - - **Modelo desde carpeta...** abre los metadatos del modelo desde una estructura de carpetas guardada con cualquier versión de Tabular Editor. - - **Archivo...** abre cualquier tipo de archivo compatible con Tabular Editor 3, según la extensión del nombre de archivo. Consulta [Tipos de archivo compatibles](xref:supported-files). - - **Importar desde Metric View YAML...** importa los metadatos del modelo desde un archivo YAML de Metric View de Databricks. + - **Modelo desde archivo...** abre los metadatos del modelo desde un archivo, como un archivo .bim o .pbit. + - **Modelo desde base de datos...** carga los metadatos de un modelo implementado. Introduzca los datos de conexión de Analysis Services o Power BI XMLA, o conéctese a una instancia local, como el servidor del espacio de trabajo integrado de Visual Studio o Power BI Desktop. Haga clic con el botón derecho en un servidor de la lista **Servidor** para anclarlo en la parte superior de la lista o eliminarlo. Consulte @xmla-as-connectivity. + - **Modelo desde carpeta...** abre los metadatos del modelo desde una estructura de carpetas guardada por cualquier versión de Tabular Editor. + - **Archivo...** abre cualquier tipo de archivo compatible con Tabular Editor 3, por extensión de nombre de archivo. Consulte [Tipos de archivos compatibles](xref:supported-files). + - **Importar desde vista de métrica en formato YAML...** importa los metadatos del modelo desde un archivo YAML de vista de métrica de Databricks. - ![Tipos de archivo compatibles](~/content/assets/images/supported-file-types.png) + ![Tipos de archivos compatibles](~/content/assets/images/supported-file-types.png) > [!IMPORTANT] -> En la Edición de escritorio de Tabular Editor 3, **Abrir > Modelo desde archivo...** y **Abrir > Modelo desde carpeta...** no están disponibles, y **Abrir > Archivo...** solo abre [archivos auxiliares](xref:supported-files#supported-file-types). +> En la edición Desktop de Tabular Editor 3, las opciones **Abrir > Modelo desde archivo...** y **Abrir > Modelo desde carpeta...** no están disponibles, y **Abrir > Archivo...** solo abre [archivos compatibles](xref:supported-files#supported-file-types). -- **Recargar desde disco** / **Recargar desde el servidor**: vuelve a cargar los metadatos del modelo desde su origen y descarta todos los cambios no guardados. El comando aparece como **Recargar desde disco** para un modelo cargado desde un archivo o carpeta, y como **Recargar desde el servidor** para un modelo abierto desde Analysis Services o Power BI. Si Tabular Editor 3 se ejecuta como herramienta externa para Power BI Desktop y el modelo cambia en Power BI Desktop, usa este comando para volver a cargar los metadatos del modelo sin volver a conectarte. Los modelos cargados desde un archivo o una carpeta se recargan automáticamente cuando cambian los archivos. Consulta [Recarga automática desde el disco](xref:auto-reload). -- **Cerrar documento** (**Ctrl+W**): cierra el documento o panel activo en el área principal, como una consulta DAX, un C# Script o un diagrama. Si el documento tiene cambios sin guardar, aparecerá un aviso para guardarlos. -- **Cerrar modelo**: descarga los metadatos del modelo. Si hay cambios en los metadatos, aparecerá un aviso para guardarlos. -- **Guardar**: guarda el documento activo en el archivo de origen. Si no hay ningún documento activo, guarda los metadatos del modelo en su origen: un archivo Model.bim, una estructura de carpetas con Database.json, una instancia de Analysis Services (incluido Power BI Desktop) o el punto de conexión XMLA de Power BI. +- **Recargar desde el disco** / **Recargar desde el servidor**: recarga los metadatos del modelo desde su origen y descarta todos los cambios no guardados. El comando dice **Volver a cargar desde el disco** para un modelo cargado desde un archivo o una carpeta, y **Volver a cargar desde el servidor** para un modelo abierto desde Analysis Services o Power BI. Si Tabular Editor 3 se ejecuta como una herramienta externa para Power BI Desktop y el modelo cambia en Power BI Desktop, utilice este comando para volver a cargar los metadatos del modelo sin volver a conectarse. Los modelos cargados desde un archivo o una carpeta se vuelven a cargar automáticamente cuando cambian los archivos. Consulte [Recarga automática desde el disco](xref:auto-reload). Los documentos abiertos de consultas DAX y Pivot Grid permanecen abiertos durante una recarga y se conectan al modelo recargado. +- **Cerrar documento** (**Ctrl+W**): cierra el documento o panel activo en el área principal, como una consulta DAX, un script de C# o un diagrama. Si el documento tiene cambios sin guardar, aparecerá un mensaje para guardarlos. +- **Cerrar modelo**: descarga los metadatos del modelo. Si ha modificado los metadatos, aparecerá un mensaje para guardar los cambios. Los documentos abiertos de consultas DAX y Pivot Grid se cierran con el modelo, y aparece un mensaje para guardar los cambios en cada uno de ellos que tenga cambios sin guardar. +- **Guardar**: guarda el documento activo en su archivo de origen. Si no hay ningún documento activo, guarda los metadatos del modelo en su origen: un archivo Model.bim, una estructura de carpetas Database.json, una instancia de Analysis Services (incluido Power BI Desktop) o el punto de conexión XMLA de Power BI. - **Guardar como...** guarda el documento activo como un nuevo archivo. Si no hay ningún documento activo, guarda los metadatos del modelo como un nuevo archivo .bim (JSON). - **Guardar en carpeta...** guarda los metadatos del modelo como una [estructura de carpetas](xref:save-to-folder). -- **Guardar todo**: guarda todos los documentos sin guardar y los metadatos del modelo. -- **Archivos recientes**: enumera los archivos auxiliares usados recientemente. -- **Modelos tabulares recientes**: enumera los archivos y carpetas de metadatos del modelo usados recientemente. +- **Guardar todo**: guarda todos los documentos no guardados y los metadatos del modelo. +- **Archivos recientes**: enumera los archivos auxiliares utilizados recientemente. +- **Modelos tabulares recientes**: enumera los archivos y carpetas de metadatos de modelos utilizados recientemente. + +Con **Detalle del origen del modelo** establecido en **Solo nombre** u **Oculto**, el texto que aparece al pasar el ratón por encima de los menús de archivos y modelos recientes muestra los nombres de los archivos sin los directorios. > [!IMPORTANT] -> En la Edición de escritorio de Tabular Editor 3, **Guardar en carpeta** y **Modelos tabulares recientes** están desactivados, y **Guardar como** solo está habilitado para los [archivos auxiliares](xref:supported-files#supported-file-types). +> En la edición Desktop de Tabular Editor 3, las opciones **Guardar en carpeta** y **Modelos tabulares recientes** están deshabilitadas, y la opción **Guardar como** solo está habilitada para [archivos compatibles](xref:supported-files#supported-file-types). -- **Salir**: cierra Tabular Editor 3. En primer lugar, aparece un aviso para guardar los archivos o los metadatos del modelo que no se hayan guardado. +- **Salir**: cierra Tabular Editor 3. Primero aparece un mensaje para guardar los archivos no guardados o los metadatos del modelo. ### Editar @@ -143,136 +143,129 @@ El menú **Editar** permite editar el documento activo o los metadatos del model ![Menú Editar](~/content/assets/images/edit-menu.png) -- **Deshacer**: deshace el último cambio en la parte de la ventana que tiene el foco. En un control de texto, como un documento o el **Editor de expresiones**, deshace la escritura y se muestra como **Deshacer escritura**. En otros casos, deshace el último cambio en los metadatos del modelo. **Ctrl+Z** ejecuta este comando. +- **Deshacer**: deshace el último cambio en la parte de la ventana que tiene el foco. En un control de texto, como un documento o el **Editor de expresiones**, deshace la escritura y muestra **Deshacer escritura**. En otros lugares, deshace el último cambio realizado en los metadatos del modelo. **Ctrl+Z** ejecuta este comando. - **Rehacer**: rehace el último cambio deshecho, siguiendo las mismas reglas que **Deshacer**. **Ctrl+Y** ejecuta este comando. -- **Deshacer** / **Rehacer** seguidos del nombre de un cambio del modelo, por ejemplo **Deshacer C# Script (MCP)**: solo aparecen cuando un control de texto tiene el foco y deshacen o rehacen el último cambio en los metadatos del modelo. Consulta [Deshacer en editores de texto](xref:undo-redo#undo-in-text-editors). -- **Buscar**: abre el cuadro de diálogo "Buscar y reemplazar" en la pestaña "Buscar". Consulta [Buscar](xref:find-replace#find). -- **Reemplazar**: abre el cuadro de diálogo "Buscar y reemplazar" en la pestaña "Reemplazar". Consulta [Reemplazar](xref:find-replace#replace). -- **Cortar / Copiar / Pegar**: cuando un control de texto tiene el foco, se aplican al texto seleccionado. Cuando el Explorador TOM tiene el foco, se aplican a los objetos seleccionados. Por ejemplo, para duplicar varias medidas, selecciónalas con **Mayús** o **Ctrl** en el Explorador TOM y pulsa **Ctrl+C** y, a continuación, **Ctrl+V**. +- **Deshacer** / **Rehacer** seguido del nombre de un cambio en el modelo, por ejemplo, **Deshacer script de C# (MCP)**: aparecen solo cuando un control de texto tiene el foco y deshacen o rehacen el último cambio en los metadatos del modelo. Consulte [Deshacer en editores de texto](xref:undo-redo#undo-in-text-editors). +- **Buscar**: abre el cuadro de diálogo «Buscar y reemplazar» en la pestaña «Buscar». Consulte [Buscar](xref:find-replace#find). +- **Reemplazar**: abre el cuadro de diálogo «Buscar y reemplazar» en la pestaña «Reemplazar». Consulte [Reemplazar](xref:find-replace#replace). +- **Cortar / Copiar / Pegar**: cuando un control de texto tiene el foco, estas acciones se aplican al texto seleccionado. Cuando el Explorador TOM tiene el foco, se aplican a los objetos seleccionados. Por ejemplo, para duplicar varias medidas, selecciónelas con **Mayús** o **Ctrl** en el Explorador TOM y pulse **Ctrl+C** y, a continuación, **Ctrl+V**. - **Eliminar**: elimina el texto seleccionado cuando un control de texto tiene el foco, o los objetos seleccionados cuando el Explorador TOM tiene el foco. > [!NOTE] -> Solo aparece una confirmación de eliminación cuando hay varios objetos seleccionados o cuando otros objetos dependen de los que eliminas. **Deshacer** (**Ctrl+Z**) restaura los objetos eliminados. +> Solo aparece un mensaje de eliminación cuando se seleccionan varios objetos o cuando otros objetos dependen de los que se eliminan. **Deshacer** (**Ctrl+Z**) restaura los objetos eliminados. -- **Seleccionar todo**: selecciona todo el texto del documento activo o todos los objetos que pertenecen al mismo elemento padre en el Explorador TOM. -- **Code Assist**: accesos directos a las características de Code Assist para DAX. Disponible mientras editas DAX. Consulta el [Editor de DAX](xref:dax-editor#code-assist-features). +- **Seleccionar todo**: selecciona todo el texto del documento activo o todos los objetos con el mismo elemento principal en el Explorador TOM. +- **Code Assist**: accesos directos a las funciones de Code Assist para DAX. Disponible mientras edita DAX. Consulte [Editor DAX](xref:dax-editor#code-assist-features). - **Ajuste de línea**: activa o desactiva el ajuste de línea en el documento de texto activo. ### Vista -El menú **Ver** se abre y pone el foco en las vistas de Tabular Editor 3, incluidas las ocultas. Los documentos no aparecen en la lista; cambia entre ellos con el [menú Ventana](#window). +El menú **Vista** abre y centra las vistas de Tabular Editor 3, incluidas las ocultas. Los documentos no aparecen en la lista; cambie de uno a otro con el [menú Ventana](#window). -![Menú de vista](~/content/assets/images/model-menu.png) +![Menú Ver](~/content/assets/images/view-menu.png) -- **Explorador TOM**: El Explorador TOM presenta una vista jerárquica de todo el [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) de los metadatos del modelo cargado actualmente. Consulta @tom-explorer-view para obtener más información. -- **Asistente de IA**: La vista Asistente de IA te permite interactuar con un asistente de IA que puede ayudarte con tareas de modelado. -- **Administrador de paquetes de DAX**: La vista Administrador de paquetes de DAX te permite examinar e instalar paquetes de funciones definidas por el usuario de DAX en tu modelo. -- **Best Practice Analyzer**: Best Practice Analyzer le ayuda a mejorar la calidad de su modelo al permitirle especificar reglas para la validación de mejores prácticas. Consulta @bpa-view para obtener más información. -- **Mensajes**: La vista de mensajes muestra errores, advertencias y mensajes informativos de varios orígenes, como el Analizador semántico de Tabular Editor 3. Consulta @messages-view para obtener más información. -- **Actualización de datos**: La vista Actualización de datos le permite hacer un seguimiento de las operaciones de actualización de datos que se ejecutan en segundo plano. Consulta @data-refresh-view para obtener más información. -- **Editor de expresiones**: Este es el "editor rápido" que le permite editar expresiones DAX, M o SQL en el objeto que esté seleccionado actualmente en el Explorador TOM. Consulta @dax-editor para obtener más información. -- **Macros**: La vista de macros le permite administrar cualquier macro que haya creado. Las macros se pueden crear desde @csharp-scripts. Consulta @creating-macros para obtener más información. -- **Analizador VertiPaq**: La vista Analizador VertiPaq le permite recopilar, importar y exportar estadísticas detalladas sobre los datos de su modelo para ayudarle a mejorar y depurar el rendimiento de DAX. El Analizador VertiPaq es creado y mantenido por [Marco Russo](https://twitter.com/marcorus) de [SQLBI](https://sqlbi.com) bajo la licencia MIT. Más información en la [página del proyecto en GitHub](https://github.com/sql-bi/VertiPaq-Analyzer). -- **Dependencias**: La vista [**Dependencias de DAX**](xref:creating-and-testing-dax#dax-dependencies) visualiza las dependencias entre el objeto seleccionado actualmente y otros objetos del modelo. Marca **Seguir el Explorador TOM** para que siga la selección en el árbol. -- **Optimizador de DAX**: La vista Optimizador de DAX se integra con [Optimizador de DAX](https://www.daxoptimizer.com) para analizar tu modelo en busca de problemas de rendimiento de DAX. -- **Editor de calendario**: La vista Editor de calendario te permite definir y administrar calendarios en modelos mediante la característica moderna de inteligencia temporal. -- **Editor de perspectivas**: La vista Editor de perspectivas proporciona una vista matricial de qué objetos se incluyen en cada perspectiva del modelo. -- **Editor de traducción de metadatos**: La vista Editor de traducción de metadatos proporciona una cuadrícula para editar las traducciones de metadatos (configuraciones regionales) de los objetos del modelo. -- **Barras de herramientas / Propiedades**: Los elementos restantes te permiten mostrar u ocultar las barras de herramientas y abrir la vista de propiedades (F4). +- **TOM Explorer**: un árbol del [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) del modelo cargado. Consulte @tom-explorer-view. +- **Asistente de IA**: un chat con un asistente de IA para tareas de modelado. +- **Administrador de paquetes DAX**: explora los paquetes de funciones DAX definidas por el usuario y los instala en el modelo. +- **Best Practice Analyzer**: valida el modelo con respecto a las reglas de mejores prácticas que usted defina. Consulte @bpa-view. +- **Mensajes**: errores, advertencias y mensajes informativos procedentes de fuentes como el Analizador semántico de Tabular Editor 3. Consulte @messages-view. +- **Actualización de datos**: realiza un seguimiento de las operaciones de actualización que se ejecutan en segundo plano. Consulta @data-refresh-view. +- **Editor de expresiones**: edita las expresiones DAX, M o SQL del objeto seleccionado en el Explorador TOM. Consulte @dax-editor. +- **Macros**: gestiona las macros que ha creado a partir de @csharp-scripts. Consulte @creating-macros. +- **Analizador VertiPaq**: recopila, importa y exporta estadísticas sobre los datos del modelo, para optimizar el rendimiento de DAX. El Analizador VertiPaq ha sido creado y es mantenido por [Marco Russo](https://twitter.com/marcorus) de [SQLBI](https://sqlbi.com) bajo licencia MIT. Consulte la [página del proyecto en GitHub](https://github.com/sql-bi/VertiPaq-Analyzer). +- **Dependencias**: la vista [**Dependencias DAX**](xref:creating-and-testing-dax#dax-dependencies) muestra las dependencias entre el objeto seleccionado y otros objetos del modelo. Seleccione **Seguir Explorador TOM** para que siga la selección del Explorador TOM. +- **Optimizador de DAX**: analiza el modelo en busca de problemas de rendimiento de DAX con [DAX Optimizer](https://www.daxoptimizer.com). +- **Editor de calendarios**: define y gestiona los calendarios para la función moderna de inteligencia temporal. +- **Editor de perspectivas**: una matriz que indica qué objetos incluye cada perspectiva del modelo. +- **Metadata Translation Editor**: una cuadrícula para editar las traducciones de metadatos (culturas) de los objetos del modelo. +- **Barras de herramientas / Propiedades**: alterna la visibilidad de la barra de herramientas y abre la vista Propiedades (**F4**). -## Modelo +### Modelo -El menú **Modelo** muestra las acciones que se pueden realizar a nivel del objeto Modelo (el objeto raíz del Explorador TOM). +El menú **Modelo** contiene acciones sobre el objeto Model, la raíz del Explorador TOM. -![Menú Herramientas](~/content/assets/images/tools-menu.png) +![Menú Ver](~/content/assets/images/model-menu.png) -- **Implementar...**: abre el Asistente de implementación de Tabular Editor. Consulta [Implementación del modelo](xref:deployment). +- **Implementar...**: abre el asistente de implementación de Tabular Editor. Consulte [Implementación del modelo](xref:deployment). > [!IMPORTANT] -> La opción **Deploy** no está disponible en la Edición de escritorio de Tabular Editor 3. Para más información, consulte @editions. - -- **Opciones de serialización...** Te permiten configurar cómo se serializan los metadatos del modelo al guardarlos en disco (estructura de archivos o carpetas). -- **Importar tablas...** Inicia el Asistente de importación de tablas de Tabular Editor 3. Para más información, consulte @importing-tables. -- **Actualizar esquema (todas las tablas)...** Detecta cambios en el esquema de los Data source(s) de todas las tablas del modelo, en comparación con las columnas importadas actualmente. Consulta [Actualización del esquema de tabla](xref:importing-tables#updating-table-schema) para obtener más información. -- **Script DAX**: Genera un script DAX para el/los objeto(s) seleccionados actualmente (o para todos los objetos DAX del modelo, si no se ha seleccionado nada). Para más información, consulte @dax-scripts. -- **Actualizar modelo**: Cuando Tabular Editor está conectado a una instancia de Analysis Services, este submenú contiene opciones para iniciar una operación de actualización en segundo plano a nivel de modelo. El submenú incluye las siguientes opciones. Para más información, consulta [Comando Refresh (TMSL)](https://docs.microsoft.com/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request). - - **Automático (modelo)**: Analysis Services determina qué objetos actualizar (solo los objetos que no están en el estado "Listo"). +> **Implementar** no está disponible en la edición Desktop de Tabular Editor 3. Consulte @editions. + +- **Opciones de serialización...** establece cómo se serializan los metadatos del modelo cuando se guardan en un archivo o en una estructura de carpetas. +- **Importar tablas...** abre el asistente de importación de tablas de Tabular Editor 3. Consulte @importing-tables. +- **Actualizar esquema (todas las tablas)...** compara las columnas de todas las tablas con sus fuentes de datos y detecta los cambios en el esquema. Consulte [Actualizar esquema de tabla](xref:importing-tables#updating-table-schema). +- **Script DAX**: genera un script DAX para los objetos seleccionados, o para todos los objetos DAX del modelo si no hay nada seleccionado. Consulte @dax-scripts. +- **Actualizar modelo**: inicia una actualización en segundo plano del modelo cuando Tabular Editor está conectado a Analysis Services. Consulte [Comando Actualizar (TMSL)](https://docs.microsoft.com/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request). El submenú tiene estas opciones: + - **Automática (modelo)**: Analysis Services actualiza solo los objetos que no están en el estado «Listo». - **Actualización completa (modelo)**: Analysis Services realiza una actualización completa del modelo. - - **Calcular (modelo)**: Analysis Services vuelve a calcular todas las tablas calculadas, columnas calculadas, grupos de cálculo y relaciones. No se leen datos de los Data sources. -- **Agregar [tipo de objeto]**: los elementos restantes crean objetos secundarios del modelo, como tablas, Data sources y perspectivas. + - **Calcular (modelo)**: Analysis Services vuelve a calcular todas las tablas calculadas, las columnas calculadas, los grupos de cálculo y las relaciones. No se leen datos de los orígenes de datos. +- **Añadir [tipo de objeto]**: los elementos restantes crean objetos secundarios del modelo, como tablas, orígenes de datos y perspectivas. ### Herramientas -El menú **Herramientas** incluye las preferencias y personalizaciones de Tabular Editor 3. +El menú **Herramientas** contiene las preferencias y personalizaciones de Tabular Editor 3. -![Menú Vista](~/content/assets/images/window-menu.png) +![Menú Ver](~/content/assets/images/tools-menu.png) -- **Personalizar...**: abre el cuadro de diálogo de personalización del diseño de la interfaz de usuario, donde puedes crear barras de herramientas y reordenar y editar menús y botones de la barra de herramientas. -- **Preferencias...**: abre el cuadro de diálogo de Preferencias, con opciones como comprobaciones de actualizaciones, configuración de proxy, límites de filas de consulta y tiempos de espera de las solicitudes. Consulta @preferences. -- **Administrar reglas de BPA...** abre el administrador de reglas de Best Practice Analyzer, donde puedes ver y editar reglas y colecciones de reglas. Consulta @bpa-view. -- **Servidor MCP...** abre el cuadro de diálogo **Servidor MCP**, donde puedes iniciar y detener el servidor que permite que un agente de IA externo trabaje en el modelo abierto, revisar los permisos que se le conceden al agente y copiar una configuración de registro para tu agente. Consulta @mcp-server. El elemento se oculta cuando no está instalado el componente de características de IA, cuando **Habilitar servidor MCP** está desactivado o cuando un administrador lo ha deshabilitado mediante una directiva. +- **Personalizar...** abre el cuadro de diálogo de personalización del diseño de la interfaz de usuario, donde puedes crear barras de herramientas y reorganizar y editar menús y botones de las barras de herramientas. +- **Preferencias...** abre el cuadro de diálogo Preferencias, con ajustes como las comprobaciones de actualizaciones, la configuración del proxy, los límites de filas de las consultas y los tiempos de espera de las solicitudes. Consulte @preferences. +- **Administrar reglas BPA...** abre el administrador de reglas del Best Practice Analyzer, donde puedes ver y editar reglas y conjuntos de reglas. Consulta @bpa-view. +- **Servidor MCP...** abre el cuadro de diálogo **Servidor MCP**, donde puedes iniciar y detener el servidor que permite que un agente de IA externo trabaje en el modelo abierto, revisar los permisos que obtiene el agente y copiar una configuración de registro para tu agente. Consulte @mcp-server. El elemento está oculto cuando el componente de funciones de IA no está instalado, cuando la opción **Habilitar servidor MCP** está desmarcada o cuando un administrador lo ha deshabilitado mediante una política. ### Ventana -El menú **Ventana** administra y permite cambiar entre las vistas y los documentos de la aplicación, denominados conjuntamente _ventanas_, y también incluye la configuración de [tema y paleta](#changing-themes-and-palettes). +El menú **Ventana** gestiona y alterna entre las vistas y los documentos de la aplicación, denominados conjuntamente *ventanas*, y también contiene los ajustes de [tema y paleta](#changing-themes-and-palettes). -![Menú Ver](~/content/assets/images/view-menu.png) +![Menú «Ventana»](~/content/assets/images/window-menu.png) - **Nuevo...** crea [archivos auxiliares](xref:supported-files#supported-file-types). Las opciones son las mismas que en **Archivo > Nuevo**. +- **Flotante** desacopla la vista o el documento actual en una ventana flotante. +- **Anclar pestaña** ancla una pestaña al extremo izquierdo de las pestañas de documentos. El menú contextual de la pestaña, al que se accede haciendo clic con el botón derecho, contiene comandos que cierran únicamente las pestañas que no están ancladas. + + ![Menú Ver](~/content/assets/images/tab-context-menu.png) -- **Flotar** desacopla la vista o el documento actual y lo coloca en una ventana flotante. - -- **Fijar pestaña** fija una pestaña en el extremo izquierdo de la barra de pestañas del documento. El menú contextual de la pestaña tiene comandos que cierran solo las pestañas no fijadas. - - ![Menú contextual de pestaña](~/content/assets/images/tab-context-menu.png) - -- **Nuevo grupo de pestañas horizontal/vertical**: divide el área principal de documentos en grupos de pestañas para mostrar varios documentos uno al lado del otro o uno encima del otro. - -- **Cerrar todo**: cierra todas las pestañas de documentos. Primero aparece un aviso para guardar los cambios sin guardar. - -- **Restablecer el diseño de la ventana**: restablece todas las personalizaciones aplicadas al área principal de documentos. - -- **1..N [documento]**: los 10 primeros documentos abiertos. **Ctrl+Tab** también cambia entre los documentos y las vistas abiertas: +- **Nuevo grupo de pestañas horizontal/vertical**: divide el área principal del documento en grupos de pestañas, para mostrar varios documentos uno al lado del otro o uno encima del otro. +- **Cerrar todo**: cierra todas las pestañas de documentos. Primero aparece un mensaje para guardar los cambios sin guardar. +- **Restablecer diseño de ventana**: restablece toda la personalización del área principal del documento. +- **1..N [documento]**: los primeros 10 documentos abiertos. **Ctrl+Tab** también permite alternar entre los documentos abiertos y las vistas: ![Menú Ver](~/content/assets/images/ctrl-tab.png) -- **Ventanas...**: abre un cuadro de diálogo con una lista de todos los documentos abiertos, donde puedes cambiar a uno de ellos o cerrarlo. - - ![Administrador de ventanas](~/content/assets/images/windows-manager.png) +- **Ventanas...**: abre un cuadro de diálogo que enumera todos los documentos abiertos, donde puedes cambiar a cada uno o cerrarlo. -- **Capturar diseño** / **Diseños...** / **Diseño predeterminado** / **Diseño clásico**: consulta [Elegir un diseño diferente](#choosing-a-different-layout). - -- **Tema** / **Paleta predeterminada**: consulta [Cambiar temas y paletas](#changing-themes-and-palettes). + ![Menú «Ver»](~/content/assets/images/windows-manager.png) +- **Capturar diseño** / **Diseños...** / **Diseño predeterminado** / **Diseño clásico**: consulte [Elegir un diseño diferente](#choosing-a-different-layout). +- **Tema** / **Paleta predeterminada**: consulte [Cambiar temas y paletas](#changing-themes-and-palettes). - **Idioma**: cambia el idioma de visualización de la interfaz de usuario de Tabular Editor 3. ### Ayuda -El menú **Ayuda** enlaza a recursos en línea. +El menú **Ayuda** enlaza con recursos en línea. -![Menú Ayuda](~/content/assets/images/help-menu.png) +![Menú «Ver»](~/content/assets/images/help-menu.png) -- **Documentación en línea**: abre [docs.tabulareditor.com](https://docs.tabulareditor.com) en tu navegador web predeterminado. -- **Guía de introducción**: abre la guía de introducción de Tabular Editor 3 para nuevos usuarios. -- **Soporte de la comunidad**: abre el [sitio público de soporte comunitario](https://github.com/TabularEditor/TabularEditor3). +- **Documentación en línea**: abre [docs.tabulareditor.com](https://docs.tabulareditor.com) en su navegador web predeterminado. +- **Guía de incorporación**: abre la guía de incorporación de Tabular Editor 3 para nuevos usuarios. +- **Soporte de la comunidad**: abre el [sitio público de soporte de la comunidad](https://github.com/TabularEditor/TabularEditor3). - **Soporte dedicado**: envía un correo electrónico a la línea directa de soporte dedicado. -- **Primeros pasos**: abre la página **Primeros pasos**, que reúne cursos, demostraciones y documentación de Tabular Editor. Antes de la versión 3.27.0 de Tabular Editor, este elemento se llamaba **Novedades**. Para ver las notas de la versión, consulta @release-history. +- **Primeros pasos**: abre la página **Primeros pasos**, que recopila cursos, demostraciones y documentación para Tabular Editor. Antes de Tabular Editor 3.27.0, este elemento se llamaba **Novedades**. Para consultar las notas de la versión, ve a @release-history. > [!NOTE] -> El soporte dedicado está reservado a los clientes de la Edición Enterprise de Tabular Editor 3. Los demás clientes deben usar el [sitio público de soporte de la comunidad](https://github.com/TabularEditor/TabularEditor3) para consultas técnicas y relacionadas con el producto. - -- **Acerca de Tabular Editor**: muestra la versión, los detalles de instalación y de licencia, y te permite cambiar tu clave de licencia. +> El soporte especializado está destinado a los clientes de Tabular Editor 3 Edición Enterprise. Otros clientes utilizan el [sitio de soporte de la comunidad pública](https://github.com/TabularEditor/TabularEditor3) para plantear preguntas técnicas y sobre el producto. +- **Acerca de Tabular Editor**: muestra la versión, los detalles de instalación y de licencia, y le permite cambiar su clave de licencia. + ### Menús dinámicos (dependientes del contexto) -Aparecen menús adicionales en función de qué elemento de la interfaz de usuario tenga el foco y qué objeto esté seleccionado en el Explorador TOM. Por ejemplo, si seleccionas una tabla, aparece un menú **Tabla** con los mismos elementos que el menú contextual de la tabla en el Explorador TOM. +Aparecen menús adicionales en función del elemento de la interfaz de usuario que tenga el foco y del objeto seleccionado en el Explorador TOM. Por ejemplo, si selecciona una tabla, aparece un menú **Tabla** con los mismos elementos que el menú contextual de la tabla en el Explorador TOM. -Cada tipo de documento, como las consultas DAX, los Pivot Grid y los diagramas, también añade un menú cuando un documento de ese tipo tiene el foco. Por ejemplo, cuando un diagrama tiene el foco, se agrega un menú **Diagrama** con una opción para agregar tablas al diagrama. +Cada tipo de documento, como las consultas DAX, las cuadrículas dinámicas y los diagramas, también añade un menú cuando un documento de ese tipo tiene el foco. Por ejemplo, un diagrama seleccionado añade un menú **Diagrama** con un elemento para añadir tablas al diagrama. -Configura el comportamiento de estos menús dinámicos en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario**. +Configure el comportamiento de estos menús dinámicos en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario**. -## Siguientes pasos +## Próximos pasos - @tom-explorer-view -- @tipos de archivo compatibles -- @preferencias +- @supported-files +- @preferences diff --git a/localizedContent/es/content/getting-started/creating-and-testing-dax.md b/localizedContent/es/content/getting-started/creating-and-testing-dax.md index 52347dd03..30c82bcd2 100644 --- a/localizedContent/es/content/getting-started/creating-and-testing-dax.md +++ b/localizedContent/es/content/getting-started/creating-and-testing-dax.md @@ -1,6 +1,6 @@ --- uid: creating-and-testing-dax -title: Agregar medidas y otros objetos calculados +title: Añadir medidas y otros objetos calculados author: Daniel Otykier updated: 2026-10-13 applies_to: @@ -17,138 +17,138 @@ applies_to: full: true --- -# Agregar medidas y otros objetos calculados +# Añadir medidas y otros objetos calculados -Desde que se lanzó Tabular Editor 2.x a principios de 2017, la posibilidad de modificar rápidamente expresiones DAX en varias medidas siempre ha sido la característica más popular de la herramienta. Junto con la navegación hacia atrás y hacia adelante, las operaciones de copiar y pegar, la visualización de dependencias de DAX y la compatibilidad con deshacer/rehacer, la herramienta siempre ha sido la opción preferida para quienes trabajan con modelos de Data model grandes y complejos, donde la capacidad de realizar rápidamente varios cambios pequeños es crucial. +Desde que se lanzó Tabular Editor 2.x a principios de 2017, la posibilidad de modificar rápidamente las expresiones DAX en todas las medidas ha sido siempre la función más popular de la herramienta. Junto con la navegación hacia atrás y hacia delante, las operaciones de copiar/pegar, la visualización de dependencias DAX y el soporte para deshacer/rehacer, la herramienta siempre ha sido la opción preferida de cualquiera que trabaje con modelos de datos grandes y complejos, donde es crucial poder realizar rápidamente múltiples cambios menores. -La única queja al respecto por parte de los usuarios de Tabular Editor 2.x era la falta de funciones de Code Assist para DAX (a veces llamadas "IntelliSense"). Especialmente cuando no dominas DAX al 100% (¡y muy poca gente lo hace!), que el editor de código DAX te ayude a recordar la sintaxis, los parámetros de las funciones, etc., resulta increíblemente útil. +La única queja al respecto por parte de los usuarios de Tabular Editor 2.x fue la falta de funciones de asistencia para el código DAX (a veces denominadas «IntelliSense»). Especialmente cuando no se domina DAX al 100 % (¡y muy pocas personas lo dominan!), contar con el editor de código DAX para ayudarle a recordar la sintaxis, los parámetros de las funciones, etc., resulta increíblemente útil. -Todo esto se ha resuelto con el nuevo editor de código DAX que usa Tabular Editor 3. +Todo esto se ha solucionado con el nuevo editor de código DAX que utiliza Tabular Editor 3. -![Edición de una expresión DAX compleja](~/content/assets/images/dax-editor-screenshot.png) +![Editar una expresión DAX compleja](~/content/assets/images/dax-editor-screenshot.png) -El resto de este artículo describe cómo crear medidas y otros objetos calculados, y cómo modificar las expresiones DAX en estos objetos. Para obtener más información sobre las numerosas funciones del editor de código DAX, consulta . +El resto de este artículo describe cómo crear medidas y otros objetos calculados, y cómo modificar las expresiones DAX de estos objetos. Para obtener más información sobre las numerosas funciones del editor de código DAX, consulte . -# Agregar medidas +# Añadir medidas -Una vez que hayas [importado algunas tablas](xref:importing-tables-data-modeling#importing-new-tables) a tu modelo y [creado relaciones entre ellas](xref:importing-tables-data-modeling#modifying-relationships-using-the-diagram), es el momento de agregar algunas medidas explícitas que contengan tu lógica de negocio. +Una vez que haya [importado algunas tablas](xref:importing-tables-data-modeling#importing-new-tables) a su modelo y [creado relaciones entre ellas](xref:importing-tables-data-modeling#modifying-relationships-using-the-diagram), es hora de añadir algunas medidas explícitas que contengan su lógica empresarial. > [!TIP] -> Técnicamente, no es obligatorio agregar medidas explícitas a tu modelo antes de visualizar datos en un Report de Power BI. Sin embargo, es una buena práctica hacerlo siempre, ya que las herramientas cliente basadas en MDX (como Excel y el Pivot Grid de Tabular Editor 3) requieren que las medidas se definan explícitamente. Además, los [grupos de cálculo](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions) solo se aplican a medidas explícitas. +> Técnicamente, no es necesario que agregues medidas explícitas a tu modelo antes de visualizar los datos en un informe de Power BI. Sin embargo, es una práctica recomendada hacerlo siempre, ya que las herramientas cliente basadas en MDX (como Excel y Pivot Grid de Tabular Editor 3) requieren medidas explícitas. Además, los [grupos de cálculos](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions) solo se aplican a medidas explícitas. -Para agregar una nueva medida con Tabular Editor, haz clic con el botón derecho en la tabla en la que quieres agregar la medida y luego elige **Crear > Medida** (ALT+1). +Para añadir una nueva medida utilizando Tabular Editor, haga clic con el botón derecho en la tabla en la que desea añadir la medida y, a continuación, seleccione **Crear > Medida** (ALT+1). -![Agregar una nueva medida](~/content/assets/images/adding-new-measure.png) +![Añadir una nueva medida](~/content/assets/images/adding-new-measure.png) -Cuando se agrega una nueva medida, podrás editar su nombre. Pulsa ENTER cuando hayas proporcionado un nombre para la medida. Puedes editar el nombre más adelante en la vista **Properties** o pulsando F2 mientras la medida está seleccionada en el **Explorador TOM**. +Cuando se agregue una nueva medida, el nombre de esa medida será editable. Pulse INTRO cuando haya indicado un nombre para la medida. Siempre puede editar el nombre más tarde en la vista **Propiedades** o pulsando F2 mientras la medida está seleccionada en el **Explorador TOM**. -La vista **Editor de expresiones** se usa para escribir la expresión DAX de la medida. Mientras escribes el código, fíjate en cómo el editor de DAX ofrece sugerencias e incluso subraya errores sintácticos o semánticos. +La vista **Editor de expresiones** se utiliza para proporcionar la expresión DAX para la medida. Mientras introduce el código, observe cómo el editor DAX proporciona sugerencias de código e incluso subraya los errores de sintaxis o semánticos. -![Agregar Medida Editar Dax](~/content/assets/images/add-measure-edit-dax.png) +![Añadir medida Editar DAX](~/content/assets/images/add-measure-edit-dax.png) -El desplegable de la esquina superior izquierda del **Editor de expresiones** se usa para alternar entre distintas propiedades DAX del objeto actualmente seleccionado. Por ejemplo, en las versiones más recientes de Analysis Services, las medidas tienen una propiedad `Expression` además de una [`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/). Otros tipos de objetos pueden tener propiedades diferentes que contengan código DAX. Por ejemplo, los [KPIs](https://docs.microsoft.com/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions) tienen tres propiedades de DAX diferentes. Para agregar un KPI en Tabular Editor, haz clic con el botón derecho en una medida y selecciona **Create > KPI**. +El cuadro desplegable situado en la esquina superior izquierda del **Editor de expresiones** se utiliza para cambiar entre las diferentes propiedades DAX del objeto seleccionado actualmente. Por ejemplo, en las versiones más recientes de Analysis Services, las medidas tienen una propiedad «Expression», así como una [`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/). Otros tipos de objetos pueden tener diferentes propiedades que contengan código DAX. Por ejemplo, los [KPI](https://docs.microsoft.com/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions) tienen tres propiedades DAX diferentes. Para añadir un KPI en Tabular Editor, haga clic derecho en una medida y elija **Crear > KPI**. -![Editar Kpis](~/content/assets/images/editing-kpis.png) +![Editar KPI](~/content/assets/images/editing-kpis.png) -Si quieres que tu medida esté oculta, haz clic con el botón derecho y selecciona la opción **Make invisible** (CTRL+I). Del mismo modo, puedes volver a mostrar una medida seleccionando la opción **Make visible** (CTRL+U). +Si quieres que tu medida esté oculta, simplemente haz clic derecho y elige la opción **Hacer invisible** (CTRL+I). Del mismo modo, puedes mostrar una medida seleccionando la opción **Hacer visible** (CTRL+U). -## Otras propiedades de la medida +## Otras propiedades de las medidas -Además de las propiedades `Name`, `Expression` y `Hidden`, puedes usar la vista **Properties** para revisar y editar el valor de todas las propiedades del objeto(s) seleccionado actualmente en el **Explorador TOM**. En el caso de las medidas, aquí puedes establecer, por ejemplo, `Format String`. Para más información, consulta [vista de propiedades](xref:properties-view). +Además de las propiedades «Nombre», «Expresión» y «Oculto», puede utilizar la vista **Propiedades** para revisar y editar el valor de todas las propiedades de los objetos seleccionados actualmente en el **Explorador TOM**. En el caso de las medidas, aquí es donde puede establecer la «Cadena de formato», por ejemplo. Para obtener más información, consulte [Vista de propiedades](xref:properties-view). -# Agregar columnas calculadas +# Añadir columnas calculadas -Para agregar una columna calculada, haz clic con el botón derecho en la tabla a la que quieras agregarla y elige **Create > Calculated Column** (ALT+2). Ponle un nombre a la columna y edita su expresión DAX con el **Editor de expresiones**, igual que hicimos con las medidas más arriba. +Para añadir una columna calculada, haga clic derecho en la tabla en la que desea añadir la columna y elija **Crear > Columna calculada** (ALT+2). Asigne un nombre a la columna y edite su expresión DAX utilizando el **Editor de expresiones**, de forma similar a como lo hicimos con las medidas anteriores. > [!IMPORTANT] -> Esta opción no está disponible de forma predeterminada cuando estás conectado a un modelo de Power BI Desktop. Esto se debe a las [limitaciones de compatibilidad de Power BI Desktop con herramientas externas](xref:desktop-limitations). Haz clic en el vínculo para obtener más información. +> Esta opción no está disponible de forma predeterminada cuando se está conectado a un modelo de Power BI Desktop. Esto se debe a las [limitaciones de la compatibilidad de Power BI Desktop con herramientas externas](xref:desktop-limitations). Haga clic en el enlace para obtener más información. > [!NOTE] -> Cuando se haya cambiado la expresión DAX de una columna calculada, debes actualizar la tabla en la que se encuentra la columna antes de poder usarla en un Report. Consulta para obtener más información. +> Cuando se ha modificado la expresión DAX de una columna calculada, es necesario actualizar la tabla en la que se encuentra la columna antes de poder usarla en un informe. Consulta para obtener más información. -# Agregar tablas calculadas +# Adición de tablas calculadas -Para agregar una tabla calculada, haz clic con el botón derecho en el modelo o en la carpeta "Tablas" y elige **Crear > Tabla calculada** (ALT+6). Asigna un nombre a la tabla y edita su expresión DAX con el **Editor de expresiones**, igual que hicimos antes con las medidas. Observa que las columnas de la tabla cambian automáticamente cuando haces un cambio en la expresión DAX. Esto puede provocar efectos en cascada si otras expresiones DAX hacen referencia a la tabla o si se usan columnas en una jerarquía. +Para añadir una tabla calculada, haga clic con el botón derecho en el modelo o en la carpeta «Tablas» y elija **Crear > Tabla calculada** (ALT+6). Ponga un nombre a la tabla y edite su expresión DAX utilizando el **Editor de expresiones**, de forma similar a como lo hicimos con las medidas anteriores. Observe que las columnas de la tabla cambian automáticamente cuando realiza un cambio en la expresión DAX. Esto puede provocar efectos en cascada si otras expresiones DAX hacen referencia a la tabla o si se usan columnas en una jerarquía. > [!IMPORTANT] -> Esta opción no está disponible de forma predeterminada cuando te conectas a un modelo de Power BI Desktop. Esto se debe a las [limitaciones de la compatibilidad de Power BI Desktop con herramientas externas](xref:desktop-limitations). Haz clic en el enlace para obtener más información. +> Esta opción no está disponible de forma predeterminada cuando se está conectado a un modelo de Power BI Desktop. Esto se debe a las [limitaciones de la compatibilidad de Power BI Desktop con herramientas externas](xref:desktop-limitations). Haga clic en el enlace para obtener más información. > [!NOTE] -> Cuando cambias la expresión DAX de una tabla calculada, tienes que actualizar la tabla antes de poder usarla en un Report. Consulta para obtener más información. +> Cuando se ha modificado la expresión DAX de una tabla calculada, es necesario actualizar la tabla antes de poder usarla en un informe. Consulta para obtener más información. -# Agregar grupos de cálculo +# Añadir grupos de cálculos -Para agregar un [grupo de cálculo](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions), haga clic con el botón derecho en el modelo o en la carpeta "Tables" y seleccione **Create > Calculation Group** (ALT+7). Asigna un nombre al grupo de cálculo. Considera también usar un nombre diferente para la columna **Name** predeterminada. +Para añadir un [grupo de cálculos](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions), haga clic con el botón derecho en el modelo o en la carpeta «Tablas» y elija **Crear > Grupo de cálculos** (ALT+7). Asigne un nombre al grupo de cálculo. Considere también un nombre diferente para la columna **Nombre** predeterminada. > [!IMPORTANT] -> Esta opción solo está disponible para modelos con un nivel de compatibilidad 1470 o superior. Analysis Services admite los grupos de cálculo a partir del nivel de compatibilidad 1500. +> Esta opción solo está disponible en modelos con un nivel de compatibilidad de 1470 o superior. Analysis Services admite grupos de cálculos a partir del nivel de compatibilidad 1500. -Para agregar elementos de cálculo, haz clic con el botón derecho en el grupo de cálculo recién creado y elige **Crear > Elemento de cálculo**. Asigna un nombre al elemento de cálculo y edita su expresión DAX con el **Editor de expresiones**, igual que hicimos antes con las medidas. +Para añadir elementos de cálculo, haga clic derecho en el grupo de cálculos recién creado y elija **Crear > Elemento de cálculo**. Asigna un nombre al elemento de cálculo y edita su expresión DAX utilizando el **Editor de expresiones** de forma similar a como lo hicimos con las medidas anteriores. -Puedes organizar el orden de visualización de los elementos de cálculo arrastrándolos en el Explorador TOM o estableciendo la propiedad `Ordinal` en la vista **Propiedades**. +Puede organizar el orden de visualización de los elementos de cálculo arrastrándolos por el Explorador TOM o estableciendo la propiedad `Ordinal` en la vista **Propiedades**. Al establecer `Ordinal`, el elemento se desplaza a esa posición, y un valor superior a la última posición desplaza el elemento al final. > [!NOTE] -> Cuando agregas, cambias el nombre o eliminas elementos de cálculo de un grupo de cálculo, tienes que actualizar el grupo de cálculo antes de poder usarlo en un Report. Consulta para obtener más información. +> Cuando se añaden, se cambian de nombre o se eliminan elementos de cálculo de un grupo de cálculos, es necesario actualizar el grupo de cálculos antes de poder usarlo en un informe. Consulta para obtener más información. # Operaciones de modelado comunes -## Copiar y pegar +## Copiar/pegar -Todos los objetos del Explorador TOM se pueden copiar y pegar en Tabular Editor. Incluso puedes copiar y pegar entre diferentes instancias de Tabular Editor, e incluso entre Tabular Editor 2.x y Tabular Editor 3. Puedes usar los atajos de teclado habituales: +Todos los objetos del Explorador TOM se pueden copiar y pegar con Tabular Editor. Incluso puedes copiar y pegar entre diferentes instancias de Tabular Editor, e incluso entre Tabular Editor 2.x y Tabular Editor 3. Puede usar los conocidos accesos directos de teclado: - **Editar > Copiar** (CTRL+C) - **Editar > Cortar** (CTRL+X) - **Editar > Pegar** (CTRL+V) > [!TIP] -> Si quieres sustituir una tabla por otra y conservar todas las relaciones existentes con esa tabla, copia una tabla al portapapeles; después, en el Explorador TOM, selecciona la tabla que quieras sustituir y pega. Se te preguntará si quieres reemplazar la tabla seleccionada por la que está en el portapapeles. +> Si deseas reemplazar una tabla por otra, conservando todas las relaciones existentes hacia/desde esa tabla, copia una tabla al portapapeles, luego selecciona la tabla que deseas reemplazar en el Explorador TOM y pégala. Se le preguntará si desea reemplazar la tabla seleccionada por la que está en el portapapeles. -## Deshacer / rehacer +## Deshacer/rehacer -Cada vez que haces un cambio en un objeto o una propiedad en Tabular Editor, se registra el historial completo de cambios, lo que te permite deshacer cualquier cambio que hayas hecho. Puedes usar los atajos de teclado habituales: +Cada vez que se realiza un cambio en un objeto o una propiedad en Tabular Editor, se registra el historial completo de cambios, lo que le permite deshacer todos los cambios realizados. Puede usar los conocidos atajos de teclado: - **Editar > Deshacer** (CTRL+Z) - **Editar > Rehacer** (CTRL+Y) > [!NOTE] -> Los editores de texto de Tabular Editor 3 tienen su propio historial de deshacer. Cuando el cursor está en un editor de texto, **Ctrl+Z** y **Ctrl+Y** deshacen y rehacen lo escrito en ese editor. Para deshacer un cambio en el modelo, haga clic primero en el Explorador TOM o seleccione la entrada de deshacer del modelo en el menú **Editar**. Consulte [Deshacer en los editores de texto](xref:undo-redo#undo-in-text-editors). +> Los editores de texto de Tabular Editor 3 tienen su propio historial de deshacer. Cuando el cursor está en un editor de texto, **Ctrl+Z** y **Ctrl+Y** deshacen y rehacen la escritura en ese editor. Para deshacer un cambio en el modelo, haga clic primero en el Explorador TOM o seleccione la entrada de deshacer del modelo en el menú **Editar**. Consulte [Deshacer en editores de texto](xref:undo-redo#undo-in-text-editors). # Navegación -Cuando el cursor esté sobre una referencia a un objeto en el editor de DAX, haz clic con el botón derecho y elige **Ir a definición** (F12) para saltar rápidamente a ese objeto. Por supuesto, también puedes navegar entre objetos usando el Explorador TOM. +Mientras el cursor esté sobre una referencia de objeto en el editor DAX, haga clic derecho y elija **Ir a definición** (F12) para saltar rápidamente a ese objeto. Por supuesto, también puede navegar entre objetos utilizando el Explorador TOM. -Puedes usar los botones de flecha de la esquina superior derecha del **Editor de expresiones** para saltar rápidamente hacia delante y hacia atrás entre los objetos visitados. +Puede usar los botones de flecha situados en la esquina superior derecha del **Editor de expresiones** para desplazarse rápidamente hacia delante y hacia atrás entre los objetos visitados. ## Dependencias de DAX -Para ver las dependencias de DAX entre objetos, selecciona un objeto en el **Explorador TOM** y, después, haz clic con el botón derecho y elige **Mostrar dependencias** (**Mayús+F12**). Esto abre la vista **Dependencias de DAX**, que muestra las dependencias del objeto seleccionado. Haz doble clic en un objeto del árbol para ir a ese elemento, o haz clic con el botón derecho para acceder a **Ir al elemento**, **Copiar como texto** y **Copiar como JSON**. +Para ver las dependencias DAX entre objetos, seleccione un objeto en el **Explorador TOM**, luego haga clic derecho y elija **Mostrar dependencias** (**Mayús+F12**). Esto abre la vista **Dependencias DAX**, que muestra las dependencias del objeto seleccionado. Haga doble clic en un objeto del árbol para navegar hasta él, o haga clic derecho para **Ir al elemento**, **Copiar como texto** y **Copiar como JSON**. -![Dependencias de Dax y Explorador Tom](~/content/assets/images/dax-dependencies-and-tom-explorer.png) +![Dependencias DAX y Explorador TOM](~/content/assets/images/dax-dependencies-and-tom-explorer.png) -La vista muestra una dirección cada vez. Elige cuál con los botones de opción: +La vista muestra una dirección a la vez. Elija cuál con los botones de opción: -| Opción | Muestra | -| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Objetos que dependen de este elemento** | Qué se rompería si cambiaras o eliminaras el objeto seleccionado | -| **Objetos de los que depende este elemento** | De qué objetos lee el objeto seleccionado | -| **Relaciones que parten de esta tabla** | Las relaciones que salen de la tabla seleccionada. Con una columna seleccionada, se muestra **Relaciones que parten de esta columna** | +| Opción | Muestra | +|---|---| +| **Objetos que dependen de este** | Qué dejaría de funcionar si modificara o eliminara el objeto seleccionado | +| **Objetos de los que este depende** | De dónde lee el objeto seleccionado | +| **Relaciones que comienzan desde esta tabla** | Las relaciones que salen de la tabla seleccionada. Con una columna seleccionada, esto muestra **Relaciones que comienzan desde esta columna** | -Marca **Mostrar inactivas** para incluir las relaciones inactivas. +Marque **Mostrar inactivos** para incluir las relaciones inactivas. -### Seguimiento del Explorador TOM +### Seguir al Explorador TOM -En lugar de ejecutar **Mostrar dependencias** para cada objeto por separado, marca **Seguir el Explorador TOM** y la vista seguirá lo que esté seleccionado en el árbol. Al marcarla, se muestran de inmediato las dependencias del objeto que _ya_ está seleccionado, en lugar de esperar al siguiente cambio de selección. +En lugar de invocar **Mostrar dependencias** para cada objeto por turno, marque **Seguir Explorador TOM** y la vista seguirá lo que esté seleccionado en el árbol. Al marcarlo, se muestran inmediatamente las dependencias del objeto que *ya* está seleccionado, en lugar de esperar al siguiente cambio de selección. -El seguimiento se aplica a un único objeto seleccionado. Si seleccionas varios objetos, o ninguno, la vista se vacía en lugar de mostrar una respuesta parcial. +El seguimiento se aplica a un único objeto seleccionado. Si se seleccionan varios objetos, o ninguno, se borra la vista en lugar de mostrar una respuesta parcial. # Carpetas de visualización -Cuando tu modelo empieza a tener un número considerable de medidas, una buena práctica es organizarlas usando carpetas de visualización. En Tabular Editor, para crear una carpeta de visualización, edita la propiedad `Display Folder` en la vista **Propiedades** o, alternativamente, haz clic con el botón derecho en medida(s) y selecciona la opción **Crear > Carpeta de visualización**. +Cuando tu modelo empiece a tener un número considerable de medidas, una buena práctica es organizarlas mediante carpetas de visualización. En Tabular Editor, para crear una carpeta de visualización, edita la propiedad «Carpeta de visualización» a través de la vista **Propiedades** o, alternativamente, haz clic con el botón derecho en la(s) medida(s) y selecciona la opción **Crear > Carpeta de visualización**. -También puedes cortar/copiar/pegar o arrastrar y soltar objetos entre carpetas de visualización. +También puede cortar/copiar/pegar o arrastrar y soltar objetos entre carpetas de visualización. -# Pasos a seguir +# Próximos pasos - @dax-script-introduction - @bpa -- @Scripts y macros de C# \ No newline at end of file +- @cs-scripts-and-macros \ No newline at end of file diff --git a/localizedContent/es/content/getting-started/installation.md b/localizedContent/es/content/getting-started/installation.md index 07858740c..b6d8eb75d 100644 --- a/localizedContent/es/content/getting-started/installation.md +++ b/localizedContent/es/content/getting-started/installation.md @@ -1,8 +1,8 @@ --- uid: installation-activation-basic -title: Instalación, activación y configuración básica +title: Instalación y activación avanzadas author: Morten Lønskov -updated: 2026-10-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -17,74 +17,74 @@ applies_to: full: true --- -# Instalación, activación y configuración básica +# Instalación y activación avanzadas -## Resumen +## Información general -Esta página cubre escenarios avanzados de instalación y activación de Tabular Editor 3: activación manual (sin conexión), gestión de licencias basada en el Registro, implementación desatendida y administración de puestos en la Edición Enterprise. +Esta página trata de los escenarios avanzados de instalación y activación de Tabular Editor 3: activación manual (sin conexión), gestión de licencias basada en el registro, implementación silenciosa y administración de licencias de usuario de la edición Enterprise. -Para el flujo de activación estándar, consulta @getting-started. +Para conocer el proceso de activación estándar, consulte @getting-started. -## Activación manual (sin Internet) +## Activación manual (sin conexión a Internet) Si no tienes acceso a Internet, por ejemplo, debido a un proxy, Tabular Editor te pedirá que realices una activación manual. -![Aviso de activación manual](~/content/assets/images/getting-started/Activation_manual_firstprompt.png) +![Mensaje de activación manual](~/content/assets/images/getting-started/Activation_manual_firstprompt.png) -Después de introducir tu correo electrónico, aparece un cuadro de diálogo con un enlace a una clave de activación. Copia la URL y ábrela en un navegador web conectado a Internet. +Después de introducir su correo electrónico, aparecerá un cuadro de diálogo con un enlace a una clave de activación. Copie la URL y ábrala en un navegador web que esté conectado a Internet. La URL devuelve un objeto JSON: ![Objeto JSON de activación manual](~/content/assets/images/getting-started/activation_manual_jsonobject.png) -Copia el objeto JSON completo y pégalo en el cuadro de diálogo. El cuadro de diálogo de activación manual debería quedar como el que se muestra a continuación. +Copia el objeto JSON completo y pégalo en el cuadro de diálogo. Su cuadro de diálogo de activación manual acabará teniendo el aspecto que se muestra en la captura de pantalla a continuación. ![Activación manual completada](~/content/assets/images/getting-started/activation_manual_dialogbox_filled.png) -De este modo, se verificará tu licencia de Tabular Editor 3. +A continuación, se verifica su licencia de Tabular Editor 3. -## Cambiar puestos en la Edición Enterprise +## Cambio de puestos en la Edición Enterprise -Para cambiar un puesto de la Edición Enterprise, anula el registro del usuario actual de ese puesto a través del [portal de autoservicio de Tabular Editor](https://tabulareditor.com/my-account/). El propietario de la suscripción o el administrador de licencias crea una cuenta o inicia sesión en una existente para administrar los puestos de licencia. +Para cambiar una licencia Enterprise, da de baja al usuario existente de la licencia a través del [portal de autoservicio de Tabular Editor](https://tabulareditor.com/my-account/). El titular de la suscripción o el administrador de licencias crea una cuenta, o inicia sesión con una existente, para administrar las plazas de licencia. > [!NOTE] > Cambiar un usuario solo es posible en la Edición Enterprise. ## Detalles del registro -Tabular Editor 3 almacena los detalles de activación de cada usuario de Windows en `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3`. +Tabular Editor 3 almacena los datos de activación de cada usuario de Windows en `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3`. -| Valor | Tipo | Contenido | -| ------------------ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `LicenseKey` | `REG_SZ` | La clave de licencia | -| `User` | `REG_SZ` | La dirección de correo electrónico del usuario con licencia, para licencias multiusuario | -| `ActivationKey` | `REG_SZ` | La activación devuelta por el servicio de licencias | -| `Activation` | `REG_SZ` | Una activación guardada por versiones anteriores de Tabular Editor 3. Tabular Editor 3 la elimina la próxima vez que almacena una activación | -| `InstallationDate` | `REG_QWORD` | La primera vez que este usuario de Windows inicia Tabular Editor 3. Tabular Editor 3 la crea al iniciarse si no existe | +| Valor | Tipo | Contenido | +|-------|------|---------| +| `LicenseKey` | `REG_SZ` | La clave de licencia | +| `User` | `REG_SZ` | La dirección de correo electrónico del usuario con licencia, para licencias multiusuario | +| `ActivationKey` | `REG_SZ` | La activación devuelta por el servicio de licencias | +| `Activation` | `REG_SZ` | Una activación escrita por versiones anteriores de Tabular Editor 3. Tabular Editor 3 la elimina la próxima vez que almacena una activación | +| `InstallationDate` | `REG_QWORD` | El primer inicio de sesión de Tabular Editor 3 para este usuario de Windows. Tabular Editor 3 lo crea al iniciarse si no existe | -Para ver la clave de licencia actual del usuario de Windows activo, ejecuta el siguiente comando en el Símbolo del sistema de Windows (Inicio > Ejecutar > cmd.exe): +Para ver la clave de licencia actual del usuario activo de Windows, ejecute el siguiente comando en el símbolo del sistema de Windows (Inicio > Ejecutar > cmd.exe): ```cmd REG QUERY "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey ``` -También puedes usar `regedit.exe` (Editor del Registro de Windows) y navegar hasta `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` para ver y modificar los valores. +También puedes usar «regedit.exe» (Editor del Registro de Windows) y navegar hasta «HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3» para ver y modificar los valores. ![Editor del Registro](~/content/assets/images/troubleshooting/registry-editor.png) -Un administrador del sistema también puede asignar de forma proactiva licencias de Tabular Editor 3 a un equipo, especificando los valores **LicenseKey** y **User** en la clave del Registro `SOFTWARE\Kapacity\Tabular Editor 3` de cada usuario. Consulta [Instalación desatendida y aprovisionamiento previo de la licencia](#silent-installation-and-license-pre-provisioning) para ver el procedimiento completo de implementación. +Un administrador del sistema también puede asignar de forma proactiva licencias de Tabular Editor 3 a un equipo especificando los valores **LicenseKey** y **User** en la clave de registro `SOFTWARE\Kapacity\Tabular Editor 3` de cada usuario. Consulta [Instalación silenciosa y aprovisionamiento previo de licencias](#silent-installation-and-license-pre-provisioning) para conocer el procedimiento de implementación completo. -## Cambiar una clave de licencia +## Cambio de una clave de licencia a través del registro -La opción **Cambiar clave de licencia** en **Ayuda > Acerca de Tabular Editor** elimina los valores `LicenseKey`, `User`, `ActivationKey` y `Activation`, y desactiva la instalación en el servicio de licencias. La opción solo aparece cuando no hay ningún modelo cargado y la licencia está activada o la reserva de asiento ha caducado. Si no aparece, por ejemplo porque la activación falló, restablece la licencia desde el Editor del Registro: +La opción **Cambiar clave de licencia** en **Ayuda > Acerca de Tabular Editor** elimina los valores `LicenseKey`, `User`, `ActivationKey` y `Activation` y desactiva la instalación en el servicio de licencias. La opción solo aparece cuando no hay ningún modelo cargado y la licencia está activada o su reserva de licencia ha caducado. Si no se muestra, por ejemplo, porque la activación ha fallado, restablezca la licencia a través del Editor del Registro: -1. Cierra todas las instancias de Tabular Editor 3. -2. Abre el Editor del Registro de Windows (Inicio > Ejecutar > regedit.exe). -3. Localiza `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` (consulta la captura de pantalla anterior). -4. Elimina los valores `LicenseKey`, `User`, `ActivationKey` y `Activation`. Deja `InstallationDate` tal cual. -5. Cierra el Editor del Registro y reinicia Tabular Editor 3. +1. Cierra todas las instancias de Tabular Editor 3. +2. Abra el Editor del Registro en Windows (Inicio > Ejecutar > regedit.exe). +3. Busca `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` (consulta la captura de pantalla anterior). +4. Elimine los valores `LicenseKey`, `User`, `ActivationKey` y `Activation`. Deje `InstallationDate` donde está. +5. Cierre el Editor del Registro y reinicie Tabular Editor 3. -Como alternativa, ejecuta los siguientes comandos en el Símbolo del sistema de Windows (Inicio > Ejecutar > cmd.exe). Un comando Report informa de un error si su valor no existe, y los demás comandos siguen ejecutándose: +Como alternativa, ejecuta los siguientes comandos en un símbolo del sistema de Windows (Inicio > Ejecutar > cmd.exe). Un comando informa de un error si su valor no existe, pero los comandos restantes se ejecutan igualmente: ```cmd REG DELETE "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey /f @@ -93,16 +93,16 @@ REG DELETE "HKCU\Software\Kapacity\Tabular Editor 3" /v ActivationKey /f REG DELETE "HKCU\Software\Kapacity\Tabular Editor 3" /v Activation /f ``` -La próxima vez que inicies Tabular Editor 3, se te pedirá una clave de licencia. +La próxima vez que inicies Tabular Editor 3, se te pedirá una clave de licencia. > [!NOTE] -> Eliminar los valores del registro no desactiva la instalación. Usa el [portal de autoservicio de Tabular Editor](https://tabulareditor.com/my-account/) para gestionar tus licencias activadas. +> Eliminar los valores del registro no desactiva la instalación. Utiliza el [Portal de autoservicio de Tabular Editor](https://tabulareditor.com/my-account/) para gestionar tus licencias activadas. -## Instalación desatendida y aprovisionamiento previo de la licencia +## Instalación silenciosa y aprovisionamiento previo de licencias -Puedes implementar Tabular Editor de forma desatendida y aprovisionar previamente la licencia a través del Registro de Windows. Instala primero y, después, escribe la licencia, que debe estar establecida antes de que la aplicación se inicie por primera vez. +Puedes implementar Tabular Editor de forma silenciosa y aprovisionar previamente la licencia a través del Registro de Windows. Primero instale y, a continuación, introduzca la licencia, que debe estar en su sitio antes de iniciar la aplicación por primera vez. -### Instalar en silencio +### Instalación silenciosa Sin interfaz de usuario, sin reinicio: @@ -110,80 +110,85 @@ Sin interfaz de usuario, sin reinicio: msiexec /i TabularEditor..x64.Net10.msi /qn /norestart /l*v C:\Temp\TE3_install.log ``` -| Funcionalidad MSI | Se muestra en el instalador como | Descripción | Activar la instalación | -| ----------------- | -------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| `MainFeature` | Tabular Editor 3 | Aplicación principal de Tabular Editor 3 | Sí (obligatorio) | -| `AIAssistant` | Funciones de IA | El @ai-assistant y el @mcp-server | Sí, a partir de la versión 3.27.0. Las versiones anteriores solo lo instalan si se selecciona | +| Función MSI | Mostrada en el instalador como | Descripción | Instalada de forma predeterminada | +|-------------|---------------------------|-------------|----------------------| +| `MainFeature` | Tabular Editor 3 | Aplicación principal de Tabular Editor 3 | Sí (obligatoria) | +| `AIAssistant` | Funciones de IA | El @ai-assistant y el @mcp-server | Sí, a partir de la versión 3.27.0. Las versiones anteriores lo instalan solo cuando está seleccionado | > [!IMPORTANT] -> A partir de la versión 3.27.0, una nueva instalación incluye el componente de **funciones de IA** a menos que lo excluyas. Si tu organización no permite el Asistente de IA ni el servidor MCP, excluye el componente y configura la directiva `DisableAi` como se describe a continuación. +> A partir de la versión 3.27.0, una nueva instalación incluye el componente **Funciones de IA**, a menos que lo excluyas. Si tu organización no permite el Asistente de IA ni el servidor MCP, excluye el componente y establece la política `DisableAi` como se describe a continuación. -### Desplegar sin las funciones de IA +### Implementación sin las funciones de IA -No incluyas `AIAssistant` en `ADDLOCAL` para instalar Tabular Editor 3 sin las funciones de IA: +Deja `AIAssistant` fuera de `ADDLOCAL` para instalar Tabular Editor 3 sin las funciones de IA: ```powershell msiexec /i TabularEditor..x64.Net10.msi /qn /norestart ADDLOCAL=MainFeature /l*v C:\Temp\TE3_install.log ``` -Ejecuta el paquete con `REMOVE` para quitar el componente de los equipos que ya lo tienen: +Ejecute el paquete con `REMOVE` para eliminar el componente de los equipos que ya lo tengan: ```powershell msiexec /i TabularEditor..x64.Net10.msi /qn /norestart REMOVE=AIAssistant /l*v C:\Temp\TE3_install.log ``` -Sin el componente, los ensamblados de IA no están en la carpeta de instalación; el panel del **Asistente de IA** y el servidor MCP no están disponibles en la aplicación, y no se envía ninguna solicitud a un proveedor de modelos. Las demás funciones no se ven afectadas. +Sin el componente, los ensamblados de IA no están en la carpeta de instalación, el panel **Asistente de IA** y el servidor MCP no están presentes en la aplicación y no se envían solicitudes a ningún proveedor de modelos. Las demás funciones no se ven afectadas. Para cambiar la selección en un solo equipo, vuelve a ejecutar el instalador y selecciona **Modificar** en el cuadro de diálogo de mantenimiento. > [!NOTE] -> Cuando uses `ADDLOCAL`, incluye `MainFeature` en la lista junto con cualquier característica opcional. Si especificas solo `AIAssistant` sin `MainFeature`, la instalación quedará incompleta. +> Cuando utilice `ADDLOCAL`, incluya `MainFeature` junto con cualquier función opcional. Si se especifica solo `AIAssistant` sin `MainFeature`, la instalación quedará incompleta. ### Actualizaciones y el componente de funciones de IA -Cuando instalas una versión más reciente del mismo paquete sobre una instalación existente, el instalador conserva la selección de funciones que ya tiene el equipo. Esto se aplica a las instalaciones interactivas y silenciosas. Un equipo implementado sin las funciones de IA antes de la versión 3.27.0 seguirá sin ellas después de la actualización, y un equipo en el que se seleccionaron las funciones de IA las conservará. +Cuando instala una versión más reciente del mismo paquete sobre una instalación existente, el instalador mantiene la selección de funciones que ya tiene el equipo. Esto se aplica a las instalaciones interactivas y silenciosas. Un equipo implementado sin las funciones de IA antes de la versión 3.27.0 se queda sin ellas después de la actualización, y un equipo en el que se seleccionaron las funciones de IA las conserva. -En estos casos, el instalador aplica la selección predeterminada o la selección indicada en la línea de comandos: +En estos casos, el instalador aplica la selección predeterminada o la selección de la línea de comandos: -| Situación | Resultado | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| La línea de comandos establece `ADDLOCAL`, `REMOVE` u otra propiedad de característica | La línea de comandos establece la selección. `ADDLOCAL=MainFeature` quita las funciones de IA de los equipos que las tienen, y `ADDLOCAL=ALL` las instala en los equipos que no las tienen | -| La implementación desinstala la versión anterior antes de instalar la nueva; por ejemplo, una sustitución de Intune configurada para desinstalar | La instalación es nueva e incluye las funciones de IA, a menos que la línea de comandos las excluya | -| El paquete usa un entorno de ejecución distinto del instalado; por ejemplo, el paquete de .NET 10 en un equipo con el paquete de .NET 8 | Los paquetes de .NET 8 y .NET 10 son productos independientes. La instalación es nueva e incluye las funciones de IA, a menos que la línea de comandos las excluya | +| Situación | Resultado | +|--|--| +| La línea de comandos establece «ADDLOCAL», «REMOVE» u otra propiedad de función | La línea de comandos establece la selección. `ADDLOCAL=MainFeature` elimina las funciones de IA de los equipos que las tienen, y `ADDLOCAL=ALL` las instala en los equipos que no las tienen | +| La implementación desinstala la versión anterior antes de instalar la nueva, por ejemplo, una sustitución de Intune configurada para desinstalar | La instalación es nueva e incluye las funciones de IA, a menos que la línea de comandos las excluya | -La directiva `DisableAi` prevalece sobre la selección en todos los casos. +La política «DisableAi» anula la selección en todos los casos. -### Imponer la decisión con la directiva DisableAi +### Cambiar entre los paquetes .NET 8 y .NET 10 -Un usuario que ejecuta el instalador obtiene la selección predeterminada, que incluye las funciones de IA. Establece `DisableAi` @policies en `1` bajo `HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3` para mantener desactivadas las funciones de IA en todas las instalaciones del equipo. Tabular Editor 3 lee la directiva al iniciarse y desactiva el Asistente de IA y el servidor MCP. +Los paquetes .NET 8 y .NET 10 se sustituyen entre sí. Cuando instala uno en un equipo que tiene la otra edición en la misma versión o en una versión anterior, el instalador elimina la otra edición antes de instalar ningún archivo y conserva la selección de funciones de esa edición. Un dispositivo que tenga instaladas ambas ediciones tendrá una sola instalación después de la siguiente instalación, y en **Configuración > Aplicaciones > Aplicaciones instaladas** aparecerá un solo **Tabular Editor 3**. + +Si la otra edición está instalada en una versión más reciente, la instalación se detiene y aparece un mensaje. Desinstala primero la edición más reciente y, a continuación, vuelve a ejecutar el instalador. + +### Aplicar la decisión con la directiva DisableAi + +Un usuario que ejecute el instalador obtendrá la selección predeterminada, que incluye las funciones de IA. Establezca las @políticas «DisableAi» en «1» en «HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3» para mantener desactivadas las funciones de IA en todas las instalaciones del dispositivo. Tabular Editor 3 lee la política al iniciarse y desactiva el Asistente de IA y el servidor MCP. A partir de la versión 3.27.0, el instalador también lee la directiva: -- una nueva instalación omite el componente de funciones de IA y el instalador no lo muestra -- una actualización elimina el componente de un equipo que lo tiene -- una instalación existente conserva los archivos de IA hasta la siguiente actualización. Tabular Editor 3 no los carga mientras la directiva esté establecida +- Una nueva instalación omite el componente de funciones de IA, y el instalador no lo muestra. +- Una actualización elimina el componente de un equipo que lo tiene. +- Una instalación existente conserva los archivos de IA hasta la siguiente actualización. Tabular Editor 3 no los carga mientras la política esté establecida. -Una herramienta de implementación que se ejecuta con la cuenta del sistema local no lee las directivas de `HKEY_CURRENT_USER` de los usuarios del equipo. Configura la directiva en `HKEY_LOCAL_MACHINE` para que el instalador la lea en una implementación desatendida. +Una herramienta de implementación que se ejecuta como la cuenta del sistema local no lee las políticas `HKEY_CURRENT_USER` de los usuarios del equipo. Establece la política en «HKEY_LOCAL_MACHINE» para que el instalador la lea en una implementación silenciosa. ### Nombres de paquetes y otras opciones de MSI -También puedes usar `/package` en lugar de `/i`. Reemplaza `` por la cadena de versión real. +También puedes usar `/package` en lugar de `/i`. Sustituye «» por la cadena de la versión real. -Los paquetes MSI se llaman `TabularEditor....msi`, por ejemplo `TabularEditor.3.27.0.x64.Net10.msi` o `TabularEditor.3.27.0.ARM64.Net8.msi`. Elige la arquitectura y el runtime que mejor se adapten a los equipos de destino; consulta @system-requirements. El MSI no instala el .NET Desktop Runtime, así que instálalo primero. +Los paquetes MSI se denominan «TabularEditor....msi», por ejemplo, «TabularEditor.3.27.0.x64.Net10.msi» o «TabularEditor.3.27.0.ARM64.Net8.msi». Elija la arquitectura y el tiempo de ejecución que se adapten a los equipos de destino; consulte @system-requirements. El MSI no instala .NET Desktop Runtime, así que despliéguelo primero. -Para obtener información detallada sobre las opciones de línea de comandos de MSI disponibles, consulta la documentación oficial de Microsoft: -[Microsoft Standard Installer command-line options - Win32 apps | Microsoft Learn](https://learn.microsoft.com/windows/win32/msi/command-line-options) +Para obtener más información sobre las opciones de línea de comandos de MSI disponibles, consulte la documentación oficial de Microsoft: +[Opciones de la línea de comandos del instalador estándar de Microsoft - Aplicaciones Win32 | Microsoft Learn](https://learn.microsoft.com/windows/win32/msi/command-line-options) -### Aprovisiona previamente la licencia +### Aprovisionar previamente la licencia -Escribe la licencia en el Registro _antes de iniciar la aplicación por primera vez_: +Escribe la licencia en el Registro *antes del primer inicio* de la aplicación: ```bat REM Per-user license key (HKCU) REG ADD "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey /t REG_SZ /d YOUR-25-CHAR-KEY /f ``` -Si usas una clave de licencia de la **Edición Enterprise**, establece también el correo electrónico del usuario con licencia: +Si está utilizando una clave de licencia de la **Edición Enterprise**, establezca también el correo electrónico del usuario con licencia: ```bat REG ADD "HKCU\Software\Kapacity\Tabular Editor 3" /v User /t REG_SZ /d user@example.com /f @@ -191,7 +196,7 @@ REG ADD "HKCU\Software\Kapacity\Tabular Editor 3" /v User /t REG_SZ /d user@exam **Notas** -- El instalador no acepta un parámetro de licencia; la licencia se gestiona mediante las entradas del Registro anteriores. -- Las claves se almacenan en **HKCU** (por usuario). Asegúrate de que los comandos se ejecuten en el contexto del usuario de destino (por ejemplo, mediante un script de inicio de sesión) para que los valores se escriban en el perfil correcto. -- Para conocer más claves y valores, consulta [Detalles del Registro](#registry-details). +- El instalador no acepta un parámetro de licencia; las licencias se gestionan a través de las entradas del Registro indicadas anteriormente. +- Las claves se guardan en **HKCU** (por usuario). Asegúrese de que los comandos se ejecuten en el contexto del usuario de destino (por ejemplo, mediante un script de inicio de sesión) para que los valores se escriban en el perfil correcto. +- Para conocer otras claves y valores, consulte [Detalles del Registro](#registry-details). diff --git a/localizedContent/es/content/getting-started/personalizing-te3.md b/localizedContent/es/content/getting-started/personalizing-te3.md index d954da178..800c43916 100644 --- a/localizedContent/es/content/getting-started/personalizing-te3.md +++ b/localizedContent/es/content/getting-started/personalizing-te3.md @@ -1,6 +1,6 @@ --- uid: personalizing-te3 -title: Personalización y configuración de Tabular Editor 3 para adaptarlo a tus necesidades +title: Personalizar y configurar Tabular Editor 3 para adaptarlo a sus necesidades author: Daniel Otykier updated: 2026-10-12 applies_to: @@ -17,134 +17,134 @@ applies_to: full: true --- -# Personalización y configuración de Tabular Editor 3 para adaptarlo a tus necesidades +# Personalizar y configurar Tabular Editor 3 para que se adapte a sus necesidades -Tabular Editor 3 ofrece una amplia gama de opciones de configuración que te permiten ajustar la herramienta a tus necesidades específicas y a tu flujo de trabajo preferido. En este artículo, te guiaremos a través de la configuración que los desarrolladores de modelos suelen ajustar con más frecuencia. +Tabular Editor 3 ofrece una amplia gama de opciones de configuración que le permiten adaptar la herramienta a sus necesidades específicas y a su flujo de trabajo preferido. En este artículo, te guiaremos a través de los ajustes que suelen modificar con más frecuencia los desarrolladores de modelos individuales. -A la mayoría de las opciones tratadas en este artículo se accede desde la opción de menú **Herramientas > Preferencias**. A lo largo del artículo, enumeraremos las configuraciones individuales con el siguiente formato para facilitar la consulta: +A la mayoría de los ajustes tratados en este artículo se accede a través de la opción de menú **Herramientas > Preferencias**. A lo largo del artículo, enumeraremos los ajustes individuales con el siguiente estilo, para facilitar su consulta: -**_Nombre de la configuración_ (valor predeterminado)**
Descripción de la configuración. +***Nombre del ajuste* (valor predeterminado)**
Descripción del ajuste. > [!TIP] -> Usa el **cuadro de búsqueda** en la parte superior del cuadro de diálogo de preferencias para localizar rápidamente ajustes por nombre o palabra clave. La búsqueda filtra el árbol de preferencias en tiempo real, ayudándote a ir directamente a la configuración que necesitas. +> Utilice el **cuadro de búsqueda** situado en la parte superior del cuadro de diálogo Preferencias para localizar rápidamente los ajustes por nombre o palabra clave. La búsqueda filtra el árbol de preferencias en tiempo real, lo que te ayuda a ir directamente al ajuste que necesitas. -# Características generales +# Funciones generales -La primera página que encontrarás en el cuadro de diálogo **Preferencias** es **Tabular Editor > Características** (consulta la captura de pantalla a continuación). A continuación se muestra una breve descripción de las características de esta página y para qué se suelen usar: +La primera página que encontrará en el cuadro de diálogo **Preferencias** es la página **Tabular Editor > Funciones** (vea la captura de pantalla a continuación). A continuación, encontrará una breve descripción de las funciones de esta página y para qué se utilizan habitualmente: -![Preferencias: características generales](~/content/assets/images/pref-general-features.png) +![Preferencias: Funciones generales](~/content/assets/images/pref-general-features.png) ## Power BI -Estos ajustes son útiles sobre todo para los desarrolladores que usan Tabular Editor 3 como una [herramienta externa para Power BI Desktop](https://docs.microsoft.com/power-bi/transform-model/desktop-external-tools). +Estos ajustes son especialmente útiles para los desarrolladores que utilizan Tabular Editor 3 como [herramienta externa para Power BI Desktop](https://docs.microsoft.com/power-bi/transform-model/desktop-external-tools). -##### _Permitir operaciones de modelado no compatibles_ (deshabilitado) +##### *Permitir operaciones de modelado no compatibles* (deshabilitado) -Las herramientas externas para Power BI Desktop tienen algunas [limitaciones](xref:desktop-limitations). De forma predeterminada, Tabular Editor 3 te impedirá hacer cambios no compatibles en el Data model. Puede haber algunas características avanzadas de modelado que funcionen bien, aunque no estén admitidas; consulta el enlace anterior. Para desbloquear todos los objetos y propiedades del Tabular Object Model, habilita esta configuración. +Las herramientas externas para Power BI Desktop tienen algunas [limitaciones](xref:desktop-limitations). De forma predeterminada, Tabular Editor 3 impedirá que el usuario realice cambios no admitidos en el modelo de datos. Puede haber algunas funciones avanzadas de modelado que funcionen bien, aunque no sean compatibles según el enlace anterior. Para desbloquear todos los objetos y propiedades del modelo de objetos tabulares, habilite este ajuste. -##### _Ocultar advertencias de fecha/hora automáticas_ (deshabilitado) +##### *Ocultar advertencias de fecha/hora automática* (deshabilitado) -Cuando la configuración "Fecha/hora automática" de Power BI Desktop está habilitada, se crean automáticamente varias tablas calculadas. Por desgracia, estas tablas incluyen código DAX que hace que el analizador de DAX integrado de Tabular Editor 3 muestre un mensaje de advertencia. Para ocultar estas advertencias, habilita esta configuración. +Cuando el ajuste «Fecha/hora automática» de Power BI Desktop está habilitado, se crean automáticamente varias tablas calculadas. Por desgracia, estas tablas contienen código DAX que activa un mensaje de advertencia del analizador DAX integrado de Tabular Editor 3. Para ocultar estas advertencias, habilite esta configuración. -##### _Salto de línea en la primera línea de DAX_ (deshabilitado) +##### *Salto de línea en la primera línea de DAX* (desactivado) -En Power BI Desktop es habitual insertar un salto de línea en la primera línea de una expresión DAX, debido a cómo la barra de fórmulas muestra el código DAX. Si a menudo alternas entre Tabular Editor y Power BI Desktop, considera habilitar esta opción para que Tabular Editor 3 inserte el salto de línea automáticamente cada vez que se edite una expresión DAX desde la herramienta. +En Power BI Desktop es habitual insertar un salto de línea en la primera línea de una expresión DAX, debido a la forma en que la barra de fórmulas muestra el código DAX. Si sueles pasar de Tabular Editor a Power BI Desktop y viceversa, plantéate activar esta opción para que Tabular Editor 3 inserte el salto de línea automáticamente cada vez que se edite una expresión DAX a través de la herramienta. ## Sincronización de metadatos -Estas opciones controlan el comportamiento de Tabular Editor 3 cuando los metadatos del modelo se cargan desde una base de datos en una instancia de Analysis Services. Estas opciones especifican cómo Tabular Editor 3 gestiona los cambios de metadatos aplicados a la base de datos desde fuera de la aplicación; por ejemplo, cuando otro usuario modifica la base de datos o cuando tú cambias el modelo desde Power BI Desktop mientras usas Tabular Editor 3 como herramienta externa. +Estos ajustes controlan el comportamiento de Tabular Editor 3 cuando se cargan los metadatos del modelo desde una base de datos en una instancia de Analysis Services. Los ajustes especifican cómo debe gestionar Tabular Editor 3 los cambios de metadatos aplicados a la base de datos desde fuera de la aplicación, por ejemplo, cuando otro usuario realiza un cambio en la base de datos o cuando usted realiza un cambio en el modelo a través de Power BI Desktop mientras se utiliza Tabular Editor 3 como herramienta externa. -##### _Avisar cuando los metadatos locales no estén sincronizados con el modelo implementado_ (habilitado) +##### *Advertir cuando los metadatos locales no estén sincronizados con el modelo implementado* (habilitado) -Cuando esta opción está activada, Tabular Editor muestra un mensaje de advertencia al intentar guardar cambios si otro usuario o proceso ha modificado la base de datos desde que los metadatos del modelo se cargaron en tu instancia de Tabular Editor. +Cuando esto está marcado, Tabular Editor muestra un mensaje de advertencia cuando intenta guardar cambios, si otro usuario o proceso ha realizado un cambio en la base de datos desde que se cargaron los metadatos del modelo en su instancia de Tabular Editor. -##### _Seguir los cambios externos del modelo_ (habilitado) +##### *Rastrear cambios externos del modelo* (habilitado) -Esta opción solo es relevante para instancias locales de Analysis Services (es decir, procesos msmdsrv.exe que se ejecutan en la misma máquina que Tabular Editor). Cuando está activada, Tabular Editor inicia un seguimiento en Analysis Services y te notifica si se realizan cambios externos. +Esta opción solo es relevante para las instancias locales de Analysis Services (es decir, los procesos msmdsrv.exe que se ejecutan en el mismo equipo que Tabular Editor). Cuando está marcada, Tabular Editor inicia un seguimiento en Analysis Services y le notifica si se realizan cambios externos. -##### _Actualizar automáticamente los metadatos locales del Tabular Object Model_ (habilitado) +##### *Actualizar metadatos del Tabular Object Model local automáticamente* (habilitado) -Cuando el mecanismo de seguimiento descrito anteriormente está habilitado, esta opción permite que Tabular Editor actualice automáticamente los metadatos del modelo cuando se detecta un cambio externo. Esto es útil si alternas con frecuencia entre Power BI Desktop y Tabular Editor 3, ya que garantiza que los cambios realizados en Power BI Desktop se sincronicen automáticamente con Tabular Editor. +Cuando el mecanismo de seguimiento descrito anteriormente está habilitado, esta opción permite que Tabular Editor actualice automáticamente los metadatos del modelo cuando se detecta un cambio externo. Esto resulta útil si sueles alternar entre Power BI Desktop y Tabular Editor 3, ya que garantiza que los cambios realizados en Power BI Desktop se sincronicen automáticamente con Tabular Editor. -##### _Limpiar seguimientos huérfanos de Tabular Editor_ +##### *Limpiar rastros huérfanos de Tabular Editor* -Normalmente, Tabular Editor 3 debería detener y eliminar automáticamente cualquier seguimiento de AS iniciado debido a las opciones anteriores. Sin embargo, si la aplicación se cerró de forma prematura, es posible que esos seguimientos nunca se detengan. Al hacer clic en este botón, se eliminarán todos los seguimientos de AS iniciados por cualquier instancia de Tabular Editor en la instancia actual de Analysis Services. +Normalmente, Tabular Editor 3 debería detener y eliminar automáticamente cualquier seguimiento de AS iniciado debido a los ajustes anteriores. Sin embargo, si la aplicación se cerró prematuramente, es posible que los rastros nunca se detengan. Al hacer clic en este botón, se eliminarán todos los rastros de AS iniciados por cualquier instancia de Tabular Editor en la instancia actual de Analysis Services. > [!NOTE] > El botón de limpieza solo está disponible cuando Tabular Editor está conectado a una instancia de Analysis Services. # Configuración del Explorador TOM -Las opciones siguientes controlan varios aspectos del Explorador TOM. Puedes encontrar estos ajustes en **Tabular Editor > Explorador TOM**: +Los siguientes ajustes controlan varios aspectos del Explorador TOM. Puede encontrar estos ajustes en **Tabular Editor > Explorador TOM**: -![Configuración del Explorador Tom](~/content/assets/images/unsaved-changes/preferences.png) +![Ajustes del Explorador TOM](~/content/assets/images/unsaved-changes/preferences.png) -##### _Mostrar toda la rama_ (desactivado) +##### *Mostrar rama completa* (desactivada) -Al filtrar el Explorador TOM, de forma predeterminada, Tabular Editor 3 muestra todos los elementos de la jerarquía que coinciden con la cadena de filtro, incluidos sus elementos padre. Si también quieres ver todos los elementos secundarios (aunque no coincidan con la cadena de filtro), habilita esta opción. +Al filtrar el Explorador TOM, Tabular Editor 3 muestra de forma predeterminada todos los elementos de la jerarquía que coinciden con la cadena de filtro, incluidos sus elementos principales. Si también desea ver todos los elementos secundarios (aunque estos no coincidan con la cadena de filtro), habilite esta opción. -##### _Mostrar siempre advertencias de eliminación_ (desactivado) +##### *Mostrar siempre advertencias de eliminación* (desactivado) -Si prefieres que Tabular Editor 3 te pida confirmar todas las eliminaciones de objetos, habilita esta opción. De lo contrario, Tabular Editor 3 solo te pedirá que confirmes las eliminaciones de varios objetos o las eliminaciones de objetos a los que hacen referencia otros objetos. +Si prefiere que Tabular Editor 3 le solicite confirmar todas las eliminaciones de objetos, habilite este ajuste. De lo contrario, Tabular Editor 3 solo le solicitará que confirme las eliminaciones de varios objetos o las eliminaciones de objetos a los que hacen referencia otros objetos. > [!NOTE] > Todas las operaciones de eliminación en Tabular Editor 3 se pueden deshacer pulsando CTRL+Z. -# Ajustes generales del Editor de DAX +# Configuración general del editor de DAX -El Editor de DAX de Tabular Editor 3 es muy configurable y es fácil sentirse abrumado por la gran cantidad de ajustes disponibles. Esta sección destaca los ajustes más comunes e importantes. Encuentra los ajustes generales en **Editores de texto > Editor de DAX > General**: +El editor DAX de Tabular Editor 3 es altamente configurable, y es fácil sentirse abrumado por los numerosos ajustes disponibles. En esta sección se destacan los ajustes más comunes e importantes. Localice la configuración general en **Editores de texto > Editor de DAX > General**: -![General del Editor de Dax](~/content/assets/images/dax-editor-general.png) +![Configuración general del editor DAX](~/content/assets/images/dax-editor-general.png) ## General -Los ajustes _Números de línea_, _Plegado de código_, _Espacios en blanco visibles_ y _Guías de sangría_ sirven para activar o desactivar varias características Visuales del editor. En la captura de pantalla siguiente, se han habilitado las cuatro opciones: +Los ajustes *Números de línea*, *Plegado de código*, *Espacios en blanco visibles* y *Guías de sangría* se pueden usar para activar o desactivar varias funciones visuales del editor. En la captura de pantalla siguiente, se han habilitado las cuatro opciones: ![Espacios en blanco visibles](~/content/assets/images/visible-whitespace.png) -##### _Usar tabulaciones_ (desactivado) +##### *Usar tabulaciones* (desactivado) -Al marcar esta opción, se inserta un carácter de tabulación (`\t`) cada vez que se pulsa la tecla TAB. De lo contrario, se inserta un número de espacios correspondiente al ajuste _Ancho de sangría_. +Cuando esto está marcado, se inserta un carácter de tabulación (`\t`) cada vez que se pulsa la tecla TAB. De lo contrario, se inserta un número de espacios correspondiente al ajuste *Ancho de sangría*. -##### _Estilo de comentario_ (barras inclinadas) +##### *Estilo de comentario* (barras diagonales) -DAX admite comentarios de línea con barras (`//`) o guiones (`--`). Este ajuste determina qué estilo de comentario se usa cuando Tabular Editor 3 genera código DAX, por ejemplo, al usar la funcionalidad de scripts DAX. +DAX admite comentarios de línea que usan barras diagonales («//») o guiones («--»). Este ajuste determina qué estilo de comentario se utiliza cuando Tabular Editor 3 genera código DAX, como cuando se utiliza la función de script DAX. ## Configuración de DAX -Estas opciones determinan determinados comportamientos del analizador de código DAX. La opción _Locale_ es simplemente una cuestión de preferencia. El resto de las opciones solo son relevantes cuando Tabular Editor 3 no puede determinar la versión de Analysis Services utilizada, como ocurre, por ejemplo, cuando se carga directamente un archivo Model.bim. En este caso, Tabular Editor intenta deducir en qué versión se implementará el modelo, basándose en el nivel de compatibilidad especificado en el modelo; sin embargo, en función de la versión real del destino de implementación, pueden existir distintas diferencias en el lenguaje DAX que Tabular Editor no puede determinar. Si Tabular Editor genera un Report de errores semánticos o de sintaxis que no lo son, puede que debas ajustar esta configuración. +Estos ajustes determinan ciertos comportamientos del analizador de código DAX. El ajuste *Configuración regional* es simplemente una cuestión de preferencia. Todos los demás ajustes solo son relevantes cuando Tabular Editor 3 no puede determinar la versión de Analysis Services utilizada, como ocurre, por ejemplo, cuando se carga directamente un archivo Model.bim. En este caso, Tabular Editor intenta adivinar en qué versión se implementará el modelo, en función del nivel de compatibilidad especificado en el modelo, pero, dependiendo de la versión real del destino de la implementación, puede haber varias diferencias en el lenguaje DAX que Tabular Editor no puede determinar. Si Tabular Editor informa de errores semánticos/de sintaxis incorrectos, es posible que tengas que ajustar estos ajustes. # Formato automático -En la página **Editores de texto > Editor de DAX > Formato automático**, encontrarás una amplia variedad de configuraciones para controlar cómo se formatea tu código DAX. +En la página **Editores de texto > Editor de DAX > Formato automático**, encontrará una amplia gama de ajustes para controlar cómo se formatea su código DAX. -![Configuración de formato automático](~/content/assets/images/auto-formatting-settings.png) +![Ajustes de formato automático](~/content/assets/images/auto-formatting-settings.png) -##### _Formatear el código automáticamente mientras escribes_ (habilitado) +##### *Formatear código automáticamente mientras escribe* (habilitado) -Esta opción aplicará automáticamente ciertas reglas de formato cuando se produzcan determinadas pulsaciones de teclas. Por ejemplo, al cerrar un paréntesis, esta función garantiza que todo lo que esté dentro del paréntesis se formatee según los demás ajustes de esta página. +Esta opción aplicará automáticamente ciertas reglas de formato siempre que se produzcan determinadas pulsaciones de teclas. Por ejemplo, cuando se cierra un paréntesis, esta función garantizará que todo lo que esté dentro de los paréntesis se formatee de acuerdo con los demás ajustes de esta página. -##### _Formatear automáticamente las llamadas a funciones_ (habilitado) +##### *Formatear llamadas a funciones automáticamente* (habilitado) -Esta opción controla específicamente si el formato automático de las llamadas a funciones (es decir, el espaciado entre argumentos y paréntesis) debe aplicarse cuando se cierra un paréntesis. +Esta opción controla específicamente si el formateo automático de las llamadas a funciones (es decir, el espaciado entre los argumentos y los paréntesis) debe producirse cuando se cierra un paréntesis. -##### _Cierre automático de llaves_ (habilitado) +##### *Sangrado automático* (habilitado) -Esta opción aplica sangría automáticamente a los argumentos de una función cuando se inserta un salto de línea dentro de una llamada a una función. +Esta opción aplica sangría automáticamente a los argumentos de la función cuando se inserta un salto de línea dentro de una llamada a función. -##### _Sangría automática_ (habilitado) +##### *Llaves automáticas* (habilitado) -Cuando está habilitada, esta opción envuelve automáticamente la selección actual con la llave de cierre al escribir una llave de apertura. +Esta opción inserta automáticamente la llave o comilla de cierre cada vez que se introduce una llave o comilla de apertura. -##### _Envolver la selección_ (habilitado) +##### *Envolver selección* (habilitada) -Esta opción inserta automáticamente la llave o la comilla de cierre cuando se escribe una llave o comilla de apertura. +Cuando está habilitada, esta opción envuelve automáticamente la selección actual con la llave de cierre cuando se introduce una llave de apertura. ## Reglas de formato -Estas configuraciones controlan cómo se formatea el espacio en blanco del código DAX, tanto cuando se aplica el formato automático como cuando el código se formatea manualmente (mediante las opciones del menú **Formatear DAX**). +Estos ajustes controlan cómo se formatean los espacios en blanco del código DAX, tanto cuando se produce el formateo automático como cuando el código se formatea manualmente (utilizando las opciones del menú **Formatear DAX**). -##### _Espacio después de las funciones_ (deshabilitado) +##### *Espacio después de funciones* (desactivado) # [Habilitado](#tab/tab1) @@ -160,9 +160,9 @@ SUM( 'Sales'[Amount] ) *** -##### [Habilitado](#tab/newline-after-function-on) +##### *Nueva línea después de funciones* (deshabilitada) -Se aplica solo cuando es necesario dividir una llamada de función en varias líneas. +Se aplica solo cuando una llamada a función debe dividirse en varias líneas. # [Habilitado](#tab/tab3) @@ -183,9 +183,9 @@ SUM( *** -##### _Nueva línea antes del operador_ (habilitado) +##### *Nueva línea antes del operador* (habilitada) -Solo se aplica cuando una operación binaria debe dividirse en varias líneas. +Se aplica solo cuando una operación binaria debe dividirse en varias líneas. # [Habilitado](#tab/tab5) @@ -203,7 +203,7 @@ Solo se aplica cuando una operación binaria debe dividirse en varias líneas. *** -##### _Espaciar los paréntesis_ (habilitado) +##### *Rellenar paréntesis* (habilitado) # [Habilitado](#tab/tab7) @@ -211,7 +211,7 @@ Solo se aplica cuando una operación binaria debe dividirse en varias líneas. SUM( Sales[Amount] ) ``` -# [Deshabilitado](#tab/tab8) +# [Desactivado](#tab/tab8) ```DAX SUM(Sales[Amount]) @@ -219,49 +219,49 @@ SUM(Sales[Amount]) *** -##### _Límite de línea del formato largo_ (120) +##### *Límite de línea de formato largo* (120) -El número máximo de caracteres que se conservarán en una sola línea antes de dividir una expresión en varias líneas, al usar la opción **Formatear DAX (líneas cortas)**. +El número máximo de caracteres que se pueden mantener en una sola línea antes de que una expresión se divida en varias líneas, al usar la opción **Formatear DAX (líneas largas)**. -##### _Límite de línea del formato corto_ (60) +##### *Límite de línea de formato corto* (60) -El número máximo de caracteres que se pueden mantener en una sola línea antes de dividir una expresión en varias líneas, al usar la opción **Formatear DAX (líneas largas)**. +El número máximo de caracteres que se pueden mantener en una sola línea antes de que una expresión se divida en varias líneas, al usar la opción **Formatear DAX (líneas cortas)**. > [!NOTE] -> La mayoría de los ajustes anteriores solo surten efecto al usar el formateador de DAX integrado (predeterminado). +> La mayoría de los ajustes anteriores solo se aplican cuando se utiliza el formateador DAX integrado (predeterminado). -## Mayúsculas/minúsculas y comillas +## Mayúsculas y comillas -Además de dar formato a los espacios en blanco del código DAX, Tabular Editor 3 también puede corregir referencias a objetos y el uso de mayúsculas/minúsculas en funciones y palabras clave. +Además de formatear los espacios en blanco del código DAX, Tabular Editor 3 también puede corregir las referencias a objetos y las mayúsculas y minúsculas de las funciones y palabras clave. -##### _Corregir calificadores de medidas/columnas_ (habilitado) +##### *Corregir calificadores de medida/columna* (habilitado) -Cuando esta opción está marcada, los prefijos de tabla se eliminan automáticamente de las referencias a medidas y se insertan automáticamente en las referencias a columnas. +Cuando esto está marcado, los prefijos de tabla se eliminan automáticamente de las referencias de medidas y se insertan automáticamente en las referencias de columnas. -##### _Capitalización preferida de palabras clave_ (predeterminado = UPPER) +##### *Mayúsculas preferidas para palabras clave* (predeterminado = MAYÚSCULAS) -Esta configuración permite cambiar el uso de mayúsculas/minúsculas de las palabras clave, como `ORDER BY`, `VAR`, `EVALUATE`, etc. Esto también se aplica cuando se inserta una palabra clave mediante la función de autocompletado, incluidos los valores fijos de palabras clave de las funciones que los admiten. Consulta @preferences para ver la lista completa de preferencias. +Este ajuste le permite cambiar las mayúsculas y minúsculas utilizadas para las palabras clave, como «ORDER BY», «VAR», «EVALUATE», etc. Esto también se aplica cuando se inserta una palabra clave a través de la función de autocompletar, incluidos los valores fijos de las palabras clave de las funciones que las utilizan. Consulta @preferences para ver la lista completa. -##### _Capitalización preferida de funciones_ (predeterminado = UPPER) +##### *Mayúsculas preferidas para funciones* (predeterminado = MAYÚSCULAS) -Esta configuración permite cambiar el uso de mayúsculas/minúsculas de las funciones, como `CALCULATE(...)`, `SUM(...)`, etc. Esto también se aplica cuando una función se inserta mediante el autocompletado. +Este ajuste le permite cambiar las mayúsculas y minúsculas utilizadas para las funciones, como `CALCULATE(...)`, `SUM(...)`, etc. Esto también se aplica cuando se inserta una función a través de la función de autocompletar. -##### _Corregir mayúsculas/minúsculas de palabras clave/funciones_ (habilitado) +##### *Corregir mayúsculas de palabras clave/funciones* (habilitado) -Cuando esta opción está marcada, el uso de mayúsculas/minúsculas en palabras clave y funciones se corrige automáticamente cada vez que el código se formatea automáticamente o de forma manual. +Cuando esto está marcado, las mayúsculas y minúsculas de las palabras clave y las funciones se corrigen automáticamente cada vez que el código se formatea automáticamente o manualmente. -##### _Corregir mayúsculas/minúsculas en referencias a objetos_ (habilitado) +##### *Corregir mayúsculas de referencias de objetos* (habilitado) -DAX no distingue entre mayúsculas y minúsculas. Si se activa, las referencias a tablas, columnas y medidas se corrigen automáticamente para que el uso de mayúsculas/minúsculas coincida con el nombre físico de los objetos a los que se hace referencia. Esta corrección se realiza cada vez que el código se formatea automáticamente o de forma manual. +DAX es un lenguaje que no distingue entre mayúsculas y minúsculas. Cuando esto está habilitado, las referencias a tablas, columnas y medidas se corrigen automáticamente de modo que las mayúsculas coincidan con el nombre físico de los objetos a los que se hace referencia. Esta corrección se realiza siempre que el código se formatee automáticamente o manualmente. -##### _Poner siempre comillas a los nombres de tabla_ (deshabilitado) +##### *Entrecomillar siempre tablas* (desactivado) -Para hacer referencia a ciertos nombres de tabla no es necesario encerrarlos entre comillas simples en DAX. Sin embargo, si prefieres que las referencias a tablas vayan siempre entre comillas, independientemente del nombre de la tabla, puedes activar esta opción. +Hacer referencia a ciertos nombres de tablas no requiere que vayan entre comillas simples en DAX. Sin embargo, si prefiere que las referencias a tablas vayan siempre entre comillas, independientemente del nombre de la tabla, puede marcar esta opción. -##### _Anteponer siempre el prefijo a las columnas de extensión_ (deshabilitado) +##### *Prefijar siempre las columnas de extensión* (desactivado) -Las columnas de extensión se pueden definir sin un nombre de tabla. Cuando esta opción está seleccionada, el Editor de DAX siempre añadirá el prefijo de tabla a una columna de extensión, incluso si el nombre de la tabla está en blanco. En ese caso, la referencia a la columna se verá así: `''[Extension Column]`. +Las columnas de extensión se pueden definir sin un nombre de tabla. Cuando esto está marcado, el editor de DAX siempre añadirá el prefijo de la tabla a una columna de extensión, incluso si el nombre de la tabla está en blanco. En ese caso, la referencia de columna tendrá el siguiente formato: `''[Extension Column]`. -# Pasos a seguir +# Próximos pasos - @boosting-productivity-te3 \ No newline at end of file diff --git a/localizedContent/es/content/getting-started/refresh-preview-query.md b/localizedContent/es/content/getting-started/refresh-preview-query.md index f1675f49f..03191ebdf 100644 --- a/localizedContent/es/content/getting-started/refresh-preview-query.md +++ b/localizedContent/es/content/getting-started/refresh-preview-query.md @@ -1,6 +1,6 @@ --- uid: refresh-preview-query -title: Actualización, vista previa y consulta de datos +title: "Actualizar, obtener una vista previa y consultar datos" author: Daniel Otykier updated: 2026-10-12 applies_to: @@ -16,31 +16,30 @@ applies_to: - edition: Enterprise full: true --- +# Actualizar, obtener vista previa y consultar datos -# Actualización, vista previa y consulta de datos - -Cuando Tabular Editor 3 se conecta a una instancia de Analysis Services, se habilitan varias **funciones conectadas** adicionales que le permiten usar Tabular Editor 3 como herramienta cliente para Analysis Services. +Cuando Tabular Editor 3 está conectado a una instancia de Analysis Services, hay disponibles varias **funciones conectadas** adicionales que le permiten usar Tabular Editor 3 como herramienta cliente para Analysis Services. > [!NOTE] -> La expresión "conectado a una instancia de Analysis Services" se refiere a cualquiera de las siguientes opciones: -> -> - Cargar un modelo en el [**modo del área de trabajo**](xref:workspace-mode) +> La expresión «conectado a una instancia de Analysis Services» significa cualquiera de las siguientes opciones: +> +> - Cargar un modelo en [**modo de espacio de trabajo**](xref:workspace-mode) > - Cargar un modelo directamente desde SQL Server Analysis Services, Azure Analysis Services o el punto de conexión XMLA de Power BI > - Usar Tabular Editor 3 como herramienta externa para Power BI Desktop En resumen, estas funciones conectadas son: - Operaciones de actualización de datos -- Vista previa de datos de las tablas +- Vista previa de los datos de la tabla - PivotGrids -- Consulta DAX +- Consultas DAX - Analizador VertiPaq # Actualización de datos -Tabular Editor no inicia automáticamente operaciones de actualización en Analysis Services cuando se realizan cambios en el Data model. Esto se hace así por diseño, para garantizar que guardar los cambios de metadatos en Analysis Services no lleve demasiado tiempo. Una operación de actualización puede tardar mucho en completarse; durante ese tiempo, no se puede actualizar ningún metadato adicional en el servidor. Como contrapartida, puede hacer cambios con Tabular Editor, lo que hace que el modelo pase a un estado en el que solo se puede consultar parcialmente o no se puede consultar en absoluto. Según el tipo de cambio realizado en el Data model, puede que necesites aplicar distintos niveles de actualización. +Tabular Editor no activa automáticamente las operaciones de actualización en Analysis Services cuando se realizan cambios en el modelo de datos. Esto es intencionado, para garantizar que guardar los cambios de metadatos en Analysis Services no lleve demasiado tiempo. Potencialmente, una operación de actualización puede tardar mucho tiempo en completarse, durante el cual no se pueden actualizar metadatos adicionales en el servidor. Por supuesto, el inconveniente de esto es que puedes realizar cambios utilizando Tabular Editor, lo que hace que el modelo entre en un estado en el que solo se pueden realizar consultas parcialmente o no se pueden realizar en absoluto. Dependiendo del tipo de cambio realizado en el modelo de datos, pueden ser necesarios diferentes niveles de actualización. -En general, los siguientes cambios requieren una actualización completa antes de poder consultar el objeto mencionado (es decir, una actualización de datos seguida de una actualización de cálculo): +En general, los siguientes cambios requieren una actualización completa antes de que se pueda consultar el objeto mencionado (es decir, una actualización de datos seguida de una actualización de cálculo): - Agregar una nueva tabla al modelo - Agregar una nueva columna a una tabla @@ -48,140 +47,142 @@ En general, los siguientes cambios requieren una actualización completa antes d En general, los siguientes cambios requieren una actualización de cálculo: - Cambiar la expresión DAX de una tabla calculada o de una columna calculada -- Agregar o modificar una relación -- Agregar, cambiar el nombre o quitar un elemento de cálculo de un grupo de cálculo +- Añadir o modificar una relación +- Añadir, renombrar o eliminar un elemento de cálculo de un grupo de cálculos -Cabe destacar que añadir, modificar o quitar medidas a un modelo no requiere ningún tipo de actualización (a menos que la medida esté referenciada por una columna calculada; en ese caso, habrá que recalcular la tabla en la que se encuentra esa columna). +Cabe destacar que añadir, modificar o eliminar medidas de un modelo no requiere ningún tipo de actualización (a menos que una columna calculada haga referencia a la medida, en cuyo caso hay que recalcular la tabla en la que se encuentra esa columna). -Para iniciar una actualización con Tabular Editor, haz clic con el botón derecho en la tabla o partición que quieras actualizar, ve a **Actualizar tabla** o **Actualizar partición** y elige el tipo de actualización que quieres ejecutar. +Para iniciar una actualización con Tabular Editor, simplemente haga clic con el botón derecho en la tabla o partición que desee actualizar, vaya a **Actualizar tabla** o **Actualizar partición** y, a continuación, elija el tipo de actualización que desea realizar. ![Actualizar tabla](~/content/assets/images/refresh-table.png) -También puedes iniciar una actualización a nivel de modelo desde el menú **Modelo > Actualizar modelo**. Una vez iniciada la operación de actualización, verás el texto "Data refresh started... Ver cola de actualizaciones". Haz clic en el enlace o abre la vista **Actualización de datos** desde la opción de menú **Vista > Actualización de datos**. Esto mostrará una lista de todas las operaciones de actualización (tanto las pasadas como las que están en curso), con los mensajes de estado devueltos por Analysis Services, incluidos los contadores de progreso y la duración, y te permitirá cancelar una actualización iniciada por error. +También puede iniciar una actualización a nivel de modelo a través del menú **Modelo > Actualizar modelo**. Una vez que se inicie la operación de actualización, verá el texto «Actualización de datos iniciada... Ver cola de actualización». Haga clic en el enlace o busque la vista **Actualización de datos** a través de la opción de menú **Vista > Actualización de datos**. Esto mostrará una lista de todas las operaciones de actualización (tanto pasadas como actuales), con el mensaje de estado devuelto por Analysis Services, incluidos los contadores de progreso y la duración, y le permitirá cancelar una actualización no deseada. -![Vista de actualización de datos](~/content/assets/images/data-refresh-view2.png) +![Vista de actualización de datos 2](~/content/assets/images/data-refresh-view2.png) > [!TIP] -> La vista de actualización de datos incluye una columna **Hora de inicio** que muestra cuándo comenzó cada operación de actualización. Haz clic en el encabezado de la columna para ordenar las operaciones cronológicamente; así verás primero las actualizaciones más recientes. Puedes ordenar por cualquier columna para organizar las operaciones de actualización según tus necesidades. Consulta la [vista de actualización de datos](xref:data-refresh-view) para obtener más información. +> La vista Actualización de datos incluye una columna **Hora de inicio** que muestra cuándo comenzó cada operación de actualización. Haga clic en el encabezado de la columna para ordenar las operaciones cronológicamente, lo que facilita ver primero las actualizaciones más recientes. Puede ordenar por cualquier columna para organizar las operaciones de actualización según sus necesidades. Consulte [Vista de actualización de datos](xref:data-refresh-view) para obtener más detalles. + +Mientras se está realizando una actualización, puedes seguir trabajando en tu modelo de datos, consultando y previsualizando datos o poniendo en cola nuevas operaciones de actualización de datos de acuerdo con este artículo. Sin embargo, no podrá guardar los cambios del modelo en Analysis Services hasta que se completen todas las operaciones de actualización de datos. -Mientras una actualización está en curso, puedes seguir trabajando en tu Data model, consultando y previsualizando datos o poniendo en cola nuevas operaciones de actualización de datos, tal como se describe en este artículo. Sin embargo, no podrás guardar los cambios del modelo en Analysis Services hasta que finalicen todas las operaciones de actualización de datos. ## Operaciones de actualización compatibles -Tabular Editor 3 admite operaciones de actualización en distintos tipos de objetos. Los tipos de actualización compatibles se muestran a continuación: +Tabular Editor 3 admite operaciones de actualización en diferentes tipos de objetos. Los tipos de actualización admitidos se muestran a continuación: -- **Modelo** (Automática, cálculo, completa) -- **Tabla (importada)** (Automática, cálculo, solo datos, completa) -- **Partición** (Completa) -- **Tabla calculada** (Calculate) -- **Grupo de cálculo** (Calculate) +- **Modelo** (automática, cálculo, completa) +- **Tabla (importada)** (automática, calcular, solo datos, completa) +- **Partición** (completa) +- **Tabla calculada** (Calcular) +- **Grupo de cálculo** (Calcular) -Consulta [Tipos de actualización](https://docs.microsoft.com/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request) para obtener más información sobre los tipos de operaciones de actualización compatibles con Analysis Services / Power BI. +Consulte [Tipos de actualización](https://docs.microsoft.com/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request) para obtener más información sobre los tipos de operaciones de actualización compatibles con Analysis Services / Power BI. -# Vista previa de los datos de la tabla +# Vista previa de datos de tabla -En determinados momentos, durante la creación de DAX y el desarrollo del Data model, es posible que necesites inspeccionar el contenido de tus tablas fila por fila. Por supuesto, podrías escribir una consulta DAX para hacerlo, pero Tabular Editor 3 lo pone aún más fácil al permitirte previsualizar los datos de la tabla directamente. Para ello, haz clic con el botón derecho en una tabla y elige la opción **Vista previa de datos**. +En determinados momentos durante la creación de DAX y el desarrollo del modelo de datos, es posible que deba inspeccionar el contenido de sus tablas fila por fila. Por supuesto, podría escribir una consulta DAX para conseguirlo, pero Tabular Editor 3 lo hace aún más fácil al permitirle previsualizar los datos de las tablas directamente. Para ello, haga clic derecho en una tabla y elija la opción **Obtener vista previa de datos**. -![Vista previa de datos](~/content/assets/images/preview-data-big.png) +![Vista previa de los datos](~/content/assets/images/preview-data-big.png) -Puedes abrir varias vistas previas de tabla y organizarlas como quieras en la interfaz de usuario. Tabular Editor ejecuta una consulta DAX en el modelo para devolver solo un pequeño número de registros, suficientes para rellenar la vista actual, y luego va cargando más filas a medida que te desplazas. +Puede abrir varias vistas previas de tablas de este tipo y organizarlas como desee en la interfaz de usuario. Tabular Editor ejecuta una consulta DAX en el modelo para devolver solo un pequeño número de registros adecuados para rellenar la vista actual y, a continuación, va paginando más filas a medida que se desplaza. -Cada encabezado de columna incorpora opciones de ordenación y filtrado; el menú contextual de la cuadrícula puede abrir la expresión de una columna calculada o recalcular la tabla; y **Show actual DAX query...** te muestra la consulta que hay detrás de la vista previa como un nuevo documento de consulta DAX. Al seleccionar una columna en el Explorador TOM, la vista previa se desplaza hasta ella. +Cada encabezado de columna incluye una opción de ordenación y un filtro. El menú contextual de la cuadrícula (al hacer clic con el botón derecho) permite abrir la expresión de una columna calculada o recalcular la tabla, y la opción **Mostrar consulta DAX real...** le proporciona la consulta subyacente a la vista previa como un nuevo documento de consulta DAX. Al seleccionar una columna en el Explorador TOM, la vista previa se desplaza hasta ella. -Consulta @table-preview para ver la barra de herramientas, el menú contextual, hasta dónde puedes desplazarte en cada modo de almacenamiento y las preferencias que controlan el orden de las columnas y el desplegable de filtro. +Consulte @table-preview para ver la barra de herramientas, el menú contextual, hasta dónde puede desplazarse en cada modo de almacenamiento y las preferencias que rigen el orden de las columnas y el menú desplegable de filtros. -# Pivot Grid +# Pivot Grids -Después de agregar o editar medidas DAX en un modelo, es habitual que los desarrolladores del modelo prueben estas medidas. Tradicionalmente, esto solía hacerse con herramientas cliente como Excel o Power BI. Con Tabular Editor 3, ahora puedes usar **Pivot Grid**, que se comportan de forma muy parecida a las conocidas tablas dinámicas de Excel. Pivot Grid te permite crear rápidamente vistas resumidas de los datos de tu modelo, lo que te permite probar el comportamiento de tus medidas DAX al filtrar y segmentar por varias columnas y jerarquías. +Después de añadir o editar medidas DAX en un modelo, es habitual que los desarrolladores de modelos prueben estas medidas. Tradicionalmente, esto solía hacerse utilizando herramientas cliente como Excel o Power BI. Con Tabular Editor 3, ahora puedes utilizar **cuadrículas dinámicas**, que funcionan de forma muy parecida a las famosas tablas dinámicas de Excel. La cuadrícula dinámica te permite crear rápidamente vistas resumidas de los datos de tu modelo, lo que te permite probar el comportamiento de tus medidas DAX al filtrar y segmentar por varias columnas y jerarquías. -Para crear una nueva Pivot Grid, usa la opción **Archivo > Nuevo > Pivot Grid**. Desde aquí, puedes arrastrar medidas, columnas y jerarquías desde el Explorador TOM a la cuadrícula, o bien usar la opción de menú **Pivot Grid > Mostrar campos** para ver una lista emergente de todos los campos que se pueden arrastrar a la Pivot Grid (consulta la captura de pantalla a continuación). +Para crear una nueva Pivot Grid, utilice la opción **Archivo > Nuevo > Pivot Grid**. Desde aquí, puede arrastrar medidas, columnas y jerarquías del TOM Explorer a la cuadrícula, o puede usar la opción de menú **Pivot Grid > Show fields** para mostrar una lista emergente de todos los campos que se pueden arrastrar a la Pivot Grid (vea la captura de pantalla a continuación). ![Mostrar campos de tabla dinámica](~/content/assets/images/show-fields-pivot.png) -A medida que se arrastran campos a la Pivot Grid, Tabular Editor genera consultas MDX que se envían a Analysis Services para mostrar los datos resultantes. En este sentido, el comportamiento es muy similar al de las tablas dinámicas de Excel. Puedes reorganizar los campos del Pivot Grid arrastrándolos y soltándolos, y hay varias opciones en el menú contextual para personalizar la forma en que se muestran los datos. +A medida que se arrastran campos al Pivot Grid, Tabular Editor genera consultas MDX que se envían a Analysis Services para mostrar los datos resultantes. En este sentido, el comportamiento es muy similar al de las tablas dinámicas de Excel. Puede reorganizar los campos en el Pivot Grid arrastrándolos y soltándolos, y hay varias opciones de menú disponibles al hacer clic con el botón derecho para personalizar la forma en que se muestran los datos. -![Personalizar Pivot Grid](~/content/assets/images/customizing-pivot-grids.png) +![Personalización de Pivot Grids](~/content/assets/images/customizing-pivot-grids.png) -El Pivot Grid se actualiza automáticamente cuando se realiza un cambio en el modelo o finaliza una operación de actualización. Puedes activar o desactivar esta actualización automática en el menú **Pivot Grid**. +Pivot Grid se actualiza automáticamente cuando se realiza un cambio en el modelo o cuando finaliza una operación de actualización. Puede activar o desactivar esta función de actualización automática en el menú **Pivot Grid**. # Consultas DAX -Una forma más directa de consultar los datos de tu modelo es escribir una consulta DAX. Usa la opción de menú **Archivo > Nuevo > Consulta DAX** para crear un nuevo documento de consulta DAX. Puedes tener varios documentos de consulta DAX abiertos al mismo tiempo. +Una forma más directa de consultar los datos de tu modelo es escribir una consulta DAX. Use la opción de menú **Archivo > Nuevo > Consulta DAX** para crear un nuevo documento de consulta DAX. Puede tener varios documentos de consultas DAX abiertos al mismo tiempo. -Las consultas DAX se pueden guardar y cargar desde archivos independientes usando la extensión `.dax` o `.msdax`. Consulta @supported-files para obtener más información. +Las consultas DAX se pueden guardar y cargar en archivos independientes y desde ellos utilizando la extensión de archivo «.dax» o «.msdax». Consulta @supported-files para obtener más información. -Escribe tu consulta DAX `EVALUATE` en el editor y pulsa **Consulta > Ejecutar** (F5) para enviar la consulta a Analysis Services y ver el resultado. De forma predeterminada, Tabular Editor 3 limita a 1000 el número de filas devueltas por Analysis Services, pero esto se puede cambiar en **Herramientas > Preferencias > Navegación de datos > Consulta DAX**. Si una consulta supera este límite, Tabular Editor 3 muestra un acceso directo que te permite recuperar todos los registros (consulta la captura de pantalla a continuación). +Escriba su consulta DAX `EVALUATE` en el editor y pulse **Consulta > Ejecutar** (F5) para enviar la consulta a Analysis Services y ver el resultado. De forma predeterminada, Tabular Editor 3 limita el número de filas devueltas por Analysis Services a 1000, pero esto se puede cambiar en **Herramientas > Preferencias > Exploración de datos > Consulta DAX**. Si una consulta supera este límite, Tabular Editor 3 muestra un acceso directo que le permite recuperar todos los registros (vea la captura de pantalla a continuación). -![Límite de filas del conjunto de resultados de la consulta](~/content/assets/images/query-rowset-limit.png) +![Límite del conjunto de filas de la consulta](~/content/assets/images/query-rowset-limit.png) > [!WARNING] -> Mostrar un gran número de registros en la ventana de resultados de la consulta podría tardar un rato y aumentar drásticamente la memoria consumida por Tabular Editor 3. +> Mostrar un gran número de registros en la ventana de resultados de la consulta podría llevar un tiempo y aumentar drásticamente la memoria consumida por Tabular Editor 3. -Tabular Editor 3 usa el mismo editor de código DAX para editar consultas que para definir expresiones DAX en los objetos. Por tanto, están disponibles todas las funciones de autocompletado, formato automático, etc. Consulta @dax-editor para obtener más información. Además, como una consulta DAX tiene una sintaxis ligeramente distinta a las expresiones de objetos, el editor de consultas DAX ofrece algunas opciones adicionales para tareas comunes. +Tabular Editor 3 utiliza el mismo editor de código DAX para editar consultas que para definir expresiones DAX en objetos. Por lo tanto, están disponibles todas las funciones relacionadas con la finalización de código, el formato automático, etc. Consulta @dax-editor para obtener más información. Además, dado que una consulta DAX tiene una sintaxis ligeramente diferente a la de las expresiones de objetos, el editor de consultas DAX ofrece algunas opciones más para las tareas habituales. -Por ejemplo, si haces clic con el botón derecho en una referencia a una medida, aparece la opción **Definir medida**, como se ve en la captura de pantalla siguiente. Esta opción añadirá una instrucción `DEFINE MEASURE` en la parte superior de tu consulta DAX, lo que te permitirá modificar fácilmente la expresión DAX de esa medida dentro del ámbito de la consulta. +Por ejemplo, si hace clic con el botón derecho en una referencia de medida, hay una opción para **Definir medida**, como se ve en la captura de pantalla siguiente. Esta opción añadirá una instrucción `DEFINE MEASURE` en la parte superior de su consulta DAX, lo que le permitirá modificar fácilmente la expresión DAX de esa medida dentro del ámbito de la consulta. -![Funciones de la Consulta Dax](~/content/assets/images/dax-query-features.png) +![Funciones de consulta Dax](~/content/assets/images/dax-query-features.png) -Además, una consulta DAX puede contener varias instrucciones `EVALUATE`. En ese caso, Tabular Editor 3 muestra el resultado de cada instrucción en una pestaña numerada independiente. Si solo quieres ejecutar una única instrucción `EVALUATE`, aunque tu documento contenga varias, puedes colocar el cursor en cualquier parte de la instrucción que quieras ejecutar y, a continuación, usar la opción **Consulta > Ejecutar selección** (SHIFT+F5). +Además, una consulta DAX puede contener varias instrucciones `EVALUATE`. Cuando ese es el caso, Tabular Editor 3 muestra el resultado de cada una de esas sentencias en una pestaña separada y numerada. Si solo quieres ejecutar una única instrucción `EVALUATE`, aunque tu documento contenga varias, puedes colocar el cursor en algún punto de la instrucción que quieras ejecutar y, a continuación, usar la opción **Consulta > Ejecutar selección** (MAYÚS+F5). -Una Consulta DAX en Tabular Editor 3 se actualiza automáticamente cuando se realiza un cambio en el modelo o cuando finaliza una operación de actualización. Puedes activar o desactivar esta función de actualización automática en el menú **Consulta**. +Una consulta DAX en Tabular Editor 3 se actualiza automáticamente cuando se realiza un cambio en el modelo o cuando finaliza una operación de actualización. Puede activar o desactivar esta función de actualización automática en el menú **Consulta**. -# Suplantación de identidad +# Simulación de usuario -Al consultar los datos del modelo, a veces resulta útil poder suplantar a un usuario específico o una combinación de roles, para ver cómo se comporta el modelo desde la perspectiva de un usuario final. Tabular Editor 3 te permite suplantar a un usuario específico o a uno o varios roles haciendo clic en el botón **Suplantar...**. Esto se aplica a las [Vistas previas de tabla](#previewing-table-data), los [Pivot Grid](#pivot-grids) y las [Consultas DAX](#dax-queries). +Al consultar los datos del modelo, a veces resulta útil poder suplantar a un usuario específico o a una combinación de roles, para ver cuál sería el comportamiento del modelo desde la perspectiva de un usuario final. Tabular Editor 3 te permite suplantar a un usuario específico o a uno o varios roles haciendo clic en el botón **Suplantar...**. Esto se aplica a las [vistas previas de tablas](#previewing-table-data), las [cuadrículas dinámicas](#pivot-grids) y las [consultas DAX](#dax-queries). > [!NOTE] -> Para suplantar a un usuario, Tabular Editor agrega la propiedad [`EffectiveUserName`](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#effectiveusername) a la cadena de conexión cuando se conecta a Analysis Services. Para suplantar un rol, Tabular Editor agrega la propiedad [`Roles`](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#roles) a la cadena de conexión. Esto solo se aplica a la vista de datos (es decir, la Consulta DAX, el Pivot Grid o la Vista previa de tabla) en la que se especifica la suplantación. +> Para suplantar a un usuario, Tabular Editor añade la [propiedad `EffectiveUserName`](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#effectiveusername) a la cadena de conexión, al conectarse a Analysis Services. Para suplantar un rol, Tabular Editor añade la [propiedad `Roles`](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#roles) a la cadena de conexión. Esto solo se aplica a la vista de datos (es decir, la consulta DAX, Pivot Grid o la vista previa de la tabla) en la que se especifica la suplantación. -Al hacer clic en el botón **Suplantación...** (que también puedes encontrar en el menú **Consulta**, **Pivot Grid** o **Vista previa de tabla**, según el tipo de vista de datos activa), se abre un cuadro de diálogo que te permite especificar un usuario o seleccionar uno o varios roles. +Al hacer clic en el botón **Suplantación...** (que también se puede encontrar a través del menú **Consulta**, **Cuadrícula dinámica** o **Vista previa de tabla**, dependiendo del tipo de vista de datos que esté activa), una ventana emergente le permite especificar un usuario o seleccionar uno o más roles. -![Seleccionar suplantación](~/content/assets/images/select-impersonation.png) +![Seleccionar simulación de usuario](~/content/assets/images/select-impersonation.png) -Una vez habilitada la suplantación, el botón **Suplantación...** queda marcado y se aplicará a la vista de datos actual. Al hacer clic en la pequeña flecha junto al botón **Suplantación...**, puedes ver y cambiar rápidamente entre las 10 suplantaciones más recientes que has usado. +Una vez habilitada la suplantación, se marca el botón **Suplantación...** y la suplantación se aplicará a la vista de datos actual. Al hacer clic en la pequeña flecha situada junto al botón **Suplantación...**, puede ver y cambiar rápidamente entre las 10 suplantaciones más recientes que se hayan usado. -![Seleccionar suplantación](~/content/assets/images/impersonation-customdata.png) +![Menú desplegable de suplantación](~/content/assets/images/impersonation-dropdown.png) -Cuando la actualización automática está habilitada en una vista de datos, cambiar la suplantación actualizará la vista de inmediato. +Cuando la actualización automática está habilitada en una vista de datos, al cambiar la suplantación se actualizará inmediatamente la vista. ## CustomData -La característica CustomData permite pasar un valor de cadena personalizado que puede usarse en expresiones DAX, normalmente para implementar escenarios dinámicos de seguridad a nivel de filas. Esta característica se puede combinar con cualquiera de las opciones de suplantación descritas anteriormente, incluida la opción **Sin suplantación**. +La función CustomData le permite pasar un valor de cadena personalizado que se puede usar en expresiones DAX, normalmente para implementar escenarios de seguridad dinámica a nivel de fila. Esta función se puede combinar con cualquiera de las opciones de simulación de usuario descritas anteriormente, incluida la opción **Sin simulación de usuario**. -![Seleccionar suplantación de identidad](~/content/assets/images/impersonation-customdata.png) +![Seleccionar simulación de usuario](~/content/assets/images/impersonation-customdata.png) -Cuando se introduce un valor en el campo de entrada **CustomData**, Tabular Editor 3 agrega la propiedad [`CustomData`](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata) a la cadena de conexión. A continuación, puedes recuperar este valor en tus expresiones DAX mediante la [`función CUSTOMDATA()`](https://dax.guide/customdata/). +Cuando introduce un valor en el campo de entrada **CustomData**, Tabular Editor 3 añade la [propiedad «CustomData»](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata) a la cadena de conexión. A continuación, este valor puede recuperarse dentro de sus expresiones DAX utilizando la [función `CUSTOMDATA()`](https://dax.guide/customdata/). -CustomData se usa habitualmente para implementar seguridad a nivel de filas dinámica cuando una aplicación utiliza autenticación personalizada. El valor que proporciones puede utilizarse en las expresiones de filtro del rol para controlar qué filas pueden ver los usuarios en función de los datos personalizados que se pasan a través de la cadena de conexión. +CustomData se usa habitualmente para implementar seguridad dinámica a nivel de filas cuando una aplicación utiliza autenticación personalizada. El valor que proporcione puede aprovecharse en expresiones de filtro de roles para controlar qué filas pueden ver los usuarios en función de los datos personalizados que se transmiten a través de la cadena de conexión. -Esta característica es especialmente útil en escenarios de **Power BI Embedded**, donde puedes utilizar CustomData de forma nativa para agregar filtros de fila que transmitan texto libre (cadenas) y así aprovechar la seguridad a nivel de filas dinámica en Reports, Dashboards y Tiles integrados. - -**Ejemplo de caso de uso:** Podrías pasar el departamento o la región de un usuario como CustomData y, luego, usar ese valor en la expresión de filtro de un rol, por ejemplo: +Esta función es especialmente útil en escenarios de **Power BI Embedded**, donde puedes utilizar de forma nativa CustomData para añadir filtros de filas que pasan texto libre (cadenas) con el fin de aprovechar la seguridad dinámica a nivel de fila en informes, paneles y mosaicos integrados. +**Ejemplo de caso de uso:** Puede pasar el departamento o la región de un usuario como CustomData y, a continuación, usar ese valor en la expresión de filtro de un rol, como en el siguiente ejemplo: ```dax 'Department'[DepartmentCode] = CUSTOMDATA() -``` +``` # Analizador VertiPaq -Tabular Editor 3 incluye una versión de la herramienta de código abierto [Analizador VertiPaq](https://www.sqlbi.com/tools/vertipaq-analyzer/), creada por [SQLBI](https://sqlbi.com). El Analizador VertiPaq es útil para analizar las estructuras de almacenamiento VertiPaq de tu Data model de Power BI o de un Data model tabular. +Tabular Editor 3 incluye una versión de la herramienta de código abierto [Analizador VertiPaq](https://www.sqlbi.com/tools/vertipaq-analyzer/), creada por [SQLBI](https://sqlbi.com). El Analizador VertiPaq es útil para analizar las estructuras de almacenamiento VertiPaq de su modelo de datos de Power BI o tabular. + +Con Tabular Editor 3, puedes recopilar estadísticas del Analizador VertiPaq mientras estás conectado a cualquier instancia de Analysis Services. También puede exportar las estadísticas como un [archivo .vpax](https://www.youtube.com/watch?v=zRa9y01Ub30) o importar estadísticas desde un archivo .vpax. -Con Tabular Editor 3, puedes recopilar estadísticas del Analizador VertiPaq mientras estás conectado a cualquier instancia de Analysis Services. También puedes exportar las estadísticas como un [archivo .vpax](https://www.youtube.com/watch?v=zRa9y01Ub30) o importar estadísticas desde un archivo .vpax. +Para recopilar estadísticas, simplemente pulse el botón **Recopilar estadísticas** en la vista **Analizador VertiPaq**. -Para recopilar estadísticas, simplemente haz clic en el botón **Recopilar estadísticas** en la vista **Analizador VertiPaq**. +Si no se pueden leer las estadísticas a partir de los datos del modelo, por ejemplo, cuando una columna de alta cardinalidad supera el límite de memoria por consulta de una capacidad de Power BI, las estadísticas se recopilan únicamente a partir de los metadatos del modelo. Aparece una advertencia de **Estadísticas recopiladas sin leer los datos** junto con el error del servidor, y es posible que falten cardinalidades o que sean inexactas. Para omitir la lectura de estadísticas de los datos, desmarque **Leer estadísticas de datos** en **Herramientas > Preferencias > Formatos de archivo > Analizador VertiPaq**. -![Analizador VertiPaq: Recopilar estadísticas](~/content/assets/images/vertipaq-analyzer-collect-stats.png) +![Recopilar estadísticas de Vertipaq Analyzer](~/content/assets/images/vertipaq-analyzer-collect-stats.png) -Una vez recopiladas las estadísticas, el Analizador VertiPaq muestra un resumen del tamaño del modelo, el número de tablas, etc. Puedes encontrar estadísticas más detalladas en las pestañas **Tablas**, **Columnas**, **Relaciones** y **Particiones**. +Una vez recopiladas las estadísticas, VertiPaq Analyzer muestra un resumen del tamaño del modelo, el número de tablas, etc. Puedes consultar estadísticas más detalladas en las pestañas **Tablas**, **Columnas**, **Relaciones** y **Particiones**. -Además, siempre que se hayan cargado estadísticas, Tabular Editor 3 mostrará información de cardinalidad y tamaño en una información sobre herramientas al pasar el cursor del ratón sobre los objetos del Explorador TOM: +Además, siempre que se hayan cargado estadísticas, Tabular Editor 3 mostrará la información de cardinalidad y tamaño como una información emergente al pasar el cursor del ratón sobre los objetos en el Explorador TOM: ![Estadísticas del Analizador VertiPaq en el Explorador TOM](~/content/assets/images/vertipaq-analyzer-stats.png) -...o al situar el cursor sobre las referencias a objetos en expresiones DAX: +...o cuando pase el cursor del ratón sobre las referencias de objetos en las expresiones DAX: -![Estadísticas del Analizador VertiPaq en una expresión DAX](~/content/assets/images/vertipaq-analyzer-stats-dax.png) +![Estadísticas de Vertipaq Analyzer en una expresión DAX](~/content/assets/images/vertipaq-analyzer-stats-dax.png) -# Pasos a seguir +# Próximos pasos -- @creating-and-testing-dax \ No newline at end of file +- @crear-y-probar-dax \ No newline at end of file diff --git a/localizedContent/es/content/getting-started/toc.md b/localizedContent/es/content/getting-started/toc.md index 8c453828b..13d5fa56a 100644 --- a/localizedContent/es/content/getting-started/toc.md +++ b/localizedContent/es/content/getting-started/toc.md @@ -1,75 +1,45 @@ -# [Bienvenido](index.md) - -# Introducción a Tabular Editor - -## @general-introduction - -## @installation-activation-basic +# [Te damos la bienvenida](index.md) +# Primeros pasos con Tabular Editor 3 +## @introducción-general +## @getting-started +## @instalación-activación-básica ## @migrate-from-vs - -## @migrate-from-desktop - +## @migrar-desde-desktop ## @migrate-from-te2 - ## @azure-marketplace - -# Primeros pasos con Tabular Editor 3 - -## @getting-started - ## @editions - ## @training-telearn -# @getting-started-te2 +# @primeros-pasos-te2 # Power BI Desktop y Tabular Editor - -## @desktop-integration - -## @desktop-limitations +## @integración-desktop +## @limitaciones-de-desktop # Interfaz de usuario - -## @user-interface-reference - -## @bpa-view-reference - -## @data-refresh-view-reference - -## @find-replace-reference - -## @macros-view-reference - -## @messages-view-reference - -## @properties-view-reference - -## @tom-explorer-view-reference - -## @diagram-view-reference - -# Desarrollo en paralelo - -## @parallel-development - -## @optimizing-workflow-workspace-mode +## @referencia-interfaz-usuario +## @referencia-vista-bpa +## @referencia-vista-actualización-datos +## @referencia-buscar-reemplazar +## @referencia-vista-macros +## @referencia-vista-mensajes +## @referencia-vista-propiedades +## @referencia-vista-explorador-tom +## @referencia-vista-diagrama +## @referencia-vista-previa-tabla + +# Desarrollo paralelo +## @desarrollo-paralelo +## @compartir-macros-reglas-bpa +## @optimizar-flujo-de-trabajo-modo-espacio-de-trabajo # Cree modelos más rápido con Tabular Editor - -## @boosting-productivity-te3 - -## @importing-tables-data-modeling - -## @refresh-preview-query - -## @creating-and-testing-dax - -## @dax-script-introduction - +## @aumentar-la-productividad-te3 +## @importación-tablas-modelado-datos +## @actualizar-vista-previa-consulta +## @crear-y-probar-dax +## @introduccion-a-los-scripts-de-dax ## @bpa - -## @cs-scripts-and-macros - -## @personalizing-te3 \ No newline at end of file +## @scripts-y-macros-de-cs +## @personalizar-te3 \ No newline at end of file diff --git a/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md b/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md index c7f094de1..9b36f27e9 100644 --- a/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md +++ b/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md @@ -1,6 +1,8 @@ ---- +--- uid: advanced-filtering-explorer-tree title: Filtrado avanzado de objetos +author: Morten Lønskov +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -11,88 +13,88 @@ applies_to: # Filtrado avanzado de objetos -Este artículo explica cómo usar el cuadro de texto "Filter" en Tabular Editor, una función increíblemente útil para navegar por modelos complejos. +El cuadro de texto **Filtro** del árbol del explorador filtra los objetos que se muestran en el árbol por nombre, por patrón de comodines o por una expresión Dynamic LINQ. ## Modo de filtrado -Desde la versión [2.7.4](https://github.com/TabularEditor/TabularEditor/releases/tag/2.7.4), Tabular Editor te permite decidir cómo se aplica el filtro a los objetos de la jerarquía y cómo se muestran los resultados de búsqueda. Esto se controla con los tres botones más a la derecha de la barra de herramientas, junto al botón "Filter": +Los tres botones de la barra de herramientas situados más a la derecha, junto al botón **Filtro**, añadidos en [Tabular Editor 2.7.4](https://github.com/TabularEditor/TabularEditor/releases/tag/2.7.4), determinan cómo se aplica el filtro a la jerarquía de objetos y cómo se muestran los resultados. -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-01.png) +![Cuadro de texto de filtro y botones de modo de filtro en la barra de herramientas del Explorador](~/content/assets/images/advanced-filtering-of-the-explorer-tree-01.png) -- ![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-02.png) **Jerárquico por elemento padre**: La búsqueda se aplicará a los objetos _padre_; es decir, a tablas y carpetas de visualización (si están habilitadas). Cuando un elemento padre cumpla los criterios de búsqueda, se mostrarán todos los elementos hijos. -- ![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-03.png) **Jerárquico por elementos hijo**: La búsqueda se aplicará a los objetos _hijos_; es decir, a medidas, columnas, jerarquías, etc. Los objetos padre solo se mostrarán si tienen al menos un objeto hijo que cumpla los criterios de búsqueda. -- ![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-04.png) **Plano**: La búsqueda se aplicará a todos los objetos y los resultados se mostrarán en una lista plana. Los objetos que contengan elementos secundarios seguirán mostrándolos de forma jerárquica. +* ![Botón Jerárquico por elemento principal](~/content/assets/images/advanced-filtering-of-the-explorer-tree-02.png) **Jerárquico por elemento principal**: la búsqueda se aplica a los objetos principales, es decir, a las tablas, y muestra las carpetas si están visibles. Cuando un elemento principal coincide, se muestran todos sus elementos secundarios. +* ![Botón Jerárquico por elementos secundarios](~/content/assets/images/advanced-filtering-of-the-explorer-tree-03.png) **Jerárquico por elementos secundarios**: la búsqueda se aplica a los objetos secundarios, como medidas, columnas y jerarquías. Un elemento principal solo se muestra si al menos uno de sus elementos secundarios coincide. +* ![Botón «Plano»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-04.png) **Plano**: la búsqueda se aplica a todos los objetos y los resultados se muestran como una lista plana. Los objetos con elementos secundarios siguen mostrándolos de forma jerárquica. ## Búsqueda simple -Escribe lo que quieras en el cuadro de texto "Filter" y pulsa [Enter] para realizar una búsqueda sencilla sin distinguir entre mayúsculas y minúsculas en los nombres de los objetos. Por ejemplo, si escribes "sales" en el cuadro de texto "Filter" y usas el modo de filtrado "By Parent", obtendrás los siguientes resultados: +Escriba texto en el cuadro de texto **Filtro** y pulse **Intro** para realizar una búsqueda de nombres de objetos sin distinguir entre mayúsculas y minúsculas. Por ejemplo, «ventas» en el modo «Por elemento principal» da estos resultados: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-05.png) +![Resultados de la búsqueda de «sales» en el modo «Por elemento principal»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-05.png) -Al expandir cualquiera de las tablas, se mostrarán todas las medidas, columnas, jerarquías y particiones de la tabla. Si cambiamos el modo de filtrado a "By Child", los resultados se verán así: +Al expandir una tabla se muestran todas sus medidas, columnas, jerarquías y particiones. En el modo «Por elemento secundario», la misma búsqueda da estos resultados: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-06.png) +![Resultados de la búsqueda de «sales» en el modo «Por elemento secundario»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-06.png) -Observa que la tabla "Employee" ahora aparece en la lista, ya que tiene un par de elementos secundarios (columnas, en este caso) que contienen la palabra "sales". +Ahora aparece la tabla «Empleado», porque algunas de sus columnas contienen la palabra «ventas». ## Búsqueda con comodines -Al escribir una cadena en el cuadro de texto del filtro, puedes usar el comodín `?` para indicar cualquier carácter y `*` para indicar cualquier secuencia de caracteres (cero o más). Así, escribir `*sales*` produciría exactamente los mismos resultados que se muestran más arriba; sin embargo, si escribes `sales*`, solo se mostrarán los objetos cuyo nombre _empieza_ por la palabra "sales" (de nuevo, no distingue entre mayúsculas y minúsculas). +En el cuadro de texto **Filtro**, `?` coincide con cualquier carácter individual y `*` coincide con cualquier secuencia de cero o más caracteres, y la coincidencia no distingue entre mayúsculas y minúsculas, como en la búsqueda simple. `*sales*` da los mismos resultados que los anteriores, y `sales*` muestra solo los objetos cuyos nombres comienzan por «sales». -Búsqueda de `sales*` por elemento padre: +Una búsqueda de «sales*» en el modo «Por elemento principal» da estos resultados: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-07.png) +![Resultados de la búsqueda de sales* en el modo «Por elemento principal»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-07.png) -Búsqueda de `sales*` por elemento hijo: +La misma búsqueda en el modo «Por elemento secundario» da estos resultados: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-08.png) +![Resultados de la búsqueda de sales* en el modo «Por elemento secundario»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-08.png) -Búsqueda plana de `sales*` (pulsa [Ctrl]+[F1] para mostrar u ocultar las columnas de información y ver información detallada de cada objeto): +Búsqueda plana de «sales*», con las columnas de información mostradas (**Ctrl+F1**) para obtener detalles sobre cada objeto: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-09.png) +![Resultados de la búsqueda plana para sales* con columnas de información que muestran el elemento principal y el tipo](~/content/assets/images/advanced-filtering-of-the-explorer-tree-09.png) -Los comodines se pueden colocar en cualquier parte de la cadena y puedes incluir tantos como necesites. Si eso no te parece lo bastante complejo, sigue leyendo... +Puede colocar cualquier número de comodines en cualquier parte de la cadena. -## Búsqueda con LINQ dinámico +## Búsqueda Dynamic LINQ -También puedes usar [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions) para buscar objetos; es lo mismo que haces al crear reglas del [Best Practice Analyzer](xref:best-practice-analyzer). Para habilitar el modo LINQ dinámico en el cuadro de texto Filtro, solo tienes que poner un `:` (dos puntos) delante de tu cadena de búsqueda. Por ejemplo, para ver todos los objetos cuyo nombre termina en "Key" (distingue entre mayúsculas y minúsculas), escribe: +El filtro también acepta expresiones [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions), la sintaxis que utilizan las [reglas del Best Practice Analyzer](xref:best-practice-analyzer). Inicie la cadena de búsqueda con «:`» (dos puntos) para cambiar al modo Dynamic LINQ. Por ejemplo, este filtro muestra todos los objetos cuyo nombre termina en «Key» (distingue entre mayúsculas y minúsculas): -``` +```text :Name.EndsWith("Key") ``` -...y pulsa [Enter]. En el modo de filtrado "Flat", el resultado se ve así: +Pulse **Intro** para aplicar el filtro, que en el modo «Plano» da este resultado: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-10.png) +![Resultados en modo plano para un filtro Dynamic LINQ sobre nombres que terminan en «Key»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-10.png) -Para una búsqueda sin distinción entre mayúsculas y minúsculas en LINQ dinámico, puedes convertir la cadena de entrada con algo como: +Para realizar una búsqueda sin distinguir entre mayúsculas y minúsculas en Dynamic LINQ, convierta la cadena: -``` +```text :Name.ToUpper().EndsWith("KEY") ``` -o también puedes proporcionar el argumento [StringComparison](https://docs.microsoft.com/dotnet/api/system.string.endswith?view=netframework-4.7.2#System_String_EndsWith_System_String_System_StringComparison_), por ejemplo: +o bien puede proporcionar el argumento [StringComparison](https://docs.microsoft.com/dotnet/api/system.string.endswith?view=netframework-4.7.2#System_String_EndsWith_System_String_System_StringComparison_), como: -``` +```text :Name.EndsWith("Key", StringComparison.InvariantCultureIgnoreCase) ``` -No estás limitado a buscar solo en los nombres de los objetos. Las cadenas de búsqueda de LINQ dinámico pueden ser tan complejas como quieras, para evaluar cualquier propiedad (incluidas las subpropiedades) de un objeto. Así que, si quieres encontrar todos los objetos que tengan una expresión que contenga la palabra "TODO", usarías el siguiente filtro de búsqueda: +Un filtro Dynamic LINQ puede evaluar cualquier propiedad de un objeto, incluidas las subpropiedades. Por ejemplo, este filtro busca todos los objetos cuya expresión contenga la palabra «TODO»: -``` +```text :Expression.ToUpper().Contains("TODO") ``` -Como otro ejemplo, lo siguiente mostrará todas las medidas ocultas del modelo que no estén referenciadas por ningún otro objeto: +Este filtro muestra todas las medidas ocultas del modelo a las que no hace referencia ningún otro objeto: -``` +```text :ObjectType="Measure" and (IsHidden or Table.IsHidden) and ReferencedBy.Count=0 ``` -También puedes usar expresiones regulares. Lo siguiente encontrará todas las columnas cuyo nombre contenga la palabra "Number" o "Amount": +Las expresiones regulares también funcionan, como en este filtro que busca todas las columnas cuyo nombre contiene «Número» o «Importe»: -``` +```text :ObjectType="Column" and RegEx.IsMatch(Name,"(Number)|(Amount)") ``` -Ten en cuenta que las opciones de visualización (los botones de la barra de herramientas justo encima del árbol) pueden afectar a los resultados al usar los modos de filtrado "By Parent" y "By Child". Por ejemplo, el filtro LINQ anterior solo devuelve columnas, pero si tus opciones de visualización están configuradas para no mostrar columnas, no se mostrará nada. +En los modos «Por elemento principal» y «Por elemento secundario», las opciones de visualización y los botones de la barra de herramientas situados justo encima del árbol también filtran los resultados. Por ejemplo, el filtro anterior solo devuelve columnas, por lo que, si las opciones de visualización ocultan las columnas, el árbol no muestra nada. diff --git a/localizedContent/es/content/how-tos/deploy-current-model.md b/localizedContent/es/content/how-tos/deploy-current-model.md index ee6bf16ca..3ede710e0 100644 --- a/localizedContent/es/content/how-tos/deploy-current-model.md +++ b/localizedContent/es/content/how-tos/deploy-current-model.md @@ -2,7 +2,7 @@ uid: deploy-current-model title: Implementar el modelo cargado author: Morten Lønskov -updated: 2026-09-15 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -13,22 +13,24 @@ applies_to: # Implementar el modelo cargado -La implementación envía el modelo que tienes abierto a un servidor, ya sea creando una base de datos nueva o sobrescribiendo una existente. Así es como llevas a un servidor un modelo almacenado en un archivo `.bim` o en una carpeta, y cómo lo promocionas de un entorno a otro. +La implementación transfiere el modelo que tiene abierto a un servidor, ya sea creando una nueva base de datos o sobrescribiendo una existente. Es la forma de llevar un modelo almacenado en un archivo `.bim` o en una carpeta a un servidor, y de trasladar un modelo de un entorno a otro. -Abre el asistente desde **Model > Deploy...**, elige el servidor y la base de datos de destino y, después, decide qué parte del modelo quieres enviar. +Abra el asistente con **Modelo > Implementar...**, elija el servidor y la base de datos de destino y, a continuación, elija qué parte del modelo desea enviar. ## Qué controla cada opción -La utilidad del asistente está en lo que te permite _dejar intacto_ en el destino. Cada opción implica decidir si el destino conserva su propia versión de algo: +El valor del asistente reside en lo que te permite *dejar tal cual* en el destino. Cada opción es una decisión sobre si el destino mantiene su propia versión de algo: -- **Implementar la estructura del modelo** envía los metadatos del modelo. Esta es la implementación en sí; si la desmarcas, no queda nada por hacer. -- **Implementar Data sources** envía los Data sources explícitos. Desmárcala para que el destino conserve sus propias cadenas de conexión y credenciales, que suele ser lo que quieres al pasar de desarrollo a pruebas. -- **Implementar particiones de tabla** sincroniza las particiones con los metadatos del modelo. Desmárcala para dejar intactas las particiones existentes y los datos que contienen. Si está activada, las particiones del destino que no estén en el modelo se eliminan junto con sus datos. - - **Implementar particiones regidas por políticas de actualización incremental** aparece cuando la opción anterior está activada y te permite implementar todas las particiones _excepto_ las que genera una política de actualización incremental. -- **Implementar roles del modelo** envía los roles definidos en el modelo. Desmárcala para conservar los roles del destino tal como están. - - **Implementar miembros de roles del modelo** envía la asignación de miembros a los roles. Los miembros de los roles suelen administrarse en el servidor en lugar de en los metadatos, así que es normal desmarcar esta opción. +- **Implementar estructura del modelo** envía los metadatos del modelo. Esta es la implementación en sí; si se desmarca, no queda nada por hacer. +- **Implementar orígenes de datos** envía orígenes de datos explícitos. Desmárquela para conservar las cadenas de conexión y las credenciales propias del destino, que suele ser lo que se desea al pasar del entorno de desarrollo al de pruebas. +- **Implementar particiones de tabla** sincroniza las particiones con los metadatos del modelo. Desmárquela para dejar intactas las particiones existentes y los datos que contienen. Si está habilitada, las particiones del destino que no están en el modelo se eliminan junto con sus datos. + - **Implementar particiones regidas por directivas de actualización incremental** aparece cuando la opción anterior está habilitada y le permite implementar todas las particiones *excepto* las que genera una directiva de actualización incremental. +- **Implementar expresiones compartidas** envía las expresiones compartidas del modelo. Desmárquela para conservar las expresiones compartidas propias del destino. Esta opción está disponible en Tabular Editor 3. +- **Implementar roles de modelo** envía los roles definidos en el modelo. Desmárcala para mantener los roles del destino tal como están. + - **Implementar miembros de roles de modelo** envía la pertenencia a los roles. Los miembros de los roles suelen gestionarse en el servidor en lugar de en los metadatos, por lo que es normal desmarcar esta opción. +- **Implementar metadatos lingüísticos (sinónimos de preguntas y respuestas, instrucciones de IA y esquema de datos de IA)** envía los metadatos lingüísticos de cada cultura. Desmárquelo para conservar los sinónimos de preguntas y respuestas, las instrucciones de IA y el esquema de datos de IA configurados en el servicio Power BI. -@deployment cubre todo esto en detalle, junto con el script TMSL que genera el asistente, lo que una implementación hace con los datos que ya existen en el destino y cómo implementar desde la línea de comandos o desde un pipeline. +@deployment trata todo esto en detalle, junto con el script TMSL que genera el asistente, lo que hace una implementación con los datos que ya están en el destino y cómo implementar desde la línea de comandos o un «pipeline». > [!NOTE] -> Implementar no es lo mismo que guardar. Si abriste el modelo desde un servidor, **Archivo > Guardar** guarda los cambios en _esa_ base de datos, como se describe en @connect-ssas. Usa la implementación cuando el destino esté en otro lugar. +> Implementar no es lo mismo que guardar. Si ha abierto el modelo desde un servidor, **Archivo > Guardar** vuelve a escribir en *esa* base de datos, como se describe en @connect-ssas. Use la implementación cuando el destino esté en otro lugar. diff --git a/localizedContent/es/content/how-tos/drag-drop.md b/localizedContent/es/content/how-tos/drag-drop.md index 10bdbf9cc..a2b8fe35b 100644 --- a/localizedContent/es/content/how-tos/drag-drop.md +++ b/localizedContent/es/content/how-tos/drag-drop.md @@ -2,7 +2,7 @@ uid: drag-drop title: Arrastrar y soltar objetos author: Morten Lønskov -updated: 2026-09-15 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -13,86 +13,94 @@ applies_to: # Arrastrar y soltar objetos -Reorganiza un modelo en @tom-explorer-view, el mismo árbol que usas para explorarlo. Recoge los objetos donde los encuentres y suéltalos donde deban estar. No hay una superficie de modelado independiente a la que tengas que cambiar antes, y nada queda fuera de tu alcance solo porque la vista en la que estás no lo muestre. +Arrastrar y soltar en la @tom-explorer-view desplaza objetos entre carpetas de visualización, tablas, jerarquías, grupos de cálculos y grupos de tablas. Al arrastrar, siempre se mueve un objeto, y ninguna tecla modificadora lo convierte en una copia. Mientras arrastra, el cursor de movimiento indica dónde se puede soltar y el cursor de prohibición de soltar indica dónde no se puede. **Duplicar**, descrito en @duplicate-and-batch, copia un objeto. -La acción siempre es un movimiento. Tabular Editor muestra el cursor de movimiento cuando se permite soltar y el cursor de no permitido cuando no, y no hay ninguna tecla modificadora que convierta un arrastre en una copia. Para copiar un objeto, usa **Duplicar**; se describe en @duplicate-and-batch. +## Mover carpetas de visualización -## Reorganizar carpetas de visualización +Arrastre una carpeta de visualización a otra carpeta para moverla. Todos los objetos y subcarpetas que contiene se desplazan con ella, y se mantiene la estructura de subcarpetas. -Arrastra una carpeta de visualización y todos los objetos que contiene se moverán con ella, incluidas las subcarpetas anidadas, que conservan su estructura. Para eso existe esta función: reestructurar la organización de carpetas de un modelo grande pasa a ser una sola acción por carpeta en lugar de una edición por medida. + - +También puedes: -El resto de elementos del árbol se mueve del mismo modo: +- Seleccionar varios objetos con **Ctrl+clic** o **Mayús+clic** y arrastrarlos juntos. Puede combinar medidas, columnas, jerarquías y carpetas si están en la misma tabla. +- Soltar objetos en el nodo de la tabla para sacarlos de su carpeta y llevarlos al nivel superior de la tabla. +- Soltar una carpeta sobre otra carpeta para anidarla. No puedes soltar una carpeta en una de sus propias subcarpetas. -- Selecciona varios objetos con **Ctrl+clic** o **Mayús+clic** y arrástralos juntos. Puedes mezclar medidas, columnas, jerarquías y carpetas siempre que estén en la misma tabla. -- Suelta los objetos directamente sobre el **nodo de la tabla** para sacarlos de su carpeta y devolverlos al nivel superior de la tabla. -- Suelta una carpeta dentro de otra para anidarla. Tabular Editor no permite soltar una carpeta dentro de una de sus propias subcarpetas, así que no puedes perder una rama dentro de sí misma. +Cada vez que se suelta un elemento se cuenta como un paso de deshacer (**Ctrl+Z**), independientemente de cuántos objetos se muevan. -Cada acción de soltar cuenta como un único paso de **Editar > Deshacer**, sin importar cuántos objetos afecte. - -Las carpetas de visualización no son más que una propiedad de cadena de cada objeto, con `\\` separando los niveles; por ejemplo, `Sales\\Ratios` es la carpeta _Ratios_ dentro de _Sales_. Un objeto puede estar en más de una carpeta a la vez si separas las rutas con `;`. +Una carpeta de visualización es una propiedad de cadena de cada objeto, con `\` separando los niveles: `Sales\Ratios` es la carpeta Índices dentro de Ventas. Para mostrar un objeto en más de una carpeta, separe las rutas con `;`. ## Mover un objeto a otra tabla -Las medidas y las columnas calculadas se pueden arrastrar a otra tabla, ya sea al nodo de la tabla o directamente a una de sus carpetas de visualización. Ningún otro tipo de objeto puede pasar de una tabla a otra de este modo. +Arrastre medidas y columnas calculadas a otra tabla o, en Tabular Editor 3, a una carpeta de visualización de esa tabla para moverlas allí, lo que no es posible con otros tipos de objetos. -Qué incluye el objeto: +En Tabular Editor 3, el traslado conserva lo siguiente del objeto: -- **Traducciones** de su nombre y descripción. -- **Pertenencia a perspectivas.** De forma predeterminada, el objeto conserva las perspectivas en las que estaba. Marca _Heredar la pertenencia de tabla al pegar o mover un objeto a una tabla_ en **Herramientas > Preferencias > Tabular Editor** para que adopte en su lugar la pertenencia de la tabla de destino. -- **El KPI**, en el caso de una medida que lo tenga. -- **Indicadores de error y advertencia.** Una expresión que no era válida antes del movimiento sigue marcada como no válida después, en lugar de parecer correcta hasta que la vuelvas a editar. +- traducciones de su nombre y descripción +- la pertenencia a la perspectiva, a menos que seleccione **Heredar la pertenencia de la tabla cuando se pega/mueve un objeto a una tabla** en **Herramientas > Preferencias > Tabular Editor > Operaciones de modelado**, lo que otorga al objeto la pertenencia a la perspectiva de la tabla de destino +- KPI, para una medida que tenga uno +- los indicadores de error y advertencia, de modo que una expresión no válida siga marcada como no válida después del traslado > [!WARNING] -> Mover una **columna calculada** a otra tabla elimina los elementos que dependían de ella en su posición anterior. Se elimina cualquier relación en la que participe, se elimina cualquier nivel de jerarquía construido sobre ella, se quita de calendarios y variaciones, y se borra cualquier _Ordenar por columna_ que apunte a ella. No se te pedirá que lo confirmes. **Editar > Deshacer** restaura todo en un solo paso, así que comprueba el modelo antes de hacer nada más. +> Cuando mueve una columna calculada a otra tabla, no aparece ninguna confirmación y se modifican los siguientes elementos: +> +> - Se eliminan las relaciones que usan la columna. +> - Se eliminan los niveles de jerarquía basados en la columna. +> - Se quita la columna de los calendarios y las variaciones. +> - Se borran las referencias `SortByColumn` a la columna. +> +> Pulse **Ctrl+Z** para deshacer el traslado y todos estos cambios en un solo paso. -El DAX que hace referencia a la columna por su tabla anterior, como `'Reseller Sales'[Margin]`, no se reescribe y sigue apuntando a la tabla de la que salió la columna. Las referencias a medidas se escriben como `[Measure]` sin tabla, por lo que no se ven afectadas. Ejecuta @using-bpa o revisa @messages-view tras un movimiento para detectar qué se rompió. +El DAX que hace referencia a la columna por su tabla anterior, como `'Reseller Sales'[Margin]`, no se reescribe y sigue apuntando a la tabla que ha dejado la columna. Las referencias de medida se escriben como `[Measure]` sin una tabla, por lo que no se ven afectadas. Ejecute @using-bpa o consulte la @messages-view después de un traslado para detectar lo que se ha roto. En la vista de mensajes, desmarque **Mostrar errores en cascada** para mostrar solo las expresiones que necesita corregir. ## Crear jerarquías y ordenar elementos de cálculo -- Arrastra una o varias **columnas sobre una jerarquía** para agregarlas como niveles. Suéltalas entre dos niveles existentes para elegir la posición. Se rechaza una columna que ya sea un nivel de esa jerarquía. -- Arrastra los **niveles** dentro de una jerarquía para reordenarlos, o sobre otra jerarquía de la misma tabla para moverlos allí. -- Arrastra los **elementos de cálculo** para reordenarlos dentro de su grupo de cálculo, o sobre otro grupo de cálculo para moverlos. +- Arrastre una o más columnas a una jerarquía para añadirlas como niveles. Suéltelas entre dos niveles existentes para elegir la posición. No puedes añadir una columna que ya sea un nivel de esa jerarquía. +- Arrastre niveles dentro de una jerarquía para reordenarlos, o a otra jerarquía de la misma tabla para moverlos allí. +- Arrastre elementos de cálculo para reordenarlos en su grupo de cálculos o a otro grupo de cálculos para moverlos. ## Agrupar tablas -En Tabular Editor 3, puedes arrastrar una o varias tablas sobre un **grupo de tablas** para incluirlas en él. Si sueltas tablas sobre otra tabla, pasarán al grupo en el que esté esa tabla; así también es como se sacan tablas de un grupo: suéltalas sobre una tabla que no esté en ninguno. +> [!NOTE] +> Los grupos de tablas solo están disponibles en Tabular Editor 3. -Los grupos de tablas son una función práctica de Tabular Editor para organizar el árbol. Se almacenan como una anotación y no forman parte de los metadatos del modelo, por lo que no aparecen en Power BI ni en Analysis Services. +Arrastre una o más tablas a un grupo de tablas para moverlas a él, o a otra tabla para moverlas al grupo de esa tabla. Si se colocan tablas en una tabla que no está en un grupo, se eliminarán de su grupo. Los grupos de tablas organizan el Explorador TOM y se almacenan como una anotación, que Power BI y Analysis Services ignoran. ## Carpetas de visualización y traducciones -Al arrastrar, cambias la carpeta de visualización _de la traducción que estás viendo actualmente_ en el Explorador TOM, y solo esa. +Al arrastrar, la carpeta de visualización solo se cambia para la traducción seleccionada en el Explorador TOM: -- Si no hay ninguna traducción seleccionada, que es la opción predeterminada, al arrastrar se escribe la carpeta de visualización sin traducir. Los nombres traducidos de las carpetas de visualización se dejan exactamente como estaban, por lo que en esas configuraciones regionales los objetos permanecen en la carpeta anterior. -- Con una configuración regional seleccionada en la lista desplegable de traducción del Explorador TOM, al arrastrar se escribe la carpeta de visualización traducida de esa configuración regional y se deja intacta la carpeta sin traducir. +- Si no se ha seleccionado ninguna traducción (opción predeterminada), al arrastrar se cambia la carpeta de visualización no traducida. Las carpetas de visualización traducidas no se modifican, por lo que las vistas traducidas siguen mostrando los objetos de la carpeta anterior. +- Con una cultura seleccionada en el menú desplegable de traducción del Explorador TOM, al arrastrar se cambia la carpeta de visualización traducida de esa cultura y se deja sin cambios la carpeta de visualización no traducida. -Así que reorganizar carpetas en la vista predeterminada no arrastra las traducciones. Vuelve a sincronizar las traducciones en el @metadata-translation-editor, o ejecuta la regla integrada de Best Practice Analyzer para los objetos que tienen una carpeta de visualización pero no una carpeta de visualización traducida, cuya corrección copia el valor sin traducir en cada configuración regional. +Actualice las traducciones en el @metadata-translation-editor o con la corrección de la regla del Best Practice Analyzer [Traducir carpetas de visualización para todas las culturas](xref:kb.bpa-translate-display-folders), que copia el valor no traducido en todas las culturas. -Mover un objeto a otra tabla es la excepción: sus propias traducciones se conservan al moverlo. +## Qué se puede arrastrar y dónde se puede colocar -## Qué se puede arrastrar y adónde puede ir +| Arrastrar | Hacia | Resultado | +|---|---|---| +| Medidas, columnas, jerarquías, carpetas | Una carpeta de visualización de la misma tabla | Los objetos se desplazan a esa carpeta | +| Medidas, columnas, jerarquías, carpetas | El nodo de la tabla | Los objetos salen de su carpeta | +| Medidas, columnas calculadas | Otra tabla o una carpeta de esa tabla (carpeta: solo en Tabular Editor 3) | Los objetos se desplazan a esa tabla | +| Columnas | Una jerarquía o uno de sus niveles | Las columnas se añaden como niveles | +| Niveles | La misma jerarquía u otra de la tabla | Los niveles se reordenan o se desplazan | +| Elementos de cálculo | Su grupo u otro grupo de cálculo | Los elementos se reordenan o se mueven | +| Tablas (solo Tabular Editor 3) | Un grupo de tablas u otra tabla | Las tablas se desplazan a ese grupo | -| Arrastrar | En | Resultado | -| ---------------------------------------- | ---------------------------------------------- | -------------------------------------------- | -| Medidas, columnas, jerarquías y carpetas | Una carpeta de visualización en la misma tabla | Los objetos se mueven a esa carpeta | -| Lo mismo | El nodo de la tabla | Los objetos salen de su carpeta | -| Medidas y columnas calculadas | Otra tabla, o una carpeta dentro de ella | Los objetos se mueven a esa tabla | -| Columnas | Una jerarquía o uno de sus niveles | Las columnas se añaden como niveles | -| Niveles | La misma jerarquía, u otra de la misma tabla | Los niveles se reordenan o se mueven | -| Elementos de cálculo | Su grupo, u otro grupo de cálculo | Los elementos se reordenan o se mueven | -| Tablas | Un grupo de tablas o otra tabla | Las tablas pasan a formar parte de ese grupo | +Se aplican las siguientes limitaciones: -Las particiones, los roles, las perspectivas, las relaciones, los Data source y las expresiones compartidas no se pueden arrastrar. Los objetos eliminados desde el último guardado, que aparecen tachados en el árbol, tampoco se pueden arrastrar ni usar como destino para soltar. Los objetos solo aparecen donde el árbol está configurado para mostrarlos, así que tienes que activar las carpetas de visualización y los grupos de tablas en la barra de herramientas antes de poder soltarlos ahí. +- Las particiones, los roles, las perspectivas, las relaciones, las fuentes de datos y las expresiones compartidas no se pueden arrastrar. +- En Tabular Editor 3.27.0 y versiones posteriores, los objetos eliminados desde el último guardado se muestran tachados en el árbol y no se pueden arrastrar ni soltar sobre ellos. +- Las carpetas de visualización y los grupos de tablas solo aceptan soltar elementos mientras están activados en la barra de herramientas del Explorador TOM. -## Hacer lo mismo mediante un script +## Realizar los mismos cambios desde un script -Las carpetas de visualización son una propiedad, por lo que un script establece la cadena directamente. Usa `\\` en una cadena normal de C#, o una cadena literal: +Un script mueve objetos entre carpetas de visualización estableciendo la cadena `DisplayFolder`. Utilice `\\` en una cadena de C# normal o en una cadena literal: ```csharp Selected.Measures.SetDisplayFolder(@"Sales\Ratios"); @@ -100,25 +108,20 @@ Model.Tables["Sales"].Measures["Margin %"].DisplayFolder = @"Sales\Ratios"; Model.Tables["Sales"].Measures["Margin %"].TranslatedDisplayFolders["da-DK"] = @"Salg\Nøgletal"; ``` -Una medida se mueve entre tablas con `MoveTo`, que conserva sus indicadores de error exactamente igual que al arrastrarla: +`MoveTo` mueve una medida a otra tabla y conserva sus indicadores de error: ```csharp Model.Tables["Sales"].Measures["Margin %"].MoveTo(Model.Tables["Reseller Sales"]); ``` -Las columnas calculadas no tienen `MoveTo`. Usa la misma acción que usa el árbol: - -```csharp -var column = Model.Tables["Sales"].Columns["Margin"]; -column.Handler.Actions.MoveObject(column, Model.Tables["Reseller Sales"], false, null); -``` +La API de scripting no tiene ningún método para mover una columna calculada a otra tabla. En Tabular Editor 3, al establecer `TableGroup` se mueve una tabla a un grupo de tablas: `Model.Tables["Sales"].TableGroup = "Facts";`, en un script que ejecute como se describe en @csharp-scripts. -Los grupos de tablas también son una propiedad: `Model.Tables["Sales"].TableGroup = "Facts";`. Consulta @csharp-scripts para ver cómo ejecutar todo esto. +## Arrastrar a otras vistas -## Arrastrar en otras partes de la aplicación +También puede arrastrar objetos desde el Explorador TOM a: -El Explorador TOM es el único lugar donde, al arrastrar, se cambia la estructura del modelo, pero también sirve como origen de varias otras acciones de arrastrar y soltar: +- el editor DAX o C#, para insertar el nombre totalmente calificado del objeto. Consulte @dax-editor. +- un diagrama de modelo abierto, para agregarle tablas. En el diagrama, arrastre una columna a una columna de otra tabla para crear una relación. Consulte @diagram-view. +- una [cuadrícula dinámica](xref:pivot-grid), para agregar columnas, medidas o jerarquías como campos. -- Arrastra un objeto al editor de DAX o C# para insertar su nombre completo, en lugar de escribirlo. Consulta @dax-editor. -- Arrastra tablas desde el árbol hasta un diagrama de modelo abierto para agregarlas. Dentro del diagrama, arrastra una columna sobre una columna de otra tabla para crear una relación entre ambas. Consulta @diagram-view. -- Arrastra columnas, medidas o jerarquías a un Pivot Grid para agregarlas como campos. +El diagrama del modelo y la tabla dinámica solo están disponibles en Tabular Editor 3. diff --git a/localizedContent/es/content/how-tos/duplicate-batchrename.md b/localizedContent/es/content/how-tos/duplicate-batchrename.md index 627cb24a8..963963224 100644 --- a/localizedContent/es/content/how-tos/duplicate-batchrename.md +++ b/localizedContent/es/content/how-tos/duplicate-batchrename.md @@ -1,8 +1,8 @@ --- uid: duplicate-and-batch -title: Duplicación de objetos y cambio de nombre en lote +title: Duplicar objetos y cambiar nombre por lotes author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -11,12 +11,13 @@ applies_to: full: true --- -# Duplicar objetos y renombrar en lote +# Duplicar objetos y cambiar el nombre de lotes +El menú contextual que aparece al hacer clic con el botón derecho en el árbol del Explorador le permite duplicar medidas y columnas. Los objetos duplicados tendrán sus nombres con el sufijo «copia». Además, puedes realizar cambios de nombre por lotes seleccionando varios objetos y haciendo clic con el botón derecho en el árbol del explorador. -El menú contextual, accesible con clic derecho, del árbol del Explorador le permite duplicar medidas y columnas. Los objetos duplicados tendrán el sufijo "copy" al final del nombre. Además, puede realizar cambios de nombre en lote seleccionando varios objetos y haciendo clic con el botón derecho en el árbol del Explorador. +![Cuadro de diálogo para cambiar nombres por lotes](~/content/assets/images/getting-started-te-03.png) -![Cuadro de diálogo para renombrar en lote](~/content/assets/images/getting-started-te-03.png) +Puedes usar expresiones regulares para cambiar los nombres y, opcionalmente, elegir si también se deben cambiar los nombres de las traducciones. -Puede usar RegEx para renombrar y, opcionalmente, elegir si también desea renombrar las traducciones. +Un objeto duplicado conserva todos los indicadores de error y advertencia que tenía el original, por lo que una copia de un objeto con una expresión no válida se marca como no válida de inmediato. -Un objeto duplicado conserva los indicadores de error y advertencia del original, por lo que la copia de un objeto con una expresión no válida se marca como no válida de inmediato. \ No newline at end of file +Si el original se muestra en más de una carpeta de visualización, la copia aparece en todas ellas y se selecciona después de crearse. Esto también se aplica cuando copia y pega un objeto. diff --git a/localizedContent/es/content/how-tos/formula-fixup-dependencies.md b/localizedContent/es/content/how-tos/formula-fixup-dependencies.md index 84ab54571..71ae69e60 100644 --- a/localizedContent/es/content/how-tos/formula-fixup-dependencies.md +++ b/localizedContent/es/content/how-tos/formula-fixup-dependencies.md @@ -1,6 +1,8 @@ --- uid: formula-fix-up-dependencies -title: Corrección automática de fórmulas y dependencias de fórmulas +title: Corrección de fórmulas y dependencias de fórmulas +author: Morten Lønskov +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -9,10 +11,9 @@ applies_to: full: true --- -# Corrección automática de fórmulas y dependencias de fórmulas +# Corrección de fórmulas y dependencias de fórmulas +Tabular Editor analiza continuamente las expresiones DAX de todas las medidas, columnas calculadas y tablas calculadas del modelo y crea un árbol de dependencias de estos objetos. La *corrección de fórmulas* utiliza el árbol: cuando cambia el nombre de un objeto, actualiza las expresiones DAX que hacen referencia a él. Habilítela con **Corrección automática de fórmula DAX** en **Herramientas > Preferencias > Tabular Editor > Operaciones de modelado** (**Archivo > Preferencias** en Tabular Editor 2). -Tabular Editor analiza continuamente las expresiones DAX de todas las medidas, columnas calculadas y tablas calculadas de tu modelo para construir un árbol de dependencias de estos objetos. Este árbol de dependencias se utiliza para la funcionalidad de corrección automática de fórmulas, que se puede habilitar en **Herramientas > Preferencia** (**Archivo > Preferencia** en Tabular Editor 2). La Corrección automática de fórmulas actualiza la expresión DAX de cualquier medida, columna calculada o tabla calculada cada vez que se cambia el nombre de un objeto al que se hacía referencia en la expresión. +Haga clic derecho en un objeto del Explorador TOM y elija **Mostrar dependencias...** para ver su árbol de dependencias. -Para visualizar el árbol de dependencias, haz clic con el botón derecho en el objeto del árbol del explorador y selecciona "Mostrar dependencias..." - -![image](~/content/assets/images/formula-fixup-dependencies-01.png) \ No newline at end of file +![Cuadro de diálogo «Dependencias de objetos» que muestra los objetos de los que depende una medida](~/content/assets/images/formula-fixup-dependencies-01.png) \ No newline at end of file diff --git a/localizedContent/es/content/how-tos/load-save.md b/localizedContent/es/content/how-tos/load-save.md index 4ecdb521e..d43320255 100644 --- a/localizedContent/es/content/how-tos/load-save.md +++ b/localizedContent/es/content/how-tos/load-save.md @@ -2,7 +2,7 @@ uid: load-save-model title: Cargar y guardar metadatos del modelo author: Morten Lønskov -updated: 2026-09-23 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -11,70 +11,71 @@ applies_to: editions: - edition: Desktop none: true - note: "La Edición de escritorio no puede abrir ni guardar archivos de metadatos del modelo." + note: "Desktop Edition can't open or save model metadata files." - edition: Business full: true - edition: Enterprise full: true --- - # Cargar y guardar metadatos del modelo -Tabular Editor lee los metadatos del modelo desde un archivo, una carpeta o un servidor, los carga en memoria y luego los vuelve a escribir en la misma ubicación o en una nueva. +Tabular Editor lee los metadatos del modelo en la memoria desde un archivo, una carpeta o un servidor, y los vuelve a escribir en el mismo lugar o en uno nuevo. > [!NOTE] -> Los metadatos definen tablas, medidas y relaciones, pero no contienen datos, y al cargar un modelo no se cargan las filas de sus tablas. Consulta [Vista previa de tabla](xref:table-preview) y [Actualización avanzada](xref:advanced-refresh) para trabajar con datos. +> Los metadatos definen tablas, medidas y relaciones, pero no contienen datos, y al cargar un modelo no se cargan las filas de sus tablas. Consulte [Vista previa de tabla](xref:table-preview) y [Actualización avanzada](xref:advanced-refresh) para trabajar con datos. ## Cargar un modelo -![El menú Archivo con el submenú Abrir desplegado, que muestra "Modelo desde archivo", "Modelo desde BD", "Modelo desde carpeta", "Archivo" e "Importar desde YAML de Vista de métricas", junto con los comandos "Guardar", "Guardar como" y "Guardar en carpeta"](~/content/assets/images/file-menu-open.png) +![El menú Archivo con el submenú Abrir expandido, que muestra las opciones Modelo desde archivo, Modelo desde base de datos, Modelo desde carpeta, Archivo e Importar desde vista de métrica en formato YAML, junto con los comandos Guardar, Guardar como y Guardar en carpeta](~/content/assets/images/file-menu-open.png) -| Fuente | Comando | -| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Un archivo `Model.bim` o `.bim` | **Archivo > Abrir > Modelo desde archivo...** | -| Una estructura de carpetas, en formato JSON o [Tabular Model Definition Language (TMDL)](xref:tmdl) | **Archivo > Abrir > Modelo desde carpeta...** | -| Una base de datos XMLA de Analysis Services o Power BI | **Archivo > Abrir > Modelo desde BD...** (**Ctrl+Shift+O**) | -| Una instancia de Power BI Desktop en ejecución | **Archivo > Abrir > Modelo desde BD...**, o inicie Tabular Editor desde la cinta **Herramientas externas** de Power BI Desktop | +| Origen | Comando | +|---|---| +| Un archivo «Model.bim» o «.bim» | **Archivo > Abrir > Modelo desde archivo...** | +| Una estructura de carpetas, en formato JSON o en formato [Lenguaje de definición de modelo tabular (TMDL)](xref:tmdl) | **Archivo > Abrir > Modelo desde carpeta...** | +| Una base de datos XMLA de Analysis Services o de Power BI | **Archivo > Abrir > Modelo desde BD...** (**Ctrl+Mayús+O**) | +| Una instancia en ejecución de Power BI Desktop | **Archivo > Abrir > Modelo desde BD...**, o inicie Tabular Editor desde la cinta de opciones **Herramientas externas** de Power BI Desktop | -Un archivo `.bim` debe tener nivel de compatibilidad 1200 o posterior. Los niveles anteriores usan el formato antiguo basado en XML, que Tabular Editor no puede abrir. +Un archivo `.bim` debe tener un nivel de compatibilidad 1200 o superior. Los niveles anteriores utilizan el formato basado en XML más antiguo, que Tabular Editor no abre. -Para todo lo que Tabular Editor reconoce, incluidos los tipos de archivo compatibles que no son metadatos de modelo, consulta [Tipos de archivo compatibles](xref:supported-files). +Para conocer todo lo que Tabular Editor reconoce, incluidos los tipos de archivos compatibles que no son metadatos del modelo, consulte [Tipos de archivos compatibles](xref:supported-files). > [!TIP] -> **Archivo > Modelos tabulares recientes** reabre un modelo que tenías abierto anteriormente. +> **Archivo > Modelos tabulares recientes** vuelve a abrir un modelo que había abierto anteriormente. ## Guardar un modelo -**Archivo > Guardar** (**Ctrl+S**) vuelve a guardar el modelo en el lugar del que lo cargaste. Un modelo cargado desde un archivo se guarda de nuevo en ese archivo. Un modelo cargado desde una carpeta se guarda de nuevo en esa carpeta, en el formato que ya usa. Un modelo cargado desde una base de datos se implementa de nuevo en esa base de datos. +**Archivo > Guardar** (**Ctrl+S**) vuelve a escribir el modelo en el lugar desde donde lo cargó. Un modelo cargado desde un archivo vuelve a ese archivo. Un modelo cargado desde una carpeta vuelve a esa carpeta, en el formato que ya utiliza. Un modelo cargado desde una base de datos se implementa de nuevo en esa base de datos. -Para guardar un modelo en otro lugar o en otro formato: +Para guardar un modelo en otro lugar o en un formato diferente: -- **Archivo > Guardar como...** guarda los metadatos del modelo en un único archivo `.bim`. -- **Archivo > Guardar en carpeta...** guarda los metadatos del modelo como una [estructura de carpetas](xref:save-to-folder), en formato JSON o TMDL, según el modo de serialización de **Herramientas > Preferencias > Formatos de archivo > Guardar en carpeta**. +- **Archivo > Guardar como...** guarda los metadatos del modelo como un único archivo `.bim`. +- **Archivo > Guardar en carpeta...** guarda los metadatos del modelo como una [estructura de carpetas](xref:save-to-folder), en formato JSON o TMDL, según el modo de serialización establecido en **Herramientas > Preferencias > Formatos de archivo > Guardar en carpeta**. > [!IMPORTANT] -> Un modelo cargado desde una estructura de carpetas JSON heredada se guarda en ese mismo formato cuando usas **Archivo > Guardar**, aunque la **preferencia** esté configurada en TMDL. El formato solo cambia cuando usas **Archivo > Guardar en carpeta...**. Consulta [TMDL](xref:tmdl). +> Un modelo cargado desde una estructura de carpetas JSON heredada se guarda en ese mismo formato cuando usa **Archivo > Guardar**, incluso si sus preferencias indican TMDL. El formato solo cambia cuando usa **Archivo > Guardar en carpeta...**. Consulta [TMDL](xref:tmdl). -## Recargar +## Recarga -**Archivo > Recargar desde disco** descarta los cambios realizados desde el último guardado y vuelve a cargar los metadatos desde el origen. Si tienes cambios sin guardar, primero aparece el mensaje **¿Recargar los metadatos del modelo?**. La etiqueta del comando depende del origen del modelo: +**Archivo > Recargar desde disco** descarta los cambios realizados desde el último guardado y vuelve a cargar los metadatos desde el origen. Si tienes cambios sin guardar, primero aparecerá el mensaje «**¿Volver a cargar los metadatos del modelo?**». La etiqueta del comando depende del origen del modelo: -| Origen del modelo | Comando | -| ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Un archivo o una carpeta | **Recargar desde disco** | -| Un modelo en [modo del área de trabajo](xref:workspace-mode) | **Recargar desde disco**. El modelo se vuelve a cargar desde sus archivos y se vuelve a desplegar en la base de datos del Workspace. | -| Analysis Services o Power BI, fuera del modo del área de trabajo | **Recargar desde el servidor** | -| Ningún modelo cargado | **Recargar desde el origen**, deshabilitado | +| Origen del modelo | Comando | +|---|---| +| Un archivo o una carpeta | **Volver a cargar desde el disco** | +| Un modelo en [modo de espacio de trabajo](xref:workspace-mode) | **Volver a cargar desde el disco**. El modelo se vuelve a cargar a partir de sus archivos y se vuelve a implementar en la base de datos del área de trabajo. | +| Analysis Services o Power BI, fuera del modo de espacio de trabajo | **Volver a cargar desde el servidor** | +| No se cargó ningún modelo | **Volver a cargar desde el origen**, desactivado | En Tabular Editor 3.26 y versiones anteriores, y en Tabular Editor 2, el comando se llama **Archivo > Revertir**. -En Tabular Editor 3.27.0 y versiones posteriores, cuando un agente, un script o un `git pull` modifica los archivos de metadatos del modelo abierto, el modelo se vuelve a cargar, después de un aviso si tienes cambios sin guardar. Consulta [Recarga automática desde el disco](xref:auto-reload). +En Tabular Editor 3.27.0 y versiones posteriores, cuando un agente, un script o un «git pull» modifican los archivos de metadatos del modelo abierto, el modelo se vuelve a cargar, tras un aviso si tiene cambios sin guardar. Consulte [Recarga automática desde el disco](xref:auto-reload). + +Los documentos abiertos de consultas DAX y Pivot Grid permanecen abiertos durante una recarga manual o automática y se conectan al modelo recargado. > [!WARNING] -> Haz una copia de seguridad de los metadatos del modelo antes de permitir que cualquier herramienta escriba en ellos, incluido Tabular Editor. Guardar sobrescribe el origen, y la recarga no puede recuperar los cambios que ya hayas guardado. +> Haga una copia de seguridad de los metadatos de su modelo antes de permitir que ninguna herramienta escriba en ellos, incluido Tabular Editor. Al guardar se sobrescribe el origen, y la recarga no puede recuperar los cambios que ya haya guardado. -## Pasos a seguir +## Pasos siguientes -- Consulta [Guardar en carpeta](xref:save-to-folder) para conocer los formatos de carpeta y la configuración de serialización que determina cómo se divide un modelo entre archivos. -- [Habilitar el desarrollo en paralelo con Git y la opción Guardar en carpeta](xref:parallel-development) si más de una persona trabaja en el modelo. -- [Despliegue](xref:deployment) para escribir el modelo en un servidor de Analysis Services. +- [Guardar en carpeta](xref:save-to-folder) para conocer los formatos de carpeta y la configuración de serialización que controlan cómo se divide un modelo entre los archivos. +- [Habilitar el desarrollo paralelo mediante Git y Guardar en carpeta](xref:parallel-development) si más de una persona trabaja en el modelo. +- [Implementación](xref:deployment) para escribir el modelo en un servidor de Analysis Services. diff --git a/localizedContent/es/content/how-tos/perspectives-translations.md b/localizedContent/es/content/how-tos/perspectives-translations.md index 34640f461..1895d3a79 100644 --- a/localizedContent/es/content/how-tos/perspectives-translations.md +++ b/localizedContent/es/content/how-tos/perspectives-translations.md @@ -1,30 +1,30 @@ --- uid: perspectives-translations title: Perspectivas y traducciones +author: Morten Lønskov +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 full: true - product: Tabular Editor 3 full: true - note: Incluye editores dedicados para perspectivas y traducciones + note: Includes dedicated Perspective and Translation Editors --- # Trabajar con perspectivas y traducciones - -Puedes agregar o editar perspectivas y traducciones (configuraciones regionales) existentes haciendo clic en el nodo Modelo del árbol del Explorador y buscando las propiedades correspondientes en la parte inferior de la cuadrícula de propiedades. Como alternativa, cuando el árbol del Explorador [muestre todos los tipos de objeto](../features/hierarchical-display.md), puedes ver y editar perspectivas, configuraciones regionales y roles directamente en el árbol. +Puede añadir/editar perspectivas y traducciones (culturas) existentes haciendo clic en el nodo Modelo del árbol del explorador y localizando las propiedades pertinentes en la parte inferior de la cuadrícula de propiedades. Como alternativa, cuando tu árbol del Explorador [muestra todos los tipos de objetos](../features/hierarchical-display.md), puedes ver y editar perspectivas, culturas y roles directamente en el árbol. ![](~/content/assets/images/perspectives-translations-01.png) -Puedes duplicar una perspectiva, un rol o una traducción existente abriendo el menú con el botón derecho y seleccionando "Duplicar". Esto creará una copia exacta del objeto, que después puedes modificar según tus necesidades. - -Para ver las perspectivas y/o traducciones "en acción", usa las dos listas desplegables de la barra de herramientas, en la parte superior de la pantalla. Al elegir una perspectiva, se ocultarán todos los objetos que no estén incluidos en esa perspectiva, mientras que al elegir una traducción se mostrarán todos los objetos del árbol usando los nombres traducidos y las carpetas de visualización. Al pulsar F2 para cambiar los nombres de los objetos o las carpetas de visualización, o al arrastrar objetos dentro del árbol, los cambios solo se aplicarán a la traducción seleccionada. +Puede duplicar una perspectiva, un rol o una traducción existentes abriendo el menú contextual con el botón derecho del ratón y eligiendo «Duplicar». Esto creará una copia exacta del objeto, que luego podrá modificar según sus necesidades. -## Perspectivas/traducciones en el contexto de un objeto +Para ver las perspectivas o las traducciones «en acción», utiliza las dos listas desplegables de la barra de herramientas situada cerca de la parte superior de la pantalla. Al elegir una perspectiva, se ocultarán todos los objetos que no estén incluidos en esa perspectiva, mientras que al elegir una traducción se mostrarán todos los objetos del árbol utilizando los nombres traducidos y las carpetas de visualización. Al pulsar F2 para cambiar los nombres de los objetos/carpetas de visualización o al arrastrar objetos por el árbol, los cambios solo se aplicarán a la traducción seleccionada. -Cuando se seleccionen uno o más objetos en el árbol, encontrarás 4 colecciones de propiedades especiales en la cuadrícula de propiedades: +## Perspectivas/traducciones dentro del contexto del objeto +Cuando se seleccionan uno o más objetos en el árbol, encontrará 4 colecciones de propiedades especiales dentro de la cuadrícula de propiedades: -- **Títulos**, **Descripciones** y **Carpetas de visualización** muestran una lista de todas las configuraciones regionales del modelo y, para cada configuración regional, los nombres, descripciones y carpetas de visualización traducidos de los objetos seleccionados, respectivamente. -- **Perspectivas** muestra una lista de todas las perspectivas del modelo, indicando si los objetos seleccionados pertenecen o no a cada perspectiva. +* **Títulos**, **Descripciones** y **Carpetas de visualización** muestran una lista de todas las configuraciones regionales del modelo, con los nombres traducidos, las descripciones y las carpetas de visualización, respectivamente, de los objetos seleccionados para cada configuración regional. +* **Perspectivas** muestra una lista de todas las perspectivas del modelo, con una indicación de si los objetos seleccionados pertenecen o no a cada perspectiva. -Puedes usar estas colecciones en la cuadrícula de propiedades para cambiar las traducciones y la pertenencia a perspectivas de uno o más objetos a la vez. \ No newline at end of file +Puede utilizar estas colecciones en la cuadrícula de propiedades para cambiar las traducciones y las inclusiones de perspectivas de uno o más objetos a la vez. \ No newline at end of file diff --git a/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md b/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md index fd2197a96..71085823d 100644 --- a/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md +++ b/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md @@ -1,8 +1,8 @@ --- uid: semantic-bridge-rename-objects -title: Renombrar objetos en una Metric View +title: Cambiar el nombre de objetos en una vista de métrica author: Greg Baldini -updated: 2026-09-14 +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -17,21 +17,19 @@ applies_to: - edition: Enterprise full: true --- +# Cambiar el nombre de objetos en una vista de métrica -# Renombrar objetos en una Metric View - -Este procedimiento muestra cómo cambiar el nombre de un campo de una vista de métricas. -El mismo patrón se aplica a todas las colecciones de una vista de métricas: `Fields`, `Measures`, `Dimensions` y `Joins`. +Esta guía práctica muestra cómo cambiar el nombre de un campo de una vista de métrica, y el mismo patrón se aplica a todas las colecciones de una vista de métrica: «Campos», «Medidas», «Dimensiones» y «Uniones». > [!NOTE] -> Estos procedimientos están dirigidos a Tabular Editor 3.26.2 y versiones posteriores. -> Las versiones anteriores no admiten las funcionalidades de la vista de métricas v1.1 que se muestran aquí. +> Estas guías prácticas están dirigidas a Tabular Editor 3.26.2 y versiones posteriores, ya que las versiones anteriores no admiten las funciones de la vista de métricas v1.1 que se muestran aquí. +> Para cambiar el nombre «in situ», se necesita Tabular Editor 3.27.0 o una versión posterior. -[!INCLUDE [sample](includes/sample-metricview.md)] +[!INCLUDE [ejemplo](includes/sample-metricview.md)] ## Cambiar el nombre de un campo -Asigna la propiedad `Name` del objeto. Todo lo demás del objeto (su expresión, comentario, nombre para mostrar, sinónimos y formato) se mantiene sin cambios, y conserva su lugar en la colección. +Al asignar un valor a la propiedad `Name` del objeto, este se renombra y se conservan las demás propiedades del objeto (expresión, comentario, nombre para mostrar, sinónimos y formato), así como su posición en la colección. ```csharp {run id=rename setup=mv-sample after=none output=true} var view = SemanticBridge.MetricView.Model; @@ -59,25 +57,25 @@ Fields: Order Month ``` -El índice de nombres de la colección se actualiza con el objeto, de modo que se puede acceder al campo de inmediato con su nuevo nombre: +El índice de la colección se actualiza inmediatamente: ```csharp var field = view.Fields["Order Month"]; ``` -## Reglas +## Reglas de nomenclatura -- **Los nombres deben ser únicos dentro de su colección.** Si cambias el nombre de un campo por uno que ya usa otro campo, se produce una `ArgumentException` y no se modifica ni el objeto ni la colección. -- **La coincidencia de nombres no distingue entre mayúsculas y minúsculas**, de acuerdo con Databricks SQL. `view.Fields["ORDER MONTH"]` encuentra el campo cuyo nombre se cambió anteriormente. Aunque un cambio de nombre solo modifique las mayúsculas y minúsculas, sigue siendo útil, ya que actualiza el nombre almacenado. -- **El cambio de nombre se aplica al modelo de objetos en memoria.** Serializa la vista para escribirla. +- Los nombres deben ser únicos dentro de su colección. Si se cambia el nombre de un campo por un nombre que ya utiliza otro campo, se produce una excepción `ArgumentException` y el objeto y la colección permanecen sin cambios. +- La coincidencia de nombres no distingue entre mayúsculas y minúsculas, siguiendo Databricks SQL. `view.Fields["ORDER MONTH"]` encuentra el campo renombrado anteriormente, y un cambio de nombre solo por mayúsculas o minúsculas actualiza el nombre almacenado. +- El cambio de nombre modifica el modelo de objetos en la memoria. Serialice la vista para escribirla. -## Pasos a seguir +## Próximos pasos -- [Agregar objetos a una vista de métricas](xref:semantic-bridge-add-object) -- [Quitar objetos de una vista de métricas](xref:semantic-bridge-remove-object) -- [Serializar una vista de métricas a YAML](xref:semantic-bridge-serialize) +- [Añadir objetos a una vista de métrica](xref:semantic-bridge-add-object) +- [Quitar objetos de una vista de métrica](xref:semantic-bridge-remove-object) +- [Serializar una vista de métrica en formato YAML](xref:semantic-bridge-serialize) -## Ver también +## Véase también -- [Modelo de objetos de la Metric View](xref:semantic-bridge-metric-view-object-model) -- @validación de Metric View en Semantic Bridge +- [Modelo de objetos de vista de métrica](xref:semantic-bridge-metric-view-object-model) +- @semantic-bridge-metric-view-validation diff --git a/localizedContent/es/content/how-tos/toc.md b/localizedContent/es/content/how-tos/toc.md index fc5f726f3..baca0f897 100644 --- a/localizedContent/es/content/how-tos/toc.md +++ b/localizedContent/es/content/how-tos/toc.md @@ -1,81 +1,67 @@ # Secuencias de comandos y automatización - -## [Secuencias de comandos avanzadas](Advanced-Scripting.md) - -## [Objetos de referencia del script](script-reference-objects.md) - -# Gestión y despliegue de modelos - -## [Desplegar el modelo actual](deploy-current-model.md) - +## [Scripting avanzado](Advanced-Scripting.md) +## [Objetos de referencia de script](script-reference-objects.md) + +# Patrones de scripting +## [Navegar por la jerarquía de objetos TOM](scripting-navigate-tom-hierarchy.md) +## [Comprobar tipos de objetos](scripting-check-object-types.md) +## [Interfaces TOM clave](scripting-tom-interfaces.md) +## [Dynamic LINQ frente a C# LINQ](scripting-dynamic-linq-vs-csharp.md) +## [Filtrar y consultar objetos con LINQ](scripting-filter-query-linq.md) +## [Usar el objeto Selected](scripting-use-selected-object.md) +## [Trabajar con expresiones y propiedades de DAX](scripting-work-with-expressions.md) +## [Trabajar con dependencias](scripting-work-with-dependencies.md) +## [Trabajar con anotaciones y propiedades extendidas](scripting-work-with-annotations.md) +## [Trabajar con perspectivas y traducciones](scripting-perspectives-translations.md) +## [Agregar, clonar y eliminar objetos](scripting-add-clone-remove-objects.md) +## [Usar los ayudantes de la interfaz de usuario de scripts](scripting-ui-helpers.md) +## [Crear cuadros de diálogo WinForms personalizados en scripts](scripting-custom-winforms-dialogs.md) + +# Gestión e implementación de modelos +## [Implementar el modelo actual](deploy-current-model.md) ## [Conectarse a SSAS](connect-ssas.md) - -## [Cargar y guardar](load-save.md) - +## [Cargar y guardar metadatos del modelo](load-save.md) ## [Serialización de carpetas](folder-serialization.md) - ## [Patrón de modelo maestro](Master-model-pattern.md) - ## [Actualizar el nivel de compatibilidad](update-compatibility-level.md) +## [Cambiar el modo de compatibilidad](change-compatibility-mode.md) # Importación de datos y tablas - -## [Importar tablas (TE2)](Importing-Tables.md) - -## [Importar tablas desde Excel (TE2)](importing-tables-from-excel.md) - +## [Importación de tablas (TE2)](Importing-Tables.md) +## [Importación de tablas desde Excel (TE2)](importing-tables-from-excel.md) ## [Reemplazar tablas](replace-tables.md) # Organización y estructura del modelo - ## [Filtrado avanzado del árbol del explorador](Advanced-Filtering-of-the-Explorer-Tree.md) - ## [Arrastrar y soltar](drag-drop.md) - -## [Duplicar y cambiar el nombre en lote](duplicate-batchrename.md) - +## [Duplicar y cambiar nombre por lotes](duplicate-batchrename.md) ## [Editar propiedades](edit-properties.md) # Traducciones y perspectivas - ## [Importar/exportar traducciones](import-export-translations.md) - ## [Perspectivas y traducciones](perspectives-translations.md) -# Seguridad de datos y roles - +# Seguridad de los datos y roles ## [Roles y seguridad a nivel de filas](roles-rls.md) # Conectividad e integración - -## [Conectividad de Analysis Services mediante XMLA](xmla-as-connectivity.md) - -## [Solución alternativa para PBIX con XMLA en Power BI](powerbi-xmla-pbix-workaround.md) +## [Conectividad de XMLA Analysis Services](xmla-as-connectivity.md) +## [Solución alternativa para XMLA PBIX de Power BI](powerbi-xmla-pbix-workaround.md) # Mantenimiento del modelo - ## [Dependencias de corrección de fórmulas](formula-fixup-dependencies.md) - ## [Copia de seguridad de metadatos](metadata-backup.md) - ## [Deshacer y rehacer](undo-redo.md) # [Puente semántico](semantic-bridge-how-tos.md) - ## @semantic-bridge-load-inspect - +## @semantic-bridge-metric-view-import-from-file ## @semantic-bridge-import - ## @semantic-bridge-validate-default - ## @semantic-bridge-validate-simple-rules - ## @semantic-bridge-validate-contextual-rules - ## @semantic-bridge-add-object - ## @semantic-bridge-remove-object - ## @semantic-bridge-rename-objects - ## @semantic-bridge-serialize +## @semantic-bridge-metric-view-handle-failures diff --git a/localizedContent/es/content/kb/DR002.md b/localizedContent/es/content/kb/DR002.md index 02b9dce42..d3c03fd88 100644 --- a/localizedContent/es/content/kb/DR002.md +++ b/localizedContent/es/content/kb/DR002.md @@ -1,36 +1,33 @@ --- uid: DR002 -category: Acciones de código -sub-category: Legibilidad -title: Usa un agregador en lugar de un iterador +category: Code actions +sub-category: Readability +title: Usar agregador en lugar de iterador author: Daniel Otykier updated: 2025-01-06 --- -Acción de código `DR002` (Legibilidad) **Usa un agregador en lugar de un iterador** +Acción de código `DR002` (Legibilidad) **Usar agregador en lugar de iterador** ## Descripción -Usa una función agregadora en lugar de una función iteradora siempre que sea posible para simplificar el código. +Use una función de agregador en lugar de una función de iterador cuando sea posible, para simplificar el código. ### Ejemplo -Cambie: - +Cambiar: ```dax SUMX(Sales, Sales[Line Amount]) ``` - A: - ```dax SUM(Sales[Line Amount]) ``` ## ¿Por qué Tabular Editor sugiere esto? -Cuando solo necesitas agregar los valores de una sola columna, las funciones agregadoras ([`SUM`](https://dax.guide), [`MIN`](https://dax.guide), [`MAX`](https://dax.guide), etc.), usan una sintaxis más sencilla y concisa que sus funciones iteradoras equivalentes ([`SUMX`](https://dax.guide), [`MINX`](https://dax.guide), [`MAXX`](https://dax.guide), etc.) usan una sintaxis más sencilla y concisa que sus funciones iteradoras equivalentes ([`SUMX`](https://dax.guide), [`MINX`](https://dax.guide), [`MAXX`](https://dax.guide), etc.) y deberían preferirse para que el código sea más legible. +Cuando solo necesitas agregar los valores de una sola columna, las funciones agregadoras ([`SUM`](https://dax.guide), [`MIN`](https://dax.guide), [`MAX`](https://dax.guide), etc.) utilizan una sintaxis más sencilla y concisa que sus funciones iteradoras equivalentes ([`SUMX`](https://dax.guide), [`MINX`](https://dax.guide), [`MAXX`](https://dax.guide), etc.) y deben preferirse para que el código sea más legible. ## Relacionado con: -- [DR003 - Usa VALUES en lugar de SUMMARIZE](xref:DR003) \ No newline at end of file +- [DR003 - Usar VALUES en lugar de SUMMARIZE](xref:DR003) \ No newline at end of file diff --git a/localizedContent/es/content/references/downloads.md b/localizedContent/es/content/references/downloads.md index 8504cc39d..02263a465 100644 --- a/localizedContent/es/content/references/downloads.md +++ b/localizedContent/es/content/references/downloads.md @@ -1,8 +1,8 @@ ---- +--- uid: downloads title: Todas las descargas author: Daniel Otykier -updated: 2026-09-22 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -16,94 +16,107 @@ applies_to: - edition: Enterprise full: true --- +# Descargas de Tabular Editor 3 -# Descargas de Tabular Editor 3 - -Esta página ofrece instrucciones de descarga e instalación para Tabular Editor 3. +Esta página proporciona instrucciones de descarga e instalación de Tabular Editor 3. ## Última versión -Tabular Editor 3.27.0.0 (_[Notas de la versión](release-notes/3_27_0_0.md)_) se publica en dos compilaciones: una con .NET 10 y otra con .NET 8. Las dos compilaciones son _funcionalmente idénticas_ y se pueden instalar en paralelo. +Tabular Editor 3.27.1.1 (*[Notas de la versión](release-notes/3_27_1_1.md)*) se publica en dos compilaciones, una en .NET 10 y otra en .NET 8. Las dos compilaciones son *funcionalmente idénticas*. Al instalar una compilación, se reemplaza la otra; consulte [Cambiar entre los paquetes .NET 8 y .NET 10](xref:installation-activation-basic#switching-between-the-net-8-and-net-10-packages). ### En .NET 10 (recomendado) -Requiere el [Runtime de escritorio de .NET 10](https://dotnet.microsoft.com/download/dotnet/10.0). El instalador `.exe` te ofrece descargarlo e instalarlo; el `.zip` portátil es autónomo y no requiere ningún entorno de ejecución. +Requiere [.NET Desktop Runtime 10](https://dotnet.microsoft.com/download/dotnet/10.0). El instalador `.exe` le ofrece descargarlo e instalarlo por usted; el archivo `.zip` portátil es autónomo y no necesita ningún tiempo de ejecución. -- Descarga [Tabular Editor 3.27.0.0 (64 bits)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe) _(recomendado)_ -- Descarga [Tabular Editor 3.27.0.0 (ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) -- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) -- Versión MSI: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) +- Descargue [Tabular Editor 3.27.1.1 (64 bits)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) *(recomendado)* +- Descargar [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) +- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) +- Versión MSI: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) ### En .NET 8 -Para equipos que aún no pueden ejecutar el runtime de escritorio de .NET 10. Requiere el [Runtime de escritorio de .NET 8](https://dotnet.microsoft.com/download/dotnet/8.0). +Para equipos que aún no pueden ejecutar el tiempo de ejecución de escritorio de .NET 10. Requiere [.NET Desktop Runtime 8](https://dotnet.microsoft.com/download/dotnet/8.0). -- Descarga [Tabular Editor 3.27.0.0 (64 bits)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe) -- Descarga [Tabular Editor 3.27.0.0 (ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) -- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) -- Versión MSI: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) +- Descargar [Tabular Editor 3.27.1.1 (64 bits)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) +- Descargar [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) +- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) +- Versión MSI: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) > [!TIP] -> ¿No sabes cuál elegir? Elige el instalador x64 de .NET 10. Elige ARM64 solo en un PC basado en ARM, y elige .NET 8 solo si tu organización no puede instalar el runtime de escritorio de .NET 10. +> ¿No sabes cuál elegir? Elige el instalador de .NET 10 x64. Elige ARM64 solo en un PC basado en ARM y elige .NET 8 solo si tu organización no puede instalar el tiempo de ejecución de escritorio de .NET 10. -Consulta @system-requirements para ver la matriz completa y @release-history para ver las notas de la versión de esta y de todas las versiones anteriores. +Consulte @system-requirements para ver la matriz completa y @release-history para ver las notas de la versión de esta y de todas las versiones anteriores. ## Instrucciones de instalación 1. Descarga el archivo instalador .exe. -2. Ejecuta el instalador .exe. El asistente de instalación te guiará durante la instalación. -3. Para obtener instrucciones sobre cómo activar el producto o cambiar una clave de licencia, consulta nuestra [guía de inicio](xref:getting-started). +2. Ejecuta el instalador .exe. El asistente de instalación te guiará a través del proceso de instalación. +3. Para obtener instrucciones sobre cómo activar el producto o cambiar una clave de licencia, consulte nuestra [guía de introducción](xref:getting-started). -No es necesario desinstalar versiones anteriores al actualizar a una versión más reciente de Tabular Editor 3. +No es necesario eliminar las instalaciones anteriores al actualizar a una versión más reciente de Tabular Editor 3. ## Historial -- 2026-09-22 **Tabular Editor 3.27.0.0** (_[Notas de la versión](release-notes/3_27_0_0.md)_) - - .NET 10 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) +- 23-10-2026 **Tabular Editor 3.27.1.1** (*[Notas de la versión](release-notes/3_27_1_1.md)*) + - Instalador de .NET 10 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) + - .NET 10 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) + - Instalador de .NET 10 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) +- 15-10-2026 **Tabular Editor 3.27.1.0** (*[Notas de la versión](release-notes/3_27_1_0.md)*) + - Instalador de .NET 10 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) + - .NET 10 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) + - Instalador de .NET 10 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) +- 22-09-2026 **Tabular Editor 3.27.0.0** (*[Notas de la versión](release-notes/3_27_0_0.md)*) + - Instalador de .NET 10 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) - .NET 10 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) - - .NET 10 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) + - Instalador de .NET 10 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) -- 2026-07-10 **Tabular Editor 3.26.3** (_[Notas de la versión](release-notes/3_26_3.md)_) - - .NET 8: instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) - - .NET 8: versión portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) - - .NET 8: instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) -- 2026-06-25 **Tabular Editor 3.26.2** (_[Notas de la versión](release-notes/3_26_2.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) +- 10-07-2026 **Tabular Editor 3.26.3** (*[Notas de la versión](release-notes/3_26_3.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) +- 25-06-2026 **Tabular Editor 3.26.2** (*[Notas de la versión](release-notes/3_26_2.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) -- 2026-04-17 **Tabular Editor 3.26.1** (_[Notas de la versión](release-notes/3_26_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) -- 2026-03-25 **Tabular Editor 3.26.0** (_[Release notes](release-notes/3_26_0.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) -- 2026-03-02 **Tabular Editor 3.25.5** (_[Notas de la versión](release-notes/3_25_5.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) +- 17-04-2026 **Tabular Editor 3.26.1** (*[Notas de la versión](release-notes/3_26_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) +- 25-03-2026 **Tabular Editor 3.26.0** (*[Notas de la versión](release-notes/3_26_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) +- 02/03/2026 **Tabular Editor 3.25.5** (*[Notas de la versión](release-notes/3_25_5.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) -- 2026-02-11 **Tabular Editor 3.25.3** (_[Notas de la versión](release-notes/3_25_3.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) +- 11-02-2026 **Tabular Editor 3.25.3** (*[Notas de la versión](release-notes/3_25_3.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) -- 2025-11-11 **Tabular Editor 3.24.2** (_[Notas de la versión](release-notes/3_24_2.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) -- 2025-10-28 **Tabular Editor 3.24.0** (_[Notas de la versión](release-notes/3_24_0.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) -- 2025-09-15 **Tabular Editor 3.23.1** (_[Notas de la versión](release-notes/3_23_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) -- 2025-06-28 **Tabular Editor 3.22.1** (_[Notas de la versión](release-notes/3_22_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) +- 11-11-2025 **Tabular Editor 3.24.2** (*[Notas de la versión](release-notes/3_24_2.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) +- 28-10-2025 **Tabular Editor 3.24.0** (*[Notas de la versión](release-notes/3_24_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) +- 15-09-2025 **Tabular Editor 3.23.1** (*[Notas de la versión](release-notes/3_23_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) +- 28-06-2025 **Tabular Editor 3.22.1** (*[Notas de la versión](release-notes/3_22_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) -Para versiones anteriores, consulta el [historial completo de versiones](release-history.md). \ No newline at end of file +Para consultar versiones anteriores, consulte el [historial completo de versiones](release-history.md). \ No newline at end of file diff --git a/localizedContent/es/content/references/policies.md b/localizedContent/es/content/references/policies.md index ba0ece847..3798d0aa9 100644 --- a/localizedContent/es/content/references/policies.md +++ b/localizedContent/es/content/references/policies.md @@ -1,45 +1,45 @@ --- uid: policies -title: Directivas +title: Políticas author: Morten Lønskov -updated: 2026-10-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 partial: true - note: "Tabular Editor 2 solo lee la clave heredada del Registro y solo tiene en cuenta las directivas marcadas como TE2 más abajo." + note: "Tabular Editor 2 reads the legacy registry key only, and honors only the policies marked TE2 below." - product: Tabular Editor 3 editions: - edition: Desktop partial: true - note: "Solo directivas generales" + note: "General policies only" - edition: Business partial: true - note: "Solo directivas generales" + note: "General policies only" - edition: Enterprise full: true - - product: CLI de Tabular Editor + - product: Tabular Editor CLI partial: true - note: "En Windows, y solo para las directivas marcadas como CLI más abajo." + note: "On Windows, and only for the policies marked CLI below." --- # Directivas -Si administras Tabular Editor para una organización, puedes limitar sus funciones y configurar el Asistente de IA y el servidor MCP para tus usuarios mediante directivas de grupo. Define manualmente los valores en el Registro de Windows o usa las plantillas administrativas incluidas con Tabular Editor 3. +Si administras Tabular Editor para una organización, puedes limitar sus funciones y configurar el Asistente de IA y el servidor MCP en nombre de tus usuarios a través de la política de grupo. Establece los valores en el registro de Windows manualmente o utiliza las plantillas administrativas que se incluyen con Tabular Editor 3. -La mayoría de las directivas son directivas generales, disponibles en todas las ediciones de Tabular Editor 3. Las directivas que configuran el Asistente de IA y el servidor MCP requieren la [Edición Enterprise de Tabular Editor 3](xref:editions) y están marcadas como **Enterprise** más abajo. +La mayoría de las políticas son políticas generales, disponibles en todas las ediciones de Tabular Editor 3. Las políticas que configuran el Asistente de IA y el servidor MCP requieren [Tabular Editor 3 Edición Enterprise](xref:editions) y se indican a continuación con la etiqueta **Enterprise**. > [!NOTE] > Esta funcionalidad requiere las siguientes versiones de Tabular Editor: > -> - Tabular Editor [2.17.0](https://github.com/TabularEditor/TabularEditor/releases/tag/2.17.0) o posterior -> - Tabular Editor [3.3.5](https://github.com/TabularEditor/TabularEditor3/releases/tag/3.3.5) o posterior, para las directivas generales -> - Tabular Editor 3.27 o posterior, para las siguientes claves del Registro, para directivas aplicables a todo el equipo y para todas las directivas Enterprise -> - CLI de Tabular Editor 0.7 o posterior +> - Tabular Editor [2.17.0](https://github.com/TabularEditor/TabularEditor/releases/tag/2.17.0) o una versión posterior +> - Tabular Editor [3.3.5](https://github.com/TabularEditor/TabularEditor3/releases/tag/3.3.5) o una versión posterior, para las políticas generales +> - Tabular Editor 3.27 o una versión posterior, para las claves de registro que se indican a continuación, para las políticas de todo el equipo y para todas las políticas empresariales +> - Tabular Editor CLI 0.7 o posterior -## Claves del Registro +## Claves del registro -Las directivas se leen de seis claves, y la primera clave que define un valor es la que determina ese valor. Toda clave en `HKEY_LOCAL_MACHINE` tiene prioridad sobre cualquier clave en `HKEY_CURRENT_USER`, de modo que una directiva para todo el equipo establecida mediante Configuración del equipo no puede ser anulada por el usuario. Dentro de una misma rama del Registro, una clave específica del producto tiene prioridad sobre la clave compartida, que a su vez tiene prioridad sobre la clave heredada: +Las políticas se leen a partir de seis claves, y la primera clave que define un valor decide ese valor. Todas las claves bajo `HKEY_LOCAL_MACHINE` tienen prioridad sobre todas las claves bajo `HKEY_CURRENT_USER`, por lo que el usuario no puede anular una política para todo el equipo establecida a través de la Configuración del equipo. Dentro de un subárbol, una clave específica del producto tiene prioridad sobre la clave compartida, que a su vez tiene prioridad sobre la clave heredada: ``` HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3 @@ -50,202 +50,203 @@ HKEY_CURRENT_USER\Software\Policies\Tabular Editor ApS HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor ``` -- `Tabular Editor ApS\TE3` solo la lee Tabular Editor 3. La CLI de Tabular Editor lee `Tabular Editor ApS\TECLI` en su lugar; las otras cuatro claves son las mismas para ambos. -- `Tabular Editor ApS` es la clave compartida; la leen tanto Tabular Editor 3 como la CLI. -- `Kapacity\Tabular Editor` es la clave que usan las versiones anteriores. Se sigue leyendo, y es la única clave que lee Tabular Editor 2, así que establece ahí la directiva si debe aplicarse también a Tabular Editor 2. +- `Tabular Editor ApS\TE3` solo lo lee Tabular Editor 3. Tabular Editor CLI lee «Tabular Editor ApS\TECLI» en su lugar; las otras cuatro claves son las mismas para ambos. +- `Tabular Editor ApS` es la clave compartida, leída tanto por Tabular Editor 3 como por la CLI. +- `Kapacity\Tabular Editor` es la clave utilizada por las versiones anteriores. Sigue siendo leída y es la única clave que lee Tabular Editor 2, así que establezca también una política allí si también tiene que llegar a Tabular Editor 2. -La precedencia se aplica a cada valor por separado: un `DisableTelemetry` para todo el equipo con valor 0 anula un `DisableTelemetry` a nivel de usuario con valor 1, mientras que un `DisableCSharpScripts` establecido solo a nivel de usuario sigue aplicándose. -Los nombres de los valores no distinguen mayúsculas de minúsculas. +La prioridad se aplica a cada valor por separado: un valor «DisableTelemetry» de 0 para todo el equipo anula un valor «DisableTelemetry» de 1 por usuario, mientras que un valor «DisableCSharpScripts» establecido solo por usuario sigue aplicándose. +Los nombres de los valores no distinguen entre mayúsculas y minúsculas. ## Tipos de valores -| Tipo de configuración | Tipo de registro | Notas | -| ------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Directiva de activación/desactivación | `REG_DWORD` | Cualquier valor distinto de cero impone la directiva. `0` y la ausencia del valor significan, en ambos casos, que no se aplica. | -| Opción | `REG_SZ` | El nombre de la opción, por ejemplo, `Read`, tal como lo escribe la plantilla administrativa. También se acepta un `REG_DWORD` que contiene la posición de la opción en la lista. | -| Número | `REG_DWORD` | Lo que escribe la plantilla administrativa. También se acepta un `REG_SZ` que contiene el número. | -| Lista | `REG_MULTI_SZ` | Una entrada por línea. También se acepta un `REG_SZ` cuyas entradas estén separadas por puntos y coma. | -| Ruta, dirección o nombre | `REG_SZ` | | +| Tipo de ajuste | Tipo de registro | Notas | +|--|--|--| +| Política de activación/desactivación | `REG_DWORD` | Cualquier valor distinto de cero aplica la política. `0` y la ausencia del valor significan que no se aplica. | +| Opción | `REG_SZ` | El nombre de la opción, por ejemplo `Read`, que es lo que escribe la plantilla administrativa. También se acepta un `REG_DWORD` que contenga la posición de la opción en la lista. | +| Número | `REG_DWORD` | Lo que escribe la plantilla administrativa. También se acepta un `REG_SZ` que contenga el número. | +| Lista | `REG_MULTI_SZ` | Una entrada por línea. También se acepta un `REG_SZ` cuyas entradas estén separadas por punto y coma. | +| Ruta, dirección o nombre | `REG_SZ` | | -Tabular Editor lee los valores de directiva una sola vez, al iniciarse. El cambio surtirá efecto la próxima vez que inicies la aplicación. +Tabular Editor lee los valores de las políticas una sola vez, al iniciarse. Los cambios surtirán efecto la próxima vez que inicie la aplicación. -## Directivas generales +## Políticas generales -Para aplicar una de ellas, agrega un valor `REG_DWORD` con el nombre que aparece a continuación y asígnale un valor distinto de cero. La columna **Productos** muestra qué productos respetan la directiva: **TE3** es Tabular Editor 3, **CLI** es la CLI de Tabular Editor y **TE2** es Tabular Editor 2, que solo lee la clave heredada. +Para aplicar una de estas políticas, añada un valor `REG_DWORD` con el nombre que se indica a continuación y un valor distinto de cero. La columna **Productos** muestra qué productos cumplen la política: **TE3** es Tabular Editor 3, **CLI** es Tabular Editor CLI y **TE2** es Tabular Editor 2, que solo lee la clave heredada. -| Valor | Productos | Cuando se aplica... | -| ------------------------------ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| DisableUpdates | TE3, TE2 | Tabular Editor no comprobará si hay versiones más recientes disponibles en línea. Los usuarios tampoco pueden buscar actualizaciones manualmente. | -| DisableCSharpScripts | TE3, TE2 | Tabular Editor no permitirá a los usuarios crear ni ejecutar C# Scripts. | -| DisableMacros | TE3, TE2 | Tabular Editor no permitirá a los usuarios guardar ni ejecutar macros. Las macros almacenadas en la carpeta `%LocalAppData%` no se cargan al iniciar la aplicación. | -| DisableBpaDownload | TE3, CLI, TE2 | Las reglas de Best Practice Analyzer no se pueden descargar desde la web. Las reglas almacenadas localmente o junto con el modelo siguen funcionando. | -| DisableWebDaxFormatter | TE3, CLI, TE2 | El formateador de DAX que envía el código a daxformatter.com está deshabilitado. Tabular Editor 3 sigue ofreciendo su formateador integrado, que no envía nada a través de la red. | -| DisableErrorReports | TE3 | Los usuarios no pueden enviar Reports de errores o cierres inesperados al equipo de soporte de Tabular Editor. | -| DisableTelemetry | TE3, CLI | No se recopilan ni se envían datos de uso anónimos al equipo de soporte de Tabular Editor. | -| DisableDaxOptimizer | TE3 | La integración con el Optimizador de DAX no está disponible. | -| DisableDaxOptimizerUpload | TE3 | Los usuarios no pueden cargar archivos del Analizador VertiPaq mediante la integración con el Optimizador de DAX. Se aplica implícitamente cuando se aplica `DisableDaxOptimizer`. | -| RequireDaxOptimizerObfuscation | TE3 | Los usuarios no pueden cargar archivos del Analizador VertiPaq en texto sin formato mediante la integración con el Optimizador de DAX; solo se pueden cargar archivos ofuscados. Se aplica implícitamente cuando se aplica `DisableDaxOptimizer` o `DisableDaxOptimizerUpload`. | -| DisableDaxPackageManager | TE3 | El administrador de paquetes de DAX no está disponible. | -| DisableAi | TE3 | Toda la funcionalidad de IA está desactivada: el Asistente de IA, el servidor MCP y cualquier función basada en IA no están disponibles. No se carga nada relacionado con la IA al iniciar la aplicación y se borra cualquier configuración del proveedor almacenada, incluida la clave de la API. | -| DisableAiChat | TE3 | El panel de chat del Asistente de IA no está disponible. El resto de la funcionalidad de IA, incluido el servidor MCP, no se ve afectada. | -| DisableMcpServer | TE3 | El servidor MCP no está disponible, así que las herramientas de agentes externos no pueden conectarse a Tabular Editor 3. El chat del Asistente de IA no se ve afectado. | -| RequireMcpAccessToken | TE3 | Los clientes que se conecten al servidor MCP deben presentar el token de acceso que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**, y los usuarios no pueden desactivar ese requisito. | +|Valor|Productos|Cuando se aplica...| +|--|--|--| +| DisableUpdates | TE3, TE2 | Tabular Editor no comprobará si hay versiones más recientes disponibles en línea. Los usuarios tampoco pueden buscar actualizaciones manualmente. | +| DisableCSharpScripts | TE3, TE2 | Tabular Editor no permitirá a los usuarios crear ni ejecutar scripts de C#. | +| DisableMacros | TE3, TE2 | Tabular Editor no permitirá a los usuarios guardar ni ejecutar macros. Las macros almacenadas en la carpeta `%LocalAppData%` no se cargan cuando se inicia la aplicación. | +| DisableBpaDownload | TE3, CLI, TE2 | No se pueden descargar de la web las reglas del Best Practice Analyzer. Las reglas almacenadas localmente o junto al modelo siguen funcionando. | +| DisableWebDaxFormatter | TE3, CLI, TE2 | El formateador DAX que envía código a daxformatter.com está deshabilitado. Tabular Editor 3 sigue ofreciendo su formateador integrado, que no envía nada a través de la red. | +| DisableErrorReports | TE3 | Los usuarios no pueden enviar informes de errores o bloqueos al equipo de asistencia de Tabular Editor. | +| DisableTelemetry | TE3, CLI | No se recopilan ni se envían datos de uso anónimos al equipo de asistencia de Tabular Editor. | +| DisableDaxOptimizer | TE3 | La integración con DAX Optimizer no está disponible. | +| DisableDaxOptimizerUpload | TE3 | Los usuarios no pueden cargar archivos del Analizador VertiPaq a través de la integración con el Optimizador de DAX. Se aplica de forma implícita cuando se activa `DisableDaxOptimizer`. | +| RequireDaxOptimizerObfuscation | TE3 | Los usuarios no pueden cargar archivos del Analizador VertiPaq en texto plano a través de la integración con DAX Optimizer; solo se pueden cargar archivos ofuscados. Se aplica de forma implícita cuando se activa `DisableDaxOptimizer` o `DisableDaxOptimizerUpload`. | +| DisableDaxPackageManager | TE3 | El administrador de paquetes DAX no está disponible. | +| DisableAi | TE3 | Todas las funciones de IA están desactivadas: el Asistente de IA, el servidor MCP y todas las funciones basadas en IA no están disponibles, no se carga nada relacionado con la IA cuando se inicia la aplicación y se borra cualquier configuración de proveedor almacenada, incluida la clave de la API. | +| DisableAiChat | TE3 | El panel de chat del Asistente de IA no está disponible. Otras funcionalidades de IA, incluido el servidor MCP, no se ven afectadas. | +| DisableMcpServer | TE3 | El servidor MCP no está disponible, por lo que las herramientas de agentes externos no pueden conectarse a Tabular Editor 3. El chat del asistente de IA no se ve afectado. | +| RequireMcpAccessToken | TE3 | Los clientes que se conecten al servidor MCP deben presentar el token de acceso que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**, y los usuarios no pueden desactivar este requisito. | +| RequireNativeLibrarySignatureVerification | TE3 | Tabular Editor 3 verifica la firma Authenticode de las bibliotecas del editor de código, «Scintilla.dll» y «Lexilla.dll», antes de cargarlas. Si el equipo no puede validar la cadena de certificados del editor, los editores de código no se inician y Tabular Editor 3 se cierra. En el editor de directivas de grupo, esta directiva se denomina **Requerir la verificación de la firma de las bibliotecas de soporte del editor de código**. | -### En la CLI de TE +### En Tabular Editor CLI -La CLI de Tabular Editor respeta las directivas marcadas con **CLI** más arriba en Windows y lee las mismas claves en el mismo orden que Tabular Editor 3. También respeta `BlockUnsafeScripts` de las [directivas Enterprise](#scripts-and-macros) siguientes, para `te script`, `te macro run` y `te bpa run --fix`. +Tabular Editor CLI respeta las políticas marcadas como **CLI** más arriba, en Windows, leyendo las mismas claves en el mismo orden que Tabular Editor 3. También respeta `BlockUnsafeScripts` de las [políticas Enterprise](#scripts-and-macros) que se indican a continuación, para `te script`, `te macro run` y `te bpa run --fix`. -Una operación rechazada no pasa desapercibida. `te` indica la directiva que la rechazó y finaliza con un código distinto de cero, por lo que el paso de la canalización falla en lugar de aparentar que tuvo éxito sin haber hecho nada. +Una operación rechazada no pasa desapercibida. «te» indica la política que la ha rechazado y sale con un código distinto de cero, por lo que un paso del «pipeline» falla en lugar de parecer que se ha completado con éxito sin que se haya hecho nada. -La CLI no tiene ediciones, así que una directiva que requiere la Edición Enterprise de Tabular Editor 3 en la aplicación de escritorio se aplica igualmente en la CLI, sea cual sea la licencia que tenga el equipo. +La CLI no tiene ediciones, por lo que una política que requiere Tabular Editor 3 Edición Enterprise en la aplicación de escritorio simplemente la aplica la CLI, independientemente de la licencia que tenga el equipo. -## Directivas Enterprise +## Políticas Enterprise -Estas directivas determinan lo que puede hacer un C# Script y configuran el Asistente de IA y el servidor MCP. Todas requieren la Edición Enterprise de Tabular Editor 3 y deben colocarse en `Tabular Editor ApS\TE3`, excepto `BlockUnsafeScripts`, que también respeta la CLI de Tabular Editor y que, por tanto, debe ubicarse en la clave compartida `Tabular Editor ApS`. Colócalo en `TE3` o `TECLI` para que solo afecte a uno de los dos. +Estas políticas determinan lo que puede hacer un script de C# y configuran el Asistente de IA y el servidor MCP. Todas ellas requieren Tabular Editor 3 Edición Enterprise y pertenecen a `Tabular Editor ApS\TE3`, excepto `BlockUnsafeScripts`, que también respeta Tabular Editor CLI y que, por tanto, pertenece a la clave compartida `Tabular Editor ApS`. En su lugar, colócala bajo «TE3» o «TECLI» para que afecte solo a uno de los dos. ### Scripts y macros -| Valor | Tipo | Qué hace | -| ------------------ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| BlockUnsafeScripts | Activado/desactivado | Los C# Script y las macros solo se permiten si se mantienen dentro del modelo semántico. Un script que lea o escriba un archivo, acceda a la red, inicie otro programa, cargue código externo o envíe un comando directamente al servidor se rechaza antes de que se ejecute nada. | +|Valor|Tipo|Qué hace| +|--|--|--| +| BlockUnsafeScripts | Activado/desactivado | Los scripts y las macros de C# solo están permitidos cuando permanecen dentro del modelo semántico. Un script que lee o escribe un archivo, accede a la red, inicia otro programa, incorpora código externo o envía un comando directamente al servidor se rechaza antes de que se ejecute nada de eso. | -La restricción se aplica allí donde se ejecute un script: **Ejecutar script** y **Ejecutar con vista previa** en un documento de script, **Aplicar corrección** en el Best Practice Analyzer, el Asistente de IA, el servidor MCP, y `te script`, `te macro run` y `te bpa run --fix` en la línea de comandos. Un script rechazado no es un script fallido. Nada llega al modelo, la lista de errores permanece vacía y un cuadro de diálogo **Script no ejecutado** indica la directiva y lo que utilizó el script. +La restricción se aplica dondequiera que se ejecute un script: **Ejecutar script** y **Ejecutar con vista previa** en un documento de script, **Aplicar corrección** en Best Practice Analyzer, el Asistente de IA, el servidor MCP y `te script`, `te macro run` y `te bpa run --fix` en la línea de comandos. Un script rechazado no es un script fallido. Nada llega al modelo, la lista de errores permanece vacía y un cuadro de diálogo **Script no ejecutado** indica el nombre de la política y lo que usó el script. -Una macro que accede a recursos fuera del modelo se omite de todos los menús, para que no pueda ejecutarse por accidente. Sigue apareciendo la macro en **Ver > Macros** con la columna **Bloqueada** rellenada, y aún puede abrirse y editarse, para que pueda volver a ajustarse a la directiva en lugar de reescribirse desde cero. Guardar una macro de este tipo funciona e indica que se ha guardado, pero que no se ejecutará. +Una macro que se extiende fuera del modelo se omite en todos los menús, por lo que no se puede ejecutar por accidente. Sigue apareciendo en **Ver > Macros** con su columna **Bloqueada** rellenada, y aún se puede abrir y editar, de modo que se puede volver a incluir dentro de los límites en lugar de tener que reescribirla desde cero. El guardado de dicha macro se realiza correctamente y se indica que se ha guardado, pero que no se ejecutará. -Lo que cuenta como permanecer dentro del modelo se decide analizando el script compilado en lugar de buscar en su texto, por lo que también se rechazan las rutas indirectas a los mismos destinos: reflexión, árboles de expresiones, `Activator`, `AppDomain`, lectores XML o deserialización. Entre los [métodos auxiliares](xref:script-helper-methods) integrados, los tres que escriben fuera del modelo, `SaveFile`, `ExecuteCommand` y `Bpa.ExportCsv`, se consideran inseguros; los que solo leen, incluidos `ReadFile`, `ExecuteDax`, `EvaluateDax`, `ExecuteReader` y `ExportProperties`, no. Consulta [Directivas del administrador](xref:csharp-scripts#administrator-policies) para ver la misma regla desde la perspectiva del autor del script. +Lo que se considera que permanece dentro del modelo se decide analizando el script compilado en lugar de buscando en su texto, por lo que también se rechazan las rutas indirectas a los mismos lugares: reflexión, árboles de expresiones, `Activator`, `AppDomain`, lectores XML o deserialización. Entre los [métodos auxiliares](xref:script-helper-methods) integrados, los tres que escriben fuera del modelo, `SaveFile`, `ExecuteCommand` y `Bpa.ExportCsv`, se consideran inseguros; los que solo leen, incluidos `ReadFile`, `ExecuteDax`, `EvaluateDax`, `ExecuteReader` y `ExportProperties`, no se consideran inseguros. Consulte [Políticas de administrador](xref:csharp-scripts#administrator-policies) para ver la misma regla desde el punto de vista del autor del script. -En el Editor de directivas de grupo, esta se llama **Permitir solo scripts y macros que permanezcan dentro del modelo** y, como se escribe en la clave compartida, aparece directamente en **Plantillas administrativas > Tabular Editor** en lugar de en la subcarpeta **Tabular Editor 3**. +En el editor de directivas de grupo, esta opción se llama **Permitir únicamente secuencias de comandos y macros que se mantengan dentro del modelo** y, como se escribe en la clave compartida, se encuentra directamente bajo **Plantillas administrativas > Tabular Editor** en lugar de en la subcarpeta **Tabular Editor 3**. ### Límites de permisos -Cada uno de estos establece un límite máximo de acceso para el Asistente de IA y el servidor MCP a un tipo de recurso. Los valores aceptados son `Deny`, `Read` y `Write`, salvo para los datos del modelo, donde `Read` es el ajuste más alto con sentido. +Cada uno de estos establece un límite superior a lo que el Asistente de IA y el servidor MCP pueden alcanzar para un tipo de recurso. Los valores aceptados son «Denegar», «Leer» y «Escribir», excepto para los datos del modelo, donde «Leer» es el ajuste más alto con sentido. -Un límite fija el máximo que un usuario puede conceder: un permiso existente por encima del límite se reduce hasta él, la opción correspondiente en **Herramientas > Preferencias > Funciones de IA > Permisos** y en el cuadro de diálogo **Herramientas > Servidor MCP...** se muestra en modo de solo lectura, y el Asistente de IA deja de pedir permisos que no se le pueden conceder. Ninguna concesión de permisos prevalece sobre un límite: ni un permiso permanente, ni uno concedido para un solo modelo, ni uno concedido en una versión anterior. La elección del usuario se deja intacta en sus preferencias, por lo que vuelve a aplicarse si se quita la directiva. +Un límite restringe lo que un usuario puede conceder: un permiso existente que supere el límite se reduce a este, la opción correspondiente en **Herramientas > Preferencias > Funciones de IA > Permisos** y en el cuadro de diálogo **Herramientas > Servidor MCP...** se muestra como de solo lectura, y el Asistente de IA ya no solicita un permiso que no se le puede conceder. Ninguna concesión supera un límite: ni un permiso permanente, ni uno concedido para un solo modelo, ni uno concedido en una versión anterior. La propia elección del usuario se mantiene intacta en sus preferencias, por lo que vuelve a aplicarse si se elimina la directiva. -| Valor | Valores aceptados | Limita el acceso a... | -| ------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| MaxModelMetadataAccess | Deny, Read, Write | Los metadatos del modelo abierto: nombres de tablas, columnas y medidas, expresiones, descripciones, resultados de Best Practice Analyzer y estadísticas de VertiPaq. `Write` también permite al asistente ejecutar sus propios C# Scripts en el modelo. Con `Deny`, no se envía absolutamente nada sobre el modelo abierto: ni un resumen del modelo, ni un aviso de que el modelo ha cambiado, ni la selección actual. | -| MaxModelDataAccess | Deny, Read | Los valores de datos del modelo, es decir, los resultados de las consultas DAX. | -| MaxBpaAccess | Deny, Read, Write | Reglas del Best Practice Analyzer. `Read` permite enumerar las reglas y ejecutar el análisis; `Write` también permite agregar y modificar reglas. | -| MaxDocumentsAccess | Deny, Read, Write | Los documentos que el usuario tiene abiertos, como C# Scripts y consultas DAX. `Read` permite leer su contenido; `Write` además permite modificarlos. | -| MaxMacrosAccess | Deny, Read, Write | La biblioteca de macros del usuario. | -| McpMaxModelMetadataAccess | Deny, Read, Write | Los mismos cinco recursos, exclusivamente para el servidor MCP. | -| McpMaxModelDataAccess | Deny, Read | | -| McpMaxBpaAccess | Deny, Read, Write | | -| McpMaxDocumentsAccess | Denegar, Leer, Escribir | | -| McpMaxAccesoAMacros | Denegar, Leer, Escribir | | +|Valor|Valores aceptados|Limita el acceso a...| +|--|--|--| +| MaxModelMetadataAccess | Denegar, Leer, Escribir | Los metadatos del modelo abierto: nombres de tablas, columnas y medidas, expresiones, descripciones, resultados del Best Practice Analyzer y estadísticas de VertiPaq. «Write» también permite al asistente ejecutar sus propios scripts de C# en el modelo. Con «Denegar», no se envía nada en absoluto sobre el modelo abierto: ni el resumen del modelo, ni el aviso de que el modelo ha cambiado, ni la selección actual. | +| MaxModelDataAccess | Denegar, Leer | Valores de datos del modelo, es decir, los resultados de las consultas DAX. | +| MaxBpaAccess | Denegar, Leer, Escribir | Reglas del Best Practice Analyzer. `Read` permite listar las reglas y ejecutar el análisis; `Write` permite además añadir y modificar reglas. | +| MaxDocumentsAccess | Denegar, Leer, Escribir | Los documentos que el usuario tiene abiertos, como scripts de C# y consultas DAX. `Read` permite leer su contenido; `Write` permite además modificarlos. | +| MaxMacrosAccess | Denegar, Lectura, Escritura | La biblioteca de macros del usuario. | +| McpMaxModelMetadataAccess | Denegar, Lectura, Escritura | Los mismos cinco recursos, solo para el servidor MCP. | +| McpMaxModelDataAccess | Denegar, Leer | | +| McpMaxBpaAccess | Denegar, Lectura, Escritura | | +| McpMaxDocumentsAccess | Denegar, Lectura, Escritura | | +| McpMaxMacrosAccess | Denegar, Lectura, Escritura | | -Los cinco valores `McpMax...` se aplican únicamente al servidor MCP. Cuando no se establece uno de ellos, el servidor MCP hereda el límite `Max...` correspondiente. Solo pueden reducir ese límite, nunca aumentarlo, por lo que un agente desatendido nunca puede tener más permisos que el asistente interactivo. +Los cinco valores «McpMax...» se aplican únicamente al servidor MCP. Cuando uno de ellos no está establecido, el servidor MCP hereda el límite «Max...» correspondiente. Solo pueden reducir ese límite, nunca aumentarlo, por lo que a un agente desatendido nunca se le permite más que al asistente interactivo. ### Proveedor de IA -| Valor | Tipo | Valores aceptados | Qué hace | -| ---------------------- | --------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| AiProvider | Selección | None, OpenAI, Anthropic, AzureOpenAI, Custom | Restringe el Asistente de IA a un único proveedor. `None` desactiva el Asistente de IA; el servidor MCP no se ve afectado. | -| AiEndpoint | Dirección | | Fija el endpoint o la URL base a la que se envían las solicitudes, por ejemplo, un Gateway interno o un recurso de Azure OpenAI. | -| AiModel | Nombre | | Fija el modelo o el nombre de implementación de Azure OpenAI. El selector de modelos del panel de chat se sustituye por un indicador simple, por lo que los usuarios no pueden cambiar de modelo. | -| AiOrganizationId | Nombre | | Fija la organización de OpenAI a la que se facturan las solicitudes. | -| AiProjectId | Nombre | | Fija el proyecto de OpenAI al que se facturan las solicitudes. | -| AiAllowedProviders | Lista | Cualquiera de los nombres de los proveedores anteriores | Restringe qué proveedores pueden configurar los usuarios. Un proveedor establecido por `AiProvider` se permite tanto si figura en la lista como si no, y `None` siempre se ofrece; una lista de permitidos no sirve para evitar que un usuario desactive el asistente. | -| AiAllowedEndpointHosts | Lista | Nombres de host | Restringe a qué hosts puede apuntar un endpoint; por ejemplo, `Gateway.contoso.com` o `*.contoso.com`. | +|Valor|Tipo|Valores aceptados|Qué hace| +|--|--|--|--| +| AiProvider | Opción | None, OpenAI, Anthropic, AzureOpenAI, Custom | Vincula el Asistente de IA a un proveedor. `None` desactiva el asistente de IA; el servidor MCP no se ve afectado. | +| AiEndpoint | Dirección | | Bloquea el punto de conexión o la URL base a los que se envían las solicitudes, por ejemplo, una pasarela interna o un recurso de Azure OpenAI. | +| AiModel | Nombre | | Bloquea el modelo o el nombre de la implementación de Azure OpenAI. El selector de modelos del panel de chat se reemplaza por un indicador sencillo, por lo que los usuarios no pueden cambiar de modelo. | +| AiOrganizationId | Nombre | | Bloquea la organización de OpenAI a la que se facturan las solicitudes. | +| AiProjectId | Nombre | | Bloquea el proyecto de OpenAI al que se facturan las solicitudes. | +| AiAllowedProviders | Lista | Cualquiera de los nombres de proveedores anteriores | Restringe qué proveedores pueden configurar los usuarios. Se permite un proveedor establecido por `AiProvider` tanto si aparece en la lista como si no, y siempre se ofrece `None`. Una lista de elementos permitidos no es una forma de impedir que un usuario desactive el asistente. | +| AiAllowedEndpointHosts | Lista | Nombres de host | Restringe los hosts a los que puede apuntar un extremo, por ejemplo, «gateway.contoso.com» o «*.contoso.com». | -La configuración bloqueada aparece como de solo lectura en **Herramientas > Preferencias > Funciones de IA > Asistente de IA**, y el Asistente de IA usa la configuración bloqueada independientemente de lo que el usuario hubiera elegido antes. No se escribe nada en las preferencias del propio usuario, por lo que su proveedor, endpoint, modelo y clave API vuelven a aparecer si se quita la directiva. Las claves API nunca se distribuyen mediante directiva. +Los ajustes bloqueados aparecen como de solo lectura en **Herramientas > Preferencias > Funciones de IA > Asistente de IA**, y el Asistente de IA utiliza la configuración bloqueada, independientemente de lo que el usuario hubiera elegido antes. No se escribe nada en las propias preferencias del usuario, por lo que su proveedor, su punto de conexión, su modelo y su clave de API vuelven a aparecer si se elimina la política. Las claves de API nunca se distribuyen mediante directivas. -Los nombres de host solo se comparan con la parte de host de la URL del endpoint. La comparación no distingue entre mayúsculas y minúsculas y omite el puerto. Un `*.` inicial cubre los subdominios de un dominio, pero no el dominio en sí; por tanto, incluye ambos en la lista si necesitas los dos. La lista se aplica a todos los proveedores siempre que se establezca un endpoint, así que no se puede usar una sobrescritura de la URL base para eludirla. +Los nombres de host se comparan únicamente con la parte del host de la URL del punto de conexión. La coincidencia no distingue entre mayúsculas y minúsculas y no tiene en cuenta el puerto. Un «*.» inicial cubre los subdominios de un dominio, pero no el dominio en sí, así que enumera ambos si se desean los dos. La lista se aplica a todos los proveedores siempre que se establezca un punto de conexión, por lo que no se puede usar una anulación de la URL base para evitarla. -Se rechaza cualquier configuración que la directiva no permita, y el Asistente de IA indica qué regla la rechazó en lugar de enviar la solicitud: un proveedor que no esté en la lista de permitidos, un host del endpoint que no esté en la lista de hosts permitidos, un endpoint que no sea una URL válida cuando se aplique una lista de hosts permitidos, o un proveedor de Azure OpenAI o Custom bloqueado sin ningún endpoint. +Se rechaza cualquier configuración que la política no permita, y el Asistente de IA indica qué regla la ha rechazado en lugar de enviar la solicitud: un proveedor que no está en la lista de permitidos, un host de punto de conexión que no está en la lista de permitidos de hosts, un punto de conexión que no es una URL válida cuando se aplica una lista de permitidos de hosts, o un proveedor de Azure OpenAI o personalizado bloqueado que no tiene ningún punto de conexión. ### Instrucciones personalizadas -| Valor | Tipo | Qué hace | -| ----------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| AiCustomInstructionsPath | Ruta | Especifica una carpeta de Instrucciones personalizadas que el Asistente de IA carga para todos los usuarios, además de las que se incluyen con el producto. Se admite una ruta UNC a un recurso compartido de red de solo lectura. Si una instrucción de la organización y una instrucción del propio usuario comparten el mismo identificador, prevalece la de la organización. | -| DisableUserCustomInstructions | Activado/desactivado | El Asistente de IA ignora las Instrucciones personalizadas que el usuario haya colocado en su propia carpeta, y el botón que abre esa carpeta está desactivado. Las instrucciones incluidas con el producto, así como cualquier carpeta de la organización, siguen cargándose. | +|Valor|Tipo|Qué hace| +|--|--|--| +| AiCustomInstructionsPath | Ruta | Indica una carpeta de instrucciones personalizadas que el Asistente de IA carga para cada usuario, además de las que se incluyen con el producto. Se admite una ruta UNC a un recurso compartido de red de solo lectura. Cuando una instrucción de la organización y la propia instrucción de un usuario comparten el mismo identificador, prevalece la de la organización. | +| DisableUserCustomInstructions | Activado/desactivado | El Asistente de IA ignora las instrucciones personalizadas que el usuario ha colocado en su propia carpeta, y el botón que abre esa carpeta está desactivado. Las instrucciones que se incluyen con el producto y cualquier carpeta de la organización siguen cargándose. | ### Servidor MCP -| Valor | Tipo | Qué hace | -| ---------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| McpDisabledTools | Lista | Nombres de herramientas MCP que nunca se ofrecen a un cliente conectado. Las herramientas listadas no aparecen en la lista de herramientas del cliente y no se ejecutan, incluso si el cliente solicita alguna por su nombre. El chat de AI Assistant no se ve afectado. | -| McpPort | Número: de 1024 a 49151 | Fija el puerto en el que escucha el servidor MCP, de modo que se pueda compartir una única configuración de cliente en toda la organización. El valor predeterminado es 42100. El servidor solo escucha en la dirección de loopback. | +|Valor|Tipo|Qué hace| +|--|--|--| +| McpDisabledTools | Lista | Nombres de las herramientas MCP que nunca se ofrecen a un cliente conectado. Las herramientas enumeradas no aparecen en la lista de herramientas del cliente y no se ejecutan aunque un cliente solicite una por su nombre. El chat del asistente de IA no se ve afectado. | +| McpPort | Número, de 1024 a 49151 | Bloquea el puerto en el que escucha el servidor MCP, de modo que se pueda compartir una configuración de cliente en toda una organización. El valor predeterminado es 42100. El servidor solo escucha en la dirección de bucle invertido. | ### Registro de auditoría -Tabular Editor 3 mantiene un registro local de la actividad de AI Assistant y del servidor MCP: llamadas a herramientas, decisiones de permisos, configuración y sesiones del servidor. El texto de un prompt o de una respuesta nunca se registra. +Tabular Editor 3 mantiene un registro local de la actividad del Asistente de IA y del servidor MCP: llamadas a herramientas, decisiones sobre permisos, configuración y sesiones del servidor. El texto de una solicitud o de una respuesta nunca se registra. -El registro es una característica de la Edición Enterprise. En las licencias Enterprise, Consultancy y Trial, sí se guarda el registro, y **Abrir carpeta de auditoría** aparece en **Herramientas > Preferencia > Funciones de IA** y en el cuadro de diálogo **Herramientas > Servidor MCP...**. En las licencias Desktop y Business, y antes de activar una licencia, no se guarda nada, no se crea ninguna carpeta y no se muestra ninguno de los dos botones. Consulta @ai-audit-log. +El registro es una función de la Edición Enterprise. En las licencias Enterprise, Consultancy y Trial, se registra, y **Abrir carpeta de auditoría** aparece en **Herramientas > Preferencias > Funciones de IA** y en el cuadro de diálogo **Herramientas > Servidor MCP...**. En las ediciones Desktop y Business, y antes de activar una licencia, no se escribe nada, no se crea ninguna carpeta y no se muestra ninguno de los dos botones. Consulta @ai-audit-log. -| Valor | Tipo | Qué hace | -| ----------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| AiAuditLogPath | Ruta | Redirige el registro de auditoría para que pueda recopilarse de forma centralizada. Se admite una ruta UNC a un recurso compartido de red. Cuando la política no está configurada, el registro se escribe en `%LocalAppData%\TabularEditor3\AI\audit`, con un archivo `ai-audit-.jsonl` al día y los scripts registrados en `audit\scripts\`. | -| AiAuditLogRetentionDays | Número, de 0 a 3650 | Cuántos días conservar el registro de auditoría; los archivos más antiguos se eliminan. `0` lo conserva todo. El valor predeterminado es 30 días. | +|Valor|Tipo|Qué hace| +|--|--|--| +| AiAuditLogPath | Ruta | Redirige el registro de auditoría para que se pueda recopilar de forma centralizada. Se admite una ruta UNC a un recurso compartido de red. Cuando la directiva no está establecida, el registro se escribe en `%LocalAppData%\TabularEditor3\AI\audit`, un archivo `ai-audit-.jsonl` por día, con los scripts registrados en `audit\scripts\`. | +| AiAuditLogRetentionDays | Número, de 0 a 3650 | Número de días del registro de auditoría que se conservarán; los archivos más antiguos se eliminan. «0» conserva todo. El valor predeterminado es 30 días. | -## Qué ocurre sin la Edición Enterprise +## Qué sucede sin la Edición Enterprise -Las políticas Enterprise nunca se ignoran sin avisar. Si se configura cualquiera de los valores de las tablas Enterprise anteriores —aunque sea uno que Tabular Editor no pueda interpretar— y la copia instalada de Tabular Editor 3 no tiene licencia para la Edición Enterprise, el Asistente de IA y el servidor MCP se niegan a iniciarse, y el Asistente de IA muestra un Report indicando que tu organización ha configurado políticas de IA que requieren la Edición Enterprise de Tabular Editor 3, e identifica los valores en cuestión. Todo lo demás en Tabular Editor 3 sigue funcionando, y las políticas generales anteriores se siguen aplicando. +Las políticas de la Edición Enterprise nunca se ignoran sin más. Si se establece alguno de los valores de las tablas Enterprise anteriores (aunque Tabular Editor no pueda interpretar ni siquiera uno) y la copia instalada de Tabular Editor 3 no tiene licencia para la edición Enterprise, el Asistente de IA y el servidor MCP se negarán a iniciarse, y el Asistente de IA informará de que tu organización ha configurado políticas de IA que requieren Tabular Editor 3 Edición Enterprise, indicando los valores en cuestión. Todo lo demás en Tabular Editor 3 sigue funcionando, y las políticas generales anteriores siguen aplicándose. -Las políticas Enterprise también fallan en modo cerrado cuando no se puede interpretar un valor. Un límite de permisos mal escrito deniega el recurso en lugar de leerse como "sin límite", y un nombre de proveedor que Tabular Editor no reconoce hace que el Asistente de IA no esté disponible en lugar de recurrir a la propia elección del usuario. +Las políticas Enterprise también fallan de forma cerrada cuando no se puede interpretar un valor. Un límite de permisos mal escrito deniega el recurso en lugar de interpretarse como «sin límite», y un nombre de proveedor que Tabular Editor no reconozca hace que el Asistente de IA no esté disponible en lugar de recurrir a la propia elección del usuario. -`BlockUnsafeScripts` falla en modo cerrado de la misma manera, y conviene saber exactamente cómo, porque afecta a más que solo las funciones de IA. En una copia sin licencia para la Edición Enterprise, la mera presencia del valor impide la ejecución de **todos** los scripts y macros, sean seguros o no, con mensajes que indican la edición requerida; las macros desaparecen de los menús hasta que se activa una licencia Enterprise y vuelven a aparecer sin necesidad de reiniciar. Un valor que el lector no puede interpretar aplica la restricción en lugar de levantarla. Un `0` explícito no la aplica, pero sigue contando como configurado, así que también sitúa las funciones de IA tras la barrera de Enterprise. +`BlockUnsafeScripts` falla de forma cerrada de la misma manera, y vale la pena saber exactamente cómo, porque va más allá de las superficies de la IA. En una copia que no tiene licencia para la edición Enterprise, la presencia del valor impide que se ejecute **ningún** script ni macro, sean seguros o no, y se muestra un mensaje en el que se indica la edición necesaria; las macros desaparecen de los menús hasta que se activa una licencia Enterprise, momento en el que vuelven a aparecer sin necesidad de reiniciar. Un valor que el lector no puede interpretar aplica la restricción en lugar de eliminarla. Un «0» explícito no la aplica, pero sigue contando como configurado, por lo que también deja las superficies de IA detrás de la barrera de Enterprise. -Para desactivar toda la funcionalidad de IA sin una licencia Enterprise, usa la política general `DisableAi`. +Para desactivar todas las funciones de IA sin una licencia Enterprise, use la política general «DisableAi». -## Ver qué políticas están en vigor +## Ver qué políticas están vigentes -Abre **Herramientas > Preferencias > Tabular Editor > Actualizaciones y comentarios**. Cuando hay alguna política configurada, una sección **Administrado por tu organización** enumera todos los valores que encontró Tabular Editor, el propio valor y la clave y colmena del Registro de la que procede. Un valor que Tabular Editor no pudo interpretar se marca como _(no válido)_, lo que es la forma más rápida de encontrar un error tipográfico en una política que parece no tener efecto. +Abra **Herramientas > Preferencias > Tabular Editor > Actualizaciones y comentarios**. Cuando se establece cualquier política, la sección **Gestionado por su organización** enumera todos los valores que Tabular Editor ha encontrado, el valor en sí y la clave de registro y el subárbol de registro de los que procede. Los valores que Tabular Editor no ha podido interpretar se marcan como *(no válido)*, lo cual es la forma más rápida de encontrar una errata en una política que parece no tener ningún efecto. -Los controles que una política haya bloqueado o limitado en otras partes de **Preferencias**, y en el cuadro de diálogo **Herramientas > Servidor MCP...**, se muestran como de solo lectura y llevan un mensaje emergente que indica que la configuración está controlada por la política de tu organización. +Los controles que una política ha bloqueado o limitado en otros lugares de **Preferencias** y en el cuadro de diálogo **Herramientas > Servidor MCP...** se muestran como de solo lectura y llevan una información sobre herramientas que indica que la configuración está controlada por la política de su organización. ## Uso de las plantillas administrativas -Tabular Editor 3.27 y versiones posteriores instalan un par de plantillas administrativas de Directiva de Grupo, de modo que las políticas anteriores pueden configurarse desde el editor de Directiva de Grupo en lugar de editar el Registro. Las encontrarás en la carpeta `Policies` de la carpeta de instalación, que de forma predeterminada es `C:\Program Files\Tabular Editor 3\Policies`: +Tabular Editor 3.27 y versiones posteriores instalan un par de plantillas administrativas de directivas de grupo, de modo que las directivas anteriores se pueden configurar desde el editor de directivas de grupo en lugar de editando el registro. Las encontrarás en la carpeta «Policies» de la carpeta de instalación, que por defecto es «C:\Program Files\Tabular Editor 3\Policies»: - `TabularEditorApS.admx` - `en-US\TabularEditorApS.adml` -Para usarlos en un único equipo, copia ambos archivos en `%SystemRoot%\PolicyDefinitions`, manteniendo la estructura de carpetas `en-US`: +Para usarlas en un solo equipo, copie ambos archivos en `%SystemRoot%\PolicyDefinitions`, manteniendo la estructura de carpetas `en-US`: ``` C:\Windows\PolicyDefinitions\TabularEditorApS.admx C:\Windows\PolicyDefinitions\en-US\TabularEditorApS.adml ``` -Para usarlos en todo un dominio, cópialos en el almacén central de un controlador de dominio, manteniendo la misma estructura: +Para usarlos en un dominio, cópielos en el almacén central de un controlador de dominio, manteniendo la misma estructura: ``` \\\SYSVOL\\Policies\PolicyDefinitions\TabularEditorApS.admx \\\SYSVOL\\Policies\PolicyDefinitions\en-US\TabularEditorApS.adml ``` -A continuación, abre el Editor de directivas de grupo local (`gpedit.msc`) o el Editor de administración de directivas de grupo y busca en: +A continuación, abra el Editor de directivas de grupo local (`gpedit.msc`) o el Editor de administración de directivas de grupo y busque en: -- **Configuración del equipo > Plantillas administrativas > Tabular Editor** para directivas de todo el equipo -- **Configuración de usuario > Plantillas administrativas > Tabular Editor** para directivas por usuario +- **Configuración del equipo > Plantillas administrativas > Tabular Editor** para las políticas de todo el equipo +- **Configuración del usuario > Plantillas administrativas > Tabular Editor** para las políticas por usuario -Las directivas compartidas por Tabular Editor 3 y la CLI se encuentran directamente bajo **Tabular Editor**. Las directivas que aplica exclusivamente Tabular Editor 3 están en **Tabular Editor > Tabular Editor 3**; el Asistente de IA, el servidor MCP y la integración con el Optimizador de DAX tienen cada uno su propia subcarpeta. +Las políticas compartidas por Tabular Editor 3 y la CLI se encuentran directamente bajo **Tabular Editor**. Las políticas que solo aplica Tabular Editor 3 se encuentran en **Tabular Editor > Tabular Editor 3**, con el Asistente de IA, el servidor MCP y la integración de DAX Optimizer en sus propias subcarpetas. -Al establecer una directiva en **Habilitada** se escribe su valor en el Registro. Establecerla en **Deshabilitada** o dejarla en **No configurada** significa que la directiva no se aplica. Las plantillas no escriben en la clave heredada `Kapacity\Tabular Editor`, así que establece esa clave manualmente si una directiva también debe aplicarse a Tabular Editor 2. +Al establecer una política como **Habilitada**, se escribe su valor de registro. Establecerla en **Deshabilitada** o dejarla en **No configurada** significa que la directiva no se aplica. Las plantillas no escriben en la clave heredada «Kapacity\Tabular Editor», por lo que debe establecer esa clave manualmente si una política también tiene que llegar a Tabular Editor 2. -Para las directivas de Enterprise, **Deshabilitada** elimina el valor del Registro en lugar de escribir un `0`. Eso es intencionado: la mera presencia de un valor de Enterprise es lo que hace que el Asistente de IA y el servidor MCP queden sujetos a la comprobación de licencia Enterprise, así que una directiva que un administrador acaba de desactivar no debe dejar ningún valor residual. +En el caso de las políticas Enterprise, **Desactivada** elimina el valor del registro en lugar de escribir un «0». Esto es deliberado: el mero hecho de que exista un valor Enterprise es lo que hace que el Asistente de IA y el servidor MCP dependan de la comprobación de la licencia Enterprise, por lo que una política que un administrador acabe de desactivar no debe dejar ningún valor. -## Deshabilitar las comunicaciones web +## Desactivación de las comunicaciones web -Si quieres asegurarte de que Tabular Editor no realice solicitudes web, especifica las directivas `DisableUpdates`, `DisableBpaDownload`, `DisableWebDaxFormatter`, `DisableErrorReports`, `DisableTelemetry`, `DisableDaxOptimizer`, `DisableDaxPackageManager` y `DisableAi`. +Si desea asegurarse de que Tabular Editor no realice solicitudes web, especifique las políticas `DisableUpdates`, `DisableBpaDownload`, `DisableWebDaxFormatter`, `DisableErrorReports`, `DisableTelemetry`, `DisableDaxOptimizer`, `DisableDaxPackageManager` y `DisableAi`. > [!NOTE] -> Incluso cuando se especifican las políticas anteriores, Tabular Editor 3 seguirá realizando solicitudes ocasionales a `https://api.tabulareditor.com` para validar la licencia. Si Tabular Editor 3 no puede acceder a este endpoint (debido a un cortafuegos o un proxy), el usuario tendrá que [activar manualmente](xref:installation-activation-basic#manual-activation-no-internet) el producto cada 30 días. +> Incluso cuando se especifican las políticas anteriores, Tabular Editor 3 seguirá realizando solicitudes ocasionales a `https://api.tabulareditor.com` con fines de validación de la licencia. Si Tabular Editor 3 no puede acceder a este punto de conexión (debido a un cortafuegos o un proxy), el usuario tendrá que [activar manualmente](xref:installation-activation-basic#manual-activation-no-internet) el producto cada 30 días. -## Deshabilitar los scripts personalizados +## Desactivación de scripts personalizados -Si quieres asegurarte de que Tabular Editor no permita a los usuarios ejecutar código arbitrario, especifica las políticas `DisableCSharpScripts` y `DisableMacros` para deshabilitar las macros. +Si desea asegurarse de que Tabular Editor no permita a los usuarios ejecutar código arbitrario, especifique las políticas `DisableCSharpScripts` y `DisableMacros`. -Si tu organización quiere seguir usando scripts, pero no a costa de permitir que cualquier script acceda al sistema de archivos, a la red o a otro programa, usa `BlockUnsafeScripts` en su lugar. Los scripts y las macros siguen funcionando sobre el modelo, y solo se rechazan las partes que intentan salir de él. Esa directiva requiere la Edición Enterprise; las dos anteriores se aplican en todas las ediciones. +Si su organización desea conservar los scripts, pero no a costa de permitir que cualquier script acceda al sistema de archivos, a la red o a otro programa, utilice `BlockUnsafeScripts` en su lugar. Los scripts y las macros siguen funcionando con el modelo, y solo se rechazan las partes que salen de él. Esa política requiere la Edición Enterprise; las dos anteriores se aplican en todas las ediciones. -## Deshabilitar las funciones de IA +## Desactivar las funciones de IA -Si quieres impedir toda la funcionalidad de IA, especifica la directiva `DisableAi`. Esto evita que se cargue al inicio cualquier componente relacionado con la IA y borra cualquier configuración de clave de API almacenada previamente. Se aplica en todas las ediciones y no requiere una licencia Enterprise. +Si desea impedir todas las funcionalidades de IA, especifique la política `DisableAi`. Esto evita que se cargue nada relacionado con la IA al iniciar el programa y elimina cualquier configuración de clave de API almacenada. Se aplica en todas las ediciones y no requiere licencia Enterprise. -A partir de la versión 3.27.0, el instalador también lee la directiva desde las seis claves, respetando el mismo orden de precedencia. Una instalación nueva no incluye el componente de IA, y una actualización lo elimina de cualquier equipo que lo tenga instalado. Una instalación existente conserva los archivos de IA hasta la siguiente actualización, y Tabular Editor 3 no los carga mientras la directiva esté establecida. Establece el valor como un `REG_DWORD` de `1`: el instalador interpreta `1` como _desactivar_ y cualquier otro valor presente como _no desactivado_, mientras que la aplicación acepta cualquier número distinto de cero. Consulta [Hacer cumplir la decisión con la directiva DisableAi](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy) para implementar conjuntamente la selección de características y la directiva. +A partir de la versión 3.27.0, el instalador también lee la política, a partir de las seis claves y con la misma prioridad. Una nueva instalación deja fuera el componente de IA, y una actualización lo elimina de un equipo que lo tenga. Una instalación existente conserva los archivos de IA hasta la siguiente actualización, y Tabular Editor 3 no los carga mientras la política esté establecida. Establezca el valor como un `REG_DWORD` de `1`: el instalador trata el `1` como *deshabilitado* y cualquier otro valor presente como *no deshabilitado*, donde la aplicación acepta cualquier número distinto de cero. Consulte [Aplicar la decisión con la directiva DisableAi](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy) para implementar la selección de funciones y la directiva conjuntamente. -Para mantener disponible AI Assistant, pero limitar lo que puede hacer, usa en su lugar las políticas Enterprise anteriores: ajusta los límites de permisos a lo que tu organización considere adecuado, bloquea el proveedor y el endpoint en un Gateway que administres y usa `McpDisabledTools` para impedir que los agentes conectados accedan a herramientas concretas. +Para que el Asistente de IA siga estando disponible, pero limitando lo que puede hacer, usa en su lugar las políticas para empresas mencionadas anteriormente: establece los límites de permisos en función de lo que tu organización considere oportuno, bloquea el proveedor y el punto de conexión a una pasarela que gestiones y usa `McpDisabledTools` para impedir que los agentes conectados utilicen determinadas herramientas. diff --git a/localizedContent/es/content/references/preferences.md b/localizedContent/es/content/references/preferences.md index 3156590b4..eb852d897 100644 --- a/localizedContent/es/content/references/preferences.md +++ b/localizedContent/es/content/references/preferences.md @@ -1,8 +1,8 @@ --- uid: preferences -title: Control de preferencias -author: Daniel Otykier -updated: 2026-10-12 +title: Control de las preferencias +author: Morten Lønskov +updated: 2026-10-19 applies_to: products: - product: Tabular Editor 2 @@ -16,78 +16,51 @@ applies_to: - edition: Enterprise full: true --- - # Preferencias de Tabular Editor 3 -Los procesos y flujos de trabajo de desarrollo del Data model tabular varían mucho de una organización a otra. Para garantizar que la herramienta pueda encajar en la mayor cantidad posible de estos flujos de trabajo, Tabular Editor 3 es altamente personalizable, no solo en cuanto al aspecto y la experiencia de la interfaz de usuario, sino también en temas más avanzados como servidores proxy web, actualizaciones y comentarios, límites de filas, tiempos de espera, preferencias de comparación de esquemas, etc. +El cuadro de diálogo «Preferencias» controla la interfaz de usuario de Tabular Editor 3, los formatos de archivo, la conectividad, la navegación por los datos, las funciones de IA y el comportamiento del editor. -Este artículo describe los cuadros de diálogo de preferencias de Tabular Editor 3 y la configuración que puedes controlar desde ellos. +Este artículo describe los cuadros de diálogo de Preferencias de Tabular Editor 3 y los ajustes que puede controlar a través de ellos. -Para acceder al cuadro de diálogo de preferencias, ve a **Herramientas > Preferencias**. +Para acceder al cuadro de diálogo de preferencias, vaya a **Herramientas > Preferencias**. > [!NOTE] -> Todas las preferencias de Tabular Editor se almacenan para cada perfil de usuario de Windows en la carpeta `%localappdata%\\TabularEditor3`. Puedes migrar tu configuración a otra máquina simplemente copiando el contenido de esta carpeta. +> Todas las preferencias de Tabular Editor se almacenan para cada perfil de usuario de Windows, en la carpeta `%localappdata%\TabularEditor3`. Es posible migrar su configuración a otro equipo simplemente copiando el contenido de esta carpeta. > [!TIP] -> Usa el cuadro de búsqueda en la parte superior del cuadro de diálogo de preferencias para encontrar rápidamente ajustes específicos. +> Utilice el cuadro de búsqueda situado en la parte superior del cuadro de diálogo Preferencias para encontrar rápidamente ajustes específicos. -## Tabular Editor > Características +## Tabular Editor > Funciones -![Preferencias: características generales](~/content/assets/images/pref-general-features.png) +![Preferencias > Funciones generales](~/content/assets/images/pref-general-features.png) ### Power BI -##### _Permitir edición no admitida_ (deshabilitado) - -Esta opción solo es relevante cuando Tabular Editor 3 se usa como herramienta externa para Power BI Desktop. Al activarla, todas las propiedades de modelado del Data model de TOM estarán disponibles para editar cuando te conectes a una instancia de Power BI Desktop. Por lo general, se recomienda dejar esta opción desactivada para asegurarte de que no haces cambios accidentalmente en tu archivo de Power BI [que no son compatibles con Power BI Desktop](xref:desktop-limitations). - -##### _Ocultar advertencias de fecha/hora automática_ (deshabilitado) - -Cuando la marcas, se ocultarán las advertencias sobre las tablas de fecha/hora automática de Power BI. Estas advertencias aparecen cuando la configuración "Fecha/hora automática" de Power BI Desktop está habilitada, lo que crea tablas calculadas que generan advertencias en el analizador de DAX integrado de Tabular Editor 3. - -##### _Salto de línea en la primera línea de DAX_ (deshabilitado) - -En Power BI Desktop es habitual insertar un salto de línea en la primera línea de una expresión DAX, debido a la forma en que la barra de fórmulas muestra el código DAX. Si alternas con frecuencia entre Tabular Editor y Power BI Desktop, considera habilitar esta opción para que Tabular Editor 3 inserte el salto de línea automáticamente. +**Permitir la edición no admitida** (deshabilitada): se aplica únicamente a las versiones de Power BI Desktop anteriores a junio de 2025, que restringen las operaciones de modelado que puede realizar una herramienta externa. Cuando está marcada, todas las propiedades TOM están disponibles para su edición mientras Tabular Editor 3 está conectado a dicha versión, incluidos los cambios que [Power BI Desktop no admite](xref:desktop-limitations). Esta configuración no tiene ningún efecto en Power BI Desktop de junio de 2025 o posterior. -##### _Only for multi-line DAX expressions_ (enabled) +**Ocultar advertencias de fecha/hora automática** (desactivado): cuando está marcada, oculta las advertencias sobre las tablas de fecha/hora automática de Power BI. Estas advertencias aparecen cuando está habilitada la configuración «Fecha/hora automática» en Power BI Desktop, que crea tablas calculadas que activan advertencias en el analizador DAX integrado de Tabular Editor 3. -Cuando se habilita "Salto de línea en la primera línea de DAX", esta subconfiguración controla si el salto de línea se añade solo a expresiones DAX de varias líneas. Si se selecciona, las expresiones de una sola línea se dejan sin cambios. +**Salto de línea en la primera línea de DAX** (deshabilitado): En Power BI Desktop es habitual insertar un salto de línea en la primera línea de una expresión DAX, debido a la forma en que la barra de fórmulas muestra el código DAX. Si sueles pasar de Tabular Editor a Power BI Desktop y viceversa, plantéate activar esta opción para que Tabular Editor 3 inserte el salto de línea automáticamente. -##### _Modo de autenticación predeterminado de Power BI_ (Integrada) +**Solo para expresiones DAX de varias líneas** (habilitado): Cuando está habilitada la opción «Salto de línea en la primera línea de DAX», este subajuste controla si el salto de línea se añade solo para las expresiones DAX de varias líneas. Cuando está marcado, las expresiones de una sola línea no se modifican. -Selecciona el método de autenticación predeterminado (Integrada, ServicePrincipal o MasterUser) que se usará al conectarte a Datasets de Power BI. +**Modo de autenticación predeterminado de Power BI** (Integrado): Seleccione el método de autenticación predeterminado (Integrado, ServicePrincipal o MasterUser) a utilizar al conectarse a conjuntos de datos de Power BI. ### Best Practice Analyzer -##### _Buscar infracciones de prácticas recomendadas en segundo plano_ (habilitado) +**Buscar violaciones de mejores prácticas en segundo plano** (habilitado): Ejecuta el Analizador de mejores prácticas en un subproceso en segundo plano cada vez que cambia el modelo. Si la desactiva, ejecute el análisis desde la ventana **Best Practice Analyzer**. En modelos grandes o con reglas complejas, el análisis en segundo plano ralentiza la edición. -Si se desactiva, tendrás que ejecutar explícitamente un análisis de prácticas recomendadas desde la ventana de la herramienta Best Practice Analyzer para comprobar si hay alguna infracción. Si la activas, el análisis se ejecuta continuamente en un subproceso en segundo plano cada vez que haces cambios. Para modelos muy grandes o modelos con reglas de prácticas recomendadas muy complejas, esto puede causar problemas. - -##### _Reglas BPA integradas_ (habilitadas para usuarios nuevos) - -Elige si quieres habilitar, deshabilitar o que se te pregunte sobre el uso de las reglas integradas de Best Practice Analyzer de Tabular Editor. Las reglas integradas cubren procedimientos recomendados clave en formato, metadatos, diseño del modelo, expresiones DAX y traducciones. Las instalaciones nuevas tendrán las reglas integradas habilitadas de forma predeterminada. +**Reglas integradas del BPA** (habilitadas para nuevos usuarios): Elige si quieres habilitar, deshabilitar o que se te pregunte sobre el uso de las reglas integradas del Best Practice Analyzer de Tabular Editor. Las reglas integradas abarcan las principales prácticas recomendadas en materia de formato, metadatos, diseño del modelo, expresiones DAX y traducciones. En las nuevas instalaciones, las reglas integradas estarán habilitadas de forma predeterminada. ### Notificaciones -##### _Data refresh notification_ (enabled) - -Si se selecciona, se muestra una notificación cuando finaliza una operación de actualización de datos. +**Notificación de actualización de datos** (habilitada): Cuando está marcada, se muestra una notificación cuando se completa una operación de actualización de datos. -### Ajuste de fórmulas DAX +### Corrección de fórmulas DAX -##### _Habilitar ajuste de fórmulas_ (habilitado) +**Habilitar corrección de fórmulas** (habilitado): Ajusta automáticamente las referencias en las expresiones DAX cuando se cambian de nombre o se mueven los objetos. Esta función garantiza que tu código DAX siga siendo válido cuando reorganices tu modelo. -Ajusta automáticamente las referencias en las expresiones DAX cuando se cambia el nombre de los objetos o se mueven. Esta característica garantiza que tu código DAX siga siendo válido cuando reorganizas el modelo. - -##### _Habilitar ajuste de fórmulas al pegar_ (habilitado) - -Ajusta automáticamente las referencias en las expresiones DAX al pegar objetos. Esto es útil al copiar medidas o columnas calculadas entre tablas o modelos. - -### Direct Lake - -##### _Actualización automática al guardar_ (habilitado) - -Actualiza automáticamente las tablas Direct Lake al guardar cambios para garantizar que los datos estén al día. Esto garantiza que tu modelo Direct Lake se mantenga sincronizado con el Data source subyacente. +**Habilitar la corrección de fórmulas al pegar** (habilitado): Ajusta automáticamente las referencias en las expresiones DAX al pegar objetos. Esto es útil cuando se copian medidas o columnas calculadas entre tablas o modelos. ## Tabular Editor > Actualizaciones y comentarios @@ -95,291 +68,217 @@ Actualiza automáticamente las tablas Direct Lake al guardar cambios para garant ### Actualizaciones -##### _Mostrar la página "Primeros pasos" tras una actualización_ (activado) - -Si la activas, la página **Primeros pasos** se abre automáticamente la primera vez que ejecutas Tabular Editor después de actualizarlo. Se muestra **tras una actualización**, no en cada inicio. Puedes abrirla en cualquier momento desde **Ayuda > Primeros pasos**. - -##### _Buscar actualizaciones al iniciar_ (habilitado) - -Si lo activas, Tabular Editor buscará nuevas versiones cuando se inicie la aplicación. Así te mantienes al día con las últimas funciones y correcciones de errores. +**Mostrar página «Primeros pasos» en actualizaciones** (habilitado): Cuando está marcada, la página **Primeros pasos** se abre automáticamente la primera vez que ejecutas Tabular Editor después de que se haya actualizado. Aparece **en las actualizaciones**, no en cada inicio. Puedes abrirla en cualquier momento desde **Ayuda > Introducción**. -##### _Solo actualizaciones principales_ (desactivada) +**Buscar actualizaciones al iniciar** (habilitado): Busca una nueva versión cuando se inicia la aplicación. -Si lo activas, solo las actualizaciones de versión principal activarán las notificaciones. Se ignorarán las actualizaciones menores y las de corrección. Esta configuración solo está disponible cuando está activada la opción _Buscar actualizaciones al iniciar_. +**Solo actualizaciones principales** (desactivada): cuando está marcada, solo las actualizaciones de versiones principales activan notificaciones. Las actualizaciones menores y los parches se ignoran. Este ajuste solo está disponible cuando la opción **Buscar actualizaciones al iniciar** está marcada. -Debajo de estas opciones se muestra la versión que estás usando, junto con un botón **Buscar actualizaciones** que realiza la comprobación de inmediato. +La versión que estás ejecutando se muestra debajo de estos ajustes, junto con un botón **Buscar actualizaciones** que ejecuta la búsqueda inmediatamente. -### Administrado por tu organización +### Gestionado por tu organización -Si un administrador ha configurado [directivas](xref:policies), al final de esta página se agrega una sección de solo lectura, **Administrado por tu organización**, que enumera todos los valores de directiva que Tabular Editor encontró, con el formato `Nombre = valor`. Pasa el cursor sobre una entrada para ver de qué clave y colmena del Registro procede. +Cuando un administrador ha configurado [políticas](xref:policies), se añade a esta página una sección de solo lectura, **Gestionado por su organización**, en la que se enumeran todos los valores de las políticas que Tabular Editor ha encontrado, en forma de «Nombre = valor». Pase el cursor sobre una entrada para ver de qué clave de registro y de qué subárbol procede. -Un valor que Tabular Editor no pudo interpretar se muestra con la marca `(invalid)` en lugar de omitirse. Esa marca es la forma más rápida de encontrar el error tipográfico detrás de una directiva que parece no hacer nada, así que revisa aquí primero cuando una directiva no esté surtiendo efecto. +Un valor que Tabular Editor no ha podido interpretar se muestra con el marcador «(inválido)» en lugar de omitirse. Ese marcador es la forma más rápida de encontrar el error tipográfico detrás de una política que parece no hacer nada, así que compruebe aquí primero cuando una política no surta efecto. -La sección no aparece cuando no se aplica ninguna directiva. Las opciones que una directiva bloquea o limita se muestran como de solo lectura en otras partes de este cuadro de diálogo y en el cuadro de diálogo **Herramientas > Servidor MCP...**, con una descripción emergente que lo indica. +La sección no aparece cuando no se aplica ninguna directiva. Los ajustes que una política bloquea o limita se muestran en modo de solo lectura en otra parte de este cuadro de diálogo y en el cuadro de diálogo **Herramientas > Servidor MCP...**, con una información sobre herramientas que así lo indica. ### Datos de uso y comentarios -##### _Ayuda a mejorar Tabular Editor recopilando datos de uso anónimos_ (habilitado) - -Los datos no contienen información de identificación personal ni información sobre la estructura o el contenido de tus Data models. Si aun así quieres excluirte de la telemetría, desmarca esta opción. - -##### _Enviar Reports de error_ (habilitado) - -En caso de bloqueo, si esta opción está activada, Tabular Editor muestra la opción de enviar un Report de bloqueo. ¡Los Crash Reports son muy útiles para depurar, así que, si no te importa, déjalo marcado! - -## Tabular Editor > Implementación - -![Preferencias de implementación del modelo](~/content/assets/images/pref-model-deployment.png) +**Ayudar a mejorar Tabular Editor recopilando datos de uso anónimos** (habilitado): Los datos no contienen ninguna información de identificación personal, ni ninguna información sobre la estructura o el contenido de sus modelos de datos. Desmárcala para no participar en la telemetría. -Configura qué tipos de objetos se implementan de forma predeterminada al usar el Asistente de implementación: +**Enviar informes de errores** (habilitado): En caso de bloqueos, Tabular Editor muestra una opción para enviar un informe de bloqueo cuando esta opción está marcada. -##### _Implementar Data sources_ (deshabilitado) - -Incluye las definiciones de los Data sources al implementar. Activa esta opción si quieres que las cadenas de conexión y la configuración de los Data sources se implementen junto con tus cambios en el modelo. - -##### _Implementar particiones_ (deshabilitado) - -Incluye las definiciones de particiones al implementar. Activa esta opción si quieres que la configuración de las particiones se implemente junto con tus cambios en el modelo. - -##### _Implementar particiones de política de actualización_ (deshabilitado) +## Tabular Editor > Valores predeterminados -Incluye las particiones de la política de actualización incremental durante la implementación. Esto controla si se implementan las particiones creadas por las políticas de actualización incremental. + -##### _Implementar roles del modelo_ (deshabilitado) +**Nivel de compatibilidad de modelo nuevo** (1600): Establezca el nivel de compatibilidad predeterminado para los modelos recién creados. Las opciones son las mismas que en el cuadro de diálogo **Nuevo modelo**: -Incluye las definiciones de rol al implementar. Activa esta opción si quieres que se implementen los roles de seguridad a nivel de filas (RLS) y de seguridad a nivel de objetos (OLS). +| Nivel | Objetivo | +|---|---| +| 1200 | Azure Analysis Services / SQL Server 2016 o posterior | +| 1400 | Azure Analysis Services / SQL Server 2017 o posterior | +| 1500 | Azure Analysis Services / SQL Server 2019 o posterior | +| 1600 | Azure Analysis Services / SQL Server 2022 o posterior | +| 1700 | Azure Analysis Services / SQL Server 2025 o posterior | +| 1706 | Power BI / Fabric | -##### _Implementar miembros de los roles del modelo_ (deshabilitado) +1700 es el nivel más alto que admite Analysis Services; 1706 es el nivel más alto en general y solo está disponible para Power BI y Fabric. -Incluye las asignaciones de miembros a roles al implementar. Activa esta opción si quieres que se implementen las asignaciones de usuarios y grupos a los roles de seguridad. +**Usar el nivel de compatibilidad más reciente como predeterminado** (habilitado): Usar automáticamente el nivel de compatibilidad más reciente disponible para los nuevos modelos. Cuando está habilitado, esto anula la configuración del nivel de compatibilidad específico anterior y el menú desplegable queda deshabilitado. -##### _Implementar expresiones compartidas_ (deshabilitado) +**Los nuevos modelos usan la base de datos del área de trabajo** (habilitado): Al crear un nuevo modelo, se crea automáticamente una base de datos del área de trabajo en Analysis Services. Esto te permite probar y consultar tu modelo de inmediato durante el desarrollo. -Incluye expresiones compartidas (expresiones M) al implementar. Activa esta opción si quieres que se implementen las expresiones compartidas de Power Query. +**Modo de guardado predeterminado** (AlwaysAsk): Elija si desea guardar siempre como archivo (.bim), carpeta (varios archivos JSON), TMDL (lenguaje de definición de modelo tabular) o si prefiere que se le pregunte siempre al guardar. Opciones: AlwaysAsk, File, Folder, TMDL. -### Metadatos de implementación +**Usar el nombre del archivo PBIX al guardar en el disco** (habilitado): Al guardar un modelo cargado desde un archivo PBIX, usar el nombre del archivo PBIX como valor predeterminado. Esto mantiene la coherencia en la nomenclatura entre los archivos de Power BI y los metadatos del modelo guardado. -##### _Anotar metadatos de implementación_ (deshabilitado) +**Crear opciones de usuario para nuevos modelos** (habilitado): Crea automáticamente archivos .tmuo (Opciones de usuario del modelo tabular) para nuevos modelos. Estos archivos almacenan ajustes específicos del usuario, como los diseños de los diagramas y las posiciones de las ventanas. -Añade la marca de tiempo de implementación y la información del usuario como anotaciones en los objetos implementados. Esto puede ser útil para realizar un seguimiento de cuándo y por quién se implementaron los cambios del modelo. +## Tabular Editor > Teclado -### Configuración de copia de seguridad +![Asignaciones de teclado](~/content/assets/images/keyboard-mappings.png) -##### _Crear copia de seguridad al guardar_ (habilitado) +Configure los accesos directos de teclado para todos los comandos de Tabular Editor. Utiliza la función de búsqueda para encontrar rápidamente comandos específicos y asignar o modificar sus atajos de teclado para que coincidan con tu flujo de trabajo preferido. -Crea una copia de seguridad del modelo al guardar cambios localmente. Esto te ofrece una red de seguridad por si necesitas revertir cambios. +## Tabular Editor > Interfaz de usuario -##### _Ubicación para guardar la copia de seguridad_ +Controle las barras de herramientas y los menús, la cantidad de ubicación de origen del modelo que se muestra, el diseño de las ventanas, el idioma, la accesibilidad y las listas de elementos recientes. -Especifica la carpeta en la que se almacenan las copias de seguridad del despliegue. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. + -##### _Copia de seguridad al implementar_ (habilitado) +### Barras de herramientas y menús -Crea una copia de seguridad del modelo de destino antes de implementar los cambios. Esto te permite restaurar la versión anterior si es necesario. +**Mostrar barras de herramientas en ventanas flotantes** (habilitado): Muestra las barras de herramientas en los documentos y vistas que desacople en ventanas flotantes. -##### _Ubicación de copia de seguridad_ +**Ocultar barras de herramientas inactivas** (habilitado): Oculta las barras de herramientas que no se aplican al documento o a la vista activos. -Especifica la carpeta en la que se almacenan las copias de seguridad de las partidas guardadas. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. +**Ocultar menús inactivos** (habilitado): Oculta los [menús dinámicos](xref:user-interface#dynamic-menus-context-dependent) que no se aplican al documento o a la vista activos. -## Tabular Editor > Valores predeterminados +**Ocultar número de versión** (desactivado): Oculta el número de compilación y versión de Tabular Editor 3 de la barra de título. - +**Detalle de la fuente del modelo** (Ruta completa): Establezca qué parte de la ubicación de origen del modelo cargado aparece en la barra de título, en el elemento de conexión de la barra de estado, en las información sobre herramientas de las pestañas de los documentos y en el texto que aparece al pasar el cursor por los menús de archivos y modelos recientes: -##### _Nivel de compatibilidad del nuevo modelo_ (1600) +- **Ruta completa**: el nombre del modelo con su ruta completa, servidor o ubicación del espacio de trabajo. +- **Solo nombre**: el nombre del archivo, el nombre de la carpeta o el nombre de la base de datos, sin rutas ni nombres de servidores. +- **Oculto**: ni el nombre del modelo ni su ubicación. La barra de título muestra **Modelo cargado** y la barra de estado muestra **Conectado** cuando está conectado a un servidor. -Establece el nivel de compatibilidad predeterminado para los modelos recién creados. Las opciones son las mismas que en el cuadro de diálogo **Nuevo modelo**: +Los agentes conectados a través del @mcp-server reciben el título del modelo en el mismo nivel. Si seleccionó **Ocultar detalles de origen del modelo** en una versión anterior, este ajuste estará **Oculto**. -| Nivel | Destino | -| ----- | ------------------------------------------ | -| 1200 | Azure Analysis Services / SQL Server 2016+ | -| 1400 | Azure Analysis Services / SQL Server 2017+ | -| 1500 | Azure Analysis Services / SQL Server 2019+ | -| 1600 | Azure Analysis Services / SQL Server 2022+ | -| 1700 | Azure Analysis Services / SQL Server 2025+ | -| 1706 | Power BI / Fabric | +### Buscar y reemplazar -1700 es el nivel más alto compatible con Analysis Services; 1706 es el nivel más alto en general y es exclusivo de Power BI y Fabric. +**Opacidad del cuadro de diálogo cuando está inactivo** (70 %): Opacidad del cuadro de diálogo **Buscar y reemplazar** cuando no tiene el foco. -##### _Usar el nivel de compatibilidad más reciente como valor predeterminado_ (habilitado) +### Diseño -Usa automáticamente el nivel de compatibilidad más reciente disponible para los modelos nuevos. Al habilitarlo, se reemplaza la configuración específica del nivel de compatibilidad anterior y se deshabilita el menú desplegable. +**Recordar si la ventana está maximizada** (habilitado): Restaura el estado maximizado de la ventana principal cuando se inicia Tabular Editor 3. -##### _Los nuevos modelos usan la base de datos de Workspace_ (habilitado) +**Recordar posición y tamaño de la ventana** (habilitado): Restaura la posición y el tamaño de la ventana principal cuando se inicia Tabular Editor 3. -Al crear un modelo nuevo, crea automáticamente una base de datos de Workspace en Analysis Services. Esto te permite probar y consultar el modelo de inmediato durante el desarrollo. +### Idioma -##### _Modo de guardado predeterminado_ (AlwaysAsk) +**Idioma de la interfaz de usuario** (inglés): El idioma de la interfaz de usuario. Reinicie Tabular Editor 3 para aplicar un cambio. -Elige si quieres guardar siempre como archivo (.bim), carpeta (varios archivos JSON), TMDL (Tabular Model Definition Language) o que pregunte siempre al guardar. Opciones: AlwaysAsk, File, Folder, TMDL. +### Accesibilidad -##### _Usar el nombre del archivo PBIX al guardar en disco_ (habilitado) +**Modo daltonismo** (desactivado): Marque los objetos añadidos desde el último guardado en color turquesa donde de otro modo serían verdes, en los indicadores de cambios del **Explorador TOM** y en la vista de comparación de modelos. Consulte @accessibility. -Al guardar un modelo cargado desde un archivo PBIX, usa el nombre del archivo PBIX como valor predeterminado. Esto mantiene la coherencia de nombres entre los archivos de Power BI y los metadatos del modelo guardados. +### Elementos recientes -##### _Crear opciones de usuario para modelos nuevos_ (habilitado) +**Usar rutas de archivo compactas** (habilitado): Acorta las rutas de archivo largas en los menús de archivos y modelos recientes. Con **Detalle de origen del modelo** establecido como **Ruta completa**, la parte de la ubicación de la barra de título también se acorta. -Crea automáticamente archivos .tmuo (Tabular Model User Options) para los modelos nuevos. Estos archivos almacenan ajustes específicos de cada usuario, como los diseños del diagrama y las posiciones de las ventanas. +**Número de archivos recientes mostrados** (10): El número máximo de archivos en el menú de archivos recientes, hasta 50. -## Tabular Editor > Teclado +**Número de modelos recientes mostrados** (10): El número máximo de modelos en el menú de modelos recientes, hasta 50. -![Asignaciones de teclas](~/content/assets/images/keyboard-mappings.png) +**Número de servidores recientes mostrados** (10): El número máximo de servidores en la lista **Servidor** cuando se conecta a un modelo semántico, hasta 50. Los servidores anclados no se cuentan y siempre permanecen en la lista. Consulta @xmla-as-connectivity. -Configura los atajos de teclado para todos los comandos de Tabular Editor. Usa la función de búsqueda para encontrar rápidamente comandos específicos y asignar o modificar sus atajos de teclado para adaptarlos a tu flujo de trabajo. +**Borrar archivos recientes**, **Borrar modelos recientes**, **Borrar servidores recientes** y **Borrar todos los elementos recientes**: Borra las listas correspondientes. **Borrar servidores recientes** y **Borrar todos los elementos recientes** conservan los servidores anclados y sus ajustes guardados. ## Tabular Editor > Explorador TOM -![Configuración del Explorador Tom](~/content/assets/images/unsaved-changes/preferences.png) +![Configuración del Explorador TOM](~/content/assets/images/unsaved-changes/preferences.png) -Controla cómo el Explorador TOM (Tabular Object Model) presenta el modelo y qué ocurre con los objetos que eliminas. +Controle cómo presenta el modelo el Explorador TOM (Tabular Object Model) y qué sucede con los objetos que elimina. -Los conmutadores que determinan qué tipos de objetos aparecen en el árbol, como medidas, columnas, jerarquías, particiones, carpetas de visualización y objetos ocultos, no son preferencias. Se encuentran en la barra de herramientas @tom-explorer-view, donde puedes cambiarlos en cada modelo sin abrir este cuadro de diálogo. +Los botones de activación/desactivación que deciden qué tipos de objetos aparecen en el árbol, como medidas, columnas, jerarquías, particiones, carpetas de visualización y objetos ocultos, no son preferencias. Se encuentran en la barra de herramientas @tom-explorer-view, donde puede cambiarlos por modelo sin abrir este cuadro de diálogo. ### Visualización y filtrado -##### _Usar grupos de tablas_ (activado) - -Agrupa tus tablas en el Explorador TOM, por ejemplo, para mantener separados los grupos de cálculo, las dimensiones y las tablas de hechos. Tabular Editor registra el grupo de una tabla en una anotación de la propia tabla, de modo que la agrupación acompaña al modelo. Es interno de Tabular Editor: ninguna otra herramienta cliente, ni siquiera Power BI Desktop, muestra esa agrupación. Consulta @table-groups. - -##### _Mostrar rama completa_ (deshabilitado) - -Cuando filtras el árbol, Tabular Editor muestra los objetos que coinciden con tu cadena de filtro junto con sus nodos principales. Activa esta opción para mostrar también todos los elementos secundarios de una coincidencia, independientemente de que coincidan o no con la cadena. - -##### _Resaltar relaciones_ (habilitado) +**Usar grupos de tablas** (habilitado): Agrupe sus tablas en el Explorador TOM, por ejemplo, para mantener separados los grupos de cálculos, las dimensiones y las tablas de hechos. Tabular Editor registra el grupo de una tabla en una anotación en la propia tabla, de modo que la agrupación viaja con el modelo. Es interna a Tabular Editor: ninguna otra herramienta cliente, incluido Power BI Desktop, la muestra. Consulte @table-groups. -Resalta las relaciones en las que interviene la tabla o la columna que has seleccionado, para que puedas ver de un vistazo con qué se une una columna. +**Mostrar rama completa** (desactivado): Cuando filtra el árbol, Tabular Editor muestra los objetos que coinciden con su cadena de filtro junto con sus elementos principales. Habilite esta opción para mostrar también todos los elementos secundarios de una coincidencia, independientemente de que los elementos secundarios coincidan o no con la cadena. -### Cambios no guardados +**Resaltar relaciones** (habilitado): Resalta las relaciones que involucran la tabla o columna que ha seleccionado, para que pueda ver de un vistazo a qué está unida una columna. -Estos ajustes controlan cómo se indican los [cambios no guardados](xref:unsaved-changes) en el Explorador TOM y en la vista de propiedades. +### Cambios sin guardar -##### _Marcar objetos con cambios no guardados_ (habilitado) +Estos ajustes controlan cómo se indican los [cambios sin guardar](xref:unsaved-changes) en el Explorador TOM y en la vista Propiedades. -Resalta en el Explorador TOM los objetos que difieren de la última versión guardada del modelo, mediante una fila sombreada y un distintivo en el icono del objeto: naranja para los objetos editados, verde para los objetos añadidos y rojo para los objetos eliminados. Las tablas, carpetas y grupos que contienen objetos modificados reciben un relleno rayado. Cuando está deshabilitado, los objetos eliminados siguen siendo visibles según la configuración siguiente, y el filtro **Mostrar cambios** de la barra de herramientas sigue funcionando. Usa **Modo para daltónicos** en **Interfaz de usuario > Accesibilidad** para marcar los objetos añadidos en verde azulado en lugar de verde. +**Marcar objetos con cambios no guardados** (habilitado): Resalta los objetos en el Explorador TOM que difieren de la última versión guardada del modelo, usando una fila coloreada y una insignia en el icono del objeto: naranja para los objetos modificados, verde para los objetos añadidos y rojo para los objetos eliminados. Las tablas, las carpetas y los grupos que contengan objetos modificados se rellenarán con un sombreado de rayas. Cuando está desactivada, los objetos eliminados siguen siendo visibles según la configuración que se indica a continuación, y el filtro **Mostrar cambios** de la barra de herramientas sigue funcionando. Use el **Modo daltonismo** en **Interfaz de usuario > Accesibilidad** para marcar los objetos añadidos en color azul verdoso en lugar de verde. -##### _Mantener visibles los objetos eliminados_ (Hasta que se guarde el modelo) - -Cuánto tiempo permanecen visibles los objetos eliminados en el Explorador TOM, tachados, en el lugar que ocupaban. Haz clic con el botón derecho en un objeto eliminado y elige **Restaurar** para recuperarlo. Opciones: +**Mantener visibles los objetos eliminados** (hasta que se guarde el modelo): cuánto tiempo permanecen visibles los objetos eliminados en el Explorador TOM, tachados, en el lugar donde solían estar. Haga clic derecho en un objeto eliminado y elija **Restaurar** para recuperarlo. Opciones: - **Nunca**: Los objetos eliminados desaparecen del Explorador TOM de inmediato. -- **Hasta que se guarde el modelo**: Los objetos eliminados se tratan como cambios no guardados y desaparecen al guardar el modelo. -- **Hasta que se cierre el modelo**: Los objetos eliminados permanecen visibles y se pueden restaurar durante toda la sesión de edición, incluso después de guardar. - -##### _Agrupar los objetos eliminados bajo un nodo "Objetos eliminados"_ (deshabilitado) - -Muestra juntos los objetos eliminados de una tabla, jerarquía, rol o grupo de tablas bajo un único nodo **Objetos eliminados** al final de su contenedor, en lugar de mostrarlos individualmente donde estaban. Haz clic con el botón derecho en el nodo y elige **Restaurar** para recuperarlos todos de una vez. +- **Hasta que se guarde el modelo**: Los objetos eliminados se tratan como cambios sin guardar y desaparecen cuando se guarda el modelo. +- **Hasta que se cierre el modelo**: Los objetos eliminados permanecen visibles y se pueden restaurar durante toda la sesión de edición, incluso después de guardar el modelo. -##### _Marcar las propiedades con cambios no guardados en el panel de propiedades_ (habilitado) +**Reunir los objetos eliminados bajo un nodo «Objetos eliminados»** (deshabilitado): Mostrar los objetos eliminados de una tabla, jerarquía, rol o grupo de tablas juntos bajo un único nodo **Objetos eliminados** al final de su contenedor, en lugar de cada uno donde solía estar. Haga clic derecho en el nodo y elija **Restaurar** para recuperarlos todos a la vez. -Resalta en la vista de propiedades aquellas que difieren de la última versión guardada del modelo, mediante una fila sombreada. Cuando está deshabilitado, el filtro **Mostrar cambios** de la barra de herramientas en la vista de propiedades sigue funcionando. +**Marcar las propiedades con cambios no guardados en el panel «Propiedades»** (habilitado): Resalta las propiedades de la vista «Propiedades» que difieren de la última versión guardada del modelo, usando una fila coloreada. Cuando está desactivado, el filtro de la barra de herramientas **Mostrar cambios** de la vista Propiedades sigue funcionando. ### Eliminar -##### _Mostrar siempre advertencias de eliminación_ (deshabilitado) - -Si prefieres que Tabular Editor 3 te pida confirmación para todas las eliminaciones de objetos, habilita esta opción. De lo contrario, Tabular Editor 3 solo te pedirá que confirmes la eliminación de varios objetos o la de objetos a los que hacen referencia otros objetos. +**Mostrar siempre advertencias de eliminación** (deshabilitado): Le pide que confirme cada eliminación de objetos. Cuando está desactivada, solo aparece una confirmación para las eliminaciones de varios objetos y para los objetos a los que hacen referencia otros objetos. > [!NOTE] -> Todas las operaciones de eliminación en Tabular Editor 3 se pueden deshacer con CTRL+Z. +> Todas las operaciones de eliminación en Tabular Editor 3 se pueden deshacer pulsando CTRL+Z. ### Localización -Estos ajustes determinan la cadena de formato que Tabular Editor escribe cuando seleccionas el formato numérico _Moneda_ para un objeto en el panel de propiedades. - -##### _Moneda predeterminada_ (Inglés (Estados Unidos)) - -La convención de formato que se usa como base para la cadena de formato de moneda. Elige la configuración regional cuyo símbolo de moneda, separador decimal y agrupación de dígitos quieras usar. +Estos ajustes determinan la cadena de formato que escribe Tabular Editor cuando elige el formato numérico **Moneda** para un objeto en el panel Propiedades. -##### _Usar un símbolo de moneda personalizado_ (desactivado) +**Moneda predeterminada** (inglés (Estados Unidos)): la convención de formato en la que se basa la cadena de formato de moneda. Elija la configuración regional cuyo símbolo de moneda, separador decimal y agrupación de dígitos desee. -Indica tu propio símbolo en lugar de usar el de la configuración regional anterior. Las tres opciones siguientes solo se aplican mientras esta casilla esté seleccionada. +**Usar un símbolo de moneda personalizado** (desactivado): Proporcione su propio símbolo en lugar de tomar uno de la configuración regional anterior. Los tres ajustes siguientes solo se aplican mientras esta opción esté marcada. -##### _Símbolo de moneda personalizado_ +**Símbolo de moneda personalizado**: El símbolo que se usará. Introduzca el símbolo por sí solo, sin el número; se ignoran los espacios en blanco. -El símbolo que se usará. Escribe solo el símbolo, sin el número; se ignoran los espacios en blanco. +**Posición del símbolo de moneda personalizado** (antes del número): si el símbolo va antes o después del valor numérico. -##### _Posición del símbolo de moneda personalizado_ (Antes del número) - -Si el símbolo va antes o después del valor numérico. - -##### _Poner un espacio entre el número y el símbolo_ (desactivado) - -Separa el símbolo del valor numérico con un espacio. +**Poner un espacio entre el número y el símbolo** (desactivado): Separe el símbolo del valor numérico con un espacio. ## Tabular Editor > Copiar/Pegar - - -Controla qué metadatos se incluyen al copiar objetos: - -##### _Incluir traducciones_ (habilitado) + -Copia los metadatos de traducción junto con los objetos. Cuando está habilitado, también se copiarán las traducciones definidas para el objeto copiado. +Controlar qué metadatos se incluyen al copiar objetos: -##### _Incluir perspectivas_ (habilitado) +**Incluir traducciones** (habilitado): Copiar los metadatos de las traducciones junto con los objetos. Cuando está habilitada, también se copiarán todas las traducciones definidas para el objeto copiado. -Copia la pertenencia a las perspectivas junto con los objetos. Cuando está habilitado, el objeto copiado pertenecerá a las mismas perspectivas que el original. +**Incluir perspectivas** (habilitado): Copiar la pertenencia a perspectivas junto con los objetos. Cuando está habilitado, el objeto copiado pertenecerá a las mismas perspectivas que el original. -##### _Incluir RLS_ (habilitado) +**Incluir RLS** (habilitado): Copiar las expresiones de seguridad a nivel de filas junto con los objetos. Esto se aplica al copiar tablas que tienen definidas reglas de RLS. -Copia las expresiones de seguridad a nivel de filas junto con los objetos. Esto se aplica al copiar tablas que tengan definidas reglas de RLS. - -##### _Incluir OLS_ (habilitado) - -Copia la configuración de seguridad a nivel de objetos junto con los objetos. Esto se aplica al copiar objetos con restricciones de OLS. +**Incluir OLS** (habilitado): Copiar los ajustes de seguridad a nivel de objeto junto con los objetos. Esto se aplica al copiar objetos que tienen restricciones de OLS. ## Tabular Editor > Perspectivas - - -Controla cómo se gestiona la pertenencia a las perspectivas: - -##### _Heredar la pertenencia a las perspectivas para objetos nuevos_ (deshabilitado) - -Los objetos recién creados heredan automáticamente la pertenencia a las perspectivas de su objeto padre. Por ejemplo, una nueva medida se agregaría automáticamente a las mismas perspectivas que su tabla padre. - -##### _Heredar la pertenencia a las perspectivas para objetos reubicados_ (deshabilitado) + -Los objetos que se mueven heredan la pertenencia a las perspectivas de su nuevo objeto padre. Esto resulta útil al reorganizar la estructura del modelo. +Controle cómo se gestiona la pertenencia a perspectivas: -##### _Heredar al agregar una tabla a una perspectiva_ (habilitado) +**Heredar pertenencia a perspectiva para objetos nuevos** (desactivada): Los objetos recién creados heredan automáticamente la pertenencia a perspectiva de su elemento principal. Por ejemplo, una nueva medida se añadiría automáticamente a las mismas perspectivas que su tabla principal. -Agrega automáticamente todos los objetos de la tabla (columnas, medidas, jerarquías) cuando se agrega una tabla a una perspectiva. +**Heredar pertenencia a perspectiva para objetos reubicados** (desactivado): Los objetos que se mueven heredan la pertenencia a perspectiva de su nuevo elemento principal. Esto es útil cuando se reorganiza la estructura de tu modelo. -##### _Heredar al quitar una tabla de una perspectiva_ (habilitado) +**Heredar al agregar una tabla a una perspectiva** (habilitado): Agregar automáticamente todos los objetos de la tabla (columnas, medidas, jerarquías) cuando se agrega una tabla a una perspectiva. -Quita automáticamente todos los objetos de la tabla cuando se quita una tabla de una perspectiva. +**Heredar al quitar una tabla de una perspectiva** (habilitado): Quitar automáticamente todos los objetos de la tabla cuando se quita una tabla de una perspectiva. ## Tabular Editor > Comparación de esquemas ![Preferencias de comparación de esquema](~/content/assets/images/pref-schema-compare.png) -Configura qué cambios se ignoran durante la comparación de esquemas al actualizar los esquemas de las tablas: +Configure qué cambios se ignoran durante la comparación de esquemas al actualizar los esquemas de tabla: -##### _Ignorar cambios en Import mode_ (deshabilitado) +**Ignorar cambios en el modo de importación** (desactivado): No marcar los cambios en las propiedades del modo de importación. Habilite esto si desea ignorar los cambios entre los modos Importación, DirectQuery y Dual durante la comparación de esquemas. -No marques cambios en las propiedades de Import mode. Activa esta opción si quieres ignorar los cambios entre los modos Import, DirectQuery y Dual durante la comparación de esquemas. +**Ignorar cambios en tipo de datos** (deshabilitado): No marcar cambios en tipo de datos de columnas. Habilite esto si desea ignorar los cambios en el tipo de datos durante la comparación de esquemas. -##### _Ignorar cambios de tipo de datos_ (deshabilitado) +**Ignorar cambios en la descripción** (desactivado): No marcar los cambios en las descripciones de los objetos. Habilite esto si no desea ver los cambios en la descripción en la comparación de esquemas. -No marques cambios en el tipo de datos de las columnas. Activa esta opción si quieres ignorar cambios de tipo de datos durante la comparación de esquemas. +**Ignorar cambios de decimal a doble** (deshabilitado): No marcar cambios entre los tipos de datos decimal y doble. Esto resulta útil cuando se trabaja con Data source que no distinguen entre estos tipos. -##### _Ignorar cambios de descripción_ (deshabilitado) - -No marques cambios en las descripciones de los objetos. Activa esta opción si no quieres ver los cambios en las descripciones al comparar esquemas. - -##### _Ignorar cambios de decimal a double_ (deshabilitado) - -No marques como cambios las diferencias entre los tipos de datos decimal y double. Esto resulta útil cuando trabajas con varios Data source que no distinguen entre estos tipos. - -##### _Priorizar el detector de esquemas de Analysis Services_ (deshabilitado) - -Usa los metadatos de Analysis Services como fuente de referencia para la detección de esquemas. Cuando está habilitado, Tabular Editor consultará directamente la instancia de Analysis Services, en lugar de usar la información del esquema del proveedor del Data source. +**Dar prioridad al detector de esquemas de Analysis Services** (deshabilitado): Usar los metadatos de Analysis Services como fuente de referencia para la detección de esquemas. Cuando está habilitada, la detección de esquemas consulta directamente a la instancia de Analysis Services. ## Tabular Editor > Guardar en carpeta/archivo @@ -387,422 +286,311 @@ Usa los metadatos de Analysis Services como fuente de referencia para la detecci ### Modo de serialización -##### _Usar formato TMDL_ (deshabilitado) - -Guarda los metadatos del modelo usando el formato Tabular Model Definition Language (TMDL) en lugar de JSON. TMDL es el formato moderno recomendado para el control de versiones y la colaboración. +**Usar el formato TMDL** (deshabilitado): Guarde los metadatos del modelo utilizando el formato del Lenguaje de definición de modelo tabular (TMDL) en lugar de JSON. TMDL es el formato moderno recomendado para el control de versiones y la colaboración. -##### _Usar configuración de serialización recomendada_ (habilitado) - -Aplica la configuración recomendada para la serialización basada en carpetas (sobrescribe la configuración personalizada). Cuando está habilitado, Tabular Editor aplica prácticas recomendadas para guardar modelos en carpetas, optimizadas para el control de versiones. +**Usar la configuración de serialización recomendada** (habilitada): Aplica la configuración recomendada para la serialización basada en carpetas (anula la configuración personalizada). Cuando está habilitado, Tabular Editor utiliza las mejores prácticas para guardar modelos en carpetas, optimizadas para el control de versiones. ### Configuración de serialización heredada (JSON) -##### _Anteponer prefijos a los nombres de archivo_ (deshabilitado) - -Añade prefijos numéricos a los nombres de archivo para ordenarlos. Esto puede ayudar a mantener un orden coherente de los archivos en los exploradores de archivos. - -##### _Relaciones locales_ (habilitado) - -Guarda las definiciones de relación junto con cada tabla, en lugar de en una ubicación central. Esto facilita ver qué relaciones pertenecen a cada tabla cuando usas control de versiones. - -##### _Perspectivas locales_ (habilitado) - -Guarda la pertenencia a perspectivas junto con cada objeto, en lugar de en una ubicación central. Esto reduce los conflictos de combinación en el control de versiones. - -##### _Traducciones locales_ (activadas) - -Guarda las traducciones junto a cada objeto, en lugar de en una ubicación central. Esto reduce los conflictos de combinación en el control de versiones. - -##### _Niveles_ - -Selecciona qué tipos de objetos se deben serializar en cada nivel de carpeta. Esto te permite organizar los archivos del modelo en una estructura jerárquica. Los niveles disponibles son Data sources, funciones definidas por el usuario (UDFs), expresiones compartidas, perspectivas, relaciones, roles, tablas, columnas, jerarquías, medidas, particiones, elementos de cálculo y traducciones. - -##### _Ignorar objetos inferidos_ (activado) +**Añadir prefijos a los nombres de archivo** (desactivado): Añadir prefijos numéricos a los nombres de archivo para ordenarlos. Esto puede ayudar a mantener un orden de archivos coherente en los exploradores de archivos. -No serialices los objetos que el motor infiere automáticamente. Esto reduce el desorden en los metadatos guardados. +**Relaciones locales** (habilitado): almacena las definiciones de las relaciones con tablas individuales en lugar de en una ubicación central. Esto facilita ver qué relaciones pertenecen a cada tabla cuando se utiliza el control de versiones. -##### _Ignorar propiedades inferidas_ (activado) +**Perspectivas locales** (habilitadas): Almacenar la pertenencia a perspectivas con objetos individuales en lugar de en una ubicación central. Esto reduce los conflictos de fusión en el control de versiones. -No serialices las propiedades que el motor infiere automáticamente. Esto mantiene los metadatos guardados limpios y centrados en los valores establecidos explícitamente. +**Traducciones locales** (habilitadas): Almacenar las traducciones con objetos individuales en lugar de en una ubicación central. Esto reduce los conflictos de fusión en el control de versiones. -##### _Ignorar marcas de tiempo_ (activado) +**Niveles**: Seleccione qué tipos de objetos serializar en diferentes niveles de carpetas. Esto te permite organizar los archivos de tu modelo en una estructura jerárquica. Los niveles disponibles son: fuentes de datos, funciones definidas por el usuario (UDF), expresiones compartidas, perspectivas, relaciones, roles, tablas, columnas, jerarquías, medidas, particiones, elementos de cálculo y traducciones. -No serialices los metadatos de marca de tiempo. Te lo recomendamos encarecidamente para el control de versiones, ya que evita cambios innecesarios en cada commit. +**Ignorar objetos inferidos** (habilitado): No serializar los objetos que el motor infiere automáticamente. Esto reduce el desorden en los metadatos guardados. -##### _Ignorar etiquetas de linaje_ (desactivado) +**Ignorar propiedades inferidas** (habilitado): No serializar las propiedades que el motor infiere automáticamente. Esto mantiene los metadatos guardados limpios y centrados en los valores establecidos explícitamente. -No serialices los metadatos de la etiqueta de linaje de Power BI. Actívalo si no quieres información de linaje en los metadatos guardados. +**Ignorar marcas de tiempo** (habilitado): No serializar los metadatos de las marcas de tiempo. Esto es muy recomendable para el control de versiones, ya que evita cambios innecesarios en cada confirmación. -##### _Ignorar configuración de privacidad_ (desactivado) +**Ignorar etiquetas de linaje** (desactivado): No serializar los metadatos de las etiquetas de linaje de Power BI. Habilite esto si no desea que haya información de linaje en sus metadatos guardados. -No serialices la configuración de privacidad del Data source. Actívalo si administras la configuración de privacidad por separado. +**Ignorar configuración de privacidad** (deshabilitado): No serializar la configuración de privacidad del origen de datos. Habilite esto si gestiona la configuración de privacidad por separado. -##### _Incluir datos confidenciales_ (desactivado) +**Incluir datos sensibles** (desactivado): Incluir información sensible, como contraseñas, en los metadatos serializados. No se recomienda por motivos de seguridad. -Incluye información confidencial, como contraseñas, en los metadatos serializados. No se recomienda por motivos de seguridad. +**Ignorar particiones de actualización incremental** (deshabilitado): No serializar las particiones creadas por las políticas de actualización incremental. Habilite esto si desea que la actualización incremental se gestione por separado de sus metadatos guardados. -##### _Ignorar particiones de actualización incremental_ (desactivado) +**Dividir cadenas de varias líneas** (habilitado): Divide los valores de cadenas largas en varias líneas para mejorar la legibilidad en el control de versiones. Esto facilita la visualización de los cambios en las expresiones DAX y en otras propiedades de texto largo. -No serialices las particiones creadas por las políticas de actualización para la actualización incremental. Activa esta opción si quieres que la actualización incremental se gestione por separado de los metadatos guardados. - -##### _Dividir cadenas multilínea_ (activado) - -Divide los valores de cadena largos en varias líneas para mejorar la legibilidad en el control de versiones. Esto facilita ver los cambios en las expresiones DAX y en otras propiedades de texto extensas. - -##### _Ordenar arrays_ (desactivado) - -Ordena alfabéticamente los elementos del array para una serialización coherente. Esto puede reducir diferencias irrelevantes en el control de versiones, pero puede cambiar el orden lógico de algunos elementos. +**Ordenar matrices** (desactivado): Ordene los elementos de las matrices alfabéticamente para lograr una serialización coherente. Reduce las diferencias de ordenación en el control de versiones y cambia el orden de algunos elementos. ### Configuración de serialización de TMDL -##### _Modo de sangría_ (tabulaciones) - -Elige entre tabulaciones o espacios para la sangría en los archivos TMDL. Las tabulaciones son la opción predeterminada y recomendada. - -##### _Espacios de sangría_ (4) +**Modo de sangría** (tabulaciones): Elija entre tabulaciones o espacios para la sangría en los archivos TMDL. Las tabulaciones son la opción predeterminada y recomendada. -Si usas espacios, especifica el número de espacios por nivel de sangría. - - +**Espacios de sangría** (4): Cuando utilice espacios, especifique el número de espacios por nivel de sangría. ## Funciones de IA -La página principal contiene las dos opciones que se aplican a todas las funciones de IA, tanto al chat como al [servidor MCP](xref:mcp-server). - -##### _Buscar actualizaciones de la base de conocimientos al iniciar_ (activado) +La página principal contiene los dos ajustes que se aplican a todas las funciones de IA, tanto al chat como al [servidor MCP](xref:mcp-server). -El Asistente de IA busca en una copia local de la documentación de Tabular Editor. Cuando esta opción está seleccionada, Tabular Editor busca una copia más reciente al iniciarse y la descarga si hay una disponible. Esta es la única solicitud saliente que realiza por sí sola cualquier función de IA. +**Buscar actualizaciones de la base de conocimientos al iniciar** (habilitado): El Asistente de IA busca una copia local de la documentación de Tabular Editor. Cuando está marcada esta opción, Tabular Editor busca una copia más reciente al iniciar y la descarga si hay una disponible. Esta es la única solicitud saliente que cualquier función de IA realiza por sí sola. -##### Registro de auditoría - -**Abrir carpeta de auditoría** abre el registro de este equipo de lo que hicieron el Asistente de IA y el servidor MCP: decisiones de permisos, qué herramientas se llamaron y cómo terminó cada una, y el texto completo de cualquier script que se ejecutó o se entregó para su revisión. Los prompts, las respuestas y los valores de datos nunca se registran. El registro es una función de la Edición Enterprise: en las ediciones Desktop y Business no se registra nada y no se muestra el botón. Consulta @ai-audit-log. +**Registro de auditoría**: **Abrir carpeta de auditoría** abre el registro de este ordenador sobre lo que hicieron el Asistente de IA y el servidor MCP: decisiones sobre permisos, qué herramientas se invocaron y cómo finalizó cada una, y el texto completo de cualquier script que se ejecutó o se entregó para su revisión. Las indicaciones, las respuestas y los valores de los datos nunca se registran. El registro es una función de la Edición Enterprise: en las ediciones Desktop y Business no se registra nada y el botón no se muestra. Consulta @ai-audit-log. ## Funciones de IA > Asistente de IA -Configuración de conexión para el chat del Asistente de IA. La subpágina **Proveedor de IA** se muestra aquí. Consulta @ai-assistant para ver qué necesita cada proveedor. - -##### _Elegir proveedor_ (Ninguno) +Configuración de conexión para el chat del Asistente de IA. La página secundaria **Proveedor de IA** se muestra aquí. Consulta @ai-assistant para saber qué necesita cada proveedor. -Con qué proveedor de IA se comunica el chat: **OpenAI**, **Anthropic**, **Azure OpenAI** o **Personalizado (compatible con OpenAI)**. Los campos de abajo cambian según tu elección. Un administrador puede fijarlo a un único proveedor o limitar la lista mediante una directiva. +**Elegir proveedor** (Ninguno): Con qué proveedor de IA se comunica el chat: **OpenAI**, **Anthropic**, **Azure OpenAI** o **Personalizado (compatible con OpenAI)**. Los campos que aparecen a continuación cambian en función de tu elección. Un administrador puede bloquear esto para que solo se use un único proveedor o reducir la lista mediante una directiva. -##### _URL base_ / _Punto de conexión del servicio_ +**URL base** / **Punto de conexión del servicio**: A dónde se envían las solicitudes. OpenAI y Anthropic proporcionan un valor predeterminado y el campo es opcional. Azure OpenAI y Personalizado no tienen ningún valor predeterminado, por lo que se requiere un punto de conexión. -Dónde se envían las solicitudes. OpenAI y Anthropic proporcionan uno predeterminado y el campo es opcional. Azure OpenAI y Personalizado no tienen ningún valor predeterminado, por lo que se requiere un punto de conexión. +**Clave de API**: Tu propia clave para el proveedor elegido. Se almacena cifrada en esta máquina en «Preferences.json». Tabular Editor no incluye ninguna clave integrada y nunca actúa como proxy de tus solicitudes. -##### _Clave de API_ +**ID de organización de OpenAI** e **ID de proyecto de OpenAI**: Opcionales y solo se muestran para el proveedor OpenAI. Úselos cuando su cuenta de OpenAI facture o determine el uso por organización o proyecto. -Tu propia clave para el proveedor elegido. Se almacena cifrada en este equipo, en el archivo de preferencias `Preferences.json`. Tabular Editor no incluye ninguna clave integrada y nunca actúa como proxy de tus solicitudes. - -##### _ID de organización de OpenAI_ y _ID de proyecto de OpenAI_ - -Son opcionales y solo se muestran para el proveedor OpenAI. Úsalos cuando tu cuenta de OpenAI facture o delimite el uso por organización o proyecto. - -##### _Nombre del modelo_ (_Implementación_ para Azure OpenAI) - -Qué modelo usar. Para OpenAI y Anthropic, es una lista desplegable que se rellena desde un catálogo en línea, por lo que estará vacía hasta que se haya descargado el catálogo al menos una vez en este equipo. En Azure OpenAI, el campo se etiqueta como **Implementación** y toma el nombre que le diste a la implementación, que no necesariamente coincide con el nombre del modelo subyacente. Si se deja en blanco, se usa el valor predeterminado del proveedor, salvo en Azure OpenAI y Personalizado, que no tienen valor predeterminado. +**Nombre del modelo** (**Despliegue** para Azure OpenAI): Qué modelo usar. En el caso de OpenAI y Anthropic, se trata de un menú desplegable que se rellena a partir de un catálogo en línea, por lo que está vacío hasta que se haya descargado el catálogo una vez en este equipo. En Azure OpenAI, el campo se denomina **Despliegue** y adopta el nombre que le dio al despliegue, que no es necesariamente el nombre del modelo subyacente. Si lo deja en blanco, se utilizará el valor predeterminado del proveedor, excepto en el caso de Azure OpenAI y Personalizado, que no tienen ninguno. ## Funciones de IA > Asistente de IA > Preferencias -Cómo se comporta el chat. Consulta @ai-assistant para conocer los detalles de cada grupo. +Cómo se comporta el chat. Consulta @ai-assistant para obtener más detalles sobre cada grupo. ### Visualización del chat -##### _Mostrar indicador de contexto de selección_ (habilitado) - -Muestra qué objeto del modelo está seleccionado actualmente encima del chat, para que veas qué tratará el asistente como contexto. - -##### _Mostrar indicador de instrucciones personalizadas_ (habilitado) +**Mostrar indicador del contexto de la selección** (habilitado): muestra qué objeto del modelo está seleccionado actualmente encima del chat, para que pueda ver qué considerará el asistente como contexto. -Muestra qué [Instrucciones personalizadas](xref:ai-assistant#custom-instructions) se aplicaron sobre cada respuesta. +**Mostrar indicador de instrucciones personalizadas** (habilitado): Muestra qué [instrucciones personalizadas](xref:ai-assistant#custom-instructions) se aplicaron encima de cada respuesta. -##### _Mostrar indicador de búsqueda en la base de conocimientos_ (habilitado) +**Mostrar indicador de búsqueda en la base de conocimientos** (habilitado): muestra el progreso mientras el asistente busca en la base de conocimientos. -Muestra el progreso mientras el asistente busca en la base de conocimientos. +### Compactación del contexto -### Compactación de contexto +**Compactación automática** (habilitada): resume automáticamente la parte más antigua de una conversación a medida que se acerca al límite de contexto del modelo, de modo que una conversación larga pueda continuar. -##### _Compactación automática_ (habilitado) +**Umbral de compactación automática %** (80): Indica el grado de llenado de la ventana de contexto antes de que se ejecute la compactación, como porcentaje de la ventana de contexto del modelo seleccionado. Los valores fuera del rango de 50 a 100 no tienen ningún efecto adicional. -Resume automáticamente la parte más antigua de una conversación cuando se acerca al límite de contexto del modelo, para que una conversación larga pueda continuar. +### Script de C# -##### _Umbral de compactación automática %_ (80) +**Permitir que el asistente de IA ejecute C# Scripts directamente** (desactivado): Permite que el asistente realice el cambio de modelo que has solicitado, en lugar de escribir un script y abrirlo para que lo ejecutes. Solo se ejecutan de esta manera los scripts que el análisis de seguridad considera seguros, es decir, los scripts que afectan a objetos del modelo y nada más; cualquier script que acceda a archivos, a la red o a un ensamblado externo se te seguirá entregando para que lo revises. Cada ejecución se registra como un único paso de deshacer. -Cuánto se llena la ventana de contexto antes de que se ejecute la compactación, como porcentaje de la ventana del _propio modelo_ en lugar de un número fijo de tokens. Los valores fuera del rango de 50 a 100 no tienen ningún efecto adicional. +Este ajuste no está disponible hasta que **Metadatos del modelo** se establezca en **Escribir** en la página [Permisos](#ai-features--permissions), y estará disponible en cuanto cambies ese menú desplegable, sin cerrar el cuadro de diálogo. Tampoco está disponible, con una información sobre herramientas que así lo indica, cuando un administrador ha establecido la [política](xref:policies) `DisableCSharpScripts`. Está desactivado de forma predeterminada deliberadamente: **Metadatos del modelo > Escritura** es también lo que un agente necesita en el servidor MCP, y concederlo allí no debe cambiar de forma silenciosa lo que hace el chat. Consulta [Permitir que el asistente cambie tu modelo](xref:ai-assistant#letting-the-assistant-change-your-model). -### C# Script +**Vista previa de los cambios** (habilitada): muestra el cuadro de diálogo de vista previa del script antes de que se aplique un cambio realizado por el asistente, para que pueda ver todos los cambios en los metadatos del modelo y aceptarlos o cancelarlos. Al cancelar, se restaura el modelo y se informa al asistente de que ha rechazado el cambio. -##### _Permitir que el asistente de IA ejecute C# Scripts directamente_ (deshabilitado) +## Funciones de IA > Servidor MCP -Permite que el asistente realice el cambio en el modelo que pediste, en lugar de escribir un script y abrirlo para que lo ejecutes. Solo se ejecutan así los scripts que el análisis de seguridad considera seguros; es decir, scripts que solo modifican objetos del modelo y nada más. Cualquier script que acceda a archivos, a la red o a un ensamblado externo se te seguirá entregando para su revisión. Cada ejecución queda registrada como un único paso de deshacer. +Configuración del [servidor MCP](xref:mcp-server), que permite que un agente externo como Claude Code, GitHub Copilot o Cursor trabaje en el modelo que tengas abierto. -Esta opción no está disponible hasta que configures **Metadatos del modelo** como **Escritura** en la página [Permisos](#ai-features--permissions), y pasa a estar disponible en cuanto cambies esa lista desplegable, sin cerrar el cuadro de diálogo. Tampoco está disponible, con un tooltip que lo indica, cuando un administrador ha establecido la [directiva](xref:policies) `DisableCSharpScripts`. Está desactivada deliberadamente de forma predeterminada: **Metadatos del modelo > Escritura** es también lo que un agente necesita a través del servidor MCP, y concederlo ahí no debe cambiar silenciosamente el comportamiento del chat. Consulta [Permitir que el asistente cambie tu modelo](xref:ai-assistant#letting-the-assistant-change-your-model). +![Preferencias del servidor MCP](~/content/assets/images/pref-mcp-server.png) -##### _Vista previa de los cambios_ (activada) +**Habilitar servidor MCP** (habilitado): Indica si el servidor MCP está disponible o no. Si se desactiva, se detiene un servidor en ejecución y se eliminan tanto el elemento del menú **Herramientas > Servidor MCP...** como el indicador de la barra de estado. -Muestra el cuadro de diálogo de vista previa del script antes de que se aplique un cambio realizado por el asistente, para que puedas ver todos los cambios de metadatos del modelo y aceptarlos o cancelarlos. Al cancelar, el modelo vuelve a su estado anterior y el asistente recibe la indicación de que rechazaste el cambio. +**Iniciar el servidor MCP automáticamente** (deshabilitado): Inicia el servidor cuando se inicie Tabular Editor, de modo que un agente pueda conectarse sin que tengas que iniciarlo manualmente. Si el puerto está en uso al iniciar, el servidor no se inicia y no se muestra ningún mensaje. -## Funciones de IA > Servidor MCP +**Requerir token de acceso** (deshabilitado): hace que los agentes presenten un token al portador, que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**. El servidor escucha solo en la interfaz de bucle invertido, por lo que esto es más importante en un equipo en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un host Citrix, donde cada sesión puede acceder a «127.0.0.1». Los administradores pueden aplicarlo con la [directiva](xref:policies) `RequireMcpAccessToken`. -Configuración del [servidor MCP](xref:mcp-server), que permite que un agente externo, como Claude Code, GitHub Copilot o Cursor, trabaje en el modelo que tienes abierto. - -![Preferencias del servidor MCP](~/content/assets/images/pref-mcp-server.png) +**Puerto** (42100): El puerto de bucle invertido en el que escucha el servidor, de 1024 a 49151. Si se cambia, se invalidan los registros de agentes existentes, que apuntan a una dirección fija. Si el puerto está ocupado cuando inicia el servidor manualmente, Tabular Editor ofrece el siguiente puerto libre que encuentre. -##### _Habilitar el servidor MCP_ (activado) +## Funciones de IA > Permisos -Determina si el servidor MCP está disponible. Al desmarcarlo, se detiene el servidor en ejecución y se eliminan tanto la opción de menú **Herramientas > Servidor MCP...** como el indicador de la barra de estado. +Un permiso permanente por recurso, que rige tanto el chat del Asistente de IA como cualquier agente conectado a través del servidor MCP. El chat puede solicitar además algo que un permiso no cubra; un agente no puede hacerlo, por lo que, en el caso del MCP, los permisos se aplican tal cual y solo cambian cuando se reinicia el servidor. -##### _Iniciar el servidor MCP automáticamente_ (desactivado) +![Preferencias de permisos de las funciones de IA](~/content/assets/images/pref-ai-permissions.png) -Inicia el servidor cuando se inicia Tabular Editor, para que un agente pueda conectarse sin que tengas que iniciarlo manualmente. Si el puerto está en uso al iniciar, el servidor no se inicia y no se muestra ningún aviso. +| Recurso | Niveles | Predeterminado | Qué cubre | +| -- | -- | -- | -- | +| **Metadatos del modelo** | Denegar / Lectura / Escritura | Lectura | Tablas, columnas, medidas, expresiones, descripciones y relaciones, además de las estadísticas del Analizador VertiPaq. El nivel «Escribir» permite realizar cambios mediante scripts de C# | +| **Datos del modelo** | Denegar / Leer | Denegar | Valores de datos de tu modelo, como los resultados de las consultas DAX. No hay nivel de escritura | +| **Best Practice Analyzer** | Denegar / Lectura / Escritura | Lectura | Lectura: consulta las reglas y ejecuta el análisis; Escritura: añade o modifica reglas | +| **Documentos** | Denegar / Lectura / Escritura | Escritura | Sus pestañas abiertas de script de C# y de consulta DAX. Lectura se refiere a su contenido; Escritura los crea o los modifica | +| **Macros** | Denegar / Lectura / Escritura | Escritura | Su biblioteca de macros | -##### _Requerir token de acceso_ (desactivado) +**Escritura** abarca Lectura, por lo que no es necesario conceder ambos permisos. **Datos del modelo** es el único recurso denegado de forma predeterminada. -Hace que los agentes deban presentar un token bearer, que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**. El servidor solo escucha en la interfaz de loopback, por lo que esto es especialmente relevante en una máquina en la que varias personas han iniciado sesión a la vez, como un host de Escritorio remoto o Citrix, donde cada sesión puede acceder a `127.0.0.1`. Los administradores pueden imponerlo mediante la [directiva](xref:policies) `RequireMcpAccessToken`. +En las ediciones Enterprise, Consultancy y Trial, un administrador puede limitar cualquiera de estos recursos mediante [políticas](xref:policies), por separado para el chat y para el servidor MCP. Una lista desplegable limitada se muestra en modo de solo lectura. Consulte @ai-assistant para saber cómo solicita el chat lo que no cubre un permiso, y @mcp-server para saber lo que ve un agente. -##### _Puerto_ (42100) + -El puerto de loopback en el que escucha el servidor, entre 1024 y 49151. Cambiarlo invalida los registros existentes de los agentes, que apuntan a una dirección fija. Si el puerto está ocupado cuando inicias el servidor manualmente, Tabular Editor te ofrece el siguiente puerto libre que encuentre. +## Tabular Editor > Varios -## Funciones de IA > Permisos +![Preferencias varias](~/content/assets/images/pref-miscellaneous.png) -Una autorización permanente por recurso, que se aplica tanto al chat del Asistente de IA como a cualquier agente conectado a través del servidor MCP. Además, el chat puede pedir algo que una autorización no cubra; un agente no puede hacerlo, así que en MCP las autorizaciones se aplican tal como están y solo cambian cuando el servidor se reinicia. +### Sincronización de metadatos -![Preferencias de permisos de las funciones de IA](~/content/assets/images/pref-ai-permissions.png) +Estos ajustes controlan cómo gestiona Tabular Editor 3 los metadatos del modelo que cambian fuera de la aplicación. Los tres primeros se refieren a un modelo cargado desde una base de datos en una instancia de Analysis Services y se basan en un seguimiento de Analysis Services. **Volver a cargar automáticamente desde el disco** se aplica a un modelo cargado desde un archivo o una carpeta y supervisa esos archivos directamente. -| Recurso | Niveles | Predeterminado | Qué cubre | -| -------------------------- | ------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Metadatos del modelo** | Denegar / Leer / Escribir | Leer | Tablas, columnas, medidas, expresiones, descripciones y relaciones, además de las estadísticas del Analizador VertiPaq. Escribir permite realizar cambios mediante C# Scripts | -| **Datos del modelo** | Denegar / Leer | Denegar | Valores de datos del modelo, como los resultados de Consultas DAX. No existe un nivel de escritura | -| **Best Practice Analyzer** | Denegar / Leer / Escribir | Leer | Leer muestra las reglas y ejecuta el análisis; escribir agrega o modifica reglas | -| **Documentos** | Denegar / Leer / Escribir | Escribir | Tus pestañas abiertas de C# Scripts y de Consultas DAX. Leer permite ver su contenido; escribir permite crearlas o modificarlas | -| **Macros** | Denegar / Leer / Escribir | Escribir | Tu biblioteca de macros | +**Advertir cuando los metadatos locales no estén sincronizados con el modelo implementado** (habilitado): cuando está marcada esta opción, se muestra una barra de información dentro de Tabular Editor cada vez que haya realizado cambios locales en el modelo que aún no se hayan guardado en Analysis Services. La barra desaparece cuando guarda (**Ctrl+S**). -**Escribir** incluye el permiso de lectura, por lo que no es necesario conceder ambos permisos. Los **datos del modelo** son el único recurso que se deniega de forma predeterminada, porque los metadatos describen tu modelo, mientras que los datos _son_ su contenido. +**Rastrear cambios externos del modelo** (habilitado): Al igual que Power BI Desktop puede detectar cuándo una herramienta externa realiza un cambio en el modelo de datos, también puede hacerlo Tabular Editor. Esta opción solo es relevante para las instancias locales de Analysis Services (es decir, los procesos msmdsrv.exe que se ejecutan en el mismo equipo que Tabular Editor). Cuando está marcada, Tabular Editor inicia un seguimiento en Analysis Services y le notifica si se realizan cambios externos. -En las ediciones Enterprise, Consultancy y Trial, un administrador puede establecer un límite para cualquiera de estos mediante una [política](xref:policies), por separado para el chat y para el servidor MCP. Un desplegable con límite se muestra en modo de solo lectura. Consulta @ai-assistant para ver cómo el chat solicita lo que un permiso no cubre, y @mcp-server para ver lo que ve un agente. +**Actualizar automáticamente los metadatos del Tabular Object Model local** (habilitada): Cuando el mecanismo de seguimiento descrito anteriormente está habilitado, esta opción permite que Tabular Editor actualice automáticamente los metadatos del modelo cuando se detecta un cambio externo. Esto resulta útil si sueles alternar entre Power BI Desktop y Tabular Editor 3. -## Tabular Editor > Miscelánea +**Volver a cargar automáticamente desde el disco** (habilitado): Cuando está marcado, Tabular Editor supervisa los archivos de metadatos desde los que se cargó el modelo y vuelve a cargar el modelo cuando otra aplicación los modifica. A diferencia de los dos ajustes anteriores, este no implica un seguimiento de Analysis Services: supervisa los propios archivos, por lo que abarca un modelo cargado desde un archivo `.bim` o desde una carpeta, independientemente de si hay un servidor implicado o no. Si el modelo tiene cambios sin guardar, Tabular Editor le preguntará qué copia desea conservar. Consulte [Recarga automática desde el disco](xref:auto-reload). -![Preferencias de Miscelánea](~/content/assets/images/pref-miscellaneous.png) +**Limpiar rastros huérfanos de Tabular Editor**: Elimina todos los rastros de Analysis Services iniciados por cualquier instancia de Tabular Editor. Úsela cuando queden rastreos después de que Tabular Editor 3 se haya cerrado inesperadamente. -### Sincronización de metadatos +> [!NOTE] +> El botón de limpieza solo está disponible cuando Tabular Editor está conectado a una instancia de Analysis Services. -Estas configuraciones controlan cómo gestiona Tabular Editor 3 los metadatos del modelo que cambian fuera de la aplicación. Las tres primeras se aplican a un modelo cargado desde una base de datos en una instancia de Analysis Services y dependen de una traza de Analysis Services. **Recargar automáticamente desde disco** se aplica a un modelo cargado desde un archivo o una carpeta, y supervisa esos archivos directamente. +## Implementación de modelo > General -##### _Advertir cuando los metadatos locales estén desincronizados con el modelo implementado_ (habilitado) +![Preferencias de implementación de modelo](~/content/assets/images/pref-model-deployment.png) -Cuando la marcas, se muestra una barra de información dentro de Tabular Editor, siempre que hayas hecho cambios locales en el modelo que aún no se hayan guardado en Analysis Services. Por ejemplo, si te preguntas por qué una consulta DAX o una Pivot Grid no producen el resultado esperado, podría deberse a que se ha cambiado la expresión de una medida en Tabular Editor sin guardar el cambio en Analysis Services. La barra desaparece cuando pulsas Guardar (Ctrl+S). +### Opciones de implementación -##### _Hacer seguimiento de los cambios externos en el modelo_ (habilitado) +**Agregar anotación de metadatos al implementar** (deshabilitado): Añade detalles de la implementación al modelo implementado: el usuario, el equipo cliente, la hora, la versión de Tabular Editor y el modo de implementación. -Al igual que Power BI Desktop puede detectar cuándo una herramienta externa realiza cambios en el Data model, Tabular Editor también puede hacerlo. Esta opción solo es relevante para instancias locales de Analysis Services (es decir, procesos msmdsrv.exe que se ejecutan en el mismo equipo que Tabular Editor). Al marcarla, Tabular Editor inicia una traza en Analysis Services y te notifica si se realizan cambios externos. +**Guardar copia de seguridad de Model.bim al implementar** (habilitado): Guarda una copia comprimida del archivo «Model.bim» del modelo en la carpeta **Ubicación de la copia de seguridad** en cada implementación. No se guarda ninguna copia de seguridad mientras **Ubicación de copia de seguridad** esté vacía. -##### _Actualizar automáticamente los metadatos locales del Tabular Object Model_ (habilitado) +**Ubicación de copia de seguridad**: La carpeta para las copias de seguridad de las implementaciones. Disponible cuando se selecciona **Guardar copia de seguridad de Model.bim al implementar**. -Cuando está habilitado el mecanismo de trazas descrito anteriormente, esta opción permite que Tabular Editor actualice automáticamente los metadatos del modelo cuando se detecta un cambio externo. Esto es útil si cambias a menudo entre Power BI Desktop y Tabular Editor 3. +### Opciones de guardado de modelo -##### _Recargar automáticamente desde disco_ (habilitado) +**Guardar copia de seguridad de Model.bim al guardar modelo** (habilitado): Guarda una copia comprimida del archivo «Model.bim» del modelo en la carpeta **Ubicación de la copia de seguridad** cada vez que guarda el modelo. No se guarda ninguna copia de seguridad mientras **Ubicación de copia de seguridad** esté vacía. -Cuando está marcada, Tabular Editor supervisa los archivos de metadatos desde los que se cargó el modelo y vuelve a cargar el modelo cuando otra aplicación los modifica. A diferencia de las dos opciones anteriores, esto no implica una traza de Analysis Services: supervisa los propios archivos, por lo que se aplica a un modelo cargado desde un archivo `.bim` o desde una carpeta, haya o no un servidor de por medio. Si el modelo tiene cambios sin guardar, Tabular Editor te pregunta qué copia quieres conservar. Consulta [Recarga automática desde disco](xref:auto-reload). +**Ubicación de copia de seguridad**: La carpeta para guardar las copias de seguridad. Disponible cuando se selecciona **Guardar copia de seguridad de Model.bim al guardar modelo**. -##### _Limpiar trazas huérfanas de Tabular Editor_ +## Implementación de modelo > Actualización de datos -Normalmente, Tabular Editor 3 debería detener y eliminar automáticamente cualquier traza de AS iniciada debido a la configuración anterior. Sin embargo, si la aplicación se cerró de forma prematura, es posible que las trazas nunca se detengan. Al hacer clic en este botón, se eliminarán todas las trazas de AS iniciadas por cualquier instancia de Tabular Editor. +### Direct Lake -> [!NOTE] -> El botón de limpieza solo está disponible cuando Tabular Editor está conectado a una instancia de Analysis Services. +**Actualización automática al guardar nuevas tablas** (habilitada): Actualiza un modelo Direct Lake cuando lo guarda con nuevas tablas. Si la desactiva, las nuevas tablas permanecerán sin procesar hasta que actualice el modelo, y las consultas que se realicen sobre ellas recurrirán al modo DirectQuery. ## Exploración de datos > Pivot Grid + ![Preferencias de Pivot Grid](~/content/assets/images/pref-pivot-grid.png) ### Básico -##### _Actualización automática de Pivot Grid_ (activada) +**Actualizar automáticamente Pivot Grids de forma predeterminada** (habilitado): Actualiza automáticamente las Pivot Grids cuando se guardan los cambios en el modelo. Al igual que con las consultas DAX, esto le permite ver inmediatamente el impacto de los cambios en las medidas. -Actualiza automáticamente las cuadrículas Pivot Grid cuando se guardan los cambios del modelo. Al igual que con las consultas DAX, esto te permite ver al instante el impacto de los cambios en las medidas. - -##### _Avisar si los campos del Pivot Grid no coinciden_ (habilitado) - -Muestra una advertencia cuando las definiciones de campos del Pivot Grid no coinciden con el modelo actual. Esto puede ocurrir si has eliminado o cambiado el nombre de los campos usados en un Pivot Grid guardado. +**Mostrar advertencia si Pivot Grid no coincide con el modelo** (habilitado): Muestra una advertencia cuando un diseño de Pivot Grid utiliza campos que el modelo actual no tiene, por ejemplo, después de eliminar o cambiar el nombre de un campo, abrir un diseño guardado desde un modelo diferente o mantener un Pivot Grid abierto mientras abre un modelo diferente. El ajuste también controla la confirmación que aparece antes de que se abra un modelo diferente mientras permanecen abiertos los Pivot Grids con campos en su diseño. ### Encabezados de campo -##### _Ajuste de línea en los encabezados del Pivot Grid_ (habilitado) - -Habilita el ajuste de línea en los encabezados del Pivot Grid. Esto hace que los nombres de campo largos sean más legibles. +**Ajuste de línea en encabezados de campo** (habilitado): Los encabezados de campo se ajustan a varias líneas cuando el texto del encabezado no cabe en una sola línea. ### Lista de campos -##### _Mostrar siempre la lista de campos del Pivot Grid_ (habilitado) +**Mostrar siempre lista de campos** (habilitado): Muestra la lista de campos cuando se crea una nueva Pivot Grid. -Mantén visible, de forma predeterminada, la lista de campos del Pivot Grid. Desactiva esta opción si prefieres disponer de más espacio en pantalla para el propio Pivot Grid. +**Mantener campos visibles** (habilitado): Mantiene un campo en la sección Campos de la lista de campos después de añadirlo al Pivot Grid. -##### _Mostrar todos los campos en la personalización del Pivot Grid_ (habilitado) +**Diseño** (sección de campos y sección de áreas apiladas): El diseño predeterminado de la lista de campos: -Muestra de forma predeterminada todos los campos disponibles en la lista de campos del Pivot Grid, incluidos los campos ocultos. +- **Sección de campos y sección de áreas apiladas** +- **Sección de campos y sección de áreas lado a lado** +- **Solo sección de campos** +- **Solo sección de áreas (2 x 2)** +- **Solo sección de áreas (1 x 4)** -##### _Diseño predeterminado para la personalización de Pivot Grid_ (StackedDefault) +### Mantener los documentos abiertos al cambiar de modelo -Elige el diseño predeterminado para la lista de campos de la Pivot Grid. Las opciones incluyen: - -- **StackedDefault**: Campos y áreas en un único panel apilado -- **StackedSideBySide**: Campos y áreas en paneles en paralelo -- **TopPanelOnly**: Lista de campos solo en la parte superior -- **BottomPanelOnly2by2**: Lista de campos en una cuadrícula 2x2 en la parte inferior -- **BottomPanelOnly1by4**: Lista de campos en un diseño 1x4 en la parte inferior +**Mantener los Pivot Grids abiertos cuando se abra un modelo diferente** (habilitado): Mantener los documentos de Pivot Grid abiertos cuando se abra un modelo diferente y conectarlos al nuevo modelo. Se mantiene el diseño de los campos y se eliminan los campos que el nuevo modelo no tiene. Cuando está desactivada, las Pivot Grids se cierran junto con el modelo anterior. Consulte @pivot-grid. ## Exploración de datos > Consulta DAX -![Preferencias de la Consulta DAX](~/content/assets/images/pref-dax-query.png) + +![Preferencias de consultas DAX](~/content/assets/images/pref-dax-query.png) ### Básico -##### _Ejecutar automáticamente las Consultas DAX de forma predeterminada_ (habilitado) - -Las nuevas Consultas DAX se abren con **Ejecución automática** activada, por lo que se vuelven a ejecutar cada vez que se realizan cambios en el modelo semántico implementado. Desactiva esta opción si prefieres ejecutar cada consulta por tu cuenta. - -##### _Mantener la ordenación y el filtrado existentes en la cuadrícula de resultados_ (WhenQueryUnchanged) +**Ejecutar automáticamente consultas DAX de forma predeterminada** (habilitado): Las nuevas consultas DAX se abren con la **Ejecución automática** habilitada, por lo que la consulta se vuelve a ejecutar cada vez que se realizan cambios en el modelo semántico implementado. Desactívela si prefiere ejecutar cada consulta usted mismo. -Controla si se deben conservar los filtros y la ordenación de la cuadrícula al volver a ejecutar consultas: +**Mantener la ordenación y el filtrado existentes en la cuadrícula de resultados** (WhenQueryUnchanged): Controle si desea conservar los filtros y la ordenación de la cuadrícula al volver a ejecutar las consultas: +- **Nunca**: la ordenación y el filtrado siempre se restablecen cuando se ejecuta una consulta. +- **WhenQueryUnchanged**: la ordenación y el filtrado solo se restablecen cuando se modifica la consulta. +- **Siempre**: la ordenación y el filtrado nunca se restablecen si las columnas siguen existiendo. -- **Nunca**: la ordenación y el filtrado siempre se restablecen cuando se ejecuta una consulta -- **WhenQueryUnchanged**: la ordenación y el filtrado se restablecen solo cuando se modifica la consulta -- **Always**: la ordenación y el filtrado nunca se restablecen si las columnas siguen existiendo +### Configuración de consulta -### Configuración de la consulta +**Selección inteligente** (habilitada): Cuando ejecuta parte de una consulta, Tabular Editor convierte esa selección en una consulta DAX válida en su nombre, envolviendo una expresión escalar entre llaves y añadiendo la sección `DEFINE` o la palabra clave `EVALUATE` cuando no forman parte de la selección. En un documento con varias consultas `DEFINE ... EVALUATE`, la sección `DEFINE` añadida es la que pertenece a la consulta seleccionada. Una referencia de columna seleccionada, incluida una en una cláusula «ORDER BY», devuelve los valores distintos de la columna. -##### _Selección inteligente_ (habilitada) - -Cuando ejecutas parte de una consulta, Tabular Editor convierte esa selección en una consulta DAX válida automáticamente, envolviendo una expresión escalar entre llaves y añadiendo la sección `DEFINE` o la palabra clave `EVALUATE` cuando no forman parte de la selección. - -##### _Límite de filas_ (1,000) - -Envuelve cada instrucción `EVALUATE` en una llamada a `TOPN`, para evitar que una consulta accidental sobre una tabla grande se ejecute durante mucho tiempo o agote la memoria. Establécelo en `0` para quitar el límite por completo. +**Límite de filas** (1000): Encierra cada sentencia `EVALUATE` en una llamada `TOPN`, para evitar que una consulta accidental sobre una tabla grande se ejecute durante mucho tiempo o agote la memoria. Establézcalo en «0» para eliminar el límite por completo. ### Generación de código -##### _Usar comentarios como separadores_ (habilitado) +**Usar comentarios como separadores** (activado): Inserta comentarios en las definiciones de objetos generadas, por ejemplo, en el bloque `DEFINE` producido por **Definir objeto en consulta**, para que sean más fáciles de leer. -Inserta comentarios en las definiciones de objetos generadas, por ejemplo en el bloque `DEFINE` producido por **Definir objeto en la consulta**, para que sean más fáciles de leer. +### Mantener los documentos abiertos al cambiar de modelo + +**Mantener abiertas las consultas DAX cuando se abra un modelo diferente** (habilitado): Mantener abiertos los documentos de consultas DAX cuando se abra un modelo diferente. Se conserva el texto de la consulta, se borran los resultados anteriores y la consulta se ejecuta contra el modelo recién abierto. Cuando está desactivada, los documentos de consultas DAX se cierran junto con el modelo anterior. Consulte @dax-query. ## Exploración de datos > Vista previa de tabla -![Preferencias de Vista previa de tabla](~/content/assets/images/pref-table-preview.png) +![Preferencias de vista previa de tabla](~/content/assets/images/pref-table-preview.png) ### Básico -##### _Actualizar automáticamente las Vistas previas de tabla de forma predeterminada_ (habilitado) - -Las nuevas Vistas previas de tabla se abren con **Actualización automática** habilitada, de modo que la vista previa se actualiza cada vez que se realizan cambios en el modelo semántico implementado. Esto es útil al depurar: actualiza una expresión en una ventana mientras mantienes abierta una vista previa de la misma tabla en otra. +**Actualizar automáticamente vistas previas de tabla de forma predeterminada** (habilitado): Las nuevas vistas previas de tabla se abren con la **Actualización automática** habilitada, por lo que la vista previa se actualiza cada vez que se realizan cambios en el modelo semántico implementado. Esto es útil al depurar: actualice una expresión en una ventana mientras una vista previa de la misma tabla está abierta en otra. -##### _Ordenar alfabéticamente las columnas de la Vista previa de tabla_ (desactivado) +**Ordenar las columnas de la vista previa de la tabla alfabéticamente** (desactivado): Cuando está marcado, las columnas de la vista previa de la tabla se ordenan alfabéticamente por nombre, coincidiendo con el orden en que @tom-explorer-view enumera las columnas de una tabla. Cuando no está marcada (valor predeterminado), las columnas aparecen en el orden en que las devuelve el motor, que es aproximadamente el orden interno de las columnas y puede parecer arbitrario. -Al marcarla, las columnas de la Vista previa de tabla se ordenan alfabéticamente por nombre, coincidiendo con el orden en que @tom-explorer-view muestra las columnas de una tabla. Cuando no está marcada (valor predeterminado), las columnas aparecen en el orden en que las devuelve el motor, que es aproximadamente el orden interno de las columnas y puede parecer arbitrario. +**Número máximo de valores en el menú desplegable de filtros** (5000): Número máximo de valores distintos que aparecen en el menú desplegable de filtros de una columna. En una columna con más valores distintos que este número, los valores que superen el límite no se mostrarán y no se podrán marcar directamente. Si se aumenta, se mostrarán más valores, pero a costa de una consulta más pesada cada vez que se abra el menú desplegable. Acepta valores de 100 a 1 000 000. -##### _Máx. valores en el menú desplegable del filtro_ (5,000) - -Número máximo de valores distintos que se muestran en el desplegable de filtro de una columna. En una columna con más valores distintos que este límite, los valores que lo superen no se mostrarán en la lista ni podrán marcarse directamente. Al aumentarlo, se mostrarán más valores, a costa de una consulta más pesada cada vez que se abra el desplegable. Acepta de 100 a 1.000.000. - -##### _Máx. filas para ordenar sin una jerarquía de atributos_ (100.000) - -Límite superior del número de filas que Tabular Editor ordena al ordenar por una columna que no tiene una jerarquía de atributos para ordenar. +**Máx. de filas para ordenar sin una jerarquía de atributos** (100 000): Límite superior del número de filas que Tabular Editor ordena por una columna que no tiene una jerarquía de atributos por la que ordenar. ### DirectQuery -##### _Límite de filas_ (100) - -Número máximo de filas que se pueden recuperar para una Vista previa de tabla en modo DirectQuery. Auméntalo si necesitas ver más datos, teniendo en cuenta que cada fila se recupera del origen subyacente. +**Límite de filas** (100): Número máximo de filas que se van a recuperar para una vista previa de tabla en el modo DirectQuery. Auméntelo si necesita ver más datos, teniendo en cuenta que cada fila se extrae del origen subyacente. ### Comportamiento -##### _Seguir la columna seleccionada en el Explorador TOM_ (habilitado) - -Cuando seleccionas una columna en la vista @tom-explorer-view, la Vista previa de tabla abierta se desplaza hasta esa columna y la resalta; es la forma más rápida de encontrar una columna en una tabla muy ancha. La misma configuración puede activarse y desactivarse para una sola vista previa con **Seguir la columna seleccionada** en la barra de herramientas de la Vista previa de tabla. - -## Editor de DAX > General - -![Editor de Dax General](~/content/assets/images/dax-editor-general.png) - -El Editor de DAX de Tabular Editor 3 es muy configurable. Esta página ofrece opciones para la configuración general del Editor de DAX: - -##### _Números de línea_ (habilitado) - -Muestra los números de línea en el margen izquierdo del editor. - -##### _Plegado de código_ (habilitado) +**Seguir la columna seleccionada en el Explorador TOM** (habilitado): Cuando selecciona una columna en la @tom-explorer-view, la vista previa de la tabla abierta desplaza esa columna hasta que quede visible y la resalta, lo cual es la forma más rápida de encontrar una columna de una tabla muy ancha. El mismo ajuste se puede activar y desactivar para una sola vista previa con **Seguir columna seleccionada** en la barra de herramientas de la vista previa de tabla. -Habilita regiones plegables en el código DAX para mejorar la legibilidad. ¡Asegúrate de probar esta función! +## Editores de texto > Editor de DAX > General -##### _Espacios en blanco visibles_ (desactivado) +![Editor DAX - General](~/content/assets/images/dax-editor-general.png) -Muestra puntos para los espacios y flechas para las tabulaciones. Esto puede ser útil para diagnosticar problemas de sangría. +El editor DAX de Tabular Editor 3 es altamente configurable. Esta página ofrece ajustes para la configuración general del editor DAX: -##### _Guías de sangría_ (habilitado) +**Números de línea** (habilitado): Muestra los números de línea en el margen izquierdo del editor. -Muestra líneas verticales para indicar los niveles de sangría. +**Plegado de código** (habilitado): Habilita las regiones contraíbles en el código DAX para mejorar la legibilidad. ¡Asegúrate de probar esta función! -##### _Usar tabulaciones_ (desactivado) +**Espacios en blanco visibles** (desactivado): Muestra puntos para los espacios y flechas para las tabulaciones. Esto puede ser útil para diagnosticar problemas de sangría. -Si se selecciona, se inserta un carácter de tabulación (`\t`) cada vez que se pulsa la tecla TAB. De lo contrario, se insertará el número de espacios correspondiente al ajuste _Ancho de sangría_. +**Guías de sangría** (habilitadas): Muestra líneas verticales para indicar los niveles de sangría. -##### _Estilo de comentario_ (barras) +**Usar tabulaciones** (desactivado): cuando está marcado, se inserta un carácter de tabulación (`\t`) cada vez que se pulsa la tecla TAB. De lo contrario, se inserta un número de espacios correspondiente al ajuste **Ancho de sangría**. -DAX admite comentarios de línea con barras (`//`) o guiones (`--`). Esta configuración determina qué estilo de comentario se usa cuando Tabular Editor 3 genera código DAX. +**Estilo de comentario** (barras diagonales): DAX admite comentarios de línea que utilizan barras diagonales («//») o guiones («--»). Este ajuste determina qué estilo de comentario se utiliza cuando Tabular Editor 3 genera código DAX. -##### _Documentación de funciones DAX_ - -Utiliza esta configuración para especificar qué URL se abrirá en el navegador web predeterminado cada vez que pulses F12 con el cursor sobre una función DAX. Las opciones incluyen https://dax.guide (recomendado) y la documentación oficial de Microsoft. +**Documentación de funciones DAX**: Use esta configuración para especificar qué URL abrir en el navegador web predeterminado cada vez que pulse F12 mientras el cursor esté situado sobre una función DAX. Las opciones incluyen https://dax.guide (recomendada) y la documentación oficial de Microsoft. ### Configuración de DAX -##### _Configuración regional_ - -Especifica la configuración regional para las funciones de DAX y el formato. - -##### _Configuración de la versión de Analysis Services_ - -Estas configuraciones solo son relevantes cuando Tabular Editor 3 no puede determinar la versión de Analysis Services utilizada, como ocurre cuando se carga directamente un archivo Model.bim. En este caso, Tabular Editor intenta deducir a qué versión se implementará el modelo, en función del nivel de compatibilidad. Si Tabular Editor genera un Report de errores semánticos o de sintaxis que no lo son, puede que debas ajustar esta configuración. - -## Editor de DAX > Formato automático - -![Configuración de formato automático](~/content/assets/images/auto-formatting-settings.png) +**Configuración regional**: Especifique la configuración regional para las funciones y el formato de DAX. -El Editor de DAX es **muy** potente y te ayuda a generar código DAX bonito y fácil de leer mientras escribes. +**Configuración de la versión de Analysis Services**: Estos ajustes solo son relevantes cuando Tabular Editor 3 no puede determinar la versión de Analysis Services utilizada, como ocurre cuando se carga directamente un archivo Model.bim. En este caso, Tabular Editor intenta adivinar en qué versión se implementará el modelo, en función del nivel de compatibilidad. Si Tabular Editor informa de errores semánticos o de sintaxis incorrectos, configúrelos según la versión de Analysis Services en la que vaya a implementar. -##### _Formatear el código automáticamente mientras escribes_ (habilitado) +## Editores de texto > Editor de DAX > Formato automático -Esta opción aplicará automáticamente ciertas reglas de formato cuando se produzcan determinadas pulsaciones de teclas. Por ejemplo, al cerrar un paréntesis, esta función garantiza que todo lo que esté dentro del paréntesis se formatee según los demás ajustes de esta página. +![Ajustes de formato automático](~/content/assets/images/auto-formatting-settings.png) -##### _Formatear automáticamente las llamadas a funciones_ (habilitado) +El editor de DAX es **muy** potente y le ayuda a crear un código DAX atractivo y legible mientras escribe. -Esta opción aplica sangría automáticamente a los argumentos de una función cuando se inserta un salto de línea dentro de una llamada a una función. +**Formatear código automáticamente mientras escribe** (habilitado): Aplica reglas de formato cuando se pulsan determinadas teclas. Por ejemplo, cuando se cierra un paréntesis, todo lo que hay dentro de los paréntesis se formatea de acuerdo con los demás ajustes de esta página. -##### _Cierre automático de llaves_ (habilitado) +**Formatear llamadas a funciones automáticamente** (habilitado): Formatea las llamadas a funciones (espaciado entre argumentos y paréntesis) cuando se cierra un paréntesis. -Esta opción aplica sangría automáticamente a los argumentos de una función cuando se inserta un salto de línea dentro de una llamada a una función. +**Sangría automática** (habilitada): Esta opción aplica sangría automáticamente a los argumentos de la función cuando se inserta un salto de línea dentro de una llamada a función. -##### _Sangría automática_ (habilitado) +**Llave automática** (habilitada): Esta opción inserta automáticamente la llave o comilla de cierre cada vez que se introduce una llave o comilla de apertura. -Cuando está habilitada, esta opción envuelve automáticamente la selección actual con la llave de cierre al escribir una llave de apertura. - -##### _Envolver la selección_ (habilitado) - -Esta opción inserta automáticamente la llave o la comilla de cierre cuando se escribe una llave o comilla de apertura. +**Envolver selección** (habilitado): Cuando está habilitada, esta opción envuelve automáticamente la selección actual con la llave de cierre cuando se introduce una llave de apertura. ### Reglas de formato -Estos ajustes controlan cómo se formatean los espacios en blanco del código DAX, tanto cuando se aplica el formato automático como cuando formateas el código manualmente. +Estos ajustes controlan cómo se formatean los espacios en blanco del código DAX, tanto cuando se produce el formateo automático como cuando el código se formatea manualmente. -##### _Espacio después de las funciones_ (deshabilitado) +**Espacio después de funciones** (desactivado) -# [Deshabilitado](#tab/space-after-function-off) +# [Habilitado](#tab/space-after-function-on) ```DAX SUM ( 'Sales'[Amount] ) ``` -# [Habilitado](#tab/space-after-function-on) +# [Desactivado](#tab/space-after-function-off) ```DAX SUM( 'Sales'[Amount] ) @@ -810,11 +598,9 @@ SUM( 'Sales'[Amount] ) *** -##### [Habilitado](#tab/newline-after-function-on) - -Se aplica solo cuando es necesario dividir una llamada de función en varias líneas. +**Nueva línea después de funciones** (deshabilitado): Se aplica solo cuando una llamada a función debe dividirse en varias líneas. -# [Deshabilitado](#tab/newline-after-function-off) +# [Habilitado](#tab/newline-after-function-on) ```DAX SUM @@ -823,7 +609,7 @@ SUM ) ``` -# _Salto de línea después de las funciones_ (deshabilitado) +# [Desactivado](#tab/newline-after-function-off) ```DAX SUM( @@ -833,15 +619,15 @@ SUM( *** -##### _Añadir espacios en los paréntesis_ (habilitado) +**Rellenar paréntesis** (activado) -# [Deshabilitado](#tab/pad-parentheses-off) +# [Habilitado](#tab/pad-parentheses-on) ```DAX SUM( Sales[Amount] ) ``` -# [Habilitado](#tab/pad-parentheses-on) +# [Deshabilitado](#tab/pad-parentheses-off) ```DAX SUM(Sales[Amount]) @@ -849,223 +635,144 @@ SUM(Sales[Amount]) *** -##### _Límite de línea del formato largo_ (120) - -El número máximo de caracteres que se conservarán en una sola línea antes de dividir una expresión en varias líneas, al usar la opción **Formatear DAX (líneas cortas)**. - -##### _Límite de línea del formato corto_ (60) - -El número máximo de caracteres que se pueden mantener en una sola línea antes de dividir una expresión en varias líneas, al usar la opción **Formatear DAX (líneas largas)**. - -### Mayúsculas/minúsculas y comillas - -Además de dar formato a los espacios en blanco del código DAX, Tabular Editor 3 también puede corregir referencias a objetos y el uso de mayúsculas/minúsculas en funciones y palabras clave. - -##### _Corregir calificadores de medidas/columnas_ (habilitado) - -Si se activa, los prefijos de tabla se quitan automáticamente de las referencias a medidas y se agregan automáticamente a las referencias a columnas. - -##### _Uso de mayúsculas preferido para palabras clave_ (MAYÚSCULAS) +**Límite de línea de formato largo** (120): El número máximo de caracteres que se pueden mantener en una sola línea antes de que una expresión se divida en varias líneas, al usar la opción **Formatear DAX (líneas largas)**. -Esta configuración permite cambiar el uso de mayúsculas/minúsculas de las palabras clave, como `ORDER BY`, `VAR`, `EVALUATE`, etc. También controla los _valores_ de palabras clave fijas que ofrece el autocompletado para las funciones que los aceptan: `ASC` y `DESC`, `KEEP`, `FIRST`, `LAST` y `DEFAULT`, las direcciones de `CROSSFILTER` y los valores `EXPLICIT` e `INFERRED` de `LOOKUP`. Elige **Capitalizar solo la primera letra** para que se ofrezca `Explicit` en lugar de `EXPLICIT`. +**Límite de línea de formato corto** (60): El número máximo de caracteres que se pueden mantener en una sola línea antes de que una expresión se divida en varias líneas, al usar la opción **Formatear DAX (líneas cortas)**. -##### _Uso de mayúsculas preferido para funciones_ (MAYÚSCULAS) +### Mayúsculas y comillas -Esta configuración permite cambiar el uso de mayúsculas/minúsculas de las funciones, como `CALCULATE(...)`, `SUM(...)`, etc. +Además de formatear los espacios en blanco del código DAX, Tabular Editor 3 también puede corregir las referencias a objetos y las mayúsculas y minúsculas de las funciones y palabras clave. -##### _Corregir mayúsculas/minúsculas de palabras clave/funciones_ (habilitado) +**Corregir calificadores de medida/columna** (habilitado): Cuando está marcada esta opción, los prefijos de tabla se eliminan automáticamente de las referencias a medidas y se insertan automáticamente en las referencias a columnas. -Si se activa, el uso de mayúsculas/minúsculas de las palabras clave y las funciones se corrige automáticamente cada vez que el código se formatea automáticamente o manualmente. +**Mayúsculas preferidas para palabras clave** (MAYÚSCULAS): Este ajuste le permite cambiar las mayúsculas utilizadas para las palabras clave, como «ORDER BY», «VAR», «EVALUATE», etc. También rige los valores fijos de las palabras clave que ofrece el autocompletado para las funciones que los utilizan: «ASC» y «DESC», «KEEP», «FIRST», «LAST» y «DEFAULT», las direcciones de «CROSSFILTER» y «EXPLICIT» e «INFERRED» de «LOOKUP». Elija **Poner en mayúscula solo la primera letra** para que se le ofrezca «Explicit» en lugar de «EXPLICIT». -##### _Corregir mayúsculas/minúsculas en referencias a objetos_ (habilitado) +**Mayúsculas preferidas para funciones** (MAYÚSCULAS): Este ajuste le permite cambiar las mayúsculas utilizadas para las funciones, como `CALCULATE(...)`, `SUM(...)`, etc. -DAX no distingue entre mayúsculas y minúsculas. Si se activa, las referencias a tablas, columnas y medidas se corrigen automáticamente para que el uso de mayúsculas/minúsculas coincida con el nombre físico de los objetos a los que se hace referencia. +**Corregir mayúsculas de palabras clave/funciones** (habilitado): Cuando está marcada esta opción, las mayúsculas de las palabras clave y las funciones se corrigen automáticamente cada vez que el código se formatea automáticamente o manualmente. -##### _Poner siempre comillas a los nombres de tabla_ (deshabilitado) +**Corregir mayúsculas de referencias de objetos** (habilitado): DAX es un lenguaje que no distingue entre mayúsculas y minúsculas. Cuando esto está habilitado, las referencias a tablas, columnas y medidas se corrigen automáticamente de modo que las mayúsculas coincidan con el nombre físico de los objetos a los que se hace referencia. -Para hacer referencia a ciertos nombres de tabla no es necesario encerrarlos entre comillas simples en DAX. Sin embargo, si prefieres que las referencias a tablas siempre lleven comillas, puedes activar esta opción. +**Entrecomillar siempre tablas** (deshabilitado): Hacer referencia a ciertos nombres de tabla no requiere entrecomillarlos con comillas simples en DAX. Sin embargo, si prefiere que las referencias a tablas vayan siempre entre comillas, puede marcar esta opción. -##### _Anteponer siempre el prefijo a las columnas de extensión_ (deshabilitado) +**Prefijar siempre las columnas de extensión** (deshabilitado): Las columnas de extensión se pueden definir sin un nombre de tabla. Cuando está marcado, el Editor de DAX añade el prefijo de la tabla a una columna de extensión. -Las columnas de extensión se pueden definir sin un nombre de tabla. Si se activa, el Editor de DAX siempre agregará el prefijo de tabla a una columna de extensión. +## Editores de texto > Editor de DAX > Code Assist -## Editor de DAX > Code Assist +![Preferencias de Code Assist del editor de DAX](~/content/assets/images/pref-dax-code-assist.png) -![Preferencias de Code Assist del Editor de DAX](~/content/assets/images/pref-dax-code-assist.png) +En esta página, puede configurar las dos funciones más importantes de Code Assist, a saber, las descripciones emergentes (también llamadas «información de parámetros») y el autocompletado. -En esta página puedes configurar las dos funciones más importantes de Code Assist: los calltips (también conocidos como "información de parámetros") y el autocompletado. +**Activador de autocompletar**: Controle cuándo aparece la lista de autocompletar. Las opciones incluyen la activación automática después de escribir un cierto número de caracteres o la activación manual con CTRL+Espacio. -##### _Disparador de autocompletado_ +**Activador de información sobre llamadas**: Controle cuándo aparece la información sobre los parámetros. Las opciones incluyen la activación automática al abrir un paréntesis de función o la activación manual. -Controla cuándo aparece la lista de autocompletado. Las opciones incluyen la activación automática después de escribir un determinado número de caracteres, o la activación manual con Ctrl+Espacio. +**Búsqueda incremental** (habilitada): habilita la búsqueda difusa/incremental en el autocompletado. Esto le permite encontrar elementos escribiendo partes de su nombre, no solo el principio. -##### _Disparador de sugerencias de llamada_ +**Sugerir nombres de tablas** (habilitado): Incluir nombres de tablas en las sugerencias de autocompletado. -Controla cuándo aparece la información de parámetros. Las opciones incluyen la activación automática al abrir el paréntesis de una función o la activación manual. +**Entrecomillar siempre los nombres de tabla** (deshabilitado): Entrecomilla automáticamente los nombres de tabla en las sugerencias, incluso cuando no sea necesario. -##### _Búsqueda incremental_ (activada) +**Mostrar solo la primera letra** (desactivado): Mostrar solo los elementos que comienzan con la letra escrita. Deshabilite esta opción para usar la búsqueda incremental en su lugar. -Habilita la búsqueda difusa/incremental en el autocompletado. Esto te permite encontrar elementos escribiendo partes de su nombre, no solo el inicio. +## Editores de texto > Editor de DAX > Acciones de código -##### _Sugerir nombres de tablas_ (activado) +![Preferencias de acciones de código del editor de DAX](~/content/assets/images/pref-dax-code-actions.png) -Incluye nombres de tablas en las sugerencias de autocompletado. +Configurar sugerencias automáticas de mejora del código: -##### _Poner siempre entre comillas los nombres de las tablas_ (desactivado) +**Prefijos de variables**: Defina los prefijos aceptables para los nombres de variables (p. ej., `_`, `__`, `$`, `var_`, `var`, `v_`, `v`, `VAR_`). Las acciones de código sugieren añadir estos prefijos a los nombres de variables que no siguen la convención. -Pone automáticamente entre comillas los nombres de las tablas en las sugerencias, incluso cuando no es necesario. +**Prefijos de columna**: Defina los prefijos aceptables para los nombres de columnas temporales (p. ej., `@`, `$`, `_`, `x`, `x_`). Las acciones de código sugieren añadir estos prefijos a los nombres de columnas temporales que no siguen la convención. -##### _Mostrar solo la primera letra_ (desactivado) +## Editor SQL / Editor M / Editor C# -Muestra solo los elementos que empiezan por la letra escrita. Desactiva esta opción para usar la búsqueda incremental en su lugar. - -## Editor de DAX > Acciones de código - -![Preferencias de acciones de código del Editor de DAX](~/content/assets/images/pref-dax-code-actions.png) - -Configura sugerencias automáticas de mejora de código: - -##### _Prefijos de variables_ - -Define prefijos aceptables para nombres de variables (p. ej., `_`, `__`, `var_`, `var`, `v_`, `v`, `VAR_`). Las acciones de código sugerirán añadir estos prefijos a los nombres de variables que no sigan la convención. - -##### _Prefijos de columnas_ - -Define prefijos aceptables para nombres de columnas temporales (p. ej., `@`, `_`, `x`, `x_`). Las acciones de código sugerirán añadir estos prefijos a los nombres de columnas temporales que no sigan la convención. - -## Editor SQL / Editor M / Editor C\# - - - -Hay opciones de configuración similares para los editores de scripts SQL, M (Power Query) y C# Script, entre ellas: + +Hay opciones de configuración similares disponibles para los editores de scripts SQL, M (Power Query) y C#, incluidas las siguientes: - Resaltado de sintaxis y esquemas de color - Opciones de formato automático - Funciones de Code Assist y autocompletado -- Estilos de comentarios y preferencias de sangría - -Cada editor se puede personalizar de forma independiente para ajustarse a tu estilo de programación preferido. +- Estilos de comentarios y preferencias de sangrado -## DAX Formatter +Cada editor se puede personalizar de forma independiente para que coincida con tu estilo de programación preferido. - +## Formateador DAX -##### _Consentimiento para DAX Formatter_ (deshabilitado) + -Aceptar enviar el código DAX al servicio externo de formato DAX (www.daxformatter.com). Cuando está habilitado, puedes usar este servicio para dar formato al código DAX según los estándares de la comunidad. +**Consentimiento para el formateador de DAX** (desactivado): Acepte enviar código DAX al servicio externo de formateo de DAX (www.daxformatter.com). Cuando está habilitado, puede usar este servicio para formatear código DAX de acuerdo con los estándares de la comunidad. -##### _Tiempo de espera de la solicitud de DAX Formatter_ (5000) +**Tiempo de espera de las solicitudes del formateador de DAX** (5000): Tiempo de espera en milisegundos para las solicitudes del formateador de DAX. Aumente este valor si suele recibir errores de tiempo de espera al usar el formateador de DAX. -Tiempo de espera, en milisegundos, para las solicitudes a DAX Formatter. Aumentar este valor si a menudo recibes errores de tiempo de espera al usar DAX Formatter. +## Integración del Optimizador de DAX -## Integración con el Optimizador de DAX + - +Configure la integración con DAX Optimizer (solo en la Edición Enterprise): -Configura la integración con el Optimizador de DAX (solo en la Edición Enterprise): +**Conectar automáticamente** (nulo/solicitar): Conectar automáticamente al Optimizador de DAX cuando esté disponible. Cuando no está configurado, aparece un mensaje la primera vez. -##### _Conectar automáticamente_ (null/prompt) +**Ofuscar archivos VPAX** (habilitado): anonimiza los metadatos del modelo cuando se envían al Optimizador de DAX. Esto protege la información confidencial, como los nombres de las tablas y las columnas, al tiempo que permite realizar análisis. -Conectar automáticamente con el Optimizador de DAX cuando esté disponible. Si no lo configuras, se te preguntará la primera vez. +**Directorio del diccionario de ofuscación** (`%LocalAppData%\TabularEditor3\DaxOptimizer`): especifique dónde se almacenan los diccionarios de ofuscación. El diccionario mantiene una ofuscación coherente en múltiples análisis. -##### _Ofuscar archivos VPAX_ (habilitado) - -Anonimizar los metadatos del modelo al enviarlos al Optimizador de DAX. Esto protege información confidencial como nombres de tablas y columnas, sin impedir el análisis. - -##### _Directorio del diccionario de ofuscación_ (`%LocalAppData%\\TabularEditor3\\DaxOptimizer`) - -Especifica dónde se almacenan los diccionarios de ofuscación. El diccionario mantiene una ofuscación coherente en varios análisis. - -## Analizador VertiPaq +## Formatos de archivo > Analizador VertiPaq ![Preferencias del Analizador VertiPaq](~/content/assets/images/pref-vertipaq-analyzer.png) -##### _Incluir metadatos de TOM_ (habilitado) - -Incluye los metadatos del Tabular Object Model en las estadísticas del Analizador VertiPaq. Esto aporta información más completa sobre la estructura de tu modelo. - -##### _Leer estadísticas de los datos_ (habilitado) - -Lee las estadísticas analizando los datos reales (más preciso, pero más lento). Si lo deshabilitas, solo se usan los metadatos. - -##### _Modo de extracción de Direct Lake_ (ResidentOnly) - -Cómo extraer estadísticas de los modelos de Direct Lake: - -- **ResidentOnly**: Analiza solo los datos cargados actualmente en memoria -- **All**: Incluye datos no residentes (más lento; puede desencadenar la carga de datos) - -##### _Leer estadísticas de las vistas de administración dinámica_ (deshabilitado) +**Incluir metadatos del TOM** (habilitado): Incluir los metadatos del Tabular Object Model en las estadísticas de VertiPaq Analyzer. Esto proporciona información más completa sobre la estructura de tu modelo. -Usa las DMV para recopilar estadísticas (más rápido, pero menos preciso). Es una alternativa a leer las estadísticas directamente de los datos. +**Leer estadísticas de datos** (habilitado): Lee las estadísticas analizando los datos reales (más preciso, pero más lento). Cuando está desactivada, solo se utilizan los metadatos. Si la lectura de estadísticas a partir de los datos falla, por ejemplo, cuando una columna de alta cardinalidad supera el límite de memoria por consulta de una capacidad de Power BI, **Recopilar estadísticas** recopila las estadísticas a partir de los metadatos y aparece una advertencia de **Estadísticas recopiladas sin leer datos**. -##### _Filas de muestra de relaciones_ (3) +**Modo de extracción Direct Lake** (ResidentOnly): Cómo extraer estadísticas de modelos Direct Lake: +- **ResidentOnly**: Solo analizar los datos cargados actualmente en la memoria +- **Todos**: Incluir datos no residentes (más lento, puede desencadenar la carga de datos) -Número de filas que se toman como muestra al analizar las relaciones. Valores más altos ofrecen mayor precisión, pero tardan más. +**Leer estadísticas de las vistas de administración dinámica** (desactivado): Utilice las DMV para recopilar estadísticas (más rápido, pero menos preciso). Esta es una alternativa a la lectura de datos. -##### _Tamaño del lote de columnas_ (50) +**Filas de muestra de relaciones** (3): Número de filas que se van a muestrear al analizar las relaciones. Los valores más altos proporcionan mayor precisión, pero tardan más. -Número de columnas que se analizan en cada lote. Ajusta esto en función del tamaño de tu modelo y de tus requisitos de rendimiento. +**Tamaño de lote de columnas** (50): Número de columnas que se van a analizar en cada lote. Ajusta este valor en función del tamaño de tu modelo y de tus requisitos de rendimiento. ## Integración con Power BI -![Preferencias de integración con Power BI](~/content/assets/images/pref-power-bi.png) +![Preferencias de integración de Power BI](~/content/assets/images/pref-power-bi.png) -##### _URL base del punto de conexión de Power BI_ (`https://api.powerbi.com`) +**URL base del punto de conexión de Power BI** (`https://api.powerbi.com`): La URL base para las llamadas a la API de Power BI. Cambia esto si trabajas con una nube soberana o un entorno personalizado. -La URL base para las llamadas a la API de Power BI. Cámbiala si estás trabajando con una nube soberana o un entorno personalizado. +**URL base del punto de conexión de Fabric** (`https://api.fabric.microsoft.com`): La URL base para las llamadas a la API de Microsoft Fabric. Cambia esto si trabajas con una nube soberana o un entorno personalizado. -##### _URL base del punto de conexión de Fabric_ (`https://api.fabric.microsoft.com`) +**Usar el navegador integrado para la autenticación** (habilitado): Usa el navegador integrado para la autenticación OAuth en lugar del navegador del sistema. Esto proporciona una experiencia más integrada. -La URL base para las llamadas a la API de Microsoft Fabric. Cámbiala si estás trabajando con una nube soberana o un entorno personalizado. - -##### _Usar el navegador integrado para la autenticación_ (activado) - -Usa el navegador integrado para la autenticación OAuth en lugar del navegador del sistema. Esto ofrece una experiencia más Integrada. - -## Configuración del proxy +## Configuración de proxy ![Preferencias de configuración de proxy](~/content/assets/images/pref-proxy-settings.png) -##### _Tipo de proxy_ (Ninguno) - -Elige entre: - +**Tipo de proxy** (Ninguno): Elija entre: - **Ninguno**: Sin configuración de proxy -- **Sistema**: Usar la configuración de proxy del sistema -- **Personalizado**: Especificar una configuración de proxy personalizada - -##### _Dirección del proxy_ - -La dirección del servidor proxy (por ejemplo, `http://proxy.company.com:8080`). - -##### _Usuario del proxy_ - -Nombre de usuario para la autenticación del proxy, si es necesario. - -##### _Contraseña del proxy_ - -Contraseña para la autenticación del proxy (se almacena cifrada). +- **Sistema**: Utilizar la configuración de proxy del sistema +- **Personalizado**: Especifique una configuración de proxy personalizada. -##### _Usar credenciales predeterminadas_ (activado) +**Dirección de proxy**: La dirección del servidor proxy (p. ej., `http://proxy.company.com`). -Usa las credenciales actuales de Windows para la autenticación del proxy. Esto implementa el [mismo comportamiento que Power BI Desktop](https://docs.microsoft.com/power-bi/connect-data/desktop-troubleshooting-sign-in#using-default-system-credentials-for-web-proxy). +**Usuario del proxy**: Nombre de usuario para la autenticación del proxy, si es necesario. -##### _Omitir el proxy para direcciones locales_ (activado) +**Contraseña del proxy**: Contraseña para la autenticación del proxy (almacenada cifrada). -Omite el proxy para las direcciones locales. Se recomienda para mejorar el rendimiento. +**Usar credenciales predeterminadas** (habilitado): Usar las credenciales actuales de Windows para la autenticación del proxy. Esto implementa [el mismo comportamiento que Power BI Desktop](https://docs.microsoft.com/power-bi/connect-data/desktop-troubleshooting-sign-in#using-default-system-credentials-for-web-proxy). -##### _Lista de exclusión del proxy_ +**Omitir el proxy en local** (habilitado): Omitir el proxy para las direcciones locales. Se recomienda por motivos de rendimiento. -Lista de direcciones que deben omitir el proxy (p. ej., `localhost;*.company.local`). +**Lista de omisión del proxy**: Lista de direcciones que deben omitir el proxy (p. ej., `localhost;*.company.local`). -## Próximos pasos +## Pasos siguientes -Para consultar una guía fácil de usar sobre las preferencias que se modifican con más frecuencia, consulta la guía de primeros pasos [Personalizing TE3](xref:personalizing-te3). +Para obtener una guía fácil de usar sobre las preferencias que se ajustan con más frecuencia, consulta la guía de introducción [Personalización de Tabular Editor 3](xref:personalizing-te3). diff --git a/localizedContent/es/content/references/release-history.md b/localizedContent/es/content/references/release-history.md index 664bd452b..67744360d 100644 --- a/localizedContent/es/content/references/release-history.md +++ b/localizedContent/es/content/references/release-history.md @@ -1,402 +1,416 @@ --- uid: release-history -title: Historial completo de versiones +title: Historial completo de lanzamientos +updated: 2026-10-23 --- +# Historial completo de lanzamientos -# Historial completo de versiones - -- 2026-09-22 **Tabular Editor 3.27.0.0** (_[Notas de la versión](release-notes/3_27_0_0.md)_) - - .NET 10 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) +- 23-10-2026 **Tabular Editor 3.27.1.1** (*[Notas de la versión](release-notes/3_27_1_1.md)*) + - Instalador de .NET 10 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) + - .NET 10 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) + - Instalador de .NET 10 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) +- 15-10-2026 **Tabular Editor 3.27.1.0** (*[Notas de la versión](release-notes/3_27_1_0.md)*) + - Instalador de .NET 10 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) + - .NET 10 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) + - Instalador de .NET 10 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) +- 22-09-2026 **Tabular Editor 3.27.0.0** (*[Notas de la versión](release-notes/3_27_0_0.md)*) + - Instalador de .NET 10 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) - .NET 10 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) - - .NET 10 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) + - Instalador de .NET 10 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) -- 2026-07-10 **Tabular Editor 3.26.3** (_[Notas de la versión](release-notes/3_26_3.md)_) - - .NET 8 - instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) - - .NET 8 - versión portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) - - .NET 8 - instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) -- 2026-06-25 **Tabular Editor 3.26.2** (_[Notas de la versión](release-notes/3_26_2.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) +- 10/07/2026 **Tabular Editor 3.26.3** (*[Notas de la versión](release-notes/3_26_3.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) +- 25-06-2026 **Tabular Editor 3.26.2** (*[Notas de la versión](release-notes/3_26_2.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) -- 2026-04-17 **Tabular Editor 3.26.1** (_[Notas de la versión](release-notes/3_26_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) -- 2026-03-25 **Tabular Editor 3.26.0** (_[Release notes](release-notes/3_26_0.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) -- 2026-03-02 **Tabular Editor 3.25.5** (_[Notas de la versión](release-notes/3_25_5.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) +- 17-04-2026 **Tabular Editor 3.26.1** (*[Notas de la versión](release-notes/3_26_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) +- 25-03-2026 **Tabular Editor 3.26.0** (*[Notas de la versión](release-notes/3_26_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) +- 02/03/2026 **Tabular Editor 3.25.5** (*[Notas de la versión](release-notes/3_25_5.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) -- 2026-02-11 **Tabular Editor 3.25.3** (_[Notas de la versión](release-notes/3_25_3.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) +- 11-02-2026 **Tabular Editor 3.25.3** (*[Notas de la versión](release-notes/3_25_3.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) -- 2026-02-11 **Tabular Editor 3.25.2** (_[Notas de la versión](release-notes/3_25_2.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) +- 11-02-2026 **Tabular Editor 3.25.2** (*[Notas de la versión](release-notes/3_25_2.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.msi) -- 2026-01-22 **Tabular Editor 3.25.1** (_[Notas de la versión](release-notes/3_25_1.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.ARM64.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.msi) +- 22-01-2026 **Tabular Editor 3.25.1** (*[Notas de la versión](release-notes/3_25_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.ARM64.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.msi) -- 2025-11-11 **Tabular Editor 3.24.2** (_[Notas de la versión](release-notes/3_24_2.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) -- 2025-11-05 **Tabular Editor 3.24.1** (_[Notas de la versión](release-notes/3_24_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.msi) -- 2025-10-28 **Tabular Editor 3.24.0** (_[Notas de la versión](release-notes/3_24_0.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) -- 2025-09-15 **Tabular Editor 3.23.1** (_[Notas de la versión](release-notes/3_23_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) -- 2025-08-28 **Tabular Editor 3.23.0** (_[Notas de la versión](release-notes/3_23_0.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.ARM64.Net8.exe) - - Versión portátil de .NET 8 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.zip) - - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.msi) -- 2025-06-28 **Tabular Editor 3.22.1** (_[Notas de la versión](release-notes/3_22_1.md)_) - - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.msi) +- 11-11-2025 **Tabular Editor 3.24.2** (*[Notas de la versión](release-notes/3_24_2.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) +- 05/11/2025 **Tabular Editor 3.24.1** (*[Notas de la versión](release-notes/3_24_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.msi) +- 28-10-2025 **Tabular Editor 3.24.0** (*[Notas de la versión](release-notes/3_24_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) +- 15-09-2025 **Tabular Editor 3.23.1** (*[Notas de la versión](release-notes/3_23_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) +- 28-08-2025 **Tabular Editor 3.23.0** (*[Notas de la versión](release-notes/3_23_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.ARM64.Net8.exe) + - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.zip) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.msi) +- 28-06-2025 **Tabular Editor 3.22.1** (*[Notas de la versión](release-notes/3_22_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) -- 2025-06-19 **Tabular Editor 3.22.0** (_[Notas de la versión](release-notes/3_22_0.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x86.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) +- 19-06-2025 **Tabular Editor 3.22.0** (*[Notas de la versión](release-notes/3_22_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.msi) -- 2025-04-25 **Tabular Editor 3.21.0** (_[Notas de la versión](release-notes/3_21_0.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x86.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.msi) +- 25-04-2025 **Tabular Editor 3.21.0** (*[Notas de la versión](release-notes/3_21_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.msi) -- 2025-04-11 **Tabular Editor 3.20.1** (_[Notas de la versión](release-notes/3_20_1.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.Net8.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.msi) +- 11-04-2025 **Tabular Editor 3.20.1** (*[Notas de la versión](release-notes/3_20_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.msi) -- 2025-02-21 **Tabular Editor 3.20.0** (_[Notas de la versión](release-notes/3_20_0.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.msi) +- 21-02-2025 **Tabular Editor 3.20.0** (*[Notas de la versión](release-notes/3_20_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.msi) -- 2024-12-19 **Tabular Editor 3.19.0** (_[Notas de la versión](release-notes/3_19_0.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.msi) +- 19-12-2024 **Tabular Editor 3.19.0** (*[Notas de la versión](release-notes/3_19_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.msi) -- 2024-11-14 **Tabular Editor 3.18.2** (_[Notas de la versión](release-notes/3_18_2.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.msi) +- 14-11-2024 **Tabular Editor 3.18.2** (*[Notas de la versión](release-notes/3_18_2.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.msi) -- 2024-11-11 **Tabular Editor 3.18.1** (_[Notas de la versión](release-notes/3_18_1.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.msi) +- 11-11-2024 **Tabular Editor 3.18.1** (*[Notas de la versión](release-notes/3_18_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.msi) -- 2024-10-31 **Tabular Editor 3.18.0** (_[Notas de la versión](release-notes/3_18_0.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.msi) +- 31-10-2024 **Tabular Editor 3.18.0** (*[Notas de la versión](release-notes/3_18_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.msi) -- 2024-08-22 **Tabular Editor 3.17.1** (_[Notas de la versión](release-notes/3_17_1.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.msi) +- 22-08-2024 **Tabular Editor 3.17.1** (*[Notas de la versión](release-notes/3_17_1.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.msi) -- 2024-08-14 **Tabular Editor 3.17.0** (_[Notas de la versión](release-notes/3_17_0.md)_) - - .NET 8 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.Net8.exe) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.msi) +- 14-08-2024 **Tabular Editor 3.17.0** (*[Notas de la versión](release-notes/3_17_0.md)*) + - Instalador de .NET 8 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.Net8.exe) - .NET 8 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.zip) - - .NET 8 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.msi) - - .NET 6 instalador (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.exe) + - Instalador de .NET 8 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.msi) + - Instalador de .NET 6 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.exe) - .NET 6 portátil (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.zip) - - .NET 6 instalador (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.msi) -- 2024-06-19 **Tabular Editor 3.16.2** (_[Notas de la versión](release-notes/3_16_2.md)_) + - Instalador de .NET 6 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.msi) +- 19-06-2024 **Tabular Editor 3.16.2** (*[Notas de la versión](release-notes/3_16_2.md)*) - [TabularEditor.3.16.2.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.Installer.x64.exe) - [TabularEditor.3.16.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.Installer.x86.exe) - [TabularEditor.3.16.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x64.zip) - [TabularEditor.3.16.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x86.zip) - [TabularEditor.3.16.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x64.msi) - [TabularEditor.3.16.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x86.msi) -- 2024-06-17 **Tabular Editor 3.16.1** (_[Notas de la versión](release-notes/3_16_1.md)_) +- 17-06-2024 **Tabular Editor 3.16.1** (*[Notas de la versión](release-notes/3_16_1.md)*) - [TabularEditor.3.16.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.Installer.x64.exe) - [TabularEditor.3.16.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.Installer.x86.exe) - [TabularEditor.3.16.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x64.zip) - [TabularEditor.3.16.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x86.zip) - [TabularEditor.3.16.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x64.msi) - [TabularEditor.3.16.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x86.msi) -- 2024-06-10 **Tabular Editor 3.16.0** (_[Notas de la versión](release-notes/3_16_0.md)_) +- 10-06-2024 **Tabular Editor 3.16.0** (*[Notas de la versión](release-notes/3_16_0.md)*) - [TabularEditor.3.16.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.Installer.x64.exe) - [TabularEditor.3.16.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.Installer.x86.exe) - [TabularEditor.3.16.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x64.zip) - [TabularEditor.3.16.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x86.zip) - [TabularEditor.3.16.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x64.msi) - [TabularEditor.3.16.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x86.msi) -- 2024-04-17 **Tabular Editor 3.15.0** (_[Notas de la versión](release-notes/3_15_0.md)_) +- 17-04-2024 **Tabular Editor 3.15.0** (*[Notas de la versión](release-notes/3_15_0.md)*) - [TabularEditor.3.15.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.Installer.x64.exe) - [TabularEditor.3.15.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.Installer.x86.exe) - [TabularEditor.3.15.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x64.zip) - [TabularEditor.3.15.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x86.zip) - [TabularEditor.3.15.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x64.msi) - [TabularEditor.3.15.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x86.msi) -- 2024-02-20 **Tabular Editor 3.14.0** (_[Notas de la versión](release-notes/3_14_0.md)_) +- 20-02-2024 **Tabular Editor 3.14.0** (*[Notas de la versión](release-notes/3_14_0.md)*) - [TabularEditor.3.14.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.Installer.x64.exe) - [TabularEditor.3.14.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.Installer.x86.exe) - [TabularEditor.3.14.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x64.zip) - [TabularEditor.3.14.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x86.zip) - [TabularEditor.3.14.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x64.msi) - [TabularEditor.3.14.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x86.msi) -- 2023-12-15 **Tabular Editor 3.13.0** (_[Notas de la versión](release-notes/3_13_0.md)_) +- 15/12/2023 **Tabular Editor 3.13.0** (*[Notas de la versión](release-notes/3_13_0.md)*) - [TabularEditor.3.13.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) - [TabularEditor.3.13.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) - [TabularEditor.3.13.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip) - [TabularEditor.3.13.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) - [TabularEditor.3.13.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi) - [TabularEditor.3.13.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) -- 2023-12-01 **Tabular Editor 3.12.1** (_[Notas de la versión](release-notes/3_12_1.md)_) +- 01/12/2023 **Tabular Editor 3.12.1** (*[Notas de la versión](release-notes/3_12_1.md)*) - [TabularEditor.3.12.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x64.exe) - [TabularEditor.3.12.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x86.exe) - [TabularEditor.3.12.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x64.zip) - [TabularEditor.3.12.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x86.zip) - [TabularEditor.3.12.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x64.msi) - [TabularEditor.3.12.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x86.msi) -- 2023-11-27 **Tabular Editor 3.12.0** (_[Notas de la versión](release-notes/3_12_0.md)_) +- 27-11-2023 **Tabular Editor 3.12.0** (*[Notas de la versión](release-notes/3_12_0.md)*) - [TabularEditor.3.12.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.Installer.x64.exe) - [TabularEditor.3.12.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.Installer.x86.exe) - [TabularEditor.3.12.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x64.zip) - [TabularEditor.3.12.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x86.zip) - [TabularEditor.3.12.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x64.msi) - [TabularEditor.3.12.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x86.msi) -- 2023-09-25 **Tabular Editor 3.11.0** (_[Notas de la versión](release-notes/3_11_0.md)_) +- 25-09-2023 **Tabular Editor 3.11.0** (*[Notas de la versión](release-notes/3_11_0.md)*) - [TabularEditor.3.11.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.Installer.x64.exe) - [TabularEditor.3.11.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.Installer.x86.exe) - [TabularEditor.3.11.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x64.zip) - [TabularEditor.3.11.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x86.zip) - [TabularEditor.3.11.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x64.msi) - [TabularEditor.3.11.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x86.msi) -- 2023-08-30 **Tabular Editor 3.10.1** (_[Notas de la versión](release-notes/3_10_1.md)_) +- 30-08-2023 **Tabular Editor 3.10.1** (*[Notas de la versión](release-notes/3_10_1.md)*) - [TabularEditor.3.10.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.Installer.x64.exe) - [TabularEditor.3.10.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.Installer.x86.exe) - [TabularEditor.3.10.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x64.zip) - [TabularEditor.3.10.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x86.zip) - [TabularEditor.3.10.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x64.msi) - [TabularEditor.3.10.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x86.msi) -- 2023-08-24 **Tabular Editor 3.10.0** (_[Notas de la versión](release-notes/3_10_0.md)_) +- 24-08-2023 **Tabular Editor 3.10.0** (*[Notas de la versión](release-notes/3_10_0.md)*) - [TabularEditor.3.10.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.Installer.x64.exe) - [TabularEditor.3.10.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.Installer.x86.exe) - [TabularEditor.3.10.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x64.zip) - [TabularEditor.3.10.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x86.zip) - [TabularEditor.3.10.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x64.msi) - [TabularEditor.3.10.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x86.msi) -- 2023-07-20 **Tabular Editor 3.9.0** (_[Notas de la versión](release-notes/3_9_0.md)_) +- 20-07-2023 **Tabular Editor 3.9.0** (*[Notas de la versión](release-notes/3_9_0.md)*) - [TabularEditor.3.9.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.Installer.x64.exe) - [TabularEditor.3.9.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.Installer.x86.exe) - [TabularEditor.3.9.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x64.zip) - [TabularEditor.3.9.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x86.zip) - [TabularEditor.3.9.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x64.msi) - [TabularEditor.3.9.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x86.msi) -- 2023-06-23 **Tabular Editor 3.8.0** (_[Notas de la versión](release-notes/3_7_1.md)_) +- 23-06-2023 **Tabular Editor 3.8.0** (*[Notas de la versión](release-notes/3_7_1.md)*) - [TabularEditor.3.8.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.Installer.x64.exe) - [TabularEditor.3.8.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.Installer.x86.exe) - [TabularEditor.3.8.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x64.zip) - [TabularEditor.3.8.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x86.zip) - [TabularEditor.3.8.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x64.msi) - [TabularEditor.3.8.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x86.msi) -- 2023-05-22 **Tabular Editor 3.7.1** (_[Notas de la versión](release-notes/3_7_1.md)_) +- 22-05-2023 **Tabular Editor 3.7.1** (*[Notas de la versión](release-notes/3_7_1.md)*) - [TabularEditor.3.7.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.Installer.x64.exe) - [TabularEditor.3.7.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.Installer.x86.exe) - [TabularEditor.3.7.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x64.zip) - [TabularEditor.3.7.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x86.zip) - [TabularEditor.3.7.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x64.msi) - [TabularEditor.3.7.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x86.msi) -- 2023-05-17 **Tabular Editor 3.7.0** (_[Notas de la versión](release-notes/3_7_0.md)_) +- 17-05-2023 **Tabular Editor 3.7.0** (*[Notas de la versión](release-notes/3_7_0.md)*) - [TabularEditor.3.7.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.Installer.x64.exe) - [TabularEditor.3.7.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.Installer.x86.exe) - [TabularEditor.3.7.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x64.zip) - [TabularEditor.3.7.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x86.zip) - [TabularEditor.3.7.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x64.msi) - [TabularEditor.3.7.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x86.msi) -- 2023-04-19 **Tabular Editor 3.6.0** (_[Notas de la versión](release-notes/3_6_0.md)_) +- 19-04-2023 **Tabular Editor 3.6.0** (*[Notas de la versión](release-notes/3_6_0.md)*) - [TabularEditor.3.6.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.Installer.x64.exe) - [TabularEditor.3.6.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.Installer.x86.exe) - [TabularEditor.3.6.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x64.zip) - [TabularEditor.3.6.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x86.zip) - [TabularEditor.3.6.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x64.msi) - [TabularEditor.3.6.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x86.msi) -- 2023-03-28 **Tabular Editor 3.5.1** (_[Notas de la versión](release-notes/3_5_1.md)_) +- 28-03-2023 **Tabular Editor 3.5.1** (*[Notas de la versión](release-notes/3_5_1.md)*) - [TabularEditor.3.5.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.Installer.x64.exe) - [TabularEditor.3.5.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.Installer.x86.exe) - [TabularEditor.3.5.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x64.zip) - [TabularEditor.3.5.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x86.zip) - [TabularEditor.3.5.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x64.msi) - [TabularEditor.3.5.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x86.msi) -- 2023-03-15 **Tabular Editor 3.5.0** (_[Notas de la versión](release-notes/3_5_0.md)_) +- 15-03-2023 **Tabular Editor 3.5.0** (*[Notas de la versión](release-notes/3_5_0.md)*) - [TabularEditor.3.5.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.Installer.x64.exe) - [TabularEditor.3.5.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.Installer.x86.exe) - [TabularEditor.3.5.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x64.zip) - [TabularEditor.3.5.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x86.zip) - [TabularEditor.3.5.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x64.msi) - [TabularEditor.3.5.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x86.msi) -- 2023-02-09 **Tabular Editor 3.4.2** (_[Notas de la versión](release-notes/3_4_2.md)_): +- 09-02-2023 **Tabular Editor 3.4.2** (*[Notas de la versión](release-notes/3_4_2.md)*): - [TabularEditor.3.4.2.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.Installer.x64.exe) - [TabularEditor.3.4.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.Installer.x86.exe) - [TabularEditor.3.4.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x64.zip) - [TabularEditor.3.4.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x86.zip) - [TabularEditor.3.4.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x64.msi) - [TabularEditor.3.4.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x86.msi) -- 2023-02-03 **Tabular Editor 3.4.1** (_[Notas de la versión](release-notes/3_4_1.md)_): - - _No se recomienda. En su lugar, usa [3.4.2](release-notes/3_4_2.md)._ +- 03-02-2023 **Tabular Editor 3.4.1** (*[Notas de la versión](release-notes/3_4_1.md)*): + - *No se recomienda; utilice [3.4.2](release-notes/3_4_2.md) en su lugar.* - [TabularEditor.3.4.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.Installer.x64.exe) - [TabularEditor.3.4.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.Installer.x86.exe) - [TabularEditor.3.4.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x64.zip) - [TabularEditor.3.4.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x86.zip) - [TabularEditor.3.4.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x64.msi) - [TabularEditor.3.4.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x86.msi) -- 2022-12-13 **Tabular Editor 3.4.0** (_[Notas de la versión](release-notes/3_4_0.md)_): +- 13-12-2022 **Tabular Editor 3.4.0** (*[Notas de la versión](release-notes/3_4_0.md)*): - [TabularEditor.3.4.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.Installer.x64.exe) - [TabularEditor.3.4.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.Installer.x86.exe) - [TabularEditor.3.4.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x64.zip) - [TabularEditor.3.4.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x86.zip) - [TabularEditor.3.4.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x64.msi) - [TabularEditor.3.4.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x86.msi) -- 2022-11-11 **Tabular Editor 3.3.6** (_[Notas de la versión](release-notes/3_3_6.md)_): +- 11-11-2022 **Tabular Editor 3.3.6** (*[Notas de la versión](release-notes/3_3_6.md)*): - [TabularEditor.3.3.6.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.Installer.x64.exe) - [TabularEditor.3.3.6.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.Installer.x86.exe) - [TabularEditor.3.3.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x64.zip) - [TabularEditor.3.3.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x86.zip) - [TabularEditor.3.3.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x64.msi) - [TabularEditor.3.3.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x86.msi) -- 2022-09-06 **Tabular Editor 3.3.5** (_[Notas de la versión](release-notes/3_3_5.md)_): +- 06-09-2022 **Tabular Editor 3.3.5** (*[Notas de la versión](release-notes/3_3_5.md)*): - [TabularEditor.3.3.5.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.Installer.x64.exe) - [TabularEditor.3.3.5.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.Installer.x86.exe) - [TabularEditor.3.3.5.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x64.zip) - [TabularEditor.3.3.5.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x86.zip) - [TabularEditor.3.3.5.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x64.msi) - [TabularEditor.3.3.5.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x86.msi) -- 2022-08-10 **Tabular Editor 3.3.4** (_[Notas de la versión](release-notes/3_3_4.md)_): +- 10-08-2022 **Tabular Editor 3.3.4** (*[Notas de la versión](release-notes/3_3_4.md)*): - [TabularEditor.3.3.4.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x64.exe) - [TabularEditor.3.3.4.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x86.exe) - [TabularEditor.3.3.4.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x64.zip) - [TabularEditor.3.3.4.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x86.zip) - [TabularEditor.3.3.4.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x64.msi) - [TabularEditor.3.3.4.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x86.msi) -- 2022-07-17 **Tabular Editor 3.3.3** (_[Notas de la versión](release-notes/3_3_3.md)_): +- 17-07-2022 **Tabular Editor 3.3.3** (*[Notas de la versión](release-notes/3_3_3.md)*): - [TabularEditor.3.3.3.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.Installer.x64.exe) - [TabularEditor.3.3.3.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.Installer.x86.exe) - [TabularEditor.3.3.3.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x64.zip) - [TabularEditor.3.3.3.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x86.zip) - [TabularEditor.3.3.3.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x64.msi) - [TabularEditor.3.3.3.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x86.msi) -- 2022-06-28 **Tabular Editor 3.3.2** (_[Notas de la versión](release-notes/3_3_2.md)_): +- 28-06-2022 **Tabular Editor 3.3.2** (*[Notas de la versión](release-notes/3_3_2.md)*): - [TabularEditor.3.3.2.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.Installer.x64.exe) - [TabularEditor.3.3.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.Installer.x86.exe) - [TabularEditor.3.3.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.x64.zip) - [TabularEditor.3.3.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.x86.zip) -- 2022-06-16 **Tabular Editor 3.3.0** (_[Notas de la versión](release-notes/3_3_0.md)_): +- 16-06-2022 **Tabular Editor 3.3.0** (*[Notas de la versión](release-notes/3_3_0.md)*): - [TabularEditor.3.3.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x64.msi) - [TabularEditor.3.3.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x86.msi) - [TabularEditor.3.3.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x64.zip) - [TabularEditor.3.3.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x86.zip) -- 2022-04-07 **Tabular Editor 3.2.3** (_[Notas de la versión](release-notes/3_2_3.md)_): +- 07-04-2022 **Tabular Editor 3.2.3** (*[Notas de la versión](release-notes/3_2_3.md)*): - [TabularEditor.3.2.3.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x64.msi) - [TabularEditor.3.2.3.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x86.msi) - [TabularEditor.3.2.3.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x64.zip) - [TabularEditor.3.2.3.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x86.zip) -- 2022-02-16 **Tabular Editor 3.2.2** (_[Notas de la versión](release-notes/3_2_2.md)_): +- 16-02-2022 **Tabular Editor 3.2.2** (*[Notas de la versión](release-notes/3_2_2.md)*): - [TabularEditor.3.2.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x64.msi) - [TabularEditor.3.2.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x86.msi) - [TabularEditor.3.2.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x64.zip) - [TabularEditor.3.2.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x86.zip) -- 2022-01-28 **Tabular Editor 3.2.1** (_[Notas de la versión](release-notes/3_2_1.md)_): +- 28-01-2022 **Tabular Editor 3.2.1** (*[Notas de la versión](release-notes/3_2_1.md)*): - [TabularEditor.3.2.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x64.msi) - [TabularEditor.3.2.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x86.msi) - [TabularEditor.3.2.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x64.zip) - [TabularEditor.3.2.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x86.zip) -- 2022-01-20 **Tabular Editor 3.2.0** (_[Notas de la versión](release-notes/3_2_0.md)_): +- 2022-01-20 **Tabular Editor 3.2.0** (*[Notas de la versión](release-notes/3_2_0.md)*): - [TabularEditor.3.2.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x64.msi) - [TabularEditor.3.2.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x86.msi) - [TabularEditor.3.2.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x64.zip) - [TabularEditor.3.2.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x86.zip) -- 2021-12-16 **Tabular Editor 3.1.7** (_[Notas de la versión](release-notes/3_1_7.md)_): +- 16-12-2021 **Tabular Editor 3.1.7** (*[Notas de la versión](release-notes/3_1_7.md)*): - [TabularEditor.3.1.7.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x64.msi) - [TabularEditor.3.1.7.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x86.msi) - [TabularEditor.3.1.7.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x64.zip) - [TabularEditor.3.1.7.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x86.zip) -- 2021-11-23 **Tabular Editor 3.1.6** (_[Notas de la versión](release-notes/3_1_6.md)_): +- 23-11-2021 **Tabular Editor 3.1.6** (*[Notas de la versión](release-notes/3_1_6.md)*): - [TabularEditor.3.1.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x64.msi) - [TabularEditor.3.1.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x86.msi) - [TabularEditor.3.1.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x64.zip) - [TabularEditor.3.1.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x86.zip) -- 2021-11-02 **Tabular Editor 3.1.5** (_[Notas de la versión](release-notes/3_1_5.md)_): +- 02/11/2021 **Tabular Editor 3.1.5** (*[Notas de la versión](release-notes/3_1_5.md)*): - [TabularEditor.3.1.5.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x64.msi) - [TabularEditor.3.1.5.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x86.msi) - [TabularEditor.3.1.5.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x64.zip) - [TabularEditor.3.1.5.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x86.zip) -- 2021-10-07 **Tabular Editor 3.1.4** (_[Notas de la versión](release-notes/3_1_4.md)_): +- 07-10-2021 **Tabular Editor 3.1.4** (*[Notas de la versión](release-notes/3_1_4.md)*): - [TabularEditor.3.1.4.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x64.msi) - [TabularEditor.3.1.4.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x86.msi) - [TabularEditor.3.1.4.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x64.zip) - [TabularEditor.3.1.4.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x86.zip) -- 2021-09-30 **Tabular Editor 3.1.3** (_[Notas de la versión](release-notes/3_1_3.md)_): +- 30-09-2021 **Tabular Editor 3.1.3** (*[Notas de la versión](release-notes/3_1_3.md)*): - [TabularEditor.3.1.3.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x64.msi) - [TabularEditor.3.1.3.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x86.msi) - [TabularEditor.3.1.3.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x64.zip) - [TabularEditor.3.1.3.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x86.zip) -- 2021-08-10 **Tabular Editor 3.0.10** (_[Notas de la versión](release-notes/3_0_10.md)_): +- 10-08-2021 **Tabular Editor 3.0.10** (*[Notas de la versión](release-notes/3_0_10.md)*): - [TabularEditor.3.0.10.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x64.msi) - [TabularEditor.3.0.10.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x86.msi) - [TabularEditor.3.0.10.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x64.zip) - [TabularEditor.3.0.10.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x86.zip) -- 2021-08-07 **Tabular Editor 3.0.9** (_[Notas de la versión](release-notes/3_0_9.md)_): +- 07-08-2021 **Tabular Editor 3.0.9** (*[Notas de la versión](release-notes/3_0_9.md)*): - [TabularEditor.3.0.9.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x64.msi) - [TabularEditor.3.0.9.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x86.msi) - [TabularEditor.3.0.9.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x64.zip) - [TabularEditor.3.0.9.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x86.zip) -- 2021-08-06 **Tabular Editor 3.0.8** (_[Notas de la versión](release-notes/3_0_8.md)_): +- 06-08-2021 **Tabular Editor 3.0.8** (*[Notas de la versión](release-notes/3_0_8.md)*): - [TabularEditor.3.0.8.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x64.msi) - [TabularEditor.3.0.8.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x86.msi) - [TabularEditor.3.0.8.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x64.zip) - [TabularEditor.3.0.8.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x86.zip) -- 2021-06-30 **Tabular Editor 3.0.7** (_[Notas de la versión](release-notes/3_0_7.md)_): +- 30-06-2021 **Tabular Editor 3.0.7** (*[Notas de la versión](release-notes/3_0_7.md)*): - [TabularEditor.3.0.7.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x64.msi) - [TabularEditor.3.0.7.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x86.msi) - [TabularEditor.3.0.7.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x64.zip) - [TabularEditor.3.0.7.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x86.zip) -- 2021-06-17 **Tabular Editor 3.0.6** (_[Notas de la versión](release-notes/3_0_6.md)_): +- 17-06-2021 **Tabular Editor 3.0.6** (*[Notas de la versión](release-notes/3_0_6.md)*): - [TabularEditor.3.0.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x64.msi) - [TabularEditor.3.0.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x86.msi) - [TabularEditor.3.0.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x64.zip) - [TabularEditor.3.0.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x86.zip) -- 2021-06-10 **Tabular Editor 3.0.5** (_[Notas de la versión](release-notes/3_0_5.md)_): +- 10-06-2021 **Tabular Editor 3.0.5** (*[Notas de la versión](release-notes/3_0_5.md)*): - [TabularEditor.3.0.5.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.5.x64.msi) - [TabularEditor.3.0.5.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.5.x86.msi) -- 2021-06-08 **Tabular Editor 3.0.4** (_[Notas de la versión](release-notes/3_0_4.md)_): +- 08-06-2021 **Tabular Editor 3.0.4** (*[Notas de la versión](release-notes/3_0_4.md)*): - [TabularEditor.3.0.4.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.4.x64.msi) - [TabularEditor.3.0.4.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.4.x86.msi) -- 2021-06-03 **Tabular Editor 3.0.2** (_[Notas de la versión](release-notes/3_0_2.md)_): +- 03-06-2021 **Tabular Editor 3.0.2** (*[Notas de la versión](release-notes/3_0_2.md)*): - [TabularEditor.3.0.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.2.x64.msi) - [TabularEditor.3.0.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.2.x86.msi) -- 2021-06-01 **Tabular Editor 3.0.1** (_[Notas de la versión](release-notes/3_0_1.md)_): +- 01-06-2021 **Tabular Editor 3.0.1** (*[Notas de la versión](release-notes/3_0_1.md)*): - [TabularEditor.3.0.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.1.x64.msi) - [TabularEditor.3.0.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.1.x86.msi) \ No newline at end of file diff --git a/localizedContent/es/content/references/release-notes/3_27_1_0.md b/localizedContent/es/content/references/release-notes/3_27_1_0.md new file mode 100644 index 000000000..76f13f6c1 --- /dev/null +++ b/localizedContent/es/content/references/release-notes/3_27_1_0.md @@ -0,0 +1,110 @@ +--- +uid: release-3-27-1-0 +--- +# Tabular Editor 3.27.1.0 + +# [**Descargas**](#tab/downloads) + +Descargas de Tabular Editor 3.27.1.0: + +**En .NET 10** (recomendado para la mayoría de los usuarios): + +- Descargar [Tabular Editor 3.27.1.0 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe) *(recomendado)* +- Descargar [Tabular Editor 3.27.1.0 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) +- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) +- Versión MSI: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) + +**En .NET 8** (para equipos que aún no pueden ejecutar el tiempo de ejecución de escritorio de .NET 10): + +- Descargue [Tabular Editor 3.27.1.0 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe) +- Descargar [Tabular Editor 3.27.1.0 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) +- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) +- Versión MSI: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) + +*Si no has usado Tabular Editor 3 antes, puedes optar a una prueba de 30 días, que se puede activar después de la instalación. También puedes [comprar una licencia](https://tabulareditor.com/licensing).* + +# [**Sumas de comprobación SHA-256**](#tab/checksums) + +| Archivo | Entorno de ejecución .NET | Plataforma | SHA-256 | +| -- | -- | -- | -- | +| [TabularEditor.3.27.1.0.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe) | .NET 10 | x64 | «57171F0B45F6F700E09A9140480A753134A94993DC9F74629B7CBD42D2C09272» | +| [TabularEditor.3.27.1.0.x64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi) | .NET 10 | x64 | `8A3948B1E85EA331ACF151FDEA2C47FEFEFB28E377A7248A785AF760B706B1D7` | +| [TabularEditor.3.27.1.0.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip) | .NET 10 | x64 | «7761B99F117A87A38204D984C52F26A95B740B39720044ABA805F123D9BBB0CF» | +| [TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | «90A0DA17220255D81EFE80B8381FCB14E447BF5569ED53DDF11AE732A6055746» | +| [TabularEditor.3.27.1.0.ARM64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) | .NET 10 | ARM64 | `54D8F8CBC083B11C2025A2D32A1E0E32A3CDB5E10AE0ADBCB3E9A179EF6BC8C8` | +| [TabularEditor.3.27.1.0.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) | .NET 10 | ARM64 | «3338D9647596D5FBBE53A807725B45C5FA2FD9CC5B30834A9DD13EABD5D97912» | +| [TabularEditor.3.27.1.0.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe) | .NET 8 | x64 | `43C227A33C51E7E7A5175D7AB705CC5C2B7E8686A2DA6DCCC786BD0D27CD45CB` | +| [TabularEditor.3.27.1.0.x64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi) | .NET 8 | x64 | `6D05B0F8BC9654379D7CBAD2B75C317C8F067847BB69468F8FD36A8417729B9B` | +| [TabularEditor.3.27.1.0.x64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip) | .NET 8 | x64 | `EAE7EB7AA0B4B4AEE56A9B80BA8752DA04B98B59235DD5DD9278A41071DFB514` | +| [TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) | .NET 8 | ARM64 | `54F1DFE6C23B9066C47FE20552F33A866E21A4C50C55A1E658ED097AD313EE4B` | +| [TabularEditor.3.27.1.0.ARM64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) | .NET 8 | ARM64 | `91468976BC010A90C4858320DD676290C234CD8705C6C6368C3E63A339A380EE` | +| [TabularEditor.3.27.1.0.ARM64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) | .NET 8 | ARM64 | `C49AB825BF72760C232AC87FC56758B3C7A768839BA09E1AD57A9775A2D6F1BA` | + + +*** + +## Mejoras en la versión 3.27.1.0 + +- El [asistente de IA](https://docs.tabulareditor.com/en/features/ai-assistant.html) y los agentes conectados a través del [servidor MCP](https://docs.tabulareditor.com/en/features/mcp-server.html) ahora reciben los errores de DAX de tu modelo y de los documentos abiertos: + - Ahora enumera los errores, las advertencias y los mensajes de Analysis Services que muestra la vista **Mensajes**. + - Los errores y las advertencias del documento activo (consulta DAX, script DAX, script C# o Pivot Grid) se añaden al contexto del asistente. + - Después de que se ejecute un script de C#, el resultado enumera los errores que el script ha introducido o resuelto. + + El texto de error devuelto por Analysis Services puede contener datos del modelo y solo se comparte cuando el permiso **Datos del modelo** está establecido en **Lectura**. + +- Los documentos **Consulta DAX** y **Pivot Grid** ahora permanecen abiertos cuando abres un modelo diferente y se conectan al nuevo modelo. Una consulta DAX conserva su texto y los cambios sin guardar. Un Pivot Grid conserva su estructura y elimina los campos que no tiene el nuevo modelo. Desactive esta opción con **Mantener las consultas DAX abiertas cuando se abra un modelo diferente** y **Mantener los Pivot Grids abiertos cuando se abra un modelo diferente** en **Herramientas > Preferencias > Exploración de datos**. Consulte [Consultas DAX: cambio de modelos](https://docs.tabulareditor.com/en/features/dax-query.html#switching-models) y [Pivot Grids: cambio de modelos](https://docs.tabulareditor.com/en/features/pivot-grid.html#switching-models). +- **Modelo > Implementar...** tiene una nueva opción, **Implementar metadatos lingüísticos (sinónimos de preguntas y respuestas, instrucciones de IA y esquema de datos de IA)**, seleccionada de forma predeterminada. Desmárcala para conservar las instrucciones de la IA, el esquema de datos de la IA y los sinónimos de preguntas y respuestas ya configurados en el modelo semántico de destino. Consulte [Opciones de implementación](https://docs.tabulareditor.com/en/features/deployment.html#deployment-options). +- Haga clic con el botón derecho en un servidor de la lista **Servidor** de **Archivo > Abrir > Modelo desde BD...** o del asistente de implementación para **Anclarlo**, **Desanclarlo** o **Eliminarlo**. Los servidores anclados permanecen en la parte superior de la lista y no se eliminan con **Borrar servidores recientes**. Consulte [Servidores recientes y anclados](https://docs.tabulareditor.com/en/how-tos/xmla-as-connectivity.html#recent-and-pinned-servers). +- El título de la ventana ahora comienza con el nombre del modelo. La preferencia **Detalles de origen del modelo** en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario** sustituye a **Ocultar detalles de origen del modelo** y establece qué parte de la ubicación del modelo se muestra en la barra de título, la barra de estado, las descripciones emergentes de las pestañas y las listas de elementos recientes. La barra de estado muestra la conexión como `@`. Consulta [Preferencias de la interfaz de usuario](https://docs.tabulareditor.com/en/references/preferences.html#tabular-editor--user-interface) e [Interfaz de usuario de Tabular Editor 3](https://docs.tabulareditor.com/en/features/views/user-interface.html#basic-user-interface-elements). +- La vista **Mensajes** tiene una columna **Causado por** que muestra el objeto que causa un error en cascada y **+N errores dependientes** en el objeto que causa errores en otros objetos. Haga clic con el botón derecho en un error para desactivar **Mostrar errores en cascada** o para elegir **Ir a la causa raíz**. Consulte [Errores en cascada y causas raíz](https://docs.tabulareditor.com/en/features/views/messages-view.html#cascading-errors-and-root-causes). + +## Correcciones de errores en la versión 3.27.1.0 + +- Se ha solucionado un problema por el que, al establecer el **Ordinal** de un elemento de cálculo para moverlo hacia el final de su grupo de cálculos, se colocaba una posición antes de lo debido. +- Se ha solucionado un problema por el que **Archivo > Nuevo > Modelo...** aplicaba el nombre elegido solo al modelo y dejaba la base de datos con el nombre «SemanticModel». +- Se ha solucionado un problema por el que se aceptaba un nombre de configuración regional no válido para la propiedad **Culture** (Configuración regional) de un modelo y para la propiedad **Language** (Lenguaje) de una traducción. Ahora estos valores se rechazan con un error como «'en US' es un especificador de configuración regional no válido». +- Se ha solucionado un problema por el que la comparación de dos modelos fallaba con el mensaje «La referencia al objeto no está establecida en una instancia de un objeto» cuando diferían en los miembros de los roles, los grupos de consultas u otros elementos de la colección sin nombre. +- Se ha corregido un problema por el que no se informaba de un carácter de espacio en blanco no estándar en una expresión DAX, como un espacio sin separación. Ahora se informa como un error que indica el carácter y le dice que ejecute **Formatear DAX**. +- Se han solucionado problemas en el **Metadata Translation Editor**: + - Borrar una celda de traducción no tenía ningún efecto; ahora elimina la traducción. + - La celda **Mostrar carpeta** de una tabla, un nivel de jerarquía, una perspectiva o el modelo era editable y el valor se descartaba; ahora estas celdas son de solo lectura. + - El menú contextual de la cabecera de la columna ofrecía la opción **Mostrar fila de filtro automático**, que no funcionaba en las columnas de traducción. +- Se ha solucionado un problema por el que, al cerrar el **Asistente para importar tablas** mientras mostraba una lista de tablas, podía aparecer un cuadro de diálogo de informe de errores o faltar objetos en el árbol. +- Se ha solucionado un problema por el que al cancelar el cuadro de diálogo **Cargar modelo semántico desde base de datos** o la solicitud de credenciales del origen de datos se podía cerrar Tabular Editor y perder el trabajo no guardado. +- Se han solucionado problemas por los que **Depurar este valor** en un valor de **Pivot Grid** ignoraba o invertía algunos de los filtros de la cuadrícula, de modo que el depurador mostraba un valor diferente al de la cuadrícula. +- Se ha solucionado un problema por el que un documento abierto por un cliente MCP cuando Tabular Editor no era la ventana activa mostraba la barra de herramientas y el menú del documento anterior. Informado en [debate de GitHub n.º 1590](https://github.com/TabularEditor/TabularEditor3/discussions/1590). +- Se ha corregido un problema por el que al duplicar o pegar una medida, columna o jerarquía que aparecía en varias carpetas de visualización, la copia se colocaba en una sola carpeta con el nombre de todas ellas, como `carpeta_01;carpeta_02`. La copia ahora aparece en todas las carpetas de visualización del original. +- Se han solucionado problemas en el editor de **Consultas DAX** por los que, al ejecutar una de varias consultas de un documento, se utilizaba el bloque `DEFINE` de la primera consulta, y al ejecutar una columna seleccionada en una cláusula `ORDER BY` se producía un error con el mensaje «No se puede determinar un único valor para la columna...». +- Se ha corregido un problema por el que la vista **Mensajes** dejaba de mostrar los errores de los documentos que permanecían abiertos después de abrir un modelo diferente. +- Se han solucionado problemas que podían provocar el cierre inesperado de Tabular Editor 3 o la aparición de un cuadro de diálogo de error: + - Mientras la vista **Propiedades** mostraba una medida o cuando se eliminaba su objeto seleccionado. + - al abrir un modelo semántico, con un error de «No se puede acceder a un objeto eliminado» + - después de una edición que eliminaba un objeto con una expresión DAX y renombraba o añadía otro objeto + - Mientras se editaba una expresión DAX, con un error del tipo «El índice estaba fuera de los límites de la matriz». +- Se ha solucionado un problema por el que un origen de datos heredado que utilizaba un nombre de proveedor OLE DB específico de una versión, como «Provider=MSOLEDBSQL19.1», aparecía como no instalado y el cuadro de diálogo **Propiedades del vínculo de datos** se abría sin el proveedor original. Este problema era una regresión desde la versión 3.25.0. +- Se ha solucionado un problema por el que **Analizador VertiPaq > Recopilar estadísticas** no devolvía ninguna estadística cuando no se podían analizar los datos del modelo. Ahora las estadísticas se recopilan a partir de los metadatos del modelo con una advertencia, y si se desactiva **Leer estadísticas de datos** en **Herramientas > Preferencias > Formatos de archivo > Analizador VertiPaq**, se omite la lectura de datos. + +--- + +## ¿Viene de Tabular Editor 2.x? + +Para ver un repaso de las principales características de Tabular Editor 3, mira [este vídeo](https://youtu.be/O4ATwdzCvWc). Para empezar, consulte la [guía de incorporación](https://docs.tabulareditor.com/onboarding/index.html). + +**Principales funciones de Tabular Editor 3:** +- IDE personalizable con soporte para múltiples monitores y Hi-DPI, y temas +- Editor de código DAX con autocompletado, comprobación de sintaxis, plegado de código y formateo +- *Modo de espacio de trabajo, que guarda sus cambios en el disco y sincroniza los metadatos del modelo con Analysis Services al mismo tiempo +- *Vista previa de datos de tabla con desplazamiento infinito, creación de PivotGrids o escritura de consultas DAX para explorar el modelo o probar la lógica de cálculo +- *Programar actualizaciones de datos +- Actualización del esquema de tabla tanto en los orígenes de datos de proveedor como en los estructurados, incluidas las consultas M +- Crear diagramas de modelos de datos +- Crear scripts DAX para editar varias medidas u otros objetos calculados en un solo documento +- Grabar scripts de C# y guardarlos como macros (antes «Acciones personalizadas») +- Integración con el analizador VertiPaq +- Depurador DAX +- Integración con el Optimizador de DAX +- Acciones de código para refactorizar tu DAX + +*=Solo cuando se está conectado a una instancia de Analysis Services o Power BI + +--- diff --git a/localizedContent/es/content/references/release-notes/3_27_1_1.md b/localizedContent/es/content/references/release-notes/3_27_1_1.md new file mode 100644 index 000000000..c9e0ec9eb --- /dev/null +++ b/localizedContent/es/content/references/release-notes/3_27_1_1.md @@ -0,0 +1,74 @@ +--- +uid: release-3-27-1-1 +--- +# Tabular Editor 3.27.1.1 + +# [**Descargas**](#tab/downloads) + +Descargas de Tabular Editor 3.27.1.1: + +**En .NET 10** (recomendado para la mayoría de los usuarios): + +- Descargar [Tabular Editor 3.27.1.1 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) *(recomendado)* +- Descargar [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) +- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) +- Versión MSI: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) + +**En .NET 8** (para equipos que aún no pueden ejecutar el tiempo de ejecución de escritorio de .NET 10): + +- Descargar [Tabular Editor 3.27.1.1 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) +- Descargar [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) +- Versiones portátiles: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) +- Versión MSI: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) + +*Si no has usado Tabular Editor 3 antes, puedes optar a una prueba de 30 días, que se puede activar después de la instalación. También puedes [comprar una licencia](https://tabulareditor.com/licensing).* + +# [**Sumas de comprobación SHA-256**](#tab/checksums) + +| Archivo | Entorno de ejecución .NET | Plataforma | SHA-256 | +| -- | -- | -- | -- | +| [TabularEditor.3.27.1.1.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) | .NET 10 | x64 | «77D937365893FB9BBD5978340BFDDEB6E80CF0A2FE7BD2E553900FC55FFCFF80» | +| [TabularEditor.3.27.1.1.x64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi) | .NET 10 | x64 | `995DCE34B0167FF6A3253C5D69D8528F4376E6D901D47D51267BDE92496C5EA2` | +| [TabularEditor.3.27.1.1.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip) | .NET 10 | x64 | `640635D3017C78DBA3142C5FB29342D3A6CCAA8506FEE93C999AA7CA788D676F` | +| [TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | «E95A76DF2C3AB2DDCA4C02DF2C1013BBBBA8350DB3066B4D59F01B1B84135D23» | +| [TabularEditor.3.27.1.1.ARM64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) | .NET 10 | ARM64 | `6F1A81BB998A2875D2F296F19202B721C0F1D98A8E778DB8B8F05320BE3E4A25` | +| [TabularEditor.3.27.1.1.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) | .NET 10 | ARM64 | `E78071C0B5AA9CA49242F4A663A82C7579384D1470278A2DC1691E29A1FCFE25` | +| [TabularEditor.3.27.1.1.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) | .NET 8 | x64 | «ACFA96FF21E270BF65E7D4501C0A50703AC2AF1FDCE17689838AC1647A46274F» | +| [TabularEditor.3.27.1.1.x64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi) | .NET 8 | x64 | `8B1F1D53C9BF432F4CD981A0584F8C879E53D953B8C97945269A21D1F8C448F2` | +| [TabularEditor.3.27.1.1.x64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip) | .NET 8 | x64 | `619DE6309EE63BC2AE3DD4B9FA2B08F8A6404394DA50F05C6BBD1ABF46AB31EA` | +| [TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) | .NET 8 | ARM64 | `7715427824868BE2D34FE7BD66AF48E85C91B4A0B55BD695F132313D9D5747C7` | +| [TabularEditor.3.27.1.1.ARM64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) | .NET 8 | ARM64 | `B96150B0D2763F4A349724F7E7E985D825147D39933A3ADC62314E4ECD9B1B5A` | +| [TabularEditor.3.27.1.1.ARM64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) | .NET 8 | ARM64 | `55516A79C8B96F0C3B67DE96DC6D86475F5BC00A8C36ADCF9A71907CBA5846F9` | + + +*** + +## Correcciones de errores en la versión 3.27.1.1 + +- Se ha solucionado un problema por el que Tabular Editor 3 se cerraba inesperadamente al seleccionar un objeto con una expresión, en equipos cuya configuración de seguridad impedía el inicio del componente del editor de código. Este problema era una regresión desde la versión 3.27.0. Los administradores pueden volver a activar la comprobación de firmas de las bibliotecas del editor de código con la directiva `RequireNativeLibrarySignatureVerification`. Consulta [Directivas](https://docs.tabulareditor.com/en/references/policies.html#general-policies). +- Se ha solucionado un problema por el que los detalles de un error inesperado, en el cuadro de diálogo del informe de errores y en «errorreport.txt», enumeraban el mismo error varias veces y omitían el error subyacente. Ahora, cada error de la cadena se indica una sola vez, hasta llegar a la causa subyacente. + +--- + +## ¿Viene de Tabular Editor 2.x? + +Para ver un repaso de las principales características de Tabular Editor 3, mira [este vídeo](https://youtu.be/O4ATwdzCvWc). Para empezar, consulte la [guía de incorporación](https://docs.tabulareditor.com/onboarding/index.html). + +**Principales funciones de Tabular Editor 3:** +- IDE personalizable con soporte para múltiples monitores y Hi-DPI, y temas +- Editor de código DAX con autocompletado, comprobación de sintaxis, plegado de código y formateo +- *Modo de espacio de trabajo, que guarda sus cambios en el disco y sincroniza los metadatos del modelo con Analysis Services al mismo tiempo +- *Vista previa de datos de tabla con desplazamiento infinito, creación de PivotGrids o escritura de consultas DAX para explorar el modelo o probar la lógica de cálculo +- *Programar actualizaciones de datos +- Actualización del esquema de tabla tanto en los orígenes de datos de proveedor como en los estructurados, incluidas las consultas M +- Crear diagramas de modelos de datos +- Crear scripts DAX para editar varias medidas u otros objetos calculados en un único documento +- Grabar scripts de C# y guardarlos como macros (antes «Acciones personalizadas») +- Integración con el analizador VertiPaq +- Depurador DAX +- Integración con el Optimizador de DAX +- Acciones de código para refactorizar tu DAX + +*=Solo cuando se está conectado a una instancia de Analysis Services o Power BI + +--- diff --git a/localizedContent/es/content/references/supported-files.md b/localizedContent/es/content/references/supported-files.md index 6c1634048..db88a6e78 100644 --- a/localizedContent/es/content/references/supported-files.md +++ b/localizedContent/es/content/references/supported-files.md @@ -1,6 +1,6 @@ ---- +--- uid: supported-files -title: Tipos de archivo compatibles +title: Tipos de archivo admitidos author: Morten Lønskov updated: 2026-10-12 applies_to: @@ -11,47 +11,45 @@ applies_to: editions: - edition: Desktop partial: true - note: "La Edición de escritorio no admite archivos de metadatos de modelos" + note: "Desktop Edition does not support model metadata files" - edition: Business full: true - edition: Enterprise full: true --- +# Tipos de archivo admitidos -# Tipos de archivo compatibles - -Tabular Editor 3 utiliza varios formatos de archivo y tipos de documento, algunos de los cuales no se usan en Analysis Services ni en Power BI. Este artículo ofrece una descripción general y una explicación de cada uno de estos tipos de archivo. +Tabular Editor 3 utiliza varios formatos de archivo y tipos de documentos diferentes, algunos de los cuales no son utilizados por Analysis Services ni por Power BI. Este artículo ofrece una visión general y una descripción de cada uno de estos tipos de archivo. -![Tipos de archivo compatibles](~/content/assets/images/file-types/te3-supported-file-types.png) +![Tipos de archivos compatibles](~/content/assets/images/file-types/te3-supported-file-types.png) -Hay archivos de ejemplo disponibles para cada tipo de archivo, basados en el caso práctico “Business Case” del curso 2 de [learn.tabulareditor.com](https://tabulareditor.com/learn). +Hay archivos de ejemplo disponibles para cada uno de los distintos tipos de archivo, basados en el caso de negocio del curso 2 de [learn.tabulareditor.com](https://tabulareditor.com/learn). -## Tipos de archivo del Dataset +## Tipos de archivos de conjuntos de datos -Tabular Editor admite cuatro tipos de archivo para modelos semánticos: .bim, archivos de Power BI (.pbit y .pbip), .json y .tmdl. Cada tipo de archivo tiene características y limitaciones distintas, que se explican a continuación. +Tabular Editor admite cuatro tipos de archivos para modelos semánticos: .bim, archivos de Power BI (.pbit y .pbip), .json y .tmdl. Cada tipo de archivo tiene características y limitaciones diferentes, que se explican a continuación. -Además, las ediciones Business y Edición Enterprise de Tabular Editor 3 admiten **guardar con archivos auxiliares** para la integración de Git de Microsoft Fabric. Esto crea una estructura de carpetas que contiene los archivos de metadatos .platform y definition.pbism junto a los archivos de tu modelo, lo que permite una sincronización fluida con los Workspaces de Fabric. Consulta [Guardar con archivos auxiliares](xref:save-with-supporting-files) para obtener más información. +Además, las ediciones Business y Enterprise de Tabular Editor 3 permiten **guardar con archivos auxiliares** para la integración de Microsoft Fabric Git. Esto crea una estructura de carpetas que contiene los archivos de metadatos .platform y definition.pbism junto con los archivos de su modelo, lo que permite una sincronización perfecta con los espacios de trabajo de Fabric. Consulte [Guardar con archivos auxiliares](xref:save-with-supporting-files) para obtener más información. > [!NOTE] -> Dado que **Tabular Editor 3 Edición de escritorio** solo está diseñado para usarse como herramienta externa de Power BI Desktop, esta edición no permite cargar ni guardar archivos de modelo semántico. No obstante, puedes seguir usando Tabular Editor 2.x para este fin. Consulta para obtener más información sobre las diferencias entre las ediciones de Tabular Editor 3. +> Dado que **Tabular Editor 3 Desktop Edition** solo está pensada para usarse como herramienta externa para Power BI Desktop, esta edición no permite cargar ni guardar archivos de modelos semánticos. Sin embargo, aún puede usar Tabular Editor 2.x para este fin. Consulta para obtener más información sobre las diferencias entre las ediciones de Tabular Editor 3. ### [Archivos de modelo tabular (.bim)](#tab/BIM) +Un archivo .bim es un archivo único compuesto por JSON anidado, conocido como TMSL. -Un archivo .bim es un único archivo que contiene JSON anidado, conocido como TMSL. +Es el formato original de un modelo semántico compatible con Microsoft. -Es el formato original de un modelo semántico que Microsoft admite. +Sin embargo, tiene un gran inconveniente: al tratarse de un único archivo de gran tamaño, resulta difícil hacer un seguimiento de los cambios y aplicar buenas prácticas de desarrollo en equipo, como el control de código fuente con Git. -Sin embargo, tiene un gran inconveniente: al ser un único archivo grande, es difícil hacer seguimiento de los cambios y aplicar buenas prácticas de desarrollo en equipo, como el control de versiones con Git. +**.bim archivo en una carpeta** -#### Archivo «.bim» en una carpeta +![Tipos de archivos BIM compatibles](~/content/assets/images/file-types/te3-supported-file-bim.png) -![Supported File Types BIM](~/content/assets/images/file-types/te3-supported-file-bim.png) +[Descargar archivo .bim de ejemplo ](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/bim-file-example.bim) -[Descarga el archivo de ejemplo .bim](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/bim-file-example.bim) +**Guardar con archivos auxiliares para la integración de Fabric Git** -#### Guardar con archivos auxiliares para la integración de Git de Fabric - -Al usar la opción **Guardar con archivos auxiliares** (ediciones Business y Edición Enterprise), Tabular Editor crea una estructura de carpetas compatible con la integración de Git de Microsoft Fabric: +Al utilizar la opción **Guardar con archivos auxiliares** (ediciones Business y Enterprise), Tabular Editor crea una estructura de carpetas compatible con la integración de Microsoft Fabric Git: ``` DatabaseName.SemanticModel/ @@ -60,89 +58,93 @@ DatabaseName.SemanticModel/ └── model.bim ``` -Esta estructura te permite realizar commits de tus modelos semánticos en repositorios Git y sincronizarlos con los Workspaces de Fabric. Consulta [Guardar con archivos auxiliares](xref:save-with-supporting-files) para ver la documentación completa. +Esta estructura te permite confirmar tus modelos semánticos en repositorios Git y sincronizarlos con los espacios de trabajo de Fabric. Consulte [Guardar con archivos auxiliares](xref:save-with-supporting-files) para obtener la documentación completa. + ### [Power BI](#tab/PowerBI) -Tabular Editor puede trabajar con dos tipos de formatos de almacenamiento de Power BI: +Tabular Editor puede gestionar dos tipos de formatos de almacenamiento de Power BI: - Archivos de plantilla de Power BI (.pbit) -- Carpetas del Proyecto de Power BI (.pbip) +- Carpetas de proyectos de Power BI (.pbip) -#### Carpetas del Proyecto de Power BI (.pbip) _(Versión preliminar)_ -Las carpetas del Proyecto de Power BI se introdujeron en junio de 2023 y están disponibles en Power BI Desktop como una funcionalidad en versión preliminar (también conocida como "Modo de desarrollador"). Este formato de almacenamiento es una forma alternativa de guardar el contenido de un archivo .pbix, en un formato más compatible con el control de versiones y con la lectura/edición del contenido por parte de terceros. + +**Carpetas de proyectos de Power BI (.pbip) (Vista previa)** + +Las carpetas de Proyectos de Power BI se introdujeron en junio de 2023 y están disponibles en Power BI Desktop como una función de vista previa (también conocida como «Modo desarrollador»). El formato de almacenamiento es una forma alternativa de almacenar el contenido de un archivo .pbix, en un formato más adecuado para el control de versiones y para que terceros puedan leer/editar el contenido. > [!WARNING] -> Al igual que un archivo .pbix, una carpeta del Proyecto de Power BI puede contener **datos** del modelo además de **metadatos**; por tanto, debe tratarse como información confidencial, del mismo modo que un archivo .pbix. +> Al igual que un archivo .pbix, una carpeta de Proyecto de Power BI puede contener **datos** del modelo además de **metadatos**, por lo que la carpeta debe tratarse como confidencial de la misma manera que debe tratarse un archivo .pbix. -En la raíz de las carpetas del Proyecto de Power BI se encuentra un archivo .pbip. En esencia, el archivo es un puntero a un archivo de definición de informe de Power BI, que a su vez puede apuntar a un Dataset de Power BI: ya sea de forma local, en la misma estructura de carpetas (almacenado como un archivo model.bim), o a un Dataset publicado en el servicio de Power BI (en este caso, se considera que el Report está en modo _Live connect_). Si hay un Dataset (archivo model.bim) en la carpeta del Proyecto de Power BI, Tabular Editor podrá cargar estos metadatos del modelo al abrir el archivo .pbip. +En la raíz de las carpetas del Proyecto de Power BI se encuentra un archivo .pbip. El archivo es básicamente un puntero a un archivo de definición de informe de Power BI, que a su vez puede apuntar a un conjunto de datos de Power BI, ya sea localmente en la misma estructura de carpetas (almacenado como un archivo model.bim) o a un conjunto de datos publicado en el servicio Power BI (en este caso, se dice que el informe está en modo *Conexión en directo*). Si hay un conjunto de datos (archivo model.bim) en la carpeta del Proyecto de Power BI, Tabular Editor podrá cargar los metadatos de este modelo al abrir el archivo .pbip. -Para obtener más información sobre las carpetas del Proyecto de Power BI, consulta [esta entrada oficial del blog de Microsoft](https://powerbi.microsoft.com/en-us/blog/deep-dive-into-power-bi-desktop-developer-mode-preview/). +Para obtener más información sobre las carpetas de proyectos de Power BI, lea [esta entrada oficial del blog de Microsoft](https://powerbi.microsoft.com/en-us/blog/deep-dive-into-power-bi-desktop-developer-mode-preview/). > [!IMPORTANT] -> El archivo de Proyecto de Power BI es el formato recomendado al usar Power BI con Tabular Editor, ya que admite la [gama más amplia de operaciones de modelado](https://learn.microsoft.com/power-bi/developer/projects/projects-overview#model-authoring). Realizar cambios en los metadatos del modelo distintos de los enumerados puede hacer que el modelo deje de poder cargarse en Power BI Desktop; en ese caso, el Soporte técnico de Microsoft no podrá ayudarte. +> El archivo de proyecto de Power BI es el formato recomendado cuando se utiliza Power BI con Tabular Editor, ya que admite [la gama más amplia de operaciones de modelado](https://learn.microsoft.com/power-bi/developer/projects/projects-overview#model-authoring). Realizar otros tipos de cambios en los metadatos del modelo distintos de los enumerados puede hacer que su modelo no se pueda cargar en Power BI Desktop y, en ese caso, el servicio de asistencia técnica de Microsoft no podrá ayudarle. -#### Archivo de plantilla de Power BI (.pbit) +**Archivo de plantilla de Power BI (.pbit)** -Los archivos de plantilla de Power BI son similares a los archivos .pbix, con la diferencia de que no contienen **datos** del modelo; solo **metadatos** del modelo. Por tanto, estos metadatos del modelo se pueden abrir y editar en Tabular Editor. +Los archivos de plantilla de Power BI son similares a los archivos .pbix, con la excepción de que no contienen **datos** del modelo, sino únicamente **metadatos** del modelo. Por lo tanto, estos metadatos del modelo se pueden abrir y editar en Tabular Editor. > [!WARNING] -> Aunque técnicamente es posible cargar metadatos del modelo desde un archivo .pbit y volver a guardarlos en un .pbit, este enfoque no está admitido por Power BI Desktop. Tabular Editor mostrará una advertencia y bloqueará los cambios de forma predeterminada. En su lugar, usa carpetas del Proyecto de Power BI si tienes previsto hacer cambios en tu modelo de Power BI a través de Tabular Editor. +> Aunque técnicamente es posible cargar y guardar metadatos del modelo en un archivo .pbit y desde él, Power BI Desktop no admite este enfoque. Tabular Editor mostrará una advertencia y bloqueará los cambios de forma predeterminada. En su lugar, utiliza las carpetas de Proyectos de Power BI si tienes intención de realizar cambios en tu modelo de Power BI a través de Tabular Editor. ### [Carpeta de modelo tabular (.json)](#tab/JSON) -Tabular Editor te permite guardar los objetos de tu Dataset como archivos JSON independientes, usando un formato de serialización personalizado. +Tabular Editor le permite guardar los objetos de su conjunto de datos como archivos JSON separados, que es un formato de serialización personalizado. Este formato conserva la estructura y las propiedades de tus objetos, como tablas, columnas, medidas y relaciones. -Este formato es compatible con Tabular Editor desde sus inicios y es un método probado —aunque Microsoft no lo admite— para almacenar los objetos del Dataset como archivos individuales. De este modo, los desarrolladores pueden hacer un seguimiento de los cambios en el control de código fuente y colaborar en la creación de modelos semánticos. +Este formato es compatible con Tabular Editor desde sus inicios y es un método probado, aunque no respaldado por Microsoft, para almacenar los objetos de su conjunto de datos como archivos individuales. De este modo, los desarrolladores pueden rastrear los cambios en el control de código fuente y colaborar en la construcción de modelos semánticos. + +Existe una compatibilidad total entre Tabular Editor 2 y 3 en lo que respecta a la estructura de los archivos JSON. -Hay compatibilidad total entre Tabular Editor 2 y 3 en lo que respecta a la estructura de archivos JSON. +Para guardar un modelo semántico en JSON, debe usar la opción «Guardar en carpeta» cuando lo guarde por primera vez. Los guardados posteriores de un modelo cargado a partir de un modelo estructurado en JSON mantienen la configuración. Siempre es posible convertir un modelo que esté en JSON a un archivo con la extensión .bim utilizando «Archivo > Guardar como». -Para guardar un modelo semántico en JSON, debes usar la opción "Guardar en carpeta" la primera vez que lo guardes. Los guardados posteriores de un modelo cargado desde un modelo estructurado en JSON mantienen la configuración. siempre es posible convertir un modelo que está en JSON a un archivo .bim usando 'Archivo > Guardar como' -![Tipos de archivo compatibles JSON](~/content/assets/images/file-types/te3-supported-file-json.png) +![Tipos de archivos JSON compatibles](~/content/assets/images/file-types/te3-supported-file-json.png) -1. El modelo completo incluye un archivo json de la base de datos y cada encabezado TOM tiene su propia carpeta -2. En la carpeta tables, cada tabla tiene su propia carpeta -3. Una tabla individual como un archivo json de TableName con carpetas para medidas, columnas y particiones -4. Las medidas de la tabla tienen cada una su propio archivo json. +1. El modelo general tiene una base de datos JSON y cada encabezado TOM tiene su propia carpeta. +2. En las tablas, cada tabla existe en su propia carpeta. +3. Una tabla individual como archivo JSON con el nombre de la tabla y carpetas para medidas, columnas y particiones. +4. Cada una de las medidas de la tabla tiene su propio archivo JSON. -La configuración de serialización gestiona la profundidad de los objetos json que se crearán. +La profundidad de los objetos JSON que se crearán se gestiona mediante la configuración de serialización. Un único archivo JSON para una medida contiene todas las propiedades de esa medida: + +![Tipos de archivos compatibles: archivo JSON](~/content/assets/images/file-types/te3-supported-file-json-measure.png) -![Tipos de archivo compatibles: archivo JSON de una medida](~/content/assets/images/file-types/te3-supported-file-json-measure.png) -Para más información sobre Guardar en carpeta y la configuración de serialización, consulta: [Guardar en carpeta](xref:save-to-folder) +Para obtener más información sobre «Guardar en carpeta» y los ajustes de serialización, consulta: [Guardar en carpeta](xref:save-to-folder) [Descargar ejemplo de estructura de carpetas JSON](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/json-model-example.zip) ### [TMDL](#tab/TMDL) -TMDL significa Tabular Model Definition Language y es un nuevo formato para definir y administrar los Dataset en un formato legible para las personas, usando una sintaxis similar a YAML. +TMDL son las siglas de «Lenguaje de definición de modelo tabular» y es un nuevo formato para definir y gestionar conjuntos de datos en un formato legible por humanos utilizando una sintaxis similar a YAML. -Microsoft presentó TMDL como una característica en versión preliminar en abril de 2023, con el objetivo de ofrecer una forma unificada y coherente de trabajar con los Dataset en distintas plataformas y herramientas. +Microsoft presentó TMDL como una función de vista previa en abril de 2023, con el objetivo de ofrecer una forma unificada y coherente de trabajar con conjuntos de datos en diferentes plataformas y herramientas. -TMDL está diseñado para admitir el control de código fuente de los Dataset, lo que permite a los usuarios hacer un seguimiento de los cambios, colaborar y automatizar flujos de trabajo con modelos semánticos. - -> [!Note] -> TMDL está en versión preliminar, lo que significa que aún no es totalmente estable y puede tener algunas limitaciones o problemas. +TMDL está diseñado para admitir el control de código fuente de los conjuntos de datos, lo que permite a los usuarios rastrear cambios, colaborar y automatizar flujos de trabajo con modelos semánticos. +> [!NOTE] +> TMDL está en versión preliminar, lo que significa que no es totalmente estable y puede tener algunas limitaciones o problemas. -![Tipos de archivo compatibles TMDL](~/content/assets/images/file-types/te3-supported-file-tmdl.png) +![Tipos de archivos TMDL compatibles](~/content/assets/images/file-types/te3-supported-file-tmdl.png) -1. La serialización general se realiza en el nivel del objeto superior de TOM -2. Cada tabla es un único archivo -3. El archivo TMDL usa una sangría similar a la de YAML e incluye cada columna y medida dentro del archivo. +1. La serialización general se encuentra en el nivel de objeto superior del TOM. +2. Cada tabla es un archivo único. +3. El archivo TMDL consta de una sangría similar a YAML con cada columna y medida dentro del archivo. -Para ampliar información, consulta: [TMDL](xref:tmdl) +Para obtener más información, consulte: [TMDL](xref:tmdl) [Descargar ejemplo de estructura de carpetas TMDL](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/tmdl-model-example.zip) -#### Guardar con archivos auxiliares para la integración de Git de Fabric +**Guardar con archivos auxiliares para la integración de Fabric Git** -Al usar la opción **Guardar con archivos auxiliares** (ediciones Business y Edición Enterprise), Tabular Editor crea una estructura de carpetas compatible con la integración de Git de Microsoft Fabric: +Al utilizar la opción **Guardar con archivos auxiliares** (ediciones Business y Enterprise), Tabular Editor crea una estructura de carpetas compatible con la integración de Microsoft Fabric Git: ``` DatabaseName.SemanticModel/ @@ -154,161 +156,158 @@ DatabaseName.SemanticModel/ └── ... ``` -El formato TMDL legible para humanos es especialmente adecuado para el control de versiones y las revisiones de código cuando se usa la integración de Git de Fabric. Consulta [Guardar con archivos auxiliares](xref:save-with-supporting-files) para ver la documentación completa. +El formato TMDL legible por humanos es especialmente adecuado para el control de versiones y las revisiones de código cuando se utiliza la integración de Git de Fabric. Consulte [Guardar con archivos auxiliares](xref:save-with-supporting-files) para obtener la documentación completa. *** -## Archivos de integración de Git de Fabric +## Archivos de integración de Fabric con Git -Al usar la característica **Guardar con archivos auxiliares** (ediciones Business y Edición Enterprise), Tabular Editor crea archivos de metadatos adicionales necesarios para la integración de Git de Microsoft Fabric. Tabular Editor genera y gestiona estos archivos automáticamente. +Al utilizar la función **Guardar con archivos auxiliares** (ediciones Business y Enterprise), Tabular Editor crea archivos de metadatos adicionales necesarios para la integración de Microsoft Fabric Git. Estos archivos se generan y gestionan automáticamente por Tabular Editor. ### .platform -El archivo .platform contiene metadatos sobre el elemento de modelo semántico, incluidos: +El archivo .platform contiene metadatos sobre el elemento del modelo semántico, que incluyen: +- **type**: Identifica el elemento como un SemanticModel +- **displayName**: El nombre que se muestra en los espacios de trabajo de Fabric (sincronizado a partir de la propiedad `Name` de la base de datos) +- **description**: La descripción que se muestra en Fabric (sincronizada a partir de la propiedad `Description` de la base de datos) +- **logicalId**: Un identificador entre áreas de trabajo generado automáticamente -- **type**: Identifica el elemento como SemanticModel -- **displayName**: El nombre que se muestra en los Workspaces de Fabric (sincronizado desde la propiedad `Name` de `Database`) -- **description**: La descripción que se muestra en Fabric (sincronizada desde la propiedad `Description` de `Database`) -- **logicalId**: Un identificador entre Workspaces generado automáticamente - -Este archivo JSON no debe editarse manualmente a menos que entiendas el formato de elementos de Fabric. +Este archivo es un archivo JSON que no debe editarse manualmente a menos que comprenda el formato de los elementos de Fabric. > [!NOTE] -> Esta sincronización se aplica a un modelo cuyos metadatos incluyen un nombre o una descripción. Un modelo semántico de un Proyecto de Power BI (PBIP) creado con Power BI Desktop no incluye ninguno de los dos en su TMDL: ambos solo existen en el archivo `.platform`. +> Esta sincronización se aplica a un modelo cuyos metadatos llevan un nombre o una descripción. Un modelo semántico de Proyecto de Power BI (PBIP) creado por Power BI Desktop no contiene ninguno de los dos en su TMDL: ambos solo existen en el archivo «.platform». ### definition.pbism -El archivo definition.pbism contiene la definición general y la configuración principal del modelo semántico. Este archivo funciona junto con los metadatos del modelo (almacenados como model.bim o en la carpeta definition/) para proporcionar la información completa del modelo semántico que requiere Microsoft Fabric. +El archivo definition.pbism contiene la definición general y los ajustes principales del modelo semántico. Este archivo funciona junto con los metadatos del modelo (almacenados como model.bim o en la carpeta definition/) para proporcionar la información completa del modelo semántico que requiere Microsoft Fabric. -Ambos archivos se crean automáticamente cuando seleccionas la opción **Save with supporting files** durante las operaciones de guardado. La estructura de carpetas resultante (con el sufijo .SemanticModel) puede confirmarse en repositorios de Git y sincronizarse con los Workspaces de Fabric. +Ambos archivos se crean automáticamente cuando marca la opción **Guardar con archivos auxiliares** durante las operaciones de guardado. La estructura de carpetas resultante (con el sufijo .SemanticModel) se puede confirmar en repositorios de Git y sincronizar con los espacios de trabajo de Fabric. -Para consultar la documentación completa de esta característica, consulta [Save with supporting files](xref:save-with-supporting-files). +Para obtener documentación completa sobre esta función, consulte [Guardar con archivos auxiliares](xref:save-with-supporting-files). -## Archivos de soporte de Tabular Editor +## Archivos de compatibilidad de Tabular Editor -Los archivos de soporte son archivos que no utilizan Analysis Services ni Power BI. En su lugar, estos archivos sirven de apoyo a distintos flujos de trabajo de desarrollo en Tabular Editor 3 y otras herramientas. +Los archivos de soporte son archivos que no utilizan Analysis Services ni Power BI. En cambio, todos estos archivos admiten diferentes tipos de flujos de trabajo de desarrollo en Tabular Editor 3 y otras herramientas. -Todos los archivos auxiliares se pueden guardar individualmente con Ctrl+S o con 'Archivo > Guardar', siempre que tengas abierto y en primer plano el documento o la ventana correspondiente. +Todos los archivos auxiliares se pueden guardar individualmente usando Ctrl+S o «Archivo > Guardar» mientras el documento o la ventana correspondiente están abiertos y seleccionados. ### Opciones de usuario (.tmuo) -Un archivo `.tmuo` guarda tu configuración local de tu equipo para un modelo: la base de datos del Workspace, las anulaciones de credenciales de Data source, la configuración de importación de tablas, las anulaciones de actualización y las concesiones de permisos de IA. Se guarda junto al modelo y se nombra a partir de este y de tu nombre de usuario de Windows, de modo que varios desarrolladores puedan trabajar en el mismo modelo sin interferir entre sí. +Un archivo «.tmuo» contiene su propia configuración local del equipo para un modelo: la base de datos del área de trabajo, las anulaciones de credenciales de la fuente de datos, la configuración de importación de tablas, las anulaciones de actualización y las concesiones de permisos de IA. Se encuentra junto al modelo y lleva el nombre de este y su nombre de usuario de Windows, de modo que varios desarrolladores pueden trabajar en el mismo modelo sin interferir entre sí. -Las credenciales que contiene se cifran con tu clave de usuario de Windows, por lo que no resulta útil compartir el archivo. Agrega `*.tmuo` a `.gitignore`. +Las credenciales que contiene están cifradas con tu clave de usuario de Windows, lo que significa que el archivo no se puede compartir de forma útil. Añada «*.tmuo» a «.gitignore». -Consulta @user-options para ver el contenido completo y dónde se escribe el archivo para cada formato de modelo. +Consulte @user-options para ver el contenido completo y dónde se escribe el archivo para cada formato de modelo. ### Archivo de diagrama (.te3diag) -Un archivo .te3diag es un archivo que almacena el diagrama de un modelo creado con TE3. +Un archivo .te3diag es un formato de archivo que almacena el diagrama de un modelo creado con TE3. Estos archivos pueden ser útiles para documentar la estructura y la lógica del modelo para otros desarrolladores que trabajen en el mismo proyecto. Un archivo .te3diag se puede guardar en la misma carpeta que el archivo del modelo para facilitar el acceso y la consulta. -Los archivos de diagrama en realidad son archivos JSON almacenados en una extensión de Tabular Editor 3. +Los archivos de diagrama son en realidad archivos JSON que se almacenan en una extensión de Tabular Editor 3. [Descargar archivo de diagrama de ejemplo](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/te3-diagram.te3diag) -### Archivos de consulta DAX (.dax o .msdax) +### Archivos de consultas DAX (.dax o .msdax) -Las consultas DAX son expresiones que se pueden usar para manipular y analizar datos en modelos semánticos. Un archivo DAX es un archivo de texto que contiene una o varias consultas DAX. +Las consultas DAX son expresiones que se pueden utilizar para manipular y analizar datos en modelos semánticos. Un archivo DAX es un archivo de texto que contiene una o más consultas DAX. -Puedes guardar un archivo DAX en Tabular Editor 3 y usarlo más adelante para volver a ejecutar las consultas. También puedes abrir un archivo DAX en otras herramientas que admitan DAX, como [DAX Studio](https://daxstudio.org). +Puedes guardar un archivo DAX en Tabular Editor 3 y usarlo más tarde para volver a ejecutar las consultas. También puedes abrir un archivo DAX en otras herramientas compatibles con DAX, como [DAX Studio](https://daxstudio.org). [Descargar archivo DAX de ejemplo](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/dax-query-example.dax) -Estos archivos solo se pueden abrir cuando Tabular Editor 3 está conectado a una instancia de Analysis Services o al punto de conexión XMLA de Power BI / Fabric. +Estos archivos solo se pueden abrir mientras Tabular Editor 3 está conectado a una instancia de Analysis Services o al punto de conexión XMLA de Power BI / Fabric. -### Diseños de Pivot Grid (.te3pivot) +### Estructuras de Pivot Grid (.te3pivot) -Estos archivos contienen el diseño de un Pivot Grid en Tabular Editor 3. Son archivos JSON sencillos que especifican qué campos (medidas, columnas, jerarquías) se muestran en el Pivot Grid y cómo se organizan. +Estos archivos contienen la estructura de un Pivot Grid en Tabular Editor 3. Son archivos JSON sencillos que especifican qué campos (medidas, columnas, jerarquías) se muestran en el Pivot Grid y cómo están organizados. -Estos archivos solo se pueden abrir cuando Tabular Editor 3 está conectado a una instancia de Analysis Services o al punto de conexión XMLA de Power BI / Fabric. +Estos archivos solo se pueden abrir mientras Tabular Editor 3 está conectado a una instancia de Analysis Services o al punto de conexión XMLA de Power BI / Fabric. ### Scripts DAX (.te3daxs) -Estos archivos son Scripts DAX guardados (no consultas) que se usan en Tabular Editor para manipular varios objetos DAX a la vez. Por ejemplo, modificar varias medidas en un modelo semántico. +Estos archivos son scripts DAX guardados (no consultas) que se utilizan en Tabular Editor para manipular muchos objetos DAX a la vez. Por ejemplo, para modificar varias medidas en un modelo semántico. -### C# Script (.csx) +### Scripts de C# (.csx) -Crear y editar C# Scripts es una de las funciones de productividad más potentes de Tabular Editor. +Crear y editar C# Scripts es una de las funciones de productividad más importantes de Tabular Editor. -Estos scripts se pueden guardar como archivos con la extensión .csc, cargarse en Tabular Editor y también guardarse como macros. Tabular Editor mantiene un [archivo de configuración local llamado MacroActions.json](xref:supported-files#macroactionsjson). +Estos scripts se pueden guardar como archivos con la extensión .csc y cargarse en Tabular Editor, así como guardarse como macros. Tabular Editor mantiene un [archivo de configuración local MacroActions.json](xref:supported-files#macroactionsjson). -Así, puedes reutilizar los scripts sin tener que escribirlos desde cero cada vez. La [biblioteca de scripts](xref:csharp-script-library) es un buen lugar para explorar y reutilizar varios ejemplos de scripts, ya que muestran distintas características y funcionalidades de C#. +De esta manera, los scripts se pueden reutilizar sin tener que escribirlos desde cero cada vez. La [biblioteca de scripts](xref:csharp-script-library) es un buen lugar para investigar y reutilizar varios ejemplos de scripts, ya que muestran diferentes características y funcionalidades de C#. [Descargar archivo de ejemplo de script de C#](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/create-sum-measures-csharp.csx) -### Archivos de VertiPaq Analyzer (.vpax) +### Archivos de Vertipaq Analyzer (.vpax) -Con Tabular Editor, puedes exportar e importar archivos .vpax con la función VertiPaq Analyzer. Un archivo .vpax es un archivo comprimido que contiene información sobre el tamaño y la estructura de tu modelo semántico, pero no los datos reales. +Con Tabular Editor, puede exportar e importar archivos .vpax utilizando la función Vertipaq Analyzer. Un archivo .vpax es un archivo comprimido que contiene información sobre el tamaño y la estructura de tu modelo semántico, pero no los datos reales. -Puedes usar este archivo para analizar y optimizar el rendimiento del modelo, sin exponer datos confidenciales. Por ejemplo, puedes usar la herramienta [DAX optimizer](https://www.daxoptimizer.com/) para obtener sugerencias sobre cómo mejorar tus fórmulas DAX en función del archivo .vpax. +Puedes usar este archivo para analizar y optimizar el rendimiento de tu modelo, sin exponer datos confidenciales. Por ejemplo, puede usar la herramienta [DAX Optimizer](https://www.daxoptimizer.com/) para obtener sugerencias sobre cómo mejorar sus fórmulas DAX basándose en el archivo .vpax. -[Descargar archivo de ejemplo de script DAX](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/dax-script-example.te3daxs) +[Descargar archivo de ejemplo de Script DAX](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/dax-script-example.te3daxs) -A diferencia de otros tipos de archivos compatibles, la creación de un archivo .vpax se realiza en la ventana de VertiPaq Analyzer mediante los botones 'Import' y 'Export'. +A diferencia de otros tipos de archivos compatibles, la creación de un archivo .vpax se realiza en la ventana de Vertipaq Analyzer utilizando los botones «Importar» y «Exportar». ![VPAX](~/content/assets/images/file-types/te3-supported-file-vpax.png) [Descargar archivo VPAX de ejemplo](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/vpaq-example.vpax) > [!WARNING] -> Si los metadatos de tu modelo son confidenciales, un archivo .vpax también debe considerarse confidencial y compartirse únicamente teniendo esto en cuenta. Si te preocupa proteger la propiedad intelectual, Tabular Editor 3 ofrece una opción para ofuscar archivos VPAX. +> Si los metadatos de su modelo son confidenciales, un archivo .vpax también debe considerarse confidencial y solo debe compartirse teniendo esto en cuenta. Si le preocupa proteger la propiedad intelectual, Tabular Editor 3 tiene una opción para ofuscar los archivos VPAX. -#### Ofuscación +### Archivos VPAX ofuscados (.ovpax) -Si necesitas entregar el archivo VPAX a un tercero, como un consultor o un proveedor de herramientas, puedes ofuscarlo para ocultar los metadatos del modelo. Para hacerlo, selecciona la opción "Obfuscated Export..." en el menú desplegable junto al botón "Export" en la ventana de VertiPaq Analyzer. +Si necesita entregar el archivo VPAX a un tercero, como un consultor o un proveedor de herramientas, puede ofuscar el archivo para ocultar los metadatos del modelo. Para ello, seleccione la opción «Exportación ofuscada...» en el botón desplegable situado junto al botón «Exportar» de la ventana del analizador Vertipaq. -Un archivo VPAX ofuscado usa la extensión .ovpax. +Un archivo VPAX ofuscado utiliza la extensión de archivo .ovpax. -![Export obfuscated VPAX](~/content/assets/images/obfuscated-vpax.png) +![Exportar VPAX ofuscado](~/content/assets/images/obfuscated-vpax.png) -Para más documentación sobre VertiPaq Analyzer, consulta: [sqlbi Vertipaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer) y [sqlbi Docs: Vertipaq Analyzer](https://docs.sqlbi.com/vertipaq-analyzer/) +Para obtener más documentación sobre Vertipaq Analyzer, consulte: [sqlbi Vertipaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer) y [Documentación de sqlbi: Vertipaq Analyzer](https://docs.sqlbi.com/vertipaq-analyzer/) -Para más información sobre la ofuscación de archivos VPAX, consulta: [VPAX Obfuscator](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) +Para obtener más información sobre la ofuscación de archivos VPAX, consulte: [Ofuscador VPAX](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) ## Archivos de configuración local -Tabular Editor mantiene varios archivos locales en la carpeta "%localappdata%\TabularEditor3". Estos archivos son funcionalmente relevantes para Tabular Editor 3 y conviene conocerlos. +Tabular Editor mantiene varios archivos locales en la carpeta «%localappdata%\TabularEditor3». Estos archivos son funcionalmente relevantes para Tabular Editor 3 y es útil conocerlos. -Te puede resultar útil compartir estos archivos con el equipo para que todos los desarrolladores tengan las mismas macros y reglas de BPA. +Puede ser útil compartir estos archivos en un equipo para que todos los desarrolladores tengan las mismas macros y reglas BPA. > [!TIP] -> Una forma nativa de Windows de sincronizar un archivo con control de versiones en la carpeta "%localappdata%\TabularEditor3" es usar [SymLink](https://www.howtogeek.com/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/). +> Una forma nativa de Windows de sincronizar un archivo con control de versiones en la carpeta «%localappdata%\TabularEditor3» es utilizar [SymLink](https://www.howtogeek.com/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/). > -> Guarda los archivos necesarios en Git u OneDrive y crea un Symlink a la carpeta "%localappdata%\TabularEditor3", pero ten en cuenta que esto puede acabar causando problemas de sincronización si varios usuarios actualizan la misma versión del archivo. -> Sin embargo, Tabular Editor no lo admite directamente, así que impleméntalo bajo tu propia responsabilidad. +> Almacene los archivos necesarios en Git o OneDrive y cree un enlace simbólico a la carpeta «%localappdata%\TabularEditor3», pero tenga en cuenta que esto podría provocar problemas de sincronización si varios usuarios actualizan la misma versión del archivo. +> Sin embargo, Tabular Editor no admite esto directamente, así que impleméntelo a su propia discreción. + ### Registro de auditoría de IA -Solo aparece cuando está instalado el componente de características de IA. Tabular Editor registra lo que hicieron el [Asistente de IA](xref:ai-assistant) y el [servidor MCP](xref:mcp-server): qué permisos se solicitaron y cómo se contestó a ellos, qué herramientas se ejecutaron y si cada una tuvo éxito, falló o fue rechazada, y el texto completo de cualquier C# Script que se ejecutó o se entregó para revisión. Los prompts, las respuestas y los valores de datos de tu modelo nunca se registran. +Solo está presente cuando se instala el componente de funciones de IA. Tabular Editor registra lo que hicieron el [Asistente de IA](xref:ai-assistant) y el [servidor MCP](xref:mcp-server): qué permisos se solicitaron y cómo se respondió a ellos, qué herramientas se ejecutaron y si cada una tuvo éxito, falló o fue rechazada, y el texto completo de cualquier script de C# que se ejecutara o se entregara para su revisión. Las indicaciones, las respuestas y los valores de datos de tu modelo nunca se registran. -Se escribe un archivo al día y, de forma predeterminada, se conservan durante 30 días. Accede a la carpeta con **Abrir carpeta de auditoría** en **Herramientas > Preferencias > Características de IA**. Los administradores pueden moverlo y cambiar el período de retención mediante una [directiva](xref:policies). Consulta @ai-audit-log para ver qué contiene cada registro. +Los archivos se escriben a razón de uno por día y se conservan durante 30 días de forma predeterminada. Acceda a la carpeta con **Abrir carpeta de auditoría** en **Herramientas > Preferencias > Funciones de IA**. Los administradores pueden moverla y cambiar el período de conservación mediante [políticas](xref:policies). Consulta @ai-audit-log para saber qué contiene cada registro. -A diferencia de los demás archivos de esta carpeta, este es un registro, no una configuración. No lo compartas ni lo sincronices: es un registro por equipo, y los scripts que contiene pueden revelar la estructura de los modelos en los que has trabajado. +A diferencia de los demás archivos de esta carpeta, este es un registro, no una configuración. No lo comparta ni lo sincronice: es un registro por equipo, y los scripts que contiene pueden revelar la estructura de los modelos en los que ha trabajado. ### MacroActions.json +Este archivo almacena todas las macros que has creado o importado. Puede ser útil compartir este archivo con sus compañeros o hacer una copia de seguridad en un sistema de control de versiones, y también se puede configurar para que se sincronice con un repositorio remoto que contenga macros (véase el consejo anterior). -Este archivo almacena todas las macros que hayas creado o importado. Te puede resultar útil compartir este archivo con tus compañeros o guardarlo como copia de seguridad en un sistema de control de versiones. También puedes configurarlo para que se sincronice con un repositorio remoto que contenga macros (consulta el consejo anterior). +Este archivo contiene el índice de cada macro que se utiliza en el software. Si necesita cambiar el orden o el nombre de alguna macro, puede editar este archivo manualmente con un editor de texto. Sin embargo, tenga cuidado de no introducir errores o incoherencias en el archivo que puedan dañarlo, así que asegúrese de crear una copia de seguridad. -Este archivo contiene el índice de cada macro que se utiliza en la aplicación. Si necesitas cambiar el orden o el nombre de alguna macro, puedes editar este archivo manualmente con un editor de texto. Eso sí: ten cuidado de no introducir errores o incoherencias en el archivo, ya que podrías corromperlo; asegúrate de crear una copia de seguridad. +[Descargar archivo MacroActions de ejemplo](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/MacroActions.json) -[Descargar archivo MacroActions.json de ejemplo](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/MacroActions.json) ### BPARules.json +El archivo contiene las [reglas del Best Practice Analyzer](xref:using-bpa) y las expresiones de corrección. El único lugar para añadir y editar expresiones de corrección es dentro de este archivo JSON. +Se recomienda almacenar el archivo de reglas del BPA en el control de versiones, lo que también permite ejecutar las reglas del BPA en el modelo semántico antes de la implementación. -El archivo contiene las [reglas de Best Practice Analyzer](xref:using-bpa) y expresiones de corrección. El único lugar donde puedes añadir y editar expresiones de corrección es este archivo JSON. -Se recomienda almacenar el archivo de reglas de BPA en un sistema de control de versiones, lo que también permite ejecutar las reglas de BPA contra el modelo semántico antes del despliegue. - -Puedes descargar aquí las reglas oficiales de BPA de Microsoft: [PBA Rules](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json) +Puedes descargar las reglas BPA oficiales de Microsoft aquí: [Reglas BPA](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json) ### RecentServers.json - -Contiene todos los servidores a los que te has conectado. Te puede venir bien editarlo manualmente para "olvidar" servidores anteriores que ya no sean relevantes. +Contiene los servidores a los que se ha conectado, con el tipo de autenticación, el nombre de usuario, el modo y el color de la barra de estado guardados para cada uno, así como la lista de servidores anclados. Las contraseñas no se almacenan. Para eliminar o anclar un servidor, haga clic derecho sobre él en la lista **Servidor** del cuadro de diálogo de conexión. Consulte [Servidores recientes y anclados](xref:xmla-as-connectivity#recent-and-pinned-servers). ### Layouts.json - -El archivo Layouts lo genera automáticamente Tabular Editor al iniciar la aplicación. Contiene toda la información sobre cómo se configura el diseño de la interfaz de usuario de Tabular Editor 3. +Tabular Editor genera automáticamente el archivo Layouts al iniciar la aplicación. Contiene toda la información sobre cómo se configura el diseño de la interfaz de usuario de Tabular Editor 3. > [!TIP] -> Si eliminas este archivo, se restablecerá el diseño de Tabular Editor. Si el diseño de Tabular Editor no se comporta como esperas, un buen primer paso es guardar una copia de seguridad de este archivo en otro lugar, eliminar el original y reiniciar Tabular Editor 3. +> Si elimina este archivo, se restablecerá el diseño de Tabular Editor. Si el diseño de Tabular Editor no se comporta como se espera, un buen primer paso es hacer una copia de seguridad de este archivo en otro lugar, eliminar el original y reiniciar Tabular Editor 3. diff --git a/localizedContent/es/content/references/system-requirements.md b/localizedContent/es/content/references/system-requirements.md index 1051175f8..40dbdb510 100644 --- a/localizedContent/es/content/references/system-requirements.md +++ b/localizedContent/es/content/references/system-requirements.md @@ -1,8 +1,8 @@ ---- +--- uid: system-requirements title: Requisitos del sistema author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -16,60 +16,59 @@ applies_to: - edition: Enterprise full: true --- - # Requisitos del sistema -Tabular Editor 3 es una aplicación de escritorio para Windows. A partir de la versión 3.27.0, se publica para dos runtimes de .NET, dos arquitecturas de procesador y en tres formatos de paquete. +Tabular Editor 3 es una aplicación de escritorio de Windows. A partir de la versión 3.27.0, se publica en dos tiempos de ejecución de .NET, para dos arquitecturas de procesador, en tres formatos de paquete. ## Sistema operativo -- Windows 10, Windows 11, Windows Server 2016, Windows Server 2019 o versiones posteriores +- Windows 10, Windows 11, Windows Server 2016, Windows Server 2019 o versiones posteriores -Las versiones de Windows compatibles en cada momento se rigen por la política de Microsoft sobre sistemas operativos compatibles con .NET para el runtime que instales; por lo tanto, la lista de sistemas compatibles puede reducirse con el tiempo, independientemente de Tabular Editor. +Las versiones de Windows compatibles en un momento dado se rigen por la política de sistemas operativos compatibles con .NET de Microsoft para el tiempo de ejecución que instales, por lo que puede reducirse con el tiempo independientemente de Tabular Editor. ## Qué se publica -| Runtime | Arquitectura | Formatos | -| ---------------------------------------------------------- | ------------ | ------------------------------------------- | -| .NET 10 _(recomendado)_ | x64, ARM64 | instalador `.exe`, `.msi` y `.zip` portátil | -| .NET 8 | x64, ARM64 | instalador `.exe`, `.msi` y `.zip` portátil | +| Entorno de ejecución | Arquitectura | Formatos | +|---|---|---| +| .NET 10 *(recomendado)* | x64, ARM64 | Instalador `.exe`, `.msi`, `.zip` portátil | +| .NET 8 | x64, ARM64 | Instalador `.exe`, `.msi`, `.zip` portátil | -Las compilaciones de .NET 10 y .NET 8 son _funcionalmente idénticas_. No hay nada disponible en una que falte en la otra, y ambas pueden instalarse una junto a la otra. +Las compilaciones de .NET 10 y .NET 8 son *funcionalmente idénticas*. No hay nada disponible en una que no esté disponible en la otra. Instalar una compilación con el instalador `.exe` o `.msi` reemplaza la otra compilación. Consulte [Cambiar entre los paquetes .NET 8 y .NET 10](xref:installation-activation-basic#switching-between-the-net-8-and-net-10-packages). -Las compilaciones ARM64 son nativas a partir de la versión 3.23.0. +Las compilaciones ARM64 son nativas, a partir de la versión 3.23.0. -## Entorno de ejecución para «.NET» +## Entorno de ejecución de .NET -| Compilación | Necesita | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Instalador `.exe` | El [.NET Desktop Runtime](https://dotnet.microsoft.com/download/dotnet) correspondiente: [10](https://dotnet.microsoft.com/download/dotnet/10.0) o [8](https://dotnet.microsoft.com/download/dotnet/8.0). El instalador se ofrece a descargarlo e instalarlo por ti | -| `.msi` | El .NET Desktop Runtime correspondiente, ya instalado. El MSI _no_ lo incluye, lo que lo hace adecuado para el despliegue sin supervisión | -| `.zip` portátil | Nada. Es autónomo | +| Build | Necesita | +|---|---| +| Instalador `.exe` | El [.NET Desktop Runtime](https://dotnet.microsoft.com/download/dotnet) correspondiente: [10](https://dotnet.microsoft.com/download/dotnet/10.0) u [8](https://dotnet.microsoft.com/download/dotnet/8.0). El instalador te ofrece descargarlo e instalarlo por ti | +| `.msi` | El .NET Desktop Runtime correspondiente, instalado previamente. El MSI *no* lo incluye, lo cual es lo que lo hace adecuado para una implementación desatendida | +| `.zip` portátil | Nada. Es autónomo | -Debe ser el runtime _Desktop_. El runtime de ASP.NET Core y el runtime base de .NET no incluyen las bibliotecas de Windows Forms y WPF que necesita la aplicación. +Debe ser el tiempo de ejecución de *Desktop*. El entorno de ejecución de ASP.NET Core y el entorno de ejecución de .NET normal no incluyen las bibliotecas de Windows Forms y WPF que necesita la aplicación. ## Elegir una compilación -Elige el **instalador `.exe` x64 de .NET 10** salvo que tengas una razón para no hacerlo. Las razones son: +Elige el **instalador `.exe` de .NET 10 x64** a menos que tengas una razón para no hacerlo. Las razones son: -- **ARM64**: usas un PC basado en ARM -- **.NET 8**: tu organización aún no puede instalar el .NET Desktop Runtime de .NET 10 -- **`.msi`**: vas a realizar un despliegue centralizado. Consulta la [instalación silenciosa](xref:installation-activation-basic) -- **`.zip` portátil**: no puedes instalar software en el equipo o quieres varias versiones en paralelo +- **ARM64**: estás en un PC basado en ARM +- **.NET 8**: tu empresa aún no puede instalar el tiempo de ejecución de escritorio de .NET 10. +- **`.msi`**: estás realizando una implementación centralizada. Consulta [Instalación silenciosa](xref:installation-activation-basic) +- **`.zip` portátil**: no puede instalar software en el equipo o desea tener varias versiones instaladas simultáneamente. ## Componentes opcionales -| Componente | Necesario para | Notas | -| ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [runtime de Microsoft Edge WebView2](https://developer.microsoft.com/microsoft-edge/webview2/) | La página **Primeros pasos** de la aplicación y el @ai-assistant | Viene incluido en las instalaciones actuales de Windows. Si no está disponible, Tabular Editor recurre al control de navegador integrado o ofrece un enlace para abrir la página en tu navegador predeterminado | -| Funciones de IA | El @ai-assistant y el servidor MCP | Un componente del instalador, seleccionado de forma predeterminada. Se puede desmarcar durante la instalación, y un administrador puede deshabilitar las funciones de IA de todos modos mediante la directiva `DisableAi` en @policies | +| Componente | Necesario para | Notas | +|---|---|---| +| [Entorno de ejecución de Microsoft Edge WebView2](https://developer.microsoft.com/microsoft-edge/webview2/) | La página **Introducción** de la aplicación y el @ai-assistant | Presente en las instalaciones actuales de Windows. Cuando no está presente, Tabular Editor recurre al control de navegador integrado u ofrece un enlace para abrir la página en su navegador predeterminado | +| Funciones de IA | El @ai-assistant y el servidor MCP | Un componente del instalador, seleccionado de forma predeterminada. Se puede anular su selección durante la instalación, y un administrador puede deshabilitar las funciones de IA independientemente de ello con las @policies `DisableAi` | -## Dónde encontrar las descargas +## Dónde están las descargas -Consulta @downloads para la versión actual y @release-history para las anteriores. +Consulte @downloads para ver la versión actual y @release-history para ver las versiones anteriores. -## Pasos a seguir +## Próximos pasos - @downloads - @getting-started -- @installation-activation-basic +- @instalación-activación-básica diff --git a/localizedContent/es/content/references/toc.md b/localizedContent/es/content/references/toc.md index d822a18b8..9b8b74bb7 100644 --- a/localizedContent/es/content/references/toc.md +++ b/localizedContent/es/content/references/toc.md @@ -1,33 +1,39 @@ -# Descargas y lanzamientos - +# Descargas y versiones ## @downloads - +## @requisitos-del-sistema ## @release-history -## @whats-new # Referencia técnica - ## @faq - ## @preferences - ## @policies - ## @shortcuts3 - ## @shortcuts2 - ## @user-options - ## @supported-files - +## @accessibility ## @user-setting-files-te2 -# Desarrollo y planificación +# Referencia de propiedades de objetos +## @propiedades-de-objeto +## @propiedades-de-objetos-comunes +## @object-properties-model +## @propiedades-de-objeto-tablas +## @propiedades-de-objeto-columnas +## @object-properties-measures +## @object-properties-calculation-groups +## @object-properties-hierarchies +## @object-properties-relationships +## @object-properties-partitions +## @object-properties-data-sources +## @object-properties-security +## @object-properties-perspectives-cultures +## @object-properties-calendars +## @object-properties-functions +# Desarrollo y planificación ## @roadmap # Funciones obsoletas - -## @formatdax \ No newline at end of file +## @formatdax \ No newline at end of file diff --git a/localizedContent/es/content/references/user-options.md b/localizedContent/es/content/references/user-options.md index ff8e2015b..516a3e473 100644 --- a/localizedContent/es/content/references/user-options.md +++ b/localizedContent/es/content/references/user-options.md @@ -1,8 +1,8 @@ ---- +--- uid: user-options title: Archivo de opciones de usuario (.tmuo) author: Daniel Otykier -updated: 2026-09-15 +updated: 2026-10-12 applies_to: products: - product: Tabular Editor 2 @@ -16,34 +16,33 @@ applies_to: - edition: Enterprise full: true --- - # Archivo de opciones de usuario del modelo tabular (.tmuo) -Tabular Editor 3 presenta un nuevo archivo basado en JSON para almacenar preferencias específicas del desarrollador y del modelo. Este archivo se denomina **Tabular Model User Options** y utiliza la extensión **.tmuo**. +Tabular Editor 3 introduce un nuevo archivo basado en JSON para almacenar las preferencias específicas del desarrollador y del modelo. Este archivo se denomina archivo de **Opciones de usuario del modelo tabular** y utiliza la extensión **.tmuo**. -Cuando abres un modelo desde el disco, el archivo se crea junto a él y se nombra según el modelo y tu nombre de usuario de Windows. Tabular Editor busca un archivo con ese nombre cada vez que se carga un modelo desde el disco. +Cuando abre un modelo desde el disco, el archivo se crea junto a él, con el mismo nombre que el modelo y con su nombre de usuario de Windows. Tabular Editor busca un archivo con ese nombre cada vez que se carga un modelo desde el disco. -| Lo que abriste | Archivo de opciones de usuario | -| ---------------------------------------------------------------------------------------------------------- | ------------------------------------------ | -| `SpaceParts.bim`, o cualquier archivo `.bim` / `.pbit` / `Database.json` | `SpaceParts..tmuo`, junto a él | -| Un archivo `model.tmdl` o `database.tmdl` | `model..tmuo`, junto a él | -| Una carpeta que contiene `Database.json` | `database..tmuo`, en esa carpeta | -| Una carpeta que contiene archivos de modelo en Tabular Model Definition Language (TMDL) | `model..tmuo`, en esa carpeta | +| Lo que ha abierto | Archivo de opciones de usuario | +|---|---| +| `SpaceParts.bim`, o cualquier archivo `.bim` / `.pbit` / `database.json` | `SpaceParts..tmuo`, junto a él | +| Un archivo «model.tmdl» o «database.tmdl» | «model..tmuo`, junto a él | +| Una carpeta que contiene `database.json` | `database..tmuo`, en esa carpeta | +| Una carpeta que contiene archivos de modelo del Lenguaje de definición de modelo tabular (TMDL) | `model..tmuo`, en esa carpeta | -TMDL siempre usa el prefijo `model` para mantener la continuidad con las versiones anteriores a `database.tmdl`. +TMDL siempre utiliza el prefijo «model», para mantener la continuidad con las versiones anteriores a «database.tmdl». -Para un modelo abierto a través de una conexión, en lugar de desde el disco, no hay ningún lugar junto al modelo donde colocar el archivo, así que se guarda por servidor y por base de datos en `%LocalAppData%\\TabularEditor3\\UserOptions\\`. +En el caso de un modelo abierto a través de una conexión y no desde el disco, no hay ningún lugar aparte del modelo donde colocar el archivo, por lo que se guarda por servidor y base de datos en `%LocalAppData%\TabularEditor3\UserOptions\`. -La opción _Crear archivo de opciones de usuario (.tmuo)_ en @preferencias determina si se crea o no el archivo para un modelo nuevo. +El hecho de que se cree o no el archivo para un nuevo modelo se rige por *Crear archivo de opciones de usuario (.tmuo)* en @preferencias. > [!IMPORTANT] -> El archivo **.tmuo** contiene preferencias específicas del usuario y, por lo tanto, no debe incluirse en un entorno compartido de control de versiones. Si usas Git para el control de versiones, asegúrate de incluir la extensión `.tmuo` en tu archivo `.gitignore`. +> El archivo **.tmuo** contiene preferencias específicas del usuario y, como tal, no debe incluirse en un entorno de control de versiones compartido. Si utiliza Git para el control de versiones, asegúrese de incluir la extensión `.tmuo` en su archivo `.gitignore`. ## Contenido del archivo -El archivo es JSON y todas las propiedades son opcionales. Tabular Editor solo crea uno cuando hay algo que guardar, así que un archivo real contiene solo algunos de los bloques siguientes, no todos. Si no hay nada que guardar, no se escribe ningún archivo. +El archivo es JSON y todas las propiedades son opcionales. Tabular Editor solo escribe uno cuando hay algo que almacenar, por lo que un archivo real contiene unos pocos de los bloques que se muestran a continuación, en lugar de todos ellos. Si no hay nada que almacenar, no se escribe ningún archivo. -Un archivo mínimo, para un modelo que no hace nada más que conectarse a una base de datos de Workspace: +Un archivo mínimo, para un modelo que no hace nada más que conectarse a una base de datos del área de trabajo: ```json { @@ -58,86 +57,87 @@ Un archivo mínimo, para un modelo que no hace nada más que conectarse a una ba ### Propiedades de nivel superior -| Propiedad | Tipo | Se escribe cuando | -| ----------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UseWorkspace` | Booleano | Ya has respondido a la pregunta sobre Workspace para este modelo. Mientras no esté presente, Tabular Editor te lo pregunta cada vez que se carga el modelo. | -| `WorkspaceConnection` | Cadena u objeto | Se ha configurado una conexión a Workspace. Forma de objeto cuando la cadena de conexión incluye una contraseña. | -| `WorkspaceConnectionAuthMode` | Cadena | Heredado y solo cuando no es `Integrated`. Ahora el modo de autenticación viene implícito en la cadena de conexión. | -| `WorkspaceDatabase` | Cadena | Se ha configurado un nombre de base de datos para Workspace. | -| `Deployment` | Objeto | Se ha ejecutado el Asistente de implementación para este modelo. | -| `DataSourceOverrides` | Objeto | Se ha definido al menos una anulación de Data source. | -| `TableImportSettings` | Objeto | Al menos un Data source tiene configuración de importación. | -| `RefreshOverrides` | Objeto | Se ha definido al menos un perfil de reemplazo de actualización. | -| `AIConsent` | Objeto | Legado. Se lee cuando está presente; nunca se vuelve a escribir. | -| `Permissions` | Objeto | Se ha concedido al menos una concesión de IA por modelo. | +| Propiedad | Tipo | Se escribe cuando | +|---|---|---| +| `UseWorkspace` | Booleano | Ha respondido a la pregunta sobre el espacio de trabajo para este modelo. Mientras no esté presente, Tabular Editor lo preguntará cada vez que se cargue el modelo. | +| `WorkspaceConnection` | Cadena u objeto | Se establece una conexión al espacio de trabajo. Formato de objeto cuando la cadena de conexión contiene una contraseña. | +| `WorkspaceConnectionAuthMode` | Cadena | Heredado, y solo cuando no es `Integrated`. El modo de autenticación ahora está implícito en la cadena de conexión. | +| `WorkspaceDatabase` | Cadena | Se establece un nombre de base de datos del área de trabajo. | +| `Deployment` | Objeto | El asistente de implementación se ha ejecutado con este modelo. | +| `DataSourceOverrides` | Objeto | Se ha definido al menos una anulación de origen de datos. | +| `TableImportSettings` | Objeto | Al menos un origen de datos tiene configuración de importación. | +| `RefreshOverrides` | Objeto | Se ha definido al menos un perfil de anulación de actualización. | +| `AIConsent` | Objeto | Obsoleto. Se lee cuando está presente, nunca se vuelve a escribir. | +| `Permissions` | Objeto | Se ha concedido al menos un permiso de IA por modelo. | Aparecen en ese orden. -### Base de datos del Workspace +### Base de datos del área de trabajo -- `UseWorkspace` decide si Tabular Editor se conecta a una base de datos del Workspace al cargar el modelo. La base de datos del Workspace se sobrescribe con los metadatos del archivo cargado o de la estructura de carpetas. -- `WorkspaceConnection` es la instancia de Analysis Services o el punto de conexión XMLA de Power BI en el que se implementa la base de datos del Workspace. -- `WorkspaceDatabase` es el nombre de esa base de datos del Workspace. Debe ser único para cada desarrollador y cada modelo, ya que la idea es que cada desarrollador tenga el suyo. +- `UseWorkspace` decide si Tabular Editor se conecta a una base de datos de área de trabajo cuando carga el modelo. La base de datos del área de trabajo se sobrescribe con los metadatos del archivo cargado o de la estructura de carpetas. +- `WorkspaceConnection` es la instancia de Analysis Services o el punto de conexión XMLA de Power BI en la que se implementa la base de datos del área de trabajo. +- `WorkspaceDatabase` es el nombre de esa base de datos. Haga que sea único para cada desarrollador y para cada modelo, ya que la idea es que cada desarrollador tenga el suyo propio. -### Sobrescrituras del Data source +### Anulaciones de origen de datos -`DataSourceOverrides` se usa para proporcionar a la base de datos del Workspace detalles de conexión distintos a los del archivo del modelo, de modo que Analysis Services actualice desde un origen diferente al indicado por el modelo. +`DataSourceOverrides` se utiliza para proporcionar a la base de datos del área de trabajo detalles de conexión distintos de los del archivo del modelo, de modo que Analysis Services se actualice desde un lugar distinto del indicado por el modelo. -| Propiedad | Tipo | Se escribe cuando | -| ------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ImpersonationMode` | Cadena | Distinto de `Default`. Uno de `Default`, `ImpersonateAccount`, `ImpersonateAnonymous`, `ImpersonateCurrentUser`, `ImpersonateServiceAccount`, `ImpersonateUnattendedAccount`. | -| `Username` | Cadena | Se establece. | -| `ConnectionString` | Objeto cifrado | Al establecerse. | -| `Password` | Objeto cifrado | Al establecerse. | -| `AccountKey` | Objeto cifrado | Al establecerse. Se usa para orígenes de almacenamiento de blobs. | -| `PrivacySetting` | Cadena | Al establecerse. | +| Propiedad | Tipo | Se escribe cuando | +|---|---|---| +| `ImpersonationMode` | Cadena | No es `Default`. Uno de `Default`, `ImpersonateAccount`, `ImpersonateAnonymous`, `ImpersonateCurrentUser`, `ImpersonateServiceAccount`, `ImpersonateUnattendedAccount`. | +| `Username` | Cadena | Establecido. | +| `ConnectionString` | Objeto cifrado | Establecido. | +| `Password` | Objeto cifrado | Establecido. | +| `AccountKey` | Objeto cifrado | Establecido. Se utiliza para orígenes de almacenamiento de blobs. | +| `PrivacySetting` | Cadena | Establecer. | -Una anulación cuya Data source ya no exista en el modelo se elimina la próxima vez que se escriba el archivo, y otra cuya Data source se haya cambiado de nombre seguirá ese cambio. +Una anulación cuyo origen de datos ya no exista en el modelo se eliminará la próxima vez que se escriba el archivo, y una cuyo origen de datos se haya renombrado seguirá el cambio de nombre. ### Configuración de importación de tablas -`TableImportSettings` se usa al ejecutar [Importar tabla o actualizar esquema](xref:importing-tables) para explorar las tablas y vistas disponibles y detectar los cambios en el esquema de origen. - -| Propiedad | Tipo | Se escribe cuando | -| ------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `ServerType` | Cadena | Siempre. Uno de `Sql`, `Oracle`, `Odbc`, `OleDb`, `Snowflake`, `Dataflow`, `PostgreSql`, `MySql`, `MariaDb`, `Db2`, `Databricks`, `OneLake`. | -| `Options` | Objeto de cadenas | La colección no está vacía. | -| `UserId` | Cadena | Configurado. | -| `Contraseña` | Objeto cifrado | Configurado, _y_ elegiste guardarlo. | -| `Proveedor` | Cadena | `ServerType` es `OleDb`. | -| `PasswordKey`, `UserIdKey` | Cadena | `ServerType` es `OleDb` y el valor correspondiente está configurado. | -| `Servidor` | Cadena | `ServerType` no es `Odbc` y está configurado. | -| `ServerKey`, `DatabaseKey` | Cadena | `ServerType` no es `Sql` y el valor está configurado. | -| `Base de datos` | Cadena | Configurado. | -| `Autenticación` | Cadena | `ServerType` es `Sql`, `OleDb` o `Databricks`. Uno de `Sql`, `WindowsIntegrated`, `AadInteractive`, `AadPassword`, `AadIntegrated`, `AadServicePrincipal`, `AccessToken`, `OAuth`. | -| `Cifrar` | Booleano | Se establece en cualquiera de los dos casos. | -| `Dsn` | Cadena | Se establece. Se usa para ODBC. | -| `RowLimitClause`, `IdentifierQuoting` | Número | No tienen sus valores predeterminados. | -| `Schema` | Cadena | Se establece. | - -`Options` es donde se guarda todo lo específico de un proveedor, como cadenas de texto sin formato: un Warehouse de Snowflake es `Options.warehouse`; un Workspace de OneLake es `Options.workspaceid`. Las propiedades `…Key` son los _nombres_ de las claves de la cadena de conexión, como `PWD`, no valores secretos. - -`Password` es el único valor cifrado aquí. `UserId`, `Server`, `Database`, `Dsn` y todo lo que hay en `Options` se almacena como texto sin formato, así que trata el archivo como confidencial incluso cuando no contenga ninguna contraseña. Un token de acceso de Power BI se almacena como `Password` y está cifrado. +`TableImportSettings` se utiliza cuando ejecuta [Importar tabla o actualización de esquema](xref:importing-tables), para explorar las tablas y vistas disponibles y para recoger los cambios del esquema de origen. + +| Propiedad | Tipo | Se escribe cuando | +|---|---|---| +| `ServerType` | Cadena | Siempre. Uno de los siguientes: `Sql`, `Oracle`, `Odbc`, `OleDb`, `Snowflake`, `Dataflow`, `PostgreSql`, `MySql`, `MariaDb`, `Db2`, `Databricks`, `OneLake`. | +| `Options` | Objeto de cadenas | El conjunto no está vacío. | +| `UserId` | Cadena | Establecido. | +| `Password` | Objeto cifrado | Se ha establecido *y* ha optado por guardarlo. | +| `Provider` | Cadena | `ServerType` es `OleDb`. | +| `PasswordKey`, `UserIdKey` | Cadena | `ServerType` es `OleDb` y el valor correspondiente está establecido. | +| `Server` | Cadena | `ServerType` no es `Odbc` y está establecido. | +| `ServerKey`, `DatabaseKey` | Cadena | `ServerType` no es `Sql` y el valor está establecido. | +| `Database` | Cadena | Establecida. | +| `Authentication` | Cadena | `ServerType` es `Sql`, `OleDb` o `Databricks`. Uno de `Sql`, `WindowsIntegrated`, `AadInteractive`, `AadPassword`, `AadIntegrated`, `AadServicePrincipal`, `AccessToken`, `OAuth`. | +| `Encrypt` | Booleano | Establecido de una forma u otra. | +| `Dsn` | Cadena | Establecido. Se utiliza para ODBC. | +| `RowLimitClause`, `IdentifierQuoting` | Número | No con sus valores predeterminados. | +| `Schema` | Cadena | Establecida. | + +En `Options` es donde acaba todo lo específico de un proveedor, como cadenas simples: un almacén de Snowflake es `Options.warehouse`, un espacio de trabajo de OneLake es `Options.workspaceid`. Las propiedades «…Key» son los *nombres* de las claves de la cadena de conexión, como «PWD», no secretos. + +`Password` es el único valor cifrado aquí. `UserId`, `Server`, `Database`, `Dsn` y todo lo que hay en `Options` se almacenan como texto sin formato, por lo que debe tratar el archivo como confidencial incluso cuando no contenga ninguna contraseña. Un token de acceso de Power BI se almacena como «Password» y está cifrado. ### Implementación -`Deployment` contiene la última configuración que usó el Asistente de implementación para este modelo. Las seis opciones booleanas siempre se escriben una vez que existe el bloque, tanto si son verdaderas como falsas: - -| Propiedad | Tipo | Se escribe cuando | -| ------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| `DeployDataSources` | Booleano | Siempre | -| `Desplegar particiones` | Booleano | Siempre | -| `DeployRefreshPolicyPartitions` | Booleano | Siempre | -| `DeployModelRoles` | Booleano | Siempre | -| `DeployModelRoleMembers` | Booleano | Siempre | -| `DeploySharedExpressions` | Booleano | Siempre | -| `TargetConnectionString` | Cadena u objeto | Siempre; `null` si no está configurado. Forma de objeto cuando la cadena de conexión incluye una contraseña. | -| `TargetDatabase` | Cadena | Siempre; `null` si no está configurado. | -| `TargetCredentials` | Objeto | Se han establecido tanto un nombre de usuario como una contraseña. | +`Deployment` contiene lo que el asistente de implementación utilizó por última vez para este modelo. Las siete opciones booleanas siempre se escriben una vez que existe el bloque, tanto si son true como si son false: + +| Propiedad | Tipo | Se escribe cuando | +|---|---|---| +| `DeployDataSources` | Booleano | Siempre | +| `DeployPartitions` | Booleano | Siempre | +| `DeployRefreshPolicyPartitions` | Booleano | Siempre | +| `DeployModelRoles` | Booleano | Siempre | +| `DeployModelRoleMembers` | Booleano | Siempre | +| `DeploySharedExpressions` | Booleano | Siempre | +| `DeployLinguisticMetadata` | Booleano | Siempre | +| `TargetConnectionString` | Cadena u objeto | Siempre, `null` si no se establece. Formato de objeto cuando la cadena de conexión contiene una contraseña. | +| `TargetDatabase` | Cadena | Siempre, `null` si no se establece. | +| `TargetCredentials` | Objeto | Se establecen tanto un nombre de usuario como una contraseña. | ### Anulaciones de actualización -`RefreshOverrides` se indexa por el nombre del perfil, y esa clave es el único lugar donde se guarda el nombre. Cada perfil contiene una única matriz `Overrides` que describe qué cambia el perfil cuando se ejecuta. Consulta @refresh-overrides para ver qué hacen los perfiles y cómo definirlos. +`RefreshOverrides` se indexa por nombre de perfil, y esa clave es el único lugar donde se almacena el nombre. Cada perfil contiene una única matriz `Overrides` que describe qué cambia el perfil cuando se ejecuta. Consulta @refresh-overrides para saber qué hacen los perfiles y cómo definirlos. ```json "RefreshOverrides": { @@ -159,7 +159,7 @@ Una anulación cuya Data source ya no exista en el modelo se elimina la próxima ### Permisos de IA por modelo -`Permissions` registra las concesiones de permisos de IA que se aplican solo a este modelo, y se escribe cuando respondes **Permitir para este modelo** en una tarjeta de permisos del @ai-assistant. +`Permissions` registra las concesiones de permisos de IA que se aplican únicamente a este modelo, escritas cuando responde **Permitir para este modelo** en una tarjeta de permisos del @ai-assistant. ```json "Permissions": { @@ -168,22 +168,22 @@ Una anulación cuya Data source ya no exista en el modelo se elimina la próxima } ``` -`Grants` contiene una entrada por cada recurso al que has concedido permisos: `ModelMetadata`, `ModelData`, `Bpa`, `Documents` o `Macros`, cada uno establecido en `Deny`, `Read` o `Write`. Esto eleva tu concesión de permisos vigente para el chat mientras este modelo esté abierto. El servidor MCP solo lee los permisos globales, así que nada de esto le llega. +`Grants` contiene una entrada por cada recurso que haya concedido: `ModelMetadata`, `ModelData`, `Bpa`, `Documents` o `Macros`, cada una configurada como `Deny`, `Read` o `Write`. Estos aumentan su concesión permanente para el chat mientras este modelo esté abierto. El servidor MCP solo lee los permisos globales, por lo que nada de lo que aparece aquí llega a él. ### Cómo se cifran las credenciales -Todo lo sensible se cifra con la API de protección de datos de Windows bajo tu propia cuenta de usuario, así que un archivo que contiene datos cifrados no se puede compartir con otro usuario ni mover a otro equipo. Aparecen tres formas, según lo que se esté protegiendo: +Todos los datos confidenciales se cifran con la API de protección de datos de Windows bajo su propia cuenta de usuario, por lo que un archivo que contenga datos cifrados no se puede compartir con otro usuario ni trasladar a otro equipo. Aparecen tres formas, según lo que se esté protegiendo: -Una cadena de conexión sin contraseña no se cifra en absoluto y permanece como una cadena JSON en texto plano, por eso `WorkspaceConnection` aparece de ambas formas en la práctica. +Una cadena de conexión que no contiene ninguna contraseña no está cifrada en absoluto y sigue siendo una cadena JSON sin formato, por lo que `WorkspaceConnection` aparece de ambas formas en la práctica. -Si no se puede descifrar un valor, por ejemplo porque el archivo procede de otro usuario, el valor se lee como vacío en lugar de hacer que falle la carga. +Si un valor no se puede descifrar, por ejemplo, porque el archivo procede de otro usuario, el valor se lee como vacío en lugar de producir un error en la carga. ## Cuando no se puede leer el archivo Un modelo se abre con o sin un archivo `.tmuo`. -Si el archivo no se puede deserializar, por ejemplo porque se editó manualmente y quedó como JSON no válido, Tabular Editor muestra una advertencia titulada _Error al cargar el archivo de opciones de usuario (.tmuo)_, que incluye el error subyacente, y luego abre el modelo con las opciones predeterminadas. No se pierde nada del modelo en sí; pierdes la configuración que contenía el archivo, y en el siguiente guardado se escribirá uno nuevo. +Si el archivo no se puede deserializar, por ejemplo, porque se ha editado manualmente y ha quedado como un JSON no válido, Tabular Editor muestra una advertencia titulada *Error al cargar el archivo de opciones de usuario (.tmuo)* que contiene el error subyacente, y luego abre el modelo con las opciones predeterminadas. No se pierde nada del modelo en sí; se pierden los ajustes que contenía el archivo, y la siguiente vez que se guarde se escribirá uno nuevo. -## Pasos a seguir +## Próximos pasos -- @Workspace-mode \ No newline at end of file +- @workspace-mode \ No newline at end of file diff --git a/localizedContent/es/content/security/ai-compliance.md b/localizedContent/es/content/security/ai-compliance.md index 3a3c43e9a..0ac6505d8 100644 --- a/localizedContent/es/content/security/ai-compliance.md +++ b/localizedContent/es/content/security/ai-compliance.md @@ -1,8 +1,8 @@ --- uid: ai-compliance -title: Guía de cumplimiento de las funciones de IA +title: Guía de cumplimiento normativo de las funciones de IA author: Morten Lønskov -updated: 2026-10-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -12,225 +12,225 @@ applies_to: editions: - edition: Desktop partial: true - note: "Solo políticas generales. Sin límites de permisos, bloqueo de proveedor ni registro de auditoría" + note: "General policies only. No permission limits, provider lock or audit log" - edition: Business partial: true - note: "Solo políticas generales. Sin límites de permisos, bloqueo de proveedor ni registro de auditoría" + note: "General policies only. No permission limits, provider lock or audit log" - edition: Enterprise full: true --- -# Guía de cumplimiento de las funciones de IA +# Guía de cumplimiento normativo de las funciones de IA -El [Asistente de IA](xref:ai-assistant) y el [servidor de Model Context Protocol (MCP)](xref:mcp-server) de Tabular Editor 3 dan a los modelos de IA acceso al modelo semántico abierto, dentro de los permisos que los administradores limitan mediante directiva de grupo y que la Edición Enterprise registra en un registro de auditoría. Esta página está dirigida a los equipos de TI, seguridad y cumplimiento que aprueban estas funciones para una organización. +El [asistente de IA](xref:ai-assistant) y el [servidor del Protocolo de Contexto de Modelo (MCP)](xref:mcp-server) de Tabular Editor 3 permiten a los modelos de IA acceder al modelo semántico abierto, dentro de los límites de los permisos que los administradores establecen mediante políticas de grupo y que la Edición Enterprise registra en un registro de auditoría. Esta página está dirigida a los equipos de TI, seguridad y cumplimiento normativo que aprueban estas funciones para una organización. -## Funciones de IA +## Las funciones de IA -| Funcionalidad | Qué hace | Qué realiza la llamada al proveedor de IA | Tráfico de red | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -| Asistente de IA | Un panel de chat de Tabular Editor 3 que lee, consulta y modifica el modelo semántico abierto | Tabular Editor 3, desde el equipo del usuario, con una clave de API que el usuario introduce | Saliente hacia el punto de conexión del proveedor configurado | -| Servidor MCP | Un servidor local al que se conecta un agente de IA que el usuario ya ejecuta, como Claude Code, GitHub Copilot, Codex o Cursor. Luego, el agente lee, consulta y modifica el modelo semántico abierto | El agente, con su propia configuración y suscripción | Solo tráfico entrante en `127.0.0.1` | +| Función | Qué hace | Qué llama al proveedor de IA | Tráfico de red | +| -- | -- | -- | -- | +| Asistente de IA | Un panel de chat en Tabular Editor 3 que lee, consulta y modifica el modelo semántico abierto | Tabular Editor 3, desde el equipo del usuario, con una clave de API que introduce el usuario | Saliente hacia el punto de conexión del proveedor configurado | +| Servidor MCP | Un servidor local al que se conecta un agente de IA que el usuario ya ejecuta, como Claude Code, GitHub Copilot, Codex o Cursor. A continuación, el agente lee, consulta y modifica el modelo semántico abierto | El agente, con su propia configuración y suscripción | Tráfico entrante solo en «127.0.0.1» | -Ambas funciones se incluyen en el componente de funciones de IA, que forma parte de la instalación predeterminada desde Tabular Editor 3.27.0. Comparten las concesiones de permisos, las políticas de administrador y el registro de auditoría. Las diferencias se describen en [Concesiones de permisos](#permission-grants). +Ambas funciones se incluyen en el componente de funciones de IA, que forma parte de la instalación predeterminada de Tabular Editor 3.27.0. Comparten las concesiones de permisos, las políticas de administrador y el registro de auditoría, con las diferencias descritas en [Concesiones de permisos](#permission-grants). -Tabular Editor ApS no opera ningún servicio de IA ni incluye una clave de API. Los prompts, las respuestas, los metadatos del modelo y los datos del modelo de cualquiera de las funciones nunca pasan por los servidores de Tabular Editor. Con la telemetría activada, Tabular Editor 3 envía a Tabular Editor ApS eventos de uso de la IA con el proveedor, el nombre del modelo, un ID de conversación y los recuentos de tokens. La directiva `DisableTelemetry` los desactiva. +Tabular Editor ApS no gestiona ningún servicio de IA y no incluye ninguna clave de API. Las indicaciones, las respuestas, los metadatos del modelo y los datos del modelo de cualquiera de las dos funciones nunca pasan por los servidores de Tabular Editor. Con la telemetría activada, Tabular Editor 3 envía eventos de uso de la IA a Tabular Editor ApS con el proveedor, el nombre del modelo, un ID de conversación y el número de «tokens». En el caso del servidor MCP, los eventos incluyen el nombre de la herramienta, el resultado y la duración de cada llamada a la herramienta, así como el nombre y la versión del cliente MCP si se trata de un cliente conocido. No se envían los argumentos de las herramientas, los resultados de las herramientas ni los mensajes de error. La directiva «DisableTelemetry» los desactiva. -El [Centro de confianza de Tabular Editor](https://trust.tabulareditor.com/) publica el Report independiente de pruebas de penetración del Asistente de IA, el Report de auditoría SOC 2 y la lista de subencargados del tratamiento. +El [Centro de confianza de Tabular Editor](https://trust.tabulareditor.com/) publica el informe de la prueba de penetración independiente para el Asistente de IA, el informe de auditoría SOC 2 y la lista de subencargados del tratamiento. ## Flujo de datos ### Asistente de IA -El Asistente de IA envía solicitudes directamente desde tu equipo al proveedor configurado en **Herramientas > Preferencias > Funciones de IA > Asistente de IA**: OpenAI, Anthropic, Azure OpenAI o cualquier punto de conexión compatible con OpenAI, incluido un modelo alojado en tu propia red. La autenticación se realiza únicamente mediante clave de API. Consulta [Proveedores compatibles](xref:ai-assistant#supported-providers). +El Asistente de IA envía solicitudes directamente desde el equipo del usuario al proveedor configurado en **Herramientas > Preferencias > Funciones de IA > Asistente de IA**: OpenAI, Anthropic, Azure OpenAI o cualquier punto de conexión compatible con OpenAI, incluido un modelo alojado en su propia red. La autenticación se realiza únicamente mediante clave de API. Consulte [Proveedores compatibles](xref:ai-assistant#supported-providers). Una solicitud al proveedor contiene: -- el prompt del sistema y las Instrucciones personalizadas vigentes, incluidas las que publique tu organización -- tus mensajes y el historial de la conversación -- contexto sobre el modelo abierto añadido a tus mensajes: el nombre de la base de datos, el recuento de objetos, la selección actual, el título del documento activo, los errores del modelo y los cambios recientes. Tu configuración de **Metadatos del modelo** no impide su envío; sí lo hace un límite `MaxModelMetadataAccess` de `Deny` -- los resultados de las herramientas que invocó el asistente, dentro de las [concesiones de permisos](#permission-grants) -- pasajes de la base de conocimiento de Tabular Editor, una base de datos local creada a partir de la documentación, el blog, las incidencias y los debates de GitHub +- la indicación del sistema y las instrucciones personalizadas vigentes, incluidas las que publique tu organización +- los mensajes del usuario y el historial de la conversación +- contexto sobre el modelo abierto añadido a los mensajes del usuario: el nombre de la base de datos, el número de objetos, la selección actual, el título del documento activo, los errores del modelo y los cambios recientes. El ajuste **Metadatos del modelo** de un usuario no los retiene; un límite de «MaxModelMetadataAccess» de «Deny» sí lo hace. +- los resultados de las herramientas que el asistente ha llamado, dentro de los [permisos concedidos](#permission-grants) +- pasajes de la base de conocimientos de Tabular Editor, una base de datos local creada a partir de la documentación de Tabular Editor, el blog, los problemas de GitHub y los debates -Los metadatos del modelo abarcan toda la definición del modelo: nombres de objetos, descripciones y anotaciones, expresiones DAX y M, consultas de origen de las particiones, detalles de conexión del Data source, roles, miembros de los roles y filtros de seguridad a nivel de filas. Los valores escritos en la definición del modelo, como una expresión `DATATABLE` o una tabla de **Introducir datos**, forman parte de los metadatos. +Los metadatos del modelo abarcan toda la definición del modelo: nombres de objetos, descripciones y anotaciones, expresiones DAX y M, consultas de orígenes de particiones, detalles de conexión de orígenes de datos, roles, miembros de roles y filtros de seguridad a nivel de fila. Los valores introducidos en la definición del modelo, como una expresión `DATATABLE` o una tabla **Introducir datos**, forman parte de los metadatos. -El texto de estas fuentes pasa a formar parte de la solicitud e influye en lo que hace el asistente. Restringe el acceso de escritura a la carpeta de Instrucciones personalizadas de tu organización a las personas que aprueban su contenido. +El texto de estas fuentes pasa a formar parte de la solicitud e influye en lo que hace el asistente. Limite el acceso de escritura a una carpeta de instrucciones personalizadas de la organización a las personas que aprueban su contenido. -El acuerdo de tu organización con el proveedor rige la retención, la región en la que se procesan los datos y si el proveedor usa las solicitudes para entrenar modelos. Para mantener el procesamiento dentro de un inquilino de Azure o de una red gobernada por tu organización, usa Azure OpenAI, [Microsoft Foundry](xref:ai-assistant#using-microsoft-foundry) o un [modelo autoalojado](xref:ai-assistant#using-a-local-or-organizational-llm), y bloquea la configuración mediante [directiva](#restrict-the-ai-provider). +El acuerdo de su organización con el proveedor rige la retención, la región en la que se procesan los datos y si el proveedor utiliza las solicitudes para entrenar el modelo. Para seguir procesando en un inquilino de Azure o en una red gestionada por su organización, utilice Azure OpenAI, [Microsoft Foundry](xref:ai-assistant#using-microsoft-foundry) o un [modelo autoalojado](xref:ai-assistant#using-a-local-or-organizational-llm), y bloquee la configuración mediante una [política](#restrict-the-ai-provider). ### Servidor MCP -El servidor MCP es un listener HTTP enlazado a `127.0.0.1`, con el puerto 42100 como valor predeterminado. No tiene clave de API, no realiza solicitudes salientes y rechaza las solicitudes del navegador con un encabezado `Origin` no local. +El servidor MCP es un «listener» HTTP vinculado a `127.0.0.1`, en el puerto 42100 de forma predeterminada. No tiene clave de API, no realiza solicitudes salientes y rechaza las solicitudes del navegador con un encabezado «Origin» no local. -El agente conectado envía lo que lee de Tabular Editor 3 a su propio proveedor, conforme a la configuración del agente y a las condiciones del proveedor. Tabular Editor 3 no tiene ninguna configuración para el proveedor del agente, así que gestiona el agente mediante sus propios controles administrativos. Las propias herramientas del agente, como el acceso a archivos y al shell, también quedan fuera de Tabular Editor 3. Los archivos de modelo en disco, los archivos de conversación y los archivos de auditoría pueden leerse por cualquier agente que se ejecute con la cuenta del usuario. +El agente conectado envía lo que lee de Tabular Editor 3 a su propio proveedor, según la configuración del agente y las condiciones del proveedor. Tabular Editor 3 no tiene ningún ajuste para el proveedor del agente, por lo que debes controlar al agente a través de sus propios controles administrativos. Las propias herramientas del agente, como el acceso a archivos y al shell, también están fuera de Tabular Editor 3. La preferencia **Detalle del origen del modelo** establece qué parte de la ruta del archivo o del servidor del modelo recibe el agente junto con el nombre del modelo, y no cambia los detalles de la conexión en los metadatos del modelo. Consulte [Comprobar que ha funcionado](xref:mcp-server#check-that-it-worked). Los archivos de modelo en el disco, los archivos de conversación y los archivos de auditoría pueden ser leídos por cualquier agente que se ejecute como el usuario. -**Requerir token de acceso** está desactivado de forma predeterminada. Mientras esté desactivado, cualquier proceso del equipo puede conectarse al servidor sin credenciales, incluidos los procesos en las sesiones de otros usuarios en un host de Escritorio remoto o de Citrix. La directiva `RequireMcpAccessToken` exige el token para todos los usuarios. Los archivos de registro del agente almacenan el token en texto sin formato, y la opción **Regenerar token** del cuadro de diálogo **Herramientas > Servidor MCP...** invalida todos los registros existentes. Consulta [Ejecución en un equipo compartido](xref:mcp-server#running-on-a-shared-machine). +La opción **Requerir token de acceso** está desactivada de forma predeterminada. Mientras esté desactivada, cualquier proceso del equipo puede conectarse al servidor sin credenciales, incluidos los procesos de las sesiones de otros usuarios en un Escritorio remoto o en un host Citrix. La política «RequireMcpAccessToken» impone el token para todos los usuarios. Los archivos de registro del agente almacenan el token en texto plano, y la opción **Regenerar token** en el cuadro de diálogo **Herramientas > Servidor MCP...** invalida todos los registros existentes. Consulte [Ejecución en un equipo compartido](xref:mcp-server#running-on-a-shared-machine). ### Puntos de conexión de red -Permite el acceso a estos puntos de conexión a través del firewall o proxy para las funciones de IA: +Permite estos puntos finales a través de tu cortafuegos o proxy para las funciones de IA: -| Tráfico | Punto de conexión | -| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Solicitudes del Asistente de IA | El punto de conexión del proveedor configurado, por ejemplo `https://api.openai.com`, `https://api.anthropic.com`, un recurso de Azure OpenAI o tu propio Gateway | -| Catálogo de modelos de IA | `https://api.tabulareditor.com/AiModels`. Una solicitud anónima para obtener la lista de modelos, que se realiza cuando un usuario abre la lista de modelos de OpenAI o Anthropic. La lista se almacena en caché durante 24 horas. `DisableUpdates` lo desactiva | -| Actualizaciones de la base de conocimientos de IA | `https://cdn.tabulareditor.com`. Una comprobación como máximo una vez al día mientras el Asistente de IA esté configurado, sin datos sobre el usuario ni el modelo. Ninguna directiva lo desactiva salvo `DisableAi`. Los usuarios desmarcan **Comprobar si hay actualizaciones de la base de conocimientos al iniciar** en **Herramientas > Preferencias > Funciones de IA > Asistente de IA** | -| Servidor MCP | Ninguno | +| Tráfico | Punto de conexión | +| -- | -- | +| Solicitudes del Asistente de IA | El punto de conexión del proveedor configurado, por ejemplo, «https://api.openai.com», «https://api.anthropic.com», un recurso de Azure OpenAI o tu propia pasarela | +| Catálogo de modelos de IA | `https://api.tabulareditor.com/AiModels`. Una solicitud anónima de la lista de modelos, realizada cuando un usuario abre la lista de modelos de OpenAI o Anthropic. La lista se almacena en caché durante 24 horas. `DisableUpdates` la desactiva | +| Actualizaciones de la base de conocimientos de IA | `https://cdn.tabulareditor.com`. Una comprobación como máximo una vez al día mientras el asistente de IA esté configurado, sin datos sobre el usuario ni el modelo. Ninguna directiva lo desactiva, excepto «DisableAi». Los usuarios desmarcan **Buscar actualizaciones de la base de conocimientos al iniciar** en **Herramientas > Preferencias > Funciones de IA > Asistente de IA** | +| Servidor MCP | Ninguno | -La validación de la licencia, la comprobación de actualizaciones y la telemetría usan solicitudes independientes. Consulta [Solicitudes web](xref:security-privacy#web-requests). +La validación de licencias, las comprobaciones de actualizaciones y la telemetría utilizan solicitudes separadas. Consulte [Solicitudes web](xref:security-privacy#web-requests). ### Datos almacenados en el equipo del usuario -Todas las rutas están en `%LocalAppData%\TabularEditor3`, salvo que se indique lo contrario. +Todas las rutas se encuentran en `%LocalAppData%\TabularEditor3`, a menos que se indique lo contrario. -| Elemento | Ubicación | Formato | -| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Clave de API del proveedor | `Preferences.json` | Cifrada con la API de protección de datos de Windows para el usuario actual. Se borra cuando el componente de IA no está cargado o se establece `DisableAi` | -| Token de acceso de MCP | `Preferences.json` | Cifrado con la API de protección de datos de Windows para el usuario actual | -| Permisos concedidos de forma permanente | `Preferences.json` | JSON | -| Permisos concedidos por modelo | El archivo de [opciones de usuario](xref:user-options) (`.tmuo`) del modelo: junto a un modelo cargado desde archivos o en `UserOptions` para un modelo abierto desde un servidor | JSON | -| Conversaciones | `AI\Conversations` | JSON sin cifrar. Contiene prompts, respuestas y resultados de herramientas, incluidas las filas de las consultas DAX cuando **Datos del modelo** está configurado en **Lectura**. Se crean copias archivadas antes de cada compactación. Los archivos se conservan hasta que el usuario elimine la conversación | -| Instrucciones personalizadas del usuario | `AI\\CustomInstructions` | Markdown | -| Base de conocimientos | `kb.sqlite` | Base de datos SQLite | -| Catálogo de modelos de IA | `AiModels.json` | JSON | -| Registro de auditoría | `AI\\audit`, o la carpeta configurada por `AiAuditLogPath` | Consulta [Registro de auditoría](#audit-log) | +| Elemento | Ubicación | Formato | +| -- | -- | -- | +| Clave de API del proveedor | `Preferences.json` | Cifrada con la API de protección de datos de Windows para el usuario actual. Se borra cuando el componente de IA no está cargado o se establece `DisableAi` | +| Token de acceso MCP | `Preferences.json` | Cifrado con la API de protección de datos de Windows para el usuario actual | +| Concesiones de permisos permanentes | `Preferences.json` | JSON | +| Concesiones de permisos por modelo | El archivo de [opciones de usuario](xref:user-options) (`.tmuo`) del modelo: junto a un modelo cargado desde archivos o en `UserOptions` para un modelo abierto desde un servidor | JSON | +| Conversaciones | `AI\Conversations` | JSON sin cifrar. Contiene indicaciones, respuestas y resultados de herramientas, incluidas las filas de consultas DAX y el texto de error de Analysis Services cuando **Datos del modelo** está en **Lectura**. Las copias archivadas se escriben antes de cada compactación. Los archivos permanecen hasta que el usuario elimina la conversación | +| Instrucciones personalizadas del usuario | `AI\CustomInstructions` | Markdown | +| Base de conocimientos | `kb.sqlite` | Base de datos SQLite | +| Catálogo de modelos de IA | `AiModels.json` | JSON | +| Registro de auditoría | `AI\audit` o la carpeta establecida por `AiAuditLogPath` | Consulte [Registro de auditoría](#audit-log) | -## Permisos otorgados +## Concesiones de permisos -Los permisos otorgados controlan a qué pueden acceder el Asistente de IA y el servidor MCP, con un nivel de acceso por recurso. El usuario configura cada nivel en **Herramientas > Preferencias > Funciones de IA > Permisos**. En la Edición Enterprise, un administrador puede establecer un límite de permiso para cada recurso mediante una directiva: +Las concesiones de permisos controlan a qué acceden el asistente de IA y el servidor MCP, con un nivel de acceso por recurso. El usuario establece cada nivel en **Herramientas > Preferencias > Funciones de IA > Permisos**. En la Edición Enterprise, un administrador puede establecer un límite de permisos para cada recurso mediante una directiva: -| Recurso | A qué pueden acceder las funciones de IA | Predeterminado | Límite para ambas funciones | Límite solo para el servidor MCP | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | --------------------------- | -------------------------------- | -| Metadatos del modelo | Lectura: la definición del modelo y las estadísticas del Analizador VertiPaq. Escritura: modificar el modelo mediante C# Scripts | Leer | `MaxModelMetadataAccess` | `McpMaxModelMetadataAccess` | -| Datos del modelo | Lectura: resultados de consultas DAX, es decir, valores de datos del modelo | Denegar | `MaxModelDataAccess` | `McpMaxModelDataAccess` | -| Best Practice Analyzer | Lectura: reglas y resultados del análisis. Escritura: agregar y cambiar reglas | Leer | `MaxBpaAccess` | `McpMaxBpaAccess` | -| Documentos | Lectura: el contenido de los documentos abiertos de C# Script, de consultas DAX y de scripts DAX. Escritura: crearlos y sobrescribirlos | Escribir | `MaxDocumentsAccess` | `McpMaxDocumentsAccess` | -| Macros | Lectura: la biblioteca de macros del usuario, incluido el código de las macros | Escribir | `MaxMacrosAccess` | `McpMaxMacrosAccess` | +| Recurso | A qué acceden las funciones de IA | Predeterminado | Límite para ambas funciones | Límite solo para el servidor MCP | +| -- | -- | -- | -- | -- | +| Metadatos del modelo | Lectura: la definición del modelo, las estadísticas del Analizador VertiPaq y los errores y advertencias del modelo. El texto del error del servidor también necesita **Datos del modelo > Lectura**. Escritura: modificación del modelo mediante scripts de C# | Lectura | `MaxModelMetadataAccess` | `McpMaxModelMetadataAccess` | +| Datos del modelo | Lectura: resultados de consultas DAX y texto de los errores devueltos por Analysis Services, que pueden contener valores de datos del modelo | Denegar | `MaxModelDataAccess` | `McpMaxModelDataAccess` | +| Best Practice Analyzer | Lectura: reglas y resultados del análisis. Escritura: añadir y cambiar reglas | Lectura | `MaxBpaAccess` | `McpMaxBpaAccess` | +| Documentos | Lectura: el contenido de los documentos abiertos de scripts de C#, consultas DAX y scripts DAX, así como los errores y las advertencias de los documentos abiertos, incluidas las tablas dinámicas. Escritura: crearlos y sobrescribirlos | Escritura | `MaxDocumentsAccess` | `McpMaxDocumentsAccess` | +| Macros | Lectura: la biblioteca de macros del usuario, incluido el código de las macros | Escritura | `MaxMacrosAccess` | `McpMaxMacrosAccess` | -En los niveles predeterminados, las funcionalidades de IA leen la definición del modelo, ejecutan el Best Practice Analyzer, leen la biblioteca de macros y leen y sobrescriben los documentos de scripts y consultas abiertos. No leen valores de datos ni cambian el modelo. El código de macros y los documentos abiertos pueden contener cadenas de conexión y otras credenciales. Configura `MaxMacrosAccess` y `MaxDocumentsAccess` si eso ocurre en tu organización. +En los niveles predeterminados, las funciones de IA leen la definición del modelo, ejecutan Best Practice Analyzer, leen la biblioteca de macros y leen y sobrescriben los documentos de script y de consultas abiertos. No leen los valores de los datos ni cambian el modelo. El código de las macros y los documentos abiertos pueden contener cadenas de conexión y otras credenciales. Establece «MaxMacrosAccess» y «MaxDocumentsAccess» si es el caso en tu organización. -El Asistente de IA y el servidor MCP aplican los permisos de la siguiente manera: +El asistente de IA y el servidor MCP aplican los permisos de la siguiente manera: -- **Asistente de IA.** Cuando una solicitud necesita un acceso que el permiso permanente no cubre, aparece una tarjeta de permisos en el chat. El usuario puede permitirlo para este turno, para la sesión o siempre; y, en **Metadatos del modelo** y **Datos del modelo**, también para el modelo actual. No aparece ninguna tarjeta para un acceso que supere un límite de permisos. -- **Servidor MCP.** No aparece ningún aviso. El servidor lee los permisos permanentes al iniciarse, y las herramientas que esos permisos no cubren no se ofrecen al agente. Los permisos que concedas para un modelo o una sesión se aplican solo al chat. +- **Asistente de IA.** Cuando una solicitud necesita un acceso que no cubre el permiso permanente, aparece una tarjeta de permiso en el chat. El usuario lo permite para el turno, para la sesión o siempre, y para **Metadatos del modelo** y **Datos del modelo** también para el modelo actual. No aparece ninguna tarjeta para el acceso por encima de un límite de permisos. +- **Servidor MCP.** No aparece ningún mensaje. El servidor lee los permisos permanentes cuando se inicia, y las herramientas que un permiso no cubre no se ofrecen al agente. Los permisos concedidos para un modelo o una sesión se aplican únicamente al chat. -Un límite de permisos tiene prioridad sobre cualquier permiso que concedas, incluidos los que concedas para un modelo y los que hayas concedido antes de establecer la directiva; además, la configuración correspondiente solo ofrece los niveles hasta ese límite. Un límite `McpMax...` solo reduce el límite compartido para el servidor MCP. Consulta [Permisos y consentimiento](xref:ai-assistant#permissions-and-consent). +Un límite de permisos prevalece sobre todas las concesiones de los usuarios, incluidas las concesiones otorgadas para un modelo y las concesiones otorgadas antes de establecer la política, y el ajuste correspondiente ofrece solo los niveles hasta el límite. Un límite «McpMax...» solo reduce el límite compartido para el servidor MCP. Consulta [Permisos y consentimiento](xref:ai-assistant#permissions-and-consent). -## Protecciones para los cambios del modelo +## Medidas de protección ante cambios en el modelo -Las funciones de IA ejecutan scripts que cambian un modelo solo cuando **Metadatos del modelo** están en **Escritura**. Todos los cambios pasan por el [motor de C# Script](xref:csharp-scripts) sobre el modelo cargado en Tabular Editor 3: +Las funciones de IA ejecutan scripts que modifican un modelo solo cuando los **Metadatos del modelo** están en **Escritura**. Cada cambio se ejecuta a través del [motor de scripting de C#](xref:csharp-scripts) en el modelo cargado en Tabular Editor 3: -- Los cambios de un script forman una sola entrada de deshacer, llamada **C# Script (AI Assistant)** o **C# Script (MCP)**. -- Un script que falla a mitad de ejecución se revierte por completo. -- El Asistente de IA ejecuta scripts solo cuando el usuario activa **Permitir que el asistente de IA ejecute C# Scripts directamente**, que está desactivada de forma predeterminada. Con **Vista previa de los cambios** activada, que es la opción predeterminada, un cuadro de diálogo de vista previa muestra los cambios de cada ejecución del script, y el usuario los acepta o los cancela. Ambas opciones son preferencias del usuario y no hay ninguna directiva para bloquearlas. -- Al seleccionar **Ejecutar** en un script que el Asistente de IA escribe en el chat, este se ejecuta como si fuera un script tuyo, con cualquier nivel de **Metadatos del modelo**. Se aplica la comprobación de seguridad; no se aplican las restricciones sobre `ReadFile` ni sobre los métodos auxiliares de DAX que se indican a continuación. -- Los scripts de un agente MCP se ejecutan sin cuadro de diálogo de vista previa. Después, el usuario revisa los cambios en el **Explorador TOM** y en la vista **Propiedades**, que marcan todos los cambios no guardados. -- Los cambios permanecen sin guardar en el modelo cargado hasta que el usuario los guarde. Ninguna herramienta de IA guarda ni implementa un modelo. Los enlaces en las respuestas del asistente pueden iniciar comandos de Tabular Editor, incluidos **Save** y **Deploy**, cuando el usuario los selecciona. Si el usuario abrió el modelo mediante una conexión en vivo a Analysis Services o a un Workspace de Power BI, al guardar se escriben los cambios en ese servidor. -- No se ejecuta ningún script que use el sistema de archivos, la red o un ensamblado externo. El Asistente de IA lo muestra con una insignia **Unsafe** y el comando **Execute** deshabilitado. Para un agente MCP, se abre como un documento de revisión o se rechaza cuando **Documents** está por debajo de **Write**. +- Los cambios de un script forman una entrada de deshacer, denominada **Script de C# (Asistente de IA)** o **Script de C# (MCP)**. +- Un script que falla a mitad de camino se revierte por completo. +- El asistente de IA ejecuta scripts solo cuando el usuario activa **Permitir que el asistente de IA ejecute C# Scripts directamente**, que está desactivado de forma predeterminada. Con la opción **Vista previa de los cambios** activada, que es la configuración predeterminada, un cuadro de diálogo de vista previa muestra los cambios de cada ejecución de script y el usuario los acepta o los cancela. Ambos ajustes son preferencias del usuario, sin ninguna directiva que los bloquee. +- **Ejecutar** en un script que el Asistente de IA escribe en el chat lo ejecuta como el propio script del usuario, en cualquier nivel de **Metadatos del modelo**. Se aplica la comprobación de seguridad; las restricciones de `ReadFile` y los métodos auxiliares de DAX que se indican a continuación no se aplican. +- Los scripts de un agente MCP se ejecutan sin un cuadro de diálogo de vista previa. El usuario revisa los cambios posteriormente en el **Explorador TOM** y en la vista **Propiedades**, que marcan todos los cambios no guardados. +- Los cambios permanecen sin guardar en el modelo cargado hasta que el usuario los guarda. Ninguna herramienta de IA guarda ni implementa un modelo. Los enlaces de las respuestas del asistente pueden iniciar comandos de Tabular Editor, incluidos **Guardar** e **Implementar**, cuando el usuario los selecciona. Si el usuario ha abierto el modelo a través de una conexión en tiempo real a Analysis Services o a un área de trabajo de Power BI, al guardar, los cambios se escriben en ese servidor. +- No se ejecuta un script que utilice el sistema de archivos, la red o un ensamblado externo. El asistente de IA lo muestra con una insignia de **No seguro** y con **Ejecutar** desactivado. En el caso de un agente MCP, se abre como documento de revisión o se rechaza cuando **Documentos** está por debajo de **Escritura**. - La comprobación de seguridad analiza el script compilado. La reflexión, los árboles de expresiones, `Activator`, `AppDomain`, los lectores XML y la deserialización se consideran inseguros. -- En un script que ejecute el Asistente de IA o un agente MCP, `ReadFile`, `SaveFile`, `Bpa.ExportCsv`, `ExecuteCommand`, las llamadas que ejecutan una macro y las llamadas a Semantic Bridge siempre fallan. `ExecuteCommand` envía comandos de Tabular Model Scripting Language (TMSL) y XML for Analysis (XMLA) al servidor. -- En esos mismos scripts, los métodos auxiliares de DAX requieren **Model data** en **Read**, igual que la herramienta de consultas DAX. +- En un script que ejecuta el Asistente de IA o un agente MCP, `ReadFile`, `SaveFile`, `Bpa.ExportCsv`, `ExecuteCommand`, las llamadas que ejecutan una macro y las llamadas de Semantic Bridge siempre fallan. `ExecuteCommand` envía al servidor comandos del lenguaje de scripting de modelo tabular (TMSL) y de XML for Analysis (XMLA). +- En los mismos scripts, los métodos auxiliares de DAX requieren **Datos del modelo** en **Lectura**, al igual que la herramienta de consultas DAX. -La directiva `BlockUnsafeScripts` aplica la misma comprobación de seguridad a todos los scripts y macros: del usuario, del Best Practice Analyzer, del Asistente de IA, del servidor MCP o de la CLI de Tabular Editor. `DisableCSharpScripts` desactiva los documentos de C# Script y elimina del Asistente de IA la herramienta que ejecuta scripts, y del servidor MCP ambas herramientas de scripts. Las macros siguen ejecutándose a menos que también se establezca `DisableMacros`. Consulta [Cómo un agente cambia tu modelo](xref:mcp-server#how-an-agent-changes-your-model). +La política «BlockUnsafeScripts» aplica la misma comprobación de seguridad a todos los scripts y macros: del usuario, de Best Practice Analyzer, del asistente de IA, del servidor MCP o de Tabular Editor CLI. `DisableCSharpScripts` desactiva los documentos de script de C# y elimina la herramienta que ejecuta los scripts del Asistente de IA y ambas herramientas de script del servidor MCP. Las macros siguen ejecutándose, a menos que también se establezca `DisableMacros`. Consulta [Cómo cambia un agente tu modelo](xref:mcp-server#how-an-agent-changes-your-model). ## Controles del administrador -Los administradores aplican estos controles mediante la directiva de grupo de Windows, con las plantillas administrativas incluidas en Tabular Editor 3 o escribiendo directamente valores del Registro. Consulta @policies para conocer las claves del Registro, los tipos de valor y la configuración de las plantillas. +Los administradores aplican los controles a través de la política de grupo de Windows, con las plantillas administrativas que se incluyen con Tabular Editor 3 o escribiendo directamente los valores del registro. Consulta @policies para conocer las claves del registro, los tipos de valores y la configuración de las plantillas. -Una directiva en `HKEY_LOCAL_MACHINE` tiene prioridad sobre el mismo valor en `HKEY_CURRENT_USER`. Los usuarios estándar no pueden cambiar ninguna de las dos claves `Software\\Policies`. Tabular Editor 3 lee las directivas al iniciarse, y el servidor MCP lee las concesiones de permisos al iniciarse, por lo que un cambio de directiva surte efecto en una sesión en ejecución después de que el usuario reinicie Tabular Editor 3. +Una política bajo `HKEY_LOCAL_MACHINE` tiene prioridad sobre el mismo valor bajo `HKEY_CURRENT_USER`. Los usuarios estándar no pueden cambiar ninguna de las claves `Software\Policies`. Tabular Editor 3 lee las políticas cuando se inicia, y el servidor MCP lee las concesiones de permisos cuando se inicia, por lo que un cambio de política llega a una sesión en ejecución después de que el usuario reinicie Tabular Editor 3. -Las directivas de la Edición Enterprise se aplican a las licencias Enterprise, Consultancy y Trial. En Desktop y en la Edición Business, los administradores pueden desactivar las funciones de IA, exigir el token de acceso de MCP, desactivar los scripts de C# Script y las macros, y desactivar la telemetría. En las tablas siguientes, **All** significa todas las ediciones de Tabular Editor 3. +Las políticas de la Edición Enterprise se aplican a las licencias Enterprise, Consultancy y Trial. En las ediciones Desktop y Business, los administradores pueden desactivar las funciones de IA, aplicar el token de acceso MCP, desactivar los scripts y las macros de C# y desactivar la telemetría. En las siguientes tablas, **Todas** significa todas las ediciones de Tabular Editor 3. ### Desactivar las funciones de IA -| Requisito | Directiva | Edición | -| -------------------------------------------------------------------------------------------------------- | ------------------ | ------- | -| Sin funciones de IA; el componente de IA se omite en las nuevas instalaciones y se elimina al actualizar | `DisableAi` | Todas | -| Sin asistente de IA; se permite el servidor MCP | `DisableAiChat` | Todas | -| Sin servidor MCP; se permite el asistente de IA | `DisableMcpServer` | Todas | +| Requisito | Política | Edición | +| -- | -- | -- | +| Sin funciones de IA, y el componente de IA excluido de las nuevas instalaciones y eliminado en la actualización | `DisableAi` | Todas | +| Sin asistente de IA, servidor MCP permitido | `DisableAiChat` | Todas | +| Sin servidor MCP, asistente de IA permitido | `DisableMcpServer` | Todas | -`DisableAi` también borra cualquier configuración del proveedor almacenada, incluida la clave de la API. Una instalación en la que el instalador no se ha ejecutado desde que se estableció la directiva conserva los archivos de IA en el disco, y Tabular Editor 3 no los carga. Consulta [Forzar la decisión con la directiva DisableAi](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy). +`DisableAi` también borra cualquier configuración de proveedor almacenada, incluida la clave de API. Una instalación en la que el instalador no se ha ejecutado desde que se estableció la política mantiene los archivos de IA en el disco, y Tabular Editor 3 no los carga. Consulta [Aplicar la decisión con la directiva DisableAi](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy). -La versión portátil de Tabular Editor 3 no tiene ningún paso de instalación. Respeta `DisableAi` en tiempo de ejecución. Use el control de aplicaciones, como AppLocker o Windows Defender Application Control, si los usuarios no deben ejecutar versiones anteriores. +La compilación portátil de Tabular Editor 3 no tiene ningún paso de instalación. Respeta `DisableAi` en tiempo de ejecución. Utilice el control de aplicaciones, como AppLocker o el Control de aplicaciones de Windows Defender, si los usuarios no deben ejecutar versiones anteriores. ### Limitar el alcance de las funciones de IA -| Requisito | Directiva | Edición | -| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------- | -| Un límite por recurso para ambas funciones | `MaxModelMetadataAccess`, `MaxModelDataAccess`, `MaxBpaAccess`, `MaxDocumentsAccess`, `MaxMacrosAccess` | Enterprise | -| Un límite mínimo por recurso para los agentes MCP | `McpMaxModelMetadataAccess`, `McpMaxModelDataAccess`, `McpMaxBpaAccess`, `McpMaxDocumentsAccess`, `McpMaxMacrosAccess` | Enterprise | -| Impedir que los agentes MCP usen herramientas concretas | `McpDisabledTools` | Enterprise | -| Sin documentos de C# Script, herramientas de scripts de IA ni macros | `DisableCSharpScripts` y `DisableMacros` | Todas | -| Solo C# Scripts que superen la comprobación de seguridad | `BlockUnsafeScripts` | Enterprise | +| Requisito | Política | Edición | +| -- | -- | -- | +| Un límite por recurso para ambas funciones | `MaxModelMetadataAccess`, `MaxModelDataAccess`, `MaxBpaAccess`, `MaxDocumentsAccess`, `MaxMacrosAccess` | Enterprise | +| Un límite inferior por recurso para los agentes MCP | `McpMaxModelMetadataAccess`, `McpMaxModelDataAccess`, `McpMaxBpaAccess`, `McpMaxDocumentsAccess`, `McpMaxMacrosAccess` | Enterprise | +| Retirar herramientas individuales a los agentes MCP | `McpDisabledTools` | Enterprise | +| Sin documentos de script de C#, herramientas de script de IA ni macros | `DisableCSharpScripts` y `DisableMacros` | Todos | +| Solo scripts de C# que superen la comprobación de seguridad | `BlockUnsafeScripts` | Enterprise | -Extrae los nombres de las herramientas para `McpDisabledTools` de los registros `tool_call` del registro de auditoría. +Obtenga los nombres de las herramientas para `McpDisabledTools` de los registros `tool_call` del registro de auditoría. ### Restringir el proveedor de IA -| Requisito | Directiva | Edición | -| ---------------------------------------------------------------- | --------------------------------- | ---------- | -| Un proveedor aprobado | `AiProvider` | Enterprise | -| Un punto de conexión o un Gateway aprobados | `AiEndpoint` | Enterprise | -| Un modelo aprobado o una implementación de Azure OpenAI aprobada | `AiModel` | Enterprise | -| Facturación a una organización o proyecto de OpenAI aprobados | `AiOrganizationId`, `AiProjectId` | Enterprise | -| Una lista de proveedores aprobados | `AiAllowedProviders` | Enterprise | -| Una lista de hosts de endpoints aprobados | `AiAllowedEndpointHosts` | Enterprise | +| Requisito | Política | Edición | +| -- | -- | -- | +| Un proveedor aprobado | `AiProvider` | Enterprise | +| Un punto de conexión o una pasarela aprobados | `AiEndpoint` | Enterprise | +| Un modelo aprobado o una implementación de Azure OpenAI | `AiModel` | Enterprise | +| Facturación a una organización o proyecto de OpenAI aprobado | `AiOrganizationId`, `AiProjectId` | Enterprise | +| Una lista de proveedores aprobados | `AiAllowedProviders` | Enterprise | +| Una lista de hosts de puntos de conexión aprobados | `AiAllowedEndpointHosts` | Enterprise | -`AiProvider`, `AiEndpoint`, `AiModel`, `AiOrganizationId` y `AiProjectId` sustituyen la configuración del usuario, y `AiProvider` establecido en `None` desactiva el Asistente de IA. Si la configuración infringe `AiAllowedProviders` o `AiAllowedEndpointHosts`, el Asistente de IA no envía la solicitud y se muestra un error que indica el proveedor o el host del endpoint. `AiAllowedEndpointHosts` solo valida el endpoint que introduce el usuario, por lo que OpenAI y Anthropic, sin un endpoint personalizado, acceden a su API pública independientemente de lo que contenga la lista. Combínalo con `AiProvider` o `AiAllowedProviders`. Ninguna directiva exige HTTPS; restringe `AiEndpoint` a una dirección `https://`. Las directivas no distribuyen claves de API. Con el endpoint restringido a un recurso propiedad de su organización, como un recurso de Azure OpenAI o un Gateway interno, solo funcionan las claves emitidas por su organización. Con un endpoint público como `api.openai.com`, los usuarios pueden introducir una clave personal. Estas directivas se aplican solo al Asistente de IA. +`AiProvider`, `AiEndpoint`, `AiModel`, `AiOrganizationId` y `AiProjectId` sustituyen la configuración del usuario, y si `AiProvider` se establece en `None`, el Asistente de IA se desactiva. Si la configuración interrumpe `AiAllowedProviders` o `AiAllowedEndpointHosts`, el asistente de IA no envía la solicitud y un error indica el nombre del proveedor o del host del punto de conexión. `AiAllowedEndpointHosts` solo comprueba un punto de conexión que introduce el usuario, por lo que OpenAI y Anthropic, sin un punto de conexión personalizado, acceden a su API pública independientemente de lo que contenga la lista. Combínelo con «AiProvider» o «AiAllowedProviders». Ninguna política requiere HTTPS; bloquee `AiEndpoint` a una dirección `https://`. Las directivas no distribuyen claves de API. Si el punto de conexión está bloqueado para un recurso que pertenece a su organización, como un recurso de Azure OpenAI o una pasarela interna, solo funcionarán las claves que emita su organización. Con un punto de conexión público como «api.openai.com», los usuarios pueden introducir una clave personal. Estas políticas se aplican únicamente al asistente de IA. ### Instrucciones personalizadas y el puerto MCP -| Requisito | Directiva | Edición | -| ---------------------------------------------------------------------------------- | ------------------------------- | ---------- | -| Instrucciones personalizadas aprobadas por la organización para todos los usuarios | `AiCustomInstructionsPath` | Enterprise | -| Ignorar las instrucciones personalizadas escritas por los propios usuarios | `DisableUserCustomInstructions` | Enterprise | -| Los agentes MCP se autentican con un token de acceso | `RequireMcpAccessToken` | Todas | -| Un puerto fijo para el servidor MCP | `McpPort` | Enterprise | +| Requisito | Política | Edición | +| -- | -- | -- | +| Instrucciones personalizadas aprobadas por la organización para todos los usuarios | `AiCustomInstructionsPath` | Enterprise | +| Ignorar las instrucciones personalizadas que escriben los propios usuarios | `DisableUserCustomInstructions` | Enterprise | +| Los agentes MCP se autentican con un token de acceso | `RequireMcpAccessToken` | Todas | +| Un puerto fijo del servidor MCP | `McpPort` | Enterprise | -### Directivas de la edición Enterprise en otras ediciones +### Políticas de la Edición Enterprise en otras ediciones -Si hay algún valor de directiva de Enterprise presente en un equipo cuya licencia no sea Enterprise, el Asistente de IA y el servidor MCP no se inician, y un valor de `BlockUnsafeScripts` impide que se ejecute cualquier script o macro. Un valor que Tabular Editor 3 no pueda interpretar deniega el recurso cuando existe un límite de permisos, hace que el Asistente de IA no esté disponible para `AiProvider` y aplica `BlockUnsafeScripts`. Cualquier otro valor no válido se ignora y la configuración que controla permanece sin restricciones. Implementa las directivas Enterprise solo en equipos que tengan la licencia correspondiente. Consulta [Qué ocurre sin la Edición Enterprise](xref:policies#what-happens-without-enterprise-edition). +Si hay algún valor de política Enterprise en un equipo cuya licencia no sea Enterprise, el asistente de IA y el servidor MCP no se inician, y un valor `BlockUnsafeScripts` impide que se ejecuten todos los scripts y macros. Un valor que Tabular Editor 3 no pueda interpretar deniega el recurso por un límite de permisos, hace que el Asistente de IA no esté disponible para «AiProvider» y aplica «BlockUnsafeScripts». Cualquier otro valor no válido se ignora y el ajuste que controla permanece sin restricciones. Implemente las políticas Enterprise solo en los equipos con una licencia coincidente. Consulte [Qué sucede sin la Edición Enterprise](xref:policies#what-happens-without-enterprise-edition). -Para comprobar qué directivas se aplican en un equipo, abre **Herramientas > Preferencias > Tabular Editor > Actualizaciones y comentarios**. La sección **Administrado por tu organización** enumera todos los valores de directiva encontrados, su clave de origen y cualquier valor marcado como **(no válido)**. +Para comprobar qué políticas se aplican en un equipo, abra **Herramientas > Preferencias > Tabular Editor > Actualizaciones y comentarios**. La sección **Gestionado por su organización** enumera todos los valores de políticas encontrados, su clave de origen y cualquier valor marcado como **(no válido)**. ## Registro de auditoría -En la Edición Enterprise, Tabular Editor 3 escribe un registro local de la actividad del Asistente de IA y del servidor MCP en un archivo JSON Lines distinto cada día. Cada registro incluye una marca de tiempo UTC, la característica (`chat` o `mcp`), la sesión y, cuando corresponda, el nombre del modelo abierto, así como el nombre de usuario de Windows. No se registra nada antes de que se active una licencia. +En la Edición Enterprise, Tabular Editor 3 escribe un registro local de la actividad del Asistente de IA y del servidor MCP en un archivo JSON Lines al día. Cada registro incluye una marca de tiempo UTC, la función («chat» o «mcp»), la sesión y el nombre del modelo abierto al que se aplican, así como el nombre de usuario de Windows. No se registra nada antes de activar una licencia. -El registro incluye: +El registro recoge: -- las solicitudes de permisos y la respuesta del usuario -- cada llamada a una herramienta, con el nombre de la herramienta, los permisos que necesitó, su resultado (`ok`, `error`, `denied` o `cancelled`), su duración y los nombres y el tamaño total de sus argumentos -- cada C# Script enviado para ejecutarse —incluidos los C# Scripts que fallaron en tiempo de ejecución, los que se rechazaron o los que se devolvieron para revisión— se guarda como un archivo `.csx` con su hash SHA-256 -- el proveedor, el modelo, el host del punto de conexión y el recuento de tokens de cada turno del chat +- solicitudes de permiso y respuesta del usuario +- cada llamada a una herramienta, con el nombre de la herramienta, los permisos que necesitaba, su resultado («ok», «error», «denied» o «cancelled»), su duración y los nombres y el tamaño total de sus argumentos +- Todos los scripts de C# enviados para su ejecución, incluidos los scripts que fallaron en tiempo de ejecución, fueron rechazados o devueltos para su revisión, guardados como archivo «.csx» con su hash SHA-256. +- el proveedor, el modelo, el host del punto de conexión y el número de tokens para cada turno del chat - Cambios en la configuración de la IA -- Inicio y detención del servidor MCP, con el nivel de permisos de cada recurso -- Conexiones del agente MCP, con el nombre y la versión que informa el cliente +- Inicio y parada del servidor MCP, con el nivel de permiso de cada recurso +- Conexiones de agentes MCP, con el nombre y la versión que informa el cliente -No se registran el texto del prompt, el texto de la respuesta, los valores de los argumentos, los valores de datos del modelo, las claves de API ni los tokens de acceso. No se guardan los scripts que no se pueden compilar ni los scripts que las funciones de IA escriben en un documento para que los ejecutes. +No se registran el texto de la indicación, el texto de la respuesta, los valores de los argumentos, los valores de los datos del modelo, las claves de API ni los tokens de acceso. No se guardan los scripts que no se compilan ni los scripts que las funciones de IA escriben en un documento para que el usuario los ejecute. -Los archivos con más de 30 días se eliminan, a menos que `AiAuditLogRetentionDays` establezca otro período; `0` conserva todos los archivos. Cada copia de Tabular Editor 3 elimina los archivos caducados de la carpeta en la que escribe antes de escribir su primer registro en una sesión. +Los archivos con más de 30 días de antigüedad se eliminan, a menos que «AiAuditLogRetentionDays» establezca otro período; si se establece «0», se conservan todos los archivos. Cada copia de Tabular Editor 3 elimina los archivos caducados de la carpeta en la que escribe antes de escribir su primer registro en una sesión. -El registro lo escribe tu propio proceso de Tabular Editor 3, por lo que tienes permisos de escritura y eliminación, incluso en un recurso compartido redirigido. Si no se puede escribir el registro, por ejemplo, porque no se puede acceder al recurso compartido, el AI Assistant y el servidor MCP siguen funcionando, y el error se registra una sola vez en el registro de la aplicación de Tabular Editor. +El registro lo escribe el propio proceso de Tabular Editor 3 del usuario, por lo que este tiene acceso de escritura y eliminación al mismo, incluso en un recurso compartido redirigido. Si no se puede escribir el registro, por ejemplo, porque no se puede acceder al recurso compartido, el asistente de IA y el servidor MCP siguen funcionando y el fallo se escribe una vez en el registro de la aplicación de Tabular Editor. -`AiAuditLogPath` redirige el registro. Se omite una ruta relativa. Los nombres de archivo diarios y los nombres de archivo de scripts no incluyen el nombre del usuario ni el del equipo, así que asigna una carpeta independiente a cada usuario. Las variables de entorno, como `%USERNAME%`, se expanden solo en un valor `REG_EXPAND_SZ`; la plantilla administrativa escribe `REG_SZ`, que se usa tal cual. +`AiAuditLogPath` redirige el registro. Se omite una ruta relativa. Los nombres de los archivos diarios y los nombres de los archivos de script no incluyen el nombre del usuario ni el de la máquina, así que asigne a cada usuario una carpeta independiente. Las variables de entorno como `%USERNAME%` solo se expanden en un valor `REG_EXPAND_SZ`; la plantilla administrativa escribe `REG_SZ`, que se usa tal como está escrito. -Consulta @ai-audit-log para ver el formato del registro. +Consulte @ai-audit-log para conocer el formato del registro. -## Línea de base recomendada +## Configuración básica recomendada -La siguiente línea de base sirve de orientación para una organización que permite el desarrollo de modelos asistido por IA y mantiene los datos del modelo fuera del alcance de los proveedores de IA. Ajústala a tu propia evaluación de riesgos. +La siguiente línea de base es una orientación para una organización que permite el desarrollo de modelos asistidos por IA y mantiene los datos de los modelos alejados de los proveedores de IA. Ajústela a su propia evaluación de riesgos. -| Control | Configuración | Efecto | -| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| Proveedor | `AiProvider`, `AiEndpoint`, `AiModel` y `AiAllowedEndpointHosts` configurados para apuntar a un recurso propiedad de tu organización y para el que tu organización tenga un acuerdo de tratamiento de datos | El AI Assistant envía solicitudes solo a ese punto de conexión, con claves emitidas por tu organización | -| Datos del modelo | `MaxModelDataAccess` establecido en `Deny` | Ningún resultado de consulta DAX llega al Asistente de IA ni a un agente MCP | -| Macros | `MaxMacrosAccess` establecido en `Deny` | El código de la macro no se envía a un proveedor de IA | -| Secuencias de comandos | `BlockUnsafeScripts` establecido en `1` | Ninguna secuencia de comandos ni macro escribe archivos, accede a la red, inicia otros programas o carga código externo | -| Autenticación de MCP | `RequireMcpAccessToken` establecido en `1` | Solo los clientes con el token de acceso del usuario se conectan al servidor MCP | -| Retención de auditoría | `AiAuditLogRetentionDays` establecido según tus requisitos de retención | Los archivos de auditoría se conservan durante ese período | -| Ubicación de la auditoría | `AiAuditLogPath` establecido por usuario en una carpeta de un recurso compartido | Los archivos de auditoría se recopilan de forma centralizada | +| Control | Configuración | Efecto | +| -- | -- | -- | +| Proveedor | `AiProvider`, `AiEndpoint`, `AiModel` y `AiAllowedEndpointHosts` establecidos en un recurso que su organización posee y para el que tiene un acuerdo de tratamiento de datos | El Asistente de IA envía solicitudes solo a ese punto de conexión, con claves emitidas por su organización | +| Datos del modelo | `MaxModelDataAccess` establecido en `Deny` | Ningún resultado de consulta DAX ni ningún texto de error de Analysis Services llega al Asistente de IA ni a un agente MCP | +| Macros | `MaxMacrosAccess` establecido en `Deny` | El código de la macro no se envía a un proveedor de IA | +| Scripts | `BlockUnsafeScripts` establecido en `1` | Ningún script ni macro escribe archivos, accede a la red, inicia otros programas ni carga código externo | +| Autenticación MCP | `RequireMcpAccessToken` establecido en `1` | Solo los clientes con el token de acceso del usuario se conectan al servidor MCP | +| Conservación de auditorías | `AiAuditLogRetentionDays` establecido según tu requisito de conservación | Los archivos de auditoría se conservan durante ese periodo | +| Ubicación de la auditoría | `AiAuditLogPath` establecido por usuario en una carpeta de un recurso compartido | Los archivos de auditoría se recopilan de forma centralizada | -El siguiente archivo del Registro aplica la parte de la línea base para toda la máquina. Restringe el Asistente de IA a un recurso de Azure OpenAI y conserva los archivos de auditoría durante 365 días. Sustituye el punto de conexión y el nombre de la implementación por los tuyos, y aplica el archivo solo a equipos con licencia para la Edición Enterprise: +El siguiente archivo de registro aplica la parte de la línea base que afecta a todo el equipo. Vincula el Asistente de IA a un recurso de Azure OpenAI y conserva los archivos de auditoría durante 365 días. Sustituya el punto de conexión y el nombre de la implementación por los suyos y aplique el archivo solo a los equipos con licencia para la Edición Enterprise: ```ini Windows Registry Editor Version 5.00 @@ -249,47 +249,47 @@ Windows Registry Editor Version 5.00 "AiAuditLogRetentionDays"=dword:0000016d ``` -`BlockUnsafeScripts` está en la clave compartida, por lo que la CLI de Tabular Editor también lo aplica. Configura `AiAuditLogPath` en una carpeta para cada usuario: ya sea un valor `REG_EXPAND_SZ`, como `\\fileserver\te-audit$\%USERNAME%`, en la clave `HKEY_LOCAL_MACHINE`, o un valor `REG_SZ` por usuario en `HKEY_CURRENT_USER\SOFTWARE\Policies\Tabular Editor ApS\TE3`. +`BlockUnsafeScripts` se encuentra en la clave compartida, por lo que Tabular Editor CLI también lo aplica. Establezca `AiAuditLogPath` en una carpeta para cada usuario: ya sea un valor `REG_EXPAND_SZ` como `\\fileserver\te-audit$\%USERNAME%` bajo la clave `HKEY_LOCAL_MACHINE`, o un valor `REG_SZ` por usuario bajo `HKEY_CURRENT_USER\SOFTWARE\Policies\Tabular Editor ApS\TE3`. ## Preguntas frecuentes -### ¿Recibe Tabular Editor ApS nuestros prompts, metadatos o datos? +### ¿Tabular Editor ApS recibe nuestras indicaciones, metadatos o datos? -No. Consulta [Flujo de datos](#data-flow). +No. Consulte [Flujo de datos](#data-flow). ### ¿Se utilizan nuestros datos para entrenar modelos de IA? -Tabular Editor ApS no recibe solicitudes, respuestas ni contenido del modelo. El acuerdo con el proveedor de IA determina si el proveedor entrena con las solicitudes. +Tabular Editor ApS no recibe ninguna solicitud, respuesta ni contenido del modelo. Tu acuerdo con el proveedor de IA determina si el proveedor entrena con las solicitudes. ### ¿Dónde se procesan nuestros datos? -En el punto de conexión configurado del Asistente de IA y allí donde se ejecute el proveedor de un agente MCP. Consulta [Restringir el proveedor de IA](#restrict-the-ai-provider). +En el punto de conexión configurado del asistente de IA y en cualquier lugar donde opere el proveedor de un agente MCP. Consulta [Restringir el proveedor de IA](#restrict-the-ai-provider). ### ¿Pueden los usuarios eludir una directiva? -Un usuario no puede cambiar una directiva sin derechos de administrador local. Las versiones anteriores a 3.27.0, incluidas las compilaciones portátiles antiguas, solo leen `HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor` e ignoran todas las directivas de esta página. Consulta [Desactivar las funciones de IA](#turn-the-ai-features-off). +Un usuario no puede cambiar una política sin derechos de administrador local. Las versiones anteriores a la 3.27.0, incluidas las compilaciones portátiles más antiguas, solo leen `HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor` e ignoran todas las políticas de esta página. Consulte [Desactivar las funciones de IA](#turn-the-ai-features-off). -### ¿Pueden las funciones de IA modificar o desplegar un modelo en producción? +### ¿Pueden las funciones de IA cambiar o implementar un modelo de producción? -Solo ejecutan scripts en el modelo cargado si **Model metadata** está en **Write**, y solo el usuario puede guardar o desplegar. Consulta [Medidas de protección para los cambios del modelo](#safeguards-on-model-changes). +Ejecutan scripts en el modelo cargado solo con **Metadatos del modelo** en **Escritura**, y solo el usuario guarda o implementa. Consulte [Medidas de seguridad para los cambios en el modelo](#safeguards-on-model-changes). ### ¿Pueden las funciones de IA leer datos de nuestros modelos? -Los resultados de las consultas DAX requieren que **Model data** esté en **Read**, y el valor predeterminado es **Deny**. Los valores escritos en la definición del modelo forman parte de los metadatos. Consulta [Flujo de datos](#data-flow). +Los resultados de las consultas DAX y el texto de los errores de Analysis Services requieren **Datos del modelo** en **Lectura**, y el valor predeterminado es **Denegar**. Por debajo de **Lectura**, el texto de error del servidor se reemplaza por una frase fija. Los valores introducidos en la definición del modelo forman parte de los metadatos. Consulta [Flujo de datos](#data-flow). ### ¿Puede un agente MCP usar un proveedor que no hayamos aprobado? -Sí. Administra el agente mediante sus propios controles administrativos o establece `DisableMcpServer`. Consulta [Servidor MCP](#mcp-server). +Sí. Controle el agente a través de sus propios controles administrativos o establezca `DisableMcpServer`. Consulta [Servidor MCP](#mcp-server). -### ¿Cómo podemos detener las funciones de IA durante un incidente? +### ¿Cómo detenemos las funciones de IA en un incidente? -Establece `DisableAi` y pide a los usuarios que reinicien Tabular Editor 3. Revoca las claves de API afectadas en el proveedor. Consulta [Desactivar las funciones de IA](#turn-the-ai-features-off). +Establezca `DisableAi` y haga que los usuarios reinicien Tabular Editor 3. Revoque las claves de API afectadas en el proveedor. Consulte [Desactivar las funciones de IA](#turn-the-ai-features-off). -### ¿El registro de auditoría permite detectar si se ha manipulado? +### ¿El registro de auditoría es a prueba de manipulaciones? -No. El usuario puede modificar y eliminar sus propios archivos de auditoría. Consulta el [registro de auditoría](#audit-log). +No. El usuario puede cambiar y eliminar sus propios archivos de auditoría. Consulta [Registro de auditoría](#audit-log). -## Ver también +## Véase también - @ai-assistant - @mcp-server diff --git a/localizedContent/es/content/security/security-privacy.md b/localizedContent/es/content/security/security-privacy.md index 4365c2bdf..ccfab8e76 100644 --- a/localizedContent/es/content/security/security-privacy.md +++ b/localizedContent/es/content/security/security-privacy.md @@ -1,8 +1,8 @@ --- uid: security-privacy -title: Resumen de seguridad +title: Descripción general de la seguridad author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -16,140 +16,137 @@ applies_to: - edition: Enterprise full: true --- +# Seguridad y privacidad de Tabular Editor 3 -# Seguridad y privacidad de Tabular Editor 3 - -Este documento describe las consideraciones de seguridad y privacidad de Tabular Editor 3 y su uso. A continuación, la expresión "Tabular Editor" puede referirse tanto a la herramienta comercial Tabular Editor 3 como a la herramienta de código abierto Tabular Editor 2.X. Cuando algo se refiera solo a una de las herramientas, utilizaremos sus nombres explícitos: "Tabular Editor 3" o "Tabular Editor 2.X". +Este documento describe las consideraciones de seguridad y privacidad de Tabular Editor 3 y su uso. En lo sucesivo, la expresión «Tabular Editor» puede referirse tanto a la herramienta comercial Tabular Editor 3 como a la herramienta de código abierto Tabular Editor 2.X. Siempre que se haga referencia a una sola de las herramientas, utilizaremos sus nombres explícitos «Tabular Editor 3» o «Tabular Editor 2.X». ## Recomendaciones de Microsoft sobre herramientas de terceros como Tabular Editor -Microsoft respalda el uso de herramientas de terceros de la comunidad, tal y como se indica aquí: [Herramientas comunitarias y de terceros para desarrollar modelos empresariales de Power BI y Analysis Services](https://powerbi.microsoft.com/en-us/blog/community-tools-for-enterprise-powerbi-and-analysisservices) - -La documentación de planificación de la implementación de Power BI de Microsoft menciona específicamente Tabular Editor en escenarios avanzados de modelado de datos y desarrollo en entornos empresariales: [Escenarios de uso de Power BI: Administración avanzada del Data model](https://learn.microsoft.com/power-bi/guidance/powerbi-implementation-planning-usage-scenario-advanced-data-model-management#tabular-editor) +Microsoft respalda el uso de herramientas de terceros de la comunidad, tal y como se indica aquí: [Herramientas de la comunidad y de terceros para desarrollar modelos de Power BI y Analysis Services a nivel empresarial]( https://powerbi.microsoft.com/en-us/blog/community-tools-for-enterprise-powerbi-and-analysisservices) -## Trust Center +La documentación de planificación de la implementación de Power BI de Microsoft incluye específicamente a Tabular Editor en escenarios avanzados de modelado de datos y desarrollo empresarial: [Escenarios de uso de Power BI: Gestión avanzada de modelos de datos](https://learn.microsoft.com/power-bi/guidance/powerbi-implementation-planning-usage-scenario-advanced-data-model-management#tabular-editor) -En Tabular Editor, estamos comprometidos con la transparencia y con prácticas de seguridad sólidas. Visita nuestro [Trust Center](https://trust.tabulareditor.com/) para ver detalles de nuestro Report de auditoría SOC 2, documentos clave de políticas, términos de licencia y nuestro enfoque sobre la seguridad de la infraestructura y la organización. También encontrarás información sobre nuestros subprocesadores y sobre cómo trabajamos para mantener tus datos seguros. +## Centro de cumplimiento +En Tabular Editor, estamos comprometidos con la transparencia y con unas prácticas de seguridad sólidas. Visite nuestro [Centro de confianza](https://trust.tabulareditor.com/) para obtener información detallada sobre nuestro informe de auditoría SOC 2, los documentos clave de nuestras políticas, los términos de las licencias y nuestro enfoque en materia de seguridad de la infraestructura y de la organización. También encontrará información sobre nuestros subencargados del tratamiento y sobre cómo trabajamos para mantener sus datos seguros. ## Metadatos y privacidad de los datos -Tabular Editor es principalmente una herramienta sin conexión, lo que significa que todos los datos y metadatos se almacenan localmente en el equipo cliente donde está instalado Tabular Editor, y que todas las interacciones del usuario también se realizan de forma local. No se requiere una conexión a Internet para ejecutar y usar Tabular Editor. +Tabular Editor es principalmente una herramienta sin conexión, lo que significa que todos los datos y metadatos residen localmente en el equipo cliente en el que está instalado Tabular Editor, y todas las interacciones de los usuarios también se realizan localmente. No se requiere una conexión a Internet para ejecutar y usar Tabular Editor. -Dicho esto, hay escenarios en los que Tabular Editor se conecta a servicios remotos con distintos fines. Se describen a continuación: +Dicho esto, hay situaciones en las que Tabular Editor se conecta a servicios remotos para diversos fines. A continuación se describen dichos escenarios: ### Protocolo XMLA de Analysis Services -Toda la comunicación con instancias de Analysis Services o con los Workspaces de Power BI Premium se realiza mediante las bibliotecas cliente de [Microsoft Analysis Management Objects (AMO)](https://docs.microsoft.com/analysis-services/amo/developing-with-analysis-management-objects-amo?view=asallproducts-allversions) o, más concretamente, mediante la [extensión Tabular Object Model (TOM) para AMO](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions). Estas bibliotecas cliente las proporciona Microsoft para su redistribución en aplicaciones de terceros, como Tabular Editor. Para conocer los detalles de la licencia, consulta el [EULA de AMO](https://go.microsoft.com/fwlink/?linkid=852989). +Toda la comunicación con las instancias de Analysis Services o los espacios de trabajo de Power BI Premium se realiza mediante el uso de las bibliotecas cliente de [Microsoft Analysis Management Objects (AMO)](https://docs.microsoft.com/analysis-services/amo/developing-with-analysis-management-objects-amo?view=asallproducts-allversions), o más concretamente, de la [extensión Tabular Object Model (TOM) para AMO](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions). Microsoft proporciona estas bibliotecas cliente para su redistribución en aplicaciones de terceros, como Tabular Editor. Para obtener información sobre las licencias, consulta el [CLUF de AMO](https://go.microsoft.com/fwlink/?linkid=852989). -Cuando Tabular Editor se conecta a una instancia de Analysis Services (en la red local o en la nube) o a un Workspace de Power BI Premium (en la nube), esta conexión se realiza a través de las bibliotecas cliente mencionadas anteriormente. Por diseño, la biblioteca AMO se encarga de la autenticación y la autorización del usuario. Solo los usuarios con privilegios administrativos en la instancia de Analysis Services o en el Workspace de Power BI Premium pueden conectarse. Esto no difiere de lo que ocurre al usar herramientas de Microsoft como SQL Server Management Studio o SQL Server Data Tools (que usan las mismas bibliotecas cliente para conectarse). +Cuando Tabular Editor se conecta a una instancia de Analysis Services (red local o nube) o a un área de trabajo de Power BI Premium (nube), esta conexión se realiza a través de las bibliotecas cliente mencionadas anteriormente. Por diseño, la biblioteca AMO se encarga de la autenticación y la autorización del usuario. Solo los usuarios con privilegios administrativos en la instancia de Analysis Services o en el área de trabajo de Power BI Premium pueden conectarse. Esto no es diferente de cuando se utilizan herramientas de Microsoft como SQL Server Management Studio o SQL Server Data Tools (que utilizan las mismas bibliotecas cliente para la conectividad). ### Metadatos del Tabular Object Model -Una vez que la biblioteca cliente AMO/TOM establece la conexión, Tabular Editor solicitará todos los metadatos del Tabular Object Model (TOM) correspondientes a la base de datos de Analysis Services o al Dataset de Power BI específico al que el usuario quiera conectarse. A continuación, la biblioteca cliente AMO/TOM proporciona estos metadatos a la aplicación cliente (Tabular Editor) de forma programática, lo que permite a la aplicación aplicar cambios de metadatos, como cambiar el nombre de un objeto, agregar una descripción, modificar una expresión DAX, etc. Además, la biblioteca cliente AMO/TOM ofrece métodos para serializar los metadatos de TOM en un formato basado en JSON. Tabular Editor utiliza esta técnica para permitir a los usuarios guardar los metadatos del modelo como un archivo JSON local, con fines de control de versiones de la estructura del Data model. **Nota: El archivo JSON generado de este modo no contiene ningún registro de datos real. El archivo contiene únicamente metadatos del modelo; es decir, información sobre la estructura del modelo en cuanto a tablas, columnas, medidas, expresiones DAX, etc.** Aunque, por lo general, los metadatos del modelo no se consideran información confidencial, es responsabilidad del usuario de Tabular Editor tratar cualquier archivo generado de este modo con la confidencialidad requerida (por ejemplo, no compartir el archivo con terceros, etc.). +Una vez que la biblioteca cliente AMO/TOM establece la conexión, Tabular Editor solicitará todos los metadatos del Tabular Object Model (TOM) de la base de datos de Analysis Services o del conjunto de datos de Power BI concretos a los que el usuario desee conectarse. A continuación, la biblioteca cliente AMO/TOM proporciona estos metadatos a la aplicación cliente (Tabular Editor) mediante un enfoque programático, lo que permite a la aplicación aplicar cambios en los metadatos, como cambiar el nombre de un objeto, añadir una descripción, modificar una expresión DAX, etc. Además, la biblioteca cliente AMO/TOM proporciona métodos para serializar los metadatos TOM en un formato basado en JSON. Tabular Editor utiliza esta técnica para permitir a los usuarios guardar los metadatos del modelo como un archivo JSON local, con el fin de controlar las versiones de la estructura del modelo de datos. **Nota: El archivo JSON generado de esta manera no contiene registros de datos reales. El archivo contiene únicamente metadatos del modelo, es decir, información sobre la estructura del modelo en términos de tablas, columnas, medidas, expresiones DAX, etc.** Aunque los metadatos del modelo no suelen considerarse información confidencial, es responsabilidad del usuario de Tabular Editor tratar cualquier archivo generado de esta manera con la confidencialidad necesaria (es decir, no compartir el archivo con terceros, etc.). -**Tabular Editor no recopila, publica, comparte, transfiere ni hace públicos de ningún otro modo los metadatos del modelo obtenidos a través de la biblioteca cliente AMO/TOM, a menos que el usuario inicie explícitamente una acción para hacerlo** (por ejemplo, guardando el archivo JSON de metadatos del modelo en una ubicación de red compartida o implementando los metadatos del modelo en otra instancia de Analysis Services o en un Workspace de Power BI). +**Tabular Editor no recopila, publica, comparte, transfiere ni hace públicos de ninguna otra forma los metadatos del modelo obtenidos a través de la biblioteca cliente AMO/TOM, a menos que el usuario inicie específicamente una acción para hacerlo** (por ejemplo, guardando el archivo JSON de los metadatos del modelo en una ubicación de red compartida o implementando los metadatos del modelo en otra instancia de Analysis Services o en otro área de trabajo de Power BI). -### Contenido de datos del modelo +### Contenido de los datos del modelo -En lo que sigue, "datos del modelo" se refiere a los registros de datos reales almacenados en la base de datos de Analysis Services o en el Dataset de Power BI. Según la base de datos de origen o el Dataset, es muy probable que los datos del modelo sean confidenciales. +A continuación, «datos del modelo» se refiere a los registros de datos reales almacenados en la base de datos de Analysis Services o en el conjunto de datos de Power BI. Dependiendo de la base de datos o del conjunto de datos de origen, es muy probable que los datos del modelo sean confidenciales. -Dado que se requiere que el usuario tenga privilegios administrativos en la instancia de Analysis Services o en el Workspace de Power BI al que se está conectando, el usuario, por definición, también tendrá acceso a todo el contenido de datos de la base de datos de Analysis Services o del Dataset de Power BI. Tabular Editor solo permite recuperar datos a través de la biblioteca cliente AMO mencionada anteriormente. Tabular Editor 3 ofrece funcionalidades para explorar y consultar los datos del modelo. Independientemente de la técnica que se utilice para acceder a los datos, **Tabular Editor solo almacena los datos recuperados en la memoria local. Tabular Editor no recopila, publica, comparte, transfiere ni hace públicos de ningún otro modo los datos del modelo obtenidos a través de la herramienta**. Si un usuario decide copiar o exportar los resultados de consultas obtenidos a través de Tabular Editor, es su responsabilidad tratar los datos copiados o exportados de acuerdo con el nivel de confidencialidad de esos datos. Esto no difiere de cuando un usuario se conecta a la base de datos de Analysis Services o al Dataset de Power BI mediante herramientas cliente como Excel o Power BI; en ese caso, también tendrá la opción de copiar los resultados de la consulta. +Debido al requisito de que un usuario tenga privilegios administrativos en la instancia de Analysis Services o en el área de trabajo de Power BI a la que se está conectando, el usuario, por definición, también tendrá acceso a todo el contenido de datos de la base de datos de Analysis Services o del conjunto de datos de Power BI. Tabular Editor solo permite la recuperación de datos a través de la biblioteca cliente AMO mencionada anteriormente. Tabular Editor 3 ofrece funciones para explorar y consultar los datos del modelo. Independientemente de la técnica utilizada para acceder a los datos, **Tabular Editor solo almacena los datos recuperados en la memoria local. Tabular Editor no recopila, publica, comparte, transfiere ni hace públicos de ninguna otra forma los datos de los modelos obtenidos a través de la herramienta**. Si un usuario decide copiar o exportar los resultados de las consultas obtenidos a través de Tabular Editor, es su responsabilidad tratar los datos copiados o exportados de acuerdo con su nivel de confidencialidad. Esto no es diferente de que un usuario se conecte a la base de datos de Analysis Services o al conjunto de datos de Power BI utilizando herramientas cliente como Excel o Power BI, en cuyo caso también tendrá la opción de copiar los resultados de las consultas. ### Asistente de IA -Tabular Editor 3 incluye un asistente de IA para el desarrollo de modelos semánticos mediante chat. A partir de la versión 3.27.0 forma parte de la instalación predeterminada; antes había que seleccionarlo expresamente. Si el componente no está instalado, no hay ningún código relacionado con la IA en el equipo y no se aplica nada de lo descrito en esta sección. +Tabular Editor 3 incluye un Asistente de IA para el desarrollo de modelos semánticos basado en chat. A partir de la versión 3.27.0, forma parte de la instalación predeterminada; antes de esa versión, había que seleccionarlo deliberadamente. Si el componente no está instalado, no hay ningún código relacionado con la IA en el equipo y no se aplica ninguno de los comportamientos descritos en esta sección. -El Asistente de IA usa un modelo **bring-your-own-key**. Proporcionas una clave de API de un proveedor de IA compatible (OpenAI, Anthropic, Azure OpenAI o cualquier punto de conexión compatible con OpenAI). No se incluye ninguna clave de API integrada y Tabular Editor no proporciona ni intermedia ningún servicio de IA. +El asistente de IA utiliza un modelo de **trae tu propia clave**. Tú proporcionas una clave de API de un proveedor de IA compatible (OpenAI, Anthropic, Azure OpenAI o cualquier punto de conexión compatible con OpenAI). No se incluye ninguna clave API integrada y Tabular Editor no proporciona ni intermedia ningún servicio de IA. -**Flujo de datos.** Toda la comunicación entre el Asistente de IA y el proveedor de IA se realiza directamente desde el equipo cliente hasta la API del proveedor. Ningún dato pasa por los servidores de Tabular Editor. Lo que se envía depende de lo que solicites y está limitado por cinco recursos de permisos, cada uno con un nivel de acceso: +**Flujo de datos.** Toda la comunicación entre el asistente de IA y el proveedor de IA se produce directamente desde el equipo cliente hasta la API del proveedor. No pasan datos por los servidores de Tabular Editor. Lo que se envía depende de lo que solicites y está limitado por cinco recursos de permisos, cada uno de los cuales tiene un nivel de acceso: -| Recurso | Qué abarca | Niveles | Predeterminado | -| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | -------------- | -| Metadatos del modelo | Nombres de tablas, columnas y medidas, expresiones, descripciones y similares. La lectura también abarca las estadísticas del Analizador VertiPaq | Denegar / Leer / Escribir | Leer | -| Datos del modelo | Valores de datos de tu modelo, como los resultados de consultas DAX. Requiere una conexión en directo | Denegar / Leer | Denegar | -| Best Practice Analyzer | Leer enumera las reglas y ejecuta el análisis; Escribir añade o modifica reglas | Denegar / Leer / Escribir | Leer | -| Documentos | Tus editores abiertos de C# Script y de consultas DAX. Leer permite acceder a su contenido; Escribir es necesario para crearlos o modificarlos | Denegar / Leer / Escribir | Escribir | -| Macros | Tu biblioteca de macros | Denegar / Lectura / Escritura | Escritura | +| Recurso | Qué abarca | Niveles | Predeterminado | +| -- | -- | -- | -- | +| Metadatos del modelo | Nombres de tablas, columnas y medidas, expresiones, descripciones y elementos similares. La lectura también abarca las estadísticas del Analizador VertiPaq y los mensajes de error y advertencia del modelo | Denegar / Lectura / Escritura | Lectura | +| Datos del modelo | Valores de datos de su modelo, como los resultados de las consultas DAX, y el texto de los errores devueltos por Analysis Services, que pueden contener valores de datos. Las consultas DAX requieren una conexión en vivo | Denegar / Leer | Denegar | +| Best Practice Analyzer | Lectura: lee las reglas de las listas y ejecuta el análisis; Escritura: añade o modifica reglas | Denegar / Lectura / Escritura | Lectura | +| Documentos | Sus documentos abiertos: consultas DAX, scripts de C#, scripts DAX y cuadrículas dinámicas. Lectura se refiere a su contenido y a sus errores y advertencias; Escritura es necesaria para crearlos o modificarlos. Los diseños de Pivot Grid no se pueden leer ni modificar | Denegar / Lectura / Escritura | Escritura | +| Macros | Su biblioteca de macros | Denegar / Lectura / Escritura | Escritura | -Escritura incluye Lectura. El acceso a los datos del modelo se deniega de forma predeterminada porque los metadatos describen un modelo en el que los valores de datos son el contenido del modelo. +El permiso de Escritura incluye el de Lectura. Los datos del modelo se deniegan de forma predeterminada, ya que los metadatos describen un modelo en el que los valores de los datos son el contenido del modelo. -**Gestión de permisos.** Las autorizaciones son configuraciones permanentes, no avisos por solicitud. Revísalas y cámbialas en **Herramientas > Preferencias > Funciones de IA > Permisos** o en el cuadro de diálogo **Herramientas > Servidor MCP...**, que edita el mismo registro. Si el chat necesita algo que una autorización no cubra, muestra una tarjeta de permiso en ese momento y puedes responder para el turno, la sesión, el modelo actual o siempre. **Permitir siempre** aumenta la autorización permanente y nunca la reduce. Las autorizaciones globales se almacenan en el archivo local Preferences.json; las autorizaciones concedidas para un único modelo se almacenan en el archivo de opciones de usuario (.tmuo) de ese modelo y se aplican solo al chat. Restablecer un recurso a **Denegar** hace que el chat vuelva a preguntar. +**Gestión de permisos.** Los permisos son ajustes permanentes, no indicaciones que se muestran para cada solicitud. Revíselos y cámbielos en **Herramientas > Preferencias > Funciones de IA > Permisos**, o en el cuadro de diálogo **Herramientas > Servidor MCP...**, que edita el mismo registro. Cuando el chat necesita algo que un permiso no cubre, muestra una tarjeta de permiso en ese momento, y usted responde para el turno, la sesión, el modelo actual o siempre. **Permitir siempre** aumenta el permiso permanente y nunca lo reduce. Los permisos globales se almacenan en el archivo local Preferences.json; los permisos concedidos para un solo modelo se almacenan en el archivo de opciones de usuario (.tmuo) de ese modelo y se aplican únicamente al chat. Si se vuelve a establecer un recurso en **Denegar**, el chat volverá a preguntar. -**Límites del administrador.** En las ediciones Enterprise, Consultancy y Trial, un administrador puede fijar un límite para cada recurso mediante una [política](xref:policies), por separado para el chat y para el servidor MCP, y el límite del MCP solo puede ser inferior. Un límite prevalece sobre cualquier autorización, incluida una que el usuario ya haya dado, y la opción correspondiente se muestra como de solo lectura. Estas políticas fallan en modo seguro: si en un equipo no licenciado aparece cualquier valor de política de nivel Enterprise, el Asistente de IA y el servidor MCP se niegan a iniciarse en lugar de ignorar la política. +**Límites del administrador.** En las ediciones Enterprise, Consultancy y Trial, un administrador puede limitar cada recurso mediante [políticas](xref:policies), por separado para el chat y para el servidor MCP, y el límite del MCP solo puede ser inferior. Un límite tiene prioridad sobre cualquier concesión, incluida una que un usuario ya haya otorgado, y la opción correspondiente se muestra como de solo lectura. Estas políticas fallan en modo cerrado: si algún valor de política de nivel Enterprise está presente en un equipo que no tiene licencia para ello, el Asistente de IA y el servidor MCP se niegan a iniciarse en lugar de ignorar la política. -**Registro de auditoría.** Tabular Editor 3 escribe un registro local de lo que hicieron el Asistente de IA y el servidor MCP: qué permisos se solicitaron y cómo se respondieron, qué herramientas se ejecutaron y si cada una se completó correctamente, falló o fue rechazada, y el texto completo de cualquier C# Script que el Asistente de IA o un agente ejecutó o envió a ejecutar, incluidos los scripts que fallaron durante la ejecución o fueron rechazados. Las indicaciones, las respuestas y los valores de datos no se registran; tampoco se registra un script que no se pueda compilar ni el texto de un script incluido en un documento para que el usuario lo ejecute. Los archivos diarios se conservan durante 30 días, y la opción **Abrir carpeta de auditoría** en **Herramientas > Preferencias > Funciones de IA** los abre. Los administradores pueden cambiar la ubicación y el período de retención. +**Registro de auditoría.** Tabular Editor 3 escribe un registro local de lo que hicieron el Asistente de IA y el servidor MCP: qué permisos se solicitaron y cómo se respondió a ellos, qué herramientas se ejecutaron y si cada una tuvo éxito, falló o fue rechazada, y el texto completo de cualquier script de C# que el Asistente de IA o un agente ejecutara o enviara para su ejecución, incluidos los scripts que fallaron en tiempo de ejecución o fueron rechazados. No se registran las indicaciones, las respuestas ni los valores de los datos, ni tampoco los scripts que no se compilan o el texto de un script escrito en un documento para que lo ejecute el usuario. Los archivos diarios se conservan durante 30 días y se pueden abrir con **Abrir carpeta de auditoría** en **Herramientas > Preferencias > Funciones de IA**. Los administradores pueden redirigir la ubicación y cambiar el período de conservación. -**Almacenamiento de claves de API.** Las claves de API se almacenan cifradas en el equipo local, en el archivo de preferencias Preferences.json. Si el módulo de IA no se carga (por ejemplo, porque se excluyó durante la instalación o se deshabilitó mediante una directiva), cualquier configuración de claves de API almacenada anteriormente se borra automáticamente. +**Almacenamiento de claves API.** Las claves API se almacenan cifradas en el equipo local, en el archivo Preferences.json. Si el módulo de IA no se carga (por ejemplo, porque se excluyó durante la instalación o se desactivó por una política), cualquier configuración de clave de API almacenada previamente se borra automáticamente. -**Almacenamiento de conversaciones.** Las conversaciones se almacenan localmente en el equipo cliente en `%LocalAppData%\TabularEditor3\AI\Conversations\`. No se envían datos de conversaciones a los servidores de Tabular Editor. +**Almacenamiento de conversaciones.** Las conversaciones se almacenan localmente en el equipo cliente en `%LocalAppData%\TabularEditor3\AI\Conversations\`. No se envían datos de las conversaciones a los servidores de Tabular Editor. -**Deshabilitar el Asistente de IA.** Puedes excluir el componente de funciones de IA durante la instalación, borrar el proveedor en **Herramientas > Preferencias > Funciones de IA > Asistente de IA** o aplicar una [política](xref:policies) mediante el Registro de Windows: `DisableAi` desactiva toda la funcionalidad de IA, incluido el servidor MCP, y borra la configuración del proveedor almacenada, mientras que `DisableAiChat` desactiva solo el chat y deja el servidor MCP en ejecución. +**Desactivación del asistente de IA.** Puede excluir el componente de funciones de IA durante la instalación, eliminar el proveedor en **Herramientas > Preferencias > Funciones de IA > Asistente de IA** o aplicar una [política](xref:policies) a través del registro de Windows: `DisableAi` desactiva todas las funciones de IA, incluido el servidor MCP, y elimina la configuración del proveedor almacenada, mientras que `DisableAiChat` desactiva únicamente el chat y deja el servidor MCP en funcionamiento. -**Pruebas de penetración.** Se ha realizado una prueba de penetración independiente del Asistente de IA. El Report está disponible en nuestro [Trust Center](https://trust.tabulareditor.com/). +**Pruebas de penetración.** Se ha realizado una prueba de penetración independiente del asistente de IA. El informe está disponible en nuestro [Centro de cumplimiento](https://trust.tabulareditor.com/). ### Servidor MCP -Tabular Editor 3 puede actuar como servidor MCP (Model Context Protocol) para que un agente de IA que se ejecute en el mismo equipo pueda trabajar en el modelo que tienes abierto. Consulta @mcp-server para obtener información sobre la función en sí. +Tabular Editor 3 puede actuar como servidor MCP (Model Context Protocol), de modo que un agente de IA que se ejecute en el mismo dispositivo pueda trabajar en el modelo que tengas abierto. Consulta @mcp-server para obtener información sobre la propia función. -**Exposición de red.** El servidor es un listener HTTP enlazado explícitamente a `127.0.0.1`, de forma predeterminada, en el puerto 42100. No es accesible desde otro equipo. Las solicitudes del navegador que llevan un encabezado `Origin` no local se rechazan como medida de protección frente al DNS rebinding. El servidor se ejecuta solo después de iniciarlo, o desde el inicio de la aplicación si así lo has indicado. +**Exposición de la red.** El servidor es un «listener» HTTP vinculado explícitamente a «127.0.0.1», de forma predeterminada en el puerto 42100. No se puede acceder a él desde otro equipo. Las solicitudes del navegador que llevan un encabezado «Origin» no local se rechazan como medida de defensa contra el «rebinding» de DNS. El servidor solo se ejecuta después de que lo inicies, o desde el inicio de la aplicación si lo has solicitado. -**Autenticación.** La vinculación a loopback es el perímetro de seguridad predeterminado, por lo que el servidor acepta conexiones locales sin credenciales de forma predeterminada. En un host en el que varias personas tienen sesión iniciada a la vez, como un servidor de Remote Desktop o Citrix, eso no basta: cualquier sesión de la máquina puede acceder a `127.0.0.1`. Mientras el token esté desactivado, cualquier proceso de la máquina puede conectarse sin credenciales. Activa **Requerir token de acceso** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP** y los clientes tendrán que presentar un bearer token, que se almacena cifrado en el archivo local Preferences.json. Los administradores pueden imponerlo con la [directiva](xref:policies) `RequireMcpAccessToken`. +**Autenticación.** La vinculación de loopback es el límite predeterminado, por lo que el servidor acepta conexiones locales sin credenciales de forma inmediata. En un host en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un servidor Citrix, eso no es suficiente: cualquier sesión en el equipo llega a «127.0.0.1». Mientras el token esté desactivado, cualquier proceso del equipo puede conectarse sin credenciales. Active **Requerir token de acceso** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP**. Los clientes deberán presentar un token al portador, que se almacena cifrado en el archivo local Preferences.json. Los administradores pueden imponer esto con la [directiva](xref:policies) `RequireMcpAccessToken`. -**Flujo de datos.** Tabular Editor no contacta con ningún proveedor de IA para esta característica ni almacena ninguna clave de API para ella. El agente es la única parte que se comunica con un proveedor, con su propia configuración y su propia suscripción. Lo que el agente puede leer del modelo está limitado por las mismas cinco concesiones de permisos que rigen el Asistente de IA, capturadas al iniciarse el servidor, y nunca se ofrece al agente ninguna herramienta que no esté cubierta por una de ellas. El acceso a los datos del modelo está denegado de forma predeterminada, por lo que ningún resultado de consulta DAX sale del modelo a menos que lo autorices explícitamente. Los valores escritos en la definición del modelo, como una expresión `DATATABLE` o una tabla de «Introducir datos», son metadatos del modelo y están cubiertos por el permiso Model metadata. +**Flujo de datos.** Tabular Editor no se pone en contacto con ningún proveedor de IA para esta función y no dispone de ninguna clave de API para ella. El agente es la única parte que se comunica con un proveedor, con su propia configuración y su propia suscripción. Lo que el agente puede leer del modelo está limitado por los mismos cinco permisos que rigen el Asistente de IA, de los que se hace una captura cuando se inicia el servidor, y cualquier herramienta que no esté cubierta por un permiso nunca se ofrece al agente. Los datos del modelo se deniegan de forma predeterminada, por lo que ningún resultado de consulta DAX sale del modelo a menos que lo concedas explícitamente. Los valores introducidos en la definición del modelo, como una expresión `DATATABLE` o una tabla Introducir datos, son metadatos del modelo y están cubiertos por el permiso de metadatos del modelo. -**Cambios en el modelo.** Un agente solo cambia el modelo a través del motor de scripting de C#, usando **C# Script**, de forma atómica y como un único paso de deshacer, y solo con la concesión de metadatos del modelo en Write. La ejecución directa de TMSL y XMLA nunca está disponible para un agente, y nunca se ejecuta para él un script que vaya más allá del modelo. +**Cambios en el modelo.** Un agente solo puede cambiar el modelo a través del motor de scripting de C# Script, de forma atómica y como un único paso de deshacer, y únicamente con el permiso de metadatos del modelo en Escritura. La ejecución de TMSL y XMLA en bruto nunca está disponible para un agente, y nunca se ejecuta para él un script que se extienda más allá del modelo. -**Registro de auditoría.** Las decisiones de permisos, las llamadas a herramientas y el texto completo de cualquier C# Script que un agente ejecutó o envió a ejecutar se registran en un registro de auditoría local. Los prompts, las respuestas y los valores de datos no se registran. +**Registro de auditoría.** Las decisiones sobre permisos, las llamadas a herramientas y el texto completo de cualquier script de C# que un agente haya ejecutado o enviado para su ejecución se registran en un registro de auditoría local. No se registran las indicaciones, las respuestas ni los valores de los datos. -**Desactivación del servidor MCP.** Desmarca **Habilitar servidor MCP** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP**, o aplica la [directiva](xref:policies) `DisableMcpServer` o `DisableAi`. El servidor forma parte del componente de funciones de IA, por lo que, si excluyes ese componente durante la instalación, también se quitará. +**Deshabilitar el servidor MCP.** Desactive **Habilitar servidor MCP** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP** o aplique la [política](xref:policies) `DisableMcpServer` o `DisableAi`. El servidor forma parte del componente de funciones de IA, por lo que, si se excluye ese componente en el momento de la instalación, también se elimina el servidor. ### Solicitudes web -Tabular Editor puede realizar solicitudes a recursos en línea (URL web) solo en los siguientes casos: +Tabular Editor puede realizar solicitudes a recursos en línea (URL web) únicamente en los siguientes casos: -- **Activación de licencia\*.** Cuando Tabular Editor 3 se inicia por primera vez y, posteriormente, a intervalos periódicos, la herramienta puede realizar una solicitud a nuestro servicio de licencias. Esta solicitud contiene información cifrada sobre la clave de licencia introducida por el usuario, la dirección de correo electrónico del usuario (si se proporciona), el nombre del equipo local y un hash codificado unidireccional que identifica la instalación actual. No se transmite ningún otro dato en esta solicitud. El propósito de esta solicitud es activar y validar la clave de licencia utilizada por la instalación, aplicar las limitaciones de la versión de prueba y permitir que el usuario gestione sus instalaciones de Tabular Editor 3 a través de nuestro servicio de licencias. -- **Comprobaciones de actualización\*.** Cada vez que se inicia Tabular Editor 3, puede realizar una solicitud a nuestro servicio de aplicaciones para determinar si hay disponible una versión más reciente de Tabular Editor 3. Esta solicitud no contiene ningún dato. -- **Telemetría de uso\*.** De forma predeterminada, Tabular Editor 3 recopila y transmite datos de uso anónimos a medida que los usuarios interactúan con la herramienta. Estos datos incluyen información sobre los objetos de la interfaz de usuario con los que interactúa un usuario y el momento de cada interacción. También contiene información de alto nivel sobre el Data model tabular que se está editando con la herramienta. Esta información solo se refiere a propiedades de alto nivel como el nivel de compatibilidad y el modo, el número de tablas, el tipo de servidor (Analysis Services vs. Power BI vs. Power BI Desktop), etc. **No se recopilan datos personales identificables de esta manera**, ni recopilamos información sobre los nombres de los objetos o las expresiones DAX en el propio Tabular Object Model. Un usuario puede optar por no enviarnos datos de telemetría en cualquier momento. -- **Reports de error\*.** Cuando se produce un error inesperado, transmitimos la traza de la pila y los mensajes de error (anonimizados), junto con una descripción opcional proporcionada por el usuario. Si un usuario decide no enviar datos de telemetría, tampoco se enviarán los Reports de error. -- **Uso del formateador de DAX.** (Solo Tabular Editor 2.x) Se puede dar formato a una expresión DAX haciendo clic en un botón en Tabular Editor. En este caso, la expresión DAX (y nada más) se envía al servicio web www.daxformatter.com. La primera vez que un usuario hace clic en este botón, se muestra un mensaje de advertencia explícito para que confirme su intención. Tabular Editor 3 no realiza solicitudes web al dar formato al código DAX. -- **Optimizador de DAX**. Si un usuario tiene una [cuenta de Tabular Tools](https://tabulartools.com) con una suscripción a [Optimizador de DAX](https://daxoptimizer.com), podrá explorar su Workspace del Optimizador de DAX, ver incidencias y sugerencias, y cargar nuevos archivos VPAX directamente desde Tabular Editor 3. Los archivos VPAX contienen metadatos y estadísticas del modelo, pero no _datos_ reales del modelo. La función de integración del Optimizador de DAX en Tabular Editor 3 realiza varias solicitudes a uno o varios de los endpoints indicados a continuación (en función del tipo de autenticación y de la región especificados al crear la cuenta de Tabular Tools).
- Para obtener más información, consulta la [documentación de Optimizador de DAX](https://docs.daxoptimizer.com/legal/data-processing).
- Endpoints utilizados: +- **Activación de la licencia\*.** Cuando se inicia Tabular Editor 3 por primera vez, y a intervalos periódicos a partir de entonces, la herramienta puede realizar una solicitud a nuestro servicio de licencias. Esta solicitud contiene información cifrada sobre la clave de licencia introducida por el usuario, la dirección de correo electrónico del usuario (si se ha proporcionado), el nombre del equipo local y un hash codificado unidireccional que identifica la instalación actual. No se transmiten otros datos en esta solicitud. El propósito de esta solicitud es activar y validar la clave de licencia utilizada por la instalación, hacer cumplir las limitaciones de la versión de prueba, así como permitir al usuario gestionar sus instalaciones de Tabular Editor 3 a través de nuestro servicio de licencias. +- **Comprobaciones de actualizaciones\*.** Cada vez que se inicia Tabular Editor 3, puede realizar una solicitud a nuestro servicio de aplicaciones para determinar si hay una versión más reciente de Tabular Editor 3 disponible. Esta solicitud no contiene ningún dato. +- **Telemetría de uso\*.** De forma predeterminada, Tabular Editor 3 recopila y transmite datos de uso anónimos a medida que los usuarios interactúan con la herramienta. Estos datos incluyen información sobre los objetos de la interfaz de usuario con los que interactúa un usuario y el momento en que lo hace con cada uno de ellos. También contiene información de alto nivel sobre el modelo de datos tabulares que se está editando a través de la herramienta. Esta información solo se refiere a propiedades de alto nivel, como el nivel y el modo de compatibilidad, el número de tablas, el tipo de servidor (Analysis Services frente a Power BI frente a Power BI Desktop), etc. **No se recopilan datos de identificación personal de esta manera**, ni tampoco recopilamos información sobre los nombres de los objetos o las expresiones DAX en el propio Tabular Object Model. Cada evento identifica la arquitectura del procesador y el tiempo de ejecución de .NET de la instalación. Un usuario puede optar por no enviarnos datos de telemetría en cualquier momento. +- **Informes de errores\*.** Cuando se produce un error inesperado, transmitimos el seguimiento de la pila y el mensaje de error (anonimizado), junto con una descripción opcional proporcionada por el usuario. Si un usuario opta por no enviar datos de telemetría, tampoco se enviarán los informes de errores. +- **Uso del formateador de DAX.** (Solo en Tabular Editor 2.x) Se puede formatear una expresión DAX haciendo clic en un botón de Tabular Editor. En este caso, la expresión DAX (y nada más) se envía al servicio web www.daxformatter.com. La primera vez que un usuario hace clic en este botón, se muestra un mensaje de advertencia explícito en el que se le pide que confirme su intención. Tabular Editor 3 no realiza solicitudes web al formatear código DAX. +- **Optimizador de DAX**. Si un usuario tiene una [cuenta de Tabular Tools](https://tabulartools.com) con una suscripción al [Optimizador de DAX](https://daxoptimizer.com), podrá navegar por su espacio de trabajo del Optimizador de DAX, ver problemas y sugerencias, y cargar nuevos archivos VPAX directamente desde Tabular Editor 3. Los archivos VPAX contienen metadatos y estadísticas del modelo, pero no *datos* reales del modelo. La función de integración de DAX Optimizer en Tabular Editor 3 genera varias solicitudes a uno o más de los siguientes puntos finales (en función del tipo de autenticación y de la región especificados al crear la cuenta de Tabular Tools).
+ Para obtener más información, consulta la [documentación de DAX Optimizer](https://docs.daxoptimizer.com/legal/data-processing).
+ Puntos de conexión utilizados: - https://account.tabulartools.com - https://licensing.api.daxoptimizer.com/api - https://australiaeast.api.daxoptimizer.com/api - https://eastus.api.daxoptimizer.com/api - https://westeurope.api.daxoptimizer.com/api -- **Asistente de IA.** Cuando el Asistente de IA está configurado y en uso, Tabular Editor 3 envía solicitudes directamente a la API del proveedor de IA configurado. Los endpoints dependen del proveedor seleccionado (por ejemplo, `https://api.openai.com` para OpenAI, `https://api.anthropic.com` para Anthropic o el endpoint que especifiques para Azure OpenAI y proveedores personalizados). En estas solicitudes solo se incluyen los datos cubiertos por las concesiones de permisos. Consulta la sección [Asistente de IA](#ai-assistant) anterior para ver los recursos y sus valores predeterminados. -- **Actualizaciones de la base de conocimientos de IA.** La base de conocimientos en la que busca el Asistente de IA es una base de datos local incluida en el componente de funciones de IA. Tabular Editor 3 comprueba si hay una copia más reciente y la descarga desde `https://cdn.tabulareditor.com`. La solicitud no contiene datos sobre ti ni sobre tu modelo. -- **Catálogo de modelos de IA.** Cuando un usuario abre la lista de modelos del proveedor OpenAI o Anthropic, Tabular Editor 3 descarga la lista de modelos disponibles desde `https://api.tabulareditor.com/AiModels` y la almacena en caché en `%LocalAppData%\TabularEditor3\AiModels.json` durante 24 horas. La solicitud es anónima y no incluye datos sobre ti, tu clave de API ni tu modelo. La directiva `DisableUpdates` lo desactiva. -- **Servidor MCP.** El servidor MCP no realiza solicitudes salientes. Solo acepta conexiones en la interfaz loopback, y el agente que se conecta a él es quien se comunica con un proveedor de IA, con su propia configuración. Consulta la sección [servidor MCP](#mcp-server) anterior. -- **Importación de reglas de prácticas recomendadas.** Tabular Editor incluye una funcionalidad que permite especificar una dirección URL desde la que obtener una lista de reglas de prácticas recomendadas en formato JSON. Este tipo de solicitud solo descarga los datos JSON desde la URL; no se transmite ningún dato a la URL. -- **Uso de C# Scripts.** Tabular Editor permite a los usuarios escribir y ejecutar código en C# con fines de automatización. Este tipo de script puede conectarse a recursos en línea mediante características del lenguaje C# y el entorno de ejecución de .NET. El usuario es siempre responsable de garantizar que el código ejecutado no provoque ningún intercambio de datos no deseado. Tabular Editor ApS no se hace responsable de ningún daño, pérdida o filtración causados por el uso, en general, de la funcionalidad de C# Script. Tabular Editor nunca ejecutará C# Scripts sin una acción explícita del usuario. - -\***Toda la información que obtengamos a través del servicio de activación de licencias, la telemetría de uso o los Reports de errores se mantendrá confidencial. No compartiremos, publicaremos ni distribuiremos los datos recopilados de ninguna forma.** - -**Lista de permitidos / aceptados del firewall** -Para permitir el tráfico de las solicitudes web mencionadas anteriormente, deberás incluir en la lista de permitidos: - -- Activación de licencias / comprobaciones de actualización / catálogo de modelos de IA: **https://api.tabulareditor.com** -- Telemetría de uso / Reports de errores: **https://\*.in.applicationinsights.azure.com** -- DAX Formatter (solo Tabular Editor 2.x): **https://www.daxformatter.com** -- Importar reglas de prácticas recomendadas / C# Scripts: depende del contexto -- Optimizador de DAX: puntos de conexión enumerados arriba. -- Asistente de IA: Depende del proveedor configurado (p. ej., **https://api.openai.com**, **https://api.anthropic.com** o endpoints de Azure OpenAI o personalizados especificados por el usuario) +- **Asistente de IA.** Cuando el Asistente de IA está configurado y en uso, Tabular Editor 3 envía solicitudes directamente a la API del proveedor de IA configurado. Los puntos de conexión dependen del proveedor seleccionado (por ejemplo, `https://api.openai.com` para OpenAI, `https://api.anthropic.com` para Anthropic o un punto de conexión especificado por el usuario para Azure OpenAI y proveedores personalizados). En estas solicitudes solo se incluyen los datos cubiertos por las concesiones de permisos. Consulta la sección [Asistente de IA](#ai-assistant) anterior para conocer los recursos y sus valores predeterminados. +- **Actualizaciones de la base de conocimientos de IA.** La base de conocimientos en la que busca el asistente de IA es una base de datos local que se incluye con el componente de características de IA. Tabular Editor 3 busca una copia más reciente y la descarga desde «https://cdn.tabulareditor.com». La solicitud no contiene datos sobre ti ni sobre tu modelo. +- **Catálogo de modelos de IA.** Cuando un usuario abre la lista de modelos del proveedor OpenAI o Anthropic, Tabular Editor 3 descarga la lista de modelos disponibles desde `https://api.tabulareditor.com/AiModels` y la almacena en caché en `%LocalAppData%\TabularEditor3\AiModels.json` durante 24 horas. La solicitud es anónima y no contiene datos sobre ti, tu clave de API ni tu modelo. La directiva `DisableUpdates` la desactiva. +- **Servidor MCP.** El servidor MCP no realiza solicitudes salientes. Solo acepta conexiones en la interfaz de bucle invertido, y el agente que se conecta a él es el que se comunica con un proveedor de IA, según su propia configuración. Consulta la sección [Servidor MCP](#mcp-server) anterior. +- **Importación de reglas de buenas prácticas.** Tabular Editor dispone de una función que permite al usuario especificar una URL desde la que recuperar una lista de reglas de buenas prácticas en un formato basado en JSON. Este tipo de solicitud solo descarga los datos JSON de la URL; no se transmiten datos a la URL. +- **Uso de scripts de C#.** Tabular Editor permite a los usuarios escribir y ejecutar código escrito en C# con fines de automatización. Dicho script puede conectarse potencialmente a recursos en línea, utilizando las características del lenguaje C# y el tiempo de ejecución de .NET. El usuario es siempre responsable de garantizar que el código ejecutado no provoque ningún intercambio de datos no deseado. Tabular Editor ApS no se hace responsable de ningún daño, pérdida o filtración causados por el uso de la función de C# Script en general. Tabular Editor nunca ejecutará scripts de C# sin la acción explícita del usuario. + +\***Cualquier información que obtengamos a través del servicio de activación de licencias, los datos de telemetría de uso o los informes de errores se mantiene confidencial. No compartiremos, publicaremos ni distribuiremos los datos recopilados de ninguna manera, forma o modo.** + +**Lista de elementos permitidos/lista de elementos aceptados del cortafuegos** +Para permitir el tráfico a las solicitudes web mencionadas anteriormente, tendrás que incluir en la lista blanca: +- Activación de licencias / Comprobaciones de actualización / Catálogo de modelos de IA: **https://api.tabulareditor.com** +- Telemetría de uso / Informes de errores: **https://*.in.applicationinsights.azure.com** +- Formateador DAX (solo Tabular Editor 2.x): **https://www.daxformatter.com** +- Importar reglas de buenas prácticas / scripts C#: depende del contexto +- Optimizador de DAX: puntos de conexión enumerados anteriormente. +- Asistente de IA: depende del proveedor configurado (por ejemplo, **https://api.openai.com**, **https://api.anthropic.com** o puntos de conexión de Azure OpenAI/personalizados especificados por el usuario). - Actualizaciones de la base de conocimientos de IA: **https://cdn.tabulareditor.com** -- Servidor MCP: nada. Escucha en **127.0.0.1** y no realiza solicitudes salientes +- Servidor MCP: nada. Escucha en **127.0.0.1** y no realiza ninguna solicitud saliente. > [!NOTE] -> Un administrador del sistema puede aplicar determinadas [directivas](xref:policies), que pueden usarse para deshabilitar algunas o todas las funciones mostradas en la lista anterior. +> Un administrador del sistema puede aplicar ciertas [políticas](xref:policies), que se pueden utilizar para desactivar algunas o todas las funciones que se muestran en la lista anterior. ## Seguridad de la aplicación -Tabular Editor no requiere ningún privilegio elevado en el equipo Windows donde está instalado, ni accede a ningún recurso restringido del equipo. Una excepción a esta regla es si se usa el archivo del instalador de Tabular Editor (.msi); en ese caso, el ejecutable y los archivos de soporte necesarios para la herramienta se copian, de forma predeterminada, en la carpeta `Program Files`, que normalmente requiere permisos elevados. Tanto los archivos binarios de Tabular Editor como el archivo del instalador se han firmado con un certificado de firma de código emitido a nombre de Tabular Editor ApS, lo cual le garantiza que el código no ha sido manipulado por ninguna tercera parte. +Tabular Editor no requiere ningún privilegio elevado en el equipo Windows en el que está instalado, ni accede a ningún recurso restringido del equipo. Una excepción a esta regla se da si se utiliza el archivo de instalación de Tabular Editor (.msi), en cuyo caso el ejecutable y los archivos de soporte necesarios para la herramienta se copian de forma predeterminada en la carpeta «Archivos de programa», que normalmente requiere permisos elevados. Tanto los archivos binarios de Tabular Editor como el archivo del instalador se han firmado con un certificado de firma de código emitido a Tabular Editor ApS, lo que constituye su garantía de que ningún tercero ha manipulado el código. -Mientras la aplicación se está ejecutando, todo el acceso a recursos externos se realiza a través de la biblioteca cliente AMO/TOM o de las solicitudes web mencionadas anteriormente. +Cuando la aplicación se está ejecutando, todos los accesos a recursos externos se realizan a través de la biblioteca cliente AMO/TOM o de las solicitudes web mencionadas anteriormente. -La funcionalidad de C# Script permite a Tabular Editor ejecutar código C# arbitrario dentro del runtime de .NET. Ese código solo se compila y ejecuta cuando lo solicitas explícitamente. Los C# Script también pueden guardarse como "macros", lo que te facilita administrar y ejecutar varios scripts distintos. El código se almacena en tu propia carpeta `%localappdata%`, lo que garantiza que solo tú o un administrador local del equipo pueden acceder a los scripts. Siempre eres responsable de garantizar que el código ejecutado no provoque efectos secundarios no deseados. En ningún caso Tabular Editor ApS será responsable de ningún daño, pérdida o filtración causados por el uso de las funciones de C# Script o de acciones personalizadas/macros. +La función de C# Script permite a Tabular Editor ejecutar código C# arbitrario dentro del tiempo de ejecución de .NET. Dicho código solo se compila y ejecuta a petición explícita del usuario. Los C# Scripts también se pueden guardar como «macros», lo que facilita al usuario la gestión y ejecución de varios scripts diferentes. El código se almacena en la carpeta `%localappdata%` del propio usuario, lo que garantiza que solo él o un administrador del equipo local puedan acceder a los scripts. El usuario es siempre responsable de garantizar que el código ejecutado no provoque ningún efecto secundario no deseado. Bajo ninguna circunstancia se podrá considerar a Tabular Editor ApS responsable de ningún daño, pérdida o filtración causados por el uso de las funciones de C# Script o de las acciones/macros personalizadas. -Las organizaciones que no quieran dejar esto a criterio de cada usuario pueden gestionarlo de forma centralizada. Las [políticas](xref:policies) `DisableCSharpScripts` y `DisableMacros` desactivan por completo los scripts de C# y las macros, en todas las ediciones. Con Tabular Editor 3 Edición Enterprise, `BlockUnsafeScripts` mantiene el scripting disponible, pero solo permite scripts y macros que permanezcan dentro del modelo semántico: se rechaza, antes de ejecutarse, cualquier cosa que lea o escriba un archivo, acceda a la red, inicie otro programa o cargue código externo, independientemente de dónde provenga el script: un documento de script, el Best Practice Analyzer, una macro, el Asistente de IA, el servidor MCP o la línea de comandos. Consulta las [políticas de administrador](xref:csharp-scripts#administrator-policies). +Las organizaciones que no quieran dejar esto en manos de cada usuario pueden gestionarlo de forma centralizada. Las [políticas](xref:policies) «DisableCSharpScripts» y «DisableMacros» desactivan por completo las funciones, en todas las ediciones. Con Tabular Editor 3 Edición Enterprise, `BlockUnsafeScripts` mantiene disponible el scripting, pero solo permite scripts y macros que se queden dentro del modelo semántico: cualquier cosa que lea o escriba un archivo, acceda a la red, inicie otro programa o cargue código externo se rechaza antes de ejecutarse, independientemente de de dónde proceda el script: un documento de script, Best Practice Analyzer, una macro, el Asistente de IA, el servidor MCP o la línea de comandos. Consulte [Políticas del administrador](xref:csharp-scripts#administrator-policies). diff --git a/localizedContent/es/content/security/toc.md b/localizedContent/es/content/security/toc.md index 3d3b79dbe..cc3894e11 100644 --- a/localizedContent/es/content/security/toc.md +++ b/localizedContent/es/content/security/toc.md @@ -1,11 +1,8 @@ # @security-privacy +# @ai-compliance -# Legal - -## @te3-eula - -## @third-party-notices - +# Aspectos legales +## @terms +## @avisos-de-terceros ## @privacy-policy - ## @gdpr-delete \ No newline at end of file diff --git a/localizedContent/es/content/troubleshooting/toc.md b/localizedContent/es/content/troubleshooting/toc.md index c4e7b7572..a7a4d6c12 100644 --- a/localizedContent/es/content/troubleshooting/toc.md +++ b/localizedContent/es/content/troubleshooting/toc.md @@ -1,9 +1,17 @@ -# @licensing-activation +# @activación-de-licencias # @proxy-settings -# @locale-not-supported +# @idioma-no-compatible -# @calendar-blank-value +# @valor-en-blanco-en-calendario -# @direct-lake-entity-updates-reverting \ No newline at end of file +# @revertir-actualizaciones-entidades-direct-lake + +# @errores-de-conexión-de-azure-openai + +# @formato-medida-modelo-compuesto + +# @longitud-comentarios-columna-databricks + +# @databricks-actualizar-catálogo-vacío diff --git a/localizedContent/es/content/tutorials/new-as-model.md b/localizedContent/es/content/tutorials/new-as-model.md index 208a57134..776a7f15b 100644 --- a/localizedContent/es/content/tutorials/new-as-model.md +++ b/localizedContent/es/content/tutorials/new-as-model.md @@ -1,4 +1,4 @@ ---- +--- uid: new-as-model title: Crear un modelo de Analysis Services author: Daniel Otykier @@ -13,67 +13,65 @@ applies_to: none: true - edition: Business partial: true - note: "Limitado a SQL Server Standard Edition" + note: "Limited to SQL Server Standard Edition" - edition: Enterprise full: true --- +# (Tutorial) Creación de su primer modelo de Analysis Services -# (Tutorial) Cómo crear tu primer modelo de Analysis Services - -En esta página te guiamos paso a paso por el proceso de crear desde cero un nuevo modelo tabular de Analysis Services con Tabular Editor 3. +Esta página te guía a través del proceso de creación de un nuevo modelo tabular de Analysis Services desde cero utilizando Tabular Editor 3. > [!NOTE] -> La Edición Business de Tabular Editor 3 se limita a la [edición Standard de SQL Server](https://docs.microsoft.com/analysis-services/analysis-services-features-supported-by-the-editions-of-sql-server-2016?view=asallproducts-allversions#tabular-models) y al [nivel Basic de Azure Analysis Services](https://docs.microsoft.com/azure/analysis-services/analysis-services-overview#basic-tier). Ten en cuenta que algunas características de modelado no se admiten en estos niveles. +> Tabular Editor 3 Edición Business está limitado a [SQL Server Edición Standard](https://docs.microsoft.com/analysis-services/analysis-services-features-supported-by-the-editions-of-sql-server-2016?view=asallproducts-allversions#tabular-models) y al [nivel básico de Azure Analysis Services](https://docs.microsoft.com/azure/analysis-services/analysis-services-overview#basic-tier). Tenga en cuenta que ciertas funciones de modelado no son compatibles con estos niveles. -##### Crear un nuevo modelo +## Creación de un nuevo modelo -- En el menú Archivo, elige Nuevo > Modelo... o pulsa `CTRL+N` +- En el menú Archivo, seleccione Nuevo > Modelo... o pulse «CTRL+N». ![Nuevo modelo](~/content/assets/images/new-as-model-new-model.png) -- Indica un nombre para tu modelo o usa el valor predeterminado. Luego, elige el nivel de compatibilidad para la versión de Analysis Services a la que te diriges. El cuadro de diálogo muestra estas opciones: - - - 1200 (Azure Analysis Services / SQL Server 2016+) - - 1400 (Azure Analysis Services / SQL Server 2017+) +- Proporcione un nombre para su modelo o use el valor predeterminado. El nombre que introduzca se utilizará para el nombre de la base de datos, el ID de la base de datos y el nombre del modelo. A continuación, elija el nivel de compatibilidad para la versión de Analysis Services a la que se dirige. El cuadro de diálogo muestra estas opciones: + - 1200 (Azure Analysis Services / SQL Server 2016 o posterior) + - 1400 (Azure Analysis Services / SQL Server 2017 o posterior) - 1500 (Azure Analysis Services / SQL Server 2019+) - - 1600 (Azure Analysis Services / SQL Server 2022+) - - 1700 (Azure Analysis Services / SQL Server 2025+) + - 1600 (Azure Analysis Services / SQL Server 2022 o posterior) + - 1700 (Azure Analysis Services / SQL Server 2025 o posterior) - 1706 (Power BI / Fabric) - 1700 es el nivel más alto que admite Analysis Services. Usa 1706 solo para Power BI y Fabric, por ejemplo, al desplegar el modelo mediante el punto de conexión XMLA de Power BI. + 1700 es el nivel más alto que admite Analysis Services. Use 1706 solo para Power BI y Fabric, por ejemplo, cuando implemente el modelo a través del punto de conexión XMLA de Power BI. -- Para obtener la mejor experiencia de desarrollo, marca la opción "Usar base de datos del Workspace". Esto requiere que tengas disponible una instancia de Analysis Services en la que se implementará la base de datos del Workspace. Puede ser una instancia local o remota de SQL Server Analysis Services, o una instancia de Azure Analysis Services. Al hacer clic en Aceptar, se te solicitará que introduzcas la cadena de conexión de la instancia de Analysis Services en la que quieres que se cree la base de datos del Workspace. +- Para disfrutar de la mejor experiencia de desarrollo, marque la opción «Usar base de datos del área de trabajo». Esto requiere que tengas disponible una instancia de Analysis Services en la que se implementará la base de datos de tu área de trabajo. Podría tratarse de una instancia local o remota de SQL Server Analysis Services o de una instancia de Azure Analysis Services. Cuando haga clic en Aceptar, se le pedirá que introduzca la cadena de conexión de la instancia de Analysis Services en la que desea que se cree la base de datos del área de trabajo. - [Más información sobre las bases de datos de Workspace](xref:workspace-mode). + [Más información sobre las bases de datos del área de trabajo](xref:workspace-mode). > [!NOTE] -> Con una base de datos del Workspace, puedes validar Power Query (expresiones M) e importar el esquema de la tabla desde expresiones de Power Query. También puedes actualizar y consultar datos en la base de datos del Workspace, lo que facilita la depuración y las pruebas de tus expresiones DAX. +> Con una base de datos de área de trabajo, puede validar Power Query (expresiones M) e importar el esquema de tabla desde expresiones de Power Query. También puede actualizar y consultar datos en la base de datos del área de trabajo, lo que facilita la depuración y la prueba de sus expresiones DAX. -Una vez creado el modelo, el siguiente paso es agregar un Data source y algunas tablas. +Una vez creado tu modelo, el siguiente paso es añadir una Data source y algunas tablas. -#### Agregar un Data source y tablas +## Agregar un origen de datos y tablas -Antes de poder importar datos a tu modelo tabular, tienes que configurar uno o varios Data sources. Ubica el Explorador TOM, haz clic con el botón derecho en la carpeta "Data sources" y elige "Crear". Para un modelo que use un nivel de compatibilidad 1400 o superior, tienes dos opciones: Legacy y Data sources de Power Query. Para obtener más información sobre las diferencias entre estos dos tipos de Data sources, [consulte el blog de Microsoft Analysis Services](https://docs.microsoft.com/archive/blogs/analysisservices/using-legacy-data-sources-in-tabular-1400). +Antes de poder importar datos a su modelo tabular, debe configurar uno o más orígenes de datos. Localice el Explorador TOM, haga clic derecho en la carpeta «Fuentes de datos» y elija «Crear». Para un modelo que utiliza el nivel de compatibilidad 1400 o superior, tenemos dos opciones: orígenes de datos heredados y orígenes de datos de Power Query. Para obtener más información sobre las diferencias entre estos dos tipos de orígenes de datos, [consulte el blog de Microsoft Analysis Services](https://docs.microsoft.com/archive/blogs/analysisservices/using-legacy-data-sources-in-tabular-1400). -![Agregar un Data source](~/content/assets/images/new-as-model-add-data-source.png) +![Añadir origen de datos](~/content/assets/images/new-as-model-add-data-source.png) -En este ejemplo, crearemos un Data source de Power Query, que usaremos para importar algunas tablas de una base de datos relacional de SQL Server. Una vez creado el Data source, pulsa F2 para cambiarle el nombre y configúralo con la cuadrícula de propiedades, como se muestra en la captura de pantalla siguiente: +En este ejemplo, crearemos un origen de datos de Power Query, que usaremos para importar algunas tablas de una base de datos relacional de SQL Server. Una vez creado el origen de datos, pulse F2 para cambiarle el nombre y configurar el origen de datos utilizando la cuadrícula de propiedades, como se muestra en la siguiente captura de pantalla: -![Configurar las propiedades del Data source](~/content/assets/images/new-as-model-data-source-properties.png) +![Establecer propiedades del origen de datos](~/content/assets/images/new-as-model-data-source-properties.png) -En nuestro ejemplo, establecimos las siguientes propiedades: +En nuestro ejemplo, establecemos las siguientes propiedades: -| Propiedad | Valor | -| ------------------ | ---------------------- | -| Nombre | `AdventureWorks` | -| Protocolo | `tds` | -| Base de datos | `AdventureWorksDW2017` | -| Servidor | `localhost` | -| AuthenticationKind | `ServiceAccount` | +| Propiedad | Valor | +|---|---| +| Nombre | `AdventureWorks` | +| Protocolo | `tds` | +| Base de datos | `AdventureWorksDW2017` | +| Servidor | `localhost` | +| AuthenticationKind | «ServiceAccount» | -Haz clic en Guardar (Ctrl+S). Se te pedirá que indiques una ruta y un nombre de archivo para el archivo Model.bim, que contendrá los metadatos del modelo que has creado hasta ahora. También puedes guardar el modelo como una estructura de carpetas (Archivo > Guardar en carpeta...), lo cual se recomienda si piensas integrar los metadatos del modelo en un entorno con control de versiones. Si estás usando una base de datos de Workspace, Tabular Editor 3 también sincronizará los metadatos con la instancia conectada de Analysis Services. +Pulse Guardar (Ctrl+S). Se le pedirá que proporcione una ruta y un nombre de archivo para el archivo Model.bim, que contendrá los metadatos del modelo que ha creado hasta ahora. También puede guardar el modelo como una estructura de carpetas (Archivo > Guardar en carpeta...), lo cual se recomienda si tiene previsto integrar los metadatos de su modelo en un entorno con control de versiones. Si está utilizando una base de datos del área de trabajo, Tabular Editor 3 también sincronizará los metadatos con la instancia conectada de Analysis Services. -A continuación, añade una nueva tabla al modelo haciendo clic con el botón derecho en la carpeta "Tablas" y eligiendo "Crear > Tabla" (también puedes pulsar Alt+5). Asigna un nombre a la tabla; en nuestro ejemplo, `Internet Sales`. Expande la tabla, localiza la partición de la tabla y proporciona la siguiente consulta M como expresión de la partición, para rellenar la tabla con datos: +A continuación, añade una nueva tabla al modelo haciendo clic con el botón derecho en la carpeta «Tablas» y eligiendo «Crear > Tabla» (también puedes pulsar Alt+5). Ponga un nombre a la tabla; en nuestro ejemplo, «Internet Sales». Expanda la tabla, localice la partición en la tabla e introduzca la siguiente consulta M como expresión de partición para rellenar la tabla con datos: ```M let @@ -83,57 +81,57 @@ in Data ``` -Esto asume que la base de datos relacional de SQL Server contiene una tabla llamada "FactInternetSales" dentro del esquema "dbo". +Esto supone que la base de datos relacional de SQL Server contiene una tabla denominada «FactInternetSales» dentro del esquema «dbo». ![Expresión de partición M](~/content/assets/images/new-as-model-m-partition.png) -A continuación, haz clic con el botón derecho en la tabla recién creada y elige "Actualizar esquema de tabla...". Esto permite que Tabular Editor rellene automáticamente las columnas de la tabla en función de la consulta de la partición. +A continuación, haga clic con el botón derecho en la tabla recién creada y elija «Actualizar esquema de tabla...». Esto permite que Tabular Editor rellene automáticamente las columnas de la tabla en función de la consulta de la partición. > [!NOTE] -> Si no estás usando una base de datos de Workspace, esta operación solo está disponible en Tabular Editor, versión 3.1.0 o posterior. +> Si no está utilizando una base de datos del área de trabajo, esta operación solo está disponible en Tabular Editor versión 3.1.0 o posterior. ![Comparación de esquemas](~/content/assets/images/new-as-model-schema-compare.png) -Haz clic en "Aceptar" para añadir las columnas a la tabla. Haz clic en Guardar de nuevo (Ctrl+S). Si estás usando una base de datos de Workspace, puedes actualizar la tabla en el servidor y explorar los datos de la tabla una vez que finalice la operación de actualización. Para ello, haz clic con el botón derecho en la tabla y elige "Actualizar tabla > Automático (tabla)". Espera a que finalice la operación en la pestaña "Actualización de datos" y, después, haz clic con el botón derecho en la tabla y elige "Vista previa" (también puedes hacerlo desde el Explorador TOM) para ver los datos reales de la tabla: +Pulse «Aceptar» para añadir las columnas a la tabla. Pulse de nuevo Guardar (Ctrl+S). Si está utilizando una base de datos del área de trabajo, puede actualizar la tabla en el servidor y consultar los datos de la tabla una vez que se haya completado la operación de actualización. Para ello, haga clic con el botón derecho en la tabla y elija «Actualizar tabla > Automática (tabla)». Espere a que finalice la operación en la pestaña «Actualización de datos», luego haga clic derecho en la tabla y elija «Vista previa» (también puede hacerlo desde el Explorador TOM) para ver los datos reales de la tabla: ![Actualización de datos](~/content/assets/images/new-as-model-data-refresh.png) -Si la tabla que importaste es una tabla de dimensión, recomendamos establecer la propiedad "Key" de la columna de clave principal de la tabla como "true". Esto facilita definir relaciones entre esta tabla y otras, como veremos más adelante. +Si la tabla que ha importado es una tabla de dimensiones, le recomendamos que establezca la propiedad «Clave» de la columna de clave primaria de la tabla en «true». Esto facilita la definición de relaciones entre esta tabla y otras, como veremos más adelante. -Repite este proceso con cualquier tabla que quieras importar en tu modelo tabular. No tienes que actualizar los datos de cada tabla una por una; en su lugar, puedes ejecutar la operación de actualización a nivel del modelo. +Repite este proceso para cualquier tabla que quieras importar a tu modelo tabular. No es necesario actualizar los datos de cada tabla uno por uno; en su lugar, puede ejecutar la operación de actualización a nivel de modelo. -#### Definición de relaciones +## Definición de relaciones -Una vez que hayas importado varias tablas, la forma más sencilla de definir las relaciones entre ellas con Tabular Editor 3 es crear un nuevo diagrama. Elige "File > New > Diagram". Después, selecciona varias tablas y arrástralas a la Vista de diagrama, o haz clic con el botón derecho en las tablas y elige "Add to diagram": +Una vez que hayas importado varias tablas, la forma más fácil de definir las relaciones entre ellas con Tabular Editor 3 es crear un nuevo diagrama. Elija «Archivo > Nuevo > Diagrama». A continuación, seleccione varias tablas a la vez y arrástrelas a la vista de diagrama o haga clic derecho en las tablas y elija "Agregar al diagrama": ![Agregar al diagrama](~/content/assets/images/new-as-model-add-to-diagram.png) -Para crear una relación entre dos tablas, localiza la columna de clave externa en la tabla de hechos y "arrastra" esa columna hasta la columna de clave primaria de la tabla de dimensiones. Pulsa "OK" para confirmar la configuración de la relación en el cuadro de diálogo que aparece. +Para crear una relación entre dos tablas, localice la columna de clave externa en la tabla de hechos y «arrastre» esa columna a la columna de clave primaria de la tabla de dimensiones. Pulse «Aceptar» para confirmar la configuración de la relación en el cuadro de diálogo que aparece. ![Vista de diagrama](~/content/assets/images/new-as-model-diagram-view.png) -Cierra la Vista de diagrama (no hace falta guardarla, ya que siempre puedes reconstruir el diagrama más adelante). Pulsa Ctrl+S de nuevo para guardar el modelo. Ahora toca añadir algo de lógica de negocio. Si estás usando una Workspace Database, este es un buen momento para ejecutar una actualización ("Automatic" o "Calculate") a nivel del modelo, para asegurarte de que en el servidor se crean las estructuras de soporte para las relaciones y, así, dejar el modelo en un estado consultable. +Cierre la vista de diagrama (no es necesario guardarla, ya que siempre puede reconstruir el diagrama más tarde). Pulse Ctrl+S una vez más para guardar el modelo. Ahora es el momento de añadir algo de lógica empresarial. Si está utilizando una base de datos del área de trabajo, ahora es un buen momento para ejecutar una actualización (automática o calculada) a nivel de modelo, para asegurarse de que las estructuras de soporte de las relaciones se creen en el servidor, lo que hará que el modelo esté en un estado en el que se puedan realizar consultas. -#### Añadir medidas +## Añadir medidas -Selecciona una de las tablas en el Explorador TOM y pulsa Alt+1 (o elige Create > New Measure) para añadir una medida a esa tabla. Asigna un nombre a la medida y proporciona una expresión DAX para la medida. +Seleccione una de las tablas en el Explorador TOM y presione Alt+1 (o elija Crear > Nueva medida) para añadir una medida a esa tabla. Ponga un nombre a la medida e indique una expresión DAX para la medida. -![Agregar medida](~/content/assets/images/new-as-model-add-measure.png) +![Añadir medida](~/content/assets/images/new-as-model-add-measure.png) -Pulsa Ctrl+S para guardar los metadatos del modelo. +Pulse Ctrl+S para guardar los metadatos del modelo. -Si estás usando una Workspace Database, ahora puedes probar tu nueva medida directamente en Tabular Editor 3. La forma más sencilla de probarla es usar un Pivot Grid. Elige File > New > Pivot Grid y, a continuación, arrastra la medida recién creada desde el Explorador TOM a la cuadrícula. También puedes arrastrar columnas y jerarquías desde el Explorador TOM a las áreas Filter, Row o Column del Pivot Grid para segmentar tu medida por distintos atributos de dimensión: +Si estás utilizando una base de datos del área de trabajo, ahora puedes probar tu nueva medida directamente dentro de Tabular Editor 3. La forma más fácil de probarla es usando un Pivot Grid. Elija Archivo > Nuevo > Pivot Grid y, a continuación, arrastre la medida recién creada desde el Explorador TOM a la cuadrícula. También puede arrastrar columnas y jerarquías del Explorador TOM al área de Filtro, Fila o Columna del Pivot Grid, para segmentar su medida por diferentes atributos de dimensión: ![Pivot Grid](~/content/assets/images/new-as-model-pivot-grid.png) -Si no usaste una Workspace Database, tendrás que desplegar tu modelo en una instancia de Analysis Services antes de poder realizar actualizaciones de datos y consultar el modelo. +Si no has usado una base de datos del área de trabajo, tendrás que implementar tu modelo en una instancia de Analysis Services antes de poder realizar actualizaciones de datos y consultar el modelo. -#### Implementación del Data model +## Implementación del modelo de datos -Para implementar los metadatos del modelo en cualquier instancia de Analysis Services, haz clic en el menú "Modelo" y elige "Implementar...". Esto abre el Asistente de implementación de Tabular Editor 3, similar al Asistente de implementación de Tabular Editor 2.X. Sigue las instrucciones de las distintas páginas del asistente para implementar los metadatos del modelo en una instancia de Analysis Services. También puedes usar el Asistente de implementación para generar un script TMSL/XMLA, que puedes entregar a un administrador del servidor de Analysis Services para que lo implemente manualmente. +Para implementar los metadatos del modelo en cualquier instancia de Analysis Services, haz clic en el menú «Modelo» y elige «Implementar...». Esto abrirá el Asistente de implementación de Tabular Editor 3, que es similar al Asistente de implementación de Tabular Editor 2.X. Sigue las instrucciones de las distintas páginas del asistente para implementar los metadatos del modelo en una instancia de Analysis Services. También puede utilizar el Asistente de implementación para generar un script TMSL/XMLA, que puede entregarse a un administrador del servidor de Analysis Services para su implementación manual. -![Despliegue](~/content/assets/images/new-as-model-deployment.png) +![Implementación](~/content/assets/images/new-as-model-deployment.png) -Para actualizar y probar la base de datos implementada, puedes usar las herramientas estándar de administración y cliente proporcionadas por Microsoft, o bien otra instancia de Tabular Editor 3 (siempre que tengas acceso administrativo a la instancia de Analysis Services donde se encuentra el modelo implementado). +Para actualizar y probar la base de datos implementada, puedes utilizar las herramientas estándar de gestión y cliente proporcionadas por Microsoft, o bien puedes utilizar otra instancia de Tabular Editor 3 (suponiendo que tengas acceso administrativo a la instancia de Analysis Services en la que se encuentra el modelo implementado). -El párrafo anterior ofrece un buen motivo para usar el enfoque de la base de datos de Workspace descrito anteriormente. Cuando estés conectado a una base de datos de Workspace, podrás realizar todas las operaciones de desarrollo, incluida la actualización de datos y las pruebas de la lógica de negocio, dentro de la misma instancia de Tabular Editor 3, sin depender de otras herramientas. +El párrafo anterior ofrece una buena razón para utilizar el enfoque de la base de datos del área de trabajo descrito anteriormente. Cuando esté conectado a una base de datos de área de trabajo, podrá realizar todas las operaciones de desarrollo, incluidas la actualización de datos y las pruebas de la lógica empresarial, dentro de la misma instancia de Tabular Editor 3, sin tener que depender de otras herramientas. diff --git a/localizedContent/es/content/tutorials/new-pbi-model.md b/localizedContent/es/content/tutorials/new-pbi-model.md index e9ec32b81..d6aacdb3b 100644 --- a/localizedContent/es/content/tutorials/new-pbi-model.md +++ b/localizedContent/es/content/tutorials/new-pbi-model.md @@ -1,4 +1,4 @@ ---- +--- uid: new-pbi-model title: Crear un modelo semántico de Power BI author: Daniel Otykier @@ -13,30 +13,29 @@ applies_to: none: true - edition: Business partial: true - note: "Solo puntos de conexión XMLA de Premium por usuario" + note: "Premium Per User XMLA Endpoints Only" - edition: Enterprise full: true --- +# (Tutorial) Creación de su primer modelo semántico de Power BI -# (Tutorial) Cómo crear tu primer modelo semántico de Power BI - -Esta página te guía paso a paso por el proceso de crear un nuevo modelo semántico de Power BI desde cero con Tabular Editor 3. +Esta página te guía a través del proceso de creación de un nuevo modelo semántico de Power BI desde cero utilizando Tabular Editor 3. > [!IMPORTANT] -> La Edición Business de Tabular Editor 3 solo está disponible con [Power BI Premium Per User](https://learn.microsoft.com/fabric/enterprise/powerbi/service-premium-per-user-faq). Para Fabric, Power BI Premium o una capacidad Embedded, debes actualizar a la Edición Enterprise de Tabular Editor 3. En cualquier caso, el Workspace de destino debe permitir el [acceso de lectura y escritura a XMLA](https://learn.microsoft.com/fabric/enterprise/powerbi/service-premium-connect-tools#enable-xmla-read-write); esta es la configuración predeterminada en todas las SKU de capacidad desde junio de 2025. -> -> La Edición de escritorio de Tabular Editor 3 no admite modelos semánticos de Power BI. +> Tabular Editor 3 Edición Business está limitado a [Power BI Premium por usuario](https://learn.microsoft.com/fabric/enterprise/powerbi/service-premium-per-user-faq). Para la capacidad de Fabric, Power BI Premium o Embedded, debe actualizar a Tabular Editor 3 Edición Enterprise. En cualquier caso, el área de trabajo de destino debe permitir el [acceso de lectura/escritura XMLA](https://learn.microsoft.com/fabric/enterprise/powerbi/service-premium-connect-tools#enable-xmla-read-write), que es el valor predeterminado en todos los SKU de capacidad desde junio de 2025. > +> Tabular Editor 3 Desktop Edition no es compatible con los modelos semánticos de Power BI. +> > [Más información](xref:editions). -##### Crear un nuevo modelo semántico +## Creación de un nuevo modelo semántico -1. En el menú Archivo, elige Nuevo > Modelo... o pulsa `CTRL+N` +1. En el menú Archivo, seleccione Nuevo > Modelo... o pulse `CTRL+N` ![Nuevo modelo](~/content/assets/images/tutorials/new-pbi-model.png) -- Indica un nombre para tu modelo o usa el valor predeterminado. Luego, establece el nivel de compatibilidad en "1706 (Power BI / Fabric)". -- Para obtener la mejor experiencia de desarrollo, marca la opción "Usar base de datos del Workspace". Esto requiere que tengas un Workspace de desarrollo disponible en Power BI, con el punto de conexión XMLA de lectura/escritura habilitado. Al hacer clic en Aceptar, se te pedirá que introduzcas la cadena de conexión del Workspace de Power BI en el que quieres que se cree la base de datos del Workspace. +- Proporcione un nombre para su modelo o use el valor predeterminado. A continuación, establezca el nivel de compatibilidad como «1706 (Power BI / Fabric)». +- Para disfrutar de la mejor experiencia de desarrollo, marque la opción «Usar base de datos del área de trabajo». Para ello, debes tener un área de trabajo de desarrollo disponible en Power BI, con la lectura/escritura de XMLA habilitada. Cuando haga clic en «Aceptar», se le pedirá que introduzca la cadena de conexión del área de trabajo de Power BI en la que desea que se cree la base de datos del área de trabajo. > [!NOTE] -> Con una base de datos del Workspace, puedes validar Power Query (expresiones M) e importar el esquema de la tabla desde expresiones de Power Query. También puedes actualizar y consultar datos en la base de datos del Workspace, lo que facilita la depuración y las pruebas de tus expresiones DAX. +> Con una base de datos de área de trabajo, puede validar Power Query (expresiones M) e importar el esquema de tabla desde expresiones de Power Query. También puede actualizar y consultar datos en la base de datos del área de trabajo, lo que facilita la depuración y la prueba de sus expresiones DAX. diff --git a/localizedContent/es/content/whats-new/3-18-0.html b/localizedContent/es/content/whats-new/3-18-0.html index 788bf22b6..24a7bcfb4 100644 --- a/localizedContent/es/content/whats-new/3-18-0.html +++ b/localizedContent/es/content/whats-new/3-18-0.html @@ -4,7 +4,7 @@

Tabular Editor 3.18.0

  • DAX Optimizer integration is GA and includes 4 free runs per day for Tabular Editor 3 Enterprise Edition customers
  • One-click DAX improvements and refactorings with the new code actions feature
  • Explicit authentication against XMLA endpoints, using Microsoft Entra MFA
  • -
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • +
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • Set your own number of recent items in the preferences - default is 10
  • Fixed several bugs including ensuring DAX Debugger support for FormatString measures in DAX Queries
  • And more...
  • diff --git a/localizedContent/es/content/whats-new/3-18-1.html b/localizedContent/es/content/whats-new/3-18-1.html index 4a4213f22..db3a3be62 100644 --- a/localizedContent/es/content/whats-new/3-18-1.html +++ b/localizedContent/es/content/whats-new/3-18-1.html @@ -4,7 +4,7 @@

    Tabular Editor 3.18.1

  • DAX Optimizer integration is GA and includes 4 free runs per day for Tabular Editor 3 Enterprise Edition customers
  • One-click DAX improvements and refactorings with the new code actions feature
  • Explicit authentication against XMLA endpoints, using Microsoft Entra MFA
  • -
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • +
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • Set your own number of recent items in the preferences - default is 10
  • Fixed several bugs including ensuring DAX Debugger support for FormatString measures in DAX Queries
  • And more...
  • diff --git a/localizedContent/es/content/whats-new/3-18-2.html b/localizedContent/es/content/whats-new/3-18-2.html index cd2ad7a73..a37721ec0 100644 --- a/localizedContent/es/content/whats-new/3-18-2.html +++ b/localizedContent/es/content/whats-new/3-18-2.html @@ -4,7 +4,7 @@

    Tabular Editor 3.18.2

  • DAX Optimizer integration is GA and includes 4 free runs per day for Tabular Editor 3 Enterprise Edition customers
  • One-click DAX improvements and refactorings with the new code actions feature
  • Explicit authentication against XMLA endpoints, using Microsoft Entra MFA
  • -
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • +
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • Set your own number of recent items in the preferences - default is 10
  • Fixed several bugs including ensuring DAX Debugger support for FormatString measures in DAX Queries
  • And more...
  • diff --git a/localizedContent/es/content/whats-new/3-26-0.html b/localizedContent/es/content/whats-new/3-26-0.html new file mode 100644 index 000000000..a99676ef7 --- /dev/null +++ b/localizedContent/es/content/whats-new/3-26-0.html @@ -0,0 +1,12 @@ +

    Tabular Editor 3.26.0

    +

    Release blog: March 2026 (v. 3.26.0, release notes)

    +
      +
    • AI Assistant (Public Preview): A built-in assistant for common semantic model development tasks -- explore your model, write DAX queries, generate C# scripts, run BPA analysis and more. Bring your own API key and privacy guards. Read the announcement.
    • +
    • Run script with preview: A new option for C# scripts that snapshots your model before execution and shows a side-by-side diff of all changes, letting you review and accept or revert them.
    • +
    • New built-in BPA rule: Detects User-Defined Functions without compound names (separators), preventing future naming conflicts with built-in DAX functions.
    • +
    • Expanded C# scripting accessors: Complete singular and plural Selected.* accessor support for all object types, including roles, KPIs, calendars, calculation items, functions and more.
    • +
    • Workspace database improvements: Tabular Editor now detects changes to incremental refresh Source Expression or Polling Expression and prompts before overwriting workspace partitions.
    • +
    • TOM Explorer table groups toggle: New toolbar button to show or hide table groups directly from the TOM Explorer.
    • +
    • New DAX function support: TABLEOF, NAMEOF (table references), DATESINPERIOD EndBehavior parameter.
    • +
    • Various bugfixes including Calendar Editor, DAX Debugger Call Tree, M Editor comment highlighting and C# script editor autocomplete. See release notes for details.
    • +
    diff --git a/localizedContent/es/content/whats-new/3-26-1.html b/localizedContent/es/content/whats-new/3-26-1.html new file mode 100644 index 000000000..564fd0372 --- /dev/null +++ b/localizedContent/es/content/whats-new/3-26-1.html @@ -0,0 +1,12 @@ +

    Tabular Editor 3.26.1

    +

    Release blog: March 2026 (v. 3.26.1, release notes)

    +
      +
    • AI Assistant (Public Preview): A built-in assistant for common semantic model development tasks -- explore your model, write DAX queries, generate C# scripts, run BPA analysis and more. Bring your own API key and privacy guards. Read the announcement.
    • +
    • Run script with preview: A new option for C# scripts that snapshots your model before execution and shows a side-by-side diff of all changes, letting you review and accept or revert them.
    • +
    • New built-in BPA rule: Detects User-Defined Functions without compound names (separators), preventing future naming conflicts with built-in DAX functions.
    • +
    • Expanded C# scripting accessors: Complete singular and plural Selected.* accessor support for all object types, including roles, KPIs, calendars, calculation items, functions and more.
    • +
    • Workspace database improvements: Tabular Editor now detects changes to incremental refresh Source Expression or Polling Expression and prompts before overwriting workspace partitions.
    • +
    • TOM Explorer table groups toggle: New toolbar button to show or hide table groups directly from the TOM Explorer.
    • +
    • New DAX function support: TABLEOF, NAMEOF (table references), DATESINPERIOD EndBehavior parameter.
    • +
    • Various bugfixes including Calendar Editor, DAX Debugger Call Tree, M Editor comment highlighting and C# script editor autocomplete. See release notes for details.
    • +
    diff --git a/localizedContent/es/content/whats-new/3-26-2.html b/localizedContent/es/content/whats-new/3-26-2.html new file mode 100644 index 000000000..5f8f18ae2 --- /dev/null +++ b/localizedContent/es/content/whats-new/3-26-2.html @@ -0,0 +1,11 @@ +

    Tabular Editor 3.26.2

    +

    Release blog: June 2026 (v. 3.26.2, release notes)

    +
      +
    • DAX UDFs are generally available: DAX user-defined functions are now GA. Tabular Editor 3.26.2 supports their syntax and metadata for models at compatibility level 1702 or higher, so you can package logic once and reuse it in measures, calculated columns, visual calculations, and other functions. Learn more.
    • +
    • Optional parameters for DAX UDFs: A parameter can now carry a default expression, keeping the common case short while the edge cases stay configurable. The Semantic Analyzer also warns when an argument doesn't match a parameter's declared type.
    • +
    • New NAMEOF parameters: Tabular Editor 3.26.2 understands the optional component and escaped parameters introduced in Power BI Desktop's April 2026 update -- validating them as you type, suggesting calendars alongside tables, columns, and measures, and updating table references inside NAMEOF during formula fixup.
    • +
    • Move tables to groups from the context menu: Right-click one or more selected tables in the TOM Explorer to move them into a Table Group or remove them. The new Move to group submenu lists your existing groups, plus a (New...) entry that creates a group from the selection and a (None) entry that clears the assignment.
    • +
    • Semantic Bridge supports metric view YAML 1.1 (Enterprise): Importing a Databricks Metric View now carries more metadata -- display names, descriptions, and format strings -- into the generated semantic model, with improved SQL-to-DAX translation and support for snowflake schemas with nested joins.
    • +
    • Also in the Tabular Editor CLI: these DAX language and semantic analysis improvements are available in te-cli, helping with scripting operations and giving agents better DAX results.
    • +
    • Other fixes include more reliable Data Preview sorting and pagination across storage modes, several Semantic Analyzer corrections, and Update Table Schema working on mixed selections and Table Groups. See release notes for details.
    • +
    diff --git a/localizedContent/es/content/whats-new/3-26-3.html b/localizedContent/es/content/whats-new/3-26-3.html new file mode 100644 index 000000000..e0d8ca304 --- /dev/null +++ b/localizedContent/es/content/whats-new/3-26-3.html @@ -0,0 +1,11 @@ +

    Tabular Editor 3.26.3

    +

    Release blog: June 2026 (v. 3.26.3, release notes)

    +
      +
    • DAX UDFs are generally available: DAX user-defined functions are now GA. Tabular Editor 3.26.2 and higher supports their syntax and metadata for models at compatibility level 1702 or higher, so you can package logic once and reuse it in measures, calculated columns, visual calculations, and other functions. Learn more.
    • +
    • Optional parameters for DAX UDFs: A parameter can now carry a default expression, keeping the common case short while the edge cases stay configurable. The Semantic Analyzer also warns when an argument doesn't match a parameter's declared type.
    • +
    • New NAMEOF parameters: Tabular Editor 3.26.2 and higher understands the optional component and escaped parameters introduced in Power BI Desktop's April 2026 update -- validating them as you type, suggesting calendars alongside tables, columns, and measures, and updating table references inside NAMEOF during formula fixup.
    • +
    • Move tables to groups from the context menu: Right-click one or more selected tables in the TOM Explorer to move them into a Table Group or remove them. The new Move to group submenu lists your existing groups, plus a (New...) entry that creates a group from the selection and a (None) entry that clears the assignment.
    • +
    • Semantic Bridge supports metric view YAML 1.1 (Enterprise): Importing a Databricks Metric View now carries more metadata -- display names, descriptions, and format strings -- into the generated semantic model, with improved SQL-to-DAX translation and support for snowflake schemas with nested joins.
    • +
    • Also in the Tabular Editor CLI: these DAX language and semantic analysis improvements are available in te-cli, helping with scripting operations and giving agents better DAX results.
    • +
    • Other fixes include more reliable Data Preview sorting and pagination across storage modes, several Semantic Analyzer corrections, and Update Table Schema working on mixed selections and Table Groups. See release notes for details.
    • +
    diff --git a/localizedContent/es/content/whats-new/index.html b/localizedContent/es/content/whats-new/index.html index 08c7cd070..d5556b17d 100644 --- a/localizedContent/es/content/whats-new/index.html +++ b/localizedContent/es/content/whats-new/index.html @@ -46,14 +46,15 @@

    Community

    Ask questions, suggest enhancements and help other TE fans get their answers at our GitHub community:

    Articles

    Share your favorite blog or SoMe post with the community

    Video

    @@ -85,12 +86,9 @@

    Tabular Editor Learn

    Meet the team

    The Tabular Editor Team will be at the following conferences:

    diff --git a/localizedContent/zh/.translation-status.json b/localizedContent/zh/.translation-status.json index f85892cf9..746818f25 100644 --- a/localizedContent/zh/.translation-status.json +++ b/localizedContent/zh/.translation-status.json @@ -15,7 +15,7 @@ "status": "translated" }, "features/ai-assistant.md": { - "sourceHash": "sha256:f408187864a033df9803ec001397d671d7d2661b82c6aefcdae02e4bf77e22fc", + "sourceHash": "sha256:653e705ba399c654e40c36883e8821688545725b1f1657df3133c8f4629b7d7b", "status": "translated" }, "features/ai-audit-log.md": { @@ -23,7 +23,7 @@ "status": "translated" }, "features/auto-reload.md": { - "sourceHash": "sha256:12a094cafa3b8bcd0d1143ab195cd05c04cce7aceda6d897e9c63276420524fe", + "sourceHash": "sha256:1b25013ea7ca0df1506f97af0d79d1da0fe83c27f1fa19f9f8fa73e039c7f9b4", "status": "translated" }, "features/Best-Practice-Analyzer.md": { @@ -207,15 +207,15 @@ "status": "translated" }, "features/dax-debugger.md": { - "sourceHash": "sha256:2edb8f85458de285384d61b1bd055fda7ff1f02e451a601cb555acac25c64f50", + "sourceHash": "sha256:240c1f8e4048f7cf6ab8c97e779b96cb212c203f9200de5b6183be205b89cde9", "status": "translated" }, "features/dax-editor.md": { - "sourceHash": "sha256:b8456895d28fb1c0ac0e2e78432a85e2d85bdf9ae2aa1e2d9c9edb2784e55923", + "sourceHash": "sha256:a2a254e8b33e5325bfef77305993edd6b3cc92ff7f7830e8d1d58eb71415ee08", "status": "translated" }, "features/dax-optimizer-integration.md": { - "sourceHash": "sha256:7f360b8d39e0a763558717f52a112f4e908cd7e30b99c94580b0f478277858f1", + "sourceHash": "sha256:99732043836a08d92b3e06d9215483d6711ec71964f26bb5e38ca466a294391f", "status": "translated" }, "features/dax-package-manager.md": { @@ -223,7 +223,7 @@ "status": "translated" }, "features/dax-query.md": { - "sourceHash": "sha256:43d7d61f433e79310e7af7d7e44e34ffa6f80b49df061b34d91f9285a55131d4", + "sourceHash": "sha256:cfc810bcddec30cd43d0f71a516b57a5cbbe240900a372f9d255b4d508ab7f18", "status": "translated" }, "features/dax-scripts.md": { @@ -231,7 +231,7 @@ "status": "translated" }, "features/deployment.md": { - "sourceHash": "sha256:ccf07d6fb575c9a62fa94e4e5b3ba9e41543a57b1b651441ecdde3eabe98b0f2", + "sourceHash": "sha256:59c740eeb41c5812656c4ecdf7add21b676c2ef38dcda6e8b955e8d08a39b728", "status": "translated" }, "features/hierarchical-display.md": { @@ -247,11 +247,11 @@ "status": "translated" }, "features/mcp-server.md": { - "sourceHash": "sha256:9fbfc101f7c6f4a71721ef6382610bdec5123aa3ddd0f4728ee93852bf4f8196", + "sourceHash": "sha256:11b33ab0816ca299b20337ffce43acefead22d00f79b0e7cad01500f51b2ca0c", "status": "translated" }, "features/metadata-translation-editor.md": { - "sourceHash": "sha256:7dd826b950714972b3429347f09fed22bcdbaf3f149e4f47dc6382ecf26e69e5", + "sourceHash": "sha256:9da3d1822e843167af66095f47aaf417f6868dc20d31ed081cb914e7682e1cbf", "status": "translated" }, "features/perspective-editor.md": { @@ -259,7 +259,7 @@ "status": "translated" }, "features/pivot-grid.md": { - "sourceHash": "sha256:13469e84b4715d3989eb9f9220222807cad8eaa30bb5dc6eb1837da1e13d82ee", + "sourceHash": "sha256:8b5e42ebb25a83fb72a1dd42178826b3e07c9ca59d91e76d2e922efee202d417", "status": "translated" }, "features/refresh-overrides.md": { @@ -299,7 +299,7 @@ "status": "translated" }, "features/Semantic-Model/direct-lake-sql-model.md": { - "sourceHash": "sha256:7f45a897ce4afe418c209f05ba10729e24bba2a60d8710191bfd66051336293b", + "sourceHash": "sha256:73344d63079311e84f9818b64bfc4ee152c34968b77b2096ff54785a3a7a8eb2", "status": "translated" }, "features/Semantic-Model/direct-query-over-as.md": { @@ -375,11 +375,11 @@ "status": "translated" }, "features/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:7dc2adbeda0cb31f2e08f9530d215f40d39da97a305b2d70c361c71377a687cf", + "status": "translated" }, "features/unsaved-changes.md": { - "sourceHash": "sha256:b4276f4a2d3144459dfc5e6fa6f6e71d560547cad60cc6c6227c8a2207fc3651", + "sourceHash": "sha256:f93949808fcb3a5667d510775e7332f7cb5bc9abe646876e577513435792113d", "status": "translated" }, "features/Useful-script-snippets.md": { @@ -423,7 +423,7 @@ "status": "translated" }, "features/views/messages-view.md": { - "sourceHash": "sha256:c444a771025eab4067d298298fa8391fd1e0157c38582320b097f9d2320d4657", + "sourceHash": "sha256:db0847f6ed1bf009751ad3aa4ada7c220f90f78cb4757bb35fa47d7d3c0a4715", "status": "translated" }, "features/views/properties-view.md": { @@ -435,7 +435,7 @@ "status": "translated" }, "features/views/user-interface.md": { - "sourceHash": "sha256:7e6a431584ea6e620b932f5ff895cea2a9a28faecc253b212fe62b033ed833c7", + "sourceHash": "sha256:2227d849e02e4070d711ebfccd5753903cdaf829555cab0d47a2fbb43933add9", "status": "translated" }, "features/Workspace-Database.md": { @@ -463,7 +463,7 @@ "status": "translated" }, "getting-started/creating-and-testing-dax.md": { - "sourceHash": "sha256:326a4af18f1bacea3e4b6a52d44c336bab3495074918c9cf49722d2e579a561f", + "sourceHash": "sha256:836430b3198033ceaa17a90143a25c7d46e8c1142fc98348688d14668eb46ba0", "status": "translated" }, "getting-started/cs-scripts-and-macros.md": { @@ -507,7 +507,7 @@ "status": "translated" }, "getting-started/installation.md": { - "sourceHash": "sha256:ef3f254c8f8def44e84251f71974aec719f3b23b69dd37d3c5bc343b3a53ed8a", + "sourceHash": "sha256:8e3e0f91d19b41b20234ddeb9205f1899488c93dfffe2e3573388426a972e5ce", "status": "translated" }, "getting-started/migrate-from-desktop.md": { @@ -539,7 +539,7 @@ "status": "translated" }, "getting-started/refresh-preview-query.md": { - "sourceHash": "sha256:3bdec39f290189d4f7a9e60eebcaf4eed6a54db750203a2d1bf692927d4fa5c7", + "sourceHash": "sha256:d0e7a9eb57432d790cdaed210b05766df549b82e124d70f0000358cfd176abf4", "status": "translated" }, "getting-started/sharing-macros-bpa-rules.md": { @@ -547,8 +547,8 @@ "status": "translated" }, "getting-started/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:adf238552f81c08ae51d0b01e45e454d85808fa4cb5f0346102572f8c292fd10", + "status": "translated" }, "getting-started/training-telearn.md": { "sourceHash": "sha256:cba2b907335edf7e1310d6323c063305cbed3c66013758b932d91466394b4d85", @@ -595,7 +595,7 @@ "status": "translated" }, "how-tos/Advanced-Filtering-of-the-Explorer-Tree.md": { - "sourceHash": "sha256:65c40ce723d4b32aff6b4591f2bbc7b92f9efcc4d8f5fee3beeeaf4faf58cd71", + "sourceHash": "sha256:88282c7d6522f7528d4115587a3f6a37c0d26be56435f14d66005adbb0770c79", "status": "translated" }, "how-tos/Advanced-Scripting.md": { @@ -611,15 +611,15 @@ "status": "translated" }, "how-tos/deploy-current-model.md": { - "sourceHash": "sha256:678aaf20d780c1b7489968a3ddd0dc11553f102e5db763a0d545b49e368b5301", + "sourceHash": "sha256:58521385386ec88ac53dd46854e7567f35e5616760dab3bc173cfda4ff3d84b4", "status": "translated" }, "how-tos/drag-drop.md": { - "sourceHash": "sha256:56d2daf749079cedf7edccdd1a6981c5cfc49aadfd04b91a2f7a95f481c2e3b9", + "sourceHash": "sha256:0426f2b83c294640fed1d3a435902ee1221d185985da9b78e3ce35ad7dede0c3", "status": "translated" }, "how-tos/duplicate-batchrename.md": { - "sourceHash": "sha256:c0595217b896e03211f74b7fe747e6f6d9ca610669b0e08fe07ff459e2b39d20", + "sourceHash": "sha256:d3b9138170b47bba94fdedc45130e77ef1d8ffedcb1a4d266f38e6b3b9806591", "status": "translated" }, "how-tos/edit-properties.md": { @@ -631,7 +631,7 @@ "status": "translated" }, "how-tos/formula-fixup-dependencies.md": { - "sourceHash": "sha256:f1b335d4a4c069ac21bdd9c20b0e34ed6442c63307f9d3a1cfdb29e4992daec5", + "sourceHash": "sha256:47edeccaae5f56e9ee945ebb0361b52f61ca0dc746445cb17413f13e5cfdcd1d", "status": "translated" }, "how-tos/import-export-translations.md": { @@ -659,7 +659,7 @@ "status": "translated" }, "how-tos/load-save.md": { - "sourceHash": "sha256:4ac29ac34e1aee8edd2733d947e4519b26dbdef29ba4a372362a644d0488b1c9", + "sourceHash": "sha256:de10907604abecdab5c2b7628b19a6fd4345c1be2ae92a4f0c8b3dd54b342fd4", "status": "translated" }, "how-tos/Master-model-pattern.md": { @@ -671,7 +671,7 @@ "status": "translated" }, "how-tos/perspectives-translations.md": { - "sourceHash": "sha256:65165835a80d24a358493e2af433e6d3833c039846e65fe9977c5d279d0f35f5", + "sourceHash": "sha256:64fcbfd8515d82099b04d79577931bed5fd8e8b440a4e58ef070ff7a17cc367c", "status": "translated" }, "how-tos/powerbi-xmla-pbix-workaround.md": { @@ -771,7 +771,7 @@ "status": "translated" }, "how-tos/semantic-bridge-rename-objects.md": { - "sourceHash": "sha256:888e6e749bc1d666eb315f3186540a12184bc538bfd73ebf97dbf68645c6092e", + "sourceHash": "sha256:3cb819a90b4c798f3f736dda4333bb4ca4757bc37687178bf68e48702389192f", "status": "translated" }, "how-tos/semantic-bridge-serialize.md": { @@ -791,8 +791,8 @@ "status": "translated" }, "how-tos/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:6b2bda5655200d7d8468b139409d10f4024adeb90e0ae3177833c7003df10ec9", + "status": "translated" }, "how-tos/undo-redo.md": { "sourceHash": "sha256:857971043360cef22eb83ee113a0ebbe86160e1250ecfce378e7824e924fcc2d", @@ -1075,7 +1075,7 @@ "status": "translated" }, "references/downloads.md": { - "sourceHash": "sha256:d6f5f62ef64bfef5eab06ef77caad78ee695cd60e12114b7af9774a337063085", + "sourceHash": "sha256:1282a6707c314a8a8f4394fb08390fefb831dcab74679799630ee8d2558df14b", "status": "translated" }, "references/FAQ.md": { @@ -1155,15 +1155,15 @@ "status": "translated" }, "references/policies.md": { - "sourceHash": "sha256:2caab8e0667baf27214a05cd1d8083570418378257a94a739c21abf6060ef5ac", + "sourceHash": "sha256:7a4be238eccce5f3ac219cda6a6824acde17d1d7c36645af7f81cefc5b49a3f2", "status": "translated" }, "references/preferences.md": { - "sourceHash": "sha256:4b727d58249a9c4583c67d0dc40a32ebd45efe9e006f86cf404c53f094e8bcd9", + "sourceHash": "sha256:5d6e1afb9979182cee148aee717272331dc45ac4d34090bee49f433f1a91a9b0", "status": "translated" }, "references/release-history.md": { - "sourceHash": "sha256:78226d0901a9debfe95e062f96697ba023c893852edcf6560dc89296382c0fc1", + "sourceHash": "sha256:216e34e41eb93fb86370730947fc2286cb0d3af22695f0ea6e3bee3a0e6c0bc1", "status": "translated" }, "references/release-notes/3_0_1.md": { @@ -1179,8 +1179,8 @@ "status": "translated" }, "references/release-notes/3_0_3.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:e34eb6b6cc40a550c2b1e5555ab3dd5ae9aab4fe150191da8b217f7e1c44b7f8", + "status": "translated" }, "references/release-notes/3_0_4.md": { "sourceHash": "sha256:0745acfac1154de9e0b61300052c871454382fff3120fa89b0bf5b794522bcb1", @@ -1283,8 +1283,8 @@ "status": "translated" }, "references/release-notes/3_1_2.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:9f7ef93ca36c28f28b2a61b62b7cf68738da2a31a73abbc67ebacd4be6b05915", + "status": "translated" }, "references/release-notes/3_1_3.md": { "sourceHash": "sha256:63da26ecf5029706dd4a732a7494b15ff4df4bbf3d4e1e7743f61b46d979d2ef", @@ -1386,6 +1386,14 @@ "sourceHash": "sha256:0871275249d3bbd3ca332855873c89ed84a476929a2216333724fd61a05bdfc3", "status": "translated" }, + "references/release-notes/3_27_1_0.md": { + "sourceHash": "sha256:c6fc5f3a2f35a2df7ef78a0206485bc8bb3b337a77c75fda7e36ca9648233938", + "status": "translated" + }, + "references/release-notes/3_27_1_1.md": { + "sourceHash": "sha256:431749c4a72f633d7c9d7fbe244f6da012dbaa570a77f50b42df292786498c60", + "status": "translated" + }, "references/release-notes/3_2_0.md": { "sourceHash": "sha256:f80a34035dde22a0619af4ce18d51f59866d2eff27418c893e676f9da877b10c", "status": "translated" @@ -1419,8 +1427,8 @@ "status": "translated" }, "references/release-notes/3_3_4.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:dabac3bc52ea3ecb59ffc39e10a13d252a29530412a604c284cf33fa988e7ccb", + "status": "translated" }, "references/release-notes/3_3_5.md": { "sourceHash": "sha256:b88d6bc31375caca6ccbc5af1f95d1c64a64bac5d5861d540a5a111046ec2709", @@ -1515,11 +1523,11 @@ "status": "translated" }, "references/supported-files.md": { - "sourceHash": "sha256:b914a46e482200adc4b407c54a40cdc4312d5698ff765fc661d83c4b0333b60a", + "sourceHash": "sha256:93d9b802670030915f59f55702d47df2cfd257de11be8bb0ac18171f58f302a1", "status": "translated" }, "references/system-requirements.md": { - "sourceHash": "sha256:1ca5de3bd3440c895a05b276f9bf93d2a5fe80092b93928712c99994712827d1", + "sourceHash": "sha256:b45a50ff74b9dfc6b6409ef77e6e9d0a4a689617fc4c39903540cb4df21e06a5", "status": "translated" }, "references/TabularEditor.TOMWrapper-h.md": { @@ -1527,11 +1535,11 @@ "status": "translated" }, "references/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:dbc3800f9348e300524d13c2beacfc036c700b0df898692e39929d7b4bfcb440", + "status": "translated" }, "references/user-options.md": { - "sourceHash": "sha256:ad092f6088edad3d3e8bd124c227f618338b081a453118946880a2fdc8dccf9d", + "sourceHash": "sha256:c1c940b4529b30a1be9a016f78877c647519695975505908b58abf3ce615ed86", "status": "translated" }, "references/user-settings-files-te2.md": { @@ -1539,7 +1547,7 @@ "status": "translated" }, "security/ai-compliance.md": { - "sourceHash": "sha256:4c6a93c738e015fe6143730853cffa714e10e80d7911eb6ff5f749dda7a364ad", + "sourceHash": "sha256:7ba0a0711d3c14abb5627dac340e887b63c61b2bc08d10a25bfe4af1eddc1870", "status": "translated" }, "security/gdpr-delete.md": { @@ -1555,8 +1563,8 @@ "status": "translated" }, "security/security-privacy.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:ae9530c71a3a786879ad5d50ac6ff917ae5e7dc0e43cd258413cd7a12ec1c7e3", + "status": "translated" }, "security/terms.md": { "sourceHash": "sha256:90fd51f0cff45e9e16b2c200fc4dc3ccf769b97a3c6afcd09b7a688cfc5b87f0", @@ -1567,8 +1575,8 @@ "status": "copied" }, "security/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:aecf5ca69ba24fc448be9fbff14d4662f5b333222a4ddec6bb6a064575481147", + "status": "translated" }, "toc.yml": { "sourceHash": "sha256:11d5df2671e45efed1baf56cd10c6634fc48f5f34b8f40d5b83456258a929108", @@ -1631,8 +1639,8 @@ "status": "translated" }, "troubleshooting/toc.md": { - "sourceHash": "", - "status": "untranslated" + "sourceHash": "sha256:eb90344041259d96a138c386edc99bc3c992c331f293f88539c4deca6fffd323", + "status": "translated" }, "tutorials/calendars.md": { "sourceHash": "sha256:42d5fbcac1800e22943c402afc8cc0ab45ecae62d802ffafb492d37a3e4096b2", @@ -1699,7 +1707,7 @@ "status": "translated" }, "tutorials/new-as-model.md": { - "sourceHash": "sha256:617f37b605f71ee0f770b896db1166d532fa0b21fb5e9c084cccfd12324bcbc9", + "sourceHash": "sha256:aafe64ce672080b50a6cced93d8c852b61559993eac2f36f822441f33286f4b3", "status": "translated" }, "tutorials/new-pbi-model.md": { @@ -1727,126 +1735,154 @@ "status": "translated" }, "whats-new/3-11-0.html": { - "sourceHash": "sha256:8e741c7bee681e80aef9a0cac12b2c4a08193ba1a64e896f825400209a615dd0", - "status": "translated" + "sourceHash": "sha256:f05c90ee23a66c16c7f7e97f10f44e50bdd772f3049b4d0e75def4e1562c6664", + "status": "copied" }, "whats-new/3-12-0.html": { - "sourceHash": "sha256:1185bd5e0f896cf0241dba6051a1d23f8122df33d35ca629751388ca46e5411b", - "status": "translated" + "sourceHash": "sha256:ac4db83ba7bf38d569d8888e29c900ac98bd8528159db2439b310bcb4613ce33", + "status": "copied" }, "whats-new/3-12-1.html": { - "sourceHash": "sha256:0e1800850f435b7939eaf29d4c05564b315198f49bd8a9539dd180c2289aaca4", - "status": "translated" + "sourceHash": "sha256:05454034ab0295fc27adbd530c98851b2c6d978d1297620c005cbac8723068e2", + "status": "copied" }, "whats-new/3-13-0.html": { - "sourceHash": "sha256:fe072740d52a6d0664d5a54627f904603dca096280c9a0c3e4d67fa0dfa89236", - "status": "translated" + "sourceHash": "sha256:338340ce38e3d4e0c78ca8939e9f682a39a84144c10c7775b2ebd45fd0a013d8", + "status": "copied" }, "whats-new/3-14-0.html": { - "sourceHash": "sha256:516c949f7443084eeb6e3c4c5981e5ff4960ddd65622dd0f34b5b9c47b81431e", - "status": "translated" + "sourceHash": "sha256:0ebf84c1ed96b8df959859fedb4294d14f1a785f7d90c898a23552a840a5d66e", + "status": "copied" }, "whats-new/3-15-0.html": { - "sourceHash": "sha256:21384e1d1473d31ef1d1076640a94dc9f48033a072ae9e56e37b700954319083", - "status": "translated" + "sourceHash": "sha256:be61fe699768f176d186e6121c697e035fabed64aa567550d5e9636e31ee0b5c", + "status": "copied" }, "whats-new/3-16-0.html": { - "sourceHash": "sha256:2ea751dad6a56088eb1e35934df0e3def7ceb65e15877e869778a2c946bbb322", - "status": "translated" + "sourceHash": "sha256:305e03f418ff43c6b4462466e6df3a048aabbdd677da448067f9f63e9d4131da", + "status": "copied" }, "whats-new/3-17-0.html": { - "sourceHash": "sha256:5d0ae23d2d1a98813d3c06f3c50039838fe3b4e024ef3b4d61462469d9d904a3", - "status": "translated" + "sourceHash": "sha256:66246fbfd6abce8bb7bd60f3c922f470b96c4a78315fbf1a9b862db29983b50c", + "status": "copied" }, "whats-new/3-17-1.html": { - "sourceHash": "sha256:5d0ae23d2d1a98813d3c06f3c50039838fe3b4e024ef3b4d61462469d9d904a3", - "status": "translated" + "sourceHash": "sha256:66246fbfd6abce8bb7bd60f3c922f470b96c4a78315fbf1a9b862db29983b50c", + "status": "copied" }, "whats-new/3-18-0.html": { - "sourceHash": "sha256:379bc949c979ed11804eacb3090b760cb0b67f7e10d4a01b1b7e314b1fe98739", - "status": "translated" + "sourceHash": "sha256:11676c6ea80f5de2ee940db6e5e07bfb1c4d654c363ce8172034e56ea09ad766", + "status": "copied" }, "whats-new/3-18-1.html": { - "sourceHash": "sha256:264150226e01169f6dd8569bb48d8c13192aedd54d78d17b51df115ca260c0c9", - "status": "translated" + "sourceHash": "sha256:f38aa0f26bb0eec38c07d2926df761a9237ae36fdb8903b71e4b1a115897ef3c", + "status": "copied" }, "whats-new/3-18-2.html": { - "sourceHash": "sha256:07289f60b049811a09e673f8642fe4dcbc50efddb8ad77718cf55d16e4b69200", - "status": "translated" + "sourceHash": "sha256:3aaee936b3713c578ac67b6bf55cfd638a90fd2d1fdca3b9d06d971af73da0ce", + "status": "copied" }, "whats-new/3-19-0.html": { - "sourceHash": "sha256:264b6c6843e8a6c737c5e88953856e08a9ece0ebd39ac78b2a58cef1b69796db", - "status": "translated" + "sourceHash": "sha256:c97ca1eaa3a079bbe8ee4ce15231468a917535875b99bf94b66dbfe850ea78f1", + "status": "copied" }, "whats-new/3-20-0.html": { - "sourceHash": "sha256:165affb599d769434c2e227fc63aa174509c08ec5a501e357ff028b3bb26bbd7", - "status": "translated" + "sourceHash": "sha256:800086470837f7c0ef96b37778a29897895b6ecc41e8b6aa6127b8dbed13370a", + "status": "copied" }, "whats-new/3-21-0.html": { - "sourceHash": "sha256:0560eecc9d57bfa393d9415121f00a06c9e0692db7bbf924c81fd5e32f99283c", - "status": "translated" + "sourceHash": "sha256:433f0fca243c8efa8f7e643fc432faaedfc6ea9d43c4ddbabed6c55468c15afb", + "status": "copied" }, "whats-new/3-22-0.html": { - "sourceHash": "sha256:d5c122abcc84f8fdea50724e96e35435f1ce4e71e204cbd4b4bf2822dc98bbb1", - "status": "translated" + "sourceHash": "sha256:d8dadb26e6e39ddb632129d367d22c2512cc8b1cb1f0b4ff9261b2158440fa11", + "status": "copied" }, "whats-new/3-22-1.html": { - "sourceHash": "sha256:65af209383626dfef5ecc828f1d6050cf336ff370c7f3b58c2233352ab39ef02", - "status": "translated" + "sourceHash": "sha256:132726eaf4923afa154e884b8084fb50cde7472a2e18de4ec06a1d8b8ee8d990", + "status": "copied" }, "whats-new/3-23-0.html": { - "sourceHash": "sha256:c8a1848ae04394a58fe7146ebfa57ace75dafed1fbe735e6feba8a43d805ac11", - "status": "translated" + "sourceHash": "sha256:57003c0ce3231886266229e77c19fd45b4e0c8a8d816b79d2af5201117f44630", + "status": "copied" }, "whats-new/3-23-1.html": { - "sourceHash": "sha256:258468e5a7e6f2437aa12b410807dceabf6d5b5060c8607ea88b157ee8dc2b8f", - "status": "translated" + "sourceHash": "sha256:792a9676ccb8bbe2dcf7d1df81d3b3307567e1af2cc15567c78415b2e24d4ec8", + "status": "copied" }, "whats-new/3-24-0.html": { - "sourceHash": "sha256:addd6ae83a458d866e21cf5b566afd011b438d822206582320568f2a5efa2c5b", - "status": "translated" + "sourceHash": "sha256:7f944c252f7a8c422aa266d7a6fc28a9c05ae602a41e7846f04249d4fc48ef6a", + "status": "copied" }, "whats-new/3-24-1.html": { - "sourceHash": "sha256:971a290fd477bc5955d7e55e0868b296e8b4016774ca60206f9e04d719a8e273", - "status": "translated" + "sourceHash": "sha256:c43935a7d057dd95816594b369f06182a924aa6a892fad182b0eabe93a7e9501", + "status": "copied" }, "whats-new/3-24-2.html": { - "sourceHash": "sha256:b4c35a93026703f8aa4b295d1bca544dd64c9fbbd0f191e6c484aaed0d501d02", - "status": "translated" + "sourceHash": "sha256:7a5a2de978c00c85cefdbc798ba050b892549dc039334f947ffffbfd8aa9c6a3", + "status": "copied" }, "whats-new/3-25-0.html": { - "sourceHash": "sha256:ecb851a842a1bb429299b338684019c5e58c5a41d49e50f52bde33460e1d17c4", - "status": "translated" + "sourceHash": "sha256:d64545aff7bba1e17aa5ea0c1a64c25699af771f3b12a5ce4d5a1b6e67f8e28c", + "status": "copied" }, "whats-new/3-25-1.html": { - "sourceHash": "sha256:0164edb73af4cbdf606868a921664852b195a2230d52ae4df0b77028c40ea798", - "status": "translated" + "sourceHash": "sha256:a22b5f95bd8281add36952622203e4249a87421aa1f355eb2b8fabea4d52ebd3", + "status": "copied" }, "whats-new/3-25-2.html": { - "sourceHash": "sha256:d698e79f8caf50a91fb5563c900116a4ed42d0259db6412db4cc0e1a44ad7dca", - "status": "translated" + "sourceHash": "sha256:7dd48026b0f54b9bd1a0087c7a3155cda91de983325d1a59280ff75550f39875", + "status": "copied" }, "whats-new/3-25-3.html": { - "sourceHash": "sha256:fa93ee8ef8188bc519bde65fb7c222301d13ac1867b883028505bc3a5a7e76c0", - "status": "translated" + "sourceHash": "sha256:b005281766f013aba39b364a5233f5a3308bef9fc7c98ddf77a6330d625e8878", + "status": "copied" + }, + "whats-new/3-26-0.html": { + "sourceHash": "sha256:e43a553222c48f862abe7993dc460ee413a0b843c62cc0ad18c8ee4669af8cb1", + "status": "copied" + }, + "whats-new/3-26-1.html": { + "sourceHash": "sha256:68c34fd5ab34fb25fbf53b557a43128c142fdbc69895090ebb76be287698b5d4", + "status": "copied" + }, + "whats-new/3-26-2.html": { + "sourceHash": "sha256:9052c24f89a6030cebc66e1dfe7ae2ee4b5dc2f845c6be3f14f02afa04fdc262", + "status": "copied" + }, + "whats-new/3-26-3.html": { + "sourceHash": "sha256:dccf4025abdb99f91e5f04c0a14759b69591e9ffc4253095f6994516954541bb", + "status": "copied" }, "whats-new/generic.html": { - "sourceHash": "sha256:5db66c26cee732683b90bc9374802446f747ffb7ee43cbbcad0e977805871f2c", - "status": "translated" + "sourceHash": "sha256:2b76277d177968724be678e9d085bf68a7a25d3f6071054d57b096853676bd31", + "status": "copied" }, "whats-new/index.html": { - "sourceHash": "sha256:5b9c85b1dffecec8f9912e589adb5fb38de25f01803f8a3618053f6994580251", - "status": "translated" + "sourceHash": "sha256:56e416db8f0fa9adcc561aa6bfd06d25309358bcd08aa1983a71d1667cbaf05e", + "status": "copied" } }, "summary": { - "translated": 448, + "translated": 432, "outdated": 0, - "untranslated": 10, - "copied": 1, + "untranslated": 0, + "copied": 33, "pinned": 0, - "total": 459, - "completionPercent": 97.8, - "failures": 0 + "total": 465, + "completionPercent": 100.0, + "failures": 2 + }, + "failures": { + "how-tos/xmla-as-connectivity.md": { + "error": "link targets 29 -> 28 (missing ['https://learn.microsoft.com/power-bi/enterprise/service-premium-connect-tools#duplicate-workspace-names'], added [])", + "at": "2026-10-23T11:05:21Z", + "sourceHash": "sha256:1327f49f78176015f7f08cd552b754ea50c38b1c375c04b77da2637df323b550" + }, + "tutorials/new-pbi-model.md": { + "error": "headings 2 -> 1", + "at": "2026-10-23T11:05:48Z", + "sourceHash": "sha256:8503350984bdac5e40c759969b1fb791033bfe39c86aff6addee287ff8030458" + } } } diff --git a/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md b/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md index d913dbaf0..aadf16c10 100644 --- a/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md +++ b/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md @@ -1,6 +1,6 @@ ---- +--- uid: direct-lake-sql-model -title: SQL 语义模型上的 Direct Lake +title: Direct Lake on SQL 语义模型 author: Morten Lønskov updated: 2026-10-12 applies_to: @@ -18,55 +18,57 @@ applies_to: --- # Direct Lake 语义模型 - -SQL 语义模型上的 Direct Lake 可通过 SQL 端点直接连接到存储在 [Fabric 中的 OneLake](https://learn.microsoft.com/fabric/onelake/onelake-overview) 中的数据源。 +Direct Lake on SQL 语义模型通过 SQL 端点直接连接到存储在 [Fabric 中的 OneLake](https://learn.microsoft.com/fabric/onelake/onelake-overview) 中的数据源。 > [!IMPORTANT] -> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,Tabular Editor 3 支持在 OneLake 上使用 Direct Lake,且在大多数情况下建议采用此方式。更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 +> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,Tabular Editor 3 支持 Direct Lake on OneLake,在大多数情况下都建议使用此功能。有关详细信息,请参阅我们的[Direct Lake 指南](xref:direct-lake-guidance)文章。 -Tabular Editor 3 可以创建并连接此类模型。有关本主题的教程,请参阅我们的博客文章:[Direct Lake 语义模型:如何在 Tabular Editor 中使用它们](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/)。 -Tabular Editor 3 可以通过 Lakehouse 和 Warehouse SQL Endpoint 创建 Direct Lake 语义模型。 +Tabular Editor 3 可以创建此类模型并连接到此类模型。有关这方面的教程,请参阅我们的博客文章:[Direct Lake 语义模型:如何在 Tabular Editor 中使用它们](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/)。 +Tabular Editor 3 可以使用湖仓和数据仓库 SQL 端点创建 Direct Lake 语义模型。 -Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于创建新表或 Direct Lake 语义模型的内置功能。这需要手动完成,或使用 C# Script 来实现。 +Tabular Editor 2 可以连接到 Direct Lake 语义模型,但没有任何内置功能可用于创建新表或 Direct Lake 语义模型。这需要手动完成或使用 C# 脚本完成。 > [!NOTE] > **Direct Lake 的限制** -> Direct Lake 模型可进行的更改存在一些限制。有关完整列表,请参阅 [Direct Lake 的注意事项和限制](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations)。另见 [SQLBI 的这篇文章](https://www.sqlbi.com/blog/marco/2024/04/06/direct-lake-vs-import-mode-in-power-bi/),了解如何在 Direct Lake 和导入模式之间做出选择。 +> 对 Direct Lake 模型可以进行的更改存在多项限制。请参阅[Direct Lake 的注意事项和限制](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations),了解完整列表。另请参阅[SQLBI 的这篇文章](https://www.sqlbi.com/blog/marco/2024/04/06/direct-lake-vs-import-mode-in-power-bi/),了解有关在 Direct Lake 和导入模式之间进行选择的概述。 -## 在 Tabular Editor 3 中创建基于 SQL 的 Direct Lake 模型 +## 在 Tabular Editor 3 中创建 Direct Lake on SQL 模型 -在 Tabular Editor 3(3.15.0 或更高版本)中创建基于 SQL 的 Direct Lake 模型时,需要在创建模型时于 _New Model_ 对话框中勾选 Direct Lake 复选框进行指定。 +在 Tabular Editor 3 (3.15.0 或更高版本) 中创建 Direct Lake on SQL 模型时,必须在“_新建模型_”对话框中通过勾选“Direct Lake”复选框来指定。 ![Direct Lake 新建模型](~/content/assets/images/common/DirectLakeNewModelDialog.png) -使用该复选框可确保设置 Direct Lake 特有的属性与注释,并将表的导入限制为 Direct Lake 支持的数据源。 +使用此复选框可确保设置 Direct Lake 特有属性和批注,并将表的导入限制为 Direct Lake 支持的源。 > [!NOTE] -> 基于 SQL 的 Direct Lake 模型当前使用的排序规则与常规 Power BI 导入语义模型不同。这可能会导致在查询模型或在 DAX 代码中引用对象名称时得到不同的结果。更多信息见 Kurt Buhler 的这篇博文:[Power BI 中区分大小写的模型:影响与注意事项](https://data-goblins.com/power-bi/case-specific)。 +> Direct Lake on SQL 模型目前使用的排序规则与常规 Power BI 导入语义模型不同。这可能会导致在查询模型时或在 DAX 代码中引用对象名称时产生不同的结果。 +> 有关更多信息,请参阅 Kurt Buhler 的这篇博客文章:[Power BI 中的区分大小写模型:影响和注意事项](https://data-goblins.com/power-bi/case-specific)。 > [!IMPORTANT] -> 从 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 开始,“新建模型”对话框中已移除 Direct Lake 复选框。如果在 SQL 上使用 Direct Lake,你必须[手动将模型的排序规则设置为与 Fabric Warehouse 的排序规则一致](xref:direct-lake-guidance#collation)。 +> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,“新建模型”对话框中已删除“Direct Lake”复选框。如果使用 Direct Lake on SQL,您必须[手动设置模型的排序规则,使其与 Fabric 仓库的排序规则相匹配](xref:direct-lake-guidance#collation)。 + +## 构建新模型和表格导入 + +Tabular Editor 3(3.15.0 或更高版本)在首次部署时自动对模型进行建模(刷新)。这是为了确保激活 Direct Lake 模式,否则模型将自动回退到 DirectQuery。 -## 为新模型和表导入设定框架 +此外,在导入新表时,Tabular Editor 3(3.15.0 或更高版本)会在下次保存模型时对其进行构架(刷新)。此首选项位于**工具 > 首选项 > 模型部署 > 数据刷新**下。 -Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。这是为了确保启用 Direct Lake 模式;否则模型会自动回退到 DirectQuery。 -此外,在导入新表后,Tabular Editor 3(3.15.0 或更高版本)会在你下次保存模型时对模型进行 framing(刷新)。该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 ## 识别 Direct Lake 模型 +Tabular Editor 3 标题栏在模型名称后显示打开的模型的存储模式,例如 **(Direct Lake)**、**(DirectQuery)** 或 **(Import)**。如果模型包含多种表格模式,则标题栏显示 **(复合)**。TOM 资源管理器显示每个表的类型和模式(导入、DirectQuery、双重或 Direct Lake)。Direct Lake on SQL 模型不能包含处于导入、DirectQuery 或双重模式的表。 -Tabular Editor 顶部的标题栏会显示该 Tabular Editor 实例中当前打开的是哪种类型的模型。此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。如果模型混用了多种表模式,标题栏将显示“混合”。目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 ## 将 Direct Lake 模型转换为导入模式 -下面的 C# Script 会将现有模型转换为导入模式。如果你的模型对数据延迟的要求不高,无需 Direct Lake,或者你想避开 Direct Lake 模型的限制,但已经在 Fabric 中开始构建 Direct Lake 模型,那么这会很有用。 +以下 C# 脚本将现有模型转换为导入模式。如果您的模型的数据延迟要求不需要 Direct Lake,或者您想避免 Direct Lake 模型的限制,但已经开始在 Fabric 中构建一个 Direct Lake 模型,则此操作可能很有用。 -当 Tabular Editor 通过 XMLA endpoint 连接到语义模型后,即可运行该脚本。不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。为规避这一限制,建议使用“Model > Deploy...”选项。这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 +当 Tabular Editor 通过 XMLA 端点连接到语义模型时,可以运行该脚本。但是,Microsoft 不支持将更改直接保存回 Power BI/Fabric 工作区。为了规避这个问题,建议的方法是使用“模型 > 部署…”选项。这样,就可以将新转换的模型作为新实体部署到工作区中。 > [!NOTE] -> 部署新转换的导入模式模型后,你需要指定用于访问 Lakehouse 的凭据,才能将数据刷新到模型中。 +> 部署新转换的导入模式模型后,您需要指定访问 Lakehouse 的凭据,以便将数据刷新到模型中。 -### 将 Direct Lake 模型转换为导入模式的 C# Script +### 用于将Direct Lake模型转换为导入模式的C#脚本 ```csharp // ********************************************************************************** diff --git a/localizedContent/zh/content/features/ai-assistant.md b/localizedContent/zh/content/features/ai-assistant.md index c06eebacd..a4356f425 100644 --- a/localizedContent/zh/content/features/ai-assistant.md +++ b/localizedContent/zh/content/features/ai-assistant.md @@ -17,264 +17,269 @@ applies_to: - edition: Enterprise full: true --- - # AI 助手 -AI 助手是用于语义模型开发的聊天面板。它会浏览模型元数据、编写并运行 DAX 查询、生成 C# Script、运行 Best Practice Analyzer 检查、查询 VertiPaq分析器统计信息,并搜索 Tabular Editor 知识库。[权限设置](#permissions-and-consent) 控制它会向你的 AI 提供程序发送哪些内容。 AI 助手已通过独立渗透测试;你可以查看 [Tabular Editor 信任中心](https://trust.tabulareditor.com)。 +AI 助手是一个用于语义模型开发的聊天面板。它会探索您的模型元数据、编写并运行 DAX 查询、生成 C# 脚本、解释并修复您的模型和已打开文档中的错误、运行 Best Practice Analyzer 检查、查询 VertiPaq Analyzer 统计数据并搜索 Tabular Editor 知识库。[权限设置](#permissions-and-consent)控制它向您的 AI 提供商发送的内容。AI 助手已通过独立渗透测试;请参阅[Tabular Editor 信任中心](https://trust.tabulareditor.com)。 + +AI 助手采用“自带密钥”模式,即您提供来自受支持提供商之一的 API 密钥,助手直接针对该提供商的 API 运行。 -AI 助手采用自带密钥(BYOK)模式,你提供来自某个受支持提供商的 API 密钥,助手会直接调用该提供商的 API。 +您还可以通过 [MCP 服务器](xref:mcp-server)使用自己的代理,无需 API 密钥。Claude Code、GitHub Copilot、VS Code 代理模式、Codex 或 Cursor 等代理在开放模型上使用与聊天相同的工具和权限设置,但会话和每个模型的授权除外,这些授权仅适用于聊天。请参阅[MCP 服务器和 AI 助手的区别](#mcp-server-and-ai-assistant-differences)。 -你也可以通过 [MCP 服务器](xref:mcp-server) 使用自己的代理,无需 API 密钥。 Claude Code、GitHub Copilot、VS Code 代理模式、Codex 或 Cursor 等代理,可在打开的模型上使用与聊天相同的工具和权限设置进行操作;但会话级授权和按模型授权除外,这两者仅适用于聊天。查看 [MCP 服务器与 AI 助手的差异](#mcp-server-and-ai-assistant-differences)。 -![AI 助手窗格首次打开时的界面:上方是助手的问候语,列出它能做什么(回答问题、查询模型、编写并执行 C# Script、修改模型)以及不能做什么,下方是空白信息输入框](~/content/assets/images/ai-assistant/ai-assistant-panel-first-open.png) -## 快速入门 +![首次打开的“AI 助手”窗格,助手的问候语列出了它能做什么(回答问题、查询模型、编写和执行 C# 脚本、更改模型)以及它不能做什么,下方是一个空的消息框](~/content/assets/images/ai-assistant/ai-assistant-panel-first-open.png) -1. 依次打开 **工具 > 偏好 > AI 功能 > AI 助手 > AI 提供程序** -2. 选择 AI 提供商(全新安装时默认是 **无(AI 已禁用)**),然后输入你的 API 密钥 -3. 从 **视图 > AI 助手** 打开 AI 助手面板 -4. 输入一条信息并按 **Enter** 键开始对话 +## 开始使用 + +1. 打开**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商** +2. 选择您的 AI 提供商(在新安装时,此项默认为**无(AI 已禁用)**),然后输入您的 API 密钥 +3. 从**视图 > AI 助手**打开 AI 助手面板 +4. 输入消息并按 **Enter** 键开始对话 > [!TIP] -> 我们的 [AI 助手交互式演示](https://demos.tabulareditor.com/psl/of150vcy?) 将逐步讲解设置和使用方法。 +> [AI 助手的交互式演示](https://demos.tabulareditor.com/psl/of150vcy?)介绍了设置和使用方法。 > [!NOTE] -> API 密钥会以加密形式存储在你的本地计算机上。 +> API 密钥以加密形式存储在您的本地计算机上。 -## 支持的提供程序 +## 支持的提供商 -在 **工具 > 偏好 > AI 功能 > AI 助手 > AI 提供商** 中配置 AI 提供商。从下拉列表中选择一个提供商(在你完成配置之前,默认值为 **无(AI 已禁用)**),输入 API 密钥,并可选择覆盖默认模型。 +在**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商**下配置您的 AI 提供商。从下拉列表中选择一个提供商(在您配置提供商之前,默认值为**无(AI 已禁用)**),输入您的 API 密钥,并可选择覆盖默认模型。 -将模型字段留空即可使用提供商的默认模型。 OpenAI 和 Anthropic 都有默认值;Azure OpenAI 和自定义提供程序始终需要填写相应的值。 +将模型字段留空以使用提供商的默认模型。OpenAI 和 Anthropic 有默认值;Azure OpenAI 和自定义提供程序始终需要一个值。 -| 提供程序 | 默认模型 | 需要配置 | -| -------------- | ----------------------- | ----------------------------- | -| OpenAI | gpt-5.5 | API 密钥。可选:基础 URL、组织 ID 和项目 ID | -| Anthropic | claude-sonnet-4-6 | API 密钥。可选:基础 URL | -| Azure OpenAI | 无。必须提供部署名称 | API 密钥、端点 URL 和部署名称 | -| 自定义(兼容 OpenAI) | 无。必须提供模型名称 | API 密钥和自定义端点 URL | +| 提供商 | 默认模型 | 需要的配置 | +| -- | -- | -- | +| OpenAI | gpt-5.5 | API 密钥。可选的基本URL、组织ID和项目ID | +| Anthropic | claude-sonnet-4-6 | API 密钥。可选基本URL | +| Azure OpenAI | 无。需要部署名称 | API 密钥、端点 URL 和部署名称 | +| 自定义(兼容 OpenAI) | 无。需要模型名称 | API 密钥和自定义端点 URL | -![AI 提供商偏好页,其中“选择提供商”下拉列表已展开,显示“无(AI 已禁用)”、OpenAI、Anthropic、Azure OpenAI 和“自定义(兼容 OpenAI)”,下方有 URL 和 API 密钥字段](~/content/assets/images/ai-assistant/ai-assistant-provider-preferences.png) +![AI 提供商首选项页面,其中“选择提供商”下拉菜单显示为“无”(AI 已禁用)、OpenAI、Anthropic、Azure OpenAI 和自定义(兼容 OpenAI),下方有 URL 和 API 密钥字段](~/content/assets/images/ai-assistant/ai-assistant-provider-preferences.png) ### 选择模型 -当前活动模型显示在信息框上方的状态栏中,位于上下文用量条旁边。点击它会打开一个选择器,其中列出了当前已配置提供程序的可用模型;你选择的模型会从下一次请求开始生效。最后一项 **偏好...** 会打开 **工具 > 偏好 > AI 功能 > AI 助手 > AI 提供程序**,以便配置列表中未包含的选项。对于 Azure OpenAI 和自定义提供程序,或者在尚未检索到模型列表之前,模型名称会显示为链接,点击后会打开相应的偏好设置页面。 +活动模型显示在信息框上方的状态条中,位于上下文使用情况条旁边。点击它即可打开一个选择器,其中列出了已配置提供商的可用模型;您选择的模型将从下一个请求开始应用。最后一个条目**首选项……**将打开**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商**,用于处理不在列表中的任何内容。对于 Azure OpenAI 和自定义提供商,或者在检索模型列表之前,模型名称是一个链接,可打开这些首选项。 -![信息框上方已打开的模型选择器,其中列出了 claude-sonnet-5、claude-fable-5-1、claude-fable-5、claude-opus-5、claude-haiku-4-5、claude-opus-4-8,以及以粗体显示的当前活动项 claude-sonnet-4-6,底部还有偏好……位于分隔线下方](~/content/assets/images/ai-assistant/ui-model-picker.png) +![模型选择器在消息框上方打开,列出了 claude-sonnet-5、claude-fable-5-1、claude-fable-5、claude-opus-5、claude-haiku-4-5、claude-opus-4-8 和以粗体显示的当前模型 claude-sonnet-4-6,分隔线下方是“首选项…”](~/content/assets/images/ai-assistant/ui-model-picker.png) > [!NOTE] -> 只有在提供程序、API 密钥和模型都已设置后,才会显示模型指示器。 +> 在设置提供商、API密钥和模型之前,模型指示器处于隐藏状态。 ### OpenAI -将提供程序选择为 **OpenAI**,然后输入你的 API 密钥。如果你的 OpenAI 账户使用 Organization ID 或 Project ID,也一并填写。模型名称可以填写你账户中可用的任何模型。 +选择 **OpenAI** 作为提供商,然后输入您的 API 密钥。如果您的 OpenAI 账户使用组织 ID 或项目 ID,也请输入这些 ID。模型名称可为您的帐户上提供的任何模型。 -![早期版本的 AI 提供程序偏好设置页:已选择 OpenAI,显示已遮盖的 API 密钥,Organization ID 和 Project ID 字段为空,模型名称为 gpt-4o](~/content/assets/images/ai-assistant/ai-assistant-openai-config.png) +![早期版本的 AI 提供商首选项页面,已选择 OpenAI,API 密钥已遮挡,组织 ID 和项目 ID 字段为空,模型名称为 gpt-4o](~/content/assets/images/ai-assistant/ai-assistant-openai-config.png) ### Anthropic -选择 **Anthropic** 作为提供商,然后输入你的 API 密钥。模型名称可以填写你账户中可用的任何 Anthropic 模型。 +选择**Anthropic**作为提供商,然后输入您的 API 密钥。模型名称可为您的账户上可用的任何 Anthropic 模型。 -![AI 提供程序偏好设置页:提供程序选择为 Anthropic,基础 URL 为 https://api.anthropic.com,显示已遮盖的 API 密钥,模型名称为 claude-sonnet-4-6](~/content/assets/images/ai-assistant/ai-assistant-anthropic-config.png) +![“AI 提供商”首选项页面,其中选择了 Anthropic 作为提供商,基础 URL 为 https://api.anthropic.com,API 密钥已遮挡,模型名称为 claude-sonnet-4-6](~/content/assets/images/ai-assistant/ai-assistant-anthropic-config.png) > [!IMPORTANT] -> Anthropic 会根据你的账户等级,强制执行每分钟输入 token(ITPM)的速率限制。新创建的 API 密钥起始为 Tier 1,Claude Sonnet 4.x 的 ITPM 上限为 30,000。对大型模型发起的一次请求就可能超过此限制。购买 $40 或以上的 API 额度即可升至第 2 档(450,000 ITPM)。有关各档位的完整详情,请参阅 [Anthropic 速率限制文档](https://docs.anthropic.com/en/api/rate-limits)。 +> Anthropic 根据您的账户等级实施每分钟输入令牌数 (ITPM) 的速率限制。对于 Claude Sonnet 4.x,新的 API 密钥从 1 级开始,ITPM 为 30,000。针对大型模型的单个请求可能会超过此限制。购买 $40 或以上的 API 额度即可达到 2 级(450,000 ITPM)。有关完整等级详细信息,请参阅[Anthropic 速率限制文档](https://docs.anthropic.com/en/api/rate-limits )。 ### Azure OpenAI -选择 **Azure OpenAI** 作为提供商,并配置以下字段: +选择**Azure OpenAI**作为提供商,并配置以下字段: -- **API 密钥**:用于访问你的 Azure OpenAI 资源的密钥 -- **Service endpoint**:资源 URL,例如 `https://your-resource.openai.azure.com`。 SSL 证书是为 `*.openai.azure.com` 签发的,因此使用 `*.privatelink.openai.azure.com` 地址会导致证书验证失败 -- **Deployment**:在 **Deployments** 的 **Name** 列中显示的部署名称 +- **API 密钥**:您的 Azure OpenAI 资源的访问密钥 +- **服务端点**:资源URL,例如`https://your-resource.openai.azure.com`。SSL 证书是为 `*.openai.azure.com` 颁发的,因此 `*.privatelink.openai.azure.com` 地址无法通过证书验证 +- **部署**:显示在**部署**的**名称**列中的部署名称 -Azure OpenAI 要求在每次 API 调用中都提供部署名称。该名称是在创建部署时设置的,通常与其服务的模型一致,例如 `gpt-4o`,但也可能不同。如果你输入资源名称,或输入的模型名称并未作为部署存在,请求就会失败。 +Azure OpenAI 要求在每次 API 调用中提供部署名称。名称在创建部署时设置,通常与它所服务的模型相匹配,例如 `gpt-4o`,但也有可能不同。如果您输入的资源名称或模型名称不存在于部署中,则请求将失败。 -可在 [Azure AI Foundry 门户](https://ai.azure.com) 中找到部署名称: +在 [Azure AI Foundry 门户](https://ai.azure.com)中查找部署名称: -1. 登录并选择你的 Azure OpenAI 资源 -2. 打开 **部署**(如果资源已升级到 Foundry,则为 **模型 + 终结点**) -3. 复制 **名称** 列中的值 +1. 登录并选择您的 Azure OpenAI 资源 +2. 打开**部署**(如果资源已升级到 Foundry,则打开**模型 + 端点**) +3. 复制**名称**列中的值 -如果在你的组织采用 Azure AI Foundry 之前创建的部署未显示在门户中,可以用 Azure CLI 列出这些部署: +如果您的组织采用 Azure AI Foundry 之前创建的部署未显示在门户中,请使用 Azure CLI 列出部署: ```bash az cognitiveservices account deployment list --name "" --resource-group "" --output table ``` -见 [创建并部署 Azure OpenAI 资源](https://learn.microsoft.com/azure/ai-foundry/openai/how-to/create-resource#deploy-a-model)。 +请参阅[创建和部署 Azure OpenAI 资源](https://learn.microsoft.com/azure/ai-foundry/openai/how-to/create-resource#deploy-a-model)。 -有关 403 错误、SSL 失败或 "DeploymentNotFound" 响应,请参阅 @azure-openai-connection-errors。对于部署在 Microsoft Foundry 中的模型,请参阅[使用 Microsoft Foundry](#using-microsoft-foundry)。 +对于 403 错误、SSL 故障或“DeploymentNotFound”响应,请参阅@azure-openai-connection-errors。对于在 Microsoft Foundry 中部署的模型,请参阅[使用 Microsoft Foundry](#using-microsoft-foundry)。 ### 自定义(兼容 OpenAI) -自定义提供商可以连接到任何提供 OpenAI 兼容 API 端点的 LLM,例如你自己机器上的模型,或托管在你组织网络中的模型。输入你的 API 密钥和端点 URL。使用自托管模型时,所有数据都会保留在你自己的基础设施中,不会发送到第三方云提供商。见 [使用本地或组织内的 LLM](#using-a-local-or-organizational-llm)。 +自定义提供程序可连接到任何公开 OpenAI 兼容 API 端点的 LLM,例如您自己计算机上的模型或托管在您组织网络上的模型。输入您的 API 密钥和端点 URL。使用自托管模型,所有数据都将保留在您自己的基础设施中,不会将任何数据发送到第三方云提供商。请参阅[使用本地或组织 LLM](#using-a-local-or-organizational-llm)。 -## 使用本地或组织内部的 LLM +## 使用本地或组织 LLM -你可以通过“自定义”提供商让 AI 助手对接自托管的 LLM。这样可确保所有数据都保留在你自己的基础设施内,无论是运行在本地计算机上的模型,还是托管在你所在组织网络中的集中式 LLM。无论哪种方式,都不会将数据发送到第三方云提供商。这些工具可以在开发者的工作站上托管提供 OpenAI 兼容 API 的模型,也可以托管在充当团队端点的共享服务器上: +您可以使用自定义提供程序,针对自托管 LLM 运行 AI 助手。这样,所有数据都将保留在您自己的基础设施中,无论是在您的本地计算机上运行的模型,还是在您组织的网络中集中托管的 LLM。无论哪种方式,都不会将数据发送到第三方云提供商。 +这些工具在开发人员的工作站或用作团队端点的共享服务器上托管具有OpenAI兼容API的模型: -- [Ollama](https://ollama.com) — 轻量级 CLI,用于在本地下载并运行模型 -- [LM Studio](https://lmstudio.ai) — 带图形界面的桌面应用,用于管理并运行本地模型 -- [LocalAI](https://localai.io) — 自托管、社区驱动的替代方案,支持多种模型 +- [Ollama](https://ollama.com):用于在本地下载和运行模型的轻量级 CLI +- [LM Studio](https://lmstudio.ai):具有图形界面的桌面应用程序,用于管理和运行本地模型 +- [LocalAI](https://localai.io):自托管、社区驱动的替代方案,支持广泛的模型 ### 示例:Ollama 1. [下载并安装 Ollama](https://ollama.com/download) -2. 拉取一个模型,例如 `ollama pull llama3.1` -3. 启动 Ollama 服务器。安装后会自动启动,默认使用端口 11434 -4. 在 Tabular Editor 中,依次点击 **Tools > 偏好 > AI Features > AI Assistant > AI Provider** -5. 将 **Choose provider** 设置为 **Custom (OpenAI-compatible)** -6. 将 **Service Endpoint** 设置为 `http://localhost:11434/v1` -7. 将 **Model name** 设置为你拉取的模型,例如 `llama3.1` -8. 将 **API Key** 设置为任意非空值,例如 `ollama`。 Ollama 不要求身份验证,但该字段不能为空 +2. 拉取模型,例如 `ollama pull llama3.1` +3. 启动 Ollama 服务器。安装后会自动启动,默认端口为 11434 +4. 在 Tabular Editor 中,转到**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商** +5. 将**选择提供商**设置为**自定义(兼容 OpenAI)** +6. 将**服务终结点**设置为 `http://localhost:11434/v1` +7. 将**模型名称**设置为您拉取的模型,例如 `llama3.1` +8. 将**API 密钥**设置为任何非空值,例如 `ollama`。Ollama 不需要身份验证,但该字段不能为空 ### 示例:LM Studio 1. [下载并安装 LM Studio](https://lmstudio.ai/download) -2. 从左侧面板中的模型搜索页面下载一个模型,或使用 CLI,例如 `lms get lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` -3. 从左侧面板中的开发者页面启动 LM Studio 服务器,或使用 `lms server start`。启用 OpenAI 兼容模式。如果上下文大小低于 100,000 个 token,请将其调高到 100,000 以上 -4. 在 Tabular Editor 中,依次点击 **Tools > 偏好 > AI Features > AI Assistant > AI Provider** -5. 将 **Choose provider** 设置为 **Custom (OpenAI-compatible)** -6. 将 **Service Endpoint** 设置为 `http://localhost:1234/v1` -7. 将 **模型名称** 设置为你下载的模型,例如 `lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` -8. 将 **API 密钥** 设置为任意非空值,例如 `lms`。 LM Studio 不需要身份验证,但该字段不能为空 +2. 从左侧面板的模型搜索页面下载模型,或使用 CLI 下载模型,例如 `lms get lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` +3. 从左侧面板中的开发人员页面启动 LM Studio 服务器,或使用 `lms server start` 启动。开启兼容 OpenAI 的模式。如果上下文大小低于 100,000 个 token,请将其提高到 100,000 个以上 +4. 在 Tabular Editor 中,转到**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商** +5. 将**选择提供商**设置为**自定义(兼容 OpenAI)** +6. 将**服务终结点**设置为 `http://localhost:1234/v1` +7. 将**模型名称**设置为您下载的模型,例如 `lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF` +8. 将**API 密钥**设置为任何非空值,例如 `lms`。LM Studio 不需要身份验证,但该字段不能为空 + > [!NOTE] -> 本地模型的响应质量取决于模型规模以及你的硬件配置。更大的模型通常效果更好,但也需要更多 RAM 和性能足够的 GPU。 AI Assistant 的工具调用功能要求模型支持 OpenAI 兼容格式的函数调用。 +> 使用本地模型的回复质量取决于模型大小和您的硬件。较大的模型能提供更好的结果,但需要更多的 RAM 和性能更强的 GPU。AI 助手的工具调用需要一个支持以 OpenAI 兼容格式进行函数调用的模型。 > [!TIP] -> 使用参数量至少为 30 billion 的模型,最好为 100 billion 或更多。 Qwen3.5-122B-A10B 在内部测试中表现良好。 +> 使用参数至少为 300 亿的模型,最好为 1000 亿或更多。Qwen3.5-122B-A10B 在内部测试中表现良好。 ## 使用 Microsoft Foundry -[Microsoft Foundry](https://ai.azure.com)(前身为 Azure AI Foundry)可让你在 Azure 环境中部署 OpenAI 和 Anthropic 模型。在 Tabular Editor 中,使用 **OpenAI** 或 **Anthropic** 提供程序连接这些模型。 +[Microsoft Foundry](https://ai.azure.com)(前身为 Azure AI Foundry)在您的 Azure 环境中部署 OpenAI 和 Anthropic 模型。在 Tabular Editor 中使用 **OpenAI** 或 **Anthropic** 提供商连接到这些模型。 > [!IMPORTANT] -> 不要将 **Azure OpenAI** 提供程序用于 Microsoft Foundry 模型。它仅适用于使用 `api-version` 查询参数的经典 Azure OpenAI 资源。 +> 请勿对 Microsoft Foundry 模型使用 **Azure OpenAI** 提供程序。它仅适用于使用 `api-version` 查询参数的经典 Azure OpenAI 资源。 ### Microsoft Foundry 上的 OpenAI 模型 -按如下方式配置在 Microsoft Foundry 中部署的 OpenAI 模型,例如 GPT-4o 或 GPT-5.4-mini: +配置部署在 Microsoft Foundry 中的 OpenAI 模型,例如 GPT-4o 或 GPT-5.4-mini: -1. 在 Tabular Editor 中,依次点击 **Tools > 偏好 > AI Features > AI Assistant > AI Provider** -2. 将 **选择提供程序** 设置为 **OpenAI** -3. 将 **基础 URL** 设置为你的 Foundry 资源端点,并在末尾追加 `/openai/v1`,格式如下之一: +1. 在 Tabular Editor 中,转到**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商** +2. 将**选择提供程序**设置为**OpenAI** +3. 将**基础 URL**设置为您的 Foundry 资源端点,并附加`/openai/v1`,格式如下所示: - `https://your-resource.services.ai.azure.com/openai/v1` - `https://your-resource.openai.azure.com/openai/v1` -4. 输入 Foundry **API 密钥** -5. 将 **模型名称** 设置为你的部署名称,例如 `gpt-5.4-mini` +4. 输入您的 Foundry **API 密钥** +5. 将**模型名称**设置为您的部署名称,例如“gpt-5.4-mini” > [!NOTE] -> Microsoft Foundry 门户不会显示基础 URL。它会显示一个包含完整 API 路径的 **目标 URI**,例如 `https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses`。对于基础 URL,只使用 `https://your-resource.services.ai.azure.com/openai/v1`。 +> Microsoft Foundry 门户不显示基础 URL。它显示的是包含完整 API 路径的**目标 URI**,例如 `https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses`。对于基础 URL,仅使用`https://your-resource.services.ai.azure.com/openai/v1`。 -### Microsoft Foundry 中的 Anthropic 模型 +### Microsoft Foundry 上的 Anthropic 模型 -对于在 Microsoft Foundry 中部署的 Anthropic 模型,例如 Claude Sonnet 4.6: +对于部署在 Microsoft Foundry 中的 Anthropic 模型,例如 Claude Sonnet 4.6: -1. 在 Tabular Editor 中,依次点击 **Tools > 偏好 > AI Features > AI Assistant > AI Provider** -2. 将 **选择提供程序** 设置为 **Anthropic** -3. 将 **基础 URL** 设置为你的 Foundry 资源端点,并在末尾追加 `/anthropic`,例如 `https://your-resource.services.ai.azure.com/anthropic` -4. 输入 Foundry **API 密钥** -5. 将 **模型名称** 设置为模型标识符,例如 `claude-sonnet-4-6` +1. 在 Tabular Editor 中,转到**工具 > 首选项 > AI 功能 > AI 助手 > AI 提供商** +2. 将**选择提供程序**设置为**Anthropic** +3. 将**基础 URL** 设置为您的 Foundry 资源端点,并附加 `/anthropic`,例如 `https://your-resource.services.ai.azure.com/anthropic` +4. 输入您的 Foundry **API 密钥** +5. 将**模型名称**设置为模型标识符,例如 `claude-sonnet-4-6` > [!NOTE] -> 门户会显示一个 **目标 URI**,例如 `https://your-resource.services.ai.azure.com/anthropic/v1/messages`。对于基础 URL,只使用到并包含 `/anthropic` 为止的部分。 +> 门户显示**目标 URI**,例如 `https://your-resource.services.ai.azure.com/anthropic/v1/messages`。对于基准 URL,请使用截至并包含“/anthropic”的部分。 ## 功能 -在你授予的[权限](#permissions-and-consent)范围内,AI Assistant 会在你的模型上下文中执行以下操作: +在您的[权限授予](#permissions-and-consent)范围内,AI 助手会使用您的模型上下文: - **模型探索**:查询模型元数据,包括表、列、度量值、关系及其属性 -- **DAX 查询编写**:生成 DAX 查询,对连接模式下连接的模型执行,并在聊天中返回结果集 -- **C# 脚本生成**:创建用于模型更改的 C# Script。视你的设置而定,助手会在编辑器窗口中打开脚本供你运行,或由其自行运行;参见[让助手更改你的模型](#letting-the-assistant-change-your-model) +- **DAX 查询编写**:生成 DAX 查询,对照您连接的模型运行这些查询,并在聊天中返回结果集 +- **C# 脚本生成**:为模型更改创建 C# 脚本。根据您的设置,助手会在编辑器窗口中打开脚本供您运行,或者自行运行脚本;请参阅[让助手更改您的模型](#letting-the-assistant-change-your-model) - **Best Practice Analyzer**:运行 BPA 分析,列出规则违规情况,并创建或修改 BPA 规则 -- **VertiPaq分析器**:查询内存使用统计信息和列的基数 -- **文档访问**:读取并修改已打开的文档:DAX 查询、C# Script 和 DAX 脚本 -- **知识库搜索**:搜索内置的 Tabular Editor 文档 +- **VertiPaq Analyzer**:查询内存使用情况统计数据和列基数 +- **模型错误**:列出模型的错误、警告和 Analysis Services 消息,与[消息视图](xref:messages-view)中显示的消息相同,并首先列出根本原因。当模型的错误发生变化时,助手会收到通知。 +- **文档访问**:读取和修改打开的 DAX 查询、C# 脚本和 DAX 脚本,并读取每个打开的文档(包括 Pivot Grid)的错误和警告。活动文档是助手的上下文的一部分,因此您可以询问“为什么我在此查询中看到此错误?”。它无法读取或更改 Pivot Grid 的布局 +- **知识库搜索**:搜索嵌入的 Tabular Editor 文档 - **UI 导航**:生成 `te3://` 操作链接,用于打开特定的 Tabular Editor 对话框和功能 -通过 [MCP 服务器](xref:mcp-server) 连接的代理具备相同的能力,但不包括 UI 导航。两者都会通过运行一个 C# Script 来更改模型,并将该更改作为一个可撤销的单一步骤记录。它们的区别在于你如何审查更改以及授予权限;请参阅 [MCP 服务器与 AI 助手的差异](#mcp-server-and-ai-assistant-differences)。 +通过 [MCP 服务器](xref:mcp-server)连接的代理具有相同的功能,但 UI 导航除外。两者都通过将 C# 脚本作为单个不可撤消的步骤来运行,从而更改您的模型。它们在您如何查看更改和授予权限方面存在差异;请参阅[MCP 服务器和 AI 助手的差异](#mcp-server-and-ai-assistant-differences)。 > [!NOTE] -> 当模型从文件加载(例如 `.bim` 文件或 TMDL 文件夹),且未连接到 Analysis Services 或 Power BI 时,需要连接的工具会被隐藏,包括 DAX 查询执行和 VertiPaq分析器统计信息。助手仍会编写 DAX 查询,但在你连接之前,DAX 查询项上的 **Execute** 会被禁用。从 `.vpax` 文件加载的 VertiPaq分析器统计信息仍然可用。 +> 当模型从文件(例如 `.bim` 文件或 TMDL 文件夹)加载且未连接到 Analysis Services 或 Power BI 时,需要连接的工具(包括 DAX 查询执行和 VertiPaq Analyzer 统计信息)将被隐藏。助手仍会编写 DAX 查询,但在您连接之前,DAX 查询工件上的**执行**功能处于禁用状态。从 `.vpax` 文件加载的 VertiPaq分析器统计数据仍可用。 -## 让助手更改你的模型 +## 让助手更改您的模型 -默认情况下,助手会编写一个 C# Script 并在编辑器窗口中打开,供你查看并运行。当你在 **工具 > 偏好 > AI 功能 > AI 助手 > 偏好** 下选中 **允许 AI 助手直接运行 C# Script** 时,它也可以自行运行该脚本。 +默认情况下,助手会编写一个 C# 脚本,并在编辑器窗口中打开该脚本,供您阅读和运行。当您在**工具 > 首选项 > AI 功能 > AI 助手 > 首选项**下选择**允许 AI 助手直接运行 C# 脚本**时,它也可以自行运行脚本。 -此设置默认关闭,并且只有在 **工具 > 偏好 > AI 功能 > 权限** 下将 **模型元数据** 设置为 **读取/写入** 后才可用。 +该设置默认关闭,并且在**工具 > 首选项 > AI 功能 > 权限**下将**模型元数据**设置为**读/写**之前不可用。 -### 当助手运行脚本时会发生什么 +### 助手运行脚本时会发生什么 -- 如果 **预览更改** 处于开启状态(默认值),则会在应用更改前显示[预览对话框](xref:csharp-scripts#run-c-scripts-with-preview)。**取消** 会还原这些更改,并将此次拒绝 Report 给助手。如果 **预览更改** 处于关闭状态,则会在不显示对话框的情况下应用更改。 -- 该脚本的更改会作为一个撤销条目显示为:**C# Script (AI Assistant)**。焦点仍在聊天框中,**Ctrl+Z** 无法撤销对模型的更改。要撤销整个脚本,请单击 TOM Explorer 并按 **Ctrl+Z**,或在 **Edit** 菜单中选择 **Undo C# Script (AI Assistant)**。 -- 如果脚本在执行到一半时失败,模型将保持不变,助手会 Report 该错误。 -- 访问文件、网络或外部程序集的脚本不会运行。它会以脚本工件形式打开,带有 **Unsafe** 徽章,且 **Execute** 被禁用;助手的回复还会说明脚本使用了什么。 +- 如果**Preview changes**(预览更改)已启用(默认设置),则在应用更改之前会显示[预览对话框](xref:csharp-scripts#run-c-scripts-with-preview)。**取消**将撤消更改,并将拒绝情况报告给助手。如果**预览更改**已关闭,则会在不显示对话框的情况下应用更改。 +- 脚本的更改是一个撤消条目,即**C# 脚本(AI 助手)**。焦点仍停留在聊天框中,在此处按 **Ctrl+Z** 不会撤消模型更改。要撤消整个脚本,请点击 TOM Explorer 并按 **Ctrl+Z**,或在**编辑**菜单中选择**撤消 C# 脚本(AI 助手)**。 +- 如果脚本在执行过程中部分失败,模型将保持不变,并且助手会报告错误。 +- 如果脚本成功执行并引入或解决了 DAX 错误,助手会收到这些错误的列表,并按根本原因分组。 +- 访问文件、网络或外部程序集的脚本不会运行。它将作为带有“不安全”徽章且“执行”被禁用的脚本工件打开,助手的回复会说明脚本使用了什么。 -如果你要求生成脚本,例如“给我写一个脚本,把每个度量值都重命名为 sentence case”,助手会将其作为脚本文档打开,由你自行运行,即使启用了此设置也是如此。 +如果您要求提供脚本,例如“为我编写一个将每个度量值重命名为句首大写形式的脚本”,即使启用了此设置,助手也会将其作为脚本文档打开,由您自行运行。 -`DisableCSharpScripts` [策略](xref:policies) 适用于所有版本,并会同时禁用直接执行和助手交给你运行的脚本。 +`DisableCSharpScripts` [策略](xref:policies)适用于每个版本,并同时禁用直接执行和助手交给您运行的脚本。 -`BlockUnsafeScripts` 策略需要企业版,并适用于 Tabular Editor 中的所有脚本,包括通过 [MCP 服务器](xref:mcp-server)运行的脚本。启用后,助手仍然可以编写访问文件、网络或外部程序集的脚本,但脚本不会运行,也不会打开任何工件供你查看。见[管理员策略](xref:csharp-scripts#administrator-policies)。 +`BlockUnsafeScripts` 策略需要 Enterprise Edition,并适用于 Tabular Editor 中的每个脚本,包括通过 [MCP 服务器](xref:mcp-server)运行的脚本。设置此策略后,助手仍可以编写访问文件、网络或外部程序集的脚本,但该脚本不会运行,也不会打开任何项目以供审核。请参阅[管理员策略](xref:csharp-scripts#administrator-policies)。 ## 对话 -AI 助手支持多个同时进行的对话,每个对话都有各自的信息历史记录和上下文。 +AI 助手支持多条同时进行的对话,每条对话都有自己的消息历史记录和上下文。 -- 对话会跨会话保留,并存储在本地的 `%LocalAppData%\TabularEditor3\AI\Conversations\` 中 -- 标题会在首次交流后自动生成,你也可以重命名对话 -- **自动压缩**:当对话接近上下文窗口限制时,系统会先归档完整对话的快照,再将较早的信息概括成摘要以释放空间。该阈值是模型自身上下文窗口的百分比,可在 [上下文压缩](#context-compaction) 中设置 +- 对话跨会话保留,并本地存储在 `%LocalAppData%\TabularEditor3\AI\Conversations\` 中 +- 标题在第一次交流后自动生成,您可以重命名对话 +- **自动压缩**:当对话接近上下文窗口的限制时,在对完整对话的快照进行存档后,系统会对较旧的消息进行摘要,以释放空间。阈值是模型自身上下文窗口的百分比,在[上下文压缩](#context-compaction)下设置 ### 删除对话 -**删除对话** 位于 AI 助手工具栏的最左侧,紧挨着 **新建对话**。确认提示后,对话及其历史记录会从磁盘中删除,且无法恢复。点击面板标题栏上的关闭按钮,或选择 **视图 > AI 助手**,只会隐藏面板,不会删除任何内容。 +**删除对话**位于 AI 助手工具栏的左端,紧挨着**新建对话**。确认提示后,对话及其历史记录将从磁盘中删除,且无法恢复。面板标题栏上的“关闭”按钮,或**“视图”>“AI 助手”**,可隐藏面板,但不会删除任何内容。 -## 工件 +## 产物 -AI 助手生成的代码会作为 _工件_ 在编辑器窗口中打开: +AI 助手生成的代码会在编辑器窗口中以*工件*的形式打开: -- **C# Script**:在 C# Script 编辑器中打开,支持语法高亮、编译和执行 -- **DAX 查询**:在 DAX 查询编辑器中打开,支持语法高亮和执行 +- **C# 脚本**:具有语法高亮显示、编译和执行功能的 C# 脚本编辑器 +- **DAX 查询**:具有语法突出显示和执行功能的 DAX 查询编辑器 -工件会随着 AI 生成而流式呈现;C# Script 工件还包含安全分析,可标记不安全代码,例如访问文件系统或进行网络操作。 +随着 AI 生成工件,工件会陆续显示,C# 脚本工件包含安全分析,该分析会标记不安全的代码,例如文件系统访问或网络操作。 -![AI 助手窗格,显示生成的 C# Script 产物及其“执行”按钮,以及助手对该脚本作用的说明和随附的大小写敏感提示](~/content/assets/images/ai-assistant/ai-assistant-generate-c-sharp-script.png) +![“AI 助手”窗格显示生成的 C# 脚本工件,其中包含“执行”按钮,以及助手对脚本功能的解释和随附的大小写敏感性注意事项](~/content/assets/images/ai-assistant/ai-assistant-generate-c-sharp-script.png) -如果启用了 **预览更改**,在聊天中运行 C# Script 时会打开 **脚本预览** 对话框,并排显示该脚本对所有模型元数据所做更改的差异,你可以在其中接受或还原这些更改。请参阅 [带预览运行脚本](xref:csharp-scripts#run-c-scripts-with-preview)。 +如果**预览更改**已启用,从聊天中运行 C# 脚本将打开**脚本预览**对话框,其中并排显示脚本对模型元数据所做的所有更改的差异,您可以在其中接受或撤销这些更改。请参阅[运行带预览功能的脚本](xref:csharp-scripts#run-c-scripts-with-preview)。 -![“脚本预览 - 模型更改”对话框:左右并排显示更改前后的模型;其中 Internet Total Freight 度量值的格式字符串已更改,并新增了说明和显示文件夹,且每项更改都标注了对应的原始值](~/content/assets/images/preview-script-changes.png) +![“脚本预览 - 模型变更”对话框,模型变更前后的内容并排显示,其中“Internet Total Freight”度量的格式字符串已更改,并添加了描述和显示文件夹,每个变更都与原始内容进行了对比标记](~/content/assets/images/preview-script-changes.png) ## 自定义指令 -_自定义指令_ 是一组指令集,用于在特定任务中引导 AI 助手。助手会收到所有可用指令及其 `description` 的列表,并且只加载与你请求相关的那些指令的全文,所以描述要尽量准确、具体。已加载的指令会在该对话的剩余过程中持续生效。 +*自定义指令*是一组指令,用于指导 AI 助手执行特定任务。助手会收到所有可用指令的列表及其“描述”,并仅加载与您的请求相关的指令的完整文本,因此请确保描述准确且具体。加载的指令在对话的其余部分中一直有效。 ### 内置自定义指令 AI 助手包含以下自定义指令: -| 自定义指令 | 调用方式 | 涵盖内容 | -| ----------- | --------------------- | ------------------------------------------------------- | -| DAX 查询 | `/dax-querying` | 编写和执行 DAX 查询:列与度量值的限定引用、验证筛选器值、验证并更新查询 | -| 模型修改 | `/model-modification` | 用于创建或更改模型对象的 C# Script:TOMWrapper API 模式、执行顺序、幂等更新、命名规则 | -| 语义模型设计 | `/model-design` | 星型架构、关系与交叉筛选、日期表、度量值与计算列、计算组、命名 | -| 语义模型组织 | `/organize-model` | 审核并整理模型元数据:命名约定、表格组、显示文件夹、隐藏列、格式字符串、说明 | -| 语义模型大小优化 | `/optimize-model` | 减少模型内存占用和大小:VertiPaq 度量值、删除列、数据类型调优、结构调整、SKU 限制 | -| 宏 | `/宏` | 用于宏窗口的可复用 C# 宏:选择上下文、通用代码规则 | -| DAX 用户自定义函数 | `/udf` | 编写 DAX UDF:语法、`VAL`/`EXPR` 参数模式、类型提示、命名空间、DaxLib | -| 最佳实践分析器 | `/bpa` | 查看违规项,并使用 LINQ Dynamic 表达式编写自定义规则 | +| 自定义指令 | 调用方式 | 涵盖内容 | +| -- | -- | -- | +| DAX 查询 | `/dax-querying` | 编写和执行 DAX 查询:列和度量值限定、验证筛选值、验证和更新查询 | +| 模型修改 | `/model-modification` | 用于创建或更改模型对象的 C# 脚本:TOMWrapper API 模式、执行顺序、幂等更新、命名规则 | +| 语义模型设计 | `/model-design` | 星型模式、关系和交叉筛选、日期表、度量值与计算列、计算组、命名 | +| 语义模型组织 | `/organize-model` | 审核和整理模型元数据:命名约定、表组、显示文件夹、隐藏列、格式字符串、描述 | +| 语义模型大小优化 | `/optimize-model` | 减少模型内存和大小:VertiPaq 测量、列删除、数据类型调整、结构更改、SKU 限制 | +| 宏 | `/macros` | 用于“宏”窗口的可重用 C# 宏:选择上下文、通用代码规则 | +| DAX 用户自定义函数 | `/udf` | 编写 DAX UDF:语法、`VAL`/`EXPR` 参数模式、类型提示、命名空间、DaxLib | +| Best Practice Analyzer | `/bpa` | 查看违规并以 LINQ Dynamic 表达式的形式编写自定义规则 | -在 **工具 > 偏好 > AI 功能 > AI 助手 > 偏好** 下选中 **显示自定义指令指示器** 后,每条回复上方的指示器会显示哪些指令影响了该回复。 +在**工具 > 首选项 > AI 功能 > AI 助手 > 首选项**下选中**显示自定义指令指示器**后,每个回复上方的指示器将显示影响该回复的指令。 ### 调用自定义指令 -输入 `/` 可浏览可用的自定义指令。在信息开头输入某条指令的 `/id`,即可加载该指令,而不受信息内容影响;例如,`/dax-querying` 会加载 DAX 查询指令。仅输入 `/id` 而不附带信息,会加载该指令,但不会发出请求。显式加载的指令会在后续整个对话中持续生效,就像助手自行加载的指令一样。 +键入“/”以浏览可用的自定义指令。让您的消息以指令的`/id`开头,即可加载该指令,而无需考虑消息内容;例如,`/dax-querying`将加载DAX查询指令。没有消息的 `/id` 会加载指令,而不会发出请求。显式加载的指令在对话的其余部分中保持有效,就像助手自行加载的指令一样。 -### 添加自己的自定义指令 +### 添加您自己的自定义指令 -将 `.md` 文件放到 `%LocalAppData%\TabularEditor3\AI\CustomInstructions\` 中,即可创建自定义指令。该文件夹会在 AI 助手首次运行时创建,其中包含一个可供参考和复制的 `example.md` 文件。在 AI Assistant 工具栏上点击 **Open Custom Instructions Folder** 即可打开该文件夹。 +通过将 `.md` 文件放置在 `%LocalAppData%\TabularEditor3\AI\CustomInstructions\` 中来创建自定义指令。该文件夹在 AI 助手首次运行时创建,其中包含一个 `example.md` 文件,可供您从中复制。点击 AI 助手工具栏上的**打开自定义指令文件夹**即可打开该文件夹。 -用于定义指令元数据的 YAML frontmatter 是可选的: +定义指令元数据的 YAML 前置 मैटर是可选的: ```yaml --- @@ -290,202 +295,202 @@ Your instruction content goes here. This is the text that will be injected into the AI's system prompt when the instruction is activated. ``` -| 字段 | 必需 | 默认值 | 说明 | -| --------------- | -- | ------------- | ------------------------------------------- | -| `id` | 否 | 不含 `.md` 的文件名 | 唯一标识符,也会作为 `/id` 用于显式调用 | -| `name` | 否 | `id` 使用标题式大小写 | 自动完成中的显示名称 | -| `description` | 否 | 默认使用 `name` | 说明该指令涵盖的内容以及适用时机 | -| `priority` | 否 | 100 | 当多个自定义指令同时生效时,数值越高越先注入 | -| `always_inject` | 否 | false | 如果为 true,则始终包含在系统提示词中。此类指令不会出现在 `/` 自动完成列表中 | -| `hidden` | 否 | false | 如果为 true,则不会在 `/command` 的自动补全中显示 | +| 字段 | 是否必填 | 默认值 | 说明 | +| -- | -- | -- | -- | +| `id` | 否 | 不带 `.md` 的文件名 | 唯一标识符,也用作显式调用的 `/id` | +| `name` | 否 | 首字母大写的 `id` | 自动补全中显示的名称 | +| `description` | 否 | 回退到 `name` | 说明该指令涵盖的内容以及何时适用 | +| `priority` | 否 | 100 | 当多条自定义指令生效时,值较高的指令将优先注入 | +| `always_inject` | 否 | false | 如果为 true,则始终包含在系统提示中。`/` 自动补全中不提供此类指令 | +| `hidden` | 否 | false | 如果为 true,则不显示在 `/command` 自动补全中 | -具有与内置指令相同 `id` 的自定义指令会覆盖内置版本。 +`id` 与内置指令匹配的自定义指令会覆盖内置版本。 -Tabular Editor 会按以下方式读取这些文件: +Tabular Editor 按以下方式读取文件: -- frontmatter 必须以文件第一行的 `---` 开始,并以单独一行 `---` 结束。如果不符合上述格式,或者 YAML 无法解析,则整个文件都会被视为指令内容,并应用上述所有默认值 -- 上表中未列出的键会被忽略。早期版本中仍包含 `triggers:` 部分的文件可按原样加载 -- 正文中出现的任何 `{{version}}` 都会被替换为 Tabular Editor AI 组件的版本号 -- 只会读取文件夹中直接包含的 `.md` 文件;不会搜索子文件夹 +- 前置内容必须以“---”开头,位于文件的第一行,并以“---”行结尾。如果不是这样,或者如果无法解析 YAML,则整个文件将被视为指令内容,并且上述所有默认值均适用。 +- 不在上述表格中的键将被忽略。仍有“triggers:”部分的早期版本文件将按原样加载 +- 正文中的任何 `{{version}}` 都将替换为 Tabular Editor AI 组件的版本 +- 仅读取直接位于该文件夹中的 `.md` 文件;不搜索子文件夹 -### 来自你所在组织的自定义说明 +### 来自您组织的自定义指令 -管理员可以通过 `AiCustomInstructionsPath` [策略](xref:policies) 发布一个面向所有人的自定义指令文件夹,该文件夹也可以是只读网络共享。除内置指令外,这些指令也会为每位用户加载,其使用方式与其他指令相同:会出现在 `/` 自动完成中,可按说明选择,也可通过 `/id` 调用。 +管理员可以使用 `AiCustomInstructionsPath` [策略](xref:policies)为所有人发布一个自定义指令文件夹,该文件夹可以是只读网络共享。除了内置的指令外,这些指令还会为每个用户加载,并且工作方式与其他指令一样:在“/”自动补全中提供,按其描述选择,通过“/id”调用。 -如果多个位置存在相同的 `id`,优先级如下: +如果相同的 `id` 存在于多个位置,则优先级为: -1. 你所在组织的文件夹 -2. 你自己的文件夹 +1. 您所在组织的文件夹 +2. 您自己的文件夹 3. 内置指令 -另一项策略 `DisableUserCustomInstructions` 会让 Tabular Editor 忽略你自己文件夹中的指令,并禁用 **Open Custom Instructions Folder**;内置指令和组织文件夹中的指令仍会加载。这两项策略都需要 Tabular Editor 3 企业版。 +一项单独的策略 `DisableUserCustomInstructions` 会使 Tabular Editor 忽略您自己文件夹中的指令,并禁用**打开自定义指令文件夹**;内置指令和组织指令仍会加载。这两项策略都需要 Tabular Editor 3 企业版。 -## 权限与同意 +## 权限和同意 -为每项资源设置访问级别,以控制 AI Assistant 可以访问哪些内容;[MCP 服务器](xref:mcp-server) 也使用相同的设置。 +为每个资源设置访问级别,以控制 AI 助手可以访问的内容,[MCP 服务器](xref:mcp-server)使用相同的设置。 -| 资源 | 涵盖内容 | 级别 | 默认值 | -| -------------------------- | -------------------------------------------------------- | ------------ | ------ | -| **模型元数据** | 表、列和度量值的名称、表达式、描述等。“读取”权限还包括 VertiPaq分析器的统计信息 | 拒绝 / 读取 / 写入 | **读取** | -| **模型数据** | 模型中的数据值,例如 DAX 查询结果。需要实时连接 | 拒绝 / 读取 | **拒绝** | -| **Best Practice Analyzer** | 读取可列出规则并运行分析;写入可添加或修改规则 | 拒绝 / 读取 / 写入 | **读取** | -| **文档** | 你当前打开的文档:DAX 查询、C# Script 和 DAX 脚本。读取可访问其内容;创建或修改则需要写入权限 | 拒绝 / 读取 / 写入 | **写入** | -| **宏** | 你的宏库。读取可列出并读取宏;写入权限为未来的宏编辑工具预留 | 拒绝 / 读取 / 写入 | **写入** | +| 资源 | 涵盖内容 | 级别 | 默认 | +| -- | -- | -- | -- | +| **模型元数据** | 表、列和度量值名称、表达式、描述等。“读”还包括 VertiPaq 分析器统计数据以及模型的错误和警告消息 | 拒绝/读/写 | **读** | +| **模型数据** | 来自您模型的数据值,例如 DAX 查询结果,以及 Analysis Services 返回的错误文本(其中可能包含数据值)。DAX 查询需要实时连接 | 拒绝/读取 | **拒绝** | +| **最佳实践分析器** | 读权限可读取规则列表并运行分析;写权限可添加或修改规则 | 拒绝/读/写 | **读** | +| **文档** | 您打开的文档:DAX 查询、C# 脚本、DAX 脚本和 Pivot Grid。“读”是指其内容及其错误和警告;“写”是指需要创建或修改它们。无法读取或修改 Pivot Grid 布局 | 拒绝/读取/写入 | **写入** | +| **宏** | 您的宏库。“读”可列出并读取宏;“写”保留供将来宏编辑工具使用 | 拒绝/读/写 | **写** | -**Write**(在下拉列表中标为 **Read/Write**)也包含 Read 权限。 +**写**(在下拉菜单中标记为**读/写**)包括读。 > [!NOTE] -> 授予 **模型数据** 权限会将模型中的数据值发送给你的 AI 提供商。 +> 授予**模型数据**会将模型中的数据值发送给你的 AI 提供商。 某些授权依赖于其他授权: -- 要使用[直接执行](#letting-the-assistant-change-your-model),必须具备 **模型元数据 > 写入** 权限;直接执行功能需要另行开启。 -- 运行 Best Practice Analyzer 除了需要 **Best Practice Analyzer > 读取** 外,还需要 **模型元数据 > 读取**。 -- 运行 DAX 查询除了需要 **模型数据 > 读取** 外,还需要 **模型元数据 > 读取**。查询可以通过 `INFO` 函数、DMV 以及结果中的列名来读取元数据。 +- [直接执行](#letting-the-assistant-change-your-model)需要**模型元数据 > 写入**,您需要单独启用此项。 +- 运行 Best Practice Analyzer 除了需要**Best Practice Analyzer > 读取**外,还需要**模型元数据 > 读取**。 +- 运行 DAX 查询除了需要**模型数据 > 读取**外,还需要**模型元数据 > 读取**。查询可以通过 `INFO` 函数、DMV 及其结果中的列名来读取元数据。 ### 设置权限授予 -打开 **工具 > 偏好 > AI 功能 > 权限**。在这里,每个资源都有一个下拉菜单,可选择其可用级别。 +打开**工具 > 首选项 > AI 功能 > 权限**,其中每个资源都有一个下拉菜单,显示其可用级别。 -![AI 功能 > 权限偏好设置,每个资源一个下拉菜单,默认值](~/content/assets/images/pref-ai-permissions.png) +![AI 功能 > 权限首选项,每个资源都有一个处于默认状态的下拉列表](~/content/assets/images/pref-ai-permissions.png) -聊天没有单独的“询问”级别,当它需要某个被设为 **拒绝** 的资源时,会显示一张[权限卡片](#permission-cards-in-the-chat)。 +聊天没有单独的“询问”级别,当需要将资源设置为**拒绝**时,会显示[权限卡](#permission-cards-in-the-chat)。 > [!NOTE] -> 从 3.27.0 起,**模型元数据**、**文档** 和 **宏** 默认设置为“读取”或更高级别,聊天也不会再为它们弹出提示。默认情况下,只有 DAX 查询结果和对 Best Practice Analyzer 规则的编辑会显示卡片。将某个资源设为 **拒绝**,就能让它重新弹出提示。 +> 从 3.27.0 开始,**模型元数据**、**文档**和**宏**的默认设置为“读取”或更高权限,聊天不再提示这些权限。默认情况下,只有 DAX 查询结果和 Best Practice Analyzer 规则编辑才会显示卡片。将资源设置为**拒绝**,以恢复其提示。 > [!NOTE] -> 在企业版中,管理员可以通过策略限制这些权限的上限。参见 @policies。 +> 在企业版中,管理员可以通过策略限制这些权限。请参阅@policies。 ### 聊天中的权限卡片 -当助手需要的资源超出你当前授权的范围时,对话中会出现一张 **需要权限** 卡片。卡片会说明助手想做什么,例如“AI 想访问你的语义模型的元数据”,或者显示它建议运行的 DAX 查询。 +当助手需要你的常设授权未涵盖的资源时,对话中会显示“需要权限”卡片。该卡片会说明助手想要执行的操作,例如“AI 希望访问你语义模型的元数据”,或者显示其提议运行的 DAX 查询。 -![聊天中的“需要权限”卡片,显示助手想要运行的 DAX 查询,并带有“允许”“在本次会话中允许”“对此模型允许”“始终允许”和“拒绝”按钮](~/content/assets/images/ai-assistant/ai-assistant-generate-consent-dialog.png) +![聊天中的“需要权限”卡片,其中列出了助手想要运行的 DAX 查询,并提供了“允许”、“允许用于会话”、“允许用于此模型”、“始终允许”和“拒绝”按钮](~/content/assets/images/ai-assistant/ai-assistant-generate-consent-dialog.png) -| 按钮 | 作用 | -| ------------ | ------------------------------------------------------------------------------------------ | -| **允许** | 仅适用于当前这一轮。在完成你的任务期间,助手可能会重复提出同样的请求,之后也不会记住任何内容 | -| **在本次会话中允许** | 在 Tabular Editor 重启前一直有效。该授权只保存在内存中,绝不会写入磁盘 | -| **仅对该模型允许** | 会记录到模型的[用户选项](xref:user-options) 文件中,并在你下次打开此模型时生效。仅针对 **模型元数据** 和 **模型数据** 提供,且仅在已加载模型时可用 | -| **始终允许** | 在“权限”页中提高常设授权级别,对所有模型和所有会话生效 | -| **拒绝** | 拒绝此请求。助手会在没有该访问权限的情况下继续;下次需要该权限时,卡片会再次出现 | +| 按钮 | 功能 | +| -- | -- | +| **允许** | 仅适用于此轮。助手在完成您的任务时可以重复相同的请求,之后不会记住任何内容 | +| **仅在本次会话中允许** | 适用于 Tabular Editor 重新启动之前。授权保留在内存中,绝不会写入磁盘 | +| **允许用于此模型** | 记录在模型的[用户选项](xref:user-options)文件中,并在下次打开此模型时应用。仅适用于**模型元数据**和**模型数据**,并且仅在加载模型时适用 | +| **始终允许** | 在“权限”页面上提升永久授权,适用于每个模型和每个会话 | +| **拒绝** | 拒绝此请求。助手将在没有该访问权限的情况下继续运行,下次需要该权限时,卡片将再次出现 | -**始终允许** 绝不会降低现有授权;如果某个资源当前是“写入”,即使你允许的是“读取”,它也会保持为“写入”。 +**始终允许**绝不会降低现有授权;允许在“写入”时对资源进行读取,则会将其保留在“写入”级别。 -### 在等待权限时停止当前轮次 +### 在权限待处理时停止回合 -在你回应 **需要权限** 卡片之前,本轮对话会暂停。**停止** 会在不作答的情况下结束本轮,移除卡片,并将该请求计为已拒绝。发送一条新信息以继续对话。 +回合将暂停,直到您回复**需要权限**卡片。**停止**会在没有回答的情况下结束回合,移除卡片并将请求计为已拒绝。发送新消息以继续对话。 -### MCP 服务器与 AI 助手的区别 +### MCP 服务器和 AI 助手的区别 -[MCP 服务器](xref:mcp-server)使用相同的五种授权,但不会显示权限卡片: +[MCP 服务器](xref:mcp-server)使用相同的五项授权,但不显示权限卡片: -- 服务器启动时会读取这些授权,并持续生效直到服务器停止,因此更改后的授权只有在你重启服务器后才会生效 -- 只有全局授权会生效。通过 **对此模型允许** 或 **本次会话允许** 授予的权限仅对该聊天生效 -- 被拒绝的资源对应的工具不会出现在代理的工具列表中 +- 授权在服务器启动时读取,并一直有效,直到服务器停止,因此更改后的授权仅在您重启服务器后才会生效 +- 仅适用全局授权。通过**允许用于此模型**或**允许用于会话**授予的权限仅适用于聊天 +- 被拒绝的资源的工具不在代理的工具列表中 ### 撤销权限 -要撤销某项资源的授权,就在 **权限** 页面将它重新设为 **拒绝**。之后,聊天在下次需要该资源时会显示一张权限卡片。 +在“权限”页面上将资源重新设置为“拒绝”,以撤销其授权。然后,下次聊天需要该资源时,聊天将显示一个权限卡。 -降低全局授权级别不会清除按模型授予的权限。要撤销按模型授予的权限,请删除该模型的 `.tmuo` 文件,或删除其中的 `Permissions` 项。参见 @user-options。 +降低全局授权不会清除针对特定模型的授权。删除模型的 `.tmuo` 文件,或其中的 `Permissions` 条目,以撤销针对每个模型的授权。请参阅 @user-options。 ### 审计记录 -在企业版中,包括 Consultancy 和 Trial 许可证,Tabular Editor 会将 AI Assistant 和 [MCP 服务器](xref:mcp-server) 的活动写入本地日志。记录内容包括: +在企业版(包括咨询版和试用版许可证)中,Tabular Editor 会写入 AI 助手和[MCP 服务器](xref:mcp-server)活动的本地日志。它会记录: -- 请求了哪些权限,以及你如何回应 +- 请求了哪些权限以及您的回答 - 运行了哪些工具,以及每个工具是成功、失败还是被阻止 -- 助手或 MCP 代理运行或提交运行的任何 C# Script 的完整文本,包括在运行时失败或被拒绝执行的脚本 +- 助手或 MCP 代理运行或提交运行的任何 C# 脚本的完整文本,包括运行时失败或被拒绝的脚本 -你的提示词、助手的回复以及模型中的数据值都不会被记录。无法编译的脚本不会被保存;同样,助手写入文档供你自行运行的脚本文本也不会被保存。在 **工具 > 偏好 > AI 功能** 下点击 **打开审计文件夹**,即可打开日志文件夹。 +您的提示、助手的回复以及来自您模型的数据值绝不会被记录。无法编译的脚本不会被保存,助手写入文档供您自行运行的脚本文本也不会被保存。**工具 > 首选项 > AI 功能**下的**打开审计文件夹**可打开日志文件夹。 -如果没有企业版许可证,或许可证尚未激活,则不会记录任何内容,不会创建文件夹,也不会显示该按钮。关于每条记录包含的内容、文件存储位置以及重定向这些文件的策略,参见 @ai-audit-log。 +如果没有企业版许可证,且在许可证激活之前,不会记录任何内容,不会创建任何文件夹,也不会显示该按钮。请参阅 @ai-audit-log,了解每条记录包含的内容、文件的存储位置以及重定向这些文件的策略。 -## 偏好设置 +## 偏好 -在 **工具 > 偏好 > AI 功能 > AI Assistant > 偏好** 中配置 AI 助手的显示与行为选项。 +在**工具 > 首选项 > AI 功能 > AI 助手 > 首选项**下配置 AI 助手的显示和行为选项。 ### 聊天显示 -| 偏好 | 默认值 | 说明 | -| ---------- | --- | ---------------- | -| 显示选择上下文指示器 | 关 | 在聊天中显示当前选定的模型对象 | -| 显示自定义指令指示器 | 关 | 在助手回复上方显示自定义指令标识 | -| 显示知识库搜索指示器 | 关 | 搜索知识库时显示进度 | +| 首选项 | 默认值 | 描述 | +| -- | -- | -- | +| 显示所选内容上下文指示器 | 关闭 | 在聊天中显示当前所选的模型对象 | +| 显示自定义指令指示器 | 关闭 | 在助手的回复上方显示自定义指令指示器 | +| 显示知识库搜索指示器 | 关闭 | 显示搜索知识库时的进度 | ### 上下文压缩 -| 偏好 | 默认值 | 说明 | -| -------- | --- | ------------------------------------------------------------------------------- | -| 自动压缩 | 开 | 接近上下文限制时自动摘要较早的信息 | -| 自动压缩阈值 % | 80 | 达到模型自身上下文窗口的这一百分比时,将触发自动压缩。此字段可接受 25 到 100 之间的值。低于 50 的值按 50 处理,高于 90 的值按 90 处理 | +| 首选项 | 默认 | 说明 | +| -- | -- | -- | +| 自动压缩 | 开 | 接近上下文限制时自动汇总较早的信息 | +| 自动压缩阈值 % | 80 | 触发自动压缩时模型自身上下文窗口的百分比。该字段接受 25 至 100。低于 50 的值按 50 处理,高于 90 的值按 90 处理 | ### C# Script -| 偏好 | 默认值 | 说明 | -| ---------------------- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 允许 AI 助手直接运行 C# Script | 关 | 允许助手自行运行 C# Script。关闭后,助手会打开每个脚本,由你来运行。只有在 **权限** 下将 **模型元数据** 设为 **读取/写入** 后,此功能才可用;如果启用了 `DisableCSharpScripts` [策略](xref:policies),则始终不可用。见 [让助手更改你的模型](#letting-the-assistant-change-your-model) | -| 预览更改 | 开 | 在聊天中执行 AI 生成的 C# Script 时,显示“预览更改”对话框 | +| 首选项 | 默认值 | 说明 | +| -- | -- | -- | +| 允许 AI 助手直接运行 C# 脚本 | 关闭 | 让助手自行运行其 C# 脚本。关闭时,助手会打开每个脚本,由您来运行。在**权限**下将**模型元数据**设置为**读/写**之前不可用,并且在 `DisableCSharpScripts` [策略](xref:policies)下完全不可用。请参阅[让助手更改您的模型](#letting-the-assistant-change-your-model) | +| 预览更改 | 开 | 从聊天中执行 AI 生成的 C# 脚本时,显示“预览更改”对话框 | -**启动时检查知识库更新** 选项和 **打开审计文件夹** 按钮位于 **AI 功能** 页面中 **AI Assistant** 上方,这两项也适用于 MCP 服务器。见 @preferences。 +**启动时检查知识库更新**和**打开审核文件夹**按钮位于**AI 功能**页面上,在**AI 助手**上方,两者也适用于 MCP 服务器。请参阅@preferences。 -![AI Assistant 偏好页面:三个聊天显示指示器均未选中(默认),已选择“自动压缩”,阈值为 80,“允许 AI 助手直接运行 C# Script”未选中,并已选择“预览更改”](~/content/assets/images/ai-assistant/ai-assistant-preferences.png) +![AI 助手首选项页面,三个聊天显示指示器均未选中(默认设置),“自动压缩”已选中,阈值为 80,“允许 AI 助手直接运行 C# 脚本”未选中,“预览更改”已选中](~/content/assets/images/ai-assistant/ai-assistant-preferences.png) -## Token 使用量 +## Token 使用情况 -每条发给 AI 助手的信息都会消耗输入 token。单条信息的 token 成本取决于其包含的上下文: +向 AI 助手发送的每条消息都会消耗输入令牌。单条消息的令牌成本取决于其包含的上下文: -- **系统提示词和自定义指令**:会随每条信息一起发送;通常为 5,000 到 15,000 个 token,具体取决于启用了哪些自定义指令 -- **模型元数据**:通过工具调用分阶段获取。助手会先获取一个轻量级概览(表和度量值名称、关系),然后按名称、描述或 DAX 表达式搜索相关对象,并且只在问题需要时才检索相关表或对象的完整信息。如果工具调用结果非常大,会被截断,并附带说明,指导助手如何获取剩余内容 +- **系统提示和自定义指令**:随每条消息一起发送,通常为 5,000 至 15,000 个令牌,具体取决于哪些自定义指令处于活动状态 +- **模型元数据**:通过工具调用分阶段检索。助手首先获取一个轻量级概览(表名和度量值名称、关系),然后按名称、描述或 DAX 表达式搜索相关对象,并仅检索问题所需的表或对象的完整详细信息。非常大的工具结果会被截断,并提供有关助手如何检索其余部分的指导 -### Token 计数器 +### 令牌计数器 -Token 计数器位于信息框上方的状态栏中,紧挨着[当前模型指示器](#choosing-a-model)。进度条会以千 token 为单位显示“已用 / 总量”,并会随着上下文逐渐填满而呈现绿色、琥珀色或红色。数字前面的 `±` 表示暂时还无法提供精确计数。 +令牌计数器位于消息框上方的状态条中,在[活动模型指示器](#choosing-a-model)旁边。该进度条以千个为单位显示已使用/总计的令牌数,并随着上下文的填充而显示为绿色、琥珀色或红色。数字前面的“±”表示尚无确切计数。 -将鼠标悬停在计数器上可查看明细: +将鼠标悬停在计数器上,即可查看细目: -| 部分 | 涵盖内容 | -| ------------ | ------------------------------------------ | -| **上一轮** | 最近一次交互的开销:新输入、从提供方的提示缓存中读取的令牌、写入缓存的令牌,以及输出 | -| **本次对话(计费)** | 同样的四项数字,累计整个对话中的每次请求,包括工具往返调用 | -| **上下文** | 当前位于上下文窗口中的令牌数,并与该窗口的实际大小对照 | +| 部分 | 涵盖内容 | +| -- | -- | +| **上一轮** | 最近一次交互的成本:新输入、从提供商的提示缓存中提供的token、写入缓存的token以及输出 | +| **此对话(已计费)** | 在对话中的每个请求中累积的相同四个数字,包括工具往返 | +| **上下文** | 当前在上下文窗口中的令牌数,与窗口的实际大小对比 | -某一行可能会显示为:`37,588 input + 131,744 cached · write 37,558 · output 2,866`。对于不支持提示缓存的提供商,将省略缓存部分;当某个部分没有任何可报告的内容时,该部分也将被省略。 +例如,一行显示为“37,588 个输入 + 131,744 个缓存 · 写入 37,558 个 · 输出 2,866 个”。对于不支持提示缓存的提供商,将省略缓存部分;如果某个部分没有可报告的内容,则会省略该部分。 > [!TIP] -> 对比 **上一轮** 和 **本次对话(计费)**,就能看出单个问题消耗了多少 token。在较长的对话中,**本次对话(计费)** 的数值很大,而 **上一轮** 的数值很小,这是正常现象。 +> 将**上一轮**与**此对话(已计费)**进行比较,查看单个问题的成本。在长时间的对话中,**“本次对话(已计费)”**数字较大,而旁边的**“上一轮”**数字较小,这是正常现象。 ### 上下文窗口 -上下文使用进度条、自动压缩触发点以及单次回复的最大长度,都以所选模型的上下文窗口为准。例如,如果某个模型的窗口为一百万 token,就会以一百万 token 作为度量值基准进行衡量。如果无法得知模型的窗口大小(例如仅有 Azure OpenAI 或 Custom 的部署名称,或某台机器从未检索过模型目录),Tabular Editor 会按 200,000 个 token 计算。 +上下文使用情况栏、自动压缩点和单个回复的最大长度使用所选模型的上下文窗口。例如,具有一百万个令牌窗口的模型将以一百万个令牌为基准进行衡量。如果模型的窗口未知(Azure OpenAI 或自定义部署名称,或从未检索过模型目录的计算机),Tabular Editor 将使用 200,000 个令牌。 -### 减少 token 使用量 +### 减少 Token 使用量 -提问前,先在 **TOM Explorer** 中选择特定对象。这样一来,助手会将上下文范围限定为所选对象,而不会检索整个模型的元数据;这样最能减少 token 用量和 API 成本。 +在提出问题之前,请在**TOM Explorer**中选择特定对象。然后,助手将其上下文范围限定为所选对象,并且不会检索整个模型的元数据,这可以最大限度地减少令牌使用量和 API 成本。 -其他减少 token 使用量的方法: +减少 Token 使用量的其他方法: -- 尽量围绕特定的表、度量值或列提问。像“为所有度量值设置显示文件夹”这样含糊的提示词,会让助手检索整个模型的元数据。像“为我当前选中的度量值设置显示文件夹”这样明确的提示词,会将上下文限制在当前选择范围内,并使用少得多的 token -- 切换主题时就开始新对话,以免历史记录越积越长 -- 进行探索性提问时,使用更小或成本更低的模型 +- 针对特定表、度量值或列提出有针对性的问题。“为所有度量值设置显示文件夹”等模糊提示会使助手检索整个模型的元数据。像“为我选择的度量值设置显示文件夹”这样的具体提示会将上下文限制在当前选择范围内,使用的令牌要少得多。 +- 切换主题时开始新的对话,以免历史记录过长 +- 对于探索性问题,使用更小或更便宜的模型 -## 限制 +## 局限性 -- 需要你自己的 API 密钥;不内置 API 密钥 -- 响应质量取决于所选的提供商和模型 -- 该 AI 助手不能替代你对 DAX 和语义模型设计基础的理解 -- 该 AI 助手无法访问外部文件或服务,也无法搜索网页 -- 该 AI 助手无法连接到外部 MCP 服务器来扩展自己的工具。若要在 Tabular Editor 3 中使用您自己的代理,请参阅 @mcp-server -- 该 AI 助手无法在聊天中切换到其他模型。在 Tabular Editor 用户界面中更改模型连接 -- 该 AI 助手无法管理偏好 +- 需要您自己的 API 密钥;未内置 API 密钥 +- 回答质量取决于您选择的提供商和模型 +- AI 助手不能替代对 DAX 和语义模型设计基础知识的了解 +- AI 助手无法访问外部文件或服务,也无法搜索网络 +- AI 助手无法连接到外部 MCP 服务器以扩展其自身的工具。要将您自己的代理与 Tabular Editor 3 一起使用,请参阅 @mcp-server +- AI 助手无法连接到与聊天不同的模型。在 Tabular Editor 用户界面中更改模型连接 +- AI 助手无法管理偏好设置 ## 禁用 AI 助手 -AI 助手是一个可选组件,自 Tabular Editor 3.27.0 起默认随产品安装。再次运行 Tabular Editor 3 安装程序,然后选择 **Modify**,以在现有安装中包含或排除该组件。升级会保留现有选择;请参阅[升级与 AI 功能组件](xref:installation-activation-basic#upgrades-and-the-ai-features-component)。在便携版本中,从安装目录中删除 `TabularEditor3.AI.dll` 即可将其移除。 +AI 助手是一个可选组件,从 Tabular Editor 3.27.0 开始默认安装。再次运行 Tabular Editor 3 安装程序,然后选择**修改**,以在现有安装中包含或排除该组件。升级将保留现有选择;请参阅[升级和 AI 功能组件](xref:installation-activation-basic#upgrades-and-the-ai-features-component)。在便携式版本中,从安装目录中删除 `TabularEditor3.AI.dll` 即可将其移除。 -同一个组件还包含 MCP 服务器,因此排除该组件或删除 `TabularEditor3.AI.dll` 会同时移除两者。如果只想关闭聊天功能,保留该组件并设置 `DisableAiChat` 策略。 +同一组件包含 MCP 服务器,因此排除该组件或删除 `TabularEditor3.AI.dll` 会同时移除两者。要仅关闭聊天功能,请保留该组件并设置 `DisableAiChat` 策略。 > [!NOTE] -> 无论是否安装该组件,系统管理员都可以通过 [`DisableAi` 策略](xref:policies) 关闭 Tabular Editor 3 中的所有 AI 功能,包括 MCP 服务器。 `DisableMcpServer` 仅关闭 MCP 服务器。参见 @policies。 +> 无论是否安装该组件,系统管理员都可以使用 [`DisableAi` 策略](xref:policies)关闭 Tabular Editor 3 中的所有 AI 功能,包括 MCP 服务器。`DisableMcpServer` 仅关闭 MCP 服务器。请参阅 @policies。 diff --git a/localizedContent/zh/content/features/auto-reload.md b/localizedContent/zh/content/features/auto-reload.md index 5c78c3fa1..f771b7092 100644 --- a/localizedContent/zh/content/features/auto-reload.md +++ b/localizedContent/zh/content/features/auto-reload.md @@ -2,7 +2,7 @@ uid: auto-reload title: 从磁盘自动重新加载 author: Morten Lønskov -updated: 2026-09-23 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -12,70 +12,69 @@ applies_to: editions: - edition: Desktop none: true - note: "桌面版无法打开或保存模型元数据文件。" + note: "Desktop Edition can't open or save model metadata files." - edition: Business full: true - edition: Enterprise full: true --- - # 从磁盘自动重新加载 -当你从文件或文件夹加载的模型的元数据文件在磁盘上发生变化时,Tabular Editor 会自动重新加载该模型。如果你有未保存的更改,会弹出提示,供你选择重新加载还是保留更改。外部更改的常见来源包括 AI 智能体、脚本、其他编辑器、执行 `git pull`,或同事在共享文件夹中编辑。 +当您从文件或文件夹加载的模型在磁盘上的元数据文件发生变化时,Tabular Editor 会自动重新加载该模型。如果您有未保存的更改,系统会显示提示,让您选择重新加载或保留更改。外部更改的常见来源包括 AI 代理、脚本、其他编辑器、`git pull` 或编辑共享文件夹的同事。 -![图示:文件 > 保存会将 Tabular Editor 中的模型写入磁盘上的文件;另一个工具写入这些文件;自动重新加载再将已更改的文件加载回 Tabular Editor](~/content/assets/images/features/auto-reload-sync.png) +![示意图:选择“文件”>“保存”会将 Tabular Editor 中的模型写入磁盘上的文件;另一个工具将内容写入文件;自动重新加载会将已更改的文件重新加载到 Tabular Editor 中](~/content/assets/images/features/auto-reload-sync.png) > [!NOTE] -> 自动重新加载会监视文件,其行为不受 [工具 > 偏好 > Tabular Editor > 杂项](xref:preferences#miscellaneous) 下的 **跟踪外部模型更改** 和 **自动刷新本地 Tabular Object Model 元数据** 影响。这些设置使用 Analysis Services 跟踪来检测连接到的数据库中的更改。 +> 自动重新加载功能会监视文件,并且独立于 [工具 > 首选项 > Tabular Editor > 其他](xref:preferences#tabular-editor--miscellaneous) 下的**跟踪外部模型更改**和**自动刷新本地 Tabular Object Model 元数据**。这些设置使用 Analysis Services 跟踪来检测对连接的数据库的更改。 -## 监视的文件 +## 受监视的文件 -| 模型加载来源 | 监视的文件 | -| ------------------------------------------------------------------------------------ | ------------------------------------------------------- | -| 一个`.bim`文件 | 该文件。同一文件夹中的其他文件会被忽略。 | -| 一个采用 JSON(Database.json)格式的文件夹 | 模型根目录下的每个 `.json` 文件,包括子文件夹中的文件。 | -| 一个采用 [Tabular Model Definition Language (TMDL)](xref:tmdl) 格式的文件夹 | 模型根目录下的每个 `.tmdl` 文件,包括子文件夹。 | -| 一个 Workspace 数据库 | 在[工作区模式](xref:workspace-mode)下,为模型提供支持的文件,遵循与上面各行相同的规则。 | -| 工作区模式之外的数据库或 Power BI Desktop | 无。该模型在磁盘上没有文件。 | -| 一个 `.pbit` 模板,或一个你从未保存过的模型 | 无。 | +| 模型加载自 | 受监视的文件 | +|---|---| +| `.bim` 文件 | 该文件。同一文件夹中的其他文件将被忽略。| +| JSON (Database.json) 格式的文件夹 | 模型根目录下的每个 `.json` 文件,包括子文件夹。| +| [表格模型定义语言 (TMDL)](xref:tmdl) 格式的文件夹 | 模型根目录下的每个 `.tmdl` 文件,包括子文件夹。| +| 工作区数据库 | 在[工作区模式](xref:workspace-mode)下支持模型的文件,遵循与上述行相同的规则。| +| 数据库或 Power BI Desktop,非工作区模式 | 无。模型在磁盘上没有文件。| +| `.pbit` 模板或您从未保存过的模型 | 无。| -## 有未保存更改时重新加载 +## 重新加载未保存的更改 -如果你有未保存的更改,则会显示 **检测到外部更改** 提示。由于 Tabular Editor 不会合并这些更改,你需要选择保留哪个版本。 +如果您有未保存的更改,则会显示**检测到外部更改**提示,并且您可以选择要保留的版本,因为 Tabular Editor 不会合并这些更改。 -![“检测到外部更改”提示对话框,包含“重新加载”和“忽略”按钮,焦点位于“重新加载”](~/content/assets/images/features/external-changes-prompt.png) +![带有“重新加载”和“忽略”按钮的“检测到外部更改”提示,焦点在“重新加载”上](~/content/assets/images/features/external-changes-prompt.png) -- **重新加载** 会丢弃你未保存的更改,并加载磁盘上的版本。 -- **忽略** 会保留你的更改。磁盘上的文件会保留这些外部更改,而你下一次保存会覆盖它们。 +- **重新加载**将放弃您未保存的更改,并加载磁盘上的版本。 +- **忽略**将保留您的更改。磁盘上的文件保留外部更改,您的下一次保存将覆盖这些更改。 -按 **Esc** 或关闭该提示的效果与 **忽略** 相同。 +按 **Esc** 或关闭提示的效果与**忽略**相同。 > [!WARNING] -> **重新加载** 是默认按钮,因此在提示中按 **Enter** 也会执行重新加载。重新加载会直接丢弃你未保存的更改,不会再进一步确认,而且无法撤销。 +> **重新加载**是默认按钮,因此在提示时按**Enter**也会重新加载。重新加载会放弃您未保存的更改,无需进一步确认,且无法撤消。 ### 示例 -1. 你打开一个 TMDL 文件夹模型,并重命名一个度量值。 +1. 您打开一个 TMDL 文件夹模型并重命名一个度量值。 2. 在同一文件夹中工作的 AI 代理重写了四个 `.tmdl` 文件。 -3. 代理写入完成后,会出现一次 **检测到外部更改** 提示。 -4. 你选择 **重新加载**,这会放弃该重命名并加载代理的更改。 TOM Explorer 会保留已展开的节点。 +3. 代理的写入操作完成后,将显示一个“检测到外部更改”提示。 +4. 您选择**重新加载**,这将放弃重命名并加载代理的更改。TOM Explorer 保留其展开的节点。 ## 多次写入和后台更改 -当某个工具重写以文件夹序列化的模型时,它会在短时间内连续更改多个文件,而 Tabular Editor 会在写入完成后统一重新加载一次。 +当工具重写文件夹序列化模型时,它会快速连续地更改多个文件,并且 Tabular Editor 在写入完成后会重新加载一次。 -如果文件发生更改时 Tabular Editor 不是活动窗口,则重新加载或提示会在你切换回它时出现。它处于非活动状态期间发生的所有更改都会合并为一次提示。 +如果文件发生变化时 Tabular Editor 不是活动窗口,则在您切换回该窗口时会进行重新加载或显示提示。在非活动状态下所做的所有更改都会产生一个提示。 ## 工作区模式 -在[工作区模式](xref:workspace-mode)下,重新加载还会将模型重新部署到 Workspace 数据库中。 +在[工作区模式](xref:workspace-mode)下,重新加载还会将模型重新部署到工作区数据库。 -## 关闭此功能 +## 关闭自动重新加载 -自动重新加载默认启用。若要关闭,请在 **工具 > 偏好 > Tabular Editor > 杂项** 下取消勾选 **自动从磁盘重新加载(热重载)**。 +默认情况下,自动重新加载处于启用状态。要禁用此功能,请在**工具 > 首选项 > Tabular Editor > 其他**下取消选中**自动从磁盘重新加载(热重载)**。 -![工具 > 偏好 > Tabular Editor > 杂项,显示“元数据同步”下的自动重新加载设置](~/content/assets/images/pref-miscellaneous.png) +![工具 > 首选项 > Tabular Editor > 其他,显示“元数据同步”下的自动重新加载设置](~/content/assets/images/pref-miscellaneous.png) -如果某个持续运行的进程也会写入模型文件夹(例如文件同步客户端,或在后台刷新的 CI 检出副本),建议将其关闭。每次更改都会触发一次重新加载;如果存在未保存的更改,则会弹出模态提示对话框。 +如果某个持续运行的进程(例如文件同步客户端或在后台刷新的 CI 签出)也会写入模型文件夹,请将其关闭。每次更改都会触发重新加载,或者当您有未保存的更改时,会显示模态提示。 -取消选中此设置后,使用 **文件 > 从磁盘重新加载** 加载外部更改,或使用 **文件 > 保存** 用 Tabular Editor 中的模型覆盖它们。有关该页面上的其他设置,请参阅[偏好](xref:preferences#miscellaneous)。 +取消该设置后,使用**文件 > 从磁盘重新加载**来加载外部更改,或使用**文件 > 保存**使用 Tabular Editor 中的模型覆盖它们。有关该页面上的其他设置,请参阅[偏好](xref:preferences#tabular-editor--miscellaneous)。 diff --git a/localizedContent/zh/content/features/dax-debugger.md b/localizedContent/zh/content/features/dax-debugger.md index 717ac966e..5c3785fe6 100644 --- a/localizedContent/zh/content/features/dax-debugger.md +++ b/localizedContent/zh/content/features/dax-debugger.md @@ -1,6 +1,6 @@ ---- +--- uid: dax-debugger -title: DAX调试器 +title: DAX 调试器 author: Daniel Otykier updated: 2026-10-12 applies_to: @@ -16,148 +16,139 @@ applies_to: - edition: Enterprise full: true --- - -# DAX调试器 +# DAX 调试器 > [!NOTE] -> DAX调试器在 3.2.0 版本中推出。随着我们为调试器添加更多功能,本文信息可能会有所变化。 - - +> DAX 调试器在 3.2.0 版本中推出。随着我们为调试器添加更多功能,本文中的信息可能会发生变化。 -众所周知,DAX 是一门相对复杂、很难精通的语言。大多数数据模型开发者可能都经历过这样一种情况:DAX 代码没有返回预期结果。在这种情况下,把代码按变量逐个拆开、按函数调用逐步拆开,会有助于更好地理解到底发生了什么。 + -在此之前,对代码进行这种“拆解”既繁琐又耗时,往往需要捕获客户端工具执行的 DAX 查询,然后在 [DAX Studio](https://daxstudio.org/) 或 [SQL Server Management Studio](https://docs.microsoft.com/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15) 中将查询拆分并执行其中较小的部分。 +众所周知,DAX 是一种相对复杂的语言,很难掌握。大多数数据模型开发人员可能都曾遇到过 DAX 代码未返回预期结果的情况。在这种情况下,将代码逐个变量和逐个函数调用进行分解,有助于更好地了解发生了什么。 -Tabular Editor 3 引入了 **DAX调试器** 概念,这是一款工具,可让你更轻松地逐步深入模型中的 DAX 代码。从概念上讲,这个调试器类似于传统 IDE 的调试器,比如你在开发 C# 应用程序时 Visual Studio 自带的调试器。 +到目前为止,这种代码的“分解”是一项繁琐且耗时的任务,通常需要捕获由客户端工具执行的DAX查询,以便将其分解并在[DAX Studio](https://daxstudio.org/)或[SQL Server Management Studio](https://docs.microsoft.com/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15)中执行较小的查询片段。 -## 先决条件 +Tabular Editor 3 引入了**DAX 调试器**的概念,这是一种工具,让您单步执行模型 DAX 代码的过程变得更加轻松。在概念层面上,调试器类似于传统的 IDE 调试器,例如在开发 C# 应用程序时 Visual Studio 中所用的调试器。 -DAX调试器会分析你模型中的 DAX 代码,并生成适用于评估子表达式、行语境等的 DAX 查询,让你能够以交互方式逐步执行代码。 +## 前提条件 +DAX 调试器分析模型中的 DAX 代码,并生成用于评估子表达式、行上下文等的合适 DAX 查询,使您能够以交互方式单步执行代码。 -要实现这一点,Tabular Editor 3 必须在 **连接模式** 或 **工作区模式** 下运行,比如直接从 Power BI Desktop 或任何其他 Analysis Services 实例加载模型元数据时。 +为了使此功能正常工作,Tabular Editor 3 必须在**连接模式**或**工作区模式**下运行,例如直接从 Power BI Desktop 或任何其他 Analysis Services 实例加载模型元数据时。 # 开始使用 -当 Tabular Editor 3 已连接到某个 Analysis Services 实例时,可以通过以下两种方式之一启动调试器: +当 Tabular Editor 3 连接到 Analysis Services 实例时,可以通过以下两种方式之一启动调试器: - 通过 Pivot Grid - 通过 DAX 查询 -启动调试器后,你会看到多个新视图,它们为正在调试的代码提供上下文信息;同时还会有一个 DAX 脚本视图,用于突出显示当前正在调试的那部分代码。 +启动调试器后,系统会向您显示多个新视图,这些视图提供有关正在调试的代码的上下文信息,以及突出显示当前正在调试的代码部分的 DAX 脚本视图。 > [!TIP] -> 在开始调试会话之前,建议先格式化你的 DAX 代码,让代码更易读。 - -# 通过 Pivot Grid 调试 - -1. 创建一个新的 Pivot Grid(**文件 > 新建 > Pivot Grid**) -2. 将你要调试的度量值添加到 Pivot Grid。你可以: +> 在开始调试会话之前,请考虑格式化您的 DAX 代码,以便于阅读。 -- 从 TOM Explorer 拖动一个度量值,或 -- 在 TOM Explorer 中右键单击某个度量值,然后选择 **添加到 Pivot Grid**,或 -- 从 Pivot Grid 字段列表中选择该度量值(**Pivot Grid > 显示字段**) +# 通过 Pivot Grid 进行调试 -3. (可选)在 Pivot Grid 的筛选区域、列区域或行区域中添加一列或多列。 -4. 在 Pivot Grid 中右键单击数值单元格,然后选择 **调试此值**。 +1. 创建新的 Pivot Grid (**文件 > 新建 > Pivot Grid**) +2. 将您要调试的度量值添加到Pivot Grid中。您可以: + - 从 TOM Explorer 中拖动一个度量值,或 + - 在 TOM Explorer 中右键单击一个度量值,然后选择**添加到 Pivot Grid**,或者 + - 从Pivot Grid字段列表中选择度量值(**Pivot Grid > 显示字段**) +3. (可选)在筛选器区域、列区域或行区域中,向 Pivot Grid 添加一个或多个列或层次结构。 +4. 右键单击Pivot Grid中的值单元格,然后选择**调试此值**。 -![从 Pivot Grid 调试](~/content/assets/images/features/debug-from-pivot.png) +![从数据透视表调试](~/content/assets/images/features/debug-from-pivot.png) -# 通过 DAX 查询调试 +# 通过 DAX 查询进行调试 -1. 创建一个新的 DAX 查询(**文件 > 新建 > DAX 查询**)。 -2. 输入或粘贴 DAX 查询。通常,这应是一条由 `SUMMARIZECOLUMNS` 调用构成的查询,并包含一个或多个(显式)度量值,例如 Power BI 中的 Visual 所生成的查询。 +1. 创建新的 DAX 查询(**文件 > 新建 > DAX 查询**)。 +2. 输入或粘贴 DAX 查询。这通常应是一个由 `SUMMARIZECOLUMNS` 调用组成、包含一个或多个(显式)度量值的查询,例如 Power BI 中可视化对象生成的查询。 > [!TIP] -> 你可以在 Power BI Desktop 中使用 [Performance Analyzer](https://docs.microsoft.com/power-bi/create-reports/desktop-performance-analyzer) 来捕获由各个 Visual 生成的查询。 +> 您可以使用 Power BI Desktop 中的[性能分析器](https://docs.microsoft.com/power-bi/create-reports/desktop-performance-analyzer)来捕获视觉对象生成的查询。 -3. 按 F5 在 Tabular Editor 3 中执行查询。找到你要调试的值,右键单击该单元格并选择 **调试**。 +3. 按 F5 在 Tabular Editor 3 中执行查询。找到要调试的值,右键单击单元格,然后选择**调试**。 -![从查询中调试](~/content/assets/images/features/debug-from-query.png) +![从查询调试](~/content/assets/images/features/debug-from-query.png) # 调试视图 -调试器提供以下视图(如果它们被隐藏,可通过 **调试 > 窗口** 菜单访问)。 +调试器提供以下视图(如果这些视图被隐藏,则可以通过**“调试”>“窗口”**菜单访问)。 - 局部变量 -- 监视 +- 观察 - 评估语境 - 调用树 ## 局部变量 +此视图列出当前执行范围内的列、度量值和变量,并显示它们的值。它还显示当前正在调试的子表达式的值。当跳转到不同的子表达式时,或者当评估语境发生变化时,此列表中的值会自动更新。**局部值始终在调用树的当前所选项处进行求值**。 -此视图会列出当前执行范围内的列、度量值和变量,并显示它们的值。它还会显示当前正在调试的子表达式的值。当你单步切换到其他子表达式,或评估语境发生变化时,此列表中的值会自动更新。**局部变量值始终在调用树中当前选定的项上求值**。 +![局部变量](~/content/assets/images/locals.png) -![Locals](~/content/assets/images/locals.png) +您可以通过单击**值**列中的放大镜按钮来检查局部变量值。这将弹出一个对话框,更详细地显示该值。如果检查的值是表,则此功能特别有用。 -你可以在 **值** 列中点击放大镜按钮来检查某个局部变量值。这会弹出一个对话框,更详细地显示该值。当被检查的值是一个表时,这尤其有用。 +![检查局部变量值](~/content/assets/images/inspect-locals.png) -![Inspect locals value](~/content/assets/images/inspect-locals.png) +如果您希望在单独的 DAX 查询窗口中检查局部变量值,可以关闭**工具 > 首选项 > DAX 调试器 > 局部变量**下的**使用弹出检查器**选项。 -如果你更想在单独的 DAX 查询窗口中检查局部变量值,可以在 **工具 > 偏好 > DAX调试器 > 局部变量** 中关闭 **使用弹出式检查器** 选项。 +![DAX 调试器设置](~/content/assets/images/features/dax-debugger-settings.png) -![Dax 调试器设置](~/content/assets/images/features/dax-debugger-settings.png) +## 观察 +此视图允许您输入任何 DAX 表达式,该表达式将在当前评估上下文中进行计算。您可以输入标量和表格表达式,您可以使用所有可用的 DAX 函数,并引用当前计算范围内的变量。当单步执行到不同的子表达式时,或者当评估上下文发生变化时,监视值将自动更新。**监视值始终在评估语境栈中当前选定项的范围内进行评估**。 -## 监视 +![监视](~/content/assets/images/watch.png) -此视图允许你输入任意 DAX 表达式,并在当前评估语境中进行计算。你既可以输入标量表达式,也可以输入表表达式;可以使用所有可用的 DAX 函数,并引用当前评估范围内的变量。当你单步切换到其他子表达式,或评估语境发生变化时,监视值会自动更新。**监视值始终在评估语境堆栈中当前选定项的作用域内求值**。 +要快速将变量、度量值或子表达式添加到“监视”视图,只需突出显示一部分代码,然后将其拖入“监视”视图即可。您还可以将光标置于要添加的表达式上,然后右键单击并选择**观察此表达式**: -![Watch](~/content/assets/images/watch.png) +![快速添加到监视](~/content/assets/images/quick-add-to-watch.png) -要快速将变量、度量值或子表达式添加到“监视”视图,只需选中一段代码并将其拖到“监视”视图中。你也可以将光标放在要添加的表达式上,然后右键并选择 **监视此表达式**: +要添加、复制或删除观察表达式,请使用“观察”视图的右键单击上下文菜单: -![Quick Add To Watch](~/content/assets/images/quick-add-to-watch.png) +![“监视”上下文菜单](~/content/assets/images/watch-context-menu.png) -要添加、复制或删除观察表达式,请使用“监视”视图的右键菜单: +**生成查询**选项与**值**列中的放大镜按钮相同,如下图所示。点击此选项后,调试器将打开一个新的 DAX 查询文档,该文档定义了计算的上下文以及计算本身,使您可以更详细地查看结果。当监视表达式是表表达式时,此功能尤为有用,如下所示: -![Watch Context Menu](~/content/assets/images/watch-context-menu.png) - -**生成查询** 选项与 **值** 列中的放大镜按钮一致,如下方截图中高亮所示。点击此项后,调试器会打开一个新的 DAX 查询文档,其中既定义了计算的语境,也定义了计算本身,让你能够更详细地检查结果。当观察表达式是表表达式时,这一点尤其有用,如下所示: - -![Inspect Watch](~/content/assets/images/inspect-watch.png) +![检查监视](~/content/assets/images/inspect-watch.png) > [!TIP] -> **Locals** 视图和 **Watch** 视图有什么区别? -> -> - **Locals** 会显示当前执行范围内列、度量值、变量及其他相关子表达式的值,其中也包括调用树中当前选定子表达式的值。 -> - **Watch** 允许你输入任意 DAX 表达式,并在当前评估语境中对其进行计算。 +> **局部变量**视图和**监视**视图有何区别? +> - **局部变量**显示当前执行范围内的列、度量值、变量和其他相关子表达式的值,包括调用树中当前所选子表达式的值。 +> - **监视**允许您输入任何 DAX 表达式,该表达式将在当前评估上下文中进行计算。 ## 评估语境 - -此视图提供有关当前子表达式的 DAX 评估语境的信息。例如,`CALCULATE` 表达式可能会执行语境转换,或向评估语境添加筛选;`SUMX` 这类迭代器则可能会添加行语境。 +此视图提供有关当前子表达式的 DAX 求值上下文的信息。例如,`CALCULATE` 表达式可能会执行语境转换或向求值语境添加筛选器,或者 `SUMX` 迭代器可能会添加行语境。 ![评估语境](~/content/assets/images/evaluation-context.png) -你可以在评估语境堆栈中双击某个项目,将焦点定位到该项目。这会使所有 **Watch** 表达式在新的语境下重新计算(即从堆栈底部直到并包含当前聚焦项的所有语境)。如下方动画所示。另外,你还可以在任意活动迭代中通过翻页浏览各行,从而在活动行语境中检查各列的值: +您可以双击“评估上下文”堆栈中的某个项目,将焦点移至该项目。这将导致所有**监视**表达式在新上下文中重新求值(即从栈底到当前聚焦项(含)的所有上下文)。下图动画对此进行了说明。另请注意,您还可以通过在任何活动迭代中翻页浏览行,来检查活动行语境中各个列的值: -![Call Tree](~/content/assets/images/navigating-evaluation-context.gif) +![调用树](~/content/assets/images/navigating-evaluation-context.gif) -你还可以从外层筛选语境中切换单个筛选条件(例如,生成查询的 [`SUMMARIZECOLUMNS`](https://dax.guide/summarizecolumns) 调用中的分组列,或 Pivot Grid 中指定的筛选条件)。如下方动画所示。以这种方式切换的筛选条件会同时对 Watch 和 Locals 生效。 +您还可以从外部筛选语境中切换单个筛选器(例如,在生成查询的 [`SUMMARIZECOLUMNS`](https://dax.guide/summarizecolumns) 调用中对列进行分组,或在 Pivot Grid 中指定筛选器)。下面的动画对此进行了说明。以这种方式切换的筛选器将同时应用于“监视”和“局部变量”。 -![Call Tree](~/content/assets/images/toggle-filters.gif) +![调用树](~/content/assets/images/toggle-filters.gif) -最后,你可以浏览任意迭代器的前 1000 行:点击 **Row** 列中的 Zoom 按钮,即可将当前行语境设置为这前 1000 行中的某一行。 +最后,您可以通过点击**行**列中的“缩放”按钮,浏览任何迭代器的前 1000 行,并将当前行语境设置为这前 1000 行中的特定行。 -![Browse Row Contexts](~/content/assets/images/browse-row-contexts.png) +![浏览行上下文](~/content/assets/images/browse-row-contexts.png) ## 调用树 +此视图提供了整个计算的概览,并让您可以通过双击轻松在子表达式之间导航(您也可以使用快捷键进行导航)。该树还提供有关上下文转换、迭代和行上下文的信息。不会被执行的代码分支(例如在 `IF` 或 `SWITCH` 调用中,或者当迭代器为空时)会被划掉。 -此视图提供整个计算的结构概览,并让你通过双击轻松在各个子表达式之间导航(也可以使用快捷键进行导航)。该树还提供有关语境转换、迭代以及行语境的信息。不会执行的代码分支(例如 `IF` 或 `SWITCH` 调用中的分支,或迭代器为空时)会被加上删除线。 - -![Call Tree](~/content/assets/images/call-tree.png) +![调用树](~/content/assets/images/call-tree.png) -当你在调用树的各个项之间切换时,调试器中的 DAX 脚本会高亮显示与当前调用树项对应的代码,并标出(以灰色背景显示)到达该高亮代码所经过的路径,如下所示: +当您在调用树中的项之间导航时,DAX 调试脚本将突出显示与调用树项对应的代码,同时还会(以灰色背景)指示到达突出显示的代码所采用的路径,如下所示: -![Call Tree](~/content/assets/images/navigating-call-tree.gif) +![调用树](~/content/assets/images/navigating-call-tree.gif) -注意,当你在树中导航时,**Locals** 视图中的值会随之更新。你也可以将光标悬停在表达式上,右键单击并选择 **Step into selection** 选项(Ctrl+B),进入某个子表达式。 +请注意,在浏览树时,**局部变量**视图中的值是如何更新的。您还可以通过将光标悬停在表达式上、右键单击并选择**单步执行到选定内容**选项 (Ctrl+B) 来导航到子表达式。 -![Step into selection](~/content/assets/images/debugger-step-into-selection.png) +![单步执行到选定内容](~/content/assets/images/debugger-step-into-selection.png) ## 标量谓词 -在 [`CALCULATE`](https://dax.guide/calculate) 或 [`CALCULATETABLE`](https://dax.guide/calculatetable) 函数的筛选参数中使用的标量谓词,会在 **Locals** 视图中以一种特殊方式处理。 +[`CALCULATE`](https://dax.guide/calculate) 或 [`CALCULATETABLE`](https://dax.guide/calculatetable) 函数的筛选器参数中使用的标量谓词在**局部变量**视图中以特殊方式处理。 -例如,下面的度量值使用了一个标量谓词,仅显示在美国或加拿大产生的销售额。 +例如,以下度量值使用标量谓词,仅显示在美国或加拿大实现的销售额。 ```dax CALCULATE( @@ -166,7 +157,7 @@ CALCULATE( ) ``` -乍一看,第 3 行的表达式似乎会返回一个标量值(true/false)。不过,在 DAX 中,筛选条件本质上是表。实际上,标量谓词会使用 [`FILTER`](https://dax.guide/filter) 函数转换为一个表表达式,如下所示: +乍一看,第 3 行的表达式似乎会返回标量值(真/假)。但是,在 DAX 中,筛选器是表格。实际上,标量谓词使用 [`FILTER`](https://dax.guide/filter) 函数转换为表表达式,如下所示: ```dax CALCULATE( @@ -178,48 +169,48 @@ CALCULATE( ) ``` -`FILTER` 函数是一个迭代器,会遍历表 `ALL(Geography[Country Region Code])`,即 Geography 表中“Country Region Code”列的所有唯一值。迭代器会为迭代中的每一行生成一个筛选语境。然后会在每个这样的行语境中计算该标量谓词。对于 `FILTER` 函数,只会保留谓词计算结果为 `TRUE` 的行。在此示例中,`FILTER` 函数会输出一个包含 1 列(“Country Region Code”)且有 2 行(“US”和“CA”)的表。 +`FILTER` 函数是一个迭代器,它对表 `ALL(Geography[Country Region Code])` 进行迭代,即对“Geography”表中“Country Region Code”列的所有唯一值进行迭代。迭代器为迭代中的每一行生成一个筛选语境。然后,在每个此类行语境中对标量谓词求值。对于 `FILTER` 函数,仅保留谓词计算结果为 `TRUE` 的行。在此示例中,`FILTER` 函数将输出一个包含 1 列(“Country Region Code”)和 2 行(“US”和“CA”)的表。 -在调试标量谓词时,**Locals** 视图会显示两个特殊项:**(Current expression)** 和 **(Filter expression)**。具体如下: +调试标量谓词时,**“局部变量”**视图将显示两个特殊项:**(当前表达式)**和**(筛选器表达式)**。这些项目描述如下: ![调试标量谓词](~/content/assets/images/features/debug-scalar-predicates.png) -在上面的屏幕截图中: +在上面的截图中: -1. 这是当前正在调试的标量谓词。尽管这个子表达式看起来像是应返回标量值(true/false),但实际上它返回的是一张表。 -2. **(当前表达式)**:这是谓词在上文所述、由 `FILTER` 函数生成的当前行语境中求值后得到的标量值。在截图中,标量值的计算结果为 `False`,因为当前行语境中 [Country Region Code] 的值是 "AU",如在 **Watch** 视图中所示 (4)。我们可以使用 **Evaluation Context** 视图 (5) 逐行浏览迭代过程。 -3. **(筛选表达式)**:这是由 `FILTER` 函数生成的表表达式,如上所述。在截图中,这是一个 1x2 表,包含值 "US" 和 "CA"。点击放大镜按钮会打开一个弹出窗口,以网格形式显示表中的值。 -4. 我们可以使用 **Watch** 窗口,在当前评估语境中对任意 DAX 表达式求值。在这种情况下,由于我们有一个活动的行语境,因此可以直接引用行语境中的列,例如 `Geography[Country Region Code]`。我们可以看到此列的当前值是“AU”,因此标量谓词 (2) 的求值结果为 `False`。 -5. 我们可以使用 **Evaluation Context** 视图逐行浏览迭代过程。这会更新 **Locals** 视图以及 **Watch** 视图中的值,以反映当前行语境中的值。 +1. 这是当前正在调试的标量谓词。尽管这个子表达式看起来像是应该返回标量值(真/假)的表达式,但实际上它返回的是一个表。 +2. **(当前表达式)**:这是谓词的*标量*值,当在如上所述由 `FILTER` 函数生成的当前*行语境*中求值时。在截图中,标量值的计算结果为 `False`,因为当前行语境中 [Country Region Code] 的值为“AU”,如 **Watch** 视图 (4) 中所示。我们可以使用**评估语境**视图 (5),逐一行滚动浏览迭代的行。 +3. **(筛选器表达式)**:这是由 `FILTER` 函数生成的*表*表达式,如上所述。在截图中,这是一个包含值“US”和“CA”的 1x2 表格。点击放大镜按钮将打开一个弹出窗口,在网格中显示表格值。 +4. 我们可以使用“监视”窗口来计算当前计算上下文中的任何 DAX 表达式。在这种情况下,由于我们有活动行语境,因此可以直接引用行语境中的列,例如 `Geography[Country Region Code]`。我们可以看到,此列的当前值为“AU”,这就是标量谓词 (2) 的计算结果为 `False` 的原因。 +5. 我们可以使用**评估语境**视图逐行滚动浏览迭代的行。这将更新**局部变量**视图和**监视**视图中的值,以反映当前行语境中的值。 ## 键盘快捷键 -使用以下键盘快捷键可快速在调用树中导航: +使用以下键盘快捷键快速导航调用树: -- **单步进入 (F11)** - 进入调用树中当前项的第一个子项。如果没有更多子项,则跳转到下一个同级项。 +- **单步执行 (F11)** - 单步执行到调用树中当前项的第一个子项。如果没有更多子项,则跳转到下一个同级项。 - **单步跳出 (Shift-F11)** - 跳出到调用树中当前项的父项。 -- **单步跳过 (F10)** - 跳转到下一个函数参数、算术运算的下一个子表达式,或进入当前函数调用(如果它不是一个简单的函数)。 -- **回退一步 (Shift-F10)** - 跳转到上一个函数参数、算术运算的上一个子表达式;如果当前项之前没有参数或子表达式,则跳出到当前项的父项。 -- **进入所选内容 (Ctrl-B)** - 跳转到光标下的表达式。如果有多条路径通向同一表达式(例如,当某个度量值被多个度量值引用,而这些度量值又被其他度量值引用时),系统会弹出对话框提示你选择路径。 -- **下一行 (F9)** - 将最内层迭代的行语境移动到迭代器的下一行。 -- **上一行 (Shift-F9)** - 将最内层迭代的行语境移动到迭代器的上一行。 +- **单步执行 (F10)** - 跳转到下一个函数参数、算术运算的下一个子表达式,或单步进入当前函数调用(如果是非平凡函数)。 +- **单步返回 (Shift-F10)** - 跳转到上一个函数参数、算术运算的上一个子表达式,或者如果当前项目之前没有参数或子表达式,则单步返回到当前项目的父级。 +- **单步执行到选定内容 (Ctrl-B)** - 跳转到光标下的表达式。如果多条路径指向同一表达式(例如,当一个度量值被多个度量值和这些度量值引用时),将弹出一个对话框,提示您选择路径。 +- **下一行 (F9)** - 将最内层迭代的行上下文移至迭代器的下一行。 +- **上一行 (Shift-F9)** - 将最内层迭代的行上下文移至迭代器的上一行。 -# 限制与已知问题 +# 限制和已知问题 -DAX调试器当前有以下限制: +DAX 调试器目前存在以下限制: -- **UDFs:** 当前不支持用户定义函数 (UDF)。如果在正在调试的代码中遇到 UDF,调试器可能会出现异常行为。 -- 调试 DAX 查询时,仅支持部分 DAX 表表达式(例如,可以调试依赖 [SUMMARIZECOLUMNS](https://dax.guide/summarizecolumns) 的查询,但其他表格函数目前不支持)。通常支持由 Power BI 生成的查询(可通过 Power BI Desktop 性能分析器捕获)。 -- 目前不支持包含隐式度量值或查询范围内计算的查询。 -- 在浏览由筛选后的表表达式产生的迭代器的前 1000 行时,浏览窗口中选中的行并不总是与评估语境堆栈中的当前行语境相对应(在 **监视** 窗口中输入 `CALCULATETABLE('
    ')` 以检查当前行语境)。 -- 调试器目前仅允许在度量值上调试 DAX 表达式。 -- 由于 [Visual 计算](https://learn.microsoft.com/power-bi/transform-model/desktop-visual-calculations-overview) 是使用查询作用域的列来定义的,因此无法进行调试。调试器目前不支持查询范围内的对象。 -- 如果某个度量值在筛选语境中被计算项修改,那么调试器的“监视/本地变量”视图里显示的部分结果可能不正确。 +- **UDF:**目前不支持用户定义函数 (UDF)。如果在正在调试的代码中遇到 UDF,调试器的行为可能会出乎意料。 +- 调试 DAX 查询时,仅支持部分 DAX 表表达式(例如,可以调试依赖于 [SUMMARIZECOLUMNS](https://dax.guide/summarizecolumns) 的查询,但目前不支持其他表函数)。通常支持由 Power BI 生成的查询(可以通过 Power BI Desktop 性能分析器捕获)。 +- 目前不支持包含隐式度量值或查询范围计算的查询。 +- 浏览由筛选的表表达式产生的迭代器的前 1000 行时,浏览窗口中选定的行并不总能与评估语境栈中的当前行语境相对应(在**监视**窗口中键入 `CALCULATETABLE('
    ')` 以检查当前行语境)。 +- 调试器目前仅允许调试度量值上的DAX表达式。 +- [可视化计算](https://learn.microsoft.com/power-bi/transform-model/desktop-visual-calculations-overview)无法调试,因为它们是使用查询范围列定义的。调试器目前不支持查询范围的对象。 +- 如果度量值被筛选语境中的计算项修改,则调试器的“监视”/“局部变量”视图中显示的部分结果可能不正确。 -如果你遇到的调试器问题不在上面的列表中,请将其提交到 TE3 社区支持 GitHub 站点的 [问题跟踪器](https://github.com/TabularEditor/TabularEditor3/issues)。 +如果您在使用调试器时遇到上述问题以外的问题,请将其发布到 TE3 社区支持 GitHub 网站上的[问题跟踪器](https://github.com/TabularEditor/TabularEditor3/issues)。 # 路线图 -我们计划在未来持续为 DAX调试器添加更多功能,以解决上述问题,并让这个工具更加强大。一如既往,我们非常欢迎反馈。功能需求和一般讨论请使用 [Discussions 区](https://github.com/TabularEditor/TabularEditor3/discussion)。 +我们计划随着时间的推移,为 DAX 调试器添加许多其他功能,以解决上述问题,并使该工具具备更强大的功能。一如既往,我们非常欢迎您提供反馈。请使用[讨论区](https://github.com/TabularEditor/TabularEditor3/discussion)提出功能请求和进行一般讨论。 -**调试愉快!** +**祝您调试愉快!** diff --git a/localizedContent/zh/content/features/dax-editor.md b/localizedContent/zh/content/features/dax-editor.md index e4212751a..88f968a92 100644 --- a/localizedContent/zh/content/features/dax-editor.md +++ b/localizedContent/zh/content/features/dax-editor.md @@ -1,8 +1,8 @@ ---- +--- uid: dax-editor title: DAX编辑器 author: Daniel Otykier -updated: 2026-09-14 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,58 +16,57 @@ applies_to: - edition: Enterprise full: true --- - # DAX编辑器 -**DAX编辑器**是 Tabular Editor 3 的核心功能。 +**DAX 编辑器**是 Tabular Editor 3 的核心。 -它提供三种不同的模式: +它有三种不同的*版本*: -- **表达式编辑器** 用于在 TOM Explorer 中对对象上的单个 DAX 表达式进行快速修改。 -- **DAX 查询**(连接功能)用于编写 DAX 查询,从已连接的 Analysis Services / Power BI 实例中获取数据。 -- **DAX脚本**:用于在单个文档中查看并编辑多个对象的 DAX 表达式及其基本属性。 +- **表达式编辑器**用于对 TOM Explorer 中对象的单个 DAX 表达式进行快速更改。 +- **DAX 查询**(已连接功能)用于编写 DAX 查询,以便从连接的 Analysis Services/Power BI 实例检索数据。 +- **DAX脚本**用于在单个文档中查看和编辑多个对象的DAX表达式和基本属性。 -这三种模式在[键盘快捷键](xref:shortcuts3#dax-code)、语法高亮、Code Assist 等方面支持的操作完全一致。 +所有三种版本在[键盘快捷键](xref:shortcuts3#dax-code)、语法高亮、代码辅助等方面都支持相同的操作。 ## Code Assist 功能 -Tabular Editor 3 的 DAX编辑器提升效率的关键在于其**参数信息**和**自动补全**功能。这些功能统称为 **Code Assist**(其他厂商通常称之为“IntelliSense”)。 +Tabular Editor 3 的 DAX 编辑器中提高工作效率的主要推动因素是其**参数信息**和**自动补全**功能。统称为**Code Assist**功能(其他供应商使用“IntelliSense”一词)。 -**参数信息**会在光标所在位置显示该 DAX 函数及其参数的详细信息。这些信息会以工具提示的形式显示在光标上方。按 [Esc] 关闭工具提示,按 [Ctrl+Shift+Space] 显示工具提示。 +**参数信息**提供有关光标所在位置的 DAX 函数及其参数的详细信息。该信息显示在光标上方的工具提示中。按 [Esc] 关闭工具提示,按 [Ctrl+Shift+空格键] 显示工具提示。 -**自动补全**会在你输入时在下拉框中提供与上下文相关的建议。你可以使用键盘在下拉列表中选择条目,按下 [Enter] 或 [Tab] 即可将所选条目插入代码中。按 [Esc] 关闭下拉框,按 [Ctrl+Space] 打开下拉框。 +**自动补全**在您输入时,在下拉框中提供与上下文相关的建议。您可以使用键盘导航下拉菜单中的项,按 [Enter] 或 [Tab] 将所选项插入到您的代码中。您可以按 [Esc] 关闭下拉菜单,按 [Ctrl+空格键] 打开下拉菜单。 -也可以通过编辑器的上下文菜单调用这些功能。 +这些功能也可以通过编辑器的上下文菜单调用。 -使用上/下箭头在不同语法选项之间切换时,DAX 调用提示会随之更新。 +当您使用向上/向下箭头切换语法备选方案时,DAX 参数提示会随之更新。 -![Dax Code Assist](~/content/assets/images/dax-code-assist.png) +![DAX 代码助手](~/content/assets/images/dax-code-assist.png) -Code Assist 的大多数选项可在 [**工具 > 偏好 > 文本编辑器 > DAX编辑器 > Code Assist**](xref:preferences#dax-editor--code-assist) 中进行配置。 +代码辅助的大多数方面都可以在 [**工具 > 首选项 > 文本编辑器 > DAX 编辑器 > 代码辅助**](xref:preferences#text-editors--dax-editor--code-assist) 下进行配置。 ## 窥视定义 -当光标停留在变量或度量值引用等对象引用上时,按下 [Alt+F12],即可在光标下方显示包含该对象定义的内联编辑器。当你想查看被引用对象的 DAX 代码,同时又不想离开文档中的当前位置时,这会很有用。 +当光标位于变量或度量值引用等对象引用上方时,按 [Alt+F12] 将在光标下方显示包含该对象定义的内联编辑器。当您想要查看引用对象的 DAX 代码,而又不想离开文档中的当前位置时,这非常有用。 ![窥视定义](~/content/assets/images/peek-definition.png) -按 Esc 键就能关闭“窥视定义”面板。 +使用 Esc 键再次关闭“窥视定义”面板。 ## 转到定义 -除了用“窥视定义”,你也可以直接跳转到被引用对象的定义位置。要这么做,按下 [F12]。如果被引用对象不在当前文档中定义,此操作会跳转到 TOM Explorer 中的该对象。如有需要,你可以按 [Alt+左箭头] 返回。 +除了“快速查看”之外,我们还可以直接跳转到被引用对象被定义的位置。要执行此操作,请按 [F12]。如果被引用对象未在当前文档中定义,此操作将跳转到 TOM Explorer 中的该对象。如果需要,您可以使用 [Alt+向左箭头] 导航返回。 ## 定义度量值 -对于 DAX脚本和 DAX 查询,有时需要将代码中其他位置引用的度量值定义一并包含进来。当光标位于度量值引用上时,**定义度量值** 功能可让你做到这一点。如果你还想把所有下游的度量值引用也一并包含进来,也可以选择 **定义度量值及依赖项** 选项。 +对于 DAX 脚本和 DAX 查询,有时包含代码中其他位置引用的 Measure 的定义会很有用。当光标位于 Measure 引用上方时,**定义 Measure** 功能可让您执行此操作。如果您还希望包含所有下游度量值引用,也可以选择**定义具有依赖项的度量值**选项。 -![定义度量值及其依赖项](~/content/assets/images/define-measure-with-deps.png) +![定义带依赖项的度量值](~/content/assets/images/define-measure-with-deps.png) ## 内联度量值 -如果你想将某个度量值的定义带入当前文档,**内联度量值** 功能正好可以做到这一点。在 DAX 编辑器中右键单击度量值引用,然后选择 **内联度量值**。 +如果您想将度量值的定义引入当前文档,**内联度量值**功能可以让您做到这一点。在 DAX 编辑器中右键单击 Measure 引用,然后选择**内联 Measure**。 -度量值引用会在评估该度量值的表达式之前,隐式将当前行转换为筛选器。因此,如果原样直接粘贴该表达式,结果就会发生变化。所以,当该引用位于行语境中时,例如作为 [`SUMX`](https://dax.guide/sumx) 或 [`FILTER`](https://dax.guide/filter) 等迭代器的第二个参数,Tabular Editor 会用 [`CALCULATE`](https://dax.guide/calculate) 包裹内联后的表达式,以保留这种行为: +在计算 Measure 的表达式之前,Measure 引用会隐式地将当前行转换为筛选器。因此,原样粘贴表达式将改变结果。所以,当引用位于行语境中时(例如,作为 [`SUMX`](https://dax.guide/sumx) 或 [`FILTER`](https://dax.guide/filter) 等迭代器的第二个参数),Tabular Editor 会将内联表达式封装在 [`CALCULATE`](https://dax.guide/calculate) 中,以保留该行为: ```dax // Before using inline measure on the [Margin] measure @@ -77,24 +76,24 @@ SUMX ( 'Sales', [Margin] ) SUMX ( 'Sales', CALCULATE ( 'Sales'[Amount] - 'Sales'[Cost] ) ) ``` -仅在确实可能影响结果时,才会添加这层包裹。在以下情况下,插入表达式时不会添加包裹: +仅在能够产生影响的地方添加包装。在以下情况下,插入的表达式不带包装: -- 该引用**不在行语境中**,包括它本来就位于自己的 `CALCULATE( …… )` 中 -- 该度量值的表达式**不从模型中读取任何内容**(例如常量、对其他度量值的引用,或对 `TODAY()` 之类函数的调用)。对表、列、日历或[用户定义函数](xref:udfs)的引用都算作从模型中读取内容,因此也会添加这层包裹 -- 该表达式**已经自行执行了上下文转换**,例如通过 `CALCULATE( …… )` 或 `CALCULATETABLE( …… )` 且不带任何筛选参数。如果带有筛选参数,仍会添加这层包裹,因为筛选参数会在转换之前求值 +- 引用**不在行语境中**,包括当它已经位于其自身的 `CALCULATE( ... )` 中时 +- 度量的表达式**不从模型中读取任何内容**(常量、对另一个度量的引用或对 `TODAY()` 等函数的调用)。对表、列、日历或[用户定义函数](xref:udfs)的引用确实算作从模型中读取,并且确实会得到包裹 +- 该表达式**已通过没有筛选器参数的 `CALCULATE( ... )` 或 `CALCULATETABLE( ... )` **自行执行转换**。如果有筛选器参数,仍会添加包裹,因为筛选器参数在转换之前进行计算。 -如果无法分析该度量值的表达式,就会添加这层包裹。原则是:多加一层即使不需要也无害,漏掉该加的一层则不行。 +如果无法分析该度量的表达式,则会添加包装,其原则是,不需要的包装是无害的,而缺少包装则不然。 -## 格式化 DAX +## 格式化DAX -Tabular Editor 3 中的 DAX编辑器会在你输入时自动格式化代码,比如修正函数和对象引用的大小写、添加合适的缩进,以及在括号内外加上适当的空格等。这些都可以在 [**工具 > 偏好 > 文本编辑器 > DAX编辑器 > 自动格式化**](xref:preferences#dax-editor--auto-formatting) 中进行配置。 +Tabular Editor 3 中的 DAX 编辑器会在您键入时自动设置代码格式,即修正函数和对象引用的大小写,在括号之间添加适当的缩进和空格等。所有这些都可以在[**工具 > 首选项 > 文本编辑器 > DAX 编辑器 > 自动格式化**](xref:preferences#text-editors--dax-editor--auto-formatting)下进行配置。 -不过,有时也需要对整个文档进行格式化。按 [F6] 即可;如果你希望换行更频繁,可按 [Shift+F6]。对于 DAX 查询,你还可以使用 [Alt+F6] 重新格式化代码,让逗号始终放在行首,这在调试时很有用。 +但是,有时有必要格式化整个文档。如果您希望更频繁地换行,可以通过按 [F6] 或 [Shift+F6] 来完成此操作。对于 DAX 查询,您还可以使用 [Alt+F6] 重新格式化代码,以便始终在行首添加逗号,这在调试时非常有用。 ## 重构 -如果你想更改变量或扩展列的名称,可以在光标位于该变量或扩展列引用处时,使用 **重构** 选项 (Ctrl+R)。这会选中该对象的所有引用,让你一次性在所有位置完成重命名。 +如果您想更改变量或扩展列的名称,可以在光标位于变量或扩展列引用上时使用**重构**选项 (Ctrl+R)。这将选择该对象的所有实例,使您能够一次性在所有位置对其重命名。 ## 可配置的键盘快捷键 -DAX编辑器以及一般的代码编辑器都具有很强的可配置性,并支持许多额外命令,帮助你快速、高效地编辑代码。你可以在 **工具 > 偏好 > Tabular Editor > 键盘** 中查看所有这些命令,并修改和分配键盘快捷键。 +DAX 编辑器和代码编辑器通常具有高度可配置性,并支持许多其他命令,用于快速、高效地编辑代码。您可以在**工具 > 首选项 > Tabular Editor > 键盘**下查看所有这些命令,以及修改和分配键盘快捷键。 diff --git a/localizedContent/zh/content/features/dax-optimizer-integration.md b/localizedContent/zh/content/features/dax-optimizer-integration.md index 661ded75a..5eb83f588 100644 --- a/localizedContent/zh/content/features/dax-optimizer-integration.md +++ b/localizedContent/zh/content/features/dax-optimizer-integration.md @@ -1,8 +1,8 @@ --- uid: dax-optimizer-integration -title: DAX优化器集成 +title: DAX 优化器集成 author: Daniel Otykier -updated: 2024-10-30 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,115 +16,114 @@ applies_to: - edition: Enterprise full: true --- - -# DAX优化器集成 +# DAX 优化器集成 > [!NOTE] -> Tabular Editor 3 **企业版** 用户可免费使用 DAX优化器。[了解更多](https://blog.tabulareditor.com/2024/10/31/free-dax-optimizer-access-in-tabular-editor-3/) +> Tabular Editor 3 **企业版**用户可免费使用 DAX Optimizer。[了解详细信息](https://blog.tabulareditor.com/2024/10/31/free-dax-optimizer-access-in-tabular-editor-3/) -Tabular Editor 3.18.0 将 **DAX优化器** 作为集成式体验引入其中。 [DAX优化器](https://daxoptimizer.com) 是一项服务,可帮助你优化 SSAS/Azure AS 表格模型以及 Power BI/Fabric 语义模型。该工具将 [VertiPaq分析器统计信息](https://www.sqlbi.com/tools/vertipaq-analyzer/) 与对你的 DAX 代码进行的静态分析相结合,从而提供一份按优先级排序的建议列表,帮助你快速定位潜在的性能瓶颈。 +Tabular Editor 3.18.0 将**DAX Optimizer** 作为集成体验推出。[DAX Optimizer](https://daxoptimizer.com) 是一项帮助您优化 SSAS/Azure AS 表格模型和 Power BI/Fabric 语义模型 的服务。该工具将[VertiPaq 分析器统计数据](https://www.sqlbi.com/tools/vertipaq-analyzer/)与 DAX 代码的静态分析相结合,从而提供一个按优先级排序的建议列表,帮助您快速识别潜在的性能瓶颈。 > [!IMPORTANT] -> DAX优化器是一项付费的第三方服务。要在 Tabular Editor 3 中使用 **DAX优化器** 功能,你需要拥有一个 [DAX优化器账户](https://www.daxoptimizer.com/free-tour/)。 +> DAX 优化器是一项付费的第三方服务。要使用 Tabular Editor 3 中的**DAX Optimizer**功能,您需要一个[DAX Optimizer 账户](https://www.daxoptimizer.com/free-tour/)。 ## 视频简介 -观看来自 [SQLBI](https://www.sqlbi.com) 的 Marco Russo 介绍 Tabular Editor 3 中的 DAX优化器集成: +观看来自 [SQLBI](https://www.sqlbi.com) 的 Marco Russo 介绍 Tabular Editor 3 中的 DAX Optimizer 集成: - + ## 开始使用 -要访问此功能,请在 **视图** 菜单中选择 **DAX优化器**。 +要访问此功能,请转到**视图**菜单,然后选择**DAX Optimizer**。 -![Dax 优化器](~/content/assets/images/features/dax-optimizer-view-menu.png) +![DAX Optimizer](~/content/assets/images/features/dax-optimizer-view-menu.png) -你会看到一个新视图,类似下图: +您将看到一个类似于下图的新视图: -![Dax 优化器视图](~/content/assets/images/features/dax-optimizer-view.png) +![DAX Optimizer 视图](~/content/assets/images/features/dax-optimizer-view.png) -要将 Tabular Editor 3 连接到 DAX优化器服务,请在 **选项** 菜单中点击 **Connect...**。系统将提示你输入 Tabular Tools(DAX优化器)的登录凭据。 +要将 Tabular Editor 3 连接到 DAX 优化器服务,请通过“选项”菜单点击“连接…”。系统将提示您输入 Tabular Tools(DAX 优化器)凭据。 -如果你想要**断开连接**或**使用其他帐户连接**,请再次打开 **Options** 菜单,然后选择 **Reconnect...** 选项。取消该对话框将断开当前会话。 +如果您希望**断开连接**或**使用其他账户连接**,请再次转到**“选项”**菜单,然后选择**“重新连接…”**选项。取消对话框将断开当前会话。 -如果你希望 Tabular Editor 3 在下次启动应用时自动连接,可以在 **Options** 菜单中勾选 **Connect automatically** 选项。如果你的 DAX优化器帐户在多个区域都有 Workspace,也可以通过 **Options** 菜单选择要连接的区域。 +如果你希望 Tabular Editor 3 在下次启动应用程序时自动连接,则可以在**选项**菜单中选中**自动连接**选项。如果您有一个在多个区域拥有工作区的 DAX Optimizer 账户,您还可以通过**选项**菜单选择要连接的区域。 -最后,**Options** 菜单还支持你在[组场景](https://docs.daxoptimizer.com/how-to-guides/managing-groups)中切换到其他帐户。 +最后,**“选项”**菜单还允许您在[组场景](https://docs.daxoptimizer.com/how-to-guides/managing-groups)中切换到其他账户。 -## 浏览 Workspace 和模型 +## 浏览工作区和模型 -连接后,视图顶部的下拉列表会自动列出你现有的 Workspace、模型和模型版本。从左到右依次选择(即先选 **Workspace**,再选 **Model**,最后选 **Version**)。该视图会显示当前所选模型版本的摘要信息,例如模型大小、表数量、度量值数量等。 +连接后,视图顶部的下拉菜单将填充您的现有工作区、模型和模型版本。请从左到右进行选择(即先选择**工作区**,然后选择**模型**,最后选择**版本**)。视图将显示当前所选模型版本的摘要,其中包含模型大小、表数、度量值数等信息。 -![Model Overview](~/content/assets/images/model-overview.png) +![模型概览](~/content/assets/images/model-overview.png) > [!NOTE] -> Tabular Editor 3 支持上传 VPAX 文件,以便在 DAX优化器服务中创建新模型或新模型版本。但如果你需要创建或管理 Workspace、移动或共享模型等,则需要通过 [DAX优化器 Web 界面](https://app.daxoptimizer.com) 来完成。 +> Tabular Editor 3 让您可以上传 VPAX 文件,以便在 DAX 优化器服务中创建新模型或模型版本。但是,如果您需要创建或管理工作区、移动或共享模型等,则需要通过 [DAX Optimizer Web 界面](https://app.daxoptimizer.com)进行操作。 -如果某个模型版本尚未分析,你会看到一个用于启动分析的选项。注意,根据你的帐户计划,可用的“运行”次数可能有限。 +如果模型版本尚未分析,您将可以选择开始分析。请注意,根据您的账户套餐,您可用的“运行”次数可能有限。 -分析完成后,你将看到一个摘要,其中显示检测到的问题数量。这里显示的信息和你在 DAX优化器网页版里看到的内容类似。 +分析完成后,系统将向您显示一个摘要,其中列出检测到的问题数量。显示的信息与您在 DAX 优化器 Web 界面中看到的信息类似。 -转到 **Issues** 或 **度量值** 选项卡查看详细结果。使用列标题对结果进行排序和筛选。 +转到**问题**或**度量值**选项卡,查看详细结果。使用列标题对结果进行排序和筛选。 -![Dax 优化器问题](~/content/assets/images/features/dax-optimizer-issues.png) +![DAX Optimizer 问题](~/content/assets/images/features/dax-optimizer-issues.png) -## 导航问题和度量值 +## 浏览问题和度量值 -在上述详细视图中双击某个问题或度量值后,你会跳转到 **DAX优化器结果** 视图;在那里会显示该度量值的原始 DAX 表达式,并将有问题的部分高亮标出。屏幕左侧的列表可让你切换需要高亮显示的具体问题。此外,你还可以使用列表中的复选框将问题标记为 **Fixed** 或 **Ignored**。 +当您在上述详细视图中双击问题或度量值时,系统将带您进入**DAX优化器结果**视图,其中显示度量值的原始DAX表达式,并突出显示有问题的地方。通过屏幕左侧的列表,您可以切换要突出显示的问题。此外,您还可以使用列表中的复选框将问题标记为**已修复**或**已忽略**。 -![Dax 优化器结果](~/content/assets/images/features/dax-optimizer-results.png) +![DAX优化器结果](~/content/assets/images/features/dax-optimizer-results.png) -在视图右上角点击 **Find in TOM Explorer...** 按钮,即可跳转到当前加载模型中对应的度量值。 +点击视图右上角的**在 TOM Explorer 中查找…**按钮,导航到当前加载模型中的相应度量值。 -勾选 **Track TOM Explorer** 复选框,使 TOM Explorer 与 **DAX优化器结果** 视图中当前选中的度量值保持同步。 +勾选**跟踪 TOM Explorer**复选框,使 TOM Explorer 与 DAX 优化器结果视图中当前选定的度量值保持同步。 -当你在 **DAX优化器结果** 视图的 DAX 代码面板中点击某个度量值引用时,视图会跳转到该度量值。然后,你可以使用 **Back** (Alt+Left) 和 **Forward** (Alt+Right) 按钮,在你访问过的度量值之间来回切换。 +当您在**DAX优化器结果**视图中的DAX代码面板中单击Measure引用时,视图将导航到该Measure。然后,您可以使用**后退**(Alt+向左键)和**前进**(Alt+向右键)按钮在您已访问的度量值之间来回导航。 ## 上传模型和模型版本 -要将 VPAX 统计信息上传到 DAX优化器,请确保 Tabular Editor 当前已连接到某个 Analysis Services 实例(SSAS、Azure AS、Power BI Desktop 或 Power BI/Fabric 的 XMLA endpoint)。然后,在 **DAX优化器** 视图左上角的下拉列表中选择 Workspace。在 **Options** 菜单中点击 **Upload...**。 +要将 VPAX 统计信息上传到 DAX优化器,请确保 Tabular Editor 当前已连接到 Analysis Services 实例(SSAS、Azure AS、Power BI Desktop 或 Power BI/Fabric XMLA endpoint)。然后,在**DAX优化器**视图的左上角下拉菜单中选择工作区。在**选项**菜单中单击**上传……**。 -你将看到一个与下图类似的对话框: +您将看到一个类似于下方所示的对话框: -![Upload Vpax](~/content/assets/images/upload-vpax.png) +![上传 Vpax](~/content/assets/images/upload-vpax.png) -在此,你可以选择将 VPAX 作为 Workspace 中的新模型上传,或将其作为现有模型的统计信息更新上传。 +在这里,您可以选择是否应将 VPAX 作为工作区中的新模型上传,或者 VPAX 是否包含现有模型的更新统计信息。 -- 对于 **新模型**,你必须提供名称,并选择是否对 VPAX 进行[混淆](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/)(关于混淆的更多信息请参见下文)。你还必须选择要把该模型上传到哪个[合约](https://docs.daxoptimizer.com/glossary/contract)下。这会影响你后续在该模型上可执行的 DAX优化器 [_runs_](https://docs.daxoptimizer.com/glossary/run) 的次数和频率。 -- 对于 **新模型版本**,你必须选择要更新的现有模型。 +- 对于**新模型**,您必须提供一个名称,并选择是否应[混淆](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) VPAX(有关混淆的更多详细信息,请参阅下文)。您还必须选择应在哪个[合约](https://docs.daxoptimizer.com/glossary/contract)下上传模型。这将影响您随后可以对模型执行的 DAX 优化器[*运行*](https://docs.daxoptimizer.com/glossary/run)的次数和频率。 +- 对于**新模型版本**,你必须选择要更新的现有模型。 -点击 **OK** 按钮后,VPAX 文件将上传到 DAX优化器,你就可以开始分析该模型。 +点击**确定**按钮后,VPAX 文件将被上传到 DAX 优化器,您将能够开始分析模型。 > [!NOTE] -> 如果在 Tabular Editor 3 中没有可用的 VertiPaq分析器统计信息,我们会在上传 VPAX 文件之前先为当前模型收集这些统计信息。对于该模型,如果上一次统计信息收集的时间早于或等于最近一次 VPAX 文件上传时所使用的统计信息时间,我们也会自动重新收集统计信息。 +> 如果 Tabular Editor 3 中没有可用的 VertiPaq 分析器统计数据,则会在上传 VPAX 文件之前收集当前模型的统计数据。如果上次收集的时间晚于或等于该模型的上次 VPAX 上传时间,也会重新收集统计数据。上传的统计数据始终从模型的数据中读取。如果无法读取统计数据,则不会开始上传。 ### 混淆 -默认情况下,使用 Tabular Editor 3 上传的 VPAX 文件会进行混淆处理。在 **Upload Model** 中,你可以在上传新模型时开启或关闭混淆。后续的模型版本上传是否混淆,将取决于第一个版本上传时的设置。你也可以在 **VertiPaq分析器** 视图中,将混淆后的 VPAX 文件导出到本地,而无需上传到 DAX优化器。在这种情况下,会生成一个字典文件,并保存在本地,与导出的 .ovpax 文件位于同一目录下。该字典文件用于对 .ovpax 文件的内容进行去混淆。 +默认情况下,使用 Tabular Editor 3 上传的 VPAX 文件将被混淆。在**上传模型**中,您可以为新模型上传启用/禁用混淆。后续模型版本的上传将根据第一个版本的上传情况进行混淆或不进行混淆。您还可以通过**VertiPaq Analyzer**视图将混淆的 VPAX 文件导出到本地,而无需上传到 DAX 优化器。在这种情况下,系统会生成一个字典文件,并将其存储在您的本地计算机上,位于导出的 .ovpax 文件旁边。此字典文件用于对 .ovpax 文件的内容进行反混淆。 -当通过 **DAX优化器** 视图将已混淆的 VPAX 数据上传到 DAX优化器服务时,Tabular Editor 会自动跟踪混淆字典,并将其存储在本机的 `%LocalAppData%\TabularEditor3\DaxOptimizer` 文件夹中。因此,在 Tabular Editor 3 中使用 **DAX优化器** 功能浏览模型时,如果在该文件夹中找到合适的字典,模型会自动去混淆,从而在使用混淆功能时获得更顺畅的体验。 +当通过**DAX优化器**视图将混淆的 VPAX 数据上传到 DAX优化器服务时,Tabular Editor 会自动跟踪混淆字典,将其存储在本地计算机的 `%LocalAppData%\TabularEditor3\DaxOptimizer` 文件夹中。因此,在使用 Tabular Editor 3 中的**DAX Optimizer**功能浏览模型时,如果在此文件夹中找到合适的字典,则会自动对模型进行反混淆处理,从而在使用混淆功能时提供更顺畅的体验。 -如果未找到字典,你可以选择手动指定一个字典文件。 +如果未找到字典,您可以选择手动指定字典文件。 -![Obfuscated Model](~/content/assets/images/obfuscated-model.png) +![混淆的模型](~/content/assets/images/obfuscated-model.png) -如果未提供字典文件,你只能浏览已混淆的模型和 DAX优化器结果,这意味着你无法查看原始 DAX 表达式,也无法在 TOM Explorer 中导航到对应的度量值。 +如果未提供字典文件,您将只能浏览混淆的模型和 DAX Optimizer 结果,这意味着您将无法查看原始 DAX 表达式或在 TOM Explorer 中导航到相应的度量值。 -[了解有关 DAX优化器 混淆的更多信息](https://docs.daxoptimizer.com/how-to-guides/obfuscating-files)。 +[了解有关DAX优化器混淆的更多信息](https://docs.daxoptimizer.com/how-to-guides/obfuscating-files)。 > [!TIP] -> 如果你想通过 DAX优化器 Web 界面浏览已混淆的模型,可以从 `%LocalAppData%\TabularEditor3\DaxOptimizer` 位置选择一个字典。 DAX优化器 Web 界面会在客户端执行去混淆,因此你的字典不会上传到 DAX优化器服务。 +> 如果您想通过 DAX 优化器 Web 界面浏览混淆模型,可以从 `%LocalAppData%\TabularEditor3\DaxOptimizer` 位置指定字典。DAX优化器 Web 界面在客户端执行反混淆操作,因此您的字典绝不会上传到 DAX优化器服务。 ### 分析模型 -VPAX 文件上传后,请稍等几秒钟,等待 DAX优化器服务对文件进行“验证”。验证完成后,勾选“你同意**消耗 1 次运行**来分析此模型。”复选框,然后在 **DAX优化器** 视图中点击 **分析** 按钮,即可执行一次 DAX优化器“运行”: +上传 VPAX 文件后,请等待几秒钟,让 DAX优化器服务“验证”该文件。验证完成后,您可以勾选“您同意**使用 1 次运行**来分析此模型。”复选框,然后点击**DAX Optimizer**视图中的**分析**按钮,以执行 DAX Optimizer“运行”: -![Dax Optimizer 分析](~/content/assets/images/features/dax-optimizer-analyze.png) +![DAX Optimizer 分析](~/content/assets/images/features/dax-optimizer-analyze.png) -分析所需时间取决于模型大小和度量值数量,通常需要几分钟。分析完成后,你将看到检测到的问题摘要。 +分析需要几分钟才能完成,具体取决于模型的大小和度量值的数量。分析完成后,系统将向您显示所检测到的问题的汇总。 ## 已知问题和限制 -以下是 **DAX优化器** 功能的已知问题和限制,我们预计会在未来版本中解决: +以下是**DAX 优化器**功能的已知问题和限制,我们预计将在未来版本中解决这些问题: -- **DAX优化器** 视图不会显示任何合同剩余的“运行”次数。变通方法:登录 https://app.daxoptimizer.com,点击右上角的“闪电”图标,查看各合同剩余的“运行”次数。 \ No newline at end of file +- **DAX 优化器**视图不会显示任何特定合约的剩余“运行”次数。作为一种变通方法,请登录 https://app.daxoptimizer.com ,然后单击右上角的“闪电”图标,以查看每个合同的剩余“运行”次数。 \ No newline at end of file diff --git a/localizedContent/zh/content/features/dax-query.md b/localizedContent/zh/content/features/dax-query.md index 7a8e61b31..b026c4c5d 100644 --- a/localizedContent/zh/content/features/dax-query.md +++ b/localizedContent/zh/content/features/dax-query.md @@ -1,8 +1,8 @@ ---- +--- uid: dax-query title: DAX 查询 author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,95 +16,101 @@ applies_to: - edition: Enterprise full: true --- - # DAX 查询 -Tabular Editor 内置 DAX 查询窗口,可针对语义模型编写并执行 DAX 查询。 +Tabular Editor 具有内置的 DAX 查询窗口,用于编写和执行针对语义模型的 DAX 查询。 -DAX 查询的一个常见用例是由 [Power BI 性能分析器](https://www.sqlbi.com/articles/introducing-the-power-bi-performance-analyzer/) 生成的 DAX 查询:可以复制每个 Visual 的查询,用于故障排查、调试或更深入的性能分析。 +DAX 查询的一个常见用例是 [Power BI 性能分析器](https://www.sqlbi.com/articles/introducing-the-power-bi-performance-analyzer/)生成的 DAX 查询,其中可以复制每个视觉对象的查询,用于故障排除、调试或详细的性能分析。 -连接到语义模型时,可通过以下三种方式之一打开该窗口: +连接到语义模型时,可以通过以下三种方式中的任意一种打开该窗口: -- **文件 > 新建 > DAX 查询** 菜单项 -- 工具栏快捷按钮 -- 在 @table-preview 的右键菜单中选择 **显示实际 DAX 查询...**,将打开一个新的查询文档,其中包含该预览背后的查询,包括筛选和排序 +- **“文件”>“新建”>“DAX 查询”**菜单 +- 工具栏快捷方式 +- @table-preview 右键菜单上的**显示实际 DAX 查询…**,这将打开一个新查询文档,其中包含预览背后的查询,包括筛选和排序 -![新建 Dax 查询](~/content/assets/images/features/dax_query_window/create_new_dax_query.png) +![新建DAX查询](~/content/assets/images/features/dax_query_window/create_new_dax_query.png) -内置的上下文感知 DAX编辑器可确保在开始新查询时只提供两个有效的 DAX 关键字:DEFINE 或 EVALUATE(按 Ctrl+Space 可自行验证) +内置的上下文感知 DAX 编辑器可确保在开始新查询时,仅提供两个有效的 DAX 关键字:DEFINE 或 EVALUATE(按 Ctrl+空格键自行验证) ## DAX 查询选项 -DAX 查询窗口提供六种不同的查询选项。 +DAX 查询窗口有六个不同的查询选项。 + +![DAX查询工具栏](~/content/assets/images/features/dax_query_window/dax_query_toolbar.png) + + +1. **执行 (F5)**:如果存在选定内容,则执行选定的DAX;否则,执行DAX查询编辑器中的完整查询。 +2. **执行完整查询**:执行DAX查询编辑器中的完整查询。 +3. **执行所选内容 (Shift+F5)**:如果存在所选内容,则执行该内容。否则,它将执行光标当前所在位置的 EVALUATE 语句。 +4. **停止**:此按钮可取消当前查询的执行。 +5. **自动执行查询**:它允许跟踪连接的语义模型,并在模型中发生任何更改时更新查询结果。这对于了解(例如)修改度量值后其结果如何变化很有帮助。 +6. **保留排序和筛选**:它允许用户控制在执行查询时如何在结果网格中保留排序和筛选。有三种偏好可用: + - **从不**:每次运行查询时,排序和过滤都会重置。 + - **当查询被修改时**:仅当查询结构发生变化时,才会重置排序和筛选。 + - **始终**:只要列在新查询中仍然存在,排序和筛选就会保持不变。 + +“自动执行查询”和“保留排序和筛选”偏好的默认值可以在“偏好”对话框中设置:**工具 > 偏好… > 数据浏览 > DAX 查询** > 基本。同一页面上的**切换模型时保持文档打开**部分控制着当您打开不同的模型时,打开的 DAX 查询会发生什么情况。请参阅[切换模型](#switching-models)。 -![Dax 查询工具栏](~/content/assets/images/features/dax_query_window/dax_query_toolbar.png) +### 切换模型 -1. **执行 (F5)**:如果有选中内容,则执行所选的 DAX;否则执行 DAX 查询编辑器中的整个查询。 -2. **执行完整查询**:执行 DAX 查询编辑器中的整个查询 -3. **执行所选内容 (Shift+F5)**:如果有选中内容,则执行所选内容。否则,会执行光标当前位置的 EVALUATE 语句。 -4. **停止**:此按钮用于取消当前正在执行的查询。 -5. **自动执行查询**:用于跟踪已连接的语义模型,并在模型发生变化时自动更新查询结果。例如,修改某个度量值时,它可以帮助你了解结果会如何变化。 -6. **保留排序和筛选**:用于控制在执行查询时,结果网格(一个或多个)中排序和筛选状态的保留方式。提供三种偏好: - - **从不**:每次运行查询时都会重置排序和筛选。 - - **当查询被修改时**:仅当查询结构发生变化时才会重置排序和筛选。 - - **始终**:只要新查询中仍包含这些列,就会保留排序和筛选。 +当您打开其他模型时,打开的 DAX 查询将保持打开状态并连接到新模型。如果选中了**默认自动执行 DAX 查询**,则查询将再次针对新模型运行;否则,查询将在您下次执行时针对新模型运行。如果新模型没有可供运行的数据库(例如,从不含工作区数据库的文件加载的模型),则查询将保持打开状态,且无法执行。 -“自动执行查询”和“保留排序和筛选”偏好的默认值可在“偏好设置”对话框中配置:**工具 > 偏好设置…… > 数据浏览 > DAX 查询** > 基本。 +要在打开其他模型时关闭 DAX 查询,请在**工具 > 首选项 > 数据浏览 > DAX 查询**下取消选中**打开其他模型时保持 DAX 查询打开**。此选项默认为选中状态。 ### 使用 DAX 查询添加或更新度量值、列和表 -Tabular Editor(3.12.0 及更高版本)支持通过 DAX 查询窗口直接添加或更改度量值。 +Tabular Editor(3.12.0 及更高版本)具备直接通过 DAX 查询窗口添加或更改度量值的功能。 -从 Tabular Editor 3.23.0 起,“应用”和“应用选择”也会处理 DEFINE COLUMN 和 DEFINE TABLE 语句。 Tabular Editor 会在模型中创建相应的计算列/计算表;如果它们已存在,则会更新其表达式。 +从 Tabular Editor 3.23.0 开始,“应用”和“应用所选内容”也会处理 DEFINE COLUMN 和 DEFINE TABLE 语句。Tabular Editor 将在您的模型中创建相应的计算列/表,或者如果它们已存在,则更新其表达式。 -将 DAX 查询中 DEFINE 的度量值、列和表应用到模型有四个选项: +将 DAX 查询定义的度量值、列和表格应用于模型有四种选项: -![Dax 查询应用度量值](~/content/assets/images/features/dax_query_window/dax_query_apply_measure.png) +![DAX查询应用度量值](~/content/assets/images/features/dax_query_window/dax_query_apply_measure.png) -“应用”选项会将查询中通过 DEFINE 显式定义的所有度量值、列或表的 DAX 表达式同步到相应对象的定义中。任何尚不存在的度量值、列或表都会被创建。 +“应用”选项将查询中显式定义的所有度量值、列或表的 DAX 表达式同步到对象的定义。将创建所有尚不存在的度量值、列或表格。 -“应用度量值并同步”会将 DAX 表达式应用到度量值、列或表的定义中,并保存模型。 +“应用度量值并同步”将 DAX 表达式应用于度量值、列或表格的定义,并保存模型。 -“应用选择”和“应用选择并同步”只会应用查询编辑器当前所选范围内的度量值、列或表。 +“应用选定内容”和“应用选定内容并同步”将仅应用查询编辑器当前选定内容中的度量值、列或表。 -与 [DAX脚本功能](xref:dax-scripts) 不同,由于 DAX 查询语法不支持指定 Description、显示文件夹等其他属性,因此这种方式只能更新度量值的表达式属性。 +与[DAX脚本功能](xref:dax-scripts)不同,只能以这种方式更新度量值的表达式属性,因为DAX查询语法不支持指定其他属性,例如“描述”、“显示文件夹”等。 -右键上下文菜单中也新增了“应用”选项。 +“应用”选项也已添加到右键单击上下文菜单中。 -![Dax 查询 右键应用](~/content/assets/images/features/dax_query_window/dax_query_apply_measure_right_click.png) +![DAX查询应用右键单击](~/content/assets/images/features/dax_query_window/dax_query_apply_measure_right_click.png) -这些命令的快捷键为: +这些命令的快捷键如下: - 应用 (F7) - 应用度量值并同步 (Shift+F7) -- 应用选择 (F8) -- 应用所选内容并同步 (Shift+F8) +- 应用选定内容 (F8) +- 应用选定内容并同步 (Shift+F8) ## DAX 查询示例 -DAX 查询始终会返回一张结果表。最简单的 DAX 查询形式,就是对模型中的某张表进行求值。 +DAX查询始终返回结果表,要创建的最简单的DAX查询形式是评估模型中表的查询。 ```DAX EVALUATE Products ``` -![Dax 查询 Evaluate 表](~/content/assets/images/features/dax_query_window/evaluate_table.png) +![DAX查询评估表](~/content/assets/images/features/dax_query_window/evaluate_table.png) -也可以返回某个度量值,但需要在度量值名称外用表构造器 {} 包裹,将标量值转换为一张 1x1 表。 +也可以返回 Measure 的值,但 Measure 名称前后需要使用表构造函数 {} ,以便将标量值转换为 1x1 表。 ```DAX EVALUATE { [Invoice Lines] } ``` -![Dax 查询 Evaluate 度量值](~/content/assets/images/features/dax_query_window/evaluate_measure.png) +![DAX查询EVALUATE度量值](~/content/assets/images/features/dax_query_window/evaluate_measure.png) ### 多个 EVALUATE 语句 -在同一个 DAX 查询中包含多个 EVALUATE 语句完全可行。这种查询类型最常见于 Power BI 性能分析器的查询。 +完全可以在同一个 DAX 查询中包含多个 EVALUATE 语句。这种查询类型最常出现在 Power BI 性能分析器查询中。 -下面的语句会返回两张表,但会在结果窗格中分别显示在不同的结果标签页中。 +在以下语句中返回两个表格,但作为结果窗格中单独的行选项卡。 ```DAX EVALUATE @@ -114,21 +120,21 @@ EVALUATE Customers ``` -![Dax 查询 Evaluate 多个表](~/content/assets/images/features/dax_query_window/multiple_evaluate_table.png) +![DAX查询评估多个表](~/content/assets/images/features/dax_query_window/multiple_evaluate_table.png) ## 调试 DAX 查询 -DAX 查询是可以运行 [DAX 调试器](xref:dax-debugger) 的两个位置之一;另一个是 Pivot Grid。 +DAX查询是可运行[DAX调试器](xref:dax-debugger)的两个位置之一,另一个是Pivot Grid。 -DAX调试器使你能够理解 DAX 在单个单元格中是如何工作的。要启动调试器,只需在目标单元格上右键单击并选择“调试单元格”,调试器将以所选单元格为上下文启动。 +DAX 调试器提供了了解 DAX 在单个单元格内如何工作的能力。要启动调试器,只需右键单击所需单元格,然后选择“调试单元格”,即可在所选单元格的上下文中启动调试器。 -![Dax 查询 调试器](~/content/assets/images/features/dax_query_window/dax_query_open_dax_debugger.gif) +![DAX查询调试器](~/content/assets/images/features/dax_query_window/dax_query_open_dax_debugger.gif) ## 导出 DAX 查询结果 -Tabular Editor 3 从 3.16.0 版本开始,新增将 DAX 查询结果导出为 CSV 或 Excel 的功能。运行 DAX 查询后,工具栏上会激活一个按钮,让你可以将结果以 CSV 或 Excel 格式保存到本地。 +从 3.16.0 版本开始,Tabular Editor 3 引入了将 DAX 查询结果导出为 CSV 或 Excel 的新功能。运行 DAX 查询后,工具栏中会激活一个按钮,使用户能够以 CSV 或 Excel 格式将结果保存到本地。 > [!TIP] -> 要导出超过 1001 行的数据,请在运行 DAX 查询后选择“单击以获取所有行” +> 要导出超过 1001 行,请在运行 DAX 查询后选择“单击以获取所有行” -![Dax 查询 导出数据](~/content/assets/images/features/dax_query_window/dax_query_export_data.png) +![DAX查询导出数据](~/content/assets/images/features/dax_query_window/dax_query_export_data.png) diff --git a/localizedContent/zh/content/features/deployment.md b/localizedContent/zh/content/features/deployment.md index 45de3a042..c6f2f45ff 100644 --- a/localizedContent/zh/content/features/deployment.md +++ b/localizedContent/zh/content/features/deployment.md @@ -1,6 +1,8 @@ ---- +--- uid: deployment title: 模型部署 +author: Morten Lønskov +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -17,71 +19,81 @@ applies_to: # 模型部署 -Tabular Editor 3(商业版和企业版)可以复制当前加载的语义模型元数据,并将其部署到 Analysis Services 实例或 Power BI / Fabric 的 XMLA endpoint。 +Tabular Editor 3(Business Edition 和 Enterprise Edition)可以复制当前加载的语义模型元数据,并将其部署到 Analysis Services 实例或 Power BI/Fabric XMLA endpoint。 -要执行部署,请通过 **Model > Deploy...** 菜单启动 **Deployment Wizard**。 +要执行部署,请通过**“模型”>“部署...”**菜单选项启动**“部署向导”**。 > [!NOTE] -> Tabular Editor 3 商业版在支持哪些 Analysis Services 实例类型或 Power BI / Fabric Workspace 进行 XMLA 连接方面存在一些[限制](xref:editions)。这一点同样适用于部署。 +> Tabular Editor 3 商业版在 XMLA 连接支持的 Analysis Services 实例类型或 Power BI/Fabric 工作区方面存在一定的[限制](xref:editions)。这也适用于部署。 + +## 目标服务器 + +在**目标服务器**页面上,输入服务器名称,或从最近服务器的**服务器**列表中选择一个。右键单击列表中的服务器,将其固定到列表顶部或将其删除。该列表与**文件 > 打开 > 从数据库打开模型…**共享。有关详细信息,请参阅[最近使用的服务器和已固定的服务器](xref:xmla-as-connectivity#recent-and-pinned-servers)。 ## 部署选项 -选择要部署到的目标服务器和数据库后,你会看到一组 **部署选项**,如下方截图所示。 +选择要部署的目标服务器和数据库后,系统将显示**部署选项**列表,如下图所示。 ![部署选项](~/content/assets/images/deployment-options.png) -包括: +这些选项包括: -- **部署模型结构**:表示将部署模型元数据。取消选中会导致无法执行部署(该选项出于历史原因保留)。 -- **部署数据源**:对于使用 _显式_ 数据源的模型,此选项用于指定部署时是否包含这些数据源。如果你修改了一个或多个数据源属性,但不打算部署这些修改,取消选中此选项会很有用。例如,将模型元数据从开发环境部署到测试环境时,你可能希望目标环境上的连接字符串等保持原样。注意:对于 Power BI / Fabric 语义模型,此选项通常不会启用,因为此类模型使用 _隐式_ 数据源:凭据由 Power BI 服务管理,连接详细信息存储在分区的 M 查询中,或存储在模型的共享表达式中。 -- **部署表分区**:此选项表示是否应部署表分区。在某些情况下,目标数据库可能包含模型元数据中不存在的分区。取消选中此选项将阻止部署修改目标服务器上的任何现有分区。如果勾选这个选项,Tabular Editor 将把目标服务器上的分区与模型元数据同步。如果目标服务器上存在分区,但模型元数据中没有这些分区,它们将被删除(包括其中包含的数据)。 - - **部署受增量刷新刷新策略管控的分区**:启用 **部署表分区** 选项后,你可以选择避免部署受增量刷新刷新策略管控的分区。当模型中包含由 [增量刷新刷新策略](xref:incremental-refresh-about) 自动创建的分区,而你希望部署除该刷新策略管控的分区之外的所有分区时,这个选项就很有用。 -- **部署模型角色**:这个选项用来决定是否部署模型中定义的角色。取消勾选这个选项将按原样保留模型中现有的角色。如果你正在部署对模型中的表或列所做的更改,可能需要重新检查 [RLS 或 OLS 设置](xref:data-security-about),以确保它们仍然有效。 - - **部署模型角色成员**:这个选项用来决定是否部署角色成员。通常会直接在服务器上管理角色成员,而不是在模型元数据中管理。取消勾选这个选项将阻止部署修改目标服务器上的任何现有角色成员。 +- **部署模型结构**:这表示将部署模型元数据。取消选中此选项将阻止您执行部署(此选项出于历史原因而存在)。 +- **部署数据源**:对于使用*显式*数据源的模型,此选项表示是否将任何此类数据源包含在部署中。如果数据源上的一个或多个属性已被修改,且你并不打算部署这些修改,则取消选中此选项可能很有用。例如,如果您要将模型元数据从开发环境部署到测试环境,您可能希望在目标环境中保留所有连接字符串等内容的原样。请注意,此选项通常不会对 Power BI / Fabric 语义模型启用,因为此类模型使用*隐式*数据源,其中凭据由 Power BI 服务管理,连接详细信息存储在模型中分区上的 M 查询或共享表达式中。 +- **部署表分区**:此选项指示是否应部署表分区。在某些情况下,目标数据库可能包含模型元数据中不存在的分区。取消选中此选项将阻止部署修改目标服务器上的任何现有分区。如果选中此选项,Tabular Editor 将使目标服务器上的分区与模型元数据同步。如果目标服务器上存在任何分区,但模型元数据中不存在这些分区,则将删除这些分区(包括其中包含的数据)。 + - **部署受增量刷新策略管理的分区**:启用**部署表分区**选项时,您将有一个选项,以避免部署受增量刷新策略管理的分区。当您的模型包含由[增量刷新策略](xref:incremental-refresh-about)自动创建的分区,并且您希望部署除受该策略约束的分区之外的所有分区时,此选项非常有用。 +- **部署共享表达式**:部署模型的共享表达式,例如 Power Query 参数和共享查询。取消选中此选项,以保留目标数据库中存在的共享表达式。 +- **部署模型角色**:此选项指示是否应部署模型中定义的角色。取消选中此选项将按原样保留模型上的现有角色。如果您正在部署对模型中表或列的更改,则可能需要重新查看[RLS 或 OLS 设置](xref:data-security-about),以确保它们仍然有效。 + - **部署模型角色成员**:此选项指示是否应部署角色成员。通常会在服务器上直接管理角色成员,而不是在模型元数据中管理。取消选中此选项将阻止部署修改目标服务器上的任何现有角色成员。 +- **部署语言元数据(问答同义词、AI 指令和 AI 数据架构)**:部署模型中每个区域设置的语言元数据。在 Power BI 中,一种文化的语言元数据包含其问答同义词以及在 Power BI 服务中使用**为 AI 准备数据**设置的 AI 指令和 AI 数据架构。此选项默认选中。取消选中此选项,以便在您重新部署时保留目标语义模型上的语言元数据: + - 两个模型中的一种文化都会获得模型的翻译,并保留目标的语言元数据 + - 仅存在于目标中的文化将保留其语言元数据,但不保留其翻译 + - 仅存在于模型中的文化在部署时没有语言元数据 + +Tabular Editor 不会更新保留的语言元数据,因此保留的 AI 数据架构可以列出已部署的模型不再包含的表或列。 ## 数据源凭据 -默认情况下,Tabular Editor 在将模型保存到磁盘时,不会保存密码、账户密钥和其他机密信息。因此,从文件加载的模型中,某些数据源的机密信息可能缺失。 Deployment Wizard 会在部署前检查这一点。机密信息为空或为 `********` 时,即视为缺失。向导会检查: +默认情况下,Tabular Editor 在将模型保存到磁盘时不会保存密码、账户密钥和其他密钥。因此,从文件加载的模型可能具有缺少密钥的数据源。部署向导会在部署之前检查这一点。当密钥为空或为“********”时,即视为缺失。向导将检查: -- 连接字符串中包含密码关键字(如 `Password` 或 `Pwd`)的 Provider数据源, -- 模拟特定 Windows 帐户的 Provider数据源, -- 使用 Windows 身份验证或用户名/密码身份验证,或使用帐户密钥的 Structured数据源。 +- 连接字符串包含密码关键字(例如 `Password` 或 `Pwd`)的提供程序数据源, +- 模拟特定 Windows 帐户的提供程序数据源, +- 使用 Windows 或用户名/密码身份验证或帐户密钥的 Structured数据源。 -对于每个缺失的机密信息,向导都会要求你提供服务器在刷新模型时应使用的凭据。 Tabular Editor 会将你输入的内容加密后存储在 @user-options 文件中,作为数据源覆盖设置,并在下次部署时直接使用,而无需再次询问。 +对于每个缺失的密钥,向导都会要求你提供服务器在刷新模型时应使用的凭据。Tabular Editor 将您输入的内容以加密形式存储为 @user-options 文件中的数据源覆盖,并在下次部署时使用,而不会再次询问。 -取消选中 **部署数据源** 后,向导会对目标中已存在的数据源执行相同的检查。如果服务器没有返回其中某个数据源所需的机密信息,向导会在每次部署时都要求你提供,因为这些信息不会被存储。 +当您清除**部署数据源**时,向导会对目标上已存在的数据源执行相同的检查。如果服务器未返回其中一个数据源所需的密钥,向导会在每次部署时都要求提供该密钥,因为这些答案不会被存储。 -Power BI 和 Fabric 语义模型不会在模型中存储凭据。你需要改为在 Power BI 服务中的语义模型里设置这些凭据。 +Power BI 和 Fabric 语义模型不会在模型中存储凭据。而是要在 Power BI 服务中的语义模型上设置它们。 ## 部署脚本 -在部署过程中,Tabular Editor 会生成一个 [CreateOrReplace TMSL 脚本](https://learn.microsoft.com/analysis-services/tmsl/createorreplace-command-tmsl?view=asallproducts-allversions),随后会针对 Analysis Services 引擎执行该脚本。 CreateOrReplace 脚本包含重新创建模型所需的全部元数据,包括表、列、度量值、关系、透视、翻译等。如果目标服务器上尚不存在该模型,将创建该模型。如果模型已存在,则现有对象将被脚本中指定的新元数据替换。 - -如果在 **部署选项** 页面取消选择了某些选项,Tabular Editor 将在生成的 TMSL 脚本中使用这些对象的原始元数据定义,从而在服务器上按原样保留其定义。 +在部署过程中,Tabular Editor 会生成一个[CreateOrReplace TMSL 脚本](https://learn.microsoft.com/analysis-services/tmsl/createorreplace-command-tmsl?view=asallproducts-allversions),然后针对 Analysis Services 引擎执行该脚本。CreateOrReplace 脚本包含重新创建模型所需的所有元数据,包括表、列、度量值、关系、视角、翻译等。如果目标服务器上尚不存在该模型,则将创建该模型。如果模型已存在,现有对象将被脚本中指定的新元数据替换。 -Deployment Wizard 的最后一页允许你导出生成的脚本,这样你就能在执行前先审查这些更改。 +如果您在**部署选项**页面上清除了某个选项,则生成的 TMSL 脚本将保留目标对这些对象的现有定义。 +部署向导的最后一页**部署摘要**列出了所选选项。点击**TMSL 脚本**,在部署前查看生成的脚本。**导出生成...** 会忽略 **部署共享表达式** 和 **部署语言元数据** 选项。 ## 部署影响 > [!WARNING] -> 这种部署属于 **仅元数据部署**。根据对模型所做更改的类型,部署期间可能会丢失已导入的数据。在这种情况下,你可能需要在部署完成后执行一次刷新操作。 +> 此类型的部署是**仅元数据部署**。根据对模型所做更改的类型,导入的数据可能会在部署过程中丢失。在这种情况下,部署完成后,您可能需要执行刷新操作。 -一般来说,以下对模型的更改无需后续数据刷新: +通常情况下,可以对模型进行以下更改,而无需随后刷新数据: -- 添加/编辑/删除度量值和 KPI,包括它们的 DAX 表达式。 -- 编辑 FormatString、Description、DisplayFolder 等属性。 -- 添加/编辑/删除元数据翻译、透视、OLS 和 RLS 角色。 +- 添加/编辑/删除度量值和 KPI,包括其 DAX 表达式。 +- 编辑属性,例如 FormatString、Description、DisplayFolder 等。 +- 添加/编辑/移除元数据翻译、视角、OLS 和 RLS 角色。 -以下更改可能需要先执行一次 **Calculate refresh**,然后才能查询这些对象: +在可以查询对象之前,以下更改可能需要执行**计算刷新**: - 添加/编辑计算列、计算表格和计算组 - 添加/编辑关系 - 添加/编辑层次结构 - 删除列/表格 -以下更改可能需要执行一次 **Full refresh**: +以下更改可能需要**完全刷新**: -- 添加/编辑分区、表格和列 +- 添加/编辑分区、表和列 > [!WARNING] -> 鉴于以这种方式部署语义模型可能带来的影响,我们建议不要使用此选项将其部署到生产环境。更好的做法是设置一条用于将模型部署到生产环境的 [CI/CD 流水线](https://blog.tabulareditor.com/category/ci-cd/)。 \ No newline at end of file +> 由于以这种方式部署语义模型可能产生影响,我们建议不要使用此选项对生产环境执行部署。最好设置一个[用于将模型部署到生产环境的 CI/CD 管道](https://blog.tabulareditor.com/category/ci-cd/)。 \ No newline at end of file diff --git a/localizedContent/zh/content/features/mcp-server.md b/localizedContent/zh/content/features/mcp-server.md index 63ddb9532..19c8e6460 100644 --- a/localizedContent/zh/content/features/mcp-server.md +++ b/localizedContent/zh/content/features/mcp-server.md @@ -17,59 +17,58 @@ applies_to: - edition: Enterprise full: true --- - # MCP 服务器 -Tabular Editor 3 可以充当 MCP(Model Context Protocol)服务器。支持 MCP 的代理(例如 Claude Code、GitHub Copilot、VS Code 代理模式、Codex 或 Cursor)可连接到正在运行的实例,读取、查询并分析你当前打开的语义模型;如果你授予写入权限,还可以修改它。首先,选择 **工具 > MCP 服务器...** 并注册你的代理。 +Tabular Editor 3 可以充当 MCP(模型上下文协议)服务器。支持 MCP 的代理(例如 Claude Code、GitHub Copilot、VS Code 代理模式、Codex 或 Cursor)连接到正在运行的实例,以读取、查询和分析您已打开的语义模型,并在您授予写入权限的情况下对其进行更改。要开始,请选择**工具 > MCP 服务器…**,然后注册您的代理。 -MCP 服务器不会使用你在 Tabular Editor 中配置的 AI 提供程序或 API 密钥;你的代理会使用它自己的提供程序和订阅。 +MCP 服务器不使用在 Tabular Editor 中配置的 AI 提供商或 API 密钥,您的代理使用其自己的提供商和订阅。 -代理处理的是 Tabular Editor 当前打开的模型,包括尚未保存的更改。它可以是 Power BI Desktop 模型、PBIP 项目、TMDL (Tabular Model Definition Language) 文件夹、`.bim` 文件、Workspace 数据库,或到 Analysis Services、Azure Analysis Services 或 Fabric 的实时连接。无论模型处于已连接还是脱机状态,代理使用的工具都是相同的,但需要实时连接的工具(例如 DAX 查询)除外。 +代理在 Tabular Editor 已打开的模型上工作,包括未保存的更改。这可以是 Power BI Desktop 模型、PBIP 项目、TMDL(表格模型定义语言)文件夹、“.bim”文件、工作区数据库或与 Analysis Services、Azure Analysis Services 或 Fabric 的实时连接。无论模型是已连接还是离线,代理都使用相同的工具,但需要实时连接的工具(例如 DAX 查询)除外。 -代理的更改会通过 [Tabular Object Model (TOM) 包装器](xref:csharp-scripts) 和 C# Script 脚本引擎应用,并与手动编辑一样,经过相同的验证、公式自动修正和撤销堆栈处理。这些更改会显示为未保存的更改,并在 [TOM Explorer 和属性视图](xref:unsaved-changes) 中标记;在你保存之前,不会将任何内容写回源文件。 +代理更改会经过 [Tabular Object Model (TOM) 包装器](xref:csharp-scripts)和 C# 脚本引擎,并与您自己的编辑使用相同的验证、公式修复和撤消栈。它们显示为未保存的更改,在[TOM Explorer 和“属性”视图](xref:unsaved-changes)中标记,并且在您保存之前不会将任何内容写入源。 ## 开始之前 -- Tabular Editor 3.27.0 或更高版本,任何版本均可。 -- 已安装 **AI 功能** 组件。从 3.27.0 开始,它已包含在默认安装中。如果你以集中方式部署 Tabular Editor,请参阅 @installation-activation-basic;如果管理员已关闭 AI 功能,请参阅 @policies。 +- Tabular Editor 3.27.0 或更高版本,任何版本。 +- 已安装**AI 功能**组件。从 3.27.0 版本起,它是默认安装的一部分。如果您集中部署 Tabular Editor,请参阅@installation-activation-basic;如果您的管理员已禁用 AI 功能,请参阅@policies。 - 支持通过可流式传输的 HTTP 使用 MCP 的代理。 ## 启动服务器 -1. 选择 **工具 > MCP 服务器...**。 -2. 检查权限设置。见 [设置代理权限](#set-agent-permissions)。 -3. 点击 **启动服务器**。 +1. 选择**工具 > MCP 服务器……**。 +2. 查看权限。请参阅[设置代理权限](#set-agent-permissions)。 +3. 点击**启动服务器**。 -该对话框会显示服务器侦听的地址:`http://127.0.0.1:42100/`,除非你已更改端口。状态栏指示器会从 **MCP 已停止** 变为 **MCP 已启动**,其工具提示中会显示该地址。 +除非您更改了端口,否则该对话框将显示服务器侦听的地址:`http://127.0.0.1`。状态栏指示器从**MCP 已停止**变为**MCP 已启动**,其工具提示中显示地址。 -![MCP 服务器对话框,显示服务器 URL、已掩码的访问令牌,以及设置为非默认级别的五行代理权限](~/content/assets/images/features/mcp-server/mcp-server-dialog.png) +![MCP 服务器对话框,显示服务器 URL、已屏蔽的访问令牌以及设置为非默认级别的五个代理权限行](~/content/assets/images/features/mcp-server/mcp-server-dialog.png) -![MCP 状态栏指示器显示 MCP Started,其工具提示显示 "MCP 服务器正在侦听 http://127.0.0.1:42100/。点击以打开连接对话框。"](~/content/assets/images/features/mcp-server/status-bar-menu.png) +![MCP 状态栏指示器显示“MCP 已启动”,其工具提示显示“MCP 服务器正在监听 http://127.0.0.1。点击可打开连接对话框。"](~/content/assets/images/features/mcp-server/status-bar-menu.png) -无论是否打开模型,服务器都可以运行。如果没有打开模型,工具结果会明确说明;而且你可以随时打开模型,无需重启服务器。 +服务器在打开或未打开模型的情况下均可运行。如果没有打开模型,工具结果会显示这一点,您可以随时打开模型,而无需重启服务器。 -右键单击状态栏指示器可启动或停止服务器、复制注册配置,或打开 MCP 服务器偏好设置。左键单击它可打开对话框,而不会启动或停止服务器。 +右键单击状态栏指示器,即可启动或停止服务器、复制注册配置或打开 MCP 服务器偏好设置。左键单击它,即可打开对话框,而无需启动或停止服务器。 -![MCP 状态栏指示器及其已打开的右键菜单,菜单项包括“MCP 服务器详细信息...”、“停止 MCP 服务器”、“复制 MCP 配置”和“MCP 服务器偏好...”,其中“复制 MCP 配置”子菜单已展开,列出 Claude Code、VS Code、Copilot CLI、Codex 和 Cursor](~/content/assets/images/features/mcp-server/status-bar-context-menu.png) +![MCP 状态栏指示器,其右键菜单在“MCP 服务器详细信息…”、“停止 MCP 服务器”、“复制 MCP 配置”和“MCP 服务器首选项…”上打开,并且“复制 MCP 配置”子菜单已展开,列出了 Claude Code、VS Code、Copilot CLI、Codex 和 Cursor](~/content/assets/images/features/mcp-server/status-bar-context-menu.png) ### MCP 偏好 -打开 **工具 > 偏好 > AI 功能 > MCP 服务器**,设置服务器的启动、身份验证和端口选项。 +打开**工具 > 首选项 > AI 功能 > MCP 服务器**,设置服务器的启动、身份验证和端口选项。 -![MCP 服务器偏好,显示“启用 MCP 服务器”“自动启动 MCP 服务器”“需要访问令牌”和端口](~/content/assets/images/pref-mcp-server.png) +![MCP服务器首选项,显示“启用MCP服务器”、“自动启动MCP服务器”、“需要访问令牌”和端口](~/content/assets/images/pref-mcp-server.png) -| 偏好 | 默认值 | 作用 | -| ---------------- | ----- | ----------------------------------------------------------------- | -| **启用 MCP 服务器** | 开 | 取消勾选后,会停止正在运行的服务器,并移除菜单项和状态栏指示器 | -| **自动启动 MCP 服务器** | 关 | 在 Tabular Editor 启动时启动服务器 | -| **需要访问令牌** | 关 | 代理必须提供服务器对话框中显示的访问令牌。参见 [在共享计算机上运行](#running-on-a-shared-machine) | -| **端口** | 42100 | 服务器侦听的回环端口,范围为 1024 到 49151。更改后会使现有的代理注册失效 | +| 首选项 | 默认值 | 功能 | +| -- | -- | -- | +| **启用 MCP 服务器** | 开 | 取消勾选此项将停止正在运行的服务器,并移除菜单项和状态栏指示器 | +| **自动启动 MCP 服务器** | 关闭 | Tabular Editor 启动时启动服务器 | +| **需要访问令牌** | 关闭 | 代理必须出示服务器对话框中显示的访问令牌。请参阅[在共享计算机上运行](#running-on-a-shared-machine) | +| **端口** | 42100 | 服务器侦听的环回端口,范围为 1024 至 49151。更改此端口将使现有代理注册失效 | -## 注册代理 +## 注册您的代理 -在服务器对话框中,从 **导出配置** 中选择你的代理,然后将复制的配置粘贴到你的代理中。每个代理只需注册一次,该配置会以 `tabular-editor` 这个名称注册服务器。 +在服务器对话框中,从**导出配置**中选择您的代理,然后将复制的配置粘贴到您的代理中。您只需对每个代理注册一次,配置会将服务器注册为“tabular-editor”的名称。 -![导出配置下拉菜单已展开,其中列出了 Claude Code、VS Code、Copilot CLI、Codex 和 Cursor](~/content/assets/images/features/mcp-server/export-configuration.png) +![“导出配置”下拉菜单,展开后列出了Claude Code、VS Code、Copilot CLI、Codex和Cursor](~/content/assets/images/features/mcp-server/export-configuration.png) **Claude Code**:在终端中运行复制的命令: @@ -77,7 +76,7 @@ MCP 服务器不会使用你在 Tabular Editor 中配置的 AI 提供程序或 A claude mcp add --transport http tabular-editor http://127.0.0.1:42100/ ``` -**VS Code**:添加到你的 MCP 配置中: +**VS Code**:添加到您的 MCP 配置: ```json { @@ -90,7 +89,7 @@ claude mcp add --transport http tabular-editor http://127.0.0.1:42100/ } ``` -**Copilot CLI**:将以下内容添加到 `~/.copilot/mcp-config.json`: +**Copilot CLI**:添加到`~/.copilot/mcp-config.json`: ```json { @@ -103,14 +102,14 @@ claude mcp add --transport http tabular-editor http://127.0.0.1:42100/ } ``` -**Codex**:将以下内容添加到 `~/.codex/config.toml`: +**Codex**:添加到`~/.codex/config.toml`: ```toml [mcp_servers.tabular-editor] url = "http://127.0.0.1:42100/" ``` -**Cursor**:将以下内容添加到 `~/.cursor/mcp.json`: +**Cursor**:添加到`~/.cursor/mcp.json`: ```json { @@ -122,209 +121,213 @@ url = "http://127.0.0.1:42100/" } ``` -启用 **需要访问令牌** 后,导出的配置会按各客户端的格式包含令牌。从对话框中复制配置,不要手动编写。 +当**需要访问令牌**开启时,导出的配置将以每个客户端的格式包含令牌。从对话框中复制配置;不要手动书写。 -任何其他 MCP 客户端都可通过 streamable HTTP 连接到 `http://127.0.0.1:42100/`。启用 **需要访问令牌** 后,请在 `Authorization: Bearer ` 标头中携带令牌。 +任何其他MCP客户端都通过可流式传输的HTTP连接到`http://127.0.0.1`。如果**需要访问令牌**已启用,请在`Authorization: Bearer `标头中发送令牌。 ### 检查是否成功 -向你的代理提问: +询问您的代理: + +> 我在 Tabular Editor 中连接的是哪个模型? -> 我在 Tabular Editor 中连接到了哪个模型? +代理将回答模型名称、模型的加载方式、是否存在未保存的更改及其兼容性级别,或者报告未打开任何模型。Tabular Editor 中不会显示提示。 -代理会回答模型名称、模型的加载方式、是否有未保存的更改及其兼容级别;或者会发送一条 Report,说明当前未打开任何模型。 Tabular Editor 中不会出现任何提示。 +智能体收到的模型名称遵循 **工具 > 首选项 > Tabular Editor > 用户界面** 下的 **模型源详细信息** 设置。如果选择**仅名称**,则智能体不会收到文件路径或服务器名称;如果选择**隐藏**,则智能体将收到“模型已加载”而非模型名称。 ## 设置代理权限 -权限决定代理可以使用哪些工具,而 [AI Assistant](xref:ai-assistant) 也使用同一套权限。可在 **工具 > MCP 服务器...** 对话框中设置,也可在 **工具 > 偏好 > AI 功能 > 权限** 下设置;两者编辑的是同一项设置。 +权限控制代理可以获得的工具,[AI 助手](xref:ai-assistant)使用相同的权限。请在**工具 > MCP 服务器……**对话框中或在**工具 > 首选项 > AI 功能 > 权限**下设置权限,两者均可编辑同一设置。 -![AI 功能权限页面:每个资源各有一个下拉菜单,均处于默认级别](~/content/assets/images/pref-ai-permissions.png) +![“AI 功能权限”页面,每个资源都有一个处于默认级别的下拉列表](~/content/assets/images/pref-ai-permissions.png) -将鼠标悬停在某项权限的标签或下拉列表上,即可查看各个级别允许的操作。如果管理员已通过[策略](xref:policies)为某项资源设置了上限,下拉列表会变为只读,并显示该策略。 +将鼠标悬停在权限的标签或下拉菜单上,查看每个级别允许的内容。如果管理员已通过[策略](xref:policies)对资源设置了上限,则下拉菜单为只读,并显示该策略。 -每项资源都有一个访问级别: +每个资源都有一个访问级别: -| 资源 | 默认值 | 代理获得的内容 | -| -------------------------- | --- | --------------------------------------------------------------------- | -| **模型元数据** | 读取 | 读取:表、列、度量值、表达式、描述、关系,以及 VertiPaq分析器统计信息。写入:能够通过 C# Script 脚本更改模型 | -| **模型数据** | 禁止 | 读取:DAX 查询结果(来自你的模型的数据值)。需要实时连接 | -| **Best Practice Analyzer** | 读取 | 读取:规则集和分析结果。写入:添加和修改规则 | -| **文档** | 写入 | 读取:你打开的 DAX 查询、C# Script 和 DAX 脚本的内容。写入:修改这些内容,并创建 C# Script 和 DAX 查询 | -| **宏** | 写入 | 读取:你的宏库,包括名称、说明和代码。写入:此版本中没有额外工具 | +| 资源 | 默认 | 代理可获得的内容 | +| -- | -- | -- | +| **模型元数据** | 读取 | 读取:表、列、度量、表达式、描述、关系、VertiPaq分析器统计数据以及模型的错误和警告消息。写入:通过 C# 脚本更改模型的能力 | +| **模型数据** | 拒绝 | 读取:DAX 查询结果(来自模型的数据值)以及 Analysis Services 返回的错误文本,其中可能包含数据值。DAX 查询需要实时连接 | +| **最佳实践分析器** | 读取 | 读取:规则集和分析结果。写:添加和修改规则 | +| **文档** | 写入 | 读取:你当前打开的 DAX 查询、C# 脚本和 DAX 脚本的内容,以及每个打开的文档(包括 Pivot Grid)的错误和警告。写入:修改它们,并创建 C# 脚本和 DAX 查询。无法读取或修改 Pivot Grid 布局 | +| **宏** | 写 | 读:您的宏库,包括名称、描述和代码。写:此版本中没有其他工具 | -**写入**(在下拉列表中标为 **读/写**)包含“读取”权限,而 **模型数据** 没有“写入”级别。 +**写**(在下拉菜单中标记为**读/写**)包括读,而**模型数据**没有写级别。 -**文档** 默认设置为“写入”,这允许代理创建选项卡,并覆盖已打开的 DAX 查询、C# Script 和 DAX 脚本的内容。代理不会运行它们,模型也不会更改。如果这些选项卡里有未保存的工作,就把 **文档** 设为“读取”。 +**文档**默认为“写入”,这使代理能够创建选项卡并覆盖已打开的 DAX 查询、C# 脚本和 DAX 脚本的内容。代理不会运行它们,模型也不会发生变化。如果您在这些选项卡中保留未保存的工作,请将**文档**设置为**读**。 -将这些授权提升到默认值以上,会让智能体获得更多访问权限: +将这些权限提升到其默认值之上,可为代理提供更多访问权限: -- **模型数据 > 读取**会将模型中的值发送给智能体,并经由智能体发送给其提供方。只在智能体需要用真实值核对结果时才授予这个权限。 -- **模型元数据 > 写入**允许智能体通过 C# Script 修改模型。保护措施请参阅[智能体如何更改你的模型](#how-an-agent-changes-your-model)。 +- **模型数据 > 读取**将值从您的模型发送到您的代理,并通过代理发送到您的代理的提供商。当代理需要对照实际值检查结果时,授予此权限。 +- **模型元数据 > 写入**允许代理通过 C# 脚本更改模型。请参阅[代理如何更改您的模型](#how-an-agent-changes-your-model) ,了解安全措施。 > [!IMPORTANT] -> 服务器启动时会读取权限,而智能体会在连接时获取其工具列表。更改授权后,先停止并重新启动服务器,再重新连接代理。在此之前,智能体会继续保留它连接时生效的权限。 +> 权限在服务器启动时读取,代理在连接时获取其工具列表。更改权限后,请停止并启动服务器,然后重新连接代理。在此之前,代理将保留其连接时生效的权限。 ## 代理可以做什么 -智能体可用的工具取决于你的授权。下表列出了你可以提出的请求,以及每项请求所需的授权。 - -| 请求 | 所需授权 | -| ------------------------------------------------------------------------------ | ------------------------------- | -| 识别 Tabular Editor 实例及其当前打开的模型 | 无 | -| 搜索 Tabular Editor 文档、博客以及 GitHub 的 Issues 和 Discussions | 无 | -| 查阅脚本 API:了解你当前运行的 Tabular Editor 版本中模型对象的属性、方法和签名 | 无 | -| 获取表的概览,包括每个表的列数、度量值数量以及所有关系 | **模型元数据 > 读取** | -| 获取指定名称对象的完整信息,包括表达式、说明、格式字符串和数据类型 | **模型元数据 > 读取** | -| 按名称、说明、DAX 或 M 表达式、格式字符串或批注搜索模型 | **模型元数据 > 读取** | -| 获取完整模型。这会消耗大量令牌,工具说明中也会提醒智能体 | **模型元数据 > 读取** | -| 在 TOM Explorer 中查看所选对象 | **模型元数据 > 读取** | -| 获取 VertiPaq分析器统计信息:表大小、列基数和内存使用情况 | **模型元数据 > 读取** | -| 列出有效的 [Best Practice Analyzer](xref:best-practice-analyzer) 规则,包括你自定义的规则,并运行分析 | **Best Practice Analyzer > 读取** | -| 在本地规则集中添加或修改规则 | **Best Practice Analyzer > 写入** | -| 运行 DAX 查询并返回结果行。查询默认返回 100 行,最多返回 500 行 | **模型数据 > 读取** 和 **模型元数据 > 读取** | -| 列出你当前打开的 DAX 查询、C# Script 和 DAX 脚本 | **模型元数据 > 读取** | -| 读取已打开标签页的内容 | **文档 > 读取** | -| 编辑标签页,或打开新的 C# Script 或 DAX 查询以供审阅 | **文档 > 写入** | -| 读取你的宏库 | **宏 > 读取** | -| 更改模型。查看 [代理如何更改你的模型](#how-an-agent-changes-your-model) | **模型元数据 > 写入** | - -在提示中引用对象之前,请先在 TOM Explorer 中选中它们,例如在请求“将这些对象的格式统一”之前。 - -在代理生成的 C# Script 或 DAX 查询以文档形式打开之前,Tabular Editor 会先编译脚本或根据当前打开的模型验证查询,并将所有错误返回给代理。 DAX 查询验证需要 Tabular Editor 连接到 Analysis Services 或 Power BI。 +代理的工具取决于您的授权,下表列出了您可以请求的内容以及每个请求所需的授权。 + +| 请求 | 需要的授权 | +| -- | -- | +| 识别 Tabular Editor 实例及其已打开的模型 | 无 | +| 搜索 Tabular Editor 文档、博客、GitHub 问题和讨论 | 无 | +| 查找脚本 API:您正在运行的 Tabular Editor 版本中模型对象的属性、方法和签名 | 无 | +| 获取表、其列和度量值计数以及每个关系的概览 | **模型元数据 > 读取** | +| 获取命名对象的完整详细信息,包括表达式、描述、格式字符串和数据类型 | **模型元数据 > 读取** | +| 按名称、描述、DAX 或 M 表达式、格式字符串或注释搜索模型 | **模型元数据 > 读取** | +| 获取完整模型。这会使用大量令牌,工具描述会向代理发出警告 | **模型元数据 > 读取** | +| 查看在 TOM Explorer 中选定的对象 | **模型元数据 > 读取** | +| 获取 VertiPaq分析器统计数据:表大小、列基数和内存使用情况 | **模型元数据 > 读取** | +| 列出有效的 [Best Practice Analyzer](xref:best-practice-analyzer) 规则(包括您自己的规则),并运行分析 | **Best Practice Analyzer > 读取** | +| 在本地规则集中添加或更改规则 | **最佳实践分析器 > 写入** | +| 运行 DAX 查询并获取行。默认情况下,查询返回 100 行,最多返回 500 行 | **模型数据 > 读取**和**模型元数据 > 读取** | +| 列出模型的错误、警告和 Analysis Services 消息,首先列出根本原因 | **模型元数据 > 读取**。Analysis Services 错误的文本也需要**模型数据 > 读取** | +| 列出您的打开的 DAX 查询、C# 脚本、DAX 脚本和 Pivot Grid,以及活动文档和每个文档的错误和警告计数 | **模型元数据 > 读取** | +| 读取已打开的 DAX 查询、C# 脚本或 DAX 脚本的内容 | **文档 > 读取** | +| 读取一个已打开文档的错误和警告,包括服务器上次运行时返回的错误 | **文档 > 读取**。服务器错误的文本也需要**模型数据 > 读取** | +| 编辑已打开的 DAX 查询、C# 脚本或 DAX 脚本,或打开新的 C# 脚本或 DAX 查询以进行查看 | **文档 > 写入** | +| 读取你的宏库 | **宏 > 读取** | +| 更改模型。请参阅[代理如何更改您的模型](#how-an-agent-changes-your-model) | **模型元数据 > 写入** | + +在提示中引用对象之前,请先在 TOM Explorer 中选择这些对象,例如,在询问“将这些对象格式化为一致”之前。要询问查询或脚本中的错误,请先将其选项卡设为活动文档,例如,在询问“为什么我在此查询中看到此错误?”之前。 + +在来自代理的 C# 脚本或 DAX 查询作为文档打开之前,Tabular Editor 会编译脚本或根据打开的模型验证查询,并将任何错误返回给代理。DAX 查询验证需要 Tabular Editor 连接到 Analysis Services 或 Power BI。 > [!NOTE] -> 查询数据需要实时连接;而 VertiPaq 统计信息则需要连接,或使用你事先已收集的统计信息。工具的可用性在代理连接时确定,因此如果你在之后才连接模型,请重新连接代理。 +> 查询数据需要实时连接,而 VertiPaq 统计信息需要连接或您已收集的统计信息。工具可用性在代理连接时设置,因此,如果您稍后连接模型,请重新连接代理。 -## 代理如何更改你的模型 +## 代理如何更改您的模型 -拥有 **模型元数据 > 写入** 权限时,代理会通过在后台创建 [C# Script](xref:csharp-scripts) 来更改你的模型。 Tabular Editor 会编译该脚本,检查其安全性,并针对当前打开的模型运行它。 +使用**模型元数据 > 写入**,代理通过在后台创建[C# 脚本](xref:csharp-scripts)来更改您的模型。Tabular Editor 编译脚本,检查其安全性,并针对打开的模型运行该脚本。 -脚本可以执行 C# Script API 支持的任何操作,例如添加度量值、列、计算组、透视、翻译、关系和刷新策略,或批量重命名并设置对象格式。由代理运行的脚本具有以下特性: +脚本可以执行 C# 脚本 API 支持的任何操作,例如添加度量值、列、计算组、透视、翻译、关系和刷新策略,或者批量重命名和格式化对象。代理运行的脚本具有以下属性: -- 其所有更改会合并为一条名为 **C# Script (MCP)** 的撤销记录;按 **Ctrl+Z** 会撤销整个脚本。当文档处于焦点时,按 **Ctrl+Z** 可撤销在文档中输入的内容。请先单击 TOM Explorer,或在 **Edit** 菜单中选择 **Undo C# Script (MCP)**。请参阅[文本编辑器中的撤销](xref:undo-redo#undo-in-text-editors)。 -- 如果脚本执行到一半时引发异常,其所有更改都会回滚。 -- 代理会收到一个列表,其中包含脚本新增、更改或删除的每个对象,以及脚本输出的所有内容。 -- 来自 `Output`、`Info`、`Warning` 或 `Error` 的信息会作为结果的一部分返回给代理,且不会弹出任何对话框。 -- 长时间调用运行时,会显示 **请稍候** 指示器,并忽略你在 Tabular Editor 中的点击操作。 -- 在你保存之前,[TOM Explorer 和属性视图](xref:unsaved-changes)中会标记已更改的对象和属性。**显示更改** 会将两个视图筛选为只显示更改项;右键单击 **还原** 可撤销单个属性、单个对象或整个分支。 +- 其更改是一个撤消条目,即**C# 脚本 (MCP)**,而 **Ctrl+Z** 则撤消整个脚本。如果文档处于焦点状态,则按 **Ctrl+Z** 可撤消在文档中的键入操作。请先单击 TOM Explorer,或在“编辑”菜单中选择“撤消 C# 脚本 (MCP)”。请参阅[在文本编辑器中撤消](xref:undo-redo#undo-in-text-editors)。 +- 如果脚本在执行过程中抛出异常,其所有更改都将回滚。 +- 代理会收到一个列表,其中包含脚本添加、更改或删除的每个对象,以及脚本打印的所有内容。如果脚本引入或解决了 DAX 错误,结果也会列出这些错误,并按根本原因分组。 +- 来自“输出”、“信息”、“警告”或“错误”的消息作为结果的一部分返回给代理,且不会打开对话框。 +- 在长时间调用运行时,会显示**请稍候**指示器,并且 Tabular Editor 中的点击操作将被忽略。 +- 在您保存之前,已更改的对象和属性会在[TOM Explorer 和“属性”视图](xref:unsaved-changes)中标记。**显示更改**会将两个视图都筛选为更改,右键单击**还原**可撤消单个属性、单个对象或整个分支。 -![打开的编辑菜单中只有一条“撤销 C# Script (MCP)”记录,TOM Explorer 用绿色标记新增度量值,用橙色标记已更改的度量值,并用带删除线的红色标记已删除的度量值,属性视图则筛选为仅显示那一个已更改的属性](~/content/assets/images/features/mcp-server/agent-change-review.png) +![“编辑”菜单在单个“撤消 C# 脚本 (MCP)”条目上打开,TOM Explorer 以绿色标记已添加的度量值,以橙色标记已更改的度量值,以红色带删除线的形式标记已删除的度量值,“属性”视图筛选出已更改的属性](~/content/assets/images/features/mcp-server/agent-change-review.png) -[AI 助手](xref:ai-assistant)聊天运行脚本的方式相同:同样只有一个撤销步骤,并支持回滚;其撤销记录为 **C# Script (AI Assistant)**。代理脚本没有预览对话框,也没有 **取消** 按钮。之后可在 TOM Explorer 和属性视图中检查这些更改。 +[AI 助手](xref:ai-assistant)聊天以相同的方式运行脚本,在撤销条目**C# 脚本(AI 助手)**下具有相同的单步撤销和回滚。代理脚本没有预览对话框,也没有**取消**。之后,在 TOM Explorer 和“属性”视图中查看它们的更改。 ### 被阻止的操作 -无论你授予了哪些权限,以下操作都会被阻止: +无论您是否授予权限,以下操作均被阻止: -- 在由代理运行的脚本中,用于执行原始 TMSL 或 XMLA 的 `ExecuteCommand` 始终会失败。 -- 访问文件系统、发送 Web 请求或引用外部程序集的代理脚本不会运行。这项检查使用的分析与 `BlockUnsafeScripts` 策略相同;完整列表见 [哪些情况算作保持在模型范围内](xref:csharp-scripts#what-counts-as-staying-within-the-model)。脚本会如何处理,取决于你的权限和策略: - - 拥有 **文档 > 写入** 权限时,脚本会以 **代理脚本(审阅)** 文档的形式打开,工具结果会告知代理让你审阅并运行它。 - - 如果没有 **文档 > 写入**,脚本不会运行,也不会打开任何文档。 - - 启用 `BlockUnsafeScripts` [策略](xref:policies)后,脚本不会运行,也不会打开任何文档。 -- 脚本中的 DAX 辅助功能同样需要 **模型数据 > 读取** 权限,与查询工具一致。 +- `ExecuteCommand` 用于运行原始 TMSL 或 XMLA,在代理运行的脚本中始终会失败。 +- 访问文件系统、发出 Web 请求或引用外部程序集的代理脚本不会运行。此检查与 `BlockUnsafeScripts` 策略对已编译脚本进行的分析相同;请参阅[哪些操作被视为在模型范围内](xref:csharp-scripts#what-counts-as-staying-within-the-model),以了解完整列表。脚本会发生什么情况取决于您的授权和策略: + - 如果具有**文档 > 写入**权限,脚本将作为**代理脚本(审核)**文档打开,工具结果会指示代理让您审核并运行该脚本。 + - 如果没有**文档 > 写入**,脚本不会运行,也不会打开任何文档。 + - 如果设置了 `BlockUnsafeScripts` [策略](xref:policies),脚本不会运行,也不会打开任何文档。 +- 脚本中的 DAX 帮助程序需要**模型数据 > 读取**,与查询工具相同。 ## 示例任务 -### 修复 Best Practice Analyzer 违规项 +### 修复最佳实践分析器违规项 -打开一个模型,然后提问: +打开模型并询问: -> 运行 Best Practice Analyzer,告诉我哪些问题值得优先修复,按严重程度从高到低排列。 +> 运行 Best Practice Analyzer,并告诉我哪些值得修复,最严重的先修复。 -然后继续输入“修复格式字符串违规项”。如果已授予 **模型元数据 > 写入**,代理会编写并运行一段脚本,并在 TOM Explorer 中以橙色高亮显示已更改的对象。在[属性视图](xref:unsaved-changes)中,点击 **显示更改** 可按属性查看更改前后的值。右键点击任何你不想保留的更改,选择 **还原**,然后保存。 +然后说“修复格式字符串违规”。如果授予**模型元数据 > 写入**权限,代理将编写一个脚本并运行它,并且已更改的对象在 TOM Explorer 中以橙色标记。[属性视图](xref:unsaved-changes)中的**显示更改**显示每个属性的更改前后的值。右键单击您不想要的任何更改上的**还原**,然后保存。 -### 根据规格说明添加度量值 +### 从规范添加度量值 -让代理读取规格说明、工单或包含度量值定义的电子表格: +将代理指向规范、工单或度量值定义电子表格: -> 把 requirements.md 中的度量值添加到 Sales 表。沿用那里已有的命名和格式字符串。 +> 将 requirements.md 中的度量值添加到“销售额”表中。遵循其中已使用的命名和格式字符串。 -代理会从其自身的 Workspace 中读取 `requirements.md`。 +代理从其自己的工作区读取 `requirements.md`。 -### 用查询验证结果 +### 使用查询验证结果 -授予 **模型数据 > 读取** 后,代理可以运行 DAX 来检查自己的工作: +在授予**模型数据 > 读取**权限后,代理可以运行 DAX 来检查其工作: -> 确认新的 Margin % 度量值在 2025 年得出的总计与旧计算相同。 +> 确认新的“利润率 %”度量值得出的总和与 2025 年的旧计算结果相同。 -它会编写并运行 DAX 查询,然后对比结果。 +它编写DAX查询,运行该查询并比较结果。 -### 起草脚本而不运行 +### 编写脚本但不运行 -有了 **文档 > 写入** 权限,代理可以将 C# Script 或 DAX 查询写入文档,供你审阅后自行运行;例如,你可以在实际运行前先检查更改,或稍后在另一个模型上运行: +借助**“文档”>“写入”**,代理可以将 C# 脚本或 DAX 查询放入一个文档中,由您自行审核和运行,例如,在运行之前检查更改,或稍后针对另一个模型运行: -> 帮我写一个脚本,把每个度量值重命名为句首大写的 sentence case 格式,但不要运行它。 +> 为我编写一个脚本,将每个度量值的名称更改为首字母大写,但不要运行它。 -该脚本会作为文档在 Tabular Editor 中打开,并已完成编译和安全检查。读完后再运行。 +脚本在 Tabular Editor 中以文档形式打开,并经过编译和安全检查。阅读后运行。 > [!TIP] -> 在任务之间先审阅并保存,让每次未保存的更改都尽量少一些。 +> 在任务之间进行审核和保存,以使每组未保存的更改都保持较小。 -## 同时运行多个实例 +## 运行多个实例 -每个 Tabular Editor 实例都会在各自的端口上托管自己的服务器。要同时处理两个模型,请分别在各自的实例中打开,并为每个实例连接一个代理。 +每个 Tabular Editor 实例都在自己的端口上托管自己的服务器。要同时处理两个模型,请在各自的实例中打开每个模型,并将一个代理连接到每个模型。 -要启动第二个服务器,请启动第二个实例,打开 **Tools > MCP Server...**,然后单击 **Start server**。如果配置的端口已被占用,系统会提示使用后续 20 个端口中第一个可用的端口;如果都不可用,则会显示错误。你也可以在 **Tools > 偏好 > AI Features > MCP Server** 中设置其他端口。 +对于第二个服务器,请启动第二个实例,打开**工具 > MCP 服务器……**,然后点击**启动服务器**。如果配置的端口已被占用,提示将提供接下来的 20 个端口中第一个空闲的端口;如果没有空闲端口,则会显示错误。您还可以在**工具 > 首选项 > AI 功能 > MCP 服务器**下设置另一个端口。 -以单独的名称在代理中注册第二个端口,并在提示中写明你指的是哪个实例。 +使用您自己的名称在您的代理中注册第二个端口,并在提示中为所指的实例命名。 ## 在共享计算机上运行 -服务器监听在 `127.0.0.1` 上,其他机器无法访问。它还会拒绝带有非本地 `Origin` 标头的浏览器请求。 +服务器绑定到 `127.0.0.1`,其他机器无法访问。它还会拒绝带有非本地“Origin”标头的浏览器请求。 -当 **要求访问令牌** 处于关闭状态时,本机上的任何进程都可以在无需凭据的情况下连接。在多个用户同时登录的主机上(例如远程桌面或 Citrix 服务器),这也包括其他用户会话中的进程。 +当**需要访问令牌**关闭时,计算机上的任何进程都可以在没有凭据的情况下进行连接。在有数人同时登录的主机上(例如远程桌面或 Citrix 服务器),这包括其他人员会话中的进程。 -在 **工具 > 偏好 > AI 功能 > MCP 服务器** 中选择 **要求访问令牌**,然后重新启动服务器。此后,代理必须提供服务器对话框中显示的令牌;未提供令牌的请求将被拒绝。 +在**工具 > 首选项 > AI 功能 > MCP 服务器**下选择**需要访问令牌**,然后重启服务器。然后,代理必须出示服务器对话框中显示的令牌,没有令牌的请求将被拒绝。 -选择 **重新生成令牌**(令牌旁边的刷新按钮)以生成新令牌;这会使现有注册失效,并重新启动正在运行的服务器。如果令牌已泄露,请重新生成令牌并重新注册你的代理。管理员可以通过 `RequireMcpAccessToken` 策略强制所有人都使用令牌,同时也会锁定该偏好设置。参见 @policies。 +选择**重新生成令牌**(令牌旁边的刷新按钮)以颁发新令牌,这将使现有注册失效并重启正在运行的服务器。如果令牌被泄露,请重新生成令牌并重新注册您的代理。管理员可以使用`RequireMcpAccessToken`策略使令牌对每个人都成为必选项,该策略还会锁定偏好设置。请参阅@policies。 -## 哪些内容会离开你的计算机 +## 哪些内容会离开您的计算机 -使用 MCP 服务器时,Tabular Editor 不会联系任何 AI 提供商,只会通过回环连接响应来自你本机进程的工具调用。代理搜索的知识库是 Tabular Editor 随附的本地数据库,并通过 Tabular Editor 的服务进行更新。 +当你使用 MCP 服务器时,Tabular Editor 不会联系 AI 提供商,而只会通过环回连接响应来自你电脑上进程的工具调用。代理搜索的知识库是随 Tabular Editor 一起提供的本地数据库,并从 Tabular Editor 的服务更新。 -你的代理会按照你的订阅和该提供商的条款,将数据发送给相应的提供商;发送哪些数据由代理的设置决定。当 **Model data** 保持默认值 **Deny** 时,代理将无法从 Tabular Editor 获取任何 DAX 查询结果。在模型定义中输入的值,例如 `DATATABLE` 表达式或 **Enter data** 表,属于模型元数据,代理可通过 **Model metadata > Read** 访问这些内容。 +您的代理根据您的订阅和该提供商的条款向其提供商发送数据,并且代理的设置控制发送的内容。在**模型数据**默认为**拒绝**的情况下,代理不会从 Tabular Editor 接收任何数据值,Analysis Services 错误的文本将被替换为固定句子。要使代理接收的内容中不包含文件路径和服务器名称,请将**工具 > 首选项 > Tabular Editor > 用户界面**下的**模型源详细信息**设置为**仅名称**或**隐藏**。 -更全面的说明请参阅 @security-privacy,其中也包括 [AI 助手](xref:ai-assistant);它会直接调用提供商,并且需要单独配置。 +请参阅 @security-privacy 了解更全面的情况,包括[AI 助手](xref:ai-assistant),它直接调用提供商,并单独进行配置。 ## 管理员控制 -MCP 服务器默认启用,任何用户都可以将其关闭。管理员可以使用以下 [策略](xref:policies) 来控制 MCP 的运行方式: +MCP 服务器默认开启,任何用户都可以将其关闭。管理员可以使用这些[策略](xref:policies)来控制 MCP 的运行方式: -| 策略 | 版本 | 作用 | -| ------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------ | -| `DisableMcpServer` | 所有版本 | 移除 MCP 服务器。 AI 助手聊天不受影响 | -| `DisableAi` | 所有版本 | 关闭所有 AI 功能,包括 MCP 服务器。将 `REG_DWORD` 的值设为 `1` 后,安装程序在全新安装时也不会安装 AI 组件,并会在升级时将其移除 | -| `RequireMcpAccessToken` | 所有版本 | 强制使用令牌进行身份验证,并锁定该偏好 | -| `DisableCSharpScripts` | 全部 | 阻止代理运行 C# Script,并禁止将脚本草拟到文档中。起草 DAX 查询以及所有只读工具都不受影响 | -| `BlockUnsafeScripts` | 企业版 | 在 Tabular Editor 中,所有脚本都只能在模型内部运行。访问文件、网络、其他进程或外部程序集的代理脚本不会运行,也不会打开任何审阅文档 | -| `Max...` 和 `McpMax...` 权限限制 | 企业版 | 为每种资源设置上限。 `Max...` 限制适用于 AI Assistant 和 MCP 服务器。 `McpMax...` 限制仅适用于 MCP 服务器,并且只能将 `Max...` 限制调低 | -| `AiAuditLogPath`, `AiAuditLogRetentionDays` | 企业版 | 设置 [审计日志](xref:ai-audit-log) 的位置和保留期 | -| `AiProvider` 及相关值 | 企业版 | 锁定 AI Assistant 的提供程序。 MCP 服务器不受影响 | +| 策略 | 版本 | 功能 | +| -- | -- | -- | +| `DisableMcpServer` | 所有 | 删除 MCP 服务器。AI 助手聊天不受影响 | +| `DisableAi` | 所有 | 关闭所有 AI 功能,包括 MCP 服务器。如果 `REG_DWORD` 的值为 `1`,安装程序还会在新安装中不包含 AI 组件,并在升级时将其移除 | +| `RequireMcpAccessToken` | 所有 | 强制进行令牌身份验证并锁定首选项 | +| `DisableCSharpScripts` | 所有 | 阻止代理运行 C# 脚本并将脚本草拟到文档中。起草 DAX 查询以及所有只读工具均不受影响 | +| `BlockUnsafeScripts` | Enterprise | 对于 Tabular Editor 中的每个脚本,仅允许停留在模型内的脚本。访问文件、网络、其他进程或外部程序集的代理脚本不会运行,也不会打开任何审查文档 | +| `Max...` 和 `McpMax...` 权限限制 | Enterprise | 对每种资源设置上限。`Max...` 限制适用于 AI 助手和 MCP 服务器。`McpMax...` 限制仅适用于 MCP 服务器,并且只能降低 `Max...` 限制 | +| `AiAuditLogPath`、`AiAuditLogRetentionDays` | Enterprise | 设置[审计日志](xref:ai-audit-log)的位置和保留期 | +| `AiProvider` 和相关值 | Enterprise | 锁定 AI 助手的提供商。MCP 服务器不受影响 | > [!WARNING] -> 如果没有 Enterprise 许可证,任何 Enterprise 策略设置都会阻止 AI Assistant 和 MCP 服务器启动,并移除菜单项和状态栏指示器。 `BlockUnsafeScripts` 值还会阻止所有脚本和宏,因此只能将 Enterprise 策略部署到具有 Enterprise 许可证的计算机上(请参阅[没有企业版时会发生什么](xref:policies#what-happens-without-enterprise-edition))。 +> 如果没有 Enterprise 许可证,任何 Enterprise 策略值都会阻止 AI 助手和 MCP 服务器启动,并移除菜单项和状态栏指示器。`BlockUnsafeScripts` 值还会阻止所有脚本和宏,因此请仅在拥有 Enterprise 许可证的计算机上部署 Enterprise 策略(请参阅[没有 Enterprise Edition 会发生什么](xref:policies#what-happens-without-enterprise-edition))。 -在企业版中,Tabular Editor 会在本地保留 AI Assistant 和 MCP 服务器活动的[审计日志](xref:ai-audit-log),其中包括代理调用的每个工具,以及其运行的任何 C# Script 的完整文本。提示词、回复和数据值不会被记录。在服务器对话框中点击 **打开审计文件夹**,或在 **工具 > 偏好 > AI 功能** 中点击同名按钮,都会打开日志文件夹。在 Desktop 版和商业版中,不会记录任何内容,这两个按钮也都不会显示。 +在企业版中,Tabular Editor 会保留 AI 助手和 MCP 服务器活动的本地[审计日志](xref:ai-audit-log),包括代理调用的每个工具以及其运行的任何 C# 脚本的完整文本。提示、回复和数据值不会被记录。在服务器对话框中**打开审计文件夹**,并在**工具 > 首选项 > AI 功能**中打开日志文件夹。在 Desktop 和 Business 版本中,不会记录任何内容,也不会显示这两个按钮。 -有关完整列表、注册表布局和管理模板,请参阅 @policies。 +请参阅@policies,了解完整列表、注册表布局和管理模板。 -## 故障排查 +## 故障排除 -| 你看到的现象 | 实际情况 | -| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| 代理提示它没有可用于 Tabular Editor 的工具 | 服务器没有运行,或者代理在服务器启动前就已连接。确认状态栏显示 **MCP 已启动**,然后重新连接代理 | -| 智能体看不到你刚授予的权限 | 授权会在服务器启动时读取,工具列表会在连接时确定。停止并重新启动服务器,然后重新连接智能体 | -| 长时间中断后,代理会丢失连接 | 如果 20 分钟内没有任何请求且没有打开的流,服务器会关闭会话。重新连接智能体 | -| 智能体报告未打开任何模型 | 服务器独立于你的模型运行。请在 Tabular Editor 中打开一个模型,然后再问一次。你不需要重启任何东西 | -| 智能体无法运行 DAX 查询 | **模型数据** 默认设置为 **Deny**。查询也需要实时连接:如果模型是从磁盘打开的,不管授予什么权限,查询工具都不可用 | -| 连接被 401 拒绝 | **要求访问令牌** 已开启,但智能体没有发送该令牌。请再次从对话框中复制注册配置。其中包含令牌 | -| 端口已被占用 | 另一个 Tabular Editor 实例或其他应用程序正在使用它。在提示中接受下一个可用端口,并更新代理的注册信息。如果启用了 **自动启动 MCP 服务器**,启动时发生冲突将不会弹出提示,指示器会显示 **MCP Stopped** | -| 菜单中没有 **工具 > MCP 服务器...** | 在偏好中未选中 **启用 MCP 服务器**,未安装 AI 功能组件,管理员设置了 `DisableMcpServer` 或 `DisableAi`,或者在未获得相应许可的计算机上设置了 Enterprise 策略值。见 @policies | +| 您看到的内容 | 正在发生的情况 | +| -- | -- | +| 代理显示没有适用于 Tabular Editor 的工具 | 服务器未运行,或者代理在服务器运行之前已连接。检查状态栏是否显示“**MCP 已启动**”,然后重新连接代理 | +| 代理看不到您刚刚授予的权限 | 权限在服务器启动时读取,工具列表在连接时固定。停止并启动服务器,然后重新连接代理 | +| 代理在长时间中断后失去连接 | 如果 20 分钟内没有请求且没有打开的流,服务器将关闭会话。请重新连接代理 | +| 代理报告没有打开的模型 | 服务器独立于你的模型运行。在 Tabular Editor 中打开模型,然后再次提问。您无需重启任何内容 | +| 代理无法运行 DAX 查询 | **模型数据**默认设置为**拒绝**。查询还需要实时连接:对于从磁盘打开的模型,无论授予何种权限,查询工具都不可用 | +| 连接被拒绝,返回 401 | **需要访问令牌**已启用,但代理未发送令牌。再次从对话框中复制注册配置。其中包含令牌 | +| 端口已被占用 | 另一个 Tabular Editor 实例或其他应用程序正在使用该端口。接受提示中的下一个可用端口,并更新代理的注册信息。如果**自动启动 MCP 服务器**已启用,则启动时的冲突不会显示提示,且指示器显示**MCP 已停止** | +| **工具 > MCP 服务器...** 不在菜单中 | 在首选项中取消了选中 **启用 MCP 服务器**,未安装 AI 功能组件,管理员已设置 `DisableMcpServer` 或 `DisableAi`,或者在未获得相应许可证的计算机上设置了企业策略值。请参阅 @policies | ## 后续步骤 -- 完整权限模型和内置聊天见 @ai-assistant。 -- 通过 @unsaved-changes 查看并撤销智能体所做的更改。 -- 有关脚本以及因此代理能更改哪些内容,见 @csharp-scripts。 -- 如需了解如何在组织范围内对服务器进行治理,请参阅 @policies。 -- 如果你的代理处理 repository 或管道中的模型文件,见 @te-cli-skill。 +- @ai-assistant,了解完整权限模型和内置聊天功能。 +- @unsaved-changes,用于查看和还原代理执行的操作。 +- @csharp-scripts,了解脚本(进而了解代理)可以更改的内容。 +- @policies,用于在整个组织中管理服务器。 +- 如果您的代理在存储库或管道中的模型文件上工作,请参阅 @te-cli-skill。 diff --git a/localizedContent/zh/content/features/metadata-translation-editor.md b/localizedContent/zh/content/features/metadata-translation-editor.md index a781d4de9..8e556ae83 100644 --- a/localizedContent/zh/content/features/metadata-translation-editor.md +++ b/localizedContent/zh/content/features/metadata-translation-editor.md @@ -1,8 +1,8 @@ ---- +--- uid: metadata-translation-editor title: 元数据翻译编辑器 -author: Šarūnas Jučius -updated: 2023-04-18 +author: Morten Lønskov +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,27 +16,29 @@ applies_to: - edition: Enterprise full: true --- - # 元数据翻译编辑器 -**元数据翻译编辑器**可概览模型中可翻译对象的名称、说明和显示文件夹的翻译内容。你可以通过 **视图** 菜单启动元数据翻译编辑器。另外,如果你只需要编辑部分翻译,请在 **TOM Explorer** 中选中它们(按住 CTRL 或 SHIFT 可多选),然后右键单击并选择 **在元数据翻译编辑器中显示**。 +**元数据翻译编辑器**提供了模型中可翻译对象的已翻译名称、描述和显示文件夹的概览。您可以通过**视图**菜单启动元数据翻译编辑器。或者,如果您只需要编辑某些翻译,请在**TOM 资源管理器**中选择它们(按住 CTRL 或 SHIFT 键可进行多选),然后右键单击并选择**在元数据翻译编辑器中显示**。 ![元数据翻译编辑器](~/content/assets/images/metadata-translation-editor.png) -使用元数据翻译编辑器中的输入字段,可以快速为相应语言添加、删除或编辑对象名称、说明和显示文件夹名称的翻译。编辑器中的前三列允许你更改对象的默认名称、说明和显示文件夹名称。你可以像平常一样使用撤销(Ctrl+Z)和重做(Ctrl+Y)。 +使用元数据翻译编辑器中的输入字段,快速添加/删除或编辑对象名称、描述和显示文件夹名称的相应语言翻译。编辑器中的前三列允许您更改对象的默认名称、描述和显示文件夹名称。您可以使用通常的方式撤消 (Ctrl+Z) 和重做 (Ctrl+Y)。 + +要删除翻译,请清空其单元格,然后按**Enter**。清除默认的**描述**或**显示文件夹**单元格将清空该属性。无法清除默认**名称**。模型、表、层次结构级别和透视的**显示文件夹**单元格为只读。 ## 元数据翻译编辑器工具栏 -在元数据翻译编辑器处于活动状态时,工具栏提供以下选项: +当元数据翻译编辑器处于活动状态时,随附的工具栏提供以下选项: -- ![Metadata Translation Editor New Translation](~/content/assets/images/metadata-translation-editor-add-translation.png) **新建翻译**:点击此按钮可向模型中添加一条新翻译。该翻译将显示在元数据翻译编辑器中。 -- ![Metadata Translation Editor Hide Members](~/content/assets/images/perspective-editor-hide-members.png) **显示/隐藏已隐藏对象**:如果你想在元数据翻译编辑器中查看所有对象,包括隐藏对象,请启用此选项。 -- ![Metadata Translation Editor Hide Names](~/content/assets/images/metadata-translation-editor-name.png) **显示/隐藏名称**:如果你不想在元数据翻译编辑器中看到名称翻译列,就关闭此选项。 -- ![Metadata Translation Editor Hide Descriptions](~/content/assets/images/metadata-translation-editor-description.png) **显示/隐藏说明**:如果你不想在元数据翻译编辑器中看到说明翻译列,就关闭此选项 -- ![Metadata Translation Editor Hide Display Folders](~/content/assets/images/perspective-editor-folder.png) **显示/隐藏显示文件夹**:如果你不想在元数据翻译编辑器中看到显示文件夹翻译列,就关闭此选项 +- ![元数据翻译编辑器新翻译](~/content/assets/images/metadata-translation-editor-add-translation.png) **新翻译**:此按钮将新翻译添加到模型。翻译将显示在元数据翻译编辑器中。 +- ![元数据翻译编辑器隐藏成员](~/content/assets/images/perspective-editor-hide-members.png) **显示/隐藏隐藏对象**:如果您想在元数据翻译编辑器中查看所有对象(包括隐藏对象),请启用此选项。 +- ![元数据翻译编辑器隐藏名称](~/content/assets/images/metadata-translation-editor-name.png) **显示/隐藏名称**:如果您不希望在元数据翻译编辑器中看到名称翻译列,请禁用此选项。 +- ![元数据翻译编辑器隐藏描述](~/content/assets/images/metadata-translation-editor-description.png) **显示/隐藏描述**:如果您不想在元数据翻译编辑器中看到描述翻译列,请禁用此选项。 +- ![元数据翻译编辑器隐藏显示文件夹](~/content/assets/images/perspective-editor-folder.png) **显示/隐藏显示文件夹**:如果您不希望在元数据翻译编辑器中看到显示文件夹翻译列,请禁用此选项。 -## 处理大量翻译 +## 处理多项翻译 -如果你正在处理包含大量翻译的模型,一次性显示所有翻译可能并不现实。在元数据翻译编辑器中,你可以通过拖动列标题来调整翻译的显示顺序,更方便并排对照翻译内容。此外,你可以随时通过右键上下文菜单在编辑器中添加或删除翻译: +如果您正在处理一个具有许多翻译的模型,一次性显示所有翻译可能不切实际。您可以通过拖动列标题来重新排列元数据翻译编辑器中翻译的显示顺序,从而更轻松地并排比较翻译。此外,您可以随时通过右键单击上下文菜单,在编辑器中添加/删除翻译: + ![元数据翻译编辑器列](~/content/assets/images/metadata-translation-editor-columns-bands.png) \ No newline at end of file diff --git a/localizedContent/zh/content/features/pivot-grid.md b/localizedContent/zh/content/features/pivot-grid.md index 8fdc53a49..46c7283ff 100644 --- a/localizedContent/zh/content/features/pivot-grid.md +++ b/localizedContent/zh/content/features/pivot-grid.md @@ -1,8 +1,8 @@ ---- +--- uid: pivot-grid title: Pivot Grid author: Daniel Otykier -updated: 2026-05-27 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,156 +16,170 @@ applies_to: - edition: Enterprise full: true --- - # Pivot Grid > [!NOTE] -> 本文信息适用于 Tabular Editor 3.16.0 或更高版本。请确保你使用的是最新版本的 Tabular Editor 3,以便充分利用新增功能和改进。 +> 本文中的信息与 Tabular Editor 3.16.0 或更高版本相关。请确保您正在使用最新版本的 Tabular Editor 3,以便利用新功能和改进。 -在开发语义模型时,你经常需要测试 DAX 表达式是否返回了预期值。传统上,这通常通过 Excel 或 Power BI 等客户端工具来完成。在 Tabular Editor 3 中,你可以使用 **Pivot Grids**,其行为与 Excel 中广为人知的 PivotTables 非常相似。 Pivot Grid 可让你快速创建模型数据的汇总视图,从而在对不同列和层级进行筛选与切片时,测试 DAX 度量值的行为。 +在开发语义模型时,您可能经常希望测试您的 DAX 表达式是否返回预期值。传统上,这是使用 Excel 或 Power BI 等客户端工具来完成的。使用 Tabular Editor 3,您可以使用**数据透视网格**,其行为与 Excel 中广为人知的数据透视表非常相似。Pivot Grid让您能够快速创建模型中数据的汇总视图,从而让您能够在按各种列和层次结构进行筛选和切片时测试DAX度量值的行为。 ![Pivot Grid 示例](~/content/assets/images/pivot-grid-example.png) -上面的截图展示了一个 Pivot Grid,其中包含两个度量值 `[Total Net Order Value]` 和 `[Net Orders]`:横向按 Year 切片,并筛选到 2021 和 2022;纵向按 Product Hierarchy 切片。 Tabular Editor 3 用户可以使用此功能,确保度量值背后的 DAX 表达式按预期工作,并快速验证模型中的数据。 +上图的屏幕截图显示了一个包含两个度量值(`[Total Net Order Value]` 和 `[Net Orders]`)的 Pivot Grid,该 Pivot Grid 按年份水平切片,筛选为 2021 年和 2022 年,并按产品层次结构垂直切片。Tabular Editor 3 用户可以使用此功能来确保 Measure 背后的 DAX 表达式按预期工作,并快速验证模型中的数据。 -默认情况下,每次你保存对语义模型的更改(Ctrl+S)时,Pivot Grid 都会自动更新。因此,你可以快速迭代 DAX 表达式并在 Pivot Grid 中查看结果:修改度量值并保存模型后,无需等待模型刷新,Pivot Grid 会立即反映新的度量值定义。一个不错的工作流是:在单独的窗口中打开 Pivot Grid,同时在 **表达式编辑器** 中编写 DAX 表达式,或使用 **DAX脚本**。 +默认情况下,每次保存对语义模型的更改(Ctrl+S)时,Pivot Grid 都会自动更新。因此,您可以快速迭代 DAX 表达式,并在 Pivot Grid 中查看结果,而无需等待模型刷新。只需更改度量值、保存模型,即可直接在 Pivot Grid 中看到新的度量值定义。一个好的工作流程是在**表达式编辑器**中处理 DAX 表达式或使用**DAX 脚本**时,在单独的窗口中打开 Pivot Grid。 > [!TIP] > 关于术语的一些说明: -> -> - **Fields** 指模型度量值、KPI、列和层级。换句话说,就是任何可以拖到 Pivot Grid 里的内容。 -> - **KPIs** 是一种特殊的度量值类型,可在 Tabular Editor 中创建。它们在 Pivot Grid 中的显示方式与度量值相同,但会带有一个特殊图标,用于标明它们是 KPI。每个 KPI 最多可包含 3 个不同的值(目标、趋势和状态),并在 Pivot Grid 中分别显示。 -> - Pivot Grid 中的**列**(例如术语“Column Area”中的列)不要与模型中的列混为一谈。在 Pivot Grid 中,列用于按水平方向切分数据,而行用于按垂直方向切分数据。 -> - Pivot Grid 中的**单元格**是行与列交叉处的单个数据点。每个单元格仅包含一个值。该值是在由 _Row Area_ 和 _Column Area_ 中的值所产生的筛选语境下,并结合对 _Filter Area_ 中各字段应用的任何筛选条件,对特定度量值的 DAX 表达式求值得到的结果。 +> - **字段**是指模型度量值、KPI、列和层次结构。换言之,任何可以拖入Pivot Grid的内容。 +> - **KPI** 是一种特殊类型的度量值,可以在 Tabular Editor 中创建。它们在 Pivot Grid 中显示的方式与度量值一样,但带有一个特殊图标,以表示它们是 KPI。每个KPI最多可以有3个不同的值(目标、趋势和状态),这些值在Pivot Grid中分别显示。 +> - Pivot Grid 中的**列**(例如“列区域”一词中的列)不应与模型中的列混淆。在 Pivot Grid 中,列用于水平切片数据,而行用于垂直切片数据。 +> - Pivot Grid 中的**单元格**是行和列相交处的单个数据点。每个单元格都包含一个单个值,该值是特定度量的 DAX 表达式的结果,在*行区域*和*列区域*中的值所产生的筛选器上下文中进行评估,并与应用于*筛选器区域*中字段的任何筛选器相结合。 > [!NOTE] -> 具有多维模型背景的开发者可能更熟悉 _Dimensions_ 和 _Attributes_ 这两个术语。在语义模型中,_Dimensions_ 由模型表表示,而 _Attributes_ 由模型列表示。语义模型中的 _Hierarchies_ 只是将多列分组在一起的一种方式,例如日历层次结构:Year > Quarter > Month > Day。在多维模型中,这类层次结构过去称为 _Attribute Hierarchies_ 或 _User-Defined Hierarchies_。 +> 具有多维背景的开发人员可能更熟悉*维度*和*属性*这两个术语。在语义模型中,*维度*由模型*表*表示,*属性*由模型*列*表示。语义模型中的*层次结构*只是将列分组的一种方式,例如在日历层次结构中:年 > 季度 > 月 > 日。在多维模型中,此类层次结构曾被称为*属性层次结构*或*用户定义的层次结构*。 ## 创建 Pivot Grid -你可以通过菜单选项 **File > New > New Pivot Grid** 创建一个新的空 Pivot Grid。或者,在 **TOM Explorer** 中选择一个或多个度量值,右键点击或打开 **度量值** 菜单并选择 **Add to Pivot Grid**,即可创建一个包含所选度量值的新 Pivot Grid。 +您可以通过**文件 > 新建 > 新建Pivot Grid**菜单选项来创建一个新的空Pivot Grid。或者,在**TOM Explorer**中选择一个或多个度量值,右键单击或转到**度量值**菜单,然后选择**添加到 Pivot Grid**,以使用所选度量值创建新的 Pivot Grid。 -![从 TOM Explorer 创建 Pivot Grid](~/content/assets/images/create-pivot-grid-from-TOM-Explorer.png) +![通过 TOM Explorer 创建 Pivot Grid](~/content/assets/images/create-pivot-grid-from-TOM-Explorer.png) -你可以按需创建任意数量的 Pivot Grid。 +您可以根据需要创建任意数量的 Pivot Grid。 > [!IMPORTANT] -> 仅当 Tabular Editor 3 连接到 Analysis Services 实例或 Power BI / Fabric XMLA endpoint 时,才能创建 Pivot Grid。 +> 仅当 Tabular Editor 3 连接到 Analysis Services 实例或 Power BI/Fabric XMLA endpoint 时,才能使用创建 Pivot Grid 的选项。 -## Pivot Grid 布局 +## Pivot Grid布局 -Pivot Grid 分为 4 个区域:**Filter Area**、**Column Area**、**Row Area** 和 **Data Area**。你可以将字段从 **字段列表** 或 **TOM Explorer** 拖入这些区域,来创建 Pivot Grid 布局。 **Data Area** 用于放置度量值或 KPI;**Row Area** 和 **Column Area** 用于按层次结构和列切分数据。 **Filter Area** 用于根据列或层次结构中的值筛选数据。 +Pivot Grid分为4个区域:**筛选器区域**、**列区域**、**行区域**和**数据区域**。您可以将字段从**字段列表**或**TOM资源管理器**拖入这些区域,以创建Pivot Grid布局。**数据区域**是放置度量值或 KPI 的区域,而**行区域**和**列区域**用于按层次结构和列对数据进行切片。**筛选器区域**用于根据列或层次结构中的值筛选数据。 ![突出显示的空 Pivot Grid](~/content/assets/images/empty-pivot-grid-highlighted.png) -上图展示了一个空的 Pivot Grid 布局。字段列表底部的 4 个空框分别代表 Pivot Grid 的 4 个区域。你可以将字段从字段列表拖到这些列表框中,以创建 Pivot Grid 的布局。或者,你也可以直接将字段拖到 Pivot Grid 中。 +上方的屏幕截图显示了一个空的Pivot Grid布局。字段列表底部的4个空框代表Pivot Grid的4个区域。您可以将字段从“字段列表”拖入这些列表框,以创建Pivot Grid布局。或者,您可以直接将字段拖入Pivot Grid。 ## Pivot Grid 菜单和工具栏 -默认情况下,在 Tabular Editor 3 中,只要 Pivot Grid 是活动窗口,就会显示 **Pivot Grid** 菜单和工具栏。这个菜单包含与工具栏相同的操作。 +默认情况下,当 Pivot Grid 是 Tabular Editor 3 中的活动窗口时,将提供**Pivot Grid**菜单和工具栏。菜单包含与工具栏相同的操作。 -![Pivot Grid 工具栏](~/content/assets/images/pivot-grid-toolbar.png) +![Pivot Grid工具栏](~/content/assets/images/pivot-grid-toolbar.png) -![Pivot Grid 菜单](~/content/assets/images/pivot-grid-menu.png) +![Pivot Grid菜单](~/content/assets/images/pivot-grid-menu.png) 这些操作包括: -- **模拟身份...**:显示一个对话框,允许你在 Pivot Grid 中指定要模拟的角色或用户。当你希望测试模型在不同用户或角色下的行为时,这会很有用,例如模型已应用了 [RLS 或 OLS](xref:data-security-about) 的情况。 -- **刷新**:重新执行 Pivot Grid 生成的查询。当禁用自动刷新时,或在 Tabular Editor 3 之外对模型进行了更改时,这会很有用。 -- **自动刷新**:开启/关闭自动刷新。启用自动刷新后,每次保存对模型的更改,或当某个 [数据刷新操作](xref:data-refresh-view) 完成时,Pivot Grid 都会自动刷新。 -- **清除筛选器**:清除 Pivot Grid 中的所有筛选器。 -- **清除**:从 Pivot Grid 中移除所有字段。 -- **在列中显示空值**:切换是否在 Pivot Grid 中显示空值,适用于添加到 Pivot Grid 列区域的字段。 -- **在行中显示空值**:切换是否在 Pivot Grid 中显示空值,适用于添加到 Pivot Grid 行区域的字段。 -- **字段列表**:切换字段列表显示/隐藏。 +- **模拟身份…**:显示一个对话框,允许你指定要通过 Pivot Grid 模拟的角色或用户。当您想要测试模型对不同用户或角色的行为时,这非常有用,例如,当[RLS 或 OLS](xref:data-security-about)已应用于模型时。 +- **刷新**:重新执行由Pivot Grid生成的查询。当禁用自动刷新时,或者在 Tabular Editor 3 之外对模型进行了更改时,此操作非常有用。 +- **自动刷新**:切换自动刷新功能的启用或禁用。启用自动刷新后,每次您保存对模型的更改时,或者在[数据刷新操作](xref:data-refresh-view)完成后,Pivot Grid 将自动刷新。 +- **清除筛选器**:清除Pivot Grid中的所有筛选器。 +- **清除**:从Pivot Grid中删除所有字段。 +- **在列上显示空值**:切换是否应在 Pivot Grid 中显示空值(对于添加到 Pivot Grid 列区域的字段)。 +- **在行上显示空值**:切换是否应在 Pivot Grid 中显示空值(对于添加到 Pivot Grid 行区域的字段)。 +- **字段列表**:切换字段列表的显示/隐藏。 ## 字段列表 -默认情况下,字段列表显示在 Pivot Grid 的右侧。字段列表包含模型中所有可用字段(度量值、KPI、列和层级结构)。你可以将字段从字段列表拖到 Pivot Grid 中以创建布局。你还可以在 Pivot Grid 的不同区域之间拖动字段,以重新排列布局。 +默认情况下,字段列表显示在Pivot Grid的右侧。字段列表包含模型中可用的所有字段(度量值、KPI、列和层次结构)。您可以将字段从“字段列表”拖动到Pivot Grid中,以创建布局。您还可以将字段在Pivot Grid的不同区域之间拖动,以重新排列布局。 -字段列表可以停靠在 Pivot Grid 的左侧、右侧、上方或下方;也可以隐藏;或取消停靠,以独立窗口“浮动”显示。如果你同时打开了多个 Pivot Grid,每个 Pivot Grid 都有自己的字段列表。 +“字段列表”本身可以停靠在 Pivot Grid 的左侧或右侧、上方或下方,可以隐藏,也可以取消停靠,使其作为单独的窗口“浮动”。如果您打开了多个 Pivot Grid,则每个 Pivot Grid 都有自己的字段列表。 -如果你希望默认不显示字段列表,请在 **工具 > 偏好 > 数据浏览 > Pivot Grid > 字段列表** 下取消勾选 **始终显示字段列表** 选项。 +如果您不希望默认显示字段列表,请取消选中**工具 > 首选项 > 数据浏览 > Pivot Grid > 字段列表**下的**始终显示字段列表**选项。 -你可以在 **工具 > 偏好 > 数据浏览 > Pivot Grid > 字段列表 > 布局** 中更改字段列表的默认布局。你也可以更改任何字段列表的布局:在字段列表的空白处单击右键,然后在快捷菜单中选择所需的布局。 +您可以在**工具 > 首选项 > 数据浏览 > 数据透视表 > 字段列表 > 布局**下更改字段列表的默认布局。您还可以通过右键单击字段列表的空白区域,然后从上下文菜单中选择所需的布局,来更改任何字段列表的布局。 ![字段列表设置](~/content/assets/images/field-list-settings.png) -默认情况下,你添加到 Pivot Grid 的任何字段都会在字段列表中保持显示。如果你希望隐藏已添加到 Pivot Grid 的字段,可以在 **工具 > 偏好 > 数据浏览 > Pivot Grid > 字段列表** 下取消勾选 **保持字段可见** 选项(此行为与 Tabular Editor v. 3.16.0 之前的 Pivot Grid 类似)。 +默认情况下,您添加到 Pivot Grid 的任何字段都将保留在字段列表中。如果您希望隐藏添加到 Pivot Grid 的字段,可以取消选中**工具 > 首选项 > 数据浏览 > Pivot Grid > 字段列表**下的**保持字段可见**选项(此行为类似于 Pivot Grid 在 Tabular Editor v. 3.16.0 之前的运作方式)。 -如果你正在处理大型复杂模型,并且预计 Pivot Grid 中用到的度量值计算会比较慢,你可以勾选字段列表底部的 **延迟更新布局** 选项。这样可避免 Pivot Grid 在你每次添加或移除字段时都更新布局;如果你打算在更新前对 Pivot Grid 布局做多项修改,这会很有用。点击 **更新** 按钮,将更改应用到 Pivot Grid。 +如果您正在处理一个庞大而复杂的模型,并且预计 Pivot Grid 中使用的度量值会相对较慢,则可以选中字段列表底部的**延迟布局更新**选项。这将阻止 Pivot Grid 在您每次添加或删除字段时更新布局。如果您打算在更新 Pivot Grid 布局之前对其进行多次更改,此选项可能很有用。点击**更新**按钮,将更改应用于 Pivot Grid。 > [!IMPORTANT] -> 没有属性层次结构(IsAvailableIn MDX = false)的列无法在 Pivot Grid 中使用,也不会显示在字段列表中。 +> 不含属性层次结构的列(IsAvailableIn MDX = false)不能在Pivot Grid中使用,也不会显示在字段列表中。 ## 自定义 Pivot Grid ### 添加字段 -将字段添加到 Pivot Grid 有多种方式: +有几种方法可以将字段添加到 Pivot Grid: **从 TOM Explorer:** -- 右键单击一个或多个 _度量值_,然后选择 **添加到 Pivot Grid**。 -- 右键单击 _列_ 或 _层次结构_,然后选择任一 **Add to pivot** 选项(可选择添加到行、列或筛选器)。 -- 如果某个度量值、列或层次结构已经显示在 Pivot Grid 中,右键选项会允许你 **从 Pivot Grid 中移除**。此外,你还会看到用于在 Pivot Grid 的不同区域之间移动列或层次结构的选项。 -- 当你在 TOM Explorer 中选择了一个或多个此类对象时,上述所有选项也可以分别在 **度量值**、**列** 和 **层次结构** 菜单(分别)中找到。 -- 除了以上方式,你还可以将一个或多个度量值、列或层次结构从 TOM Explorer 拖放到 Pivot Grid 的各个区域。 +- 右键单击一个或多个*度量值*,然后选择**添加到 Pivot Grid**。 +- 右键单击*列*或*层次结构*,然后选择任意一个**添加到数据透视**选项(在行、列或筛选器之间进行选择)。 +- 如果Pivot Grid中已显示度量值、列或层次结构,则右键单击选项将允许您**从Pivot Grid中删除**。此外,您还将看到在Pivot Grid的不同区域之间移动列或层次结构的选项。 +- 当在 TOM Explorer 中选择一个或多个此类对象时,上述所有选项也可以通过**度量值**、**列**和**层次结构**菜单(分别)使用。 +- 除上述操作外,您还可以将一个或多个度量值、列或层次结构从 TOM Explorer 拖动到 Pivot Grid 区域。 ![通过 TOM Explorer 将层次结构添加到 Pivot Grid](~/content/assets/images/add-through-tom-explorer.png) -**从字段列表中:** +**从字段列表:** -- 将字段从字段列表拖放到 Pivot Grid。 -- 将字段从字段列表拖放到字段列表底部的各个区域列表框中,即可将其添加到 Pivot Grid。 -- 在“字段列表”中右键单击某个字段,即可看到将其添加到 Pivot Grid 的选项。 -- 如果某个字段已显示在 Pivot Grid 中,右键上下文菜单还会提供移除该字段的选项,或将其移动到其他区域(仅列/层级字段)。 -- 双击某个字段会立即将其添加到 Pivot Grid。度量值/KPI 会添加到“数据区域”,而列和层级字段会添加到“筛选区域”。 +- 将字段从“字段列表”拖到Pivot Grid中。 +- 将字段从“字段列表”拖到“字段列表”底部的区域列表框中,以将其添加到 Pivot Grid 中。 +- 右键单击字段列表中的字段,以查看将其添加到 Pivot Grid 的选项。 +- 如果字段已显示在Pivot Grid中,则右键单击上下文菜单中也会有删除字段或将其移动到其他区域(仅限列/层次结构字段)的选项。 +- 双击字段将立即将其添加到 Pivot Grid 中。量度/KPI 被添加到数据区域,而列和层次结构被添加到筛选器区域。 ![通过字段列表添加](~/content/assets/images/add-through-field-list.png) ### 调整字段 -将字段添加到 Pivot Grid 后,你可以调整列宽,让内容显示得更合适。双击列标题分隔线,会自动将列宽调整为适合该列内容的宽度。你也可以拖动列标题分隔线,手动调整列宽。最后,你可以在列标题上右键单击,在上下文菜单中使用 **最佳适应** 或 **设置宽度...** 选项。 +将字段添加到 Pivot Grid 后,您可以调整列的宽度,以便更好地容纳其内容。双击列标题分隔符将自动调整列宽,以适应列的内容。您还可以拖动列标题分隔符,手动调整列宽。最后,您可以通过右键单击列标题,使用上下文菜单选项**最佳适应**或**设置宽度……**。 -![最佳适应列 2](~/content/assets/images/best-fit-columns-2.png) +![列最佳适应 2](~/content/assets/images/best-fit-columns-2.png) -要同时对 Pivot Grid 中的所有列应用“最佳适应”,或为所有列设置特定的像素宽度,请在“值”标题上右键单击,然后在上下文菜单中选择所需选项。 +要同时对Pivot Grid中的所有列应用“最佳拟合”或设置特定的像素宽度,请右键单击“值”标题,然后从上下文菜单中选择所需选项。 -默认情况下,字段标题会在垂直方向自动扩展,以适应字段名称的内容。如果你想把字段标题的高度限制为一行,可以在 **工具 > 偏好 > Pivot Grid > 字段标题** 中禁用 **字段标题自动换行** 选项。 +默认情况下,字段标题垂直展开以适应字段名称。要将字段标题限制为一行,请在**工具 > 首选项 > 数据浏览 > 数据透视表 > 字段标题**下取消选中**字段标题自动换行**。 -要更改 Pivot Grid 中字段的顺序,你可以在 Pivot Grid 的不同区域之间拖动字段。你也可以在同一区域内拖动字段来调整顺序。要从 Pivot Grid 中移除字段,你可以把它拖回“字段列表”,或在该字段上右键单击,然后从上下文菜单中选择 **从 Pivot Grid 中移除**。 +要更改 Pivot Grid 中字段的顺序,您可以将字段在 Pivot Grid 的不同区域之间拖动。您还可以拖动同一区域内的字段,以更改其顺序。要从 Pivot Grid 中删除字段,请将其拖回字段列表,或右键单击该字段,然后从上下文菜单中选择**从 Pivot Grid 中删除**。 -如果你想让度量值显示在行上而不是列上,把“值”字段从“列区域”拖到“行区域”即可。 +如果您希望将度量值显示在行上而不是列上,请将“值”字段从列区域拖动到行区域。 ### 可视化规则 -你可以为 Pivot Grid 中的单元格添加可视化规则,这有助于根据数值突出显示单元格,例如更容易发现异常值。要添加可视化规则,在 Pivot Grid 的任意“数据区域”单元格上右键单击,然后从上下文菜单中选择要应用的规则(见下方截图)。 +您可以向数据透视中的单元格添加可视化规则,这对于根据单元格的值突出显示单元格非常有用,例如,以便更好地发现异常值。要添加可视化规则,请右键单击 Pivot Grid 中任何数据区域单元格,然后从上下文菜单中选择要应用的规则(请参阅下图)。 ![自定义 Pivot Grid](~/content/assets/images/customizing-pivot-grids.png) -## 保存 Pivot Grid 布局 +## 持久化 Pivot Grid 布局 -当你关闭 Pivot Grid 时,Tabular Editor 会提示你保存 Pivot Grid 的布局。如果你选择保存布局,那么下次打开 Pivot Grid 时,它会恢复到你关闭时的布局。当 Pivot Grid 窗口处于活动状态时,你也可以按 (Ctrl+S) 或使用 **文件 > 保存** 选项手动保存 Pivot Grid 的布局。 +关闭 Pivot Grid 时,Tabular Editor 将提示您保存 Pivot Grid 的布局。如果您选择保存布局,下次打开数据透视表时,它将恢复到关闭时的布局。当Pivot Grid为活动窗口时,您还可以通过按 (Ctrl+S) 或使用**“文件”>“保存”**选项,手动保存Pivot Grid的布局。 -用于保存 Pivot Grid 布局的文件扩展名是 `.te3pivot`。这是一个简单的 json 文件,用于指定 Pivot Grid 中显示哪些模型对象,以及它们放置在哪些区域。对象通过名称和 Lineage tag(如有)进行引用,因此即使自保存布局以来模型发生了修改,通常也能恢复 Pivot Grid 布局。 +用于保存 Pivot Grid 布局的文件扩展名为 `.te3pivot`。这是一个简单的 json 文件,用于指定在 Pivot Grid 中显示哪些模型对象,以及将它们放置在哪些区域。对象通过名称和沿袭标签(如果存在)进行引用,因此即使自保存布局以来模型已更改,通常也可以还原 Pivot Grid 布局。 > [!NOTE] -> 你可以打开在其他模型中创建的 Pivot Grid 布局,不过要注意:该布局中的字段可能在你当前连接的模型中并不存在。在这种情况下,Pivot Grid 会显示一条警告信息,并将模型中不存在的字段从布局中移除。你可以在 **工具 > 偏好 > 数据浏览 > Pivot Grid > 如果 Pivot Grid 与模型不匹配则显示警告** 中关闭这条警告信息。 +> 您可以打开在不同模型中创建的 Pivot Grid 布局。如果布局使用了您所连接的模型中不存在的字段,则会显示警告,并且这些字段将从布局中删除。当已打开的 Pivot Grid 保持打开状态并连接到不同的模型时,也会发生同样的情况,如[切换模型](#switching-models)中所述。要关闭警告,请在**工具 > 首选项 > 数据浏览 > Pivot Grid**下取消选中**如果 Pivot Grid 与模型不匹配则显示警告**。 + +## 切换模型 + +当您打开不同的模型时,已打开的 Pivot Grid 将保持打开状态并连接到新模型。每个 Pivot Grid 都保留其字段布局,新模型中不包含的任何字段都会从布局中删除。删除字段时,将显示警告:“刚才打开的模型不包含此Pivot Grid使用的所有字段。缺少的字段已从布局中删除。” 如果新模型没有可浏览的数据,例如从不含工作区数据库的文件加载的模型,则Pivot Grid将被清空。 + +如果 Pivot Grid 的**自动刷新**已关闭,则该网格将保留其先前的布局和值,直到您单击**刷新**或打开其字段列表。此时,它将连接到新模型并删除所有缺失的字段。 + +如果已打开的 Pivot Grid 的布局中包含字段,则在新模型打开之前,将显示**Pivot Grid 将重新绑定到新模型**确认消息: + +- **是**将打开新模型。 +- **是,不再询问**将打开新模型并清除**如果 Pivot Grid 与模型不匹配则显示警告**偏好设置,这将同时关闭此确认提示和有关已丢弃字段的警告。 +- **取消**将保持当前模型加载的状态,所有文档均保持不变。 + +要保留原始布局,请点击**取消**,并在切换模型之前使用**文件 > 另存为**保存 Pivot Grid 的副本。 + +在**工具 > 首选项 > 数据浏览 > Pivot Grid**下取消选中**打开其他模型时保持 Pivot Grid 打开**,以便在您打开其他模型时关闭 Pivot Grid。此选项默认为选中状态。 ## 其他功能 -Pivot Grid 还有一些值得了解的功能: +Pivot Grid还有一些值得了解的实用功能: -- 如果你在字段上右键单击,可以选择 **转到** 该字段。这会将焦点切换到 TOM Explorer,并选中对应的模型对象。对于度量值和计算列,焦点会切换到 **表达式编辑器**,并显示相应对象的 DAX 表达式。 -- 如果你在 Pivot Grid 的单元格上右键单击,可以选择 **调试此值**。这将启动 [**DAX Debugger**](xref:dax-debugger),并以生成该单元格值的特定度量值和筛选语境为起点进行调试。 -- 当 Pivot Grid 正在 **刷新** 时,某些工具栏项会被禁用,上下文菜单操作也会暂时不可用。 +- 如果右键单击某个字段,您将可以选择**转到**该字段。这将使 TOM Explorer 成为焦点,并选中等效的模型对象。对于度量值和计算列,**表达式编辑器**将成为焦点,并显示度量值的 DAX 表达式。 +- 如果右键单击 Pivot Grid 中的单元格,您可以选择**调试此值**选项。这将启动[**DAX 调试器**](xref:dax-debugger),从产生单元格中值的特定度量值和筛选器上下文开始。 +- Pivot Grid **正在刷新**时,某些工具栏项将被禁用,上下文菜单操作将暂时不可用。 -## 限制与已知问题 +## 限制和已知问题 -下面列出了 Tabular Editor 3.16.0 中 Pivot Grid 的已知限制与问题,我们正在努力在后续版本中解决: +以下是 Tabular Editor 3.16.0 中 Pivot Grid 的已知限制和问题列表,我们正在努力在未来版本中解决这些问题: -- 格式规则(例如图标集、数据条等)在将 Pivot Grid 布局保存为 `.te3pivot` 文件时,这些规则无法被正确保留。 -- 如果你在与保存布局时不同的模型上打开 `.te3pivot` 文件,当前模型中不存在的字段会从布局中移除。按“保存”(Ctrl+S) 会保存该布局,并将已移除的字段也一并从文件中去除。我们可能会在未来版本中更改此行为,让 `.te3pivot` 文件在你明确确认之前不会被覆盖。 -- 使用 **Group By Columns** 属性的列(包括字段参数列)不能单独添加到行区域或列区域。这样做会出现错误 _"Column X is part of a composite key, but not all columns of the composite key are included in the expression or its dependent expression"_。这是 MDX 客户端的普遍限制,在 Excel 数据透视表中使用此类列时也会出现同样的情况。为绕过此问题,请在添加依赖列之前,先将相关的 Group By Column 添加到 Pivot Grid,然后再添加依赖列。例如,如果 `[ProductKey]` 被配置为 `[ProductName]` 的 Group By Column,先将 `[ProductKey]` 添加到行区域或列区域,再添加 `[ProductName]`。 -- 对行区域或列区域中的列显式应用升序或降序排序时,无论列的数据类型如何,值都会按字符串的字典序排序。以长日期格式显示的日期(例如“2024 年 五月 4 日”)和整数会按字典序排序,而不是按时间顺序或数值顺序排序。这是 MDX 客户端排序方式的限制;连接到该模型的 Excel 数据透视表中也会出现相同的行为。要按时间顺序或数值顺序排序,请使用列的自然排序(不要显式设置排序),或在模型列上使用 **Sort By Column** 属性,将其指向一个底层值可用于排序的列。 \ No newline at end of file +- 将Pivot Grid布局另存为“.te3pivot”文件时,格式规则(例如图标集、数据条等)未正确保留。 +- 如果您在与保存布局的模型不同的模型上打开 `.te3pivot` 文件,或者在已保存的 Pivot Grid 打开时切换模型,则当前模型中不存在的字段将从布局中删除。如果随后进行保存(**Ctrl+S**),则 `.te3pivot` 文件将被覆盖,且不包含这些字段。 +- 使用“按列分组”属性的列(包括字段参数列)不能单独添加到行区域或列区域。这样做会导致出现错误“*列 X 是复合键的一部分,但并非复合键的所有列都包含在表达式或其依赖表达式中*”。这是 MDX 客户端的一般性限制,在 Excel 数据透视表中也存在使用此类列时会出现这种情况。要解决此问题,请在添加从属列*之前*将相关的“分组依据列”添加到Pivot Grid。例如,如果 `[ProductKey]` 被配置为 `[ProductName]` 的“分组依据列”,请先将 `[ProductKey]` 添加到行区域或列区域,然后再添加 `[ProductName]`。 +- 对行区域或列区域中的列应用显式升序或降序排序时,无论列的数据类型如何,都会按字母顺序将值作为字符串排序。格式化为长日期的日期(例如“2024 年 5 月 4 日”)和整数按字典顺序排序,而不是按时间顺序或数字顺序排序。这是 MDX 客户端排序方式的限制,连接到模型的 Excel 数据透视表也会出现相同的行为。要获得按时间顺序或数值顺序的排序,请依靠列的自然排序(不要应用显式排序),或使用模型列上的**按列排序**属性,以指向具有可排序底层值的列。 \ No newline at end of file diff --git a/localizedContent/zh/content/features/toc.md b/localizedContent/zh/content/features/toc.md index 0a167a41f..01fa86cef 100644 --- a/localizedContent/zh/content/features/toc.md +++ b/localizedContent/zh/content/features/toc.md @@ -1,119 +1,100 @@ # 用户界面 - ## @user-interface - -## @tom-explorer-view - +## @tom-资源管理器视图 ## @properties-view - +## @unsaved-changes ## @bpa-view - ## @data-refresh-view - ## @find-replace - ## @messages-view - ## @diagram-view # DAX 功能 - ## @dax-debugger - ## @dax-editor - ## @dax-query - ## @dax-scripts - ## @code-actions - ## @dax-package-manager -# 脚本编写与自动化 - +# 脚本和自动化 ## @csharp-scripts - -## C# Script 脚本库 - -### @csharp-script-library - -### @script-library-beginner - -### @script-library-advanced - -## @script-helper-methods - -## @useful-script-snippets - +## C#脚本库 +### @csharp-脚本库 +### @脚本库-初级 +### @脚本库-高级 +## @脚本-帮助程序-方法 +## @有用的脚本片段 ## @macros -# 模型分析与质量 - -## @best-practice-analyzer - -### @built-in-bpa-rules - +# 模型分析和质量 +## @最佳实践分析器 +### @内置-bpa-规则 ### @using-bpa - ### @using-bpa-sample-rules-expressions - ## @dax-optimizer-integration -# 数据探索与连接性 - +# 数据探索和连接性 ## @import-tables - +## @connectivity +### @connect-sql-server +### @connect-snowflake +### @connect-databricks +### @connect-oracle +### @connect-odbc +### @connect-oledb +### @connect-onelake +### @connect-dataflows +## @table-preview ## @pivot-grid - ## @semantic-model-types - ### @direct-lake-sql-model - ### @dq-over-as-limitations -# AI Features - +# AI 功能 ## @ai-assistant +## @mcp-server +## @ai-audit-log # 高级建模功能 - -## @metadata-translation-editor - +## @user-context-calculated-columns +## @元数据-翻译-编辑器 ## @perspective-editor # 模型组织 - ## @hierarchical-display - ## @table-groups -# 模型部署与管理 - +# 模型部署和管理 ## [模型部署](deployment.md) - ## @workspace-databases - ## @workspace-mode - ## @tmdl - ## @save-to-folder - ## @save-with-supporting-files - +## @auto-reload ## @advanced-refresh - ## @refresh-overrides -# 命令行与集成 - -## @command-line-options - -# 用于跨平台翻译的语义桥 - +# 命令行和集成 +## Tabular Editor CLI(有限 PuPr) +### [概述](xref:te-cli) +### [安装和设置](xref:te-cli-install) +### [身份验证和连接](xref:te-cli-auth) +### [命令参考](xref:te-cli-commands) +### [自定义配置](xref:te-cli-config) +### [交互模式](xref:te-cli-interactive) +### [自动化和脚本](xref:te-cli-automation) +### [CI/CD 集成](xref:te-cli-cicd) +### [机器可读结果(JSON)](xref:te-cli-findings) +### [AI 代理技能](xref:te-cli-skill) +### [从 TE2 CLI 迁移](xref:te-cli-migrate) +### [行为差异和已知限制](xref:te-cli-limitations) +## @命令行选项 + +# [用于跨平台翻译的语义桥](xref:semantic-bridge) ## @semantic-bridge - ## @semantic-bridge-metric-view-object-model - +## @semantic-bridge-metric-view-tabular-translation ## @semantic-bridge-metric-view-validation +## @semantic-bridge-metric-view-fields-and-dimensions diff --git a/localizedContent/zh/content/features/unsaved-changes.md b/localizedContent/zh/content/features/unsaved-changes.md index 1a013e2ac..674319c8a 100644 --- a/localizedContent/zh/content/features/unsaved-changes.md +++ b/localizedContent/zh/content/features/unsaved-changes.md @@ -1,8 +1,8 @@ --- uid: unsaved-changes -title: 未保存更改指示符 +title: 未保存的更改指示器 author: Daniel Otykier -updated: 2026-09-23 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -17,136 +17,135 @@ applies_to: - edition: Enterprise full: true --- +# 未保存的更改指示器 -# 未保存更改指示符 +Tabular Editor 3 会标记与模型上次保存的版本存在差异的对象和属性。这包括来自[C# 脚本](xref:csharp-scripts)、宏和[AI 助手](xref:ai-assistant)的更改。当您保存、还原或撤消更改时,标记将清除。 -Tabular Editor 3 会标记与模型上次保存时相比发生变化的对象和属性。这包括来自 [C# Script](xref:csharp-scripts)、宏和 [AI Assistant](xref:ai-assistant) 的更改。保存、还原或撤销更改后,标记会被清除。 +指示器出现在两个位置: -这些指示器会显示在两个位置: +- 在[TOM 资源管理器](xref:tom-explorer-view)中,已更改的对象会显示为彩色行并带有图标徽章:橙色(已编辑)、绿色(已添加)和红色(已删除)。这些是部署时显示的模型比较视图的颜色。 +- 在[属性视图](xref:properties-view)中,已更改的属性显示为浅橙色行。 -- 在 [TOM Explorer](xref:tom-explorer-view) 中,已更改的对象所在行会以不同颜色显示,并带有图标徽章:橙色(已编辑)、绿色(已添加)和红色(已删除)。这些颜色与部署时显示的模型比较视图中的颜色一致。 -- 在 [属性视图](xref:properties-view) 中,已更改的属性所在行会显示为淡橙色。 +![TOM Explorer 中突出显示了已编辑、已添加和已删除的度量值,并且“属性”视图中突出显示了已更改的“描述”行](~/content/assets/images/unsaved-changes/overview.png) -![TOM Explorer 中已编辑、新增和已删除的度量值已高亮显示,属性视图中已更改的“说明”行也已高亮显示](~/content/assets/images/unsaved-changes/overview.png) - -这两个视图都提供 **显示更改** 工具栏按钮,以及右键菜单中的 **还原** 命令。 +这两个视图均具有**显示更改**工具栏按钮和右键单击**还原**命令。 > [!NOTE] -> 这些指示器会跟踪相对于模型的加载来源或上次保存目标所发生的更改。将模型部署到其他数据库不会清除这些标记。 +> 这些指示器跟踪相对于模型从中加载或最后保存到的源的更改。将模型部署到其他数据库不会清除这些标记。 ## TOM Explorer 中的更改指示器 -树中的每个对象都会根据其自上次保存以来的变化进行标记: +树中的每个对象都根据其自上次保存以来的更改进行标记: -- **已编辑** 对象所在行会显示为淡橙色,并在图标上带有橙色圆点徽章。这包括任何被修改的属性,也包括在树中没有对应节点的子对象上的更改,例如表的刷新策略或列的 `AlternateOf` 设置。 -- **已添加** 对象所在行会显示淡绿色背景,并带有绿色 **+** 徽标。新表及其所有新列都会显示为绿色。编辑已添加的对象不会使其从绿色变为橙色。 -- **已删除** 对象所在行会显示为淡红色,并带有红色 **−** 徽章,同时其名称会显示删除线。请参见 [已删除对象](#deleted-objects)。 +- **已编辑**的对象显示为浅橙色行,并带有橙色圆点徽章。这涵盖任何已修改的属性,包括对树中没有节点的子对象的更改,例如表的刷新策略或列的 `AlternateOf` 设置。 +- **已添加**的对象显示为浅绿色行,并带有绿色 **+** 徽章。新表及其所有新列均为绿色。编辑已添加的对象不会将其从绿色变为橙色。 +- **已删除**对象显示为浅红色行、红色 **−** 徽章和带删除线的名称。请参阅[已删除对象](#deleted-objects)。 -如果其下方的内容发生了更改,表、显示文件夹、表格组以及 **Model** 节点会显示斜线填充图案。如果其下方的所有更改都是新增,其图标徽章就是绿色;否则为橙色。 +当表格、显示文件夹、表格组和**模型**节点下方的某项内容发生变化时,它们将显示为阴影填充。当它们下方的所有更改都是添加时,它们的图标徽章为绿色,否则为橙色。 -在选中状态下,选中高亮会覆盖行颜色,但图标徽章仍会标记已更改的对象。错误和警告徽章的优先级高于更改徽章。 +在选择范围内,选择高亮显示优先于行颜色,图标徽章仍会标记已更改的对象。错误和警告徽章的优先级高于更改徽章。 > [!TIP] -> 如果绿色行和红色行不易区分,请在 **工具 > 偏好 > Tabular Editor > 用户界面** 下的 **辅助功能** 组中选择 **色盲模式**。此后,新增对象会以蓝绿色而非绿色标记,这里和模型比较视图中都会这样显示。 +> 如果难以区分绿色和红色行,请在**工具 > 偏好 > Tabular Editor > 用户界面**下的**辅助功能**组中选择**色盲模式**。在此处和模型比较视图中,添加的对象将显示为蓝绿色,而不是绿色。 ### 显示更改 -TOM Explorer 工具栏上的 **显示更改** 按钮会筛选树视图,仅显示有未保存更改的对象,以及包含这些对象的表、显示文件夹和表格组。启用此筛选器时,视图标题会显示为 **TOM Explorer (Changed)**。 +TOM Explorer 工具栏上的**显示更改**按钮将树状视图筛选为具有未保存更改的对象,以及包含这些对象的表、文件夹和组。筛选器处于活动状态时,视图标题显示为**TOM Explorer(已更改)**。 -![TOM Explorer 启用“显示更改”筛选器,仅列出已更改的对象及其所属容器](~/content/assets/images/unsaved-changes/tom-explorer-show-changes.png) +![已启用“显示更改”筛选器的 TOM 资源管理器,仅列出已更改的对象及其容器](~/content/assets/images/unsaved-changes/tom-explorer-show-changes.png) -该筛选器可与工具栏上的其他切换按钮和搜索框配合使用。例如,使用 **Ctrl+2** 隐藏列时,已更改的列也会从筛选后的视图中隐藏。 +该筛选器与其他工具栏切换按钮和搜索框结合使用。例如,使用**Ctrl+2**隐藏列也会在筛选视图中隐藏已更改的列。 -## 属性视图中的更改指示器 +## 更改属性视图中的指示器 -选择已更改的对象时,已更改的属性也会以同样的浅橙色行背景高亮显示。对于包含子对象的折叠行,例如度量值的 **KPI** 行或表的 **刷新策略** 行,只要子对象中的任何内容发生更改,该行就会被标记。对于 **注释** 这类带索引的行,仅会标记发生更改的那条注释。选择多个对象时,只要所选对象中有任意一个更改了该属性,对应的属性行就会被标记。 +当您选择一个已更改的对象时,已更改的属性将显示在同一浅橙色行中。包含子对象的折叠行(例如度量的**KPI**行或表的**刷新策略**行)会在子对象内的任何内容发生更改时被标记。对于**注释**等索引行,仅标记已更改的注释。当选择多个对象时,如果任何所选对象更改了该属性,则会标记属性行。 -属性视图工具栏上的 **显示更改** 按钮会隐藏未更改的行。启用该筛选器时,视图标题将显示为 **属性(已更改)**。 +“属性”视图工具栏上的**显示更改**按钮可隐藏未更改的行。筛选器处于活动状态时,视图标题显示为**属性(已更改)**。 -![已启用“显示更改”筛选器的属性视图,仅列出已更改的属性](~/content/assets/images/unsaved-changes/properties-show-changes.png) +![“属性”视图,其中“显示更改”筛选器处于活动状态,仅列出已更改的属性](~/content/assets/images/unsaved-changes/properties-show-changes.png) ## 还原更改 -**文件 > 从磁盘重新加载** 会丢弃所有未保存的更改,并从其源重新加载模型。对于从服务器打开的模型,该命令为 **文件 > 从服务器重新加载**。**还原** 会撤销单个更改,其他所有未保存的更改则会保留。 +**文件 > 从磁盘重新加载**将放弃所有未保存的更改,并从源重新加载模型。对于从服务器打开的模型,命令为**文件 > 从服务器重新加载**。**还原**将撤消个别更改,并保留所有其他未保存的更改。 -执行还原时,就像手动输入旧值或手动重新创建已删除对象一样:Tabular Editor 会更新 DAX 引用和依赖对象,并将这次还原作为一个步骤加入撤销堆栈。要撤销还原,使用 **编辑 > 撤销**(**Ctrl+Z**)。 +还原的运作方式类似于手动输入旧值或重新创建已删除的对象:Tabular Editor会更新DAX引用和依赖对象,并将还原作为一个步骤添加到撤消栈中。要撤消还原,请使用**编辑 > 撤消**(**Ctrl+Z**)。 ### 还原单个属性 -在属性视图中右键单击带标记的行,然后选择 **还原**,即可将该属性恢复为上次保存时的值。该对象的其他未保存的更改会保留不变。 +在“属性”视图中右键单击标记的行,然后选择**还原**以恢复其保存的值。对象的其他未保存的更改将保持不变。 -![属性视图,其中“描述”和“格式字符串”行已更改,并显示右键菜单中的“还原”命令](~/content/assets/images/unsaved-changes/revert-property.png) +![显示已更改的“描述”和“格式字符串”行的“属性”视图,以及右键单击“还原”命令](~/content/assets/images/unsaved-changes/revert-property.png) -**还原** 仅对包含未保存更改的行可用。选中多个对象时,在合并行上执行 **还原** 会将所有选中且更改了该属性的对象一并还原,并作为一个可撤销的步骤。在 **注释** 等容器行上执行 **还原**,会一次性还原其所有注释:已编辑的注释会恢复为保存时的值,新增的注释会被移除,而已删除的注释会被恢复。 +**还原**仅在有未保存更改的行上启用。当选择了多个对象时,在合并行上执行**还原**操作将还原每个已更改属性的所选对象上的属性,作为一个撤消步骤。在**注释**等容器行上使用**还原**将还原其所有注释:已编辑的注释将恢复为已保存的值,已添加的注释将被移除,已删除的注释将被还原。 ### 还原对象或模型分支 -在 TOM Explorer 中右键单击带标记的对象,然后选择 **还原**,即可将该对象及其下所有内容恢复为上次保存时的状态。只要其下有内容发生更改,就可以在表、显示文件夹、表格组以及 **模型** 节点上使用 **还原**。在 **模型** 节点上执行 **还原** 会丢弃模型中所有未保存的更改,并作为一个可撤销的步骤加入撤销堆栈。 +在 TOM Explorer 中右键单击已标记的对象,然后选择**还原**,将该对象及其下方的所有内容还原为其上次保存的状态。当表、显示文件夹、表组和**模型**节点下方的某些内容发生变化时,也可以使用**还原**。对**模型**节点执行**还原**操作将放弃模型中所有未保存的更改,作为一个撤消步骤。 -![TOM Explorer 中已修改度量值的右键菜单,其中包含“还原”](~/content/assets/images/unsaved-changes/revert-object.png) +![在已编辑的 Measure 上右键单击 TOM Explorer 菜单,选择“还原”](~/content/assets/images/unsaved-changes/revert-object.png) -还原对象或模型分支时: +当您还原对象或分支时: -- 已编辑的属性会恢复为保存时的值。 -- 自上次保存后新增的对象会被移除。 -- 自上次保存后删除的对象会恢复为保存时的状态,包括已删除度量值的 KPI,或已删除列的层次结构级别和关系。 -- 模型中其他位置的对象会保留其未保存的更改。 +- 已编辑的属性恢复为保存的值。 +- 自上次保存以来添加的对象将被删除。 +- 自上次保存以来删除的对象将按保存时的状态恢复,包括已删除度量的 KPI,或已删除列的层次结构级别和关系。 +- 模型中其他位置的对象保留其未保存的更改。 -如果还原的某些部分失败,会显示 **还原未完成** 信息,列出失败项,Tabular Editor 会继续应用其余部分。例如,如果另一个对象已经占用了它的名称且无法移除,那么该已删除对象将无法还原。 +如果还原操作的部分内容失败,则会显示“**还原不完整**”消息,列出失败的内容,而 Tabular Editor 会应用其余内容。例如,如果另一个对象现在使用已删除对象的名称且无法删除,则无法还原该已删除对象。 -## 已删除的对象 +## 已删除对象 -删除对象并不会将其从 TOM Explorer 中移除。在保存模型之前,该对象会保留在原处,其名称带删除线,所在行显示为浅红色,并带有红色 **−** 标记。显示信息列时,**对象类型**列中会显示例如 **度量值(已删除)** 这样的内容。 +删除对象不会将其从 TOM Explorer 中移除。在您保存模型之前,该对象将保留在原位,其名称带有删除线,所在行显示为浅红色,并带有红色 **−** 徽章。显示信息列时,**对象类型**列显示的内容例如为**度量值(已删除)**。 -![TOM Explorer 中,已删除的度量值所在行显示为红色,名称带有删除线](~/content/assets/images/unsaved-changes/deleted-objects.png) +![TOM Explorer 中红色行上带有删除线的已删除度量值](~/content/assets/images/unsaved-changes/deleted-objects.png) -右键单击已删除的对象并选择 **还原**,即可将其恢复到删除前一刻的状态。如果对象在删除前有尚未保存的编辑,这些编辑也会一并恢复并继续保留标记,方便你单独撤销。要一步还原多个已删除对象,请将它们全部选中,然后选择 **还原**。 +右键单击已删除的对象,然后选择**还原**,将其还原为删除时的状态。如果在删除对象之前,对象有未保存的编辑内容,则这些编辑内容也会被还原并保持标记状态,您可以单独还原这些编辑内容。要一步还原多个已删除的对象,请全选这些对象,然后选择**还原**。 -你不能编辑、重命名、拖动或展开已删除的对象,它也不能作为拖放或粘贴的目标。选择已删除的对象并不会选中模型对象,因此属性视图不会显示任何内容,右键菜单中也只有 **还原**。如果所选内容同时包含已删除对象和现有对象,则既不会提供 **还原**,也不会提供常规对象命令。 +您无法编辑、重命名、拖动或展开已删除的对象,它也绝不会成为拖放或粘贴的目标。选择已删除对象不会选择模型对象,因此“属性”视图不显示任何内容,右键菜单中只有**还原**。同时选择了已删除对象和活动对象时,既没有**还原**命令,也没有常规对象命令。 -如 [脚本](#scripting) 中所述,C# Script 可通过 `Selected.Deleted` 访问所选的已删除对象。 +C# 脚本通过 `Selected.Deleted` 访问选定的已删除对象,如[脚本](#scripting)中所述。 -### 将已删除对象集中到一个节点下 +### 将已删除对象归集到一个节点下 -如果你在 **工具 > 偏好 > Tabular Editor > TOM Explorer** 下的 **未保存的更改** 部分选择 **将已删除对象收集到“已删除对象”节点下**,则表、层次结构、角色或表格组中的已删除对象会集中列在其容器末尾的同一个 **已删除对象** 节点下,而不管它们原先位于哪个显示文件夹中。该节点所在行会显示为红色,并带有删除标记;其下对象的名称会带有删除线。右键单击该节点并选择 **还原**,即可一步恢复其下的所有内容。 +如果你在**工具 > 偏好 > Tabular Editor > TOM Explorer**下的**未保存的更改**部分中选择**将已删除对象归集到“已删除对象”节点下**,则无论表、层次结构、角色或表组的已删除对象位于哪个显示文件夹中,它们都会在其容器的末尾列示在一个**已删除对象**节点下。该节点有一行红色和“已删除”徽章,其下的对象被删除线划掉。右键单击该节点并选择**还原**,即可一步还原其下的所有内容。 -![TOM Explorer,其中已删除的度量值列在其表末尾的“已删除对象”节点下](~/content/assets/images/unsaved-changes/deleted-objects-group.png) +![TOM Explorer,其中一个已删除的度量值列在其表末尾的“已删除对象”节点下](~/content/assets/images/unsaved-changes/deleted-objects-group.png) -### 保存后仍保留已删除对象 +### 在多次保存中保留已删除对象 -默认情况下,已删除对象在保存前会一直保持可见。如需更改,请将 **保留已删除对象可见** 这一偏好设置为另外两个选项之一: +默认情况下,已删除的对象在您保存之前仍保持可见。要更改此设置,请将**保持已删除对象可见**首选项设置为其另外两个选项之一: -- **从不**:TOM Explorer 会立即隐藏已删除对象。要恢复它们,请在其容器上使用 **Revert**,或选择 **编辑 > 撤销**。 -- **在模型关闭之前**:已删除对象在整个编辑会话期间都会保持可见并可还原,即使跨越多次保存也一样,只要其删除操作仍在撤销堆栈中。还原在上次保存前删除的对象时,会重新创建该对象,并将其标记为新增对象。在同一会话中创建又删除的对象,只有在其存在期间你编辑过它,或保存过模型时,才会显示出来。 +- **从不**:TOM Explorer 立即隐藏已删除对象。要恢复它们,请在其容器上使用**还原**,或使用**编辑 > 撤销**。 +- **直到模型关闭**:在整个编辑会话(包括跨次保存)中,已删除的对象仍保持可见且可恢复,同时其删除操作仍位于撤消栈中。恢复上次保存之前已删除的对象会再次创建该对象,并将其标记为已添加。您在同一会话中创建并删除的对象仅在您编辑该对象或在其存在时保存模型的情况下才会显示。 -## 指示标记何时会清除 +## 指示器何时清除 -标记反映的是当前状态与上次保存的状态之间的差异。将模型保存到文件、文件夹或数据库时,会一次性清除所有标记。标记也会在以下情况下清除:还原该更改、撤销到上次保存时的状态,或手动将属性设回其已保存的值。如果你撤销到了上次保存点之前,被撤销的对象会被标记为已更改;重新执行更改会恢复其标记。 +标记反映了当前状态与上次保存状态的差异。将模型保存到文件、文件夹或数据库会一次性清除所有标记。当您撤销更改、撤消回上次保存的点,或手动将属性设置回其保存的值时,标记也会清除。如果您撤消到上次保存之后,被撤消的对象将被标记为已更改,而重做更改将恢复其标记。 -## 偏好设置 +## 偏好 -相关指示器设置位于 **工具 > 偏好 > Tabular Editor > TOM Explorer** 下的 **未保存的更改** 部分: +指示器设置位于**工具 > 首选项 > Tabular Editor > TOM Explorer**下的**未保存的更改**部分: -![TOM Explorer 偏好设置页面中的“未保存的更改”部分](~/content/assets/images/unsaved-changes/preferences.png) +![TOM Explorer首选项页面的“未保存的更改”部分](~/content/assets/images/unsaved-changes/preferences.png) -- **标记有未保存更改的对象**(已启用):在 TOM Explorer 中为新增、已编辑和已删除对象的行着色,并为其图标添加角标,还会为其容器添加斜线填充。不影响已删除对象的可见性,也不影响 **显示更改**。 -- **保持已删除对象可见**(直到模型保存):控制已删除对象在 TOM Explorer 中保留可见的时长。请参阅[跨保存保留已删除对象](#keeping-deleted-objects-across-saves)。 -- **将已删除对象集中到“已删除对象”节点下**(已禁用):将容器中已删除的对象统一列在一个节点下。请参阅[将已删除对象集中到一个节点下](#gathering-deleted-objects-under-one-node)。 -- **在“属性”窗格中标记有未保存更改的属性**(已启用):在属性视图中对已更改属性的行着色。不影响属性视图中的 **显示更改**。 +- **标记具有未保存更改的对象**(启用):在 TOM Explorer 中为已添加、已编辑和已删除的对象的行着色,为其图标添加徽章,并为其容器添加阴影。不影响已删除对象的可见性或**显示更改**。 +- **保持已删除对象可见**(直到模型保存):已删除对象在 TOM Explorer 中保留的时间。请参阅[在多次保存之间保留已删除的对象](#keeping-deleted-objects-across-saves)。 +- **将已删除对象归集到“已删除对象”节点下**(已禁用):将容器的已删除对象列在同一个节点下。请参阅[将已删除对象归集到一个节点下](#gathering-deleted-objects-under-one-node)。 +- **在属性窗格中标记具有未保存更改的属性**(已启用):在属性视图中为已更改属性的行着色。不影响属性视图中的**显示更改**。 -本页的其他设置请参见 @preferences。 +有关此页面上的其他设置,请参阅@preferences。 ## 脚本 -[C# Script](xref:csharp-scripts) 和宏可以通过每个模型对象都具备的以下成员读取相同的更改信息,并执行相同的还原操作: +[C# 脚本](xref:csharp-scripts)和宏可以通过以下每个模型对象都具有的成员读取相同的更改信息并运行相同的还原操作: -- 当该对象或其下任何内容与上次保存的状态不同时,`HasUnsavedChanges` 返回 `true`。在 `Model` 对象上,它会返回模型是否有任何未保存的更改。 -- `Revert()` 会将该对象及其子对象作为一次撤销操作还原。该方法也存在于 `Selected.Measures` 等集合中,也存在于整个模型的 `Model` 上。如果部分还原失败,它会引发一个异常,其中列出无法还原的部分。 -- `Revert("PropertyName")` 会将单个属性恢复为其已保存的值,例如 `Revert("Expression")` 或 `Revert("Annotations[MyAnnotation]")`。如果该属性未更改,它不会执行任何操作。 +- 当对象或其下任何内容与上次保存的状态不同时,`HasUnsavedChanges` 返回 `true`。在`Model`对象上,它返回模型是否有任何未保存的更改。 +- `Revert()` 将对象及其子级作为一个撤消步骤进行还原。该方法也存在于 `Selected.Measures` 等集合中,以及整个模型的 `Model` 中。如果部分还原操作失败,它将抛出一个异常,列出无法还原的部分。 +- `Revert("PropertyName")` 将一个属性还原为其保存的值,例如 `Revert("Expression")` 或 `Revert("Annotations[MyAnnotation]")`。当属性未变时,它不会执行任何操作。 -表、层次结构和角色等容器会提供一个 `DeletedObjects` 集合,其中列出当前会话中从该容器删除的对象。每个条目都有 `Name`、`ObjectType` 和 `Parent`,以及一个 `Restore()` 方法。在该集合上调用 `Restore()` 会还原其中的所有条目。 +表格、层次结构和角色等容器具有 `DeletedObjects` 集合,其中列出了当前会话中从它们中删除的对象。每个条目都有一个 `Name`、`ObjectType` 和 `Parent`,以及一个 `Restore()` 方法。集合上的 `Restore()` 会还原所有条目。 -`Selected.Deleted` 返回在 TOM Explorer 中选中的已删除对象。已删除的对象不会出现在 `Selected.Measures`、`Selected.Columns` 或其他访问器中。 +`Selected.Deleted` 返回在 TOM Explorer 中选定的已删除对象。已删除的对象不会出现在 `Selected.Measures`、`Selected.Columns` 或其他访问器中。 ```csharp // List the measures with unsaved changes in the selected tables: diff --git a/localizedContent/zh/content/features/views/messages-view.md b/localizedContent/zh/content/features/views/messages-view.md index bdf318ef8..86f21ae76 100644 --- a/localizedContent/zh/content/features/views/messages-view.md +++ b/localizedContent/zh/content/features/views/messages-view.md @@ -1,8 +1,8 @@ ---- +--- uid: messages-view title: 信息视图 author: Daniel Otykier -updated: 2021-09-08 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -16,34 +16,55 @@ applies_to: - edition: Enterprise full: true --- - # 信息视图 -Tabular Editor 3 的信息视图是一个工具窗口,用于显示与当前数据集相关的各类信息。 +Tabular Editor 3 中的“消息”视图是一个工具窗口,用于显示与当前数据集相关的各种类型消息。 > [!TIP] -> 你可以双击一条信息,直接跳转到模型树或脚本编辑器中对应的错误源。 +> 您可以双击一条信息,跳转到模型树或脚本编辑器中的错误源。
    - Message View
    图 1: Tabular Editor 中的信息窗口。提供对您数据集中所有警告和错误的概览
    + 消息视图 +
    图 1: Tabular Editor 中的“信息”窗口。提供数据集中的所有警告和错误的概览
    -信息视图会告诉你消息的来源以及生成该消息的对象。 -显示的信息分为两类:“错误”和“警告” +消息按**来源**分组,例如语义分析器、表达式编辑器或 Analysis Services。每行都包含以下列: -- 错误:这个选项卡会显示任何会导致你的模型无法部署或保存的错误。例如,计算项中存在无效表达式,或关系中存在循环依赖。 -- 警告:此选项卡显示不符合规范、但不会影响模型正常使用的警告。例如使用完全限定的度量值引用。 -- +| 列 | 显示 | +| -- | -- | +| **对象** | 消息所属的对象或文档。| +| **类型** | 信息的严重程度:错误、警告或信息。| +| **消息** | 消息文本。| +| **原因** | 对于级联错误,是导致该错误的对象的错误。对于根错误,其导致的从属错误数。| +| **行**和**列** | 消息在表达式或文档中的位置。| -## 复制信息 +错误是 Analysis Services 拒绝的表达式或结构,例如计算项中的无效表达式或循环依赖关系。警告会标记出能够正常工作但未遵循推荐做法的表达式,例如完全限定的度量值引用。 + +## 级联错误和根本原因 + +当一个表达式存在错误时,每个引用该表达式的表达式也会出现错误,例如,一个度量值仅因其引用的度量值出错而导致自身出错。这些是*级联错误*,它们追溯到的错误是*根错误*。 + +**“原因”**列为每种类型的错误显示不同的值: -在信息视图中,你可以用 Ctrl+C 复制错误信息。 +- 对于级联错误,它会命名具有根错误的对象,当错误追溯到多个根错误时,则在其后加上 **+N** +- 对于根错误,它显示 **+N 个依赖错误**,统计其直接和间接导致的错误 -从 Tabular Editor 3.23.0 起,Ctrl+C 默认复制所选单元格。要按行复制,用 Ctrl+Shift+C(或在右键菜单中选择“复制行”)。 +要处理级联错误,请在“信息”视图中右键单击一行: + +- **转到根本原因**会在表达式编辑器中打开根本错误,并突出显示该错误。该命令仅在级联错误中显示。 +- **显示级联错误**显示或隐藏级联错误。取消选中此项,仅列出您需要修复的根源错误。此设置默认为启用状态,并在会话之间保存。 + +具有自身错误的对象和对损坏对象的引用将显示两行:根错误和级联错误。Analysis Services 错误以及 DAX 查询、DAX 脚本和 Pivot Grid 中的错误绝不会级联。 + +## 复制信息 +信息视图允许使用 Ctrl+C 复制错误信息。 + +从 Tabular Editor 3.23.0 开始,Ctrl+C 默认复制所选单元格。使用 Ctrl+Shift+C(或右键单击菜单中的“复制行”)进行行级复制。 > [!TIP] -> 右键点击单元格以选择“复制单元格”/“复制行”。 +> 右键单击单元格,选择**复制单元格**或**复制行**。同一菜单中还有**转到根本原因**和**显示级联错误**。 + -![信息视图副本](~/content/assets/images/messages-view-copy.png) +![消息视图复制](~/content/assets/images/messages-view-copy.png) diff --git a/localizedContent/zh/content/features/views/user-interface.md b/localizedContent/zh/content/features/views/user-interface.md index 66b07dd43..617eda075 100644 --- a/localizedContent/zh/content/features/views/user-interface.md +++ b/localizedContent/zh/content/features/views/user-interface.md @@ -16,263 +16,256 @@ applies_to: - edition: Enterprise full: true --- - # 了解 Tabular Editor 3 的用户界面 -本文介绍 Tabular Editor 3 的用户界面。 +本文介绍了 Tabular Editor 3 的用户界面。 ## 基本用户界面元素 -加载语义模型后,Tabular Editor 3 会显示如下默认布局。 +加载语义模型后,Tabular Editor 3 显示以下默认布局。 ![基本用户界面](~/content/assets/images/basic-ui.png) -1. **标题栏**:显示当前加载的文件名;如果已连接,还会显示 Analysis Services 数据库或 Power BI 数据集的名称。 -2. **菜单栏**:菜单栏用于访问 Tabular Editor 3 的各项功能。有关所有菜单项的详细说明,请参阅[菜单](#menus)。 -3. **工具栏**:工具栏提供对最常用功能的快速访问。工具栏中可用的所有功能也都可以通过菜单访问。你可以在 **工具 > 自定义...** 中自定义工具栏及其按钮 -4. **TOM Explorer 视图**:以层级结构展示您的数据模型,所有对象均可用 . 来自表示你的 Data model 的 [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 元数据中的元数据。顶部的切换按钮可让你筛选要显示的对象。搜索框可按名称筛选对象。 -5. **表达式编辑器**:表达式编辑器提供一种快捷方式,用于编辑 TOM Explorer 中当前选中对象的任意 DAX、SQL 或 M 表达式。如果你关闭了表达式编辑器,只需在 TOM Explorer 中双击某个对象,即可将其重新打开。顶部的下拉列表可让你在不同的表达式属性之间切换,以防当前选定对象包含多个此类属性(例如,KPI 具有目标表达式、状态表达式和趋势表达式,它们是同一个 KPI 对象下的 3 个不同 DAX 表达式)。 -6. **属性视图**:显示 TOM Explorer 中当前选定对象(一个或多个)的所有可用 TOM 属性的详细信息。大多数属性都可以通过网格进行编辑,即使同时选中了多个对象也一样。某些属性(例如“格式字符串”“连接字符串”“角色成员”)提供弹出对话框或集合编辑器,可通过点击属性值单元格中的省略号按钮打开。 -7. **信息视图**:Tabular Editor 3 会持续分析你模型中的 DAX 表达式,查找语义错误。任何此类错误都会在此处显示。此外,此视图中显示的信息还可能来自 C# 脚本,或来自 Analysis Services 报告的错误消息。 -8. **状态栏**:状态栏会提供与当前选择相关的各种上下文信息、Best Practice Analyzer 的检测结果等。当 [MCP 服务器](xref:mcp-server) 可用时,右侧末端的指示器会显示 **MCP Started** 或 **MCP Stopped**,其工具提示中会显示服务器正在侦听的地址。单击可打开 MCP Server 对话框;右键单击可启动或停止服务器、复制供你的代理使用的注册配置,或跳转到偏好页面。 +1. **标题栏**:已加载文件的名称,或者您所连接的 Analysis Services 数据库或 Power BI 语义模型的名称。 +2. **菜单栏**: Tabular Editor 3 的所有功能。请参阅[菜单](#menus)了解每个菜单。 +3. **工具栏**:最常用的功能。每个工具栏命令也位于菜单中。在**工具 > 自定义……**下自定义工具栏及其按钮。 +4. **TOM 资源管理器视图**:模型对象的树状视图,由 [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 元数据构建而成。顶部的切换按钮用于筛选要显示的对象类型,搜索框用于按名称筛选对象。 +5. **表达式编辑器**:编辑在 TOM Explorer 中选定对象的 DAX、SQL 或 M 表达式。如果您将其关闭,请双击 TOM Explorer 中的对象以再次打开。如果对象有多个表达式属性,则顶部的下拉菜单可在它们之间切换。例如,KPI 有一个目标、一个状态和一个趋势表达式。 +6. **属性视图**:在 TOM Explorer 中选定对象的所有 TOM 属性。您可以在网格中编辑大多数属性,也可以在选择了多个对象的情况下进行编辑。对于某些属性(例如**格式字符串**、**连接字符串**和**角色成员**),可以通过值单元格中的省略号按钮打开对话框或集合编辑器。 +7. **消息视图**:通过对模型的 DAX 表达式进行持续分析发现的语义错误,以及来自 C# 脚本的消息和 Analysis Services 报告的错误。 +8. **状态栏**:有关当前所选内容、最佳实践分析器发现结果等的信息。连接项将您连接的数据库和服务器显示为“`@`”,或对于 Power BI Desktop 显示为“`:`”,对于未连接加载的模型显示为“**(无连接)**”。当 [MCP 服务器](xref:mcp-server)可用时,右端的指示器显示 **MCP 已启动** 或 **MCP 已停止**,其工具提示显示服务器侦听的地址。单击指示器以打开**MCP 服务器**对话框,或右键单击指示器以启动或停止服务器、复制代理的注册配置或打开首选项页面。 -[视图菜单](#view) 可打开其他视图。 +[“视图”菜单](#view)可打开其他视图。 ## 自定义用户界面 -你可以调整并重新排列所有 UI 元素,还可以将视图拖出主窗口,例如拖到另一台显示器上。关闭应用程序时,Tabular Editor 3 会保存布局,并在下次启动时恢复。 +您可以调整所有 UI 元素的大小并重新排列,还可以将视图拖出主窗口,例如拖到另一台显示器上。当你关闭应用程序时,Tabular Editor 3 会保存布局,并在下次启动时恢复该布局。 ### 选择不同的布局 -选择 **窗口 > 默认布局** 可将应用程序重置为默认布局;或者选择 **窗口 > 经典布局**,将 TOM Explorer 放在左侧,并将属性视图放在表达式编辑器下方,就像 Tabular Editor 2.x 一样。 +选择**“窗口”>“默认布局”**,将应用程序重置为默认布局;或选择**“窗口”>“经典布局”**,将 TOM 资源管理器置于左侧,将“属性”视图置于“表达式编辑器”下方,与 Tabular Editor 2.x 一样。 -要在自己保存的布局之间切换,请通过 **窗口 > 捕获布局** 保存当前布局,这样它就会出现在 **窗口** 菜单中供你选择。**窗口 > 布局...** 会列出所有布局,你可以在这里应用、加载、删除和保存布局。保存到磁盘的布局会以 .xml 文件形式存储,你可以与其他 Tabular Editor 3 用户共享。 +要切换您自己的布局,请使用**“窗口”>“捕获布局”**保存当前布局,它将成为**“窗口”**菜单中的一个选项。**“窗口”>“布局...”**列出了所有布局,您可以在其中应用、加载、删除和保存布局。保存到磁盘的布局是一个 .xml 文件,您可以与其他 Tabular Editor 3 用户共享。 ![管理布局](~/content/assets/images/manage-layouts.png) ### 窗口停靠选项 -拖动视图或文档时,停靠指示器会显示可停靠的位置。 +当您拖动视图或文档时,停靠指示器会显示您可以将其停靠的位置。 ![窗口停靠选项](~/content/assets/images/window-docking-options.png) -将窗口放到哪里,决定了它的停靠方式: - -**文档选项卡停靠(中心指示器)**:将窗口拖放到中心指示器上后,它会成为主文档区域中的一个文档选项卡,与 DAX 查询、脚本和关系图等文档并列。文档选项卡: +您将窗口拖放到哪里决定了它的行为方式: -- 使用 **Ctrl+Tab** 循环切换时会包含在内 -- 不支持自动隐藏 +**文档选项卡停靠(中心指示器)**:拖放到中心指示器上的窗口将成为主文档区域中的文档选项卡,位于 DAX 查询、脚本和图表等文档旁边。文档选项卡: +- 在您使用 **Ctrl+Tab** 循环时包含在内 +- 不具备自动隐藏功能 -**工具窗口停靠(边缘指示器)**:将窗口拖放到左侧、右侧、顶部或底部指示器上后,它会作为工具窗口停靠,例如 TOM Explorer 和信息视图。工具窗口: - -- 使用 **Ctrl+Tab** 切换时不会包含在内 -- 带有可启用自动隐藏的图钉图标;窗口未使用时会自动折叠 +**工具窗口停靠(边缘指示器)**:拖放到左侧、右侧、顶部或底部指示器上的窗口将作为工具窗口停靠,例如 TOM Explorer 和“消息”视图。工具窗口: +- 不包含在 **Ctrl+Tab** 中 +- 具有可开启自动隐藏功能的图钉图标,该功能会在窗口不使用时将其折叠 - 可停靠在主文档区域的任意一侧 > [!TIP] -> 停靠窗口的大小取决于停靠位置的可用空间,你可以拖动窗口之间的分隔条来调整其大小。 +> 固定窗口的大小取决于您将其固定的位置的可用空间,您可以通过拖动窗口之间的分隔线来调整其大小。 ### 更改主题和调色板 -在 **窗口 > 主题** 中选择主题: +在**窗口 > 主题**下选择一个主题: -- Basic 和 Bezier 是基于矢量的,可在高 DPI 显示器上缩放。 -- Blue、Dark 和 Light 是基于位图的,在高 DPI 显示器上缩放效果不佳。 +- Basic 和 Bezier 基于矢量,可在高 DPI 显示器上缩放。 +- 蓝色、深色和浅色是基于光栅的,在高 DPI 显示器上缩放效果不佳。 -对于 Basic 和 Bezier,**窗口 > 默认调色板** 可更改主题颜色。 +对于“基本”和“贝塞尔”,**“窗口”>“默认调色板”**可更改主题的颜色。 -![Palettes](~/content/assets/images/palettes.png) +![调色板](~/content/assets/images/palettes.png) ## 菜单 -本节介绍各个菜单。 +本节介绍每个菜单。 -_活动文档_ 是指当前光标所在的文档,比如表达式编辑器或下方截图中的“DAX脚本 1”选项卡。某些快捷键和菜单项取决于当前是否有活动文档,以及该文档的类型。 +*活动文档*是指带有光标的文档,例如表达式编辑器或下图中的“DAX 脚本 1”选项卡。某些快捷键和菜单项取决于文档是否处于活动状态及其类型。 > [!NOTE] -> 默认情况下,菜单和工具栏会锁定在原位。要解锁,请取消选中 **锁定菜单和工具栏**,位于 **工具 > 自定义…… > 选项**。 +> 菜单和工具栏默认锁定在原位。要解锁它们,请在**工具 > 自定义... > 选项**下取消选中**锁定菜单和工具栏**。 -![Active Document](~/content/assets/images/active-document.png) + +![活动文档](~/content/assets/images/active-document.png) ### 文件 -**文件** 菜单用于加载和保存模型元数据、相关支持文件以及文档。 - -![File Menu](~/content/assets/images/file-menu.png) +“**文件**”菜单用于加载和保存模型元数据、支持文件和文档。 -- **新建**:创建新的空白模型(**Ctrl+N**),或创建一个[支持文件](xref:supported-files#supported-file-types),例如 DAX 查询、DAX脚本(文本文件)或关系图(JSON 文件)。除 C# Script 外,其他支持文件在使用前都需要先加载模型。 +![文件菜单](~/content/assets/images/file-menu.png) - ![File Menu New](~/content/assets/images/file-menu-new.png) +- **新建**:创建新的空白模型 (**Ctrl+N**) 或[支持文件](xref:supported-files#supported-file-types),例如 DAX 查询、DAX 脚本(文本文件)或图表(JSON 文件)。C# 脚本以外的支持文件需要已加载的模型。 + + ![“文件”菜单“新建”](~/content/assets/images/file-menu-new.png) > [!IMPORTANT] -> **新建 > 模型...** 选项在 Tabular Editor 3 桌面版中不可用;该版本只能作为 Power BI Desktop 的外部工具使用。参见 @editions。 +> **新建 > 模型…** 在 Tabular Editor 3 Desktop 版本中不可用,该版本仅作为 Power BI Desktop 的外部工具使用。请参阅@editions。 -- **打开**:从以下来源之一加载模型,或打开任何其他支持的文件: +- **打开**:从以下来源之一加载模型,或打开任何其他受支持的文件: - ![File Menu Open](~/content/assets/images/file-menu-open.png) + ![“文件”菜单“打开”](~/content/assets/images/file-menu-open.png) - - **从文件加载模型...**:从 .bim 或 .pbit 等文件打开模型元数据。 - - **从数据库加载模型...**:加载已部署模型的元数据。输入 Analysis Services 或 Power BI 的 XMLA 连接信息,或连接到本地实例,例如 Visual Studio 的集成 Workspace 服务器或 Power BI Desktop。 - - **从文件夹加载模型...**:从由任意版本的 Tabular Editor 保存的文件夹结构中打开模型元数据。 - - **文件...**:根据文件扩展名打开 Tabular Editor 3 支持的任意文件类型。参见[支持的文件类型](xref:supported-files)。 - - **从 Metric View YAML 导入...**:从 Databricks Metric View YAML 文件导入模型元数据。 + - **从文件打开模型…** 从 .bim 或 .pbit 文件等文件中打开模型元数据。 + - **从数据库打开模型...**加载已部署模型的元数据。输入 Analysis Services 或 Power BI XMLA 连接详细信息,或连接到本地实例,例如 Visual Studio 的集成工作区服务器或 Power BI Desktop。右键单击**服务器**列表中的服务器,将其固定到列表顶部或将其删除。请参阅 @xmla-as-connectivity。 + - **从文件夹打开模型…** 从由任何版本的 Tabular Editor 保存的文件夹结构打开模型元数据。 + - **文件…** 按文件扩展名打开 Tabular Editor 3 支持的任何文件类型。请参阅[支持的文件类型](xref:supported-files)。 + - **从指标视图 YAML 导入...** 从 Databricks 指标视图 YAML 文件导入模型元数据。 ![支持的文件类型](~/content/assets/images/supported-file-types.png) > [!IMPORTANT] -> 在 Tabular Editor 3 桌面版中,**打开 > 从文件加载模型...** 和 **打开 > 从文件夹加载模型...** 不可用,且 **打开 > 文件...** 只能打开[支持文件](xref:supported-files#supported-file-types)。 - -- **从磁盘重新加载** / **从服务器重新加载**:从源重新加载模型元数据,并丢弃所有未保存的更改。对于从文件或文件夹加载的模型,此命令显示为 **从磁盘重新加载**;对于从 Analysis Services 或 Power BI 打开的模型,则显示为 **从服务器重新加载**。如果 Tabular Editor 3 作为 Power BI Desktop 的外部工具运行,并且模型在 Power BI Desktop 中发生更改,可使用此命令重新加载模型元数据,而无需重新连接。从文件或文件夹加载的模型会在文件发生更改时自动重新加载。参见 [从磁盘自动重新加载](xref:auto-reload)。 -- **关闭文档**(**Ctrl+W**):关闭主区域中当前活动的文档或面板,例如 DAX 查询、C# Script 或关系图。如果文档有未保存的更改,系统会提示你保存这些更改。 -- **关闭模型**:卸载模型元数据。如果你修改了元数据,系统会提示你保存这些更改。 -- **保存**:将活动文档保存到其源文件。如果当前没有活动文档,则会将模型元数据保存回其源:Model.bim 文件、Database.json 文件夹结构、Analysis Services 实例(包括 Power BI Desktop)或 Power BI XMLA endpoint。 -- **另存为...**:将活动文档另存为新文件。如果当前没有活动文档,则将模型元数据另存为新的 .bim(JSON)文件。 -- **保存到文件夹...**:将模型元数据以[文件夹结构](xref:save-to-folder)的形式保存。 -- **全部保存**:一次性保存所有未保存的文档和模型元数据。 -- **最近文件**:列出最近使用的支持文件。 +> 在 Tabular Editor 3 Desktop 版本中,**打开 > 从文件打开模型…** 和 **打开 > 从文件夹打开模型…** 不可用,而 **打开 > 文件…** 仅打开[支持的文件](xref:supported-files#supported-file-types)。 + +- **从磁盘重新加载**/**从服务器重新加载**:从源重新加载模型元数据并放弃所有未保存的更改。对于从文件或文件夹加载的模型,该命令显示为**从磁盘重新加载**;对于从 Analysis Services 或 Power BI 打开的模型,该命令显示为**从服务器重新加载**。如果 Tabular Editor 3 作为 Power BI Desktop 的外部工具运行,并且模型在 Power BI Desktop 中发生变化,请使用此命令在不重新连接的情况下重新加载模型元数据。从文件或文件夹加载的模型会在文件发生变化时自动重新加载。请参阅[从磁盘自动重新加载](xref:auto-reload)。在重新加载过程中,打开的 DAX 查询和 Pivot Grid 文档将保持打开状态,并连接到重新加载的模型。 +- **关闭文档** (**Ctrl+W**):关闭主区域中的活动文档或面板,例如 DAX 查询、C# 脚本或图表。如果文档有未保存的更改,则会显示保存更改的提示。 +- **关闭模型**:卸载模型元数据。如果您更改了元数据,则会显示保存更改的提示。打开的 DAX 查询和 Pivot Grid 文档将随模型一起关闭,对于每个有未保存更改的文档,都会显示保存提示。 +- **保存**:将活动文档保存到其源文件。如果没有处于活动状态的文档,则将模型元数据保存到其源:Model.bim 文件、Database.json 文件夹结构、Analysis Services 实例(包括 Power BI Desktop)或 Power BI XMLA endpoint。 +- **另存为…**将活动文档另存为新文件。如果没有处于活动状态的文档,则将模型元数据另存为新的 .bim (JSON) 文件。 +- **保存到文件夹…**将模型元数据保存为[文件夹结构](xref:save-to-folder)。 +- **全部保存**:保存所有未保存的文档和模型元数据。 +- **最近使用的文件**:列出最近使用的支持文件。 - **最近的表格模型**:列出最近使用的模型元数据文件和文件夹。 +如果将**模型源详细信息**设置为**仅名称**或**隐藏**,则最近文件和模型菜单的悬停文本将显示不带目录的文件名。 + > [!IMPORTANT] -> 在 Tabular Editor 3 桌面版中,**保存到文件夹**和**最近的表格模型**已禁用,而**另存为**仅可用于[支持文件](xref:supported-files#supported-file-types)。 +> 在 Tabular Editor 3 Desktop 版本中,**保存到文件夹**和**最近使用的tabular模型**被禁用,而**另存为**仅对[支持文件](xref:supported-files#supported-file-types)启用。 -- **退出**:关闭 Tabular Editor 3。此时会先提示你保存未保存的文件或模型元数据。 +- **退出**:关闭 Tabular Editor 3。首先会显示保存未保存文件或模型元数据的提示。 ### 编辑 -**编辑**菜单用于编辑活动文档或已加载的模型元数据。 +**“编辑”**菜单用于编辑活动文档或已加载的模型元数据。 -![编辑菜单](~/content/assets/images/edit-menu.png) +![“编辑”菜单](~/content/assets/images/edit-menu.png) -- **撤销**:撤销当前获得焦点的窗口区域中的上一项更改。在文本控件中(如文档或 **表达式编辑器**),它会撤销输入,命令名称显示为 **撤销输入**。在其他位置,它会撤销对模型元数据所做的最后一次更改。 **Ctrl+Z** 执行此命令。 -- **重做**:重做上一次已撤销的更改,规则与 **撤销** 相同。 **Ctrl+Y** 执行此命令。 -- **撤销** / **重做** 后跟模型更改名称,例如 **撤销 C# script (MCP)**:仅当文本控件获得焦点时才会出现,用于撤销或重做对模型元数据所做的最后一次更改。参见 [文本编辑器中的撤销](xref:undo-redo#undo-in-text-editors)。 -- **查找**:打开“查找和替换”对话框,并切换到“查找”选项卡。参见[查找](xref:find-replace#find)。 -- **替换**:打开“查找和替换”对话框,并切换到“替换”选项卡。参见[替换](xref:find-replace#replace)。 -- **剪切 / 复制 / 粘贴**:当文本控件具有焦点时,这些命令作用于所选文本。当 TOM Explorer 获得焦点时,这些命令作用于所选对象。例如,要复制多个度量值,请在 TOM Explorer 中按住 **Shift** 或 **Ctrl** 选择它们,然后按 **Ctrl+C**,再按 **Ctrl+V**。 +- **撤消**:撤消窗口中具有焦点的部分中的上一次更改。在文本控件(例如文档或**表达式编辑器**)中,它会撤消键入操作,并显示为**撤消键入**。在其他地方,它会撤消对模型元数据的最后一次更改。**Ctrl+Z** 运行此命令。 +- **重做**:重做上一次撤销的更改,遵循与**撤销**相同的规则。**Ctrl+Y** 运行此命令。 +- **撤消**/**重做**后跟模型更改的名称,例如**撤消 C# 脚本 (MCP)**:仅在文本控件获得焦点时显示,并撤消或重做对模型元数据的最后一次更改。请参阅[在文本编辑器中撤消](xref:undo-redo#undo-in-text-editors)。 +- **查找**:在“查找”选项卡上打开“查找和替换”对话框。请参阅[查找](xref:find-replace#find)。 +- **替换**:在“替换”选项卡上打开“查找和替换”对话框。请参阅[替换](xref:find-replace#replace)。 +- **剪切/复制/粘贴**:当文本控件获得焦点时,这些操作将应用于选定的文本。当 TOM Explorer 获得焦点时,它们将应用于所选对象。例如,要复制多个度量值,请在 TOM Explorer 中使用 **Shift** 或 **Ctrl** 选择它们,然后按 **Ctrl+C**,再按 **Ctrl+V**。 - **删除**:当文本控件获得焦点时,删除所选文本;当 TOM Explorer 获得焦点时,删除所选对象。 > [!NOTE] -> 只有在选中了多个对象,或其他对象依赖于你要删除的对象时,才会出现删除提示。**撤销**(**Ctrl+Z**)可还原已删除的对象。 +> 只有在选择了多个对象,或者其他对象依赖于您要删除的对象时,才会显示删除提示。**撤消** (**Ctrl+Z**) 可恢复已删除的对象。 -- **全选**:选中活动文档中的所有文本,或选中 TOM Explorer 中具有相同父级的所有对象。 -- **Code Assist**:用于 DAX 的 Code Assist 功能的快捷方式。在编辑 DAX 时可用。请参阅 [DAX 编辑器](xref:dax-editor#code-assist-features)。 -- **自动换行**:在当前活动的文本文档中切换是否启用自动换行。 +- **全选**:选择活动文档中的所有文本,或 TOM Explorer 中具有相同父级的所有对象。 +- **代码助手**:DAX 代码助手功能的快捷方式。在您编辑 DAX 时可用。请参阅[DAX 编辑器](xref:dax-editor#code-assist-features)。 +- **自动换行**:切换活动文本文档中的自动换行。 -### 视图 +### 查看 -**视图**菜单用于打开并聚焦 Tabular Editor 3 的各个视图,包括隐藏的视图。这里不会列出文档;可通过 [窗口菜单](#window) 在它们之间切换。 +“**视图**”菜单打开并聚焦 Tabular Editor 3 的视图,包括隐藏的视图。未列出文档;使用[“窗口”菜单](#window)在文档之间切换。 -![视图菜单](~/content/assets/images/view-menu.png) +![“视图”菜单](~/content/assets/images/view-menu.png) -- **TOM Explorer**:TOM Explorer 以分层视图显示当前已加载模型元数据的整个 [Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions)。更多信息见 @tom-explorer-view。 -- **AI 助手**:AI 助手视图可让你与 AI 助手交互,协助完成建模任务。 -- **DAX 组件管理器**:DAX 组件管理器视图可让你浏览 DAX 用户定义函数组件,并将其安装到模型中。 -- **Best Practice Analyzer**: 通过让你指定用于最佳实践验证的规则,帮助提升模型质量。更多信息见 @bpa-view。 -- **信息**: 信息视图显示来自各种来源的错误、警告和信息性消息,例如 Tabular Editor 3 语义分析器。更多信息见 @messages-view。 -- **数据刷新**:数据刷新视图用于跟踪后台运行的数据刷新操作。更多信息见 @data-refresh-view。 -- **表达式编辑器**:这是一个“快速编辑器”,可让你编辑 TOM Explorer 中当前选定对象的 DAX、M 或 SQL 表达式。更多信息请参见 @dax-editor。 -- **宏**: 宏视图允许你管理你创建的任何宏。可通过 @csharp-scripts 创建宏。更多信息请参见 @creating-macros。 -- **VertiPaq分析器**:VertiPaq分析器视图允许你收集、导入和导出有关模型数据的详细统计信息,用于优化和调试 DAX 性能。 VertiPaq分析器由 [SQLBI](https://sqlbi.com) 的 [Marco Russo](https://twitter.com/marcorus) 在 MIT 许可下创建并维护。更多信息请参阅 [GitHub 项目页面](https://github.com/sql-bi/VertiPaq-Analyzer)。 -- **依赖关系**:[**DAX 依赖关系**](xref:creating-and-testing-dax#dax-dependencies) 视图会以可视化方式显示当前选中对象与模型中其他对象之间的依赖关系。勾选 **Track TOM Explorer**,即可让其跟随树形结构中的选中项。 -- **DAX优化器**:DAX优化器视图与 [DAX优化器](https://www.daxoptimizer.com) 集成,用于分析模型中的 DAX 性能问题。 -- **日历编辑器**:日历编辑器视图允许你使用现代时间智能功能在模型中定义和管理日历。 -- **透视编辑器**:透视编辑器视图提供一个矩阵概览,显示模型的每个透视中包含了哪些对象。 -- **元数据翻译编辑器**: 元数据翻译编辑器视图提供一个网格,用于编辑模型对象的元数据翻译(区域设置)。 -- **工具栏 / 属性**:其余项可让你切换工具栏的可见性,并打开属性视图(F4)。 +- **TOM 资源管理器**:加载模型的[Tabular Object Model (TOM)](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions)的树。请参阅 @tom-explorer-view。 +- **AI 助手**:与 AI 助手进行聊天,以完成建模任务。 +- **DAX 组件管理器**:浏览 DAX 用户定义函数组件并将其安装到模型中。 +- **Best Practice Analyzer**:根据您定义的最佳实践规则验证模型。请参阅 @bpa-view。 +- **消息**:来自 Tabular Editor 3 语义分析器等来源的错误、警告和信息性消息。请参阅 @messages-view。 +- **数据刷新**:跟踪在后台运行的刷新操作。请参阅@data-refresh-view。 +- **表达式编辑器**:编辑在 TOM Explorer 中选定对象的 DAX、M 或 SQL 表达式。请参阅 @dax-editor。 +- **宏**:管理您从 @csharp-scripts 创建的宏。请参阅 @creating-macros。 +- **VertiPaq 分析器**:收集、导入和导出有关模型中数据的统计信息,用于 DAX 性能优化。VertiPaq Analyzer 由 [SQLBI](https://twitter.com/marcorus) 的 [Marco Russo](https://sqlbi.com) 根据 MIT 许可证创建和维护。请参阅[GitHub 项目页面](https://github.com/sql-bi/VertiPaq-Analyzer)。 +- **依赖关系**:[**DAX依赖关系**视图](xref:creating-and-testing-dax#dax-dependencies)显示选定对象与模型中其他对象之间的依赖关系。选择**跟踪 TOM Explorer**,使其跟随 TOM Explorer 的选择。 +- **DAX 优化器**:使用 [DAX 优化器](https://www.daxoptimizer.com)分析模型的 DAX 性能问题。 +- **日历编辑器**:为现代时间智能功能定义和管理日历。 +- **透视编辑器**:一个矩阵,显示模型每个透视包含的对象。 +- **元数据翻译编辑器**:用于编辑模型对象的元数据翻译(文化)的网格。 +- **工具栏/属性**:切换工具栏的可见性并打开“属性”视图(**F4**)。 -## 模型 +### 模型 -**模型**菜单显示可在“模型”对象级别执行的操作(即 TOM Explorer 的根对象)。 +**“模型”**菜单包含对模型对象(TOM Explorer 的根)的操作。 -![模型菜单](~/content/assets/images/model-menu.png) +![视图菜单](~/content/assets/images/model-menu.png) -- **Deploy...**:打开 Tabular Editor Deployment Wizard。参见 [模型部署](xref:deployment)。 +- **部署…**:打开 Tabular Editor 部署向导。请参阅[模型部署](xref:deployment)。 > [!IMPORTANT] -> **Deploy** 选项在 Tabular Editor 3 桌面版中不可用。有关详细信息,请参阅 @editions。 - -- **序列化选项...**:可配置将模型元数据保存到磁盘时(文件或文件夹结构)的序列化方式。 -- **导入表...** 启动 Tabular Editor 3 导入表向导。有关详细信息,请参阅 @importing-tables。 -- **更新架构 (所有表)...** 检测模型中所有表的数据源中的架构更改,并与当前已导入的列进行比较。有关更多信息,请参阅[更新表架构](xref:importing-tables#updating-table-schema)。 -- **Script DAX**: 为当前选定的对象生成 DAX 脚本(如果未选择任何对象,则为模型中的所有 DAX 对象生成 DAX 脚本)。有关详细信息,请参阅 @dax-scripts。 -- **刷新模型**: 当 Tabular Editor 连接到 Analysis Services 实例时,此子菜单包含用于在模型级别启动后台刷新操作的选项。此子菜单包含以下选项。有关详细信息,请参阅 [刷新命令 (TMSL)](https://docs.microsoft.com/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request)。 - - **自动(模型)**:Analysis Services 将决定要刷新的对象(仅刷新不处于“Ready”状态的对象)。 - - **完全刷新(模型)**:Analysis Services 对模型执行完全刷新。 - - **计算(模型)**:Analysis Services 将重新计算所有计算表格、计算列、计算组和关系。不会从数据源读取任何数据。 -- **添加 [对象类型]**:其余项用于创建模型的子对象,例如表、数据源和透视。 +> **部署**在 Tabular Editor 3 Desktop 版本中不可用。请参阅@editions。 + +- **序列化选项...** 设置模型元数据在保存到文件或文件夹结构时如何进行序列化。 +- **导入表格…** 打开 Tabular Editor 3 导入表格向导。请参阅@importing-tables。 +- **更新架构(所有表格)...** 将所有表格的列与其数据源进行比较,并检测架构更改。请参阅[更新表格架构](xref:importing-tables#updating-table-schema)。 +- **脚本 DAX**:为选定对象生成 DAX 脚本,如果未选择任何内容,则为模型中的所有 DAX 对象生成 DAX 脚本。请参阅@dax-scripts。 +- **刷新模型**:当 Tabular Editor 连接到 Analysis Services 时,启动模型的后台刷新。请参阅[刷新命令 (TMSL)](https://docs.microsoft.com/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions#request)。子菜单包含以下选项: + - **自动(模型)**:Analysis Services 仅刷新不处于“就绪”状态的对象。 + - **完全刷新(模型)**:Analysis Services 对模型执行完全刷新。 + - **计算(模型)**:Analysis Services 重新计算所有计算表、计算列、计算组和关系。不会从数据源读取任何数据。 +- **添加 [对象类型]**:其余项目创建模型子对象,例如表、数据源和透视。 ### 工具 -**工具**菜单包含用于设置 Tabular Editor 3 偏好设置和自定义项的选项。 +“**工具**”菜单包含 Tabular Editor 3 的首选项和自定义项。 -![视图菜单](~/content/assets/images/tools-menu.png) +![“视图”菜单](~/content/assets/images/tools-menu.png) -- **自定义...**:打开“用户界面布局”自定义对话框,可在其中创建工具栏、重新排列并编辑菜单和工具栏按钮。 -- **偏好...**:打开“偏好”对话框,其中包含更新检查、代理设置、查询行数限制和请求超时等设置。见 @preferences。 -- **管理 BPA 规则...**:打开 Best Practice Analyzer 规则管理器,可在其中查看和编辑规则及规则集。请参阅 @bpa-view。 -- **MCP Server...**:打开 **MCP Server** 对话框,可在其中启动或停止服务器,使外部 AI 代理能够处理当前打开的模型,查看该代理获得的权限,并复制用于代理的注册配置。请参阅 @mcp-server。如果未安装 AI 功能组件、未勾选 **启用 MCP 服务器**,或者管理员已通过策略将其禁用,则该项会被隐藏。 +- **自定义……**将打开“用户界面布局”自定义对话框,您可以在其中创建工具栏,并重新排列和编辑菜单及工具栏按钮。 +- **偏好设置…** 打开“偏好设置”对话框,其中包含更新检查、代理设置、查询行数限制和请求超时等设置。请参阅 @preferences。 +- **管理 BPA 规则...** 打开 Best Practice Analyzer 规则管理器,您可以在其中查看和编辑规则及规则集合。请参阅 @bpa-view。 +- **MCP 服务器…**将打开“**MCP 服务器**”对话框,您可以在其中启动和停止允许外部 AI 代理在打开的模型上工作的服务器,查看代理获得的权限,并复制代理的注册配置。请参阅@mcp-server。当未安装 AI 功能组件、取消选中**启用 MCP 服务器**或管理员通过策略禁用该项时,该项将被隐藏。 ### 窗口 -**窗口**菜单用于管理和切换应用中的视图和文档,这些统称为_窗口_;此外,该菜单还包含[主题和调色板](#changing-themes-and-palettes)设置。 - -![查看菜单](~/content/assets/images/window-menu.png) - -- **新建...**:用于创建[支持文件](xref:supported-files#supported-file-types)。这些选项与 **文件 > 新建** 中的选项相同。 +**“窗口”**菜单用于管理和切换应用程序的视图和文档(统称为*窗口*),还包含[主题和调色板](#changing-themes-and-palettes)设置。 -- **浮动**:将当前视图或文档从停靠状态解除,并在浮动窗口中显示。 +![窗口菜单](~/content/assets/images/window-menu.png) -- **固定选项卡**:将选项卡固定在文档选项卡区域的最左侧。选项卡的右键菜单中包含仅关闭未固定选项卡的命令。 +- **新建...** 创建[支持文件](xref:supported-files#supported-file-types)。选项与**文件 > 新建**下的选项相同。 +- **浮动**将当前视图或文档脱离停靠,变为浮动窗口。 +- **固定选项卡**将选项卡固定到文档选项卡的左端。选项卡右键菜单包含仅关闭未固定的选项卡的命令。 + + ![视图菜单](~/content/assets/images/tab-context-menu.png) - ![标签页上下文菜单](~/content/assets/images/tab-context-menu.png) +- **新建水平/垂直选项卡组**:将主文档区域划分为选项卡组,以便并排或上下显示多个文档。 +- **全部关闭**:关闭所有文档选项卡。首先会显示保存未保存更改的提示。 +- **重置窗口布局**:重置主文档区域的所有自定义设置。 +- **1..N [document]**:前 10 个打开的文档。**Ctrl+Tab** 还可以切换已打开的文档和视图: -- **新建水平/垂直选项卡组**:将主文档区域拆分为多个选项卡组,以并排或上下显示多个文档。 + ![视图菜单](~/content/assets/images/ctrl-tab.png) -- **全部关闭**:关闭所有文档选项卡。如果存在未保存的更改,会先提示你保存。 +- **窗口...**:打开一个对话框,其中列出所有已打开的文档,您可以在其中切换到或关闭每个文档。 -- **重置窗口布局**:重置对主文档区域应用的所有自定义设置。 + ![视图菜单](~/content/assets/images/windows-manager.png) -- **1..N [document]**:前 10 个已打开的文档。 **Ctrl+Tab** 也可在打开的文档和视图之间切换: - - ![Ctrl+Tab 快捷键](~/content/assets/images/ctrl-tab.png) - -- **窗口...**:打开一个列出所有打开文档的对话框,你可以在其中切换到某个文档或将其关闭。 - - ![窗口管理器](~/content/assets/images/windows-manager.png) - -- **捕获布局** / **布局...** / **默认布局** / **经典布局**:参见[选择其他布局](#choosing-a-different-layout)。 - -- **主题** / **默认调色板**:参见[更改主题和调色板](#changing-themes-and-palettes)。 - -- **语言**:可以更改 Tabular Editor 3 用户界面的显示语言。 +- **捕获布局**/**布局…**/**默认布局**/**经典布局**:请参阅[选择不同的布局](#choosing-a-different-layout)。 +- **主题**/**默认调色板**:请参阅[更改主题和调色板](#changing-themes-and-palettes)。 +- **语言**:更改 Tabular Editor 3 用户界面的显示语言。 ### 帮助 -**帮助**菜单提供联机资源的入口。 +“**帮助**”菜单链接到在线资源。 -![帮助菜单](~/content/assets/images/help-menu.png) +![“帮助”菜单](~/content/assets/images/help-menu.png) -- **联机文档**:在默认 Web 浏览器中打开文档站点 [docs.tabulareditor.com](https://docs.tabulareditor.com)。 +- **在线文档**:在默认Web浏览器中打开 [docs.tabulareditor.com](https://docs.tabulareditor.com)。 - **入门指南**:打开面向新用户的 Tabular Editor 3 入门指南。 -- **社区支持**:打开我们的[公开社区支持站点](https://github.com/TabularEditor/TabularEditor3)。 -- **专属支持**:发送电子邮件至专属支持热线。 -- **开始使用**:这个菜单项会打开 **开始使用** 页面,其中汇集了 Tabular Editor 的课程、演示和文档。在 Tabular Editor 3.27.0 之前,此项名为 **What's New**。有关发布说明,请参阅 @release-history。 +- **社区支持**:打开[公共社区支持网站](https://github.com/TabularEditor/TabularEditor3 )。 +- **专门支持**:向专门支持热线发送电子邮件。 +- **入门**:打开**入门**页面,该页面收集了 Tabular Editor 的课程、演示和文档。在 Tabular Editor 3.27.0 之前,此项称为**新增功能**。有关发布说明,请参阅@release-history。 > [!NOTE] -> 专属支持仅面向 Tabular Editor 3 企业版客户。其他客户如果有技术或产品相关问题,可以前往[公开社区支持站点](https://github.com/TabularEditor/TabularEditor3)寻求帮助。 - -- **关于 Tabular Editor**:显示版本、安装和许可详细信息,并可更改许可证密钥。 +> 专用支持面向 Tabular Editor 3 企业版客户。其他客户使用[公共社区支持网站](https://github.com/TabularEditor/TabularEditor3)来咨询技术和产品问题。 +- **关于Tabular Editor**:显示版本、安装和许可证详细信息,并允许您更改许可证密钥。 + ### 动态菜单(取决于上下文) -额外的菜单会根据当前获得焦点的 UI 元素以及在 TOM Explorer 中选中的对象而显示。例如,如果你选择一个表,就会出现一个 **表** 菜单,其中的菜单项与在 TOM Explorer 中右键单击该表时显示的菜单相同。 +根据哪个 UI 元素具有焦点以及在 TOM Explorer 中选定了哪个对象,将显示额外的菜单。例如,如果您选择一个表格,则会显示一个**表格**菜单,其项目与 TOM Explorer 中表格的右键单击菜单相同。 -每种文档类型(如 DAX 查询、Pivot Grid 和图表)在该类型文档获得焦点时,也会添加一个菜单。例如,当关系图获得焦点时,会添加一个 **关系图** 菜单,其中包含“向关系图添加表”的命令。 +每种文档类型(例如 DAX 查询、Pivot Grid 和图表)也会在相应类型的文档获得焦点时添加一个菜单。例如,处于焦点的图表会添加一个**图表**菜单,其中包含一个用于将表格添加到图表的项。 -你可以在 **工具 > 偏好 > Tabular Editor > 用户界面** 中设置这些动态菜单的行为。 +在**工具 > 偏好 > Tabular Editor > 用户界面**下设置这些动态菜单的行为。 ## 后续步骤 - @tom-explorer-view - @supported-files -- @偏好 +- @preferences diff --git a/localizedContent/zh/content/getting-started/creating-and-testing-dax.md b/localizedContent/zh/content/getting-started/creating-and-testing-dax.md index 2dcd55fd7..638030e65 100644 --- a/localizedContent/zh/content/getting-started/creating-and-testing-dax.md +++ b/localizedContent/zh/content/getting-started/creating-and-testing-dax.md @@ -19,136 +19,136 @@ applies_to: # 添加度量值和其他计算对象 -自 2017 年初发布 Tabular Editor 2.x 以来,能够在多个度量值上快速修改 DAX 表达式一直是该工具最受欢迎的功能。结合后退/前进导航、复制/粘贴操作、DAX 依赖关系可视化以及撤销/重做支持,这款工具一直是处理大型且复杂 Data model 的用户的首选,因为能够快速完成多处小幅修改往往至关重要。 +自 2017 年初 Tabular Editor 2.x 发布以来,跨度量快速修改 DAX 表达式的功能一直是该工具最受欢迎的功能。该工具结合了后退和前进导航、复制/粘贴操作、DAX 依赖关系可视化以及撤销/重做支持,始终是处理大型复杂数据模型的首选工具,因为在这些模型中,能够快速进行多项小规模更改至关重要。 -Tabular Editor 2.x 用户在这方面唯一的抱怨,是缺少 DAX Code Assist 功能(有时也称为“IntelliSense”)。尤其是当你对 DAX 还没做到 100% 熟练(说实话,几乎没人能做到!)时,让 DAX 代码编辑器帮你记住语法、函数参数等,会非常有用。 +在这方面,Tabular Editor 2.x 用户唯一的抱怨是缺乏 DAX 代码辅助功能(有时称为“IntelliSense”)。尤其是在您对 DAX 的掌握并不完全精通(很少有人能完全精通!)的情况下,让 DAX 代码编辑器帮助您记忆语法、函数参数等,将大有裨益。 -Tabular Editor 3 使用的新 DAX 代码编辑器已将这些问题全部解决。 +Tabular Editor 3 使用的新 DAX 代码编辑器解决了所有这些问题。 ![编辑复杂的 DAX 表达式](~/content/assets/images/dax-editor-screenshot.png) -本文其余部分将介绍如何创建度量值和其他计算对象,以及如何修改这些对象上的 DAX 表达式。想详细了解 DAX 代码编辑器的众多功能,可以查看 。 +本文的其余部分将介绍如何创建度量值和其他计算对象,以及如何修改这些对象上的 DAX 表达式。要了解有关 DAX 代码编辑器众多功能的更多信息,请参阅。 # 添加度量值 -当你已将[一些表导入](xref:importing-tables-data-modeling#importing-new-tables)模型,并[在它们之间创建了关系](xref:importing-tables-data-modeling#modifying-relationships-using-the-diagram)之后,就该添加一些包含业务逻辑的显式度量值了。 +在将[一些表导入](xref:importing-tables-data-modeling#importing-new-tables)到你的模型并[在它们之间创建关系](xref:importing-tables-data-modeling#modifying-relationships-using-the-diagram)后,是时候添加一些包含你的业务逻辑的显式度量值了。 > [!TIP] -> 从技术角度来说,在 Power BI Report 里可视化数据之前,你不必先在模型里添加显式度量值。不过,最佳实践是始终这样做,因为基于 MDX 的客户端工具(例如 Excel 和 Tabular Editor 3 的 Pivot Grid)要求显式定义度量值。此外,[计算组](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions) 仅适用于显式度量值。 +> 从技术上讲,在 Power BI 报表中可视化数据之前,您无需向模型添加显式度量值。但是,最佳做法是始终这样做,因为基于 MDX 的客户端工具(例如 Excel 和 Tabular Editor 3 的 Pivot Grid)需要显式度量值。此外,[计算组](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions)仅适用于显式度量值。 -要使用 Tabular Editor 添加新的度量值,请在要添加度量值的表上单击右键,然后选择 **创建 > 度量值**(ALT+1)。 +要使用 Tabular Editor 添加新度量值,请右键单击要添加度量值的表,然后选择**创建 > 度量值** (ALT+1)。 ![添加新度量值](~/content/assets/images/adding-new-measure.png) -添加新的度量值后,该度量值的名称将处于可编辑状态。为度量值输入名称后,按 Enter 键。你随时都可以在 **属性** 视图中编辑名称,也可以在 **TOM Explorer** 中选中该度量值后按 F2 键。 +添加新度量值时,该度量值的名称将可编辑。为该度量值提供名称后,请按 ENTER 键。您始终可以在 **Properties** 视图中或在 **TOM Explorer** 中选中度量值时按 F2 键,稍后编辑名称。 -**表达式编辑器** 视图用于为度量值提供 DAX 表达式。输入代码时,注意 DAX 编辑器会提供代码建议,甚至会为语法或语义错误加下划线提示。 +**表达式编辑器**视图用于提供该度量的 DAX 表达式。在您输入代码时,请注意 DAX 编辑器如何提供代码建议,甚至还会将语法或语义错误加下划线。 -![添加度量值并编辑 Dax](~/content/assets/images/add-measure-edit-dax.png) +![添加度量值 编辑 DAX](~/content/assets/images/add-measure-edit-dax.png) -**表达式编辑器** 左上角的下拉框用于在当前所选对象的不同 DAX 属性之间切换。例如,在较新版本的 Analysis Services 中,度量值既有 `Expression` 属性,也有 [`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/)。其他类型的对象可能有不同的属性用于承载 DAX 代码。例如,[KPI](https://docs.microsoft.com/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions) 有三个不同的 DAX 属性。要在 Tabular Editor 中添加 KPI,右键单击某个度量值,然后选择 **创建 > KPI**。 +**表达式编辑器**左上角的下拉框用于在当前选定对象的不同 DAX 属性之间切换。例如,在较新版本的 Analysis Services 中,度量值具有 `Expression` 属性以及 [`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/)。其他类型的对象可能具有包含 DAX 代码的不同属性。例如,[KPI](https://docs.microsoft.com/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions) 有三种不同的 DAX 属性。要在 Tabular Editor 中添加 KPI,请右键单击度量值,然后选择**创建 > KPI**。 -![编辑 Kpis](~/content/assets/images/editing-kpis.png) +![编辑 KPI](~/content/assets/images/editing-kpis.png) -如果你希望隐藏度量值,只需右键单击并选择 **设为不可见**(CTRL+I)。同样,你也可以通过选择 **设为可见**(CTRL+U)来取消隐藏度量值。 +如果您希望隐藏度量值,只需右键单击并选择**隐藏**(CTRL+I)选项即可。同样,您可以通过选择**显示**(CTRL+U)选项来取消隐藏度量值。 ## 其他度量值属性 -除了 `Name`、`Expression` 和 `Hidden` 属性之外,你还可以使用 **属性** 视图来查看并编辑 **TOM Explorer** 中当前所选对象(一个或多个)的所有属性值。例如,对于度量值,你可以在这里设置 `Format String`。更多信息请参阅 [属性视图](xref:properties-view)。 +除了`Name`、`Expression`和`Hidden`属性外,您还可以使用**Properties**视图查看和编辑**TOM资源管理器**中当前选定对象的所有属性的值。对于度量,您可以在此处设置“格式字符串”等。有关更多信息,请参阅[属性视图](xref:properties-view)。 # 添加计算列 -要添加计算列,请右键单击要添加该列的表,然后选择 **创建 > 计算列**(ALT+2)。为该列命名,并使用 **表达式编辑器** 编辑其 DAX 表达式,方式与上面创建度量值时类似。 +要添加计算列,请右键单击要添加列的表格,然后选择**创建 > 计算列** (ALT+2)。为列命名,并使用**表达式编辑器**编辑其 DAX 表达式,类似于我们上面对度量值所做的操作。 > [!IMPORTANT] -> 连接到 Power BI Desktop 模型时,此选项默认不可用。这是因为 [Power BI Desktop 对外部工具支持的限制](xref:desktop-limitations)。单击链接了解更多信息。 +> 连接到 Power BI Desktop 模型时,此选项默认不可用。这是因为[Power BI Desktop 对外部工具的支持存在局限性](xref:desktop-limitations)。点击链接了解更多。 > [!NOTE] -> 当计算列的 DAX 表达式发生更改后,必须先刷新该列所在的表,才能在 Report 中使用该列。更多信息请参阅。 +> 当计算列的 DAX 表达式发生更改时,必须先刷新该列所在的表,然后才能在报表中使用该列。有关详细信息,请参阅。 # 添加计算表格 -要添加计算表格,请在模型或“Tables”文件夹上右键单击,然后选择 **创建 > 计算表格** (ALT+6)。为表格命名,并使用 **表达式编辑器** 编辑其 DAX 表达式,方式与我们在上面创建度量值时类似。注意,当你修改 DAX 表达式时,表中的列会自动更新。如果其他 DAX 表达式引用了该表格,或某些列被用在层次结构中,这可能会产生连锁影响。 +要添加计算表格,请右键单击模型或“表格”文件夹,然后选择**创建 > 计算表格** (ALT+6)。为表命名,并使用**表达式编辑器**编辑其 DAX 表达式,类似于我们对上述度量值的操作。请注意,当您对 DAX 表达式进行更改时,表上的列会自动发生变化。如果其他 DAX 表达式引用该表,或者如果在层次结构中使用了列,则可能会产生级联效应。 > [!IMPORTANT] -> 连接到 Power BI Desktop 模型时,此选项默认不可用。这是因为 [Power BI Desktop 对外部工具支持的限制](xref:desktop-limitations)。点击链接了解更多。 +> 连接到 Power BI Desktop 模型时,此选项默认不可用。这是因为[Power BI Desktop 对外部工具的支持存在局限性](xref:desktop-limitations)。点击链接了解更多。 > [!NOTE] -> 当计算表格的 DAX 表达式发生更改后,必须先刷新该表格,才能在 Report 中使用。更多信息见 。 +> 当计算表格的 DAX 表达式发生更改时,必须先刷新该表格,然后才能在报表中使用。有关详细信息,请参阅。 # 添加计算组 -要添加[计算组](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions),请在模型或“表”文件夹上单击右键,然后选择 **创建 > 计算组** (ALT+7)。为计算组命名。另外,建议为默认的 **Name** 列另取一个名称。 +要添加[计算组](https://docs.microsoft.com/analysis-services/tabular-models/calculation-groups?view=asallproducts-allversions),请右键单击模型或“表格”文件夹,然后选择**创建 > 计算组** (ALT+7)。为计算组命名。还可以考虑为默认的**名称**列使用其他名称。 > [!IMPORTANT] -> 此选项仅适用于兼容级别为 1470 或更高的模型。 Analysis Services 从兼容级别 1500 起支持计算组。 +> 此选项仅适用于兼容级别为 1470 或更高的模型。Analysis Services 支持兼容级别 1500 或更高的计算组。 -要添加计算项,请在新建的计算组上右键单击,然后选择 **创建 > 计算项**。为计算项命名,并使用 **表达式编辑器** 编辑其 DAX 表达式,方式与我们在上面创建度量值时类似。 +要添加计算项,请右键单击新创建的计算组,然后选择**创建 > 计算项**。为计算项命名,并使用**表达式编辑器**编辑其 DAX 表达式,类似于我们上面对度量值所做的操作。 -你可以在 TOM Explorer 中拖动计算项来调整显示顺序,或在 **属性** 视图中设置 `Ordinal` 属性。 +您可以通过在 TOM Explorer 中拖动计算项来排列其显示顺序,也可以在**属性**视图中设置`Ordinal`属性。设置 `Ordinal` 会将该项移动到该位置,而超出最后一个位置的值会将该项移动到末尾。 > [!NOTE] -> 在计算组中添加、重命名或删除计算项后,必须先刷新计算组,才能在 Report 中使用。更多信息见 。 +> 当计算项被添加到计算组、在计算组中重命名或从计算组中移除时,必须先刷新计算组,然后才能在报表中使用该计算组。有关详细信息,请参阅。 -# 常见建模操作 +# 常用建模操作 ## 复制/粘贴 -TOM Explorer 中的所有对象都可以使用 Tabular Editor 进行复制和粘贴。你甚至可以在不同的 Tabular Editor 实例之间复制和粘贴,也可以在 Tabular Editor 2.x 和 Tabular Editor 3 之间复制和粘贴。你可以使用熟悉的键盘快捷键: +可以使用 Tabular Editor 复制和粘贴 TOM Explorer 中的所有对象。您甚至可以在不同 Tabular Editor 实例之间进行复制和粘贴,甚至在 Tabular Editor 2.x 和 Tabular Editor 3 之间进行复制和粘贴。您可以使用熟悉的键盘快捷键: - **编辑 > 复制** (CTRL+C) - **编辑 > 剪切** (CTRL+X) - **编辑 > 粘贴** (CTRL+V) > [!TIP] -> 如果你想用另一张表替换某张表,同时保留与该表之间现有的所有关系,请先把一张表复制到剪贴板,然后在 TOM Explorer 中选择要替换的表并粘贴。系统会提示你是否要用剪贴板中的表替换所选表。 +> 如果你想用一个表替换另一个表,同时保留该表的所有现有关系,请将一个表复制到剪贴板,然后在 TOM Explorer 中选择要替换的表并粘贴。系统将提示您是否要用剪贴板中的表格替换所选表格。 ## 撤销/重做 -在 Tabular Editor 中,只要对对象或属性进行了更改,就会记录完整的更改历史,让你可以撤销所做的每一次更改。你可以使用熟悉的键盘快捷键: +每当对 Tabular Editor 中的对象或属性进行更改时,系统都会跟踪完整的更改历史记录,使您可以撤消所做的每项更改。您可以使用熟悉的键盘快捷键: -- **编辑 > 撤销** (CTRL+Z) +- **编辑 > 撤消** (CTRL+Z) - **编辑 > 重做** (CTRL+Y) > [!NOTE] -> Tabular Editor 3 中的每个文本编辑器都有各自的撤销历史记录。当光标位于文本编辑器中时,**Ctrl+Z** 和 **Ctrl+Y** 会分别撤销和重做该编辑器中的输入操作。要撤销对模型所做的更改,请先单击 TOM Explorer,或在 **Edit** 菜单中选择模型的撤销条目。另请参阅 [文本编辑器中的撤销](xref:undo-redo#undo-in-text-editors)。 +> Tabular Editor 3 中的文本编辑器有自己的撤销历史记录。当光标位于文本编辑器中时, **Ctrl+Z** 和 **Ctrl+Y** 分别用于撤消和重做该编辑器中的键入操作。要撤消模型更改,请先单击“TOM Explorer”,或在“编辑”菜单中选择“模型撤消”项。请参阅[在文本编辑器中撤消](xref:undo-redo#undo-in-text-editors)。 # 导航 -当光标停留在 DAX 编辑器中的对象引用上时,右键单击并选择 **转到定义** (F12),即可快速跳转到该对象。当然,你也可以使用 TOM Explorer 在对象之间导航。 +当光标位于 DAX 编辑器中的对象引用上时,右键单击并选择**转到定义** (F12),即可快速跳转到该对象。当然,您也可以使用 TOM Explorer 在对象之间导航。 -你可以使用 **表达式编辑器** 右上角的箭头按钮,在已访问的对象之间快速前后跳转。 +您可以使用**表达式编辑器**右上角的箭头按钮,在已访问的对象之间快速来回跳转。 -## DAX 依赖项 +## DAX 依赖关系 -要查看对象之间的 DAX 依赖项,请在 **TOM Explorer** 中选择一个对象,然后右键单击并选择 **显示依赖项**(**Shift+F12**)。这会打开 **DAX 依赖项** 视图,其中显示所选对象的依赖项。在树中双击对象即可跳转到该对象;也可以右键单击,选择 **转到项**、**复制为文本** 或 **复制为 JSON**。 +要查看对象之间的 DAX 依赖项,请在**TOM Explorer**中选择一个对象,然后右键单击并选择**显示依赖项**(**Shift+F12**)。这将打开**DAX 依赖关系**视图,该视图显示所选对象的依赖关系。双击树中的对象以导航至该对象,或右键单击以选择**转到项**、**复制为文本**和**复制为 JSON**。 -![Dax 依赖项与 Tom Explorer](~/content/assets/images/dax-dependencies-and-tom-explorer.png) +![DAX 依赖项和 TOM Explorer](~/content/assets/images/dax-dependencies-and-tom-explorer.png) -该视图一次只显示一个方向。使用单选按钮选择要显示的方向: +该视图一次显示一个方向。使用单选按钮选择方向: -| 选项 | 显示 | -| ------------- | --------------------------------- | -| **依赖于此对象的对象** | 如果更改或删除所选对象,哪些对象会失效 | -| **此对象依赖的对象** | 所选对象会从哪些对象中读取内容 | -| **从此表开始的关系** | 从所选表出发的关系。选择列时,此项显示为 **从此列开始的关系** | +| 选项 | 显示内容 | +|---|---| +| **依赖于此的对象** | 如果您更改或删除了所选对象,哪些内容会出错 | +| **此对象依赖的对象** | 所选对象读取的对象 | +| **从此表格开始的关系** | 从所选表格开始的关系。选择一列后,此项显示为**从此列开始的关系** | -勾选 **显示非活动** 以纳入非活动关系。 +勾选**显示非活跃项**以包含非活跃关系。 -### 跟随 TOM Explorer 选择 +### 跟踪 TOM Explorer -无需依次对每个对象都使用 **显示依赖项**,勾选 **跟踪 TOM Explorer** 后,视图就会跟随树中当前选中的内容。勾选后,会立即显示当前_已_选中的对象的依赖项,而无需等到下一次选择更改后才显示。 +与其逐个为每个对象调用**显示依赖项**,不如勾选**跟踪 TOM Explorer**,视图将跟随树中选定的任何内容。选中此项将立即显示*已*选定对象的依赖项,而不是等待下一次选择更改。 -跟踪仅适用于单个选定对象。如果同时选择多个对象,或未选择任何对象,视图会被清空,而不会显示不完整的结果。 +跟踪适用于单个选定对象。选择多个对象或不选择任何对象将清除视图,而不是显示部分答案。 # 显示文件夹 -当模型里的度量值数量增长到一定规模后,用显示文件夹来组织它们会更方便。在 Tabular Editor 中,要创建显示文件夹,可以在 **属性** 视图中编辑 `Display Folder` 属性;或者右键单击度量值(可多选),然后选择 **创建 > 显示文件夹**。 +当您的模型开始拥有大量度量值时,一个好的做法是使用显示文件夹来组织它们。在 Tabular Editor 中,要创建显示文件夹,可以通过“属性”视图编辑“显示文件夹”属性,或者右键单击度量值,然后选择“创建 > 显示文件夹”选项。 -你还可以在显示文件夹之间剪切/复制/粘贴对象,或通过拖放移动对象。 +您还可以在显示文件夹之间剪切/复制/粘贴或拖放对象。 # 后续步骤 -- @dax-script-introduction +- @dax-脚本-简介 - @bpa -- @C# 脚本和宏 \ No newline at end of file +- @cs-scripts-and-macros \ No newline at end of file diff --git a/localizedContent/zh/content/getting-started/installation.md b/localizedContent/zh/content/getting-started/installation.md index b0a1a82b7..ea0d99c3f 100644 --- a/localizedContent/zh/content/getting-started/installation.md +++ b/localizedContent/zh/content/getting-started/installation.md @@ -1,8 +1,8 @@ --- uid: installation-activation-basic -title: 高级安装与激活 +title: 高级安装和激活 author: Morten Lønskov -updated: 2026-10-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -17,74 +17,74 @@ applies_to: full: true --- -# 高级安装与激活 +# 高级安装和激活 -## 概览 +## 概述 -本页介绍 Tabular Editor 3 的高级安装和激活场景:手动(离线)激活、基于注册表的许可证管理、静默部署,以及企业版席位管理。 +本页介绍了 Tabular Editor 3 的高级安装和激活场景:手动(离线)激活、基于注册表的许可证管理、静默部署和企业席位管理。 -如需了解标准激活流程,请参阅 @getting-started。 +有关标准激活流程,请参阅@getting-started。 -## 手动激活(无网络连接) +## 手动激活(无互联网) -如果您无法访问互联网(例如受代理限制),Tabular Editor 会提示您进行手动激活。 +如果您无法访问互联网(例如由于代理原因),Tabular Editor 会提示您进行手动激活。 ![手动激活提示](~/content/assets/images/getting-started/Activation_manual_firstprompt.png) -输入邮箱后,会弹出一个对话框,其中包含指向激活密钥的链接。复制该 URL,并在可连接到互联网的 Web 浏览器中打开。 +输入您的电子邮件后,将出现一个包含激活密钥链接的对话框。复制该 URL,然后在已连接到互联网的 Web 浏览器中打开。 -该 URL 会返回一个 JSON 对象: +该 URL 返回一个 JSON 对象: ![手动激活 JSON 对象](~/content/assets/images/getting-started/activation_manual_jsonobject.png) -复制完整的 JSON 对象,并将其粘贴到对话框中。完成后,手动激活对话框应如下方截图所示。 +复制完整的 JSON 对象并将其粘贴到对话框中。您的手动激活对话框最终将显示如下面的屏幕截图所示。 ![已填写的手动激活](~/content/assets/images/getting-started/activation_manual_dialogbox_filled.png) -随后将验证您的 Tabular Editor 3 许可证。 +然后,您的 Tabular Editor 3 许可证将得到验证。 -## 更换企业版席位 +## 更改企业版的用户席位 -要更换企业版席位,必须先通过 [Tabular Editor 自助服务门户](https://tabulareditor.com/my-account/) 将现有用户从该席位取消注册。要管理许可证席位,订阅所有者或许可证管理员需要创建一个账户,或使用现有账户登录。 +要更改企业版席位,请通过 [Tabular Editor 自助服务门户](https://tabulareditor.com/my-account/)取消该席位上现有用户的注册。订阅所有者或许可证管理员创建账户或使用现有账户登录,以管理许可证席位。 > [!NOTE] -> 仅企业版支持更换用户。 +> 仅在企业版中可以更改用户。 ## 注册表详细信息 -Tabular Editor 3 会在 `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` 下为每个 Windows 用户保存激活详细信息。 +Tabular Editor 3 将每位 Windows 用户的激活详细信息存储在 `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` 下。 -| 值 | 类型 | 内容 | -| ------------------ | ----------- | -------------------------------------------------------------------- | -| `LicenseKey` | `REG_SZ` | 许可证密钥 | -| `User` | `REG_SZ` | 多用户许可证的授权用户电子邮件地址 | -| `ActivationKey` | `REG_SZ` | 许可服务返回的激活信息 | -| `Activation` | `REG_SZ` | 由旧版 Tabular Editor 3 写入的激活信息。 Tabular Editor 3 会在下次存储激活信息时将其删除 | -| `InstallationDate` | `REG_QWORD` | 此 Windows 用户首次启动 Tabular Editor 3 的时间。如果缺失,Tabular Editor 3 会在启动时创建它 | +| 值 | 类型 | 内容 | +|-------|------|---------| +| `LicenseKey` | `REG_SZ` | 许可证密钥 | +| `User` | `REG_SZ` | 许可证用户的电子邮件地址,适用于多用户许可证 | +| `ActivationKey` | `REG_SZ` | 许可服务返回的激活 | +| `Activation` | `REG_SZ` | 由旧版本 Tabular Editor 3 写入的激活。Tabular Editor 3 在下次存储激活时会将其删除 | +| `InstallationDate` | `REG_QWORD` | 此 Windows 用户首次启动 Tabular Editor 3 的时间。如果该项缺失,Tabular Editor 3 会在启动时创建它 | -若要查看当前 Windows 用户的许可证密钥,请在 Windows 命令提示符(开始 > 运行 > cmd.exe)中运行以下命令: +要查看活动 Windows 用户的当前许可证密钥,请在 Windows 命令提示符(“开始”>“运行”>“cmd.exe”)中运行以下命令: ```cmd REG QUERY "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey ``` -你也可以使用 `regedit.exe`(Windows 注册表编辑器),导航到 `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` 以查看和修改这些值。 +您还可以使用 `regedit.exe`(Windows 注册表编辑器)并导航到 `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3`,以查看和修改值。 ![注册表编辑器](~/content/assets/images/troubleshooting/registry-editor.png) -系统管理员还可以通过在每个用户的 `SOFTWARE\Kapacity\Tabular Editor 3` 注册表项下设置 **LicenseKey** 和 **User** 值,提前为计算机分配 Tabular Editor 3 许可证。完整部署过程见 [静默安装和许可证预配](#silent-installation-and-license-pre-provisioning)。 +系统管理员还可以通过在每位用户的 `SOFTWARE\Kapacity\Tabular Editor 3` 注册表项下指定 **LicenseKey** 和 **User** 值,主动将 Tabular Editor 3 许可证分配给某台计算机。请参阅[静默安装和许可证预配置](#silent-installation-and-license-pre-provisioning),了解完整的部署程序。 -## 在注册表中更改许可证密钥 +## 通过注册表更改许可证密钥 -在 **帮助 > 关于 Tabular Editor** 中,**更改许可证密钥** 选项会删除 `LicenseKey`、`User`、`ActivationKey` 和 `Activation` 值,并在许可服务上停用该安装。仅当未加载任何模型,且许可证已激活或其席位预留已过期时,才会显示该选项。如果未显示该选项 (例如由于激活失败),请通过注册表编辑器重置许可证: +**帮助 > 关于 Tabular Editor** 中的**更改许可证密钥**选项将删除 `LicenseKey`、`User`、`ActivationKey` 和 `Activation` 值,并在许可服务上停用安装。此选项仅在未加载模型且许可证已激活或其席位预留已过期时才会显示。如果未显示(例如,由于激活失败),请通过注册表编辑器重置许可证: 1. 关闭所有 Tabular Editor 3 实例。 -2. 打开 Windows 注册表编辑器(开始 > 运行 > regedit.exe)。 -3. 定位到 `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3`(见上方屏幕截图)。 -4. 删除 `LicenseKey`、`User`、`ActivationKey` 和 `Activation` 值。保留 `InstallationDate` 值。 -5. 关闭注册表编辑器,然后重新启动 Tabular Editor 3。 +2. 在 Windows 中打开注册表编辑器(“开始”>“运行”>“regedit.exe”)。 +3. 找到 `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3`(见上图)。 +4. 删除 `LicenseKey`、`User`、`ActivationKey` 和 `Activation` 值。保留 `InstallationDate`。 +5. 关闭注册表编辑器,然后重启 Tabular Editor 3。 -或者,在 Windows 命令提示符 (开始 > 运行 > cmd.exe) 中运行以下命令。当某个命令的值不存在时,该命令会报告错误,其余命令仍会继续执行: +或者,在 Windows 命令提示符(“开始”>“运行”>“cmd.exe”)中运行以下命令。如果命令的值不存在,则该命令会报告错误,但其余命令仍会运行: ```cmd REG DELETE "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey /f @@ -93,105 +93,110 @@ REG DELETE "HKCU\Software\Kapacity\Tabular Editor 3" /v ActivationKey /f REG DELETE "HKCU\Software\Kapacity\Tabular Editor 3" /v Activation /f ``` -下次启动 Tabular Editor 3 时,系统会提示你输入许可证密钥。 +下次启动 Tabular Editor 3 时,系统会提示您输入许可证密钥。 > [!NOTE] -> 删除这些注册表值并不会停用该安装;要管理已激活的许可证,请使用 [Tabular Editor 自助服务门户](https://tabulareditor.com/my-account/)。 +> 删除注册表值不会停用安装,请使用 [Tabular Editor 自助服务门户](https://tabulareditor.com/my-account/) 来管理你的已激活许可证。 -## 静默安装与许可证预配置 +## 静默安装和许可证预配置 -你可以以静默方式部署 Tabular Editor,并通过 Windows 注册表预先配置许可证。先安装,再写入许可证;许可证必须在应用程序首次启动前就已写入。 +您可以静默部署 Tabular Editor,并通过 Windows 注册表预先配置许可证。先进行安装,然后写入许可证。许可证必须在首次启动应用程序之前就位。 ### 静默安装 -无界面、无需重启: +无 UI,无需重启: ```powershell msiexec /i TabularEditor..x64.Net10.msi /qn /norestart /l*v C:\Temp\TE3_install.log ``` -| MSI 功能 | 在安装程序中显示为 | 说明 | 默认安装 | -| ------------- | ---------------- | ----------------------------------------------------- | -------------------------------------------------------------- | -| `MainFeature` | Tabular Editor 3 | Tabular Editor 3 核心应用程序 | 是(必需) | -| `AIAssistant` | AI 功能 | @ai-assistant 和 @mcp-server | 是,自 3.27.0 起。较早版本仅在选中该组件时才会安装它 | +| MSI 功能 | 在安装程序中显示为 | 描述 | 默认安装 | +|-------------|---------------------------|-------------|----------------------| +| `MainFeature` | Tabular Editor 3 | Tabular Editor 3 核心应用程序 | 是(必需) | +| `AIAssistant` | AI 功能 | @ai-assistant 和 @mcp-server | 是,从 3.27.0 开始。早期版本仅在选择时才会安装它 | > [!IMPORTANT] -> 从 3.27.0 开始,除非排除该组件,否则全新安装将包含 **AI 功能** 组件。如果贵组织不允许使用 AI Assistant 或 MCP 服务器,请排除此组件,并按下文所述设置 `DisableAi` 策略。 +> 从 3.27.0 开始,新安装将包含**AI 功能**组件,除非您将其排除在外。如果您的组织不允许使用 AI 助手或 MCP 服务器,请排除该组件,并按以下说明设置 `DisableAi` 策略。 -### 部署时不包含 AI 功能 +### 不使用 AI 功能进行部署 -如需安装不含 AI 功能的 Tabular Editor 3,请在 `ADDLOCAL` 中省略 `AIAssistant`: +将 `AIAssistant` 从 `ADDLOCAL` 中排除,以安装不含 AI 功能的 Tabular Editor 3: ```powershell msiexec /i TabularEditor..x64.Net10.msi /qn /norestart ADDLOCAL=MainFeature /l*v C:\Temp\TE3_install.log ``` -对于已安装该组件的计算机,可在运行该组件时使用 `REMOVE` 将其移除: +使用“REMOVE”运行软件包,以从已安装该组件的计算机中将其移除: ```powershell msiexec /i TabularEditor..x64.Net10.msi /qn /norestart REMOVE=AIAssistant /l*v C:\Temp\TE3_install.log ``` -如果未安装该组件,则安装目录中不会包含 AI 程序集,应用程序中也不会显示 **AI Assistant** 窗格和 MCP 服务器,并且不会向模型提供程序发送任何请求。其他功能不受影响。 +如果没有该组件,AI 程序集将不会位于安装文件夹中,**AI 助手**窗格和 MCP 服务器将不会出现在应用程序中,并且不会有任何请求发送到模型提供商。其他功能不受影响。 -如需更改单台设备上的选择,请再次运行安装程序,并在维护对话框中选择 **修改**。 +要更改单台计算机上的选择,请再次运行安装程序,然后在维护对话框中选择“修改”。 > [!NOTE] -> 使用 `ADDLOCAL` 时,除了任何可选功能外,也必须包含 `MainFeature`。如果仅指定 `AIAssistant` 而不包含 `MainFeature`,将导致安装不完整。 +> 使用 `ADDLOCAL` 时,请将 `MainFeature` 与任何可选功能一起列出。仅指定 `AIAssistant` 而不指定 `MainFeature` 将导致安装不完整。 -### 升级与 AI 功能组件 +### 升级和 AI 功能组件 -在现有安装上安装同一组件的较新版本时,安装程序会保留该计算机当前的功能选择。这同样适用于交互式安装和静默安装。在 3.27.0 之前部署且不含 AI 功能的计算机,升级后仍然不含这些功能;已选择 AI 功能的计算机则会保留这些功能。 +当您在现有安装之上安装同一软件包的较新版本时,安装程序会保留该计算机已有的功能选择。这适用于交互式安装和静默安装。在 3.27.0 之前部署的未包含 AI 功能的计算机在升级后仍不包含这些功能,而选择了 AI 功能的计算机则会保留这些功能。 -在以下情况下,安装程序会应用默认选择或命令行中的选择: +在这些情况下,安装程序将应用默认选择或命令行上的选择: -| 情况 | 结果 | -| ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -| 命令行设置了 `ADDLOCAL`、`REMOVE` 或其他功能属性 | 命令行决定所选内容。 `ADDLOCAL=MainFeature` 会从已安装 AI 功能的计算机中移除这些功能,而 `ADDLOCAL=ALL` 会在未安装这些功能的计算机上安装它们 | -| 部署会先卸载旧版本,再安装新版本,例如将 Intune 的 supersedence 设置为“卸载” | 该安装会被视为全新安装,除非命令行将其排除,否则会包含 AI 功能 | -| 该组件针对的运行时与已安装的组件不同,例如在已安装 .NET 8 组件的计算机上部署 .NET 10 组件 | .NET 8 和 .NET 10 组件是两个独立的产品。如果是全新安装,则默认包含 AI 功能,除非通过命令行将其排除 | +| 情况 | 结果 | +|--|--| +| 命令行设置 `ADDLOCAL`、`REMOVE` 或其他功能属性 | 命令行设置选择。`ADDLOCAL=MainFeature` 会从已安装 AI 功能的计算机上移除这些功能,而 `ADDLOCAL=ALL` 会在未安装这些功能的计算机上安装它们 | +| 部署在安装新版本之前卸载旧版本,例如设置为卸载的 Intune 替代 | 安装是新安装,并且包含 AI 功能,除非命令行将其排除在外 | -无论哪种情况,`DisableAi` 策略都会覆盖该选择。 +`DisableAi` 策略在所有情况下都会覆盖所选内容。 -### 通过 `DisableAi` 策略强制执行此决定 +### 在 .NET 8 和 .NET 10 包之间切换 -运行安装程序的用户会使用默认选择,其中包含 AI 功能。要让这台计算机上的每次安装都关闭 AI 功能,请在 `HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3` 下将 `DisableAi` @policies 设为 `1`。 Tabular Editor 3 会在启动时读取该策略,并禁用 AI 助手和 MCP 服务器。 +.NET 8 和 .NET 10 包相互替换。当您在已安装相同或更早版本的另一个版本的计算机上安装其中一个版本时,安装程序会在安装任何文件之前先卸载另一个版本,并保留该版本的Feature选择。如果一台计算机上安装了这两个版本,则在下一次安装后将只保留一个安装,并且**设置 > 应用 > 已安装的应用**中将列出一个**Tabular Editor 3**。 -从 3.27.0 开始,安装程序也会读取该策略: +如果安装的另一个版本是较新版本,则安装将停止,并显示一条消息。请先卸载较新版本,然后再次运行安装程序。 -- 全新安装不会安装 AI 功能组件,安装程序也不会显示它 -- 升级会从已安装该组件的计算机上移除它 -- 现有安装会保留 AI 文件,直到下一次升级。在启用该策略期间,Tabular Editor 3 不会加载它们 +### 使用 DisableAi 策略强制执行决定 -以本地系统账户运行的部署工具不会读取这台计算机上用户的 `HKEY_CURRENT_USER` 策略。静默部署时,把策略设在 `HKEY_LOCAL_MACHINE` 下,这样安装程序就能读取该策略。 +运行安装程序的用户将获得默认选择,其中包含 AI 功能。将 `HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3` 下的 `DisableAi` @policies 设置为 `1`,以在计算机上的每次安装中都禁用 AI 功能。Tabular Editor 3 在启动时读取该策略,并关闭 AI 助手和 MCP 服务器。 + +从 3.27.0 版本开始,安装程序也会读取该策略: + +- 新安装将省略 AI 功能组件,安装程序不会显示该组件 +- 升级将从已安装该组件的计算机中将其删除 +- 现有安装将保留 AI 文件,直至下一次升级。在设置策略时,Tabular Editor 3 不会加载它们。 + +以本地系统账户运行的部署工具不会读取计算机用户的 `HKEY_CURRENT_USER` 策略。在“HKEY_LOCAL_MACHINE”下设置策略,以便安装程序在静默部署中读取该策略。 ### 组件名称和其他 MSI 选项 -你也可以使用 `/package` 替代 `/i`。将 `` 替换为实际的版本字符串。 +您还可以使用 `/package` 代替 `/i`。将“”替换为实际的版本字符串。 -MSI 组件的命名格式为 `TabularEditor.`...msi`,例如 `TabularEditor.3.27.0.x64.Net10.msi`或`TabularEditor.3.27.0.ARM64.Net8.msi\`。选择适合目标计算机的体系结构和运行时;参见 @system-requirements。 MSI 不会安装 .NET Desktop Runtime,所以先部署它。 +MSI 包的命名方式为“TabularEditor....msi”,例如“TabularEditor.3.27.0.x64.Net10.msi”或“TabularEditor.3.27.0.ARM64.Net8.msi”。选择适合目标计算机的架构和运行时;请参阅@system-requirements。MSI 不会安装 .NET Desktop Runtime,因此请先部署该运行时。 -可用的 MSI 命令行选项详见 Microsoft 官方文档: -[Microsoft Standard Installer command-line options - Win32 apps | Microsoft Learn](https://learn.microsoft.com/windows/win32/msi/command-line-options) +有关可用 MSI 命令行选项的详细信息,请参阅 Microsoft 官方文档: +[Microsoft Standard Installer 命令行选项 - Win32 应用 | Microsoft Learn](https://learn.microsoft.com/windows/win32/msi/command-line-options) ### 预先配置许可证 -在应用程序 _首次启动之前_ 将许可证写入注册表: +在应用程序*首次启动之前*,将许可证写入注册表: ```bat REM Per-user license key (HKCU) REG ADD "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey /t REG_SZ /d YOUR-25-CHAR-KEY /f ``` -如果使用的是**企业版**许可证密钥,还需要设置授权用户的电子邮件地址: +如果您使用的是**企业版**许可证密钥,还请设置持证用户的电子邮箱: ```bat REG ADD "HKCU\Software\Kapacity\Tabular Editor 3" /v User /t REG_SZ /d user@example.com /f ``` -**注意事项** +**备注** -- 安装程序不接受许可证参数;许可通过上述注册表项进行处理。 -- 许可证密钥存储在 **HKCU** 下(按用户)。确保这些命令在目标用户的上下文中运行(例如通过登录脚本),这样这些值才会写入正确的用户配置文件。 -- 如需其他键和值,请参阅 [注册表详细信息](#registry-details)。 +- 安装程序不接受许可证参数;许可通过上述注册表项处理。 +- 密钥存储在 **HKCU**(每个用户)下。确保命令在目标用户的上下文中运行(例如通过登录脚本),以便将值写入正确的配置文件。 +- 有关其他键和值,请参阅[注册表详细信息](#registry-details)。 diff --git a/localizedContent/zh/content/getting-started/refresh-preview-query.md b/localizedContent/zh/content/getting-started/refresh-preview-query.md index 1cf11fccb..96d358220 100644 --- a/localizedContent/zh/content/getting-started/refresh-preview-query.md +++ b/localizedContent/zh/content/getting-started/refresh-preview-query.md @@ -1,6 +1,6 @@ --- uid: refresh-preview-query -title: 刷新、预览与查询数据 +title: 刷新、预览和查询数据 author: Daniel Otykier updated: 2026-10-12 applies_to: @@ -16,62 +16,62 @@ applies_to: - edition: Enterprise full: true --- +# 刷新、预览和查询数据 -# 刷新、预览与查询数据 - -当 Tabular Editor 3 连接到某个 Analysis Services 实例时,会提供一系列额外的**连接功能**,使你能够将 Tabular Editor 3 作为 Analysis Services 的客户端工具来使用。 +当 Tabular Editor 3 连接到 Analysis Services 实例时,将提供多项额外的**连接功能**,使你可以将 Tabular Editor 3 用作 Analysis Services 的客户端工具。 > [!NOTE] -> “连接到某个 Analysis Services 实例”是指以下任意一种情况: -> -> - 在[**工作区模式**](xref:workspace-mode)中加载模型 +> “连接到 Analysis Services 实例”一词是指以下任一情况: +> +> - 在[**工作区模式**](xref:workspace-mode)下加载模型 > - 直接从 SQL Server Analysis Services、Azure Analysis Services 或 Power BI XMLA endpoint 加载模型 > - 将 Tabular Editor 3 用作 Power BI Desktop 的外部工具 -总结一下,这些连接功能包括: +总之,这些连接功能包括: - 数据刷新操作 -- 表数据预览 -- PivotGrids +- 表格数据预览 +- PivotGrid - DAX 查询 - VertiPaq分析器 # 刷新数据 -当对 Data model 进行更改时,Tabular Editor 不会在 Analysis Services 中自动触发刷新操作。这是有意为之,以确保将元数据更改保存到 Analysis Services 时不会耗时过长。刷新操作可能需要很长时间才能完成,在此期间,服务器上将无法更新任何其他元数据。当然,这样做的缺点是:你可以使用 Tabular Editor 进行更改,从而让模型进入只能部分可查询、甚至完全无法查询的状态。根据对 Data model 进行的更改类型,可能需要不同级别的刷新。 +对数据模型进行更改时,Tabular Editor 不会在 Analysis Services 中自动触发刷新操作。这是设计使然,旨在确保将元数据更改保存到 Analysis Services 不会花费太长时间。刷新操作可能需要很长时间才能完成,在此期间,服务器上可能不会更新任何其他元数据。当然,这样做的缺点是,您可以使用 Tabular Editor 进行更改,这会导致模型进入只能部分查询或完全无法查询的状态。根据所进行的数据模型更改的类型,可能需要不同级别的刷新。 -通常,在可以查询所述对象之前,以下更改需要执行一次完全刷新(即先进行数据刷新,再进行计算刷新): +通常,在可以查询所述对象之前,以下更改需要进行完全刷新(即,先进行数据刷新,然后进行计算刷新): - 向模型添加新表 - 向表添加新列 -通常,以下更改需要计算刷新: +通常,以下更改需要进行计算刷新: - 更改计算表格或计算列的 DAX 表达式 - 添加或修改关系 -- 在计算组中添加、重命名或删除计算项 +- 向计算组添加、重命名或从中移除计算项 -需要指出的是,在模型中添加、修改或删除度量值不需要任何类型的刷新(除非该度量值被计算列引用;此时,包含该计算列的表必须重新计算)。 +值得注意的是,在模型中添加、修改或删除度量值不需要进行任何类型的刷新(除非计算列引用了该度量值,在这种情况下,必须重新计算该列所在的表)。 -要在 Tabular Editor 中启动刷新,只需在要刷新的表或分区上右键单击,选择 **刷新表** 或 **刷新分区**,然后选择要执行的刷新类型。 +要使用 Tabular Editor 启动刷新,只需右键单击您希望刷新的表格或分区,导航至**刷新表格**或**刷新分区**,然后选择您希望执行的刷新类型。 -![刷新表](~/content/assets/images/refresh-table.png) +![刷新表格](~/content/assets/images/refresh-table.png) -你也可以通过 **模型 > 刷新模型** 菜单在模型级别启动刷新。刷新操作开始后,你会看到文本“数据刷新已开始……查看刷新队列”。单击该链接,或通过 **视图 > 数据刷新** 菜单选项打开 **数据刷新** 视图。这将显示所有刷新操作(历史和当前)的列表,显示 Analysis Services 返回的状态消息(包括进度计数器和持续时间),并允许你取消非预期的刷新。 +您还可以通过“**模型 > 刷新模型**”菜单在模型层面发起刷新。刷新操作开始后,您将看到“数据刷新已开始… 查看刷新队列”字样。点击该链接,或通过“视图”>“数据刷新”菜单选项找到“数据刷新”视图。这将显示所有刷新操作(包括过去和当前)的列表,显示 Analysis Services 返回的状态消息(包括进度计数器和持续时间),并允许您取消意外的刷新。 -![数据刷新视图](~/content/assets/images/data-refresh-view2.png) +![数据刷新视图 2](~/content/assets/images/data-refresh-view2.png) > [!TIP] -> 数据刷新视图包含一个 **开始时间** 列,用来显示每次刷新操作是什么时候开始的。单击列标题即可按时间顺序对操作排序,方便你优先查看最新的刷新记录。你也可以按任意列排序,以便根据需要整理刷新操作。详情请参阅 [数据刷新视图](xref:data-refresh-view)。 +> “数据刷新”视图包含一个**开始时间**列,显示每个刷新操作的开始时间。点击列标题,按时间顺序对操作进行排序,以便轻松地首先查看最近的刷新操作。您可以按任何列进行排序,以根据您的需求来组织刷新操作。有关详细信息,请参阅[数据刷新视图](xref:data-refresh-view)。 + +在刷新进行期间,您可以根据本文所述继续处理数据模型、查询和预览数据,或将新的数据刷新操作排入队列。但是,在所有数据刷新操作完成之前,您将无法将模型更改保存到 Analysis Services。 -在刷新进行期间,你可以继续处理你的 Data model,按本文所述继续查询和预览数据,或将新的数据刷新操作加入队列。不过,在所有数据刷新操作完成之前,你无法将模型更改保存到 Analysis Services。 ## 支持的刷新操作 Tabular Editor 3 支持对不同对象类型执行刷新操作。支持的刷新类型如下所示: -- **模型**(自动、计算、完全) -- **(导入)表**(自动、计算、仅数据、完全) +- **模型**(自动、计算、完整) +- **(已导入)表**(自动、计算、仅数据、完整) - **分区**(完全) - **计算表格**(计算) - **计算组**(计算) @@ -80,107 +80,108 @@ Tabular Editor 3 支持对不同对象类型执行刷新操作。支持的刷新 # 预览表格数据 -在编写 DAX 和开发 Data model 的过程中,有时你可能需要逐行检查表中的内容。当然,你也可以编写 DAX 查询来实现这一点;但 Tabular Editor 3 让这件事更简单,你可以直接预览表格数据。要做到这一点,你可以右键单击某个表格,然后选择 **预览数据**。 +在 DAX 编写和数据模型开发的某些阶段,您可能需要逐行检查表格的内容。当然,您可以编写 DAX 查询来实现此目的,但 Tabular Editor 3 通过允许您直接预览表数据,使此操作变得更加轻松。要执行此操作,请右键单击表,然后选择**预览数据**选项。 ![预览数据](~/content/assets/images/preview-data-big.png) -你可以打开多个此类表格预览,并在用户界面中按你的习惯随意排列。 Tabular Editor 会针对模型执行 DAX 查询,只返回足以填充当前视图的一小部分记录,然后在你滚动时逐页加载更多行。 +您可以打开多个此类表预览,并在用户界面中以您喜欢的方式排列它们。Tabular Editor 对模型执行 DAX 查询,仅返回适合填充当前视图的少量记录,然后在你滚动时分页显示更多行。 -每个列标题都提供排序和筛选功能;网格的右键菜单可打开计算列的表达式或重新计算表格;而 **显示实际 DAX 查询...** 会将预览背后的查询以新的 DAX 查询文档形式提供给你。在 TOM Explorer 中选择某一列,会使预览滚动到该列位置。 +每个列标题都包含一个排序和一个筛选器,网格的右键菜单可以打开计算列的表达式或重新计算表,而**显示实际 DAX 查询…**则会将预览背后的查询作为新的 DAX 查询文档提供给您。在 TOM Explorer 中选择一列,预览将滚动到该列。 -有关工具栏、右键菜单、在各存储模式下可滚动的范围,以及控制列顺序和筛选下拉菜单的偏好设置,请参阅 @table-preview。 +请参阅 @table-preview,了解工具栏、右键菜单、在每种存储模式下可以滚动多远,以及控制列顺序和筛选器下拉列表的偏好设置。 # Pivot Grid -在模型中新增或编辑 DAX 度量值后,你通常会想测试一下这些度量值。传统上,这通常通过 Excel 或 Power BI 等客户端工具来完成。借助 Tabular Editor 3,你现在可以使用 **Pivot Grid**,其使用方式与 Excel 中著名的数据透视表非常相似。 Pivot Grid 可让你快速创建模型数据的汇总视图,从而在按不同列与层级进行筛选和切片时,测试 DAX 度量值的行为。 +在模型中添加或编辑 DAX 度量值后,模型开发人员通常会测试这些度量值。传统上,这通常使用 Excel 或 Power BI 等客户端工具来完成。使用 Tabular Editor 3,您现在可以使用**数据透视网格**,其行为与 Excel 中著名的数据透视表非常相似。数据透视表让您可以快速创建模型中数据的汇总视图,从而让您能够在按各种列和层次结构进行筛选和切片时测试 DAX 度量的行为。 -要创建新的 Pivot Grid,请选择 **文件 > 新建 > Pivot Grid**。接下来,你可以将度量值、列和层级从 TOM Explorer 拖入网格;也可以使用 **Pivot Grid > 显示字段** 菜单选项,显示一个弹出列表,其中列出了所有可拖入 Pivot Grid 的字段(见下图)。 +要创建新的 Pivot Grid,请使用**文件 > 新建 > Pivot Grid**选项。在此,您可以将度量值、列和层次结构从 TOM 资源管理器拖入网格,也可以使用**Pivot Grid > Show fields**菜单选项,显示一个弹出列表,其中包含所有可以拖入 Pivot Grid 的字段(请参阅下图)。 -![显示字段 Pivot](~/content/assets/images/show-fields-pivot.png) +![显示字段数据透视](~/content/assets/images/show-fields-pivot.png) -当字段被拖入 Pivot Grid 时,Tabular Editor 会生成 MDX 查询并发送到 Analysis Services,以显示结果数据。在这一点上,其行为与 Excel 中的数据透视表非常相似。你可以通过拖拽重新排列 Pivot Grid 中的字段,并可通过右键菜单中的多种选项自定义数据的显示方式。 +将字段拖入 Pivot Grid 时,Tabular Editor 会生成 MDX 查询并将其发送到 Analysis Services,以显示结果数据。在这方面,其行为与 Excel 中的数据透视表非常相似。您可以通过拖放来重新排列Pivot Grid中的字段,并且有各种右键菜单选项可用于自定义数据的显示方式。 ![自定义 Pivot Grid](~/content/assets/images/customizing-pivot-grids.png) -当模型发生更改或刷新操作完成时,Pivot Grid 会自动刷新。你可以在 **Pivot Grid** 菜单中切换此自动刷新功能。 +对模型进行更改或刷新操作完成后,Pivot Grid会自动刷新。您可以在**Pivot Grid**菜单中切换此自动刷新功能。 # DAX 查询 -查询模型数据更直接的方式是编写 DAX 查询。你可以使用 **文件 > 新建 > DAX 查询** 菜单选项来创建新的 DAX 查询文档。你可以同时打开多个 DAX 查询文档。 +查询模型中数据的更直接方法是编写 DAX 查询。使用**文件 > 新建 > DAX 查询**菜单选项,创建新的 DAX 查询文档。您可以同时打开多个 DAX 查询文档。 -DAX 查询可以使用 `.dax` 或 `.msdax` 文件扩展名保存到独立文件中,也可以从这些文件中加载。更多信息请参阅 @supported-files。 +可以使用 `.dax` 或 `.msdax` 文件扩展名将 DAX 查询保存到独立文件并从独立文件加载。有关详细信息,请参阅 @supported-files。 -在编辑器中输入 DAX `EVALUATE` 查询,然后点击 **查询 > 执行**(F5),即可将查询发送到 Analysis Services 并查看结果。默认情况下,Tabular Editor 3 会将 Analysis Services 返回的行数限制为 1000;但你可以在 **工具 > 偏好 > 数据浏览 > DAX 查询** 中更改此设置。如果查询超过此限制,Tabular Editor 3 会显示一个快捷链接,方便你检索所有记录(见下方截图)。 +在编辑器中输入您的 DAX `EVALUATE` 查询,然后点击**查询 > 执行** (F5),将查询发送到 Analysis Services 并查看结果。默认情况下,Tabular Editor 3 将从 Analysis Services 返回的行数限制为 1000 行,但您可以在**工具 > 首选项 > 数据浏览 > DAX 查询**下更改此设置。如果查询超过此限制,Tabular Editor 3 将显示一个快捷方式,让您检索所有记录(请参阅下图)。 ![查询行集限制](~/content/assets/images/query-rowset-limit.png) > [!WARNING] -> 在查询结果窗口中显示大量记录可能需要一些时间,并会显著增加 Tabular Editor 3 的内存占用。 +> 在查询结果窗口中显示大量记录可能需要一段时间,并会大幅增加 Tabular Editor 3 占用的内存。 -Tabular Editor 3 在编辑查询时使用与在对象上定义 DAX 表达式相同的 DAX 代码编辑器。因此,代码补全、自动格式化等所有相关功能都可用。更多信息请参阅 @dax-editor。此外,由于 DAX 查询的语法与对象表达式略有不同,DAX 查询编辑器还为常见任务提供了一些额外选项。 +Tabular Editor 3 使用的查询编辑 DAX 代码编辑器与用于在对象上定义 DAX 表达式的编辑器相同。因此,所有与代码补全、自动格式化等相关的功能均可使用。有关详细信息,请参阅@dax-editor。此外,由于 DAX 查询的语法与对象表达式略有不同,因此 DAX 查询编辑器为常见任务提供了更多选项。 -例如,如果你右键单击某个度量值引用,就会看到 **定义度量值** 选项,如下方截图所示。此选项会在 DAX 查询顶部添加一条 `DEFINE MEASURE` 语句,使你可以在查询作用域内轻松修改该度量值的 DAX 表达式。 +例如,如果您右键单击 Measure 引用,则有一个**定义 Measure**选项,如下图所示。此选项将在 DAX 查询的顶部添加一个 `DEFINE MEASURE` 语句,使您能够轻松地在查询范围内修改该度量的 DAX 表达式。 -![Dax 查询功能](~/content/assets/images/dax-query-features.png) +![DAX查询功能](~/content/assets/images/dax-query-features.png) -此外,一个 DAX 查询可以包含多个 `EVALUATE` 语句。在这种情况下,Tabular Editor 3 会将每条语句的结果显示在单独的编号选项卡上。如果文档中包含多个 `EVALUATE` 语句,但你只想执行其中一条,可以将光标放在要执行的语句中的任意位置,然后使用 **查询 > 执行所选内容**(SHIFT+F5)。 +此外,DAX 查询可以包含多个 `EVALUATE` 语句。在这种情况下,Tabular Editor 3 会在单独的带编号选项卡上显示每个此类语句的结果。如果您只想执行单个 `EVALUATE` 语句(即使您的文档包含多个此类语句),您可以将光标放置在要执行的语句中的某个位置,然后使用**查询 > 执行选定内容**(SHIFT+F5)选项。 -Tabular Editor 3 中的 DAX 查询会在模型发生更改或刷新操作完成时自动刷新。你可以在 **查询** 菜单中开启或关闭此自动刷新功能。 +当对模型进行更改或刷新操作完成后,Tabular Editor 3 中的 DAX 查询会自动刷新。您可以在**查询**菜单中切换此自动刷新功能。 -# 身份模拟 +# 模拟 -在查询模型中的数据时,有时需要模拟某个特定用户或一组角色,以便从最终用户的透视角度查看模型的行为表现。 Tabular Editor 3 支持点击 **模拟身份...** 按钮,来模拟特定用户或一个或多个角色。这适用于 [表格预览](#previewing-table-data)、[Pivot Grid](#pivot-grids) 和 [DAX 查询](#dax-queries)。 +在查询模型中的数据时,有时能够模拟特定用户或角色组合非常有用,以便从最终用户的角度查看模型的行为。通过点击**模拟……**按钮,Tabular Editor 3 允许您模拟特定用户或一个或多个角色。这适用于[表预览](#previewing-table-data)、[数据透视表](#pivot-grids)和[DAX 查询](#dax-queries)。 > [!NOTE] -> 为模拟用户,Tabular Editor 在连接到 Analysis Services 时,会将 [`EffectiveUserName` 属性](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#effectiveusername) 添加到连接字符串中。为模拟角色,Tabular Editor 会将 [`Roles` 属性](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#roles) 添加到连接字符串中。这仅适用于指定了模拟身份的那个数据视图(即 DAX 查询、Pivot Grid 或表格预览)。 +> 为了模拟用户,Tabular Editor 在连接到 Analysis Services 时,会将 [`EffectiveUserName` 属性](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#effectiveusername)添加到连接字符串中。要模拟角色,Tabular Editor 会将[`Roles`属性](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#roles)添加到连接字符串中。这仅适用于指定了模拟的数据视图(即 DAX 查询、Pivot Grid 或表预览)。 -点击 **模拟身份..** 按钮后(根据当前激活的数据视图类型,也可以在 **查询**、**Pivot Grid** 或 **表格预览** 菜单中找到),会弹出一个窗口,让你指定用户或选择一个或多个角色。 +单击**模拟身份..**按钮(也可以通过**查询**、**数据透视表**或**表预览**菜单找到,具体取决于哪种类型的数据视图处于活动状态)时,将弹出一个窗口,允许您指定一个用户,或选择一个或多个角色。 -![选择模拟身份](~/content/assets/images/select-impersonation.png) +![选择模拟](~/content/assets/images/select-impersonation.png) -启用模拟身份后,**模拟身份..** 按钮将显示为已选中,并且该模拟身份会应用于当前数据视图。点击 **模拟身份..** 按钮旁的小箭头,你可以查看并快速切换最近使用的 10 个模拟身份。 +启用模拟后,**模拟..**按钮将被选中,模拟将应用于当前数据视图。通过点击“**模拟身份..**”按钮旁的小箭头,您可以查看并快速切换最近使用的 10 个模拟身份。 -![模拟身份下拉列表](~/content/assets/images/impersonation-dropdown.png) +![模拟身份下拉菜单](~/content/assets/images/impersonation-dropdown.png) -当某个数据视图启用了自动刷新时,更改模拟身份会立即刷新该视图。 +在数据视图中启用自动刷新时,更改模拟将立即刷新视图。 ## CustomData -CustomData 功能允许你传入一个自定义字符串值,可在 DAX 表达式中使用,通常用于实现动态行级安全性方案。此功能可以与上文介绍的任何模拟选项结合使用,包括 **不进行模拟**。 +CustomData 功能允许您传递一个可用于 DAX 表达式的自定义字符串值,通常用于实现动态行级安全场景。此功能可与上述任何模拟选项(包括**无模拟**)结合使用。 ![选择模拟](~/content/assets/images/impersonation-customdata.png) -当你在 **CustomData** 输入字段中输入值时,Tabular Editor 3 会将 [`CustomData` 属性](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata) 添加到连接字符串中。然后,你可以在 DAX 表达式中通过 [`CUSTOMDATA()` 函数](https://dax.guide/customdata/) 取回该值。 +当您在**CustomData**输入字段中输入值时,Tabular Editor 3 会将[`CustomData`属性](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata)添加到连接字符串中。然后,您可以使用 [`CUSTOMDATA()` 函数](https://dax.guide/customdata/)在 DAX 表达式中检索此值。 -当应用使用自定义身份验证时,CustomData 常用于实现动态行级安全性。你提供的值可用于角色筛选表达式,通过连接字符串传入的自定义数据来控制用户能够看到哪些行。 +当应用程序使用自定义身份验证时,CustomData 通常用于实现动态行级安全性。您提供的值可以在角色筛选器表达式中加以利用,以根据通过连接字符串传递的自定义数据控制用户可以查看哪些行。 -此功能在 **Power BI Embedded** 场景中特别有用,你可以直接利用 CustomData 添加行筛选器,传入自由文本(字符串),从而在嵌入式 Report、Dashboard 和 Tile 中实现动态行级安全性。 - -**示例用例:** 你可以将用户的部门或区域作为 CustomData 传入,然后在某个角色的筛选表达式中使用该值,例如: +此功能在**Power BI Embedded**场景中尤为有用,您可以在其中原生使用 CustomData 添加行筛选器,该筛选器传递自由文本(字符串),以便在嵌入式报表、仪表板和磁贴中利用动态行级安全性。 +**示例用例:**您可以将用户的部门或区域作为 CustomData 传递,然后在角色的筛选器表达式中使用该值,例如: ```dax 'Department'[DepartmentCode] = CUSTOMDATA() -``` +``` # VertiPaq分析器 -Tabular Editor 3 内置了由 [SQLBI](https://sqlbi.com) 创建的开源工具 [VertiPaq分析器](https://www.sqlbi.com/tools/vertipaq-analyzer/) 的一个版本。 VertiPaq分析器可用于分析 Power BI 或 Tabular Data model 的 VertiPaq 存储结构。 +Tabular Editor 3 包含一个由 [SQLBI](https://www.sqlbi.com/tools/vertipaq-analyzer/) 创建的开源 [VertiPaq 分析器](https://sqlbi.com)工具版本。VertiPaq分析器对于分析您的 Power BI 或表格数据模型的 VertiPaq 存储结构非常有用。 + +使用 Tabular Editor 3,您可以在连接到任何 Analysis Services 实例时收集 VertiPaq 分析器统计信息。您还可以将统计信息导出为 [.vpax 文件](https://www.youtube.com/watch?v=zRa9y01Ub30),或从 .vpax 文件导入统计信息。 -使用 Tabular Editor 3,只要你连接到任意 Analysis Services 实例,就可以收集 VertiPaq分析器统计信息。你还可以将统计信息导出为 [.vpax 文件](https://www.youtube.com/watch?v=zRa9y01Ub30),或从 .vpax 文件导入统计信息。 +要收集统计信息,只需点击**VertiPaq Analyzer**视图中的**收集统计信息**按钮即可。 -要收集统计信息,只需在 **VertiPaq分析器** 视图中点击 **收集统计信息** 按钮。 +如果无法从模型的数据中读取统计信息,例如当高基数列超过 Power BI 容量的每个查询内存限制时,则仅从模型元数据中收集统计信息。此时会显示“未读取数据即收集统计信息”警告以及服务器错误,且基数可能缺失或不准确。要跳过从数据读取统计信息,请在**工具 > 首选项 > 文件格式 > VertiPaq Analyzer**下取消选中**从数据读取统计信息**。 -![VertiPaq分析器收集统计信息](~/content/assets/images/vertipaq-analyzer-collect-stats.png) +![Vertipaq Analyzer 收集统计信息](~/content/assets/images/vertipaq-analyzer-collect-stats.png) -收集完成后,VertiPaq分析器会显示模型大小、表数量等摘要信息。你可以在 **表**、**列**、**关系** 和 **分区** 选项卡中查看更详细的统计信息。 +收集统计信息后,VertiPaq Analyzer 将显示模型大小、表数等汇总信息。您可以在**表**、**列**、**关系**和**分区**选项卡中查看更详细的统计信息。 -此外,只要已加载统计信息,当鼠标悬停在 TOM Explorer 中的对象上时,Tabular Editor 3 就会以工具提示的形式显示基数和大小信息: +此外,每当加载统计信息时,将鼠标光标悬停在 TOM Explorer 中的对象上时,Tabular Editor 3 将以工具提示的形式显示基数和大小信息: -![TOM Explorer 中的 VertiPaq分析器统计信息](~/content/assets/images/vertipaq-analyzer-stats.png) +![TOM Explorer 中的 VertiPaq Analyzer 统计信息](~/content/assets/images/vertipaq-analyzer-stats.png) -……或将鼠标指针悬停在 DAX 表达式中的对象引用上时: +……或者将鼠标光标悬停在 DAX 表达式中的对象引用上时: -![DAX 表达式中的 VertiPaq分析器统计信息](~/content/assets/images/vertipaq-analyzer-stats-dax.png) +![DAX 表达式中的 Vertipaq Analyzer 统计信息](~/content/assets/images/vertipaq-analyzer-stats-dax.png) # 后续步骤 diff --git a/localizedContent/zh/content/getting-started/toc.md b/localizedContent/zh/content/getting-started/toc.md index a24b06c87..b5059dea3 100644 --- a/localizedContent/zh/content/getting-started/toc.md +++ b/localizedContent/zh/content/getting-started/toc.md @@ -1,75 +1,45 @@ -# [欢迎](index.md) - -# Tabular Editor 简介 - -## @general-introduction - -## @installation-activation-basic +# [欢迎](index.md) +# Tabular Editor 3 入门指南 +## @概述 +## @getting-started +## @安装-激活-基础 ## @migrate-from-vs - -## @migrate-from-desktop - +## @从-desktop-迁移 ## @migrate-from-te2 - ## @azure-marketplace - -# Tabular Editor 3 入门指南 - -## @getting-started - ## @editions - ## @training-telearn # @getting-started-te2 # Power BI Desktop 和 Tabular Editor - ## @desktop-integration - -## @desktop-limitations +## @desktop-limitations # 用户界面 - ## @user-interface-reference - -## @bpa-view-reference - -## @data-refresh-view-reference - -## @find-replace-reference - -## @macros-view-reference - -## @messages-view-reference - -## @properties-view-reference - -## @tom-explorer-view-reference - -## @diagram-view-reference +## @bpa-视图-参考 +## @数据刷新视图参考 +## @查找-替换-参考 +## @宏视图-参考 +## @消息-视图-参考 +## @属性-视图-参考 +## @tom-资源管理器-视图-参考 +## @图视图-参考 +## @table-preview-reference # 并行开发 - -## @parallel-development - -## @optimizing-workflow-workspace-mode +## @并行开发 +## @sharing-macros-bpa-rules +## @优化-工作流-工作区-模式 # 使用 Tabular Editor 更快地构建模型 - ## @boosting-productivity-te3 - -## @importing-tables-data-modeling - -## @refresh-preview-query - +## @导入-表-数据-建模 +## @刷新-预览-查询 ## @creating-and-testing-dax - -## @dax-script-introduction - +## @dax-脚本-简介 ## @bpa - -## @cs-scripts-and-macros - +## @cs-脚本和宏 ## @personalizing-te3 \ No newline at end of file diff --git a/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md b/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md index 9086d2be7..ab15a765b 100644 --- a/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md +++ b/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md @@ -1,6 +1,8 @@ ---- +--- uid: advanced-filtering-explorer-tree title: 高级对象筛选 +author: Morten Lønskov +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -11,88 +13,88 @@ applies_to: # 高级对象筛选 -本文介绍如何在 Tabular Editor 中使用“Filter”文本框——在浏览复杂模型时,这是一个非常实用的功能。 +资源管理器树中的**筛选**文本框按名称、通配符模式或动态 LINQ 表达式筛选树中显示的对象。 ## 筛选模式 -从 [2.7.4](https://github.com/TabularEditor/TabularEditor/releases/tag/2.7.4) 起,Tabular Editor 允许你决定筛选器如何应用于层级结构中的对象,以及搜索结果的显示方式。这通过紧挨着“Filter”按钮右侧的三个工具栏按钮来控制: +[Tabular Editor 2.7.4](https://github.com/TabularEditor/TabularEditor/releases/tag/2.7.4) 中新增的**筛选**按钮旁边的三个最右侧工具栏按钮用于设置筛选器应用于对象层次结构的方式以及结果的显示方式。 -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-01.png) +![Explorer工具栏中的筛选文本框和筛选模式按钮](~/content/assets/images/advanced-filtering-of-the-explorer-tree-01.png) -- ![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-02.png) **按父级分层**:搜索会应用于 _父级_ 对象,即表和显示文件夹(如已启用)。当父级项匹配搜索条件时,将显示其所有子项。 -- ![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-03.png) **按子级分层**:搜索会应用于 _子级_ 对象,例如度量值、列、层次结构等。父级对象仅在其至少有一个子对象匹配搜索条件时才会显示。 -- ![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-04.png) **平铺**:搜索将应用于所有对象,结果将以平铺列表显示。包含子项的对象仍会以分层方式显示其子项。 +* ![按父级分层按钮](~/content/assets/images/advanced-filtering-of-the-explorer-tree-02.png) **按父级分层**:搜索适用于父级对象,即表格,并显示文件夹(如果显示)。当父级匹配时,将显示其所有子级。 +* ![按子级分层按钮](~/content/assets/images/advanced-filtering-of-the-explorer-tree-03.png) **按子级分层**:搜索适用于子级对象,例如度量值、列和层次结构。只有当至少一个子级匹配时,才会显示父级。 +* ![扁平按钮](~/content/assets/images/advanced-filtering-of-the-explorer-tree-04.png) **扁平**:搜索适用于所有对象,结果以扁平列表的形式显示。具有子项的对象仍按层次结构显示子项。 ## 简单搜索 -在“Filter”文本框中输入任意内容,然后按 [Enter],即可在对象名称中进行不区分大小写的简单搜索。例如,在“Filter”文本框中输入“sales”,并使用“按父级”筛选模式,会得到如下结果: +在**筛选器**文本框中输入文本,然后按**Enter**键,即可对对象名称进行不区分大小写的搜索。例如,在“按父级”模式下搜索“sales”将得到以下结果: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-05.png) +![“按父级”模式下的“销售”搜索结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-05.png) -展开任意表,你就能看到该表的所有度量值、列、层级结构和分区。如果你把筛选模式改为“按子级”,结果会是这样: +展开表将显示其所有度量值、列、层次结构和分区。在“按子级”模式下,相同的搜索将返回以下结果: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-06.png) +![“按子级”模式下的“销售”搜索结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-06.png) -注意,“Employee”表现在也出现在列表中,因为它有几个子项(本例中是列)包含“sales”这个词。 +“Employee”表现在显示出来,因为其部分列包含“sales”一词。 ## 通配符搜索 -在“筛选”文本框中输入字符串时,可使用通配符 `?` 表示任意单个字符,使用 `*` 表示任意长度的字符序列(可为空)。因此,输入 `*sales*` 会得到与上面完全相同的结果;但输入 `sales*` 只会显示名称以“sales”开头的对象(同样不区分大小写)。 +在**筛选条件**文本框中,`?`匹配任意单个字符,`*`匹配任意零个或多个字符的序列,并且与简单搜索一样,匹配不区分大小写。`*sales*`给出与上述相同的结果,而`sales*`仅显示名称以“sales”开头的对象。 -按父级搜索 `sales*`: +在“按父级”模式下搜索“sales*”将得到以下结果: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-07.png) +![在“按父级”模式下搜索“sales*”的结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-07.png) -按子级搜索 `sales*`: +在“按子级”模式下进行相同的搜索,将得到以下结果: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-08.png) +![在“按子级”模式下搜索“sales*”的结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-08.png) -平铺模式下搜索 `sales*`(按 [Ctrl]+[F1] 切换信息列,以显示每个对象的详细信息): +对“sales*”进行扁平搜索,显示信息列(**Ctrl+F1**),以查看每个对象的详细信息: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-09.png) +![sales* 的平面搜索结果,信息列显示父级和类型](~/content/assets/images/advanced-filtering-of-the-explorer-tree-09.png) -通配符可以放在字符串中的任意位置,并且你可以按需使用多个。如果这还不够复杂,继续往下看…… +您可以在字符串的任何位置放置任意数量的通配符。 ## 动态 LINQ 搜索 -你还可以使用 [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions) 来搜索对象,这与创建 [Best Practice Analyzer 规则](xref:best-practice-analyzer) 时使用的方法相同。要在筛选框中启用动态 LINQ 模式,只需在搜索字符串前加上 `:`(冒号)。例如,要查看所有名称以“Key”结尾的对象(区分大小写),请输入: +筛选器还接受 [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions) 表达式,即 [Best Practice Analyzer 规则](xref:best-practice-analyzer)使用的语法。使用“`:`”(冒号)开头搜索字符串,以切换到动态 LINQ 模式。例如,此筛选器显示所有名称以“Key”结尾的对象(区分大小写): -``` +```text :Name.EndsWith("Key") ``` -……然后按下 [Enter]。在“平铺”筛选模式下,结果如下: +按 **Enter** 应用筛选器,在“扁平”模式下将得到以下结果: -![image](~/content/assets/images/advanced-filtering-of-the-explorer-tree-10.png) +![对以“Key”结尾的名称应用动态 LINQ 筛选器的平面结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-10.png) -在动态 LINQ 中进行不区分大小写的搜索,你可以先用类似下面的方式转换输入字符串: +对于动态 LINQ 中的不区分大小写的搜索,请转换字符串: -``` +```text :Name.ToUpper().EndsWith("KEY") ``` -或者,你也可以像下面这样传入 [StringComparison](https://docs.microsoft.com/dotnet/api/system.string.endswith?view=netframework-4.7.2#System_String_EndsWith_System_String_System_StringComparison_) 参数: +或者,您可以提供 [StringComparison](https://docs.microsoft.com/dotnet/api/system.string.endswith?view=netframework-4.7.2#System_String_EndsWith_System_String_System_StringComparison_) 参数,例如: -``` +```text :Name.EndsWith("Key", StringComparison.InvariantCultureIgnoreCase) ``` -你不必只在对象名称中进行搜索。动态 LINQ 的搜索字符串可以按需写得很复杂,用于匹配对象的任意属性(以及子属性)。因此,如果你想找出所有表达式中包含“TODO”一词的对象,可以使用以下筛选条件: +动态 LINQ 筛选器可以评估对象的任何属性,包括子属性。例如,此筛选器会查找表达式中包含“TODO”一词的所有对象: -``` +```text :Expression.ToUpper().Contains("TODO") ``` -再举一例,下面将显示模型中所有未被任何其他对象引用的隐藏度量值: +此筛选器显示模型中所有未被其他对象引用的隐藏度量值: -``` +```text :ObjectType="Measure" and (IsHidden or Table.IsHidden) and ReferencedBy.Count=0 ``` -你也可以使用正则表达式。下面会查找所有名称包含“Number”或“Amount”的列: +正则表达式也适用,例如以下筛选器可查找名称中包含“Number”或“Amount”的所有列: -``` +```text :ObjectType="Column" and RegEx.IsMatch(Name,"(Number)|(Amount)") ``` -注意:显示选项(树形视图正上方的工具栏按钮)可能会在使用“按父项”和“按子项”筛选模式时影响结果。例如,上面的 LINQ 筛选器只返回列,但如果你的显示选项当前设置为不显示列,那么就不会显示任何内容。 +在“按父级”和“按子级”模式下,显示选项(位于树正上方的工具栏按钮)也会筛选结果。例如,上面的筛选器仅返回列,因此,如果显示选项隐藏列,则树将不显示任何内容。 diff --git a/localizedContent/zh/content/how-tos/deploy-current-model.md b/localizedContent/zh/content/how-tos/deploy-current-model.md index 4dc594a75..9eb29ceac 100644 --- a/localizedContent/zh/content/how-tos/deploy-current-model.md +++ b/localizedContent/zh/content/how-tos/deploy-current-model.md @@ -2,7 +2,7 @@ uid: deploy-current-model title: 部署已加载的模型 author: Morten Lønskov -updated: 2026-09-15 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -13,22 +13,24 @@ applies_to: # 部署已加载的模型 -部署会将你当前打开的模型推送到服务器,可新建数据库,也可覆盖现有数据库。这就是将存放在 `.bim` 文件或文件夹中的模型部署到服务器,以及将模型从一个环境提升到另一个环境的方法。 +部署会将您已打开的模型推送到服务器,从而创建新数据库或覆盖现有数据库。这就是您将存储在 `.bim` 文件或文件夹中的模型上传到服务器的方式,也是您将模型从一个环境升级到另一个环境的方式。 -通过 **模型 > 部署...** 打开向导,选择目标服务器和数据库,然后选择要发送模型的哪些部分。 +使用**模型 > 部署…**打开向导,选择目标服务器和数据库,然后选择要发送的模型部分。 -## 各选项的作用 +## 每个选项控制的内容 -该向导的价值在于,它让你决定目标端哪些内容可以_保持不变_。每个选项都用于决定:目标端是否保留某项内容的现有版本: +向导的价值在于它让您可以在目标中*保持原样*。每个选项都是关于目标是否保留某项内容的自有版本的决定: -- **部署模型结构**会发送模型元数据。这本身就是部署操作;如果清除此选项,就没有任何内容可部署。 -- **部署数据源**会发送显式定义的数据源。清除此选项可保留目标端自己的连接字符串和凭据;将模型从开发环境发布到测试环境时,通常就该这样做。 -- **部署表分区**用于将分区与模型元数据同步。清除此选项可保留现有分区及其中的数据,不作任何更改。启用后,目标端上不在模型中的分区会连同其数据一起被删除。 - - 启用上述选项后,会出现**部署受增量刷新策略控制的分区**选项;它让你部署除由增量刷新策略生成的分区之外的所有分区。 -- **部署模型角色**会发送模型中定义的角色。清除此选项可保留目标端现有的角色。 - - **部署模型角色成员**会发送角色成员信息。角色成员通常是在服务器上管理,而不是在元数据里定义,因此清除此选项很常见。 +- **部署模型结构**会发送模型元数据。这就是部署本身;如果取消选中此项,则无需执行任何操作。 +- **部署数据源**会发送显式数据源。取消选中此选项,以保留目标自身的连接字符串和凭据,这通常是您在从开发环境升级到测试环境时所希望的。 +- **部署表分区**将分区与模型元数据同步。取消选中此选项,以保留现有分区及其中的数据,不作任何更改。启用此选项后,目标上不在模型中的分区将与其数据一起被删除。 + - **部署受增量刷新策略管理的分区**在启用上述选项时显示,并允许您部署每个分区,*但不包括*增量刷新策略生成的分区。 +- **部署共享表达式**将发送模型的共享表达式。取消选中此选项,以保留目标自身的共享表达式。此选项在 Tabular Editor 3 中可用。 +- **部署模型角色**将发送模型中定义的角色。取消选中此选项,以使目标的角色保持原样。 + - **部署模型角色成员**将发送角色成员资格。角色成员通常在服务器上管理,而不是在元数据中管理,因此清除此项是正常的。 +- **部署语言元数据(问答同义词、AI 指令和 AI 数据架构)**会发送每种文化的语言元数据。取消选中此项,以保留在 Power BI 服务中设置的问答同义词、AI 指令和 AI 数据架构。 -在 @deployment 中对上述内容都有详细说明,包括向导生成的 TMSL 脚本、部署对目标端既有数据的影响,以及如何通过命令行或管道进行部署。 +@deployment 详细介绍了所有这些内容,以及向导生成的 TMSL 脚本、部署对已在目标中的数据有何影响,以及如何从命令行或管道进行部署。 > [!NOTE] -> 部署不同于保存。如果你是从服务器打开该模型,**文件 > 保存**会将内容写回到_该_数据库,如 @connect-ssas 中所述。当目标端是其他位置时,请使用部署。 +> 部署与保存并不相同。如果您是从服务器打开的模型,则**文件 > 保存**会将内容写回*该*数据库,如 @connect-ssas 中所述。当目标位于其他位置时,请使用部署。 diff --git a/localizedContent/zh/content/how-tos/drag-drop.md b/localizedContent/zh/content/how-tos/drag-drop.md index f66032fdd..252379731 100644 --- a/localizedContent/zh/content/how-tos/drag-drop.md +++ b/localizedContent/zh/content/how-tos/drag-drop.md @@ -2,7 +2,7 @@ uid: drag-drop title: 拖放对象 author: Morten Lønskov -updated: 2026-09-15 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -13,86 +13,94 @@ applies_to: # 拖放对象 -你可以在 @tom-explorer-view 中重新组织模型——也就是你用来浏览模型的同一棵树。在哪里找到对象,就从哪里拖起;该放到哪里,就放到哪里。无需先切换到单独的建模界面;也不会因为当前视图恰好没有绘制某个对象而无法操作它。 +在@tom-explorer-view中拖放可在显示文件夹、表格、层次结构、计算组和表格组之间移动对象。拖动始终会移动对象,没有修饰键可将其转换为副本。拖动时,移动光标显示允许放置的位置,禁止放置光标显示不允许放置的位置。**复制**(在 @duplicate-and-batch 中有介绍)可复制对象。 -这个手势始终表示移动操作。允许放置时,Tabular Editor 会显示移动光标;不允许时则显示禁止放置光标。而且没有任何修饰键可以把拖动变为复制。如果要复制对象,请改用 **Duplicate**,详见 @duplicate-and-batch。 +## 移动显示文件夹 -## 重新组织显示文件夹 +将显示文件夹拖到另一个文件夹上即可移动该文件夹。其中的每个对象和子文件夹都随之移动,并且子文件夹结构得以保留。 -拖动一个显示文件夹时,其下的所有对象都会一起移动,包括嵌套的子文件夹,而且层级结构会保持不变。这正是此功能存在的原因:重构大型模型的文件夹布局时,每个文件夹只需一次拖放,而不是每个度量值都要单独编辑一次。 + - +您还可以: -树中的其他内容也都按同样方式移动: +- 按住 **Ctrl 并单击** 或 **Shift 并单击** 以选择多个对象,然后将它们一起拖动。如果度量值、列、层次结构和文件夹位于同一表格中,您可以将它们混合在一起。 +- 将对象拖放到表节点上,将其从所在文件夹移至表的顶层。 +- 将一个文件夹拖放到另一个文件夹上,即可将其嵌套。您不能将文件夹拖放到其自身的子文件夹中。 -- 使用 **Ctrl+单击** 或 **Shift+单击** 选择多个对象,然后一起拖动。只要它们位于同一个表中,你就可以混合选择度量值、列、层次结构和文件夹。 -- 将对象放到 **表节点** 本身上,即可把它们从所属文件夹中移出,并恢复到表的顶层。 -- 将一个文件夹放到另一个文件夹中,即可将其嵌套。 Tabular Editor 不允许把文件夹放入其自己的子文件夹中,因此你不会把某个分支塞进它自己里面。 +每次拖放都是一个撤消步骤(**Ctrl+Z**),无论它移动了多少个对象。 -每次放下都算作一次 **编辑 > 撤销** 操作,无论涉及多少个对象。 - -显示文件夹本质上只是每个对象上的一个字符串属性,层级之间用 `\\` 分隔,因此 `Sales\\Ratios` 表示 _Sales_ 下的 _Ratios_ 文件夹。一个对象也可以同时位于多个文件夹中,只需用 `;` 分隔这些路径。 +显示文件夹是每个对象的字符串属性,使用“`\`”分隔各级:“`Sales\Ratios`”是“Sales”中的“Ratios”文件夹。要在一个以上的文件夹中显示对象,请使用“;”分隔路径。 ## 将对象移动到另一个表 -度量值和计算列可以拖到另一个表中,既可以放到该表节点上,也可以直接放进它的某个显示文件夹中。其他任何类型的对象都不能以这种方式跨表移动。 +将度量值和计算列拖到另一个表上,或者在 Tabular Editor 3 中拖到该表中的显示文件夹上,以将它们移动到该位置。对于其他对象类型,则无法执行此操作。 -会随对象一并移动的内容: +在 Tabular Editor 3 中,移动操作会保留对象的以下内容: -- **其名称和说明的翻译**。 -- **透视成员关系。** 默认情况下,对象会保留它原本所属的各个透视。在 **Tools > 偏好 > Tabular Editor** 下勾选 _Inherit table membership when object pasted or moved to table_,即可让对象改为继承目标表的归属。 -- 有 KPI 的度量值的 **KPI**。 -- **错误和警告指示器。** 移动前无效的表达式在移动后仍会被标记为无效,而不会在你下次编辑之前看起来像没问题一样。 +- 其名称和说明的翻译 +- 透视成员资格,除非您在**工具 > 偏好设置 > Tabular Editor > 建模操作**下选择**将对象粘贴/移动到表时继承表成员资格**,这将使对象具有目标表的透视成员资格 +- KPI(对于具有 KPI 的度量值) +- 错误和警告指示符,因此无效表达式在移动后仍被标记为无效 > [!WARNING] -> 将 **计算列** 移动到另一个表时,会删除在原位置依赖它的对象。它参与的任何关系都会被删除,基于它构建的任何层次结构级别都会被删除;它会从日历和变体中移除,指向它的 _Sort by column_ 也会被清除。系统不会要求你确认此操作。 **Edit > Undo** 可一步还原所有这些更改,因此在执行其他操作之前先检查模型。 +> 当您将计算列移动到另一个表时,不会出现确认提示,并且以下内容将发生变化: +> +> - 使用该列的关系将被删除 +> - 基于该列的层次结构级别被删除 +> - 该列将从日历和变体中移除 +> - 对该列的 `SortByColumn` 引用被清除 +> +> 按 **Ctrl+Z** 一步撤消移动和所有这些更改。 -按旧表名引用该列的 DAX,例如 `'Reseller Sales'[Margin]`,不会被重写,仍会继续指向该列已经离开的表。度量值引用写作 `[Measure]`,不带表名,因此不受影响。移动后运行 @using-bpa 或检查 @messages-view,以找出哪里出了问题。 +通过旧表引用该列的 DAX(例如 `'Reseller Sales'[Margin]`)不会被重写,并且会继续指向该列离开的表。度量值引用写为`[Measure]`,不带表,因此不受影响。运行 @using-bpa 或在移动后检查 @messages-view ,以了解哪些内容出现问题。在“信息”视图中,取消选中**显示级联错误**,以便仅列出您需要修复的表达式。 -## 构建层次结构并排序计算项 +## 构建层次结构和排序计算项 -- 将一个或多个**列拖到层次结构上**,把它们添加为级别。拖放到两个现有级别之间即可选择位置。如果某列已经是该层次结构中的级别,则无法再次添加。 -- 在层次结构内拖动**级别**可重新排序;将其拖到同一表中的另一个层次结构上,可将其移动到那里。 -- 拖动**计算项**可在其所属计算组内重新排序;将其拖到另一个计算组上,则会把它们移过去。 +- 将一个或多个列拖动到层次结构上,将其添加为级别。拖放到两个现有级别之间,以选择位置。您无法添加已经是该层次结构级别的列。 +- 拖动层次结构中的级别以重新排序,或拖动到同一表中的另一个层次结构以将其移动到该处。 +- 拖动计算项,以便在其计算组中重新排序,或拖动到另一个计算组以将其移动。 ## 表格分组 -在 Tabular Editor 3 中,你可以将一个或多个表拖到某个**表格组**上,将它们归入其中。将表拖放到另一张表上,会让它们加入该表所在的组;这也是将表移出组的方法:把它们拖放到一张不属于任何组的表上。 +> [!NOTE] +> 表组仅在 Tabular Editor 3 中可用。 -表格组只是 Tabular Editor 中用于整理树视图的便捷功能。它们会作为注解存储,不属于模型元数据,所以不会显示在 Power BI 或 Analysis Services 中。 +将一个或多个表格拖动到表格组中,将其移入该组,或拖动到另一个表格中,将其移入该表格的组中。将表格拖放到不属于任何组的表格上,会将它们从其组中移除。表组用于组织 TOM Explorer,并以注释形式存储,Power BI 和 Analysis Services 会忽略这些注释。 ## 显示文件夹和翻译 -拖动只会更改 TOM Explorer 中_你当前正在查看的翻译_对应的显示文件夹,而且只改这一项。 +拖动操作仅会更改 TOM Explorer 中所选翻译的显示文件夹: -- 默认情况下未选择任何翻译时,拖动会写入未翻译版本的显示文件夹名称。已翻译的显示文件夹名称会原样保留,因此在这些区域设置中,对象仍会留在旧文件夹中。 -- 在 TOM Explorer 的“翻译”下拉列表中选择某个区域设置后,拖动操作会写入该区域设置下已翻译的显示文件夹,并保持未翻译的显示文件夹不变。 +- 如果未选择翻译(默认),则拖动操作会更改未翻译的显示文件夹。已翻译的显示文件夹不会发生变化,因此已翻译的视图仍会显示旧文件夹中的对象。 +- 如果在 TOM Explorer 的翻译下拉列表中选择了某种文化,则拖动操作将更改该文化的已翻译显示文件夹,而未翻译的显示文件夹将保持不变。 -因此,在默认视图中重新整理文件夹时,不会把对应的翻译也一起调整。你可以在 @metadata-translation-editor 中让它们重新保持一致,或运行内置的 Best Practice Analyzer 规则来查找“有显示文件夹但没有已翻译显示文件夹”的对象;该规则的修复操作会将未翻译的值复制到每个区域设置中。 +在 @metadata-translation-editor 中更新翻译,或使用 [为所有文化翻译显示文件夹](xref:kb.bpa-translate-display-folders) Best Practice Analyzer 规则的修复功能,该功能会将未翻译的值复制到每种文化中。 -将对象移动到另一张表是个例外:对象自身的翻译会在移动过程中保留。 +## 可以拖动哪些内容,以及可以拖动到哪里 -## 哪些对象可以拖动,以及可以拖到哪里 +| 拖动 | 到 | 结果 | +|---|---|---| +| 度量值、列、层次结构、文件夹 | 同一表中的显示文件夹 | 对象移动到该文件夹中 | +| 度量值、列、层次结构、文件夹 | 表格节点 | 对象离开其文件夹 | +| 度量值、计算列 | 另一个表或其中的文件夹(文件夹:仅限 Tabular Editor 3)| 对象移动到该表 | +| 列 | 层次结构或其一个级别 | 列将作为级别添加 | +| 级别 | 同一层次结构,或表格中的另一个层次结构 | 级别被重新排序或移动 | +| 计算项 | 其所属组或其他计算组 | 计算项被重新排序或移动 | +| 表格(仅限 Tabular Editor 3)| 表格组或其他表格 | 表格移动到该组 | -| 拖动 | 拖放到 | 结果 | -| ---------------- | ------------------ | ---------- | -| 度量值、列、层次结构、显示文件夹 | 同一表中的显示文件夹 | 对象会移入该文件夹 | -| 同上 | 表节点 | 对象会移出其文件夹 | -| 度量值、计算列 | 另一张表,或该表中的显示文件夹 | 对象会移动到该表 | -| 列 | 某个层次结构或其某个级别 | 列会添加为级别 | -| 级别 | 同一层次结构,或该表中的另一层次结构 | 级别会重新排序或移动 | -| 计算项 | 其所属计算组,或另一个计算组 | 项会重新排序或移动 | -| 表 | 一个表格组,或另一张表 | 表会归入该组 | +适用以下限制: -分区、角色、透视、关系、数据源和共享表达式无法拖动。自上次保存后已删除的对象会在树状结构中以删除线显示,且无法拖动,也不能作为放置目标。对象只会出现在树中已设置显示它们的位置。因此,在将对象拖放到显示文件夹或表格组之前,必须先在工具栏中启用显示文件夹和表格组。 +- 分区、角色、透视、关系、数据源和共享表达式无法拖动。 +- 在 Tabular Editor 3.27.0 及更高版本中,自上次保存以来被删除的对象在树中显示为带删除线的形式,您无法拖动它们或将对象拖放到它们上。 +- 仅当显示文件夹和表格组在 TOM Explorer 工具栏中启用时,它们才接受拖放操作。 -## 通过脚本执行相同操作 +## 通过脚本进行相同的更改 -显示文件夹是一个属性,因此脚本可以直接设置该字符串值。在普通 C# 字符串中使用 `\\`,或使用逐字字符串: +脚本通过设置`DisplayFolder`字符串在显示文件夹之间移动对象。在常规 C# 字符串或逐字字符串中使用 `\\`: ```csharp Selected.Measures.SetDisplayFolder(@"Sales\Ratios"); @@ -100,25 +108,20 @@ Model.Tables["Sales"].Measures["Margin %"].DisplayFolder = @"Sales\Ratios"; Model.Tables["Sales"].Measures["Margin %"].TranslatedDisplayFolders["da-DK"] = @"Salg\Nøgletal"; ``` -度量值可以用 `MoveTo` 在表之间移动,错误指示器的保留方式和拖动时完全一样: +`MoveTo` 将 Measure 移动到另一个表,并保留其错误指示符: ```csharp Model.Tables["Sales"].Measures["Margin %"].MoveTo(Model.Tables["Reseller Sales"]); ``` -计算列没有 `MoveTo`。使用与树视图相同的操作: - -```csharp -var column = Model.Tables["Sales"].Columns["Margin"]; -column.Handler.Actions.MoveObject(column, Model.Tables["Reseller Sales"], false, null); -``` +脚本 API 没有将计算列移动到另一个表的方法。在 Tabular Editor 3 中,设置 `TableGroup` 可将表移动到表组:`Model.Tables["Sales"].TableGroup = "Facts";`,在您运行的脚本中,如 @csharp-scripts 中所述。 -表格组也是一个属性:`Model.Tables["Sales"].TableGroup = "Facts";`。想了解如何运行这些操作,见 @csharp-scripts。 +## 拖动到其他视图 -## 在应用程序其他位置进行拖动 +您还可以将对象从 TOM Explorer 拖动到: -TOM Explorer 是唯一会通过拖动来更改模型结构的地方,但它也是其他几种放置操作的拖动来源: +- DAX 或 C# 编辑器,以插入对象的完全限定名称。请参阅@dax-editor。 +- 打开的模型图表,以便向其中添加表格。在图表中,将列拖动到另一个表格的列上,以创建关系。请参阅@diagram-view。 +- [Pivot Grid](xref:pivot-grid),以将列、度量值或层次结构添加为字段。 -- 将对象拖到 DAX 或 C# 编辑器中,即可插入其完全限定名称,无需手动输入。见 @dax-editor。 -- 将树中的表拖到已打开的模型关系图上,即可将它们添加到该关系图中。在关系图中,将某列拖到另一张表中的某列上,即可在它们之间创建关系。见 @diagram-view。 -- 将列、度量值或层次结构拖到 Pivot Grid 上,即可将它们添加为字段。 +模型图和数据透视网格仅在 Tabular Editor 3 中可用。 diff --git a/localizedContent/zh/content/how-tos/duplicate-batchrename.md b/localizedContent/zh/content/how-tos/duplicate-batchrename.md index 0c6bc345f..b88c352d8 100644 --- a/localizedContent/zh/content/how-tos/duplicate-batchrename.md +++ b/localizedContent/zh/content/how-tos/duplicate-batchrename.md @@ -2,7 +2,7 @@ uid: duplicate-and-batch title: 复制对象和批量重命名 author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -12,11 +12,12 @@ applies_to: --- # 复制对象和批量重命名 - -在资源管理器树中右键点击即可打开上下文菜单,用于复制度量值和列。复制后的对象名称会自动追加“copy”后缀。此外,你也可以选中多个对象,然后在资源管理器树中右键点击以进行批量重命名。 +通过 Explorer树中的右键单击上下文菜单,您可以复制度量值和列。复制的对象名称将带有“copy”后缀。此外,您还可以通过选择多个对象并在“资源管理器树”中右键单击来执行批量重命名。 ![批量重命名对话框](~/content/assets/images/getting-started-te-03.png) -你可以在重命名时使用正则表达式 RegEx,并可选择是否也要重命名翻译内容。 +您可以使用正则表达式进行重命名,并可自行决定是否也应重命名翻译。 + +复制的对象将保留原始对象所携带的所有错误和警告指示符,因此,具有无效表达式的对象的副本将立即被标记为无效。 -复制出来的对象会保留原对象携带的错误和警告标识,因此,若原对象包含无效表达式,其副本也会立即被标记为无效。 \ No newline at end of file +如果原始对象显示在多个显示文件夹中,则副本将显示在每个文件夹中,并在创建后被选中。这在您复制并粘贴对象时也适用。 diff --git a/localizedContent/zh/content/how-tos/formula-fixup-dependencies.md b/localizedContent/zh/content/how-tos/formula-fixup-dependencies.md index e92840d5e..4c169c77f 100644 --- a/localizedContent/zh/content/how-tos/formula-fixup-dependencies.md +++ b/localizedContent/zh/content/how-tos/formula-fixup-dependencies.md @@ -1,6 +1,8 @@ --- uid: formula-fix-up-dependencies -title: 公式修复与公式依赖关系 +title: 公式修正和公式依赖关系 +author: Morten Lønskov +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -9,10 +11,9 @@ applies_to: full: true --- -# 公式修复与公式依赖关系 +# 公式修正和公式依赖关系 +Tabular Editor 持续解析模型中所有度量值、计算列和计算表的 DAX 表达式,并构建这些对象的依赖关系树。*公式修正*使用该树:当您重命名一个对象时,它会更新引用该对象的 DAX 表达式。在**工具 > 首选项 > Tabular Editor > 建模操作**(Tabular Editor 2 中为**文件 > 首选项**)下,通过**自动 DAX 公式修正**启用此功能。 -Tabular Editor 会持续解析模型中所有度量值、计算列和计算表格的 DAX 表达式,以构建这些对象的依赖关系树。此依赖关系树用于“公式修复”功能,可在 **工具 > 偏好设置** 中启用(在 Tabular Editor 2 中为 **文件 > 偏好设置**)。一旦表达式中引用的对象被重命名,“公式修复”就会自动更新相应度量值、计算列或计算表格的 DAX 表达式。 +在 TOM Explorer 中右键单击一个对象,然后选择**显示依赖项……**,以查看其依赖关系树。 -若要查看依赖关系树,请在资源管理器树中右键单击该对象,然后选择“显示依赖关系……” - -![image](~/content/assets/images/formula-fixup-dependencies-01.png) \ No newline at end of file +![显示 measure 所依赖对象的“对象依赖关系”对话框](~/content/assets/images/formula-fixup-dependencies-01.png) \ No newline at end of file diff --git a/localizedContent/zh/content/how-tos/load-save.md b/localizedContent/zh/content/how-tos/load-save.md index 334381df0..ecacb6ef7 100644 --- a/localizedContent/zh/content/how-tos/load-save.md +++ b/localizedContent/zh/content/how-tos/load-save.md @@ -1,8 +1,8 @@ --- uid: load-save-model -title: 加载与保存模型元数据 +title: 加载和保存模型元数据 author: Morten Lønskov -updated: 2026-09-23 +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 @@ -11,70 +11,71 @@ applies_to: editions: - edition: Desktop none: true - note: "桌面版无法打开或保存模型元数据文件。" + note: "Desktop Edition can't open or save model metadata files." - edition: Business full: true - edition: Enterprise full: true --- +# 加载和保存模型元数据 -# 加载与保存模型元数据 - -Tabular Editor 可将模型元数据从文件、文件夹或服务器读取到内存中,并将其写回原位置或另存到新位置。 +Tabular Editor 从文件、文件夹或服务器将模型元数据读取到内存中,然后将其写回同一位置或新位置。 > [!NOTE] -> 元数据定义表、度量值和关系,但不包含任何数据,加载模型也不会加载其表中的行数据。要处理数据,可查看[表格预览](xref:table-preview)和[高级刷新](xref:advanced-refresh)。 +> 元数据定义了表、度量值和关系,但不包含数据,加载模型时不会加载其表中的行。有关处理数据的信息,请参阅[表格预览](xref:table-preview)和[高级刷新](xref:advanced-refresh)。 ## 加载模型 -![“文件”菜单,其中“打开”子菜单已展开,列出了“从文件打开模型”、“从数据库打开模型”、“从文件夹打开模型”、“文件”以及“从 Metric View YAML 导入”,并包含“保存”、“另存为”和“保存到文件夹”命令](~/content/assets/images/file-menu-open.png) +![“文件”菜单,其中“打开”子菜单已展开,列出了“从文件加载模型”、“从数据库加载模型”、“从文件夹加载模型”、“文件”和“从指标视图 YAML 导入”命令,以及“保存”、“另存为”和“保存到文件夹”命令](~/content/assets/images/file-menu-open.png) -| 来源 | 命令 | -| ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | -| `Model.bim` 或 `.bim` 文件 | **文件 > 打开 > 从文件打开模型...** | -| 采用 JSON 或 [表格模型定义语言 (TMDL)](xref:tmdl) 格式的文件夹结构 | **文件 > 打开 > 从文件夹打开模型...** | -| Analysis Services 或 Power BI XMLA 数据库 | **文件 > 打开 > 从数据库打开模型...** (**Ctrl+Shift+O**) | -| Power BI Desktop 的运行实例 | **文件 > 打开 > 从数据库打开模型...**,或从 Power BI Desktop 的 **外部工具** 功能区启动 Tabular Editor | +| 来源 | 命令 | +|---|---| +| `Model.bim` 或 `.bim` 文件 | **文件 > 打开 > 从文件打开模型…** | +| JSON 或 [表格模型定义语言 (TMDL)](xref:tmdl) 格式的文件夹结构 | **文件 > 打开 > 从文件夹打开模型…** | +| Analysis Services 或 Power BI XMLA 数据库 | **文件 > 打开 > 从数据库打开模型...** (**Ctrl+Shift+O**) | +| 正在运行的 Power BI Desktop 实例 | **文件 > 打开 > 从数据库打开模型...**,或从 Power BI Desktop 的**外部工具**功能区启动 Tabular Editor | -`.bim` 文件的兼容级别必须为 1200 或更高。更早的级别使用较旧的基于 XML 的格式,Tabular Editor 无法打开此类格式。 +`.bim` 文件的兼容级别必须为 1200 或更高版本。较早的级别使用较旧的基于 XML 的格式,Tabular Editor 无法打开该格式。 -如需了解 Tabular Editor 可识别的所有内容(包括并非模型元数据的受支持文件类型),请参阅[支持的文件类型](xref:supported-files)。 +有关 Tabular Editor 识别的所有内容(包括非模型元数据的支持文件类型),请参阅[支持的文件类型](xref:supported-files)。 > [!TIP] -> **文件 > 最近使用的表格模型** 可重新打开你之前打开过的模型。 +> **文件 > 最近的表格模型**可重新打开您之前打开的模型。 ## 保存模型 -**文件 > 保存** (**Ctrl+S**) 会将模型保存回您加载它的位置。从文件加载的模型会写回到该文件。从文件夹加载的模型会以该文件夹当前使用的格式保存回该文件夹。从数据库加载的模型会部署回该数据库。 +**文件 > 保存** (**Ctrl+S**) 将模型写回您从中加载模型的位置。从文件加载的模型将保存回该文件。从文件夹加载的模型将以其已使用的格式返回到该文件夹。从数据库加载的模型将部署回该数据库。 -若要将模型写入其他位置,或改用其他格式: +要将模型写入其他位置或以其他格式写入,请执行以下操作: -- **文件 > 另存为...** 会将模型元数据保存为单个 `.bim` 文件。 -- **文件 > 保存到文件夹...** 会将模型元数据保存为[文件夹结构](xref:save-to-folder),格式可以是 JSON 或 TMDL,具体取决于 **工具 > 偏好 > 文件格式 > 保存到文件夹** 下设置的序列化模式。 +- **文件 > 另存为…**将模型元数据保存为单个 `.bim` 文件。 +- **文件 > 保存到文件夹…**将模型元数据保存为[文件夹结构](xref:save-to-folder),格式为 JSON 或 TMDL,具体取决于**工具 > 首选项 > 文件格式 > 保存到文件夹**下的序列化模式。 > [!IMPORTANT] -> 从旧版 JSON 文件夹结构加载的模型,在使用 **文件 > 保存** 时会按相同格式保存,即使你的偏好中设置的是 TMDL。只有在使用 **文件 > 保存到文件夹...** 时,格式才会更改。参见 [TMDL](xref:tmdl)。 +> 当您使用**文件 > 保存**时,从旧版JSON文件夹结构加载的模型将以相同的格式保存,即使您的首选项显示为TMDL。只有当您使用**文件 > 保存到文件夹…**时,格式才会发生变化。请参阅[TMDL](xref:tmdl)。 ## 重新加载 -**文件 > 从磁盘重新加载** 会丢弃自上次保存以来所做的所有更改,并从源位置重新加载元数据。如果你有未保存的更改,会先显示 **重新加载模型元数据?** 提示。命令标签取决于模型源: +**文件 > 从磁盘重新加载**将放弃您自上次保存以来的更改,并从源重新加载元数据。如果您有未保存的更改,则首先会显示**是否重新加载模型元数据?**提示。命令标签取决于模型源: + +| 模型源 | 命令 | +|---|---| +| 文件或文件夹 | **从磁盘重新加载** | +| [工作区模式](xref:workspace-mode)下的模型 | **从磁盘重新加载**。模型从其文件重新加载,并重新部署到工作区数据库。| +| Analysis Services 或 Power BI,工作区模式之外 | **从服务器重新加载** | +| 未加载模型 | **从源重新加载**,禁用 | -| 模型源 | 命令 | -| ------------------------------------------------- | --------------------------------------------- | -| 文件或文件夹 | **从磁盘重新加载** | -| 处于[Workspace 工作区模式](xref:workspace-mode)的模型 | **从磁盘重新加载**。模型会从其文件重新加载,并重新部署到 Workspace 数据库。 | -| Analysis Services 或 Power BI(不处于 Workspace 工作区模式) | **从服务器重新加载** | -| 未加载任何模型 | **从源重新加载**(已禁用) | +在 Tabular Editor 3.26 及更早版本以及 Tabular Editor 2 中,该命令的名称为**文件 > 还原**。 -在 Tabular Editor 3.26 及更早版本,以及 Tabular Editor 2 中,该命令名为 **文件 > 还原**。 +在 Tabular Editor 3.27.0 及更高版本中,当代理、脚本或 `git pull` 更改打开的模型的元数据文件时,系统会提示您是否存在未保存的更改,然后重新加载模型。请参阅[从磁盘自动重新加载](xref:auto-reload)。 -在 Tabular Editor 3.27.0 及更高版本中,当代理、脚本或 `git pull` 更改了已打开模型的元数据文件时,模型会重新加载;如果你有未保存的更改,则会先显示提示。参见 [从磁盘自动重新加载](xref:auto-reload)。 +打开的 DAX 查询和 Pivot Grid 文档在手动或自动重新加载过程中保持打开状态,并连接到重新加载的模型。 > [!WARNING] -> 在让任何工具写入模型元数据之前(包括 Tabular Editor),请先备份。保存会覆盖源,重新加载无法找回你已保存的更改。 +> 在允许任何工具(包括 Tabular Editor)写入模型元数据之前,请先备份模型元数据。保存操作会覆盖源,重新加载无法恢复您已保存的更改。 ## 后续步骤 -- [保存到文件夹](xref:save-to-folder):了解文件夹格式,以及控制如何将模型拆分到多个文件中的序列化设置。 -- 如果有多人共同处理这个模型,参见 [使用 Git 和保存到文件夹启用并行开发](xref:parallel-development)。 -- [部署](xref:deployment):将模型写入 Analysis Services 服务器。 +- [保存到文件夹](xref:save-to-folder),了解文件夹格式和序列化设置,这些设置控制着模型如何在多个文件之间拆分。 +- 如果有多个人处理模型,请参阅[使用 Git 和“保存到文件夹”功能实现并行开发](xref:parallel-development)。 +- [部署](xref:deployment)以将模型写入 Analysis Services 服务器。 diff --git a/localizedContent/zh/content/how-tos/perspectives-translations.md b/localizedContent/zh/content/how-tos/perspectives-translations.md index dadb88d29..cef9e16ee 100644 --- a/localizedContent/zh/content/how-tos/perspectives-translations.md +++ b/localizedContent/zh/content/how-tos/perspectives-translations.md @@ -1,30 +1,30 @@ --- uid: perspectives-translations -title: 透视与翻译 +title: 透视和翻译 +author: Morten Lønskov +updated: 2026-10-11 applies_to: products: - product: Tabular Editor 2 full: true - product: Tabular Editor 3 full: true - note: 包含专用的透视编辑器和翻译编辑器 + note: Includes dedicated Perspective and Translation Editors --- -# 使用透视与翻译 - -你可以在资源管理器树中单击“模型”节点,然后在属性网格底部找到相关属性,以添加/编辑现有的透视和翻译(区域设置)。另外,当你的资源管理器树设置为[显示所有对象类型](../features/hierarchical-display.md)时,你可以直接在树中查看和编辑透视、区域设置和角色。 +# 使用透视和翻译 +您可以添加/编辑现有视角和翻译(文化),方法是单击“资源管理器树”中的“模型”节点,然后在属性网格的底部找到相关属性。或者,当您的资源管理器树[显示所有对象类型](../features/hierarchical-display.md)时,您可以直接在树中查看和编辑视角、文化和角色。 ![](~/content/assets/images/perspectives-translations-01.png) -你可以通过右键菜单选择“Duplicate”来复制现有的透视、角色或翻译。这会创建该对象的完全副本,然后你可以按需进行修改。 +您可以打开右键单击菜单并选择“复制”,以复制现有视角、角色或翻译。这将创建对象的完全副本,然后您可以根据需要对其进行修改。 -要查看透视和/或翻译的实际效果,请使用屏幕顶部附近工具栏上的两个下拉列表。选择透视会隐藏所有未包含在该透视中的对象;选择翻译则会在树中以翻译后的名称和显示文件夹来显示所有对象。按下 F2 更改对象/显示文件夹名称,或在树中拖动对象时,这些更改只会应用于所选翻译。 +要查看“正在使用”的视角和/或翻译,请使用屏幕顶部附近工具栏中的两个下拉列表。选择一个透视将隐藏未包含在该透视中的所有对象,而选择一个翻译将使用翻译后的名称和显示文件夹显示树中的所有对象。当按F2更改对象/显示文件夹的名称或在树中拖动对象时,更改将仅应用于所选翻译。 ## 对象上下文中的透视/翻译 +在树中选择一个或多个对象时,您将在属性网格中找到 4 个特殊属性集合: -在树中选中一个或多个对象时,你会在属性网格中看到 4 个特殊的属性集合: - -- **标题**、**描述**和**显示文件夹**会列出模型中的所有区域设置,并分别显示所选对象在各个区域设置下翻译后的名称、描述和显示文件夹。 -- **透视** 会显示模型中所有透视的列表,并指示所选对象是否属于每个透视。 +* **标题**、**描述**和**显示文件夹**显示模型中所有区域设置的列表,其中分别包含每个区域设置的所选对象的翻译名称、描述和显示文件夹。 +* **视角**显示模型中所有视角的列表,并指明所选对象是否属于每个视角。 -你可以在属性网格中使用这些集合,一次性更改一个或多个对象的翻译以及透视包含关系。 \ No newline at end of file +您可以在“属性网格”中使用这些集合,一次更改一个或多个对象的翻译和视角包含项。 \ No newline at end of file diff --git a/localizedContent/zh/content/how-tos/semantic-bridge-rename-objects.md b/localizedContent/zh/content/how-tos/semantic-bridge-rename-objects.md index 1e90dc6a5..f330adff5 100644 --- a/localizedContent/zh/content/how-tos/semantic-bridge-rename-objects.md +++ b/localizedContent/zh/content/how-tos/semantic-bridge-rename-objects.md @@ -1,8 +1,8 @@ --- uid: semantic-bridge-rename-objects -title: 在指标视图中重命名对象 +title: 重命名指标视图中的对象 author: Greg Baldini -updated: 2026-09-14 +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -17,19 +17,19 @@ applies_to: - edition: Enterprise full: true --- +# 重命名指标视图中的对象 -# 在指标视图中重命名对象 - -这篇操作指南演示如何重命名指标视图中的字段。同样的模式适用于 Metric View 中的每个集合:`Fields`、`Measures`、`Dimensions` 和 `Joins`。 +本操作指南演示了如何重命名指标视图字段,相同的模式也适用于指标视图中的每个集合:`Fields`、`Measures`、`Dimensions` 和 `Joins`。 > [!NOTE] -> 这些操作指南适用于 Tabular Editor 3.26.2 及更高版本。较早版本不支持此处所示的 v1.1 指标视图功能。 +> 这些操作指南适用于 Tabular Editor 3.26.2 及更高版本,因为早期版本不支持此处所示的 v1.1 度量视图功能。 +> 原地重命名需要 Tabular Editor 3.27.0 或更高版本。 -[!INCLUDE [sample](includes/sample-metricview.md)] +[!INCLUDE [示例](includes/sample-metricview.md)] ## 重命名字段 -将其赋值给对象的 `Name` 属性。对象的其他所有内容(其表达式、注释、显示名称、同义词和格式)都保持不变,同时它在集合中的位置也不会改变。 +对对象的 `Name` 属性进行赋值会重命名该对象,并保留该对象的其他属性(表达式、注释、显示名称、同义词和格式)及其在集合中的位置。 ```csharp {run id=rename setup=mv-sample after=none output=true} var view = SemanticBridge.MetricView.Model; @@ -57,25 +57,25 @@ Fields: Order Month ``` -集合的名称索引会随该对象一起更新,因此可以立即通过新名称访问该字段: +集合索引立即更新: ```csharp var field = view.Fields["Order Month"]; ``` -## 规则 +## 命名规则 -- **名称在其所属集合内必须保持唯一。** 如果将某个字段重命名为另一个字段已在使用的名称,则会引发 `ArgumentException`,并且对象和集合都不会发生更改。 -- **名称匹配不区分大小写**,与 Databricks SQL 保持一致。 `view.Fields["ORDER MONTH"]` 会找到上面重命名后的字段。即使重命名仅改变大小写,也仍然值得这样做,因为这会刷新存储的名称。 -- **重命名会应用到内存中的对象模型。** 要将其写出,请序列化该视图。 +- 名称在其集合中必须是唯一的。将字段重命名为另一个字段已使用的名称会引发 `ArgumentException`,并且对象和集合保持不变。 +- 名称匹配不区分大小写,遵循 Databricks SQL。`view.Fields["ORDER MONTH"]` 找到上述重命名的字段,仅大小写不同的重命名会更新存储的名称。 +- 重命名会更改内存中的对象模型。序列化视图以将其写入。 ## 后续步骤 -- [向指标视图中添加对象](xref:semantic-bridge-add-object) -- [从指标视图中移除对象](xref:semantic-bridge-remove-object) +- [将对象添加到指标视图](xref:semantic-bridge-add-object) +- [从指标视图中删除对象](xref:semantic-bridge-remove-object) - [将指标视图序列化为 YAML](xref:semantic-bridge-serialize) -## 另见 +## 另请参阅 - [指标视图对象模型](xref:semantic-bridge-metric-view-object-model) - @semantic-bridge-metric-view-validation diff --git a/localizedContent/zh/content/how-tos/toc.md b/localizedContent/zh/content/how-tos/toc.md index 44736cd2b..82773aac7 100644 --- a/localizedContent/zh/content/how-tos/toc.md +++ b/localizedContent/zh/content/how-tos/toc.md @@ -1,81 +1,67 @@ # 脚本和自动化 - ## [高级脚本](Advanced-Scripting.md) - ## [脚本引用对象](script-reference-objects.md) -# 模型管理与部署 - +# 脚本模式 +## [导航 TOM 对象层次结构](scripting-navigate-tom-hierarchy.md) +## [检查对象类型](scripting-check-object-types.md) +## [关键 TOM 接口](scripting-tom-interfaces.md) +## [动态 LINQ 与 C# LINQ](scripting-dynamic-linq-vs-csharp.md) +## [使用 LINQ 筛选和查询对象](scripting-filter-query-linq.md) +## [使用 Selected 对象](scripting-use-selected-object.md) +## [使用表达式和 DAX 属性](scripting-work-with-expressions.md) +## [使用依赖关系](scripting-work-with-dependencies.md) +## [使用注释和扩展属性](scripting-work-with-annotations.md) +## [使用透视和翻译](scripting-perspectives-translations.md) +## [添加、克隆和删除对象](scripting-add-clone-remove-objects.md) +## [使用脚本 UI 助手](scripting-ui-helpers.md) +## [在脚本中构建自定义 WinForms 对话框](scripting-custom-winforms-dialogs.md) + +# 模型管理和部署 ## [部署当前模型](deploy-current-model.md) - ## [连接到 SSAS](connect-ssas.md) - -## [加载与保存](load-save.md) - +## [加载和保存模型元数据](load-save.md) ## [文件夹序列化](folder-serialization.md) - ## [主模型模式](Master-model-pattern.md) - ## [更新兼容级别](update-compatibility-level.md) +## [更改兼容性模式](change-compatibility-mode.md) -# 数据导入与表格 - -## [导入表(TE2)](Importing-Tables.md) - -## [从 Excel 导入表(TE2)](importing-tables-from-excel.md) - +# 数据导入和表格 +## [导入表 (TE2)](Importing-Tables.md) +## [从 Excel 导入表 (TE2)](importing-tables-from-excel.md) ## [替换表](replace-tables.md) -# 模型组织与结构 - +# 模型组织和结构 ## [资源管理器树的高级筛选](Advanced-Filtering-of-the-Explorer-Tree.md) - ## [拖放](drag-drop.md) - -## [复制与批量重命名](duplicate-batchrename.md) - +## [复制和批量重命名](duplicate-batchrename.md) ## [编辑属性](edit-properties.md) -# 翻译与透视 - +# 翻译和透视 ## [导入/导出翻译](import-export-translations.md) +## [透视和翻译](perspectives-translations.md) -## [透视与翻译](perspectives-translations.md) - -# 数据安全与角色 - -## [角色与行级安全性](roles-rls.md) - -# 连接与集成 +# 数据安全和角色 +## [角色和行级安全性](roles-rls.md) +# 连接和集成 ## [XMLA Analysis Services 连接](xmla-as-connectivity.md) - -## [Power BI XMLA PBIX 变通方案](powerbi-xmla-pbix-workaround.md) +## [Power BI XMLA PBIX 解决方法](powerbi-xmla-pbix-workaround.md) # 模型维护 - -## [公式修复依赖项](formula-fixup-dependencies.md) - +## [公式修正依赖项](formula-fixup-dependencies.md) ## [元数据备份](metadata-backup.md) - -## [撤销与重做](undo-redo.md) +## [撤消和重做](undo-redo.md) # [语义桥](semantic-bridge-how-tos.md) - ## @semantic-bridge-load-inspect - +## @semantic-bridge-metric-view-import-from-file ## @semantic-bridge-import - ## @semantic-bridge-validate-default - ## @semantic-bridge-validate-simple-rules - ## @semantic-bridge-validate-contextual-rules - ## @semantic-bridge-add-object - ## @semantic-bridge-remove-object - ## @semantic-bridge-rename-objects - ## @semantic-bridge-serialize +## @semantic-bridge-metric-view-handle-failures diff --git a/localizedContent/zh/content/references/downloads.md b/localizedContent/zh/content/references/downloads.md index 7a0018357..ebfe34d83 100644 --- a/localizedContent/zh/content/references/downloads.md +++ b/localizedContent/zh/content/references/downloads.md @@ -1,8 +1,8 @@ ---- -uid: 下载量 -title: 全部下载 +--- +uid: downloads +title: 所有下载 author: Daniel Otykier -updated: 2026-09-22 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -16,94 +16,107 @@ applies_to: - edition: Enterprise full: true --- - # Tabular Editor 3 下载 -本页提供 Tabular Editor 3 的下载和安装说明。 +本页面提供 Tabular Editor 3 的下载和安装说明。 ## 最新版本 -Tabular Editor 3.27.0.0(_[发布说明](release-notes/3_27_0_0.md)_)提供两个构建版本:一个基于 .NET 10,另一个基于 .NET 8。这两个构建版本在功能上完全一致,并且可以并行安装。 +Tabular Editor 3.27.1.1 (*[发布说明](release-notes/3_27_1_1.md)*) 以两个版本发布,一个基于 .NET 10,另一个基于 .NET 8。这两个版本在*功能上完全相同*。安装一个版本会替换另一个版本;请参阅[在 .NET 8 和 .NET 10 包之间切换](xref:installation-activation-basic#switching-between-the-net-8-and-net-10-packages)。 ### 基于 .NET 10(推荐) -需要 [.NET Desktop Runtime 10](https://dotnet.microsoft.com/download/dotnet/10.0)。 `.exe` 安装程序会提示为你下载并安装该运行时;便携式 `.zip` 为自包含版本,完全不需要任何运行时。 +需要 [.NET Desktop Runtime 10](https://dotnet.microsoft.com/download/dotnet/10.0)。`.exe` 安装程序会为您下载并安装;便携式 `.zip` 是自包含的,完全不需要运行时。 -- 下载 [Tabular Editor 3.27.0.0(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe) _(推荐)_ -- 下载 [Tabular Editor 3.27.0.0(ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) -- 便携版本:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) -- MSI 版:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) +- 下载 [Tabular Editor 3.27.1.1(64 位)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) *(推荐)* +- 下载 [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) +- 便携版: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) +- MSI 版本:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) -### 基于 .NET 8 +### 在 .NET 8 上 -适用于暂时无法运行 .NET 10 桌面运行时的计算机。需要 [.NET Desktop Runtime 8](https://dotnet.microsoft.com/download/dotnet/8.0)。 +适用于尚无法运行 .NET 10 桌面运行时的计算机。需要 [.NET Desktop Runtime 8](https://dotnet.microsoft.com/download/dotnet/8.0)。 -- 下载 [Tabular Editor 3.27.0.0(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe) -- 下载 [Tabular Editor 3.27.0.0(ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) -- 便携版本:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) -- MSI 版:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) +- 下载 [Tabular Editor 3.27.1.1(64 位)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) +- 下载 [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) +- 便携版:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) +- MSI 版本:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) > [!TIP] -> 不确定该选哪个?请选择 .NET 10 x64 安装程序。仅在 ARM 架构的 PC 上才选择 ARM64;只有在你的组织无法安装 .NET 10 桌面运行时的情况下才选择 .NET 8。 +> 不确定选择哪个版本?请选择 .NET 10 x64 安装程序。仅在基于 ARM 的电脑上选择 ARM64,并且仅在您的组织无法安装 .NET 10 桌面运行时时选择 .NET 8。 -完整的兼容性矩阵请参阅 @system-requirements;此版本及所有更早版本的发布说明请参阅 @release-history。 +请参阅@system-requirements,了解完整的兼容性矩阵,并参阅@release-history,了解此版本和所有先前版本的版本说明。 ## 安装说明 1. 下载 .exe 安装程序文件。 -2. 运行.exe 安装程序。安装向导将引导你完成安装。 -3. 有关如何激活产品或更换许可证密钥的说明,请参阅我们的[入门指南](xref:getting-started)。 - -升级到更新版本的 Tabular Editor 3 时,无需卸载之前安装的版本。 - -## 更新历史 - -- 2026-09-22 **Tabular Editor 3.27.0.0** (_[发布说明](release-notes/3_27_0_0.md)_) - - .NET 10 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) - - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) - - .NET 10 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) -- 2026-07-10 **Tabular Editor 3.26.3** (_[发布说明](release-notes/3_26_3.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) -- 2026-06-25 **Tabular Editor 3.26.2** (_[发布说明](release-notes/3_26_2.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) -- 2026-04-17 **Tabular Editor 3.26.1** (_[发布说明](release-notes/3_26_1.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) -- 2026-03-25 **Tabular Editor 3.26.0** (_[发布说明](release-notes/3_26_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) -- 2026-03-02 **Tabular Editor 3.25.5** (_[发布说明](release-notes/3_25_5.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) - - .NET 8 免安装版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) -- 2026-02-11 **Tabular Editor 3.25.3** (_[发布说明](release-notes/3_25_3.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) - - .NET 8 免安装版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) -- 2025-11-11 **Tabular Editor 3.24.2**(_[发布说明](release-notes/3_24_2.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) -- 2025-10-28 **Tabular Editor 3.24.0**(_[发布说明](release-notes/3_24_0.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) -- 2025-09-15 **Tabular Editor 3.23.1**(_[发布说明](release-notes/3_23_1.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) -- 2025-06-28 **Tabular Editor 3.22.1**(_[发布说明](release-notes/3_22_1.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) - -如需更早版本,请参阅[完整发布历史](release-history.md)。 \ No newline at end of file +2. 运行 .exe 安装程序。安装向导将引导您完成安装。 +3. 有关如何激活产品或更改许可证密钥的说明,请参阅我们的[入门指南](xref:getting-started)。 + +升级到较新版本的 Tabular Editor 3 时,无需卸载之前的安装。 + +## 版本历史 + +- 2026-10-23 **Tabular Editor 3.27.1.1** (*[发布说明](release-notes/3_27_1_1.md)*) + - .NET 10 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) + - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) + - .NET 10 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) +- 2026-10-15 **Tabular Editor 3.27.1.0** (*[发布说明](release-notes/3_27_1_0.md)*) + - .NET 10 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) + - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) + - .NET 10 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) +- 2026-09-22 **Tabular Editor 3.27.0.0** (*[发布说明](release-notes/3_27_0_0.md)*) + - .NET 10 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) + - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) + - .NET 10 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) +- 2026-07-10 **Tabular Editor 3.26.3** (*[发布说明](release-notes/3_26_3.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) +- 2026-06-25 **Tabular Editor 3.26.2** (*[发布说明](release-notes/3_26_2.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) +- 2026-04-17 **Tabular Editor 3.26.1** (*[发布说明](release-notes/3_26_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) +- 2026-03-25 **Tabular Editor 3.26.0** (*[发布说明](release-notes/3_26_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) +- 2026-03-02 **Tabular Editor 3.25.5** (*[发布说明](release-notes/3_25_5.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) +- 2026-02-11 **Tabular Editor 3.25.3** (*[发布说明](release-notes/3_25_3.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) +- 2025-11-11 **Tabular Editor 3.24.2** (*[发布说明](release-notes/3_24_2.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) +- 2025-10-28 **Tabular Editor 3.24.0** (*[发布说明](release-notes/3_24_0.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) +- 2025-09-15 **Tabular Editor 3.23.1** (*[发布说明](release-notes/3_23_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版 (.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) +- 2025-06-28 **Tabular Editor 3.22.1** (*[发布说明](release-notes/3_22_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) + +有关早期版本,请参阅[完整发布历史记录](release-history.md)。 \ No newline at end of file diff --git a/localizedContent/zh/content/references/policies.md b/localizedContent/zh/content/references/policies.md index c50cf1256..993fa1d9c 100644 --- a/localizedContent/zh/content/references/policies.md +++ b/localizedContent/zh/content/references/policies.md @@ -1,45 +1,45 @@ --- -uid: 策略 -title: 策略 +uid: policies +title: 政策 author: Morten Lønskov -updated: 2026-10-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 partial: true - note: "Tabular Editor 2 只读取旧版注册表项,并且仅应用下文标记为 TE2 的策略。" + note: "Tabular Editor 2 reads the legacy registry key only, and honors only the policies marked TE2 below." - product: Tabular Editor 3 editions: - edition: Desktop partial: true - note: "仅限常规策略" + note: "General policies only" - edition: Business partial: true - note: "仅限常规策略" + note: "General policies only" - edition: Enterprise full: true - product: Tabular Editor CLI partial: true - note: "仅适用于 Windows,且仅适用于下文标注为 CLI 的策略。" + note: "On Windows, and only for the policies marked CLI below." --- # 策略 -如果您为组织管理 Tabular Editor,可以通过组策略限制其功能,并代表用户配置 AI 助手和 MCP 服务器。你可以手动在 Windows 注册表中设置这些值,也可以使用 Tabular Editor 3 随附的管理模板。 +如果您为组织管理 Tabular Editor,则可以通过组策略限制其功能,并代表用户配置 AI 助手和 MCP 服务器。手动在 Windows 注册表中设置值,或使用 Tabular Editor 3 随附的管理模板。 -大多数策略都是常规策略,在 Tabular Editor 3 的每个版本中都可用。用于配置 AI 助手和 MCP 服务器的策略需要 [Tabular Editor 3 企业版](xref:editions),并在下文标注为 **Enterprise**。 +大多数策略都是通用策略,在 Tabular Editor 3 的每个版本中都可用。配置 AI 助手和 MCP 服务器的策略需要[Tabular Editor 3 企业版](xref:editions),并在下方标记为**企业版**。 > [!NOTE] > 此功能需要以下版本的 Tabular Editor: > -> - Tabular Editor [2.17.0](https://github.com/TabularEditor/TabularEditor/releases/tag/2.17.0) 或更高版本 -> - 如需使用常规策略,需要 Tabular Editor [3.3.5](https://github.com/TabularEditor/TabularEditor3/releases/tag/3.3.5) 或更高版本 -> - 如需使用下方的注册表项、计算机范围的策略以及所有 Enterprise 策略,需要 Tabular Editor 3.27 或更高版本 -> - Tabular Editor CLI 0.7 或更高版本 +> - Tabular Editor [2.17.0](https://github.com/TabularEditor/TabularEditor/releases/tag/2.17.0) 或更高版本 +> - Tabular Editor [3.3.5](https://github.com/TabularEditor/TabularEditor3/releases/tag/3.3.5) 或更高版本,用于常规策略 +> - Tabular Editor 3.27 或更高版本,适用于以下注册表项、整机策略以及所有企业策略 +> - Tabular Editor CLI 0.7 或更高版本 -## 注册表项 +## 注册表键 -系统会从六个注册表项中读取策略,哪个注册表项最先定义某个值,就以哪个值为准。 `HKEY_LOCAL_MACHINE` 下的任何注册表项优先级都高于 `HKEY_CURRENT_USER` 下的任何注册表项,因此通过“计算机配置”设置的计算机范围策略不能由用户覆盖。在同一配置单元内,产品专用注册表项的优先级高于共享注册表项,而共享注册表项又高于旧版注册表项: +策略从六个键中读取,定义值的第一个键决定该值。`HKEY_LOCAL_MACHINE` 下的每个键的优先级都高于 `HKEY_CURRENT_USER` 下的每个键,因此用户无法覆盖通过“计算机配置”设置的整机策略。在一个配置单元中,特定于产品的键的优先级高于共享键,而共享键的优先级又高于旧版键: ``` HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3 @@ -50,201 +50,203 @@ HKEY_CURRENT_USER\Software\Policies\Tabular Editor ApS HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor ``` -- `Tabular Editor ApS\TE3` 仅由 Tabular Editor 3 读取。 Tabular Editor CLI 则改为读取 `Tabular Editor ApS\TECLI`;其余四个注册表项两者相同。 -- `Tabular Editor ApS` 是共享注册表项,由 Tabular Editor 3 和 CLI 共同读取。 -- `Kapacity\Tabular Editor` 是早期版本使用的注册表项。该键仍会被读取,而且这是 Tabular Editor 2 唯一会读取的键。因此,如果策略也需要对 Tabular Editor 2 生效,也要在此处设置。 +- `Tabular Editor ApS\TE3` 仅由 Tabular Editor 3 读取。Tabular Editor CLI 读取的是 `Tabular Editor ApS\TECLI`;其他四个项对于两者来说是相同的。 +- `Tabular Editor ApS` 是共享项,由 Tabular Editor 3 和 CLI 共同读取。 +- `Kapacity\Tabular Editor` 是早期版本使用的项。该项仍会被读取,并且是 Tabular Editor 2 读取的唯一项,因此,如果还需要应用于 Tabular Editor 2,也请在该项中设置策略。 -优先级会分别应用到每个值:计算机范围的 `DisableTelemetry` 设为 0 时,会覆盖按用户设置为 1 的 `DisableTelemetry`;而只按用户设置的 `DisableCSharpScripts` 仍然生效。值名称不区分大小写。 +优先级分别适用于每个值:全机器范围的 `DisableTelemetry` 为 0 会覆盖每个用户的 `DisableTelemetry` 为 1,而仅针对每个用户设置的 `DisableCSharpScripts` 仍然适用。 +值名称不区分大小写。 ## 值类型 -| 设置类型 | 注册表类型 | 说明 | -| -------- | -------------- | ------------------------------------------------------------- | -| 开/关策略 | `REG_DWORD` | 任何非零值都会强制执行该策略。 `0` 以及该值不存在,都表示不强制实施该策略。 | -| 选项 | `REG_SZ` | 选项的名称,例如 `Read`;这也是管理模板写入的内容。也可以使用 `REG_DWORD` 来存储该选项在列表中的位置。 | -| 数值 | `REG_DWORD` | 管理模板写入的内容。也可以使用 `REG_SZ` 来存储该数值。 | -| 列表 | `REG_MULTI_SZ` | 每行一个条目。也接受使用分号分隔各条目的 `REG_SZ`。 | -| 路径、地址或名称 | `REG_SZ` | | +| 设置类型 | 注册表类型 | 注意事项 | +|--|--|--| +| 开/关策略 | `REG_DWORD` | 任何非零值都会强制执行该策略。“0”和不存在该值都表示不强制执行该策略。| +| 选择 | `REG_SZ` | 选择的名称,例如 `Read`,这是管理模板写入的内容。也接受包含选项在列表中的位置的 `REG_DWORD`。| +| 数字 | `REG_DWORD` | 管理模板写入的内容。也接受包含该数字的 `REG_SZ`。| +| 列表 | `REG_MULTI_SZ` | 每行一个条目。也接受条目由分号分隔的 `REG_SZ`。| +| 路径、地址或名称 | `REG_SZ` | | -Tabular Editor 只会在启动时读取一次策略值。更改会在下次启动应用程序时生效。 +Tabular Editor 在启动时读取一次策略值。更改将在您下次启动应用程序时生效。 ## 常规策略 -要强制执行其中一项,只需添加一个名为下述名称且数值为非零的 `REG_DWORD` 值。 **Products** 列显示哪些产品会遵循该策略:**TE3** 表示 Tabular Editor 3,**CLI** 表示 Tabular Editor CLI,**TE2** 表示 Tabular Editor 2,且它仅会读取旧版键。 - -| 值 | 产品 | 启用后…… | -| ------------------------------ | ------------- | ----------------------------------------------------------------------------------------------------------------- | -| DisableUpdates | TE3, TE2 | Tabular Editor 不会在线检查是否有新版本可用。用户也无法手动检查更新。 | -| DisableCSharpScripts | TE3、TE2 | Tabular Editor 不允许用户创建或执行 C# Script。 | -| DisableMacros | TE3, TE2 | Tabular Editor 不允许用户保存或运行宏。应用启动时不会加载存储在 `%LocalAppData%` 文件夹中的宏。 | -| DisableBpaDownload | TE3, CLI, TE2 | 无法从网络下载 Best Practice Analyzer 规则。保存在本地或随模型一起存放的规则仍可正常使用。 | -| DisableWebDaxFormatter | TE3、CLI、TE2 | 会将代码发送到 daxformatter.com 的 DAX 格式化程序已被禁用。 Tabular Editor 3 仍提供其内置格式化程序,不会通过网络发送任何数据。 | -| DisableErrorReports | TE3 | 用户无法向 Tabular Editor 支持团队发送错误或崩溃 Report。 | -| DisableTelemetry | TE3, CLI | 不会收集匿名使用数据,也不会将其发送给 Tabular Editor 支持团队。 | -| DisableDaxOptimizer | TE3 | DAX优化器集成功能不可用。 | -| DisableDaxOptimizerUpload | TE3 | 用户无法通过DAX优化器集成上传VertiPaq分析器文件。强制执行 `DisableDaxOptimizer` 时,此项也会自动生效。 | -| RequireDaxOptimizerObfuscation | TE3 | 用户无法通过DAX优化器集成上传明文VertiPaq分析器文件;只能上传已混淆的文件。强制执行 `DisableDaxOptimizer` 或 `DisableDaxOptimizerUpload` 时,此项也会自动生效。 | -| DisableDax组件管理器 | TE3 | DAX 组件管理器不可用。 | -| DisableAi | TE3 | 所有 AI 功能都会关闭:AI 助手、MCP 服务器以及所有由 AI 提供支持的功能都将不可用;应用启动时不会加载任何与 AI 相关的内容;并会清除任何已存储的提供程序配置(包括 API 密钥)。 | -| DisableAiChat | TE3 | AI 助手聊天面板不可用。其他 AI 功能(包括 MCP 服务器)不受影响。 | -| DisableMcpServer | TE3 | MCP 服务器不可用,因此外部代理工具无法连接到 Tabular Editor 3。 AI 助手聊天不受影响。 | -| RequireMcpAccessToken | TE3 | 连接到 MCP 服务器的客户端必须提供 **工具 > MCP 服务器...** 对话框中显示的访问令牌,而且用户无法关闭这一要求。 | +要强制执行其中一项,请添加一个具有以下名称和非零值的 `REG_DWORD` 值。“**产品**”列显示了哪些产品遵循该策略:**TE3** 是 Tabular Editor 3,**CLI** 是 Tabular Editor CLI,**TE2** 是 Tabular Editor 2,后者仅读取旧版键。 + +|值|产品|强制执行时……| +|--|--|--| +| DisableUpdates | TE3、TE2 | Tabular Editor 将不会检查是否有更新版本在线可用。用户也无法手动检查更新。| +| DisableCSharpScripts | TE3、TE2 | Tabular Editor 不允许用户创建或执行 C# 脚本。| +| DisableMacros | TE3、TE2 | Tabular Editor 不允许用户保存或运行宏。应用程序启动时,不会加载存储在“%LocalAppData%”文件夹中的宏。| +| DisableBpaDownload | TE3、CLI、TE2 | 无法从网络下载 Best Practice Analyzer 规则。存储在本地或与模型一起存储的规则仍可正常使用。| +| DisableWebDaxFormatter | TE3、CLI、TE2 | 已禁用将代码发送到 daxformatter.com 的 DAX 格式化工具。Tabular Editor 3 仍提供其内置的格式化工具,该工具不会通过网络发送任何内容。| +| DisableErrorReports | TE3 | 用户无法向 Tabular Editor 支持团队发送错误或崩溃报告。| +| DisableTelemetry | TE3、CLI | 不收集匿名使用数据,也不将此类数据发送给 Tabular Editor 支持团队。| +| DisableDaxOptimizer | TE3 | DAX Optimizer 集成不可用。| +| DisableDaxOptimizerUpload | TE3 | 用户无法通过 DAX Optimizer 集成上传 VertiPaq Analyzer 文件。当强制执行“DisableDaxOptimizer”时隐含。| +| RequireDaxOptimizerObfuscation | TE3 | 用户无法通过 DAX 优化器集成上传明文 VertiPaq 分析器文件;只能上传混淆的文件。当强制执行“DisableDaxOptimizer”或“DisableDaxOptimizerUpload”时隐含。| +| DisableDaxPackageManager | TE3 | DAX 包管理器不可用。| +| DisableAi | TE3 | 所有 AI 功能均已关闭:AI 助手、MCP 服务器和所有由 AI 提供支持的功能均不可用,应用程序启动时不会加载任何与 AI 相关的项,并且所有存储的提供商配置(包括 API 密钥)都将被清除。| +| DisableAiChat | TE3 | AI 助手聊天面板不可用。其他 AI 功能(包括 MCP 服务器)不受影响。| +| DisableMcpServer | TE3 | MCP 服务器不可用,因此外部代理工具无法连接到 Tabular Editor 3。AI 助手聊天不受影响。| +| RequireMcpAccessToken | TE3 | 连接到MCP服务器的客户端必须出示**“工具”>“MCP服务器…”**对话框中显示的访问令牌,用户无法关闭该要求。| +| RequireNativeLibrarySignatureVerification | TE3 | Tabular Editor 3 在加载代码编辑器库 `Scintilla.dll` 和 `Lexilla.dll` 之前,会验证其 Authenticode 签名。如果计算机无法验证发布者的证书链,代码编辑器将无法启动,Tabular Editor 3 将关闭。在组策略编辑器中,此策略的名称为**要求对代码编辑器支持库进行签名验证**。| ### 在 TE CLI 中 -在 Windows 上,Tabular Editor CLI 会遵循上文标记为 **CLI** 的策略,并按与 Tabular Editor 3 相同的顺序读取相同的键。它也会遵循下方[企业策略](#scripts-and-macros)中的 `BlockUnsafeScripts`,适用于 `te script`、`te macro run` 和 `te bpa run --fix`。 +在 Windows 上,Tabular Editor CLI 遵循上述标记为 **CLI** 的策略,以与 Tabular Editor 3 相同的顺序读取相同的键。它还遵循以下[企业策略](#scripts-and-macros)中的 `BlockUnsafeScripts`,适用于 `te script`、`te macro run` 和 `te bpa run --fix`。 -被拒绝的操作不会悄无声息。 `te` 会指出拒绝该操作的策略,并以非零代码退出,因此流水线步骤会失败,而不是看起来成功却什么也没做。 +被拒绝的操作不会静默处理。`te` 会指明拒绝该操作的策略,并以非零代码退出,因此管道步骤会失败,而不是显示为成功但未执行任何操作。 -CLI 没有版本之分,因此,在桌面应用中要求使用 Tabular Editor 3 企业版的策略,CLI 都会直接应用,无论该计算机持有什么许可证。 +CLI 没有版本,因此,无论计算机持有何种许可证,CLI 都会直接应用要求桌面应用程序使用 Tabular Editor 3 企业版的策略。 ## 企业策略 -这些策略决定 C# Script 可以执行哪些操作,并配置 AI Assistant 和 MCP 服务器。它们都要求使用 Tabular Editor 3 企业版,并且应位于 `Tabular Editor ApS\TE3` 下;但 `BlockUnsafeScripts` 例外,Tabular Editor CLI 也会遵循它,因此它应放在共享的 `Tabular Editor ApS` 键中。如果只想让两者中的一个生效,请改为将其放在 `TE3` 或 `TECLI` 下。 +这些策略决定了 C# 脚本可以执行的操作,并配置 AI 助手和 MCP 服务器。它们都需要 Tabular Editor 3 企业版,并属于 `Tabular Editor ApS\TE3` 下 - 但 `BlockUnsafeScripts` 除外,Tabular Editor CLI 也遵循该策略,因此它属于共享的 `Tabular Editor ApS` 项。改为将其置于 `TE3` 或 `TECLI` 下,以便仅影响两者之一。 ### 脚本和宏 -| 值 | 类型 | 作用 | -| ------------------ | --- | ------------------------------------------------------------------------------------------ | -| BlockUnsafeScripts | 开/关 | 仅当 C# Script 和宏的操作限定在语义模型范围内时,才允许使用。凡是读取或写入文件、访问网络、启动其他程序、引入外部代码,或直接向服务器发送命令的脚本,都会在执行前被拒绝。 | +|值|类型|作用| +|--|--|--| +| BlockUnsafeScripts | 开/关 | 仅当 C# 脚本和宏位于语义模型内时,才允许使用它们。对于读取或写入文件、访问网络、启动其他程序、引入外部代码或直接向服务器发送命令的脚本,系统会在其运行之前拒绝。| -无论脚本在哪里运行,此限制都适用:脚本文档中的 **运行脚本** 和 **运行并预览**,Best Practice Analyzer 中的 **应用修复**,AI Assistant、MCP 服务器,以及命令行中的 `te script`、用于宏的 `te macro run` 和 `te bpa run --fix`。被拒绝的脚本不算脚本执行失败。模型不会受到任何影响,错误列表仍为空,并且 **脚本未运行** 对话框会显示对应的策略以及脚本使用了哪些功能。 +无论脚本在何处运行,此限制均适用:脚本文档中的**运行脚本**和**运行并预览**、Best Practice Analyzer 中的**应用修复**、AI 助手、MCP 服务器以及命令行中的 `te script`、`te macro run` 和 `te bpa run --fix`。被拒绝的脚本并不是失败的脚本。没有任何内容到达模型,错误列表保持为空,并且**脚本未运行**对话框会列出策略以及脚本所使用的内容。 -超出模型范围的宏不会出现在任何菜单中,因此无法被误运行。它仍会列在 **视图 > 宏** 中,并且其 **Blocked** 列会被填充;你仍然可以打开并编辑它,这样就能把它改回允许范围内,而不必从头重写。这类宏可以保存,界面也会提示已保存,但实际上无法运行。 +超出模型范围的宏会被从每个菜单中排除,因此不会被意外运行。它仍列在**“视图”>“宏”**下,其**“已阻止”**列已填写,并且仍可打开和编辑,因此可以将其带回界限内,而无需从头开始重写。保存此类宏成功,并显示其已保存但不会运行。 -是否算作“保持在模型范围内”,是通过分析已编译的脚本来判断的,而不是通过搜索脚本文本。因此,任何通过间接方式到达同一位置的途径——反射、表达式树、`Activator`、`AppDomain`、XML 读取器或反序列化——同样会被拒绝。在内置的[辅助方法](xref:script-helper-methods)中,`SaveFile`、`ExecuteCommand` 和 `Bpa.ExportCsv` 这三个会向模型外部写入,因此被视为不安全;仅执行读取的方法则不算,包括 `ReadFile`、`ExecuteDax`、`EvaluateDax`、`ExecuteReader` 和 `ExportProperties`。如需从脚本作者的角度了解同一规则,请参阅[管理员策略](xref:csharp-scripts#administrator-policies)。 +是否算作停留在模型内是由分析已编译的脚本而非搜索其文本来决定的,因此通往同一位置的间接路径(反射、表达式树、`Activator`、`AppDomain`、XML 读取器或反序列化)也会被拒绝。在内置的[帮助程序方法](xref:script-helper-methods)中,在模型外部写入的三个方法 `SaveFile`、`ExecuteCommand` 和 `Bpa.ExportCsv` 被视为不安全;而仅进行读取的方法,包括 `ReadFile`、`ExecuteDax`、`EvaluateDax`、`ExecuteReader` 和 `ExportProperties`,则不被视为不安全。请参阅[管理员策略](xref:csharp-scripts#administrator-policies),了解脚本作者方面的同一条规则。 -在组策略编辑器中,此项名为 **仅允许保持在模型范围内的脚本和宏**。由于它写入共享注册表项,因此它直接位于 **管理模板 > Tabular Editor** 下,而不是 **Tabular Editor 3** 子文件夹中。 +在组策略编辑器中,此策略名为**仅允许停留在模型内的脚本和宏**,并且由于它被写入共享项,因此它直接位于**管理模板 > Tabular Editor** 下,而不是位于**Tabular Editor 3** 子文件夹中。 -### 权限上限 +### 权限限制 -其中每一项都会为 AI Assistant 和 MCP 服务器可访问的某一类资源设定上限。可接受的值为 `Deny`、`Read` 和 `Write`,但模型数据除外,因为对模型数据来说,`Read` 已是最高且有意义的设置。 +其中每一项都对 AI 助手和 MCP 服务器可以访问的某种资源设定了上限。可接受的值为 `Deny`、`Read` 和 `Write`,但模型数据除外,对于模型数据,`Read` 是最高有意义的设置。 -上限会限制用户可授予的权限:任何高于上限的现有权限都会被下调到该上限;**工具 > 偏好 > AI 功能 > 权限** 下对应的选项以及 **工具 > MCP Server...** 对话框中的对应选项都会显示为只读;AI Assistant 也不会再请求无法授予的权限。任何授权都不能高于上限——无论是常设权限、针对单个模型授予的权限,还是在早期版本中授予的权限。用户自己在偏好中的选择不会被改动,因此如果移除此策略,该选择会恢复生效。 +限制对用户可以授予的权限设置上限:高于该限制的现有权限将被降至该限制,**工具 > 首选项 > AI 功能 > 权限**下的匹配选项以及**工具 > MCP 服务器…**对话框中的匹配选项将显示为只读,并且 AI 助手将不再请求无法授予的权限。任何授权都不能超过限制——无论是长期权限、针对单个模型的权限,还是在早期版本中授予的权限。用户的偏好设置中保留其自己的选择,因此如果删除策略,该选择将恢复。 -| 值 | 可接受的值 | 限制对以下内容的访问…… | -| ------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| MaxModelMetadataAccess | Deny, Read, Write | 当前打开模型的元数据:表、列和度量值名称、表达式、说明、Best Practice Analyzer 结果以及 VertiPaq 统计信息。 `Write` 还允许助手对模型运行其自身的 C# Script。当设为 `Deny` 时,与当前打开模型有关的任何内容都不会发送——没有模型摘要、没有模型更改通知,也没有当前选择。 | -| MaxModelDataAccess | Deny, Read | 模型中的数据值,也就是 DAX 查询的结果。 | -| MaxBpaAccess | Deny, Read, Write | Best Practice Analyzer 规则。 `Read` 允许列出规则并运行分析;`Write` 还允许添加和修改规则。 | -| MaxDocumentsAccess | Deny, Read, Write | 用户当前打开的文档,例如 C# Script 脚本和 DAX 查询。 `Read` 允许读取其内容;`Write` 还允许对其进行修改。 | -| 最大宏访问权限 | 拒绝、读取、写入 | 用户的宏库。 | -| McpMaxModelMetadataAccess | Deny, Read, Write | 同样的五类资源,但仅适用于 MCP 服务器。 | -| McpMaxModelDataAccess | Deny, Read | | -| McpMaxBpaAccess | Deny, Read, Write | | -| McpMaxDocumentsAccess | 拒绝、读取、写入 | | -| Mcp 最大宏访问权限 | Deny, Read, Write | | +|值|可接受的值|限制对……的访问| +|--|--|--| +| MaxModelMetadataAccess | 拒绝、读取、写入 | 打开模型的元数据:表、列和度量值名称、表达式、描述、Best Practice Analyzer 结果和 VertiPaq 统计信息。`Write` 还允许助手对模型运行其自身的 C# 脚本。如果设置为“拒绝”,则完全不会发送有关打开的模型的任何信息:没有模型摘要,没有模型已更改的通知,也没有当前所选内容。| +| MaxModelDataAccess | 拒绝、读取 | 来自模型的数据值,即 DAX 查询的结果。| +| MaxBpaAccess | 拒绝、读取、写入 | Best Practice Analyzer 规则。`Read` 允许列出规则并运行分析;`Write` 还允许添加和更改规则。| +| MaxDocumentsAccess | 拒绝、读取、写入 | 用户已打开的文档,例如 C# 脚本和 DAX 查询。`Read` 允许读取其内容;`Write` 还允许对其进行更改。| +| MaxMacrosAccess | 拒绝、读取、写入 | 用户的宏库。| +| McpMaxModelMetadataAccess | 拒绝、读取、写入 | 仅针对 MCP 服务器的相同五项资源。| +| McpMaxModelDataAccess | 拒绝、读取 | | +| McpMaxBpaAccess | 拒绝、读取、写入 | | +| McpMaxDocumentsAccess | 拒绝、读取、写入 | | +| McpMaxMacrosAccess | 拒绝、读、写 | | -这五个 `McpMax...` 值仅适用于 MCP 服务器。当其中某个值未设置时,MCP 服务器会继承对应的 `Max...` 限制。它们只能降低该限制,不能提高,因此无人值守代理的权限绝不会超过交互式助手。 +五个“McpMax…”值仅适用于 MCP 服务器。当其中一个未设置时,MCP 服务器将继承相应的 `Max...` 限制。它们只能降低该限制,绝不能提高该限制,因此无人值守代理的权限绝不能超过交互式助手的权限。 -### AI 提供商 +### AI 提供程序 -| 值 | 类型 | 可接受的值 | 用途 | -| ---------------------- | -- | -------------------------------------------- | ----------------------------------------------------------------------------- | -| AiProvider | 选项 | None, OpenAI, Anthropic, AzureOpenAI, Custom | 将 AI 助手锁定为仅使用一个提供商。 `None` 会关闭 AI 助手;MCP 服务器不受影响。 | -| AiEndpoint | 地址 | | 锁定请求发送到的端点或基础 URL,例如内部 Gateway 或 Azure OpenAI 资源。 | -| AiModel | 姓名 | | 锁定模型或 Azure OpenAI 部署名称。聊天面板中的模型选择器会被替换为一个仅作显示的指示器,因此用户无法切换模型。 | -| AiOrganizationId | 姓名 | | 锁定 OpenAI 请求的计费组织。 | -| AiProjectId | 姓名 | | 锁定 OpenAI 请求的计费项目。 | -| AiAllowedProviders | 列表 | 上述任一提供商名称 | 限制用户可配置的提供商。即使未在列表中,`AiProvider` 设置的提供商也始终允许使用,且始终提供 `None`——允许列表并不能阻止用户关闭助手。 | -| AiAllowedEndpointHosts | 列表 | 主机名 | 限制端点可指向的主机,例如 `gateway.contoso.com` 或 `*.contoso.com`。 | +|值|类型|可接受的值|作用| +|--|--|--|--| +| AiProvider | 选择 | None、OpenAI、Anthropic、AzureOpenAI、Custom | 将 AI 助手锁定到一个提供商。`None` 会关闭 AI 助手;MCP 服务器不受影响。| +| AiEndpoint | 地址 | | 锁定请求发送到的端点或基本 URL,例如内部网关或 Azure OpenAI 资源。| +| AiModel | 名称 | | 锁定模型或 Azure OpenAI 部署名称。聊天面板中的模型选择器被一个普通指示器替换,因此用户无法切换模型。| +| AiOrganizationId | 名称 | | 锁定向其计费的 OpenAI 组织请求。| +| AiProjectId | 名称 | | 锁定 OpenAI 项目请求的计费对象。| +| AiAllowedProviders | 列表 | 上述任何提供程序名称 | 限制用户可以配置的提供程序。无论是否列出,`AiProvider` 设置的提供商均被允许,并且始终提供“无” - 允许列表并不是阻止用户关闭助手的办法。| +| AiAllowedEndpointHosts | 列表 | 主机名 | 限制端点可以指向的主机,例如 `gateway.contoso.com` 或 `*.contoso.com`。| -锁定的设置会在 **工具 > 偏好 > AI 功能 > AI 助手** 下显示为只读;无论用户之前如何选择,AI 助手都会使用锁定的配置。不会向用户自己的偏好中写入任何内容,因此如果移除该策略,提供程序、终结点、模型和 API 密钥将恢复为用户原先设置的值。策略绝不会分发 API 密钥。 +锁定的设置在**工具 > 首选项 > AI 功能 > AI 助手**下显示为只读,无论用户之前选择了什么,AI 助手都会使用锁定的配置。用户的个人偏好设置中不会写入任何内容,因此如果删除该策略,其提供商、端点、模型和 API 密钥将恢复。API 密钥绝不会通过策略分发。 -主机名仅与终结点 URL 的主机部分匹配。匹配时不区分大小写,也会忽略端口。前导 `*.` 可匹配某个域的子域,但不包括该域本身,因此如果两者都需要,请同时列出。只要设置了终结点,此列表就会对所有提供程序生效,因此无法通过 base URL 覆盖来绕过它。 +主机名仅与端点 URL 的主机部分进行匹配。匹配时忽略大小写,并忽略端口。开头的“*.”涵盖域的子域,但不涵盖域本身,因此如果两者都需要,请同时列出。每当设置端点时,该列表都适用于每个提供商,因此不能使用基准 URL 覆盖来绕过它。 -策略不允许的配置会被拒绝。AI 助手不会发送请求,而是说明是哪条规则拒绝了该配置:提供程序不在允许列表中、终结点主机不在主机允许列表中、在主机允许列表生效时终结点不是有效 URL,或者已锁定的 Azure OpenAI 或 Custom 提供程序完全没有终结点。 +政策不允许的配置将被拒绝,AI 助手会说明是哪条规则拒绝了该配置,而不是发送请求:不在允许列表中的提供商、不在主机允许列表中的端点主机、在适用主机允许列表时不是有效 URL 的端点,或者根本没有端点的已锁定 Azure OpenAI 或自定义提供商。 ### 自定义指令 -| 值 | 类型 | 作用 | -| ----------------------------- | --- | ---------------------------------------------------------------------------------------------------- | -| AiCustomInstructionsPath | 路径 | 指定一个“自定义说明”文件夹;除了产品随附的说明外,AI 助手还会为每个用户加载该文件夹中的内容。支持指向只读网络共享的 UNC 路径。如果组织说明与用户自己的说明使用相同的标识符,则以组织说明为准。 | -| DisableUserCustomInstructions | 开/关 | AI 助手会忽略用户放在自己文件夹中的“自定义说明”,用于打开该文件夹的按钮也将被禁用。产品随附的说明以及任何组织文件夹中的说明仍会加载。 | +|值|类型|作用| +|--|--|--| +| AiCustomInstructionsPath | 路径 | 指定一个自定义指令文件夹的名称,除了产品随附的指令外,AI 助手还会为每个用户加载该文件夹中的指令。支持指向只读网络共享的 UNC 路径。如果组织指令和用户自己的指令具有相同的标识符,则以组织指令为准。| +| DisableUserCustomInstructions | 开/关 | AI 助手会忽略用户放置在自己文件夹中的自定义指令,并且用于打开该文件夹的按钮会被禁用。产品随附的指令以及任何组织文件夹仍会加载。| ### MCP 服务器 -| 值 | 类型 | 作用 | -| ---------------- | --------------- | ------------------------------------------------------------------------------------- | -| McpDisabledTools | 列表 | 指定永远不会提供给已连接客户端的 MCP 工具名称。列出的工具不会出现在客户端的工具列表中,即使客户端按名称请求其中某个工具,也会拒绝执行。 AI 助手聊天功能不受影响。 | -| McpPort | 数值范围:1024–49151 | 固定 MCP 服务器侦听的端口,这样整个组织就可以共享同一份客户端配置。默认值为 42100。服务器始终只侦听回环地址。 | +|值|类型|作用| +|--|--|--| +| McpDisabledTools | 列表 | 从不向已连接的客户端提供的 MCP 工具的名称。列出的工具不在客户端的工具列表中,即使客户端按名称请求某个工具,该工具也拒绝运行。AI 助手聊天不受影响。| +| McpPort | 数字,1024 至 49151 | 锁定 MCP 服务器侦听的端口,以便一个客户端配置可以在整个组织中共享。默认值为 42100。服务器仅在环回地址上侦听。| ### 审计日志 -Tabular Editor 3 会在本地保留 AI 助手和 MCP 服务器活动记录——包括工具调用、权限决策、配置以及服务器会话。不会记录提示或响应的文本内容。 +Tabular Editor 3 保留 AI 助手和 MCP 服务器活动的本地记录,包括工具调用、权限决策、配置和服务器会话。提示或回复的文本绝不会被记录。 -此记录功能仅在企业版中提供。在企业版、咨询版和试用版许可证下,会写入该记录;并且在 **工具 > 偏好 > AI 功能** 和 **工具 > MCP 服务器...** 对话框中会显示 **打开审计文件夹**。在 Desktop 版和 Business 版中,以及在许可证激活之前,不会写入任何内容,也不会创建文件夹,并且两个位置都不会显示该按钮。参见 @ai-audit-log。 +记录是企业版功能。在企业版、咨询版和试用版许可证中,该记录会被写入,并且**打开审计文件夹**会显示在**工具 > 首选项 > AI 功能**以及**工具 > MCP 服务器……**对话框中。在 Desktop 和 Business 版本中,以及在激活许可证之前,不会写入任何内容,不会创建任何文件夹,也不会显示任何按钮。请参阅 @ai-audit-log。 -| 值 | 类型 | 作用 | -| ----------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| AiAuditLogPath | 路径 | 重定向审计日志,以便集中收集。支持指向网络共享的 UNC 路径。未设置该策略时,日志会写入 `%LocalAppData%\TabularEditor3\AI\audit`,每天生成一个 `ai-audit-.jsonl` 文件;记录的脚本存放在 `audit\scripts\` 下。 | -| AiAuditLogRetentionDays | 数值范围:0–3650 | 保留审计日志的天数;更旧的文件会被删除。 `0` 表示全部保留。默认值为 30 天。 | +|值|类型|作用| +|--|--|--| +| AiAuditLogPath | 路径 | 重定向审计日志,以便集中收集。支持指向网络共享的 UNC 路径。未设置策略时,日志将写入 `%LocalAppData%\TabularEditor3\AI\audit`,每天一个 `ai-audit-.jsonl` 文件,记录的脚本位于 `audit\scripts\` 下。| +| AiAuditLogRetentionDays | 数字,0 至 3650 | 保留多少天的审计日志;较旧的文件将被删除。“0”表示保留所有内容。默认为 30 天。| -## 没有企业版时会发生什么 +## 没有企业版会发生什么 -企业策略绝不会被悄悄忽略。如果上面的企业版表格中设置了任何值——哪怕只设置了一个 Tabular Editor 无法解析的值——而已安装的 Tabular Editor 3 又未获得企业版许可,AI Assistant 和 MCP 服务器都会拒绝启动;AI Assistant 还会提示你的组织已配置需要 Tabular Editor 3 企业版的 AI 策略,并点名列出相关值。 Tabular Editor 3 中的其他所有功能仍可正常运行,上述通用策略也会继续生效。 +企业策略绝不会被悄然忽略。如果上述企业版表格中的任何值已设置(即使只有一个 Tabular Editor 无法解释),并且已安装的 Tabular Editor 3 副本未获得企业版许可证,则 AI 助手和 MCP 服务器将拒绝启动,AI 助手将报告您的组织已配置需要 Tabular Editor 3 企业版的 AI 策略,并指明相关值。Tabular Editor 3 中的其他所有功能仍可正常运行,上述常规策略仍将继续执行。 -当某个值无法被解释时,企业策略也会采用“默认拒绝”,即 fail closed 的方式。如果权限限制值写错了,会拒绝访问该资源,而不会被当作“无限制”;如果提供程序名称不被 Tabular Editor 识别,AI Assistant 就会不可用,而不会回退到用户自己的选择。 +当无法解释某个值时,企业策略也会以“故障关闭”的方式处理。如果权限限制输入有误,则会拒绝资源,而不是被解读为“无限制”;如果提供商名称是 Tabular Editor 无法识别的,则会使 AI 助手不可用,而不是回退到用户自己的选择。 -`BlockUnsafeScripts` 也会以同样的默认拒绝方式处理,而且有必要确切了解它的行为,因为它影响的不只是 AI 相关界面。如果当前安装的副本未获得企业版许可,只要存在该值,就会阻止**所有**脚本和宏运行,无论是否安全,并显示一条消息,说明所需的版本;宏会从菜单中消失,直到激活企业版许可证,且激活后无需重启就会恢复到菜单中。读取方无法解析的值会强制执行限制,而不是解除限制。显式的 `0` 不会强制实施该限制,但仍会被视为已配置,因此它同样会让 AI 相关界面只能在企业版中使用。 +`BlockUnsafeScripts` 以同样的方式失效并关闭,值得确切了解其具体方式,因为它影响的范围超出了 AI 界面。在未获得企业版许可证的副本上,如果存在该值,则会阻止**所有**脚本和宏(无论是否安全)运行,并显示一条消息,指明所需的版本;宏将从菜单中移除,直到激活企业版许可证,然后它们将返回菜单,无需重启。如果读取器无法解释某个值,则会强制执行限制,而不是解除限制。显式的 `0` 不会强制执行此限制,但仍被视为已配置,因此它也会将 AI 界面置于 Enterprise 版的门槛之外。 -要在没有企业版许可证的情况下关闭所有 AI 功能,请使用通用 `DisableAi` 策略。 +若要在没有企业版许可证的情况下关闭所有 AI 功能,请使用通用 `DisableAi` 策略。 -## 查看当前生效的策略 +## 查看哪些策略处于生效状态 -打开 **工具 > 偏好 > Tabular Editor > 更新和反馈**。当设置了任意策略时,**由你的组织管理**部分会列出 Tabular Editor 找到的每个值、该值本身,以及它来自哪个注册表项和注册表配置单元。 Tabular Editor 无法解释的值会标记为 _(无效)_,这是找出看似没有效果的策略中拼写错误的最快方法。 +打开**工具 > 首选项 > Tabular Editor > 更新和反馈**。设置任何策略时,“**由您的组织管理**”部分会列出 Tabular Editor 找到的每个值、值本身以及其所属的注册表项和配置单元。Tabular Editor 无法解释的值会被标记为 *(无效)*,这是在看似不起作用的策略中找到拼写错误的最快方法。 -在 **偏好** 的其他位置,以及 **工具 > MCP Server...** 对话框中,凡是被策略锁定或限制的控件都会显示为只读,并带有工具提示,说明该设置由你的组织策略控制。 +在**“首选项”**的其他位置以及**“工具”>“MCP 服务器...”**对话框中,策略已锁定或限制的控件将以只读形式显示,并带有工具提示,说明该设置受贵组织策略的控制。 ## 使用管理模板 -Tabular Editor 3.27 及更高版本会安装一对组策略管理模板,因此可在组策略编辑器中设置上述策略,而不必直接编辑注册表。你可以在安装目录下的 `Policies` 文件夹中找到它们,默认路径为 `C:\Program Files\Tabular Editor 3\Policies`: +Tabular Editor 3.27 及更高版本会安装一对组策略管理模板,因此上述策略可以从组策略编辑器中设置,而无需编辑注册表。您可以在安装文件夹的“Policies”文件夹中找到它们,默认情况下,该文件夹为“C:\Program Files\Tabular Editor 3\Policies”: - `TabularEditorApS.admx` - `en-US\TabularEditorApS.adml` -若要在单台计算机上使用它们,请将这两个文件复制到 `%SystemRoot%\PolicyDefinitions`,并保留 `en-US` 文件夹结构: +要在单台计算机上使用它们,请将这两个文件复制到 `%SystemRoot%\PolicyDefinitions`,并保留 `en-US` 文件夹结构: ``` C:\Windows\PolicyDefinitions\TabularEditorApS.admx C:\Windows\PolicyDefinitions\en-US\TabularEditorApS.adml ``` -若要在整个域中使用它们,请改为将它们复制到域控制器上的中央存储,并保留相同的目录结构: +要在整个域中使用它们,请将它们复制到域控制器上的中央存储,并保持相同的结构: ``` \\\SYSVOL\\Policies\PolicyDefinitions\TabularEditorApS.admx \\\SYSVOL\\Policies\PolicyDefinitions\en-US\TabularEditorApS.adml ``` -然后打开本地组策略编辑器 (`gpedit.msc`) 或组策略管理编辑器,并查看以下位置: +然后,打开本地组策略编辑器 (`gpedit.msc`) 或组策略管理编辑器,查看以下位置: -- 整台计算机范围的策略:**计算机配置 > 管理模板 > Tabular Editor** -- 按用户生效的策略位于 **用户配置 > 管理模板 > Tabular Editor** 下 +- **计算机配置 > 管理模板 > Tabular Editor**,用于查看全机策略 +- **用户配置 > 管理模板 > Tabular Editor**,用于针对每个用户的策略 -Tabular Editor 3 与 CLI 共用的策略直接位于 **Tabular Editor** 下。仅 Tabular Editor 3 会遵循的策略位于 **Tabular Editor > Tabular Editor 3** 下;AI 助手、MCP 服务器和 DAX优化器集成则分别位于各自的子文件夹中。 +Tabular Editor 3 和 CLI 共享的策略直接位于**Tabular Editor**下方。仅 Tabular Editor 3 适用的策略位于**Tabular Editor > Tabular Editor 3** 下,AI 助手、MCP 服务器和 DAX 优化器集成位于各自的子文件夹中。 -将策略设置为 **已启用** 会写入其注册表值。将其设置为 **已禁用**,或保留为 **未配置**,表示该策略不会被强制执行。这些模板不会写入旧版 `Kapacity\Tabular Editor` 键,因此如果某项策略还需要作用于 Tabular Editor 2,请手动设置该键。 +将策略设置为**已启用**会写入其注册表值。将其设置为**禁用**,或将其保留为**未配置**,则表示该策略未实施。模板不会写入旧的 `Kapacity\Tabular Editor` 键,因此,如果策略还需要应用于 Tabular Editor 2,请手动设置该键。 -对于企业版策略,**已禁用** 会删除注册表值,而不是写入 `0`。这是刻意设计的:只要存在任何企业版相关的值,AI 助手和 MCP 服务器就会受到企业版许可证检查,因此管理员刚关闭的策略不能遗留任何值。 +对于企业版策略,**Disabled** 会删除注册表值,而不是写入“0”。这是有意的:只要存在 Enterprise 值,就会将 AI 助手和 MCP 服务器置于 Enterprise 许可证检查之后,因此管理员刚刚禁用的策略绝不能留下任何值。 -## 禁用 Web 通信 +## 禁用网络通信 -如果希望确保 Tabular Editor 不会发起任何 Web 请求,请设置 `DisableUpdates`、`DisableBpaDownload`、`DisableWebDaxFormatter`、`DisableErrorReports`、`DisableTelemetry`、`DisableDaxOptimizer`、`DisableDaxPackageManager` 和 `DisableAi` 策略。 +如果您想确保 Tabular Editor 不执行 Web 请求,请指定 `DisableUpdates`、`DisableBpaDownload`、`DisableWebDaxFormatter`、`DisableErrorReports`、`DisableTelemetry`、`DisableDaxOptimizer`、`DisableDaxPackageManager` 和 `DisableAi` 策略。 > [!NOTE] -> 即使已指定上述策略,Tabular Editor 3 仍会偶尔向 `https://api.tabulareditor.com` 发起请求,用于许可证验证。如果 Tabular Editor 3 无法访问此终结点(例如由于防火墙或代理),用户就必须每 30 天为该产品执行一次[手动激活](xref:installation-activation-basic#manual-activation-no-internet)。 +> 即使指定了上述策略,Tabular Editor 3 仍会出于许可证验证的目的,不时向 `https://api.tabulareditor.com` 发出请求。如果 Tabular Editor 3 无法访问此端点(由于防火墙或代理服务器),用户将需要每 30 天[手动激活](xref:installation-activation-basic#manual-activation-no-internet)一次产品。 ## 禁用自定义脚本 -如果你想确保 Tabular Editor 不允许用户执行任意代码,请指定 `DisableCSharpScripts` 和 `DisableMacros` 策略。 +如果您想确保 Tabular Editor 不允许用户执行任意代码,请指定 `DisableCSharpScripts` 和 `DisableMacros` 策略。 -如果贵组织希望保留脚本功能,但不希望任何脚本访问文件系统、网络或其他程序,请改用 `BlockUnsafeScripts`。脚本和宏仍可对模型执行操作,只有超出模型范围的部分会被拒绝。该策略需要企业版;上面两项则适用于所有版本。 +如果您的组织希望保留脚本功能,但不想让任何脚本访问文件系统、网络或其他程序,请改用 `BlockUnsafeScripts`。脚本和宏将继续对模型执行操作,仅拒绝离开模型的那些部分。该策略需要企业版;上述两项策略适用于所有版本。 ## 禁用 AI 功能 -如果希望禁用所有 AI 功能,请设置 `DisableAi` 策略。这会阻止任何与 AI 相关的内容在启动时加载,并清除任何已存储的 API 密钥配置。它适用于所有版本,无需企业版许可证。 +如果您想禁用所有 AI 功能,请指定 `DisableAi` 策略。这可以防止任何与 AI 相关的功能在启动时加载,并清除所有已存储的 API 密钥配置。此策略适用于所有版本,无需企业版许可证。 -从 3.27.0 起,安装程序也会从全部六个键读取该策略,并遵循相同的优先级顺序。全新安装将不包含 AI 组件,而升级会将其从已安装该组件的计算机中移除。现有安装会保留 AI 文件直到下一次升级;在设置该策略期间,Tabular Editor 3 不会加载它们。将该值设置为 `1` 的 `REG_DWORD`:安装程序将 `1` 视为 _禁用_,将任何其他已存在的值视为 _未禁用_;而应用程序则接受任何非零值。参见[使用 DisableAi 策略强制执行该决定](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy),了解如何将功能选择与该策略一并部署。 +从 3.27.0 版本开始,安装程序也会从所有六个键读取该策略,并具有相同的优先级。新安装将不包含 AI 组件,升级将从已安装该组件的计算机中将其删除。现有安装会保留 AI 文件,直至下一次升级,并且在设置了该策略时,Tabular Editor 3 不会加载这些文件。将值设置为 `REG_DWORD` 的 `1`:安装程序将 `1` 视为*禁用*,将任何其他存在的值视为*未禁用*,其中应用程序接受任何非零数字。请参阅[使用 DisableAi 策略强制执行决策](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy),了解如何同时部署功能选择和策略。 -若要保留 AI 助手但限制其可执行的操作,请改用上述企业版策略:将权限上限设置为贵组织可接受的范围,将提供程序和终结点锁定到由贵方运营的 Gateway,并使用 `McpDisabledTools` 为已连接的代理禁用特定工具。 +要使 AI 助手保持可用,但限制其可能执行的操作,请改用上述企业策略:将权限限制设置为您的组织可以接受的范围,将提供程序和终结点锁定到您运营的网关,并使用 `McpDisabledTools` 来阻止已连接的代理使用个别工具。 diff --git a/localizedContent/zh/content/references/preferences.md b/localizedContent/zh/content/references/preferences.md index bd166bef5..f73c5f5ca 100644 --- a/localizedContent/zh/content/references/preferences.md +++ b/localizedContent/zh/content/references/preferences.md @@ -1,8 +1,8 @@ --- -uid: 偏好 -title: 管理偏好设置 -author: Daniel Otykier -updated: 2026-10-12 +uid: preferences +title: 控制偏好 +author: Morten Lønskov +updated: 2026-10-19 applies_to: products: - product: Tabular Editor 2 @@ -16,785 +16,573 @@ applies_to: - edition: Enterprise full: true --- +# Tabular Editor 3 首选项 -# Tabular Editor 3 偏好设置 +“首选项”对话框用于控制 Tabular Editor 3 的用户界面、文件格式、连接性、数据浏览、AI 功能和编辑器行为。 -不同组织的表格式 Data model 开发流程和工作流差异很大。为确保该工具能够适配尽可能多的工作流,Tabular Editor 3 高度可定制——不仅可以自定义用户界面的外观与使用体验,还支持配置更高级的选项,例如 Web 代理、更新和反馈、行数限制、超时、架构比较偏好等。 +本文介绍了 Tabular Editor 3 的“首选项”对话框以及您可以通过该对话框控制的设置。 -本文介绍 Tabular Editor 3 的“偏好设置”对话框,以及你可以通过该对话框控制的设置。 - -要打开“偏好设置”对话框,请依次选择 **工具 > 偏好**。 +要访问“首选项”对话框,请转到**工具 > 首选项**。 > [!NOTE] -> 所有 Tabular Editor 偏好设置都会针对每个 Windows 用户配置文件分别存储在 `%localappdata%\\TabularEditor3` 文件夹中。只需复制此文件夹中的内容,即可将你的设置迁移到另一台计算机。 +> 所有 Tabular Editor 首选项均针对每个 Windows 用户配置文件存储在“%localappdata%\TabularEditor3”文件夹中。只需复制此文件夹的内容,即可将您的设置迁移到另一台计算机。 > [!TIP] -> 在“偏好”对话框顶部使用搜索框,可快速找到特定设置。 +> 使用“偏好”对话框顶部的搜索框,可快速找到特定设置。 ## Tabular Editor > 功能 -![偏好设置:常规功能](~/content/assets/images/pref-general-features.png) +![首选项常规功能](~/content/assets/images/pref-general-features.png) ### Power BI -##### _允许不受支持的编辑_(已禁用) - -仅当将 Tabular Editor 3 作为 Power BI Desktop 的外部工具使用时,此选项才适用。选中后,连接到 Power BI Desktop 实例时,所有 TOM Data model 的建模属性都可供编辑。通常建议保持此项未选中,以免你无意中对 Power BI 文件做出 [Power BI Desktop 不支持的](xref:desktop-limitations) 更改。 - -##### _隐藏自动日期/时间警告_(已禁用) - -选中后,将不再显示有关 Power BI 自动日期/时间表的警告。当 Power BI Desktop 中启用“自动日期/时间”设置时,会创建计算表格,从而触发 Tabular Editor 3 内置 DAX 分析器的警告。 - -##### _在 DAX 首行换行_(已禁用) - -在 Power BI Desktop 中,由于公式栏显示 DAX 代码的方式,通常会在 DAX 表达式的第一行插入换行。如果你经常在 Tabular Editor 和 Power BI Desktop 之间来回切换,可以考虑启用此选项,让 Tabular Editor 3 自动插入换行符。 +**允许不受支持的编辑**(禁用):仅适用于 2025 年 6 月之前的 Power BI Desktop 版本,这些版本限制了外部工具可以执行的建模操作。选中此项后,在 Tabular Editor 3 连接到此类版本时,所有 TOM 属性都可进行编辑,包括[Power BI Desktop 不支持](xref:desktop-limitations)的更改。此设置对 2025 年 6 月或更高版本的 Power BI Desktop 无效。 -##### _仅适用于多行 DAX 表达式_(已启用) +**隐藏自动日期/时间警告**(禁用):选中时,将隐藏有关 Power BI 自动日期/时间表格的警告。当 Power BI Desktop 中的“自动日期/时间”设置启用时,这些警告就会出现。该设置会创建计算表格,从而在 Tabular Editor 3 的内置 DAX 分析器中触发警告。 -启用“DAX 首行换行”后,此子设置用于控制是否仅对多行 DAX 表达式添加换行。选中后,单行表达式将保持不变。 +**DAX第一行换行**(禁用):在 Power BI Desktop 中,由于公式栏显示 DAX 代码的方式,通常会在 DAX 表达式的第一行插入换行符。如果您经常在 Tabular Editor 和 Power BI Desktop 之间来回切换,不妨启用此选项,让 Tabular Editor 3 自动插入换行符。 -##### _默认 Power BI 身份验证模式_(集成) +**仅适用于多行DAX表达式**(已启用):当“DAX第一行换行”被启用时,此子设置控制是否仅对多行DAX表达式添加换行符。选中此选项后,单行表达式将保持不变。 -选择连接到 Power BI Dataset 时要使用的默认身份验证方法(集成、ServicePrincipal 或 MasterUser)。 +**默认Power BI身份验证模式**(集成):选择连接到Power BI数据集时使用的默认身份验证方法(集成、ServicePrincipal或MasterUser)。 ### 最佳实践分析器 -##### _在后台扫描最佳实践违规项_(已启用) +**在后台扫描最佳实践违规**(已启用):每当模型发生变化时,就在后台线程上运行最佳实践分析器。如果取消勾选,请从**Best Practice Analyzer** 窗口运行分析。对于大型模型或具有复杂规则的模型,后台扫描会降低编辑速度。 -如果未勾选,你需要在 Best Practice Analyzer 工具窗口中手动运行一次“最佳实践分析”,才能查看是否存在违规项。选中后,每当发生更改,都会在后台线程中持续扫描。对于非常大的模型,或包含非常复杂的最佳实践规则的模型,这可能会导致问题。 - -##### _内置 BPA 规则_(新用户默认启用) - -选择启用、禁用,或在使用 Tabular Editor 内置的 Best Practice Analyzer 规则前进行提示。这些内置规则覆盖了格式设置、元数据、模型布局、DAX 表达式和翻译等方面的关键最佳实践。全新安装默认会启用内置规则。 +**内置 BPA 规则**(对新用户启用):选择是否启用、禁用或提示使用 Tabular Editor 的内置 Best Practice Analyzer 规则。内置规则涵盖格式化、元数据、模型布局、DAX 表达式和翻译等方面的关键最佳实践。新安装将默认启用内置规则。 ### 通知 -##### _数据刷新通知_(已启用) - -勾选后,数据刷新操作完成时会显示通知。 - -### DAX 公式自动修正 - -##### _启用公式修复_(已启用) +**数据刷新通知**(已启用):选中此选项后,数据刷新操作完成后将显示通知。 -当对象被重命名或移动时,自动调整 DAX 表达式中的引用。此功能可确保你在重新组织模型时,DAX 代码仍然有效。 +### DAX 公式修正 -##### _粘贴时启用公式修复_(已启用) +**启用公式修正**(已启用):当对象被重命名或移动时,自动调整 DAX 表达式中的引用。此功能可确保在您重组模型时,您的 DAX 代码仍保持有效。 -在粘贴对象时,自动调整 DAX 表达式中的引用。这在表或模型之间复制度量值或计算列时非常有用。 +**启用粘贴时的公式修正**(已启用):粘贴对象时自动调整 DAX 表达式中的引用。这在表或模型之间复制度量值或计算列时非常有用。 -### Direct Lake - -##### _保存时自动刷新_(已启用) - -保存更改时自动刷新 Direct Lake 表,确保数据为最新。这样可确保你的 Direct Lake 模型与底层数据源保持同步。 +## Tabular Editor > 更新和反馈 -## Tabular Editor > 更新与反馈 - -![更新和反馈偏好](~/content/assets/images/pref-updates-and-feedback.png) +![更新和反馈首选项](~/content/assets/images/pref-updates-and-feedback.png) ### 更新 -##### _在更新后显示“开始使用”页面_(已启用) - -勾选后,Tabular Editor 更新后首次运行时会自动打开 **开始使用** 页面。它仅在**更新后**显示,不会在每次启动时都显示。你可以随时通过 **帮助 > 开始使用** 打开它。 - -##### _启动时检查更新_(已启用) +**在更新时显示“入门”页面**(已启用):选中此项后,在 Tabular Editor 更新后首次运行时,将自动打开**“入门”**页面。它**在更新时**显示,而不是在每次启动时显示。您可以随时通过**“帮助”>“入门”**打开它。 -勾选后,Tabular Editor 会在应用启动时检查是否有新版本。这可确保你及时获取最新功能和错误修复信息。 +**启动时检查更新**(已启用):在应用程序启动时检查是否有新版本。 -##### _仅限主要更新_(已禁用) +**仅主要更新**(禁用):选中时,仅主要版本更新会触发通知。次要更新和补丁更新将被忽略。此设置仅在选中**启动时检查更新**时可用。 -勾选后,只有主版本更新才会触发通知。次要版本和补丁更新会被忽略。只有勾选 _启动时检查更新_ 时,此设置才可用。 +您正在运行的版本显示在这些设置下方,同时还有一个**检查更新**按钮,可立即运行检查。 -在这些设置下方会显示你当前运行的版本,并提供一个 **检查更新** 按钮,可立即执行检查。 +### 由您的组织管理 -### 由你的组织管理 +如果管理员已配置[策略](xref:policies),则此页面将附加一个只读的**由您的组织管理**部分,其中列出 Tabular Editor 找到的每个策略值,格式为“名称 = 值”。将鼠标悬停在条目上,查看其来自哪个注册表项和配置单元。 -如果管理员已配置[策略](xref:policies),此页面会附加一个只读的 **由你的组织管理** 部分,其中按 `名称 = 值` 列出 Tabular Editor 找到的每个策略值。将鼠标悬停在某项上,可查看它来自哪个注册表项和注册表配置单元。 +Tabular Editor 无法解释的值会显示 `(invalid)` 标记,而不是被省略。该标记是查找看似不起作用的策略背后的拼写错误的最快方法,因此,当策略未生效时,请先在此处检查。 -Tabular Editor 无法解析的值不会被省略,而是会以 `(invalid)` 标记列出。该标记能最快帮你找出那些看似不起作用的策略背后的拼写错误,因此当策略未生效时,先检查这里。 - -没有适用策略时,不会显示此部分。被策略锁定或限制的设置,会在此对话框的其他位置以及 **工具 > MCP 服务器...** 对话框中以只读方式显示,并带有相应说明的工具提示。 +当不适用任何策略时,此部分将不存在。策略锁定或限制的设置在此对话框的其他位置以及**工具 > MCP 服务器……**对话框中以只读形式显示,并带有说明此情况的工具提示。 ### 使用数据和反馈 -##### _通过收集匿名使用数据帮助改进 Tabular Editor_(已启用) - -数据不包含任何可识别个人身份的信息,也不包含任何有关你的 Data model 的结构或内容的信息。如果你仍希望选择退出遥测,请取消选中此项。 - -##### _发送错误 Report_(已启用) - -勾选后,如果发生崩溃,Tabular Editor 会显示发送崩溃 Report 的选项。崩溃 Report 在调试时非常有帮助,所以如果你不介意,就保持勾选此项吧! - -## Tabular Editor > 部署 +**通过收集匿名使用数据帮助改进 Tabular Editor**(已启用):数据不包含任何个人身份信息,也不包含有关您的数据模型的结构或内容的任何信息。取消勾选此项,即可选择退出遥测数据收集。 -![模型部署偏好](~/content/assets/images/pref-model-deployment.png) +**发送错误报告**(已启用):选中此选项后,在发生崩溃时,Tabular Editor 将显示一个用于发送崩溃报告的选项。 -使用 Deployment Wizard 时,配置默认要部署的对象类型: +## Tabular Editor > 默认值 -##### _部署数据源_(已禁用) + -部署时包含数据源定义。如果你希望在部署模型更改的同时部署数据源连接字符串和设置,请启用此选项。 +**新模型兼容级别** (1600):设置新创建模型的默认兼容级别。选项与**新建模型**对话框中的选项相同: -##### _部署分区_(已禁用) +| 级别 | 目标 | +|---|---| +| 1200 | Azure Analysis Services / SQL Server 2016 及更高版本 | +| 1400 | Azure Analysis Services / SQL Server 2017 及更高版本 | +| 1500 | Azure Analysis Services / SQL Server 2019 及更高版本 | +| 1600 | Azure Analysis Services / SQL Server 2022 及更高版本 | +| 1700 | Azure Analysis Services / SQL Server 2025 及更高版本 | +| 1706 | Power BI/Fabric | -部署时包含分区定义。如果你希望在部署模型更改的同时部署分区配置,请启用此选项。 - -##### _部署刷新策略分区_(已禁用) - -部署时包含增量刷新策略分区。此选项用于控制是否部署由增量刷新策略创建的分区。 - -##### _部署模型角色_(已禁用) - -在部署时包含角色定义。若要部署行级安全性(RLS)和对象级安全性(OLS)角色,请启用此选项。 - -##### _部署模型角色成员_(已禁用) +1700 是 Analysis Services 支持的最高级别;1706 是总体最高级别,仅适用于 Power BI 和 Fabric。 -在部署时包含角色成员分配。若要部署安全角色的用户和组分配,请启用此选项。 +**使用最新兼容级别作为默认值**(已启用):自动为新模型使用最新的可用兼容级别。启用后,此选项将覆盖上述特定兼容级别设置,并且下拉菜单将被禁用。 -##### _部署共享表达式_(已禁用) +**新模型使用工作区数据库**(已启用):创建新模型时,在 Analysis Services 上自动创建工作区数据库。这使您能够在开发过程中立即测试和查询您的模型。 -部署时包括共享表达式(M 表达式)。如需部署 Power Query 共享表达式,请启用此选项。 +**默认保存模式**(AlwaysAsk):选择是否始终保存为文件(.bim)、文件夹(多个 JSON 文件)、TMDL(表格模型定义语言),或在保存时始终询问。选项:AlwaysAsk、File、Folder、TMDL。 -### 部署元数据 +**保存到磁盘时使用 PBIX 文件名**(已启用):保存从 PBIX 文件加载的模型时,使用 PBIX 文件名作为默认值。这可以保持 Power BI 文件与已保存模型元数据之间的命名一致性。 -##### _标注部署元数据_(已禁用) +**为新模型创建用户选项**(启用):自动为新模型创建 .tmuo(表格模型用户选项)文件。这些文件存储用户特定的设置,例如图表布局和窗口位置。 -将部署时间戳和用户信息作为注释添加到已部署的对象中。这有助于跟踪模型更改是在什么时候、由谁部署的。 +## Tabular Editor > 键盘 -### 备份设置 +![键盘映射](~/content/assets/images/keyboard-mappings.png) -##### _保存时备份_(已启用) +为所有 Tabular Editor 命令配置键盘快捷键。使用搜索功能快速查找特定命令,并为其分配或修改键盘快捷键,以匹配您偏好的工作流。 -在本地保存更改时创建模型备份。这样可在需要回退更改时提供一道安全保障。 +## Tabular Editor > 用户界面 -##### _备份保存位置_ +控制工具栏和菜单、显示模型源位置的多少、窗口布局、语言、辅助功能以及最近项目列表。 -指定存放保存备份的文件夹。默认情况下,除非指定位置,否则不会创建备份。 + -##### _部署时备份_(已启用) +### 工具栏和菜单 -在部署更改之前,为目标模型创建备份。这样可在需要时还原到先前版本。 +**在浮动窗口中显示工具栏**(启用):在您取消停靠到浮动窗口的文档和视图中显示工具栏。 -##### _备份位置_ +**隐藏非活跃工具栏**(启用):隐藏不适用于活跃文档或视图的工具栏。 -指定存放部署备份的文件夹。默认情况下,除非指定位置,否则不会创建备份。 +**隐藏非活跃菜单**(启用):隐藏不适用于活跃文档或视图的[动态菜单](xref:user-interface#dynamic-menus-context-dependent)。 -## Tabular Editor > 默认设置 +**隐藏版本号**(禁用):从标题栏中隐藏 Tabular Editor 3 的构建号和版本号。 - +**模型源详细信息**(完整路径):设置已加载模型的源位置在标题栏、状态栏连接项、文档选项卡工具提示以及最近文件和模型菜单的悬停文本中显示的程度: -##### _新模型兼容级别_(1600) +- **完整路径**:模型名称及其完整路径、服务器或工作区位置 +- **仅名称**:文件名、文件夹名称或数据库名称,不包含路径或服务器名称 +- **隐藏**:不显示模型名称,也不显示其位置。当您连接到服务器时,标题栏显示**模型已加载**,状态栏显示**已连接**。 -设置新建模型的默认兼容级别。可选项与 **新建模型** 对话框中的相同: +通过 @mcp-server 连接的代理会在同一级别接收模型标题。如果您在早期版本中选择了**隐藏模型源详细信息**,则此设置为**隐藏**。 -| 级别 | 目标 | -| ---- | ------------------------------------------ | -| 1200 | Azure Analysis Services / SQL Server 2016+ | -| 1400 | Azure Analysis Services / SQL Server 2017+ | -| 1500 | Azure Analysis Services / SQL Server 2019+ | -| 1600 | Azure Analysis Services / SQL Server 2022+ | -| 1700 | Azure Analysis Services / SQL Server 2025+ | -| 1706 | Power BI / Fabric | +### 搜索和替换 -1700 是 Analysis Services 支持的最高级别;1706 是总体最高级别,仅适用于 Power BI 和 Fabric。 +**非活跃时的对话框不透明度** (70% ):**查找和替换**对话框未获得焦点时的不透明度。 -##### _将最新兼容级别设为默认_(已启用) +### 布局 -新模型会自动使用最新可用的兼容级别。启用后,此设置会覆盖上方的特定兼容级别设置,并且下拉列表会被禁用。 +**记住窗口是否最大化**(启用):Tabular Editor 3 启动时,恢复主窗口的最大化状态。 -##### _新模型使用 Workspace 数据库_(已启用) +**记住窗口位置和大小**(已启用):Tabular Editor 3 启动时,恢复主窗口的位置和大小。 -创建新模型时,会在 Analysis Services 上自动创建一个 Workspace 数据库。这样你就可以在开发过程中立即测试并查询模型。 +### 语言 -##### _默认保存模式_(AlwaysAsk) +**用户界面语言**(英语):用户界面的语言。重启 Tabular Editor 3 以应用更改。 -选择保存时是始终保存为文件(.bim)、文件夹(多个 JSON 文件)、TMDL(Tabular Model Definition Language),还是每次保存都询问。选项:AlwaysAsk、File、Folder、TMDL。 +### 无障碍功能 -##### _保存到磁盘时使用 PBIX 文件名_(已启用) +**色盲模式**(禁用):在**TOM 资源管理器**的更改指示器和模型比较视图中,将自上次保存以来添加的对象标记为青色(否则将显示为绿色)。请参阅@accessibility。 -保存从 PBIX 文件加载的模型时,默认使用 PBIX 文件名。这可确保 Power BI 文件与已保存的模型元数据在命名上保持一致。 +### 最近项目 -##### _为新模型创建用户选项_(已启用) +**使用紧凑文件路径**(已启用):缩短最近文件和模型菜单中的长文件路径。将“模型源详细信息”设置为“完整路径”后,标题栏的位置部分也会缩短。 -为新模型自动创建 .tmuo(Tabular Model User Options)文件。这些文件会存储特定于用户的设置,例如图表布局和窗口位置。 +**显示的最近文件数** (10):最近文件菜单中的最大文件数,最多 50 个。 -## Tabular Editor > 键盘 +**显示的最近模型数**(10):最近模型菜单中的最大模型数,最多 50 个。 -![键盘映射](~/content/assets/images/keyboard-mappings.png) +**显示的最近服务器数** (10):连接到语义模型时**服务器**列表中服务器的最大数量,最多 50 个。已固定的服务器不计入其中,并且始终保留在列表中。请参阅 @xmla-as-connectivity。 -为所有 Tabular Editor 命令配置键盘快捷键。使用搜索功能可快速找到特定命令,并分配或修改其键盘快捷方式,使其符合你偏好的工作流程。 +**清除最近文件**、**清除最近模型**、**清除最近服务器**和**清除所有最近项目**:清除相应列表。**清除最近服务器**和**清除所有最近项目**会保留已固定的服务器及其保存的设置。 ## Tabular Editor > TOM Explorer -![Tom Explorer 设置](~/content/assets/images/unsaved-changes/preferences.png) +![TOM Explorer 设置](~/content/assets/images/unsaved-changes/preferences.png) -控制 TOM (Tabular Object Model) Explorer 如何显示模型,以及删除对象时的处理方式。 +控制 TOM(Tabular Object Model)Explorer 如何显示模型,以及您删除的对象会发生什么情况。 -用于决定树状结构中显示哪些对象类型的开关,例如度量值、列、层次结构、分区、显示文件夹和隐藏对象,并不属于偏好设置。这些开关位于 @tom-explorer-view 工具栏上,你可以按模型分别更改它们,而无需打开此对话框。 +决定哪些对象类型(例如度量值、列、层次结构、分区、显示文件夹和隐藏对象)显示在树中的切换开关不是偏好设置。它们位于 @tom-explorer-view 工具栏上,您可以在其中针对每个模型更改它们,而无需打开此对话框。 -### 显示与筛选 +### 显示和筛选 -##### _使用表格组_(已启用) +**使用表格组**(已启用):在 TOM Explorer 中对表格进行分组,例如将计算组、维度和事实表分开。Tabular Editor 在表格本身的注释中记录表格的组,因此分组会随模型一起移动。这是 Tabular Editor 内部的功能:其他客户端工具(包括 Power BI Desktop)都不会显示它。请参阅@table-groups。 -在 TOM Explorer 中对表进行分组,例如将计算组、维度表和事实表区分开来。 Tabular Editor 会将表的组别记录在表自身的注释中,因此分组信息会随模型一起保存。这是 Tabular Editor 的内部功能:任何其他客户端工具(包括 Power BI Desktop)都不会显示它。参见 @table-groups。 +**显示完整分支**(禁用):当您筛选树时,Tabular Editor 会显示与您的筛选字符串匹配的对象及其父级。启用此选项还可以显示匹配项的每个子项,无论子项本身是否与字符串匹配。 -##### _显示完整分支_(已禁用) - -当你对树状结构进行筛选时,Tabular Editor 会显示与筛选字符串匹配的对象及其父对象。启用此项后,还会显示每个匹配项的所有子对象,无论这些子对象本身是否匹配该字符串。 - -##### _突出显示关系_(已启用) - -突出显示与你所选表或列相关的关系,这样你就能一眼看出某列关联到了哪些对象。 +**突出显示关系**(已启用):突出显示涉及您所选表或列的关系,以便您可以一眼看出列与什么内容关联。 ### 未保存的更改 -这些设置用于控制如何在 TOM Explorer 和属性视图中标识[未保存的更改](xref:unsaved-changes)。 - -##### _标记有未保存更改的对象_(已启用) - -在 TOM Explorer 中,使用着色行和对象图标上的标记来突出显示与模型上次保存版本不同的对象:橙色表示已编辑对象,绿色表示已添加对象,红色表示已删除对象。包含已更改对象的表、文件夹和组会以斜线纹理填充。禁用后,已删除对象仍会根据下方设置保持可见,且 **显示更改** 工具栏筛选器仍然有效。使用 **用户界面 > 辅助功能** 下的 **色盲模式**,可将新增对象标记为蓝绿色而不是绿色。 - -##### _让已删除的对象保持可见_(直到保存模型) +这些设置控制如何在 TOM Explorer 和“属性”视图中显示[未保存的更改](xref:unsaved-changes)。 -控制已删除对象在 TOM Explorer 中以删除线形式保留在原位置可见的时长。右键单击已删除对象并选择 **还原**,即可将其恢复。选项: +**标记具有未保存更改的对象**(已启用):在 TOM Explorer 中突出显示与模型上次保存的版本不同的对象,使用带颜色的行和对象图标上的徽章:橙色表示已编辑的对象,绿色表示已添加的对象,红色表示已删除的对象。包含已更改对象的表、文件夹和组将显示阴影填充。禁用时,已删除的对象仍会根据以下设置保持可见,并且**显示更改**工具栏筛选器仍将有效。使用**用户界面 > 无障碍**下的**色盲模式**,将添加的对象标记为蓝绿色,而不是绿色。 -- **从不**:已删除对象会立即从 TOM Explorer 中消失。 -- **直到模型保存**:已删除对象会被视为未保存的更改,并在保存模型时消失。 -- **直到模型关闭**:已删除对象在整个编辑会话期间都会保持可见,并且可还原,即使期间多次保存也是如此。 +**使已删除的对象保持可见**(直到模型保存为止):已删除的对象在 TOM Explorer 中保持可见(带删除线)的时间,以及它们之前所在的位置。右键单击已删除的对象,然后选择**还原**以将其恢复。选项: -##### _将已删除对象集中到“已删除对象”节点下_(禁用) +- **永不**:已删除的对象会立即从 TOM Explorer 中消失。 +- **直到模型被保存**:已删除的对象被视为未保存的更改,并在模型被保存时消失。 +- **直到模型关闭**:在整个编辑会话中,即使在多次保存后,已删除的对象仍保持可见且可恢复。 -将表、层次结构、角色或表格组的已删除对象集中显示在各自容器末尾的单个 **已删除对象** 节点下,而不是分别显示在原来的位置。右键单击该节点并选择 **还原**,即可一次性还原全部对象。 +**将已删除对象归集到“已删除对象”节点下**(禁用):将表、层次结构、角色或表组的已删除对象归集到其容器末尾的单个**“已删除对象”**节点下,而不是显示在它们原先所在的位置。右键单击该节点并选择**还原**,即可一次性将所有对象还原。 -##### _在属性窗格中标记带有未保存更改的属性_(启用) - -在属性视图中,用带底色的行突出显示与模型上次保存版本不同的属性。禁用后,属性视图中的 **显示更改** 工具栏筛选器仍然有效。 +**在属性窗格中标记具有未保存更改的属性**(已启用):使用带颜色的行突出显示属性视图中与模型上次保存的版本不同的属性。禁用时,属性视图中的**显示更改**工具栏筛选器仍可使用。 ### 删除 -##### _始终显示删除警告_(已禁用) - -如果你希望 Tabular Editor 3 在删除任何对象时都要求你确认,请启用此设置。否则,Tabular Editor 3 只会在删除多个对象时,或删除被其他对象引用的对象时提示你确认。 +**始终显示删除警告**(禁用):要求您确认每次对象删除。如果取消选中,则仅在删除多个对象以及其他对象引用的对象时才会显示确认提示。 > [!NOTE] -> 在 Tabular Editor 3 中,所有删除操作都可以按 CTRL+Z 撤销。 +> 按下 CTRL+Z 可撤消 Tabular Editor 3 中的所有删除操作。 ### 本地化 -这些设置决定了当你在属性窗格中为对象选择 _货币_ 数字格式时,Tabular Editor 将写入的格式字符串。 - -##### _默认货币_(英语(美国)) - -用作货币格式字符串基础的格式约定。选择你希望采用其货币符号、小数分隔符和数字分组方式的区域设置。 - -##### _使用自定义货币符号_(禁用) +这些设置决定了当您在属性窗格中为对象选择“货币”数字格式时,Tabular Editor 写入的格式字符串。 -使用你自己的符号,而不是采用上方区域设置中的符号。仅在勾选此项时,下面三个设置才会生效。 +**默认货币**(英语(美国)):货币格式字符串所基于的格式化约定。选择您想要的货币符号、小数点分隔符和数字分组的区域设置。 -##### _自定义货币符号_ +**使用自定义货币符号**(禁用):提供您自己的符号,而不是从上面的区域设置中选取符号。以下三项设置仅在选中此项时适用。 -要使用的符号。仅输入符号本身,不要包含数字;空白字符会被忽略。 +**自定义货币符号**:要使用的符号。单独输入符号,不带数字;空格将被忽略。 -##### _自定义货币符号位置_(数字前) +**自定义货币符号位置**(数字之前):符号是在数值之前还是之后。 -指定符号位于数值之前还是之后。 - -##### _在数字和符号之间添加空格_(已禁用) - -使用空格将符号与数值分隔开。 +**在数字和符号之间添加空格**(禁用):用空格将符号与数值分隔开。 ## Tabular Editor > 复制/粘贴 - + 控制复制对象时包含哪些元数据: -##### _包含翻译_(已启用) - -随对象一起复制翻译元数据。启用后,复制对象时也会一并复制为其定义的所有翻译。 - -##### _包含透视_(已启用) - -复制对象时同时复制透视成员关系。启用后,复制的对象将与原对象属于相同的透视。 - -##### _包含 RLS_(已启用) +**包含翻译**(已启用):随对象一起复制翻译元数据。启用后,为已复制对象定义的任何翻译也将被复制。 -随对象一起复制行级安全性表达式。这适用于复制已定义 RLS 规则的表。 +**包含透视**(已启用):随对象一起复制透视成员资格。启用后,复制的对象将与原始对象属于相同的透视。 -##### _包含 OLS_(已启用) +**包含 RLS**(已启用):随对象一起复制行级安全性表达式。这适用于复制已定义 RLS 规则的表。 -复制对象时同时复制对象级安全性设置。在复制带有 OLS 限制的对象时适用。 +**包含 OLS**(已启用):随对象一起复制对象级安全性设置。这适用于复制具有 OLS 限制的对象。 ## Tabular Editor > 透视 - + -控制如何处理透视成员资格: +控制透视成员资格的处理方式: -##### _新对象继承透视成员资格_(已禁用) +**对新对象继承透视成员资格**(已禁用):新创建的对象自动从其父级继承透视成员资格。例如,新度量值将自动添加到与其父表相同的透视中。 -新建对象会自动从其父对象继承透视成员资格。例如,新度量值会自动添加到与其父表相同的透视中。 +**对已移动的对象继承透视成员资格**(已禁用):已移动的对象从其新父级继承透视成员资格。这在重组模型结构时非常有用。 -##### _移动后的对象继承透视成员资格_(已禁用) +**将表添加到透视时继承**(已启用):将表添加到透视时,自动添加所有表对象(列、度量值、层次结构)。 -被移动的对象会从其新的父对象继承透视成员资格。这在重新组织模型结构时很有用。 - -##### _将表添加到透视时继承_(已启用) - -将表添加到透视时,自动添加该表的所有对象(列、度量值、层次结构)。 - -##### _从透视中移除表时一并移除_(已启用) - -从透视中移除表时,自动移除该表的所有对象。 +**从透视中删除表时继承**(已启用):从透视中删除表时,自动删除所有表对象。 ## Tabular Editor > 架构比较 -![架构比较偏好](~/content/assets/images/pref-schema-compare.png) - -配置在更新表架构并进行架构比较时要忽略哪些更改: +![架构比较首选项](~/content/assets/images/pref-schema-compare.png) -##### _忽略导入模式更改_(已禁用) +配置在更新表架构时,架构比较过程中要忽略哪些更改: -不要标记对导入模式属性的更改。如果希望在架构比较期间忽略导入模式、DirectQuery 模式和 Dual 模式之间的更改,请启用此选项。 +**忽略导入模式更改**(已禁用):不标记对导入模式属性的更改。如果您希望在架构比较过程中忽略导入、DirectQuery 和双模式之间的更改,请启用此选项。 -##### _忽略数据类型更改_(已禁用) +**忽略数据类型更改**(禁用):不标记列数据类型更改。如果您希望在架构比较过程中忽略数据类型更改,请启用此选项。 -不要标记对列数据类型的更改。如果希望在架构比较期间忽略数据类型更改,请启用此选项。 +**忽略说明更改**(已禁用):不标记对象说明的更改。如果您不希望在架构比较中看到说明更改,请启用此选项。 -##### _忽略描述更改_(已禁用) +**忽略十进制到双精度更改**(禁用):不标记十进制和双精度数据类型之间的更改。处理不区分这些类型的数据源时,此选项非常有用。 -不要标记对对象描述的更改。如果你不想在架构比较中看到描述的更改,请启用此选项。 - -##### _忽略 decimal 与 double 之间的更改_(已禁用) - -不要将 decimal 与 double 数据类型之间的更改标记为差异。这在处理不区分这些类型的数据源时很有用。 - -##### _优先使用 Analysis Services 架构检测器_(已禁用) - -将 Analysis Services 元数据作为架构检测的最终依据。启用后,Tabular Editor 将直接查询 Analysis Services 实例,而不是使用数据源提供程序的架构信息。 +**优先使用 Analysis Services 架构检测器**(禁用):将 Analysis Services 元数据用作架构检测的权威来源。启用后,架构检测将直接查询 Analysis Services 实例。 ## Tabular Editor > 保存到文件夹/文件 -![保存到文件夹偏好](~/content/assets/images/pref-save-to-folder.png) +![“保存到文件夹”首选项](~/content/assets/images/pref-save-to-folder.png) ### 序列化模式 -##### _使用 TMDL 格式_(已禁用) - -使用 Tabular Model Definition Language(TMDL)格式而非 JSON 来保存模型元数据。 TMDL 是推荐用于版本控制和协作的现代格式。 - -##### _使用推荐的序列化设置_(已启用) - -应用基于文件夹的序列化推荐设置(会覆盖自定义设置)。启用后,Tabular Editor 会使用将模型保存到文件夹的最佳实践,并针对版本控制进行优化。 - -### 传统(JSON)序列化设置 - -##### _为文件名添加前缀_(已禁用) - -为文件名添加数字前缀以便排序。这有助于在文件浏览器中保持一致的文件顺序。 - -##### _本地关系_(已启用) +**使用 TMDL 格式**(禁用):使用表格模型定义语言 (TMDL) 格式而非 JSON 格式保存模型元数据。TMDL 是建议用于版本控制和协作的现代格式。 -将关系定义与各个表一起存储,而不是集中存放在一个位置。这使得在使用版本控制时,更容易看清每个表包含哪些关系。 +**使用推荐的序列化设置**(启用):应用基于文件夹的序列化的推荐设置(覆盖自定义设置)。启用后,Tabular Editor 将采用将模型保存到文件夹的最佳实践,并针对版本控制进行优化。 -##### _本地透视_(已启用) +### 旧版 (JSON) 序列化设置 -将透视成员隶属信息随各个对象单独存储,而不是集中存放在一个位置。这可以减少版本控制中的合并冲突。 +**文件名前缀**(已禁用):为文件名添加数字前缀,以便排序。这有助于在文件资源管理器中保持一致的文件顺序。 -##### _本地翻译_(已启用) +**本地关系**(已启用):将关系定义存储在各个表中,而不是存储在中心位置。这样,在使用版本控制时,更容易看到哪些关系属于每个表。 -将翻译与各个对象一起存储,而不是集中保存在一个位置。这可以减少版本控制中的合并冲突。 +**本地透视**(已启用):将透视成员资格存储在单个对象中,而不是存储在中心位置。这可以减少版本控制中的合并冲突。 -##### _级别_ +**本地翻译**(已启用):将翻译存储在单个对象中,而不是存储在中心位置。这可以减少版本控制中的合并冲突。 -选择要在不同文件夹级别序列化的对象类型。这让你可以将模型文件组织成分层结构。可用的级别包括数据源、用户定义函数(UDF)、共享表达式、透视、关系、角色、表、列、层次结构、度量值、分区、计算项和翻译。 +**级别**:选择要在不同文件夹级别序列化的对象类型。这使你能够将模型文件组织成层次结构。可用级别包括数据源、用户定义函数 (UDF)、共享表达式、透视、关系、角色、表、列、层次结构、度量值、分区、计算项和翻译。 -##### _忽略推断对象_(已启用) +**忽略推断对象**(已启用):不序列化引擎自动推断的对象。这可以减少已保存元数据中的杂乱。 -不要序列化由引擎自动推断的对象。这可以减少已保存元数据的杂乱。 +**忽略推断属性**(已启用):不序列化由引擎自动推断的属性。这可以使保存的元数据保持简洁,并专注于显式设置的值。 -##### _忽略推断属性_(已启用) +**忽略时间戳**(已启用):不序列化时间戳元数据。对于版本控制,强烈建议这样做,因为这可以防止每次提交时出现不必要的更改。 -不要序列化由引擎自动推断的属性。这会让已保存的元数据保持整洁,只包含显式设置的值。 +**忽略 Lineage tag**(禁用):不序列化 Power BI Lineage tag 元数据。如果您不希望保存的元数据中包含沿袭信息,请启用此选项。 -##### _忽略时间戳_(已启用) +**忽略隐私设置**(禁用):不序列化数据源隐私设置。如果您单独管理隐私设置,请启用此选项。 -不要序列化时间戳元数据。强烈建议在版本控制中启用此选项,因为它可以避免每次提交都产生不必要的更改。 +**包含敏感数据**(已禁用):在序列化元数据中包含敏感信息(如密码)。出于安全原因,不建议这样做。 -##### _忽略 Lineage tag_(已禁用) +**忽略增量刷新分区**(禁用):不序列化由增量刷新策略创建的分区。如果您希望将增量刷新与保存的元数据分开管理,请启用此选项。 -不要序列化 Power BI 的 Lineage tag 元数据。如果你不希望已保存的元数据中包含谱系信息,就启用此选项。 +**拆分多行字符串**(已启用):将长字符串值拆分为多行,以便在版本控制中更易于阅读。这使您更容易看到 DAX 表达式和其他长文本属性的变化。 -##### _忽略隐私设置_(已禁用) - -不要序列化数据源隐私设置。如果你单独管理隐私设置,请启用此选项。 - -##### _包含敏感数据_(已禁用) - -在序列化的元数据中包含密码等敏感信息。出于安全原因,不建议这样做。 - -##### _忽略增量刷新分区_(已禁用) - -不要序列化由增量刷新的刷新策略创建的分区。如果你希望将增量刷新与已保存的元数据分开管理,请启用此选项。 - -##### _拆分多行字符串_(已启用) - -将较长的字符串值拆分为多行,便于在版本控制中阅读。这能让你更容易看清 DAX 表达式以及其他长文本属性的改动。 - -##### _排序数组_(已禁用) - -按字母顺序对数组元素排序,以确保序列化结果一致。这可以减少版本控制中无意义的差异,但也可能改变某些元素的逻辑顺序。 +**对数组排序**(已禁用):按字母顺序对数组元素排序,以实现一致的序列化。减少版本控制中的排序差异,并更改某些元素的顺序。 ### TMDL 序列化设置 -##### _缩进模式_(制表符) - -选择在 TMDL 文件中使用制表符或空格进行缩进。制表符是默认且推荐的选项。 - -##### _缩进空格数_(4) +**缩进模式**(制表符):在 TMDL 文件中选择使用制表符或空格进行缩进。制表符是默认且推荐的选项。 -使用空格时,指定每级缩进的空格数。 - - +**缩进空格** (4):使用空格时,指定每个缩进级别的空格数。 ## AI 功能 -父级页面包含两项适用于所有 AI 功能的设置,对聊天和 [MCP server](xref:mcp-server) 均适用。 - -##### _启动时检查知识库更新_(已启用) +父页面包含适用于每个 AI 功能的两个设置,聊天和[MCP 服务器](xref:mcp-server)均是如此。 -AI 助手会搜索 Tabular Editor 文档的本地副本。选中后,Tabular Editor 会在启动时检查是否有更新的副本,如有可用则下载。这是任何 AI 功能自行发起的唯一一次出站请求。 +**启动时检查知识库更新**(已启用):AI 助手搜索 Tabular Editor 文档的本地副本。选中此选项后,Tabular Editor 将在启动时查找更新的副本,并在有更新的副本可用时下载。这是任何 AI 功能自行发出的唯一出站请求。 -##### 审计日志 - -**打开审计文件夹**会打开本机的一份记录,记录了 AI 助手和 MCP 服务器的操作:权限决策、调用了哪些工具及其结束方式,以及任何已运行或提交供审核的脚本全文。提示词、回复和数据值绝不会被记录。这项记录功能仅限企业版:Desktop 和 Business 版不会记录任何内容,也不会显示该按钮。参见 @ai-audit-log。 +**审计日志**:**打开审计文件夹**将打开此计算机的记录,其中记录了 AI 助手和 MCP 服务器的操作:权限决策、调用的工具以及每个工具的结束方式,以及已运行或移交以供审核的任何脚本的完整文本。提示、回复和数据值绝不会被记录。记录是企业版功能:在 Desktop 和 Business 版本中,不会记录任何内容,也不会显示该按钮。请参阅@ai-audit-log。 ## AI 功能 > AI 助手 -AI 助手聊天的连接设置。 **AI 提供程序**子页面会显示在这里。各提供程序需要哪些信息,请参见 @ai-assistant。 - -##### _选择提供程序_(无) - -聊天要连接的 AI 提供程序:**OpenAI**、**Anthropic**、**Azure OpenAI** 或 **自定义(兼容 OpenAI)**。下方字段会根据你的选择而变化。管理员可以通过策略把它锁定为单个提供程序,或缩小可选列表。 +AI 助手聊天的连接设置。**AI 提供程序**子页面在此处呈现。请参阅 @ai-assistant,了解每个提供程序需要什么。 -##### _基础 URL_ / _服务端点_ +**选择提供商**(无):聊天所连接的 AI 提供商:**OpenAI**、**Anthropic**、**Azure OpenAI** 或**自定义(兼容 OpenAI)**。以下字段会随您的选择而变化。管理员可以通过策略将此锁定为单个提供商,或缩小列表范围。 -请求会发送到这里。 OpenAI 和 Anthropic 都提供默认值,所以这个字段是可选的。 Azure OpenAI 和自定义没有默认值,因此必须填写端点。 +**基础 URL**/**服务端点**:发送请求的位置。OpenAI 和 Anthropic 提供默认值,该字段为可选。Azure OpenAI 和自定义没有默认值,因此需要端点。 -##### _API 密钥_ +**API 密钥**:您针对所选提供程序的专属密钥。它以加密形式存储在此计算机的 `Preferences.json` 中。Tabular Editor 不附带内置密钥,也绝不会代理您的请求。 -用于所选提供商的自有密钥。它会以加密方式存储在本机的偏好设置文件 `Preferences.json` 中。 Tabular Editor 不提供内置密钥,也绝不会代理你的请求。 +**OpenAI 组织 ID** 和 **OpenAI 项目 ID**:可选,仅对 OpenAI 提供程序显示。在您的 OpenAI 账户按组织或项目计费或限定使用范围时使用它们。 -##### _OpenAI 组织 ID_ 和 _OpenAI 项目 ID_ +**模型名称**(对于 Azure OpenAI 为**部署**):要使用的模型。对于 OpenAI 和 Anthropic,这是一个从在线目录中填充的下拉列表,因此在此计算机上首次获取目录之前,该列表为空。对于 Azure OpenAI,该字段的标签为**部署**,并使用你为部署指定的名称,该名称不一定是底层模型的名称。如果留空,则使用提供商的默认值,但 Azure OpenAI 和“自定义”除外,它们没有默认值。 -可选,并且只在选择 OpenAI 提供程序时显示。当你的 OpenAI 账户按组织或项目计费,或将使用范围限定到组织或项目时,可以使用这些字段。 +## AI 功能 > AI 助手 > 首选项 -##### _模型名称_(在 Azure OpenAI 中为 _部署_) - -要使用的模型。对于 OpenAI 和 Anthropic,这里是一个从在线目录加载的下拉列表,因此在此计算机上首次获取目录之前会显示为空。对于 Azure OpenAI,该字段标记为 **部署**,填写的是你为该部署指定的名称,这个名称不一定是底层模型的名称。留空时会使用提供程序的默认值;Azure OpenAI 和 Custom 除外,因为它们没有默认值。 - -## AI 功能 > AI 助手 > 偏好 - -聊天的行为方式。有关各分组的详细说明,请参见 @ai-assistant。 +聊天的行为方式。请参阅@ai-assistant,了解每个组的详细信息。 ### 聊天显示 -##### _显示选择上下文指示器_(已启用) - -在聊天上方显示当前选中的模型对象,以便你了解助手会将哪些内容视为上下文。 - -##### _显示自定义指令指示器_(已启用) +**显示所选内容上下文指示器**(已启用):在聊天上方显示当前选定的模型对象,以便您可以了解助手将哪些内容视为上下文。 -在每条回复上方显示本次应用了哪些[自定义指令](xref:ai-assistant#custom-instructions)。 +**显示自定义指令指示器**(已启用):在每条回复上方显示应用了哪些[自定义指令](xref:ai-assistant#custom-instructions)。 -##### _显示知识库搜索指示器_(已启用) - -在助手搜索知识库时显示进度。 +**显示知识库搜索指示器**(已启用):在助手搜索知识库时显示进度。 ### 上下文压缩 -##### _自动压缩_(已启用) +**自动压缩**(已启用):当对话接近模型的上下文限制时,自动总结对话的较早部分,以便长时间对话可以继续进行。 -当对话接近模型的上下文限制时,自动总结较早的对话内容,让长对话可以继续进行。 +**自动压缩阈值 %**(80):在运行压缩之前,上下文窗口的填充程度,以所选模型上下文窗口的百分比表示。50 到 100 以外的值不会产生进一步的影响。 -##### _自动压缩阈值 %_(80) +### C# Script -压缩运行前,上下文窗口最多可填充到多满;这里按 _模型自身_ 窗口的百分比计算,而不是固定的 token 数量。超出 50 到 100 范围的值不会再产生额外效果。 +**允许 AI 助手直接运行 C# 脚本**(已禁用):让助手执行您所要求的模型更改,而不是编写脚本并将其打开供您运行。只有安全分析认为安全的脚本才会以这种方式运行,这意味着脚本仅涉及模型对象,不涉及其他任何内容;任何涉及文件、网络或外部程序集的脚本仍将交由您审核。每次运行都作为一个单独的撤消步骤。 -### C# Script +在[权限](#ai-features--permissions)页面上将**模型元数据**设置为**写入**之前,此设置不可用。一旦您更改该下拉列表,此设置即变为可用,无需关闭对话框。如果管理员设置了 `DisableCSharpScripts` [策略](xref:policies),该设置也会不可用,并会显示一个工具提示说明这一点。默认情况下,此设置有意处于禁用状态:**模型元数据 > 写入**也是代理在 MCP 服务器上所需的权限,在此处授予此权限绝不能在不通知的情况下更改聊天的行为。请参阅[允许助手更改您的模型](xref:ai-assistant#letting-the-assistant-change-your-model)。 -##### _允许 AI 助手直接运行 C# Script_(已禁用) +**预览更改**(已启用):在助手所做的更改生效之前显示脚本预览对话框,以便您可以查看每个模型元数据更改并接受或取消该更改。取消操作会将模型恢复原状,并告知助手您拒绝了更改。 -让助手直接执行你要求的模型更改,而不是先编写脚本再打开给你运行。只有通过安全分析并被认定为安全的脚本才会以这种方式运行,也就是只操作模型对象、不做其他事情的脚本;任何涉及文件、网络或外部程序集的内容,仍会交由你审核。每次运行都会作为一个单独的撤销步骤记录。 +## AI 功能 > MCP 服务器 -在 [权限](#ai-features--permissions) 页面将 **模型元数据** 设为 **写入** 之前,此设置不可用;切换该下拉列表后无需关闭对话框,设置会立即生效。如果管理员设置了 `DisableCSharpScripts` [策略](xref:policies),该选项同样不可用,并会显示工具提示说明这一点。默认将其关闭是刻意的:**模型元数据 > 写入** 也是代理通过 MCP 服务器所需的权限,因此在 MCP 服务器端授予该权限时,不应悄然改变聊天能做什么。参见 [允许助手更改你的模型](xref:ai-assistant#letting-the-assistant-change-your-model)。 +[MCP 服务器](xref:mcp-server)的设置,它允许 Claude Code、GitHub Copilot 或 Cursor 等外部代理在您打开的模型上工作。 -##### _预览更改_(已启用) +![MCP 服务器偏好设置](~/content/assets/images/pref-mcp-server.png) -在助手所做的更改生效前显示脚本预览对话框,以便你查看每一项模型元数据更改,并选择接受或取消。取消会将模型恢复原状,并告知助手你已拒绝该更改。 +**启用 MCP 服务器**(已启用):MCP 服务器是否可用。取消勾选将停止正在运行的服务器,并移除**“工具”>“MCP 服务器...”**菜单项和状态栏指示器。 -## AI 功能 > MCP 服务器 +**自动启动 MCP 服务器**(禁用):在 Tabular Editor 启动时启动服务器,以便代理无需您手动启动即可连接。如果端口在启动时已被占用,服务器将不会启动,也不会显示任何提示。 -[MCP 服务器](xref:mcp-server)的设置。它允许 Claude Code、GitHub Copilot 或 Cursor 等外部代理处理你当前打开的模型。 +**需要访问令牌**(禁用):让代理提供**“工具”>“MCP 服务器...”**对话框中显示的持有者令牌。服务器仅在环回接口上侦听,因此这在多个人同时登录的计算机(例如远程桌面或 Citrix 主机)上最重要,在这些计算机上,每个会话都可以访问 `127.0.0.1`。管理员可以使用`RequireMcpAccessToken`[策略](xref:policies)强制执行此操作。 -![MCP 服务器偏好设置](~/content/assets/images/pref-mcp-server.png) +**端口** (42100):服务器侦听的环回端口,范围为 1024 至 49151。更改端口将使指向固定地址的现有代理注册失效。如果您手动启动服务器时端口已被占用,Tabular Editor 将提供其找到的下一个空闲端口。 -##### _启用 MCP 服务器_(已启用) +## AI 功能 > 权限 -用于控制 MCP 服务器是否启用。取消选中后,会停止正在运行的服务器,并移除 **工具 > MCP 服务器...** 菜单项和状态栏指示器。 +每个资源一个永久授权,同时管理 AI 助手聊天和通过 MCP 服务器连接的任何代理。聊天还可以请求权限未涵盖的内容;代理则无法做到这一点,因此对于 MCP 来说,权限按原样适用,并且仅在服务器重启时才会发生变化。 -##### _自动启动 MCP 服务器_(已禁用) +![AI 功能权限首选项](~/content/assets/images/pref-ai-permissions.png) -在 Tabular Editor 启动时启动服务器,这样代理无需你手动启动即可连接。如果启动时该端口已被占用,服务器不会启动,也不会显示提示。 +| 资源 | 级别 | 默认 | 涵盖范围 | +| -- | -- | -- | -- | +| **模型元数据** | 拒绝/读/写 | 读 | 表、列、度量值、表达式、描述和关系,以及 VertiPaq 分析器统计数据。“写入”允许通过 C# 脚本进行更改 | +| **模型数据** | 拒绝/读取 | 拒绝 | 来自您模型的数据值,例如 DAX 查询结果。没有写入级别 | +| **最佳实践分析器** | 拒绝/读/写 | 读 | 读可列出规则并运行分析;写可添加或修改规则 | +| **文档** | 拒绝/读/写 | 写 | 您打开的 C# 脚本和 DAX 查询选项卡。“读”是它们的内容;“写”是创建或修改它们 | +| **宏** | 拒绝/读/写 | 写 | 您的宏库 | -##### _要求访问令牌_(已禁用) +**写**涵盖读,因此无需同时授予两者。**模型数据**是默认拒绝的唯一资源。 -要求代理提供 Bearer 令牌,该令牌会显示在 **工具 > MCP 服务器...** 对话框中。服务器仅侦听回环接口,因此这在多名用户同时登录的计算机上尤为重要,例如远程桌面或 Citrix 主机,因为每个会话都可以访问 `127.0.0.1`。管理员可通过 `RequireMcpAccessToken` [策略](xref:policies) 强制启用此项。 +在企业版、咨询版和试用版中,管理员可以通过[策略](xref:policies)对其中任何一项设置上限,并分别针对聊天和 MCP 服务器设置。受限的下拉列表以只读方式显示。请参阅 @ai-assistant,了解聊天如何请求授权未涵盖的内容,并参阅 @mcp-server,了解代理看到的内容。 -##### _端口_(42100) + -服务器侦听的回环端口,范围为 1024 到 49151。更改端口会使现有代理注册失效,因为它们指向的是固定地址。如果你手动启动服务器时该端口已被占用,Tabular Editor 会提供它找到的下一个可用端口。 +## Tabular Editor > 其他 -## AI 功能 > 权限 +![其他首选项](~/content/assets/images/pref-miscellaneous.png) -每个资源对应一项常设授权,同时适用于 AI Assistant 聊天以及通过 MCP 服务器连接的任何代理。聊天还可以额外请求授权未涵盖的内容;代理则不能。因此对于 MCP,授权将按现状生效,只有在服务器重启时才会更新。 +### 元数据同步 -![AI 功能权限偏好设置](~/content/assets/images/pref-ai-permissions.png) +这些设置控制 Tabular Editor 3 如何处理在应用程序外部发生变化的模型元数据。前三项涉及从 Analysis Services 实例上的数据库加载的模型,并依赖于 Analysis Services 跟踪。**自动从磁盘重新加载**涵盖从文件或文件夹加载的模型,并直接监视这些文件。 -| 资源 | 级别 | 默认值 | 涵盖范围 | -| -------------------------- | ------------ | --- | ------------------------------------------------------------- | -| **模型元数据** | 拒绝 / 读取 / 写入 | 读取 | 表、列、度量值、表达式、描述和关系,以及 VertiPaq分析器的统计信息。写入权限允许通过 C# Script 进行更改 | -| **模型数据** | 拒绝 / 读取 | 拒绝 | 来自模型的数据值,例如 DAX 查询结果。不提供写入级别 | -| **Best Practice Analyzer** | 拒绝 / 读取 / 写入 | 读取 | 读取会列出规则并运行分析;写入可添加或修改规则 | -| **文档** | 拒绝 / 读取 / 写入 | 写入 | 你当前打开的 C# Script 和 DAX 查询标签页。读取用于查看其内容;写入用于创建或修改它们 | -| **宏** | 拒绝 / 读取 / 写入 | 写入 | 你的宏库 | +**本地元数据与已部署模型不同步时发出警告**(已启用):选中此选项后,每当您对模型进行了尚未保存到 Analysis Services 的本地更改时,Tabular Editor 中都会显示一条信息栏。保存时(**Ctrl+S**),该栏将消失。 -**写入** 已包含读取权限,因此无需同时授予两者。**模型数据**是默认被拒绝的唯一资源,因为元数据描述的是你的模型,而数据_本身_就是它的内容。 +**跟踪外部模型更改**(已启用):正如 Power BI Desktop 可以检测到外部工具何时对数据模型进行更改一样,Tabular Editor 也可以做到这一点。此选项仅适用于 Analysis Services 的本地实例(即与 Tabular Editor 在同一台计算机上运行的 msmdsrv.exe 进程)。选中此选项后,Tabular Editor 将在 Analysis Services 上启动跟踪,并在进行外部更改时通知您。 -在 Enterprise、Consultancy 和 Trial 版本中,管理员可以通过[策略](xref:policies)为其中任意一项设置上限,并可分别对聊天和 MCP 服务器单独设定。被设定上限的下拉框会显示为只读。关于聊天如何请求授权未涵盖的内容,见 @ai-assistant;关于代理能看到什么,见 @mcp-server。 +**自动刷新本地 Tabular Object Model 元数据**(已启用):启用上述跟踪机制后,此选项允许 Tabular Editor 在检测到外部更改时自动刷新模型元数据。如果您经常在 Power BI Desktop 和 Tabular Editor 3 之间来回切换,此选项非常有用。 -## Tabular Editor > 杂项 +**自动从磁盘重新加载**(已启用):选中此选项后,Tabular Editor 将监视从中加载模型的元数据文件,并在其他应用程序更改这些文件时重新加载模型。与上述两个设置不同,此设置不涉及 Analysis Services 跟踪:它监视文件本身,因此它涵盖从 `.bim` 文件或文件夹加载的模型,无论是否涉及服务器。如果模型有未保存的更改,Tabular Editor 会询问您要保留哪个副本。请参阅[从磁盘自动重新加载](xref:auto-reload)。 -![杂项偏好设置](~/content/assets/images/pref-miscellaneous.png) +**清理孤立的 Tabular Editor 跟踪**:删除由任何 Tabular Editor 实例启动的每个 Analysis Services 跟踪。当 Tabular Editor 3 意外关闭后仍有跟踪时,请使用此选项。 -### 元数据同步 +> [!NOTE] +> 只有在 Tabular Editor 连接到 Analysis Services 实例时,才能使用“清理”按钮。 -这些设置控制 Tabular Editor 3 如何处理在应用程序外部发生变化的模型元数据。前三项适用于从 Analysis Services 实例上的数据库加载的模型,并且都依赖 Analysis Services 跟踪。**自动从磁盘重新加载** 适用于从文件或文件夹加载的模型,并会直接监视这些文件。 +## 模型部署 > 常规 -##### _当本地元数据与已部署模型不同步时发出警告_(已启用) +![模型部署首选项](~/content/assets/images/pref-model-deployment.png) -勾选后,只要你对模型进行了尚未保存到 Analysis Services 的本地更改,Tabular Editor 内就会显示一条信息栏。例如,如果你想知道为什么 DAX 查询或 Pivot Grid 没有得到预期结果,可能是因为你在 Tabular Editor 中更改了某个度量值表达式,但尚未将更改保存到 Analysis Services。保存(Ctrl+S)后,该提示栏就会消失。 +### 部署选项 -##### _跟踪外部模型更改_(已启用) +**部署时添加元数据注释**(禁用):将部署详细信息添加到已部署的模型中:用户、客户端计算机、时间、Tabular Editor 版本和部署模式。 -就像 Power BI Desktop 能检测到外部工具对 Data model 做出的更改一样,Tabular Editor 也能做到。此选项仅适用于 Analysis Services 的本地实例(即与 Tabular Editor 运行在同一台计算机上的 msmdsrv.exe 进程)。选中后,Tabular Editor 会在 Analysis Services 上启动跟踪,并在发生外部更改时通知你。 +**部署时保存 Model.bim 备份**(已启用):在每次部署时将模型的 `Model.bim` 的压缩副本保存到**备份位置**文件夹。当**备份位置**为空时,不会保存任何备份。 -##### _自动刷新本地 Tabular Object Model 元数据_(已启用) +**备份位置**:用于存放部署备份的文件夹。当选中**部署时保存 Model.bim 备份**时可用。 -启用上述跟踪机制后,勾选这个选项即可让 Tabular Editor 在检测到外部更改时自动刷新模型元数据。如果你经常在 Power BI Desktop 和 Tabular Editor 3 之间来回切换,这会很有用。 +### 模型保存选项 -##### _自动从磁盘重新加载_(已启用) +**模型保存时保存 Model.bim 备份**(已启用):每次保存模型时,将模型的 `Model.bim` 的压缩副本保存到 **备份位置** 文件夹。当**备份位置**为空时,不会保存任何备份。 -选中后,Tabular Editor 会监视模型加载来源的元数据文件,并在其他应用程序更改这些文件时重新加载模型。与上面两个设置不同,这项设置不涉及 Analysis Services 跟踪:它直接监视文件本身,因此适用于从 `.bim` 文件或文件夹加载的模型,无论是否涉及服务器。如果模型有未保存的更改,Tabular Editor 会询问你要保留哪个副本。见[自动从磁盘重新加载](xref:auto-reload)。 +**备份位置**:用于保存备份的文件夹。选中**模型保存时保存 Model.bim 备份**时可用。 -##### _清理遗留的 Tabular Editor 跟踪_ +## 模型部署 > 数据刷新 -通常,Tabular Editor 3 会自动停止并移除因上述设置而启动的所有 AS 跟踪。但是,如果应用程序异常退出,这些跟踪可能永远不会停止。点击此按钮后,将移除由任何 Tabular Editor 实例启动的所有 AS 跟踪。 +### Direct Lake -> [!NOTE] -> 清理按钮只有在 Tabular Editor 连接到 Analysis Services 实例时才可用。 +**保存新表时自动刷新**(已启用):在您保存 Direct Lake 模型并添加新表时刷新该模型。如果取消选中此选项,新表将保持未处理状态,直到您刷新模型为止,并且对这些表的查询将回退到 DirectQuery 模式。 ## 数据浏览 > Pivot Grid + ![Pivot Grid 偏好](~/content/assets/images/pref-pivot-grid.png) ### 基本 -##### _自动刷新 Pivot Grid_ (已启用) - -保存模型更改后,自动刷新 Pivot Grid。与 DAX 查询一样,这能让你立即看到度量值更改带来的影响。 - -##### _Pivot Grid 字段不匹配时发出警告_(已启用) +**默认自动刷新 Pivot Grid**(启用):保存模型更改时自动刷新 Pivot Grid。与 DAX 查询一样,这使您可以立即看到对度量值所做更改的影响。 -当 Pivot Grid 的字段定义与当前模型不匹配时显示警告。如果你删除或重命名了已保存的 Pivot Grid 中使用的字段,就可能发生这种情况。 +**如果 Pivot Grid 与模型不匹配则显示警告**(启用):当 Pivot Grid 布局使用当前模型中不存在的字段时显示警告,例如,在您删除或重命名字段后、打开从不同模型保存的布局时或在您打开不同模型时保持 Pivot Grid 打开时。此设置还控制在布局中包含字段的 Pivot Grid 保持打开状态时,打开不同模型之前显示的确认提示。 ### 字段标题 -##### _Pivot 表头自动换行_(已启用) - -在 Pivot Grid 标题中启用自动换行。这会让较长的字段名称更易阅读。 +**字段标题自动换行**(已启用):当标题文本无法在一行中显示时,字段标题将换行到多行。 ### 字段列表 -##### _始终显示 Pivot Grid 字段列表_(已启用) - -默认保持 Pivot Grid 字段列表可见。如果你希望为 Pivot Grid 本身腾出更多屏幕空间,可禁用此选项。 +**始终显示字段列表**(启用):创建新的数据透视表时显示字段列表。 -##### _在透视表自定义中显示所有字段_(已启用) +**保持字段可见**(已启用):将字段添加到 Pivot Grid 后,该字段将保留在字段列表的“字段”部分中。 -默认在 Pivot Grid 字段列表中显示所有可用字段,包括隐藏字段。 +**布局**(字段部分与区域部分堆叠显示):字段列表的默认布局: -##### _Pivot Grid 自定义默认布局_ (StackedDefault) +- **字段部分与区域部分堆叠显示** +- **字段部分与区域部分并排显示** +- **仅字段部分** +- **仅区域部分(2×2)** +- **仅区域部分(1×4)** -选择 Pivot Grid 字段列表的默认布局。可选项包括: +### 切换模型时保持文档打开状态 -- **StackedDefault**:字段和区域显示在同一个堆叠面板中 -- **StackedSideBySide**:字段和区域显示在并排面板中 -- **TopPanelOnly**:字段列表仅在顶部显示 -- **BottomPanelOnly2by2**: 底部以 2x2 网格显示字段列表 -- **BottomPanelOnly1by4**:底部 1x4 布局的字段列表 +**打开不同的模型时保持 Pivot Grid 打开**(启用):打开不同的模型时,保持 Pivot Grid 文档打开,并将它们连接到新模型。字段布局将保留,新模型中没有的字段将从中删除。禁用时,Pivot Grid 将与上一个模型一起关闭。请参阅 @pivot-grid。 ## 数据浏览 > DAX 查询 + ![DAX 查询偏好](~/content/assets/images/pref-dax-query.png) ### 基本 -##### _默认自动执行 DAX 查询_(已启用) - -新建的 DAX 查询会默认启用 **自动执行**,因此每当已部署的语义模型发生更改时,查询都会重新运行。如果你更希望手动执行每个查询,就将其关闭。 - -##### _在结果网格中保留现有排序和筛选_(WhenQueryUnchanged) - -控制重新执行查询时是否保留网格筛选和排序: +**默认自动执行 DAX 查询**(已启用):新的 DAX 查询在打开时将启用**自动执行**,因此每当对已部署的语义模型进行更改时,查询都会重新运行。如果您希望自行执行每个查询,请将其关闭。 -- **Never**:每次执行查询都会重置排序和筛选 -- **WhenQueryUnchanged**:仅在查询被修改时才会重置排序和筛选 -- **Always**:只要列仍然存在,就不会重置排序和筛选 +**在结果网格中保留现有排序和筛选** (WhenQueryUnchanged):控制在重新执行查询时是否保留网格筛选和排序: +- **从不**:执行查询时,排序和筛选始终被重置 +- **WhenQueryUnchanged**:仅当查询被修改时,排序和过滤才会被重置 +- **始终**:如果列仍然存在,则绝不会重置排序和筛选 ### 查询设置 -##### _智能选择_(已启用) +**智能选择**(已启用):当您执行查询的一部分时,Tabular Editor 会代您将该选择转换为有效的 DAX 查询,将标量表达式包裹在花括号中,并在它们不是选择的一部分时添加 `DEFINE` 部分或 `EVALUATE` 关键字。在包含多个 `DEFINE ... EVALUATE` 查询的文档中,添加的 `DEFINE` 部分是属于所选查询的部分。所选列引用(包括 `ORDER BY` 子句中的列引用)将返回该列的非重复值。 -当你执行查询中的一部分时,Tabular Editor 会替你将该选区转换为有效的 DAX 查询:把标量表达式用大括号括起来,并在所选内容中未包含 `DEFINE` 部分或 `EVALUATE` 关键字时自动补上它们。 - -##### _行数限制_(1,000) - -会将每个 `EVALUATE` 语句包装在 `TOPN` 调用中,避免误对大型表执行查询时运行过久或耗尽内存。将其设为 `0` 即可完全取消限制。 +**行数限制**(1,000):将每个 `EVALUATE` 语句包装在 `TOPN` 调用中,以防止对大表进行的意外查询长时间运行或耗尽内存。将其设置为 `0` 以完全移除限制。 ### 代码生成 -##### _使用注释作为分隔符_(已启用) +**使用注释作为分隔符**(已启用):将注释插入生成的对象定义中,例如由**在查询中定义对象**生成的 `DEFINE` 块,以便于阅读。 + +### 切换模型时保持文档打开状态 -在生成的对象定义中插入注释,例如 **在查询中定义对象** 生成的 `DEFINE` 块,以便更易阅读。 +**打开其他模型时保持 DAX 查询打开**(启用):打开其他模型时,保持 DAX 查询文档打开。查询文本将被保留,先前的结果将被清除,查询将对新打开的模型执行。禁用时,DAX 查询文档将与上一个模型一起关闭。请参阅@dax-query。 ## 数据浏览 > 表格预览 -![表格预览偏好](~/content/assets/images/pref-table-preview.png) +![表格预览首选项](~/content/assets/images/pref-table-preview.png) ### 基本 -##### _默认自动刷新表格预览_(已启用) - -新打开的表格预览会默认启用 **自动刷新**,因此每当对已部署的语义模型进行更改时,预览都会刷新。这在调试时很有用:可以在一个窗口中更新表达式,同时在另一个窗口中打开同一张表的预览。 - -##### _按字母顺序对表格预览列排序_(已禁用) - -选中后,表格预览中的列会按名称的字母顺序排序,并与 @tom-explorer-view 中列出的表列顺序一致。未选中时(默认),列会按引擎返回的顺序显示,这大致对应内部列顺序,看起来可能比较随意。 +**默认自动刷新表格预览**(已启用):新表格预览在打开时将启用**自动刷新**,因此每当对已部署的语义模型进行更改时,预览都会刷新。这在调试时非常有用:在一个窗口中更新表达式,同时在另一个窗口中打开同一表格的预览。 -##### _最大。筛选器下拉列表中的值_ (5,000) +**按字母顺序对表格预览列排序**(禁用):选中此选项后,表格预览列将按名称的字母顺序排序,与 @tom-explorer-view 列出表格列的顺序相匹配。未选中(默认)时,列将按引擎返回的顺序显示,这大致是内部列的顺序,看起来可能比较随意。 -列的筛选下拉列表中列出的不同值的最大数量。如果某列的不同值数量超过此限制,超出限制的值将不会列出,也无法直接勾选。提高此值可以显示更多值,但每次打开下拉列表时都需要执行开销更大的查询。可设置范围为 100 到 1,000,000。 +**筛选器下拉列表中最大值数**(5,000):列的筛选器下拉列表中列出的非重复值最大数。对于非重复值多于此值的列,超出限制的值不会列出,也无法直接勾选。提高此值将列出更多值,但代价是每次打开下拉菜单时查询的负担都会加重。接受 100 到 1,000,000。 -##### _最大。行数_(100,000) - -Tabular Editor 按没有属性层次结构的列进行排序时,可排序的最大行数。 +**无属性层次结构时可排序的最大行数** (100,000):Tabular Editor 按没有属性层次结构可供排序的列进行排序时,行数的上限。 ### DirectQuery -##### _行数限制_(100) - -DirectQuery 模式下,表格预览可检索的最大行数。如果你需要查看更多数据,可以提高该值,但请记住每一行数据都需要从底层数据源中提取。 +**行数限制** (100):在 DirectQuery 模式下,为表预览检索的最大行数。如果需要查看更多数据,请提高此值,但请记住,每行数据都是从底层源中提取的。 ### 行为 -##### _在 TOM Explorer 中跟踪所选列_(已启用) - -当你在 @tom-explorer-view 中选择某一列时,已打开的表格预览会自动滚动到该列并将其高亮显示,这是在超宽表中定位某一列最快的方法。也可以在表格预览工具栏中通过 **跟踪所选列**,针对单个预览启用或禁用此设置。 - -## DAX编辑器 > 常规 - -![Dax 编辑器 常规](~/content/assets/images/dax-editor-general.png) +**在 TOM Explorer 中跟踪所选列**(已启用):当您在 @tom-explorer-view 中选择一列时,打开的表格预览会将该列滚动到视图中并突出显示,这是查找非常宽的表格中的一列的最快方式。对于单个预览,可以使用表格预览工具栏上的**跟踪所选列**来启用和禁用相同的设置。 -Tabular Editor 3 的 DAX编辑器可高度自定义。这个页面提供 DAX编辑器的常规设置: +## 文本编辑器 > DAX编辑器 > 常规 -##### _行号_(已启用) +![DAX 编辑器常规](~/content/assets/images/dax-editor-general.png) -在编辑器左侧边距显示行号。 +Tabular Editor 3 的 DAX 编辑器具有高度可配置性。此页面提供 DAX 编辑器常规配置的设置: -##### _代码折叠_(已启用) +**行号**(已启用):在编辑器的左边距中显示行号。 -在 DAX 代码中启用可折叠区域,以提升可读性。一定要试试这个功能! +**代码折叠**(已启用):在 DAX 代码中启用可折叠区域,以提高可读性。请务必试用此功能! -##### _显示空白字符_(已禁用) +**可见空格**(已禁用):以点表示空格,以箭头表示制表符。这在诊断缩进问题时可能很有帮助。 -将空格显示为圆点,将制表符显示为箭头。这有助于诊断缩进问题。 +**缩进参考线**(已启用):显示垂直线以显示缩进级别。 -##### _缩进引导线_(已启用) +**使用制表符**(已禁用):选中此选项后,每次按下 TAB 键时,都会插入一个制表符 (`\t`)。否则,将插入与**缩进宽度**设置相对应的若干个空格。 -显示竖线以标示缩进层级。 +**注释样式**(斜杠):DAX 支持使用斜杠 (`//`) 或连字符 (`--`) 的行注释。此设置确定 Tabular Editor 3 生成 DAX 代码时使用哪种注释样式。 -##### _使用制表符_(已禁用) - -选中后,每次按下 TAB 键时都会插入一个制表符 (`\t`)。否则,会插入与 _缩进宽度_ 设置对应数量的空格。 - -##### _注释样式_(斜杠) - -DAX 支持使用斜杠(`//`)或连字符(`--`)的行注释。此设置决定 Tabular Editor 3 生成 DAX 代码时使用哪种注释样式。 - -##### _DAX 函数文档_ - -使用此设置指定:当光标位于某个 DAX 函数上并按下 F12 时,默认浏览器要打开的 URL。可选项包括 https://dax.guide(推荐)和 Microsoft 官方文档。 +**DAX 函数文档**:使用此设置指定当光标位于 DAX 函数上时,每次按 F12 键时在默认网页浏览器中打开的 URL。选项包括 https://dax.guide(推荐)和 Microsoft 的官方文档。 ### DAX 设置 -##### _区域设置_ - -设置 DAX 函数和格式所使用的区域设置。 +**区域设置**:指定 DAX 函数和格式的区域设置。 -##### _Analysis Services 版本设置_ +**Analysis Services 版本设置**:只有当 Tabular Editor 3 无法确定所使用的 Analysis Services 版本时(例如直接加载 Model.bim 文件时),这些设置才适用。在这种情况下,Tabular Editor 会根据兼容级别尝试猜测模型将部署到哪个版本。如果 Tabular Editor 报告不正确的语义或语法错误,请将这些设置设置为您要部署到的 Analysis Services 版本。 -只有当 Tabular Editor 3 无法确定所使用的 Analysis Services 版本时,这些设置才会用得上,比如直接加载 Model.bim 文件时就是这样。在这种情况下,Tabular Editor 会根据兼容级别推测模型将部署到的版本。如果 Tabular Editor 的 Report 误报语义或语法错误,你可能需要调整这些设置。 - -## DAX编辑器 > 自动格式化 +## 文本编辑器 > DAX编辑器 > 自动格式化 ![自动格式化设置](~/content/assets/images/auto-formatting-settings.png) -DAX编辑器 **非常** 强大,能在你输入的同时帮你写出漂亮、易读的 DAX 代码。 - -##### _输入时自动格式化代码_(已启用) - -这个选项会在发生某些按键操作时,自动应用特定的格式规则。例如,当输入右括号时,此功能会确保括号内的所有内容都按本页中的其他设置进行格式化。 - -##### _自动格式化函数调用_(已启用) - -此选项专门控制:当输入右括号时,是否对函数调用(参数与括号之间的空格)进行自动格式化。 +DAX 编辑器**非常**强大,可帮助您在键入时生成美观、易于阅读的 DAX 代码。 -##### _自动缩进_(已启用) +**键入时自动格式化代码**(启用):按下特定键时应用格式化规则。例如,当右括号闭合时,括号内的所有内容都会根据此页面上的其他设置进行格式化。 -这个选项会在函数调用内插入换行时,自动缩进函数参数。 +**自动格式化函数调用**(已启用):在右括号键入时格式化函数调用(参数和括号之间的空格)。 -##### _自动补全括号_(已启用) +**自动缩进**(已启用):此选项在函数调用中插入换行符时自动缩进函数参数。 -当输入左括号或引号时,此选项会自动插入对应的右括号或引号。 +**自动添加括号**(已启用):此选项会在每次输入左括号或引号时自动插入右括号或引号。 -##### _包裹选中内容_(已启用) - -启用后,当输入开括号时,此选项会自动用对应的闭括号包裹当前选中内容。 +**Wrap选择**(已启用):启用此选项后,当输入左大括号时,此选项将自动使用右大括号Wrap当前选择。 ### 格式化规则 -这些设置用于控制 DAX 代码中空白字符的格式:既包括自动格式化时的处理,也包括手动格式化代码时的处理。 +这些设置控制 DAX 代码空白的格式化方式,包括自动格式化时和手动格式化代码时。 -##### _函数后加空格_(已禁用) +**函数后空格**(禁用) # [已启用](#tab/space-after-function-on) @@ -810,9 +598,7 @@ SUM( 'Sales'[Amount] ) *** -##### _函数后换行_(已禁用) - -仅在函数调用需要拆分为多行时生效。 +**函数后换行**(禁用):仅在函数调用需要跨多行拆分时适用。 # [已启用](#tab/newline-after-function-on) @@ -833,7 +619,7 @@ SUM( *** -##### _括号内补空格_(已启用) +**填充括号**(已启用) # [已启用](#tab/pad-parentheses-on) @@ -849,223 +635,144 @@ SUM(Sales[Amount]) *** -##### _长格式行长度限制_(120) - -在使用 **格式化 DAX(长行)** 选项时,表达式在被拆分为多行之前,单行可保留的最大字符数。 +**长格式行限制** (120):使用**格式化 DAX(长行)**选项时,表达式跨多行拆分之前单行保留的最大字符数。 -##### _短格式行长度限制_(60) - -使用 **Format DAX (short lines)** 选项时,表达式在拆分为多行之前,每行最多保留的字符数。 +**短格式行限制** (60):使用**格式化 DAX(短行)**选项时,表达式跨多行拆分之前单行保留的最大字符数。 ### 大小写和引号 -除了格式化 DAX 代码的空白字符外,Tabular Editor 3 还可以修正对象引用,以及函数/关键字的大小写。 - -##### _修正度量值/列限定符_(已启用) - -选中后,会自动从度量值引用中移除表前缀,并在列引用中自动插入表前缀。 - -##### _首选关键字大小写_(UPPER) - -此设置可让你更改关键字的大小写形式,例如 `ORDER BY`、`VAR`、`EVALUATE` 等。它还会影响自动补全为接受这些固定关键字 _值_ 的函数所提供的关键字形式:`ASC` 和 `DESC`、`KEEP`、`FIRST`、`LAST` 和 `DEFAULT`、`CROSSFILTER` 的方向,以及 `LOOKUP` 的 `EXPLICIT` 和 `INFERRED`。选择 **仅首字母大写** 后,自动补全会提供 `Explicit` 而不是 `EXPLICIT`。 - -##### _首选函数大小写_(UPPER) - -此设置可让你更改函数名称的大小写形式,例如 `CALCULATE(...)`、`SUM(...)` 等。 - -##### _修正关键字/函数大小写_(已启用) +除了格式化 DAX 代码的空白字符外,Tabular Editor 3 还可以修复对象引用以及函数/关键字的大小写。 -选中后,无论是自动格式化还是手动格式化代码,都会自动更正关键字和函数的大小写。 +**修正度量值/列限定符**(启用):选中此项时,表前缀将自动从度量值引用中移除,并自动插入到列引用中。 -##### _修正对象引用大小写_(已启用) +**首选关键字大小写**(大写):此设置允许您更改关键字使用的大小写,例如 `ORDER BY`、`VAR`、`EVALUATE` 等。它还控制着自动补全功能为使用这些关键字的函数提供的固定关键字值:`ASC` 和 `DESC`、`KEEP`、`FIRST`、`LAST` 和 `DEFAULT`、`CROSSFILTER` 方向以及 `LOOKUP` 的 `EXPLICIT` 和 `INFERRED`。选择**仅首字母大写**,以提供“Explicit”而不是“EXPLICIT”。 -DAX 是一种不区分大小写的语言。启用后,对表、列和度量值的引用会自动更正大小写,使其与所引用对象的实际名称一致。 +**首选函数大小写**(大写):此设置允许您更改函数使用的大小写,例如 `CALCULATE(...)`、`SUM(...)` 等。 -##### _始终为表名加引号_(已禁用) +**修正关键字/函数大小写**(已启用):选中此选项后,每当代码自动格式化或手动格式化时,关键字和函数的大小写都会自动修正。 -在 DAX 中,引用某些表名时不需要用单引号括起来。不过,如果你希望表引用始终带引号,可以勾选此选项。 +**修正对象引用大小写**(已启用):DAX 是一种不区分大小写的语言。启用此选项后,对表、列和度量值的引用将自动修正,使大小写与被引用对象物理名称的大小写相匹配。 -##### _扩展列始终加前缀_(已禁用) +**始终引用表**(禁用):在 DAX 中引用某些表名时,不需要使用单引号括起来。但是,如果您希望表引用始终带引号,则可以选中此选项。 -扩展列可以在不带表名的情况下定义。选中后,DAX编辑器将始终为扩展列添加表前缀。 +**始终为扩展列添加前缀**(禁用):可以不使用表名来定义扩展列。选中此选项后,DAX编辑器将为扩展列添加表名前缀。 -## DAX编辑器 > Code Assist +## 文本编辑器 > DAX编辑器 > Code Assist -![DAX编辑器 Code Assist 偏好设置](~/content/assets/images/pref-dax-code-assist.png) +![DAX 编辑器 Code Assist 偏好](~/content/assets/images/pref-dax-code-assist.png) -在此页面上,你可以配置两项最重要的 Code Assist 功能:调用提示(也称“参数信息”)和自动完成。 +在此页面上,您可以配置两个最重要的 Code Assist 功能,即调用提示(又称“参数信息”)和自动完成。 -##### _自动完成触发方式_ +**自动完成触发器**:控制自动完成列表何时出现。选项包括在键入一定数量的字符后自动触发,或使用 CTRL+空格键手动触发。 -控制自动补全列表何时出现。可选项包括:在输入一定数量的字符后自动触发,或通过 CTRL+Space 手动触发。 +**参数信息触发器**:控制参数信息何时出现。选项包括在打开函数括号时自动触发,或手动触发。 -##### _参数提示触发_ +**增量搜索**(已启用):在自动完成中启用模糊/增量搜索。这使您能够通过键入名称的部分内容(而不仅仅是开头)来查找项目。 -控制参数信息何时显示。可选项包括:在输入函数左括号时自动触发,或手动触发。 +**建议表格名称**(已启用):在自动补全建议中包含表格名称。 -##### _增量搜索_(已启用) +**始终引用表名**(已禁用):即使不需要,也会在建议中自动引用表名。 -在自动补全中启用模糊/增量搜索。这样你就可以通过输入名称的一部分来查找条目,而不仅限于名称开头。 +**仅显示首字母**(禁用):仅显示以所键入字母开头的项目。禁用此选项以改用增量搜索。 -##### _建议表名_(已启用) +## 文本编辑器 > DAX编辑器 > 代码操作 -在自动完成建议中包含表名。 - -##### _始终为表名加引号_(已禁用) - -在建议中自动为表名加引号,即使并非必需。 - -##### _仅显示首字母_(已禁用) - -仅显示以输入字母开头的条目。禁用此项可改用增量搜索。 - -## DAX编辑器 > 代码操作 - -![DAX编辑器代码操作偏好设置](~/content/assets/images/pref-dax-code-actions.png) +![DAX 编辑器代码操作偏好](~/content/assets/images/pref-dax-code-actions.png) 配置自动代码改进建议: -##### _变量前缀_ +**变量前缀**:定义变量名称的可接受前缀(例如:`_`、`__`、`$`、`var_`、`var`、`v_`、`v`、`VAR_`)。代码操作建议将这些前缀添加到不遵循约定的变量名称中。 -定义变量名可接受的前缀(例如 `_`、`__`、`var_`、`var`、`v_`、`v`、`VAR_`)。代码操作会建议为不符合约定的变量名添加这些前缀。 +**列前缀**:定义临时列名称的可接受前缀(例如 `@`、`$`、`_`、`x`、`x_`)。代码操作建议将这些前缀添加到不符合约定的临时列名中。 -##### _列前缀_ +## SQL 编辑器/M 编辑器/C# 编辑器 -定义临时列名可接受的前缀(例如 `@`、`_`、`x`、`x_`)。代码操作会建议为不符合约定的临时列名添加这些前缀。 + -## SQL 编辑器 / M 编辑器 / C# 编辑器 - - - -SQL、M(Power Query)和 C# Script 编辑器也提供类似的配置选项,包括: - -- 语法高亮和配色方案 +SQL、M (Power Query) 和 C# 脚本编辑器提供类似的配置选项,包括: +- 语法突出显示和配色方案 - 自动格式化选项 -- Code Assist 和自动完成功能 +- 代码助手和自动完成功能 - 注释样式和缩进偏好 -每个编辑器都可以单独自定义,以符合你偏好的代码风格。 +每个编辑器都可以独立定制,以匹配您偏好的编码风格。 ## DAX Formatter - - -##### _DAX formatter 同意_(已禁用) - -同意将 DAX 代码发送到外部 DAX 格式化服务 (www.daxformatter.com)。启用后,你可以使用此服务按社区标准格式化 DAX 代码。 + -##### _DAX formatter 请求超时_(5000) +**DAX 格式化程序同意**(已禁用):同意将 DAX 代码发送到外部 DAX 格式化服务 (www.daxformatter.com )。启用后,您可以使用此服务根据社区标准格式化 DAX 代码。 -DAX formatter 请求的超时时间,单位为毫秒。如果使用 DAX Formatter 时经常遇到超时错误,请增大此值。 +**DAX Formatter 请求超时** (5000):DAX Formatter 请求的超时时间(以毫秒为单位)。如果您在使用 DAX 格式化工具时经常遇到超时错误,请增加此值。 -## DAX优化器集成 +## DAX 优化器集成 - + -配置 DAX优化器集成(仅企业版): +配置与 DAX Optimizer 的集成(仅限企业版): -##### _自动连接_(null/提示) +**自动连接**(空/提示):在 DAX 优化器可用时自动连接。如果未设置,则首次会显示提示。 -在可用时自动连接到 DAX优化器。未设置时,系统会在首次使用时提示你。 +**混淆 VPAX 文件**(已启用):将模型元数据发送到 DAX 优化器时进行匿名化处理。这可以保护表名和列名等敏感信息,同时仍允许进行分析。 -##### _对 VPAX 文件进行混淆处理_(已启用) +**混淆字典目录** (`%LocalAppData%\TabularEditor3\DaxOptimizer` ):指定混淆字典的存储位置。该字典在多项分析中保持一致的混淆。 -发送到 DAX优化器时对模型元数据进行匿名化处理。这可以保护表名和列名等敏感信息,同时仍允许进行分析。 +## 文件格式 > VertiPaq分析器 -##### _混淆字典目录_(`%LocalAppData%\TabularEditor3\DaxOptimizer`) +![VertiPaq分析器偏好](~/content/assets/images/pref-vertipaq-analyzer.png) -指定混淆字典的存储位置。该字典可在多次分析之间保持一致的混淆结果。 +**包含 TOM 元数据**(启用):在 VertiPaq Analyzer 统计信息中包含 Tabular Object Model 元数据。这提供了有关您的模型结构的更丰富的信息。 -## VertiPaq分析器 +**从数据读取统计信息**(已启用):通过扫描实际数据来读取统计信息(更准确,但速度较慢)。禁用时,仅使用元数据。如果从数据读取统计信息失败(例如,当高基数列超过 Power BI 容量的每个查询内存限制时),**收集统计信息**将从元数据收集统计信息,并显示**未读取数据即收集统计信息**警告。 -![VertiPaq分析器偏好设置](~/content/assets/images/pref-vertipaq-analyzer.png) +**Direct Lake 提取模式** (ResidentOnly):如何从 Direct Lake 模型提取统计信息: +- **ResidentOnly**:仅分析当前加载到内存中的数据 +- **全部**:包括非驻留数据(速度较慢,可能会触发数据加载) -##### _包含 TOM 元数据_(已启用) +**从动态管理视图读取统计信息**(已禁用):使用 DMV 收集统计信息(速度更快,但准确性较低)。这是从数据读取的替代方案。 -在 VertiPaq分析器的统计信息中包含 Tabular Object Model 元数据。这将提供有关模型结构的更丰富信息。 +**关系采样行数** (3):分析关系时要采样的行数。值越高,准确性越高,但所需时间也越长。 -##### _从数据读取统计信息_(已启用) - -通过扫描实际数据来读取统计信息(更准确,但更慢)。禁用后,仅使用元数据。 - -##### _Direct Lake 提取模式_(ResidentOnly) - -如何从 Direct Lake 模型中提取统计信息: - -- **ResidentOnly**:仅分析当前已加载到内存中的数据 -- **All**:包含未驻留的数据(更慢,可能触发数据加载) - -##### _从动态管理视图读取统计信息_(已禁用) - -使用 DMV 收集统计信息(更快,但准确性较低)。这是从数据读取的替代方案。 - -##### _关系采样行数_(3) - -分析关系时要采样的行数。值越高,准确性越高,但耗时也越长。 - -##### _列批次大小_(50) - -每个批次中要分析的列数。请根据模型大小和性能要求调整此项。 +**列批处理大小** (50):每个批次中要分析的列数。请根据您的模型大小和性能要求进行调整。 ## Power BI 集成 -![Power BI 集成偏好设置](~/content/assets/images/pref-power-bi.png) - -##### _Power BI 端点基础 URL_(`https://api.powerbi.com`) +![Power BI 集成偏好](~/content/assets/images/pref-power-bi.png) -用于 Power BI API 调用的基础 URL。如果你在主权云或自定义环境中工作,请更改此设置。 +**Power BI 端点基础 URL** (`https://api.powerbi.com` ):Power BI API 调用的基础 URL。如果您使用的是主权云或自定义环境,请更改此项。 -##### _Fabric 端点基础 URL_(`https://api.fabric.microsoft.com`) +**Fabric 端点基础 URL** (`https://api.fabric.microsoft.com`):Microsoft Fabric API 调用的基础 URL。如果您使用的是主权云或自定义环境,请更改此项。 -用于调用 Microsoft Fabric API 的基础 URL。如果你在主权云或自定义环境中工作,请更改此设置。 - -##### _使用嵌入式浏览器进行身份验证_(已启用) - -使用嵌入式浏览器进行 OAuth 身份验证,而不是系统浏览器。这将提供更集成的体验。 +**使用嵌入式浏览器进行身份验证**(已启用):使用嵌入式浏览器进行 OAuth 身份验证,而非系统浏览器。这可提供更一体化的体验。 ## 代理设置 -![代理设置偏好设置](~/content/assets/images/pref-proxy-settings.png) - -##### _代理类型_(无) +![代理设置首选项](~/content/assets/images/pref-proxy-settings.png) -可在以下选项中选择: - -- **无**:不配置代理 +**代理类型**(无):在以下选项中进行选择: +- **无**:无代理配置 - **系统**:使用系统代理设置 - **自定义**:指定自定义代理配置 -##### _代理地址_ - -代理服务器的地址(例如 `http://proxy.company.com:8080`)。 - -##### _代理用户_ - -如需代理身份验证,请输入用户名。 - -##### _代理密码_ - -用于代理身份验证的密码(加密存储)。 - -##### _使用默认凭据_(已启用) +**代理地址**:代理服务器的地址(例如 `http://proxy.company.com`)。 -使用当前的 Windows 凭据进行代理身份验证。其行为与 [Power BI Desktop 一致](https://docs.microsoft.com/power-bi/connect-data/desktop-troubleshooting-sign-in#using-default-system-credentials-for-web-proxy)。 +**代理用户**:如果需要,这是用于代理身份验证的用户名。 -##### _对本地地址绕过代理_(已启用) +**代理密码**:代理身份验证的密码(以加密形式存储)。 -对本地地址绕过代理。出于性能考虑,建议使用此选项。 +**使用默认凭据**(启用):使用当前的 Windows 凭据进行代理身份验证。这实现了[与 Power BI Desktop 相同的行为](https://docs.microsoft.com/power-bi/connect-data/desktop-troubleshooting-sign-in#using-default-system-credentials-for-web-proxy)。 -##### _代理绕过列表_ +**本地绕过代理**(已启用):绕过本地地址的代理。出于性能考虑,建议这样做。 -应绕过代理的地址列表(例如 `localhost;*.company.local`)。 +**代理绕过列表**:应绕过代理的地址列表(例如:`localhost;*.company.local`)。 ## 后续步骤 -如需查看有关最常调整的偏好设置的易用指南,请参阅入门指南 [Personalizing TE3](xref:personalizing-te3)。 +如需了解有关最常用调整偏好的用户友好型指南,请参阅入门指南[个性化设置 TE3](xref:personalizing-te3)。 diff --git a/localizedContent/zh/content/references/release-history.md b/localizedContent/zh/content/references/release-history.md index 84a63f380..6ad19f9e9 100644 --- a/localizedContent/zh/content/references/release-history.md +++ b/localizedContent/zh/content/references/release-history.md @@ -1,402 +1,416 @@ --- uid: release-history -title: 完整发布历史 +title: 完整版本历史记录 +updated: 2026-10-23 --- +# 完整版本历史记录 -# 完整发布历史 - -- 2026-09-22 **Tabular Editor 3.27.0.0** (_[发布说明](release-notes/3_27_0_0.md)_) - - .NET 10 安装程序(.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) - - .NET 10 便携版(.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) - - .NET 10 安装程序(.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) - - .NET 8 安装程序(.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) - - .NET 8 安装程序(.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) -- 2026-07-10 **Tabular Editor 3.26.3** (_[发布说明](release-notes/3_26_3.md)_) - - .NET 8 安装程序(.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) - - .NET 8 安装程序(.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) -- 2026-06-25 **Tabular Editor 3.26.2** (_[发布说明](release-notes/3_26_2.md)_) - - .NET 8 安装程序(.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.zip) - - .NET 8 安装程序(.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) -- 2026-04-17 **Tabular Editor 3.26.1** (_[发布说明](release-notes/3_26_1.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) -- 2026-03-25 **Tabular Editor 3.26.0** (_[发布说明](release-notes/3_26_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) -- 2026-03-02 **Tabular Editor 3.25.5** (_[发布说明](release-notes/3_25_5.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) - - .NET 8 免安装版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) -- 2026-02-11 **Tabular Editor 3.25.3** (_[发布说明](release-notes/3_25_3.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) - - .NET 8 免安装版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) -- 2026-02-11 **Tabular Editor 3.25.2** (_[发布说明](release-notes/3_25_2.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.ARM64.Net8.exe) - - .NET 8 免安装版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.msi) -- 2026-01-22 **Tabular Editor 3.25.1** (_[发布说明](release-notes/3_25_1.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.x64.Net8.exe),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.ARM64.Net8.exe) - - .NET 8 免安装版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.zip),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.msi),[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.msi) -- 2025-11-11 **Tabular Editor 3.24.2**(_[发布说明](release-notes/3_24_2.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) -- 2025-11-05 **Tabular Editor 3.24.1**(_[发布说明](release-notes/3_24_1.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.msi) -- 2025-10-28 **Tabular Editor 3.24.0**(_[发布说明](release-notes/3_24_0.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) -- 2025-09-15 **Tabular Editor 3.23.1**(_[发布说明](release-notes/3_23_1.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) -- 2025-08-28 **Tabular Editor 3.23.0**(_[发布说明](release-notes/3_23_0.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.ARM64.Net8.exe) - - .NET 8 便携版 (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.zip) - - .NET 8 安装程序 (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.msi) -- 2025-06-28 **Tabular Editor 3.22.1**(_[发布说明](release-notes/3_22_1.md)_) - - .NET 8 安装程序 (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) -- 2025-06-19 **Tabular Editor 3.22.0**(_[发布说明](release-notes/3_22_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.msi) -- 2025-04-25 **Tabular Editor 3.21.0**(_[发布说明](release-notes/3_21_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.msi) -- 2025-04-11 **Tabular Editor 3.20.1**(_[发布说明](release-notes/3_20_1.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.msi) -- 2025-02-21 **Tabular Editor 3.20.0**(_[发布说明](release-notes/3_20_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.msi) -- 2024-12-19 **Tabular Editor 3.19.0**(_[发布说明](release-notes/3_19_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.msi) -- 2024-11-14 **Tabular Editor 3.18.2**(_[发布说明](release-notes/3_18_2.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.msi) -- 2024-11-11 **Tabular Editor 3.18.1** (_[发布说明](release-notes/3_18_1.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.msi) -- 2024-10-31 **Tabular Editor 3.18.0** (_[发布说明](release-notes/3_18_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.msi) -- 2024-08-22 **Tabular Editor 3.17.1**(_[发行说明](release-notes/3_17_1.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.msi) -- 2024-08-14 **Tabular Editor 3.17.0**(_[发行说明](release-notes/3_17_0.md)_) - - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.Net8.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.Net8.exe) - - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.zip) - - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.msi) - - .NET 6 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.exe),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.exe) - - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.zip),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.zip) - - .NET 6 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.msi),[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.msi) -- 2024-06-19 **Tabular Editor 3.16.2**(_[发布说明](release-notes/3_16_2.md)_) +- 2026-10-23 **Tabular Editor 3.27.1.1** (*[发布说明](release-notes/3_27_1_1.md)*) + - .NET 10 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) + - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) + - .NET 10 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) +- 2026-10-15 **Tabular Editor 3.27.1.0** (*[发布说明](release-notes/3_27_1_0.md)*) + - .NET 10 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) + - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) + - .NET 10 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) +- 2026-09-22 **Tabular Editor 3.27.0.0** (*[发布说明](release-notes/3_27_0_0.md)*) + - .NET 10 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net10.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net10.exe) + - .NET 10 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.zip) + - .NET 10 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net10.msi) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.27.0.0.ARM64.Net8.msi) +- 2026-07-10 **Tabular Editor 3.26.3** (*[发布说明](release-notes/3_26_3.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.3.ARM64.Net8.msi) +- 2026-06-25 **Tabular Editor 3.26.2** (*[发布说明](release-notes/3_26_2.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.2.ARM64.Net8.msi) +- 2026-04-17 **Tabular Editor 3.26.1** (*[发布说明](release-notes/3_26_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.1.ARM64.Net8.msi) +- 2026-03-25 **Tabular Editor 3.26.0** (*[发布说明](release-notes/3_26_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.26.0.ARM64.Net8.msi) +- 2026-03-02 **Tabular Editor 3.25.5** (*[发布说明](release-notes/3_25_5.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.5.ARM64.Net8.msi) +- 2026-02-11 **Tabular Editor 3.25.3** (*[发布说明](release-notes/3_25_3.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.3.ARM64.Net8.msi) +- 2026-02-11 **Tabular Editor 3.25.2** (*[发布说明](release-notes/3_25_2.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.2.ARM64.Net8.msi) +- 2026-01-22 **Tabular Editor 3.25.1** (*[发布说明](release-notes/3_25_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.1.ARM64.Net8.msi) +- 2025-11-11 **Tabular Editor 3.24.2** (*[发布说明](release-notes/3_24_2.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) +- 2025-11-05 **Tabular Editor 3.24.1** (*[发布说明](release-notes/3_24_1.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.1.ARM64.Net8.msi) +- 2025-10-28 **Tabular Editor 3.24.0** (*[发布说明](release-notes/3_24_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.0.ARM64.Net8.msi) +- 2025-09-15 **Tabular Editor 3.23.1** (*[发布说明](release-notes/3_23_1.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.1.ARM64.Net8.msi) +- 2025-08-28 **Tabular Editor 3.23.0** (*[发布说明](release-notes/3_23_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.x64.Net8.exe)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.Installer.ARM64.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.23.0.ARM64.Net8.msi) +- 2025-06-28 **Tabular Editor 3.22.1** (*[发布说明](release-notes/3_22_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.1.x86.Net8.msi) +- 2025-06-19 **Tabular Editor 3.22.0** (*[发布说明](release-notes/3_22_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.22.0.x86.Net8.msi) +- 2025-04-25 **Tabular Editor 3.21.0** (*[发布说明](release-notes/3_21_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.21.0.x86.Net8.msi) +- 2025-04-11 **Tabular Editor 3.20.1** (*[发布说明](release-notes/3_20_1.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.1.x86.msi) +- 2025-02-21 **Tabular Editor 3.20.0** (*[发布说明](release-notes/3_20_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.20.0.x86.msi) +- 2024-12-19 **Tabular Editor 3.19.0** (*[发布说明](release-notes/3_19_0.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.19.0.x86.msi) +- 2024-11-14 **Tabular Editor 3.18.2** (*[发布说明](release-notes/3_18_2.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.2.x86.msi) +- 2024-11-11 **Tabular Editor 3.18.1** (*[发布说明](release-notes/3_18_1.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.1.x86.msi) +- 2024-10-31 **Tabular Editor 3.18.0** (*[发布说明](release-notes/3_18_0.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.18.0.x86.msi) +- 2024-08-22 **Tabular Editor 3.17.1** (*[发布说明](release-notes/3_17_1.md)*) + - .NET 8 安装程序(.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.zip) + - .NET 8 安装程序(.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.1.x86.msi) +- 2024-08-14 **Tabular Editor 3.17.0** (*[发布说明](release-notes/3_17_0.md)*) + - .NET 8 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.Net8.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.Net8.exe) + - .NET 8 便携版(.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.zip) + - .NET 8 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.Net8.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.Net8.msi) + - .NET 6 安装程序 (.exe):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x64.exe)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.Installer.x86.exe) + - .NET 6 便携版(.zip):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.zip) + - .NET 6 安装程序 (.msi):[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.17.0.x86.msi) +- 2024-06-19 **Tabular Editor 3.16.2** (*[发布说明](release-notes/3_16_2.md)*) - [TabularEditor.3.16.2.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.Installer.x64.exe) - [TabularEditor.3.16.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.Installer.x86.exe) - [TabularEditor.3.16.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x64.zip) - [TabularEditor.3.16.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x86.zip) - [TabularEditor.3.16.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x64.msi) - [TabularEditor.3.16.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.2.x86.msi) -- 2024-06-17 **Tabular Editor 3.16.1**(_[发布说明](release-notes/3_16_1.md)_) +- 2024-06-17 **Tabular Editor 3.16.1** (*[发布说明](release-notes/3_16_1.md)*) - [TabularEditor.3.16.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.Installer.x64.exe) - [TabularEditor.3.16.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.Installer.x86.exe) - [TabularEditor.3.16.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x64.zip) - [TabularEditor.3.16.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x86.zip) - [TabularEditor.3.16.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x64.msi) - [TabularEditor.3.16.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.1.x86.msi) -- 2024-06-10 **Tabular Editor 3.16.0**(_[发布说明](release-notes/3_16_0.md)_) +- 2024-06-10 **Tabular Editor 3.16.0** (*[发布说明](release-notes/3_16_0.md)*) - [TabularEditor.3.16.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.Installer.x64.exe) - [TabularEditor.3.16.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.Installer.x86.exe) - [TabularEditor.3.16.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x64.zip) - [TabularEditor.3.16.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x86.zip) - [TabularEditor.3.16.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x64.msi) - [TabularEditor.3.16.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.16.0.x86.msi) -- 2024-04-17 **Tabular Editor 3.15.0**(_[发布说明](release-notes/3_15_0.md)_) +- 2024-04-17 **Tabular Editor 3.15.0** (*[发布说明](release-notes/3_15_0.md)*) - [TabularEditor.3.15.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.Installer.x64.exe) - [TabularEditor.3.15.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.Installer.x86.exe) - [TabularEditor.3.15.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x64.zip) - [TabularEditor.3.15.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x86.zip) - [TabularEditor.3.15.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x64.msi) - [TabularEditor.3.15.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.15.0.x86.msi) -- 2024-02-20 **Tabular Editor 3.14.0**(_[发布说明](release-notes/3_14_0.md)_) +- 2024-02-20 **Tabular Editor 3.14.0** (*[发布说明](release-notes/3_14_0.md)*) - [TabularEditor.3.14.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.Installer.x64.exe) - [TabularEditor.3.14.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.Installer.x86.exe) - [TabularEditor.3.14.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x64.zip) - [TabularEditor.3.14.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x86.zip) - [TabularEditor.3.14.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x64.msi) - [TabularEditor.3.14.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.14.0.x86.msi) -- 2023-12-15 **Tabular Editor 3.13.0**(_[发布说明](release-notes/3_13_0.md)_) +- 2023-12-15 **Tabular Editor 3.13.0** (*[发布说明](release-notes/3_13_0.md)*) - [TabularEditor.3.13.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) - [TabularEditor.3.13.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) - [TabularEditor.3.13.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip) - [TabularEditor.3.13.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) - [TabularEditor.3.13.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi) - [TabularEditor.3.13.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) -- 2023-12-01 **Tabular Editor 3.12.1**(_[发布说明](release-notes/3_12_1.md)_) +- 2023-12-01 **Tabular Editor 3.12.1** (*[发布说明](release-notes/3_12_1.md)*) - [TabularEditor.3.12.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x64.exe) - [TabularEditor.3.12.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x86.exe) - [TabularEditor.3.12.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x64.zip) - [TabularEditor.3.12.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x86.zip) - [TabularEditor.3.12.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x64.msi) - [TabularEditor.3.12.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x86.msi) -- 2023-11-27 **Tabular Editor 3.12.0**(_[发布说明](release-notes/3_12_0.md)_) +- 2023-11-27 **Tabular Editor 3.12.0** (*[发布说明](release-notes/3_12_0.md)*) - [TabularEditor.3.12.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.Installer.x64.exe) - [TabularEditor.3.12.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.Installer.x86.exe) - [TabularEditor.3.12.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x64.zip) - [TabularEditor.3.12.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x86.zip) - [TabularEditor.3.12.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x64.msi) - [TabularEditor.3.12.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.0.x86.msi) -- 2023-09-25 **Tabular Editor 3.11.0**(_[发布说明](release-notes/3_11_0.md)_) +- 2023-09-25 **Tabular Editor 3.11.0** (*[发布说明](release-notes/3_11_0.md)*) - [TabularEditor.3.11.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.Installer.x64.exe) - [TabularEditor.3.11.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.Installer.x86.exe) - [TabularEditor.3.11.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x64.zip) - [TabularEditor.3.11.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x86.zip) - [TabularEditor.3.11.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x64.msi) - [TabularEditor.3.11.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x86.msi) -- 2023-08-30 **Tabular Editor 3.10.1**(_[发布说明](release-notes/3_10_1.md)_) +- 2023-08-30 **Tabular Editor 3.10.1** (*[发布说明](release-notes/3_10_1.md)*) - [TabularEditor.3.10.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.Installer.x64.exe) - [TabularEditor.3.10.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.Installer.x86.exe) - [TabularEditor.3.10.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x64.zip) - [TabularEditor.3.10.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x86.zip) - [TabularEditor.3.10.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x64.msi) - [TabularEditor.3.10.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x86.msi) -- 2023-08-24 **Tabular Editor 3.10.0**(_[发布说明](release-notes/3_10_0.md)_) +- 2023-08-24 **Tabular Editor 3.10.0** (*[发布说明](release-notes/3_10_0.md)*) - [TabularEditor.3.10.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.Installer.x64.exe) - [TabularEditor.3.10.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.Installer.x86.exe) - [TabularEditor.3.10.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x64.zip) - [TabularEditor.3.10.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x86.zip) - [TabularEditor.3.10.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x64.msi) - [TabularEditor.3.10.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.0.x86.msi) -- 2023-07-20 **Tabular Editor 3.9.0**(_[发布说明](release-notes/3_9_0.md)_) +- 2023-07-20 **Tabular Editor 3.9.0** (*[发布说明](release-notes/3_9_0.md)*) - [TabularEditor.3.9.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.Installer.x64.exe) - [TabularEditor.3.9.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.Installer.x86.exe) - [TabularEditor.3.9.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x64.zip) - [TabularEditor.3.9.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x86.zip) - [TabularEditor.3.9.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x64.msi) - [TabularEditor.3.9.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x86.msi) -- 2023-06-23 **Tabular Editor 3.8.0**(_[发布说明](release-notes/3_7_1.md)_) +- 2023-06-23 **Tabular Editor 3.8.0** (*[发布说明](release-notes/3_7_1.md)*) - [TabularEditor.3.8.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.Installer.x64.exe) - [TabularEditor.3.8.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.Installer.x86.exe) - [TabularEditor.3.8.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x64.zip) - [TabularEditor.3.8.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x86.zip) - [TabularEditor.3.8.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x64.msi) - [TabularEditor.3.8.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x86.msi) -- 2023-05-22 **Tabular Editor 3.7.1** (_[发布说明](release-notes/3_7_1.md)_) +- 2023-05-22 **Tabular Editor 3.7.1** (*[发布说明](release-notes/3_7_1.md)*) - [TabularEditor.3.7.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.Installer.x64.exe) - [TabularEditor.3.7.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.Installer.x86.exe) - [TabularEditor.3.7.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x64.zip) - [TabularEditor.3.7.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x86.zip) - [TabularEditor.3.7.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x64.msi) - [TabularEditor.3.7.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.1.x86.msi) -- 2023-05-17 **Tabular Editor 3.7.0** (_[发布说明](release-notes/3_7_0.md)_) +- 2023-05-17 **Tabular Editor 3.7.0** (*[发布说明](release-notes/3_7_0.md)*) - [TabularEditor.3.7.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.Installer.x64.exe) - [TabularEditor.3.7.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.Installer.x86.exe) - [TabularEditor.3.7.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x64.zip) - [TabularEditor.3.7.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x86.zip) - [TabularEditor.3.7.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x64.msi) - [TabularEditor.3.7.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.7.0.x86.msi) -- 2023-04-19 **Tabular Editor 3.6.0** (_[发布说明](release-notes/3_6_0.md)_) +- 2023-04-19 **Tabular Editor 3.6.0** (*[发布说明](release-notes/3_6_0.md)*) - [TabularEditor.3.6.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.Installer.x64.exe) - [TabularEditor.3.6.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.Installer.x86.exe) - [TabularEditor.3.6.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x64.zip) - [TabularEditor.3.6.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x86.zip) - [TabularEditor.3.6.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x64.msi) - [TabularEditor.3.6.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.6.0.x86.msi) -- 2023-03-28 **Tabular Editor 3.5.1** (_[发布说明](release-notes/3_5_1.md)_) +- 2023-03-28 **Tabular Editor 3.5.1** (*[发布说明](release-notes/3_5_1.md)*) - [TabularEditor.3.5.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.Installer.x64.exe) - [TabularEditor.3.5.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.Installer.x86.exe) - [TabularEditor.3.5.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x64.zip) - [TabularEditor.3.5.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x86.zip) - [TabularEditor.3.5.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x64.msi) - [TabularEditor.3.5.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.1.x86.msi) -- 2023-03-15 **Tabular Editor 3.5.0** (_[发布说明](release-notes/3_5_0.md)_) +- 2023-03-15 **Tabular Editor 3.5.0** (*[发布说明](release-notes/3_5_0.md)*) - [TabularEditor.3.5.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.Installer.x64.exe) - [TabularEditor.3.5.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.Installer.x86.exe) - [TabularEditor.3.5.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x64.zip) - [TabularEditor.3.5.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x86.zip) - [TabularEditor.3.5.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x64.msi) - [TabularEditor.3.5.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.5.0.x86.msi) -- 2023-02-09 **Tabular Editor 3.4.2** (_[发布说明](release-notes/3_4_2.md)_): +- 2023-02-09 **Tabular Editor 3.4.2** (*[发布说明](release-notes/3_4_2.md)*): - [TabularEditor.3.4.2.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.Installer.x64.exe) - - 下载 [TabularEditor.3.4.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.Installer.x86.exe) - - 下载 [TabularEditor.3.4.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x64.zip) - - 下载 [TabularEditor.3.4.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x86.zip) - - 下载 [TabularEditor.3.4.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x64.msi) - - 下载 [TabularEditor.3.4.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x86.msi) -- 2023-02-03 **Tabular Editor 3.4.1** (_[发布说明](release-notes/3_4_1.md)_): - - _不建议使用——请改用 [3.4.2](release-notes/3_4_2.md)。_ - - 下载 [TabularEditor.3.4.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.Installer.x64.exe) - - 下载 [TabularEditor.3.4.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.Installer.x86.exe) - - 下载 [TabularEditor.3.4.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x64.zip) - - 下载 [TabularEditor.3.4.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x86.zip) - - 下载 [TabularEditor.3.4.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x64.msi) - - 下载 [TabularEditor.3.4.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x86.msi) -- 2022-12-13 **Tabular Editor 3.4.0** (_[发布说明](release-notes/3_4_0.md)_): - - 下载 [TabularEditor.3.4.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.Installer.x64.exe) - - 下载 [TabularEditor.3.4.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.Installer.x86.exe) - - 下载 [TabularEditor.3.4.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x64.zip) - - 下载 [TabularEditor.3.4.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x86.zip) - - 下载 [TabularEditor.3.4.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x64.msi) - - 下载 [TabularEditor.3.4.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x86.msi) -- 2022-11-11 **Tabular Editor 3.3.6** (_[发布说明](release-notes/3_3_6.md)_): - - 下载 [TabularEditor.3.3.6.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.Installer.x64.exe) - - 下载 [TabularEditor.3.3.6.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.Installer.x86.exe) - - 下载 [TabularEditor.3.3.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x64.zip) - - 下载 [TabularEditor.3.3.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x86.zip) - - 下载 [TabularEditor.3.3.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x64.msi) - - 下载 [TabularEditor.3.3.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x86.msi) -- 2022-09-06 **Tabular Editor 3.3.5** (_[发布说明](release-notes/3_3_5.md)_): - - 下载 [TabularEditor.3.3.5.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.Installer.x64.exe) - - 下载 [TabularEditor.3.3.5.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.Installer.x86.exe) + - [TabularEditor.3.4.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.Installer.x86.exe) + - [TabularEditor.3.4.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x64.zip) + - [TabularEditor.3.4.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x86.zip) + - [TabularEditor.3.4.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x64.msi) + - [TabularEditor.3.4.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.2.x86.msi) +- 2023-02-03 **Tabular Editor 3.4.1** (*[发布说明](release-notes/3_4_1.md)*): + - *不推荐使用 - 请改用 [3.4.2](release-notes/3_4_2.md)。* + - [TabularEditor.3.4.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.Installer.x64.exe) + - [TabularEditor.3.4.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.Installer.x86.exe) + - [TabularEditor.3.4.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x64.zip) + - [TabularEditor.3.4.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x86.zip) + - [TabularEditor.3.4.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x64.msi) + - [TabularEditor.3.4.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.1.x86.msi) +- 2022-12-13 **Tabular Editor 3.4.0** (*[发布说明](release-notes/3_4_0.md)*): + - [TabularEditor.3.4.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.Installer.x64.exe) + - [TabularEditor.3.4.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.Installer.x86.exe) + - [TabularEditor.3.4.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x64.zip) + - [TabularEditor.3.4.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x86.zip) + - [TabularEditor.3.4.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x64.msi) + - [TabularEditor.3.4.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.4.0.x86.msi) +- 2022-11-11 **Tabular Editor 3.3.6** (*[发布说明](release-notes/3_3_6.md)*): + - [TabularEditor.3.3.6.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.Installer.x64.exe) + - [TabularEditor.3.3.6.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.Installer.x86.exe) + - [TabularEditor.3.3.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x64.zip) + - [TabularEditor.3.3.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x86.zip) + - [TabularEditor.3.3.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x64.msi) + - [TabularEditor.3.3.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.6.x86.msi) +- 2022-09-06 **Tabular Editor 3.3.5** (*[发布说明](release-notes/3_3_5.md)*): + - [TabularEditor.3.3.5.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.Installer.x64.exe) + - [TabularEditor.3.3.5.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.Installer.x86.exe) - [TabularEditor.3.3.5.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x64.zip) - [TabularEditor.3.3.5.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x86.zip) - [TabularEditor.3.3.5.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x64.msi) - [TabularEditor.3.3.5.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.5.x86.msi) -- 2022-08-10 **Tabular Editor 3.3.4** (_[发布说明](release-notes/3_3_4.md)_): +- 2022-08-10 **Tabular Editor 3.3.4** (*[发布说明](release-notes/3_3_4.md)*): - [TabularEditor.3.3.4.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x64.exe) - [TabularEditor.3.3.4.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x86.exe) - [TabularEditor.3.3.4.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x64.zip) - [TabularEditor.3.3.4.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x86.zip) - [TabularEditor.3.3.4.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x64.msi) - [TabularEditor.3.3.4.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x86.msi) -- 2022-07-17 **Tabular Editor 3.3.3** (_[发布说明](release-notes/3_3_3.md)_): +- 2022-07-17 **Tabular Editor 3.3.3** (*[发布说明](release-notes/3_3_3.md)*): - [TabularEditor.3.3.3.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.Installer.x64.exe) - [TabularEditor.3.3.3.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.Installer.x86.exe) - [TabularEditor.3.3.3.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x64.zip) - [TabularEditor.3.3.3.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x86.zip) - [TabularEditor.3.3.3.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x64.msi) - [TabularEditor.3.3.3.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.3.x86.msi) -- 2022-06-28 **Tabular Editor 3.3.2** (_[发布说明](release-notes/3_3_2.md)_): +- 2022-06-28 **Tabular Editor 3.3.2**(*[发布说明](release-notes/3_3_2.md)*): - [TabularEditor.3.3.2.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.Installer.x64.exe) - [TabularEditor.3.3.2.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.Installer.x86.exe) - [TabularEditor.3.3.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.x64.zip) - [TabularEditor.3.3.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.2.x86.zip) -- 2022-06-16 **Tabular Editor 3.3.0** (_[发布说明](release-notes/3_3_0.md)_): +- 2022-06-16 **Tabular Editor 3.3.0** (*[发布说明](release-notes/3_3_0.md)*): - [TabularEditor.3.3.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x64.msi) - [TabularEditor.3.3.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x86.msi) - [TabularEditor.3.3.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x64.zip) - [TabularEditor.3.3.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.3.0.x86.zip) -- 2022-04-07 **Tabular Editor 3.2.3** (_[发布说明](release-notes/3_2_3.md)_): +- 2022-04-07 **Tabular Editor 3.2.3** (*[发布说明](release-notes/3_2_3.md)*): - [TabularEditor.3.2.3.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x64.msi) - [TabularEditor.3.2.3.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x86.msi) - [TabularEditor.3.2.3.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x64.zip) - [TabularEditor.3.2.3.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.3.x86.zip) -- 2022-02-16 **Tabular Editor 3.2.2** (_[发布说明](release-notes/3_2_2.md)_): +- 2022-02-16 **Tabular Editor 3.2.2** (*[发布说明](release-notes/3_2_2.md)*): - [TabularEditor.3.2.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x64.msi) - [TabularEditor.3.2.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x86.msi) - [TabularEditor.3.2.2.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x64.zip) - [TabularEditor.3.2.2.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.2.x86.zip) -- 2022-01-28 **Tabular Editor 3.2.1** (_[发布说明](release-notes/3_2_1.md)_): +- 2022-01-28 **Tabular Editor 3.2.1** (*[发布说明](release-notes/3_2_1.md)*): - [TabularEditor.3.2.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x64.msi) - [TabularEditor.3.2.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x86.msi) - [TabularEditor.3.2.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x64.zip) - [TabularEditor.3.2.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.1.x86.zip) -- 2022-01-20 **Tabular Editor 3.2.0** (_[发布说明](release-notes/3_2_0.md)_): +- 2022-01-20 **Tabular Editor 3.2.0** (*[发布说明](release-notes/3_2_0.md)*): - [TabularEditor.3.2.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x64.msi) - [TabularEditor.3.2.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x86.msi) - [TabularEditor.3.2.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x64.zip) - [TabularEditor.3.2.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.2.0.x86.zip) -- 2021-12-16 **Tabular Editor 3.1.7** (_[发布说明](release-notes/3_1_7.md)_): +- 2021-12-16 **Tabular Editor 3.1.7**(*[发布说明](release-notes/3_1_7.md)*): - [TabularEditor.3.1.7.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x64.msi) - [TabularEditor.3.1.7.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x86.msi) - [TabularEditor.3.1.7.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x64.zip) - [TabularEditor.3.1.7.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.7.x86.zip) -- 2021-11-23 **Tabular Editor 3.1.6** (_[发布说明](release-notes/3_1_6.md)_): +- 2021-11-23 **Tabular Editor 3.1.6** (*[发布说明](release-notes/3_1_6.md)*): - [TabularEditor.3.1.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x64.msi) - [TabularEditor.3.1.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x86.msi) - [TabularEditor.3.1.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x64.zip) - [TabularEditor.3.1.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.6.x86.zip) -- 2021-11-02 **Tabular Editor 3.1.5** (_[发布说明](release-notes/3_1_5.md)_): +- 2021-11-02 **Tabular Editor 3.1.5** (*[发布说明](release-notes/3_1_5.md)*): - [TabularEditor.3.1.5.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x64.msi) - [TabularEditor.3.1.5.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x86.msi) - [TabularEditor.3.1.5.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x64.zip) - [TabularEditor.3.1.5.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.5.x86.zip) -- 2021-10-07 **Tabular Editor 3.1.4** (_[发布说明](release-notes/3_1_4.md)_): +- 2021-10-07 **Tabular Editor 3.1.4**(*[发布说明](release-notes/3_1_4.md)*): - [TabularEditor.3.1.4.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x64.msi) - [TabularEditor.3.1.4.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x86.msi) - [TabularEditor.3.1.4.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x64.zip) - [TabularEditor.3.1.4.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.4.x86.zip) -- 2021-09-30 **Tabular Editor 3.1.3** (_[发布说明](release-notes/3_1_3.md)_): +- 2021-09-30 **Tabular Editor 3.1.3** (*[发布说明](release-notes/3_1_3.md)*): - [TabularEditor.3.1.3.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x64.msi) - [TabularEditor.3.1.3.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x86.msi) - [TabularEditor.3.1.3.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x64.zip) - [TabularEditor.3.1.3.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.1.3.x86.zip) -- 2021-08-10 **Tabular Editor 3.0.10** (_[发布说明](release-notes/3_0_10.md)_): +- 2021-08-10 **Tabular Editor 3.0.10** (*[发布说明](release-notes/3_0_10.md)*): - [TabularEditor.3.0.10.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x64.msi) - [TabularEditor.3.0.10.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x86.msi) - [TabularEditor.3.0.10.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x64.zip) - [TabularEditor.3.0.10.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.10.x86.zip) -- 2021-08-07 **Tabular Editor 3.0.9** (_[发布说明](release-notes/3_0_9.md)_): +- 2021-08-07 **Tabular Editor 3.0.9** (*[发布说明](release-notes/3_0_9.md)*): - [TabularEditor.3.0.9.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x64.msi) - [TabularEditor.3.0.9.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x86.msi) - [TabularEditor.3.0.9.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x64.zip) - [TabularEditor.3.0.9.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.9.x86.zip) -- 2021-08-06 **Tabular Editor 3.0.8** (_[发布说明](release-notes/3_0_8.md)_): +- 2021-08-06 **Tabular Editor 3.0.8** (*[发布说明](release-notes/3_0_8.md)*): - [TabularEditor.3.0.8.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x64.msi) - [TabularEditor.3.0.8.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x86.msi) - [TabularEditor.3.0.8.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x64.zip) - [TabularEditor.3.0.8.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.8.x86.zip) -- 2021-06-30 **Tabular Editor 3.0.7** (_[发布说明](release-notes/3_0_7.md)_): +- 2021-06-30 **Tabular Editor 3.0.7** (*[发布说明](release-notes/3_0_7.md)*): - [TabularEditor.3.0.7.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x64.msi) - [TabularEditor.3.0.7.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x86.msi) - [TabularEditor.3.0.7.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x64.zip) - [TabularEditor.3.0.7.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.7.x86.zip) -- 2021-06-17 **Tabular Editor 3.0.6** (_[发布说明](release-notes/3_0_6.md)_): +- 2021-06-17 **Tabular Editor 3.0.6** (*[发布说明](release-notes/3_0_6.md)*): - [TabularEditor.3.0.6.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x64.msi) - [TabularEditor.3.0.6.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x86.msi) - [TabularEditor.3.0.6.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x64.zip) - [TabularEditor.3.0.6.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.0.6.x86.zip) -- 2021-06-10 **Tabular Editor 3.0.5** (_[发布说明](release-notes/3_0_5.md)_): +- 2021-06-10 **Tabular Editor 3.0.5**(*[发布说明](release-notes/3_0_5.md)*): - [TabularEditor.3.0.5.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.5.x64.msi) - [TabularEditor.3.0.5.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.5.x86.msi) -- 2021-06-08 **Tabular Editor 3.0.4** (_[发布说明](release-notes/3_0_4.md)_): +- 2021-06-08 **Tabular Editor 3.0.4** (*[发布说明](release-notes/3_0_4.md)*): - [TabularEditor.3.0.4.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.4.x64.msi) - [TabularEditor.3.0.4.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.4.x86.msi) -- 2021-06-03 **Tabular Editor 3.0.2** (_[发布说明](release-notes/3_0_2.md)_): +- 2021-06-03 **Tabular Editor 3.0.2** (*[发布说明](release-notes/3_0_2.md)*): - [TabularEditor.3.0.2.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.2.x64.msi) - [TabularEditor.3.0.2.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.2.x86.msi) -- 2021-06-01 **Tabular Editor 3.0.1** (_[发布说明](release-notes/3_0_1.md)_): +- 2021-06-01 **Tabular Editor 3.0.1** (*[发布说明](release-notes/3_0_1.md)*): - [TabularEditor.3.0.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.1.x64.msi) - [TabularEditor.3.0.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.0.1.x86.msi) \ No newline at end of file diff --git a/localizedContent/zh/content/references/release-notes/3_0_3.md b/localizedContent/zh/content/references/release-notes/3_0_3.md index f70303071..244403dee 100644 --- a/localizedContent/zh/content/references/release-notes/3_0_3.md +++ b/localizedContent/zh/content/references/release-notes/3_0_3.md @@ -1,54 +1,53 @@ -# Tabular Editor 3.0.3 +# Tabular Editor 3.0.3 > [!IMPORTANT] -> Tabular Editor 已推出新版本。你可以在[这里](https://docs.tabulareditor.com/references/release-notes)找到最新版本。 +> Tabular Editor 有较新版本可用。您可以在[此处](https://docs.tabulareditor.com/references/release-notes)找到最新版本。 -- 下载[Tabular Editor 3.0.3](https://cdn.tabulareditor.com/files/TabularEditor.3.0.3.x86.msi) -- 下载[Tabular Editor 3.0.3(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.0.3.x64.msi) +- 下载 [Tabular Editor 3.0.3](https://cdn.tabulareditor.com/files/TabularEditor.3.0.3.x86.msi) +- 下载 [Tabular Editor 3.0.3(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.0.3.x64.msi) -_如果你此前未使用过 Tabular Editor 3,则有资格申请 30 天试用,可在安装后提出申请。你也可以 [购买许可证](https://tabulareditor.com/#licensing)._ +*如果您此前从未使用过 Tabular Editor 3,则有资格获得 30 天试用,可在安装后申请。您还可以[购买许可证](https://tabulareditor.com/#licensing )。* -\*\*注意:\*\*如果你之前安装过某个 BETA 版本,则需要在安装此新版本之前手动卸载该版本。 +**注意:**如果您之前安装了某个 BETA 版本,则必须先手动卸载该版本,然后才能安装此新版本。 ## 已知问题 -- 由于需要先修复一些高优先级的 Bug,表导入向导未能赶上此次发布。我们会尽快提供!作为临时替代方案,只需创建一个新表并指定分区查询(SQL 或 M)。然后,右键单击该表,选择“Update Table Schema...”,即可导入列。 -- 更多信息见[路线图](https://github.com/TabularEditor/TabularEditor3/issues/12)。 +- 由于需要修复一些高优先级漏洞,表导入向导未包含在此版本中。它将尽快提供!作为一种变通方法,只需创建一个新表并指定分区查询(SQL 或 M)。然后,右键单击表并选择“更新表架构……”,以导入列。 +- 有关详细信息,请参阅[路线图](https://github.com/TabularEditor/TabularEditor3/issues/12)。 ## 3.0.3 中的新功能: -- 在处理视图中右键单击某个项,现在可以将其重新加入队列;如果该项代表单个表,还会打开该表的数据预览。 +- 现在,右键单击“处理视图”中的项目,即可将该项目重新排入队列,或者,如果该项目代表单个表,则可打开该表的数据预览。 -## 3.0.3 中修复的问题: +## 3.0.3 中的错误修复: -- 当语义分析器在计算列/计算表格上检测到错误时,将不再修改该表中的列(此前在某些情况下会导致关系被删除) -- 修复了查找/替换对话框中某些控件启用状态不正确的问题 -- 根据遥测数据和错误 Report 修复了多个问题,例如: - - 现在可以正常复制/粘贴带有 Lineage tag 的列 - - 在表已重命名时,将表粘贴覆盖到现有表不再导致崩溃 - - “还原”按钮现在会在刷新本地 TOM 之前先重新连接到 AS,从而避免崩溃 +- 当语义分析器在计算列/计算表格上检测到错误时,它不再修改该表格上的列(这在以前会导致在某些情况下关系被丢弃) +- 修复了“查找/替换”对话框上某些控件的启用状态问题 +- 根据遥测和错误报告修复了若干个漏洞,例如: + - 复制/粘贴带有 Lineage tag 的列现在可以正常工作 + - 在表重命名时将表粘贴到现有表上不再导致崩溃 + - “还原”按钮现在会在刷新本地 TOM 之前重新连接到 AS,而不会导致崩溃 - 在属性网格为空时右键单击不再导致崩溃 - - 以及许多其他修复…… -- 修复“Server”下拉框的最近使用项 MRU 未能正确保存的问题 -- 修复工作区模式无法从“用户选项”文件正确加载数据源覆盖值等多个问题。参见 [#28](https://github.com/TabularEditor/TabularEditor3/issues/28)。 -- 修复并改进多项“虚假”DAX 语义错误(支持 ROLLUPADDISSUBTOTAL、带 0 个参数的 COUNTROWS 等) -- 改进多项 DAX 函数的自动补全/参数提示(TOPN、TOPNPERLEVEL、DATEADD/DATESINPERIOD/PARALLELPERIOD 的 interval 参数等),并改进 RETURN 关键字后的提示。 + - 还有很多很多…… +- 修复了“服务器”下拉菜单的 MRU 未正确保存的问题 +- 修复了工作区模式无法从用户选项文件正确加载数据源覆盖值的几个问题。请参阅[#28](https://github.com/TabularEditor/TabularEditor3/issues/28)。 +- 修复并改进了几个“虚假”DAX 语义错误(支持 ROLLUPADDISSUBTOTAL、带 0 个参数的 COUNTROWS 等) +- 改进了多个 DAX 函数(TOPN、TOPNPERLEVEL、DATEADD/DATESINPERIOD/PARALLELPERIOD 的间隔参数)、RETURN 关键字后的自动补全/调用提示等。 -## 从 Tabular Editor 2.x 升级而来? +## 来自 Tabular Editor 2.x? -观看 [此视频](https://www.youtube.com/watch?v=pt3DdcjfImY),快速了解 Tabular Editor 3 的新功能。 另外,也别忘了查看我们的 [入门指南](https://docs.tabulareditor.com/onboarding/index.html)。 +观看[此视频](https://www.youtube.com/watch?v=pt3DdcjfImY),了解 Tabular Editor 3 的新功能。 **Tabular Editor 3 主要功能概览:** - - 完全可自定义的 IDE,支持多显示器、高 DPI 和主题 -- 全新强大的 DAX 代码编辑器,具备自动完成、语法检查、代码折叠等更多功能 -- \*工作区模式,可将更改保存到磁盘,并同时将模型元数据同步到 Analysis Services -- \*以无限滚动预览表数据,创建 PivotGrid,或编写 DAX 查询来浏览模型或测试计算逻辑 -- \*更新 Provider 和 Structured数据源上的表架构(是的,连 M 查询也支持!) -- \*安排数据刷新计划 -- 创建 Data model 图表 -- 创建 DAX 脚本,让您在一个文档中同时编辑多个度量值或其他计算对象 -- 录制 C# Script 并保存为宏(以前称为“自定义操作”) -- 集成 VertiPaq分析器 - -\*=仅在连接到 Analysis Services 或 Power BI 实例时才可用 +- 全新的强大 DAX 代码编辑器,具备自动完成、语法检查、代码折叠等众多功能 +- *工作区模式,允许您将更改保存到磁盘,并同时将模型元数据同步到 Analysis Services +- *使用无限滚动预览表格数据,创建数据透视网格或编写 DAX 查询以浏览模型或测试计算逻辑 +- *在提供程序和结构化数据源上更新表格架构(是的,即使对于 M 查询也是如此!) +- *安排数据刷新 +- 创建数据模型图 +- 创建 DAX 脚本,让您能够在单个文档中编辑多个度量值或其他计算对象 +- 录制 C# 脚本并另存为宏(以前称为“自定义操作”) +- VertiPaq分析器集成 + +*=仅在连接到 Analysis Services 或 Power BI 实例时 diff --git a/localizedContent/zh/content/references/release-notes/3_1_2.md b/localizedContent/zh/content/references/release-notes/3_1_2.md index 666ca57d9..6e64b5bcb 100644 --- a/localizedContent/zh/content/references/release-notes/3_1_2.md +++ b/localizedContent/zh/content/references/release-notes/3_1_2.md @@ -1,72 +1,70 @@ -# Tabular Editor 3.1.2 +# Tabular Editor 3.1.2 > [!IMPORTANT] -> Tabular Editor 已推出新版本。你可以在[这里](https://docs.tabulareditor.com/references/release-notes)找到最新版本。 +> Tabular Editor 有较新版本可用。您可以在[此处](https://docs.tabulareditor.com/references/release-notes)找到最新版本。 -- 下载 [Tabular Editor 3.1.2(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.1.2.x64.msi) _(推荐)_ +- 下载 [Tabular Editor 3.1.2(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.1.2.x64.msi) *(推荐)* - 下载 [Tabular Editor 3.1.2](https://cdn.tabulareditor.com/files/TabularEditor.3.1.2.x86.msi) - 便携版:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.1.2.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.1.2.x86.zip) -_如果你此前未使用过 Tabular Editor 3,则有资格申请 30 天试用,可在安装后提出申请。你也可以[购买许可证](https://tabulareditor.com/#licensing)。_ +*如果您此前从未使用过 Tabular Editor 3,则有资格获得 30 天试用,可在安装后申请。您还可以[购买许可证](https://tabulareditor.com/#licensing)。* -## 3.1.2 的错误修复 +## 3.1.2 中的错误修复 -- 修复了“更新表架构”在 SQL DW / Synapse SQL Pool 数据源上无法工作的问题,参见 [#231](https://github.com/TabularEditor/TabularEditor3/issues/231)。 -- 修复了被忽略的规则仍会被 Best Practice Analyzer 纳入考虑的问题,参见 [#203](https://github.com/TabularEditor/TabularEditor3/issues/203)。 -- 修复了因 JSON 序列化错误导致模型无法保存到磁盘(文件或文件夹)的问题,参见 [#232](https://github.com/TabularEditor/TabularEditor3/issues/232)。 -- 修复了在检查 Structured数据源的属性值时导致崩溃的问题。 +- 修复了“更新表架构”对于 SQL DW/Synapse SQL 池数据源不起作用的问题,请参阅[#231](https://github.com/TabularEditor/TabularEditor3/issues/231)。 +- 修复了 Best Practice Analyzer 仍会考虑已忽略规则的问题,请参阅 [#203](https://github.com/TabularEditor/TabularEditor3/issues/203)。 +- 修复了由于 JSON 序列化错误而无法将模型保存到磁盘(文件或文件夹)的问题,请参阅 [#232](https://github.com/TabularEditor/TabularEditor3/issues/232)。 +- 修复了在检查结构化数据源的属性值时导致崩溃的问题。 -## 3.1.1 的改进 +## 3.1.1 中的改进 -- 现在可以将共享表达式(Power Query / M 表达式)序列化为单独的文件。你可以在 **Tools > 偏好 > Save-to-folder** 中控制序列化方式;对于现有模型,则在 **Model > 序列化选项...** 中设置(参见 [#218](https://github.com/TabularEditor/TabularEditor3/issues/218)) -- 在 **Tools > 偏好 > Modeling Operations** 下新增选项,用于控制将透视成员关系应用到新对象的方式(参见问题 [#216](https://github.com/TabularEditor/TabularEditor3/issues/216))。 -- 现在可以在序列化时排除 `PrivacySetting` 属性,以避免 Microsoft.AnalysisServices.Deployment 相关问题。可在 **模型 > 序列化选项...** 中控制此项(参见问题 [#210](https://github.com/TabularEditor/TabularEditor3/issues/210))。 -- 你现在可以直接在 C# Script 中定义枚举、结构体和类,更便于组织并复用 C# 代码。 -- VertiPaq分析器现新增从数据中收集统计信息的选项(**Tools > 偏好 > VertiPaq分析器**),可提升统计信息的质量,例如当列的 IsAvailableInMDX = false 时。参见问题 [#190](https://github.com/TabularEditor/TabularEditor3/issues/290)。 -- 创建新模型后,Tabular Editor 3 现在会在首次保存时提示你:要将模型保存为文件还是文件夹。你也可以在 **工具 > 偏好 > 常规 > 新模型的默认保存格式** 中设置默认模式。参见问题 [#50](https://github.com/TabularEditor/TabularEditor3/issues/50)。 -- 启动性能已改进(部分用户反馈,在 TabularEditor3.exe 快捷方式中添加 `-multicorejit` 开关后,启动时间还能进一步缩短)。 -- 重构了“模型”菜单,使“新建计算组”等选项更易找到。 -- 已将 AMO/TOM 客户端库更新到 [19.26.1.7](https://www.nuget.org/packages/Microsoft.AnalysisServices.retail.amd64/)。 -- 现在可在 Best Practice Analyzer 中逐个遍历模型角色成员 -- 为避免与 [工作区模式](https://docs.tabulareditor.com/te3/tutorials/workspace-mode.html) 混淆,“窗口”菜单中的“Workspace”已更名为“布局”。 -- 新增 Ctrl+Shift+D 作为“部署”的快捷键 -- 支持新的 DAX 函数([`HASH`](https://dax.guide/hash)、[`NAMEOF`](https://dax.guide/nameof)、[`COLUMNSTATISTICS`](https://dax.guide/columnstatistics)、[`BITAND`](https://dax.guide/bitand)、[`BITLSHIFT`](https://dax.guide/bitlshift)、[`BITOR`](https://dax.guide/bitor)、[`BITRSHIFT`](https://dax.guide/bitrshift)、[`BITXOR`](https://dax.guide/bitxor)),并支持在 [`SELECTCOLUMNS`](https://dax.guide/selectcolumns) 中使用可选的列名参数。 +- 共享表达式(Power Query/M 表达式)现在可以序列化为单个文件。您可以在**工具 > 首选项 > 保存到文件夹**下控制序列化,或在**模型 > 序列化选项…**下为现有模型控制序列化([#218](https://github.com/TabularEditor/TabularEditor3/issues/218))。 +- 新增选项,用于控制如何将透视成员资格应用于**“工具”>“首选项”>“建模操作”**下的新对象(请参阅问题 [#216](https://github.com/TabularEditor/TabularEditor3/issues/216))。 +- 现在可以将 `PrivacySetting` 属性从序列化中排除,以避免出现 Microsoft.AnalysisServices.Deployment 相关问题。这在**模型 > 序列化选项...**下进行控制(请参阅问题[#210](https://github.com/TabularEditor/TabularEditor3/issues/210))。 +- 您现在可以直接在 C# 脚本中定义枚举、结构和类,从而使 C# 代码的结构化和重用更加轻松。 +- VertiPaq Analyzer 现在提供了一个从数据中收集统计信息的选项(**工具 > 首选项 > VertiPaq Analyzer**),从而提高了统计信息的质量,例如当列的 IsAvailableInMDX = false 时。请参阅问题 [#190](https://github.com/TabularEditor/TabularEditor3/issues/290)。 +- 创建新模型时,Tabular Editor 3 现在会在首次保存时提示是否应将模型保存为文件或文件夹。您还可以在**工具 > 首选项 > 常规 > 新模型的默认保存格式**下设置默认模式。请参阅问题 [#50](https://github.com/TabularEditor/TabularEditor3/issues/50)。 +- 提高了启动性能(一些用户报告称,通过将 `-multicorejit` 开关添加到 TabularEditor3.exe 快捷方式,进一步缩短了启动时间)。 +- 重新设计了“模型”菜单,使“新建计算组”等选项易于使用。 +- 将 AMO/TOM 客户端库更新为 [19.26.1.7](https://www.nuget.org/packages/Microsoft.AnalysisServices.retail.amd64/)。 +- 现在,可以在最佳实践分析器中单独迭代模型角色成员。 +- “窗口”菜单中的“工作区”已重命名为“布局”,以避免与[工作区模式](https://docs.tabulareditor.com/te3/tutorials/workspace-mode.html)混淆。 +- 添加了 Ctrl+Shift+D 作为“部署”的快捷键 +- 支持新的 DAX 函数([`HASH`](https://dax.guide/hash)、[`NAMEOF`](https://dax.guide/nameof)、[`COLUMNSTATISTICS`](https://dax.guide/columnstatistics)、[`BITAND`](https://dax.guide/bitand)、[`BITLSHIFT`](https://dax.guide/bitlshift)、[`BITOR`](https://dax.guide/bitor)、[`BITRSHIFT`](https://dax.guide/bitrshift)、[`BITXOR`](https://dax.guide/bitxor)),并支持 [`SELECTCOLUMNS`](https://dax.guide/selectcolumns) 中的可选列名参数。 ## 3.1.1 中的错误修复 -- 删除对象时,TOM Explorer 不再会出现卡死或崩溃(参见问题 [#223](https://github.com/TabularEditor/TabularEditor3/issues/223)、[#209](https://github.com/TabularEditor/TabularEditor3/issues/209))。 -- 修复了编辑器([#207](https://github.com/TabularEditor/TabularEditor3/issues/207))和图标([#215](https://github.com/TabularEditor/TabularEditor3/issues/215))在深色主题下的颜色问题 -- “创建/编辑关系”对话框中的表现在会按字母顺序排序(参见问题 [#214](https://github.com/TabularEditor/TabularEditor3/issues/214) -- 修复了一个 C# Script 问题:该问题会导致无法将 C# Script 保存为宏(参见问题 [#208](https://github.com/TabularEditor/TabularEditor3/issues/208))。 -- 修复了一个问题:数据源密码/凭据未能正确应用到 Workspace 数据库(参见问题 [#205](https://github.com/TabularEditor/TabularEditor3/issues/205))。 -- “选择所有列”复选框不再会导致崩溃(参见问题 [#204](https://github.com/TabularEditor/TabularEditor3/issues/204))。 -- 当脚本使用 `#r` 预编译指令引用外部 DLL 时,Tabular Editor 现在始终会在安装目录中查找(参见问题 [#192](https://github.com/TabularEditor/TabularEditor3/issues/192))。 -- 修复了语言架构中的一个 Bug,该 Bug 会在某些情况下导致 Q&A 停止工作 -- 在数据预览中对日期列进行筛选不再会导致崩溃 -- 在 TOM Explorer 的透视下拉列表中选择“所有透视”时,不属于任何透视的对象将不再显示。还修复了下拉框无法更新透视名称的问题。 -- 允许将某些 DAX 关键字用作变量(`WEEK`、`DAY`、`INTEGER` 等)且不会显示错误。 -- 修复了一个问题:首次保存模型时,序列化选项未被保存。 -- 修复了 DAX 解析器中的一个问题,该问题会导致在加载模型时崩溃(参见 [#229](https://github.com/TabularEditor/TabularEditor3/issues/229))。 +- 删除对象时,TOM 资源管理器不应再出现冻结或崩溃(请参阅问题 [#223](https://github.com/TabularEditor/TabularEditor3/issues/223)、[#209](https://github.com/TabularEditor/TabularEditor3/issues/209))。 +- 修复了编辑器([#207](https://github.com/TabularEditor/TabularEditor3/issues/207))和图标([#215](https://github.com/TabularEditor/TabularEditor3/issues/215))中深色主题的颜色问题 +- 表格现已在“创建/编辑关系”对话框中按字母顺序排序(请参阅问题 [#214](https://github.com/TabularEditor/TabularEditor3/issues/214) +- 修复了 C# 脚本无法保存为宏的问题(请参阅问题 [#208](https://github.com/TabularEditor/TabularEditor3/issues/208))。 +- 修复了数据源密码/凭据未正确应用于工作区数据库的问题(请参阅问题 [#205](https://github.com/TabularEditor/TabularEditor3/issues/205))。 +- “选择所有列”复选框不再导致崩溃(请参阅问题 [#204](https://github.com/TabularEditor/TabularEditor3/issues/204))。 +- 当脚本引用外部 DLL 时(使用 `#r` 预编译器指令),Tabular Editor 现在始终会在安装目录中查找,请参阅问题 [#192](https://github.com/TabularEditor/TabularEditor3/issues/192)。 +- 修复了语言架构的一个漏洞,该漏洞导致问答功能在某些情况下停止工作 +- 对“数据预览”中的日期列进行筛选不再会导致崩溃 +- 在 TOM Explorer 透视下拉列表中选择所有透视时,不再显示未包含在任何透视中的对象。还修复了下拉框不更新透视名称的问题。 +- 允许将某些 DAX 关键字用作变量(`WEEK`、`DAY`、`INTEGER` 等),且不会显示错误。 +- 修复了首次保存模型时序列化选项未被存储的问题。 +- 修复了 DAX 解析器的一个问题,该问题会导致在加载模型时发生崩溃(请参阅 [#229](https://github.com/TabularEditor/TabularEditor3/issues/229))。 --- +## 来自 Tabular Editor 2.x? -## 从 Tabular Editor 2.x 升级而来? - -观看 [此视频](https://www.youtube.com/watch?v=pt3DdcjfImY),快速了解 Tabular Editor 3 的新功能。 另外,也别忘了查看我们的 [入门指南](https://docs.tabulareditor.com/onboarding/index.html)。 +观看[此视频](https://www.youtube.com/watch?v=pt3DdcjfImY),了解 Tabular Editor 3 的新功能。 **Tabular Editor 3 主要功能概览:** - - 完全可自定义的 IDE,支持多显示器、高 DPI 和主题 -- 全新强大的 DAX 代码编辑器,具备自动完成、语法检查、代码折叠等更多功能 -- \*工作区模式,可将更改保存到磁盘,并同时将模型元数据同步到 Analysis Services -- \*以无限滚动预览表数据,创建 PivotGrid,或编写 DAX 查询来浏览模型或测试计算逻辑 -- \*支持计划数据刷新 -- 在提供程序和 Structured数据源上更新表架构(是的,甚至包括 M 查询!) -- 创建 Data model 图表 -- 创建 DAX 脚本,让您在一个文档中同时编辑多个度量值或其他计算对象 -- 录制 C# Script 并保存为宏(以前称为“自定义操作”) -- 集成 VertiPaq分析器 - -\*=仅在连接到 Analysis Services 或 Power BI 实例时才可用 +- 全新的强大 DAX 代码编辑器,具备自动完成、语法检查、代码折叠等众多功能 +- *工作区模式,允许您将更改保存到磁盘,并同时将模型元数据同步到Analysis Services +- *使用无限滚动预览表格数据,创建数据透视网格或编写 DAX 查询以浏览模型或测试计算逻辑 +- *安排数据刷新 +- 更新提供程序和结构化数据源上的表格架构(是的,即使对于 M 查询也是如此!) +- 创建数据模型图 +- 创建 DAX 脚本,让您能够在单个文档中编辑多个度量值或其他计算对象 +- 录制 C# 脚本并另存为宏(以前称为“自定义操作”) +- VertiPaq Analyzer 集成 + +*=仅在连接到 Analysis Services 或 Power BI 实例时 --- \ No newline at end of file diff --git a/localizedContent/zh/content/references/release-notes/3_27_1_0.md b/localizedContent/zh/content/references/release-notes/3_27_1_0.md new file mode 100644 index 000000000..3193dd479 --- /dev/null +++ b/localizedContent/zh/content/references/release-notes/3_27_1_0.md @@ -0,0 +1,110 @@ +--- +uid: release-3-27-1-0 +--- +# Tabular Editor 3.27.1.0 + +# [**下载**](#tab/downloads) + +Tabular Editor 3.27.1.0 下载: + +**基于 .NET 10**(推荐大多数用户使用): + +- 下载 [Tabular Editor 3.27.1.0 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe) *(推荐)* +- 下载 [Tabular Editor 3.27.1.0 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) +- 便携版: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) +- MSI 版本:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) + +**在 .NET 8 上**(适用于尚无法运行 .NET 10 桌面运行时的计算机): + +- 下载 [Tabular Editor 3.27.1.0 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe) +- 下载 [Tabular Editor 3.27.1.0 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) +- 便携版:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) +- MSI 版本:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) + +*如果您此前从未使用过 Tabular Editor 3,则有资格获得 30 天试用,可在安装后激活。您还可以[购买许可证](https://tabulareditor.com/licensing )。* + +# [**SHA-256 校验和**](#tab/checksums) + +| 文件 | .NET 运行时 | 平台 | SHA-256 | +| -- | -- | -- | -- | +| [TabularEditor.3.27.1.0.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe) | .NET 10 | x64 | `57171F0B45F6F700E09A9140480A753134A94993DC9F74629B7CBD42D2C09272` | +| [TabularEditor.3.27.1.0.x64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi) | .NET 10 | x64 | `8A3948B1E85EA331ACF151FDEA2C47FEFEFB28E377A7248A785AF760B706B1D7` | +| [TabularEditor.3.27.1.0.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip) | .NET 10 | x64 | `7761B99F117A87A38204D984C52F26A95B740B39720044ABA805F123D9BBB0CF` | +| [TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | `90A0DA17220255D81EFE80B8381FCB14E447BF5569ED53DDF11AE732A6055746` | +| [TabularEditor.3.27.1.0.ARM64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) | .NET 10 | ARM64 | `54D8F8CBC083B11C2025A2D32A1E0E32A3CDB5E10AE0ADBCB3E9A179EF6BC8C8` | +| [TabularEditor.3.27.1.0.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) | .NET 10 | ARM64 | `3338D9647596D5FBBE53A807725B45C5FA2FD9CC5B30834A9DD13EABD5D97912` | +| [TabularEditor.3.27.1.0.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe) | .NET 8 | x64 | `43C227A33C51E7E7A5175D7AB705CC5C2B7E8686A2DA6DCCC786BD0D27CD45CB` | +| [TabularEditor.3.27.1.0.x64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi) | .NET 8 | x64 | `6D05B0F8BC9654379D7CBAD2B75C317C8F067847BB69468F8FD36A8417729B9B` | +| [TabularEditor.3.27.1.0.x64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip) | .NET 8 | x64 | `EAE7EB7AA0B4B4AEE56A9B80BA8752DA04B98B59235DD5DD9278A41071DFB514` | +| [TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net8.exe) | .NET 8 | ARM64 | `54F1DFE6C23B9066C47FE20552F33A866E21A4C50C55A1E658ED097AD313EE4B` | +| [TabularEditor.3.27.1.0.ARM64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.msi) | .NET 8 | ARM64 | `91468976BC010A90C4858320DD676290C234CD8705C6C6368C3E63A339A380EE` | +| [TabularEditor.3.27.1.0.ARM64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net8.zip) | .NET 8 | ARM64 | `C49AB825BF72760C232AC87FC56758B3C7A768839BA09E1AD57A9775A2D6F1BA` | + + +*** + +## 3.27.1.0 中的改进 + +- [AI 助手](https://docs.tabulareditor.com/en/features/ai-assistant.html)和通过 [MCP 服务器](https://docs.tabulareditor.com/en/features/mcp-server.html)连接的代理现在可以接收模型和已打开文档中的 DAX 错误: + - 现在,它会列出“消息”视图中显示的错误、警告和 Analysis Services 消息 + - 活动文档(DAX 查询、DAX 脚本、C# 脚本或 Pivot Grid)的错误和警告将添加到助手的上下文中 + - C# 脚本运行后,结果会列出脚本引入或解决的错误 + + Analysis Services 返回的错误文本可能包含模型数据,并且仅当**模型数据**权限设置为**读取**时才会共享。 + +- 当您打开其他模型时,**DAX 查询**和**Pivot Grid** 文档现在将保持打开状态,并且它们会连接到新模型。DAX 查询会保留其文本和未保存的更改。Pivot Grid 保持其布局,并删除新模型中不存在的字段。要禁用此功能,请在**工具 > 首选项 > 数据浏览**下禁用**打开其他模型时保持 DAX 查询打开**和**打开其他模型时保持 Pivot Grid 打开**。请参阅[DAX 查询:切换模型](https://docs.tabulareditor.com/en/features/dax-query.html#switching-models)和[Pivot Grid:切换模型](https://docs.tabulareditor.com/en/features/pivot-grid.html#switching-models)。 +- **模型 > 部署…** 有一个新的**部署语言元数据(问答同义词、AI 指令和 AI 数据架构)**选项,默认选中。取消选中此选项,以保留已在目标语义模型中设置的 AI 指令、AI 数据架构和问答同义词。请参阅[部署选项](https://docs.tabulareditor.com/en/features/deployment.html#deployment-options)。 +- 在**文件 > 打开 > 从数据库打开模型...**的**服务器**列表中或部署向导中右键单击服务器,以**固定**、**取消固定**或**删除**该服务器。已固定的服务器位于列表顶部,不会被**清除最近的服务器**移除。请参阅[最近使用的服务器和已固定的服务器](https://docs.tabulareditor.com/en/how-tos/xmla-as-connectivity.html#recent-and-pinned-servers)。 +- 窗口标题现在以模型名称开头。**工具 > 首选项 > Tabular Editor > 用户界面**下的**模型源详细信息**首选项取代了**隐藏模型源详细信息**,并设置了标题栏、状态栏、选项卡工具提示和最近列表显示模型位置的多少。状态栏将连接显示为“`@`”。请参阅[用户界面首选项](https://docs.tabulareditor.com/en/references/preferences.html#tabular-editor--user-interface)和[Tabular Editor 3 用户界面](https://docs.tabulareditor.com/en/features/views/user-interface.html#basic-user-interface-elements)。 +- **“消息”**视图中有一个**“原因”**列,显示导致级联错误的对象,以及在导致其他对象出错的对象上显示的**“+N 个依赖错误”**。右键单击错误,以清除**显示级联错误**或选择**转到根本原因**。请参阅[级联错误和根本原因](https://docs.tabulareditor.com/en/features/views/messages-view.html#cascading-errors-and-root-causes)。 + +## 3.27.1.0 中的错误修复 + +- 修复了将计算项的**序号**设置为将其向其计算组的末尾移动时,将其放置的位置提前了一个位置的问题。 +- 修复了**文件 > 新建 > 模型…**仅将所选名称应用于模型,而将数据库命名为“SemanticModel”的问题。 +- 修复了对于模型的 **Culture** 属性和翻译的 **Language** 属性接受无效区域设置名称的问题。现在,这些值将被拒绝,并显示错误,例如“'en US' 是无效的区域设置说明符”。 +- 修复了当两个模型在角色成员、查询组或其他未命名集合元素上存在差异时,比较这两个模型失败并显示“对象引用未设置为对象的实例”的问题。 +- 修复了 DAX 表达式中的非标准空白字符(例如不间断空格)未被报告的问题。现在,它被报告为一个错误,该错误指明了字符的名称,并提示您运行**格式化 DAX**。 +- 修复了**元数据翻译编辑器**中的问题: + - 清除翻译单元格无效;现在将移除翻译 + - 表格、层次结构级别、透视或模型的**显示文件夹**单元格可编辑,且值被丢弃;这些单元格现在为只读 + - 列标题上下文菜单提供了**显示自动筛选行**,但该功能在翻译列上不起作用 +- 修复了在**导入表格向导**列出表格时将其关闭,可能会显示错误报告对话框或导致树中缺少对象的问题。 +- 修复了取消**从数据库加载语义模型**对话框或数据源凭据提示可能会关闭 Tabular Editor 并丢失未保存工作的问题。 +- 修复了在 **Pivot Grid** 值上使用“**调试此值**”时,忽略或颠倒网格的某些筛选器,导致调试器显示的值与网格中的值不同的问题。 +- 修复了以下问题:当 Tabular Editor 不是活动窗口时,MCP 客户端打开的文档显示的是上一个文档的工具栏和菜单。在[GitHub 讨论 #1590](https://github.com/TabularEditor/TabularEditor3/discussions/1590)中报告。 +- 修复了以下问题:复制或粘贴显示在多个显示文件夹中的度量值、列或层次结构时,会将副本放入一个以所有文件夹命名的文件夹中,例如“folder_01;folder_02”。现在,副本会出现在原始项的每个显示文件夹中。 +- 修复了 **DAX 查询**编辑器中的问题,该问题表现为:在文档中运行多个查询中的一个查询时,使用了第一个查询的 `DEFINE` 块,并且在 `ORDER BY` 子句中执行所选列时失败,并显示“无法确定列……的单个值”。 +- 修复了**消息**视图停止列出在打开其他模型后仍保持打开状态的文档的错误的问题。 +- 修复了可能导致 Tabular Editor 3 意外关闭或显示错误对话框的问题: + - 当**属性**视图显示度量值时,或当其所选对象被删除时 + - 打开语义模型时,出现“无法访问已释放的对象”错误 + - 在编辑操作(该操作删除了包含 DAX 表达式的对象并重命名或添加了另一个对象)之后 + - 编辑 DAX 表达式时,出现“索引超出了数组的边界”错误 +- 修复了以下问题:使用特定版本 OLE DB 提供程序名称(例如 `Provider=MSOLEDBSQL19.1`)的旧版数据源被报告为未安装,并且 **数据链接属性** 对话框在没有原始提供程序的情况下打开。此问题是自 3.25.0 以来的回归。 +- 修复了当无法扫描模型的数据时,**VertiPaq分析器 > 收集统计信息**未返回任何统计信息的问题。现在,统计信息将从模型元数据中收集,并附带警告;清除**工具 > 首选项 > 文件格式 > VertiPaq Analyzer**下的**从数据读取统计信息**将跳过数据读取。 + +--- + +## 来自 Tabular Editor 2.x? + +如需了解 Tabular Editor 3 的主要功能,请观看[此视频](https://youtu.be/O4ATwdzCvWc)。要开始使用,请参阅[入门指南](https://docs.tabulareditor.com/onboarding/index.html)。 + +**Tabular Editor 3 的主要功能:** +- 可定制的 IDE,支持多显示器和高 DPI,并提供主题 +- 具备自动完成、语法检查、代码折叠和格式化功能的 DAX 代码编辑器 +- *工作区模式,可将您的更改保存到磁盘,并同时将模型元数据同步到 Analysis Services +- *使用无限滚动预览表格数据,创建 PivotGrid 或编写 DAX 查询以浏览模型或测试计算逻辑 +- *安排数据刷新 +- 更新提供程序和 Structured 数据源(包括 M 查询)上的表格架构 +- 创建数据模型图 +- 创建 DAX 脚本,以便在单个文档中编辑多个度量值或其他计算对象 +- 录制 C# 脚本并将其保存为宏(原“自定义操作”) +- VertiPaq Analyzer 集成 +- DAX 调试器 +- DAX 优化器集成 +- 用于重构您的 DAX 的代码操作 + +*=仅在连接到 Analysis Services 或 Power BI 实例时 + +--- diff --git a/localizedContent/zh/content/references/release-notes/3_27_1_1.md b/localizedContent/zh/content/references/release-notes/3_27_1_1.md new file mode 100644 index 000000000..ce171e54f --- /dev/null +++ b/localizedContent/zh/content/references/release-notes/3_27_1_1.md @@ -0,0 +1,74 @@ +--- +uid: release-3-27-1-1 +--- +# Tabular Editor 3.27.1.1 + +# [**下载**](#tab/downloads) + +Tabular Editor 3.27.1.1 下载: + +**基于 .NET 10**(推荐大多数用户使用): + +- 下载 [Tabular Editor 3.27.1.1 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) *(推荐)* +- 下载 [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) +- 便携版: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) +- MSI 版本:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) + +**在 .NET 8 上**(适用于尚无法运行 .NET 10 桌面运行时的计算机): + +- 下载 [Tabular Editor 3.27.1.1 (x64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) +- 下载 [Tabular Editor 3.27.1.1 (ARM64)](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) +- 便携版: [x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) +- MSI 版本:[x64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi)、[ARM64](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) + +*如果您此前从未使用过 Tabular Editor 3,则有资格获得 30 天试用,可在安装后激活。您还可以[购买许可证](https://tabulareditor.com/licensing )。* + +# [**SHA-256 校验和**](#tab/checksums) + +| 文件 | .NET 运行时 | 平台 | SHA-256 | +| -- | -- | -- | -- | +| [TabularEditor.3.27.1.1.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) | .NET 10 | x64 | `77D937365893FB9BBD5978340BFDDEB6E80CF0A2FE7BD2E553900FC55FFCFF80` | +| [TabularEditor.3.27.1.1.x64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi) | .NET 10 | x64 | `995DCE34B0167FF6A3253C5D69D8528F4376E6D901D47D51267BDE92496C5EA2` | +| [TabularEditor.3.27.1.1.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip) | .NET 10 | x64 | `640635D3017C78DBA3142C5FB29342D3A6CCAA8506FEE93C999AA7CA788D676F` | +| [TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | `E95A76DF2C3AB2DDCA4C02DF2C1013BBBBA8350DB3066B4D59F01B1B84135D23` | +| [TabularEditor.3.27.1.1.ARM64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) | .NET 10 | ARM64 | `6F1A81BB998A2875D2F296F19202B721C0F1D98A8E778DB8B8F05320BE3E4A25` | +| [TabularEditor.3.27.1.1.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) | .NET 10 | ARM64 | `E78071C0B5AA9CA49242F4A663A82C7579384D1470278A2DC1691E29A1FCFE25` | +| [TabularEditor.3.27.1.1.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) | .NET 8 | x64 | `ACFA96FF21E270BF65E7D4501C0A50703AC2AF1FDCE17689838AC1647A46274F` | +| [TabularEditor.3.27.1.1.x64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi) | .NET 8 | x64 | `8B1F1D53C9BF432F4CD981A0584F8C879E53D953B8C97945269A21D1F8C448F2` | +| [TabularEditor.3.27.1.1.x64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip) | .NET 8 | x64 | `619DE6309EE63BC2AE3DD4B9FA2B08F8A6404394DA50F05C6BBD1ABF46AB31EA` | +| [TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) | .NET 8 | ARM64 | `7715427824868BE2D34FE7BD66AF48E85C91B4A0B55BD695F132313D9D5747C7` | +| [TabularEditor.3.27.1.1.ARM64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.msi) | .NET 8 | ARM64 | `B96150B0D2763F4A349724F7E7E985D825147D39933A3ADC62314E4ECD9B1B5A` | +| [TabularEditor.3.27.1.1.ARM64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net8.zip) | .NET 8 | ARM64 | `55516A79C8B96F0C3B67DE96DC6D86475F5BC00A8C36ADCF9A71907CBA5846F9` | + + +*** + +## 3.27.1.1 中的错误修复 + +- 修复了在安全配置阻止代码编辑器组件启动的计算机上,当您选择带有表达式的对象时,Tabular Editor 3 意外退出的问题。此问题是自 3.27.0 以来的回归。管理员可以使用 `RequireNativeLibrarySignatureVerification` 策略重新启用代码编辑器库的签名检查。请参阅[策略](https://docs.tabulareditor.com/en/references/policies.html#general-policies )。 +- 修复了在错误报告对话框和 `errorreport.txt` 中,意外错误的详细信息多次列出同一错误并遗漏根本错误的问题。现在,链中的每个错误都只列出一次,直至根本原因。 + +--- + +## 来自 Tabular Editor 2.x? + +如需了解 Tabular Editor 3 的主要功能,请观看[此视频](https://youtu.be/O4ATwdzCvWc)。要开始使用,请参阅[入门指南](https://docs.tabulareditor.com/onboarding/index.html)。 + +**Tabular Editor 3 的主要功能:** +- 可定制的 IDE,支持多显示器和高 DPI,并提供主题 +- 具备自动完成、语法检查、代码折叠和格式化功能的 DAX 代码编辑器 +- *工作区模式,可将您的更改保存到磁盘,并同时将模型元数据同步到 Analysis Services +- *使用无限滚动预览表格数据,创建数据透视网格或编写 DAX 查询以浏览模型或测试计算逻辑 +- *安排数据刷新 +- 更新提供程序和 Structured 数据源上的表格架构,包括 M 查询 +- 创建数据模型图 +- 创建 DAX 脚本,以便在单个文档中编辑多个度量值或其他计算对象 +- 录制 C# 脚本并将其保存为宏(原“自定义操作”) +- VertiPaq Analyzer 集成 +- DAX 调试器 +- DAX 优化器集成 +- 用于重构您的 DAX 的代码操作 + +*=仅在连接到 Analysis Services 或 Power BI 实例时 + +--- diff --git a/localizedContent/zh/content/references/release-notes/3_3_4.md b/localizedContent/zh/content/references/release-notes/3_3_4.md index 7ae5b0d74..0568e24fc 100644 --- a/localizedContent/zh/content/references/release-notes/3_3_4.md +++ b/localizedContent/zh/content/references/release-notes/3_3_4.md @@ -1,76 +1,74 @@ # Tabular Editor 3.3.4 > [!IMPORTANT] -> Tabular Editor 已推出新版本。你可以在[这里](https://docs.tabulareditor.com/references/release-notes)找到最新版本。 +> Tabular Editor 有较新版本可用。您可以在[此处](https://docs.tabulareditor.com/references/release-notes)找到最新版本。 -- 下载 [Tabular Editor 3.3.4(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x64.exe) _(推荐)_ +- 下载 [Tabular Editor 3.3.4(64 位)](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x64.exe) *(推荐)* - 下载 [Tabular Editor 3.3.4](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.Installer.x86.exe) - 便携版:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x64.zip)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x86.zip) - MSI 版本:[x64](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x64.msi)、[x86](https://cdn.tabulareditor.com/files/TabularEditor.3.3.4.x86.msi) -_如果你此前未使用过 Tabular Editor 3,则有资格申请 30 天试用,可在安装后提出申请。你也可以[购买许可证](https://tabulareditor.com/licensing)。_ +*如果您此前从未使用过 Tabular Editor 3,则有资格获得 30 天试用,可在安装后申请。您还可以[购买许可证](https://tabulareditor.com/licensing)。* -## 重要! +## 重要提示! -**注意**:Tabular Editor 3.3.0(及更高版本)使用 .NET 6。在启动 Tabular Editor 3.3.0(或更高版本)之前,你可能需要先安装[适用于桌面的.NET 6.0 运行时](https://dotnet.microsoft.com/en-us/download/dotnet/6.0/runtime)。从 3.3.1 开始,如果缺少这些必备组件,Tabular Editor 3 安装程序会下载并安装它们。 +**注意**:Tabular Editor 3.3.0(及更新版本)使用 .NET 6。您可能需要先安装[.NET 6.0 Runtime for Desktop](https://dotnet.microsoft.com/en-us/download/dotnet/6.0/runtime),然后才能启动 Tabular Editor 3.3.0(或更高版本)。从 3.3.1 开始,如果缺少这些先决条件,Tabular Editor 3 安装程序将下载并安装这些先决条件。 ## 3.3.4 中的改进 -- 将 TOM 更新到 [19.46.0](https://www.nuget.org/packages/Microsoft.AnalysisServices.NetCore.retail.amd64) 版。 -- 将 Microsoft.Data.SqlClient 更新到 [5.0.0](https://www.nuget.org/packages/Microsoft.Data.SqlClient) 版。 -- 将 SciLexer.dll 更新到 4.4.6 版,不受此 [CVE](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2019-16294) 影响。 -- 多项小修复与改进。 -- “新建/编辑关系”对话框改进:列会按字母顺序排序,并按匹配类型排序。我们现在也会根据“from-column”的名称来建议“to-column”。 -- 将新建 Power BI Dataset 的默认 CL 更改为 1571,并新增对 [ObjectTranslation.Altered](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.objecttranslation.altered?view=analysisservices-dotnet) 属性的支持。在基于 AS Dataset 创建 DirectQuery 时,应将该属性设置为 "true",以防元数据翻译被源端覆盖。 -- 新增快捷键 **Ctrl+Alt+S**,用于保存当前模型。参见 [#595](https://github.com/TabularEditor/TabularEditor3/issues/595)、[#561](https://github.com/TabularEditor/TabularEditor3/issues/561)。 -- 新增快捷键 **Ctrl+Shift+F6**,用于 Debug Comma DAX 格式化。参见 [#595](https://github.com/TabularEditor/TabularEditor3/issues/595)。 -- 离线架构检测现已可正常工作,即使将 Server Name、Database Name 等参数存储在共享的 M 表达式中也是如此。 - -## 3.3.4 中的 Bug 修复 - -- 修复“更新表架构”选项会将所有列都 Report 为已删除的问题,参见 [#612](https://github.com/TabularEditor/TabularEditor3/issues/612)。 -- 修复在使用嵌套筛选表达式时出现的误报语义分析器错误。 -- 修复在对通过关系而非公共列联接的表使用 `NATURALINNERJOIN` / `NATURALLEFTOUTERJOIN` 时出现的语义分析器误报错误。 -- 修复尝试显示 ODBC 连接器的连接对话框时的问题,参见 [#448](https://github.com/TabularEditor/TabularEditor3/issues/448) -- Microsoft.Data.SqlClient 的 AAD 身份验证现在会显示模态弹窗(而不是打开操作系统浏览器) -- 修复 SQL Server 连接对话框中的“高级按钮”有时会导致崩溃的问题。 -- 表导入向导现在允许在 Azure Synapse 上预览数据(数据预览查询中不再添加 NOLOCK 提示) -- 32 位安装程序现在应能正确检测 32 位 .NET 桌面运行时 -- DAX 自动完成现在也可以建议 Variant 类型的标量变量,参见 [#615](https://github.com/TabularEditor/TabularEditor3/issues/615) -- 修复 DAX调试器无法显示包含嵌套条件分支的本地/观察表达式的问题。 -- 将 SciLexer.dll 放在应用程序文件夹中,而不是将其解压/加载到 %LocalAppData%\Temp 中。这应该可以避免在组策略阻止从此位置加载 DLL 时偶尔出现的“Exception has been thrown by the target of an invocation”错误。 -- 修复了在多选时“属性网格”无法设置嵌套属性的问题。参见 [#614](https://github.com/TabularEditor/TabularEditor3/issues/614)。 -- 修复属性网格未刷新以显示动态添加/删除属性的问题,例如切换“增量刷新策略”属性时。 -- 修复一个问题:AAS Developer Tier 实例会被视为 Standard Tier 实例,导致无法连接到 TE3 商业版 -- 修复 NAMEOF 自动完成在某些情况下无法显示所有列/度量值引用的问题,参见 [#620](https://github.com/TabularEditor/TabularEditor3/issues/620)。 -- 修复了某些 DAX 关键字(START、ORDER、RETURN 等)在未加引号用作表引用时未被视为错误的问题。此问题还会导致包含对此类表的带引号引用的代码无法被正确格式化。 -- 修复“4096 (0x1000) is an invalid culture identifier”这一“无效的区域设置标识符”错误,参见 [#576](https://github.com/TabularEditor/TabularEditor3/issues/576)。 -- 修复查找/替换搜索时可能导致崩溃的问题,参见 [#611](https://github.com/TabularEditor/TabularEditor3/issues/611)。 -- 在只读模式下显示所有属性,参见 [#596](https://github.com/TabularEditor/TabularEditor3/issues/596)。 -- 已移除窗口固定/取消固定时的动画效果,详见 [#595](https://github.com/TabularEditor/TabularEditor3/issues/595)。 -- 在 DAX 注释中不再自动补全括号,详见 [#597](https://github.com/TabularEditor/TabularEditor3/issues/597)。 -- 修复在“首选项”对话框中将默认 CL 值设置为非标准值时导致崩溃的问题。 +- 将 TOM 更新至 [19.46.0](https://www.nuget.org/packages/Microsoft.AnalysisServices.NetCore.retail.amd64) 版本。 +- 将 Microsoft.Data.SqlClient 更新至 [5.0.0](https://www.nuget.org/packages/Microsoft.Data.SqlClient) 版本。 +- 将 SciLexer.dll 更新为 4.4.6 版,该版本不受[此 CVE](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2019-16294) 的影响。 +- 多项小修小改和改进。 +- “新建/编辑关系”对话框改进:列按字母顺序和匹配类型排序。我们现在还会根据“源列”的名称建议“目标列”。 +- 将新 Power BI 数据集的默认 CL 更改为 1571,并添加了对 [ObjectTranslation.Altered](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.objecttranslation.altered?view=analysisservices-dotnet) 属性的支持。在对 AS 数据集创建 DirectQuery 时,应将此属性设置为“true”,以防止元数据翻译被源覆盖。 +- 添加了用于保存当前模型的新快捷键 **Ctrl+Alt+S**。请参阅[#595](https://github.com/TabularEditor/TabularEditor3/issues/595)、[#561](https://github.com/TabularEditor/TabularEditor3/issues/561)。 +- 添加了用于调试逗号 DAX 格式的快捷键 **Ctrl+Shift+F6**。请参阅 [#595](https://github.com/TabularEditor/TabularEditor3/issues/595)。 +- 当服务器名称和数据库名称等参数存储在共享的 M 表达式中时,离线架构检测现在应该可以正常工作。 + +## 3.3.4 中的错误修复 + +- 修复了“更新表架构”选项将所有列报告为已移除的问题,请参阅 [#612](https://github.com/TabularEditor/TabularEditor3/issues/612)。 +- 修复使用嵌套筛选器表达式时出现的虚假语义分析器错误。 +- 修复在使用 `NATURALINNERJOIN` / `NATURALLEFTOUTERJOIN` 对通过关系而非公共列联接的表格进行操作时出现的虚假语义分析器错误。 +- 修复了尝试显示 ODBC 连接器的连接对话框时出现的问题,请参阅 [#448](https://github.com/TabularEditor/TabularEditor3/issues/448) +- 使用 Microsoft.Data.SqlClient 进行 AAD 身份验证现在会显示模式弹出窗口(而不是打开操作系统浏览器) +- 修复了 SQL Server 连接对话框“高级按钮”有时导致崩溃的问题。 +- 表格导入向导现在允许在 Azure Synapse 上预览数据(不再将 NOLOCK 提示添加到数据预览查询中) +- 32 位安装程序现在应能正确检查 32 位 .NET Desktop Runtime +- DAX 自动补全现在还可以建议 Variant 类型的标量变量,请参阅 [#615](https://github.com/TabularEditor/TabularEditor3/issues/615) +- 修复了 DAX 调试器无法显示具有嵌套条件分支的局部/监视表达式的问题。 +- 将 SciLexer.dll 包含在应用程序文件夹中,而不是将其提取/加载到 %LocalAppData%\Temp。应能避免有时在组策略阻止从该位置加载 DLL 时出现的“调用目标引发了异常”错误。 +- 修复了属性网格无法对多项选择设置嵌套属性的问题。请参阅 [#614](https://github.com/TabularEditor/TabularEditor3/issues/614)。 +- 修复了属性网格未刷新以显示动态添加/移除的属性的问题,例如在切换“增量刷新策略”属性时。 +- 修复了 AAS 开发人员层实例被视为标准层实例的问题,从而避免了与 TE3 商业版建立连接的问题。 +- 修复了 NAMEOF 自动补全在某些情况下未显示所有列/Measure 引用的问题,请参阅 [#620](https://github.com/TabularEditor/TabularEditor3/issues/620)。 +- 修复了某些 DAX 关键字(START、ORDER、RETURN 等)在不带引号用作表引用时未被视为错误的问题。此漏洞还阻止了对包含此类表格的带引号引用代码进行正确格式化。 +- 修复了“4096 (0x1000) 是无效的区域设置标识符”问题,请参阅 [#576](https://github.com/TabularEditor/TabularEditor3/issues/576)。 +- 防止查找/替换搜索崩溃,请参阅[#611](https://github.com/TabularEditor/TabularEditor3/issues/611)。 +- 在只读模式下显示所有属性,请参阅 [#596](https://github.com/TabularEditor/TabularEditor3/issues/596)。 +- 移除了固定/取消固定窗口的动画,请参阅 [#595](https://github.com/TabularEditor/TabularEditor3/issues/595)。 +- 不要在 DAX 注释中自动添加大括号,请参阅 [#597](https://github.com/TabularEditor/TabularEditor3/issues/597)。 +- 修复了默认 CL 值在设置为非标准值时导致“偏好”对话框崩溃的问题。 --- +## 来自 Tabular Editor 2.x? -## 从 Tabular Editor 2.x 升级而来? - -观看 [此视频](https://www.youtube.com/watch?v=pt3DdcjfImY),快速了解 Tabular Editor 3 的新功能。 另外,也别忘了查看我们的 [入门指南](https://docs.tabulareditor.com/onboarding/index.html)。另外,请务必查看我们的[上手指南](https://docs.tabulareditor.com/onboarding/index.html)。 +观看[此视频](https://www.youtube.com/watch?v=pt3DdcjfImY),了解 Tabular Editor 3 的新功能。此外,请务必查看我们的[入门指南](https://docs.tabulareditor.com/onboarding/index.html)。 **Tabular Editor 3 主要功能概览:** - - 完全可自定义的 IDE,支持多显示器、高 DPI 和主题 -- 全新强大的 DAX 代码编辑器,具备自动完成、语法检查、代码折叠等更多功能 -- \*工作区模式,可将更改保存到磁盘,并同时将模型元数据同步到 Analysis Services -- \*以无限滚动预览表数据,创建 PivotGrid,或编写 DAX 查询来浏览模型或测试计算逻辑 -- \*支持计划数据刷新 -- 在提供程序和 Structured数据源上更新表架构(是的,甚至包括 M 查询!) -- 创建 Data model 图表 -- 创建 DAX 脚本,让您在一个文档中同时编辑多个度量值或其他计算对象 -- 录制 C# Script 并保存为宏(以前称为“自定义操作”) -- 集成 VertiPaq分析器 -- \*DAX调试器 - -\*=仅在连接到 Analysis Services 或 Power BI 实例时才可用 +- 全新的强大 DAX 代码编辑器,具备自动完成、语法检查、代码折叠等众多功能 +- *工作区模式,允许您将更改保存到磁盘,并同时将模型元数据同步到 Analysis Services +- *使用无限滚动预览表格数据,创建数据透视网格或编写 DAX 查询以浏览模型或测试计算逻辑 +- *安排数据刷新 +- 更新提供程序和结构化数据源上的表格架构(是的,即使对于 M 查询也是如此!) +- 创建数据模型图 +- 创建 DAX 脚本,让您能够在单个文档中编辑多个度量值或其他计算对象 +- 录制 C# 脚本并保存为宏(以前称为“自定义操作”) +- VertiPaq分析器集成 +- *DAX 调试器 + +*=仅在连接到 Analysis Services 或 Power BI 实例时 --- \ No newline at end of file diff --git a/localizedContent/zh/content/references/supported-files.md b/localizedContent/zh/content/references/supported-files.md index 559ae282c..198ac135b 100644 --- a/localizedContent/zh/content/references/supported-files.md +++ b/localizedContent/zh/content/references/supported-files.md @@ -1,4 +1,4 @@ ---- +--- uid: supported-files title: 支持的文件类型 author: Morten Lønskov @@ -11,47 +11,45 @@ applies_to: editions: - edition: Desktop partial: true - note: "桌面版不支持模型元数据文件" + note: "Desktop Edition does not support model metadata files" - edition: Business full: true - edition: Enterprise full: true --- - # 支持的文件类型 -Tabular Editor 3 使用多种不同的文件格式和文档类型,其中一些并非 Analysis Services 或 Power BI 使用的格式。本文将概述这些文件类型,并逐一介绍它们。 +Tabular Editor 3 使用多种不同的文件格式和文档类型,其中一些文件格式和文档类型并非 Analysis Services 或 Power BI 所使用。本文概述并介绍了每种文件类型。 ![支持的文件类型](~/content/assets/images/file-types/te3-supported-file-types.png) -针对多种文件类型都提供了示例文件,基于 [learn.tabulareditor.com](https://tabulareditor.com/learn) 的课程 2“Business Case”。 +根据 [learn.tabulareditor.com](https://tabulareditor.com/learn) 课程 2 业务案例,每种文件类型均提供示例文件。 -## Dataset 文件类型 +## 数据集文件类型 -Tabular Editor 支持语义模型的四种文件类型:.bim、Power BI 文件 (.pbit 和 .pbip)、.json 和 .tmdl。每种文件类型都有各自的特性和限制,下面将逐一说明。 +Tabular Editor 支持四种语义模型文件类型:.bim、Power BI 文件(.pbit 和 .pbip)、.json 和 .tmdl。每种文件类型都有不同的功能和限制,具体说明如下。 -此外,Tabular Editor 3 商业版和企业版支持在进行 Microsoft Fabric Git 集成时使用的 **连同支持文件一起保存** 功能。这会创建一个文件夹结构,在模型文件旁边生成 .platform 和 definition.pbism 元数据文件,从而实现与 Fabric Workspace 的无缝同步。有关详细信息,请参阅[连同支持文件一起保存](xref:save-with-supporting-files)。 +此外,Tabular Editor 3 Business 和 Enterprise 版本支持**保存时包含支持文件**,以实现 Microsoft Fabric Git 集成。这将创建一个文件夹结构,其中包含 .platform 和 definition.pbism 元数据文件以及您的模型文件,从而实现与 Fabric 工作区的无缝同步。请参阅[保存时包含支持文件](xref:save-with-supporting-files)了解详情。 > [!NOTE] -> 由于 **Tabular Editor 3 桌面版** 仅用于作为 Power BI Desktop 的外部工具,因此该版本不允许加载和保存语义模型文件。不过,你仍然可以使用 Tabular Editor 2.x 来实现此目的。要详细了解 Tabular Editor 3 各版本之间的差异,请参阅 。 +> 由于 **Tabular Editor 3 Desktop 版本**仅用于作为 Power BI Desktop 的外部工具,因此此版本不允许加载和保存语义模型文件。但是,您仍可为此目的使用 Tabular Editor 2.x。请参阅,详细了解 Tabular Editor 3 各版本之间的差异。 ### [表格模型文件 (.bim)](#tab/BIM) +.bim 文件是一个由嵌套 JSON 组成的单个文件,称为 TMSL。 -.bim 文件是一个由嵌套 JSON 组成的单一文件,这种格式称为 TMSL。 +这是 Microsoft 支持的语义模型的原始格式。 -这是 Microsoft 支持的语义模型的原始格式。 +但是,它有一个很大的缺点:由于它是一个大型的单个文件,因此难以跟踪更改,也难以使用 Git 源代码管理等良好的团队开发实践。 -但它有一个明显缺点:由于它是一个单一的大文件,难以跟踪变更,也不利于采用 Git 源代码管理等良好的团队开发实践。 +**文件夹中的 .bim 文件** -#### 文件夹中的.bim 文件 +![支持的文件类型 BIM](~/content/assets/images/file-types/te3-supported-file-bim.png) -![支持的 BIM 文件类型](~/content/assets/images/file-types/te3-supported-file-bim.png) +[下载 .bim 示例文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/bim-file-example.bim) -[下载示例 .bim 文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/bim-file-example.bim) +**保存时包含用于 Fabric Git 集成的支持文件** -#### Fabric Git 集成:保存并附带支持文件 - -使用“**保存并附带支持文件**”选项(Business 和企业版)时,Tabular Editor 会创建与 Microsoft Fabric Git 集成兼容的文件夹结构: +使用**保存时包含支持文件**选项(Business 和 Enterprise 版本)时,Tabular Editor 会创建与 Microsoft Fabric Git 集成兼容的文件夹结构: ``` DatabaseName.SemanticModel/ @@ -60,89 +58,94 @@ DatabaseName.SemanticModel/ └── model.bim ``` -借助该结构,可将语义模型提交到 Git repository,并与 Fabric Workspace 同步。有关完整文档,请参阅[连同支持文件一起保存](xref:save-with-supporting-files)。 +此结构使您能够将语义模型提交到 Git 仓库,并将其与 Fabric 工作区同步。请参阅[保存时包含支持文件](xref:save-with-supporting-files),以获取完整文档。 + ### [Power BI](#tab/PowerBI) -Tabular Editor 可以处理两种 Power BI 存储格式: +Tabular Editor 可以处理两种类型的 Power BI 存储格式: - Power BI 模板文件(.pbit) - Power BI Project 文件夹(.pbip) -#### Power BI Project 文件夹(.pbip) _(预览)_ -Power BI Project 文件夹于 2023 年六月推出,目前在 Power BI Desktop 中以预览功能提供(也称为“开发人员模式”)。这种存储格式是保存 .pbix 文件内容的另一种方式,其格式更适合进行版本控制,也更便于第三方读取和编辑内容。 + +**Power BI Project 文件夹 (.pbip)(预览)** + +Power BI Project 文件夹于 2023 年 6 月推出,在 Power BI Desktop 中作为预览功能(也称为“开发者模式”)提供。该存储格式是存储 .pbix 文件内容的另一种方式,其格式对于版本控制以及第三方读取/编辑内容更加友好。 > [!WARNING] -> 与 .pbix 文件一样,Power BI Project 文件夹除了 **元数据** 外,也可能包含模型 **数据**,因此应像对待 .pbix 文件一样,将该文件夹视为敏感内容并妥善保护。 +> 与 .pbix 文件一样,Power BI Project 文件夹除了包含**元数据**外,还可能包含模型**数据**,因此应像对待 .pbix 文件一样将该文件夹视为敏感文件。 -Power BI Project 文件夹的根目录下有一个 .pbip 文件。该文件本质上是一个指向 Power BI 报表定义文件的指针,而该报表定义文件又可能进一步指向 Power BI 数据集:要么是本地的同一文件夹结构中的数据集(stored as a model.bim file),要么是发布到 Power BI 服务的数据集(in this case, the report is said to be in _Live connect_ mode)。如果 Power BI Project 文件夹中包含 Dataset(model.bim 文件),Tabular Editor 在打开 .pbip 文件时即可加载该模型的元数据。 +Power BI Project 文件夹的根目录中有一个 .pbip 文件。该文件本质上是指向 Power BI 报表定义文件的指针,该文件随后又可能指向 Power BI 数据集,该数据集可能位于本地的相同文件夹结构中(存储为 model.bim 文件),也可能是发布到 Power BI 服务的 +数据集(在这种情况下,该报表被认为是处于*实时连接*模式)。如果 Power BI Project 文件夹中存在数据集(model.bim 文件),则 Tabular Editor 将能够在打开 .pbip 文件时加载此模型元数据。 -要详细了解 Power BI Project 文件夹,请阅读微软的这篇官方博客文章:[这篇官方博客](https://powerbi.microsoft.com/en-us/blog/deep-dive-into-power-bi-desktop-developer-mode-preview/)。 +要了解有关 Power BI Project 文件夹的更多信息,请阅读[Microsoft 的这篇官方博客文章](https://powerbi.microsoft.com/en-us/blog/deep-dive-into-power-bi-desktop-developer-mode-preview/)。 > [!IMPORTANT] -> 将 Power BI 与 Tabular Editor 搭配使用时,建议使用 Power BI Project 文件格式,因为它支持 [最广泛的建模操作](https://learn.microsoft.com/power-bi/developer/projects/projects-overview#model-authoring)。对模型元数据进行上述列表之外的其他类型更改,可能会导致你的模型无法在 Power BI Desktop 中加载;在这种情况下,Microsoft 支持将无法为你提供帮助。 +> 在将 Power BI 与 Tabular Editor 一起使用时,Power BI Project 文件是推荐的格式,因为它支持[最广泛的建模操作](https://learn.microsoft.com/power-bi/developer/projects/projects-overview#model-authoring)。对模型元数据进行所列类型以外的其他类型的更改,可能会导致您的模型在 Power BI Desktop 中无法加载,在这种情况下,Microsoft 支持将无法为您提供帮助。 -#### Power BI 模板文件(.pbit) +**Power BI模板文件(.pbit)** -Power BI 模板文件与 .pbix 文件类似,但区别在于它不包含任何模型 **数据**,只包含模型 **元数据**。因此,可以在 Tabular Editor 中打开和编辑此模型元数据。 +Power BI模板文件与.pbix文件类似,但不同之处在于它们不包含任何模型**数据**,只包含模型**元数据**。因此,可以在 Tabular Editor 中打开和编辑此模型元数据。 > [!WARNING] -> 尽管从技术上讲,可以从 .pbit 文件加载模型元数据并将其保存回 .pbit 文件,但这种做法不受 Power BI Desktop 支持。默认情况下,Tabular Editor 会显示警告并阻止更改。如果你打算通过 Tabular Editor 修改 Power BI 模型,请改用 Power BI Project 文件夹。 +> 虽然从技术上来说,可以从 .pbit 文件加载模型元数据并将其保存到 .pbit 文件,但 Power BI Desktop 不支持此方法。默认情况下,Tabular Editor 将显示警告并阻止更改。如果您打算通过 Tabular Editor 对 Power BI 模型进行更改,请改用 Power BI Project 文件夹。 -### [表格模型文件夹(.json)](#tab/JSON) +### [表格模型文件夹 (.json)](#tab/JSON) -Tabular Editor 允许你将 Dataset 对象保存为单独的 JSON 文件,这是一种自定义的序列化格式。 +Tabular Editor 允许您将数据集对象保存为单独的 JSON 文件,这是一种自定义序列化格式。 -该格式会保留对象的结构和属性,例如表、列、度量值和关系。 +此格式保留了您的对象(例如表、列、度量值和关系)的结构和属性。 -这种格式从 Tabular Editor 早期起就已支持,是一种经过验证的方法,可将 Dataset 对象以单独文件的形式存储,但 Microsoft 并不支持这种做法。从而使开发人员能够在版本控制中跟踪更改,并协作构建语义模型。 +Tabular Editor 从早期开始就支持此格式,这是一种经过验证的方法,可将您的数据集对象存储为单个文件,但 Microsoft 不支持此方法。从而使开发人员能够跟踪源代码控制中的更改,并协作构建语义模型。 -在 JSON 文件结构方面,Tabular Editor 2 与 3 完全兼容。 +在 JSON 文件结构方面,Tabular Editor 2 和 3 之间完全兼容。 -要将语义模型保存为 JSON,首次保存时必须使用“保存到文件夹”选项。之后对从 JSON 结构化模型加载的模型进行保存时,会沿用该设置。你随时都可以通过“文件 > 另存为”把 JSON 格式的模型转换为 .bim 文件 +要将语义模型保存为 JSON,您必须在首次保存时使用“保存到文件夹”选项。随后将模型保存为从 JSON 结构化模型加载的模型时,将保留该设置。始终可以使用“文件 > 另存为”将 JSON 格式的模型转换为 .bim 文件。 -![支持的文件类型:JSON](~/content/assets/images/file-types/te3-supported-file-json.png) -1. 整个模型包含一个 database.json 文件,并且每个 TOM 顶层对象都有自己的文件夹 -2. 在 tables 目录中,每个表都有自己的文件夹 -3. 单个表会保存为 TableName.json 文件,并包含用于度量值、列和分区的文件夹 -4. 表中的每个度量值都有自己的 json 文件。 +![支持的文件类型 JSON](~/content/assets/images/file-types/te3-supported-file-json.png) -会创建到哪一层级的 json 对象由序列化设置控制。 +1. 整体模型具有一个数据库 JSON,每个 TOM 标题都有自己的文件夹 +2. 在表格中,每个表格都存在于其各自的文件夹中 +3. 单个表作为 TableName json 文件,其中包含度量值、列和分区的文件夹 +4. 表格上的每个度量值都有自己的 json 文件。 -一个度量值的单个 JSON 文件包含该度量值的所有属性: +将要创建的 JSON 对象的深度由序列化设置处理。 -![支持的文件类型:JSON 度量值文件](~/content/assets/images/file-types/te3-supported-file-json-measure.png) +一个度量值的单个 JSON 文件包含该度量的所有属性: + +![支持的文件类型 JSON 文件](~/content/assets/images/file-types/te3-supported-file-json-measure.png) -想了解“保存到文件夹”和序列化设置的更多信息,可以查看:[保存到文件夹](xref:save-to-folder) + +有关“保存到文件夹”和序列化设置的更多信息,请参阅:[保存到文件夹](xref:save-to-folder) [下载 JSON 文件夹结构示例](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/json-model-example.zip) ### [TMDL](#tab/TMDL) -TMDL 是 Tabular Model Definition Language 的缩写,是一种新格式,使用类似 YAML 的语法,以更易读的方式定义和管理 Dataset。 - -Microsoft 于 2023 年四月将 TMDL 作为预览功能推出,旨在提供一种统一且一致的方式,以便跨不同平台和工具处理 Dataset。 +TMDL 代表表格模型定义语言,它是一种新格式,用于使用类似 YAML 的语法以人类可读的格式定义和管理数据集。 -TMDL 的设计目标是支持 Dataset 的源代码管理,让用户能够跟踪更改、协作,并围绕语义模型自动化工作流。 +Microsoft 于 2023 年 4 月推出了 TMDL 预览功能,旨在提供一种统一且一致的方式,以便在不同平台和工具上处理数据集。 -> [!Note] -> TMDL 目前处于预览阶段,这意味着它尚未完全稳定,可能会存在一些限制或问题。 +TMDL 旨在支持数据集源代码管理,使用户能够使用语义模型跟踪更改、进行协作并自动化工作流。 +> [!NOTE] +> TMDL 处于预览阶段,这意味着它并不完全稳定,可能存在一些限制或问题。 -![支持的文件类型:TMDL](~/content/assets/images/file-types/te3-supported-file-tmdl.png) +![支持的文件类型 TMDL](~/content/assets/images/file-types/te3-supported-file-tmdl.png) 1. 整体序列化位于 TOM 的顶层对象级别 2. 每个表都是一个单独的文件 -3. TMDL 文件由类似 YAML 的缩进结构构成,文件中包含各列和度量值。 +3. TMDL 文件由类似 YAML 的缩进组成,其中包含文件内的每一列和度量值。 -想继续了解的话,可以看看:[TMDL](xref:tmdl) +如需进一步阅读,请参阅:[TMDL](xref:tmdl) [下载 TMDL 文件夹结构示例](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/tmdl-model-example.zip) -#### Fabric Git 集成:保存并附带支持文件 +**保存时包含用于 Fabric Git 集成的支持文件** -使用“**保存并附带支持文件**”选项(Business 和企业版)时,Tabular Editor 会创建与 Microsoft Fabric Git 集成兼容的文件夹结构: +使用**保存时包含支持文件**选项(Business 和 Enterprise 版本)时,Tabular Editor 会创建与 Microsoft Fabric Git 集成兼容的文件夹结构: ``` DatabaseName.SemanticModel/ @@ -154,159 +157,158 @@ DatabaseName.SemanticModel/ └── ... ``` -在使用 Fabric Git 集成时,便于阅读的 TMDL 格式特别适合用于版本控制和代码审查。有关完整文档,请参阅[连同支持文件一起保存](xref:save-with-supporting-files)。 +在使用 Fabric Git 集成时,人类可读的 TMDL 格式特别适合版本控制和代码评审。请参阅[保存时包含支持文件](xref:save-with-supporting-files),了解完整文档。 *** ## Fabric Git 集成文件 -使用**保存并附带支持文件**功能(Business 版和企业版)时,Tabular Editor 会创建 Microsoft Fabric Git 集成所需的额外元数据文件。这些文件由 Tabular Editor 自动生成和管理。 +使用**保存时包含支持文件**功能(Business 和 Enterprise 版本)时,Tabular Editor 会创建 Microsoft Fabric Git 集成所需的其他元数据文件。这些文件由 Tabular Editor 自动生成和管理。 ### .platform .platform 文件包含有关语义模型项的元数据,包括: +- **type**:将项目标识为 SemanticModel +- **displayName**:在 Fabric 工作区中显示的名称(从数据库的 `Name` 属性同步) +- **description**:在 Fabric 中显示的说明(从数据库的 `Description` 属性同步) +- **logicalId**:自动生成的跨工作区标识符 -- **type**:将该项标识为 SemanticModel -- **displayName**:在 Fabric Workspace 中显示的名称(从 Database `Name` 属性同步) -- **description**:在 Fabric 中显示的说明(从 Database `Description` 属性同步) -- **logicalId**:自动生成的跨 Workspace 的标识符 - -这是一个 JSON 文件,除非你了解 Fabric 项目项的格式,否则不要手动编辑。 +此文件是 JSON 文件,除非您了解 Fabric 项目格式,否则不应手动编辑。 > [!NOTE] -> 这种同步适用于元数据包含名称或描述的模型。由 Power BI Desktop 创建的 Power BI Project (PBIP) 语义模型在其 TMDL 中既不包含名称,也不包含描述:两者只存在于 `.platform` 文件中。 +> 此同步适用于元数据带有名称或描述的模型。由 Power BI Desktop 创建的 Power BI Project (PBIP) 语义模型在其 TMDL 中不包含名称或描述:两者仅存在于 `.platform` 文件中。 ### definition.pbism -该 definition.pbism 文件包含语义模型的整体定义和核心设置。这个文件会与模型元数据(存储在 model.bim 或 definition/ 文件夹中)一起使用,提供 Microsoft Fabric 所需的完整语义模型信息。 +definition.pbism 文件包含语义模型的整体定义和核心设置。此文件与模型元数据(以 model.bim 或在 definition/ 文件夹中存储)配合使用,以提供 Microsoft Fabric 所需的完整语义模型信息。 -在保存时勾选 **Save with supporting files** 选项后,这两个文件会自动创建。生成的文件夹结构(带 .SemanticModel 后缀)可以提交到 Git repository,并与 Fabric Workspace 同步。 +在保存操作期间选中**保存时包含支持文件**选项时,这两个文件都会自动创建。生成的文件夹结构(带有 .SemanticModel 后缀)可以提交到 Git 存储库并与 Fabric 工作区同步。 -有关此功能的完整文档,请参阅[保存并包含支持文件](xref:save-with-supporting-files)。 +有关此功能的完整文档,请参阅[保存时包含支持文件](xref:save-with-supporting-files)。 ## Tabular Editor 支持文件 -支持文件是指 Analysis Services 或 Power BI 不会使用的文件。这些文件则用于支持 Tabular Editor 3 和其他工具中的不同开发工作流。 +支持文件是指 Analysis Services 或 Power BI 不使用的文件。相反,这些文件都支持 Tabular Editor 3 和其他工具中的各种开发工作流。 -打开并选中对应的文档或窗口后,你可以用 Ctrl+S 或“文件 > 保存”来单独保存任何辅助文件。 +在相应文档或窗口打开并处于焦点状态时,可以使用 Ctrl+S 或“文件 > 保存”分别保存所有支持文件。 -### 用户选项(.tmuo) +### 用户选项 (.tmuo) -`.tmuo` 文件存储针对某个模型的、仅在本机生效的个人设置,包括:Workspace 数据库、数据源凭据覆盖、表导入设置、刷新覆盖项以及 AI 权限授予。这个文件和模型放在同一位置,并以模型名称和你的 Windows 用户名命名,这样多个开发者就能在不互相干扰的情况下处理同一个模型。 +“.tmuo”文件包含您自己针对一个模型的计算机本地设置:工作区数据库、数据源凭据覆盖、表导入设置、刷新覆盖和 AI 权限授予。它位于模型旁边,并以模型和您的Windows用户名命名,因此多名开发人员可以处理同一模型,而不会相互干扰。 -里面的凭据会使用你的 Windows 用户密钥加密,所以这个文件实际上没法共享使用。将 `*.tmuo` 添加到 `.gitignore`。 +其中的凭据使用您的 Windows 用户密钥进行加密,这意味着该文件无法有意义地共享。将 `*.tmuo` 添加到 `.gitignore`。 -有关完整内容以及每种模型格式下这个文件的写入位置,见 @user-options。 +请参阅 @user-options,了解完整内容以及针对每种模型格式写入该文件的位置。 -### 关系图文件 (.te3diag) +### 图表文件 (.te3diag) -.te3diag 文件是一种文件格式,用于存储使用 TE3 创建的模型关系图。 +.te3diag 文件是一种文件格式,用于存储使用 TE3 创建的模型的图表。 -这些文件可用于记录模型结构与逻辑,方便参与同一项目的其他开发者查看与协作。可以将 .te3diag 文件保存在与模型文件相同的文件夹中,便于访问和查阅。 +这些文件对于为从事同一项目的其他开发人员记录模型结构和逻辑非常有用。.te3diag 文件可以与模型文件保存在同一文件夹中,以便于访问和参考。 -关系图文件本质上以 JSON 格式存储,并保存在 Tabular Editor 3 扩展中。 +关系图文件实际上是存储在 Tabular Editor 3 扩展中的 JSON。 -[下载示例关系图文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/te3-diagram.te3diag) +[下载图表文件示例](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/te3-diagram.te3diag) ### DAX 查询文件(.dax 或 .msdax) -DAX 查询是一类表达式,可用于操作和分析语义模型中的数据。 DAX 文件是包含一个或多个 DAX 查询的文本文件。 +DAX 查询是可用于操作和分析语义模型中数据的表达式。DAX 文件是一个包含一个或多个 DAX 查询的文本文件。 -你可以在 Tabular Editor 3 中保存 DAX 文件,并在之后再次运行这些查询。你也可以在其他支持 DAX 的工具中打开 DAX 文件,例如 [DAX Studio](https://daxstudio.org)。 +您可以在 Tabular Editor 3 中保存 DAX 文件,稍后使用该文件再次运行查询。您还可以在其他支持 DAX 的工具(例如 [DAX Studio](https://daxstudio.org))中打开 DAX 文件。 [下载示例 DAX 文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/dax-query-example.dax) -只有当 Tabular Editor 3 连接到 Analysis Services 实例或 Power BI/Fabric XMLA endpoint 时,才能打开这些文件。 +这些文件只能在 Tabular Editor 3 连接到 Analysis Services 实例或 Power BI/Fabric XMLA endpoint 时打开。 -### Pivot Grid 布局(.te3pivot) +### Pivot Grid布局(.te3pivot) -这些文件包含 Tabular Editor 3 中 Pivot Grid 的布局。它们是简单的 JSON 文件,用于指定 Pivot Grid 中显示哪些字段(度量值、列、层次结构),以及这些字段的排列方式。 +这些文件包含 Tabular Editor 3 中 Pivot Grid 的布局。它们是简单的 JSON 文件,用于指定在 Pivot Grid 中显示哪些字段(度量值、列、层次结构)以及如何排列这些字段。 -只有当 Tabular Editor 3 连接到 Analysis Services 实例或 Power BI/Fabric XMLA endpoint 时,才能打开这些文件。 +这些文件只能在 Tabular Editor 3 连接到 Analysis Services 实例或 Power BI/Fabric XMLA endpoint 时打开。 -### DAX脚本(.te3daxs) +### DAX 脚本 (.te3daxs) -这些文件是已保存的 DAX脚本(不是查询),用来在 Tabular Editor 中一次处理多个 DAX 对象。例如,修改语义模型中的多个度量值。 +这些文件是已保存的 DAX 脚本(而非查询),用于在 Tabular Editor 中一次性操作多个 DAX 对象。例如,修改语义模型中的多个 Measure。 -### C# Script(.csx) +### C# 脚本 (.csx) -创建和编辑 C# Script 是 Tabular Editor 最能提升效率的功能之一。 +创建和编辑 C# 脚本是 Tabular Editor 最重要的生产力功能之一。 -这些脚本可以保存为扩展名为 .csc 的文件,并可加载到 Tabular Editor 中,也可以保存为宏。 Tabular Editor 会维护一个用于存储宏的 [MacroActions.json 本地设置文件](xref:supported-files#macroactionsjson)。 +这些脚本可以保存为具有 .csc 扩展名的文件并加载到 Tabular Editor 中,也可以保存为宏。[MacroActions.json 本地设置文件](xref:supported-files#macroactionsjson)由 Tabular Editor 维护。 -这样,脚本就可以重复使用,而不必每次都从头编写。[脚本库](xref:csharp-script-library) 是一个很好的去处,可在此查看并复用各类脚本示例;这些示例展示了 C# 的不同特性和功能。 +这样,脚本就可以重复使用,而无需每次都从头开始编写。[脚本库](xref:csharp-script-library)是研究和重用各种脚本示例的理想场所,因为这些示例展示了 C# 的不同特性和功能。 -[下载示例 C# Script 文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/create-sum-measures-csharp.csx) +[下载C# Script文件示例](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/create-sum-measures-csharp.csx) -### VertiPaq Analyzer 文件(.vpax) +### Vertipaq Analyzer 文件(.vpax) -在 Tabular Editor 中,你可以通过 VertiPaq Analyzer 功能导出和导入 .vpax 文件。 .vpax 文件是一种压缩文件,包含有关你的语义模型大小和结构的信息,但不包含实际数据。 +使用 Tabular Editor,您可以使用 Vertipaq Analyzer 功能导出和导入 .vpax 文件。.vpax 文件是一个压缩文件,其中包含有关你语义模型的大小和结构的信息,但不包含实际数据。 -你可以用这个文件分析并优化模型性能,而不会暴露敏感数据。例如,你可以使用 [DAX optimizer](https://www.daxoptimizer.com/) 工具,基于 .vpax 文件获取改进 DAX 公式的建议。 +您可以使用此文件分析和优化模型性能,而不会泄露敏感数据。例如,您可以使用 [DAX 优化器](https://www.daxoptimizer.com/) 工具,根据 .vpax 文件获取有关如何改进 DAX 公式 的建议。 -[下载示例 DAX脚本文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/dax-script-example.te3daxs) +[下载DAX脚本文件示例](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/dax-script-example.te3daxs) -与其他受支持的文件类型不同,创建 .vpax 文件需要在 VertiPaq Analyzer 窗口中通过“导入”和“导出”按钮完成。 +与其他支持的文件类型不同,创建 .vpax 文件是在 Vertipaq Analyzer 窗口中使用“导入”和“导出”按钮完成的。 ![VPAX](~/content/assets/images/file-types/te3-supported-file-vpax.png) -[下载示例 VPAX 文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/vpaq-example.vpax) +[下载 VPAX 文件示例](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/vpaq-example.vpax) > [!WARNING] -> 如果你的模型元数据属于机密信息,那么 .vpax 文件也应视为机密,并仅在充分考虑这一点的情况下共享。如果你担心知识产权泄露,Tabular Editor 3 提供了一个用于混淆 VPAX 文件的选项。 +> 如果您的模型元数据是机密的,则 .vpax 文件也应被视为机密,并且仅在考虑到这一点的情况下进行共享。如果您担心知识产权的保护,Tabular Editor 3 提供了一个混淆 VPAX 文件的选项。 -#### 混淆 +### 混淆的 VPAX 文件 (.ovpax) -如果你需要将 VPAX 文件交付给第三方(例如顾问或工具供应商),可以对文件进行混淆,以隐藏模型元数据。具体做法是:在 Vertipaq Analyzer 窗口中,点击“导出”按钮旁边的下拉按钮,然后选择“混淆导出...”选项。 +如果需要将 VPAX 文件移交给第三方(例如顾问或工具供应商),您可以对文件进行混淆以隐藏模型元数据。要执行此操作,请在 Vertipaq Analyzer 窗口中“导出”按钮旁边的下拉按钮下选择“混淆导出…”选项。 -混淆后的 VPAX 文件使用 .ovpax 文件扩展名。 +混淆的 VPAX 文件使用 .ovpax 文件扩展名。 -![导出已混淆的 VPAX](~/content/assets/images/obfuscated-vpax.png) +![导出混淆的 VPAX](~/content/assets/images/obfuscated-vpax.png) -有关 VertiPaq Analyzer 的更多文档,请参阅:[sqlbi Vertipaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer) 和 [sqlbi Docs: Vertipaq Analyzer](https://docs.sqlbi.com/vertipaq-analyzer/) +有关 Vertipaq Analyzer 的更多文档,请参阅:[sqlbi Vertipaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer) 和 [sqlbi 文档:Vertipaq Analyzer](https://docs.sqlbi.com/vertipaq-analyzer/) -有关 VPAX 文件混淆的更多信息,请参阅:[VPAX Obfuscator](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) +有关 VPAX 文件混淆的更多信息,请参阅:[VPAX 混淆器](https://www.sqlbi.com/blog/marco/2024/03/15/vpax-obfuscator-a-library-to-obfuscate-vpax-files/) ## 本地设置文件 -Tabular Editor 会在 "%localappdata%\\TabularEditor3" 文件夹中维护多个本地文件。这些文件与 Tabular Editor 3 的功能相关,值得了解。 +Tabular Editor 在“%localappdata%\TabularEditor3”文件夹中维护多个本地文件。这些文件与 Tabular Editor 3 的功能相关,了解这些文件很有用。 -在团队里共享这些文件会很有用,这样所有开发者都能用到相同的宏和 BPA 规则。 +在团队中共享这些文件可能很有帮助,这样所有开发人员都将拥有相同的宏和 BPA 规则。 > [!TIP] -> 在 Windows 上,将受版本控制的文件同步到 "%localappdata%\TabularEditor3" 文件夹的原生方法之一,是使用 [SymLink](https://www.howtogeek.com/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/)。 +> 将版本控制文件同步到“%localappdata%\TabularEditor3”文件夹的 Windows 原生方式是使用 [SymLink](https://www.howtogeek.com/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/)。 > -> 把所需文件放在 Git 或 OneDrive 里,并为“%localappdata%\TabularEditor3”文件夹创建一个符号链接。不过要注意:如果有多个用户更新同一个文件版本,最后可能会出现同步问题。不过,Tabular Editor 不直接支持这一点,所以要不要这样做请你自行斟酌。 +> 将所需文件存储在 Git 或 OneDrive 中,并创建指向“%localappdata%\TabularEditor3”文件夹的符号链接,但请注意,如果多位用户更新同一文件版本,这可能会导致同步问题。 +> 但是,Tabular Editor 不直接支持此操作,因此请自行决定是否实施。 + ### AI 审计日志 -仅在安装了 AI 功能组件时显示。 Tabular Editor 会记录 [AI 助手](xref:ai-assistant) 和 [MCP 服务器](xref:mcp-server) 执行过的操作:请求了哪些权限以及如何回应;运行了哪些工具,以及每个工具是成功、失败还是被拒绝;以及任何已运行或提交供审核的 C# Script 的完整文本。绝不会记录提示词、回复或你模型中的数据值。 +仅在安装了 AI 功能组件时显示。Tabular Editor 会记录[AI 助手](xref:ai-assistant)和[MCP 服务器](xref:mcp-server)的操作:请求了哪些权限以及如何回应这些请求,运行了哪些工具以及每个工具是成功、失败还是被拒绝,以及任何已运行或移交审核的 C# 脚本的完整文本。绝不会记录来自您模型的提示、回复和数据值。 -文件按天生成,每天一个,默认保留 30 天。在 **工具 > 偏好 > AI 功能** 下点击 **打开审计文件夹**,即可打开该文件夹。管理员可以通过 [策略](xref:policies) 移动该文件夹并更改保留期限。有关每条记录包含的内容,请参阅 @ai-audit-log。 +默认情况下,每天写入一个文件,并保留 30 天。通过 **工具 > 首选项 > AI 功能** 下的 **打开审计文件夹** 进入该文件夹。管理员可以通过[策略](xref:policies)移动该文件夹并更改保留期。请参阅 @ai-audit-log,了解每条记录包含的内容。 -与此文件夹中的其他文件不同,这个文件保存的是记录,而不是设置。不要共享或同步它:这是每台计算机各自的日志,其中包含的脚本可能会暴露你处理过的模型结构。 +与此文件夹中的其他文件不同,此文件是记录,而不是设置。请勿共享或同步此文件:它是一份每台机器的日志,其中包含的脚本可能会揭示您所处理的模型的结构。 ### MacroActions.json +此文件存储您已创建或导入的所有宏。与同事共享此文件或将其备份到版本控制系统中可能很有用,也可以将其配置为与包含宏的远程存储库同步(请参阅上面的提示)。 -此文件存储你创建或导入的所有宏。你可以将此文件分享给同事,或将其备份到版本控制系统中;也可以将它配置为与包含宏的远程 repository 同步(见上方提示)。 - -此文件包含软件中使用的每个宏的索引。如果需要更改某个宏的顺序或名称,可以使用文本编辑器手动编辑此文件。不过务必小心,避免在文件中引入错误或不一致而导致文件损坏;编辑前请先创建备份。 +此文件包含软件中使用的每个宏的索引。如果您需要更改任何宏的顺序或名称,您可以使用文本编辑器手动编辑此文件。但是,请注意不要在文件中引入任何错误或不一致之处,从而导致文件损坏,因此请务必创建备份。 [下载示例 MacroActions 文件](https://raw.githubusercontent.com/TabularEditor/TabularEditorDocs/main/content/assets/file-types/MacroActions.json) -### BPARules.json -该文件包含 [Best Practice Analyzer 规则](xref:using-bpa)以及修复表达式。添加和编辑修复表达式的唯一位置就是这个 JSON 文件。建议将 BPA 规则文件纳入版本控制,这样也可以在部署前对语义模型运行 BPA 规则。 +### BPARules.json +该文件包含[Best Practice Analyzer 规则](xref:using-bpa)和修复表达式。添加和编辑修复表达式的唯一位置是此 JSON 文件中。 +建议将 PBA 规则文件存储在版本控制中,这样也可以在部署前对语义模型运行 BPA 规则。 -你可以在此处下载微软官方的 BPA 规则:[PBA Rules](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json) +您可以在此处下载官方 Microsoft BPA 规则:[PBA 规则](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json) ### RecentServers.json - -包含用户连接过的所有服务器。有时可以手动编辑它,让它“忘记”那些不再相关的旧服务器。 +包含您已连接的服务器,其中为每台服务器保存了身份验证类型、用户名、模式和状态栏颜色,以及已固定的服务器列表。密码不会被存储。要移除或固定服务器,请在连接对话框的**服务器**列表中右键单击该服务器。请参阅[最近访问的服务器和已固定的服务器](xref:xmla-as-connectivity#recent-and-pinned-servers)。 ### Layouts.json - -Layouts 文件会在启动 Tabular Editor 时自动生成。其中包含 Tabular Editor 3 的 UI 布局配置方式的全部信息。 +启动应用程序时,Tabular Editor 会自动生成 Layouts 文件。它包含有关如何配置 Tabular Editor 3 的 UI 布局的所有信息。 > [!TIP] -> 删除此文件将重置 Tabular Editor 的布局。如果 Tabular Editor 的布局表现不符合预期,一个不错的第一步是先将此文件备份到别处,删除原文件,然后重启 Tabular Editor 3。 +> 删除此文件将重置 Tabular Editor 的布局。如果 Tabular Editor 布局未按预期表现,一个很好的第一步是将此文件备份到其他位置,删除原文件,然后重启 Tabular Editor 3。 diff --git a/localizedContent/zh/content/references/system-requirements.md b/localizedContent/zh/content/references/system-requirements.md index dab5cd974..41ce193be 100644 --- a/localizedContent/zh/content/references/system-requirements.md +++ b/localizedContent/zh/content/references/system-requirements.md @@ -1,8 +1,8 @@ ---- +--- uid: system-requirements title: 系统要求 author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -16,60 +16,59 @@ applies_to: - edition: Enterprise full: true --- - # 系统要求 -Tabular Editor 3 是一款 Windows 桌面应用程序。从 3.27.0 版本起,它将针对两种 .NET 运行时、两种处理器架构,并以三种组件格式发布。 +Tabular Editor 3 是一款 Windows 桌面应用程序。从 3.27.0 版本起,该产品在两个 .NET 运行时上发布,适用于两种处理器架构,并提供三种软件包格式。 ## 操作系统 - Windows 10、Windows 11、Windows Server 2016、Windows Server 2019 或更高版本 -在任何时刻支持哪些 Windows 版本,取决于你安装的运行时所遵循的 Microsoft .NET 受支持操作系统策略;因此即使 Tabular Editor 本身不变,支持范围也可能会随着时间推移而缩小。 +在任何特定时刻,哪些 Windows 版本受支持取决于 Microsoft 对于您所安装的运行时所适用的 .NET 受支持操作系统政策,因此,受支持的 Windows 版本范围可能会随着时间的推移而缩小,这与 Tabular Editor 无关。 ## 发布内容 -| 运行时 | 架构 | 格式 | -| ------------------------------ | --------- | ----------------------------- | -| .NET 10 _(推荐)_ | x64、ARM64 | `.exe` 安装程序、`.msi`、便携式 `.zip` | -| .NET 8 | x64、ARM64 | `.exe` 安装程序、`.msi`、便携式 `.zip` | +| 运行时 | 架构 | 格式 | +|---|---|---| +| .NET 10 *(推荐)* | x64、ARM64 | `.exe` 安装程序、`.msi`、便携式 `.zip` | +| .NET 8 | x64、ARM64 | `.exe` 安装程序、`.msi`、便携式 `.zip` | -.NET 10 和 .NET 8 的构建在_功能上完全一致_。两者功能完全对等,没有一方有而另一方缺的内容,而且可以同时安装。 +.NET 10 和 .NET 8 版本在*功能上是相同的*。一个版本中存在的功能在另一个版本中也存在。使用“`.exe`”或“`.msi`”安装程序安装一个版本会替换另一个版本。请参阅[在 .NET 8 和 .NET 10 包之间切换](xref:installation-activation-basic#switching-between-the-net-8-and-net-10-packages)。 -从 3.23.0 版本开始,ARM64 构建为原生版本。 +从 3.23.0 版本起,ARM64 版本为原生版本。 ## .NET 运行时 -| 构建 | 所需内容 | -| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `.exe` 安装程序 | 对应的 [.NET Desktop Runtime](https://dotnet.microsoft.com/download/dotnet):[10](https://dotnet.microsoft.com/download/dotnet/10.0) 或 [8](https://dotnet.microsoft.com/download/dotnet/8.0)。安装程序会为你下载并安装它 | -| `.msi` | 需要预先安装匹配的 .NET 桌面运行时。 MSI _不会_将其一并包含,这也是它适合无人值守部署的原因 | -| 便携版 `.zip` | 无需任何额外组件。它是自包含的 | +| 版本 | 需要 | +|---|---| +| `.exe` 安装程序 | 匹配的[.NET Desktop Runtime](https://dotnet.microsoft.com/download/dotnet):[10](https://dotnet.microsoft.com/download/dotnet/10.0) 或 [8](https://dotnet.microsoft.com/download/dotnet/8.0)。安装程序会为您下载并安装 | +| `.msi` | 匹配的 .NET Desktop Runtime,需事先安装。MSI *不会*随附该运行时,这正是其适合无人值守部署的原因 | +| 可移植的 `.zip` | 无。它是自包含的 | -必须安装 _Desktop_ 运行时。 ASP.NET Core 运行时和普通的 .NET 运行时不包含此应用所需的 Windows Forms 和 WPF 库。 +必须是*桌面*运行时。ASP.NET Core 运行时和普通的 .NET 运行时不包含应用程序所需的 Windows Forms 和 WPF 库。 -## 选择构建版本 +## 选择生成 -除非你有明确理由,否则请选择 **.NET 10 x64 `.exe` 安装程序**。理由如下: +请选择 **.NET 10 x64 `.exe` 安装程序**,除非你有不选的理由。理由如下: -- **ARM64**:你使用的是基于 ARM 的 PC -- **.NET 8**:你的组织目前还无法安装 .NET 10 桌面运行时 -- **`.msi`**:你正在进行集中部署。参见 [静默安装](xref:installation-activation-basic) -- **便携版 `.zip`**:你无法在这台计算机上安装软件,或者你希望同时使用多个版本 +- **ARM64**:您使用的是基于 ARM 的 PC +- **.NET 8**:您的组织尚无法安装 .NET 10 桌面运行时 +- **`.msi`**:您正在进行集中部署。请参阅[静默安装](xref:installation-activation-basic) +- **可移植的 `.zip`**:您无法在计算机上安装软件,或者您希望并行安装多个版本 ## 可选组件 -| 组件 | 用途 | 说明 | -| --------------------------------------------------------------------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------- | -| [Microsoft Edge WebView2 运行时](https://developer.microsoft.com/microsoft-edge/webview2/) | 应用内的 **开始使用** 页面和 @ai-assistant | 当前版本的 Windows 通常已预装。如果缺少该组件,Tabular Editor 会改用内置浏览器控件,或提供链接让你在默认浏览器中打开该页面 | -| AI 功能 | @ai-assistant 与 MCP 服务器 | 默认会被选中的安装组件。安装时可取消选中;此外,无论是否选中,管理员都可以通过 @policies 中的 `DisableAi` 禁用 AI 功能 | +| 组件 | 用于 | 注意事项 | +|---|---|---| +| [Microsoft Edge WebView2 运行时](https://developer.microsoft.com/microsoft-edge/webview2/) | 应用内**入门**页面和 @ai-assistant | 存在于当前的 Windows 安装中。如果缺少此组件,Tabular Editor 将回退到内置浏览器控件,或提供一个链接,以便在默认浏览器中打开该页面 | +| AI 功能 | @ai-assistant 和 MCP 服务器 | 安装程序组件,默认选中。您可以在安装过程中取消选择此组件,管理员也可以使用 `DisableAi` @policies 禁用 AI 功能。| ## 下载位置 -当前版本请参见 @downloads,旧版本请参见 @release-history。 +请参阅 @downloads 以了解当前版本,参阅 @release-history 以了解以前的版本。 ## 后续步骤 -- @下载量 -- @快速入门 -- @installation-activation-basic +- @downloads +- @getting-started +- @安装-激活-基础 diff --git a/localizedContent/zh/content/references/toc.md b/localizedContent/zh/content/references/toc.md index 9b6d88d49..25658d424 100644 --- a/localizedContent/zh/content/references/toc.md +++ b/localizedContent/zh/content/references/toc.md @@ -1,33 +1,39 @@ -# 下载与版本发布 - +# 下载和版本 ## @downloads - +## @系统要求 ## @release-history -## @whats-new # 技术参考 - ## @faq - ## @preferences - ## @policies - ## @shortcuts3 - ## @shortcuts2 - ## @user-options - ## @supported-files - +## @accessibility ## @user-setting-files-te2 -# 开发与规划 - +# 对象属性参考 +## @object-properties +## @object-properties-common +## @object-properties-model +## @object-properties-tables +## @object-properties-columns +## @object-properties-measures +## @object-properties-calculation-groups +## @object-properties-hierarchies +## @object-properties-relationships +## @object-properties-partitions +## @object-properties-data-sources +## @object-properties-security +## @object-properties-perspectives-cultures +## @object-properties-calendars +## @object-properties-functions + +# 开发和规划 ## @roadmap -# 已弃用的功能 - -## @formatdax \ No newline at end of file +# 已弃用功能 +## @formatdax \ No newline at end of file diff --git a/localizedContent/zh/content/references/user-options.md b/localizedContent/zh/content/references/user-options.md index fb1f4eef0..da00a92ff 100644 --- a/localizedContent/zh/content/references/user-options.md +++ b/localizedContent/zh/content/references/user-options.md @@ -1,8 +1,8 @@ ---- +--- uid: user-options -title: 用户选项(.tmuo)文件 +title: 用户选项 (.tmuo) 文件 author: Daniel Otykier -updated: 2026-09-15 +updated: 2026-10-12 applies_to: products: - product: Tabular Editor 2 @@ -16,34 +16,33 @@ applies_to: - edition: Enterprise full: true --- +# 表格模型用户选项 (.tmuo) 文件 -# Tabular Model 用户选项(.tmuo)文件 - -Tabular Editor 3 引入了一种新的基于 JSON 的文件,用于存储开发者和模型专用的偏好设置。这个文件叫做 **Tabular Model User Options** 文件,并使用 **.tmuo** 文件扩展名。 +Tabular Editor 3 引入了一种新的基于 JSON 的文件,用于存储特定于开发者和模型的首选项。此文件称为**表格模型用户选项**文件,并使用 **.tmuo** 文件扩展名。 -当您从磁盘打开模型时,系统会在模型旁边创建该文件,文件名由模型名称和您的 Windows 用户名组成。每次从磁盘加载模型时,Tabular Editor 都会查找同名的文件。 +当您从磁盘打开模型时,系统会在其旁边创建文件,文件名称以模型名称和您的 Windows 用户名命名。每次从磁盘加载模型时,Tabular Editor 都会查找具有该名称的文件。 -| 您打开的项目 | 用户选项文件 | -| ----------------------------------------------------------------------- | -------------------------------------- | -| `SpaceParts.bim`,或任何 `.bim` / `.pbit` / `Database.json` 文件 | `SpaceParts..tmuo`,与其位于同一目录中 | -| `model.tmdl` 或 `database.tmdl` 文件 | `model..tmuo`,与其位于同一目录中 | -| 包含 `Database.json` 的文件夹 | `database..tmuo`,位于该文件夹中 | -| 包含 Tabular Model Definition Language (TMDL) 模型文件的文件夹 | `model..tmuo`,位于该文件夹中 | +| 您打开的文件 | 用户选项文件 | +|---|---| +| `SpaceParts.bim` 或任何 `.bim` / `.pbit` / `database.json` 文件 | `SpaceParts..tmuo`,位于其旁边 | +| `model.tmdl` 或 `database.tmdl` 文件 | `model..tmuo`,位于其旁边 | +| 包含 `database.json` 的文件夹 | `database..tmuo`,位于该文件夹中 | +| 包含表格模型定义语言 (TMDL) 模型文件的文件夹 | 该文件夹中的 `model..tmuo`,位于该文件夹中 | -TMDL 始终使用 `model` 前缀,以延续早于 `database.tmdl` 的版本中的命名方式。 +TMDL 始终使用 `model` 前缀,以便与早于 `database.tmdl` 的版本保持一致。 -对于通过连接而非从磁盘打开的模型,由于无法在模型旁边存放该文件,因此会按服务器和数据库分别将其保存在 `%LocalAppData%\TabularEditor3\UserOptions\` 下。 +对于通过连接而非从磁盘打开的模型,除了模型之外,没有其他地方可以放置该文件,因此该文件按服务器和数据库保存在 `%LocalAppData%\TabularEditor3\UserOptions\` 下。 -是否会为新模型创建该文件,取决于 @preferences 下的 _创建用户选项(.tmuo)文件_ 偏好设置。 +是否为新模型创建文件由 @preferences 下的*创建用户选项 (.tmuo) 文件*控制。 > [!IMPORTANT] -> **.tmuo** 文件包含用户特定的偏好,因此不应将其纳入共享的版本控制环境。如果你使用 Git 进行版本控制,请确保在 `.gitignore` 文件中加入 `.tmuo` 扩展名。 +> **.tmuo** 文件包含用户特定的首选项,因此不应将其纳入共享版本控制环境。如果你使用 Git 进行版本控制,请务必在 `.gitignore` 文件中包含 `.tmuo` 扩展名。 ## 文件内容 -该文件采用 JSON 格式,所有属性都是可选的。 Tabular Editor 只会在有内容需要存储时才写入文件,因此实际生成的文件只会包含下列区块中的少数几个,而不是全部。如果没有任何内容需要存储,就根本不会生成文件。 +该文件是 JSON 文件,每个属性都是可选的。只有当有内容需要存储时,Tabular Editor 才会写入一个文件,因此,一个实际的文件只包含以下几个块,而不是全部块。如果不需要存储任何内容,则根本不会写入任何文件。 -一个最小文件示例,适用于仅连接到 Workspace 数据库、除此之外不做任何操作的模型: +对于一个除了连接到工作区数据库外什么都不做的模型,其最小文件如下: ```json { @@ -56,88 +55,89 @@ TMDL 始终使用 `model` 前缀,以延续早于 `database.tmdl` 的版本中 } ``` -### 顶层属性 +### 顶级属性 -| 属性 | 类型 | 写入条件 | -| ----------------------------- | ------ | ------------------------------------------------------------- | -| `UseWorkspace` | 布尔值 | 你已为该模型回答了 Workspace 相关问题。如果没有这个属性,Tabular Editor 每次加载模型时都会询问。 | -| `WorkspaceConnection` | 字符串或对象 | 已设置 Workspace 连接。当连接字符串包含密码时,使用对象形式。 | -| `WorkspaceConnectionAuthMode` | 字符串 | 仅为兼容旧版而保留,且仅在其不是 `Integrated` 时写入。现在可由连接字符串推断出身份验证模式。 | -| `WorkspaceDatabase` | 字符串 | 已设置 Workspace 数据库名称。 | -| `Deployment` | 对象 | 已对该模型运行过 Deployment Wizard。 | -| `DataSourceOverrides` | 对象 | 已定义至少一个数据源覆盖项。 | -| `TableImportSettings` | 对象 | 至少有一个数据源具有导入设置。 | -| `RefreshOverrides` | 对象 | 至少定义了一个刷新覆盖配置文件。 | -| `AIConsent` | 对象 | 旧版。存在时会读取,但绝不会回写。 | -| `Permissions` | 对象 | 至少已授予一项针对单个模型的 AI 授权。 | +| 属性 | 类型 | 写入时 | +|---|---|---| +| `UseWorkspace` | 布尔值 | 您已回答此模型的工作区问题。如果该属性不存在,Tabular Editor 会在每次加载模型时询问。| +| `WorkspaceConnection` | 字符串或对象 | 已设置工作区连接。当连接字符串包含密码时的对象形式。| +| `WorkspaceConnectionAuthMode` | 字符串 | 旧版,且仅当其不是 `Integrated` 时。身份验证模式现在由连接字符串隐含。| +| `WorkspaceDatabase` | 字符串 | 已设置工作区数据库名称。| +| `Deployment` | 对象 | 部署向导已对此模型运行。| +| `DataSourceOverrides` | 对象 | 至少定义了一个数据源替代。| +| `TableImportSettings` | 对象 | 至少一个数据源具有导入设置。| +| `RefreshOverrides` | 对象 | 已定义至少一个刷新覆盖配置文件。| +| `AIConsent` | 对象 | 旧版。存在时读取,绝不写回。| +| `Permissions` | 对象 | 已授予至少一个每模型 AI 权限。| -它们按该顺序出现。 +它们按该顺序显示。 -### Workspace 数据库 +### 工作区数据库 -- `UseWorkspace` 决定 Tabular Editor 在加载模型时是否连接到 Workspace 数据库。 Workspace 数据库会被已加载的文件或文件夹结构中的元数据覆盖。 -- `WorkspaceConnection` 是 Workspace 数据库要部署到的 Analysis Services 实例或 Power BI XMLA endpoint。 -- `WorkspaceDatabase` 是该 Workspace 数据库的名称。应为每位开发人员、每个模型设置唯一值,因为目的就是让每位开发人员都有自己的数据库。 +- `UseWorkspace` 决定 Tabular Editor 在加载模型时是否连接到工作区数据库。工作区数据库将被加载的文件或文件夹结构的元数据覆盖。 +- `WorkspaceConnection` 是工作区数据库部署到的 Analysis Services 实例或 Power BI XMLA 端点。 +- `WorkspaceDatabase` 是该数据库的名称。请确保每个开发者和每个模型都有唯一的名称,因为关键在于每个开发者都能拥有自己的名称。 ### 数据源覆盖 -`DataSourceOverrides` 用于让 Workspace 数据库使用与模型文件中不同的连接信息,这样 Analysis Services 就会从模型所指定位置以外的数据源刷新数据。 +`DataSourceOverrides` 用于为工作区数据库提供与模型文件中的连接详细信息不同的连接详细信息,因此 Analysis Services 会从模型指定位置以外的位置进行刷新。 -| 属性 | 类型 | 写入条件 | -| ------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ImpersonationMode` | 字符串 | 不是 `Default`。以下值之一:`Default`、`ImpersonateAccount`、`ImpersonateAnonymous`、`ImpersonateCurrentUser`、`ImpersonateServiceAccount`、`ImpersonateUnattendedAccount`。 | -| `Username` | 字符串 | 已设置时写入。 | -| `ConnectionString` | 加密对象 | 已设置时写入。 | -| `Password` | 加密对象 | 已设置时写入。 | -| `AccountKey` | 加密对象 | 已设置时写入。用于 Blob 存储数据源。 | -| `PrivacySetting` | 字符串 | 已设置时写入。 | +| 属性 | 类型 | 写入时 | +|---|---|---| +| `ImpersonationMode` | 字符串 | 不是`Default`。以下之一:`Default`、`ImpersonateAccount`、`ImpersonateAnonymous`、`ImpersonateCurrentUser`、`ImpersonateServiceAccount`、`ImpersonateUnattendedAccount`。| +| `Username` | 字符串 | 已设置。| +| `ConnectionString` | 加密对象 | 已设置。| +| `Password` | 加密对象 | 已设置。| +| `AccountKey` | 加密对象 | 已设置。用于 Blob 存储源。| +| `PrivacySetting` | 字符串 | 设置。| -如果某个覆盖项对应的数据源在模型中已不存在,则会在下次写入文件时被删除;如果其数据源已重命名,该覆盖项也会随之重命名。 +下次写入文件时,将删除数据源不再存在于模型中的覆盖,而数据源已重命名的覆盖将遵循重命名。 -### 表导入设置 +### 表格导入设置 -运行 [导入表或架构更新](xref:importing-tables) 时,会使用 `TableImportSettings` 来浏览可用的表和视图,并获取源架构更改。 +`TableImportSettings` 用于在您运行[导入表或架构更新](xref:importing-tables)时,浏览可用表和视图并获取源架构更改。 -| 属性 | 类型 | 在以下情况下写入 | -| ------------------------------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ServerType` | 字符串 | 始终写入。 `Sql`、`Oracle`、`Odbc`、`OleDb`、`Snowflake`、`Dataflow`、`PostgreSql`、`MySql`、`MariaDb`、`Db2`、`Databricks`、`OneLake` 之一。 | -| `Options` | 字符串对象 | 该包不是空的。 | -| `UserId` | 字符串 | 已设置。 | -| `Password` | 加密对象 | 已设置,_并且_你已选择将其保存。 | -| `Provider` | 字符串 | `ServerType` 为 `OleDb`。 | -| `PasswordKey`、`UserIdKey` | 字符串 | `ServerType` 为 `OleDb`,且已设置对应的值。 | -| `服务器` | 字符串 | `ServerType` 不是 `Odbc`,且已设置。 | -| `ServerKey`、`DatabaseKey` | 字符串 | `ServerType` 不是 `Sql`,且已设置该值。 | -| `数据库` | 字符串 | 已设置。 | -| `身份验证` | 字符串 | `ServerType` 可以是 `Sql`、`OleDb` 或 `Databricks`。 `Sql`、`WindowsIntegrated`、`AadInteractive`、`AadPassword`、`AadIntegrated`、`AadServicePrincipal`、`AccessToken` 或 `OAuth` 之一。 | -| `Encrypt` | 布尔值 | 无论设为 true 还是 false,都会写入。 | -| `Dsn` | 字符串 | 已设置时写入。用于 ODBC。 | -| `RowLimitClause`、`IdentifierQuoting` | 数字 | 不为默认值时写入。 | -| `Schema` | 字符串 | 已设置时写入。 | +| 属性 | 类型 | 写入时 | +|---|---|---| +| `ServerType` | 字符串 | 始终。`Sql`、`Oracle`、`Odbc`、`OleDb`、`Snowflake`、`Dataflow`、`PostgreSql`、`MySql`、`MariaDb`、`Db2`、`Databricks`、`OneLake` 之一。| +| `Options` | 字符串对象 | 集合不为空。| +| `UserId` | 字符串 | 已设置。| +| `Password` | 加密对象 | 已设置,*并且*您选择了保存。| +| `Provider` | 字符串 | `ServerType` 为 `OleDb`。| +| `PasswordKey`、`UserIdKey` | 字符串 | `ServerType` 为 `OleDb` 且已设置相应的值。| +| `Server` | 字符串 | `ServerType` 不是 `Odbc`,并且已设置。| +| `ServerKey`、`DatabaseKey` | 字符串 | `ServerType` 不是 `Sql`,并且已设置值。| +| `Database` | 字符串 | 已设置。| +| `Authentication` | 字符串 | `ServerType` 为 `Sql`、`OleDb` 或 `Databricks`。`Sql`、`WindowsIntegrated`、`AadInteractive`、`AadPassword`、`AadIntegrated`、`AadServicePrincipal`、`AccessToken`、`OAuth` 之一。| +| `Encrypt` | 布尔值 | 任意设置。| +| `Dsn` | 字符串 | 已设置。用于 ODBC。| +| `RowLimitClause`、`IdentifierQuoting` | 数字 | 不为默认值。| +| `Schema` | 字符串 | 已设置。| -`Options` 用于存放特定于某个提供程序的内容,并以纯字符串形式保存:Snowflake 的 Warehouse 对应 `Options.warehouse`,OneLake 的 Workspace 对应 `Options.workspaceid`。`…Key` 属性保存的是连接字符串键的_名称_,例如 `PWD`,而不是机密本身。 +`Options` 是特定于一个提供商的任何内容最终所在的位置,以纯字符串形式表示:Snowflake 仓库是 `Options.warehouse`,OneLake 工作区是 `Options.workspaceid`。`…Key` 属性是连接字符串键的*名称*,例如 `PWD`,而不是密钥。 -`Password` 是这里唯一经过加密的值。 `UserId`、`Server`、`Database`、`Dsn` 以及 `Options` 中的所有内容都以纯文本存储,因此即使文件中不含密码,也要把它当作敏感文件处理。 Power BI 访问令牌存储在 `Password` 中,并且会被加密。 +`Password` 是此处唯一加密的值。`UserId`、`Server`、`Database`、`Dsn`以及`Options`中的所有内容均以纯文本形式存储,因此即使文件不包含密码,也应将其视为敏感文件。Power BI 访问令牌存储为 `Password`,并经过加密。 ### 部署 -`Deployment` 保存 Deployment Wizard 上次用于此模型的内容。一旦该块存在,这六个布尔选项就会始终写入,无论其值为 true 还是 false: - -| 属性 | 类型 | 写入时机 | -| ------------------------------- | ------ | ------------------------------------- | -| `DeployDataSources` | 布尔值 | 始终 | -| `DeployPartitions` | 布尔值 | 始终 | -| `DeployRefreshPolicyPartitions` | 布尔值 | 始终 | -| `DeployModelRoles` | 布尔值 | 始终 | -| `DeployModelRoleMembers` | 布尔值 | 始终 | -| `DeploySharedExpressions` | 布尔值 | 始终 | -| `TargetConnectionString` | 字符串或对象 | 始终返回;未设置时为 `null`。当连接字符串包含密码时,使用对象形式。 | -| `TargetDatabase` | 字符串 | 始终返回;未设置时为 `null`。 | -| `TargetCredentials` | 对象 | 用户名和密码均已设置。 | +`Deployment` 包含部署向导上次对此模型使用的内容。一旦块存在,七个布尔选项始终会被写入,无论它们是 true 还是 false: + +| 属性 | 类型 | 写入时 | +|---|---|---| +| `DeployDataSources` | 布尔值 | 始终 | +| `DeployPartitions` | 布尔值 | 始终 | +| `DeployRefreshPolicyPartitions` | 布尔值 | 始终 | +| `DeployModelRoles` | 布尔值 | 始终 | +| `DeployModelRoleMembers` | 布尔值 | 始终 | +| `DeploySharedExpressions` | 布尔值 | 始终 | +| `DeployLinguisticMetadata` | 布尔值 | 始终 | +| `TargetConnectionString` | 字符串或对象 | 始终,如果未设置,则为 `null`。当连接字符串包含密码时的对象形式。| +| `TargetDatabase` | 字符串 | 始终,如果未设置,则为 `null`。| +| `TargetCredentials` | 对象 | 同时设置了用户名和密码。| ### 刷新覆盖 -`RefreshOverrides` 以配置文件名称为键,且该键是存储该名称的唯一位置。每个配置文件都包含一个 `Overrides` 数组,用于描述该配置文件运行时会更改哪些内容。有关这些配置文件的作用以及如何定义它们,请参阅 @refresh-overrides。 +`RefreshOverrides` 以配置文件名称作为键,该键是存储该名称的唯一位置。每个配置文件都包含一个单独的 `Overrides` 数组,用于描述配置文件在运行时所做的更改。请参阅@refresh-overrides,了解配置文件的作用以及如何定义配置文件。 ```json "RefreshOverrides": { @@ -159,7 +159,7 @@ TMDL 始终使用 `model` 前缀,以延续早于 `database.tmdl` 的版本中 ### 按模型划分的 AI 权限 -`Permissions` 会记录仅适用于该模型的 AI 权限授予;当你在 @ai-assistant 的权限卡片上选择 **允许用于此模型** 时,系统会将其写入其中。 +`Permissions` 记录仅适用于此模型的 AI 权限授予,当您在 @ai-assistant 的权限卡上选择**允许用于此模型**时写入。 ```json "Permissions": { @@ -168,22 +168,22 @@ TMDL 始终使用 `model` 前缀,以延续早于 `database.tmdl` 的版本中 } ``` -`Grants` 会为你已授权的每种资源各保存一条记录:`ModelMetadata`、`ModelData`、`Bpa`、`Documents` 或 `Macros`,每条都设置为 `Deny`、`Read` 或 `Write`。在你打开此模型期间,这些设置会提升该聊天的默认授权级别。 MCP 服务器只会读取全局授权,因此这里的任何内容都不会传到它那里。 +`Grants` 为您已授予的每个资源包含一个条目:`ModelMetadata`、`ModelData`、`Bpa`、`Documents` 或 `Macros`,每个条目均设置为 `Deny`、`Read` 或 `Write`。此模型打开时,这些权限会提升您在聊天中的常驻授权。MCP 服务器仅读取全局授权,因此此处没有任何内容会传到它那里。 ### 凭据的加密方式 -所有敏感信息都会在你自己的用户账户下使用 Windows Data Protection API 进行加密,因此包含加密数据的文件既无法与其他用户共享,也无法移动到另一台计算机上。根据受保护的内容不同,会出现三种形式: +所有敏感信息都会使用您自己的用户帐户下的 Windows 数据保护 API 进行加密,因此包含加密数据的文件无法与其他用户共享或移动到其他计算机。根据所保护的内容,会出现三种形状: -不含密码的连接字符串完全不会加密,会保持为纯 JSON 字符串;因此在实际使用中,`WorkspaceConnection` 会以两种形式出现。 +不包含密码的连接字符串完全不加密,仍是纯 JSON 字符串,这就是为什么在实践中“WorkspaceConnection”以两种形式出现的原因。 -如果某个值无法解密,例如因为文件来自其他用户,则会将该值读取为空,而不是导致加载失败。 +如果值无法解密(例如,因为文件来自其他用户),则该值将被读取为空,而不是导致加载失败。 -## 文件无法读取时 +## 当文件无法读取时 -无论有没有 `.tmuo` 文件,模型都可以打开。 +模型可以带或不带 `.tmuo` 文件打开。 -如果该文件无法反序列化,例如因为手动编辑后成了无效的 JSON,Tabular Editor 会显示一个标题为 _加载用户选项文件 (.tmuo) 时出错_ 的警告,其中包含底层错误信息,然后使用默认选项打开模型。模型本身不会丢失任何内容;丢失的是该文件保存的设置,而下一次保存时会写入一个新的文件。 +如果文件无法反序列化,例如由于文件被手动编辑为无效的 JSON,Tabular Editor 会显示一个标题为*加载用户选项文件时发生错误(.tmuo)*的警告,其中包含底层错误,然后使用默认选项打开模型。模型本身不会丢失任何内容;您会丢失文件所包含的设置,下次保存时会写入新的设置。 ## 后续步骤 -- @Workspace-mode \ No newline at end of file +- @workspace-mode \ No newline at end of file diff --git a/localizedContent/zh/content/security/ai-compliance.md b/localizedContent/zh/content/security/ai-compliance.md index ed9582067..e48044b98 100644 --- a/localizedContent/zh/content/security/ai-compliance.md +++ b/localizedContent/zh/content/security/ai-compliance.md @@ -2,7 +2,7 @@ uid: ai-compliance title: AI 功能合规指南 author: Morten Lønskov -updated: 2026-10-14 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -12,225 +12,225 @@ applies_to: editions: - edition: Desktop partial: true - note: "仅适用于通用策略。不含权限限制、提供程序锁定或审计日志" + note: "General policies only. No permission limits, provider lock or audit log" - edition: Business partial: true - note: "仅适用于通用策略。不含权限限制、提供程序锁定或审计日志" + note: "General policies only. No permission limits, provider lock or audit log" - edition: Enterprise full: true --- # AI 功能合规指南 -Tabular Editor 3 中的 [AI 助手](xref:ai-assistant) 和 [模型上下文协议 (MCP) 服务器](xref:mcp-server) 让 AI 模型能够在权限授予范围内访问打开的语义模型;管理员可通过组策略限制这些权限,企业版还会将相关活动记录到审计日志中。本页面面向负责批准组织使用这些功能的 IT、安全和合规团队。 +Tabular Editor 3 中的[AI 助手](xref:ai-assistant)和[模型上下文协议 (MCP) 服务器](xref:mcp-server)使 AI 模型能够访问开放语义模型,访问权限受管理员通过组策略限制,且企业版会在审计日志中记录相关信息。本页面面向为组织批准这些功能的 IT、安全和合规团队。 ## AI 功能 -| 功能 | 作用 | 调用 AI 提供程序的主体 | 网络流量 | -| ------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------- | ----------------------- | -| AI 助手 | Tabular Editor 3 中的聊天面板,可读取、查询并修改当前打开的语义模型 | 由用户计算机上的 Tabular Editor 3 调用,使用用户输入的 API 密钥 | 出站到已配置的提供程序端点 | -| MCP 服务器 | 一个本地服务器,用户已在运行的 AI 代理,例如 Claude Code、GitHub Copilot、Codex 或 Cursor,可连接到该服务器。随后,该代理会读取、查询并修改当前打开的语义模型 | 由该代理按其自身的配置和订阅调用 | 仅接受来自 `127.0.0.1` 的入站连接 | +| 功能 | 功能作用 | 调用 AI 提供商的实体 | 网络流量 | +| -- | -- | -- | -- | +| AI 助手 | Tabular Editor 3 中的聊天面板,用于读取、查询和更改打开的语义模型 | Tabular Editor 3,从用户计算机发出,使用用户输入的 API 密钥 | 出站至配置的提供商端点 | +| MCP 服务器 | 用户已运行的 AI 代理(例如 Claude Code、GitHub Copilot、Codex 或 Cursor)连接到的本地服务器。然后,代理读取、查询和更改打开的语义模型 | 代理,根据其自身的配置和订阅 | 仅入站到 `127.0.0.1` | -这两项功能都随 AI 功能组件一同提供;自 Tabular Editor 3.27.0 起,该组件已包含在默认安装中。它们共用权限授予、管理员策略和审核日志;差异见[权限授予](#permission-grants)一节所述。 +这两个功能均包含在 AI 功能组件中,该组件是 Tabular Editor 3.27.0 默认安装的一部分。它们共享权限授予、管理员策略和审计日志,差异详见[权限授予](#permission-grants)。 -Tabular Editor ApS 不运营 AI 服务,也不提供 API 密钥。任一功能中的提示、回复、模型元数据和模型数据都不会经过 Tabular Editor 服务器。启用遥测后,Tabular Editor 3 会将 AI 使用事件发送给 Tabular Editor ApS,其中包括提供方、模型名称、会话 ID 和令牌计数。可通过 `DisableTelemetry` 策略将其关闭。 +Tabular Editor ApS 不运营 AI 服务,也不提供 API 密钥。来自任一功能的提示、回复、模型元数据和模型数据绝不会经过 Tabular Editor 服务器。在启用遥测的情况下,Tabular Editor 3 会将 AI 使用事件连同提供商、模型名称、会话 ID 和令牌计数一起发送给 Tabular Editor ApS。对于 MCP 服务器,事件包含工具名称、每次工具调用的结果和持续时间,以及 MCP 客户端的名称和版本(如果是已知客户端)。工具参数、工具结果和错误消息不会被发送。`DisableTelemetry` 策略会将其关闭。 -[Tabular Editor Trust Center](https://trust.tabulareditor.com/) 发布了 AI Assistant 的独立渗透测试 Report、SOC 2 审计 Report 以及子处理者列表。 +[Tabular Editor 信任中心](https://trust.tabulareditor.com/)发布 AI 助手的独立渗透测试报告、SOC 2 审计报告以及分包处理商列表。 ## 数据流 ### AI 助手 -AI Assistant 会将请求直接从用户的计算机发送到在 **工具 > 偏好 > AI 功能 > AI Assistant** 中配置的提供方:OpenAI、Anthropic、Azure OpenAI,或任何兼容 OpenAI 的端点,包括托管在你们自有网络中的模型。仅支持通过 API 密钥进行身份验证。参见[支持的提供方](xref:ai-assistant#supported-providers)。 +AI 助手将请求直接从用户的计算机发送到在**工具 > 首选项 > AI 功能 > AI 助手**下配置的提供商:OpenAI、Anthropic、Azure OpenAI 或任何与 OpenAI 兼容的端点,包括托管在您自己网络上的模型。身份验证仅通过 API 密钥进行。请参阅[支持的提供商](xref:ai-assistant#supported-providers)。 -发送给提供方的请求包含: +向提供商发出的请求包含: -- 当前生效的系统提示和自定义说明,包括你所在组织发布的任何自定义说明 -- 用户的信息和对话历史记录 -- 附加到用户信息中的、有关当前打开模型的上下文:数据库名称、对象数量、当前选定内容、活动文档标题、模型错误以及最近的更改。用户的 **模型元数据** 设置并不会阻止发送这些内容;只有将 `MaxModelMetadataAccess` 限制为 `Deny` 才会阻止 -- 助手在[权限授予](#permission-grants)授权范围内调用工具所得的结果 -- 来自 Tabular Editor 知识库的片段;该知识库是一个基于 Tabular Editor 文档、博客、GitHub 问题和讨论构建的本地数据库 +- 系统提示和当前有效的自定义指令,包括您的组织发布的任何指令 +- 用户的消息和对话历史记录 +- 添加到用户消息中的有关开放模型的上下文:数据库名称、对象计数、当前选择、活动文档的标题、模型错误和最近的更改。用户的**模型元数据**设置不会阻止它;`MaxModelMetadataAccess`限制为`Deny`时会阻止它 +- 助手调用的工具的结果,在[权限授予](#permission-grants)范围内 +- 来自 Tabular Editor 知识库的段落,该知识库是一个由 Tabular Editor 文档、博客、GitHub 问题和讨论构建的本地数据库 -模型元数据涵盖整个模型定义:对象名称、说明和注释、DAX 和 M 表达式、分区源查询、数据源连接详细信息、角色、角色成员以及行级安全性筛选器。直接输入到模型定义中的值,例如 `DATATABLE` 表达式或 **输入数据** 表,也属于元数据的一部分。 +模型元数据涵盖整个模型定义:对象名称、描述和注释、DAX 和 M 表达式、分区源查询、数据源连接详细信息、角色、角色成员和行级安全筛选器。在模型定义中输入的值(例如 `DATATABLE` 表达式或**输入数据**表)是元数据的一部分。 -来自这些来源的文本会成为请求的一部分,并影响助手的操作。仅将你所在组织“自定义说明”文件夹的写入权限授予负责审核并批准其内容的人员。 +来自这些来源的文本将成为请求的一部分,并影响助手的操作。将对组织自定义指令文件夹的写入访问权限限制为仅限批准其内容的人员。 -你所在组织与提供方签订的协议决定了数据保留期限、数据处理所在区域,以及提供方是否会将请求用于模型训练。若要将处理限制在 Azure 租户或你所在组织管理的网络内,请使用 Azure OpenAI、[Microsoft Foundry](xref:ai-assistant#using-microsoft-foundry) 或[自托管模型](xref:ai-assistant#using-a-local-or-organizational-llm),并通过[策略](#restrict-the-ai-provider)锁定该配置。 +贵组织与提供商的协议规定了保留期限、数据处理所在区域以及提供商是否使用请求进行模型训练。要将处理保留在 Azure 租户或贵组织管理的网络中,请使用 Azure OpenAI、[Microsoft Foundry](xref:ai-assistant#using-microsoft-foundry) 或[自托管模型](xref:ai-assistant#using-a-local-or-organizational-llm),并通过[策略](#restrict-the-ai-provider)锁定配置。 ### MCP 服务器 -MCP 服务器是一个绑定到 `127.0.0.1` 的 HTTP 侦听器,默认端口为 42100。它不使用 API 密钥,不发起出站请求,并且会拒绝带有非本地 `Origin` 标头的浏览器请求。 +MCP 服务器是一个 HTTP 侦听器,默认情况下绑定到 `127.0.0.1` 的 42100 端口。它没有 API 密钥,不发出出站请求,并拒绝带有非本地“Origin”标头的浏览器请求。 -已连接的代理会在代理配置及提供程序条款的约束下,将它从 Tabular Editor 3 读取的内容发送到其所使用的提供程序。 Tabular Editor 3 中没有用于设置代理提供程序的选项,因此应通过代理自身的管理控制来管控该代理。代理自身的工具,例如文件访问和 Shell 访问,也同样在 Tabular Editor 3 之外。任何以该用户身份运行的代理都可以读取磁盘上的模型文件、对话文件和审计文件。 +已连接的代理根据代理的配置和提供商的条款,将其从 Tabular Editor 3 读取的内容发送给自己的提供商。Tabular Editor 3 没有针对代理提供商的设置,因此请通过代理自身的管理控制来管理代理。代理自身的工具(例如文件和 shell 访问)也位于 Tabular Editor 3 之外。**模型源详细信息**首选项设置代理随模型名称一起接收的模型文件路径或服务器的多少,并且不会更改模型元数据中的连接详细信息。请参阅[检查是否成功](xref:mcp-server#check-that-it-worked)。以用户身份运行的任何代理都可以读取磁盘上的模型文件、会话文件和审计文件。 -**要求访问令牌** 默认处于关闭状态。关闭时,这台计算机上的任何进程都可以在无需凭据的情况下连接到服务器,包括远程桌面或 Citrix 主机上其他用户会话中的进程。 `RequireMcpAccessToken` 策略会对每个用户强制要求使用令牌。代理注册文件会以纯文本存储该令牌,而在 **工具 > MCP 服务器...** 对话框中选择 **重新生成令牌** 会使所有现有注册失效。参见 [在共享计算机上运行](xref:mcp-server#running-on-a-shared-machine)。 +**需要访问令牌**默认关闭。在禁用此选项时,计算机上的任何进程都可以无需凭据连接到服务器,包括远程桌面或 Citrix 主机上其他用户会话中的进程。`RequireMcpAccessToken` 策略对每位用户强制使用令牌。代理注册文件以纯文本形式存储令牌,**“工具”>“MCP 服务器…”**对话框中的**“重新生成令牌”**将使所有现有注册失效。请参阅[在共享计算机上运行](xref:mcp-server#running-on-a-shared-machine)。 ### 网络端点 -要使用 AI 功能,请在防火墙或代理中放行以下端点: +通过您的防火墙或代理允许这些端点使用 AI 功能: -| 流量 | 端点 | -| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -| AI 助手请求 | 已配置的提供程序端点,例如 `https://api.openai.com`、`https://api.anthropic.com`、某个 Azure OpenAI 资源或你自己的 Gateway | -| AI 模型目录 | `https://api.tabulareditor.com/AiModels`。当用户打开 OpenAI 或 Anthropic 的模型列表时,会发起一次匿名请求以获取模型列表。该列表会缓存 24 小时。 `DisableUpdates` 可将其关闭 | -| AI 知识库更新 | `https://cdn.tabulareditor.com`。在已配置 AI 助手的情况下,最多每天检查一次,不会发送任何有关用户或模型的数据。除了 `DisableAi` 外,没有任何策略会将其关闭。用户在 **工具 > 偏好 > AI 功能 > AI 助手** 下取消选中 **启动时检查知识库更新** | -| MCP 服务器 | 无 | +| 流量 | 终结点 | +| -- | -- | +| AI 助手请求 | 已配置的提供商终结点,例如 `https://api.openai.com`、`https://api.anthropic.com`、Azure OpenAI 资源或您自己的网关 | +| AI 模型目录 | `https://api.tabulareditor.com/AiModels`。当用户打开 OpenAI 或 Anthropic 的模型列表时,发出的模型列表匿名请求。该列表缓存 24 小时。`DisableUpdates` 会将其关闭 | +| AI 知识库更新 | `https://cdn.tabulareditor.com`。在配置 AI 助手时,最多每天检查一次,不包含有关用户或模型的数据。除 `DisableAi` 外,没有策略会将其禁用。用户在**工具 > 首选项 > AI 功能 > AI 助手**下取消选中**启动时检查知识库更新** | +| MCP 服务器 | 无 | -许可证验证、更新检查和遥测分别使用独立的请求。参见 [Web 请求](xref:security-privacy#web-requests)。 +许可证验证、更新检查和遥测使用单独的请求。请参阅[Web 请求](xref:security-privacy#web-requests)。 ### 存储在用户计算机上的数据 -除非另有说明,所有路径都位于 `%LocalAppData%\TabularEditor3` 下。 +除非另有说明,否则所有路径均位于 `%LocalAppData%\TabularEditor3` 下。 -| Item | 地点 | 格式 | -| ---------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -| 提供商 API 密钥 | `Preferences.json` | 已使用适用于当前用户的 Windows 数据保护 API 加密。在未加载 AI 组件或设置了 `DisableAi` 时会被清除 | -| MCP 访问令牌 | `Preferences.json` | 已使用适用于当前用户的 Windows 数据保护 API 加密 | -| 长期权限授予 | `Preferences.json` | JSON | -| 按模型授予的权限 | 模型的[用户选项](xref:user-options)(`.tmuo`)文件:若模型从文件加载,该文件位于模型文件旁;若模型从服务器打开,则位于 `UserOptions` 下 | JSON | -| 对话 | `AI\Conversations` | 未加密的 JSON。保存提示、回复和工具结果;当 **模型数据** 设为 **读取** 时,也包括 DAX 查询行。在每次压缩之前都会写入归档副本。文件会一直保留,直到用户删除该对话 | -| 用户自定义指令 | `AI\CustomInstructions` | Markdown | -| 知识库 | `kb.sqlite` | SQLite 数据库 | -| AI 模型目录 | `AiModels.json` | JSON | -| 审计日志 | `AI\audit`,或 `AiAuditLogPath` 指定的文件夹 | 参见 [审计日志](#audit-log) | +| 项目 | 位置 | 格式 | +| -- | -- | -- | +| 提供商 API 密钥 | `Preferences.json` | 使用当前用户的 Windows 数据保护 API 进行加密。当 AI 组件未加载或已设置 `DisableAi` 时清除 | +| MCP 访问令牌 | `Preferences.json` | 使用当前用户的 Windows 数据保护 API 加密 | +| 永久权限授予 | `Preferences.json` | JSON | +| 按模型授予的权限 | 模型的[用户选项](xref:user-options) (`.tmuo`) 文件:位于从文件加载的模型旁边,或位于从服务器打开的模型的 `UserOptions` 下 | JSON | +| 对话 | `AI\Conversations` | 未加密的 JSON。包含提示、回复和工具结果,包括当**模型数据**处于**读取**状态时的 DAX 查询行和 Analysis Services 错误文本。每次压缩之前都会写入存档副本。文件将保留至用户删除对话时 | +| 用户自定义指令 | `AI\CustomInstructions` | Markdown | +| 知识库 | `kb.sqlite` | SQLite 数据库 | +| AI 模型目录 | `AiModels.json` | JSON | +| 审计日志 | `AI\audit`,或由 `AiAuditLogPath` 设置的文件夹 | 请参阅[审计日志](#audit-log) | ## 权限授予 -权限授予决定 AI 助手和 MCP 服务器可以访问哪些内容,每个资源都有一个访问级别。用户可在 **工具 > 偏好 > AI 功能 > 权限** 中设置各级别。在企业版中,管理员可通过策略为每个资源设置权限上限: +权限授予用于控制 AI 助手和 MCP 服务器的访问范围,每个资源对应一个访问级别。用户在**工具 > 首选项 > AI 功能 > 权限**下设置每个级别。在企业版中,管理员可以通过策略为每个资源设置权限限制: -| 资源 | AI 功能可访问的内容 | 默认值 | 两项功能的限制 | 仅 MCP 服务器的限制 | -| ------- | ------------------------------------------------- | --- | ------------------------ | --------------------------- | -| 模型元数据 | 读取:模型定义和 VertiPaq分析器的统计信息。编写:通过 C# Script 更改模型 | 读取 | `MaxModelMetadataAccess` | `McpMaxModelMetadataAccess` | -| 模型数据 | 读取:DAX 查询结果,即模型中的数据值 | 拒绝 | `MaxModelDataAccess` | `McpMaxModelDataAccess` | -| 最佳实践分析器 | 读取:规则和分析结果。写入:添加和修改规则 | 读取 | `MaxBpaAccess` | `McpMaxBpaAccess` | -| 文档 | 读取:已打开的 C# Script、DAX 查询和 DAX 脚本文档内容。写入:创建并覆盖这些文档 | 写入 | `MaxDocumentsAccess` | `McpMaxDocumentsAccess` | -| 宏 | 读取:用户的宏库,包括宏代码 | 写入 | `MaxMacrosAccess` | `McpMaxMacrosAccess` | +| 资源 | AI 功能的访问范围 | 默认 | 两项功能的限制 | 仅限 MCP 服务器的限制 | +| -- | -- | -- | -- | -- | +| 模型元数据 | 读取:模型定义、VertiPaq分析器统计数据以及模型的错误和警告。服务器错误文本也需要**模型数据 > 读取**。写入:通过 C# 脚本更改模型 | 读取 | `MaxModelMetadataAccess` | `McpMaxModelMetadataAccess` | +| 模型数据 | 读取:DAX 查询结果和 Analysis Services 返回的错误文本,其中可能包含来自模型的数据值 | 拒绝 | `MaxModelDataAccess` | `McpMaxModelDataAccess` | +| Best Practice Analyzer | 读取:规则和分析结果。写入:添加和更改规则 | 读取 | `MaxBpaAccess` | `McpMaxBpaAccess` | +| 文档 | 读取:打开的 C# 脚本、DAX 查询和 DAX 脚本文档的内容,以及打开的文档(包括数据透视网格)的错误和警告。写入:创建和覆盖它们 | 写入 | `MaxDocumentsAccess` | `McpMaxDocumentsAccess` | +| 宏 | 读取:用户的宏库,包括宏代码 | 写入 | `MaxMacrosAccess` | `McpMaxMacrosAccess` | -在默认级别下,AI 功能会读取模型定义、运行 Best Practice Analyzer、读取宏库,并读取和覆盖已打开的脚本与查询文档。它们不会读取数据值,也不会更改模型。宏代码和打开的文档可能包含连接字符串及其他凭据。如果你的组织也需要这样做,请设置 `MaxMacrosAccess` 和 `MaxDocumentsAccess`。 +在默认级别,AI 功能会读取模型定义、运行 Best Practice Analyzer、读取宏库以及读取并覆盖打开的脚本和查询文档。它们不会读取数据值,也不会更改模型。宏代码和已打开的文档可能包含连接字符串和其他凭据。如果您的组织中包含连接字符串和其他凭据,请设置 `MaxMacrosAccess` 和 `MaxDocumentsAccess`。 -AI Assistant 和 MCP 服务器会按如下方式应用这些授权: +AI 助手和 MCP 服务器按以下方式应用授权: -- **AI Assistant。** 当某个请求需要的访问权限超出长期授权的范围时,聊天中会显示一张权限卡片。用户可以选择仅本轮、当前会话或始终允许;对于 **模型元数据** 和 **模型数据**,还可以选择仅对当前模型允许。如果所需访问高于权限上限,则不会显示卡片。 -- **MCP 服务器。** 不会出现提示。服务器启动时会读取长期授权,不在授权范围内的工具不会提供给代理。为单个模型或单个会话授予的授权仅适用于当前聊天。 +- **AI 助手。**当请求需要访问权限而常设授权未涵盖时,聊天中会显示权限卡。用户可以针对此轮、此会话或始终允许访问,对于**模型元数据**和**模型数据**,还可以针对当前模型允许访问。对于超过权限限制的访问,不会显示卡片。 +- **MCP 服务器。**不会出现提示。服务器在启动时会读取常设授权,并且不会向代理提供授权未涵盖的工具。针对一个模型或一个会话授予的权限仅适用于聊天。 -权限上限的优先级高于任何用户授权,包括针对单个模型授予的授权,以及在策略设置之前授予的授权;对应设置只会提供不超过该上限的级别。 `McpMax...` 上限只会降低 MCP 服务器的共享上限。请参阅 [权限和同意](xref:ai-assistant#permissions-and-consent)。 +权限限制的优先级高于每个用户授权,包括针对一个模型授予的授权以及在设置策略之前授予的授权,且匹配的设置仅提供不超过该限制的级别。`McpMax...` 限制只会降低 MCP 服务器的共享限制。请参阅[权限和同意](xref:ai-assistant#permissions-and-consent)。 -## 模型更改的保护措施 +## 模型更改的保障措施 -只有当 **模型元数据** 权限为 **写入** 时,AI 功能才会运行会更改模型的脚本。每项更改都会通过 [C# Script 引擎](xref:csharp-scripts) 在 Tabular Editor 3 中已加载的模型上执行: +只有当**模型元数据**处于**写入**状态时,AI 功能才会运行更改模型的脚本。每次更改都会通过 [C# 脚本引擎](xref:csharp-scripts)针对 Tabular Editor 3 中加载的模型运行: -- 一个脚本产生的所有更改会合并为一条撤销记录,名称为 **C# Script (AI Assistant)** 或 **C# Script (MCP)**。 -- 脚本如果在执行中途失败,其更改会被完全回滚。 -- 只有当用户开启默认处于关闭状态的 **Allow AI assistant to run C# scripts directly** 时,AI Assistant 才会运行脚本。默认情况下,**预览更改** 是开启的,此时预览对话框会显示每次脚本运行产生的更改,你可以选择接受或取消。这两个设置都是用户偏好,且没有可将其锁定的策略。 -- 在聊天中对 AI Assistant 编写的脚本点击 **Execute** 后,它会作为你自己的脚本运行,且不受 **模型元数据** 级别限制。安全检查仍然适用;但对 `ReadFile` 和下文 DAX 辅助方法的限制不适用。 -- MCP 代理的脚本运行时不会显示预览对话框。之后,你可以在 **TOM Explorer** 和 **属性** 视图中查看这些更改;两者都会标出每一项未保存的更改。 -- 在你保存之前,更改会一直以未保存状态保留在已加载的模型中。没有任何 AI 工具会保存或部署模型。用户点击助手回复中的链接后,这些链接可以触发 Tabular Editor 命令,包括 **Save** 和 **Deploy**。如果用户通过与 Analysis Services 或 Power BI Workspace 的实时连接打开模型,保存会将更改写入该服务器。 -- 使用文件系统、网络或外部程序集的脚本不会运行。 AI 助手会为其显示 **Unsafe** 徽章,并禁用 **Execute**。对于 MCP 代理,它会以审阅文档的形式打开;如果 **Documents** 权限低于 **Write**,则会被拒绝。 -- 安全检查会分析已编译的脚本。反射、表达式树、`Activator`、`AppDomain`、XML 读取器和反序列化都被视为不安全。 -- 在由 AI 助手或 MCP 代理运行的脚本中,`ReadFile`、`SaveFile`、`Bpa.ExportCsv`、`ExecuteCommand`、运行宏的调用以及 Semantic Bridge 调用始终会失败。 `ExecuteCommand` 会将 Tabular Model Scripting Language (TMSL) 和 XML for Analysis (XMLA) 命令发送到服务器。 -- 在这些脚本中,DAX 辅助方法与 DAX 查询工具一样,要求 **模型数据** 权限至少为 **读取**。 +- 脚本的更改形成一个撤消条目,名为**C# 脚本(AI 助手)**或**C# 脚本(MCP)**。 +- 执行过程中部分失败的脚本将完全回滚。 +- 仅当用户启用**允许 AI 助手直接运行 C# 脚本**时,AI 助手才会运行脚本,该选项默认关闭。在默认情况下,如果启用**预览更改**,则预览对话框会显示每次运行脚本所产生的更改,用户可以选择接受或取消这些更改。这两个设置都是用户偏好,没有锁定它们的策略。 +- 对 AI 助手在聊天中编写的脚本执行**执行**操作,会在任何**模型元数据**级别将其作为用户自己的脚本运行。安全检查适用;对 `ReadFile` 和以下 DAX 帮助程序方法的限制不适用。 +- MCP 代理的脚本在没有预览对话框的情况下运行。用户随后在**TOM Explorer**和**属性**视图中查看更改,这两个视图会标记所有未保存的更改。 +- 在用户保存之前,更改将一直未保存地保留在已加载的模型中。没有 AI 工具会保存或部署模型。当用户选择助手回复中的链接时,这些链接可以启动 Tabular Editor 命令,包括**保存**和**部署**。如果用户通过与 Analysis Services 或 Power BI 工作区的实时连接打开模型,则保存操作会将更改写入该服务器。 +- 不会运行使用文件系统、网络或外部程序集的脚本。AI 助手会以带有“**不安全**”徽章且“**执行**”被禁用的方式显示该脚本。对于 MCP 代理,它将作为审核文档打开,或者当**文档**位于**写入**下方时被拒绝。 +- 安全检查会分析已编译的脚本。反射、表达式树、`Activator`、`AppDomain`、XML 读取器和反序列化均被视为不安全。 +- 在 AI 助手或 MCP 代理运行的脚本中,`ReadFile`、`SaveFile`、`Bpa.ExportCsv`、`ExecuteCommand`、运行宏的调用以及 Semantic Bridge 调用始终失败。`ExecuteCommand` 将表格模型脚本语言 (TMSL) 和 XML for Analysis (XMLA) 命令发送到服务器。 +- 在相同的脚本中,DAX 帮助程序方法需要**读取**时的**模型数据**,就像 DAX 查询工具一样。 -`BlockUnsafeScripts` 策略会对每个脚本和宏应用相同的安全检查:无论它来自用户、Best Practice Analyzer、AI 助手、MCP 服务器还是 Tabular Editor CLI。 `DisableCSharpScripts` 会禁用 C# Script 文档,并从 AI 助手中移除用于运行脚本的工具,同时从 MCP 服务器中移除两个脚本工具。除非同时设置 `DisableMacros`,否则宏仍会继续运行。参见 [代理如何更改你的模型](xref:mcp-server#how-an-agent-changes-your-model)。 +`BlockUnsafeScripts` 策略对每个脚本和宏应用相同的安全检查:来自用户、Best Practice Analyzer、AI 助手、MCP 服务器或 Tabular Editor CLI。`DisableCSharpScripts` 会禁用 C# 脚本文档,并从 AI 助手移除运行脚本的工具,以及从 MCP 服务器移除两个脚本工具。除非也设置了 `DisableMacros`,否则宏将继续运行。请参阅[代理如何更改您的模型](xref:mcp-server#how-an-agent-changes-your-model)。 ## 管理员控制 -管理员可以通过 Windows 组策略、Tabular Editor 3 附带的管理模板,或直接写入注册表值来强制执行这些控制项。有关注册表项、值类型和模板设置,参见 @policies。 +管理员通过 Windows 组策略、使用 Tabular Editor 3 随附的管理模板或直接写入注册表值来实施控制。请参阅 @policies,了解注册表项、值类型和模板设置。 -`HKEY_LOCAL_MACHINE` 下的策略优先于 `HKEY_CURRENT_USER` 下的相同值。标准用户无法更改这两个 `Software\Policies` 键中的任何一个。 Tabular Editor 3 会在启动时读取策略,MCP 服务器会在启动时读取权限授权,因此,策略更改要等到用户重启 Tabular Editor 3 后才会对当前会话生效。 +`HKEY_LOCAL_MACHINE`下的策略优先于`HKEY_CURRENT_USER`下的同一值。标准用户无法更改任何一个 `Software\Policies` 键。Tabular Editor 3 在启动时读取策略,MCP 服务器在启动时读取权限授予,因此,用户在重新启动 Tabular Editor 3 后,策略更改才会应用于正在运行的会话。 -企业版策略适用于企业版、咨询版和试用版许可证。在桌面版和商业版中,管理员可以关闭 AI 功能、强制使用 MCP 访问令牌、关闭 C# Script 和宏,以及关闭遥测。在下表中,**全部** 表示 Tabular Editor 3 的所有版本。 +企业版策略适用于企业版、咨询版和试用版许可证。在 Desktop 和 Business 版本中,管理员可以禁用 AI 功能、强制使用 MCP 访问令牌、禁用 C# 脚本和宏以及禁用遥测。在下表中,**所有**表示 Tabular Editor 3 的每个版本。 ### 关闭 AI 功能 -| 要求 | 策略 | 版本 | -| ------------------------------- | ------------------ | -- | -| 不提供 AI 功能,新安装不包含 AI 组件,升级时会将其移除 | `DisableAi` | 全部 | -| 禁用 AI 助手,允许使用 MCP 服务器 | `DisableAiChat` | 全部 | -| 禁用 MCP 服务器,允许使用 AI 助手 | `DisableMcpServer` | 全部 | +| 要求 | 策略 | 版本 | +| -- | -- | -- | +| 无 AI 功能,且新安装中不包含 AI 组件,升级时会移除 AI 组件 | `DisableAi` | 所有 | +| 无 AI 助手,允许 MCP 服务器 | `DisableAiChat` | 所有 | +| 无 MCP 服务器,允许使用 AI 助手 | `DisableMcpServer` | 所有 | -`DisableAi` 还会清除所有已保存的提供商配置,包括 API 密钥。如果在设置该策略后,安装程序尚未在某次安装上运行过,则 AI 文件仍会保留在磁盘上,但 Tabular Editor 3 不会加载它们。参见[使用 DisableAi 策略强制执行该决定](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy)。 +`DisableAi` 还会清除所有已存储的提供商配置,包括 API 密钥。对于设置策略后安装程序未在其上运行过的安装,AI 文件将保留在磁盘上,而 Tabular Editor 3 不会加载这些文件。请参阅[使用 DisableAi 策略强制执行决定](xref:installation-activation-basic#enforcing-the-decision-with-the-disableai-policy)。 -Tabular Editor 3 的便携版无需安装。它在运行时会遵循 `DisableAi` 设置。如果用户不得运行旧版本,请使用应用程序控制,例如 AppLocker 或 Windows Defender Application Control。 +Tabular Editor 3 的便携式版本没有安装程序步骤。它在运行时遵循 `DisableAi`。如果用户不得运行旧版本,请使用应用程序控制,例如 AppLocker 或 Windows Defender 应用程序控制。 -### 限制 AI 功能可访问的范围 +### 限制 AI 功能的访问范围 -| 要求 | 策略 | 版本 | -| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------- | --- | -| 为两项功能统一按资源设置限制 | `MaxModelMetadataAccess`, `MaxModelDataAccess`, `MaxBpaAccess`, `MaxDocumentsAccess`, `MaxMacrosAccess` | 企业版 | -| 为 MCP 代理按资源设置更低的限制 | `McpMaxModelMetadataAccess`, `McpMaxModelDataAccess`, `McpMaxBpaAccess`, `McpMaxDocumentsAccess`, `McpMaxMacrosAccess` | 企业版 | -| 不向 MCP 代理开放个别工具 | `McpDisabledTools` | 企业版 | -| 不允许使用 C# Script 文档、AI 脚本工具或宏 | `DisableCSharpScripts` 和 `DisableMacros` | 全部 | -| 仅允许通过安全检查的 C# Script | `BlockUnsafeScripts` | 企业版 | +| 要求 | 策略 | 版本 | +| -- | -- | -- | +| 两项功能每种资源的限制 | `MaxModelMetadataAccess`、`MaxModelDataAccess`、`MaxBpaAccess`、`MaxDocumentsAccess`、`MaxMacrosAccess` | 企业版 | +| MCP 代理的每个资源的下限 | `McpMaxModelMetadataAccess`、`McpMaxModelDataAccess`、`McpMaxBpaAccess`、`McpMaxDocumentsAccess`、`McpMaxMacrosAccess` | 企业版 | +| 不向 MCP 代理提供个别工具 | `McpDisabledTools` | 企业版 | +| 无 C# 脚本文档、AI 脚本工具或宏 | `DisableCSharpScripts` 和 `DisableMacros` | 所有 | +| 仅限通过安全检查的 C# 脚本 | `BlockUnsafeScripts` | Enterprise | -从审计日志中的 `tool_call` 记录获取 `McpDisabledTools` 的工具名称。 +从审计日志中的`tool_call`记录中获取`McpDisabledTools`的工具名称。 ### 限制 AI 提供程序 -| 要求 | 策略 | 版本 | -| ------------------------- | --------------------------------- | --- | -| 一个经批准的提供程序 | `AiProvider` | 企业版 | -| 一个经批准的端点或 Gateway | `AiEndpoint` | 企业版 | -| 一个经批准的模型或 Azure OpenAI 部署 | `AiModel` | 企业版 | -| 向经批准的 OpenAI 组织或项目计费 | `AiOrganizationId`, `AiProjectId` | 企业版 | -| 经批准的提供程序列表 | `AiAllowedProviders` | 企业版 | -| 经批准的端点主机列表 | `AiAllowedEndpointHosts` | 企业版 | +| 要求 | 策略 | 版本 | +| -- | -- | -- | +| 一个已批准的提供商 | `AiProvider` | Enterprise | +| 一个已批准的端点或网关 | `AiEndpoint` | 企业版 | +| 一个已批准的模型或 Azure OpenAI 部署 | `AiModel` | 企业版 | +| 向已批准的 OpenAI 组织或项目收费 | `AiOrganizationId`、`AiProjectId` | 企业版 | +| 已批准的提供商列表 | `AiAllowedProviders` | 企业版 | +| 已批准的端点主机列表 | `AiAllowedEndpointHosts` | 企业版 | -`AiProvider`、`AiEndpoint`、`AiModel`、`AiOrganizationId` 和 `AiProjectId` 会替换用户的设置,而将 `AiProvider` 设置为 `None` 会关闭 AI 助手。如果配置不满足 `AiAllowedProviders` 或 `AiAllowedEndpointHosts`,AI 助手不会发送请求,并且错误消息会指出相关的提供程序或端点主机。 `AiAllowedEndpointHosts` 只检查用户输入的端点,因此 OpenAI 和 Anthropic 若未使用自定义端点,无论列表中写了什么,都会访问其公共 API。将其与 `AiProvider` 或 `AiAllowedProviders` 搭配使用。没有任何策略会强制使用 HTTPS;请将 `AiEndpoint` 锁定为 `https://` 地址。策略不会分发 API 密钥。如果将端点锁定为贵组织拥有的资源(例如 Azure OpenAI 资源或内部 Gateway),则只有贵组织签发的密钥才可使用。如果使用 `api.openai.com` 这样的公共端点,用户可以输入个人密钥。这些策略仅适用于 AI 助手。 +`AiProvider`、`AiEndpoint`、`AiModel`、`AiOrganizationId` 和 `AiProjectId` 替换用户的设置,将 `AiProvider` 设置为 `None` 会关闭 AI 助手。如果配置违反了 `AiAllowedProviders` 或 `AiAllowedEndpointHosts`,AI 助手不会发送请求,并且会显示一个错误,指出提供程序或端点主机的名称。`AiAllowedEndpointHosts` 仅检查用户输入的端点,因此,如果没有自定义端点,无论列表中包含什么,OpenAI 和 Anthropic 都会访问其公共 API。将其与`AiProvider`或`AiAllowedProviders`配对。没有政策要求使用 HTTPS;将 `AiEndpoint` 锁定到 `https://` 地址。策略不会分发 API 密钥。如果终结点锁定到贵组织拥有的资源(例如 Azure OpenAI 资源或内部网关),则只有贵组织颁发的密钥才能使用。使用 `api.openai.com` 等公共端点时,用户可以输入个人密钥。这些策略仅适用于 AI 助手。 ### 自定义指令和 MCP 端口 -| 要求 | 策略 | 版本 | -| ------------------ | ------------------------------- | --- | -| 为每位用户提供组织批准的自定义指令 | `AiCustomInstructionsPath` | 企业版 | -| 忽略用户自行编写的自定义指令 | `DisableUserCustomInstructions` | 企业版 | -| MCP 代理使用访问令牌进行身份验证 | `RequireMcpAccessToken` | 全部 | -| 固定的 MCP 服务器端口 | `McpPort` | 企业版 | +| 要求 | 策略 | 版本 | +| -- | -- | -- | +| 经组织批准的适用于每个用户的自定义指令 | `AiCustomInstructionsPath` | Enterprise | +| 忽略用户自行撰写的自定义指令 | `DisableUserCustomInstructions` | Enterprise | +| MCP 代理使用访问令牌进行身份验证 | `RequireMcpAccessToken` | 所有 | +| 固定 MCP 服务器端口 | `McpPort` | Enterprise | -### 其他版本的 Enterprise 策略 +### 其他版本的企业策略 -如果在许可证非 Enterprise 的计算机上设置了任何 Enterprise 策略值,AI 助手和 MCP 服务器都不会启动;而 `BlockUnsafeScripts` 值会阻止所有脚本和宏运行。如果某个值无法被 Tabular Editor 3 解析,它会在权限限制中拒绝该资源,使 `AiProvider` 下的 AI 助手不可用,并强制启用 `BlockUnsafeScripts`。任何其他无效值都会被忽略,其所控制的设置将保持不受限制。仅向拥有对应许可证的计算机部署 Enterprise 策略。请参阅[未使用企业版时会发生什么](xref:policies#what-happens-without-enterprise-edition)。 +如果许可证不是 Enterprise 的电脑上存在任何 Enterprise 策略值,则 AI 助手和 MCP 服务器不会启动,并且 `BlockUnsafeScripts` 值会阻止所有脚本和宏运行。如果存在 Tabular Editor 3 无法解释的值,则会因权限限制而拒绝资源,导致 AI 助手无法用于 `AiProvider` 并强制执行 `BlockUnsafeScripts`。任何其他无效值都将被忽略,其所控制的设置仍不受限制。仅对具有匹配许可证的计算机推出企业版策略。请参阅[没有企业版会发生什么](xref:policies#what-happens-without-enterprise-edition)。 -要查看某台计算机上适用哪些策略,请打开 **工具 > 偏好 > Tabular Editor > 更新和反馈**。**由组织管理** 部分会列出找到的每个策略值、其源键,以及所有标记为 **(无效)** 的值。 +要查看哪些策略适用于某台计算机,请打开**工具 > 首选项 > Tabular Editor > 更新和反馈**。“由您的组织管理”部分列出了找到的每个策略值、其源键以及所有标记为“(无效)”的值。 ## 审计日志 -在企业版中,Tabular Editor 3 会在本地记录 AI 助手和 MCP 服务器的活动,并每天写入一个 JSON Lines 文件。每条记录都包含 UTC 时间戳、功能(`chat` 或 `mcp`)、对应的会话和当前打开模型的名称,以及 Windows 用户名。在许可证激活之前,不会记录任何内容。 +在企业版中,Tabular Editor 3 每天将 AI 助手和 MCP 服务器活动的本地记录写入一个 JSON Lines 文件。每条记录都包含 UTC 时间戳、功能(`chat` 或 `mcp`)、会话和适用时的打开模型名称,以及 Windows 用户名。在激活许可证之前,不会记录任何内容。 -日志会记录以下内容: +日志记录: -- 权限请求及用户的响应 -- 每次工具调用,包括工具名称、所需权限、结果(`ok`、`error`、`denied` 或 `cancelled`)、持续时间,以及其参数的名称和总大小 -- 每个提交运行的 C# Script(包括运行时失败、被拒绝或退回供审查的脚本)都会连同其 SHA-256 哈希一起保存为 `.csx` 文件 -- 每轮聊天的提供方、模型、端点主机以及 token 数量 +- 权限请求和用户的回答 +- 每次工具调用,包括工具名称、其所需的权限、其结果(`ok`、`error`、`denied`或`cancelled`)、其持续时间以及其参数的名称和总大小 +- 每个发送以供运行的 C# 脚本,包括运行时失败、被拒绝或被退回以供审核的脚本,均保存为带有其 SHA-256 哈希值的 `.csx` 文件 +- 每个聊天回合的提供程序、模型、端点主机和令牌计数 - AI 配置更改 - MCP 服务器的启动和停止,以及每个资源的权限级别 -- MCP 代理连接,以及客户端上报的名称和版本 +- MCP 代理连接,包含客户端报告的名称和版本 -不会记录提示词文本、回复文本、参数值、来自模型的数据值、API 密钥和访问令牌。编译失败的脚本,以及 AI 功能写入文档供用户运行的脚本,都不会保存。 +提示文本、回复文本、参数值、来自模型的数据值、API 密钥和访问令牌均不会被记录。无法编译的脚本以及 AI 功能写入文档供用户运行的脚本不会被保存。 -除非 `AiAuditLogRetentionDays` 设置了其他保留期,否则超过 30 天的文件会被删除;设置为 `0` 则保留所有文件。每个 Tabular Editor 3 实例都会在会话中写入第一条记录前,从其写入的文件夹中删除已过期的文件。 +除非 `AiAuditLogRetentionDays` 设置了其他期限,否则超过 30 天的文件将被删除,而 `0` 表示保留所有文件。每个 Tabular Editor 3 副本都会在其会话中写入第一条记录之前,从其写入的文件夹中删除过期的文件。 -日志由用户自己的 Tabular Editor 3 进程写入,因此用户对其具有写入和删除权限,即使日志被重定向到共享位置也是如此。如果日志无法写入,例如因为共享不可访问,AI 助手和 MCP 服务器会继续运行,并且该故障只会在 Tabular Editor 的应用程序日志中记录一次。 +日志由用户自己的 Tabular Editor 3 进程写入,因此用户对其具有写入和删除权限,包括在重定向的共享上。如果无法写入日志,例如由于共享不可访问,AI 助手和 MCP 服务器将继续运行,并且故障将写入 Tabular Editor 的应用程序日志一次。 -`AiAuditLogPath` 用于重定向日志。相对路径会被忽略。每日文件名和脚本文件名都不包含用户名或计算机名,因此要为每个用户提供单独的文件夹。诸如 `%USERNAME%` 之类的环境变量只会在 `REG_EXPAND_SZ` 值中展开;管理模板写入的是 `REG_SZ`,因此会按原样使用。 +`AiAuditLogPath` 会重定向日志。相对路径将被忽略。每日文件名和脚本文件名不包含用户或计算机名称,因此请为每位用户提供一个单独的文件夹。`%USERNAME%` 等环境变量仅在 `REG_EXPAND_SZ` 值中展开;管理模板写入 `REG_SZ`,该值按写入内容使用。 -记录格式请参见 @ai-audit-log。 +有关记录格式,请参阅 @ai-audit-log。 -## 推荐基线 +## 建议的基准 -以下基线为允许 AI 辅助模型开发、同时不让模型数据流向 AI 提供方的组织提供指导。请根据自身风险评估进行调整。 +以下基线是针对允许进行 AI 辅助模型开发且不将模型数据提供给 AI 提供商的组织的指导。请根据您自己的风险评估进行调整。 -| 控制项 | 设置 | 效果 | -| -------- | -------------------------------------------------------------------------------------- | -------------------------------- | -| Provider | 将 `AiProvider`、`AiEndpoint`、`AiModel` 和 `AiAllowedEndpointHosts` 设置为你组织拥有且已签订数据处理协议的资源 | AI 助手仅向该端点发送请求,并使用由你组织签发的密钥 | -| 模型数据 | 将 `MaxModelDataAccess` 设置为 `Deny` | 任何 DAX 查询结果都不会发送到 AI 助手或 MCP 代理 | -| 宏 | 将 `MaxMacrosAccess` 设置为 `Deny` | 宏代码不会发送给 AI 提供方 | -| 脚本 | 将 `BlockUnsafeScripts` 设置为 `1` | 任何脚本或宏都不能写入文件、访问网络、启动其他程序或加载外部代码 | -| MCP 身份验证 | 将 `RequireMcpAccessToken` 设置为 `1` | 只有持有用户访问令牌的客户端才能连接到 MCP 服务器 | -| 审计保留期 | 将 `AiAuditLogRetentionDays` 设置为满足你保留要求的期限 | 审计文件会在该期限内保留 | -| 审计存储位置 | 为每位用户将 `AiAuditLogPath` 设置为共享位置上的某个文件夹 | 审计文件会集中收集 | +| 控制项 | 设置 | 效果 | +| -- | -- | -- | +| 提供商 | `AiProvider`、`AiEndpoint`、`AiModel` 和 `AiAllowedEndpointHosts` 设置为您的组织拥有并签订了数据处理协议的资源 | AI 助手仅向该端点发送请求,并使用您的组织颁发的密钥 | +| 模型数据 | `MaxModelDataAccess` 设置为 `Deny` | 没有 DAX 查询结果或 Analysis Services 错误文本传送到 AI 助手或 MCP 代理 | +| 宏 | `MaxMacrosAccess` 设置为 `Deny` | 宏代码不会发送到 AI 提供商 | +| 脚本 | `BlockUnsafeScripts` 设置为 `1` | 任何脚本或宏都不能写入文件、访问网络、启动其他程序或加载外部代码 | +| MCP 身份验证 | `RequireMcpAccessToken` 设置为 `1` | 只有具有用户访问令牌的客户端才能连接到 MCP 服务器 | +| 审计保留 | `AiAuditLogRetentionDays` 设置为您的保留要求 | 审计文件保留该期限 | +| 审计位置 | `AiAuditLogPath` 为每位用户设置为共享上的文件夹 | 审计文件集中收集 | -以下注册表文件会应用基线中适用于整台计算机的部分。它会将 AI Assistant 锁定到一个 Azure OpenAI 资源,并将审计文件保留 365 天。将终结点和部署名称替换为你自己的,并且仅将该文件应用于已获得企业版许可的计算机: +以下注册表文件应用基线的全机范围部分。它将 AI 助手锁定到 Azure OpenAI 资源,并保留审计文件 365 天。将端点和部署名称替换为您自己的名称,并将该文件仅应用于已获得企业版许可证的计算机: ```ini Windows Registry Editor Version 5.00 @@ -249,45 +249,45 @@ Windows Registry Editor Version 5.00 "AiAuditLogRetentionDays"=dword:0000016d ``` -`BlockUnsafeScripts` 位于共享注册表项中,因此 Tabular Editor CLI 也会强制执行它。将 `AiAuditLogPath` 设置为每个用户对应的一个文件夹:可以是在 `HKEY_LOCAL_MACHINE` 项下设置 `REG_EXPAND_SZ` 值,例如 `\\fileserver\te-audit$\%USERNAME%`,也可以是在 `HKEY_CURRENT_USER\SOFTWARE\Policies\Tabular Editor ApS\TE3` 下为每个用户设置 `REG_SZ` 值。 +`BlockUnsafeScripts` 位于共享键中,因此 Tabular Editor CLI 也会强制执行该设置。将 `AiAuditLogPath` 设置为每个用户的文件夹:可以是 `HKEY_LOCAL_MACHINE` 项下的 `REG_EXPAND_SZ` 值(例如 `\\fileserver\te-audit$\%USERNAME%`),也可以是 `HKEY_CURRENT_USER\SOFTWARE\Policies\Tabular Editor ApS\TE3` 下的每个用户的 `REG_SZ` 值。 ## 常见问题 -### Tabular Editor ApS 会接收我们的提示词、元数据或数据吗? +### Tabular Editor ApS 是否会收到我们的提示、元数据或数据? -不能。参见 [数据流](#data-flow)。 +不会。请参阅[数据流](#data-flow)。 -### 我们的数据会被用于训练 AI 模型吗? +### 我们的数据是否被用于训练 AI 模型? -Tabular Editor ApS 不会接收任何提示词、回复或模型内容。你与 AI 提供程序签订的协议决定该提供程序是否会使用请求来训练模型。 +Tabular Editor ApS 不会收到任何提示、回复或模型内容。您与 AI 提供商的协议决定了提供商是否根据请求进行训练。 ### 我们的数据在哪里处理? -数据会在 AI Assistant 配置的终结点处理,也可能在 MCP 代理提供程序运行的任何位置处理。参见 [限制 AI 提供程序](#restrict-the-ai-provider)。 +在 AI 助手的配置端点以及 MCP 代理的提供商运行的任何位置。请参阅[限制 AI 提供商](#restrict-the-ai-provider)。 -### 用户能绕过策略吗? +### 用户可以绕过策略吗? -没有本地管理员权限,用户无法更改策略。 3.27.0 之前的版本(包括较旧的便携版构建)只会读取 `HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor`,并忽略此页面上的所有策略。参见 [关闭 AI 功能](#turn-the-ai-features-off)。 +用户如果没有本地管理员权限,就无法更改策略。3.27.0 之前的版本(包括较旧的便携式版本)仅读取 `HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor`,并忽略此页面上的所有策略。请参阅[关闭 AI 功能](#turn-the-ai-features-off)。 -### AI 功能能更改或部署生产模型吗? +### AI 功能可以更改或部署生产模型吗? -只有在 **Model metadata** 设为 **Write** 时,它们才会在已加载的模型上运行脚本;并且只有用户才能进行保存或部署。参见 [模型更改的保护措施](#safeguards-on-model-changes)。 +它们仅在**模型元数据**为**写入**时才在已加载的模型上运行脚本,并且仅由用户保存或部署。请参阅[模型更改的保障措施](#safeguards-on-model-changes)。 -### AI 功能能从我们的模型中读取数据吗? +### AI 功能可以读取我们模型中的数据吗? -DAX 查询结果需要 **模型数据** 权限为 **读取**,默认是 **拒绝**。在模型定义中键入的值属于元数据的一部分。见 [数据流](#data-flow)。 +DAX 查询结果和 Analysis Services 错误的文本需要**读取**权限下的**模型数据**,默认值为**拒绝**。在**读取**下方,来自服务器的错误文本被替换为固定句子。在模型定义中输入的值是元数据的一部分。请参阅[数据流](#data-flow)。 -### MCP 代理是否可以使用我们尚未批准的提供程序? +### MCP 代理是否可以使用我们未批准的提供商? -是的。可以通过代理自身的管理设置来控制它,或者设置 `DisableMcpServer`。见 [MCP 服务器](#mcp-server)。 +可以。通过代理自身的管理控制来管理代理,或者设置 `DisableMcpServer`。请参阅[MCP 服务器](#mcp-server)。 -### 发生事件时,如何停用 AI 功能? +### 如何在事件中停止 AI 功能? -设置 `DisableAi`,并让用户重启 Tabular Editor 3。在提供程序端撤销受影响的 API 密钥。见 [关闭 AI 功能](#turn-the-ai-features-off)。 +设置 `DisableAi` 并让用户重启 Tabular Editor 3。在提供商处撤销受影响的 API 密钥。请参阅[关闭 AI 功能](#turn-the-ai-features-off)。 -### 审核日志是否可检测篡改? +### 审计日志是否具有防篡改性? -不能。用户可以修改或删除自己的审核文件。见 [审核日志](#audit-log)。 +不可以。用户可以更改和删除自己的审计文件。请参阅[审计日志](#audit-log)。 ## 另请参阅 diff --git a/localizedContent/zh/content/security/security-privacy.md b/localizedContent/zh/content/security/security-privacy.md index 90e687d1d..3f50fca15 100644 --- a/localizedContent/zh/content/security/security-privacy.md +++ b/localizedContent/zh/content/security/security-privacy.md @@ -1,8 +1,8 @@ --- uid: security-privacy -title: 安全概述 +title: 安全概览 author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-23 applies_to: products: - product: Tabular Editor 2 @@ -16,138 +16,137 @@ applies_to: - edition: Enterprise full: true --- +# Tabular Editor 3 安全与隐私 -# Tabular Editor 3 的安全与隐私 - -本文档介绍 Tabular Editor 3 及其使用中的安全与隐私注意事项。下文中,“Tabular Editor”一词既可指商业工具 Tabular Editor 3,也可指开源工具 Tabular Editor 2.X。每当内容仅涉及其中一个工具时,我们会明确使用其名称“Tabular Editor 3”或“Tabular Editor 2.X”。 +本文档介绍了 Tabular Editor 3 及其使用的安全和隐私注意事项。在下文中,“Tabular Editor”一词既可以指商业工具 Tabular Editor 3,也可以指开源工具 Tabular Editor 2.X。每当仅涉及其中一个工具时,我们将使用其明确的名称“Tabular Editor 3”或“Tabular Editor 2.X”。 ## Microsoft 关于 Tabular Editor 等第三方工具的建议 -Microsoft 在此处说明其支持使用社区第三方工具:[用于开发企业级 Power BI 和 Analysis Services 模型的社区和第三方工具](https://powerbi.microsoft.com/en-us/blog/community-tools-for-enterprise-powerbi-and-analysisservices) +Microsoft 支持使用社区第三方工具,具体说明请参阅此处:[用于开发企业级 Power BI 和 Analysis Services 模型的社区和第三方工具]( https://powerbi.microsoft.com/en-us/blog/community-tools-for-enterprise-powerbi-and-analysisservices) -Microsoft的 Power BI 实施规划文档在高级数据建模场景与企业级开发中明确提及 Tabular Editor:[Power BI 使用场景:高级 Data model 管理](https://learn.microsoft.com/power-bi/guidance/powerbi-implementation-planning-usage-scenario-advanced-data-model-management#tabular-editor) +Microsoft 的 Power BI 实施规划文档特别将 Tabular Editor 纳入高级数据建模场景和企业开发中:[Power BI 使用场景:高级数据模型管理](https://learn.microsoft.com/power-bi/guidance/powerbi-implementation-planning-usage-scenario-advanced-data-model-management#tabular-editor) ## 信任中心 +在 Tabular Editor,我们致力于实现透明度和强大的安全实践。请访问我们的[信任中心](https://trust.tabulareditor.com/),了解有关我们的 SOC 2 审计报告、关键政策文件、许可条款以及我们对基础设施和组织安全的做法的详细信息。您还将找到有关我们的分处理商以及我们如何努力保护您的数据安全的信息。 -在 Tabular Editor,我们始终坚持透明原则,并践行严格的安全实践。访问我们的[信任中心](https://trust.tabulareditor.com/),查看 SOC 2 审计 Report、关键政策文件、许可条款,以及我们在基础设施和组织安全方面的做法。您还可以找到有关我们子处理方的信息,以及我们如何确保您的数据安全。 - -## 元数据与数据隐私 +## 元数据和数据隐私 -Tabular Editor 主要是一款离线工具,这意味着所有数据和元数据都保存在安装了 Tabular Editor 的本机上,所有用户交互也都在本地完成。运行和使用 Tabular Editor 无需互联网连接。 +Tabular Editor 主要是一款离线工具,这意味着所有数据和元数据都存储在安装了 Tabular Editor 的客户端计算机的本地,所有用户交互也都在本地进行。运行和使用 Tabular Editor 不需要互联网连接。 -不过,在某些场景下,Tabular Editor 会出于不同目的连接到远程服务。具体如下: +尽管如此,在某些情况下,Tabular Editor 会出于各种目的连接到远程服务。这些情况在下文中有详细说明: ### Analysis Services XMLA 协议 -与 Analysis Services 实例或 Power BI Premium Workspace 的所有通信都通过 [Microsoft Analysis Management Objects (AMO)](https://docs.microsoft.com/analysis-services/amo/developing-with-analysis-management-objects-amo?view=asallproducts-allversions) 客户端库完成;更具体地说,是通过 [用于 AMO 的 Tabular Object Model (TOM) 扩展](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions)。这些客户端库由 Microsoft 提供,可在 Tabular Editor 等第三方应用程序中再分发。有关许可的详细信息,见 [AMO EULA](https://go.microsoft.com/fwlink/?linkid=852989)。 +与 Analysis Services 实例或 Power BI Premium 工作区的所有通信均通过使用 [Microsoft Analysis Management Objects (AMO)](https://docs.microsoft.com/analysis-services/amo/developing-with-analysis-management-objects-amo?view=asallproducts-allversions) 客户端库,更具体地说,通过使用 [AMO 的 Tabular Object Model (TOM) 扩展](https://docs.microsoft.com/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions)进行。这些客户端库由 Microsoft 提供,用于在 Tabular Editor 等第三方应用程序中进行再分发。有关许可的详细信息,请参阅[AMO EULA](https://go.microsoft.com/fwlink/?linkid=852989)。 -当 Tabular Editor 连接到 Analysis Services 实例(本地网络或云端)或 Power BI Premium Workspace(云端)时,会通过上述客户端库建立连接。按照设计,AMO 库负责处理用户的身份验证和授权。只有在 Analysis Services 实例或 Power BI Premium Workspace 中具有管理员权限的用户才能连接。这与使用 SQL Server Management Studio 或 SQL Server Data Tools 等 Microsoft 工具并无不同(它们使用相同的客户端库进行连接)。 +当 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 Dataset 的完整 Tabular Object Model(TOM)元数据。然后,AMO/TOM 客户端库会以编程方式将这些元数据提供给客户端应用程序(Tabular Editor),使应用程序能够应用元数据更改,例如重命名对象、添加说明、修改 DAX 表达式等。此外,AMO/TOM 客户端库还提供了将 TOM 元数据序列化为基于 JSON 的格式的方法。 Tabular Editor 使用此技术让用户可以将模型元数据保存为本地 JSON 文件,用于对 Data model 结构进行版本控制。\*\*注意:以这种方式生成的 JSON 文件不包含任何实际数据记录。该文件仅包含模型元数据,即有关模型结构的信息,包括表、列、度量值、DAX 表达式等。\*\*虽然模型元数据通常不被视为机密信息,但使用 Tabular Editor 的用户仍有责任按所需的保密要求处理以这种方式生成的任何文件(即不与第三方共享此类文件等)。 +AMO/TOM 客户端库建立连接后,Tabular Editor 将请求用户希望连接到的特定 Analysis Services 数据库或 Power BI 数据集的完整 Tabular Object Model (TOM) 元数据。然后,AMO/TOM 客户端库以编程方式将这些元数据提供给客户端应用程序(Tabular Editor),使应用程序能够应用元数据更改,例如重命名对象、添加描述、修改 DAX 表达式等。此外,AMO/TOM 客户端库还提供了将 TOM 元数据序列化为基于 JSON 的格式的方法。Tabular Editor 使用此技术允许用户将模型元数据保存为本地 JSON 文件,以便对数据模型结构进行版本控制。**注意:以这种方式生成的 JSON 文件不包含实际数据记录。该文件仅包含模型元数据,即有关模型结构的表、列、度量值、DAX 表达式等信息。**虽然模型元数据通常不被视为机密信息,但 Tabular Editor 用户有责任以必要的保密方式处理以这种方式生成的任何文件(即不与第三方共享文件等)。 -**除非用户明确发起相关操作,否则 Tabular Editor 不会收集、发布、共享、传输或以其他方式公开通过 AMO/TOM 客户端库获取的任何模型元数据**(例如,将模型元数据 JSON 文件保存到共享网络位置,或将模型元数据部署到另一个 Analysis Services 实例或 Power BI Workspace)。 +**除非用户明确发起相关操作,否则 Tabular Editor 不会收集、发布、共享、传输或以其他方式公开通过 AMO/TOM 客户端库获得的任何模型元数据**(例如,将模型元数据 JSON 文件保存到共享网络位置,或将模型元数据部署到另一个 Analysis Services 实例或 Power BI 工作区)。 ### 模型数据内容 -下文中,“模型数据”指存储在 Analysis Services 数据库或 Power BI Dataset 中的实际数据记录。根据源数据库或 Dataset 的不同,模型数据很可能属于机密信息。 +在下文中,“模型数据”是指存储在 Analysis Services 数据库或 Power BI 数据集中的实际数据记录。根据源数据库或数据集的不同,模型数据很可能属于机密。 -由于用户必须在要连接的 Analysis Services 实例或 Power BI Workspace 中具有管理员权限,因此从定义上说,用户也能访问 Analysis Services 数据库或 Power BI Dataset 中的全部数据内容。 Tabular Editor 仅允许通过上述 AMO 客户端库检索数据。 Tabular Editor 3 提供了浏览和查询模型数据的功能。无论使用哪种技术访问数据,**Tabular Editor 都只会将检索到的数据存储在本地内存中。 Tabular Editor 不会收集、发布、共享、传输或以其他方式公开通过该工具获取的任何模型数据**。如果用户选择复制或导出通过 Tabular Editor 获取的查询结果,则有责任根据数据的保密级别妥善处理所复制或导出的数据。这与用户使用 Excel 或 Power BI 等客户端工具连接到 Analysis Services 数据库或 Power BI Dataset 并无不同;在这种情况下,用户同样可以选择复制查询结果。 +由于要求用户在其连接到的 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 数据集没有区别,在这种情况下,他们也将有权选择复制查询结果。 ### AI 助手 -Tabular Editor 3 内置 AI 助手,用于基于聊天的语义模型开发。从 3.27.0 起,它已成为默认安装的一部分;在此之前,需要手动选择安装。如果未安装该组件,计算机上就不会存在任何与 AI 相关的代码,本节所述的行为也都不适用。 +Tabular Editor 3 包含一个用于基于聊天的语义模型开发的 AI 助手。从 3.27.0 版本开始,它是默认安装的一部分;在此之前,必须有意识地选择它。如果未安装该组件,则计算机上不存在任何与 AI 相关的代码,本节中描述的任何行为均不适用。 -AI 助手采用 **自备密钥** 模式。您需要提供来自受支持的 AI 提供商的 API 密钥(OpenAI、Anthropic、Azure OpenAI 或任何与 OpenAI 兼容的端点)。不包含内置 API 密钥,Tabular Editor 也不提供或中转任何 AI 服务。 +AI 助手使用**自带密钥**模型。您需要提供来自受支持的 AI 提供商(OpenAI、Anthropic、Azure OpenAI 或任何 OpenAI 兼容端点)的 API 密钥。不包含内置API密钥,Tabular Editor不提供或中介任何AI服务。 -**数据流。** AI 助手与 AI 提供商之间的所有通信都在客户端计算机与提供商 API 之间直接进行。不会有任何数据经过 Tabular Editor 的服务器。发送哪些内容取决于您的请求,并受五类权限资源的限制;每类资源对应一个访问级别: +**数据流。** AI 助手与 AI 提供商之间的所有通信均直接从客户端计算机到提供商 API 进行。没有数据通过 Tabular Editor 服务器。发送的内容取决于您的请求,并受五种权限资源的约束,每种资源具有一个访问级别: -| 资源 | 涵盖内容 | 级别 | 默认值 | -| ------- | -------------------------------------------------------------- | ------------ | --- | -| 模型元数据 | 表、列和度量值名称、表达式、说明等。“读取”还包括 VertiPaq分析器统计信息 | 拒绝 / 读取 / 写入 | 读取 | -| 模型数据 | 模型中的数据值,例如 DAX 查询结果。需要实时连接 | 拒绝 / 读取 | 拒绝 | -| 最佳实践分析器 | “读取”用于列出规则并运行分析;“写入”用于添加或修改规则 | 拒绝 / 读取 / 写入 | 读取 | -| 文档 | 你当前打开的 C# Script 脚本编辑器和 DAX 查询编辑器。“读取”用于查看其内容;要创建或修改它们,则需要“写入” | 拒绝 / 读取 / 写入 | 写入 | -| 宏 | 你的宏库 | 拒绝 / 读取 / 写入 | 写入 | +| 资源 | 涵盖内容 | 级别 | 默认 | +| -- | -- | -- | -- | +| 模型元数据 | 表、列和度量值名称、表达式、描述等。“读”还包括 VertiPaq 分析器统计数据以及模型的错误和警告消息 | 拒绝/读/写 | 读 | +| 模型数据 | 来自您模型的数据值,例如 DAX 查询结果,以及 Analysis Services 返回的错误文本(可能包含数据值)。DAX 查询需要实时连接 | 拒绝/读取 | 拒绝 | +| Best Practice Analyzer | “读”可读取规则列表并运行分析;“写”可添加或修改规则 | 拒绝/读/写 | 读 | +| 文档 | 您打开的文档:DAX 查询、C# 脚本、DAX 脚本和 Pivot Grid。“读”是指其内容及其错误和警告;“写”是指需要创建或修改它们。Pivot Grid 布局无法读取或修改 | 拒绝/读取/写入 | 写入 | +| 宏 | 您的宏库 | 拒绝/读/写 | 写 | -写入权限包含读取权限。默认拒绝访问模型数据,因为元数据描述的是模型本身,而数据值才是模型的内容。 +“写”包含“读”。默认情况下,模型数据被拒绝,因为元数据描述的是一个数据值构成模型内容的模型。 -**权限管理。** 这些授权是持续生效的设置,而不是按每次请求弹出的提示。你可以在 **工具 > 偏好 > AI 功能 > 权限** 中查看和更改这些设置,也可以在 **工具 > MCP 服务器...** 对话框中进行编辑;两处修改的是同一项设置。当聊天需要的权限超出当前授权范围时,会在当时显示权限卡片,你可以选择仅对本轮、本次会话、当前模型或始终允许。**始终允许** 会提高持续授权级别,但不会降低已有授权。全局授权存储在本地 Preferences.json 偏好文件中;针对单个模型授予的授权存储在该模型的用户选项 (.tmuo) 文件中,并且仅对该聊天生效。将某个资源重新设为 **拒绝** 后,聊天会再次询问。 +**权限管理。**授权是永久性设置,而不是针对每次请求的提示。请在**工具 > 首选项 > AI 功能 > 权限**下或在**工具 > MCP 服务器……**对话框中查看并更改这些权限,这两个位置编辑的是同一条记录。如果聊天需要某项权限,而授权未涵盖该权限,则此时会显示权限卡,您可以针对该轮、该会话、当前模型或始终做出回答。**始终允许**会提升常设授权,且绝不会降低授权。全局授权存储在本地 Preferences.json 文件中;针对单个模型授予的授权存储在该模型的用户选项 (.tmuo) 文件中,仅适用于聊天。将资源设置回**拒绝**会导致聊天再次询问。 -**管理员上限。** 在企业版、咨询版和试用版中,管理员可以通过 [策略](xref:policies) 为每项资源分别设置上限,并分别应用于聊天和 MCP 服务器;MCP 的上限只能更低。上限优先于任何授权,包括用户已经给出的授权,并且对应选项会显示为只读。这些策略采用默认拒绝机制:如果某台机器上存在任何企业级策略值,但该机器并未获得相应许可,AI 助手和 MCP 服务器将拒绝启动,而不是忽略该策略。 +**管理员上限。**在 Enterprise、Consultancy 和 Trial 版本中,管理员可以通过[策略](xref:policies)为每项资源设置上限,分别针对聊天和 MCP 服务器,且 MCP 的上限只能更低。上限优先于所有授权,包括用户已经授予的授权,并且相应选项显示为只读。这些策略采用“故障关闭”机制:如果在未获得相应许可证的计算机上存在任何企业级策略值,AI 助手和 MCP 服务器将拒绝启动,而非忽略该策略。 -**审计记录。** Tabular Editor 3 会在本地记录 AI Assistant 和 MCP 服务器执行过的操作:请求了哪些权限以及这些请求如何得到回应;调用了哪些工具,以及每个工具是成功、失败还是被拒绝;以及 AI Assistant 或代理运行或提交运行的任何 C# Script 的完整文本,包括在运行时失败或被拒绝的脚本。提示词、回复和数据值不会被记录;编译失败的脚本,以及写入文档供你运行的脚本文本,也不会被记录。每日文件会保留 30 天,在 **工具 > 偏好 > AI 功能** 下选择 **打开审计文件夹** 可打开它们所在的文件夹。管理员可以重定向存储位置并更改保留期限。 +**审计记录。** Tabular Editor 3 会记录 AI 助手和 MCP 服务器的操作的本地记录:请求了哪些权限以及如何回应这些请求,运行了哪些工具以及每个工具是成功、失败还是被拒绝,以及 AI 助手或代理运行或提交运行的任何 C# 脚本的完整文本,包括运行时失败或被拒绝的脚本。提示、回复和数据值均不会被记录,无法编译的脚本或写入文档供用户运行的脚本文本也不会被记录。每日文件保留 30 天,可通过 **工具 > 首选项 > AI 功能** 下的 **打开审计文件夹** 打开这些文件。管理员可以重定向位置并更改保留期。 -**API 密钥存储。** API 密钥会以加密方式存储在本地计算机的偏好文件 Preferences.json 中。如果 AI 模块未加载(例如在安装期间被排除,或因策略而被禁用),之前存储的 API 密钥配置会自动清除。 +**API 密钥存储。** API 密钥以加密形式存储在本地计算机的 Preferences.json 文件中。如果未加载 AI 模块(例如,因为在安装过程中被排除或因策略而被禁用),则之前存储的任何 API 密钥配置都会自动清除。 -**对话存储。** 对话会存储在客户端本地的 `%LocalAppData%\TabularEditor3\AI\Conversations\` 中。不会将任何对话数据发送到 Tabular Editor 服务器。 +**会话存储。**会话存储在客户端计算机的 `%LocalAppData%\TabularEditor3\AI\Conversations\` 中。不会将任何对话数据发送到 Tabular Editor 服务器。 -**禁用 AI 助手。** 你可以在安装时排除 AI 功能组件,在 **工具 > 偏好 > AI 功能 > AI 助手** 下清除提供程序,或通过 Windows 注册表强制实施 [策略](xref:policies):`DisableAi` 会关闭包括 MCP 服务器在内的所有 AI 功能,并清除已存储的提供程序配置;`DisableAiChat` 则只关闭聊天功能,并让 MCP 服务器继续运行。 +**禁用 AI 助手。**您可以在安装过程中排除 AI 功能组件,在**工具 > 首选项 > AI 功能 > AI 助手**下清除提供商,或通过 Windows 注册表强制执行[策略](xref:policies) :`DisableAi` 会关闭包括 MCP 服务器在内的所有 AI 功能,并清除已存储的提供商配置,而 `DisableAiChat` 仅关闭聊天功能,并使 MCP 服务器继续运行。 -**渗透测试。** 已对 AI 助手进行了单独的渗透测试。该 Report 可在我们的 [信任中心](https://trust.tabulareditor.com/) 查看。 +**渗透测试。**已对 AI 助手进行了单独的渗透测试。该报告可在我们的[信任中心](https://trust.tabulareditor.com/)查阅。 ### MCP 服务器 -Tabular Editor 3 可以充当 MCP(Model Context Protocol)服务器,使在同一台计算机上运行的 AI 代理能够处理你当前打开的模型。关于该功能本身,可参见 @mcp-server。 +Tabular Editor 3 可以充当 MCP(模型上下文协议)服务器,以便在同一台计算机上运行的 AI 代理可以在您打开的模型上工作。有关该功能本身的信息,请参阅 @mcp-server。 -**网络暴露。** 该服务器是一个显式绑定到 `127.0.0.1` 的 HTTP 侦听器,默认使用端口 42100。无法从另一台计算机访问它。为防范 DNS 重绑定,浏览器发出的、携带非本地 `Origin` 标头的请求会被拒绝。该服务器仅在你启动后才会运行;如果你选择随应用启动,也可以在应用启动时自动运行。 +**网络暴露。**该服务器是一个 HTTP 侦听器,显式绑定到 `127.0.0.1`,默认情况下使用端口 42100。无法从其他计算机访问。为防范 DNS 重新绑定,系统会拒绝携带非本地“Origin”标头的浏览器请求。服务器仅在您启动它后才会运行,或者如果您有此要求,则会在应用程序启动时运行。 -**身份验证。** 回环绑定是默认的安全边界,因此服务器默认会在无需凭据的情况下接受本地连接。但在一个同时有多名用户登录的主机上(例如远程桌面或 Citrix 服务器),这还不够:该机器上的任何会话都可以访问 `127.0.0.1`。未启用访问令牌时,该机器上的任何进程都可以在无凭据的情况下连接。在 **工具 > 偏好 > AI 功能 > MCP 服务器** 下启用 **要求访问令牌**,客户端就必须提供 Bearer 令牌;该令牌会以加密形式存储在本地的 Preferences.json 文件中。管理员可以通过 `RequireMcpAccessToken` [策略](xref:policies) 强制实施此要求。 +**身份验证。**环回绑定是默认边界,因此服务器开箱即用即可接受无需凭据的本地连接。在多个人同时登录的主机上(例如远程桌面或 Citrix 服务器),这并不够:该机器上的任何会话都可以访问 `127.0.0.1`。在令牌关闭时,计算机上的任何进程都可以在没有凭据的情况下进行连接。在**工具 > 首选项 > AI 功能 > MCP 服务器**下启用**需要访问令牌**,客户端必须出示持有者令牌,该令牌以加密形式存储在本地 Preferences.json 文件中。管理员可以使用 `RequireMcpAccessToken` [策略](xref:policies)强制执行此操作。 -**数据流。** Tabular Editor 不会为此功能联系任何 AI 提供程序,也不会为其保存任何 API 密钥。只有代理会与提供程序通信,并使用其自身的配置和订阅。代理可从模型中读取的内容,受与 AI 助手相同的五项权限授予所限制;这些授予会在服务器启动时进行快照保存,任何不在授予范围内的工具都不会提供给代理。默认禁止访问模型数据,因此除非你明确授予该权限,否则任何 DAX 查询结果都不会离开模型。在模型定义中输入的值,例如 `DATATABLE` 表达式或“输入数据”表,属于模型元数据,并受“模型元数据”授权涵盖。 +**数据流。** Tabular Editor不会就此功能联系 AI 提供商,也不会持有其 API 密钥。代理是唯一一个根据自己的配置和订阅与提供商通信的一方。代理可以从模型中读取的内容受制于与管控 AI 助手的相同的五项权限授予,这些权限授予在服务器启动时进行快照,并且任何未被权限授予涵盖的工具都绝不会提供给代理。默认情况下,模型数据被拒绝,因此除非您明确授予权限,否则任何 DAX 查询结果都不会离开模型。在模型定义中输入的值(例如 `DATATABLE` 表达式或“输入数据”表)是模型元数据,受模型元数据授权的约束。 -**对模型的更改。** 代理只能通过 C# Script 脚本引擎更改模型;更改会以原子方式执行,并作为单个撤销步骤记录,而且仅在模型元数据权限被授予“写入”时才允许这样做。代理永远无法执行原始 TMSL 和 XMLA;此外,任何会访问模型之外内容的脚本也不会为代理执行。 +**对模型的更改。**代理仅通过 C# 脚本引擎以原子方式并作为单个撤消步骤更改模型,并且仅在具有写入权限的模型元数据授权的情况下进行更改。代理永远无法执行原始 TMSL 和 XMLA,并且永远不会为其执行超出模型范围的脚本。 -**审计记录。** 权限决策、工具调用,以及代理运行或提交运行的任何 C# Script 的完整文本,都会写入本地审计日志中。提示词、回复和数据值不会被记录。 +**审计记录。**权限决策、工具调用以及代理运行或提交运行的任何 C# 脚本的完整文本都会写入本地审计日志。提示、回复和数据值均不予记录。 -**禁用 MCP 服务器。** 在 **工具 > 偏好 > AI 功能 > MCP 服务器** 中取消勾选 **启用 MCP 服务器**,或强制执行 `DisableMcpServer` 或 `DisableAi` [策略](xref:policies)。该服务器属于 AI 功能组件,因此在安装时排除该组件也会一并移除它。 +**禁用 MCP 服务器。**在**工具 > 首选项 > AI 功能 > MCP 服务器**下清除**启用 MCP 服务器**,或强制执行 `DisableMcpServer` 或 `DisableAi` [策略](xref:policies)。服务器是 AI 功能组件的一部分,因此在安装时排除该组件也会一并移除服务器。 ### Web 请求 -Tabular Editor 仅会在以下情况下向在线资源(Web URL)发起请求: +Tabular Editor 仅在以下情况下才会向在线资源(网页网址)发起请求: -- **许可证激活\*.** 首次启动 Tabular Editor 3 时,以及之后的定期时间点,工具可能会向我们的许可服务发起请求。该请求包含以下经过加密的信息:用户输入的许可证密钥、用户的电子邮件地址(如果提供)、本地计算机名称,以及用于标识当前安装的单向编码哈希值。此请求不会传输其他数据。此请求的目的是激活并验证该安装所使用的许可证密钥、实施试用限制,以及让用户能够通过我们的许可服务管理其 Tabular Editor 3 安装。 -- **升级检查\*.** 每次启动 Tabular Editor 3 时,它可能会向我们的应用服务发起请求,以确定是否有可用的新版 Tabular Editor 3。此请求不包含任何数据。 -- **使用情况遥测\*.** 默认情况下,Tabular Editor 3 会在用户与该工具交互时收集并传输匿名使用数据。这些数据包括用户与哪些 UI 对象交互,以及每次交互的时间信息。其中还包含有关通过该工具编辑的 Tabular Data model 的高级信息。这些信息仅涉及兼容级别、模式、表数量、服务器类型(Analysis Services、Power BI 或 Power BI Desktop)等高级属性。**不会通过这种方式收集任何可识别个人身份的数据**;我们也不会收集 Tabular Object Model 本身中任何对象名称或 DAX 表达式的信息。用户可随时选择停止向我们发送遥测数据。 -- **错误 Report\*.** 当发生意外错误时,我们会传输堆栈跟踪和(已匿名化的)错误信息,并附带你提供的可选说明。如果用户选择不发送遥测数据,错误 Report 也不会发送。 -- **使用 DAX 格式化器。**(仅限 Tabular Editor 2.x)你可以在 Tabular Editor 中点击按钮来格式化 DAX 表达式。在这种情况下,会将 DAX 表达式(且仅此一项)发送到 www.daxformatter.com Web 服务。用户首次单击此按钮时,会显示一条明确的警告信息,要求其确认此操作。 Tabular Editor 3 在格式化 DAX 代码时不会发起 Web 请求。 -- **DAX优化器**。如果用户拥有 [Tabular Tools 账户](https://tabulartools.com),并订阅了 [DAX优化器](https://daxoptimizer.com),即可直接在 Tabular Editor 3 中浏览自己的 DAX优化器 Workspace、查看问题和建议,并上传新的 VPAX 文件。 VPAX 文件包含模型元数据和统计信息,但不包含实际的模型 _数据_。 Tabular Editor 3 中的 DAX优化器集成功能会向以下一个或多个端点发送请求(具体取决于创建 Tabular Tools 账户时指定的身份验证类型和区域)。
    如需了解更多信息,请参阅 [DAX优化器文档](https://docs.daxoptimizer.com/legal/data-processing)。
    使用的端点: +- **许可证激活\*\。** Tabular Editor 3 首次启动时,以及此后的定期时间间隔内,该工具可能会向我们的许可服务发起请求。此请求包含有关用户输入的许可证密钥、用户电子邮件地址(如果提供)、本地计算机名称以及标识当前安装的单向编码哈希的加密信息。此请求中不会传输其他数据。此请求的目的是激活和验证安装所使用的许可证密钥,实施试用限制,以及允许用户通过我们的许可服务管理其 Tabular Editor 3 的安装。 +- **升级检查\*\。**每次启动 Tabular Editor 3 时,它都可能向我们的应用程序服务发出请求,以确定是否有更新版本的 Tabular Editor 3 可用。此请求不包含任何数据。 +- **使用情况遥测\*\。**默认情况下,当用户与该工具进行交互时,Tabular Editor 3 会收集并传输匿名使用情况数据。这些数据包括有关用户与哪些 UI 对象进行交互以及每次交互的时间的信息。它还包含有关通过该工具编辑的表格数据模型的高级信息。这些信息仅与兼容性级别和模式、表数、服务器类型(Analysis Services、Power BI 或 Power BI Desktop)等高层次属性相关。**我们不会以这种方式收集任何个人身份识别数据**,也不会收集有关 Tabular Object Model 本身中对象名称或 DAX 表达式的任何信息。每个事件都会标识处理器的架构以及安装的 .NET 运行时。用户可以随时选择退出向我们发送遥测数据。 +- **错误报告\*\。**当发生意外错误时,我们会传输堆栈跟踪和(经过匿名的)错误消息,以及用户提供的可选描述。如果用户选择不发送遥测数据,则也不会发送错误报告。 +- **使用 DAX 格式化程序。**(仅限 Tabular Editor 2.x)可以通过点击 Tabular Editor 中的按钮来格式化 DAX 表达式。在这种情况下,DAX 表达式(仅此而已)将发送到 www.daxformatter.com Web 服务。用户首次单击此按钮时,系统会显示一条明确的警告消息,要求他们确认自己的意图。Tabular Editor 3 在格式化 DAX 代码时不会执行 Web 请求。 +- **DAX Optimizer**。如果用户拥有 [Tabular Tools 帐户](https://tabulartools.com)并订阅了 [DAX Optimizer](https://daxoptimizer.com),他们将能够浏览其 DAX Optimizer 工作区,查看问题和建议,并直接从 Tabular Editor 3 中上传新的 VPAX 文件。VPAX 文件包含模型元数据和统计信息,但不包含实际的模型*数据*。Tabular Editor 3 中的 DAX Optimizer 集成功能会导致向以下一个或多个端点发出各种请求(具体取决于创建 Tabular Tools 账户时指定的身份验证类型和区域)。
    + 有关更多信息,请参阅[DAX Optimizer 文档](https://docs.daxoptimizer.com/legal/data-processing)。
    + 使用的端点: - https://account.tabulartools.com - https://licensing.api.daxoptimizer.com/api - https://australiaeast.api.daxoptimizer.com/api - https://eastus.api.daxoptimizer.com/api - https://westeurope.api.daxoptimizer.com/api -- **AI 助手。** 当 AI 助手已完成配置并在使用时,Tabular Editor 3 会将请求直接发送到所配置的 AI 提供商 API。具体端点取决于所选提供商(例如:OpenAI 使用 `https://api.openai.com`,Anthropic 使用 `https://api.anthropic.com`;Azure OpenAI 和自定义提供商则使用用户指定的端点)。这些请求中仅包含权限授予范围内的数据。有关这些资源及其默认值,请查看上文的 [AI 助手](#ai-assistant) 部分。 -- **AI 知识库更新。** AI 助手搜索的知识库是随 AI 功能组件一同提供的本地数据库。 Tabular Editor 3 会检查是否有新版本,并从 `https://cdn.tabulareditor.com` 下载。该请求不会携带任何关于用户或其模型的数据。 -- **AI 模型目录。** 当你打开 OpenAI 或 Anthropic 提供商的模型列表时,Tabular Editor 3 会从 `https://api.tabulareditor.com/AiModels` 下载可用模型列表,并将其缓存在 `%LocalAppData%\TabularEditor3\AiModels.json` 中 24 小时。该请求是匿名的,不会携带关于你、你的 API 密钥或你的模型的任何数据。 `DisableUpdates` 策略可将其关闭。 -- **MCP 服务器。** MCP 服务器不会发起任何出站请求。它只接受来自回环接口的连接,而与其连接的代理会按照其自身配置与 AI 提供程序通信。请查看上文的 [MCP 服务器](#mcp-server) 部分。 -- **导入最佳实践规则。** Tabular Editor 提供一项功能,让你可以指定一个 URL,从中获取以 JSON 格式提供的最佳实践规则列表。此类请求只会从该 URL 下载 JSON 数据,不会向该 URL 传输任何数据。 -- **使用 C# Script。** Tabular Editor 允许用户编写并执行用 C# 编写的代码,以实现自动化。此类脚本可利用 C# 语言功能和 .NET 运行时连接到联机资源。用户始终有责任确保所执行的代码不会导致任何非预期的数据共享。对于因使用 C# Script 功能而造成的任何损害、损失或泄露,Tabular Editor ApS 概不负责。如果没有用户的明确操作,Tabular Editor 绝不会执行 C# Script。 - -\***我们通过许可证激活服务、使用情况遥测或错误 Report 获得的任何信息,都会予以保密。我们绝不会以任何形式共享、发布或分发所收集的数据。** - -**防火墙允许列表 / 接受列表** -如需允许上述 Web 请求的流量,请将以下地址加入允许列表: - -- 许可证激活 / 升级检查 / AI 模型目录:**https://api.tabulareditor.com** -- 使用情况遥测 / 错误 Report:**https://\*.in.applicationinsights.azure.com** -- DAX Formatter(仅 Tabular Editor 2.x):**https://www.daxformatter.com** -- 导入最佳实践规则 / C# Script:视具体情况而定 -- DAX优化器:端点见上文列表。 -- AI 助手:取决于所配置的提供商(例如 \*\*https://api.openai.com\*\*、\*\*https://api.anthropic.com\*\*,或你指定的 Azure OpenAI / 自定义端点) +- **AI 助手。**配置并使用 AI 助手时,Tabular Editor 3 会直接向配置的 AI 提供商 API 发送请求。端点取决于所选的提供商(例如,OpenAI 为 `https://api.openai.com`,Anthropic 为 `https://api.anthropic.com`,Azure OpenAI 和自定义提供商为用户指定的端点)。这些请求中仅包含权限授予所涵盖的数据。有关资源及其默认值,请参阅上文的[AI 助手](#ai-assistant)部分。 +- **AI 知识库更新。** AI 助手搜索的知识库是随 AI 功能组件一同提供的本地数据库。Tabular Editor 3 会检查是否有更新的副本,并从 `https://cdn.tabulareditor.com` 下载。该请求不包含有关您或您的模型的数据。 +- **AI 模型目录。**当用户打开 OpenAI 或 Anthropic 提供程序的模型列表时,Tabular Editor 3 会从 `https://api.tabulareditor.com/AiModels` 下载可用模型列表,并将其缓存到 `%LocalAppData%\TabularEditor3\AiModels.json` 中 24 小时。该请求是匿名的,不包含有关您、您的 API 密钥或您的模型的数据。`DisableUpdates` 策略会将其关闭。 +- **MCP 服务器。** MCP 服务器不发出出站请求。它仅接受环回接口上的连接,与之连接的代理根据其自身的配置与 AI 提供商进行通信。请参阅上方的[MCP 服务器](#mcp-server)部分。 +- **导入最佳实践规则。** Tabular Editor 具有一项功能,允许用户指定一个 URL,从中以基于 JSON 的格式检索最佳实践规则列表。此类请求仅从 URL 下载 JSON 数据,不会向 URL 传输任何数据。 +- **使用 C# 脚本。** Tabular Editor 允许用户编写和执行用 C# 编写的代码,以实现自动化。此类脚本可能使用 C# 语言功能和 .NET 运行时连接到在线资源。用户始终有责任确保所执行的代码不会导致任何意外的数据共享。对于因使用 C# 脚本功能而导致的任何损害、损失或泄露,Tabular Editor ApS 概不承担责任。未经用户明确操作,Tabular Editor 绝不会执行 C# 脚本。 + +\***我们通过许可证激活服务、使用情况遥测数据或错误报告获得的任何信息均将予以保密。我们不会以任何方式、形式或形式分享、发布或分发所收集的数据。** + +**防火墙允许列表/接受列表** +要允许上述 Web 请求的流量,您必须将以下地址列入白名单: +- 许可证激活/升级检查/AI 模型目录:**https://api.tabulareditor.com** +- 使用情况遥测/错误报告:**https://*.in.applicationinsights.azure.com** +- DAX Formatter(仅限 Tabular Editor 2.x):**https://www.daxformatter.com** +- 导入最佳做法规则/C# 脚本:取决于上下文 +- DAX优化器:上述端点。 +- AI 助手:取决于所配置的提供商(例如 **https://api.openai.com**、**https://api.anthropic.com** 或用户指定的 Azure OpenAI/自定义端点) - AI 知识库更新:**https://cdn.tabulareditor.com** -- MCP 服务器:无。它监听在 **127.0.0.1**,且不会发起任何出站请求 +- MCP 服务器:无。它在 **127.0.0.1** 上进行监听,不发出任何出站请求 > [!NOTE] -> 系统管理员可能会强制执行某些[策略](xref:policies),用来禁用上面列表中的部分或全部功能。 +> 系统管理员可能会强制执行某些[策略](xref:policies),这些策略可用于禁用上述列表中显示的部分或全部功能。 ## 应用程序安全 -Tabular Editor 安装在 Windows 电脑上时不需要任何提升权限,也不会访问这台电脑上的任何受限资源。不过有一个例外:如果使用 Tabular Editor 安装程序文件 (.msi),该工具所需的可执行文件和支持文件默认会复制到 `Program Files` 文件夹,这通常需要提升权限。 Tabular Editor 的二进制文件和安装程序文件均已使用颁发给 Tabular Editor ApS 的代码签名证书进行签名,这能保证代码未被任何第三方篡改。 +Tabular Editor 在其安装所在的 Windows 计算机上不需要任何提升的权限,也不会访问该计算机上的任何受限资源。此规则的一个例外是,如果使用 Tabular Editor 安装程序文件 (.msi),则该工具所需的可执行文件和支持文件默认会复制到“Program Files”文件夹,这通常需要更高的权限。Tabular Editor 二进制文件和安装程序文件均已使用签发给 Tabular Editor ApS 的代码签名证书进行签名,这可以保证代码未被任何第三方篡改。 -应用程序运行时,所有对外部资源的访问都通过 AMO/TOM 客户端库或上面提到的 Web 请求完成。 +应用程序运行时,对外部资源的所有访问均通过 AMO/TOM 客户端库或上述 Web 请求进行。 -C# Script 功能允许 Tabular Editor 在 .NET 运行时中执行任意 C# 代码。此类代码仅会在用户明确请求时才会编译和执行。 C# Script 也可以保存为“宏”,这样用户就能更轻松地管理和执行多个不同的脚本。代码会存储在用户自己的 `%localappdata%` 文件夹中,从而确保只有该用户本人或本机管理员才能访问这些脚本。用户始终有责任确保所执行的代码不会产生任何意外的副作用。在任何情况下,Tabular Editor ApS 均不对因使用 C# Script 或自定义操作/宏功能而造成的任何损害、损失或泄漏承担责任。 +C# 脚本功能允许 Tabular Editor 在 .NET 运行时中执行任意 C# 代码。此类代码仅在用户明确要求时才会编译和执行。C# 脚本还可以保存为“宏”,这使用户能够更轻松地管理和执行多个不同的脚本。代码存储在用户自己的“%localappdata%”文件夹中,确保只有用户本人或本地计算机管理员才能访问脚本。用户始终有责任确保所执行的代码不会造成任何意外的副作用。在任何情况下,Tabular Editor ApS 均不对因使用 C# 脚本或自定义操作/宏功能而导致的任何损害、损失或泄露承担责任。 -不希望由单个用户自行决定此事的组织,可以进行集中管控。 `DisableCSharpScripts` 和 `DisableMacros` [策略](xref:policies)会在所有版本中将这些功能(C# 脚本和宏)完全关闭。在 Tabular Editor 3 企业版中,`BlockUnsafeScripts` 会保留脚本功能,但只允许在语义模型范围内运行的脚本和宏:任何读取或写入文件、访问网络、启动其他程序或加载外部代码的操作,都会在运行前被拒绝,无论脚本来自何处——脚本文档、Best Practice Analyzer、宏、AI Assistant、MCP 服务器或命令行。参见[管理员策略](xref:csharp-scripts#administrator-policies)。 +不想将此事项留给个人用户处理的组织可以集中管理。`DisableCSharpScripts` 和 `DisableMacros` [策略](xref:policies)会在所有版本中完全禁用这些功能。使用 Tabular Editor 3 企业版,`BlockUnsafeScripts` 保持脚本可用,但仅允许保留在语义模型内的脚本和宏:任何读取或写入文件、访问网络、启动其他程序或加载外部代码的操作,无论脚本来自何处(脚本文档、Best Practice Analyzer、宏、AI 助手、MCP 服务器或命令行),都会在其运行之前被拒绝。请参阅[管理员策略](xref:csharp-scripts#administrator-policies)。 diff --git a/localizedContent/zh/content/security/toc.md b/localizedContent/zh/content/security/toc.md index 57d01411b..3ed671aa1 100644 --- a/localizedContent/zh/content/security/toc.md +++ b/localizedContent/zh/content/security/toc.md @@ -1,11 +1,8 @@ # @security-privacy +# @ai-compliance # 法律 - -## @te3-eula - -## @third-party-notices - +## @terms +## @第三方声明 ## @privacy-policy - ## @gdpr-delete \ No newline at end of file diff --git a/localizedContent/zh/content/troubleshooting/toc.md b/localizedContent/zh/content/troubleshooting/toc.md index c4e7b7572..53425d8f4 100644 --- a/localizedContent/zh/content/troubleshooting/toc.md +++ b/localizedContent/zh/content/troubleshooting/toc.md @@ -2,8 +2,16 @@ # @proxy-settings -# @locale-not-supported +# @不支持的区域设置 -# @calendar-blank-value +# @日历-空值 -# @direct-lake-entity-updates-reverting \ No newline at end of file +# @direct-lake-entity-updates-reverting + +# @azure-openai-连接-错误 + +# @复合模型-度量值-格式化 + +# @databricks-column-comments-length + +# @databricks-刷新-空-目录 diff --git a/localizedContent/zh/content/tutorials/new-as-model.md b/localizedContent/zh/content/tutorials/new-as-model.md index 6d2ac31c5..12a8788ec 100644 --- a/localizedContent/zh/content/tutorials/new-as-model.md +++ b/localizedContent/zh/content/tutorials/new-as-model.md @@ -1,4 +1,4 @@ ---- +--- uid: new-as-model title: 创建 Analysis Services 模型 author: Daniel Otykier @@ -13,67 +13,65 @@ applies_to: none: true - edition: Business partial: true - note: "仅限 SQL Server Standard Edition" + note: "Limited to SQL Server Standard Edition" - edition: Enterprise full: true --- - # (教程)创建您的第一个 Analysis Services 模型 -本页将指导您使用 Tabular Editor 3 从零开始创建一个新的 Analysis Services 表格模型。 +本页将引导您使用 Tabular Editor 3 从头开始创建新的 Analysis Services 表格模型。 > [!NOTE] -> Tabular Editor 3 商业版仅支持 [SQL Server Standard Edition](https://docs.microsoft.com/analysis-services/analysis-services-features-supported-by-the-editions-of-sql-server-2016?view=asallproducts-allversions#tabular-models) 和 [Azure Analysis Services Basic Tier](https://docs.microsoft.com/azure/analysis-services/analysis-services-overview#basic-tier)。请注意:在这些层级中,部分建模功能不受支持。 +> Tabular Editor 3 Business Edition 仅限于 [SQL Server Standard Edition](https://docs.microsoft.com/analysis-services/analysis-services-features-supported-by-the-editions-of-sql-server-2016?view=asallproducts-allversions#tabular-models) 和 [Azure Analysis Services Basic Tier](https://docs.microsoft.com/azure/analysis-services/analysis-services-overview#basic-tier)。请注意,这些级别不支持某些建模功能。 -##### 创建新模型 +## 创建新模型 -- 在“文件”菜单中,选择“新建” > “模型……”或按 `CTRL+N` +- 从“文件”菜单中,选择“新建”>“模型…”或按 `CTRL+N` ![新建模型](~/content/assets/images/new-as-model-new-model.png) -- 为模型指定名称,或使用默认名称。然后,选择与目标 Analysis Services 版本相对应的兼容级别。该对话框列出以下选项: - +- 为您的模型提供一个名称,或使用默认值。您输入的名称将用于数据库名称、数据库 ID 和模型名称。然后,选择您所针对的 Analysis Services 版本的兼容级别。对话框列出了以下选项: - 1200(Azure Analysis Services / SQL Server 2016+) - 1400(Azure Analysis Services / SQL Server 2017+) - 1500(Azure Analysis Services / SQL Server 2019+) - 1600(Azure Analysis Services / SQL Server 2022+) - 1700(Azure Analysis Services / SQL Server 2025+) - - 1706(Power BI / Fabric) + - 1706(Power BI/Fabric) - 1700 是 Analysis Services 支持的最高级别。 1706 仅用于 Power BI 和 Fabric,例如在通过 Power BI XMLA endpoint 部署模型时使用。 + 1700 是 Analysis Services 支持的最高级别。仅将 1706 用于 Power BI 和 Fabric,例如,当您通过 Power BI XMLA endpoint 部署模型时。 -- 为获得最佳开发体验,请勾选“使用 Workspace 数据库”选项。这要求你拥有一个可用的 Analysis Services 实例,以便将 Workspace 数据库部署到其上。这可以是 SQL Server Analysis Services 的本地或远程实例,也可以是 Azure Analysis Services 实例。单击“确定”后,系统会提示你输入要在其中创建 Workspace 数据库的 Analysis Services 实例的连接字符串。 +- 为获得最佳开发体验,请勾选“使用工作区数据库”选项。这要求您有一个可用的 Analysis Services 实例,您的工作区数据库将部署在该实例上。这可以是 SQL Server Analysis Services 的本地或远程实例,也可以是 Azure Analysis Services 的实例。单击“确定”后,系统将提示您输入要在其中创建工作区数据库的 Analysis Services 实例的连接字符串。 - [了解有关 Workspace 数据库的详细信息](xref:workspace-mode)。 + [了解有关工作区数据库的更多信息](xref:workspace-mode)。 > [!NOTE] -> 使用 Workspace 数据库,你可以验证 Power Query(M 表达式),并从 Power Query 表达式中导入表架构。你还可以在 Workspace 数据库中刷新和查询数据,从而更轻松地调试和测试 DAX 表达式。 +> 使用工作区数据库,您可以验证 Power Query(M 表达式),并从 Power Query 表达式导入表架构。您还可以刷新和查询工作区数据库中的数据,从而更轻松地调试和测试 DAX 表达式。 -模型创建完成后,下一步是添加一个数据源和一些表。 +创建模型后,下一步是添加数据源和一些表。 -#### 添加数据源和表 +## 添加数据源和表格 -在将数据导入表格模型之前,你必须先设置一个或多个数据源。找到 TOM Explorer,右键单击“数据源”文件夹,然后选择“创建”。对于兼容级别为 1400 或更高的模型,有两种选择:Legacy 数据源和 Power Query 数据源。若要进一步了解这两类数据源之间的差异,请参阅 [Microsoft Analysis Services 博客](https://docs.microsoft.com/archive/blogs/analysisservices/using-legacy-data-sources-in-tabular-1400)。 +在将数据导入到表格模型之前,您必须设置一个或多个数据源。找到 TOM Explorer,右键单击“数据源”文件夹,然后选择“创建”。对于使用兼容级别 1400 或更高版本的模型,我们有两个选项:旧版数据源和 Power Query 数据源。要详细了解这两种数据源之间的差异,请[参阅 Microsoft Analysis Services 博客](https://docs.microsoft.com/archive/blogs/analysisservices/using-legacy-data-sources-in-tabular-1400)。 ![添加数据源](~/content/assets/images/new-as-model-add-data-source.png) -在此示例中,我们将创建一个 Power Query 数据源,用它从 SQL Server 关系数据库导入几个表。创建数据源后,按 F2 将其重命名,然后如下面的屏幕截图所示,在属性网格中配置该数据源: +在本例中,我们将创建一个 Power Query 数据源,用于从 SQL Server 关系数据库导入一些表。创建数据源后,按 F2 重命名数据源,然后使用属性网格配置数据源,如下图所示: ![设置数据源属性](~/content/assets/images/new-as-model-data-source-properties.png) -在本示例中,我们设置了以下属性: +在我们的示例中,我们设置了以下属性: -| 属性 | 值 | -| ------------------ | ---------------------- | -| 名称 | `AdventureWorks` | -| 协议 | `tds` | -| 数据库 | `AdventureWorksDW2017` | -| 服务器 | `localhost` | -| AuthenticationKind | `ServiceAccount` | +| 属性 | 值 | +|---|---| +| 名称 | `AdventureWorks` | +| 协议 | `tds` | +| 数据库 | `AdventureWorksDW2017` | +| 服务器 | `localhost` | +| AuthenticationKind | `ServiceAccount` | -单击“Save”(Ctrl+S)。系统会提示你为 Model.bim 文件提供路径和文件名,该文件将保存你迄今为止创建的模型元数据。你也可以改为将模型保存为文件夹结构(File > 保存到文件夹...);如果你计划将模型元数据纳入版本控制环境,建议采用这种方式。如果你使用工作区数据库 (Workspace Database),Tabular Editor 3 还会将元数据同步到已连接的 Analysis Services 实例。 +点击“保存” (Ctrl+S)。系统将提示您为 Model.bim 文件提供路径和文件名,该文件将保存您迄今为止创建的模型元数据。您也可以将模型另存为文件夹结构(“文件”>“保存到文件夹…”)。如果您计划将模型元数据集成到版本控制环境中,则建议您这样做。如果你使用的是工作区数据库,Tabular Editor 3 还会将元数据同步到连接的 Analysis Services 实例。 -接下来,右键单击“Tables”文件夹并选择“Create > Table”(也可以按 Alt+5),向模型中添加一个新表。为该表命名,在本例中为 `Internet Sales`。展开该表,找到其中的分区,并将以下 M 查询作为分区表达式,以便用数据填充该表: +接下来,右键单击“Tables”(表格)文件夹并选择“Create > Table”(创建 > 表格)(您也可以按 Alt+5),向模型添加新表。为表命名,在我们的示例中为“Internet Sales”。展开表格,找到表格上的分区,并提供以下 M 查询作为分区表达式,以便向表格中填充数据: ```M let @@ -83,57 +81,57 @@ in Data ``` -这假设关系型 SQL Server 数据库在“dbo”架构下包含一个名为“FactInternetSales”的表。 +这假设关系 SQL Server 数据库在“dbo”架构中包含名为“FactInternetSales”的表。 ![M 分区表达式](~/content/assets/images/new-as-model-m-partition.png) -接下来,右键单击新建的表并选择“Update table schema...”。这样,Tabular Editor 就能根据分区查询自动填充表中的列。 +接下来,右键单击新创建的表格,然后选择“更新表格架构...”。这允许 Tabular Editor 根据分区查询自动填充表格列。 > [!NOTE] -> 如果你未使用 Workspace 数据库,此操作仅在 Tabular Editor 3.1.0 或更高版本中可用。 +> 如果您未使用工作区数据库,则此操作仅在 Tabular Editor 3.1.0 或更高版本中可用。 -![架构对比](~/content/assets/images/new-as-model-schema-compare.png) +![架构比较](~/content/assets/images/new-as-model-schema-compare.png) -单击“OK”,将这些列添加到表中。再次单击“Save”(Ctrl+S)。如果你使用的是 Workspace 数据库,可以在刷新操作完成后在服务器上刷新该表,并浏览表中的数据。为此,右键单击该表,然后选择“Refresh table > Automatic (table)”。等待“Data Refresh”选项卡上的操作完成,然后右键单击该表并选择“Preview”(也可以在 TOM Explorer 中执行同样的操作),以查看表中的实际数据: +点击“确定”将列添加到表中。再次按“保存” (Ctrl+S)。如果您正在使用工作区数据库,则可以在服务器上刷新表格,并在刷新操作完成后浏览表格中的数据。为此,请右键单击表格,然后选择“刷新表格 > 自动(表格)”。等待“数据刷新”选项卡上的操作完成,然后右键单击表格并选择“预览”(您也可以从 TOM Explorer 中执行此操作),以查看表格中的实际数据: ![数据刷新](~/content/assets/images/new-as-model-data-refresh.png) -如果你导入的表是维度表,我们建议将该表主键列的“Key”属性设置为“true”。这样可以更轻松地在此表与其他表之间定义关系,稍后我们会看到。 +如果您导入的表是维度表,我们建议将表上主键列的“Key”属性设置为“true”。正如我们稍后将看到的那样,这使得定义此表与其他表之间的关系更加容易。 -对你想导入到 Tabular 模型的每个表重复此过程。你无需逐个刷新每个表中的数据——可以直接在模型级别运行刷新操作。 +对于要导入到表格模型的任何表,请重复此过程。您不必逐一刷新每个表格中的数据,而是可以在模型层面运行刷新操作。 -#### 定义关系 +## 定义关系 -当你导入了多张表后,在 Tabular Editor 3 中定义它们之间关系的最简单方法是新建一个图表。选择“File > New > Diagram”。然后,多选表并将其拖到图表视图中,或者右键单击这些表并选择“Add to diagram”: +导入多张表后,使用 Tabular Editor 3 定义它们之间关系的最简单方法是创建新图表。选择“文件 > 新建 > 图表”。然后,多选并拖动表格到关系图视图,或右键单击表格并选择“添加到关系图” : -![添加到图表](~/content/assets/images/new-as-model-add-to-diagram.png) +![添加到关系图](~/content/assets/images/new-as-model-add-to-diagram.png) -要在两张表之间创建关系,请在事实表上找到外键列,然后将该列“拖动”到维度表的主键列上。在弹出的对话框中,单击“确定”以确认关系设置。 +要创建两个表之间的关系,请在事实表中找到外键列,然后将该列“拖动”到维度表的主键列。点击“确定”,在弹出的对话框中确认关系设置。 -![图表视图](~/content/assets/images/new-as-model-diagram-view.png) +![图视图](~/content/assets/images/new-as-model-diagram-view.png) -关闭图表视图(无需保存,因为之后随时都可以重新构建该图表)。再次按 Ctrl+S 保存模型。现在该添加一些业务逻辑了。如果你使用的是 Workspace Database,现在正适合在模型级别执行一次刷新(automatic 或 calculate),以确保服务器已为这些关系创建相应的支撑结构,从而使模型处于可查询状态。 +关闭图表视图(无需保存,因为您可以稍后随时重建图表)。再次按 Ctrl+S 保存模型。现在是时候添加一些业务逻辑了。如果您正在使用工作区数据库,现在是在模型层面执行刷新(自动或计算)的好时机,以确保在服务器上创建关系的支持结构,从而使模型进入可查询状态。 -#### 添加度量值 +## 添加度量值 -在 TOM Explorer 中选择一个表,然后按 Alt+1(或选择“创建”>“新建度量值”)为该表添加度量值。为该度量值命名,并为其提供一个 DAX 表达式。 +在 TOM Explorer 中选择一个表格,然后按 Alt+1(或选择“创建”>“新建度量值”),即可向该表格添加度量值。为度量值命名,并为其提供 DAX 表达式。 ![添加度量值](~/content/assets/images/new-as-model-add-measure.png) 按 Ctrl+S 保存模型元数据。 -如果你使用的是 Workspace Database,现在可以直接在 Tabular Editor 3 中测试新建的度量值。最简单的测试方法是使用 Pivot Grid。选择“文件”>“新建”>“Pivot Grid”,然后将刚刚创建的度量值从 TOM Explorer 拖到网格中。你还可以将列和层次结构从 TOM Explorer 拖到 Pivot Grid 的“筛选器”“行”或“列”区域,按不同维度属性对度量值进行切片: +如果您使用的是工作区数据库,现在可以直接在 Tabular Editor 3 中测试您的新度量值。最简单的测试方法是使用 Pivot Grid。选择“文件”>“新建”>“Pivot Grid”,然后将新创建的度量值从 TOM Explorer 拖入网格。您还可以将列和层次结构从 TOM Explorer 拖到 Pivot Grid 的“筛选器”、“行”或“列”区域,以便按不同的维度属性对度量值进行切片: ![Pivot Grid](~/content/assets/images/new-as-model-pivot-grid.png) -如果你没有使用 Workspace Database,则必须先将模型部署到某个 Analysis Services 实例,之后才能执行数据刷新并查询模型。 +如果你未使用工作区数据库,则必须将模型部署到 Analysis Services 实例,然后才能执行数据刷新和查询模型。 -#### 部署 Data model +## 部署数据模型 -要将模型元数据部署到任意 Analysis Services 实例,请单击“模型”菜单并选择“部署...”。这将打开 Tabular Editor 3 的 Deployment Wizard,它与 Tabular Editor 2.X 的 Deployment Wizard 类似。按照向导各页面上的说明操作,将模型元数据部署到 Analysis Services 实例。你也可以使用 Deployment Wizard 生成 TMSL/XMLA 脚本,并将其交给 Analysis Services 服务器管理员进行手动部署。 +要将模型元数据部署到任何 Analysis Services 实例,请点击“模型”菜单,然后选择“部署……”。这将打开 Tabular Editor 3 部署向导,该向导与 Tabular Editor 2.X 的部署向导类似。请按照向导各页面的说明,将模型元数据部署到 Analysis Services 实例。您还可以使用部署向导生成 TMSL/XMLA 脚本,该脚本可以移交给 Analysis Services 服务器管理员进行手动部署。 ![部署](~/content/assets/images/new-as-model-deployment.png) -要刷新并测试已部署的数据库,你可以使用 Microsoft 提供的标准管理工具和客户端工具;也可以使用另一个 Tabular Editor 3 实例(前提是你在已部署模型所在的 Analysis Services 实例上具有管理员访问权限)。 +要刷新和测试已部署的数据库,您可以使用 Microsoft 提供的标准管理工具和客户端工具,也可以使用另一个 Tabular Editor 3 实例(假设您对已部署模型所在的 Analysis Services 实例具有管理员访问权限)。 -上面这段内容很好地说明了为什么要使用前文所述的 Workspace 数据库方法。连接到 Workspace 数据库后,你就可以在同一个 Tabular Editor 3 实例中执行所有开发操作,包括数据刷新和业务逻辑测试,而无需依赖其他工具。 +上段提供了使用上述工作区数据库方法的充分理由。连接到工作区数据库后,您将能够在同一个 Tabular Editor 3 实例中执行所有开发操作,包括数据刷新和业务逻辑测试,而无需依赖其他工具。 diff --git a/localizedContent/zh/content/whats-new/3-18-0.html b/localizedContent/zh/content/whats-new/3-18-0.html index 788bf22b6..24a7bcfb4 100644 --- a/localizedContent/zh/content/whats-new/3-18-0.html +++ b/localizedContent/zh/content/whats-new/3-18-0.html @@ -4,7 +4,7 @@

    Tabular Editor 3.18.0

  • DAX Optimizer integration is GA and includes 4 free runs per day for Tabular Editor 3 Enterprise Edition customers
  • One-click DAX improvements and refactorings with the new code actions feature
  • Explicit authentication against XMLA endpoints, using Microsoft Entra MFA
  • -
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • +
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • Set your own number of recent items in the preferences - default is 10
  • Fixed several bugs including ensuring DAX Debugger support for FormatString measures in DAX Queries
  • And more...
  • diff --git a/localizedContent/zh/content/whats-new/3-18-1.html b/localizedContent/zh/content/whats-new/3-18-1.html index 4a4213f22..db3a3be62 100644 --- a/localizedContent/zh/content/whats-new/3-18-1.html +++ b/localizedContent/zh/content/whats-new/3-18-1.html @@ -4,7 +4,7 @@

    Tabular Editor 3.18.1

  • DAX Optimizer integration is GA and includes 4 free runs per day for Tabular Editor 3 Enterprise Edition customers
  • One-click DAX improvements and refactorings with the new code actions feature
  • Explicit authentication against XMLA endpoints, using Microsoft Entra MFA
  • -
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • +
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • Set your own number of recent items in the preferences - default is 10
  • Fixed several bugs including ensuring DAX Debugger support for FormatString measures in DAX Queries
  • And more...
  • diff --git a/localizedContent/zh/content/whats-new/3-18-2.html b/localizedContent/zh/content/whats-new/3-18-2.html index cd2ad7a73..a37721ec0 100644 --- a/localizedContent/zh/content/whats-new/3-18-2.html +++ b/localizedContent/zh/content/whats-new/3-18-2.html @@ -4,7 +4,7 @@

    Tabular Editor 3.18.2

  • DAX Optimizer integration is GA and includes 4 free runs per day for Tabular Editor 3 Enterprise Edition customers
  • One-click DAX improvements and refactorings with the new code actions feature
  • Explicit authentication against XMLA endpoints, using Microsoft Entra MFA
  • -
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • +
  • Customize how Auto-exists work with the new model property Value Filter behavior
  • Set your own number of recent items in the preferences - default is 10
  • Fixed several bugs including ensuring DAX Debugger support for FormatString measures in DAX Queries
  • And more...
  • diff --git a/localizedContent/zh/content/whats-new/3-26-0.html b/localizedContent/zh/content/whats-new/3-26-0.html new file mode 100644 index 000000000..a99676ef7 --- /dev/null +++ b/localizedContent/zh/content/whats-new/3-26-0.html @@ -0,0 +1,12 @@ +

    Tabular Editor 3.26.0

    +

    Release blog: March 2026 (v. 3.26.0, release notes)

    +
      +
    • AI Assistant (Public Preview): A built-in assistant for common semantic model development tasks -- explore your model, write DAX queries, generate C# scripts, run BPA analysis and more. Bring your own API key and privacy guards. Read the announcement.
    • +
    • Run script with preview: A new option for C# scripts that snapshots your model before execution and shows a side-by-side diff of all changes, letting you review and accept or revert them.
    • +
    • New built-in BPA rule: Detects User-Defined Functions without compound names (separators), preventing future naming conflicts with built-in DAX functions.
    • +
    • Expanded C# scripting accessors: Complete singular and plural Selected.* accessor support for all object types, including roles, KPIs, calendars, calculation items, functions and more.
    • +
    • Workspace database improvements: Tabular Editor now detects changes to incremental refresh Source Expression or Polling Expression and prompts before overwriting workspace partitions.
    • +
    • TOM Explorer table groups toggle: New toolbar button to show or hide table groups directly from the TOM Explorer.
    • +
    • New DAX function support: TABLEOF, NAMEOF (table references), DATESINPERIOD EndBehavior parameter.
    • +
    • Various bugfixes including Calendar Editor, DAX Debugger Call Tree, M Editor comment highlighting and C# script editor autocomplete. See release notes for details.
    • +
    diff --git a/localizedContent/zh/content/whats-new/3-26-1.html b/localizedContent/zh/content/whats-new/3-26-1.html new file mode 100644 index 000000000..564fd0372 --- /dev/null +++ b/localizedContent/zh/content/whats-new/3-26-1.html @@ -0,0 +1,12 @@ +

    Tabular Editor 3.26.1

    +

    Release blog: March 2026 (v. 3.26.1, release notes)

    +
      +
    • AI Assistant (Public Preview): A built-in assistant for common semantic model development tasks -- explore your model, write DAX queries, generate C# scripts, run BPA analysis and more. Bring your own API key and privacy guards. Read the announcement.
    • +
    • Run script with preview: A new option for C# scripts that snapshots your model before execution and shows a side-by-side diff of all changes, letting you review and accept or revert them.
    • +
    • New built-in BPA rule: Detects User-Defined Functions without compound names (separators), preventing future naming conflicts with built-in DAX functions.
    • +
    • Expanded C# scripting accessors: Complete singular and plural Selected.* accessor support for all object types, including roles, KPIs, calendars, calculation items, functions and more.
    • +
    • Workspace database improvements: Tabular Editor now detects changes to incremental refresh Source Expression or Polling Expression and prompts before overwriting workspace partitions.
    • +
    • TOM Explorer table groups toggle: New toolbar button to show or hide table groups directly from the TOM Explorer.
    • +
    • New DAX function support: TABLEOF, NAMEOF (table references), DATESINPERIOD EndBehavior parameter.
    • +
    • Various bugfixes including Calendar Editor, DAX Debugger Call Tree, M Editor comment highlighting and C# script editor autocomplete. See release notes for details.
    • +
    diff --git a/localizedContent/zh/content/whats-new/3-26-2.html b/localizedContent/zh/content/whats-new/3-26-2.html new file mode 100644 index 000000000..5f8f18ae2 --- /dev/null +++ b/localizedContent/zh/content/whats-new/3-26-2.html @@ -0,0 +1,11 @@ +

    Tabular Editor 3.26.2

    +

    Release blog: June 2026 (v. 3.26.2, release notes)

    +
      +
    • DAX UDFs are generally available: DAX user-defined functions are now GA. Tabular Editor 3.26.2 supports their syntax and metadata for models at compatibility level 1702 or higher, so you can package logic once and reuse it in measures, calculated columns, visual calculations, and other functions. Learn more.
    • +
    • Optional parameters for DAX UDFs: A parameter can now carry a default expression, keeping the common case short while the edge cases stay configurable. The Semantic Analyzer also warns when an argument doesn't match a parameter's declared type.
    • +
    • New NAMEOF parameters: Tabular Editor 3.26.2 understands the optional component and escaped parameters introduced in Power BI Desktop's April 2026 update -- validating them as you type, suggesting calendars alongside tables, columns, and measures, and updating table references inside NAMEOF during formula fixup.
    • +
    • Move tables to groups from the context menu: Right-click one or more selected tables in the TOM Explorer to move them into a Table Group or remove them. The new Move to group submenu lists your existing groups, plus a (New...) entry that creates a group from the selection and a (None) entry that clears the assignment.
    • +
    • Semantic Bridge supports metric view YAML 1.1 (Enterprise): Importing a Databricks Metric View now carries more metadata -- display names, descriptions, and format strings -- into the generated semantic model, with improved SQL-to-DAX translation and support for snowflake schemas with nested joins.
    • +
    • Also in the Tabular Editor CLI: these DAX language and semantic analysis improvements are available in te-cli, helping with scripting operations and giving agents better DAX results.
    • +
    • Other fixes include more reliable Data Preview sorting and pagination across storage modes, several Semantic Analyzer corrections, and Update Table Schema working on mixed selections and Table Groups. See release notes for details.
    • +
    diff --git a/localizedContent/zh/content/whats-new/3-26-3.html b/localizedContent/zh/content/whats-new/3-26-3.html new file mode 100644 index 000000000..e0d8ca304 --- /dev/null +++ b/localizedContent/zh/content/whats-new/3-26-3.html @@ -0,0 +1,11 @@ +

    Tabular Editor 3.26.3

    +

    Release blog: June 2026 (v. 3.26.3, release notes)

    +
      +
    • DAX UDFs are generally available: DAX user-defined functions are now GA. Tabular Editor 3.26.2 and higher supports their syntax and metadata for models at compatibility level 1702 or higher, so you can package logic once and reuse it in measures, calculated columns, visual calculations, and other functions. Learn more.
    • +
    • Optional parameters for DAX UDFs: A parameter can now carry a default expression, keeping the common case short while the edge cases stay configurable. The Semantic Analyzer also warns when an argument doesn't match a parameter's declared type.
    • +
    • New NAMEOF parameters: Tabular Editor 3.26.2 and higher understands the optional component and escaped parameters introduced in Power BI Desktop's April 2026 update -- validating them as you type, suggesting calendars alongside tables, columns, and measures, and updating table references inside NAMEOF during formula fixup.
    • +
    • Move tables to groups from the context menu: Right-click one or more selected tables in the TOM Explorer to move them into a Table Group or remove them. The new Move to group submenu lists your existing groups, plus a (New...) entry that creates a group from the selection and a (None) entry that clears the assignment.
    • +
    • Semantic Bridge supports metric view YAML 1.1 (Enterprise): Importing a Databricks Metric View now carries more metadata -- display names, descriptions, and format strings -- into the generated semantic model, with improved SQL-to-DAX translation and support for snowflake schemas with nested joins.
    • +
    • Also in the Tabular Editor CLI: these DAX language and semantic analysis improvements are available in te-cli, helping with scripting operations and giving agents better DAX results.
    • +
    • Other fixes include more reliable Data Preview sorting and pagination across storage modes, several Semantic Analyzer corrections, and Update Table Schema working on mixed selections and Table Groups. See release notes for details.
    • +
    diff --git a/localizedContent/zh/content/whats-new/index.html b/localizedContent/zh/content/whats-new/index.html index 08c7cd070..d5556b17d 100644 --- a/localizedContent/zh/content/whats-new/index.html +++ b/localizedContent/zh/content/whats-new/index.html @@ -46,14 +46,15 @@

    Community

    Ask questions, suggest enhancements and help other TE fans get their answers at our GitHub community:

    Articles

    Share your favorite blog or SoMe post with the community

    Video

    @@ -85,12 +86,9 @@

    Tabular Editor Learn

    Meet the team

    The Tabular Editor Team will be at the following conferences:

    From 955e81c44eced7ca88a19d233753a900999c545b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 14:56:58 +0000 Subject: [PATCH 2/8] New translations (Translated) --- localizedContent/es/.translation-status.json | 6 +- .../content/features/import-tables.partial.md | 156 +++++++--------- .../es/content/features/table-preview.md | 77 ++++---- .../features/views/data-refresh-view.md | 43 +++-- localizedContent/zh/.translation-status.json | 6 +- .../content/features/import-tables.partial.md | 170 +++++++----------- .../zh/content/features/table-preview.md | 73 ++++---- .../features/views/data-refresh-view.md | 40 ++--- 8 files changed, 244 insertions(+), 327 deletions(-) diff --git a/localizedContent/es/.translation-status.json b/localizedContent/es/.translation-status.json index 68decbe89..def984c0c 100644 --- a/localizedContent/es/.translation-status.json +++ b/localizedContent/es/.translation-status.json @@ -239,7 +239,7 @@ "status": "translated" }, "features/import-tables.partial.md": { - "sourceHash": "sha256:b416ea2b5d09ea7cc44d41ae621ca79a122104ad088f8c8bcd3c7d320ed88431", + "sourceHash": "sha256:25ccc3a686c79ee4f06828b13605e788c0b1cfa45c2d721bb2a812c16aec84a0", "status": "translated" }, "features/index.md": { @@ -315,7 +315,7 @@ "status": "translated" }, "features/table-preview.md": { - "sourceHash": "sha256:919ddbf231d1336651625f666704024ac80ce09b637d0c73ccb94aba492afc9e", + "sourceHash": "sha256:1fbe31e61f1b2a5e6a035952f236c49dd38a54efe934dfb0cbcaecb6bcc86a8f", "status": "translated" }, "features/te-cli/includes/te-cli-preview-notice.md": { @@ -403,7 +403,7 @@ "status": "translated" }, "features/views/data-refresh-view.md": { - "sourceHash": "sha256:6427f5aec9357680f68f96702ca980623b7f518f505ca0a179451aa63d701b15", + "sourceHash": "sha256:0249ef27e84da14ac1b42a614ca58df0ffb72d38b883b008d36a345d409ae839", "status": "translated" }, "features/views/diagram-basics.partial.md": { diff --git a/localizedContent/es/content/features/import-tables.partial.md b/localizedContent/es/content/features/import-tables.partial.md index 4885407e7..15779de00 100644 --- a/localizedContent/es/content/features/import-tables.partial.md +++ b/localizedContent/es/content/features/import-tables.partial.md @@ -16,169 +16,137 @@ applies_to: - edition: Enterprise full: true --- +El **Asistente para la importación de tablas** de Tabular Editor 3 crea un origen de datos en su modelo e importa tablas y vistas de orígenes relacionales, como una base de datos de SQL Server. -Tabular Editor 3 incluye un **Asistente de importación de tablas** que le ayuda a crear un origen de datos en su modelo e importar tablas o vistas desde orígenes de datos relacionales, como una base de datos de SQL Server. +![Asistente para la importación de tablas](~/content/assets/images/import-tables-wizard.png) -![Asistente para importar tablas](~/content/assets/images/import-tables-wizard.png) +## Tipos de orígenes de datos TOM -## Tipos de orígenes de datos de TOM +Los tipos de fuentes de datos disponibles en los metadatos del modelo dependen de su versión de Analysis Services: -Según su versión de Analysis Services, existen diferentes formas de definir orígenes de datos dentro de los metadatos del modelo: - -- **Proveedor (también llamado "Legacy")**: Disponible en todas las versiones de Analysis Services y en cualquier nivel de compatibilidad. Admite un conjunto limitado de orígenes, principalmente relacionales, a través de controladores OLE DB/ODBC. Las particiones suelen definirse mediante una instrucción SQL, que se ejecuta de forma nativa contra el origen. Las credenciales se administran en el objeto origen de datos del proveedor en el Tabular Object Model y se almacenan y cifran del lado del servidor. -- **Estructurado (también conocido como Power Query)**: Disponible desde SQL Server 2017 (nivel de compatibilidad 1400+). Admite una gama más amplia de orígenes de datos que los proveedores Legacy. Las particiones suelen definirse mediante expresiones M (Power Query). Las credenciales se administran en el objeto origen de datos estructurado en el Tabular Object Model y deben especificarse en cada despliegue en Analysis Services. -- **Orígenes de datos implícitos**: Se usan exclusivamente en los modelos semánticos de Power BI. No se crea ningún objeto de origen de datos explícito en el modelo. En su lugar, la expresión M (Power Query) define implícitamente el origen de datos. Las credenciales no se almacenan en el Tabular Object Model, sino que las gestiona Power BI Desktop o el servicio Power BI. +- **Proveedor (heredado)**: disponible en todas las versiones de Analysis Services y en todos los niveles de compatibilidad. Admite una gama limitada de orígenes, principalmente orígenes relacionales a través de controladores OLE DB y ODBC. Las particiones suelen ser instrucciones SQL que se ejecutan de forma nativa contra el origen. Las credenciales se gestionan en el objeto de origen de datos del proveedor en el Tabular Object Model y se almacenan y cifran en el lado del servidor. +- **Estructurado (Power Query)**: disponible a partir de SQL Server 2017 (nivel de compatibilidad 1400 y superior). Admite más orígenes que los orígenes de datos de proveedor. Las particiones suelen ser expresiones M (Power Query). Las credenciales se gestionan en el objeto de origen de datos estructurado del Tabular Object Model, y usted las especifica de nuevo en cada implementación en Analysis Services. +- **Implícita**: utilizada solo por los modelos semánticos de Power BI. El modelo no tiene ningún objeto de origen de datos, y la expresión M (Power Query) define el origen de datos. Power BI Desktop o el servicio Power BI gestionan las credenciales, y el Tabular Object Model no las almacena. > [!NOTE] -> El Asistente para importar tablas y la función Actualizar esquema de tabla de Tabular Editor 2.x solo admiten orígenes de datos Legacy con particiones SQL. En otras palabras, no hay compatibilidad con particiones de Power Query. Por este motivo, suelen recomendarse los orígenes de datos heredados, ya que proporcionan el mayor nivel de interoperabilidad entre las herramientas de desarrollo. +> El Asistente para importar tablas y la función Actualizar esquema de tabla en Tabular Editor 2.x solo admiten orígenes de datos heredados con particiones SQL, no particiones Power Query. Si los desarrolladores del modelo también utilizan Tabular Editor 2.x, utilice orígenes de datos heredados. ## Importación de nuevas tablas -Al importar tablas (menú Modelo > Importar tablas...), Tabular Editor te muestra las opciones mencionadas anteriormente (para crear un nuevo origen de datos), además de una lista de los orígenes de datos ya presentes en el modelo. Evita crear nuevos orígenes de datos si las tablas que quieres importar ya están disponibles en alguno de los orígenes de datos especificados en el modelo. +**Modelo > Importar tablas...** enumera los tipos de orígenes de datos anteriores para un nuevo origen de datos, seguidos de los orígenes de datos que ya están en el modelo. Si las tablas que quieres importar están disponibles a través de un origen de datos existente, selecciona ese origen de datos. > [!TIP] -> Por lo general, un modelo semántico se considera una caché semántica optimizada en memoria de un almacén de datos relacional. Por este motivo, lo ideal es que un modelo solo contenga un único origen de datos, que apunte a un almacén de datos basado en SQL o a un data mart. +> Un modelo semántico suele ser una caché en memoria de un almacén de datos relacional. Siempre que sea posible, asigne al modelo un único origen de datos que apunte al almacén de datos o al data mart basado en SQL. -## Crear un nuevo origen de datos +## Creación de una nueva Data source -Si necesitas crear un nuevo origen de datos, Tabular Editor te ofrece una lista de orígenes de datos compatibles: +Cuando creas una nueva Data source, el asistente muestra una lista de las fuentes que admite Tabular Editor 3: ![Crear nuevo origen](~/content/assets/images/create-new-source.png) -Ten en cuenta que, en particular, Analysis Services y Power BI admiten una gama mucho más amplia de orígenes de datos. Sin embargo, los que aparecen en la captura de pantalla anterior son aquellos a los que Tabular Editor puede conectarse para importar automáticamente los metadatos de la tabla (es decir, los nombres de las columnas y los tipos de datos). Para los orígenes de datos que no figuran en esta lista, Tabular Editor 3 aún puede [actualizar el esquema de la tabla mediante Analysis Services](#updating-table-schema-through-analysis-services). - -Actualmente, Tabular Editor 3 admite de forma nativa los siguientes orígenes de datos: +Analysis Services y Power BI admiten más orígenes que los que aparecen en esta lista. La lista contiene los orígenes a los que Tabular Editor se conecta directamente para importar los metadatos de las tablas (nombres de columnas y tipos de datos). Para otros orígenes, Tabular Editor 3 puede [actualizar el esquema de tabla a través de Analysis Services](#updating-table-schema-through-analysis-services). -- Bases de datos de SQL Server -- Bases de datos de Azure SQL -- Azure Synapse Analytics (SQL pool y SQL pool sin servidor) -- Oracle -- ODBC -- OLE DB -- Snowflake\* -- Dataflow de Power BI\* -- Databricks\* -- Lakehouse de Fabric -- Warehouse de Fabric -- Base de datos SQL de Fabric -- Base de datos reflejada de Fabric +Cada origen tiene su propio cuadro de diálogo de conexión y sus propias opciones de autenticación, documentadas en su página, incluidas las opciones que abren un inicio de sesión interactivo. Los orígenes marcados como *solo implícitos* solo están disponibles como orígenes de datos implícitos en los modelos de Power BI, no en SSAS ni en Azure Analysis Services. Consulte @connectivity para saber cómo se almacenan y se usan las credenciales. -\*=Estos orígenes de datos solo se admiten como orígenes de datos implícitos en los modelos de datos de Power BI. No están disponibles en SSAS / Azure AS. - -> [!TIP] -> Para obtener más información sobre cómo conectarse a Azure Databricks, consulte [Conectarse a Azure Databricks](xref:connecting-to-azure-databricks). +- Bases de datos de SQL Server, bases de datos de Azure SQL y Azure Synapse Analytics (pool de SQL y pool de SQL sin servidor): @connect-sql-server +- Oracle: @connect-oracle +- ODBC, incluidos PostgreSQL, MySQL, MariaDB e IBM Db2: @connect-odbc +- OLE DB: @connect-oledb +- Snowflake, solo implícito, incluida la autenticación con par de claves: @connect-snowflake +- Flujo de datos de Power BI, solo implícito: @connect-dataflows +- Databricks, solo implícito: @connect-databricks y el tutorial [Conexión a Azure Databricks](xref:connecting-to-azure-databricks) +- Microsoft Fabric Lakehouse, Microsoft Fabric Warehouse, Microsoft Fabric SQL Database y Microsoft Fabric Mirrored Database: @connect-onelake -Después de elegir uno de los orígenes de datos de la lista, Tabular Editor muestra un cuadro de diálogo con los detalles de conexión, que le permite especificar direcciones de servidor, credenciales, etc., específicos del origen de datos que desea crear. La configuración que especifique debe ser la que Tabular Editor use para establecer una conexión local con el origen. Estos ajustes se guardan en tus @user-options. +El cuadro de diálogo de conexión recoge la dirección del servidor, las credenciales y otras configuraciones del origen. Tabular Editor utiliza estos ajustes para su propia conexión con el origen y los guarda por usuario y por modelo en su archivo @user-options. Las credenciales se cifran con la API de protección de datos de Windows en su cuenta de usuario de Windows y nunca forman parte de los metadatos del modelo. ![Autenticación SQL](~/content/assets/images/sql-auth.png) -Si desea que Analysis Services use credenciales diferentes al conectarse, puede especificarlo editando las propiedades del origen de datos en el Tabular Object Model después de importar las tablas. - -## Conexión a un Data source - -Cada tipo de origen tiene su propio cuadro de diálogo de conexión y los métodos de autenticación disponibles varían entre ellos. La elección importa incluso después de la primera conexión, porque algunos métodos de autenticación requieren que haya alguien delante del teclado y, por tanto, no se pueden usar para una actualización programada. - -Consulta @connectivity para ver la lista completa y la página de tu origen: +Para proporcionar credenciales diferentes a Analysis Services, edite las propiedades del origen de datos en el Tabular Object Model después de importar las tablas. -- @connect-sql-server, que cubre Azure SQL y Synapse -- @connect-snowflake, que incluye la autenticación mediante par de claves para trabajo desatendido -- @connect-databricks -- @connect-oracle -- @connect-odbc, que también es la forma de conectarse a PostgreSQL, MySQL, MariaDB e IBM Db2 -- @connect-oledb -- @connect-onelake -- @connect-dataflows +## Elegir objetos para importar -Las credenciales se almacenan, por usuario y por modelo, en el archivo de [opciones de usuario](xref:user-options), se cifran con la clave de tu cuenta de Windows y nunca pasan a formar parte de los metadatos del modelo. - -## Seleccionar objetos para importar - -Una vez definido su origen de datos, tiene la opción de elegir tablas/vistas de una lista o especificar una consulta nativa que se ejecutará en el origen. +Después de definir el origen de datos, elige tablas y vistas de una lista o escribe una consulta nativa para ejecutarla contra el origen. ![Opciones de origen](~/content/assets/images/source-options.png) -Si selecciona la primera opción, Tabular Editor se conectará al origen y mostrará una lista de tablas y vistas que podrá previsualizar en la página siguiente: +Con la primera opción, Tabular Editor se conecta al origen y enumera sus tablas y vistas, que puede previsualizar en la página siguiente: ![Elegir objetos de origen](~/content/assets/images/choose-source-objects.png) -Puede importar varias tablas/vistas a la vez marcándolas en el lado izquierdo. Para cada tabla/vista, puede deseleccionar o seleccionar las columnas que desea importar. +Seleccione varias tablas y vistas de la izquierda para importarlas todas a la vez. Para cada una, selecciona o desmarca las columnas que quieres importar. > [!TIP] -> Si tiene el control del origen, recomendamos crear siempre una vista sobre las tablas que desee importar. En la vista, asegúrese de corregir cualquier nombre, ortografía, etc., que se vaya a usar en el modelo semántico, y elimine las columnas que el modelo semántico no necesite (columnas del sistema, marcas de tiempo, etc.). +> Si controla el origen, cree una vista sobre cada tabla que importe. En la vista, corrija los nombres y la ortografía que usa el modelo semántico y elimine las columnas que no necesita, como las columnas del sistema y las marcas de tiempo. > -> Luego, en el modelo, importe todas las columnas de esta vista (básicamente generando una instrucción `SELECT * FROM ...`). Esto facilita el mantenimiento, ya que solo necesita ejecutar una actualización de esquema en Tabular Editor para comprobar si se ha cambiado algo en el origen. +> En el modelo, importe todas las columnas de la vista, lo que genera una sentencia «SELECT * FROM ...». Cuando cambia el origen, **Actualizar esquema de tabla...** en Tabular Editor muestra qué ha cambiado. ![Importación avanzada](~/content/assets/images/advanced-import.png) -Si cambia el modo de vista previa a "Solo esquema" usando el menú desplegable de la esquina superior izquierda, puede cambiar el tipo de datos importado y el nombre de la columna de cada columna de origen. Esto puede ser útil, por ejemplo, si el origen usa valores de coma flotante, pero desea que los datos se importen como decimal fijo. +Cuando establece el modo de vista previa en **Solo esquema** en el menú desplegable de la esquina superior izquierda, puede cambiar el tipo de datos importado y el nombre de columna de cada columna de origen. Por ejemplo, importe valores de origen de punto flotante como decimales fijos. ![Confirmar selección](~/content/assets/images/confirm-selection.png) -En la última página, confirme su selección y elija qué tipo de particiones desea crear. Para los orígenes de datos del proveedor, el tipo de partición que se crea de forma predeterminada es `SQL`, mientras que para los orígenes de datos estructurados, es `M`. - -![Confirmar selección de Direct Lake](~/content/assets/images/confirm-selection-direct-lake.png) +En la última página, confirme su selección y elija el tipo de partición que desea crear. El valor predeterminado es «SQL» para los orígenes de datos de proveedor y «M» para los orígenes de datos estructurados. -Para los orígenes de datos de Fabric, en la última página hay una lista desplegable que le permite elegir si desea que su selección se cree como Direct Lake o modo de importación. +![Confirmar selección Direct Lake](~/content/assets/images/confirm-selection-direct-lake.png) -En este punto, debería ver sus tablas importadas con todas las columnas, los tipos de datos y las asignaciones de columnas de origen aplicadas: +En el caso de los orígenes de datos de Fabric, un menú desplegable en la última página determina si la selección se crea en modo Direct Lake o en modo Importación. -![Importación completa](~/content/assets/images/import-complete.png) +El asistente crea las tablas con todas las columnas, los tipos de datos y las asignaciones de columnas de origen. Las columnas se crean en el orden en que aparecen en la tabla de origen: -Las columnas se crean en el orden en que aparecen en la tabla de origen. Por lo tanto, importar la misma tabla dos veces produce el mismo orden de columnas en ambas ocasiones. +![Importación completada](~/content/assets/images/import-complete.png) > [!NOTE] -> Al crear tablas en modo **Import** a partir de un **Fabric Lakehouse** o un **Fabric Warehouse**, se lee el esquema de la tabla a través del punto de conexión de análisis SQL del Data source. Cuando no se puede determinar ningún punto de conexión y no se especifica ninguno en la configuración de importación, Tabular Editor muestra un error indicando lo que necesita: el punto de conexión SQL como servidor, o un id de Workspace y un id de elemento. No crea una tabla sin columnas. +> Las tablas importadas desde un **Microsoft Fabric Lakehouse** o un **Microsoft Fabric Warehouse** leen su esquema a través del punto de conexión de análisis SQL del origen de datos. Si Tabular Editor no puede determinar el punto de conexión y los ajustes de importación no especifican ninguno, un error indica lo que falta: el punto de conexión SQL como servidor, o un ID de área de trabajo y un ID de elemento. En ese caso, Tabular Editor no crea una tabla sin columnas. -## Actualización del esquema de tabla +## Actualizar esquema de tabla -Si se agregan o cambian columnas en el origen, o si ha modificado recientemente una expresión de partición o una consulta, puede usar la característica **Actualizar esquema de tabla** de Tabular Editor para actualizar los metadatos de las columnas en su modelo. +**Actualizar esquema de tabla...** actualiza los metadatos de las columnas de su modelo después de que se añadan o cambien columnas en el origen, o después de que usted modifique una expresión de partición o una consulta. -![Actualizar el esquema de la tabla](~/content/assets/images/update-table-schema.png) +![Actualizar esquema de tabla](~/content/assets/images/update-table-schema.png) -Esta opción del menú se puede invocar a nivel de modelo, así como en una colección de tablas o incluso en particiones individuales de una tabla. +Ejecútela en el modelo, en una selección de tablas o en particiones individuales. -Al usar esta opción, Tabular Editor se conectará a todos los Data sources pertinentes (solicitando credenciales cuando sea necesario) para determinar si es necesario agregar, modificar o eliminar columnas. Las columnas siguen el orden de la propia tabla de origen, por lo que una actualización del esquema no las reordena. +Tabular Editor se conecta a los orígenes de datos pertinentes, solicita las credenciales cuando es necesario y determina qué columnas hay que añadir, modificar o eliminar. Después de la actualización, las columnas mantienen el orden de las columnas del origen. > [!IMPORTANT] -> Si una columna que se importó anteriormente en su modelo semántico se ha quitado o se ha cambiado de nombre en el origen, debe actualizar el esquema de la tabla en su modelo semántico. De lo contrario, las operaciones de actualización de datos pueden fallar. +> Si una columna importada a tu modelo semántico se ha eliminado o se le ha cambiado el nombre en el origen, actualiza el esquema de tabla. Hasta que lo hagas, la actualización de datos fallará. -![Diálogo de comparación de esquema](~/content/assets/images/schema-compare-dialog.png) +![Cuadro de diálogo de comparación de esquema](~/content/assets/images/schema-compare-dialog.png) -En la captura de pantalla anterior, Tabular Editor detectó dos columnas nuevas en el origen que todavía no se han importado (`Color` y `Material`) y marcó dos columnas existentes para eliminarlas (`Colour` y `Substance Type`) porque sus nombres ya no coinciden con ninguna columna del origen. La detección de cambios de nombre de columnas solo funciona con cambios simples; en este caso, los nombres difieren lo suficiente como para que Tabular Editor indique una eliminación y una adición en lugar de un cambio de nombre: en realidad, `Colour` se ha cambiado a `Color` en el origen, y `Substance Type` a `Material`. +En la captura de pantalla anterior, Tabular Editor detectó dos nuevas columnas de origen que aún no se han importado («Color» y «Material») y marcó dos columnas existentes para su eliminación («Colour» y «Substance Type»), porque sus nombres ya no coinciden con ninguna columna de origen. La detección de cambios de nombre solo funciona para cambios simples. En este caso, «Colour» se ha renombrado como «Color» y «Substance Type» como «Material» en el origen, pero los nombres difieren lo suficiente como para que Tabular Editor considere cada cambio de nombre como una eliminación y una adición. -Para evitar que se rompan las fórmulas DAX existentes que dependen de la columna `[Colour]`, puedes mantener pulsada la tecla Ctrl y hacer clic en las filas `Color` (importar) y `Colour` (eliminar) del cuadro de diálogo Cambios de esquema y, a continuación, hacer clic con el botón derecho para combinar la eliminación y la adición de la columna en una única operación de actualización de SourceColumn: +Mantenga pulsada la tecla **Ctrl**, seleccione las filas `Color` (importar) y `Colour` (eliminar) en el cuadro de diálogo Cambio de esquema y, a continuación, haga clic con el botón derecho para combinar la eliminación y la adición en una sola actualización de SourceColumn. Las fórmulas DAX existentes que hacen referencia a `[Colour]` siguen funcionando: ![Combinar actualización de SourceColumn](~/content/assets/images/combine-sourcecolumn-update.png) -Si no quieres que el cambio de nombre se propague a la columna importada (y solo quieres actualizar la propiedad SourceColumn para reflejar el nombre cambiado en el origen de datos), puedes desmarcar la operación de actualización `Name` en el menú desplegable: +Si desea actualizar solo la propiedad `SourceColumn` y conservar el nombre de la columna importada, desmarque la operación de actualización `Name` en el menú desplegable: ![Deseleccionar nombre](~/content/assets/images/deselect-name.png) -## Actualizar el esquema de la tabla mediante Analysis Services +## Actualización del esquema de tabla a través de Analysis Services -De forma predeterminada, Tabular Editor 3 intenta conectarse directamente al origen de datos para actualizar el esquema de la tabla importada. Naturalmente, esto solo funciona cuando el origen de datos es compatible con Tabular Editor 3. Si necesitas actualizar el esquema de una tabla importada desde un origen de datos que no es compatible con Tabular Editor 3, puedes habilitar la opción **Usar Analysis Services para la detección de cambios** en **Herramientas > Preferencias > Comparación de esquema**. Esto también se aplica cuando la expresión M de una partición o una expresión compartida es demasiado compleja para la función integrada de detección de esquema de Tabular Editor 3. Por ejemplo, la detección de esquema integrada no admite determinadas funciones M. +De forma predeterminada, Tabular Editor 3 se conecta directamente al origen de datos para actualizar el esquema de la tabla importada, lo que solo funciona con los orígenes que admite Tabular Editor 3. Habilite **Usar Analysis Services para detección de cambios** en **Herramientas > Preferencias > Comparación de esquemas** para actualizar el esquema de una tabla de un origen no compatible. La opción también cubre las particiones y las expresiones compartidas cuyo M sea demasiado complejo para la detección de esquemas integrada, por ejemplo, las expresiones que utilizan funciones M que no admite. -![Actualizar el esquema de la tabla mediante As](~/content/assets/images/update-table-schema-through-as.png) +![Actualización del esquema de tabla a través de AS](~/content/assets/images/update-table-schema-through-as.png) -Cuando esta opción está habilitada y Tabular Editor 3 está conectado a Analysis Services o al punto de conexión XMLA de Power BI, puedes actualizar el esquema de tablas importadas desde **cualquier** origen de datos compatible con Analysis Services o Power BI. +Cuando la opción está habilitada y Tabular Editor 3 está conectado a Analysis Services o al punto de conexión XMLA de Power BI, puedes actualizar el esquema de las tablas importadas desde **cualquier** origen de datos compatible con Analysis Services o Power BI. -> [!NOTE] -> La opción **Usar Analysis Services para la detección de cambios** solo funciona mientras Tabular Editor 3 está conectado a Analysis Services o al punto de conexión XMLA de Power BI. Por este motivo, recomendamos que los desarrolladores usen siempre el [modo del área de trabajo](xref:workspace-mode) al desarrollar modelos. - -Cuando la opción **Usar Analysis Services para la detección de cambios** está habilitada, Tabular Editor 3 utilizará la siguiente técnica cuando se solicite una actualización del esquema: +> [!TIP] +> El [modo de espacio de trabajo](xref:workspace-mode) mantiene Tabular Editor 3 conectado a Analysis Services o al punto de conexión XMLA de Power BI mientras realiza el desarrollo. -1. Se crea una nueva transacción en la instancia de Analysis Services a la que se está conectado -2. Se agrega una nueva tabla temporal al modelo. Esta tabla usa una expresión de partición de Power Query que devuelve el esquema de la expresión original, para la que se solicitó una actualización del esquema. Esto se hace mediante la [función M `Table.Schema`](https://docs.microsoft.com/powerquery-m/table-schema). -3. La tabla temporal se actualiza mediante Analysis Services. Analysis Services se encarga de conectarse al origen de datos para obtener el esquema actualizado. -4. Tabular Editor 3 consulta el contenido de la tabla temporal para obtener los metadatos del esquema. -5. La transacción se revierte, dejando la base de datos de Analysis Services o el modelo semántico de Power BI en el estado original en el que se encontraba antes del paso 1. -6. Tabular Editor 3 muestra el cuadro de diálogo "Aplicar cambios de esquema" como se muestra arriba, por si hubiera cambios en el esquema. +Con la opción habilitada, una actualización de esquema ejecuta estos pasos: -Con esta técnica, Tabular Editor 3 permite importar y actualizar tablas desde orígenes de datos que, de otro modo, no son compatibles, independientemente de la complejidad y del uso de funciones en las consultas M que hay detrás de las tablas. +1. Tabular Editor 3 inicia una transacción con la instancia de Analysis Services conectada. +2. Añade una tabla temporal al modelo, con una expresión de partición de Power Query que devuelve el esquema de la expresión original a través de la [función M [`Table.Schema`](https://docs.microsoft.com/powerquery-m/table-schema). +3. Analysis Services actualiza la tabla temporal, conectándose al origen de datos para recuperar el esquema. +4. Tabular Editor 3 consulta la tabla temporal para obtener los metadatos del esquema. +5. Tabular Editor 3 revierte la transacción, lo que devuelve la base de datos de Analysis Services o el modelo semántico de Power BI a su estado anterior al paso 1. +6. Si el esquema ha cambiado, aparecerá el cuadro de diálogo **Aplicar cambios de esquema** que se muestra arriba. > [!NOTE] -> Si sus expresiones M combinan datos de varios orígenes, por ejemplo, mediante la función M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin), es posible que tenga que cambiar el [**Nivel de privacidad**](https://powerbi.microsoft.com/en-us/blog/privacy-levels-for-cloud-data-sources/) de "Privado" a "Organizacional" en el modelo semántico del servicio de Power BI. De lo contrario, es posible que vea un error que indique que ` hace referencia a otras consultas o pasos, por lo que es posible que no pueda acceder directamente a un origen de datos. Por favor, vuelva a crear esta combinación de datos`. Este error también puede producirse aunque **Usar Analysis Services para la detección de cambios** no esté habilitado, ya que Tabular Editor 3 volverá automáticamente a este mecanismo de detección cuando la expresión M sea demasiado compleja para la detección de esquema integrada de Tabular Editor 3. +> Si sus expresiones M combinan datos de varios orígenes, por ejemplo, a través de la función M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin), es posible que deba cambiar el [**Nivel de privacidad**](https://powerbi.microsoft.com/blog/privacy-levels-for-cloud-data-sources/) de «Privado» a «Organizacional» en el modelo semántico del servicio Power BI. De lo contrario, es posible que vea un error que indique que « hace referencia a otras consultas o pasos, por lo que es posible que no pueda acceder directamente a un origen de datos. Vuelva a crear esta combinación de datos.». Este error también puede producirse incluso si no está habilitada la opción **Usar Analysis Services para detección de cambios**, ya que Tabular Editor 3 recurrirá automáticamente a este mecanismo de detección cuando la expresión M sea demasiado compleja para la detección de esquemas integrada de Tabular Editor 3. ### Importación de nuevas tablas a través de Analysis Services -Para importar una tabla desde un origen de datos que, de otro modo, no es compatible, puede copiar una tabla existente de ese origen de datos, modificar la expresión M en la consulta de la partición de la tabla copiada y, a continuación, guardar los cambios en la base de datos del espacio de trabajo y actualizar el esquema de la tabla, como se ha descrito anteriormente. +Para importar una tabla desde un origen que el asistente no admite, copie una tabla existente de ese origen y modifique la expresión M de la partición de la copia. Guarde los cambios en la base de datos del área de trabajo y, a continuación, actualice el esquema de tabla como se ha descrito anteriormente. diff --git a/localizedContent/es/content/features/table-preview.md b/localizedContent/es/content/features/table-preview.md index 22cbfd182..c82cf2277 100644 --- a/localizedContent/es/content/features/table-preview.md +++ b/localizedContent/es/content/features/table-preview.md @@ -2,7 +2,7 @@ uid: table-preview title: Vista previa de tabla author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -16,80 +16,73 @@ applies_to: - edition: Enterprise full: true --- - # Vista previa de tabla -Una **Vista previa de tabla** muestra el contenido de una tabla, fila por fila, sin escribir una consulta. Haz clic con el botón derecho en una tabla del @tom-explorer-view y selecciona **Previsualizar datos**, o selecciona la tabla y pulsa **Ctrl+R**. - -![Vista previa de datos](~/content/assets/images/preview-data-big.png) +Una **vista previa de tabla** muestra las filas de una tabla sin necesidad de escribir una consulta. Haga clic con el botón derecho en una tabla de la @tom-explorer-view y elija **Vista previa de los datos**, o seleccione la tabla y pulse **Ctrl+R**. Las vistas previas se abren como documentos, por lo que puede abrir varias a la vez y anclarlas, hacerlas flotantes o moverlas a otro monitor. -Puedes abrir una vista previa de varias tablas a la vez y organizarlas como quieras. Cada vista previa es un documento normal, así que puedes acoplarla, hacerla flotante o moverla a un segundo monitor. +![Vista previa de tabla de la tabla Internet Sales con el menú desplegable de filtro de una columna de fecha abierto](~/content/assets/images/preview-data-big.png) -## Cómo interpretar la cuadrícula +## Lectura de la cuadrícula -Tabular Editor ejecuta una Consulta DAX que devuelve solo tantas filas como puede mostrar la vista y, a medida que te desplazas, va cargando más. Hasta dónde puedes desplazarte depende del modo de almacenamiento y del motor: +Tabular Editor ejecuta una consulta DAX que devuelve las filas que la vista puede mostrar y carga más filas a medida que te desplazas. El rango de desplazamiento depende del modo de almacenamiento y del motor: -| Tabla | Desplazamiento | -| ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| Importación, en un motor que admite [`WINDOW`](https://dax.guide/window) y en el que la tabla tiene una clave primaria | Toda la tabla. La paginación usa `WINDOW` sobre la clave primaria | -| Importación, sin compatibilidad con `WINDOW` o sin una clave primaria | Solo las primeras filas; la vista previa indica que el desplazamiento está desactivado | -| DirectQuery | Solo las primeras filas, hasta el valor de la preferencia **Límite de filas**; unos mensajes informativos explican por qué | +- Una tabla importada con una clave principal, en un motor que admita [`WINDOW`](https://dax.guide/window), se desplaza por toda la tabla. La paginación utiliza `WINDOW` con respecto a la clave primaria. +- Una tabla importada sin clave principal, o en un motor sin compatibilidad con `WINDOW`, muestra solo las primeras filas, y la vista previa indica que el desplazamiento está deshabilitado. +- Una tabla DirectQuery muestra solo las primeras filas, hasta la preferencia **Límite de filas**, con un mensaje que indica que la exploración paginada no está disponible para las tablas DirectQuery. Filtra la cuadrícula o escribe una consulta DAX para ver filas específicas. -Los metadatos de la vista previa se almacenan en caché durante la sesión, por lo que al volver a abrir una vista previa no se vuelve a consultar el servidor. Usa **Actualizar vista previa** para volver a leerla si, por ejemplo, el modelo se ha procesado fuera de Tabular Editor. +Los metadatos de la vista previa se almacenan en caché para la sesión, y al volver a abrir una vista previa no se consulta de nuevo al servidor. Si el modelo se procesó fuera de Tabular Editor, seleccione **Actualizar vista previa**. -Si una columna calculada está en un estado no válido, sus celdas muestran _(Calculation needed)_. Usa **Calcular tabla** en la barra de herramientas o **Recalcular tabla...** en el menú contextual de la columna para ponerla al día. +Si una columna calculada está en un estado no válido, sus celdas muestran el texto «(se necesita cálculo)». Seleccione **Calcular tabla** en la barra de herramientas o **Recalcular tabla...** en el menú contextual del encabezado de la columna para actualizarla. -![Recalcular tabla](~/content/assets/images/recalculate-table.png) +![Menú contextual del encabezado de columna en la vista previa de tabla con la opción «Recalcular tabla» seleccionada, encima de las celdas que indican que es necesario realizar un cálculo](~/content/assets/images/recalculate-table.png) ## Orden de las columnas -De forma predeterminada, las columnas aparecen en el orden en que el motor las devuelve, que se corresponde aproximadamente con el orden interno de las columnas y a menudo parece arbitrario. Marca _Ordenar alfabéticamente las columnas de la Vista previa de tabla_ en @preferencias para que sigan el mismo orden que usa el Explorador TOM. +De forma predeterminada, las columnas aparecen en el orden en que el motor las devuelve. **Ordenar las columnas de la vista previa de la tabla alfabéticamente** en @preferences las ordena por nombre, como lo hace el Explorador TOM. -## Encontrar una columna en una tabla ancha +## Buscar una columna en una tabla ancha -Al seleccionar una columna en @tom-explorer-view, la vista previa se desplaza hasta esa columna y la resalta. Esto está activado de forma predeterminada y puedes desactivarlo para una sola vista previa con **Seguir la columna seleccionada** en la barra de herramientas, o para todas las vistas previas en @preferencias. +De forma predeterminada, al seleccionar una columna en la @tom-explorer-view, la vista previa se desplaza hasta esa columna y la resalta. Desactive **Seguir la columna seleccionada** en la barra de herramientas para desactivar esta función en una vista previa, o **Seguir la columna seleccionada en el Explorador TOM** en @preferences para todas las vistas previas. ## Barra de herramientas -La barra de herramientas de **Vista previa de tabla** y el menú **Vista previa de tabla** correspondiente incluyen los mismos comandos: +La barra de herramientas **Vista previa de tabla** y el menú **Vista previa de tabla** tienen los mismos comandos: -| Comando | Qué hace | -| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Suplantación...** | Elige la identidad con la que se ejecuta la consulta de vista previa para ver los datos que vería un usuario concreto | -| **Actualizar vista previa** | Vuelve a leer la tabla y descarta los metadatos en caché | -| **Actualización automática** | Actualiza esta vista previa automáticamente cada vez que se hagan cambios en el modelo implementado. El valor predeterminado para las nuevas vistas previas proviene de @preferencias | -| **Seguir la columna seleccionada** | Sigue la selección de columnas del Explorador TOM, como se describe más arriba | -| **Calcular tabla** | Vuelve a calcular las columnas calculadas de la tabla | +| Comando | Qué hace | +|---|---| +| **Simulación de usuario...** | Establece la identidad con la que se ejecuta la consulta de vista previa, para mostrar los datos que ve un usuario concreto. | +| **Actualizar vista previa** | Vuelve a leer la tabla y descarta los metadatos almacenados en caché. | +| **Actualización automática** | Actualiza esta vista previa automáticamente cuando cambia el modelo implementado. El valor predeterminado para las nuevas vistas previas se establece en @preferences. | +| **Seguir columna seleccionada** | Sigue la selección de columnas en el Explorador TOM. Consulte [Buscar una columna en una tabla ancha](#finding-a-column-in-a-wide-table). | +| **Calcular tabla** | Vuelve a calcular las columnas calculadas de la tabla. | ## Menú contextual -Además de los comandos estándar de la cuadrícula (ordenación, filtrado, mejor ajuste, selector de columnas), la cuadrícula de vista previa añade: - -| Comando | Dónde aparece | Qué hace | -| ----------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| **Bloquear el ancho de las columnas** | Encabezado de columna | Evita que la cuadrícula redimensione las columnas mientras te desplazas y se cargan más filas al paginar | -| **Editar expresión...** | Encabezado de una columna calculada | Abre la expresión DAX de esa columna en el **Editor de expresiones** | -| **Recalcular tabla calculada...** | Encabezado de una columna calculada que no está actualizada | Recalcula la tabla | -| **Mostrar la Consulta DAX real...** | En cualquier lugar de la cuadrícula | Abre un documento nuevo y editable de [Consulta DAX](xref:dax-query) que contiene la consulta que hay detrás de la vista previa | +Además de los comandos estándar de la cuadrícula (ordenar, filtrar, ajustar al contenido, selector de columnas), la cuadrícula de vista previa dispone de estos comandos: -### Mostrar la Consulta DAX real +| Comando | Dónde aparece | Qué hace | +|---|---|---| +| **Bloquear anchos de columna** | Encabezado de columna | Evita que la cuadrícula cambie el tamaño de las columnas a medida que se desplaza y carga más filas. | +| **Editar expresión...** | Encabezado de una columna calculada | Abre la expresión DAX de la columna en el **Editor de expresiones**. | +| **Recalcular tabla...** | Encabezado de una columna calculada que no está actualizada | Recalcula la tabla. | +| **Mostrar consulta DAX real...** | En cualquier parte de la cuadrícula | Abre un nuevo documento [consulta DAX](xref:dax-query) editable con la consulta que hay detrás de la vista previa. | -**Mostrar la Consulta DAX real...** toma la consulta que ejecuta la vista previa, incluidos los filtros y la ordenación que has aplicado en la cuadrícula, la formatea y la abre como un nuevo documento de Consulta DAX. No se ejecuta automáticamente; edítala y ejecútala cuando quieras. +### Mostrar consulta DAX real -Los envoltorios de paginación se omiten deliberadamente, de modo que obtienes la consulta sobre los datos que estás viendo, en lugar de la consulta sobre una sola pantalla. +**Mostrar consulta DAX real...** formatea la consulta que ejecuta la vista previa, incluidos el filtro y la ordenación aplicados en la cuadrícula, y la abre como un nuevo documento de consulta DAX sin ejecutarla. La consulta no tiene lógica de paginación y devuelve todas las filas filtradas. > [!NOTE] -> La vista **Consulta DAX** tiene un comando con el mismo nombre en su cuadrícula de resultados, pero hace algo distinto: muestra la última consulta ejecutada en una ventana de solo lectura en lugar de abrir un documento nuevo. +> La vista **Consulta DAX** tiene un comando con el mismo nombre en su cuadrícula de resultados, que muestra la última consulta ejecutada en una ventana de solo lectura. ## Filtrado -Cada encabezado de columna incluye un menú desplegable de filtro con los valores distintos de la columna. En una columna con muchos valores distintos, la lista está limitada por _Máx. valores en el menú desplegable de filtro_ en @Preferencias; el valor predeterminado es 5.000. Los valores que superan ese límite no se muestran en la lista y no se pueden marcar directamente. Aumenta el límite si los necesitas, teniendo en cuenta que al abrir el menú desplegable se ejecuta una consulta más costosa. +Cada encabezado de columna tiene un menú desplegable de filtros que enumera los valores distintos de la columna, hasta el límite establecido por **Máx. valores en el menú desplegable de filtros** en @preferences (5000 de forma predeterminada). Los valores que superan el límite no se muestran, y aumentar el límite hace que la consulta del menú desplegable sea más lenta. ## Preferencias -Todas las opciones mencionadas en esta página se encuentran en **Herramientas > Preferencias > Exploración de datos > Vista previa de tabla**. Consulte @preferencias para ver la lista completa. +Los ajustes de esta página se encuentran en **Herramientas > Preferencias > Exploración de datos > Vista previa de tabla**. Consulta @preferences para ver la lista completa. -## Pasos a seguir +## Próximos pasos - @dax-query - @pivot-grid diff --git a/localizedContent/es/content/features/views/data-refresh-view.md b/localizedContent/es/content/features/views/data-refresh-view.md index f78ec755f..a748d7a79 100644 --- a/localizedContent/es/content/features/views/data-refresh-view.md +++ b/localizedContent/es/content/features/views/data-refresh-view.md @@ -1,4 +1,4 @@ ---- +--- uid: data-refresh-view title: Vista de actualización de datos author: Daniel Otykier @@ -16,40 +16,37 @@ applies_to: - edition: Enterprise full: true --- - # Vista de actualización de datos -La vista de Actualización de datos le permite investigar en detalle cómo se están actualizando sus datos en el servidor. -Aparecerá una nueva actualización activa cuando se inicie una actualización desde el Explorador TOM. +La vista **Actualización de datos** muestra el progreso de las operaciones de actualización en el servidor. Una actualización que inicie desde el Explorador TOM aparece en la vista como una actualización activa.
    - Data Refresh View
    Figura 1: Vista de actualización de datos en Tabular Editor. Se puede iniciar una nueva actualización haciendo clic con el botón derecho en una tabla y seleccionando Actualizar
    + Vista de actualización de datos +
    Figura 1: Vista de actualización de datos en Tabular Editor. Inicia una actualización haciendo clic con el botón derecho en una tabla y seleccionando «Actualizar».
    -Una nueva actualización se ejecutará en segundo plano para que pueda seguir creando su conjunto de datos, y Tabular Editor le avisará mediante una ventana emergente si la actualización falla. - -## Columnas de la vista de actualización de datos +Las actualizaciones se ejecutan en segundo plano mientras sigues editando el modelo, y aparece un mensaje de error si una actualización falla. -La vista de actualización de datos muestra la siguiente información para cada operación de actualización: +## Columnas de la vista Actualización de datos -- **Objeto**: El nombre del objeto del modelo que se está actualizando (tabla, partición o modelo) -- **Descripción**: Detalles adicionales sobre la operación de actualización y su estado actual -- **Progreso**: Muestra el número de filas que se han importado hasta el momento. -- **Hora de inicio**: La fecha y la hora en que comenzó la operación de actualización. Esto es útil para llevar un registro de cuándo se iniciaron las operaciones, especialmente cuando hay varias actualizaciones en cola -- **Duración**: El tiempo transcurrido desde que se inició la operación de actualización, actualizado en tiempo real para las operaciones activas +Cada operación de actualización tiene estas columnas: -### Ordenar operaciones de actualización +- **Objeto**: el objeto del modelo que se está actualizando (tabla, partición o modelo). +- **Descripción**: detalles sobre la operación de actualización y su estado actual. +- **Progreso**: el número de filas importadas hasta el momento. +- **Hora de inicio**: la fecha y hora en que comenzó la operación. +- **Duración**: el tiempo transcurrido desde el inicio de la operación, actualizado en tiempo real para las operaciones activas. -Puedes ordenar las operaciones de actualización haciendo clic en el encabezado de cualquier columna. Esto es especialmente útil para: +### Ordenación de las operaciones de actualización -- Hacer clic en la columna **Hora de inicio** para ordenar las operaciones de actualización de forma cronológica; las más recientes aparecen primero (orden descendente) o al final (orden ascendente) -- Ordenar por **Duración** para identificar operaciones de larga duración -- Ordenar por **Objeto** para agrupar las actualizaciones por nombre de tabla o partición +Haga clic en un encabezado de columna para ordenar por esa columna: una vez para ordenar de forma ascendente y otra vez para ordenar de forma descendente. Por ejemplo: -Haz clic una vez en el encabezado de una columna para ordenar de forma ascendente, y vuelve a hacer clic para ordenar de forma descendente. Esto facilita identificar las últimas operaciones de actualización cuando trabajas con varias colas de actualización. +- Ordenar por **Hora de inicio**, en orden descendente, para mostrar primero las operaciones de actualización más recientes. +- Ordene por **Duración** para encontrar las operaciones de larga duración. +- Ordene por **Objeto** para agrupar las actualizaciones por nombre de tabla o de partición. -> [!NOTA] -> Todos los mensajes y las duraciones que se muestran en la ventana de actualización de datos son solo estimaciones. Tabular Editor escucha los [eventos de seguimiento de SSAS](https://learn.microsoft.com/analysis-services/trace-events/analysis-services-trace-events?view=asallproducts-allversions) durante el procesamiento. SSAS no garantiza que envíe todos los mensajes de seguimiento al cliente (por ejemplo, puede limitar las notificaciones de eventos de seguimiento durante picos de consumo de CPU/memoria). +> [!NOTE] +> Todos los mensajes y las duraciones que se muestran en la ventana «Actualización de datos» son solo estimaciones. Tabular Editor escucha los [eventos de seguimiento de SSAS](https://learn.microsoft.com/analysis-services/trace-events/analysis-services-trace-events?view=asallproducts-allversions) durante el procesamiento. No se garantiza que SSAS envíe todos los mensajes de seguimiento al cliente (por ejemplo, puede limitar las notificaciones de eventos de seguimiento durante los momentos de máximo consumo de CPU/memoria). > [!TIP] -> Si necesita información precisa y fiable sobre el progreso y la duración de la actualización, debe conectar [SQL Server Profiler](https://learn.microsoft.com/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver16) a su instancia de SSAS y recopilar la información manualmente durante el procesamiento. \ No newline at end of file +> Si necesita información precisa y fiable sobre el progreso y la duración de la actualización, debe conectar [SQL Server Profiler](https://learn.microsoft.com/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver16) a su instancia de SSAS y recopilar la información manualmente durante el procesamiento. diff --git a/localizedContent/zh/.translation-status.json b/localizedContent/zh/.translation-status.json index 746818f25..fb79b55ab 100644 --- a/localizedContent/zh/.translation-status.json +++ b/localizedContent/zh/.translation-status.json @@ -239,7 +239,7 @@ "status": "translated" }, "features/import-tables.partial.md": { - "sourceHash": "sha256:b416ea2b5d09ea7cc44d41ae621ca79a122104ad088f8c8bcd3c7d320ed88431", + "sourceHash": "sha256:25ccc3a686c79ee4f06828b13605e788c0b1cfa45c2d721bb2a812c16aec84a0", "status": "translated" }, "features/index.md": { @@ -315,7 +315,7 @@ "status": "translated" }, "features/table-preview.md": { - "sourceHash": "sha256:919ddbf231d1336651625f666704024ac80ce09b637d0c73ccb94aba492afc9e", + "sourceHash": "sha256:1fbe31e61f1b2a5e6a035952f236c49dd38a54efe934dfb0cbcaecb6bcc86a8f", "status": "translated" }, "features/te-cli/includes/te-cli-preview-notice.md": { @@ -403,7 +403,7 @@ "status": "translated" }, "features/views/data-refresh-view.md": { - "sourceHash": "sha256:6427f5aec9357680f68f96702ca980623b7f518f505ca0a179451aa63d701b15", + "sourceHash": "sha256:0249ef27e84da14ac1b42a614ca58df0ffb72d38b883b008d36a345d409ae839", "status": "translated" }, "features/views/diagram-basics.partial.md": { diff --git a/localizedContent/zh/content/features/import-tables.partial.md b/localizedContent/zh/content/features/import-tables.partial.md index 91ec3e4a6..c6911a0e1 100644 --- a/localizedContent/zh/content/features/import-tables.partial.md +++ b/localizedContent/zh/content/features/import-tables.partial.md @@ -1,6 +1,6 @@ --- uid: import-tables -title: 导入表 +title: 导入表格 author: Morten Lønskov updated: 2026-10-12 applies_to: @@ -16,169 +16,137 @@ applies_to: - edition: Enterprise full: true --- - -Tabular Editor 3 内置 **表导入向导**,可帮助你在模型中创建数据源,并从 SQL Server 数据库等关系型数据源导入表/视图。 +Tabular Editor 3 中的**表导入向导**会在您的模型中创建数据源,并从 SQL Server 数据库等关系源导入表和视图。 ![表导入向导](~/content/assets/images/import-tables-wizard.png) -## TOM 数据源类型 +## TOM 数据源的类型 -根据你使用的 Analysis Services 版本,在模型元数据中定义数据源的方式也不同: +模型元数据中可用的数据源类型取决于您的 Analysis Services 版本: -- **提供程序(又称旧版)**:在所有 Analysis Services 版本和所有兼容级别中均可用。支持的数据源范围有限,主要通过 OLE DB/ODBC 驱动程序访问关系型数据源。分区通常使用 SQL 语句定义,并以原生方式在数据源上执行。凭据在 Tabular Object Model 的 Provider数据源对象中进行管理,并在服务器端存储和加密。 -- **结构化(又称 Power Query)**:自 SQL Server 2017 起可用(兼容级别 1400+)。支持的数据源范围比旧版提供程序更广。分区通常使用 M(Power Query)表达式定义。凭据在 Tabular Object Model 的 Structured数据源对象中进行管理,并且每次部署到 Analysis Services 时都需要指定。 -- **隐式数据源**:仅用于 Power BI 语义模型。模型中不会创建显式的数据源对象。取而代之的是,M(Power Query)表达式会隐式定义数据源。凭据不存储在 Tabular Object Model 中,而是由 Power BI Desktop 或 Power BI 服务进行管理。 +- **提供程序(旧版)**:在每个版本的 Analysis Services 和每个兼容级别中均可用。支持有限的源范围,主要通过 OLE DB 和 ODBC 驱动程序支持关系源。分区通常是对源本机执行的 SQL 语句。凭据在 Tabular Object Model 的提供程序数据源对象中进行管理,并在服务器端进行存储和加密。 +- **结构化(Power Query)**:自 SQL Server 2017 起可用(兼容级别为 1400 及以上)。支持比提供程序数据源更多的源。分区通常是 M(Power Query)表达式。凭据在 Tabular Object Model 的 Structured 数据源对象中进行管理,您在每次部署到 Analysis Services 时都需要再次指定凭据。 +- **隐式**:仅供 Power BI 语义模型使用。模型没有数据源对象,M (Power Query) 表达式定义了数据源。Power BI Desktop 或 Power BI 服务管理凭据,而 Tabular Object Model 不存储凭据。 > [!NOTE] -> Tabular Editor 2.x 的“表导入向导”和“更新表架构”功能仅支持包含 SQL 分区的旧版数据源。换句话说,不支持 Power Query 分区。因此,通常建议使用 Legacy 旧版数据源,因为它们能在各类开发者工具之间实现最高程度的互操作性。 +> Tabular Editor 2.x 中的“表导入向导”和“更新表架构”仅支持具有 SQL 分区的旧版数据源,不支持 Power Query 分区。如果模型的开发人员也使用 Tabular Editor 2.x,请使用旧版数据源。 -## 导入新表 +## 导入新表格 -在导入表时(模型菜单 > 导入表...),Tabular Editor 会显示上面提到的选项(用于创建新的数据源),以及模型中已存在的数据源列表。如果要导入的表在模型中已指定的某个数据源中可用,请避免创建新的数据源。 +**模型 > 导入表格…**列出了新数据源的上述数据源类型,然后是模型中已存在的数据源。如果可以通过现有数据源使用要导入的表,请选择该数据源。 > [!TIP] -> 语义模型通常被视为关系型 Warehouse 中经过优化、驻留内存的语义缓存。因此,理想情况下,一个模型最好只包含一个数据源,这个数据源指向基于 SQL 的 Warehouse 或数据集市。 +> 语义模型通常是关系数据仓库的内存缓存。在可能的情况下,为模型提供一个指向基于 SQL 的数据仓库或数据超市的单个数据源。 ## 创建新的数据源 -如果你需要创建新的数据源,Tabular Editor 会提供一份受支持的数据源列表: - -![创建新数据源](~/content/assets/images/create-new-source.png) - -请注意,尤其是 Power BI,Analysis Services 和 Power BI 支持的数据源范围要广得多;不过,上面截图中列出的数据源,才是 Tabular Editor 为了自动导入表元数据(即列名和数据类型)而能够连接的数据源。对于不在此列表中的数据源,Tabular Editor 3 仍然可以[利用 Analysis Services 更新表架构](#updating-table-schema-through-analysis-services)。 - -目前,Tabular Editor 3 原生支持以下数据源: +当你创建新的数据源时,向导会列出 Tabular Editor 3 支持的数据源: -- SQL Server 数据库 -- Azure SQL 数据库 -- Azure Synapse Analytics(SQL 池和无服务器 SQL 池) -- Oracle -- ODBC -- OLE DB -- Snowflake\* -- Power BI Dataflow\* -- Databricks\* -- Fabric Lakehouse -- Fabric Warehouse -- Fabric SQL 数据库 -- Fabric 镜像数据库 - -\*=这些数据源仅在 Power BI Data model 中作为隐式数据源受到支持。它们在 SSAS / Azure AS 中不可用。 - -> [!TIP] -> 想了解如何连接到 Azure Databricks 的更多信息,可以看看 [连接到 Azure Databricks](xref:connecting-to-azure-databricks)。 +![创建新源](~/content/assets/images/create-new-source.png) -从列表中选择某个数据源后,Tabular Editor 会显示一个连接详细信息对话框,让你指定服务器地址、凭据等与要创建的数据源相关的设置。你指定的设置应该是 Tabular Editor 用来建立到该源的本地连接时要用的设置。这些设置会保存在你的 @user-options 中。 +Analysis Services 和 Power BI 支持的源比此列表中的更多。该列表包含 Tabular Editor 直接连接以导入表元数据(列名和数据类型)的源。对于其他源,Tabular Editor 3 可以[通过 Analysis Services 更新表格架构](#updating-table-schema-through-analysis-services)。 -![Sql Auth](~/content/assets/images/sql-auth.png) +每个源都有自己的连接对话框和身份验证选项,这些内容在其页面上有记录,包括哪些选项会打开交互式登录。标记为*仅隐式*的数据源仅在 Power BI 模型中可用作隐式数据源,而不在 SSAS 或 Azure AS 中可用。有关凭据的存储和使用方式,请参阅 @connectivity。 -如果你希望 Analysis Services 在连接时使用不同的凭据,可以在导入表之后,通过编辑 Tabular Object Model 中的数据源属性来指定。 +- SQL Server 数据库、Azure SQL 数据库和 Azure Synapse Analytics(SQL 池和无服务器 SQL 池):@connect-sql-server +- Oracle: @connect-oracle +- ODBC,包括 PostgreSQL、MySQL、MariaDB 和 IBM Db2:@connect-odbc +- OLE DB:@connect-oledb +- Snowflake,仅限隐式,包括密钥对身份验证: @connect-snowflake +- Power BI 数据流,仅限隐式:@connect-dataflows +- Databricks,仅限隐式: @connect-databricks 和教程[连接到 Azure Databricks](xref:connecting-to-azure-databricks) +- Microsoft Fabric Lakehouse、Microsoft Fabric Warehouse、Microsoft Fabric SQL 数据库和 Microsoft Fabric 镜像数据库: @connect-onelake -## 连接到数据源 +连接对话框会获取源的服务器地址、凭据和其他设置。Tabular Editor 使用这些设置来建立自身与源的连接,并按用户和模型将它们保存在您的 @user-options 文件中。凭据使用您 Windows 用户帐户下的 Windows 数据保护 API 进行加密,绝不会成为模型元数据的一部分。 -每种数据源类型都有自己的连接对话框,可用的身份验证方法也各不相同。这种选择不仅影响首次连接,因为某些身份验证方法需要人工交互,因此无法用于计划刷新。 +![SQL 身份验证](~/content/assets/images/sql-auth.png) -完整列表请参阅 @connectivity,并查看相应数据源的页面: - -- @connect-sql-server,涵盖 Azure SQL 和 Synapse -- @connect-snowflake,包括适用于无人值守场景的密钥对身份验证 -- @connect-databricks -- @connect-oracle -- @connect-odbc,也可用于连接 PostgreSQL、MySQL、MariaDB 和 IBM Db2 -- @connect-oledb -- @connect-onelake -- @connect-dataflows - -凭据按用户和模型分别存储在 [用户选项](xref:user-options) 文件中,使用你的 Windows 帐户密钥加密,且不会写入模型元数据。 +要为 Analysis Services 提供不同的凭据,请在导入表格后编辑 Tabular Object Model 中的数据源属性。 ## 选择要导入的对象 -定义好数据源后,你可以从列表中选择表/视图,或指定要对该源执行的原生查询。 +定义数据源后,请从列表中选择表和视图,或编写要对源运行的本机查询。 -![Source Options](~/content/assets/images/source-options.png) +![源选项](~/content/assets/images/source-options.png) -如果你选择第一个选项,Tabular Editor 将连接到该源并显示表和视图列表,你可以在下一页预览: +使用第一个选项,Tabular Editor 将连接到源并列出其表和视图,您可以在下一页预览这些表和视图: -![Choose Source Objects](~/content/assets/images/choose-source-objects.png) +![选择源对象](~/content/assets/images/choose-source-objects.png) -你可以在左侧勾选,以一次导入多个表/视图。对于每个表/视图,你都可以取消勾选或勾选要导入的列。 +在左侧选择多个表和视图,以便一次性导入。对于每个表/视图,选择或取消选择要导入的列。 > [!TIP] -> 如果你能控制源系统,我们建议始终在要导入的表之上创建一个视图。在该视图中,确保更正将在语义模型中使用的名称、拼写等,并移除语义模型不需要的列(系统列、时间戳等)。 +> 如果您控制源,请在要导入的每个表格之上创建一个视图。在视图中,更正语义模型使用的名称和拼写,并删除其不需要的列,例如系统列和时间戳。 > -> 然后,在模型中从该视图导入所有列(本质上会生成一条 `SELECT * FROM ...` 语句)。这样更易于维护,因为你只需在 Tabular Editor 中运行 Schema Update,就能判断源端是否有任何更改。 - -![Advanced Import](~/content/assets/images/advanced-import.png) +> 在模型中,从视图导入所有列,这将生成 `SELECT * FROM ...` 语句。当源发生变化时,Tabular Editor 中的**更新表格架构...**会显示发生了哪些变化。 -如果你使用左上角的下拉列表将预览模式切换为“Schema only”,就可以为每个源列更改导入的数据类型和列名。例如,如果源数据使用浮点值,但你希望将数据以定点小数的形式导入,这会很有用。 +![高级导入](~/content/assets/images/advanced-import.png) -![Confirm Selection](~/content/assets/images/confirm-selection.png) +当您在左上角的下拉菜单中将预览模式设置为**仅架构**时,您可以更改每个源列的导入数据类型和列名称。例如,将浮点源值导入为定点小数。 -在最后一页,确认你的选择,并选择要创建哪种类型的分区。对于 Provider数据源,默认创建的分区类型是 `SQL`;而对于 Structured数据源,默认则为 `M`。 +![确认选择](~/content/assets/images/confirm-selection.png) -![Confirm Selection Direct Lake](~/content/assets/images/confirm-selection-direct-lake.png) +在最后一页上,确认您的选择,并选择要创建的分区类型。对于提供程序数据源,默认值为 `SQL`;对于 Structured数据源,默认值为 `M`。 -对于 Fabric 数据源,最后一页会显示一个下拉列表,供你选择将所选内容创建为 Direct Lake 或导入模式。 +![确认选择 Direct Lake](~/content/assets/images/confirm-selection-direct-lake.png) -此时,你应该能看到表已导入,并且所有列、数据类型以及源列映射都已应用: +对于 Fabric 数据源,最后一页上的下拉菜单用于设置是在 Direct Lake 模式还是在导入模式下创建所选内容。 -![Import Complete](~/content/assets/images/import-complete.png) +向导将创建包含所有列、数据类型和源列映射的表。列将按其在源表中的显示顺序创建: -列会按照它们在源表中出现的顺序创建。因此,两次导入同一个表都会得到相同的列顺序。 +![导入完成](~/content/assets/images/import-complete.png) > [!NOTE] -> 从 **Fabric Lakehouse** 或 **Fabric Warehouse** 创建导入表时,会通过数据源提供的 SQL analytics endpoint 读取表的架构。如果无法确定任何终结点,且导入设置中也未指定,Tabular Editor 会报错并说明需要提供的内容:将 SQL 终结点作为服务器,或提供 Workspace ID 和 item ID。它不会创建一个没有列的表。 +> 从**Microsoft Fabric 湖仓**或**Microsoft Fabric 仓库**导入的表格通过数据源的 SQL 分析端点读取其架构。如果 Tabular Editor 无法确定端点,且导入设置未指定端点,则会显示一条错误消息,指出缺少的内容:作为服务器的 SQL 端点,或工作区 ID 和项目 ID。在这种情况下,Tabular Editor 不会创建没有列的表。 -## 更新表架构 +## 更新表格架构 -如果源中新增或更改了列,或者你最近修改了分区表达式或查询,你可以使用 Tabular Editor 的 **更新表架构** 功能来更新模型中的列元数据。 +**更新表格架构…**会在源中添加或更改列后,或者在您修改分区表达式或查询后,更新模型中的列元数据。 -![Update Table Schema](~/content/assets/images/update-table-schema.png) +![更新表架构](~/content/assets/images/update-table-schema.png) -此菜单项既可在模型级别调用,也可对一组表甚至单个表分区调用。 +在模型、所选表或单个分区上运行此操作。 -使用此选项时,Tabular Editor 会连接到所有相关数据源(必要时会提示你输入凭据),以确定是否需要添加、修改或删除列。列会遵循源表自身的列顺序,因此架构更新不会打乱它们的顺序。 +Tabular Editor 连接到相关数据源,根据需要提示输入凭据,并确定要添加、修改或删除的列。更新后,列将保持源列的顺序。 > [!IMPORTANT] -> 如果之前导入到语义模型中的某个列在源中被删除或重命名,则必须更新语义模型中的表架构。否则,数据刷新操作可能会失败。 +> 如果导入到语义模型的列在源中被删除或重命名,请更新表格架构。在您执行此操作之前,数据刷新将失败。 -![Schema Compare Dialog](~/content/assets/images/schema-compare-dialog.png) +![架构比较对话框](~/content/assets/images/schema-compare-dialog.png) -在上方的屏幕截图中,Tabular Editor 在源中检测到两个尚未导入的新列(`Color` 和 `Material`),并将两个现有列标记为待移除(`Colour` 和 `Substance Type`),因为它们的名称已无法与源中的任何列匹配。列重命名的检测仅适用于简单变更;此处名称差异较大,因此 Tabular Editor 会将其报告为删除和新增,而非重命名——实际上,源中的 `Colour` 已重命名为 `Color`,`Substance Type` 已重命名为 `Material`。 +在上面的截图中,Tabular Editor 检测到两个尚未导入的新源列(`Color` 和 `Material`),并标记了两个要删除的现有列(`Colour` 和 `Substance Type`),因为它们的名称不再与源列匹配。重命名检测仅适用于简单更改。在这里,在源中,`Colour` 被重命名为 `Color`,`Substance Type` 被重命名为 `Material`,但名称差异较大,以至于 Tabular Editor 将每次重命名都报告为一次删除和一次添加。 -为避免破坏依赖 `[Colour]` 列的现有 DAX 公式,你可以按住 Ctrl 键,在“架构更改”对话框中点击 `Color`(导入)和 `Colour`(删除)两行,然后右键单击,将“删除列”和“新增列”合并为一次 SourceColumn 更新操作: +按住 **Ctrl** 键,在“架构更改”对话框中选择“Color”(导入)和“Colour”(移除)行,然后右键单击,将移除和添加合并为单个 SourceColumn 更新。引用 `[Colour]` 的现有 DAX 公式仍可正常工作: -![Combine Sourcecolumn Update](~/content/assets/images/combine-sourcecolumn-update.png) +![合并 Sourcecolumn 更新](~/content/assets/images/combine-sourcecolumn-update.png) -如果你不希望将名称更改传播到已导入的列(而只是想更新 SourceColumn 属性,以反映数据源中已更改的名称),你可以在下拉列表中取消选择 `Name` 更新操作: +如果您只想更新 `SourceColumn` 属性并保留导入列的名称,请在下拉列表中清除“名称”更新操作: -![Deselect Name](~/content/assets/images/deselect-name.png) +![取消选择名称](~/content/assets/images/deselect-name.png) -## 通过 Analysis Services 更新表架构 +## 通过 Analysis Services 更新表格架构 -默认情况下,Tabular Editor 3 会尝试直接连接到数据源,以便更新已导入表的架构。当然,这只在 Tabular Editor 3 支持该数据源时才有效。如果你需要更新从 Tabular Editor 3 不支持的数据源导入的表的架构,可以在 **工具 > 偏好 > 架构比较** 下启用 **使用 Analysis Services 进行更改检测** 选项。当某个分区或共享表达式的 M 表达式过于复杂,以至于 Tabular Editor 3 的内置架构检测功能无法处理时,也同样适用。例如,内置架构检测不支持某些 M 函数。 +默认情况下,Tabular Editor 3 直接连接到数据源以更新导入的表架构,这仅适用于 Tabular Editor 3 支持的数据源。在**工具 > 偏好 > 架构比较**下启用**使用 Analysis Services 进行更改检测**,以更新来自不受支持源的表的架构。该选项还涵盖分区和共享表达式,其 M 对于内置架构检测来说过于复杂,例如使用其不支持的 M 函数的表达式。 -![通过 As 更新表架构](~/content/assets/images/update-table-schema-through-as.png) +![通过 AS 更新表架构](~/content/assets/images/update-table-schema-through-as.png) -启用此选项后,当 Tabular Editor 3 连接到 Analysis Services 或 Power BI XMLA endpoint 时,即可更新从 Analysis Services 或 Power BI 支持的**任何**数据源导入的表的架构。 +启用此选项且 Tabular Editor 3 连接到 Analysis Services 或 Power BI XMLA endpoint 时,您可以更新从 Analysis Services 或 Power BI 支持的**任何**数据源导入的表的架构。 -> [!NOTE] -> **使用 Analysis Services 进行更改检测** 选项仅在 Tabular Editor 3 连接到 Analysis Services 或 Power BI XMLA endpoint 时才会生效。因此,建议你在开发模型时始终使用[工作区模式](xref:workspace-mode)。 - -启用“**使用 Analysis Services 进行更改检测**”选项后,当请求更新架构时,Tabular Editor 3 将使用以下技术: +> [!TIP] +> [工作区模式](xref:workspace-mode)使 Tabular Editor 3 在您进行开发时保持连接到 Analysis Services 或 Power BI XMLA endpoint。 -1. 针对已连接的 Analysis Services 实例创建一个新的事务 -2. 向模型添加一个新的临时表。该表使用一个 Power Query 分区表达式,用于返回原始表达式的架构,而该原始表达式已请求更新架构。这是通过 [`Table.Schema` M 函数](https://docs.microsoft.com/powerquery-m/table-schema) 实现的。 -3. Analysis Services 刷新该临时表。 Analysis Services 负责连接到数据源,以检索更新后的架构。 -4. Tabular Editor 3 查询临时表的内容,以获取架构元数据。 -5. 回滚该事务,使 Analysis Services 数据库或 Power BI 语义模型回到步骤 1 之前的原始状态。 -6. 如果存在任何架构更改,Tabular Editor 3 会显示如上所示的“应用架构更改”对话框。 +启用此选项后,架构更新将执行以下步骤: -借助该技术,无论表背后的 M 查询有多复杂、使用了哪些函数,Tabular Editor 3 都可以从原本不受支持的数据源导入并更新表。 +1. Tabular Editor 3 对已连接的 Analysis Services 实例启动事务。 +2. 它向模型添加一个临时表,其中包含一个 Power Query 分区表达式,该表达式通过 [`Table.Schema` M 函数](https://docs.microsoft.com/powerquery-m/table-schema)返回原始表达式的架构。 +3. Analysis Services 刷新临时表,连接到数据源以检索架构。 +4. Tabular Editor 3 查询临时表以获取架构元数据。 +5. Tabular Editor 3 回滚事务,使 Analysis Services 数据库或 Power BI 语义模型恢复到步骤 1 之前的状态。 +6. 如果架构发生更改,则会显示上图所示的**应用架构更改**对话框。 > [!NOTE] -> 如果您的 M 表达式通过 M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin) 函数等方式合并了来自多个数据源的数据,您可能需要在 Power BI 服务中的语义模型上,将 [**隐私级别**](https://powerbi.microsoft.com/en-us/blog/privacy-levels-for-cloud-data-sources/) 从“私有”更改为“组织”。否则,你可能会看到一条错误提示:` references other queries or steps, so it may not directly access a 数据源。请重建此数据组合`。即使未启用“**使用 Analysis Services 进行更改检测**”,也可能出现此错误,因为当 M 表达式复杂到超出 Tabular Editor 3 内置架构检测能力时,Tabular Editor 3 会自动回退到该检测机制。 +> 如果您的 M 表达式组合来自多个源的数据(例如通过 M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin) 函数),您可能需要将 Power BI 服务中语义模型的[**隐私级别**](https://powerbi.microsoft.com/blog/privacy-levels-for-cloud-data-sources/)从“私有”更改为“组织”。否则,您可能会看到一个错误,指出“`` 引用了其他查询或步骤,因此可能无法直接访问数据源。请重建此数据组合。`。即使未启用**使用 Analysis Services 进行更改检测**,也可能出现此错误,因为当 M 表达式对于 Tabular Editor 3 的内置架构检测来说过于复杂时,Tabular Editor 3 将自动回退到此检测机制。 ### 通过 Analysis Services 导入新表 -若要从原本不受支持的数据源导入表,你只要复制该数据源中的现有表,修改复制出来的表的分区查询里的 M 表达式,然后把更改保存到 Workspace 数据库,并按上文所述更新表架构。 +要从向导不支持的源导入表,请从该源复制现有表,并修改副本分区的 M 表达式。将更改保存到工作区数据库,然后按照上述说明更新表格架构。 diff --git a/localizedContent/zh/content/features/table-preview.md b/localizedContent/zh/content/features/table-preview.md index 41558d3d6..80872bb7a 100644 --- a/localizedContent/zh/content/features/table-preview.md +++ b/localizedContent/zh/content/features/table-preview.md @@ -2,7 +2,7 @@ uid: table-preview title: 表格预览 author: Morten Lønskov -updated: 2026-09-14 +updated: 2026-09-23 applies_to: products: - product: Tabular Editor 2 @@ -16,78 +16,71 @@ applies_to: - edition: Enterprise full: true --- - # 表格预览 -**表格预览** 会逐行显示单个表的内容,无需编写查询。在 @tom-explorer-view 中右键单击表并选择 **预览数据**,或选中该表后按 **Ctrl+R**。 - -![预览数据](~/content/assets/images/preview-data-big.png) +**表格预览**显示一个表格的行,无需编写查询。在 @tom-explorer-view 中右键单击表,然后选择**预览数据**,或者选择表并按 **Ctrl+R**。预览将以文档形式打开,因此您可以一次打开多个预览,并将其停靠、浮动或移动到另一个显示器。 -你可以同时打开多个表的预览,并按自己的需要任意排列。每个预览都是普通文档,因此可以停靠、浮动,或移到第二台显示器上。 +![“Internet Sales”表格的表格预览,其中日期列的筛选器下拉列表已打开](~/content/assets/images/preview-data-big.png) -## 查看网格 +## 读取网格 -Tabular Editor 会执行一个 DAX 查询,只返回当前视图可显示的行数;随着你滚动,会再分页加载更多行。可滚动的范围取决于存储模式和引擎: +Tabular Editor 运行一个 DAX 查询,该查询返回视图可以显示的行,并在您滚动时加载更多行。滚动范围取决于存储模式和引擎: -| 表 | 滚动 | -| ---------------------------------------------------------- | ------------------------------------- | -| 导入模式:在支持 [`WINDOW`](https://dax.guide/window) 的引擎上,且该表具有主键 | 整个表。分页会基于主键使用 `WINDOW` | -| 导入模式,不支持 `WINDOW` 或该表没有主键 | 仅显示前几行;预览中会说明已禁用滚动 | -| DirectQuery | 仅显示前几行,最多到 **行数限制** 偏好设置的上限;提示信息会说明原因 | +- 在支持 [`WINDOW`](https://dax.guide/window) 的引擎上,具有主键的导入表可滚动浏览整个表。分页使用针对主键的 `WINDOW`。 +- 没有主键的导入表,或在不支持 `WINDOW` 的引擎上的导入表,仅显示前几行,并且预览显示滚动已禁用。 +- DirectQuery 表仅显示前几行(最多显示至**行数限制**首选项指定的行数),并显示一条消息,告知 DirectQuery 表无法进行分页浏览。筛选网格或编写 DAX 查询以查看特定行。 -预览元数据会在当前会话中缓存,因此重新打开预览时不会再次查询服务器。例如,如果模型是在 Tabular Editor 外部处理的,可以使用 **刷新预览** 重新读取预览内容。 +预览元数据会针对会话进行缓存,重新打开预览时不会再次查询服务器。如果模型是在 Tabular Editor 之外处理的,请选择**刷新预览**。 -如果某个计算列处于无效状态,其单元格会显示 _(需要计算)_。使用工具栏上的 **计算表格**,或在列的右键菜单中选择 **重新计算表格...**,即可将其更新到最新状态。 +如果计算列处于无效状态,其单元格将显示“(需要计算)”。在工具栏上选择**计算表格**,或在列标题的右键菜单中选择**重新计算表格…**,以更新表格。 -![重新计算表格](~/content/assets/images/recalculate-table.png) +![表预览中列标题的右键菜单,其中选择了“重新计算表”,位于显示“需要计算”的单元格上方](~/content/assets/images/recalculate-table.png) ## 列顺序 -默认情况下,列会按引擎返回的顺序显示,这大致就是内部列顺序,因此看起来往往比较随意。在 @preferences 中勾选 _按字母顺序排序表格预览列_,即可让它们改为按 TOM Explorer 使用的相同顺序排列。 +默认情况下,列按引擎返回的顺序显示。在@preferences中**按字母顺序对表预览列排序**,将按名称对列进行排序,与 TOM Explorer 的操作方式相同。 ## 在宽表中查找列 -在 @tom-explorer-view 中选择某一列时,预览会滚动到该列并将其高亮显示。该功能默认开启。你可以在工具栏上取消 **跟踪所选列**,仅对单个预览关闭;也可以在 @偏好 中为所有预览关闭。 +默认情况下,在 @tom-explorer-view 中选择一列会将预览滚动到该列并突出显示该列。在工具栏上清除**跟踪所选列**,即可对一个预览禁用此功能,或者在@preferences中清除**在 TOM Explorer 中跟踪所选列**,即可对所有预览禁用此功能。 ## 工具栏 -**表格预览** 工具栏和对应的 **表格预览** 菜单包含相同的命令: +**表格预览**工具栏和**表格预览**菜单具有相同的命令: -| 命令 | 作用 | -| ----------------------------------------------------------- | -------------------------------------------------- | -| **身份模拟...** | 选择预览查询运行时使用的身份,以查看特定用户会看到的数据 | -| **刷新预览** | 重新读取该表,并丢弃缓存的元数据 | -| **自动刷新** | 每当已部署的模型发生更改时,自动刷新此预览。新建预览的默认设置来自 @偏好 | -| **跟踪所选列** | 如上所述,跟随 TOM Explorer 中的列选择 | -| **计算表格** | 重新计算该表的计算列 | +| 命令 | 功能 | +|---|---| +| **模拟……** | 设置预览查询运行的身份,以显示特定用户看到的数据。| +| **刷新预览** | 重新读取表并丢弃缓存的元数据。| +| **自动刷新** | 已部署的模型发生更改时自动刷新此预览。新预览的默认值在 @preferences 中设置。| +| **跟踪所选列** | 跟踪 TOM Explorer 中的列选择。请参阅[在宽表中查找列](#finding-a-column-in-a-wide-table)。| +| **计算表格** | 重新计算表格的计算列。| ## 右键菜单 -除了标准网格命令(排序、筛选、自动调整列宽、列选择器)之外,预览网格还增加了: +除了标准网格命令(排序、筛选、最佳拟合、列选择器)外,预览网格还具有以下命令: -| 命令 | 显示位置 | 作用 | -| ------------------------------------------------------------------ | ----------- | ------------------------------------------------- | -| **锁定列宽** | 列标题 | 防止在滚动并分页加载更多行时,网格自动重新调整列宽 | -| **编辑表达式...** | 计算列的列标题 | 在 **表达式编辑器** 中打开该列的 DAX 表达式 | -| **重新计算计算表格...** | 未保持最新的计算列标题 | 重新计算该表格 | -| **显示实际 DAX 查询...** | 网格中的任意位置 | 打开一个新的可编辑 [DAX 查询](xref:dax-query) 文档,其中包含生成预览的查询 | +| 命令 | 显示位置 | 功能 | +|---|---|---| +| **锁定列宽** | 列标题 | 防止网格在您滚动和加载更多行时调整列的大小。| +| **编辑表达式...** | 计算列的标题 | 在**表达式编辑器**中打开该列的 DAX 表达式。| +| **重新计算表格…** | 未更新的计算列的标题 | 重新计算表格。| +| **显示实际 DAX 查询...** | 网格中的任何位置 | 打开一个新的、可编辑的[DAX 查询](xref:dax-query)文档,其中包含预览背后的查询。| ### 显示实际 DAX 查询 -**显示实际 DAX 查询...** 会提取预览当前正在运行的查询,包括你在网格中应用的所有筛选和排序,对其进行格式化,并将其作为新的 DAX 查询文档打开。系统不会自动执行它;准备好后,编辑并运行即可。 - -我们有意省略了分页封装,因此你拿到的是针对当前正在查看的数据的查询,而不是只针对当前一屏数据的查询。 +**显示实际 DAX 查询…** 对预览运行的查询进行格式化,包括在网格中应用的筛选和排序,并将其作为新的 DAX 查询文档打开,但不运行该查询。该查询没有分页逻辑,并返回所有已筛选的行。 > [!NOTE] -> **DAX 查询** 视图在其结果网格上也有一个同名命令,但它的作用不同:它会在只读窗口中显示上次执行的查询,而不是打开一个新文档。 +> **DAX 查询**视图在其结果网格上有一个同名命令,该命令在只读窗口中显示最后执行的查询。 ## 筛选 -每个列标题都有一个筛选下拉菜单,列出该列的不同值。对于具有许多不同值的列,该列表会按 _Max 限制。过滤器下拉列表中的值数_ 限制,位于 @preferences 下,默认值为 5,000。超过上限的值不会列出,也无法直接勾选。如果需要这些值,可以提高上限,但请注意,打开下拉菜单时会运行开销更大的查询。 +每个列标题都有一个筛选器下拉列表,其中列出了列的非重复值,最多可达 @preferences 中**筛选器下拉列表中的最大值**所设定的上限(默认为 5,000)。超过上限的值不会列出,提高上限会使下拉菜单查询变慢。 -## 偏好设置 +## 偏好 -本页提到的所有设置都位于 **工具 > 偏好 > 数据浏览 > 表格预览** 下。完整列表请参见 @preferences。 +此页面上的设置位于**工具 > 首选项 > 数据浏览 > 表格预览**下。请参阅@preferences,了解完整列表。 ## 后续步骤 diff --git a/localizedContent/zh/content/features/views/data-refresh-view.md b/localizedContent/zh/content/features/views/data-refresh-view.md index e7ebf20de..c8ba52b50 100644 --- a/localizedContent/zh/content/features/views/data-refresh-view.md +++ b/localizedContent/zh/content/features/views/data-refresh-view.md @@ -1,4 +1,4 @@ ---- +--- uid: data-refresh-view title: 数据刷新视图 author: Daniel Otykier @@ -16,39 +16,37 @@ applies_to: - edition: Enterprise full: true --- - # 数据刷新视图 -数据刷新视图可让你深入了解服务器上的数据是如何刷新的。当你通过 TOM Explorer 触发一次新的刷新时,列表中会出现一条新的活动刷新记录。 +**数据刷新**视图显示服务器上刷新操作的进度。您从 TOM Explorer 开始的刷新将在此视图中显示为活动刷新。
    - Data Refresh View
    图 1: Tabular Editor 中的数据刷新视图。可通过右键单击某个表并选择“刷新”来启动新的刷新。
    + 数据刷新视图 +
    图 1: Tabular Editor 中的“数据刷新”视图。通过右键单击表并选择“刷新”来开始刷新。
    -新的刷新将在后台运行,因此你可以继续构建数据集。如果刷新失败,Tabular Editor 会通过弹出窗口通知你。 - -## 数据刷新视图中的列 +在您继续编辑模型时,刷新操作在后台运行,如果刷新失败,则会显示错误消息。 -“数据刷新”视图会为每次刷新操作显示以下信息: +## 数据刷新视图列 -- **对象**:正在刷新的模型对象名称(表、分区或模型) -- **说明**:关于刷新操作及其当前状态的更多信息 -- **进度**:显示截至目前已导入的行数。 -- **开始时间**:刷新操作开始时的日期和时间。这有助于跟踪操作的发起时间,尤其是在多个刷新任务排队等待时 -- **持续时间**:从刷新操作开始到现在的已用时间;对正在运行的操作会实时更新 +每个刷新操作都有以下列: -### 对刷新操作排序 +- **对象**:正在刷新的模型对象(表格、分区或模型)。 +- **说明**:有关刷新操作及其当前状态的详细信息。 +- **进度**:迄今为止已导入的行数。 +- **开始时间**:操作开始的日期和时间。 +- **持续时间**:自操作开始以来的已过时间,对于正在进行的操作会实时更新。 -可点击任意列标题,对刷新操作进行排序。这在以下场景中特别有用: +### 对刷新操作进行排序 -- 点击 **开始时间** 列,可按时间顺序对刷新操作排序:最新的操作显示在最前(降序)或最后(升序) -- 按 **持续时间** 排序,以识别运行时间较长的操作 -- 按 **对象** 排序,按表或分区名称对刷新进行分组 +点击列标题以按该列排序:点击一次为升序,再次点击为降序。例如: -单击列标题一次按升序排序,再单击一次则按降序排序。在处理多个刷新队列时,这能让你轻松识别最新的刷新操作。 +- 按**开始时间**降序排序,以便首先列出最新的刷新操作 +- 按**持续时间**排序,以查找长时间运行的操作 +- 按**对象**排序,以按表名或分区名对刷新进行分组 > [!NOTE] -> “数据刷新”窗口中显示的所有信息和持续时间仅为估算值。在处理过程中,Tabular Editor 会监听来自 SSAS 的[跟踪事件](https://learn.microsoft.com/analysis-services/trace-events/analysis-services-trace-events?view=asallproducts-allversions)。 SSAS 不保证会将所有跟踪信息发送到客户端(例如,在 CPU/内存消耗达到峰值时,可能会对跟踪事件通知进行限流)。 +> “数据刷新”窗口中显示的所有消息和持续时间仅为估算值。Tabular Editor 在处理过程中侦听[来自 SSAS 的跟踪事件](https://learn.microsoft.com/analysis-services/trace-events/analysis-services-trace-events?view=asallproducts-allversions)。不能保证 SSAS 会将所有跟踪消息发送给客户端(例如,在 CPU/内存消耗高峰期,它可能会限制跟踪事件通知)。 > [!TIP] -> 如果需要获取有关刷新进度和持续时间的准确可靠信息,建议将[SQL Server Profiler](https://learn.microsoft.com/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver16)连接到 SSAS 实例,并在处理过程中手动收集这些信息。 \ No newline at end of file +> 如果您需要有关刷新进度和持续时间的准确可靠信息,应将 [SQL Server Profiler](https://learn.microsoft.com/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver16) 连接到您的 SSAS 实例,并在处理过程中手动收集信息。 From 75fcc09f939bddc8bc7a0a4ed17f46c47d33e579 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 19:59:34 +0000 Subject: [PATCH 3/8] New translations (Translated) --- localizedContent/es/.translation-status.json | 6 +- .../Semantic-Model/semantic-model-types.md | 90 +++++---- .../user-context-calculated-columns.md | 63 +++--- .../content/tutorials/direct-lake-guidance.md | 186 ++++++++++-------- localizedContent/zh/.translation-status.json | 6 +- .../Semantic-Model/semantic-model-types.md | 84 ++++---- .../user-context-calculated-columns.md | 63 +++--- .../content/tutorials/direct-lake-guidance.md | 186 ++++++++++-------- 8 files changed, 361 insertions(+), 323 deletions(-) diff --git a/localizedContent/es/.translation-status.json b/localizedContent/es/.translation-status.json index def984c0c..94eb4e603 100644 --- a/localizedContent/es/.translation-status.json +++ b/localizedContent/es/.translation-status.json @@ -307,7 +307,7 @@ "status": "translated" }, "features/Semantic-Model/semantic-model-types.md": { - "sourceHash": "sha256:c6bc2434213fc85c0062d07e80f8e0341d4375cce84561d770944e00a7f1b1d0", + "sourceHash": "sha256:9f9e907aebbe834fc734867a3c7c054d7b4deafa71295806d20ad524c7f25e74", "status": "translated" }, "features/table-groups.md": { @@ -387,7 +387,7 @@ "status": "translated" }, "features/user-context-calculated-columns.md": { - "sourceHash": "sha256:2d7a43f84729d3d925e4d918752c57a05335335e8af7547bc7f829a833e46751", + "sourceHash": "sha256:75b6912c5c35999747fe9493f6af6f582d0561cf9e47377882cdb3f9a5fdcddd", "status": "translated" }, "features/using-bpa-sample-rules-expressions.md": { @@ -1675,7 +1675,7 @@ "status": "translated" }, "tutorials/direct-lake-guidance.md": { - "sourceHash": "sha256:964fbdf58e990aee599a3a27f26d5b302cafd8bf85c950a79eebb84f497f1a2d", + "sourceHash": "sha256:10e0826eb1daa6a7cc5698408baced6facf55b7bbee3172deec7585aad50c6fb", "status": "translated" }, "tutorials/importing-tables.md": { diff --git a/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md b/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md index fa2869b6f..e3654cee5 100644 --- a/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md +++ b/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md @@ -1,8 +1,8 @@ ---- +--- uid: semantic-model-types title: Tipos de modelos semánticos de Power BI author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-26 applies_to: products: - product: Tabular Editor 2 @@ -17,59 +17,63 @@ applies_to: full: true --- + # Tipos de modelos semánticos -Tabular Editor puede trabajar con varios tipos de modelos. A continuación encontrarás un resumen de qué tipos de modelo funcionan con Tabular Editor y qué capacidades se pueden usar con cada tipo de modelo. +Tabular Editor puede trabajar con varios tipos de modelos diferentes. A continuación, se ofrece una visión general de los tipos de modelos que funcionan con Tabular Editor y de las funciones que pueden utilizarse con cada tipo de modelo. -| Tipo de modelo | Import | DirectQuery | Direct Lake en OneLake | Direct Lake en SQL | .pbix | .pbip | -| ------------------------------------------------------- | ------ | ----------- | --------------------------------------- | ------------------------------------------ | --------------------- | --------------------- | -| Conectar en Tabular Editor | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| Crear un modelo nuevo | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Escribir medidas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Crear y editar tablas | ✔️ | ✔️ | ✔️[1](#DirectLake) | ✔️[1](#DirectLake) | ✔️ | ✔️ | -| Crear y editar particiones | ✔️ | ✔️ | ✔️[1](#DirectLake) | ✔️[1](#DirectLake) | ✔️ | ✔️ | -| Crear y editar columnas | ✔️ | ✔️ | ✔️[1](#DirectLake) | ✔️[1](#DirectLake) | ✔️ | ✔️ | -| Crear y editar tablas calculadas | ✔️ | ✔️ | ✔️[2](#DirectLakeCalculated) | ✔️[4](#DirectLakeSQLCalculated) | ✔️ | ✔️ | -| Crear y editar columnas calculadas | ✔️ | ✔️ | ✔️[5](#DirectLakeCalcColumn) | ❌ | ✔️ | ✔️ | -| Crear y editar grupos de cálculo | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| Crear y editar relaciones | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| Crear y editar roles | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Crear y editar perspectivas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Crear y editar traducciones | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Usar Best Practice Analyzer | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| Editar todas las propiedades de TOM | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Crear diagramas[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Usar datos de vista previa[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Usar Pivot Grid[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Usar consultas DAX[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Usar el depurador de DAX[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Usar el Analizador VertiPaq[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Procesar el modelo y las tablas[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| Eliminar objetos | ✔️ | ✔️ | ✔️ | ✔️ | | | -**Leyenda:** +|Tipo de modelo|Importación|Consulta directa|Direct Lake en OneLake|Direct Lake en SQL|.pbix|.pbip| +|---|---|---|---|---|---|---| +|Conectar en Tabular Editor|✔️|✔️|✔️|✔️|✔️| | +|Crear nuevo modelo|✔️|✔️|✔️|✔️|✔️|✔️| +|Escribir medidas|✔️|✔️|✔️|✔️|✔️|✔️| +|Crear y editar tablas|✔️|✔️|✔️[1](#DirectLake)|✔️[1](#DirectLake)|✔️|✔️| +|Crear y editar particiones|✔️|✔️|✔️[1](#DirectLake)|✔️[1](#DirectLake)|✔️|✔️| +|Crear y editar columnas|✔️|✔️|✔️[1](#DirectLake)|✔️[1](#DirectLake)|✔️|✔️| +|Crear y editar tablas calculadas|✔️|✔️|✔️[2](#DirectLakeCalculated)|✔️[4](#DirectLakeSQLCalculated)|✔️|✔️| +|Crear y editar columnas calculadas|✔️|✔️|✔️[5](#DirectLakeCalcColumn)|❌|✔️|✔️| +|Crear y editar grupos de cálculos|✔️|✔️|✔️|✔️|✔️| | +|Crear y editar relaciones|✔️|✔️|✔️|✔️|✔️| | +|Crear y editar roles|✔️|✔️|✔️|✔️|✔️|✔️| +|Crear y editar perspectivas|✔️|✔️|✔️|✔️|✔️|✔️| +|Crear y editar traducciones|✔️|✔️|✔️|✔️|✔️|✔️| +|Usar Best Practice Analyzer|✔️|✔️|✔️|✔️|✔️| | +|Editar todas las propiedades de TOM|✔️|✔️|✔️|✔️|✔️|✔️| +|Crear diagramas[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Usar datos de vista previa[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Usar tablas dinámicas[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Usar consultas DAX[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Usar el depurador de DAX[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Usar VertiPaq Analyzer[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Procesar modelo y tablas[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|Eliminar objetos|✔️|✔️|✔️|✔️| | | -- ✔️: Compatible -- ❌: No compatible +**Leyenda:** +- ✔️: Compatible +- ❌: No admitido -1 - La partición de la tabla debe ser una partición de entidad para funcionar correctamente. Los modelos Direct Lake solo pueden tener una partición por tabla. 2 - Las tablas calculadas no pueden hacer referencia a Direct Lake en tablas o columnas de OneLake. Se admiten los grupos de cálculo, los parámetros de hipótesis y los parámetros de campo. -3 - Solo funciones de Tabular Editor 3. Las operaciones realizadas a través del punto de conexión XMLA requieren una licencia Business o Enterprise. [Más información](xref:editions). 4 - Direct Lake en SQL solo admite grupos de cálculo, parámetros de hipótesis y parámetros de campo, que crean implícitamente tablas calculadas. No se admiten las tablas calculadas de uso general. 5 - Funcionalidad en versión preliminar. Las columnas calculadas en Direct Lake sobre OneLake se evalúan en el contexto de consulta del usuario actual, en lugar de materializarse: respetan la seguridad a nivel de filas y la seguridad a nivel de objetos, pero no se pueden usar como claves de relación y no responden a los filtros del Report ni a los segmentadores. Consulta la [Guía de Direct Lake](xref:direct-lake-guidance) para obtener más información. +1 - La partición de la tabla debe ser una partición de entidad para funcionar correctamente. Los modelos Direct Lake solo pueden tener una partición por tabla. +2 - Las tablas calculadas no pueden hacer referencia a Direct Lake en tablas o columnas de OneLake. Se admiten grupos de cálculos, parámetros de simulación y parámetros de campo. -> [!NOTE] -> En la versión de junio de 2025 de Power BI Desktop se eliminaron todas las limitaciones de modelado para las herramientas de terceros. Antes de eso, no se admitían varias operaciones de modelado. Consulta [Limitaciones de Power BI Desktop](xref:desktop-limitations). +3 - Solo funciones de Tabular Editor 3. Las operaciones realizadas a través del punto de conexión XMLA requieren una licencia Business o Enterprise. [Más información](xref:editions). +4 - Direct Lake en SQL solo admite grupos de cálculo, parámetros «what-if» y parámetros de campo, que crean implícitamente tablas calculadas. No se admiten tablas calculadas generales. +5 - Función de vista previa. Las columnas calculadas de las tablas de Direct Lake en OneLake deben usar el contexto de expresión «UserContext». Se evalúan en el momento de la consulta y no se materializan, por lo que no se pueden usar como claves de relación. Consulte [Directrices de Direct Lake](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake) para obtener más detalles. -> [!TIP] -> Para obtener más información sobre las restricciones de los modelos Direct Lake, consulta la [documentación de Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview) de Microsoft +>[!NOTE] +> La versión de junio de 2025 de Power BI Desktop eliminó todas las limitaciones de modelado para herramientas de terceros. Antes de eso, no se admitían varias operaciones de modelado. Consulte [Limitaciones de Power BI Desktop](xref:desktop-limitations). -## Tipos de modelos semánticos no compatibles +>[!TIP] +> Para obtener más información sobre las restricciones de los modelos Direct Lake, consulte la [documentación de Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview) de Microsoft. +## Tipos de modelos semánticos no admitidos Los siguientes tipos de modelos semánticos no son compatibles, ya que no admiten operaciones de escritura XMLA. -- Reports basados en una conexión en vivo con un modelo de Azure Analysis Services o SQL Server Analysis Services. -- Reports basados en una conexión en directo a un dataset de Power BI. +- Informes basados en una conexión en tiempo real a un modelo de Azure Analysis Services o de SQL Server Analysis Services. +- Informes basados en una conexión en tiempo real a un conjunto de datos de Power BI. - Modelos con datos push. -- Modelos almacenados en Mi Workspace de Power BI. -- Modelos almacenados en el Workspace Pro de Power BI. -- Modelos semánticos predeterminados de Direct Lake. Desde septiembre de 2025, Power BI ya no crea automáticamente modelos semánticos predeterminados al crear un Warehouse, un Lakehouse o un elemento reflejado. En noviembre de 2025, todos los modelos semánticos predeterminados existentes se desvincularon de sus elementos y pasaron a ser modelos semánticos independientes. Es posible conectarse a un modelo semántico predeterminado, pero no se puede modificar a través del punto de conexión XMLA. +- Modelos almacenados en Mi área de trabajo de Power BI. +- Modelos almacenados en el área de trabajo de Power BI Pro. +- Modelos semánticos predeterminados de Direct Lake. A partir de septiembre de 2025, Power BI ya no creará automáticamente modelos semánticos predeterminados cuando se cree un Warehouse, un Lakehouse o un elemento reflejado. En noviembre de 2025, todos los modelos semánticos predeterminados existentes se desconectaron de sus elementos y se convirtieron en modelos semánticos independientes. Es posible conectarse a un modelo semántico predeterminado, pero no es posible modificarlo a través del punto de conexión XMLA. - Modelos semánticos de libros de Excel. \ No newline at end of file diff --git a/localizedContent/es/content/features/user-context-calculated-columns.md b/localizedContent/es/content/features/user-context-calculated-columns.md index 9e973ba6f..25a432a48 100644 --- a/localizedContent/es/content/features/user-context-calculated-columns.md +++ b/localizedContent/es/content/features/user-context-calculated-columns.md @@ -1,8 +1,8 @@ --- uid: user-context-calculated-columns -title: Columnas calculadas con contexto de usuario +title: Columnas calculadas en función del contexto del usuario author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-26 applies_to: products: - product: Tabular Editor 2 @@ -17,53 +17,56 @@ applies_to: - edition: Enterprise full: true --- +# Columnas calculadas en función del contexto del usuario -# Columnas calculadas con contexto de usuario - -Una _columna calculada con contexto de usuario_ es una columna calculada que se evalúa por usuario. Su expresión puede llamar a funciones como [`USERPRINCIPALNAME`](https://dax.guide/userprincipalname) o [`USERNAME`](https://dax.guide/username) y devolver un valor distinto para cada usuario. En cambio, una columna calculada estándar se evalúa una sola vez, cuando se procesa la tabla, y devuelve el mismo valor para todos los usuarios. +Una *columna calculada en función del contexto del usuario* es una columna calculada que se evalúa por usuario. Su expresión puede llamar a funciones como [`USERPRINCIPALNAME`](https://dax.guide/userprincipalname) o [`USERNAME`](https://dax.guide/username) y devolver un valor diferente para cada usuario. Por el contrario, una columna calculada estándar se evalúa una sola vez, cuando se procesa la tabla, y devuelve el mismo valor para todos los usuarios. La propiedad `ExpressionContext` de la columna calculada determina si la columna se evalúa una sola vez o por usuario: -| Contexto de expresión | Significado | -| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Estándar** | La opción predeterminada. La expresión solo puede usar funciones estándar. La columna tiene un valor por fila, igual para todos los usuarios. | -| **Contexto de usuario** | La expresión puede llamar a funciones de contexto de usuario. La columna se evalúa para cada usuario. | +| Contexto de la expresión | Significado | +|---|---| +| `Standard` | El valor predeterminado. La expresión solo puede usar funciones estándar. La columna tiene un valor por fila para todos los usuarios. | +| `UserContext` | La expresión puede llamar a funciones de contexto de usuario. La columna se evalúa por usuario. | -Selecciona una columna calculada en @tom-explorer-view y establece **Contexto de expresión** en **Opciones** de @properties-view. +Seleccione una columna calculada en la @tom-explorer-view y establezca **Contexto de la expresión** en **Opciones** en la @properties-view. > [!NOTE] -> `ExpressionContext` requiere un nivel de compatibilidad 1705 o superior; por debajo de 1705, las columnas calculadas siempre son **Standard**. +> `ExpressionContext` requiere un nivel de compatibilidad de 1705 o superior, y por debajo de 1705 las columnas calculadas son siempre `Standard`. + +## Direct Lake en tablas de OneLake + +`UserContext` es el único contexto de expresión que Power BI admite para las columnas calculadas de las tablas de Direct Lake en OneLake. Si una columna calculada de una tabla Direct Lake se establece en «Standard» cuando guarda el modelo en el servicio Power BI, el guardado falla con el error «El contexto de expresión predeterminado no se puede usar para columnas calculadas en tablas Direct Lake». Las tablas de Direct Lake en SQL no admiten columnas calculadas. Para conocer los pasos para establecer el contexto de expresión en un modelo Direct Lake, consulte [Columnas calculadas en Direct Lake en OneLake](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake). -## Para qué no se puede usar una columna con contexto de usuario +## Para qué no se puede usar una columna de contexto de usuario -Los objetos que se evalúan una vez para todo el modelo no pueden hacer referencia a una columna calculada con contexto de usuario. El analizador semántico de Tabular Editor informa de un error en cada uno de estos casos: +Los objetos evaluados una sola vez para todo el modelo no pueden hacer referencia a una columna calculada con contexto del usuario. El analizador semántico de Tabular Editor informa de un error en cada uno de estos casos: -| Una columna con contexto de usuario no puede ser referenciada por | Mensaje | -| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Una columna calculada estándar | "Esta expresión hace referencia a la columna calculada con contexto de usuario `Table[Column]`, lo que no está permitido en una columna calculada estándar." | -| Una tabla calculada | "Esta expresión hace referencia a la columna calculada con contexto de usuario `Table[Column]`, lo que no está permitido en una tabla calculada." | -| Un filtro de seguridad a nivel de filas | "Esta expresión hace referencia a la columna calculada con contexto de usuario `Table[Column]`, lo que no está permitido en un filtro de seguridad a nivel de filas." | -| Una relación, como uno de sus extremos | "Una relación no puede usar la columna calculada con contexto de usuario `Table[Column]` como uno de sus extremos." | +| Una columna de contexto de usuario no puede ser referenciada por | Mensaje | +|---|---| +| Una columna calculada estándar | «Esta expresión hace referencia a la columna calculada con reconocimiento del contexto del usuario `Tabla[Columna]`, lo cual no está permitido en una columna calculada estándar». | +| Una tabla calculada | «Esta expresión hace referencia a la columna calculada con reconocimiento del contexto del usuario `Tabla[Columna]`, lo cual no está permitido en una tabla calculada». | +| Un filtro de seguridad a nivel de filas | «Esta expresión hace referencia a la columna calculada con reconocimiento del contexto del usuario `Tabla[Columna]`, lo cual no está permitido en un filtro de seguridad a nivel de filas». | +| Una relación, como extremo | «Una relación no puede usar la columna calculada con reconocimiento del contexto del usuario `Tabla[Columna]` como extremo». | Las tres primeras reglas también se aplican a las referencias indirectas, por ejemplo, a través de una medida. Las medidas y otras columnas calculadas con contexto de usuario pueden hacer referencia a una columna con contexto de usuario. ## Dónde aparecen los errores -| Cómo se hace referencia a la columna | Editor de DAX | @vista-de-mensajes | [`te validate`](xref:te-cli-commands#validate) | -| ----------------------------------------------- | ------------- | ------------------------------- | ---------------------------------------------- | -| Directamente | Sí | Sí | Sí | -| Indirectamente, por ejemplo mediante una medida | No | Sí | Sí | -| Como extremo de una relación | No | Sí | Sí | +| Cómo se hace referencia a la columna | Editor de DAX | @messages-view | [`te validate`](xref:te-cli-commands#validate) | +|---|---|---|---| +| Directamente | Sí | Sí | Sí | +| Indirectamente, por ejemplo, a través de una medida | No | Sí | Sí | +| Como extremo de una relación | No | Sí | Sí | -El editor de DAX no subraya las infracciones indirectas, así que revisa los mensajes en @messages-view antes de desplegar. +El editor DAX no subraya las infracciones indirectas, así que comprueba si aparecen en @messages-view antes de implementar. -Una infracción en un extremo de la relación también aparece en la propiedad **Mensajes de error** de la relación. Se comprueban tanto las relaciones activas como las inactivas, y los errores se reportan por extremo, así que una relación con columnas de contexto de usuario en ambos extremos tendrá dos errores. +Una infracción de extremo de relación también aparece en la propiedad **Mensaje de error** de la relación. Se comprueban tanto las relaciones activas como las inactivas, y se informan los errores por extremo, por lo que una relación con columnas de contexto de usuario en ambos lados tiene dos. > [!NOTE] -> `te validate --errors-only` sigue reportando estas infracciones, ya que la opción solo oculta advertencias y antipatrones. +> `te validate --errors-only` sigue informando de estas infracciones, ya que la opción solo oculta las advertencias y los antipatrones. -## Pasos a seguir +## Próximos pasos -- @vista de mensajes +- @messages-view - @dax-editor -- @preferencias +- @preferences diff --git a/localizedContent/es/content/tutorials/direct-lake-guidance.md b/localizedContent/es/content/tutorials/direct-lake-guidance.md index c984096cc..3fc66eeff 100644 --- a/localizedContent/es/content/tutorials/direct-lake-guidance.md +++ b/localizedContent/es/content/tutorials/direct-lake-guidance.md @@ -1,8 +1,8 @@ ---- +--- uid: direct-lake-guidance title: Guía de Direct Lake author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-26 applies_to: products: - product: Tabular Editor 2 @@ -17,87 +17,99 @@ applies_to: - edition: Enterprise full: true --- - # Guía de Direct Lake -Con el lanzamiento de Tabular Editor 3.22.0, hemos añadido compatibilidad con Direct Lake en OneLake, además de con Direct Lake en SQL. Este artículo ofrece una breve descripción de las diferencias entre estos dos modos y de cómo se comparan con otros modos de almacenamiento disponibles en modelos semánticos de Power BI. +Con el lanzamiento de Tabular Editor 3.22.0, hemos añadido compatibilidad con Direct Lake en OneLake, además de con Direct Lake en SQL. Este artículo ofrece una breve descripción general de las diferencias entre estos dos modos y cómo se comparan con otros modos de almacenamiento disponibles en los modelos semánticos de Power BI. -## Resumen de los modos de almacenamiento +## Descripción general del modo de almacenamiento -La siguiente tabla resume los modos de almacenamiento disponibles en modelos semánticos de Power BI: +La siguiente tabla resume los modos de almacenamiento disponibles en los modelos semánticos de Power BI: -| Modo de almacenamiento | Descripción | Casos de uso recomendados | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Import | Los datos se importan al modelo semántico y se almacenan en la caché en memoria del modelo (VertiPaq). | Cuando necesite un rendimiento de consulta rápido y pueda permitirse actualizar los datos periódicamente. | -| DirectQuery | Los datos se consultan directamente desde el origen en el momento de la consulta, sin importarse al modelo. Admite varios orígenes, como SQL, KQL e incluso otros modelos semánticos. | Cuando necesite acceso a datos en tiempo real o cuando el volumen de datos sea demasiado grande para caber en memoria. | -| Dual | Un modo híbrido en el que el motor puede elegir entre devolver los datos importados o delegar en DirectQuery, según el contexto de la consulta. | Cuando tu modelo contiene una mezcla de tablas DirectQuery e Import (por ejemplo, al usar agregaciones) y tienes tablas relacionadas con ambas. | -| Direct Lake en OneLake | Utiliza el formato de almacenamiento Delta Parquet para cargar rápidamente los datos en la memoria del modelo semántico cuando sea necesario. | Cuando tus datos ya están disponibles como tablas o vistas materializadas en un Warehouse o Lakehouse de Fabric. | -| Direct Lake en SQL | Versión anterior de Direct Lake que utiliza el punto de conexión de análisis SQL de un Warehouse o un Lakehouse de Fabric. | No se recomienda para nuevos desarrollos (utilice Direct Lake en OneLake en su lugar). | +| Modo de almacenamiento | Descripción | Casos de uso recomendados | +|--------------|-------------|-----------------------| +| Importación | Los datos se importan al modelo semántico y se almacenan en la caché en memoria del modelo (VertiPaq). | Cuando necesitas un rendimiento rápido de las consultas y puedes permitirte actualizar los datos periódicamente. | +| DirectQuery | Los datos se consultan directamente desde el origen en el momento de la consulta, sin importarlos al modelo. Admite varias fuentes, como SQL, KQL e incluso otros modelos semánticos. | Cuando necesitas acceder a los datos en tiempo real o cuando el volumen de datos es demasiado grande para caber en la memoria. | +| Dual | Un modo híbrido en el que el motor puede elegir entre devolver los datos importados o delegar en DirectQuery, según el contexto de la consulta. | Cuando su modelo contiene una combinación de tablas DirectQuery e Import (por ejemplo, cuando se utilizan agregaciones) y tiene tablas que están relacionadas con ambas. | +| Direct Lake en OneLake | Utiliza el formato de almacenamiento Delta Parquet para intercambiar rápidamente los datos a la memoria del modelo semántico cuando sea necesario. | Cuando sus datos ya están disponibles como tablas o vistas materializadas en un almacén de Fabric o en un lakehouse. | +| Direct Lake en SQL | Versión anterior de Direct Lake que utiliza el punto de conexión de análisis de SQL de los almacenes o lakehouses de Fabric. | No se recomienda para nuevos desarrollos (utilice Direct Lake en OneLake en su lugar). | > [!NOTE] -> También es posible crear tablas que contengan una combinación de particiones en modo **Import** y **DirectQuery** (también conocidas como "tablas híbridas"). Esto se suele hacer en tablas de hechos grandes que requieren actualización incremental, mientras que parte de los datos se consulta directamente desde el origen. Consulta [este artículo](https://learn.microsoft.com/power-bi/connect-data/incremental-refresh-xmla) para obtener más información. +> También es posible crear tablas que contengan una combinación de particiones en modo **Importación** y **DirectQuery** (también conocidas como «tablas híbridas»). Esto suele hacerse en tablas de hechos grandes que requieren una actualización incremental mientras se consultan algunos datos directamente desde el origen. Consulta [este artículo](https://learn.microsoft.com/power-bi/connect-data/incremental-refresh-xmla) para obtener más información. -## Direct Lake en OneLake vs. Direct Lake en SQL +## Direct Lake en OneLake frente a Direct Lake en SQL -[Direct Lake en OneLake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#key-concepts-and-terminology) se introdujo en marzo de 2025 como alternativa a Direct Lake en SQL. Con Direct Lake en OneLake, no hay dependencia del punto de conexión SQL ni se recurre al modo DirectQuery. Esto también significa que las [restricciones habituales de los modelos DirectQuery](https://learn.microsoft.com/power-bi/connect-data/desktop-directquery-about#modeling-limitations) no se aplican a los modelos Direct Lake en OneLake. +[Direct Lake en OneLake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#key-concepts-and-terminology) se introdujo en marzo de 2025 como alternativa a Direct Lake en SQL. Con Direct Lake en OneLake, no hay dependencia del punto de conexión SQL ni recurso al modo DirectQuery. Esto también significa que las [restricciones habituales que se aplican a los modelos DirectQuery](https://learn.microsoft.com/power-bi/connect-data/desktop-directquery-about#modeling-limitations) no se aplican a los modelos Direct Lake en OneLake. > [!NOTE] -> Direct Lake en OneLake está actualmente en vista previa pública. Debes habilitar la configuración del inquilino **User can create Direct Lake on OneLake semantic models (preview)** en el portal de administración de Fabric antes de poder crear modelos semánticos con este modo de almacenamiento de tablas. +> Direct Lake en OneLake se encuentra actualmente en versión preliminar pública. Debe habilitar la configuración del inquilino **El usuario puede crear modelos semánticos de Direct Lake en OneLake (vista previa)** en el portal de administración de Fabric antes de poder crear modelos semánticos con este modo de almacenamiento de tablas. + +Sin embargo, al igual que con Direct Lake en SQL, todavía hay algunas [limitaciones que *sí* se aplican](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations). Entre las limitaciones principales se incluyen las siguientes: + +- Las columnas calculadas en las tablas de Direct Lake en OneLake son compatibles en la versión preliminar, y solo con el contexto de expresión «UserContext». Direct Lake en SQL no admite columnas calculadas. Consulte [Columnas calculadas en Direct Lake en OneLake](#calculated-columns-on-direct-lake-on-onelake). +- Las tablas calculadas no pueden hacer referencia a columnas o tablas en el modo de almacenamiento Direct Lake. Los grupos de cálculos, los parámetros de simulación y los parámetros de campo son compatibles porque crean tablas calculadas implícitas que no hacen referencia a columnas Direct Lake. +- Las vistas SQL no materializadas no son compatibles como orígenes de datos para las tablas de Direct Lake en OneLake. Utilice vistas materializadas o asegúrese de que la tabla Delta de origen contenga las columnas que necesita. +- Los accesos directos en un lakehouse no son compatibles como fuentes de datos durante la vista previa pública de Direct Lake en OneLake. -Sin embargo, al igual que con Direct Lake en SQL, siguen existiendo algunas [limitaciones que _sí_ se aplican](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations). Entre las principales limitaciones se incluyen: +Para obtener una lista completa y actualizada de las limitaciones, consulte la [documentación de Microsoft sobre consideraciones y limitaciones de Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations). -- Las columnas calculadas en Direct Lake sobre tablas de OneLake se admiten en versión preliminar, pero solo en _contexto de usuario_: el valor se evalúa en el momento de la consulta para el usuario actual, en lugar de materializarse. Esto significa que una columna calculada de Direct Lake respeta la seguridad de nivel de fila y la seguridad a nivel de objetos, pero no se puede usar como clave de relación y no responde a los filtros ni a las segmentaciones de un Report. Use una medida en su lugar cuando el resultado deba reaccionar al contexto de filtro. Direct Lake en SQL sigue sin admitir columnas calculadas en absoluto. Consulta [Desarrollar modelos semánticos de Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-develop) para obtener más detalles. -- Las tablas calculadas no pueden hacer referencia a columnas ni tablas en el modo de almacenamiento Direct Lake. Se admiten los grupos de cálculo, los parámetros de tipo what-if y los parámetros de campo, porque crean tablas calculadas implícitas que no hacen referencia a columnas de Direct Lake. -- Las vistas SQL no materializadas no se admiten como Data sources para tablas de Direct Lake en OneLake. Usa vistas materializadas o asegúrate de que la tabla Delta de origen contenga las columnas que necesitas. -- Los accesos directos en un Lakehouse no se admiten como Data sources durante la versión preliminar pública de Direct Lake en OneLake. +### Columnas calculadas en Direct Lake en OneLake -Para obtener una lista completa y actualizada de las limitaciones, consulta la [documentación de Microsoft sobre consideraciones y limitaciones de Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations). +Una columna calculada de una tabla de Direct Lake en OneLake debe tener su propiedad `ExpressionContext` establecida en `UserContext`. La columna se evalúa en el momento de la consulta y no se materializa, por lo que no se puede usar en una relación. Las nuevas columnas calculadas usan `Standard` de forma predeterminada. Si una columna calculada de una tabla Direct Lake se establece en `Standard` cuando guarda el modelo en el servicio Power BI, el guardado falla con el error «El contexto de expresión predeterminado no se puede usar para columnas calculadas en tablas Direct Lake». + +La propiedad **Contexto de expresión** aparece en la @properties-view solo cuando el nivel de compatibilidad del modelo es 1705 o superior. Establézcala en cada columna calculada de una tabla Direct Lake en OneLake: + +1. Seleccione el modelo en la @tom-explorer-view y compruebe el **Nivel de compatibilidad** en **Base de datos** en la @properties-view. Si es inferior a 1705, actualice el modelo como se describe en @update-compatibility-level. +2. Seleccione la columna calculada en la @tom-explorer-view. +3. En **Opciones** en la @properties-view, establezca **Contexto de expresión** en «UserContext». +4. Guarde el modelo. + +Las columnas calculadas de las tablas de importación del mismo modelo pueden usar cualquiera de los dos contextos de expresión. Para los objetos que no pueden hacer referencia a una columna de contexto de usuario, consulte @user-context-calculated-columns. Microsoft enumera las combinaciones compatibles de modo de almacenamiento y contexto de expresión en [Uso de columnas calculadas en Power BI Desktop](https://learn.microsoft.com/power-bi/transform-model/desktop-calculated-columns#materialization-and-performance). ### Modelos compuestos -Si necesita una columna calculada que se materialice, pueda usarse como clave de relación o responda a los filtros y las segmentaciones de un Report, la característica de columnas calculadas en versión preliminar mencionada arriba no es suficiente. En ese caso, cree un **modelo compuesto** combinando tablas de Direct Lake con tablas en modo Import. Esto se admite con Direct Lake en OneLake, pero no con Direct Lake en SQL. En un modelo compuesto, normalmente se mantienen las tablas de hechos más grandes en modo Direct Lake, mientras que se usa Import mode para las tablas de dimensiones más pequeñas en las que se necesitan columnas calculadas completas o agrupaciones personalizadas. +Si necesita una columna calculada que esté materializada o que se pueda usar como clave de relación, cree un **modelo compuesto** combinando tablas Direct Lake con tablas de importación y añada la columna calculada a una tabla de importación. Esto es compatible con Direct Lake en OneLake, pero no con Direct Lake en SQL. En un modelo compuesto, normalmente mantiene las tablas de hechos más grandes en modo Direct Lake, mientras que utiliza el modo Importación para las tablas de dimensiones más pequeñas en las que necesita columnas calculadas completas o agrupaciones personalizadas. -Direct Lake en OneLake también admite la combinación con tablas DirectQuery mediante herramientas basadas en XMLA, como Tabular Editor. Las tablas en modo Import se pueden agregar mediante el modelado web de Power BI, Power BI Desktop (edición en vivo) o mediante herramientas XMLA. +Direct Lake en OneLake también admite la combinación con tablas DirectQuery mediante herramientas basadas en XMLA, como Tabular Editor. Las tablas de importación se pueden añadir mediante el modelado web de Power BI, Power BI Desktop (edición en vivo) o mediante herramientas XMLA. > [!NOTE] -> Direct Lake en SQL no admite modelos compuestos. No puedes combinar tablas de Direct Lake en SQL con tablas en modo de almacenamiento Import, DirectQuery o Dual en el mismo modelo semántico. Sin embargo, puedes usar Power BI Desktop para crear un modelo compuesto _sobre_ un modelo semántico de Direct Lake en SQL y ampliarlo con tablas nuevas. Para más información, consulta [Crear un modelo compuesto en un modelo semántico](https://learn.microsoft.com/power-bi/transform-model/desktop-composite-models#building-a-composite-model-on-a-semantic-model-or-model). +> Direct Lake en SQL no admite modelos compuestos. No puede combinar tablas de Direct Lake en SQL con tablas en modo de almacenamiento de importación, DirectQuery o dual en el mismo modelo semántico. Sin embargo, puede utilizar Power BI Desktop para crear un modelo compuesto *sobre* un modelo semántico de Direct Lake en SQL y ampliarlo con nuevas tablas. Consulta [Crear un modelo compuesto sobre un modelo semántico](https://learn.microsoft.com/power-bi/transform-model/desktop-composite-models#building-a-composite-model-on-a-semantic-model-or-model) para obtener más información. -## Intercalación +## intercalación -Al usar **Direct Lake en OneLake**, la intercalación del modelo es la misma que la de un modelo en modo Import mode, que de forma predeterminada no distingue mayúsculas de minúsculas. +Cuando se utiliza **Direct Lake en OneLake**, la intercalación del modelo es la misma que la de un modelo de importación, que no distingue entre mayúsculas y minúsculas de forma predeterminada. -En un modelo **Direct Lake en SQL**, la intercalación no distingue mayúsculas de minúsculas para las consultas que no recurren a DirectQuery. Si la consulta necesita recurrir a DirectQuery, la intercalación depende de la intercalación del origen. En un Warehouse de Fabric, la intercalación puede distinguir mayúsculas de minúsculas; en ese caso, deberías especificar una [intercalación que distinga mayúsculas de minúsculas en el modelo](https://data-goblins.com/power-bi/case-specific). +En el caso de un modelo **Direct Lake en SQL**, la intercalación no distingue entre mayúsculas y minúsculas en las consultas que no recurren a DirectQuery. Si la consulta sí recurre a DirectQuery, el intercalado depende del intercalado del origen. En el caso de un almacén de Fabric, es posible que la intercalación distinga entre mayúsculas y minúsculas. En ese caso, debe especificar una [intercalación que distinga entre mayúsculas y minúsculas en el modelo](https://data-goblins.com/power-bi/case-specific). > [!NOTE] -> No puedes cambiar la intercalación de un modelo una vez que los metadatos se han desplegado en Analysis Services / Power BI. Por lo tanto, si planeas usar Direct Lake en SQL con un Warehouse de Fabric con distinción entre mayúsculas y minúsculas, debes establecer la intercalación en los metadatos del modelo antes de implementarlo: +> No se puede cambiar la intercalación de un modelo una vez que los metadatos se han implementado en Analysis Services / Power BI. Por lo tanto, si tiene previsto utilizar Direct Lake en SQL con un almacén de Fabric que distingue entre mayúsculas y minúsculas, debe establecer la intercalación en los metadatos del modelo antes de implementarlo: > -> 1. Crea un nuevo modelo en Tabular Editor 3 (Archivo > Nuevo > Modelo...) -> 2. Desmarca "Use Workspace database" -> 3. Establece la propiedad **Collation** del modelo en `Latin1_General_100_BIN2_UTF8` -> 4. Guarda el modelo (Ctrl+S). -> 5. Ahora, abre el modelo desde el archivo que acabas de guardar. Cuando se te solicite conectarte a una base de datos del Workspace, elige "Sí". +> 1. Cree un nuevo modelo en Tabular Editor 3 (Archivo > Nuevo > Modelo...) +> 2. Desmarque «Usar base de datos del área de trabajo». +> 3. Establezca la propiedad ** intercalación ** del modelo como «Latin1_General_100_BIN2_UTF8» +> 4. Guarde el modelo (Ctrl+S). +> 5. Ahora, abra el modelo desde el archivo que acaba de guardar. Cuando se le pida que se conecte a una base de datos de área de trabajo, elija «Sí». > -> Con este enfoque, los metadatos del modelo se implementan desde el inicio con la intercalación correcta, y luego puedes agregar tablas en modo Direct Lake en SQL sin encontrarte con problemas de intercalación. +> Con este enfoque, los metadatos del modelo se implementan con el intercalado correcto desde el principio, y luego puedes añadir tablas en Direct Lake en modo SQL sin encontrarte con problemas de intercalado. -## Asistente para importar tablas +## Asistente para la importación de tablas -Para agregar tablas Direct Lake con el Asistente para importar tablas de Tabular Editor 3, elige **Microsoft Fabric Lakehouse**, **Microsoft Fabric Warehouse**, **Microsoft Fabric SQL Database** o **Microsoft Fabric Mirrored Database** como origen: +Para añadir tablas de Direct Lake utilizando el Asistente para la importación de tablas de Tabular Editor 3, elija **Microsoft Fabric Lakehouse**, **Microsoft Fabric Warehouse**, **Microsoft Fabric SQL Database** o **Microsoft Fabric Mirrored Database** como origen: -![Asistente de importación de tablas: Fabric](../assets/images/import-table-wizard-fabric.png) +![Asistente para la importación de tablas de Fabric](../assets/images/import-table-wizard-fabric.png) -Tras iniciar sesión, se te mostrará una lista de todos los Lakehouses y Warehouses de Fabric disponibles en los Workspaces a los que tengas acceso. Selecciona el que quieras para conectarte y pulsa **Aceptar**: +Después de iniciar sesión, se te mostrará una lista de todos los lakehouses/almacenes de Fabric disponibles en los espacios de trabajo a los que tienes acceso. Seleccione aquel al que desee conectarse y pulse **Aceptar**: -![Asistente de importación de tablas: seleccionar Lakehouse](../assets/images/import-table-wizard-select-lakehouse.png) +![Asistente para la importación de tablas: seleccionar lakehouse](../assets/images/import-table-wizard-select-lakehouse.png) -A menos que quieras especificar una consulta SQL personalizada o configurar las tablas para el modo DirectQuery, simplemente pulsa **Siguiente** para seleccionar las tablas desde una lista de tablas/vistas en el origen: +A menos que desee especificar una consulta SQL personalizada o configurar las tablas para el modo DirectQuery, simplemente pulse **Siguiente** para seleccionar las tablas de una lista de tablas/vistas del origen: -![Asistente de importación de tablas: seleccionar frente a consulta personalizada](../assets/images/import-table-wizard-select-vs-custom-query.png) +![Asistente de importación de tablas: selección frente a consulta personalizada](../assets/images/import-table-wizard-select-vs-custom-query.png) -Selecciona las tablas/vistas que quieras importar. Ten en cuenta que las **vistas no materializadas** no se admiten en el modo Direct Lake en OneLake. Al intentar agregar una vista de este tipo al modelo, se producirá un error al guardar los metadatos del modelo. +Selecciona las tablas/vistas que quieres importar. Tenga en cuenta que las **vistas no materializadas** no son compatibles con el modo Direct Lake en OneLake. Si intenta añadir una vista de este tipo al modelo, se producirá un error al guardar los metadatos del modelo. ![Asistente de importación de tablas: seleccionar objetos](../assets/images/import-table-wizard-select-objects.png) -En la última página, elige con qué modo quieres que se configure la partición de la tabla: +En la última página, elija con qué modo desea que se configure la partición de la tabla: ![Modo de partición del asistente de importación de tablas](../assets/images/table-import-wizard-partition-mode.png) @@ -105,30 +117,30 @@ Las opciones son: - Direct Lake en OneLake - Direct Lake en SQL -- Importación (M) +- Importar (M) > [!NOTE] -> Si estás trabajando en un modelo que ya contiene tablas, es posible que una o varias de las opciones mencionadas anteriormente no estén disponibles si el modelo no admite combinar tablas con distintos modos de almacenamiento. Por ejemplo, si el modelo contiene una tabla en modo Direct Lake en SQL, no puedes agregar tablas en otros modos. +> Si está trabajando en un modelo que ya contiene tablas, es posible que una o varias de las opciones mencionadas anteriormente no estén disponibles si el modelo no admite la combinación de tablas en diferentes modos de almacenamiento. Por ejemplo, si el modelo contiene una tabla en modo Direct Lake en SQL, no puede añadir tablas en otros modos. -La tabla importada ya incluye sus columnas, en el mismo orden que en el origen, y no es necesario ejecutar **Actualizar esquema de tabla** después de la importación. Si Tabular Editor no puede determinar el punto de conexión de análisis SQL del Lakehouse o del Warehouse, y la configuración de importación no especifica uno, la importación falla con un error que indica la configuración que falta y no se crea ninguna tabla. +La tabla importada ya tiene sus columnas, en el mismo orden que en el origen, y no es necesario ejecutar **Actualizar esquema de tabla** después de la importación. Si Tabular Editor no puede determinar el punto de conexión de análisis SQL del lakehouse o del almacén y los ajustes de importación no especifican ninguno, la importación falla con un error que indica el ajuste que falta y no se crea ninguna tabla. -## Inspeccionar una partición de Direct Lake +## Inspección de una partición Direct Lake -Una partición de Direct Lake no tiene expresión de consulta. Al seleccionar una en @tom-explorer-view, el **Editor de expresiones** muestra su `Data Coverage Definition Expression` o nada si la partición no tiene una definición de cobertura de datos. Las particiones generadas por una política de actualización incremental se comportan igual. +Una partición de Direct Lake no tiene expresión de consulta. Cuando selecciona una en la @tom-explorer-view, el **Editor de expresiones** muestra su «Expresión de definición de cobertura de datos», o nada si la partición no tiene una definición de cobertura de datos. Las particiones generadas por una directiva de actualización incremental se comportan de la misma manera. ## Expresiones de Power Query (M) -Esta sección incluye una descripción más técnica de cómo deben configurarse los objetos y las propiedades de TOM, en caso de que quieras configurar manualmente tablas para el modo Direct Lake sin usar el Asistente para importar tablas. +Esta sección contiene una descripción más técnica sobre cómo deben configurarse los objetos y las propiedades de TOM, en caso de que desee configurar manualmente las tablas para el modo Direct Lake sin utilizar el Asistente para la importación de tablas. ### Direct Lake en OneLake -Para configurar manualmente una tabla en el modo **Direct Lake en OneLake**, debes hacer lo siguiente: +Para configurar manualmente una tabla para el modo **Direct Lake en OneLake**, debe hacer lo siguiente: -1. **Crear expresión compartida**: las tablas de Direct Lake usan particiones de tipo "Entity", que deben hacer referencia a una expresión compartida en el modelo. Empieza por crear esta expresión compartida si todavía no la tienes. Asígnale el nombre `DatabaseQuery`: +1. **Crear una expresión compartida**: Las tablas de Direct Lake utilizan particiones de «Entidad», que deben hacer referencia a una expresión compartida en el modelo. Empieza por crear esta expresión compartida, si aún no la tienes. Llámala «DatabaseQuery»: -![Create Shared Expression](../assets/images/create-shared-expression.png) +![Crear expresión compartida](../assets/images/create-shared-expression.png) -2. **Configurar la expresión compartida**: Establece la propiedad **Kind** de la expresión que creaste en el paso 1 en "M" y la propiedad **Expression** en la siguiente consulta M, sustituyendo los ID de la URL por los correspondientes a tu Workspace de Fabric y a tu Lakehouse/Warehouse: +2. **Configurar la expresión compartida**: Establezca la propiedad **Tipo** de la expresión que creó en el paso 1 en «M» y establezca la propiedad **Expresión** en la siguiente consulta M, sustituyendo los identificadores de la URL por los de su área de trabajo de Fabric y su lakehouse/almacén: ```m let @@ -137,38 +149,38 @@ in Source ``` -3. **Crear tabla y partición de entidad**: crea una nueva tabla en el modelo (Alt+5), luego expande las particiones de la tabla en el Explorador TOM y crea una nueva _Entity Partition_: - -![Crear partición de entidad](../assets/images/create-entity-partition.png) +3. **Crear tabla y partición de entidad**: Cree una nueva tabla en el modelo (Alt+5), luego expanda las particiones de tabla en el Explorador TOM y cree una nueva *Partición de entidad*: + + ![Crear partición de entidad](../assets/images/create-entity-partition.png) -Elimina la partición de importación estándar que se creó automáticamente al crear la tabla. + Elimine la partición de importación normal que se creó automáticamente cuando creó la tabla. -4. **Configurar la partición de entidad**: establece las siguientes propiedades en la partición de entidad: +4. **Configurar la partición de entidad**: Establezca las siguientes propiedades en la partición de entidad: -| Propiedad | Valor | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Nombre | (Recomendado) Establécelo con el mismo nombre que la tabla | -| Nombre de entidad | (Obligatorio) Establécelo con el nombre de la tabla en el Lakehouse/Warehouse | -| Origen de la expresión | (Obligatorio) Establécelo en la expresión compartida que creaste en el paso 1; normalmente `DatabaseQuery` | -| Modo | (Obligatorio) `DirectLake` | -| Nombre del esquema | (Opcional) Establécelo con el nombre del esquema en el Lakehouse/Warehouse, si corresponde. Si no lo configuras, se usará el esquema predeterminado. | +| Propiedad | Valor | +| ----------|-------| +| Nombre | (Recomendado) Establecer el mismo nombre que la tabla | +| Nombre de la entidad | (Obligatorio) Establecer el nombre de la tabla en el lakehouse/almacén | +| Origen de la expresión | (Obligatorio) Establezca la expresión compartida que creó en el paso 1, normalmente «DatabaseQuery» | +| Modo | (Obligatorio) `DirectLake` | +| Nombre del esquema | (Opcional) Establézcalo como el nombre del esquema en el lakehouse/almacén, si corresponde. Si no se establece, se usará el esquema predeterminado. | -El resultado final debería verse así: + El resultado final debería tener este aspecto: -![Configurar la partición de la entidad](../assets/images/configure-entity-partition.png) +![Configurar partición de entidad](../assets/images/configure-entity-partition.png) -5. **Actualizar metadatos de columnas**: En este punto, deberías poder usar la función **Update Table Schema** de Tabular Editor para actualizar los metadatos de las columnas de la tabla. Esto recuperará automáticamente los nombres de las columnas y los tipos de datos desde el Lakehouse/Warehouse: +5. **Actualizar los metadatos de las columnas**: En esta fase, debería poder utilizar la función **Actualizar esquema de tabla** de Tabular Editor para actualizar los metadatos de las columnas de la tabla. Esto recuperará automáticamente los nombres de las columnas y los tipos de datos del lakehouse/almacén: -![Actualizar el esquema de la tabla de entidad](../assets/images/update-table-schema-entity.png) +![Actualizar entidad de esquema de tabla](../assets/images/update-table-schema-entity.png) -Como alternativa, agrega manualmente columnas de datos a la tabla (Alt+4) y especifica `Name`, `Data Type`, `Source Column` y cualquier otra propiedad relevante para cada columna. + Como alternativa, añada manualmente columnas de datos a la tabla (Alt+4) y especifique el «Nombre», el «Tipo de datos», la «Columna de origen» y cualquier otra propiedad relevante para cada columna. > [!NOTE] -> Cuando se agrega una tabla de Direct Lake al modelo, es necesario "actualizarla" manualmente después de la primera implementación de metadatos. De lo contrario, la tabla no contendrá datos cuando se consulte. Esta actualización solo debe realizarse una vez. Tabular Editor 3 actualizará automáticamente la tabla al guardar los metadatos del modelo, si está activada la opción **Actualizar automáticamente al guardar nuevas tablas** en **Herramientas > Preferencias > Implementación del modelo > Actualización de datos**. +> Cuando se agrega una tabla Direct Lake al modelo, es necesario «actualizarla» manualmente después de la primera implementación de metadatos. De lo contrario, la tabla no contendrá ningún dato cuando se consulte. Esta actualización solo debe realizarse una vez. Tabular Editor 3 actualizará automáticamente la tabla cuando se guarden los metadatos del modelo, si está activada la opción **Actualización automática al guardar nuevas tablas** en **Herramientas > Preferencias > Implementación del modelo > Actualización de datos**. ### Direct Lake en SQL -Para configurar manualmente una tabla en modo **Direct Lake en SQL**, sigue los pasos de la sección anterior para Direct Lake en OneLake, pero usa en su lugar la siguiente consulta M en la expresión compartida: +Para configurar manualmente una tabla para el modo **Direct Lake en SQL**, siga los pasos de la sección anterior para Direct Lake en OneLake, pero utilice la siguiente consulta M en la expresión compartida: ```m let @@ -177,17 +189,17 @@ in database ``` -Reemplaza `` por la cadena de conexión del [punto de conexión de análisis SQL del Warehouse de Fabric](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse) o del [Lakehouse](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint), y `` por el nombre del Warehouse o del Lakehouse. +Sustituye `` por la cadena de conexión del [punto de conexión de análisis SQL del almacén de Fabric](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse) o del [lakehouse](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint), y `` por el nombre del almacén o del lakehouse. -### Importar desde Lakehouse / Warehouse +### Importación desde Lakehouse / Warehouse -Si quieres configurar una tabla en modo **Import** y obtener los datos de un Lakehouse o Warehouse de Fabric, sigue estos pasos: +Si quieres configurar una tabla para el modo **Importación** mientras obtienes datos de un Lakehouse o Warehouse de Fabric, los pasos son los siguientes: -1. **Crear tabla**: Crea una tabla nueva en el modelo (Alt+5) y, después, expande las particiones de la tabla en el Explorador TOM. De forma predeterminada, deberías ver una única partición de tipo "Import" creada automáticamente: +1. **Crear tabla**: Cree una nueva tabla en el modelo (Alt+5) y, a continuación, expanda las particiones de la tabla en el Explorador TOM. De forma predeterminada, debería ver una única partición de tipo «Importación» creada automáticamente: -![Partición Import en M](../assets/images/m-import-partition.png) +![Partición de importación M](../assets/images/m-import-partition.png) -2. **Configurar la partición Import**: Establece la siguiente consulta M en la partición Import: +2. **Configurar la partición de importación**: Establezca la siguiente consulta M en la partición de importación: ```m let @@ -197,19 +209,19 @@ in Data ``` -Reemplaza `` por la cadena de conexión del [punto de conexión de análisis SQL del Warehouse de Fabric](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse) o del [Lakehouse](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint), y `` por el nombre del Warehouse o del Lakehouse. +Sustituye `` por la cadena de conexión del [punto de conexión de análisis SQL del almacén de Fabric](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse) o del [lakehouse](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint), y `` por el nombre del almacén o del lakehouse. -Reemplaza `` por el nombre del esquema en el Warehouse/Lakehouse y `
    ` por el nombre de la tabla o vista que quieras importar. Ten en cuenta que las tablas en Import mode pueden usar vistas no materializadas como Data source, ya que los datos se consultan a través del punto de conexión de análisis SQL durante las operaciones de actualización. +Sustituya `` por el nombre del esquema en el almacén/lakehouse y `
    ` por el nombre de la tabla o vista que quiera importar. Tenga en cuenta que las tablas en modo de importación pueden usar vistas no materializadas como origen de datos, ya que los datos se consultan a través del punto de conexión SQL durante las operaciones de actualización. -3. **Actualizar metadatos de columnas** (solo configuración manual): como una partición configurada manualmente no tiene columnas, puede usar la característica **Actualizar esquema de tabla** de Tabular Editor para recuperar los nombres de las columnas y los tipos de datos del Lakehouse/Warehouse. Como alternativa, crea columnas de datos manualmente (**Alt+4**) y especifica `Name`, `Data Type`, `Source Column` y cualquier otra propiedad relevante para cada columna. +3. **Actualizar los metadatos de las columnas** (solo en la configuración manual): dado que una partición que ha configurado manualmente no tiene columnas, utilice la función **Actualizar esquema de tabla** de Tabular Editor para recuperar los nombres de las columnas y los tipos de datos del lakehouse/almacén de datos. Como alternativa, cree columnas de datos manualmente (**Alt+4**) y especifique el «Nombre», el «Tipo de datos», la «Columna de origen» y cualquier otra propiedad relevante para cada columna. ## Conversión entre modos de almacenamiento -Es sencillo convertir entre Direct Lake en SQL y Direct Lake en OneLake usando la información de este artículo, porque solo necesitas modificar la consulta M de la expresión compartida a la que hacen referencia las particiones de Direct Lake. +Es fácil pasar de Direct Lake en SQL a Direct Lake en OneLake y viceversa utilizando la información de este artículo, ya que solo tiene que modificar la consulta M de la expresión compartida a la que hacen referencia las particiones de Direct Lake. -Si quieres convertir de Import a Direct Lake, es un poco más complicado debido a los distintos tipos de partición implicados. +Si desea convertir de Import a Direct Lake, es un poco más complicado debido a los diferentes tipos de particiones implicados. -Para ponértelo más fácil, hemos preparado un conjunto de C# Scripts que pueden ayudarte a convertir entre distintos modos de almacenamiento: +Para facilitarte las cosas, hemos preparado un conjunto de scripts de C# que pueden ayudarte a realizar conversiones entre diferentes modos de almacenamiento: - [Convertir Direct Lake en SQL a Direct Lake en OneLake](xref:script-convert-dlsql-to-dlol) -- [Convertir Import a Direct Lake en OneLake](xref:script-convert-import-to-dlol) \ No newline at end of file +- [Convertir de Importación a Direct Lake en OneLake](xref:script-convert-import-to-dlol) \ No newline at end of file diff --git a/localizedContent/zh/.translation-status.json b/localizedContent/zh/.translation-status.json index fb79b55ab..8a7dd5c70 100644 --- a/localizedContent/zh/.translation-status.json +++ b/localizedContent/zh/.translation-status.json @@ -307,7 +307,7 @@ "status": "translated" }, "features/Semantic-Model/semantic-model-types.md": { - "sourceHash": "sha256:c6bc2434213fc85c0062d07e80f8e0341d4375cce84561d770944e00a7f1b1d0", + "sourceHash": "sha256:9f9e907aebbe834fc734867a3c7c054d7b4deafa71295806d20ad524c7f25e74", "status": "translated" }, "features/table-groups.md": { @@ -387,7 +387,7 @@ "status": "translated" }, "features/user-context-calculated-columns.md": { - "sourceHash": "sha256:2d7a43f84729d3d925e4d918752c57a05335335e8af7547bc7f829a833e46751", + "sourceHash": "sha256:75b6912c5c35999747fe9493f6af6f582d0561cf9e47377882cdb3f9a5fdcddd", "status": "translated" }, "features/using-bpa-sample-rules-expressions.md": { @@ -1675,7 +1675,7 @@ "status": "translated" }, "tutorials/direct-lake-guidance.md": { - "sourceHash": "sha256:964fbdf58e990aee599a3a27f26d5b302cafd8bf85c950a79eebb84f497f1a2d", + "sourceHash": "sha256:10e0826eb1daa6a7cc5698408baced6facf55b7bbee3172deec7585aad50c6fb", "status": "translated" }, "tutorials/importing-tables.md": { diff --git a/localizedContent/zh/content/features/Semantic-Model/semantic-model-types.md b/localizedContent/zh/content/features/Semantic-Model/semantic-model-types.md index bf90292e7..dd5c84a92 100644 --- a/localizedContent/zh/content/features/Semantic-Model/semantic-model-types.md +++ b/localizedContent/zh/content/features/Semantic-Model/semantic-model-types.md @@ -1,8 +1,8 @@ ---- +--- uid: semantic-model-types title: Power BI 语义模型类型 author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-26 applies_to: products: - product: Tabular Editor 2 @@ -17,59 +17,63 @@ applies_to: full: true --- + # 语义模型类型 -Tabular Editor 支持多种不同的模型类型。下面概述了哪些模型类型可与 Tabular Editor 一起使用,以及每种模型类型可使用哪些功能。 +Tabular Editor 可以与多种不同类型的模型配合使用。以下概述了哪些模型类型可与 Tabular Editor 一起使用,以及每种模型类型可使用的功能。 -| 模型类型 | 导入 | DirectQuery | OneLake 上的 Direct Lake | SQL 上的 Direct Lake | .pbix | .pbip | -| -------------------------------------- | -- | ----------- | --------------------------------------- | ------------------------------------------ | --------------------- | --------------------- | -| 在 Tabular Editor 中连接 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| 创建新模型 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 编写度量值 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 创建和编辑表格 | ✔️ | ✔️ | ✔️[1](#DirectLake) | ✔️[1](#DirectLake) | ✔️ | ✔️ | -| 创建和编辑分区 | ✔️ | ✔️ | ✔️[1](#DirectLake) | ✔️[1](#DirectLake) | ✔️ | ✔️ | -| 创建和编辑列 | ✔️ | ✔️ | ✔️[1](#DirectLake) | ✔️[1](#DirectLake) | ✔️ | ✔️ | -| 创建和编辑计算表格 | ✔️ | ✔️ | ✔️[2](#DirectLakeCalculated) | ✔️[4](#DirectLakeSQLCalculated) | ✔️ | ✔️ | -| 创建和编辑计算列 | ✔️ | ✔️ | ✔️[5](#DirectLakeCalcColumn) | ❌ | ✔️ | ✔️ | -| 创建和编辑计算组 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| 创建和编辑关系 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| 创建和编辑角色 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 创建/编辑透视 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 创建/编辑翻译 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 使用 Best Practice Analyzer | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | -| 编辑所有 TOM 属性 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 创建图表[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 使用预览数据[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 使用Pivot Grid[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 使用 DAX 查询[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 使用 DAX 调试器[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 使用 VertiPaq分析器[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 处理模型和表格[3](#TE3Prem) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | -| 删除对象 | ✔️ | ✔️ | ✔️ | ✔️ | | | -**图例:** +|模型类型|导入|Direct Query|Direct Lake on OneLake|Direct Lake on SQL|.pbix|.pbip| +|---|---|---|---|---|---|---| +|在 Tabular Editor 中连接|✔️|✔️|✔️|✔️|✔️| | +|创建新模型|✔️|✔️|✔️|✔️|✔️|✔️| +|编写度量值|✔️|✔️|✔️|✔️|✔️|✔️| +|创建和编辑表|✔️|✔️|✔️[1](#DirectLake)|✔️[1](#DirectLake)|✔️|✔️| +|创建和编辑分区|✔️|✔️|✔️[1](#DirectLake)|✔️[1](#DirectLake)|✔️|✔️| +|创建和编辑列|✔️|✔️|✔️[1](#DirectLake)|✔️[1](#DirectLake)|✔️|✔️| +|创建和编辑计算表|✔️|✔️|✔️[2](#DirectLakeCalculated)|✔️[4](#DirectLakeSQLCalculated)|✔️|✔️| +|创建和编辑计算列|✔️|✔️|✔️[5](#DirectLakeCalcColumn)|❌|✔️|✔️| +|创建和编辑计算组|✔️|✔️|✔️|✔️|✔️| | +|创建和编辑关系|✔️|✔️|✔️|✔️|✔️| | +|创建和编辑角色|✔️|✔️|✔️|✔️|✔️|✔️| +|创建和编辑透视|✔️|✔️|✔️|✔️|✔️|✔️| +|创建和编辑翻译|✔️|✔️|✔️|✔️|✔️|✔️| +|使用最佳实践分析器|✔️|✔️|✔️|✔️|✔️| | +|编辑所有 TOM 属性|✔️|✔️|✔️|✔️|✔️|✔️| +|创建图表[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|使用预览数据[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|使用数据透视表[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|使用 DAX 查询[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|使用 DAX 调试器[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|使用 VertiPaq Analyzer[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|处理模型和表[3](#TE3Prem)|✔️|✔️|✔️|✔️|✔️|✔️| +|删除对象|✔️|✔️|✔️|✔️| | | -- ✔️:支持 +**图例:** +- ✔️:支持 - ❌:不支持 -1 - 表分区必须是 Entity Partition,才能正常工作。 Direct Lake 模型的每个表只能有一个分区。 2 - 计算表格不能引用 OneLake 上的 Direct Lake 表或列。支持计算组、假设分析参数和字段参数。 -3 - 仅限 Tabular Editor 3 功能。通过 XMLA endpoint 执行的操作需要 Business 或 Enterprise 许可证。[更多信息](xref:editions)。 4 - SQL 上的 Direct Lake 仅支持计算组、假设分析参数和字段参数,它们会隐式创建计算表格。不支持常规计算表格。 5 - 预览功能。 OneLake 上 Direct Lake 的计算列不会被物化,而是在当前用户的查询上下文中进行计算:它们遵循行级和对象级安全性,但不能用作关系键,也不会对 Report 筛选器或切片器作出响应。有关详细信息,请参阅 [Direct Lake 指南](xref:direct-lake-guidance)。 +1 - 表分区必须是实体分区才能正常工作。Direct Lake 模型每个表只能有一个分区。 +2 - 计算表不能引用 OneLake 表或列上的 Direct Lake。支持计算组、模拟分析参数和字段参数。 -> [!NOTE] -> 2025 年六月发布的 Power BI Desktop 版本已解除对第三方工具的所有建模限制。在此之前,许多建模操作都不受支持。见 [Power BI Desktop 限制](xref:desktop-limitations)。 +3 - 仅限 Tabular Editor 3 功能。通过 XMLA endpoint 执行的操作需要 Business 或 Enterprise 许可证。[更多信息](xref:editions)。 +4 - Direct Lake on SQL 仅支持计算组、假设分析参数和字段参数,这些参数会隐式创建计算表。不支持常规计算表。 +5 - 预览功能。Direct Lake on OneLake 表上的计算列必须使用 `UserContext` 表达式上下文。它们在查询时进行评估,且不会物化,因此不能用作关系键。有关详细信息,请参阅[Direct Lake 指南](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake)。 -> [!TIP] -> 如需进一步了解 Direct Lake 模型的限制,请参阅 Microsoft 的 [Direct Lake 文档](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview) +>[!NOTE] +> Power BI Desktop 2025 年 6 月版本取消了对第三方工具的所有建模限制。在此之前,不支持各种建模操作。请参阅[Power BI Desktop 限制](xref:desktop-limitations)。 -## 不受支持的语义模型类型 +>[!TIP] +> 有关 Direct Lake 模型限制的更多详细信息,请参阅 Microsoft 的[Direct Lake 文档](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview) +## 不支持的语义模型类型 以下语义模型类型不受支持,因为它们不支持 XMLA 写入操作。 -- 基于与 Azure Analysis Services 或 SQL Server Analysis Services 模型的实时连接的报告。 +- 基于与 Azure Analysis Services 或 SQL Server Analysis Services 模型的实时连接的报表。 - 基于与 Power BI 数据集的实时连接的报告。 - 具有推送数据的模型。 -- 存储在 Power BI 我的工作区中的模型。 +- 存储在 Power BI“我的工作区”中的模型。 - 存储在 Power BI Pro 工作区中的模型。 -- Direct Lake 默认语义模型。自 2025 年九月起,创建 Warehouse、Lakehouse 或镜像项时,Power BI 不再自动创建默认语义模型。到 2025 年十一月,所有现有默认语义模型都已与其对应项断开连接,并成为独立的语义模型。可以连接到默认语义模型,但无法通过 XMLA endpoint 对其进行更改。 +- Direct Lake 默认语义模型。截至 2025 年 9 月,在创建仓库、湖仓或镜像项时,Power BI 不再自动创建默认语义模型。到 2025 年 11 月,所有现有的默认语义模型都已与其项目断开连接,成为独立的语义模型。可以连接到默认语义模型,但无法通过 XMLA 端点对其进行更改。 - Excel 工作簿语义模型。 \ No newline at end of file diff --git a/localizedContent/zh/content/features/user-context-calculated-columns.md b/localizedContent/zh/content/features/user-context-calculated-columns.md index f77838046..223e2e43a 100644 --- a/localizedContent/zh/content/features/user-context-calculated-columns.md +++ b/localizedContent/zh/content/features/user-context-calculated-columns.md @@ -2,7 +2,7 @@ uid: user-context-calculated-columns title: 用户上下文计算列 author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-26 applies_to: products: - product: Tabular Editor 2 @@ -17,53 +17,56 @@ applies_to: - edition: Enterprise full: true --- - # 用户上下文计算列 -_用户上下文计算列_是指按用户分别进行计算的计算列。其表达式可以调用 [`USERPRINCIPALNAME`](https://dax.guide/userprincipalname) 或 [`USERNAME`](https://dax.guide/username) 等函数,并为每个用户返回不同的值。相比之下,标准计算列会在处理表时计算一次,并为所有用户返回相同的值。 +*用户上下文计算列*是按用户进行评估的计算列。其表达式可以调用 [`USERPRINCIPALNAME`](https://dax.guide/userprincipalname) 或 [`USERNAME`](https://dax.guide/username) 等函数,并为每个用户返回不同的值。相比之下,标准计算列在处理表格时仅评估一次,并为所有用户返回相同的值。 -计算列的 `ExpressionContext` 属性用于设置该列是只计算一次,还是按用户分别计算: +计算列的 `ExpressionContext` 属性用于设置该列是评估一次还是针对每个用户进行评估: -| 表达式上下文 | 含义 | -| --------- | ------------------------------------ | -| **标准** | 默认选项。表达式只能使用标准函数。对所有用户来说,该列每一行的值都相同。 | -| **用户上下文** | 表达式可以调用用户上下文函数。该列按用户分别计算。 | +| 表达式上下文 | 含义 | +|---|---| +| `Standard` | 默认值。表达式只能使用标准函数。对于所有用户,该列每行都有一个值。| +| `UserContext` | 表达式可以调用用户上下文函数。该列按每位用户进行评估。| -在 @tom-explorer-view 中选择一个计算列,然后在 @properties-view 的 **选项** 下设置 **表达式上下文**。 +在 @tom-explorer-view 中选择一个计算列,然后在 @properties-view 的**选项**下设置**表达式上下文**。 > [!NOTE] -> `ExpressionContext` 需要兼容级别 1705 或更高;在 1705 以下,计算列始终为 **Standard**。 +> `ExpressionContext` 需要兼容级别 1705 或更高,低于 1705 的计算列始终为 `Standard`。 + +## Direct Lake on OneLake 表 + +`UserContext` 是 Power BI 对 Direct Lake on OneLake 表上的计算列支持的唯一表达式上下文。当您将模型保存到 Power BI 服务时,如果 Direct Lake 表上的计算列设置为“Standard”,则保存将失败,并显示错误“默认表达式上下文不能用于 Direct Lake 表中的计算列”。Direct Lake on SQL 表不支持计算列。有关在 Direct Lake 模型上设置表达式上下文的步骤,请参阅[Direct Lake on OneLake 上的计算列](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake)。 -## 用户上下文计算列不能用于哪些场景 +## 用户上下文列不能用于哪些情况 -在整个模型中只计算一次的对象不能引用用户上下文计算列。对于以下每种情况,Tabular Editor 的语义分析器都会报告错误: +针对整个模型计算一次的对象无法引用用户上下文计算列。对于以下每种情况,Tabular Editor 语义分析器都会报告错误: -| 用户上下文计算列不能被以下对象引用 | 信息 | -| ----------------- | ---------------------------------------------------- | -| 标准计算列 | "此表达式引用了用户上下文计算列 `Table[Column]`,而这在标准计算列中是不允许的。" | -| 计算表格 | "此表达式引用了用户上下文计算列 `Table[Column]`,而这在计算表格中是不允许的。" | -| 行级安全性筛选器 | "此表达式引用了用户上下文计算列 `Table[Column]`,而这在行级安全性筛选器中是不允许的。" | -| 作为端点的关系 | "关系不能将用户上下文计算列 `Table[Column]` 作为端点。" | +| 用户上下文列不能被以下项引用 | 消息 | +|---|---| +| 标准计算列 | “此表达式引用了支持用户上下文的计算列 `Table[Column]`,标准计算列中不允许引用该列。” | +| 计算表格 | “此表达式引用了支持用户上下文的计算列 `Table[Column]`,计算表格中不允许引用该列。” | +| 行级安全性筛选器 | “此表达式引用了支持用户上下文的计算列 `Table[Column]`,行级安全性筛选器中不允许引用该列。” | +| 关系,作为端点 | “关系不能将支持用户上下文的计算列 `Table[Column]` 用作端点。” | -前三条规则也适用于间接引用,例如通过度量值进行引用。度量值和其他用户上下文计算列可以引用用户上下文计算列。 +前三条规则也适用于间接引用,例如通过度量值进行的引用。度量和其他用户上下文计算列可以引用用户上下文列。 -## 错误显示位置 +## 错误出现的位置 -| 列的引用方式 | DAX 编辑器 | @信息视图 | [`te validate`](xref:te-cli-commands#validate) | -| ------------ | ------- | ------------------ | ---------------------------------------------- | -| 直接 | 是的 | 是的 | 是的 | -| 间接引用,例如通过度量值 | 否 | 是的 | 是的 | -| 作为关系端点 | 否 | 是的 | 是的 | +| 列的引用方式 | DAX 编辑器 | @messages-view | [`te validate`](xref:te-cli-commands#validate) | +|---|---|---|---| +| 直接 | 是 | 是 | 是 | +| 间接引用,例如通过度量值引用 | 否 | 是 | 是 | +| 作为关系端点 | 否 | 是 | 是 | -DAX 编辑器不会为间接违规加下划线,因此部署前请先在 @信息视图 中检查这些问题。 +DAX 编辑器不会对间接违规加下划线,因此请在部署前在 @messages-view 中检查这些违规。 -关系端点违规也会显示在该关系的 **错误信息** 属性中。无论是活动关系还是非活动关系都会被检查,错误会按端点分别进行 Report;因此如果某个关系两端都包含用户上下文列,就会报出两个错误。 +关系端点违规也会显示在关系的**错误消息**属性中。系统会检查活动关系和非活动关系,并针对每个端点报告错误,因此,如果关系的两端都有用户上下文列,则会有两个错误。 > [!NOTE] -> `te validate --errors-only` 仍会 Report 这些违规,因为该选项只会隐藏警告和反模式。 +> `te validate --errors-only` 仍会报告这些违规情况,因为该选项仅隐藏警告和反模式。 ## 后续步骤 -- @信息视图 +- @messages-view - @dax-editor -- @偏好 +- @preferences diff --git a/localizedContent/zh/content/tutorials/direct-lake-guidance.md b/localizedContent/zh/content/tutorials/direct-lake-guidance.md index 4c7e4e3be..173341e72 100644 --- a/localizedContent/zh/content/tutorials/direct-lake-guidance.md +++ b/localizedContent/zh/content/tutorials/direct-lake-guidance.md @@ -1,8 +1,8 @@ ---- +--- uid: direct-lake-guidance title: Direct Lake 指南 author: Morten Lønskov -updated: 2026-10-12 +updated: 2026-10-26 applies_to: products: - product: Tabular Editor 2 @@ -17,118 +17,130 @@ applies_to: - edition: Enterprise full: true --- - # Direct Lake 指南 -随着 Tabular Editor 3.22.0 的发布,我们在支持 SQL 上的 Direct Lake 的基础上,新增了对 OneLake 上的 Direct Lake 的支持。本文简要介绍这两种模式之间的差异,并将它们与 Power BI 语义模型中其他可用的存储模式进行对比。 +随着 Tabular Editor 3.22.0 的发布,除了 Direct Lake on SQL 外,我们还增加了对 Direct Lake on OneLake 的支持。本文简要概述了这两种模式之间的差异,以及它们与 Power BI 语义模型中提供的其他存储模式的比较。 -## 存储模式概览 +## 存储模式概述 -下表汇总了 Power BI 语义模型中可用的存储模式: +下表总结了 Power BI 语义模型中可用的存储模式: -| 存储模式 | 说明 | 推荐使用场景 | -| ------------------------ | -------------------------------------------------------------------------- | ----------------------------------------------------- | -| 导入 | 数据将导入语义模型,并存储在模型的内存缓存(VertiPaq)中。 | 适用于需要快速查询性能,且可以定期刷新数据的场景。 | -| DirectQuery | 数据会在查询时直接从数据源中获取,而不会导入到模型中。支持多种源,例如 SQL、KQL,甚至其他语义模型。 | 适用于需要实时访问数据,或数据量过大而无法装入内存的场景。 | -| 双重 | 一种混合模式:引擎会根据查询上下文,在返回已导入的数据与将查询委派给 DirectQuery 之间进行选择。 | 当你的模型同时包含 DirectQuery 表和导入表(例如使用聚合时),并且存在同时与两者相关联的表时。 | -| 在 OneLake 上的 Direct Lake | 利用 Delta Parquet 存储格式,在需要时可快速将数据换入语义模型内存。 | 当你的数据已以表或物化视图的形式存在于 Fabric Warehouse 或 Lakehouse 中时。 | -| 在 SQL 上的 Direct Lake | Direct Lake 的旧版本,使用 Fabric Warehouse 或 Lakehouse 的 SQL analytics endpoint。 | 不建议用于新开发(改用在 OneLake 上的 Direct Lake)。 | +| 存储模式 | 描述 | 推荐用例 | +|--------------|-------------|-----------------------| +| 导入 | 数据被导入语义模型并存储在模型的内存缓存(VertiPaq)中。| 当您需要快速的查询性能,并且可以承受定期刷新数据时。| +| DirectQuery | 在查询时直接从源查询数据,而无需将其导入模型。支持各种源,例如 SQL、KQL 甚至其他语义模型。| 当您需要实时数据访问,或者当数据量太大而无法放入内存时。| +| 双重 | 一种混合模式,其中引擎可以根据查询语境选择返回导入的数据或委派给 DirectQuery。| 当您的模型包含 DirectQuery 表格和导入表格的混合(例如在使用聚合时),并且您有与两者都相关的表格时。| +| Direct Lake on OneLake | 使用 Delta Parquet 存储格式,在需要时将数据快速交换到语义模型内存中。| 当您的数据已在 Fabric 仓库或湖仓中以表或物化视图的形式提供时。| +| Direct Lake on SQL | 旧版本的 Direct Lake,它使用 Fabric 仓库或湖仓的 SQL 分析端点。| 不建议用于新开发(请改用 Direct Lake on OneLake)。| > [!NOTE] -> 还可以创建同时包含 **Import** 和 **DirectQuery** 模式分区的表(也称为“混合表格”)。这通常用于需要增量刷新的大型事实表,其中一部分数据会直接从数据源查询。有关更多信息,请参阅[这篇文章](https://learn.microsoft.com/power-bi/connect-data/incremental-refresh-xmla)。 +> 还可以创建包含**导入**和**DirectQuery**模式下分区组合的表(也称为“混合表”)。这通常在需要增量刷新的大型事实表上进行,同时直接从源查询一些数据。有关详细信息,请参阅[这篇文章](https://learn.microsoft.com/power-bi/connect-data/incremental-refresh-xmla)。 -## 在 OneLake 上的 Direct Lake 与在 SQL 上的 Direct Lake +## Direct Lake on OneLake 与 Direct Lake on SQL -[OneLake 上的 Direct Lake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#key-concepts-and-terminology) 于 2025 年三月推出,用作 SQL 上 Direct Lake 的替代方案。使用 OneLake 上的 Direct Lake 时,不依赖 SQL 终结点,也不会回退到 DirectQuery 模式。这也意味着,[通常适用于 DirectQuery 模型的限制](https://learn.microsoft.com/power-bi/connect-data/desktop-directquery-about#modeling-limitations) 并不适用于 OneLake 上的 Direct Lake 模型。 +[Direct Lake on OneLake](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#key-concepts-and-terminology) 于 2025 年 3 月推出,是 Direct Lake on SQL 的替代方案。使用 Direct Lake on OneLake,不存在对 SQL 端点的依赖,也不会回退到 DirectQuery 模式。这也意味着[适用于 DirectQuery 模型的常见限制](https://learn.microsoft.com/power-bi/connect-data/desktop-directquery-about#modeling-limitations)不适用于 Direct Lake on OneLake 模型。 > [!NOTE] -> OneLake 上的 Direct Lake 目前处于公开预览阶段。在使用此表存储模式创建语义模型之前,你必须先在 Fabric 管理门户中启用租户设置 **User can create Direct Lake on OneLake semantic models (preview)**。 +> Direct Lake on OneLake 目前处于公开预览阶段。您必须在 Fabric 管理门户中启用租户设置**用户可以创建 Direct Lake on OneLake 语义模型(预览)**,然后才能使用此表存储模式创建语义模型。 + +但是,与 Direct Lake on SQL 一样,仍存在一些[确实适用的限制](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations )。主要限制包括: + +- 预览版支持 Direct Lake on OneLake 表上的计算列,并且仅支持 `UserContext` 表达式上下文。Direct Lake on SQL 不支持计算列。请参阅[Direct Lake on OneLake 上的计算列](#calculated-columns-on-direct-lake-on-onelake)。 +- 计算表不能引用 Direct Lake 存储模式中的列或表。支持计算组、假设分析参数和字段参数,因为它们会创建不引用 Direct Lake 列的隐式计算表格。 +- 不支持将非物化 SQL 视图作为 Direct Lake on OneLake 表的数据源。使用物化视图,或确保源 Delta 表包含您需要的列。 +- 在 Direct Lake on OneLake 的公开预览期间,不支持将湖仓中的快捷方式作为数据源。 -不过,与 SQL 上的 Direct Lake 一样,仍然存在一些[确实适用的限制](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations)。主要限制包括: +有关完整且最新的限制列表,请参阅[Microsoft 有关 Direct Lake 注意事项和限制的文档](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations)。 -- OneLake 表上的 Direct Lake 计算列目前以预览版形式提供支持,但仅限于_用户上下文_:其值会在查询时针对当前用户求值,而不会被物化。这意味着 Direct Lake 计算列会遵循行级安全性和对象级安全性,但不能用作关系键,也不会响应 Report 中的筛选器或切片器。如果结果必须响应筛选语境,请改用度量值。 Direct Lake on SQL 仍然完全不支持计算列。详情见[开发 Direct Lake 语义模型](https://learn.microsoft.com/fabric/fundamentals/direct-lake-develop)。 -- 计算表格不能引用 Direct Lake 存储模式中的列或表。支持计算组、What-if 参数和字段参数,因为它们会创建不引用 Direct Lake 列的隐式计算表格。 -- 不支持将非物化 SQL 视图用作 OneLake 上的 Direct Lake 表的数据源。使用物化视图,或确保源 Delta 表包含所需的列。 -- 在 Direct Lake on OneLake 公开预览期间,不支持将 Lakehouse 中的快捷方式用作数据源。 +### Direct Lake on OneLake 上的计算列 -如需查看完整且最新的限制列表,请参阅 [Microsoft 关于 Direct Lake 注意事项和限制的文档](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations)。 +Direct Lake on OneLake 表上的计算列必须将其 `ExpressionContext` 属性设置为 `UserContext`。该列在查询时进行评估,且未物化,因此无法在关系中使用。新计算列默认使用 `Standard`。如果您在将模型保存到 Power BI 服务时将 Direct Lake 表中的计算列设置为“Standard”,则保存将失败,并显示错误“默认表达式上下文不能用于 Direct Lake 表中的计算列”。 + +只有当模型的兼容级别为 1705 或更高时,**表达式上下文**属性才会显示在 @properties-view 中。在 Direct Lake on OneLake 表的每个计算列上设置该属性: + +1. 在 @tom-explorer-view 中选择模型,然后在 @properties-view 的**数据库**下勾选**兼容级别**。如果低于 1705,请按照 @update-compatibility-level 中的说明升级模型。 +2. 在 @tom-explorer-view 中选择计算列。 +3. 在@properties-view的**选项**下,将**表达式上下文**设置为“UserContext”。 +4. 保存模型。 + +同一模型中导入表格上的计算列可以使用任一表达式上下文。对于无法引用用户上下文列的对象,请参阅 @user-context-calculated-columns。Microsoft 在[在 Power BI Desktop 中使用计算列](https://learn.microsoft.com/power-bi/transform-model/desktop-calculated-columns#materialization-and-performance)中列出了受支持的存储模式和表达式上下文组合。 ### 复合模型 -如果你需要的计算列必须已物化、可用作关系键,或能响应 Report 中的筛选器和切片器,那么上述预览版计算列功能还不够。在这种情况下,把 Direct Lake 表和导入表结合起来,创建一个 **复合模型**。 OneLake 上的 Direct Lake 支持这一点,但 SQL 上的 Direct Lake 不支持。在复合模型中,通常会将较大的事实表保留为 Direct Lake 模式,而对需要完整计算列功能或自定义分组的较小维度表使用导入模式。 +如果您需要一个已物化或可用作关系键的计算列,请通过将 Direct Lake 表与导入表相结合来创建**复合模型**,并将计算列添加到导入表中。Direct Lake on OneLake 支持此操作,但 Direct Lake on SQL 不支持。在复合模型中,您通常将较大的事实表保留在Direct Lake模式下,同时对需要完整计算列或自定义分组的较小维度表使用导入模式。 -OneLake 上的 Direct Lake 还支持通过 Tabular Editor 等基于 XMLA 的工具与 DirectQuery 表组合使用。可以通过 Power BI 网页建模、Power BI Desktop(实时编辑)或 XMLA 工具添加导入表。 +Direct Lake on OneLake 还支持通过基于 XMLA 的工具(例如 Tabular Editor)与 DirectQuery 表组合。可以通过 Power BI Web 建模、Power BI Desktop(实时编辑)或通过 XMLA 工具添加导入表格。 > [!NOTE] -> SQL 上的 Direct Lake 不支持复合模型。不能在同一个语义模型中,将 SQL 上的 Direct Lake 表与 Import、DirectQuery 或 Dual 存储模式表组合使用。但是,你可以使用 Power BI Desktop 在 SQL 上的 Direct Lake 语义模型 _之上_ 创建复合模型,并通过添加新表进行扩展。更多信息见[在语义模型上构建复合模型](https://learn.microsoft.com/power-bi/transform-model/desktop-composite-models#building-a-composite-model-on-a-semantic-model-or-model)。 +> Direct Lake on SQL 不支持复合模型。您不能在同一语义模型中将 Direct Lake on SQL 表与导入、DirectQuery 或双存储模式表相结合。但是,您可以使用 Power BI Desktop 在 Direct Lake on SQL 语义模型*之上*创建复合模型,并使用新表对其进行扩展。有关详细信息,请参阅[在语义模型上构建复合模型](https://learn.microsoft.com/power-bi/transform-model/desktop-composite-models#building-a-composite-model-on-a-semantic-model-or-model)。 ## 排序规则 -使用 **OneLake 上的 Direct Lake** 时,模型的排序规则和导入模式一样,默认不区分大小写。 +使用**Direct Lake on OneLake**时,模型的排序规则与导入模型的排序规则相同,默认情况下不区分大小写。 -对于 **SQL 上的 Direct Lake** 模型,如果查询不会回退到 DirectQuery,则排序规则不区分大小写。如果查询发生回退,排序规则将取决于源端的排序规则。在 Fabric Warehouse 中,排序规则可能区分大小写;在这种情况下,你应在[模型上指定区分大小写的排序规则](https://data-goblins.com/power-bi/case-specific)。 +对于**Direct Lake on SQL**模型,对于不回退到 DirectQuery 的查询,排序规则不区分大小写。如果查询确实回退,则排序规则取决于源的排序规则。对于 Fabric 仓库,排序规则可能区分大小写,在这种情况下,您应在模型上指定[区分大小写的排序规则](https://data-goblins.com/power-bi/case-specific)。 > [!NOTE] -> 模型元数据一旦部署到 Analysis Services / Power BI,就无法再更改模型的排序规则。因此,如果你打算将 SQL 上的 Direct Lake 与区分大小写的 Fabric Warehouse 搭配使用,则必须在部署前先在模型元数据中设置排序规则: +> 元数据部署到 Analysis Services/Power BI 后,您就无法更改模型的排序规则。因此,如果您计划将 Direct Lake on SQL 与区分大小写的 Fabric 仓库配合使用,则必须在部署模型元数据之前设置其排序规则: > -> 1. 在 Tabular Editor 3 中创建一个新模型(File > New > Model...) -> 2. 取消选中“使用 Workspace 数据库” -> 3. 将模型的 **Collation** 属性设置为 `Latin1_General_100_BIN2_UTF8` -> 4. 保存模型(Ctrl+S)。 -> 5. 现在,打开你刚保存的文件中的模型。当系统提示连接到 Workspace 数据库时,请选择“Yes”。 +> 1. 在 Tabular Editor 3 中创建新模型(“文件”>“新建”>“模型”……) +> 2. 取消选中“使用工作区数据库” +> 3. 将模型的**排序规则**属性设置为`Latin1_General_100_BIN2_UTF8` +> 4. 保存模型 (Ctrl+S)。 +> 5. 现在,从您刚才保存的文件中打开模型。当系统提示您连接到工作区数据库时,请选择“是”。 > -> 采用这种方式,模型元数据会从一开始就以正确的排序规则部署。之后你就可以在 SQL 上的 Direct Lake 模式下添加表,而不会遇到排序规则问题。 +> 采用此方法,模型元数据从一开始就以正确的排序规则进行部署,然后您可以在 Direct Lake on SQL 模式下添加表,而不会遇到排序规则问题。 -## 表导入向导 +## 表格导入向导 -要使用 Tabular Editor 3 的表导入向导添加 Direct Lake 表,请选择 **Microsoft Fabric Lakehouse**、**Microsoft Fabric Warehouse**、**Microsoft Fabric SQL Database** 或 **Microsoft Fabric Mirrored Database** 作为数据源: +要使用 Tabular Editor 3 的“表格导入向导”添加 Direct Lake 表格,请选择**Microsoft Fabric 湖仓**、**Microsoft Fabric 仓库**、**Microsoft Fabric SQL 数据库**或**Microsoft Fabric 镜像数据库**作为源: ![表导入向导 Fabric](../assets/images/import-table-wizard-fabric.png) -登录后,系统会显示一个列表,列出你有权访问的各个 Workspace 中所有可用的 Fabric Lakehouse/Warehouse。选择你想要连接的项,然后点击 **确定**: +登录后,系统将显示您有权访问的工作区中所有可用 Fabric 湖仓/仓库的列表。选择您想要连接的对象,然后点击**确定**: -![表导入向导:选择 Lakehouse](../assets/images/import-table-wizard-select-lakehouse.png) +![表导入向导选择湖仓](../assets/images/import-table-wizard-select-lakehouse.png) -除非你想指定自定义 SQL 查询,或将表配置为 DirectQuery 模式,否则直接点击 **Next**,从数据源的表/视图列表中选择: +除非您想指定自定义 SQL 查询,或将表配置为 DirectQuery 模式,否则只需点击**下一步**,即可从源中的表/视图列表中选择表: -![表导入向导:从列表选择还是自定义查询](../assets/images/import-table-wizard-select-vs-custom-query.png) +![表导入向导选择与自定义查询](../assets/images/import-table-wizard-select-vs-custom-query.png) -选择要导入的表/视图。请注意,Direct Lake on OneLake 模式不支持 **非物化视图**。尝试将此类视图添加到模型中,会在保存模型元数据时导致报错。 +选择要导入的表/视图。请注意,Direct Lake on OneLake 模式不支持**非物化视图**。尝试将此类视图添加到模型中,将在保存模型元数据时导致错误。 -![表导入向导:选择对象](../assets/images/import-table-wizard-select-objects.png) +![表导入向导选择对象](../assets/images/import-table-wizard-select-objects.png) -在最后一页,选择要用哪种模式来配置表分区: +在最后一页上,选择要用于配置表分区的模式: -![表导入向导:分区模式](../assets/images/table-import-wizard-partition-mode.png) +![表导入向导分区模式](../assets/images/table-import-wizard-partition-mode.png) -可选项包括: +选项有: -- 在 OneLake 上的 Direct Lake -- 在 SQL 上的 Direct Lake +- Direct Lake on OneLake +- Direct Lake on SQL - 导入 (M) > [!NOTE] -> 如果你正在处理的模型已经包含表,而该模型又不支持组合不同存储模式的表,那么上述一个或多个选项可能不可用。例如,如果模型中包含一个采用 Direct Lake on SQL 模式的表,你就不能再添加其他模式的表。 +> 如果您正在处理的模型已经包含表,并且该模型不支持将不同存储模式的表组合在一起,则上述一个或多个选项可能不可用。例如,如果模型包含一个处于 Direct Lake on SQL 模式下的表,则您无法添加处于其他模式下的表。 -导入后的表已包含所有列,顺序与源中一致,因此导入后无需再运行 **更新表架构**。如果 Tabular Editor 无法确定 Lakehouse 或 Warehouse 的 SQL analytics endpoint,且导入设置中也未指定,则导入会失败,并显示一条指出缺少该设置的错误,同时不会创建任何表。 +导入的表格已包含其列,顺序与源中相同,因此您无需在导入后运行**更新表架构**。如果 Tabular Editor 无法确定湖仓或仓库的 SQL 分析端点,且导入设置未指定端点,则导入将失败,并显示指明缺失设置的错误,且不会创建任何表。 ## 检查 Direct Lake 分区 -Direct Lake 分区没有查询表达式。当你在 @tom-explorer-view 中选中某个分区时,**表达式编辑器** 会显示其 `Data Coverage Definition Expression`;如果该分区没有数据覆盖定义,则不显示任何内容。由增量刷新策略生成的分区也是如此。 +Direct Lake 分区没有查询表达式。当您在 @tom-explorer-view 中选择一个分区时,**表达式编辑器**会显示其“数据覆盖范围定义表达式”;如果分区没有数据覆盖范围定义,则不显示任何内容。由增量刷新策略生成的分区表现方式相同。 ## Power Query (M) 表达式 -本节会更偏技术性地说明:如果你想在不使用“表导入向导”的情况下,手动将表设置为 Direct Lake 模式,需要如何配置 TOM 对象和属性。 +本节包含有关如何配置 TOM 对象和属性的更技术性的说明,以防您想在不使用“表导入向导”的情况下手动为 Direct Lake 模式设置表。 -### 在 OneLake 上的 Direct Lake +### Direct Lake on OneLake -要手动将表设置为 **OneLake 上的 Direct Lake** 模式,需要执行以下操作: +要手动为**Direct Lake on OneLake**模式设置表,您需要执行以下操作: -1. **创建共享表达式**:Direct Lake 表使用“Entity”分区,该分区必须引用模型中的共享表达式。如果你还没有,请先创建这个共享表达式。将其命名为 `DatabaseQuery`: +1. **创建共享表达式**:Direct Lake 表格使用“实体”分区,这些分区必须引用模型中的共享表达式。如果还没有此共享表达式,请先创建它。将其命名为“DatabaseQuery”: ![创建共享表达式](../assets/images/create-shared-expression.png) -2. **配置共享表达式**:将你在步骤 1 中创建的表达式的 **Kind** 属性设为“ M ”,并将 **Expression** 属性设置为以下 M 查询,同时将 URL 中的 ID 替换为你的 Fabric Workspace 和 Lakehouse/Warehouse 对应的 ID: +2. **配置共享表达式**:将您在第 1 步中创建的表达式的**类型**属性设置为“M”,并将**表达式**属性设置为以下 M 查询,替换 URL 中您的 Fabric 工作区和湖仓/仓库的 ID: ```m let @@ -137,38 +149,38 @@ in Source ``` -3. **创建表和 Entity 分区**:在模型中创建一个新表(Alt+5),然后在 TOM Explorer 中展开该表的分区,并创建一个新的 _Entity 分区_: - -![创建 Entity 分区](../assets/images/create-entity-partition.png) +3. **创建表格和实体分区**:在模型中创建新表格 (Alt+5),然后在 TOM Explorer 中展开表格分区,并创建新的*实体分区*: + + ![创建实体分区](../assets/images/create-entity-partition.png) -删除你创建表时自动生成的常规导入分区。 + 删除在您创建表时自动创建的常规导入分区。 -4. **配置 Entity 分区**:为 Entity 分区设置以下属性: +4. **配置实体分区**:在实体分区上设置以下属性: -| 属性 | 值 | -| ----- | ------------------------------------------------------- | -| 姓名 | (推荐)设置为与表相同的名称 | -| 实体名称 | (必填)设置为 Lakehouse/Warehouse 中该表的名称 | -| 表达式来源 | (必填)设置为在步骤 1 中创建的共享表达式,通常为 `DatabaseQuery` | -| 模式 | (必填)`DirectLake` | -| 架构名称 | (可选)如适用,将其设置为 Lakehouse/Warehouse 中的架构名称。如果未设置,将使用默认架构。 | +| 属性 | 值 | +| ----------|-------| +| 名称 | (建议)设置为与表相同的名称 | +| 实体名称 | (必填)设置为湖仓/仓库中表的名称 | +| 表达式源 | (必填)设置为您在第 1 步中创建的共享表达式,通常为 `DatabaseQuery` | +| 模式 | (必填)`DirectLake` | +| 架构名称 | (可选)设置为 Lakehouse/仓库中的架构名称(如果适用)。未设置时,将使用默认架构。| -最终结果应如下所示: + 最终结果应如下所示: ![配置实体分区](../assets/images/configure-entity-partition.png) -5. **更新列元数据**:在此阶段,你应该可以使用 Tabular Editor 的 **Update Table Schema** 功能来更新该表的列元数据。这将自动从 Lakehouse/Warehouse 检索列名和数据类型: +5. **更新列元数据**:在此阶段,您应该能够使用 Tabular Editor 的**更新表架构**功能来更新表的列元数据。这将自动从湖仓/仓库中检索列名称和数据类型: ![更新表架构实体](../assets/images/update-table-schema-entity.png) -或者,手动向表中添加数据列(Alt+4),并为每一列指定 `Name`、`Data Type`、`Source Column` 以及其他相关属性。 + 或者,手动将数据列添加到表(Alt+4),并为每一列指定“名称”、“数据类型”、“源列”以及任何其他相关属性。 > [!NOTE] -> 将 Direct Lake 表添加到模型后,在首次部署元数据后需要手动“刷新”一次。否则,查询该表时不会返回任何数据。此刷新只需执行一次。如果已在 **工具 > 偏好 > 模型部署 > 数据刷新** 下启用 **保存新表时自动刷新**,Tabular Editor 3 会在保存模型元数据时自动刷新该表。 +> 将 Direct Lake 表添加到模型时,在第一次元数据部署后需要手动“刷新”该表。否则,查询时该表将不包含任何数据。此刷新只需执行一次。如果选中**工具 > 首选项 > 模型部署 > 数据刷新**下的**保存新表时自动刷新**,Tabular Editor 3 将在保存模型元数据时自动刷新表。 -### 在 SQL 上的 Direct Lake +### Direct Lake on SQL -要手动将表设置为 **SQL 上的 Direct Lake** 模式,请按照上文“在 OneLake 上使用 Direct Lake”一节的步骤操作,但在共享表达式中改用以下 M 查询: +要手动设置**Direct Lake on SQL**模式的表,请按照上面“Direct Lake on OneLake”部分的步骤操作,但请改用以下 M 查询作为共享表达式: ```m let @@ -177,17 +189,17 @@ in database ``` -将 `` 替换为 [Fabric Warehouse 的 SQL analytics endpoint](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse) 或 [Lakehouse 的 SQL analytics endpoint](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint) 的连接字符串,并将 `` 替换为相应 Warehouse 或 Lakehouse 的名称。 +将``替换为[Fabric 仓库](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse)或[湖仓](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint)的 SQL 分析端点的连接字符串,并将``替换为仓库或湖仓的名称。 -### 从 Lakehouse / Warehouse 导入 +### 从 Lakehouse/Warehouse 导入 -如果你希望在从 Fabric Lakehouse 或 Warehouse 获取数据的同时,将表配置为 **导入** 模式,可按以下步骤操作: +如果您想在从 Fabric 湖仓或仓库获取数据时将表配置为**导入**模式,则步骤如下: -1. **创建表**:在模型中创建一个新表(Alt+5),然后在 TOM Explorer 中展开该表的分区。默认情况下,你应该会看到系统自动创建了一个类型为“Import”的单个分区: +1. **创建表格**:在模型中创建新表格 (Alt+5),然后在 TOM Explorer 中展开表格分区。默认情况下,您应该会看到一个自动创建的“导入”类型分区: ![M 导入分区](../assets/images/m-import-partition.png) -2. **配置 Import 分区**:在 Import 分区上设置以下 M 查询: +2. **配置导入分区**:在导入分区上设置以下 M 查询: ```m let @@ -197,19 +209,19 @@ in Data ``` -将 `` 替换为 [Fabric Warehouse 的 SQL analytics endpoint](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse) 或 [Lakehouse 的 SQL analytics endpoint](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint) 的连接字符串,并将 `` 替换为相应 Warehouse 或 Lakehouse 的名称。 +将“``”替换为[Fabric 仓库的 SQL 分析端点](https://learn.microsoft.com/fabric/data-warehouse/query-warehouse)或[湖仓](https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint)的连接字符串,并将“``”替换为仓库或湖仓的名称。 -将 `` 替换为 Warehouse/Lakehouse 中的架构名称,并将 `
    ` 替换为你要导入的表或视图名称。请注意,导入模式中的表可以使用非物化视图作为数据源,因为在刷新期间,数据会通过 SQL endpoint 进行查询。 +将``替换为仓库/湖仓中的架构名称,将`
    `替换为您要导入的表或视图的名称。请注意,导入模式下的表格可以使用非物化视图作为数据源,因为在刷新操作期间,数据是通过 SQL 端点查询的。 -3. **更新列元数据**(仅限手动设置):由于你手动配置的分区不包含任何列,请使用 Tabular Editor 的 **更新表架构** 功能,从 Lakehouse/Warehouse 检索列名和数据类型。或者,也可以手动创建数据列(**Alt+4**),并为每列指定 `Name`、`Data Type`、`Source Column` 以及其他相关属性。 +3. **更新列元数据**(仅限手动设置):由于您手动配置的分区没有列,请使用 Tabular Editor 的**更新表架构**功能从湖仓/仓库检索列名称和数据类型。或者,手动创建数据列( **Alt+4** ),并为每一列指定“名称”、“数据类型”、“源列”以及任何其他相关属性。 -## 在不同存储模式之间转换 +## 在存储模式之间进行转换 -根据本文中的信息,在 Direct Lake on SQL 与 Direct Lake on OneLake 之间转换很简单,因为你只需要修改 Direct Lake 分区所引用的共享表达式的 M 查询。 +使用本文中的信息,在 Direct Lake on SQL 和 Direct Lake on OneLake 之间进行转换非常简单,因为您只需修改 Direct Lake 分区引用的共享表达式的 M 查询即可。 -如果你想从导入模式转换为 Direct Lake,会稍微复杂一些,因为涉及不同的分区类型。 +如果您想从导入模式转换为 Direct Lake 模式,由于涉及的分区类型不同,操作会略微复杂一些。 -为简化操作,我们准备了一组 C# Script,可帮助你在不同存储模式之间进行转换: +为了让事情变得更简单,我们准备了一组 C# 脚本,可以帮助您在不同的存储模式之间进行转换: - [将 Direct Lake on SQL 转换为 Direct Lake on OneLake](xref:script-convert-dlsql-to-dlol) -- [将导入模式转换为 Direct Lake on OneLake](xref:script-convert-import-to-dlol) \ No newline at end of file +- [将导入转换为 Direct Lake on OneLake](xref:script-convert-import-to-dlol) \ No newline at end of file From 2abbd5ad971baef63d086963a69ee0102def8b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20L=C3=B8nskov?= Date: Tue, 27 Oct 2026 10:30:09 +0100 Subject: [PATCH 4/8] Restore inline code lost in the old-pipeline translations The translations from the runs before segment updates and code placeholders replaced inline code with quotation marks (and in places translated it). 46 current files failed verification; all pass now. - 24 files: code spans restored from the quoted text. - 22 files: code that was translated (property names, error messages, file name patterns, URLs) put back as the English code span. - Failures recorded by the old pipeline cleared for xmla-as-connectivity (es, zh) and new-pbi-model (zh), so the next run retries them by segment. --- localizedContent/es/.translation-status.json | 9 +---- .../Semantic-Model/semantic-model-types.md | 2 +- .../es/content/features/ai-assistant.md | 36 +++++++++---------- .../es/content/features/auto-reload.md | 6 ++-- .../es/content/features/dax-debugger.md | 6 ++-- .../es/content/features/deployment.md | 4 +-- .../content/features/import-tables.partial.md | 8 ++--- .../es/content/features/mcp-server.md | 12 +++---- .../es/content/features/pivot-grid.md | 4 +-- .../user-context-calculated-columns.md | 2 +- .../creating-and-testing-dax.md | 6 ++-- .../content/getting-started/installation.md | 14 ++++---- .../getting-started/personalizing-te3.md | 4 +-- .../getting-started/refresh-preview-query.md | 4 +-- ...Advanced-Filtering-of-the-Explorer-Tree.md | 6 ++-- .../es/content/how-tos/load-save.md | 4 +-- .../scripting-add-clone-remove-objects.md | 2 +- .../how-tos/semantic-bridge-rename-objects.md | 2 +- .../es/content/references/policies.md | 32 ++++++++--------- .../es/content/references/preferences.md | 22 ++++++------ .../references/release-notes/3_27_1_0.md | 20 +++++------ .../references/release-notes/3_27_1_1.md | 8 ++--- .../es/content/references/supported-files.md | 6 ++-- .../es/content/references/user-options.md | 14 ++++---- .../es/content/security/ai-compliance.md | 32 ++++++++--------- .../es/content/security/security-privacy.md | 10 +++--- .../content/tutorials/direct-lake-guidance.md | 16 ++++----- .../es/content/tutorials/new-as-model.md | 6 ++-- localizedContent/zh/.translation-status.json | 14 +------- .../zh/content/features/ai-assistant.md | 18 +++++----- .../zh/content/features/deployment.md | 2 +- .../content/features/import-tables.partial.md | 6 ++-- .../zh/content/features/mcp-server.md | 14 ++++---- .../zh/content/features/pivot-grid.md | 2 +- .../user-context-calculated-columns.md | 2 +- .../creating-and-testing-dax.md | 4 +-- .../content/getting-started/installation.md | 8 ++--- ...Advanced-Filtering-of-the-Explorer-Tree.md | 4 +-- .../zh/content/how-tos/drag-drop.md | 2 +- .../zh/content/references/policies.md | 22 ++++++------ .../zh/content/references/preferences.md | 8 ++--- .../references/release-notes/3_27_1_0.md | 10 +++--- .../zh/content/references/supported-files.md | 2 +- .../zh/content/references/user-options.md | 2 +- .../zh/content/security/ai-compliance.md | 2 +- .../zh/content/security/security-privacy.md | 6 ++-- .../content/tutorials/direct-lake-guidance.md | 12 +++---- .../zh/content/tutorials/new-as-model.md | 2 +- 48 files changed, 210 insertions(+), 229 deletions(-) diff --git a/localizedContent/es/.translation-status.json b/localizedContent/es/.translation-status.json index 94eb4e603..068aa6e6f 100644 --- a/localizedContent/es/.translation-status.json +++ b/localizedContent/es/.translation-status.json @@ -1871,13 +1871,6 @@ "pinned": 0, "total": 465, "completionPercent": 100.0, - "failures": 1 - }, - "failures": { - "how-tos/xmla-as-connectivity.md": { - "error": "link targets 29 -> 28 (missing ['https://learn.microsoft.com/power-bi/enterprise/service-premium-connect-tools#duplicate-workspace-names'], added [])", - "at": "2026-10-23T11:04:25Z", - "sourceHash": "sha256:1327f49f78176015f7f08cd552b754ea50c38b1c375c04b77da2637df323b550" - } + "failures": 0 } } diff --git a/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md b/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md index e3654cee5..e4ac39803 100644 --- a/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md +++ b/localizedContent/es/content/features/Semantic-Model/semantic-model-types.md @@ -59,7 +59,7 @@ Tabular Editor puede trabajar con varios tipos de modelos diferentes. A continua 3 - Solo funciones de Tabular Editor 3. Las operaciones realizadas a través del punto de conexión XMLA requieren una licencia Business o Enterprise. [Más información](xref:editions). 4 - Direct Lake en SQL solo admite grupos de cálculo, parámetros «what-if» y parámetros de campo, que crean implícitamente tablas calculadas. No se admiten tablas calculadas generales. -5 - Función de vista previa. Las columnas calculadas de las tablas de Direct Lake en OneLake deben usar el contexto de expresión «UserContext». Se evalúan en el momento de la consulta y no se materializan, por lo que no se pueden usar como claves de relación. Consulte [Directrices de Direct Lake](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake) para obtener más detalles. +5 - Función de vista previa. Las columnas calculadas de las tablas de Direct Lake en OneLake deben usar el contexto de expresión `UserContext`. Se evalúan en el momento de la consulta y no se materializan, por lo que no se pueden usar como claves de relación. Consulte [Directrices de Direct Lake](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake) para obtener más detalles. >[!NOTE] > La versión de junio de 2025 de Power BI Desktop eliminó todas las limitaciones de modelado para herramientas de terceros. Antes de eso, no se admitían varias operaciones de modelado. Consulte [Limitaciones de Power BI Desktop](xref:desktop-limitations). diff --git a/localizedContent/es/content/features/ai-assistant.md b/localizedContent/es/content/features/ai-assistant.md index 11a3259e3..ca3cfd106 100644 --- a/localizedContent/es/content/features/ai-assistant.md +++ b/localizedContent/es/content/features/ai-assistant.md @@ -86,10 +86,10 @@ Seleccione **Anthropic** como proveedor e introduzca su clave de API. El nombre Seleccione **Azure OpenAI** como proveedor y configure estos campos: - **Clave de API**: la clave de acceso a tu recurso de Azure OpenAI -- **Punto de conexión del servicio**: la URL del recurso, por ejemplo, `https://your-resource.openai.azure.com`. El certificado SSL se emite para «*.openai.azure.com», por lo que una dirección «*.privatelink.openai.azure.com» no supera la validación del certificado. +- **Punto de conexión del servicio**: la URL del recurso, por ejemplo, `https://your-resource.openai.azure.com`. El certificado SSL se emite para `*.openai.azure.com`, por lo que una dirección `*.privatelink.openai.azure.com` no supera la validación del certificado. - **Implementación**: el nombre de la implementación que se muestra en la columna **Nombre** de **Implementaciones** -Azure OpenAI requiere el nombre de la implementación en cada llamada a la API. El nombre se establece cuando se crea la implementación y, a menudo, coincide con el modelo al que sirve, por ejemplo, «gpt-4o», pero puede ser diferente. Si introduce el nombre del recurso o un nombre de modelo que no existe como implementación, la solicitud fallará. +Azure OpenAI requiere el nombre de la implementación en cada llamada a la API. El nombre se establece cuando se crea la implementación y, a menudo, coincide con el modelo al que sirve, por ejemplo, `gpt-4o`, pero puede ser diferente. Si introduce el nombre del recurso o un nombre de modelo que no existe como implementación, la solicitud fallará. Encuentra el nombre de la implementación en el [portal de Azure AI Foundry](https://ai.azure.com): @@ -123,13 +123,13 @@ Estas herramientas alojan modelos con una API compatible con OpenAI, en la estac ### Ejemplo: Ollama 1. [Descarga e instala Ollama](https://ollama.com/download) -2. Extraiga un modelo, por ejemplo, «ollama pull llama3.1». +2. Extraiga un modelo, por ejemplo, `ollama pull llama3.1`. 3. Inicie el servidor de Ollama. Se inicia automáticamente después de la instalación, de forma predeterminada en el puerto 11434. 4. En Tabular Editor, vaya a **Herramientas > Preferencias > Funciones de IA > Asistente de IA > Proveedor de IA** 5. Establezca **Elegir proveedor** en **Personalizado (compatible con OpenAI)** 6. Establezca **Punto de conexión del servicio** en `http://localhost:11434/v1` 7. Establezca **Nombre del modelo** como el modelo que ha extraído, por ejemplo, `llama3.1`. -8. Establezca **Clave de API** en cualquier valor que no esté vacío, por ejemplo, «ollama». Ollama no requiere autenticación, pero el campo no puede estar en blanco. +8. Establezca **Clave de API** en cualquier valor que no esté vacío, por ejemplo, `ollama`. Ollama no requiere autenticación, pero el campo no puede estar en blanco. ### Ejemplo: LM Studio @@ -166,10 +166,10 @@ Configura un modelo de OpenAI implementado en Microsoft Foundry, como GPT-4o o G - `https://your-resource.services.ai.azure.com/openai/v1` - `https://your-resource.openai.azure.com/openai/v1` 4. Introduzca su **clave de API** de Foundry. -5. Establece **Nombre del modelo** como el nombre de tu implementación, por ejemplo, «gpt-5.4-mini». +5. Establece **Nombre del modelo** como el nombre de tu implementación, por ejemplo, `gpt-5.4-mini`. > [!NOTE] -> El portal de Microsoft Foundry no muestra la URL base. Muestra un **URI de destino** con la ruta completa de la API, por ejemplo, «https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses». Para la URL base, use solo `https://your-resource.services.ai.azure.com/openai/v1`. +> El portal de Microsoft Foundry no muestra la URL base. Muestra un **URI de destino** con la ruta completa de la API, por ejemplo, `https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses`. Para la URL base, use solo `https://your-resource.services.ai.azure.com/openai/v1`. ### Modelos de Anthropic en Microsoft Foundry @@ -196,7 +196,7 @@ Dentro de tus [concesiones de permisos](#permissions-and-consent), el Asistente - **Errores del modelo**: enumera los errores, las advertencias y los mensajes de Analysis Services del modelo, los mismos que muestra la [vista Mensajes](xref:messages-view), con las causas raíz en primer lugar. Se informa al asistente cuando cambian los errores del modelo. - **Acceso a documentos**: lee y modifica consultas DAX abiertas, scripts de C# y scripts DAX, y lee los errores y advertencias de todos los documentos abiertos, incluidas las Pivot Grids. El documento activo forma parte del contexto del asistente, por lo que puede preguntar «¿Por qué veo este error en esta consulta?». No puede leer ni cambiar la estructura de un Pivot Grid. - **Búsqueda en la base de conocimientos**: busca en la documentación integrada de Tabular Editor. -- **Navegación por la interfaz de usuario**: genera enlaces de acción «te3://» que abren cuadros de diálogo y funciones específicos de Tabular Editor. +- **Navegación por la interfaz de usuario**: genera enlaces de acción `te3://` que abren cuadros de diálogo y funciones específicos de Tabular Editor. Un agente conectado a través del [servidor MCP](xref:mcp-server) tiene las mismas capacidades, excepto la navegación por la interfaz de usuario. Ambos cambian su modelo ejecutando un script de C# como un único paso que se puede deshacer. Difieren en la forma de revisar los cambios y conceder permisos; consulta [Diferencias entre el servidor MCP y el asistente de IA](#mcp-server-and-ai-assistant-differences). @@ -252,7 +252,7 @@ Si la opción **Vista previa de los cambios** está activada, al ejecutar un C# ## Instrucciones personalizadas -Las *instrucciones personalizadas* son conjuntos de instrucciones que guían al asistente de IA en tareas específicas. El asistente recibe una lista de todas las instrucciones disponibles con su «descripción» y carga el texto completo solo de aquellas que sean relevantes para tu solicitud, así que procura que las descripciones sean precisas y específicas. Una instrucción cargada permanece vigente durante el resto de la conversación. +Las *instrucciones personalizadas* son conjuntos de instrucciones que guían al asistente de IA en tareas específicas. El asistente recibe una lista de todas las instrucciones disponibles con su `description` y carga el texto completo solo de aquellas que sean relevantes para tu solicitud, así que procura que las descripciones sean precisas y específicas. Una instrucción cargada permanece vigente durante el resto de la conversación. ### Instrucciones personalizadas integradas @@ -277,7 +277,7 @@ Escriba `/` para ver las instrucciones personalizadas disponibles. Comience su m ### Añadir sus propias instrucciones personalizadas -Cree una instrucción personalizada colocando un archivo `.md` en `%LocalAppData%\TabularEditor3\AI\CustomInstructions\`. La carpeta se crea la primera vez que se ejecuta el asistente de IA, con un archivo «example.md» en ella para copiarlo. **Abrir carpeta de instrucciones personalizadas** en la barra de herramientas del Asistente de IA la abre. +Cree una instrucción personalizada colocando un archivo `.md` en `%LocalAppData%\TabularEditor3\AI\CustomInstructions\`. La carpeta se crea la primera vez que se ejecuta el asistente de IA, con un archivo `example.md` en ella para copiarlo. **Abrir carpeta de instrucciones personalizadas** en la barra de herramientas del Asistente de IA la abre. El encabezado YAML que define los metadatos de la instrucción es opcional: @@ -304,26 +304,26 @@ injected into the AI's system prompt when the instruction is activated. | `always_inject` | No | false | Si es true, se incluye siempre en el «prompt» del sistema. Esta instrucción no se ofrece en el autocompletado `/` | | `hidden` | No | false | Si es true, no se muestra en el autocompletado de `/command` | -Una instrucción personalizada cuyo «id» coincide con una instrucción integrada anula la versión integrada. +Una instrucción personalizada cuyo `id` coincide con una instrucción integrada anula la versión integrada. Tabular Editor lee los archivos de la siguiente manera: -- La materia preliminar debe comenzar con «---» en la primera línea del archivo y terminar con una línea «---». Si no es así, o si no se puede analizar el YAML, todo el archivo se trata como contenido de la instrucción y se aplican todos los valores predeterminados anteriores. -- Las claves que no figuran en la tabla anterior se ignoran. Los archivos de versiones anteriores que aún tienen una sección «triggers:`» se cargan sin cambios. +- La materia preliminar debe comenzar con `---` en la primera línea del archivo y terminar con una línea `---`. Si no es así, o si no se puede analizar el YAML, todo el archivo se trata como contenido de la instrucción y se aplican todos los valores predeterminados anteriores. +- Las claves que no figuran en la tabla anterior se ignoran. Los archivos de versiones anteriores que aún tienen una sección `triggers:` se cargan sin cambios. - `{{version}}` en cualquier parte del cuerpo se sustituye por la versión del componente de IA de Tabular Editor. - Solo se leen los archivos `.md` que se encuentran directamente en la carpeta; no se buscan subcarpetas. ### Instrucciones personalizadas de tu empresa -Un administrador puede publicar una carpeta de instrucciones personalizadas para todos con la [política](xref:policies) `AiCustomInstructionsPath`, y la carpeta puede ser un recurso compartido de red de solo lectura. Esas instrucciones se cargan para todos los usuarios además de las integradas y funcionan como las demás instrucciones: se ofrecen en el autocompletado «/», se eligen por su descripción y se invocan mediante «/id». +Un administrador puede publicar una carpeta de instrucciones personalizadas para todos con la [política](xref:policies) `AiCustomInstructionsPath`, y la carpeta puede ser un recurso compartido de red de solo lectura. Esas instrucciones se cargan para todos los usuarios además de las integradas y funcionan como las demás instrucciones: se ofrecen en el autocompletado `/`, se eligen por su descripción y se invocan mediante `/id`. -Cuando el mismo «id» existe en más de un lugar, la prioridad es la siguiente: +Cuando el mismo `id` existe en más de un lugar, la prioridad es la siguiente: 1. La carpeta de tu organización 2. Tu propia carpeta 3. Las instrucciones integradas -Una política independiente, «DisableUserCustomInstructions», hace que Tabular Editor ignore las instrucciones de su propia carpeta y desactive **Abrir carpeta de instrucciones personalizadas**. Las instrucciones integradas y de la organización siguen cargándose. Ambas políticas requieren Tabular Editor 3 Edición Enterprise. +Una política independiente, `DisableUserCustomInstructions`, hace que Tabular Editor ignore las instrucciones de su propia carpeta y desactive **Abrir carpeta de instrucciones personalizadas**. Las instrucciones integradas y de la organización siguen cargándose. Ambas políticas requieren Tabular Editor 3 Edición Enterprise. ## Permisos y consentimiento @@ -447,7 +447,7 @@ Cada mensaje enviado al asistente de IA consume tokens de entrada. El coste en t ### Contador de tokens -El contador de tokens se encuentra en la barra de estado situada encima del cuadro de mensajes, junto al [indicador de modelo activo](#choosing-a-model). La barra indica los tokens usados/totales en miles y se muestra en verde, ámbar o rojo a medida que se va llenando el contexto. Un «±» delante de la cifra significa que aún no se dispone de un recuento exacto. +El contador de tokens se encuentra en la barra de estado situada encima del cuadro de mensajes, junto al [indicador de modelo activo](#choosing-a-model). La barra indica los tokens usados/totales en miles y se muestra en verde, ámbar o rojo a medida que se va llenando el contexto. Un `±` delante de la cifra significa que aún no se dispone de un recuento exacto. Pasa el cursor por encima del contador para ver un desglose: @@ -457,7 +457,7 @@ Pasa el cursor por encima del contador para ver un desglose: | **Esta conversación (facturada)** | Las mismas cuatro cifras acumuladas en cada solicitud de la conversación, incluidos los viajes de ida y vuelta de las herramientas | | **Contexto** | Tokens actualmente en la ventana de contexto, en comparación con el tamaño real de la ventana | -Una línea dice, por ejemplo, «37 588 de entrada + 131 744 en caché · escritura 37 558 · salida 2866». Las partes relativas a la caché se omiten en el caso de los proveedores que no admiten el almacenamiento en caché de «prompts», y se omite una sección cuando no hay nada que informar. +Una línea dice, por ejemplo, `37,588 input + 131,744 cached · write 37,558 · output 2,866`. Las partes relativas a la caché se omiten en el caso de los proveedores que no admiten el almacenamiento en caché de «prompts», y se omite una sección cuando no hay nada que informar. > [!TIP] > Compara **Último turno** con **Esta conversación (facturada)** para ver cuánto cuesta una sola pregunta. En una conversación larga, es normal que haya una cifra elevada en **Esta conversación (facturada)** junto a una cifra baja en **Último turno**. @@ -493,4 +493,4 @@ El Asistente de IA es un componente opcional que se instala de forma predetermin El mismo componente contiene el servidor MCP, por lo que, si lo excluyes o eliminas `TabularEditor3.AI.dll`, se eliminarán ambos. Para desactivar solo el chat, mantenga el componente y establezca la política `DisableAiChat`. > [!NOTE] -> Tanto si el componente está instalado como si no, un administrador del sistema puede desactivar todas las funciones de IA en Tabular Editor 3, incluido el servidor MCP, con la [política «DisableAi»](xref:policies). `DisableMcpServer` desactiva únicamente el servidor MCP. Consulte @policies. +> Tanto si el componente está instalado como si no, un administrador del sistema puede desactivar todas las funciones de IA en Tabular Editor 3, incluido el servidor MCP, con la [política `DisableAi`](xref:policies). `DisableMcpServer` desactiva únicamente el servidor MCP. Consulte @policies. diff --git a/localizedContent/es/content/features/auto-reload.md b/localizedContent/es/content/features/auto-reload.md index 12505463f..daf5e4fc2 100644 --- a/localizedContent/es/content/features/auto-reload.md +++ b/localizedContent/es/content/features/auto-reload.md @@ -20,7 +20,7 @@ applies_to: --- # Recarga automática desde el disco -Cuando los archivos de metadatos de un modelo que ha cargado desde un archivo o una carpeta cambian en el disco, Tabular Editor vuelve a cargar el modelo automáticamente. Si tiene cambios sin guardar, aparecerá un mensaje en el que podrá elegir si desea volver a cargar o conservar sus cambios. Las fuentes típicas de cambios externos son un agente de IA, un script, otro editor, un «git pull» o un compañero que edita una carpeta compartida. +Cuando los archivos de metadatos de un modelo que ha cargado desde un archivo o una carpeta cambian en el disco, Tabular Editor vuelve a cargar el modelo automáticamente. Si tiene cambios sin guardar, aparecerá un mensaje en el que podrá elegir si desea volver a cargar o conservar sus cambios. Las fuentes típicas de cambios externos son un agente de IA, un script, otro editor, un `git pull` o un compañero que edita una carpeta compartida. ![Diagrama: Archivo > Guardar escribe el modelo en Tabular Editor en los archivos del disco; otra herramienta escribe en los archivos; una recarga automática vuelve a cargar los archivos modificados en Tabular Editor](~/content/assets/images/features/auto-reload-sync.png) @@ -32,8 +32,8 @@ Cuando los archivos de metadatos de un modelo que ha cargado desde un archivo o | Modelo cargado desde | Archivos supervisados | |---|---| | Un archivo `.bim` | Ese archivo. Se omiten otros archivos de la misma carpeta. | -| Una carpeta en formato JSON (Database.json) | Todos los archivos «.json» situados por debajo de la raíz del modelo, incluidas las subcarpetas. | -| Una carpeta en formato [Lenguaje de definición de modelo tabular (TMDL)](xref:tmdl) | Todos los archivos «.tmdl» situados debajo de la raíz del modelo, incluidas las subcarpetas. | +| Una carpeta en formato JSON (Database.json) | Todos los archivos `.json` situados por debajo de la raíz del modelo, incluidas las subcarpetas. | +| Una carpeta en formato [Lenguaje de definición de modelo tabular (TMDL)](xref:tmdl) | Todos los archivos `.tmdl` situados debajo de la raíz del modelo, incluidas las subcarpetas. | | Una base de datos del área de trabajo | Los archivos que respaldan el modelo en [modo de área de trabajo](xref:workspace-mode), según las mismas reglas que las filas anteriores. | | Una base de datos o Power BI Desktop, fuera del modo de área de trabajo | Ninguno. El modelo no tiene archivos en el disco. | | Una plantilla `.pbit` o un modelo que nunca ha guardado | Ninguno. | diff --git a/localizedContent/es/content/features/dax-debugger.md b/localizedContent/es/content/features/dax-debugger.md index e6f2dd681..a2e2d3fe1 100644 --- a/localizedContent/es/content/features/dax-debugger.md +++ b/localizedContent/es/content/features/dax-debugger.md @@ -178,9 +178,9 @@ Al depurar un predicado escalar, la vista **Locales** mostrará dos elementos es En la captura de pantalla anterior: 1. Este es el predicado escalar que se está depurando actualmente. Aunque esta subexpresión parece una que debería devolver un valor escalar (verdadero/falso), en realidad devuelve una tabla. -2. **(Expresión actual)**: Este es el valor *escalar* del predicado, cuando se evalúa dentro del *contexto de fila* actual generado por la función `FILTER` como se ha descrito anteriormente. En la captura de pantalla, el valor escalar se evalúa como «False», porque el valor de [Country Region Code] en el contexto de fila actual es «AU», como se puede ver en la vista **Watch** (4). Podemos usar la vista **Contexto de evaluación** (5) para desplazarnos por las filas de la iteración una a una. +2. **(Expresión actual)**: Este es el valor *escalar* del predicado, cuando se evalúa dentro del *contexto de fila* actual generado por la función `FILTER` como se ha descrito anteriormente. En la captura de pantalla, el valor escalar se evalúa como `False`, porque el valor de [Country Region Code] en el contexto de fila actual es «AU», como se puede ver en la vista **Watch** (4). Podemos usar la vista **Contexto de evaluación** (5) para desplazarnos por las filas de la iteración una a una. 3. **(Expresión de filtro)**: Esta es la expresión de *tabla* generada por la función `FILTER`, como se ha descrito anteriormente. En la captura de pantalla, se trata de una tabla de 1 x 2 que contiene los valores «US» y «CA». Al hacer clic en el botón de la lupa, se abrirá una ventana emergente que muestra los valores de la tabla en una cuadrícula. -4. Podemos usar la ventana **Observar** para evaluar cualquier expresión DAX dentro del contexto de evaluación actual. En este caso, como tenemos un contexto de fila activo, podemos hacer referencia directamente a las columnas del contexto de fila, como `Geography[Country Region Code]`. Podemos ver que el valor actual de esta columna es «AU», por lo que el predicado escalar (2) se evalúa como «False». +4. Podemos usar la ventana **Observar** para evaluar cualquier expresión DAX dentro del contexto de evaluación actual. En este caso, como tenemos un contexto de fila activo, podemos hacer referencia directamente a las columnas del contexto de fila, como `Geography[Country Region Code]`. Podemos ver que el valor actual de esta columna es «AU», por lo que el predicado escalar (2) se evalúa como `False`. 5. Podemos usar la vista **Contexto de evaluación** para desplazarnos por las filas de la iteración, una por una. Esto actualizará los valores en la vista **Locales**, así como en la vista **Observar**, para reflejar los valores en el contexto de fila actual. ## Accesos directos de teclado @@ -202,7 +202,7 @@ Actualmente, el depurador de DAX tiene las siguientes limitaciones: - **UDF:** Actualmente no se admiten las funciones definidas por el usuario (UDF). Si se encuentra una UDF en el código que se está depurando, el depurador puede comportarse de forma inesperada. - Solo se admite un subconjunto de expresiones de tabla DAX al depurar una consulta DAX (por ejemplo, se pueden depurar las consultas que dependen de [SUMMARIZECOLUMNS](https://dax.guide/summarizecolumns), mientras que otras funciones de tabla no se admiten actualmente). Por lo general, se admiten las consultas generadas por Power BI (que se pueden capturar a través del analizador de rendimiento de Power BI Desktop). - Actualmente no se admiten consultas que contengan medidas implícitas o cálculos con ámbito de consulta. -- Al explorar las primeras 1000 filas de un iterador que surge de una expresión de tabla filtrada, es posible que la fila seleccionada en la ventana de exploración no siempre corresponda al contexto de fila actual en la pila de contextos de evaluación (escriba «CALCULATETABLE('')» en la ventana **Observar** para inspeccionar el contexto de fila actual). +- Al explorar las primeras 1000 filas de un iterador que surge de una expresión de tabla filtrada, es posible que la fila seleccionada en la ventana de exploración no siempre corresponda al contexto de fila actual en la pila de contextos de evaluación (escriba `CALCULATETABLE('
    ')` en la ventana **Observar** para inspeccionar el contexto de fila actual). - Actualmente, el depurador solo permite depurar expresiones DAX en medidas. - Los [cálculos visuales](https://learn.microsoft.com/power-bi/transform-model/desktop-visual-calculations-overview) no se pueden depurar, ya que se definen mediante columnas con ámbito de consulta. El depurador no admite actualmente objetos de ámbito de consulta. - Si un elemento de cálculo modifica una medida en el contexto de filtro, los resultados parciales que se muestran en la vista Variables/Locales del depurador pueden ser incorrectos. diff --git a/localizedContent/es/content/features/deployment.md b/localizedContent/es/content/features/deployment.md index 8f3a7cafa..4f7a64f35 100644 --- a/localizedContent/es/content/features/deployment.md +++ b/localizedContent/es/content/features/deployment.md @@ -54,9 +54,9 @@ Tabular Editor no actualiza los metadatos lingüísticos conservados, por lo que ## Credenciales del origen de datos -De forma predeterminada, Tabular Editor no guarda contraseñas, claves de cuenta ni otros secretos cuando guarda un modelo en el disco. Por lo tanto, un modelo cargado desde un archivo puede tener orígenes de datos con un secreto faltante. El asistente de implementación comprueba esto antes de realizar la implementación. Un secreto se considera ausente cuando está vacío o es «********». El asistente comprueba: +De forma predeterminada, Tabular Editor no guarda contraseñas, claves de cuenta ni otros secretos cuando guarda un modelo en el disco. Por lo tanto, un modelo cargado desde un archivo puede tener orígenes de datos con un secreto faltante. El asistente de implementación comprueba esto antes de realizar la implementación. Un secreto se considera ausente cuando está vacío o es `********`. El asistente comprueba: -- un origen de datos de proveedor cuya cadena de conexión contiene una palabra clave de contraseña, como «Password» o «Pwd», +- un origen de datos de proveedor cuya cadena de conexión contiene una palabra clave de contraseña, como `Password` o `Pwd`, - un origen de datos del proveedor que suplanta a una cuenta de Windows específica, - un origen de datos estructurado que utiliza la autenticación de Windows o de nombre de usuario/contraseña, o una clave de cuenta. diff --git a/localizedContent/es/content/features/import-tables.partial.md b/localizedContent/es/content/features/import-tables.partial.md index 15779de00..b3d8824a0 100644 --- a/localizedContent/es/content/features/import-tables.partial.md +++ b/localizedContent/es/content/features/import-tables.partial.md @@ -78,7 +78,7 @@ Seleccione varias tablas y vistas de la izquierda para importarlas todas a la ve > [!TIP] > Si controla el origen, cree una vista sobre cada tabla que importe. En la vista, corrija los nombres y la ortografía que usa el modelo semántico y elimine las columnas que no necesita, como las columnas del sistema y las marcas de tiempo. > -> En el modelo, importe todas las columnas de la vista, lo que genera una sentencia «SELECT * FROM ...». Cuando cambia el origen, **Actualizar esquema de tabla...** en Tabular Editor muestra qué ha cambiado. +> En el modelo, importe todas las columnas de la vista, lo que genera una sentencia `SELECT * FROM ...`. Cuando cambia el origen, **Actualizar esquema de tabla...** en Tabular Editor muestra qué ha cambiado. ![Importación avanzada](~/content/assets/images/advanced-import.png) @@ -86,7 +86,7 @@ Cuando establece el modo de vista previa en **Solo esquema** en el menú despleg ![Confirmar selección](~/content/assets/images/confirm-selection.png) -En la última página, confirme su selección y elija el tipo de partición que desea crear. El valor predeterminado es «SQL» para los orígenes de datos de proveedor y «M» para los orígenes de datos estructurados. +En la última página, confirme su selección y elija el tipo de partición que desea crear. El valor predeterminado es `SQL` para los orígenes de datos de proveedor y `M` para los orígenes de datos estructurados. ![Confirmar selección Direct Lake](~/content/assets/images/confirm-selection-direct-lake.png) @@ -114,7 +114,7 @@ Tabular Editor se conecta a los orígenes de datos pertinentes, solicita las cre ![Cuadro de diálogo de comparación de esquema](~/content/assets/images/schema-compare-dialog.png) -En la captura de pantalla anterior, Tabular Editor detectó dos nuevas columnas de origen que aún no se han importado («Color» y «Material») y marcó dos columnas existentes para su eliminación («Colour» y «Substance Type»), porque sus nombres ya no coinciden con ninguna columna de origen. La detección de cambios de nombre solo funciona para cambios simples. En este caso, «Colour» se ha renombrado como «Color» y «Substance Type» como «Material» en el origen, pero los nombres difieren lo suficiente como para que Tabular Editor considere cada cambio de nombre como una eliminación y una adición. +En la captura de pantalla anterior, Tabular Editor detectó dos nuevas columnas de origen que aún no se han importado (`Color` y `Material`) y marcó dos columnas existentes para su eliminación (`Colour` y `Substance Type`), porque sus nombres ya no coinciden con ninguna columna de origen. La detección de cambios de nombre solo funciona para cambios simples. En este caso, `Colour` se ha renombrado como `Color` y `Substance Type` como `Material` en el origen, pero los nombres difieren lo suficiente como para que Tabular Editor considere cada cambio de nombre como una eliminación y una adición. Mantenga pulsada la tecla **Ctrl**, seleccione las filas `Color` (importar) y `Colour` (eliminar) en el cuadro de diálogo Cambio de esquema y, a continuación, haga clic con el botón derecho para combinar la eliminación y la adición en una sola actualización de SourceColumn. Las fórmulas DAX existentes que hacen referencia a `[Colour]` siguen funcionando: @@ -145,7 +145,7 @@ Con la opción habilitada, una actualización de esquema ejecuta estos pasos: 6. Si el esquema ha cambiado, aparecerá el cuadro de diálogo **Aplicar cambios de esquema** que se muestra arriba. > [!NOTE] -> Si sus expresiones M combinan datos de varios orígenes, por ejemplo, a través de la función M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin), es posible que deba cambiar el [**Nivel de privacidad**](https://powerbi.microsoft.com/blog/privacy-levels-for-cloud-data-sources/) de «Privado» a «Organizacional» en el modelo semántico del servicio Power BI. De lo contrario, es posible que vea un error que indique que « hace referencia a otras consultas o pasos, por lo que es posible que no pueda acceder directamente a un origen de datos. Vuelva a crear esta combinación de datos.». Este error también puede producirse incluso si no está habilitada la opción **Usar Analysis Services para detección de cambios**, ya que Tabular Editor 3 recurrirá automáticamente a este mecanismo de detección cuando la expresión M sea demasiado compleja para la detección de esquemas integrada de Tabular Editor 3. +> Si sus expresiones M combinan datos de varios orígenes, por ejemplo, a través de la función M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin), es posible que deba cambiar el [**Nivel de privacidad**](https://powerbi.microsoft.com/blog/privacy-levels-for-cloud-data-sources/) de «Privado» a «Organizacional» en el modelo semántico del servicio Power BI. De lo contrario, es posible que vea un error que indique que ` references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.`. Este error también puede producirse incluso si no está habilitada la opción **Usar Analysis Services para detección de cambios**, ya que Tabular Editor 3 recurrirá automáticamente a este mecanismo de detección cuando la expresión M sea demasiado compleja para la detección de esquemas integrada de Tabular Editor 3. ### Importación de nuevas tablas a través de Analysis Services diff --git a/localizedContent/es/content/features/mcp-server.md b/localizedContent/es/content/features/mcp-server.md index 27c5db219..1f20edef5 100644 --- a/localizedContent/es/content/features/mcp-server.md +++ b/localizedContent/es/content/features/mcp-server.md @@ -39,7 +39,7 @@ Los cambios del agente pasan por el [envoltorio del Tabular Object Model (TOM)]( 2. Revise los permisos. Consulte [Establecer permisos del agente](#set-agent-permissions). 3. Haz clic en **Iniciar servidor**. -El cuadro de diálogo muestra la dirección en la que escucha el servidor: `http://127.0.0.1`, a menos que haya cambiado el puerto. El indicador de la barra de estado cambia de **MCP detenido** a **MCP iniciado**, con la dirección en su información sobre herramientas. +El cuadro de diálogo muestra la dirección en la que escucha el servidor: `http://127.0.0.1:42100/`, a menos que haya cambiado el puerto. El indicador de la barra de estado cambia de **MCP detenido** a **MCP iniciado**, con la dirección en su información sobre herramientas. ![El cuadro de diálogo del servidor MCP, que muestra la URL del servidor, un token de acceso enmascarado y las cinco filas de permisos del agente configuradas con niveles distintos de los predeterminados](~/content/assets/images/features/mcp-server/mcp-server-dialog.png) @@ -66,7 +66,7 @@ Abra **Herramientas > Preferencias > Funciones de IA > Servidor MCP** para confi ## Registra tu agente -En el cuadro de diálogo del servidor, seleccione su agente en **Exportar configuración** y pegue la configuración copiada en su agente. Registra cada agente una sola vez, y la configuración registra el servidor con el nombre «tabular-editor». +En el cuadro de diálogo del servidor, seleccione su agente en **Exportar configuración** y pegue la configuración copiada en su agente. Registra cada agente una sola vez, y la configuración registra el servidor con el nombre `tabular-editor`. ![El menú desplegable «Exportar configuración», expandido para mostrar Claude Code, VS Code, Copilot CLI, Codex y Cursor](~/content/assets/images/features/mcp-server/export-configuration.png) @@ -123,7 +123,7 @@ url = "http://127.0.0.1:42100/" Cuando la opción **Requerir token de acceso** está activada, la configuración exportada incluye el token en el formato de cada cliente. Copie la configuración del cuadro de diálogo; no la escriba a mano. -Cualquier otro cliente MCP se conecta a «http://127.0.0.1» a través de HTTP transmisible. Si la opción **Requerir token de acceso** está activada, envía el token en un encabezado «Authorization: Bearer ». +Cualquier otro cliente MCP se conecta a `http://127.0.0.1:42100/` a través de HTTP transmisible. Si la opción **Requerir token de acceso** está activada, envía el token en un encabezado `Authorization: Bearer `. ### Comprueba que haya funcionado @@ -133,7 +133,7 @@ Pregúntale a tu agente: El agente responde con el nombre del modelo, cómo se carga el modelo, si tiene cambios sin guardar y su nivel de compatibilidad, o informa de que no hay ningún modelo abierto. No aparece ningún mensaje en Tabular Editor. -El nombre del modelo que recibe el agente sigue la configuración **Detalle del origen del modelo** en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario**. Con **Solo nombre**, el agente no recibe rutas de archivo ni nombres de servidores, y con **Oculto**, recibe «Modelo cargado» en lugar del nombre del modelo. +El nombre del modelo que recibe el agente sigue la configuración **Detalle del origen del modelo** en **Herramientas > Preferencias > Tabular Editor > Interfaz de usuario**. Con **Solo nombre**, el agente no recibe rutas de archivo ni nombres de servidores, y con **Oculto**, recibe `Model loaded` en lugar del nombre del modelo. ## Establecer permisos del agente @@ -273,7 +273,7 @@ Registra el segundo puerto con tu agente con su propio nombre y nombra la instan ## Ejecución en un equipo compartido -El servidor se vincula a `127.0.0.1`, a la que otros equipos no pueden acceder. También rechaza las solicitudes del navegador con un encabezado «Origin» no local. +El servidor se vincula a `127.0.0.1`, a la que otros equipos no pueden acceder. También rechaza las solicitudes del navegador con un encabezado `Origin` no local. Cuando la opción **Requerir token de acceso** está desactivada, cualquier proceso del equipo puede conectarse sin credenciales. En un host en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un servidor Citrix, eso incluye procesos en las sesiones de otras personas. @@ -300,7 +300,7 @@ El servidor MCP está activado de forma predeterminada, y cualquier usuario pued | `RequireMcpAccessToken` | Todos | Fuerza la autenticación con token y bloquea la preferencia | | `DisableCSharpScripts` | Todos | Impide que un agente ejecute un script de C# y lo redacte en un documento. La redacción de una consulta DAX y todas las herramientas que solo leen no se ven afectadas | | `BlockUnsafeScripts` | Enterprise | Permite únicamente los scripts que permanecen dentro del modelo, para cada script en Tabular Editor. Un script de agente que accede a archivos, a la red, a otros procesos o a ensamblados externos no se ejecuta, y no se abre ningún documento de revisión | -| Límites de permisos `Max...` y `McpMax...` | Enterprise | Limitan cada recurso. Los límites «Max...» se aplican al asistente de IA y al servidor MCP. Los límites «McpMax...» se aplican únicamente al servidor MCP y solo pueden reducir el límite «Max...» | +| Límites de permisos `Max...` y `McpMax...` | Enterprise | Limitan cada recurso. Los límites `Max...` se aplican al asistente de IA y al servidor MCP. Los límites `McpMax...` se aplican únicamente al servidor MCP y solo pueden reducir el límite `Max...` | | `AiAuditLogPath`, `AiAuditLogRetentionDays` | Enterprise | Establecen la ubicación y el período de conservación del [registro de auditoría](xref:ai-audit-log) | | `AiProvider` y valores relacionados | Enterprise | Bloquear el proveedor del asistente de IA. El servidor MCP no se ve afectado | diff --git a/localizedContent/es/content/features/pivot-grid.md b/localizedContent/es/content/features/pivot-grid.md index 5c183477d..a7a2578d4 100644 --- a/localizedContent/es/content/features/pivot-grid.md +++ b/localizedContent/es/content/features/pivot-grid.md @@ -146,7 +146,7 @@ Puede añadir reglas de visualización a las celdas de las tablas dinámicas, lo Cuando cierre un Pivot Grid, Tabular Editor le pedirá que guarde el diseño del Pivot Grid. Si decide guardar el diseño, la próxima vez que abra la cuadrícula dinámica, se restaurará con el mismo diseño que tenía cuando la cerró. También puede guardar el diseño de un Pivot Grid manualmente pulsando (Ctrl+S) o utilizando la opción **Archivo > Guardar**, mientras Pivot Grid sea la ventana activa. -La extensión de archivo que se utiliza para guardar las estructuras de Pivot Grid es «.te3pivot». Se trata de un archivo json sencillo que especifica qué objetos del modelo se muestran en el Pivot Grid y en qué áreas se colocan. Se hace referencia a los objetos por su nombre y por su etiqueta de linaje (si existe), por lo que, por lo general, el diseño de Pivot Grid se puede restaurar incluso si el modelo se ha modificado desde que se guardó el diseño. +La extensión de archivo que se utiliza para guardar las estructuras de Pivot Grid es `.te3pivot`. Se trata de un archivo json sencillo que especifica qué objetos del modelo se muestran en el Pivot Grid y en qué áreas se colocan. Se hace referencia a los objetos por su nombre y por su etiqueta de linaje (si existe), por lo que, por lo general, el diseño de Pivot Grid se puede restaurar incluso si el modelo se ha modificado desde que se guardó el diseño. > [!NOTE] > Puede abrir una estructura de Pivot Grid que se haya creado en un modelo diferente. Si el diseño utiliza campos que no existen en el modelo al que está conectado, aparece una advertencia y esos campos se eliminan del diseño. Lo mismo sucede cuando un Pivot Grid abierto se mantiene abierto y conectado a un modelo diferente, como se describe en [Cambio de modelos](#switching-models). Para desactivar la advertencia, desmarque **Mostrar advertencia si Pivot Grid no coincide con el modelo** en **Herramientas > Preferencias > Exploración de datos > Pivot Grid**. @@ -179,7 +179,7 @@ Pivot Grid tiene algunas funciones más que es útil conocer: A continuación se muestra una lista de limitaciones y problemas conocidos con las Pivot Grids en Tabular Editor 3.16.0, que estamos trabajando para solucionar en futuras versiones: -- Las reglas de formato (como los conjuntos de iconos, las barras de datos, etc.) no se conservan correctamente al guardar una estructura de Pivot Grid como archivo «.te3pivot». +- Las reglas de formato (como los conjuntos de iconos, las barras de datos, etc.) no se conservan correctamente al guardar una estructura de Pivot Grid como archivo `.te3pivot`. - Si abre un archivo `.te3pivot` en un modelo diferente al del que se guardó el diseño, o cambia de modelo mientras está abierto un Pivot Grid guardado, los campos que no existan en el modelo actual se eliminarán del diseño. Si a continuación guarda (**Ctrl+S**), el archivo `.te3pivot` se sobrescribe sin esos campos. - Las columnas que usan la propiedad **Agrupar por columnas** (incluidas las columnas de parámetros de campo) no se pueden agregar por sí solas al área de filas o al área de columnas. Si lo hace, se produce el error *"La columna X forma parte de una clave compuesta, pero no todas las columnas de la clave compuesta están incluidas en la expresión o en su expresión dependiente"*. Esta es una limitación general de los clientes MDX y también se produce cuando se utiliza una columna de este tipo en una tabla dinámica de Excel. Para evitarlo, agregue la columna Agrupar por relacionada al Pivot Grid *antes* de agregar la columna dependiente. Por ejemplo, si `[ProductKey]` está configurado como la columna «Agrupar por» de `[ProductName]`, añada primero `[ProductKey]` al área de filas o al área de columnas y, a continuación, añada `[ProductName]`. - Aplicar un orden ascendente o descendente explícito a una columna del área de filas o del área de columnas ordena los valores alfabéticamente como cadenas, independientemente del tipo de datos de la columna. Las fechas con formato de fecha larga (por ejemplo, «4 de mayo de 2024») y los números enteros se ordenan lexicográficamente en lugar de cronológica o numéricamente. Esta es una limitación de cómo ordenan los clientes MDX y el mismo comportamiento se produce en una tabla dinámica de Excel conectada al modelo. Para obtener un orden cronológico o numérico, confíe en el orden natural de la columna (no aplique un orden explícito) o utilice la propiedad **Ordenar por columna** en la columna del modelo para señalar una columna con un valor subyacente que se pueda ordenar. \ No newline at end of file diff --git a/localizedContent/es/content/features/user-context-calculated-columns.md b/localizedContent/es/content/features/user-context-calculated-columns.md index 25a432a48..9ddbd5cf9 100644 --- a/localizedContent/es/content/features/user-context-calculated-columns.md +++ b/localizedContent/es/content/features/user-context-calculated-columns.md @@ -35,7 +35,7 @@ Seleccione una columna calculada en la @tom-explorer-view y establezca **Context ## Direct Lake en tablas de OneLake -`UserContext` es el único contexto de expresión que Power BI admite para las columnas calculadas de las tablas de Direct Lake en OneLake. Si una columna calculada de una tabla Direct Lake se establece en «Standard» cuando guarda el modelo en el servicio Power BI, el guardado falla con el error «El contexto de expresión predeterminado no se puede usar para columnas calculadas en tablas Direct Lake». Las tablas de Direct Lake en SQL no admiten columnas calculadas. Para conocer los pasos para establecer el contexto de expresión en un modelo Direct Lake, consulte [Columnas calculadas en Direct Lake en OneLake](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake). +`UserContext` es el único contexto de expresión que Power BI admite para las columnas calculadas de las tablas de Direct Lake en OneLake. Si una columna calculada de una tabla Direct Lake se establece en `Standard` cuando guarda el modelo en el servicio Power BI, el guardado falla con el error «El contexto de expresión predeterminado no se puede usar para columnas calculadas en tablas Direct Lake». Las tablas de Direct Lake en SQL no admiten columnas calculadas. Para conocer los pasos para establecer el contexto de expresión en un modelo Direct Lake, consulte [Columnas calculadas en Direct Lake en OneLake](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake). ## Para qué no se puede usar una columna de contexto de usuario diff --git a/localizedContent/es/content/getting-started/creating-and-testing-dax.md b/localizedContent/es/content/getting-started/creating-and-testing-dax.md index 30c82bcd2..b5057bd5c 100644 --- a/localizedContent/es/content/getting-started/creating-and-testing-dax.md +++ b/localizedContent/es/content/getting-started/creating-and-testing-dax.md @@ -46,7 +46,7 @@ La vista **Editor de expresiones** se utiliza para proporcionar la expresión DA ![Añadir medida Editar DAX](~/content/assets/images/add-measure-edit-dax.png) -El cuadro desplegable situado en la esquina superior izquierda del **Editor de expresiones** se utiliza para cambiar entre las diferentes propiedades DAX del objeto seleccionado actualmente. Por ejemplo, en las versiones más recientes de Analysis Services, las medidas tienen una propiedad «Expression», así como una [`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/). Otros tipos de objetos pueden tener diferentes propiedades que contengan código DAX. Por ejemplo, los [KPI](https://docs.microsoft.com/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions) tienen tres propiedades DAX diferentes. Para añadir un KPI en Tabular Editor, haga clic derecho en una medida y elija **Crear > KPI**. +El cuadro desplegable situado en la esquina superior izquierda del **Editor de expresiones** se utiliza para cambiar entre las diferentes propiedades DAX del objeto seleccionado actualmente. Por ejemplo, en las versiones más recientes de Analysis Services, las medidas tienen una propiedad `Expression`, así como una [`Detail Rows Expression`](https://www.sqlbi.com/articles/controlling-drillthrough-in-excel-pivottables-connected-to-power-bi-or-analysis-services/). Otros tipos de objetos pueden tener diferentes propiedades que contengan código DAX. Por ejemplo, los [KPI](https://docs.microsoft.com/analysis-services/tabular-models/kpis-ssas-tabular?view=asallproducts-allversions) tienen tres propiedades DAX diferentes. Para añadir un KPI en Tabular Editor, haga clic derecho en una medida y elija **Crear > KPI**. ![Editar KPI](~/content/assets/images/editing-kpis.png) @@ -54,7 +54,7 @@ Si quieres que tu medida esté oculta, simplemente haz clic derecho y elige la o ## Otras propiedades de las medidas -Además de las propiedades «Nombre», «Expresión» y «Oculto», puede utilizar la vista **Propiedades** para revisar y editar el valor de todas las propiedades de los objetos seleccionados actualmente en el **Explorador TOM**. En el caso de las medidas, aquí es donde puede establecer la «Cadena de formato», por ejemplo. Para obtener más información, consulte [Vista de propiedades](xref:properties-view). +Además de las propiedades `Name`, `Expression` y `Hidden`, puede utilizar la vista **Propiedades** para revisar y editar el valor de todas las propiedades de los objetos seleccionados actualmente en el **Explorador TOM**. En el caso de las medidas, aquí es donde puede establecer `Format String`, por ejemplo. Para obtener más información, consulte [Vista de propiedades](xref:properties-view). # Añadir columnas calculadas @@ -143,7 +143,7 @@ El seguimiento se aplica a un único objeto seleccionado. Si se seleccionan vari # Carpetas de visualización -Cuando tu modelo empiece a tener un número considerable de medidas, una buena práctica es organizarlas mediante carpetas de visualización. En Tabular Editor, para crear una carpeta de visualización, edita la propiedad «Carpeta de visualización» a través de la vista **Propiedades** o, alternativamente, haz clic con el botón derecho en la(s) medida(s) y selecciona la opción **Crear > Carpeta de visualización**. +Cuando tu modelo empiece a tener un número considerable de medidas, una buena práctica es organizarlas mediante carpetas de visualización. En Tabular Editor, para crear una carpeta de visualización, edita la propiedad `Display Folder` a través de la vista **Propiedades** o, alternativamente, haz clic con el botón derecho en la(s) medida(s) y selecciona la opción **Crear > Carpeta de visualización**. También puede cortar/copiar/pegar o arrastrar y soltar objetos entre carpetas de visualización. diff --git a/localizedContent/es/content/getting-started/installation.md b/localizedContent/es/content/getting-started/installation.md index b6d8eb75d..bee4c30dc 100644 --- a/localizedContent/es/content/getting-started/installation.md +++ b/localizedContent/es/content/getting-started/installation.md @@ -68,7 +68,7 @@ Para ver la clave de licencia actual del usuario activo de Windows, ejecute el s REG QUERY "HKCU\Software\Kapacity\Tabular Editor 3" /v LicenseKey ``` -También puedes usar «regedit.exe» (Editor del Registro de Windows) y navegar hasta «HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3» para ver y modificar los valores. +También puedes usar `regedit.exe` (Editor del Registro de Windows) y navegar hasta `HKEY_CURRENT_USER\SOFTWARE\Kapacity\Tabular Editor 3` para ver y modificar los valores. ![Editor del Registro](~/content/assets/images/troubleshooting/registry-editor.png) @@ -147,10 +147,10 @@ En estos casos, el instalador aplica la selección predeterminada o la selecció | Situación | Resultado | |--|--| -| La línea de comandos establece «ADDLOCAL», «REMOVE» u otra propiedad de función | La línea de comandos establece la selección. `ADDLOCAL=MainFeature` elimina las funciones de IA de los equipos que las tienen, y `ADDLOCAL=ALL` las instala en los equipos que no las tienen | +| La línea de comandos establece `ADDLOCAL`, `REMOVE` u otra propiedad de función | La línea de comandos establece la selección. `ADDLOCAL=MainFeature` elimina las funciones de IA de los equipos que las tienen, y `ADDLOCAL=ALL` las instala en los equipos que no las tienen | | La implementación desinstala la versión anterior antes de instalar la nueva, por ejemplo, una sustitución de Intune configurada para desinstalar | La instalación es nueva e incluye las funciones de IA, a menos que la línea de comandos las excluya | -La política «DisableAi» anula la selección en todos los casos. +La política `DisableAi` anula la selección en todos los casos. ### Cambiar entre los paquetes .NET 8 y .NET 10 @@ -160,7 +160,7 @@ Si la otra edición está instalada en una versión más reciente, la instalaci ### Aplicar la decisión con la directiva DisableAi -Un usuario que ejecute el instalador obtendrá la selección predeterminada, que incluye las funciones de IA. Establezca las @políticas «DisableAi» en «1» en «HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3» para mantener desactivadas las funciones de IA en todas las instalaciones del dispositivo. Tabular Editor 3 lee la política al iniciarse y desactiva el Asistente de IA y el servidor MCP. +Un usuario que ejecute el instalador obtendrá la selección predeterminada, que incluye las funciones de IA. Establezca las @políticas `DisableAi` en `1` en `HKEY_LOCAL_MACHINE\Software\Policies\Tabular Editor ApS\TE3` para mantener desactivadas las funciones de IA en todas las instalaciones del dispositivo. Tabular Editor 3 lee la política al iniciarse y desactiva el Asistente de IA y el servidor MCP. A partir de la versión 3.27.0, el instalador también lee la directiva: @@ -168,13 +168,13 @@ A partir de la versión 3.27.0, el instalador también lee la directiva: - Una actualización elimina el componente de un equipo que lo tiene. - Una instalación existente conserva los archivos de IA hasta la siguiente actualización. Tabular Editor 3 no los carga mientras la política esté establecida. -Una herramienta de implementación que se ejecuta como la cuenta del sistema local no lee las políticas `HKEY_CURRENT_USER` de los usuarios del equipo. Establece la política en «HKEY_LOCAL_MACHINE» para que el instalador la lea en una implementación silenciosa. +Una herramienta de implementación que se ejecuta como la cuenta del sistema local no lee las políticas `HKEY_CURRENT_USER` de los usuarios del equipo. Establece la política en `HKEY_LOCAL_MACHINE` para que el instalador la lea en una implementación silenciosa. ### Nombres de paquetes y otras opciones de MSI -También puedes usar `/package` en lugar de `/i`. Sustituye «» por la cadena de la versión real. +También puedes usar `/package` en lugar de `/i`. Sustituye `` por la cadena de la versión real. -Los paquetes MSI se denominan «TabularEditor....msi», por ejemplo, «TabularEditor.3.27.0.x64.Net10.msi» o «TabularEditor.3.27.0.ARM64.Net8.msi». Elija la arquitectura y el tiempo de ejecución que se adapten a los equipos de destino; consulte @system-requirements. El MSI no instala .NET Desktop Runtime, así que despliéguelo primero. +Los paquetes MSI se denominan `TabularEditor....msi`, por ejemplo, `TabularEditor.3.27.0.x64.Net10.msi` o `TabularEditor.3.27.0.ARM64.Net8.msi`. Elija la arquitectura y el tiempo de ejecución que se adapten a los equipos de destino; consulte @system-requirements. El MSI no instala .NET Desktop Runtime, así que despliéguelo primero. Para obtener más información sobre las opciones de línea de comandos de MSI disponibles, consulte la documentación oficial de Microsoft: [Opciones de la línea de comandos del instalador estándar de Microsoft - Aplicaciones Win32 | Microsoft Learn](https://learn.microsoft.com/windows/win32/msi/command-line-options) diff --git a/localizedContent/es/content/getting-started/personalizing-te3.md b/localizedContent/es/content/getting-started/personalizing-te3.md index 800c43916..fde37f660 100644 --- a/localizedContent/es/content/getting-started/personalizing-te3.md +++ b/localizedContent/es/content/getting-started/personalizing-te3.md @@ -108,7 +108,7 @@ Cuando esto está marcado, se inserta un carácter de tabulación (`\t`) cada ve ##### *Estilo de comentario* (barras diagonales) -DAX admite comentarios de línea que usan barras diagonales («//») o guiones («--»). Este ajuste determina qué estilo de comentario se utiliza cuando Tabular Editor 3 genera código DAX, como cuando se utiliza la función de script DAX. +DAX admite comentarios de línea que usan barras diagonales (`//`) o guiones (`--`). Este ajuste determina qué estilo de comentario se utiliza cuando Tabular Editor 3 genera código DAX, como cuando se utiliza la función de script DAX. ## Configuración de DAX @@ -240,7 +240,7 @@ Cuando esto está marcado, los prefijos de tabla se eliminan automáticamente de ##### *Mayúsculas preferidas para palabras clave* (predeterminado = MAYÚSCULAS) -Este ajuste le permite cambiar las mayúsculas y minúsculas utilizadas para las palabras clave, como «ORDER BY», «VAR», «EVALUATE», etc. Esto también se aplica cuando se inserta una palabra clave a través de la función de autocompletar, incluidos los valores fijos de las palabras clave de las funciones que las utilizan. Consulta @preferences para ver la lista completa. +Este ajuste le permite cambiar las mayúsculas y minúsculas utilizadas para las palabras clave, como `ORDER BY`, `VAR`, `EVALUATE`, etc. Esto también se aplica cuando se inserta una palabra clave a través de la función de autocompletar, incluidos los valores fijos de las palabras clave de las funciones que las utilizan. Consulta @preferences para ver la lista completa. ##### *Mayúsculas preferidas para funciones* (predeterminado = MAYÚSCULAS) diff --git a/localizedContent/es/content/getting-started/refresh-preview-query.md b/localizedContent/es/content/getting-started/refresh-preview-query.md index 03191ebdf..c34fed074 100644 --- a/localizedContent/es/content/getting-started/refresh-preview-query.md +++ b/localizedContent/es/content/getting-started/refresh-preview-query.md @@ -108,7 +108,7 @@ Pivot Grid se actualiza automáticamente cuando se realiza un cambio en el model Una forma más directa de consultar los datos de tu modelo es escribir una consulta DAX. Use la opción de menú **Archivo > Nuevo > Consulta DAX** para crear un nuevo documento de consulta DAX. Puede tener varios documentos de consultas DAX abiertos al mismo tiempo. -Las consultas DAX se pueden guardar y cargar en archivos independientes y desde ellos utilizando la extensión de archivo «.dax» o «.msdax». Consulta @supported-files para obtener más información. +Las consultas DAX se pueden guardar y cargar en archivos independientes y desde ellos utilizando la extensión de archivo `.dax` o `.msdax`. Consulta @supported-files para obtener más información. Escriba su consulta DAX `EVALUATE` en el editor y pulse **Consulta > Ejecutar** (F5) para enviar la consulta a Analysis Services y ver el resultado. De forma predeterminada, Tabular Editor 3 limita el número de filas devueltas por Analysis Services a 1000, pero esto se puede cambiar en **Herramientas > Preferencias > Exploración de datos > Consulta DAX**. Si una consulta supera este límite, Tabular Editor 3 muestra un acceso directo que le permite recuperar todos los registros (vea la captura de pantalla a continuación). @@ -150,7 +150,7 @@ La función CustomData le permite pasar un valor de cadena personalizado que se ![Seleccionar simulación de usuario](~/content/assets/images/impersonation-customdata.png) -Cuando introduce un valor en el campo de entrada **CustomData**, Tabular Editor 3 añade la [propiedad «CustomData»](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata) a la cadena de conexión. A continuación, este valor puede recuperarse dentro de sus expresiones DAX utilizando la [función `CUSTOMDATA()`](https://dax.guide/customdata/). +Cuando introduce un valor en el campo de entrada **CustomData**, Tabular Editor 3 añade la [propiedad `CustomData`](https://docs.microsoft.com/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata) a la cadena de conexión. A continuación, este valor puede recuperarse dentro de sus expresiones DAX utilizando la [función `CUSTOMDATA()`](https://dax.guide/customdata/). CustomData se usa habitualmente para implementar seguridad dinámica a nivel de filas cuando una aplicación utiliza autenticación personalizada. El valor que proporcione puede aprovecharse en expresiones de filtro de roles para controlar qué filas pueden ver los usuarios en función de los datos personalizados que se transmiten a través de la cadena de conexión. diff --git a/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md b/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md index 9b36f27e9..dc361e54f 100644 --- a/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md +++ b/localizedContent/es/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md @@ -41,7 +41,7 @@ Ahora aparece la tabla «Empleado», porque algunas de sus columnas contienen la En el cuadro de texto **Filtro**, `?` coincide con cualquier carácter individual y `*` coincide con cualquier secuencia de cero o más caracteres, y la coincidencia no distingue entre mayúsculas y minúsculas, como en la búsqueda simple. `*sales*` da los mismos resultados que los anteriores, y `sales*` muestra solo los objetos cuyos nombres comienzan por «sales». -Una búsqueda de «sales*» en el modo «Por elemento principal» da estos resultados: +Una búsqueda de `sales*` en el modo «Por elemento principal» da estos resultados: ![Resultados de la búsqueda de sales* en el modo «Por elemento principal»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-07.png) @@ -49,7 +49,7 @@ La misma búsqueda en el modo «Por elemento secundario» da estos resultados: ![Resultados de la búsqueda de sales* en el modo «Por elemento secundario»](~/content/assets/images/advanced-filtering-of-the-explorer-tree-08.png) -Búsqueda plana de «sales*», con las columnas de información mostradas (**Ctrl+F1**) para obtener detalles sobre cada objeto: +Búsqueda plana de `sales*`, con las columnas de información mostradas (**Ctrl+F1**) para obtener detalles sobre cada objeto: ![Resultados de la búsqueda plana para sales* con columnas de información que muestran el elemento principal y el tipo](~/content/assets/images/advanced-filtering-of-the-explorer-tree-09.png) @@ -57,7 +57,7 @@ Puede colocar cualquier número de comodines en cualquier parte de la cadena. ## Búsqueda Dynamic LINQ -El filtro también acepta expresiones [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions), la sintaxis que utilizan las [reglas del Best Practice Analyzer](xref:best-practice-analyzer). Inicie la cadena de búsqueda con «:`» (dos puntos) para cambiar al modo Dynamic LINQ. Por ejemplo, este filtro muestra todos los objetos cuyo nombre termina en «Key» (distingue entre mayúsculas y minúsculas): +El filtro también acepta expresiones [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions), la sintaxis que utilizan las [reglas del Best Practice Analyzer](xref:best-practice-analyzer). Inicie la cadena de búsqueda con `:` (dos puntos) para cambiar al modo Dynamic LINQ. Por ejemplo, este filtro muestra todos los objetos cuyo nombre termina en «Key» (distingue entre mayúsculas y minúsculas): ```text :Name.EndsWith("Key") diff --git a/localizedContent/es/content/how-tos/load-save.md b/localizedContent/es/content/how-tos/load-save.md index d43320255..a3bea0dfd 100644 --- a/localizedContent/es/content/how-tos/load-save.md +++ b/localizedContent/es/content/how-tos/load-save.md @@ -30,7 +30,7 @@ Tabular Editor lee los metadatos del modelo en la memoria desde un archivo, una | Origen | Comando | |---|---| -| Un archivo «Model.bim» o «.bim» | **Archivo > Abrir > Modelo desde archivo...** | +| Un archivo `Model.bim` o `.bim` | **Archivo > Abrir > Modelo desde archivo...** | | Una estructura de carpetas, en formato JSON o en formato [Lenguaje de definición de modelo tabular (TMDL)](xref:tmdl) | **Archivo > Abrir > Modelo desde carpeta...** | | Una base de datos XMLA de Analysis Services o de Power BI | **Archivo > Abrir > Modelo desde BD...** (**Ctrl+Mayús+O**) | | Una instancia en ejecución de Power BI Desktop | **Archivo > Abrir > Modelo desde BD...**, o inicie Tabular Editor desde la cinta de opciones **Herramientas externas** de Power BI Desktop | @@ -67,7 +67,7 @@ Para guardar un modelo en otro lugar o en un formato diferente: En Tabular Editor 3.26 y versiones anteriores, y en Tabular Editor 2, el comando se llama **Archivo > Revertir**. -En Tabular Editor 3.27.0 y versiones posteriores, cuando un agente, un script o un «git pull» modifican los archivos de metadatos del modelo abierto, el modelo se vuelve a cargar, tras un aviso si tiene cambios sin guardar. Consulte [Recarga automática desde el disco](xref:auto-reload). +En Tabular Editor 3.27.0 y versiones posteriores, cuando un agente, un script o un `git pull` modifican los archivos de metadatos del modelo abierto, el modelo se vuelve a cargar, tras un aviso si tiene cambios sin guardar. Consulte [Recarga automática desde el disco](xref:auto-reload). Los documentos abiertos de consultas DAX y Pivot Grid permanecen abiertos durante una recarga manual o automática y se conectan al modelo recargado. diff --git a/localizedContent/es/content/how-tos/scripting-add-clone-remove-objects.md b/localizedContent/es/content/how-tos/scripting-add-clone-remove-objects.md index 202e7f117..b2da9387c 100644 --- a/localizedContent/es/content/how-tos/scripting-add-clone-remove-objects.md +++ b/localizedContent/es/content/how-tos/scripting-add-clone-remove-objects.md @@ -48,7 +48,7 @@ table.Measures.Where(m => m.IsHidden).ToList().ForEach(m => m.Delete()); ## Agregar medidas -`AddMeasure()` crea y devuelve una nueva medida en una tabla. El primer parámetro es el nombre, el segundo es una expresión DAX y el tercero es la carpeta de visualización. Todos los parámetros, excepto el primero, son opcionales. +`AddMeasure()` crea y devuelve una nueva `Measure` en una tabla. El primer parámetro es el nombre, el segundo es una expresión DAX y el tercero es la carpeta de visualización. Todos los parámetros, excepto el primero, son opcionales. Captura el objeto devuelto en una variable para establecer propiedades adicionales. Este patrón es el mismo en todos los métodos `Add*`. diff --git a/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md b/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md index 71085823d..0e1605a6a 100644 --- a/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md +++ b/localizedContent/es/content/how-tos/semantic-bridge-rename-objects.md @@ -19,7 +19,7 @@ applies_to: --- # Cambiar el nombre de objetos en una vista de métrica -Esta guía práctica muestra cómo cambiar el nombre de un campo de una vista de métrica, y el mismo patrón se aplica a todas las colecciones de una vista de métrica: «Campos», «Medidas», «Dimensiones» y «Uniones». +Esta guía práctica muestra cómo cambiar el nombre de un campo de una vista de métrica, y el mismo patrón se aplica a todas las colecciones de una vista de métrica: `Fields`, `Measures`, `Dimensions` y `Joins`. > [!NOTE] > Estas guías prácticas están dirigidas a Tabular Editor 3.26.2 y versiones posteriores, ya que las versiones anteriores no admiten las funciones de la vista de métricas v1.1 que se muestran aquí. diff --git a/localizedContent/es/content/references/policies.md b/localizedContent/es/content/references/policies.md index 3798d0aa9..9040bb525 100644 --- a/localizedContent/es/content/references/policies.md +++ b/localizedContent/es/content/references/policies.md @@ -50,11 +50,11 @@ HKEY_CURRENT_USER\Software\Policies\Tabular Editor ApS HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor ``` -- `Tabular Editor ApS\TE3` solo lo lee Tabular Editor 3. Tabular Editor CLI lee «Tabular Editor ApS\TECLI» en su lugar; las otras cuatro claves son las mismas para ambos. +- `Tabular Editor ApS\TE3` solo lo lee Tabular Editor 3. Tabular Editor CLI lee `Tabular Editor ApS\TECLI` en su lugar; las otras cuatro claves son las mismas para ambos. - `Tabular Editor ApS` es la clave compartida, leída tanto por Tabular Editor 3 como por la CLI. - `Kapacity\Tabular Editor` es la clave utilizada por las versiones anteriores. Sigue siendo leída y es la única clave que lee Tabular Editor 2, así que establezca también una política allí si también tiene que llegar a Tabular Editor 2. -La prioridad se aplica a cada valor por separado: un valor «DisableTelemetry» de 0 para todo el equipo anula un valor «DisableTelemetry» de 1 por usuario, mientras que un valor «DisableCSharpScripts» establecido solo por usuario sigue aplicándose. +La prioridad se aplica a cada valor por separado: un valor `DisableTelemetry` de 0 para todo el equipo anula un valor `DisableTelemetry` de 1 por usuario, mientras que un valor `DisableCSharpScripts` establecido solo por usuario sigue aplicándose. Los nombres de los valores no distinguen entre mayúsculas y minúsculas. ## Tipos de valores @@ -90,19 +90,19 @@ Para aplicar una de estas políticas, añada un valor `REG_DWORD` con el nombre | DisableAiChat | TE3 | El panel de chat del Asistente de IA no está disponible. Otras funcionalidades de IA, incluido el servidor MCP, no se ven afectadas. | | DisableMcpServer | TE3 | El servidor MCP no está disponible, por lo que las herramientas de agentes externos no pueden conectarse a Tabular Editor 3. El chat del asistente de IA no se ve afectado. | | RequireMcpAccessToken | TE3 | Los clientes que se conecten al servidor MCP deben presentar el token de acceso que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**, y los usuarios no pueden desactivar este requisito. | -| RequireNativeLibrarySignatureVerification | TE3 | Tabular Editor 3 verifica la firma Authenticode de las bibliotecas del editor de código, «Scintilla.dll» y «Lexilla.dll», antes de cargarlas. Si el equipo no puede validar la cadena de certificados del editor, los editores de código no se inician y Tabular Editor 3 se cierra. En el editor de directivas de grupo, esta directiva se denomina **Requerir la verificación de la firma de las bibliotecas de soporte del editor de código**. | +| RequireNativeLibrarySignatureVerification | TE3 | Tabular Editor 3 verifica la firma Authenticode de las bibliotecas del editor de código, `Scintilla.dll` y `Lexilla.dll`, antes de cargarlas. Si el equipo no puede validar la cadena de certificados del editor, los editores de código no se inician y Tabular Editor 3 se cierra. En el editor de directivas de grupo, esta directiva se denomina **Requerir la verificación de la firma de las bibliotecas de soporte del editor de código**. | ### En Tabular Editor CLI Tabular Editor CLI respeta las políticas marcadas como **CLI** más arriba, en Windows, leyendo las mismas claves en el mismo orden que Tabular Editor 3. También respeta `BlockUnsafeScripts` de las [políticas Enterprise](#scripts-and-macros) que se indican a continuación, para `te script`, `te macro run` y `te bpa run --fix`. -Una operación rechazada no pasa desapercibida. «te» indica la política que la ha rechazado y sale con un código distinto de cero, por lo que un paso del «pipeline» falla en lugar de parecer que se ha completado con éxito sin que se haya hecho nada. +Una operación rechazada no pasa desapercibida. `te` indica la política que la ha rechazado y sale con un código distinto de cero, por lo que un paso del «pipeline» falla en lugar de parecer que se ha completado con éxito sin que se haya hecho nada. La CLI no tiene ediciones, por lo que una política que requiere Tabular Editor 3 Edición Enterprise en la aplicación de escritorio simplemente la aplica la CLI, independientemente de la licencia que tenga el equipo. ## Políticas Enterprise -Estas políticas determinan lo que puede hacer un script de C# y configuran el Asistente de IA y el servidor MCP. Todas ellas requieren Tabular Editor 3 Edición Enterprise y pertenecen a `Tabular Editor ApS\TE3`, excepto `BlockUnsafeScripts`, que también respeta Tabular Editor CLI y que, por tanto, pertenece a la clave compartida `Tabular Editor ApS`. En su lugar, colócala bajo «TE3» o «TECLI» para que afecte solo a uno de los dos. +Estas políticas determinan lo que puede hacer un script de C# y configuran el Asistente de IA y el servidor MCP. Todas ellas requieren Tabular Editor 3 Edición Enterprise y pertenecen a `Tabular Editor ApS\TE3`, excepto `BlockUnsafeScripts`, que también respeta Tabular Editor CLI y que, por tanto, pertenece a la clave compartida `Tabular Editor ApS`. En su lugar, colócala bajo `TE3` o `TECLI` para que afecte solo a uno de los dos. ### Scripts y macros @@ -120,13 +120,13 @@ En el editor de directivas de grupo, esta opción se llama **Permitir únicament ### Límites de permisos -Cada uno de estos establece un límite superior a lo que el Asistente de IA y el servidor MCP pueden alcanzar para un tipo de recurso. Los valores aceptados son «Denegar», «Leer» y «Escribir», excepto para los datos del modelo, donde «Leer» es el ajuste más alto con sentido. +Cada uno de estos establece un límite superior a lo que el Asistente de IA y el servidor MCP pueden alcanzar para un tipo de recurso. Los valores aceptados son `Deny`, `Read` y `Write`, excepto para los datos del modelo, donde `Read` es el ajuste más alto con sentido. Un límite restringe lo que un usuario puede conceder: un permiso existente que supere el límite se reduce a este, la opción correspondiente en **Herramientas > Preferencias > Funciones de IA > Permisos** y en el cuadro de diálogo **Herramientas > Servidor MCP...** se muestra como de solo lectura, y el Asistente de IA ya no solicita un permiso que no se le puede conceder. Ninguna concesión supera un límite: ni un permiso permanente, ni uno concedido para un solo modelo, ni uno concedido en una versión anterior. La propia elección del usuario se mantiene intacta en sus preferencias, por lo que vuelve a aplicarse si se elimina la directiva. |Valor|Valores aceptados|Limita el acceso a...| |--|--|--| -| MaxModelMetadataAccess | Denegar, Leer, Escribir | Los metadatos del modelo abierto: nombres de tablas, columnas y medidas, expresiones, descripciones, resultados del Best Practice Analyzer y estadísticas de VertiPaq. «Write» también permite al asistente ejecutar sus propios scripts de C# en el modelo. Con «Denegar», no se envía nada en absoluto sobre el modelo abierto: ni el resumen del modelo, ni el aviso de que el modelo ha cambiado, ni la selección actual. | +| MaxModelMetadataAccess | Denegar, Leer, Escribir | Los metadatos del modelo abierto: nombres de tablas, columnas y medidas, expresiones, descripciones, resultados del Best Practice Analyzer y estadísticas de VertiPaq. `Write` también permite al asistente ejecutar sus propios scripts de C# en el modelo. Con `Deny`, no se envía nada en absoluto sobre el modelo abierto: ni el resumen del modelo, ni el aviso de que el modelo ha cambiado, ni la selección actual. | | MaxModelDataAccess | Denegar, Leer | Valores de datos del modelo, es decir, los resultados de las consultas DAX. | | MaxBpaAccess | Denegar, Leer, Escribir | Reglas del Best Practice Analyzer. `Read` permite listar las reglas y ejecutar el análisis; `Write` permite además añadir y modificar reglas. | | MaxDocumentsAccess | Denegar, Leer, Escribir | Los documentos que el usuario tiene abiertos, como scripts de C# y consultas DAX. `Read` permite leer su contenido; `Write` permite además modificarlos. | @@ -137,7 +137,7 @@ Un límite restringe lo que un usuario puede conceder: un permiso existente que | McpMaxDocumentsAccess | Denegar, Lectura, Escritura | | | McpMaxMacrosAccess | Denegar, Lectura, Escritura | | -Los cinco valores «McpMax...» se aplican únicamente al servidor MCP. Cuando uno de ellos no está establecido, el servidor MCP hereda el límite «Max...» correspondiente. Solo pueden reducir ese límite, nunca aumentarlo, por lo que a un agente desatendido nunca se le permite más que al asistente interactivo. +Los cinco valores `McpMax...` se aplican únicamente al servidor MCP. Cuando uno de ellos no está establecido, el servidor MCP hereda el límite `Max...` correspondiente. Solo pueden reducir ese límite, nunca aumentarlo, por lo que a un agente desatendido nunca se le permite más que al asistente interactivo. ### Proveedor de IA @@ -149,11 +149,11 @@ Los cinco valores «McpMax...» se aplican únicamente al servidor MCP. Cuando u | AiOrganizationId | Nombre | | Bloquea la organización de OpenAI a la que se facturan las solicitudes. | | AiProjectId | Nombre | | Bloquea el proyecto de OpenAI al que se facturan las solicitudes. | | AiAllowedProviders | Lista | Cualquiera de los nombres de proveedores anteriores | Restringe qué proveedores pueden configurar los usuarios. Se permite un proveedor establecido por `AiProvider` tanto si aparece en la lista como si no, y siempre se ofrece `None`. Una lista de elementos permitidos no es una forma de impedir que un usuario desactive el asistente. | -| AiAllowedEndpointHosts | Lista | Nombres de host | Restringe los hosts a los que puede apuntar un extremo, por ejemplo, «gateway.contoso.com» o «*.contoso.com». | +| AiAllowedEndpointHosts | Lista | Nombres de host | Restringe los hosts a los que puede apuntar un extremo, por ejemplo, `gateway.contoso.com` o `*.contoso.com`. | Los ajustes bloqueados aparecen como de solo lectura en **Herramientas > Preferencias > Funciones de IA > Asistente de IA**, y el Asistente de IA utiliza la configuración bloqueada, independientemente de lo que el usuario hubiera elegido antes. No se escribe nada en las propias preferencias del usuario, por lo que su proveedor, su punto de conexión, su modelo y su clave de API vuelven a aparecer si se elimina la política. Las claves de API nunca se distribuyen mediante directivas. -Los nombres de host se comparan únicamente con la parte del host de la URL del punto de conexión. La coincidencia no distingue entre mayúsculas y minúsculas y no tiene en cuenta el puerto. Un «*.» inicial cubre los subdominios de un dominio, pero no el dominio en sí, así que enumera ambos si se desean los dos. La lista se aplica a todos los proveedores siempre que se establezca un punto de conexión, por lo que no se puede usar una anulación de la URL base para evitarla. +Los nombres de host se comparan únicamente con la parte del host de la URL del punto de conexión. La coincidencia no distingue entre mayúsculas y minúsculas y no tiene en cuenta el puerto. Un `*.` inicial cubre los subdominios de un dominio, pero no el dominio en sí, así que enumera ambos si se desean los dos. La lista se aplica a todos los proveedores siempre que se establezca un punto de conexión, por lo que no se puede usar una anulación de la URL base para evitarla. Se rechaza cualquier configuración que la política no permita, y el Asistente de IA indica qué regla la ha rechazado en lugar de enviar la solicitud: un proveedor que no está en la lista de permitidos, un host de punto de conexión que no está en la lista de permitidos de hosts, un punto de conexión que no es una URL válida cuando se aplica una lista de permitidos de hosts, o un proveedor de Azure OpenAI o personalizado bloqueado que no tiene ningún punto de conexión. @@ -180,7 +180,7 @@ El registro es una función de la Edición Enterprise. En las licencias Enterpri |Valor|Tipo|Qué hace| |--|--|--| | AiAuditLogPath | Ruta | Redirige el registro de auditoría para que se pueda recopilar de forma centralizada. Se admite una ruta UNC a un recurso compartido de red. Cuando la directiva no está establecida, el registro se escribe en `%LocalAppData%\TabularEditor3\AI\audit`, un archivo `ai-audit-.jsonl` por día, con los scripts registrados en `audit\scripts\`. | -| AiAuditLogRetentionDays | Número, de 0 a 3650 | Número de días del registro de auditoría que se conservarán; los archivos más antiguos se eliminan. «0» conserva todo. El valor predeterminado es 30 días. | +| AiAuditLogRetentionDays | Número, de 0 a 3650 | Número de días del registro de auditoría que se conservarán; los archivos más antiguos se eliminan. `0` conserva todo. El valor predeterminado es 30 días. | ## Qué sucede sin la Edición Enterprise @@ -188,9 +188,9 @@ Las políticas de la Edición Enterprise nunca se ignoran sin más. Si se establ Las políticas Enterprise también fallan de forma cerrada cuando no se puede interpretar un valor. Un límite de permisos mal escrito deniega el recurso en lugar de interpretarse como «sin límite», y un nombre de proveedor que Tabular Editor no reconozca hace que el Asistente de IA no esté disponible en lugar de recurrir a la propia elección del usuario. -`BlockUnsafeScripts` falla de forma cerrada de la misma manera, y vale la pena saber exactamente cómo, porque va más allá de las superficies de la IA. En una copia que no tiene licencia para la edición Enterprise, la presencia del valor impide que se ejecute **ningún** script ni macro, sean seguros o no, y se muestra un mensaje en el que se indica la edición necesaria; las macros desaparecen de los menús hasta que se activa una licencia Enterprise, momento en el que vuelven a aparecer sin necesidad de reiniciar. Un valor que el lector no puede interpretar aplica la restricción en lugar de eliminarla. Un «0» explícito no la aplica, pero sigue contando como configurado, por lo que también deja las superficies de IA detrás de la barrera de Enterprise. +`BlockUnsafeScripts` falla de forma cerrada de la misma manera, y vale la pena saber exactamente cómo, porque va más allá de las superficies de la IA. En una copia que no tiene licencia para la edición Enterprise, la presencia del valor impide que se ejecute **ningún** script ni macro, sean seguros o no, y se muestra un mensaje en el que se indica la edición necesaria; las macros desaparecen de los menús hasta que se activa una licencia Enterprise, momento en el que vuelven a aparecer sin necesidad de reiniciar. Un valor que el lector no puede interpretar aplica la restricción en lugar de eliminarla. Un `0` explícito no la aplica, pero sigue contando como configurado, por lo que también deja las superficies de IA detrás de la barrera de Enterprise. -Para desactivar todas las funciones de IA sin una licencia Enterprise, use la política general «DisableAi». +Para desactivar todas las funciones de IA sin una licencia Enterprise, use la política general `DisableAi`. ## Ver qué políticas están vigentes @@ -200,7 +200,7 @@ Los controles que una política ha bloqueado o limitado en otros lugares de **Pr ## Uso de las plantillas administrativas -Tabular Editor 3.27 y versiones posteriores instalan un par de plantillas administrativas de directivas de grupo, de modo que las directivas anteriores se pueden configurar desde el editor de directivas de grupo en lugar de editando el registro. Las encontrarás en la carpeta «Policies» de la carpeta de instalación, que por defecto es «C:\Program Files\Tabular Editor 3\Policies»: +Tabular Editor 3.27 y versiones posteriores instalan un par de plantillas administrativas de directivas de grupo, de modo que las directivas anteriores se pueden configurar desde el editor de directivas de grupo en lugar de editando el registro. Las encontrarás en la carpeta `Policies` de la carpeta de instalación, que por defecto es `C:\Program Files\Tabular Editor 3\Policies`: - `TabularEditorApS.admx` - `en-US\TabularEditorApS.adml` @@ -226,9 +226,9 @@ A continuación, abra el Editor de directivas de grupo local (`gpedit.msc`) o el Las políticas compartidas por Tabular Editor 3 y la CLI se encuentran directamente bajo **Tabular Editor**. Las políticas que solo aplica Tabular Editor 3 se encuentran en **Tabular Editor > Tabular Editor 3**, con el Asistente de IA, el servidor MCP y la integración de DAX Optimizer en sus propias subcarpetas. -Al establecer una política como **Habilitada**, se escribe su valor de registro. Establecerla en **Deshabilitada** o dejarla en **No configurada** significa que la directiva no se aplica. Las plantillas no escriben en la clave heredada «Kapacity\Tabular Editor», por lo que debe establecer esa clave manualmente si una política también tiene que llegar a Tabular Editor 2. +Al establecer una política como **Habilitada**, se escribe su valor de registro. Establecerla en **Deshabilitada** o dejarla en **No configurada** significa que la directiva no se aplica. Las plantillas no escriben en la clave heredada `Kapacity\Tabular Editor`, por lo que debe establecer esa clave manualmente si una política también tiene que llegar a Tabular Editor 2. -En el caso de las políticas Enterprise, **Desactivada** elimina el valor del registro en lugar de escribir un «0». Esto es deliberado: el mero hecho de que exista un valor Enterprise es lo que hace que el Asistente de IA y el servidor MCP dependan de la comprobación de la licencia Enterprise, por lo que una política que un administrador acabe de desactivar no debe dejar ningún valor. +En el caso de las políticas Enterprise, **Desactivada** elimina el valor del registro en lugar de escribir un `0`. Esto es deliberado: el mero hecho de que exista un valor Enterprise es lo que hace que el Asistente de IA y el servidor MCP dependan de la comprobación de la licencia Enterprise, por lo que una política que un administrador acabe de desactivar no debe dejar ningún valor. ## Desactivación de las comunicaciones web diff --git a/localizedContent/es/content/references/preferences.md b/localizedContent/es/content/references/preferences.md index eb852d897..dbe3b30e7 100644 --- a/localizedContent/es/content/references/preferences.md +++ b/localizedContent/es/content/references/preferences.md @@ -78,9 +78,9 @@ La versión que estás ejecutando se muestra debajo de estos ajustes, junto con ### Gestionado por tu organización -Cuando un administrador ha configurado [políticas](xref:policies), se añade a esta página una sección de solo lectura, **Gestionado por su organización**, en la que se enumeran todos los valores de las políticas que Tabular Editor ha encontrado, en forma de «Nombre = valor». Pase el cursor sobre una entrada para ver de qué clave de registro y de qué subárbol procede. +Cuando un administrador ha configurado [políticas](xref:policies), se añade a esta página una sección de solo lectura, **Gestionado por su organización**, en la que se enumeran todos los valores de las políticas que Tabular Editor ha encontrado, en forma de `Name = value`. Pase el cursor sobre una entrada para ver de qué clave de registro y de qué subárbol procede. -Un valor que Tabular Editor no ha podido interpretar se muestra con el marcador «(inválido)» en lugar de omitirse. Ese marcador es la forma más rápida de encontrar el error tipográfico detrás de una política que parece no hacer nada, así que compruebe aquí primero cuando una política no surta efecto. +Un valor que Tabular Editor no ha podido interpretar se muestra con el marcador `(invalid)` en lugar de omitirse. Ese marcador es la forma más rápida de encontrar el error tipográfico detrás de una política que parece no hacer nada, así que compruebe aquí primero cuando una política no surta efecto. La sección no aparece cuando no se aplica ninguna directiva. Los ajustes que una política bloquea o limita se muestran en modo de solo lectura en otra parte de este cuadro de diálogo y en el cuadro de diálogo **Herramientas > Servidor MCP...**, con una información sobre herramientas que así lo indica. @@ -342,7 +342,7 @@ Configuración de conexión para el chat del Asistente de IA. La página secunda **URL base** / **Punto de conexión del servicio**: A dónde se envían las solicitudes. OpenAI y Anthropic proporcionan un valor predeterminado y el campo es opcional. Azure OpenAI y Personalizado no tienen ningún valor predeterminado, por lo que se requiere un punto de conexión. -**Clave de API**: Tu propia clave para el proveedor elegido. Se almacena cifrada en esta máquina en «Preferences.json». Tabular Editor no incluye ninguna clave integrada y nunca actúa como proxy de tus solicitudes. +**Clave de API**: Tu propia clave para el proveedor elegido. Se almacena cifrada en esta máquina en `Preferences.json`. Tabular Editor no incluye ninguna clave integrada y nunca actúa como proxy de tus solicitudes. **ID de organización de OpenAI** e **ID de proyecto de OpenAI**: Opcionales y solo se muestran para el proveedor OpenAI. Úselos cuando su cuenta de OpenAI facture o determine el uso por organización o proyecto. @@ -384,7 +384,7 @@ Configuración del [servidor MCP](xref:mcp-server), que permite que un agente ex **Iniciar el servidor MCP automáticamente** (deshabilitado): Inicia el servidor cuando se inicie Tabular Editor, de modo que un agente pueda conectarse sin que tengas que iniciarlo manualmente. Si el puerto está en uso al iniciar, el servidor no se inicia y no se muestra ningún mensaje. -**Requerir token de acceso** (deshabilitado): hace que los agentes presenten un token al portador, que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**. El servidor escucha solo en la interfaz de bucle invertido, por lo que esto es más importante en un equipo en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un host Citrix, donde cada sesión puede acceder a «127.0.0.1». Los administradores pueden aplicarlo con la [directiva](xref:policies) `RequireMcpAccessToken`. +**Requerir token de acceso** (deshabilitado): hace que los agentes presenten un token al portador, que se muestra en el cuadro de diálogo **Herramientas > Servidor MCP...**. El servidor escucha solo en la interfaz de bucle invertido, por lo que esto es más importante en un equipo en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un host Citrix, donde cada sesión puede acceder a `127.0.0.1`. Los administradores pueden aplicarlo con la [directiva](xref:policies) `RequireMcpAccessToken`. **Puerto** (42100): El puerto de bucle invertido en el que escucha el servidor, de 1024 a 49151. Si se cambia, se invalidan los registros de agentes existentes, que apuntan a una dirección fija. Si el puerto está ocupado cuando inicia el servidor manualmente, Tabular Editor ofrece el siguiente puerto libre que encuentre. @@ -437,13 +437,13 @@ Estos ajustes controlan cómo gestiona Tabular Editor 3 los metadatos del model **Agregar anotación de metadatos al implementar** (deshabilitado): Añade detalles de la implementación al modelo implementado: el usuario, el equipo cliente, la hora, la versión de Tabular Editor y el modo de implementación. -**Guardar copia de seguridad de Model.bim al implementar** (habilitado): Guarda una copia comprimida del archivo «Model.bim» del modelo en la carpeta **Ubicación de la copia de seguridad** en cada implementación. No se guarda ninguna copia de seguridad mientras **Ubicación de copia de seguridad** esté vacía. +**Guardar copia de seguridad de Model.bim al implementar** (habilitado): Guarda una copia comprimida del archivo `Model.bim` del modelo en la carpeta **Ubicación de la copia de seguridad** en cada implementación. No se guarda ninguna copia de seguridad mientras **Ubicación de copia de seguridad** esté vacía. **Ubicación de copia de seguridad**: La carpeta para las copias de seguridad de las implementaciones. Disponible cuando se selecciona **Guardar copia de seguridad de Model.bim al implementar**. ### Opciones de guardado de modelo -**Guardar copia de seguridad de Model.bim al guardar modelo** (habilitado): Guarda una copia comprimida del archivo «Model.bim» del modelo en la carpeta **Ubicación de la copia de seguridad** cada vez que guarda el modelo. No se guarda ninguna copia de seguridad mientras **Ubicación de copia de seguridad** esté vacía. +**Guardar copia de seguridad de Model.bim al guardar modelo** (habilitado): Guarda una copia comprimida del archivo `Model.bim` del modelo en la carpeta **Ubicación de la copia de seguridad** cada vez que guarda el modelo. No se guarda ninguna copia de seguridad mientras **Ubicación de copia de seguridad** esté vacía. **Ubicación de copia de seguridad**: La carpeta para guardar las copias de seguridad. Disponible cuando se selecciona **Guardar copia de seguridad de Model.bim al guardar modelo**. @@ -502,9 +502,9 @@ Estos ajustes controlan cómo gestiona Tabular Editor 3 los metadatos del model ### Configuración de consulta -**Selección inteligente** (habilitada): Cuando ejecuta parte de una consulta, Tabular Editor convierte esa selección en una consulta DAX válida en su nombre, envolviendo una expresión escalar entre llaves y añadiendo la sección `DEFINE` o la palabra clave `EVALUATE` cuando no forman parte de la selección. En un documento con varias consultas `DEFINE ... EVALUATE`, la sección `DEFINE` añadida es la que pertenece a la consulta seleccionada. Una referencia de columna seleccionada, incluida una en una cláusula «ORDER BY», devuelve los valores distintos de la columna. +**Selección inteligente** (habilitada): Cuando ejecuta parte de una consulta, Tabular Editor convierte esa selección en una consulta DAX válida en su nombre, envolviendo una expresión escalar entre llaves y añadiendo la sección `DEFINE` o la palabra clave `EVALUATE` cuando no forman parte de la selección. En un documento con varias consultas `DEFINE ... EVALUATE`, la sección `DEFINE` añadida es la que pertenece a la consulta seleccionada. Una referencia de columna seleccionada, incluida una en una cláusula `ORDER BY`, devuelve los valores distintos de la columna. -**Límite de filas** (1000): Encierra cada sentencia `EVALUATE` en una llamada `TOPN`, para evitar que una consulta accidental sobre una tabla grande se ejecute durante mucho tiempo o agote la memoria. Establézcalo en «0» para eliminar el límite por completo. +**Límite de filas** (1000): Encierra cada sentencia `EVALUATE` en una llamada `TOPN`, para evitar que una consulta accidental sobre una tabla grande se ejecute durante mucho tiempo o agote la memoria. Establézcalo en `0` para eliminar el límite por completo. ### Generación de código @@ -552,7 +552,7 @@ El editor DAX de Tabular Editor 3 es altamente configurable. Esta página ofrec **Usar tabulaciones** (desactivado): cuando está marcado, se inserta un carácter de tabulación (`\t`) cada vez que se pulsa la tecla TAB. De lo contrario, se inserta un número de espacios correspondiente al ajuste **Ancho de sangría**. -**Estilo de comentario** (barras diagonales): DAX admite comentarios de línea que utilizan barras diagonales («//») o guiones («--»). Este ajuste determina qué estilo de comentario se utiliza cuando Tabular Editor 3 genera código DAX. +**Estilo de comentario** (barras diagonales): DAX admite comentarios de línea que utilizan barras diagonales (`//`) o guiones (`--`). Este ajuste determina qué estilo de comentario se utiliza cuando Tabular Editor 3 genera código DAX. **Documentación de funciones DAX**: Use esta configuración para especificar qué URL abrir en el navegador web predeterminado cada vez que pulse F12 mientras el cursor esté situado sobre una función DAX. Las opciones incluyen https://dax.guide (recomendada) y la documentación oficial de Microsoft. @@ -645,7 +645,7 @@ Además de formatear los espacios en blanco del código DAX, Tabular Editor 3 ta **Corregir calificadores de medida/columna** (habilitado): Cuando está marcada esta opción, los prefijos de tabla se eliminan automáticamente de las referencias a medidas y se insertan automáticamente en las referencias a columnas. -**Mayúsculas preferidas para palabras clave** (MAYÚSCULAS): Este ajuste le permite cambiar las mayúsculas utilizadas para las palabras clave, como «ORDER BY», «VAR», «EVALUATE», etc. También rige los valores fijos de las palabras clave que ofrece el autocompletado para las funciones que los utilizan: «ASC» y «DESC», «KEEP», «FIRST», «LAST» y «DEFAULT», las direcciones de «CROSSFILTER» y «EXPLICIT» e «INFERRED» de «LOOKUP». Elija **Poner en mayúscula solo la primera letra** para que se le ofrezca «Explicit» en lugar de «EXPLICIT». +**Mayúsculas preferidas para palabras clave** (MAYÚSCULAS): Este ajuste le permite cambiar las mayúsculas utilizadas para las palabras clave, como `ORDER BY`, `VAR`, `EVALUATE`, etc. También rige los valores fijos de las palabras clave que ofrece el autocompletado para las funciones que los utilizan: `ASC` y `DESC`, `KEEP`, `FIRST`, `LAST` y `DEFAULT`, las direcciones de `CROSSFILTER` y `EXPLICIT` e `INFERRED` de `LOOKUP`. Elija **Poner en mayúscula solo la primera letra** para que se le ofrezca `Explicit` en lugar de `EXPLICIT`. **Mayúsculas preferidas para funciones** (MAYÚSCULAS): Este ajuste le permite cambiar las mayúsculas utilizadas para las funciones, como `CALCULATE(...)`, `SUM(...)`, etc. @@ -761,7 +761,7 @@ Configure la integración con DAX Optimizer (solo en la Edición Enterprise): - **Sistema**: Utilizar la configuración de proxy del sistema - **Personalizado**: Especifique una configuración de proxy personalizada. -**Dirección de proxy**: La dirección del servidor proxy (p. ej., `http://proxy.company.com`). +**Dirección de proxy**: La dirección del servidor proxy (p. ej., `http://proxy.company.com:8080`). **Usuario del proxy**: Nombre de usuario para la autenticación del proxy, si es necesario. diff --git a/localizedContent/es/content/references/release-notes/3_27_1_0.md b/localizedContent/es/content/references/release-notes/3_27_1_0.md index 76f13f6c1..a7ec25eed 100644 --- a/localizedContent/es/content/references/release-notes/3_27_1_0.md +++ b/localizedContent/es/content/references/release-notes/3_27_1_0.md @@ -27,12 +27,12 @@ Descargas de Tabular Editor 3.27.1.0: | Archivo | Entorno de ejecución .NET | Plataforma | SHA-256 | | -- | -- | -- | -- | -| [TabularEditor.3.27.1.0.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe) | .NET 10 | x64 | «57171F0B45F6F700E09A9140480A753134A94993DC9F74629B7CBD42D2C09272» | +| [TabularEditor.3.27.1.0.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net10.exe) | .NET 10 | x64 | `57171F0B45F6F700E09A9140480A753134A94993DC9F74629B7CBD42D2C09272` | | [TabularEditor.3.27.1.0.x64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.msi) | .NET 10 | x64 | `8A3948B1E85EA331ACF151FDEA2C47FEFEFB28E377A7248A785AF760B706B1D7` | -| [TabularEditor.3.27.1.0.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip) | .NET 10 | x64 | «7761B99F117A87A38204D984C52F26A95B740B39720044ABA805F123D9BBB0CF» | -| [TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | «90A0DA17220255D81EFE80B8381FCB14E447BF5569ED53DDF11AE732A6055746» | +| [TabularEditor.3.27.1.0.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net10.zip) | .NET 10 | x64 | `7761B99F117A87A38204D984C52F26A95B740B39720044ABA805F123D9BBB0CF` | +| [TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | `90A0DA17220255D81EFE80B8381FCB14E447BF5569ED53DDF11AE732A6055746` | | [TabularEditor.3.27.1.0.ARM64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.msi) | .NET 10 | ARM64 | `54D8F8CBC083B11C2025A2D32A1E0E32A3CDB5E10AE0ADBCB3E9A179EF6BC8C8` | -| [TabularEditor.3.27.1.0.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) | .NET 10 | ARM64 | «3338D9647596D5FBBE53A807725B45C5FA2FD9CC5B30834A9DD13EABD5D97912» | +| [TabularEditor.3.27.1.0.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.ARM64.Net10.zip) | .NET 10 | ARM64 | `3338D9647596D5FBBE53A807725B45C5FA2FD9CC5B30834A9DD13EABD5D97912` | | [TabularEditor.3.27.1.0.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.Installer.x64.Net8.exe) | .NET 8 | x64 | `43C227A33C51E7E7A5175D7AB705CC5C2B7E8686A2DA6DCCC786BD0D27CD45CB` | | [TabularEditor.3.27.1.0.x64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.msi) | .NET 8 | x64 | `6D05B0F8BC9654379D7CBAD2B75C317C8F067847BB69468F8FD36A8417729B9B` | | [TabularEditor.3.27.1.0.x64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.0/TabularEditor.3.27.1.0.x64.Net8.zip) | .NET 8 | x64 | `EAE7EB7AA0B4B4AEE56A9B80BA8752DA04B98B59235DD5DD9278A41071DFB514` | @@ -61,9 +61,9 @@ Descargas de Tabular Editor 3.27.1.0: ## Correcciones de errores en la versión 3.27.1.0 - Se ha solucionado un problema por el que, al establecer el **Ordinal** de un elemento de cálculo para moverlo hacia el final de su grupo de cálculos, se colocaba una posición antes de lo debido. -- Se ha solucionado un problema por el que **Archivo > Nuevo > Modelo...** aplicaba el nombre elegido solo al modelo y dejaba la base de datos con el nombre «SemanticModel». -- Se ha solucionado un problema por el que se aceptaba un nombre de configuración regional no válido para la propiedad **Culture** (Configuración regional) de un modelo y para la propiedad **Language** (Lenguaje) de una traducción. Ahora estos valores se rechazan con un error como «'en US' es un especificador de configuración regional no válido». -- Se ha solucionado un problema por el que la comparación de dos modelos fallaba con el mensaje «La referencia al objeto no está establecida en una instancia de un objeto» cuando diferían en los miembros de los roles, los grupos de consultas u otros elementos de la colección sin nombre. +- Se ha solucionado un problema por el que **Archivo > Nuevo > Modelo...** aplicaba el nombre elegido solo al modelo y dejaba la base de datos con el nombre `SemanticModel`. +- Se ha solucionado un problema por el que se aceptaba un nombre de configuración regional no válido para la propiedad **Culture** (Configuración regional) de un modelo y para la propiedad **Language** (Lenguaje) de una traducción. Ahora estos valores se rechazan con un error como `'en US' is an invalid culture specifier`. +- Se ha solucionado un problema por el que la comparación de dos modelos fallaba con el mensaje `Object reference not set to an instance of an object` cuando diferían en los miembros de los roles, los grupos de consultas u otros elementos de la colección sin nombre. - Se ha corregido un problema por el que no se informaba de un carácter de espacio en blanco no estándar en una expresión DAX, como un espacio sin separación. Ahora se informa como un error que indica el carácter y le dice que ejecute **Formatear DAX**. - Se han solucionado problemas en el **Metadata Translation Editor**: - Borrar una celda de traducción no tenía ningún efecto; ahora elimina la traducción. @@ -73,15 +73,15 @@ Descargas de Tabular Editor 3.27.1.0: - Se ha solucionado un problema por el que al cancelar el cuadro de diálogo **Cargar modelo semántico desde base de datos** o la solicitud de credenciales del origen de datos se podía cerrar Tabular Editor y perder el trabajo no guardado. - Se han solucionado problemas por los que **Depurar este valor** en un valor de **Pivot Grid** ignoraba o invertía algunos de los filtros de la cuadrícula, de modo que el depurador mostraba un valor diferente al de la cuadrícula. - Se ha solucionado un problema por el que un documento abierto por un cliente MCP cuando Tabular Editor no era la ventana activa mostraba la barra de herramientas y el menú del documento anterior. Informado en [debate de GitHub n.º 1590](https://github.com/TabularEditor/TabularEditor3/discussions/1590). -- Se ha corregido un problema por el que al duplicar o pegar una medida, columna o jerarquía que aparecía en varias carpetas de visualización, la copia se colocaba en una sola carpeta con el nombre de todas ellas, como `carpeta_01;carpeta_02`. La copia ahora aparece en todas las carpetas de visualización del original. -- Se han solucionado problemas en el editor de **Consultas DAX** por los que, al ejecutar una de varias consultas de un documento, se utilizaba el bloque `DEFINE` de la primera consulta, y al ejecutar una columna seleccionada en una cláusula `ORDER BY` se producía un error con el mensaje «No se puede determinar un único valor para la columna...». +- Se ha corregido un problema por el que al duplicar o pegar una medida, columna o jerarquía que aparecía en varias carpetas de visualización, la copia se colocaba en una sola carpeta con el nombre de todas ellas, como `folder_01;folder_02`. La copia ahora aparece en todas las carpetas de visualización del original. +- Se han solucionado problemas en el editor de **Consultas DAX** por los que, al ejecutar una de varias consultas de un documento, se utilizaba el bloque `DEFINE` de la primera consulta, y al ejecutar una columna seleccionada en una cláusula `ORDER BY` se producía un error con el mensaje `A single value for column ... cannot be determined`. - Se ha corregido un problema por el que la vista **Mensajes** dejaba de mostrar los errores de los documentos que permanecían abiertos después de abrir un modelo diferente. - Se han solucionado problemas que podían provocar el cierre inesperado de Tabular Editor 3 o la aparición de un cuadro de diálogo de error: - Mientras la vista **Propiedades** mostraba una medida o cuando se eliminaba su objeto seleccionado. - al abrir un modelo semántico, con un error de «No se puede acceder a un objeto eliminado» - después de una edición que eliminaba un objeto con una expresión DAX y renombraba o añadía otro objeto - Mientras se editaba una expresión DAX, con un error del tipo «El índice estaba fuera de los límites de la matriz». -- Se ha solucionado un problema por el que un origen de datos heredado que utilizaba un nombre de proveedor OLE DB específico de una versión, como «Provider=MSOLEDBSQL19.1», aparecía como no instalado y el cuadro de diálogo **Propiedades del vínculo de datos** se abría sin el proveedor original. Este problema era una regresión desde la versión 3.25.0. +- Se ha solucionado un problema por el que un origen de datos heredado que utilizaba un nombre de proveedor OLE DB específico de una versión, como `Provider=MSOLEDBSQL19.1`, aparecía como no instalado y el cuadro de diálogo **Propiedades del vínculo de datos** se abría sin el proveedor original. Este problema era una regresión desde la versión 3.25.0. - Se ha solucionado un problema por el que **Analizador VertiPaq > Recopilar estadísticas** no devolvía ninguna estadística cuando no se podían analizar los datos del modelo. Ahora las estadísticas se recopilan a partir de los metadatos del modelo con una advertencia, y si se desactiva **Leer estadísticas de datos** en **Herramientas > Preferencias > Formatos de archivo > Analizador VertiPaq**, se omite la lectura de datos. --- diff --git a/localizedContent/es/content/references/release-notes/3_27_1_1.md b/localizedContent/es/content/references/release-notes/3_27_1_1.md index c9e0ec9eb..0d6ab9b4c 100644 --- a/localizedContent/es/content/references/release-notes/3_27_1_1.md +++ b/localizedContent/es/content/references/release-notes/3_27_1_1.md @@ -27,13 +27,13 @@ Descargas de Tabular Editor 3.27.1.1: | Archivo | Entorno de ejecución .NET | Plataforma | SHA-256 | | -- | -- | -- | -- | -| [TabularEditor.3.27.1.1.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) | .NET 10 | x64 | «77D937365893FB9BBD5978340BFDDEB6E80CF0A2FE7BD2E553900FC55FFCFF80» | +| [TabularEditor.3.27.1.1.Installer.x64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net10.exe) | .NET 10 | x64 | `77D937365893FB9BBD5978340BFDDEB6E80CF0A2FE7BD2E553900FC55FFCFF80` | | [TabularEditor.3.27.1.1.x64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.msi) | .NET 10 | x64 | `995DCE34B0167FF6A3253C5D69D8528F4376E6D901D47D51267BDE92496C5EA2` | | [TabularEditor.3.27.1.1.x64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net10.zip) | .NET 10 | x64 | `640635D3017C78DBA3142C5FB29342D3A6CCAA8506FEE93C999AA7CA788D676F` | -| [TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | «E95A76DF2C3AB2DDCA4C02DF2C1013BBBBA8350DB3066B4D59F01B1B84135D23» | +| [TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net10.exe) | .NET 10 | ARM64 | `E95A76DF2C3AB2DDCA4C02DF2C1013BBBBA8350DB3066B4D59F01B1B84135D23` | | [TabularEditor.3.27.1.1.ARM64.Net10.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.msi) | .NET 10 | ARM64 | `6F1A81BB998A2875D2F296F19202B721C0F1D98A8E778DB8B8F05320BE3E4A25` | | [TabularEditor.3.27.1.1.ARM64.Net10.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.ARM64.Net10.zip) | .NET 10 | ARM64 | `E78071C0B5AA9CA49242F4A663A82C7579384D1470278A2DC1691E29A1FCFE25` | -| [TabularEditor.3.27.1.1.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) | .NET 8 | x64 | «ACFA96FF21E270BF65E7D4501C0A50703AC2AF1FDCE17689838AC1647A46274F» | +| [TabularEditor.3.27.1.1.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.x64.Net8.exe) | .NET 8 | x64 | `ACFA96FF21E270BF65E7D4501C0A50703AC2AF1FDCE17689838AC1647A46274F` | | [TabularEditor.3.27.1.1.x64.Net8.msi](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.msi) | .NET 8 | x64 | `8B1F1D53C9BF432F4CD981A0584F8C879E53D953B8C97945269A21D1F8C448F2` | | [TabularEditor.3.27.1.1.x64.Net8.zip](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.x64.Net8.zip) | .NET 8 | x64 | `619DE6309EE63BC2AE3DD4B9FA2B08F8A6404394DA50F05C6BBD1ABF46AB31EA` | | [TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe](https://cdn.tabulareditor.com/files/archive/te3/3.27.1.1/TabularEditor.3.27.1.1.Installer.ARM64.Net8.exe) | .NET 8 | ARM64 | `7715427824868BE2D34FE7BD66AF48E85C91B4A0B55BD695F132313D9D5747C7` | @@ -46,7 +46,7 @@ Descargas de Tabular Editor 3.27.1.1: ## Correcciones de errores en la versión 3.27.1.1 - Se ha solucionado un problema por el que Tabular Editor 3 se cerraba inesperadamente al seleccionar un objeto con una expresión, en equipos cuya configuración de seguridad impedía el inicio del componente del editor de código. Este problema era una regresión desde la versión 3.27.0. Los administradores pueden volver a activar la comprobación de firmas de las bibliotecas del editor de código con la directiva `RequireNativeLibrarySignatureVerification`. Consulta [Directivas](https://docs.tabulareditor.com/en/references/policies.html#general-policies). -- Se ha solucionado un problema por el que los detalles de un error inesperado, en el cuadro de diálogo del informe de errores y en «errorreport.txt», enumeraban el mismo error varias veces y omitían el error subyacente. Ahora, cada error de la cadena se indica una sola vez, hasta llegar a la causa subyacente. +- Se ha solucionado un problema por el que los detalles de un error inesperado, en el cuadro de diálogo del informe de errores y en `errorreport.txt`, enumeraban el mismo error varias veces y omitían el error subyacente. Ahora, cada error de la cadena se indica una sola vez, hasta llegar a la causa subyacente. --- diff --git a/localizedContent/es/content/references/supported-files.md b/localizedContent/es/content/references/supported-files.md index db88a6e78..44d369477 100644 --- a/localizedContent/es/content/references/supported-files.md +++ b/localizedContent/es/content/references/supported-files.md @@ -175,7 +175,7 @@ El archivo .platform contiene metadatos sobre el elemento del modelo semántico, Este archivo es un archivo JSON que no debe editarse manualmente a menos que comprenda el formato de los elementos de Fabric. > [!NOTE] -> Esta sincronización se aplica a un modelo cuyos metadatos llevan un nombre o una descripción. Un modelo semántico de Proyecto de Power BI (PBIP) creado por Power BI Desktop no contiene ninguno de los dos en su TMDL: ambos solo existen en el archivo «.platform». +> Esta sincronización se aplica a un modelo cuyos metadatos llevan un nombre o una descripción. Un modelo semántico de Proyecto de Power BI (PBIP) creado por Power BI Desktop no contiene ninguno de los dos en su TMDL: ambos solo existen en el archivo `.platform`. ### definition.pbism @@ -193,9 +193,9 @@ Todos los archivos auxiliares se pueden guardar individualmente usando Ctrl+S o ### Opciones de usuario (.tmuo) -Un archivo «.tmuo» contiene su propia configuración local del equipo para un modelo: la base de datos del área de trabajo, las anulaciones de credenciales de la fuente de datos, la configuración de importación de tablas, las anulaciones de actualización y las concesiones de permisos de IA. Se encuentra junto al modelo y lleva el nombre de este y su nombre de usuario de Windows, de modo que varios desarrolladores pueden trabajar en el mismo modelo sin interferir entre sí. +Un archivo `.tmuo` contiene su propia configuración local del equipo para un modelo: la base de datos del área de trabajo, las anulaciones de credenciales de la fuente de datos, la configuración de importación de tablas, las anulaciones de actualización y las concesiones de permisos de IA. Se encuentra junto al modelo y lleva el nombre de este y su nombre de usuario de Windows, de modo que varios desarrolladores pueden trabajar en el mismo modelo sin interferir entre sí. -Las credenciales que contiene están cifradas con tu clave de usuario de Windows, lo que significa que el archivo no se puede compartir de forma útil. Añada «*.tmuo» a «.gitignore». +Las credenciales que contiene están cifradas con tu clave de usuario de Windows, lo que significa que el archivo no se puede compartir de forma útil. Añada `*.tmuo` a `.gitignore`. Consulte @user-options para ver el contenido completo y dónde se escribe el archivo para cada formato de modelo. diff --git a/localizedContent/es/content/references/user-options.md b/localizedContent/es/content/references/user-options.md index 516a3e473..911d31c50 100644 --- a/localizedContent/es/content/references/user-options.md +++ b/localizedContent/es/content/references/user-options.md @@ -24,12 +24,12 @@ Cuando abre un modelo desde el disco, el archivo se crea junto a él, con el mis | Lo que ha abierto | Archivo de opciones de usuario | |---|---| -| `SpaceParts.bim`, o cualquier archivo `.bim` / `.pbit` / `database.json` | `SpaceParts..tmuo`, junto a él | -| Un archivo «model.tmdl» o «database.tmdl» | «model..tmuo`, junto a él | -| Una carpeta que contiene `database.json` | `database..tmuo`, en esa carpeta | -| Una carpeta que contiene archivos de modelo del Lenguaje de definición de modelo tabular (TMDL) | `model..tmuo`, en esa carpeta | +| `SpaceParts.bim`, o cualquier archivo `.bim` / `.pbit` / `database.json` | `SpaceParts..tmuo`, junto a él | +| Un archivo `model.tmdl` o `database.tmdl` | `model..tmuo`, junto a él | +| Una carpeta que contiene `database.json` | `database..tmuo`, en esa carpeta | +| Una carpeta que contiene archivos de modelo del Lenguaje de definición de modelo tabular (TMDL) | `model..tmuo`, en esa carpeta | -TMDL siempre utiliza el prefijo «model», para mantener la continuidad con las versiones anteriores a «database.tmdl». +TMDL siempre utiliza el prefijo `model`, para mantener la continuidad con las versiones anteriores a `database.tmdl`. En el caso de un modelo abierto a través de una conexión y no desde el disco, no hay ningún lugar aparte del modelo donde colocar el archivo, por lo que se guarda por servidor y base de datos en `%LocalAppData%\TabularEditor3\UserOptions\`. @@ -114,9 +114,9 @@ Una anulación cuyo origen de datos ya no exista en el modelo se eliminará la p | `RowLimitClause`, `IdentifierQuoting` | Número | No con sus valores predeterminados. | | `Schema` | Cadena | Establecida. | -En `Options` es donde acaba todo lo específico de un proveedor, como cadenas simples: un almacén de Snowflake es `Options.warehouse`, un espacio de trabajo de OneLake es `Options.workspaceid`. Las propiedades «…Key» son los *nombres* de las claves de la cadena de conexión, como «PWD», no secretos. +En `Options` es donde acaba todo lo específico de un proveedor, como cadenas simples: un almacén de Snowflake es `Options.warehouse`, un espacio de trabajo de OneLake es `Options.workspaceid`. Las propiedades `…Key` son los *nombres* de las claves de la cadena de conexión, como `PWD`, no secretos. -`Password` es el único valor cifrado aquí. `UserId`, `Server`, `Database`, `Dsn` y todo lo que hay en `Options` se almacenan como texto sin formato, por lo que debe tratar el archivo como confidencial incluso cuando no contenga ninguna contraseña. Un token de acceso de Power BI se almacena como «Password» y está cifrado. +`Password` es el único valor cifrado aquí. `UserId`, `Server`, `Database`, `Dsn` y todo lo que hay en `Options` se almacenan como texto sin formato, por lo que debe tratar el archivo como confidencial incluso cuando no contenga ninguna contraseña. Un token de acceso de Power BI se almacena como `Password` y está cifrado. ### Implementación diff --git a/localizedContent/es/content/security/ai-compliance.md b/localizedContent/es/content/security/ai-compliance.md index 0ac6505d8..e40b52366 100644 --- a/localizedContent/es/content/security/ai-compliance.md +++ b/localizedContent/es/content/security/ai-compliance.md @@ -29,11 +29,11 @@ El [asistente de IA](xref:ai-assistant) y el [servidor del Protocolo de Contexto | Función | Qué hace | Qué llama al proveedor de IA | Tráfico de red | | -- | -- | -- | -- | | Asistente de IA | Un panel de chat en Tabular Editor 3 que lee, consulta y modifica el modelo semántico abierto | Tabular Editor 3, desde el equipo del usuario, con una clave de API que introduce el usuario | Saliente hacia el punto de conexión del proveedor configurado | -| Servidor MCP | Un servidor local al que se conecta un agente de IA que el usuario ya ejecuta, como Claude Code, GitHub Copilot, Codex o Cursor. A continuación, el agente lee, consulta y modifica el modelo semántico abierto | El agente, con su propia configuración y suscripción | Tráfico entrante solo en «127.0.0.1» | +| Servidor MCP | Un servidor local al que se conecta un agente de IA que el usuario ya ejecuta, como Claude Code, GitHub Copilot, Codex o Cursor. A continuación, el agente lee, consulta y modifica el modelo semántico abierto | El agente, con su propia configuración y suscripción | Tráfico entrante solo en `127.0.0.1` | Ambas funciones se incluyen en el componente de funciones de IA, que forma parte de la instalación predeterminada de Tabular Editor 3.27.0. Comparten las concesiones de permisos, las políticas de administrador y el registro de auditoría, con las diferencias descritas en [Concesiones de permisos](#permission-grants). -Tabular Editor ApS no gestiona ningún servicio de IA y no incluye ninguna clave de API. Las indicaciones, las respuestas, los metadatos del modelo y los datos del modelo de cualquiera de las dos funciones nunca pasan por los servidores de Tabular Editor. Con la telemetría activada, Tabular Editor 3 envía eventos de uso de la IA a Tabular Editor ApS con el proveedor, el nombre del modelo, un ID de conversación y el número de «tokens». En el caso del servidor MCP, los eventos incluyen el nombre de la herramienta, el resultado y la duración de cada llamada a la herramienta, así como el nombre y la versión del cliente MCP si se trata de un cliente conocido. No se envían los argumentos de las herramientas, los resultados de las herramientas ni los mensajes de error. La directiva «DisableTelemetry» los desactiva. +Tabular Editor ApS no gestiona ningún servicio de IA y no incluye ninguna clave de API. Las indicaciones, las respuestas, los metadatos del modelo y los datos del modelo de cualquiera de las dos funciones nunca pasan por los servidores de Tabular Editor. Con la telemetría activada, Tabular Editor 3 envía eventos de uso de la IA a Tabular Editor ApS con el proveedor, el nombre del modelo, un ID de conversación y el número de «tokens». En el caso del servidor MCP, los eventos incluyen el nombre de la herramienta, el resultado y la duración de cada llamada a la herramienta, así como el nombre y la versión del cliente MCP si se trata de un cliente conocido. No se envían los argumentos de las herramientas, los resultados de las herramientas ni los mensajes de error. La directiva `DisableTelemetry` los desactiva. El [Centro de confianza de Tabular Editor](https://trust.tabulareditor.com/) publica el informe de la prueba de penetración independiente para el Asistente de IA, el informe de auditoría SOC 2 y la lista de subencargados del tratamiento. @@ -47,7 +47,7 @@ Una solicitud al proveedor contiene: - la indicación del sistema y las instrucciones personalizadas vigentes, incluidas las que publique tu organización - los mensajes del usuario y el historial de la conversación -- contexto sobre el modelo abierto añadido a los mensajes del usuario: el nombre de la base de datos, el número de objetos, la selección actual, el título del documento activo, los errores del modelo y los cambios recientes. El ajuste **Metadatos del modelo** de un usuario no los retiene; un límite de «MaxModelMetadataAccess» de «Deny» sí lo hace. +- contexto sobre el modelo abierto añadido a los mensajes del usuario: el nombre de la base de datos, el número de objetos, la selección actual, el título del documento activo, los errores del modelo y los cambios recientes. El ajuste **Metadatos del modelo** de un usuario no los retiene; un límite de `MaxModelMetadataAccess` de `Deny` sí lo hace. - los resultados de las herramientas que el asistente ha llamado, dentro de los [permisos concedidos](#permission-grants) - pasajes de la base de conocimientos de Tabular Editor, una base de datos local creada a partir de la documentación de Tabular Editor, el blog, los problemas de GitHub y los debates @@ -59,11 +59,11 @@ El acuerdo de su organización con el proveedor rige la retención, la región e ### Servidor MCP -El servidor MCP es un «listener» HTTP vinculado a `127.0.0.1`, en el puerto 42100 de forma predeterminada. No tiene clave de API, no realiza solicitudes salientes y rechaza las solicitudes del navegador con un encabezado «Origin» no local. +El servidor MCP es un «listener» HTTP vinculado a `127.0.0.1`, en el puerto 42100 de forma predeterminada. No tiene clave de API, no realiza solicitudes salientes y rechaza las solicitudes del navegador con un encabezado `Origin` no local. El agente conectado envía lo que lee de Tabular Editor 3 a su propio proveedor, según la configuración del agente y las condiciones del proveedor. Tabular Editor 3 no tiene ningún ajuste para el proveedor del agente, por lo que debes controlar al agente a través de sus propios controles administrativos. Las propias herramientas del agente, como el acceso a archivos y al shell, también están fuera de Tabular Editor 3. La preferencia **Detalle del origen del modelo** establece qué parte de la ruta del archivo o del servidor del modelo recibe el agente junto con el nombre del modelo, y no cambia los detalles de la conexión en los metadatos del modelo. Consulte [Comprobar que ha funcionado](xref:mcp-server#check-that-it-worked). Los archivos de modelo en el disco, los archivos de conversación y los archivos de auditoría pueden ser leídos por cualquier agente que se ejecute como el usuario. -La opción **Requerir token de acceso** está desactivada de forma predeterminada. Mientras esté desactivada, cualquier proceso del equipo puede conectarse al servidor sin credenciales, incluidos los procesos de las sesiones de otros usuarios en un Escritorio remoto o en un host Citrix. La política «RequireMcpAccessToken» impone el token para todos los usuarios. Los archivos de registro del agente almacenan el token en texto plano, y la opción **Regenerar token** en el cuadro de diálogo **Herramientas > Servidor MCP...** invalida todos los registros existentes. Consulte [Ejecución en un equipo compartido](xref:mcp-server#running-on-a-shared-machine). +La opción **Requerir token de acceso** está desactivada de forma predeterminada. Mientras esté desactivada, cualquier proceso del equipo puede conectarse al servidor sin credenciales, incluidos los procesos de las sesiones de otros usuarios en un Escritorio remoto o en un host Citrix. La política `RequireMcpAccessToken` impone el token para todos los usuarios. Los archivos de registro del agente almacenan el token en texto plano, y la opción **Regenerar token** en el cuadro de diálogo **Herramientas > Servidor MCP...** invalida todos los registros existentes. Consulte [Ejecución en un equipo compartido](xref:mcp-server#running-on-a-shared-machine). ### Puntos de conexión de red @@ -71,9 +71,9 @@ Permite estos puntos finales a través de tu cortafuegos o proxy para las funcio | Tráfico | Punto de conexión | | -- | -- | -| Solicitudes del Asistente de IA | El punto de conexión del proveedor configurado, por ejemplo, «https://api.openai.com», «https://api.anthropic.com», un recurso de Azure OpenAI o tu propia pasarela | +| Solicitudes del Asistente de IA | El punto de conexión del proveedor configurado, por ejemplo, `https://api.openai.com`, `https://api.anthropic.com`, un recurso de Azure OpenAI o tu propia pasarela | | Catálogo de modelos de IA | `https://api.tabulareditor.com/AiModels`. Una solicitud anónima de la lista de modelos, realizada cuando un usuario abre la lista de modelos de OpenAI o Anthropic. La lista se almacena en caché durante 24 horas. `DisableUpdates` la desactiva | -| Actualizaciones de la base de conocimientos de IA | `https://cdn.tabulareditor.com`. Una comprobación como máximo una vez al día mientras el asistente de IA esté configurado, sin datos sobre el usuario ni el modelo. Ninguna directiva lo desactiva, excepto «DisableAi». Los usuarios desmarcan **Buscar actualizaciones de la base de conocimientos al iniciar** en **Herramientas > Preferencias > Funciones de IA > Asistente de IA** | +| Actualizaciones de la base de conocimientos de IA | `https://cdn.tabulareditor.com`. Una comprobación como máximo una vez al día mientras el asistente de IA esté configurado, sin datos sobre el usuario ni el modelo. Ninguna directiva lo desactiva, excepto `DisableAi`. Los usuarios desmarcan **Buscar actualizaciones de la base de conocimientos al iniciar** en **Herramientas > Preferencias > Funciones de IA > Asistente de IA** | | Servidor MCP | Ninguno | La validación de licencias, las comprobaciones de actualizaciones y la telemetría utilizan solicitudes separadas. Consulte [Solicitudes web](xref:security-privacy#web-requests). @@ -106,14 +106,14 @@ Las concesiones de permisos controlan a qué acceden el asistente de IA y el ser | Documentos | Lectura: el contenido de los documentos abiertos de scripts de C#, consultas DAX y scripts DAX, así como los errores y las advertencias de los documentos abiertos, incluidas las tablas dinámicas. Escritura: crearlos y sobrescribirlos | Escritura | `MaxDocumentsAccess` | `McpMaxDocumentsAccess` | | Macros | Lectura: la biblioteca de macros del usuario, incluido el código de las macros | Escritura | `MaxMacrosAccess` | `McpMaxMacrosAccess` | -En los niveles predeterminados, las funciones de IA leen la definición del modelo, ejecutan Best Practice Analyzer, leen la biblioteca de macros y leen y sobrescriben los documentos de script y de consultas abiertos. No leen los valores de los datos ni cambian el modelo. El código de las macros y los documentos abiertos pueden contener cadenas de conexión y otras credenciales. Establece «MaxMacrosAccess» y «MaxDocumentsAccess» si es el caso en tu organización. +En los niveles predeterminados, las funciones de IA leen la definición del modelo, ejecutan Best Practice Analyzer, leen la biblioteca de macros y leen y sobrescriben los documentos de script y de consultas abiertos. No leen los valores de los datos ni cambian el modelo. El código de las macros y los documentos abiertos pueden contener cadenas de conexión y otras credenciales. Establece `MaxMacrosAccess` y `MaxDocumentsAccess` si es el caso en tu organización. El asistente de IA y el servidor MCP aplican los permisos de la siguiente manera: - **Asistente de IA.** Cuando una solicitud necesita un acceso que no cubre el permiso permanente, aparece una tarjeta de permiso en el chat. El usuario lo permite para el turno, para la sesión o siempre, y para **Metadatos del modelo** y **Datos del modelo** también para el modelo actual. No aparece ninguna tarjeta para el acceso por encima de un límite de permisos. - **Servidor MCP.** No aparece ningún mensaje. El servidor lee los permisos permanentes cuando se inicia, y las herramientas que un permiso no cubre no se ofrecen al agente. Los permisos concedidos para un modelo o una sesión se aplican únicamente al chat. -Un límite de permisos prevalece sobre todas las concesiones de los usuarios, incluidas las concesiones otorgadas para un modelo y las concesiones otorgadas antes de establecer la política, y el ajuste correspondiente ofrece solo los niveles hasta el límite. Un límite «McpMax...» solo reduce el límite compartido para el servidor MCP. Consulta [Permisos y consentimiento](xref:ai-assistant#permissions-and-consent). +Un límite de permisos prevalece sobre todas las concesiones de los usuarios, incluidas las concesiones otorgadas para un modelo y las concesiones otorgadas antes de establecer la política, y el ajuste correspondiente ofrece solo los niveles hasta el límite. Un límite `McpMax...` solo reduce el límite compartido para el servidor MCP. Consulta [Permisos y consentimiento](xref:ai-assistant#permissions-and-consent). ## Medidas de protección ante cambios en el modelo @@ -130,7 +130,7 @@ Las funciones de IA ejecutan scripts que modifican un modelo solo cuando los **M - En un script que ejecuta el Asistente de IA o un agente MCP, `ReadFile`, `SaveFile`, `Bpa.ExportCsv`, `ExecuteCommand`, las llamadas que ejecutan una macro y las llamadas de Semantic Bridge siempre fallan. `ExecuteCommand` envía al servidor comandos del lenguaje de scripting de modelo tabular (TMSL) y de XML for Analysis (XMLA). - En los mismos scripts, los métodos auxiliares de DAX requieren **Datos del modelo** en **Lectura**, al igual que la herramienta de consultas DAX. -La política «BlockUnsafeScripts» aplica la misma comprobación de seguridad a todos los scripts y macros: del usuario, de Best Practice Analyzer, del asistente de IA, del servidor MCP o de Tabular Editor CLI. `DisableCSharpScripts` desactiva los documentos de script de C# y elimina la herramienta que ejecuta los scripts del Asistente de IA y ambas herramientas de script del servidor MCP. Las macros siguen ejecutándose, a menos que también se establezca `DisableMacros`. Consulta [Cómo cambia un agente tu modelo](xref:mcp-server#how-an-agent-changes-your-model). +La política `BlockUnsafeScripts` aplica la misma comprobación de seguridad a todos los scripts y macros: del usuario, de Best Practice Analyzer, del asistente de IA, del servidor MCP o de Tabular Editor CLI. `DisableCSharpScripts` desactiva los documentos de script de C# y elimina la herramienta que ejecuta los scripts del Asistente de IA y ambas herramientas de script del servidor MCP. Las macros siguen ejecutándose, a menos que también se establezca `DisableMacros`. Consulta [Cómo cambia un agente tu modelo](xref:mcp-server#how-an-agent-changes-your-model). ## Controles del administrador @@ -175,7 +175,7 @@ Obtenga los nombres de las herramientas para `McpDisabledTools` de los registros | Una lista de proveedores aprobados | `AiAllowedProviders` | Enterprise | | Una lista de hosts de puntos de conexión aprobados | `AiAllowedEndpointHosts` | Enterprise | -`AiProvider`, `AiEndpoint`, `AiModel`, `AiOrganizationId` y `AiProjectId` sustituyen la configuración del usuario, y si `AiProvider` se establece en `None`, el Asistente de IA se desactiva. Si la configuración interrumpe `AiAllowedProviders` o `AiAllowedEndpointHosts`, el asistente de IA no envía la solicitud y un error indica el nombre del proveedor o del host del punto de conexión. `AiAllowedEndpointHosts` solo comprueba un punto de conexión que introduce el usuario, por lo que OpenAI y Anthropic, sin un punto de conexión personalizado, acceden a su API pública independientemente de lo que contenga la lista. Combínelo con «AiProvider» o «AiAllowedProviders». Ninguna política requiere HTTPS; bloquee `AiEndpoint` a una dirección `https://`. Las directivas no distribuyen claves de API. Si el punto de conexión está bloqueado para un recurso que pertenece a su organización, como un recurso de Azure OpenAI o una pasarela interna, solo funcionarán las claves que emita su organización. Con un punto de conexión público como «api.openai.com», los usuarios pueden introducir una clave personal. Estas políticas se aplican únicamente al asistente de IA. +`AiProvider`, `AiEndpoint`, `AiModel`, `AiOrganizationId` y `AiProjectId` sustituyen la configuración del usuario, y si `AiProvider` se establece en `None`, el Asistente de IA se desactiva. Si la configuración interrumpe `AiAllowedProviders` o `AiAllowedEndpointHosts`, el asistente de IA no envía la solicitud y un error indica el nombre del proveedor o del host del punto de conexión. `AiAllowedEndpointHosts` solo comprueba un punto de conexión que introduce el usuario, por lo que OpenAI y Anthropic, sin un punto de conexión personalizado, acceden a su API pública independientemente de lo que contenga la lista. Combínelo con `AiProvider` o `AiAllowedProviders`. Ninguna política requiere HTTPS; bloquee `AiEndpoint` a una dirección `https://`. Las directivas no distribuyen claves de API. Si el punto de conexión está bloqueado para un recurso que pertenece a su organización, como un recurso de Azure OpenAI o una pasarela interna, solo funcionarán las claves que emita su organización. Con un punto de conexión público como `api.openai.com`, los usuarios pueden introducir una clave personal. Estas políticas se aplican únicamente al asistente de IA. ### Instrucciones personalizadas y el puerto MCP @@ -188,19 +188,19 @@ Obtenga los nombres de las herramientas para `McpDisabledTools` de los registros ### Políticas de la Edición Enterprise en otras ediciones -Si hay algún valor de política Enterprise en un equipo cuya licencia no sea Enterprise, el asistente de IA y el servidor MCP no se inician, y un valor `BlockUnsafeScripts` impide que se ejecuten todos los scripts y macros. Un valor que Tabular Editor 3 no pueda interpretar deniega el recurso por un límite de permisos, hace que el Asistente de IA no esté disponible para «AiProvider» y aplica «BlockUnsafeScripts». Cualquier otro valor no válido se ignora y el ajuste que controla permanece sin restricciones. Implemente las políticas Enterprise solo en los equipos con una licencia coincidente. Consulte [Qué sucede sin la Edición Enterprise](xref:policies#what-happens-without-enterprise-edition). +Si hay algún valor de política Enterprise en un equipo cuya licencia no sea Enterprise, el asistente de IA y el servidor MCP no se inician, y un valor `BlockUnsafeScripts` impide que se ejecuten todos los scripts y macros. Un valor que Tabular Editor 3 no pueda interpretar deniega el recurso por un límite de permisos, hace que el Asistente de IA no esté disponible para `AiProvider` y aplica `BlockUnsafeScripts`. Cualquier otro valor no válido se ignora y el ajuste que controla permanece sin restricciones. Implemente las políticas Enterprise solo en los equipos con una licencia coincidente. Consulte [Qué sucede sin la Edición Enterprise](xref:policies#what-happens-without-enterprise-edition). Para comprobar qué políticas se aplican en un equipo, abra **Herramientas > Preferencias > Tabular Editor > Actualizaciones y comentarios**. La sección **Gestionado por su organización** enumera todos los valores de políticas encontrados, su clave de origen y cualquier valor marcado como **(no válido)**. ## Registro de auditoría -En la Edición Enterprise, Tabular Editor 3 escribe un registro local de la actividad del Asistente de IA y del servidor MCP en un archivo JSON Lines al día. Cada registro incluye una marca de tiempo UTC, la función («chat» o «mcp»), la sesión y el nombre del modelo abierto al que se aplican, así como el nombre de usuario de Windows. No se registra nada antes de activar una licencia. +En la Edición Enterprise, Tabular Editor 3 escribe un registro local de la actividad del Asistente de IA y del servidor MCP en un archivo JSON Lines al día. Cada registro incluye una marca de tiempo UTC, la función (`chat` o `mcp`), la sesión y el nombre del modelo abierto al que se aplican, así como el nombre de usuario de Windows. No se registra nada antes de activar una licencia. El registro recoge: - solicitudes de permiso y respuesta del usuario -- cada llamada a una herramienta, con el nombre de la herramienta, los permisos que necesitaba, su resultado («ok», «error», «denied» o «cancelled»), su duración y los nombres y el tamaño total de sus argumentos -- Todos los scripts de C# enviados para su ejecución, incluidos los scripts que fallaron en tiempo de ejecución, fueron rechazados o devueltos para su revisión, guardados como archivo «.csx» con su hash SHA-256. +- cada llamada a una herramienta, con el nombre de la herramienta, los permisos que necesitaba, su resultado (`ok`, `error`, `denied` o `cancelled`), su duración y los nombres y el tamaño total de sus argumentos +- Todos los scripts de C# enviados para su ejecución, incluidos los scripts que fallaron en tiempo de ejecución, fueron rechazados o devueltos para su revisión, guardados como archivo `.csx` con su hash SHA-256. - el proveedor, el modelo, el host del punto de conexión y el número de tokens para cada turno del chat - Cambios en la configuración de la IA - Inicio y parada del servidor MCP, con el nivel de permiso de cada recurso @@ -208,7 +208,7 @@ El registro recoge: No se registran el texto de la indicación, el texto de la respuesta, los valores de los argumentos, los valores de los datos del modelo, las claves de API ni los tokens de acceso. No se guardan los scripts que no se compilan ni los scripts que las funciones de IA escriben en un documento para que el usuario los ejecute. -Los archivos con más de 30 días de antigüedad se eliminan, a menos que «AiAuditLogRetentionDays» establezca otro período; si se establece «0», se conservan todos los archivos. Cada copia de Tabular Editor 3 elimina los archivos caducados de la carpeta en la que escribe antes de escribir su primer registro en una sesión. +Los archivos con más de 30 días de antigüedad se eliminan, a menos que `AiAuditLogRetentionDays` establezca otro período; si se establece `0`, se conservan todos los archivos. Cada copia de Tabular Editor 3 elimina los archivos caducados de la carpeta en la que escribe antes de escribir su primer registro en una sesión. El registro lo escribe el propio proceso de Tabular Editor 3 del usuario, por lo que este tiene acceso de escritura y eliminación al mismo, incluso en un recurso compartido redirigido. Si no se puede escribir el registro, por ejemplo, porque no se puede acceder al recurso compartido, el asistente de IA y el servidor MCP siguen funcionando y el fallo se escribe una vez en el registro de la aplicación de Tabular Editor. diff --git a/localizedContent/es/content/security/security-privacy.md b/localizedContent/es/content/security/security-privacy.md index ccfab8e76..56a74badc 100644 --- a/localizedContent/es/content/security/security-privacy.md +++ b/localizedContent/es/content/security/security-privacy.md @@ -89,9 +89,9 @@ El permiso de Escritura incluye el de Lectura. Los datos del modelo se deniegan Tabular Editor 3 puede actuar como servidor MCP (Model Context Protocol), de modo que un agente de IA que se ejecute en el mismo dispositivo pueda trabajar en el modelo que tengas abierto. Consulta @mcp-server para obtener información sobre la propia función. -**Exposición de la red.** El servidor es un «listener» HTTP vinculado explícitamente a «127.0.0.1», de forma predeterminada en el puerto 42100. No se puede acceder a él desde otro equipo. Las solicitudes del navegador que llevan un encabezado «Origin» no local se rechazan como medida de defensa contra el «rebinding» de DNS. El servidor solo se ejecuta después de que lo inicies, o desde el inicio de la aplicación si lo has solicitado. +**Exposición de la red.** El servidor es un «listener» HTTP vinculado explícitamente a `127.0.0.1`, de forma predeterminada en el puerto 42100. No se puede acceder a él desde otro equipo. Las solicitudes del navegador que llevan un encabezado `Origin` no local se rechazan como medida de defensa contra el «rebinding» de DNS. El servidor solo se ejecuta después de que lo inicies, o desde el inicio de la aplicación si lo has solicitado. -**Autenticación.** La vinculación de loopback es el límite predeterminado, por lo que el servidor acepta conexiones locales sin credenciales de forma inmediata. En un host en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un servidor Citrix, eso no es suficiente: cualquier sesión en el equipo llega a «127.0.0.1». Mientras el token esté desactivado, cualquier proceso del equipo puede conectarse sin credenciales. Active **Requerir token de acceso** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP**. Los clientes deberán presentar un token al portador, que se almacena cifrado en el archivo local Preferences.json. Los administradores pueden imponer esto con la [directiva](xref:policies) `RequireMcpAccessToken`. +**Autenticación.** La vinculación de loopback es el límite predeterminado, por lo que el servidor acepta conexiones locales sin credenciales de forma inmediata. En un host en el que varias personas han iniciado sesión a la vez, como un Escritorio remoto o un servidor Citrix, eso no es suficiente: cualquier sesión en el equipo llega a `127.0.0.1`. Mientras el token esté desactivado, cualquier proceso del equipo puede conectarse sin credenciales. Active **Requerir token de acceso** en **Herramientas > Preferencias > Funciones de IA > Servidor MCP**. Los clientes deberán presentar un token al portador, que se almacena cifrado en el archivo local Preferences.json. Los administradores pueden imponer esto con la [directiva](xref:policies) `RequireMcpAccessToken`. **Flujo de datos.** Tabular Editor no se pone en contacto con ningún proveedor de IA para esta función y no dispone de ninguna clave de API para ella. El agente es la única parte que se comunica con un proveedor, con su propia configuración y su propia suscripción. Lo que el agente puede leer del modelo está limitado por los mismos cinco permisos que rigen el Asistente de IA, de los que se hace una captura cuando se inicia el servidor, y cualquier herramienta que no esté cubierta por un permiso nunca se ofrece al agente. Los datos del modelo se deniegan de forma predeterminada, por lo que ningún resultado de consulta DAX sale del modelo a menos que lo concedas explícitamente. Los valores introducidos en la definición del modelo, como una expresión `DATATABLE` o una tabla Introducir datos, son metadatos del modelo y están cubiertos por el permiso de metadatos del modelo. @@ -119,7 +119,7 @@ Tabular Editor puede realizar solicitudes a recursos en línea (URL web) únicam - https://eastus.api.daxoptimizer.com/api - https://westeurope.api.daxoptimizer.com/api - **Asistente de IA.** Cuando el Asistente de IA está configurado y en uso, Tabular Editor 3 envía solicitudes directamente a la API del proveedor de IA configurado. Los puntos de conexión dependen del proveedor seleccionado (por ejemplo, `https://api.openai.com` para OpenAI, `https://api.anthropic.com` para Anthropic o un punto de conexión especificado por el usuario para Azure OpenAI y proveedores personalizados). En estas solicitudes solo se incluyen los datos cubiertos por las concesiones de permisos. Consulta la sección [Asistente de IA](#ai-assistant) anterior para conocer los recursos y sus valores predeterminados. -- **Actualizaciones de la base de conocimientos de IA.** La base de conocimientos en la que busca el asistente de IA es una base de datos local que se incluye con el componente de características de IA. Tabular Editor 3 busca una copia más reciente y la descarga desde «https://cdn.tabulareditor.com». La solicitud no contiene datos sobre ti ni sobre tu modelo. +- **Actualizaciones de la base de conocimientos de IA.** La base de conocimientos en la que busca el asistente de IA es una base de datos local que se incluye con el componente de características de IA. Tabular Editor 3 busca una copia más reciente y la descarga desde `https://cdn.tabulareditor.com`. La solicitud no contiene datos sobre ti ni sobre tu modelo. - **Catálogo de modelos de IA.** Cuando un usuario abre la lista de modelos del proveedor OpenAI o Anthropic, Tabular Editor 3 descarga la lista de modelos disponibles desde `https://api.tabulareditor.com/AiModels` y la almacena en caché en `%LocalAppData%\TabularEditor3\AiModels.json` durante 24 horas. La solicitud es anónima y no contiene datos sobre ti, tu clave de API ni tu modelo. La directiva `DisableUpdates` la desactiva. - **Servidor MCP.** El servidor MCP no realiza solicitudes salientes. Solo acepta conexiones en la interfaz de bucle invertido, y el agente que se conecta a él es el que se comunica con un proveedor de IA, según su propia configuración. Consulta la sección [Servidor MCP](#mcp-server) anterior. - **Importación de reglas de buenas prácticas.** Tabular Editor dispone de una función que permite al usuario especificar una URL desde la que recuperar una lista de reglas de buenas prácticas en un formato basado en JSON. Este tipo de solicitud solo descarga los datos JSON de la URL; no se transmiten datos a la URL. @@ -143,10 +143,10 @@ Para permitir el tráfico a las solicitudes web mencionadas anteriormente, tendr ## Seguridad de la aplicación -Tabular Editor no requiere ningún privilegio elevado en el equipo Windows en el que está instalado, ni accede a ningún recurso restringido del equipo. Una excepción a esta regla se da si se utiliza el archivo de instalación de Tabular Editor (.msi), en cuyo caso el ejecutable y los archivos de soporte necesarios para la herramienta se copian de forma predeterminada en la carpeta «Archivos de programa», que normalmente requiere permisos elevados. Tanto los archivos binarios de Tabular Editor como el archivo del instalador se han firmado con un certificado de firma de código emitido a Tabular Editor ApS, lo que constituye su garantía de que ningún tercero ha manipulado el código. +Tabular Editor no requiere ningún privilegio elevado en el equipo Windows en el que está instalado, ni accede a ningún recurso restringido del equipo. Una excepción a esta regla se da si se utiliza el archivo de instalación de Tabular Editor (.msi), en cuyo caso el ejecutable y los archivos de soporte necesarios para la herramienta se copian de forma predeterminada en la carpeta `Program Files`, que normalmente requiere permisos elevados. Tanto los archivos binarios de Tabular Editor como el archivo del instalador se han firmado con un certificado de firma de código emitido a Tabular Editor ApS, lo que constituye su garantía de que ningún tercero ha manipulado el código. Cuando la aplicación se está ejecutando, todos los accesos a recursos externos se realizan a través de la biblioteca cliente AMO/TOM o de las solicitudes web mencionadas anteriormente. La función de C# Script permite a Tabular Editor ejecutar código C# arbitrario dentro del tiempo de ejecución de .NET. Dicho código solo se compila y ejecuta a petición explícita del usuario. Los C# Scripts también se pueden guardar como «macros», lo que facilita al usuario la gestión y ejecución de varios scripts diferentes. El código se almacena en la carpeta `%localappdata%` del propio usuario, lo que garantiza que solo él o un administrador del equipo local puedan acceder a los scripts. El usuario es siempre responsable de garantizar que el código ejecutado no provoque ningún efecto secundario no deseado. Bajo ninguna circunstancia se podrá considerar a Tabular Editor ApS responsable de ningún daño, pérdida o filtración causados por el uso de las funciones de C# Script o de las acciones/macros personalizadas. -Las organizaciones que no quieran dejar esto en manos de cada usuario pueden gestionarlo de forma centralizada. Las [políticas](xref:policies) «DisableCSharpScripts» y «DisableMacros» desactivan por completo las funciones, en todas las ediciones. Con Tabular Editor 3 Edición Enterprise, `BlockUnsafeScripts` mantiene disponible el scripting, pero solo permite scripts y macros que se queden dentro del modelo semántico: cualquier cosa que lea o escriba un archivo, acceda a la red, inicie otro programa o cargue código externo se rechaza antes de ejecutarse, independientemente de de dónde proceda el script: un documento de script, Best Practice Analyzer, una macro, el Asistente de IA, el servidor MCP o la línea de comandos. Consulte [Políticas del administrador](xref:csharp-scripts#administrator-policies). +Las organizaciones que no quieran dejar esto en manos de cada usuario pueden gestionarlo de forma centralizada. Las [políticas](xref:policies) `DisableCSharpScripts` y `DisableMacros` desactivan por completo las funciones, en todas las ediciones. Con Tabular Editor 3 Edición Enterprise, `BlockUnsafeScripts` mantiene disponible el scripting, pero solo permite scripts y macros que se queden dentro del modelo semántico: cualquier cosa que lea o escriba un archivo, acceda a la red, inicie otro programa o cargue código externo se rechaza antes de ejecutarse, independientemente de de dónde proceda el script: un documento de script, Best Practice Analyzer, una macro, el Asistente de IA, el servidor MCP o la línea de comandos. Consulte [Políticas del administrador](xref:csharp-scripts#administrator-policies). diff --git a/localizedContent/es/content/tutorials/direct-lake-guidance.md b/localizedContent/es/content/tutorials/direct-lake-guidance.md index 3fc66eeff..7043f90b6 100644 --- a/localizedContent/es/content/tutorials/direct-lake-guidance.md +++ b/localizedContent/es/content/tutorials/direct-lake-guidance.md @@ -45,7 +45,7 @@ La siguiente tabla resume los modos de almacenamiento disponibles en los modelos Sin embargo, al igual que con Direct Lake en SQL, todavía hay algunas [limitaciones que *sí* se aplican](https://learn.microsoft.com/fabric/fundamentals/direct-lake-overview#considerations-and-limitations). Entre las limitaciones principales se incluyen las siguientes: -- Las columnas calculadas en las tablas de Direct Lake en OneLake son compatibles en la versión preliminar, y solo con el contexto de expresión «UserContext». Direct Lake en SQL no admite columnas calculadas. Consulte [Columnas calculadas en Direct Lake en OneLake](#calculated-columns-on-direct-lake-on-onelake). +- Las columnas calculadas en las tablas de Direct Lake en OneLake son compatibles en la versión preliminar, y solo con el contexto de expresión `UserContext`. Direct Lake en SQL no admite columnas calculadas. Consulte [Columnas calculadas en Direct Lake en OneLake](#calculated-columns-on-direct-lake-on-onelake). - Las tablas calculadas no pueden hacer referencia a columnas o tablas en el modo de almacenamiento Direct Lake. Los grupos de cálculos, los parámetros de simulación y los parámetros de campo son compatibles porque crean tablas calculadas implícitas que no hacen referencia a columnas Direct Lake. - Las vistas SQL no materializadas no son compatibles como orígenes de datos para las tablas de Direct Lake en OneLake. Utilice vistas materializadas o asegúrese de que la tabla Delta de origen contenga las columnas que necesita. - Los accesos directos en un lakehouse no son compatibles como fuentes de datos durante la vista previa pública de Direct Lake en OneLake. @@ -60,7 +60,7 @@ La propiedad **Contexto de expresión** aparece en la @properties-view solo cuan 1. Seleccione el modelo en la @tom-explorer-view y compruebe el **Nivel de compatibilidad** en **Base de datos** en la @properties-view. Si es inferior a 1705, actualice el modelo como se describe en @update-compatibility-level. 2. Seleccione la columna calculada en la @tom-explorer-view. -3. En **Opciones** en la @properties-view, establezca **Contexto de expresión** en «UserContext». +3. En **Opciones** en la @properties-view, establezca **Contexto de expresión** en `UserContext`. 4. Guarde el modelo. Las columnas calculadas de las tablas de importación del mismo modelo pueden usar cualquiera de los dos contextos de expresión. Para los objetos que no pueden hacer referencia a una columna de contexto de usuario, consulte @user-context-calculated-columns. Microsoft enumera las combinaciones compatibles de modo de almacenamiento y contexto de expresión en [Uso de columnas calculadas en Power BI Desktop](https://learn.microsoft.com/power-bi/transform-model/desktop-calculated-columns#materialization-and-performance). @@ -85,7 +85,7 @@ En el caso de un modelo **Direct Lake en SQL**, la intercalación no distingue e > > 1. Cree un nuevo modelo en Tabular Editor 3 (Archivo > Nuevo > Modelo...) > 2. Desmarque «Usar base de datos del área de trabajo». -> 3. Establezca la propiedad ** intercalación ** del modelo como «Latin1_General_100_BIN2_UTF8» +> 3. Establezca la propiedad ** intercalación ** del modelo como `Latin1_General_100_BIN2_UTF8` > 4. Guarde el modelo (Ctrl+S). > 5. Ahora, abra el modelo desde el archivo que acaba de guardar. Cuando se le pida que se conecte a una base de datos de área de trabajo, elija «Sí». > @@ -126,7 +126,7 @@ La tabla importada ya tiene sus columnas, en el mismo orden que en el origen, y ## Inspección de una partición Direct Lake -Una partición de Direct Lake no tiene expresión de consulta. Cuando selecciona una en la @tom-explorer-view, el **Editor de expresiones** muestra su «Expresión de definición de cobertura de datos», o nada si la partición no tiene una definición de cobertura de datos. Las particiones generadas por una directiva de actualización incremental se comportan de la misma manera. +Una partición de Direct Lake no tiene expresión de consulta. Cuando selecciona una en la @tom-explorer-view, el **Editor de expresiones** muestra su `Data Coverage Definition Expression`, o nada si la partición no tiene una definición de cobertura de datos. Las particiones generadas por una directiva de actualización incremental se comportan de la misma manera. ## Expresiones de Power Query (M) @@ -136,7 +136,7 @@ Esta sección contiene una descripción más técnica sobre cómo deben configur Para configurar manualmente una tabla para el modo **Direct Lake en OneLake**, debe hacer lo siguiente: -1. **Crear una expresión compartida**: Las tablas de Direct Lake utilizan particiones de «Entidad», que deben hacer referencia a una expresión compartida en el modelo. Empieza por crear esta expresión compartida, si aún no la tienes. Llámala «DatabaseQuery»: +1. **Crear una expresión compartida**: Las tablas de Direct Lake utilizan particiones de «Entidad», que deben hacer referencia a una expresión compartida en el modelo. Empieza por crear esta expresión compartida, si aún no la tienes. Llámala `DatabaseQuery`: ![Crear expresión compartida](../assets/images/create-shared-expression.png) @@ -161,7 +161,7 @@ in | ----------|-------| | Nombre | (Recomendado) Establecer el mismo nombre que la tabla | | Nombre de la entidad | (Obligatorio) Establecer el nombre de la tabla en el lakehouse/almacén | -| Origen de la expresión | (Obligatorio) Establezca la expresión compartida que creó en el paso 1, normalmente «DatabaseQuery» | +| Origen de la expresión | (Obligatorio) Establezca la expresión compartida que creó en el paso 1, normalmente `DatabaseQuery` | | Modo | (Obligatorio) `DirectLake` | | Nombre del esquema | (Opcional) Establézcalo como el nombre del esquema en el lakehouse/almacén, si corresponde. Si no se establece, se usará el esquema predeterminado. | @@ -173,7 +173,7 @@ in ![Actualizar entidad de esquema de tabla](../assets/images/update-table-schema-entity.png) - Como alternativa, añada manualmente columnas de datos a la tabla (Alt+4) y especifique el «Nombre», el «Tipo de datos», la «Columna de origen» y cualquier otra propiedad relevante para cada columna. + Como alternativa, añada manualmente columnas de datos a la tabla (Alt+4) y especifique `Name`, `Data Type`, `Source Column` y cualquier otra propiedad relevante para cada columna. > [!NOTE] > Cuando se agrega una tabla Direct Lake al modelo, es necesario «actualizarla» manualmente después de la primera implementación de metadatos. De lo contrario, la tabla no contendrá ningún dato cuando se consulte. Esta actualización solo debe realizarse una vez. Tabular Editor 3 actualizará automáticamente la tabla cuando se guarden los metadatos del modelo, si está activada la opción **Actualización automática al guardar nuevas tablas** en **Herramientas > Preferencias > Implementación del modelo > Actualización de datos**. @@ -213,7 +213,7 @@ Sustituye `` por la cadena de conexión del [punto de conexión de Sustituya `` por el nombre del esquema en el almacén/lakehouse y `
    ` por el nombre de la tabla o vista que quiera importar. Tenga en cuenta que las tablas en modo de importación pueden usar vistas no materializadas como origen de datos, ya que los datos se consultan a través del punto de conexión SQL durante las operaciones de actualización. -3. **Actualizar los metadatos de las columnas** (solo en la configuración manual): dado que una partición que ha configurado manualmente no tiene columnas, utilice la función **Actualizar esquema de tabla** de Tabular Editor para recuperar los nombres de las columnas y los tipos de datos del lakehouse/almacén de datos. Como alternativa, cree columnas de datos manualmente (**Alt+4**) y especifique el «Nombre», el «Tipo de datos», la «Columna de origen» y cualquier otra propiedad relevante para cada columna. +3. **Actualizar los metadatos de las columnas** (solo en la configuración manual): dado que una partición que ha configurado manualmente no tiene columnas, utilice la función **Actualizar esquema de tabla** de Tabular Editor para recuperar los nombres de las columnas y los tipos de datos del lakehouse/almacén de datos. Como alternativa, cree columnas de datos manualmente (**Alt+4**) y especifique `Name`, `Data Type`, `Source Column` y cualquier otra propiedad relevante para cada columna. ## Conversión entre modos de almacenamiento diff --git a/localizedContent/es/content/tutorials/new-as-model.md b/localizedContent/es/content/tutorials/new-as-model.md index 776a7f15b..8e1908bcc 100644 --- a/localizedContent/es/content/tutorials/new-as-model.md +++ b/localizedContent/es/content/tutorials/new-as-model.md @@ -26,7 +26,7 @@ Esta página te guía a través del proceso de creación de un nuevo modelo tabu ## Creación de un nuevo modelo -- En el menú Archivo, seleccione Nuevo > Modelo... o pulse «CTRL+N». +- En el menú Archivo, seleccione Nuevo > Modelo... o pulse `CTRL+N`. ![Nuevo modelo](~/content/assets/images/new-as-model-new-model.png) @@ -67,11 +67,11 @@ En nuestro ejemplo, establecemos las siguientes propiedades: | Protocolo | `tds` | | Base de datos | `AdventureWorksDW2017` | | Servidor | `localhost` | -| AuthenticationKind | «ServiceAccount» | +| AuthenticationKind | `ServiceAccount` | Pulse Guardar (Ctrl+S). Se le pedirá que proporcione una ruta y un nombre de archivo para el archivo Model.bim, que contendrá los metadatos del modelo que ha creado hasta ahora. También puede guardar el modelo como una estructura de carpetas (Archivo > Guardar en carpeta...), lo cual se recomienda si tiene previsto integrar los metadatos de su modelo en un entorno con control de versiones. Si está utilizando una base de datos del área de trabajo, Tabular Editor 3 también sincronizará los metadatos con la instancia conectada de Analysis Services. -A continuación, añade una nueva tabla al modelo haciendo clic con el botón derecho en la carpeta «Tablas» y eligiendo «Crear > Tabla» (también puedes pulsar Alt+5). Ponga un nombre a la tabla; en nuestro ejemplo, «Internet Sales». Expanda la tabla, localice la partición en la tabla e introduzca la siguiente consulta M como expresión de partición para rellenar la tabla con datos: +A continuación, añade una nueva tabla al modelo haciendo clic con el botón derecho en la carpeta «Tablas» y eligiendo «Crear > Tabla» (también puedes pulsar Alt+5). Ponga un nombre a la tabla; en nuestro ejemplo, `Internet Sales`. Expanda la tabla, localice la partición en la tabla e introduzca la siguiente consulta M como expresión de partición para rellenar la tabla con datos: ```M let diff --git a/localizedContent/zh/.translation-status.json b/localizedContent/zh/.translation-status.json index 8a7dd5c70..961c5bb4a 100644 --- a/localizedContent/zh/.translation-status.json +++ b/localizedContent/zh/.translation-status.json @@ -1871,18 +1871,6 @@ "pinned": 0, "total": 465, "completionPercent": 100.0, - "failures": 2 - }, - "failures": { - "how-tos/xmla-as-connectivity.md": { - "error": "link targets 29 -> 28 (missing ['https://learn.microsoft.com/power-bi/enterprise/service-premium-connect-tools#duplicate-workspace-names'], added [])", - "at": "2026-10-23T11:05:21Z", - "sourceHash": "sha256:1327f49f78176015f7f08cd552b754ea50c38b1c375c04b77da2637df323b550" - }, - "tutorials/new-pbi-model.md": { - "error": "headings 2 -> 1", - "at": "2026-10-23T11:05:48Z", - "sourceHash": "sha256:8503350984bdac5e40c759969b1fb791033bfe39c86aff6addee287ff8030458" - } + "failures": 0 } } diff --git a/localizedContent/zh/content/features/ai-assistant.md b/localizedContent/zh/content/features/ai-assistant.md index a4356f425..daf777426 100644 --- a/localizedContent/zh/content/features/ai-assistant.md +++ b/localizedContent/zh/content/features/ai-assistant.md @@ -166,7 +166,7 @@ az cognitiveservices account deployment list --name "" --resource - `https://your-resource.services.ai.azure.com/openai/v1` - `https://your-resource.openai.azure.com/openai/v1` 4. 输入您的 Foundry **API 密钥** -5. 将**模型名称**设置为您的部署名称,例如“gpt-5.4-mini” +5. 将**模型名称**设置为您的部署名称,例如`gpt-5.4-mini` > [!NOTE] > Microsoft Foundry 门户不显示基础 URL。它显示的是包含完整 API 路径的**目标 URI**,例如 `https://your-resource.services.ai.azure.com/api/projects/YourProject/openai/v1/responses`。对于基础 URL,仅使用`https://your-resource.services.ai.azure.com/openai/v1`。 @@ -182,7 +182,7 @@ az cognitiveservices account deployment list --name "" --resource 5. 将**模型名称**设置为模型标识符,例如 `claude-sonnet-4-6` > [!NOTE] -> 门户显示**目标 URI**,例如 `https://your-resource.services.ai.azure.com/anthropic/v1/messages`。对于基准 URL,请使用截至并包含“/anthropic”的部分。 +> 门户显示**目标 URI**,例如 `https://your-resource.services.ai.azure.com/anthropic/v1/messages`。对于基准 URL,请使用截至并包含`/anthropic`的部分。 ## 功能 @@ -252,7 +252,7 @@ AI 助手生成的代码会在编辑器窗口中以*工件*的形式打开: ## 自定义指令 -*自定义指令*是一组指令,用于指导 AI 助手执行特定任务。助手会收到所有可用指令的列表及其“描述”,并仅加载与您的请求相关的指令的完整文本,因此请确保描述准确且具体。加载的指令在对话的其余部分中一直有效。 +*自定义指令*是一组指令,用于指导 AI 助手执行特定任务。助手会收到所有可用指令的列表及其`description`,并仅加载与您的请求相关的指令的完整文本,因此请确保描述准确且具体。加载的指令在对话的其余部分中一直有效。 ### 内置自定义指令 @@ -273,7 +273,7 @@ AI 助手包含以下自定义指令: ### 调用自定义指令 -键入“/”以浏览可用的自定义指令。让您的消息以指令的`/id`开头,即可加载该指令,而无需考虑消息内容;例如,`/dax-querying`将加载DAX查询指令。没有消息的 `/id` 会加载指令,而不会发出请求。显式加载的指令在对话的其余部分中保持有效,就像助手自行加载的指令一样。 +键入`/`以浏览可用的自定义指令。让您的消息以指令的`/id`开头,即可加载该指令,而无需考虑消息内容;例如,`/dax-querying`将加载DAX查询指令。没有消息的 `/id` 会加载指令,而不会发出请求。显式加载的指令在对话的其余部分中保持有效,就像助手自行加载的指令一样。 ### 添加您自己的自定义指令 @@ -308,14 +308,14 @@ injected into the AI's system prompt when the instruction is activated. Tabular Editor 按以下方式读取文件: -- 前置内容必须以“---”开头,位于文件的第一行,并以“---”行结尾。如果不是这样,或者如果无法解析 YAML,则整个文件将被视为指令内容,并且上述所有默认值均适用。 -- 不在上述表格中的键将被忽略。仍有“triggers:”部分的早期版本文件将按原样加载 +- 前置内容必须以`---`开头,位于文件的第一行,并以`---`行结尾。如果不是这样,或者如果无法解析 YAML,则整个文件将被视为指令内容,并且上述所有默认值均适用。 +- 不在上述表格中的键将被忽略。仍有`triggers:`部分的早期版本文件将按原样加载 - 正文中的任何 `{{version}}` 都将替换为 Tabular Editor AI 组件的版本 - 仅读取直接位于该文件夹中的 `.md` 文件;不搜索子文件夹 ### 来自您组织的自定义指令 -管理员可以使用 `AiCustomInstructionsPath` [策略](xref:policies)为所有人发布一个自定义指令文件夹,该文件夹可以是只读网络共享。除了内置的指令外,这些指令还会为每个用户加载,并且工作方式与其他指令一样:在“/”自动补全中提供,按其描述选择,通过“/id”调用。 +管理员可以使用 `AiCustomInstructionsPath` [策略](xref:policies)为所有人发布一个自定义指令文件夹,该文件夹可以是只读网络共享。除了内置的指令外,这些指令还会为每个用户加载,并且工作方式与其他指令一样:在`/`自动补全中提供,按其描述选择,通过`/id`调用。 如果相同的 `id` 存在于多个位置,则优先级为: @@ -447,7 +447,7 @@ Tabular Editor 按以下方式读取文件: ### 令牌计数器 -令牌计数器位于消息框上方的状态条中,在[活动模型指示器](#choosing-a-model)旁边。该进度条以千个为单位显示已使用/总计的令牌数,并随着上下文的填充而显示为绿色、琥珀色或红色。数字前面的“±”表示尚无确切计数。 +令牌计数器位于消息框上方的状态条中,在[活动模型指示器](#choosing-a-model)旁边。该进度条以千个为单位显示已使用/总计的令牌数,并随着上下文的填充而显示为绿色、琥珀色或红色。数字前面的`±`表示尚无确切计数。 将鼠标悬停在计数器上,即可查看细目: @@ -457,7 +457,7 @@ Tabular Editor 按以下方式读取文件: | **此对话(已计费)** | 在对话中的每个请求中累积的相同四个数字,包括工具往返 | | **上下文** | 当前在上下文窗口中的令牌数,与窗口的实际大小对比 | -例如,一行显示为“37,588 个输入 + 131,744 个缓存 · 写入 37,558 个 · 输出 2,866 个”。对于不支持提示缓存的提供商,将省略缓存部分;如果某个部分没有可报告的内容,则会省略该部分。 +例如,一行显示为`37,588 input + 131,744 cached · write 37,558 · output 2,866`。对于不支持提示缓存的提供商,将省略缓存部分;如果某个部分没有可报告的内容,则会省略该部分。 > [!TIP] > 将**上一轮**与**此对话(已计费)**进行比较,查看单个问题的成本。在长时间的对话中,**“本次对话(已计费)”**数字较大,而旁边的**“上一轮”**数字较小,这是正常现象。 diff --git a/localizedContent/zh/content/features/deployment.md b/localizedContent/zh/content/features/deployment.md index c6f2f45ff..6b3c5378f 100644 --- a/localizedContent/zh/content/features/deployment.md +++ b/localizedContent/zh/content/features/deployment.md @@ -54,7 +54,7 @@ Tabular Editor 不会更新保留的语言元数据,因此保留的 AI 数据 ## 数据源凭据 -默认情况下,Tabular Editor 在将模型保存到磁盘时不会保存密码、账户密钥和其他密钥。因此,从文件加载的模型可能具有缺少密钥的数据源。部署向导会在部署之前检查这一点。当密钥为空或为“********”时,即视为缺失。向导将检查: +默认情况下,Tabular Editor 在将模型保存到磁盘时不会保存密码、账户密钥和其他密钥。因此,从文件加载的模型可能具有缺少密钥的数据源。部署向导会在部署之前检查这一点。当密钥为空或为`********`时,即视为缺失。向导将检查: - 连接字符串包含密码关键字(例如 `Password` 或 `Pwd`)的提供程序数据源, - 模拟特定 Windows 帐户的提供程序数据源, diff --git a/localizedContent/zh/content/features/import-tables.partial.md b/localizedContent/zh/content/features/import-tables.partial.md index c6911a0e1..b0c400944 100644 --- a/localizedContent/zh/content/features/import-tables.partial.md +++ b/localizedContent/zh/content/features/import-tables.partial.md @@ -116,11 +116,11 @@ Tabular Editor 连接到相关数据源,根据需要提示输入凭据,并 在上面的截图中,Tabular Editor 检测到两个尚未导入的新源列(`Color` 和 `Material`),并标记了两个要删除的现有列(`Colour` 和 `Substance Type`),因为它们的名称不再与源列匹配。重命名检测仅适用于简单更改。在这里,在源中,`Colour` 被重命名为 `Color`,`Substance Type` 被重命名为 `Material`,但名称差异较大,以至于 Tabular Editor 将每次重命名都报告为一次删除和一次添加。 -按住 **Ctrl** 键,在“架构更改”对话框中选择“Color”(导入)和“Colour”(移除)行,然后右键单击,将移除和添加合并为单个 SourceColumn 更新。引用 `[Colour]` 的现有 DAX 公式仍可正常工作: +按住 **Ctrl** 键,在“架构更改”对话框中选择`Color`(导入)和`Colour`(移除)行,然后右键单击,将移除和添加合并为单个 SourceColumn 更新。引用 `[Colour]` 的现有 DAX 公式仍可正常工作: ![合并 Sourcecolumn 更新](~/content/assets/images/combine-sourcecolumn-update.png) -如果您只想更新 `SourceColumn` 属性并保留导入列的名称,请在下拉列表中清除“名称”更新操作: +如果您只想更新 `SourceColumn` 属性并保留导入列的名称,请在下拉列表中清除 `Name` 更新操作: ![取消选择名称](~/content/assets/images/deselect-name.png) @@ -145,7 +145,7 @@ Tabular Editor 连接到相关数据源,根据需要提示输入凭据,并 6. 如果架构发生更改,则会显示上图所示的**应用架构更改**对话框。 > [!NOTE] -> 如果您的 M 表达式组合来自多个源的数据(例如通过 M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin) 函数),您可能需要将 Power BI 服务中语义模型的[**隐私级别**](https://powerbi.microsoft.com/blog/privacy-levels-for-cloud-data-sources/)从“私有”更改为“组织”。否则,您可能会看到一个错误,指出“`` 引用了其他查询或步骤,因此可能无法直接访问数据源。请重建此数据组合。`。即使未启用**使用 Analysis Services 进行更改检测**,也可能出现此错误,因为当 M 表达式对于 Tabular Editor 3 的内置架构检测来说过于复杂时,Tabular Editor 3 将自动回退到此检测机制。 +> 如果您的 M 表达式组合来自多个源的数据(例如通过 M [`Table.NestedJoin`](https://learn.microsoft.com/powerquery-m/table-nestedjoin) 函数),您可能需要将 Power BI 服务中语义模型的[**隐私级别**](https://powerbi.microsoft.com/blog/privacy-levels-for-cloud-data-sources/)从“私有”更改为“组织”。否则,您可能会看到一个错误,指出` references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.`。即使未启用**使用 Analysis Services 进行更改检测**,也可能出现此错误,因为当 M 表达式对于 Tabular Editor 3 的内置架构检测来说过于复杂时,Tabular Editor 3 将自动回退到此检测机制。 ### 通过 Analysis Services 导入新表 diff --git a/localizedContent/zh/content/features/mcp-server.md b/localizedContent/zh/content/features/mcp-server.md index 19c8e6460..58fa3571c 100644 --- a/localizedContent/zh/content/features/mcp-server.md +++ b/localizedContent/zh/content/features/mcp-server.md @@ -23,7 +23,7 @@ Tabular Editor 3 可以充当 MCP(模型上下文协议)服务器。支持 M MCP 服务器不使用在 Tabular Editor 中配置的 AI 提供商或 API 密钥,您的代理使用其自己的提供商和订阅。 -代理在 Tabular Editor 已打开的模型上工作,包括未保存的更改。这可以是 Power BI Desktop 模型、PBIP 项目、TMDL(表格模型定义语言)文件夹、“.bim”文件、工作区数据库或与 Analysis Services、Azure Analysis Services 或 Fabric 的实时连接。无论模型是已连接还是离线,代理都使用相同的工具,但需要实时连接的工具(例如 DAX 查询)除外。 +代理在 Tabular Editor 已打开的模型上工作,包括未保存的更改。这可以是 Power BI Desktop 模型、PBIP 项目、TMDL(表格模型定义语言)文件夹、`.bim`文件、工作区数据库或与 Analysis Services、Azure Analysis Services 或 Fabric 的实时连接。无论模型是已连接还是离线,代理都使用相同的工具,但需要实时连接的工具(例如 DAX 查询)除外。 代理更改会经过 [Tabular Object Model (TOM) 包装器](xref:csharp-scripts)和 C# 脚本引擎,并与您自己的编辑使用相同的验证、公式修复和撤消栈。它们显示为未保存的更改,在[TOM Explorer 和“属性”视图](xref:unsaved-changes)中标记,并且在您保存之前不会将任何内容写入源。 @@ -39,7 +39,7 @@ MCP 服务器不使用在 Tabular Editor 中配置的 AI 提供商或 API 密钥 2. 查看权限。请参阅[设置代理权限](#set-agent-permissions)。 3. 点击**启动服务器**。 -除非您更改了端口,否则该对话框将显示服务器侦听的地址:`http://127.0.0.1`。状态栏指示器从**MCP 已停止**变为**MCP 已启动**,其工具提示中显示地址。 +除非您更改了端口,否则该对话框将显示服务器侦听的地址:`http://127.0.0.1:42100/`。状态栏指示器从**MCP 已停止**变为**MCP 已启动**,其工具提示中显示地址。 ![MCP 服务器对话框,显示服务器 URL、已屏蔽的访问令牌以及设置为非默认级别的五个代理权限行](~/content/assets/images/features/mcp-server/mcp-server-dialog.png) @@ -66,7 +66,7 @@ MCP 服务器不使用在 Tabular Editor 中配置的 AI 提供商或 API 密钥 ## 注册您的代理 -在服务器对话框中,从**导出配置**中选择您的代理,然后将复制的配置粘贴到您的代理中。您只需对每个代理注册一次,配置会将服务器注册为“tabular-editor”的名称。 +在服务器对话框中,从**导出配置**中选择您的代理,然后将复制的配置粘贴到您的代理中。您只需对每个代理注册一次,配置会将服务器注册为`tabular-editor`的名称。 ![“导出配置”下拉菜单,展开后列出了Claude Code、VS Code、Copilot CLI、Codex和Cursor](~/content/assets/images/features/mcp-server/export-configuration.png) @@ -123,7 +123,7 @@ url = "http://127.0.0.1:42100/" 当**需要访问令牌**开启时,导出的配置将以每个客户端的格式包含令牌。从对话框中复制配置;不要手动书写。 -任何其他MCP客户端都通过可流式传输的HTTP连接到`http://127.0.0.1`。如果**需要访问令牌**已启用,请在`Authorization: Bearer `标头中发送令牌。 +任何其他MCP客户端都通过可流式传输的HTTP连接到`http://127.0.0.1:42100/`。如果**需要访问令牌**已启用,请在`Authorization: Bearer `标头中发送令牌。 ### 检查是否成功 @@ -133,7 +133,7 @@ url = "http://127.0.0.1:42100/" 代理将回答模型名称、模型的加载方式、是否存在未保存的更改及其兼容性级别,或者报告未打开任何模型。Tabular Editor 中不会显示提示。 -智能体收到的模型名称遵循 **工具 > 首选项 > Tabular Editor > 用户界面** 下的 **模型源详细信息** 设置。如果选择**仅名称**,则智能体不会收到文件路径或服务器名称;如果选择**隐藏**,则智能体将收到“模型已加载”而非模型名称。 +智能体收到的模型名称遵循 **工具 > 首选项 > Tabular Editor > 用户界面** 下的 **模型源详细信息** 设置。如果选择**仅名称**,则智能体不会收到文件路径或服务器名称;如果选择**隐藏**,则智能体将收到`Model loaded`而非模型名称。 ## 设置代理权限 @@ -207,7 +207,7 @@ url = "http://127.0.0.1:42100/" - 其更改是一个撤消条目,即**C# 脚本 (MCP)**,而 **Ctrl+Z** 则撤消整个脚本。如果文档处于焦点状态,则按 **Ctrl+Z** 可撤消在文档中的键入操作。请先单击 TOM Explorer,或在“编辑”菜单中选择“撤消 C# 脚本 (MCP)”。请参阅[在文本编辑器中撤消](xref:undo-redo#undo-in-text-editors)。 - 如果脚本在执行过程中抛出异常,其所有更改都将回滚。 - 代理会收到一个列表,其中包含脚本添加、更改或删除的每个对象,以及脚本打印的所有内容。如果脚本引入或解决了 DAX 错误,结果也会列出这些错误,并按根本原因分组。 -- 来自“输出”、“信息”、“警告”或“错误”的消息作为结果的一部分返回给代理,且不会打开对话框。 +- 来自`Output`、`Info`、`Warning`或`Error`的消息作为结果的一部分返回给代理,且不会打开对话框。 - 在长时间调用运行时,会显示**请稍候**指示器,并且 Tabular Editor 中的点击操作将被忽略。 - 在您保存之前,已更改的对象和属性会在[TOM Explorer 和“属性”视图](xref:unsaved-changes)中标记。**显示更改**会将两个视图都筛选为更改,右键单击**还原**可撤消单个属性、单个对象或整个分支。 @@ -273,7 +273,7 @@ url = "http://127.0.0.1:42100/" ## 在共享计算机上运行 -服务器绑定到 `127.0.0.1`,其他机器无法访问。它还会拒绝带有非本地“Origin”标头的浏览器请求。 +服务器绑定到 `127.0.0.1`,其他机器无法访问。它还会拒绝带有非本地`Origin`标头的浏览器请求。 当**需要访问令牌**关闭时,计算机上的任何进程都可以在没有凭据的情况下进行连接。在有数人同时登录的主机上(例如远程桌面或 Citrix 服务器),这包括其他人员会话中的进程。 diff --git a/localizedContent/zh/content/features/pivot-grid.md b/localizedContent/zh/content/features/pivot-grid.md index 46c7283ff..5dd95c1f0 100644 --- a/localizedContent/zh/content/features/pivot-grid.md +++ b/localizedContent/zh/content/features/pivot-grid.md @@ -179,7 +179,7 @@ Pivot Grid还有一些值得了解的实用功能: 以下是 Tabular Editor 3.16.0 中 Pivot Grid 的已知限制和问题列表,我们正在努力在未来版本中解决这些问题: -- 将Pivot Grid布局另存为“.te3pivot”文件时,格式规则(例如图标集、数据条等)未正确保留。 +- 将Pivot Grid布局另存为`.te3pivot`文件时,格式规则(例如图标集、数据条等)未正确保留。 - 如果您在与保存布局的模型不同的模型上打开 `.te3pivot` 文件,或者在已保存的 Pivot Grid 打开时切换模型,则当前模型中不存在的字段将从布局中删除。如果随后进行保存(**Ctrl+S**),则 `.te3pivot` 文件将被覆盖,且不包含这些字段。 - 使用“按列分组”属性的列(包括字段参数列)不能单独添加到行区域或列区域。这样做会导致出现错误“*列 X 是复合键的一部分,但并非复合键的所有列都包含在表达式或其依赖表达式中*”。这是 MDX 客户端的一般性限制,在 Excel 数据透视表中也存在使用此类列时会出现这种情况。要解决此问题,请在添加从属列*之前*将相关的“分组依据列”添加到Pivot Grid。例如,如果 `[ProductKey]` 被配置为 `[ProductName]` 的“分组依据列”,请先将 `[ProductKey]` 添加到行区域或列区域,然后再添加 `[ProductName]`。 - 对行区域或列区域中的列应用显式升序或降序排序时,无论列的数据类型如何,都会按字母顺序将值作为字符串排序。格式化为长日期的日期(例如“2024 年 5 月 4 日”)和整数按字典顺序排序,而不是按时间顺序或数字顺序排序。这是 MDX 客户端排序方式的限制,连接到模型的 Excel 数据透视表也会出现相同的行为。要获得按时间顺序或数值顺序的排序,请依靠列的自然排序(不要应用显式排序),或使用模型列上的**按列排序**属性,以指向具有可排序底层值的列。 \ No newline at end of file diff --git a/localizedContent/zh/content/features/user-context-calculated-columns.md b/localizedContent/zh/content/features/user-context-calculated-columns.md index 223e2e43a..44049859e 100644 --- a/localizedContent/zh/content/features/user-context-calculated-columns.md +++ b/localizedContent/zh/content/features/user-context-calculated-columns.md @@ -35,7 +35,7 @@ applies_to: ## Direct Lake on OneLake 表 -`UserContext` 是 Power BI 对 Direct Lake on OneLake 表上的计算列支持的唯一表达式上下文。当您将模型保存到 Power BI 服务时,如果 Direct Lake 表上的计算列设置为“Standard”,则保存将失败,并显示错误“默认表达式上下文不能用于 Direct Lake 表中的计算列”。Direct Lake on SQL 表不支持计算列。有关在 Direct Lake 模型上设置表达式上下文的步骤,请参阅[Direct Lake on OneLake 上的计算列](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake)。 +`UserContext` 是 Power BI 对 Direct Lake on OneLake 表上的计算列支持的唯一表达式上下文。当您将模型保存到 Power BI 服务时,如果 Direct Lake 表上的计算列设置为`Standard`,则保存将失败,并显示错误“默认表达式上下文不能用于 Direct Lake 表中的计算列”。Direct Lake on SQL 表不支持计算列。有关在 Direct Lake 模型上设置表达式上下文的步骤,请参阅[Direct Lake on OneLake 上的计算列](xref:direct-lake-guidance#calculated-columns-on-direct-lake-on-onelake)。 ## 用户上下文列不能用于哪些情况 diff --git a/localizedContent/zh/content/getting-started/creating-and-testing-dax.md b/localizedContent/zh/content/getting-started/creating-and-testing-dax.md index 638030e65..a4d45c63a 100644 --- a/localizedContent/zh/content/getting-started/creating-and-testing-dax.md +++ b/localizedContent/zh/content/getting-started/creating-and-testing-dax.md @@ -54,7 +54,7 @@ Tabular Editor 3 使用的新 DAX 代码编辑器解决了所有这些问题。 ## 其他度量值属性 -除了`Name`、`Expression`和`Hidden`属性外,您还可以使用**Properties**视图查看和编辑**TOM资源管理器**中当前选定对象的所有属性的值。对于度量,您可以在此处设置“格式字符串”等。有关更多信息,请参阅[属性视图](xref:properties-view)。 +除了`Name`、`Expression`和`Hidden`属性外,您还可以使用**Properties**视图查看和编辑**TOM资源管理器**中当前选定对象的所有属性的值。对于度量,您可以在此处设置`Format String`等。有关更多信息,请参阅[属性视图](xref:properties-view)。 # 添加计算列 @@ -143,7 +143,7 @@ Tabular Editor 3 使用的新 DAX 代码编辑器解决了所有这些问题。 # 显示文件夹 -当您的模型开始拥有大量度量值时,一个好的做法是使用显示文件夹来组织它们。在 Tabular Editor 中,要创建显示文件夹,可以通过“属性”视图编辑“显示文件夹”属性,或者右键单击度量值,然后选择“创建 > 显示文件夹”选项。 +当您的模型开始拥有大量度量值时,一个好的做法是使用显示文件夹来组织它们。在 Tabular Editor 中,要创建显示文件夹,可以通过“属性”视图编辑`Display Folder`属性,或者右键单击度量值,然后选择“创建 > 显示文件夹”选项。 您还可以在显示文件夹之间剪切/复制/粘贴或拖放对象。 diff --git a/localizedContent/zh/content/getting-started/installation.md b/localizedContent/zh/content/getting-started/installation.md index ea0d99c3f..fd9c09163 100644 --- a/localizedContent/zh/content/getting-started/installation.md +++ b/localizedContent/zh/content/getting-started/installation.md @@ -126,7 +126,7 @@ msiexec /i TabularEditor..x64.Net10.msi /qn /norestart /l*v C:\Temp\TE3 msiexec /i TabularEditor..x64.Net10.msi /qn /norestart ADDLOCAL=MainFeature /l*v C:\Temp\TE3_install.log ``` -使用“REMOVE”运行软件包,以从已安装该组件的计算机中将其移除: +使用`REMOVE`运行软件包,以从已安装该组件的计算机中将其移除: ```powershell msiexec /i TabularEditor..x64.Net10.msi /qn /norestart REMOVE=AIAssistant /l*v C:\Temp\TE3_install.log @@ -168,13 +168,13 @@ msiexec /i TabularEditor..x64.Net10.msi /qn /norestart REMOVE=AIAssista - 升级将从已安装该组件的计算机中将其删除 - 现有安装将保留 AI 文件,直至下一次升级。在设置策略时,Tabular Editor 3 不会加载它们。 -以本地系统账户运行的部署工具不会读取计算机用户的 `HKEY_CURRENT_USER` 策略。在“HKEY_LOCAL_MACHINE”下设置策略,以便安装程序在静默部署中读取该策略。 +以本地系统账户运行的部署工具不会读取计算机用户的 `HKEY_CURRENT_USER` 策略。在`HKEY_LOCAL_MACHINE`下设置策略,以便安装程序在静默部署中读取该策略。 ### 组件名称和其他 MSI 选项 -您还可以使用 `/package` 代替 `/i`。将“”替换为实际的版本字符串。 +您还可以使用 `/package` 代替 `/i`。将``替换为实际的版本字符串。 -MSI 包的命名方式为“TabularEditor....msi”,例如“TabularEditor.3.27.0.x64.Net10.msi”或“TabularEditor.3.27.0.ARM64.Net8.msi”。选择适合目标计算机的架构和运行时;请参阅@system-requirements。MSI 不会安装 .NET Desktop Runtime,因此请先部署该运行时。 +MSI 包的命名方式为`TabularEditor....msi`,例如`TabularEditor.3.27.0.x64.Net10.msi`或`TabularEditor.3.27.0.ARM64.Net8.msi`。选择适合目标计算机的架构和运行时;请参阅@system-requirements。MSI 不会安装 .NET Desktop Runtime,因此请先部署该运行时。 有关可用 MSI 命令行选项的详细信息,请参阅 Microsoft 官方文档: [Microsoft Standard Installer 命令行选项 - Win32 应用 | Microsoft Learn](https://learn.microsoft.com/windows/win32/msi/command-line-options) diff --git a/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md b/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md index ab15a765b..35588dc80 100644 --- a/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md +++ b/localizedContent/zh/content/how-tos/Advanced-Filtering-of-the-Explorer-Tree.md @@ -41,7 +41,7 @@ applies_to: 在**筛选条件**文本框中,`?`匹配任意单个字符,`*`匹配任意零个或多个字符的序列,并且与简单搜索一样,匹配不区分大小写。`*sales*`给出与上述相同的结果,而`sales*`仅显示名称以“sales”开头的对象。 -在“按父级”模式下搜索“sales*”将得到以下结果: +在“按父级”模式下搜索`sales*`将得到以下结果: ![在“按父级”模式下搜索“sales*”的结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-07.png) @@ -49,7 +49,7 @@ applies_to: ![在“按子级”模式下搜索“sales*”的结果](~/content/assets/images/advanced-filtering-of-the-explorer-tree-08.png) -对“sales*”进行扁平搜索,显示信息列(**Ctrl+F1**),以查看每个对象的详细信息: +对`sales*`进行扁平搜索,显示信息列(**Ctrl+F1**),以查看每个对象的详细信息: ![sales* 的平面搜索结果,信息列显示父级和类型](~/content/assets/images/advanced-filtering-of-the-explorer-tree-09.png) diff --git a/localizedContent/zh/content/how-tos/drag-drop.md b/localizedContent/zh/content/how-tos/drag-drop.md index 252379731..8dee3daa7 100644 --- a/localizedContent/zh/content/how-tos/drag-drop.md +++ b/localizedContent/zh/content/how-tos/drag-drop.md @@ -33,7 +33,7 @@ applies_to: 每次拖放都是一个撤消步骤(**Ctrl+Z**),无论它移动了多少个对象。 -显示文件夹是每个对象的字符串属性,使用“`\`”分隔各级:“`Sales\Ratios`”是“Sales”中的“Ratios”文件夹。要在一个以上的文件夹中显示对象,请使用“;”分隔路径。 +显示文件夹是每个对象的字符串属性,使用“`\`”分隔各级:“`Sales\Ratios`”是“Sales”中的“Ratios”文件夹。要在一个以上的文件夹中显示对象,请使用`;`分隔路径。 ## 将对象移动到另一个表 diff --git a/localizedContent/zh/content/references/policies.md b/localizedContent/zh/content/references/policies.md index 993fa1d9c..ab0c9b055 100644 --- a/localizedContent/zh/content/references/policies.md +++ b/localizedContent/zh/content/references/policies.md @@ -61,7 +61,7 @@ HKEY_CURRENT_USER\Software\Policies\Kapacity\Tabular Editor | 设置类型 | 注册表类型 | 注意事项 | |--|--|--| -| 开/关策略 | `REG_DWORD` | 任何非零值都会强制执行该策略。“0”和不存在该值都表示不强制执行该策略。| +| 开/关策略 | `REG_DWORD` | 任何非零值都会强制执行该策略。`0`和不存在该值都表示不强制执行该策略。| | 选择 | `REG_SZ` | 选择的名称,例如 `Read`,这是管理模板写入的内容。也接受包含选项在列表中的位置的 `REG_DWORD`。| | 数字 | `REG_DWORD` | 管理模板写入的内容。也接受包含该数字的 `REG_SZ`。| | 列表 | `REG_MULTI_SZ` | 每行一个条目。也接受条目由分号分隔的 `REG_SZ`。| @@ -77,14 +77,14 @@ Tabular Editor 在启动时读取一次策略值。更改将在您下次启动 |--|--|--| | DisableUpdates | TE3、TE2 | Tabular Editor 将不会检查是否有更新版本在线可用。用户也无法手动检查更新。| | DisableCSharpScripts | TE3、TE2 | Tabular Editor 不允许用户创建或执行 C# 脚本。| -| DisableMacros | TE3、TE2 | Tabular Editor 不允许用户保存或运行宏。应用程序启动时,不会加载存储在“%LocalAppData%”文件夹中的宏。| +| DisableMacros | TE3、TE2 | Tabular Editor 不允许用户保存或运行宏。应用程序启动时,不会加载存储在`%LocalAppData%`文件夹中的宏。| | DisableBpaDownload | TE3、CLI、TE2 | 无法从网络下载 Best Practice Analyzer 规则。存储在本地或与模型一起存储的规则仍可正常使用。| | DisableWebDaxFormatter | TE3、CLI、TE2 | 已禁用将代码发送到 daxformatter.com 的 DAX 格式化工具。Tabular Editor 3 仍提供其内置的格式化工具,该工具不会通过网络发送任何内容。| | DisableErrorReports | TE3 | 用户无法向 Tabular Editor 支持团队发送错误或崩溃报告。| | DisableTelemetry | TE3、CLI | 不收集匿名使用数据,也不将此类数据发送给 Tabular Editor 支持团队。| | DisableDaxOptimizer | TE3 | DAX Optimizer 集成不可用。| -| DisableDaxOptimizerUpload | TE3 | 用户无法通过 DAX Optimizer 集成上传 VertiPaq Analyzer 文件。当强制执行“DisableDaxOptimizer”时隐含。| -| RequireDaxOptimizerObfuscation | TE3 | 用户无法通过 DAX 优化器集成上传明文 VertiPaq 分析器文件;只能上传混淆的文件。当强制执行“DisableDaxOptimizer”或“DisableDaxOptimizerUpload”时隐含。| +| DisableDaxOptimizerUpload | TE3 | 用户无法通过 DAX Optimizer 集成上传 VertiPaq Analyzer 文件。当强制执行`DisableDaxOptimizer`时隐含。| +| RequireDaxOptimizerObfuscation | TE3 | 用户无法通过 DAX 优化器集成上传明文 VertiPaq 分析器文件;只能上传混淆的文件。当强制执行`DisableDaxOptimizer`或`DisableDaxOptimizerUpload`时隐含。| | DisableDaxPackageManager | TE3 | DAX 包管理器不可用。| | DisableAi | TE3 | 所有 AI 功能均已关闭:AI 助手、MCP 服务器和所有由 AI 提供支持的功能均不可用,应用程序启动时不会加载任何与 AI 相关的项,并且所有存储的提供商配置(包括 API 密钥)都将被清除。| | DisableAiChat | TE3 | AI 助手聊天面板不可用。其他 AI 功能(包括 MCP 服务器)不受影响。| @@ -126,7 +126,7 @@ CLI 没有版本,因此,无论计算机持有何种许可证,CLI 都会直 |值|可接受的值|限制对……的访问| |--|--|--| -| MaxModelMetadataAccess | 拒绝、读取、写入 | 打开模型的元数据:表、列和度量值名称、表达式、描述、Best Practice Analyzer 结果和 VertiPaq 统计信息。`Write` 还允许助手对模型运行其自身的 C# 脚本。如果设置为“拒绝”,则完全不会发送有关打开的模型的任何信息:没有模型摘要,没有模型已更改的通知,也没有当前所选内容。| +| MaxModelMetadataAccess | 拒绝、读取、写入 | 打开模型的元数据:表、列和度量值名称、表达式、描述、Best Practice Analyzer 结果和 VertiPaq 统计信息。`Write` 还允许助手对模型运行其自身的 C# 脚本。如果设置为`Deny`,则完全不会发送有关打开的模型的任何信息:没有模型摘要,没有模型已更改的通知,也没有当前所选内容。| | MaxModelDataAccess | 拒绝、读取 | 来自模型的数据值,即 DAX 查询的结果。| | MaxBpaAccess | 拒绝、读取、写入 | Best Practice Analyzer 规则。`Read` 允许列出规则并运行分析;`Write` 还允许添加和更改规则。| | MaxDocumentsAccess | 拒绝、读取、写入 | 用户已打开的文档,例如 C# 脚本和 DAX 查询。`Read` 允许读取其内容;`Write` 还允许对其进行更改。| @@ -137,7 +137,7 @@ CLI 没有版本,因此,无论计算机持有何种许可证,CLI 都会直 | McpMaxDocumentsAccess | 拒绝、读取、写入 | | | McpMaxMacrosAccess | 拒绝、读、写 | | -五个“McpMax…”值仅适用于 MCP 服务器。当其中一个未设置时,MCP 服务器将继承相应的 `Max...` 限制。它们只能降低该限制,绝不能提高该限制,因此无人值守代理的权限绝不能超过交互式助手的权限。 +五个`McpMax...`值仅适用于 MCP 服务器。当其中一个未设置时,MCP 服务器将继承相应的 `Max...` 限制。它们只能降低该限制,绝不能提高该限制,因此无人值守代理的权限绝不能超过交互式助手的权限。 ### AI 提供程序 @@ -148,12 +148,12 @@ CLI 没有版本,因此,无论计算机持有何种许可证,CLI 都会直 | AiModel | 名称 | | 锁定模型或 Azure OpenAI 部署名称。聊天面板中的模型选择器被一个普通指示器替换,因此用户无法切换模型。| | AiOrganizationId | 名称 | | 锁定向其计费的 OpenAI 组织请求。| | AiProjectId | 名称 | | 锁定 OpenAI 项目请求的计费对象。| -| AiAllowedProviders | 列表 | 上述任何提供程序名称 | 限制用户可以配置的提供程序。无论是否列出,`AiProvider` 设置的提供商均被允许,并且始终提供“无” - 允许列表并不是阻止用户关闭助手的办法。| +| AiAllowedProviders | 列表 | 上述任何提供程序名称 | 限制用户可以配置的提供程序。无论是否列出,`AiProvider` 设置的提供商均被允许,并且始终提供`None` - 允许列表并不是阻止用户关闭助手的办法。| | AiAllowedEndpointHosts | 列表 | 主机名 | 限制端点可以指向的主机,例如 `gateway.contoso.com` 或 `*.contoso.com`。| 锁定的设置在**工具 > 首选项 > AI 功能 > AI 助手**下显示为只读,无论用户之前选择了什么,AI 助手都会使用锁定的配置。用户的个人偏好设置中不会写入任何内容,因此如果删除该策略,其提供商、端点、模型和 API 密钥将恢复。API 密钥绝不会通过策略分发。 -主机名仅与端点 URL 的主机部分进行匹配。匹配时忽略大小写,并忽略端口。开头的“*.”涵盖域的子域,但不涵盖域本身,因此如果两者都需要,请同时列出。每当设置端点时,该列表都适用于每个提供商,因此不能使用基准 URL 覆盖来绕过它。 +主机名仅与端点 URL 的主机部分进行匹配。匹配时忽略大小写,并忽略端口。开头的`*.`涵盖域的子域,但不涵盖域本身,因此如果两者都需要,请同时列出。每当设置端点时,该列表都适用于每个提供商,因此不能使用基准 URL 覆盖来绕过它。 政策不允许的配置将被拒绝,AI 助手会说明是哪条规则拒绝了该配置,而不是发送请求:不在允许列表中的提供商、不在主机允许列表中的端点主机、在适用主机允许列表时不是有效 URL 的端点,或者根本没有端点的已锁定 Azure OpenAI 或自定义提供商。 @@ -180,7 +180,7 @@ Tabular Editor 3 保留 AI 助手和 MCP 服务器活动的本地记录,包括 |值|类型|作用| |--|--|--| | AiAuditLogPath | 路径 | 重定向审计日志,以便集中收集。支持指向网络共享的 UNC 路径。未设置策略时,日志将写入 `%LocalAppData%\TabularEditor3\AI\audit`,每天一个 `ai-audit-.jsonl` 文件,记录的脚本位于 `audit\scripts\` 下。| -| AiAuditLogRetentionDays | 数字,0 至 3650 | 保留多少天的审计日志;较旧的文件将被删除。“0”表示保留所有内容。默认为 30 天。| +| AiAuditLogRetentionDays | 数字,0 至 3650 | 保留多少天的审计日志;较旧的文件将被删除。`0`表示保留所有内容。默认为 30 天。| ## 没有企业版会发生什么 @@ -200,7 +200,7 @@ Tabular Editor 3 保留 AI 助手和 MCP 服务器活动的本地记录,包括 ## 使用管理模板 -Tabular Editor 3.27 及更高版本会安装一对组策略管理模板,因此上述策略可以从组策略编辑器中设置,而无需编辑注册表。您可以在安装文件夹的“Policies”文件夹中找到它们,默认情况下,该文件夹为“C:\Program Files\Tabular Editor 3\Policies”: +Tabular Editor 3.27 及更高版本会安装一对组策略管理模板,因此上述策略可以从组策略编辑器中设置,而无需编辑注册表。您可以在安装文件夹的`Policies`文件夹中找到它们,默认情况下,该文件夹为`C:\Program Files\Tabular Editor 3\Policies`: - `TabularEditorApS.admx` - `en-US\TabularEditorApS.adml` @@ -228,7 +228,7 @@ Tabular Editor 3 和 CLI 共享的策略直接位于**Tabular Editor**下方。 将策略设置为**已启用**会写入其注册表值。将其设置为**禁用**,或将其保留为**未配置**,则表示该策略未实施。模板不会写入旧的 `Kapacity\Tabular Editor` 键,因此,如果策略还需要应用于 Tabular Editor 2,请手动设置该键。 -对于企业版策略,**Disabled** 会删除注册表值,而不是写入“0”。这是有意的:只要存在 Enterprise 值,就会将 AI 助手和 MCP 服务器置于 Enterprise 许可证检查之后,因此管理员刚刚禁用的策略绝不能留下任何值。 +对于企业版策略,**Disabled** 会删除注册表值,而不是写入`0`。这是有意的:只要存在 Enterprise 值,就会将 AI 助手和 MCP 服务器置于 Enterprise 许可证检查之后,因此管理员刚刚禁用的策略绝不能留下任何值。 ## 禁用网络通信 diff --git a/localizedContent/zh/content/references/preferences.md b/localizedContent/zh/content/references/preferences.md index f73c5f5ca..f91da9069 100644 --- a/localizedContent/zh/content/references/preferences.md +++ b/localizedContent/zh/content/references/preferences.md @@ -25,7 +25,7 @@ applies_to: 要访问“首选项”对话框,请转到**工具 > 首选项**。 > [!NOTE] -> 所有 Tabular Editor 首选项均针对每个 Windows 用户配置文件存储在“%localappdata%\TabularEditor3”文件夹中。只需复制此文件夹的内容,即可将您的设置迁移到另一台计算机。 +> 所有 Tabular Editor 首选项均针对每个 Windows 用户配置文件存储在`%localappdata%\TabularEditor3`文件夹中。只需复制此文件夹的内容,即可将您的设置迁移到另一台计算机。 > [!TIP] > 使用“偏好”对话框顶部的搜索框,可快速找到特定设置。 @@ -78,7 +78,7 @@ applies_to: ### 由您的组织管理 -如果管理员已配置[策略](xref:policies),则此页面将附加一个只读的**由您的组织管理**部分,其中列出 Tabular Editor 找到的每个策略值,格式为“名称 = 值”。将鼠标悬停在条目上,查看其来自哪个注册表项和配置单元。 +如果管理员已配置[策略](xref:policies),则此页面将附加一个只读的**由您的组织管理**部分,其中列出 Tabular Editor 找到的每个策略值,格式为`Name = value`。将鼠标悬停在条目上,查看其来自哪个注册表项和配置单元。 Tabular Editor 无法解释的值会显示 `(invalid)` 标记,而不是被省略。该标记是查找看似不起作用的策略背后的拼写错误的最快方法,因此,当策略未生效时,请先在此处检查。 @@ -645,7 +645,7 @@ SUM(Sales[Amount]) **修正度量值/列限定符**(启用):选中此项时,表前缀将自动从度量值引用中移除,并自动插入到列引用中。 -**首选关键字大小写**(大写):此设置允许您更改关键字使用的大小写,例如 `ORDER BY`、`VAR`、`EVALUATE` 等。它还控制着自动补全功能为使用这些关键字的函数提供的固定关键字值:`ASC` 和 `DESC`、`KEEP`、`FIRST`、`LAST` 和 `DEFAULT`、`CROSSFILTER` 方向以及 `LOOKUP` 的 `EXPLICIT` 和 `INFERRED`。选择**仅首字母大写**,以提供“Explicit”而不是“EXPLICIT”。 +**首选关键字大小写**(大写):此设置允许您更改关键字使用的大小写,例如 `ORDER BY`、`VAR`、`EVALUATE` 等。它还控制着自动补全功能为使用这些关键字的函数提供的固定关键字值:`ASC` 和 `DESC`、`KEEP`、`FIRST`、`LAST` 和 `DEFAULT`、`CROSSFILTER` 方向以及 `LOOKUP` 的 `EXPLICIT` 和 `INFERRED`。选择**仅首字母大写**,以提供`Explicit`而不是`EXPLICIT`。 **首选函数大小写**(大写):此设置允许您更改函数使用的大小写,例如 `CALCULATE(...)`、`SUM(...)` 等。 @@ -761,7 +761,7 @@ SQL、M (Power Query) 和 C# 脚本编辑器提供类似的配置选项,包括 - **系统**:使用系统代理设置 - **自定义**:指定自定义代理配置 -**代理地址**:代理服务器的地址(例如 `http://proxy.company.com`)。 +**代理地址**:代理服务器的地址(例如 `http://proxy.company.com:8080`)。 **代理用户**:如果需要,这是用于代理身份验证的用户名。 diff --git a/localizedContent/zh/content/references/release-notes/3_27_1_0.md b/localizedContent/zh/content/references/release-notes/3_27_1_0.md index 3193dd479..050a88e04 100644 --- a/localizedContent/zh/content/references/release-notes/3_27_1_0.md +++ b/localizedContent/zh/content/references/release-notes/3_27_1_0.md @@ -61,9 +61,9 @@ Tabular Editor 3.27.1.0 下载: ## 3.27.1.0 中的错误修复 - 修复了将计算项的**序号**设置为将其向其计算组的末尾移动时,将其放置的位置提前了一个位置的问题。 -- 修复了**文件 > 新建 > 模型…**仅将所选名称应用于模型,而将数据库命名为“SemanticModel”的问题。 -- 修复了对于模型的 **Culture** 属性和翻译的 **Language** 属性接受无效区域设置名称的问题。现在,这些值将被拒绝,并显示错误,例如“'en US' 是无效的区域设置说明符”。 -- 修复了当两个模型在角色成员、查询组或其他未命名集合元素上存在差异时,比较这两个模型失败并显示“对象引用未设置为对象的实例”的问题。 +- 修复了**文件 > 新建 > 模型…**仅将所选名称应用于模型,而将数据库命名为`SemanticModel`的问题。 +- 修复了对于模型的 **Culture** 属性和翻译的 **Language** 属性接受无效区域设置名称的问题。现在,这些值将被拒绝,并显示错误,例如`'en US' is an invalid culture specifier`。 +- 修复了当两个模型在角色成员、查询组或其他未命名集合元素上存在差异时,比较这两个模型失败并显示`Object reference not set to an instance of an object`的问题。 - 修复了 DAX 表达式中的非标准空白字符(例如不间断空格)未被报告的问题。现在,它被报告为一个错误,该错误指明了字符的名称,并提示您运行**格式化 DAX**。 - 修复了**元数据翻译编辑器**中的问题: - 清除翻译单元格无效;现在将移除翻译 @@ -73,8 +73,8 @@ Tabular Editor 3.27.1.0 下载: - 修复了取消**从数据库加载语义模型**对话框或数据源凭据提示可能会关闭 Tabular Editor 并丢失未保存工作的问题。 - 修复了在 **Pivot Grid** 值上使用“**调试此值**”时,忽略或颠倒网格的某些筛选器,导致调试器显示的值与网格中的值不同的问题。 - 修复了以下问题:当 Tabular Editor 不是活动窗口时,MCP 客户端打开的文档显示的是上一个文档的工具栏和菜单。在[GitHub 讨论 #1590](https://github.com/TabularEditor/TabularEditor3/discussions/1590)中报告。 -- 修复了以下问题:复制或粘贴显示在多个显示文件夹中的度量值、列或层次结构时,会将副本放入一个以所有文件夹命名的文件夹中,例如“folder_01;folder_02”。现在,副本会出现在原始项的每个显示文件夹中。 -- 修复了 **DAX 查询**编辑器中的问题,该问题表现为:在文档中运行多个查询中的一个查询时,使用了第一个查询的 `DEFINE` 块,并且在 `ORDER BY` 子句中执行所选列时失败,并显示“无法确定列……的单个值”。 +- 修复了以下问题:复制或粘贴显示在多个显示文件夹中的度量值、列或层次结构时,会将副本放入一个以所有文件夹命名的文件夹中,例如`folder_01;folder_02`。现在,副本会出现在原始项的每个显示文件夹中。 +- 修复了 **DAX 查询**编辑器中的问题,该问题表现为:在文档中运行多个查询中的一个查询时,使用了第一个查询的 `DEFINE` 块,并且在 `ORDER BY` 子句中执行所选列时失败,并显示`A single value for column ... cannot be determined`。 - 修复了**消息**视图停止列出在打开其他模型后仍保持打开状态的文档的错误的问题。 - 修复了可能导致 Tabular Editor 3 意外关闭或显示错误对话框的问题: - 当**属性**视图显示度量值时,或当其所选对象被删除时 diff --git a/localizedContent/zh/content/references/supported-files.md b/localizedContent/zh/content/references/supported-files.md index 198ac135b..71e8f31f9 100644 --- a/localizedContent/zh/content/references/supported-files.md +++ b/localizedContent/zh/content/references/supported-files.md @@ -194,7 +194,7 @@ definition.pbism 文件包含语义模型的整体定义和核心设置。此文 ### 用户选项 (.tmuo) -“.tmuo”文件包含您自己针对一个模型的计算机本地设置:工作区数据库、数据源凭据覆盖、表导入设置、刷新覆盖和 AI 权限授予。它位于模型旁边,并以模型和您的Windows用户名命名,因此多名开发人员可以处理同一模型,而不会相互干扰。 +`.tmuo`文件包含您自己针对一个模型的计算机本地设置:工作区数据库、数据源凭据覆盖、表导入设置、刷新覆盖和 AI 权限授予。它位于模型旁边,并以模型和您的Windows用户名命名,因此多名开发人员可以处理同一模型,而不会相互干扰。 其中的凭据使用您的 Windows 用户密钥进行加密,这意味着该文件无法有意义地共享。将 `*.tmuo` 添加到 `.gitignore`。 diff --git a/localizedContent/zh/content/references/user-options.md b/localizedContent/zh/content/references/user-options.md index da00a92ff..7831e9849 100644 --- a/localizedContent/zh/content/references/user-options.md +++ b/localizedContent/zh/content/references/user-options.md @@ -174,7 +174,7 @@ TMDL 始终使用 `model` 前缀,以便与早于 `database.tmdl` 的版本保 所有敏感信息都会使用您自己的用户帐户下的 Windows 数据保护 API 进行加密,因此包含加密数据的文件无法与其他用户共享或移动到其他计算机。根据所保护的内容,会出现三种形状: -不包含密码的连接字符串完全不加密,仍是纯 JSON 字符串,这就是为什么在实践中“WorkspaceConnection”以两种形式出现的原因。 +不包含密码的连接字符串完全不加密,仍是纯 JSON 字符串,这就是为什么在实践中`WorkspaceConnection`以两种形式出现的原因。 如果值无法解密(例如,因为文件来自其他用户),则该值将被读取为空,而不是导致加载失败。 diff --git a/localizedContent/zh/content/security/ai-compliance.md b/localizedContent/zh/content/security/ai-compliance.md index e48044b98..f3987f933 100644 --- a/localizedContent/zh/content/security/ai-compliance.md +++ b/localizedContent/zh/content/security/ai-compliance.md @@ -59,7 +59,7 @@ AI 助手将请求直接从用户的计算机发送到在**工具 > 首选项 > ### MCP 服务器 -MCP 服务器是一个 HTTP 侦听器,默认情况下绑定到 `127.0.0.1` 的 42100 端口。它没有 API 密钥,不发出出站请求,并拒绝带有非本地“Origin”标头的浏览器请求。 +MCP 服务器是一个 HTTP 侦听器,默认情况下绑定到 `127.0.0.1` 的 42100 端口。它没有 API 密钥,不发出出站请求,并拒绝带有非本地`Origin`标头的浏览器请求。 已连接的代理根据代理的配置和提供商的条款,将其从 Tabular Editor 3 读取的内容发送给自己的提供商。Tabular Editor 3 没有针对代理提供商的设置,因此请通过代理自身的管理控制来管理代理。代理自身的工具(例如文件和 shell 访问)也位于 Tabular Editor 3 之外。**模型源详细信息**首选项设置代理随模型名称一起接收的模型文件路径或服务器的多少,并且不会更改模型元数据中的连接详细信息。请参阅[检查是否成功](xref:mcp-server#check-that-it-worked)。以用户身份运行的任何代理都可以读取磁盘上的模型文件、会话文件和审计文件。 diff --git a/localizedContent/zh/content/security/security-privacy.md b/localizedContent/zh/content/security/security-privacy.md index 3f50fca15..6a425c1fa 100644 --- a/localizedContent/zh/content/security/security-privacy.md +++ b/localizedContent/zh/content/security/security-privacy.md @@ -89,7 +89,7 @@ AI 助手使用**自带密钥**模型。您需要提供来自受支持的 AI 提 Tabular Editor 3 可以充当 MCP(模型上下文协议)服务器,以便在同一台计算机上运行的 AI 代理可以在您打开的模型上工作。有关该功能本身的信息,请参阅 @mcp-server。 -**网络暴露。**该服务器是一个 HTTP 侦听器,显式绑定到 `127.0.0.1`,默认情况下使用端口 42100。无法从其他计算机访问。为防范 DNS 重新绑定,系统会拒绝携带非本地“Origin”标头的浏览器请求。服务器仅在您启动它后才会运行,或者如果您有此要求,则会在应用程序启动时运行。 +**网络暴露。**该服务器是一个 HTTP 侦听器,显式绑定到 `127.0.0.1`,默认情况下使用端口 42100。无法从其他计算机访问。为防范 DNS 重新绑定,系统会拒绝携带非本地`Origin`标头的浏览器请求。服务器仅在您启动它后才会运行,或者如果您有此要求,则会在应用程序启动时运行。 **身份验证。**环回绑定是默认边界,因此服务器开箱即用即可接受无需凭据的本地连接。在多个人同时登录的主机上(例如远程桌面或 Citrix 服务器),这并不够:该机器上的任何会话都可以访问 `127.0.0.1`。在令牌关闭时,计算机上的任何进程都可以在没有凭据的情况下进行连接。在**工具 > 首选项 > AI 功能 > MCP 服务器**下启用**需要访问令牌**,客户端必须出示持有者令牌,该令牌以加密形式存储在本地 Preferences.json 文件中。管理员可以使用 `RequireMcpAccessToken` [策略](xref:policies)强制执行此操作。 @@ -143,10 +143,10 @@ Tabular Editor 仅在以下情况下才会向在线资源(网页网址)发 ## 应用程序安全 -Tabular Editor 在其安装所在的 Windows 计算机上不需要任何提升的权限,也不会访问该计算机上的任何受限资源。此规则的一个例外是,如果使用 Tabular Editor 安装程序文件 (.msi),则该工具所需的可执行文件和支持文件默认会复制到“Program Files”文件夹,这通常需要更高的权限。Tabular Editor 二进制文件和安装程序文件均已使用签发给 Tabular Editor ApS 的代码签名证书进行签名,这可以保证代码未被任何第三方篡改。 +Tabular Editor 在其安装所在的 Windows 计算机上不需要任何提升的权限,也不会访问该计算机上的任何受限资源。此规则的一个例外是,如果使用 Tabular Editor 安装程序文件 (.msi),则该工具所需的可执行文件和支持文件默认会复制到`Program Files`文件夹,这通常需要更高的权限。Tabular Editor 二进制文件和安装程序文件均已使用签发给 Tabular Editor ApS 的代码签名证书进行签名,这可以保证代码未被任何第三方篡改。 应用程序运行时,对外部资源的所有访问均通过 AMO/TOM 客户端库或上述 Web 请求进行。 -C# 脚本功能允许 Tabular Editor 在 .NET 运行时中执行任意 C# 代码。此类代码仅在用户明确要求时才会编译和执行。C# 脚本还可以保存为“宏”,这使用户能够更轻松地管理和执行多个不同的脚本。代码存储在用户自己的“%localappdata%”文件夹中,确保只有用户本人或本地计算机管理员才能访问脚本。用户始终有责任确保所执行的代码不会造成任何意外的副作用。在任何情况下,Tabular Editor ApS 均不对因使用 C# 脚本或自定义操作/宏功能而导致的任何损害、损失或泄露承担责任。 +C# 脚本功能允许 Tabular Editor 在 .NET 运行时中执行任意 C# 代码。此类代码仅在用户明确要求时才会编译和执行。C# 脚本还可以保存为“宏”,这使用户能够更轻松地管理和执行多个不同的脚本。代码存储在用户自己的`%localappdata%`文件夹中,确保只有用户本人或本地计算机管理员才能访问脚本。用户始终有责任确保所执行的代码不会造成任何意外的副作用。在任何情况下,Tabular Editor ApS 均不对因使用 C# 脚本或自定义操作/宏功能而导致的任何损害、损失或泄露承担责任。 不想将此事项留给个人用户处理的组织可以集中管理。`DisableCSharpScripts` 和 `DisableMacros` [策略](xref:policies)会在所有版本中完全禁用这些功能。使用 Tabular Editor 3 企业版,`BlockUnsafeScripts` 保持脚本可用,但仅允许保留在语义模型内的脚本和宏:任何读取或写入文件、访问网络、启动其他程序或加载外部代码的操作,无论脚本来自何处(脚本文档、Best Practice Analyzer、宏、AI 助手、MCP 服务器或命令行),都会在其运行之前被拒绝。请参阅[管理员策略](xref:csharp-scripts#administrator-policies)。 diff --git a/localizedContent/zh/content/tutorials/direct-lake-guidance.md b/localizedContent/zh/content/tutorials/direct-lake-guidance.md index 173341e72..8a9473e95 100644 --- a/localizedContent/zh/content/tutorials/direct-lake-guidance.md +++ b/localizedContent/zh/content/tutorials/direct-lake-guidance.md @@ -54,13 +54,13 @@ applies_to: ### Direct Lake on OneLake 上的计算列 -Direct Lake on OneLake 表上的计算列必须将其 `ExpressionContext` 属性设置为 `UserContext`。该列在查询时进行评估,且未物化,因此无法在关系中使用。新计算列默认使用 `Standard`。如果您在将模型保存到 Power BI 服务时将 Direct Lake 表中的计算列设置为“Standard”,则保存将失败,并显示错误“默认表达式上下文不能用于 Direct Lake 表中的计算列”。 +Direct Lake on OneLake 表上的计算列必须将其 `ExpressionContext` 属性设置为 `UserContext`。该列在查询时进行评估,且未物化,因此无法在关系中使用。新计算列默认使用 `Standard`。如果您在将模型保存到 Power BI 服务时将 Direct Lake 表中的计算列设置为`Standard`,则保存将失败,并显示错误“默认表达式上下文不能用于 Direct Lake 表中的计算列”。 只有当模型的兼容级别为 1705 或更高时,**表达式上下文**属性才会显示在 @properties-view 中。在 Direct Lake on OneLake 表的每个计算列上设置该属性: 1. 在 @tom-explorer-view 中选择模型,然后在 @properties-view 的**数据库**下勾选**兼容级别**。如果低于 1705,请按照 @update-compatibility-level 中的说明升级模型。 2. 在 @tom-explorer-view 中选择计算列。 -3. 在@properties-view的**选项**下,将**表达式上下文**设置为“UserContext”。 +3. 在@properties-view的**选项**下,将**表达式上下文**设置为`UserContext`。 4. 保存模型。 同一模型中导入表格上的计算列可以使用任一表达式上下文。对于无法引用用户上下文列的对象,请参阅 @user-context-calculated-columns。Microsoft 在[在 Power BI Desktop 中使用计算列](https://learn.microsoft.com/power-bi/transform-model/desktop-calculated-columns#materialization-and-performance)中列出了受支持的存储模式和表达式上下文组合。 @@ -126,7 +126,7 @@ Direct Lake on OneLake 还支持通过基于 XMLA 的工具(例如 Tabular Edi ## 检查 Direct Lake 分区 -Direct Lake 分区没有查询表达式。当您在 @tom-explorer-view 中选择一个分区时,**表达式编辑器**会显示其“数据覆盖范围定义表达式”;如果分区没有数据覆盖范围定义,则不显示任何内容。由增量刷新策略生成的分区表现方式相同。 +Direct Lake 分区没有查询表达式。当您在 @tom-explorer-view 中选择一个分区时,**表达式编辑器**会显示其`Data Coverage Definition Expression`;如果分区没有数据覆盖范围定义,则不显示任何内容。由增量刷新策略生成的分区表现方式相同。 ## Power Query (M) 表达式 @@ -136,7 +136,7 @@ Direct Lake 分区没有查询表达式。当您在 @tom-explorer-view 中选择 要手动为**Direct Lake on OneLake**模式设置表,您需要执行以下操作: -1. **创建共享表达式**:Direct Lake 表格使用“实体”分区,这些分区必须引用模型中的共享表达式。如果还没有此共享表达式,请先创建它。将其命名为“DatabaseQuery”: +1. **创建共享表达式**:Direct Lake 表格使用“实体”分区,这些分区必须引用模型中的共享表达式。如果还没有此共享表达式,请先创建它。将其命名为`DatabaseQuery`: ![创建共享表达式](../assets/images/create-shared-expression.png) @@ -173,7 +173,7 @@ in ![更新表架构实体](../assets/images/update-table-schema-entity.png) - 或者,手动将数据列添加到表(Alt+4),并为每一列指定“名称”、“数据类型”、“源列”以及任何其他相关属性。 + 或者,手动将数据列添加到表(Alt+4),并为每一列指定`Name`、`Data Type`、`Source Column`以及任何其他相关属性。 > [!NOTE] > 将 Direct Lake 表添加到模型时,在第一次元数据部署后需要手动“刷新”该表。否则,查询时该表将不包含任何数据。此刷新只需执行一次。如果选中**工具 > 首选项 > 模型部署 > 数据刷新**下的**保存新表时自动刷新**,Tabular Editor 3 将在保存模型元数据时自动刷新表。 @@ -213,7 +213,7 @@ in 将``替换为仓库/湖仓中的架构名称,将`
    `替换为您要导入的表或视图的名称。请注意,导入模式下的表格可以使用非物化视图作为数据源,因为在刷新操作期间,数据是通过 SQL 端点查询的。 -3. **更新列元数据**(仅限手动设置):由于您手动配置的分区没有列,请使用 Tabular Editor 的**更新表架构**功能从湖仓/仓库检索列名称和数据类型。或者,手动创建数据列( **Alt+4** ),并为每一列指定“名称”、“数据类型”、“源列”以及任何其他相关属性。 +3. **更新列元数据**(仅限手动设置):由于您手动配置的分区没有列,请使用 Tabular Editor 的**更新表架构**功能从湖仓/仓库检索列名称和数据类型。或者,手动创建数据列( **Alt+4** ),并为每一列指定`Name`、`Data Type`、`Source Column`以及任何其他相关属性。 ## 在存储模式之间进行转换 diff --git a/localizedContent/zh/content/tutorials/new-as-model.md b/localizedContent/zh/content/tutorials/new-as-model.md index 12a8788ec..e5e19c372 100644 --- a/localizedContent/zh/content/tutorials/new-as-model.md +++ b/localizedContent/zh/content/tutorials/new-as-model.md @@ -71,7 +71,7 @@ applies_to: 点击“保存” (Ctrl+S)。系统将提示您为 Model.bim 文件提供路径和文件名,该文件将保存您迄今为止创建的模型元数据。您也可以将模型另存为文件夹结构(“文件”>“保存到文件夹…”)。如果您计划将模型元数据集成到版本控制环境中,则建议您这样做。如果你使用的是工作区数据库,Tabular Editor 3 还会将元数据同步到连接的 Analysis Services 实例。 -接下来,右键单击“Tables”(表格)文件夹并选择“Create > Table”(创建 > 表格)(您也可以按 Alt+5),向模型添加新表。为表命名,在我们的示例中为“Internet Sales”。展开表格,找到表格上的分区,并提供以下 M 查询作为分区表达式,以便向表格中填充数据: +接下来,右键单击“Tables”(表格)文件夹并选择“Create > Table”(创建 > 表格)(您也可以按 Alt+5),向模型添加新表。为表命名,在我们的示例中为`Internet Sales`。展开表格,找到表格上的分区,并提供以下 M 查询作为分区表达式,以便向表格中填充数据: ```M let From 32ed098a219e3359b06424e37f0b8e12da06b983 Mon Sep 17 00:00:00 2001 From: Nedas Surkus Date: Tue, 27 Oct 2026 20:14:00 +0100 Subject: [PATCH 5/8] Sync docs site template with internal template (#441) Co-authored-by: Azure Pipelines (template-sync) --- ...hitectureDiagram-3BPJPVTR-OLGG2C47.min.js} | 4 +- ...ctureDiagram-3BPJPVTR-OLGG2C47.min.js.map} | 0 ... => blockDiagram-GPEHLZMM-3OKIGOBQ.min.js} | 4 +- ...blockDiagram-GPEHLZMM-3OKIGOBQ.min.js.map} | 0 ....js => c4Diagram-AAUBKEIU-RCWASNEG.min.js} | 4 +- ...=> c4Diagram-AAUBKEIU-RCWASNEG.min.js.map} | 0 ...-FE5ZIIEJ.min.js => chunk-35PJYFUZ.min.js} | 4 +- ...J.min.js.map => chunk-35PJYFUZ.min.js.map} | 0 .../public/chunk-7PRAVCJT.min.js.map | 7 - ...-FU2EUEZL.min.js => chunk-BAYE47ZU.min.js} | 4 +- ...L.min.js.map => chunk-BAYE47ZU.min.js.map} | 0 ...-IXKFR5M2.min.js => chunk-BSOUP4V7.min.js} | 4 +- ...2.min.js.map => chunk-BSOUP4V7.min.js.map} | 0 ...-WEUFLJCQ.min.js => chunk-E2QUWX3Y.min.js} | 4 +- ...Q.min.js.map => chunk-E2QUWX3Y.min.js.map} | 0 ...-F37HX2WT.min.js => chunk-EUHHC2DS.min.js} | 4 +- ...T.min.js.map => chunk-EUHHC2DS.min.js.map} | 0 ...-C5SK55CT.min.js => chunk-KBTCHML7.min.js} | 4 +- ...T.min.js.map => chunk-KBTCHML7.min.js.map} | 0 ...-L3PWVFHQ.min.js => chunk-LUSFEUM7.min.js} | 4 +- ...Q.min.js.map => chunk-LUSFEUM7.min.js.map} | 0 ...-JXIGGPPB.min.js => chunk-LW6SCGDZ.min.js} | 4 +- ...B.min.js.map => chunk-LW6SCGDZ.min.js.map} | 0 ...-7PRAVCJT.min.js => chunk-OYCWXTBX.min.js} | 38 +-- .../public/chunk-OYCWXTBX.min.js.map | 7 + ...-ELBPDDB4.min.js => chunk-R5KY77F3.min.js} | 4 +- ...4.min.js.map => chunk-R5KY77F3.min.js.map} | 0 ...-ANPX43U5.min.js => chunk-RSHCK4XQ.min.js} | 4 +- ...5.min.js.map => chunk-RSHCK4XQ.min.js.map} | 0 ...-WNWVX3PL.min.js => chunk-STQM5NEZ.min.js} | 4 +- ...L.min.js.map => chunk-STQM5NEZ.min.js.map} | 0 ...-QD4STHJA.min.js => chunk-STULGUR3.min.js} | 4 +- ...A.min.js.map => chunk-STULGUR3.min.js.map} | 0 .../classDiagram-4FO5ZUOK-DQPI3RMH.min.js | 2 + ...classDiagram-4FO5ZUOK-DQPI3RMH.min.js.map} | 0 .../classDiagram-4FO5ZUOK-HLERBCJ4.min.js | 2 - .../classDiagram-v2-Q7XG4LA2-6636GVKU.min.js | 2 - .../classDiagram-v2-Q7XG4LA2-PXMWC4MS.min.js | 2 + ...ssDiagram-v2-Q7XG4LA2-PXMWC4MS.min.js.map} | 0 ....min.js => dagre-BM42HDAG-YRRYDAWI.min.js} | 4 +- ...map => dagre-BM42HDAG-YRRYDAWI.min.js.map} | 0 ...in.js => diagram-2AECGRRQ-KEQBS5V5.min.js} | 4 +- ...p => diagram-2AECGRRQ-KEQBS5V5.min.js.map} | 0 ...in.js => diagram-5GNKFQAL-LLI6NUAT.min.js} | 4 +- ...p => diagram-5GNKFQAL-LLI6NUAT.min.js.map} | 0 ...in.js => diagram-KO2AKTUF-SQQV2XYA.min.js} | 4 +- ...p => diagram-KO2AKTUF-SQQV2XYA.min.js.map} | 0 ...in.js => diagram-LMA3HP47-K5X3SHWV.min.js} | 4 +- ...p => diagram-LMA3HP47-K5X3SHWV.min.js.map} | 0 ...in.js => diagram-OG6HWLK6-6IXDQDO3.min.js} | 4 +- ...p => diagram-OG6HWLK6-6IXDQDO3.min.js.map} | 0 templates/tabulareditor/public/docfx.min.js | 2 +- ....js => erDiagram-TEJ5UH35-E3J5MK7E.min.js} | 4 +- ...=> erDiagram-TEJ5UH35-E3J5MK7E.min.js.map} | 0 ...s => flowDiagram-I6XJVG4X-XT5NVU2M.min.js} | 4 +- ... flowDiagram-I6XJVG4X-XT5NVU2M.min.js.map} | 0 ... => ganttDiagram-6RSMTGT7-XYXKMRH4.min.js} | 4 +- ...ganttDiagram-6RSMTGT7-XYXKMRH4.min.js.map} | 0 ... gitGraphDiagram-PVQCEYII-VKX7RXFI.min.js} | 4 +- ...GraphDiagram-PVQCEYII-VKX7RXFI.min.js.map} | 0 ...s => infoDiagram-5YYISTIA-LNGXWYHF.min.js} | 4 +- ... infoDiagram-5YYISTIA-LNGXWYHF.min.js.map} | 0 ... ishikawaDiagram-YF4QCWOH-WL7TIAXP.min.js} | 4 +- ...ikawaDiagram-YF4QCWOH-WL7TIAXP.min.js.map} | 0 ...> journeyDiagram-JHISSGLW-W5ZAVMLQ.min.js} | 4 +- ...urneyDiagram-JHISSGLW-W5ZAVMLQ.min.js.map} | 0 ...anban-definition-UN3LZRKU-X3ZEFO2B.min.js} | 4 +- ...n-definition-UN3LZRKU-X3ZEFO2B.min.js.map} | 0 .../public/katex-GDFLULNE.min.js | 258 ------------------ .../public/katex-GDFLULNE.min.js.map | 7 - .../public/katex-YKMXVIXW.min.js | 258 ++++++++++++++++++ .../public/katex-YKMXVIXW.min.js.map | 7 + ...IE.min.js => mermaid.core-RYCBC6YV.min.js} | 6 +- ...s.map => mermaid.core-RYCBC6YV.min.js.map} | 0 ...ndmap-definition-RKZ34NQL-CZ3S6CUN.min.js} | 4 +- ...p-definition-RKZ34NQL-CZ3S6CUN.min.js.map} | 0 ...js => pieDiagram-4H26LBE5-Y7RZCZRY.min.js} | 4 +- ...> pieDiagram-4H26LBE5-Y7RZCZRY.min.js.map} | 0 ... quadrantDiagram-W4KKPZXB-MG4SWTOH.min.js} | 4 +- ...drantDiagram-W4KKPZXB-MG4SWTOH.min.js.map} | 0 ...quirementDiagram-4Y6WPE33-CBTOTNUO.min.js} | 4 +- ...ementDiagram-4Y6WPE33-CBTOTNUO.min.js.map} | 0 ...=> sankeyDiagram-5OEKKPKP-FCKJS6UT.min.js} | 4 +- ...ankeyDiagram-5OEKKPKP-FCKJS6UT.min.js.map} | 0 ... sequenceDiagram-3UESZ5HK-NUHTEM4D.min.js} | 4 +- ...uenceDiagram-3UESZ5HK-NUHTEM4D.min.js.map} | 0 ... => stateDiagram-AJRCARHV-CDIB45FK.min.js} | 4 +- ...stateDiagram-AJRCARHV-CDIB45FK.min.js.map} | 0 .../stateDiagram-v2-BHNVJYJU-OEB6SCVA.min.js | 2 + ...teDiagram-v2-BHNVJYJU-OEB6SCVA.min.js.map} | 0 .../stateDiagram-v2-BHNVJYJU-PDN77SEH.min.js | 2 - ...eline-definition-PNZ67QCA-KIKICTUT.min.js} | 4 +- ...e-definition-PNZ67QCA-KIKICTUT.min.js.map} | 0 ...s => vennDiagram-CIIHVFJN-4KBTSVZQ.min.js} | 4 +- ... vennDiagram-CIIHVFJN-4KBTSVZQ.min.js.map} | 0 ...> wardleyDiagram-YWT4CUSO-CIE4QUO7.min.js} | 4 +- ...rdleyDiagram-YWT4CUSO-CIE4QUO7.min.js.map} | 0 ...> xychartDiagram-2RQKCTM6-IJU5S7TR.min.js} | 4 +- ...chartDiagram-2RQKCTM6-IJU5S7TR.min.js.map} | 0 99 files changed, 381 insertions(+), 381 deletions(-) rename templates/tabulareditor/public/{architectureDiagram-3BPJPVTR-R6CHV6J7.min.js => architectureDiagram-3BPJPVTR-OLGG2C47.min.js} (99%) rename templates/tabulareditor/public/{architectureDiagram-3BPJPVTR-R6CHV6J7.min.js.map => architectureDiagram-3BPJPVTR-OLGG2C47.min.js.map} (100%) rename templates/tabulareditor/public/{blockDiagram-GPEHLZMM-LC63GRO2.min.js => blockDiagram-GPEHLZMM-3OKIGOBQ.min.js} (99%) rename templates/tabulareditor/public/{blockDiagram-GPEHLZMM-LC63GRO2.min.js.map => blockDiagram-GPEHLZMM-3OKIGOBQ.min.js.map} (100%) rename templates/tabulareditor/public/{c4Diagram-AAUBKEIU-XUDUJAA2.min.js => c4Diagram-AAUBKEIU-RCWASNEG.min.js} (99%) rename templates/tabulareditor/public/{c4Diagram-AAUBKEIU-XUDUJAA2.min.js.map => c4Diagram-AAUBKEIU-RCWASNEG.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-FE5ZIIEJ.min.js => chunk-35PJYFUZ.min.js} (94%) rename templates/tabulareditor/public/{chunk-FE5ZIIEJ.min.js.map => chunk-35PJYFUZ.min.js.map} (100%) delete mode 100644 templates/tabulareditor/public/chunk-7PRAVCJT.min.js.map rename templates/tabulareditor/public/{chunk-FU2EUEZL.min.js => chunk-BAYE47ZU.min.js} (99%) rename templates/tabulareditor/public/{chunk-FU2EUEZL.min.js.map => chunk-BAYE47ZU.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-IXKFR5M2.min.js => chunk-BSOUP4V7.min.js} (99%) rename templates/tabulareditor/public/{chunk-IXKFR5M2.min.js.map => chunk-BSOUP4V7.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-WEUFLJCQ.min.js => chunk-E2QUWX3Y.min.js} (80%) rename templates/tabulareditor/public/{chunk-WEUFLJCQ.min.js.map => chunk-E2QUWX3Y.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-F37HX2WT.min.js => chunk-EUHHC2DS.min.js} (99%) rename templates/tabulareditor/public/{chunk-F37HX2WT.min.js.map => chunk-EUHHC2DS.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-C5SK55CT.min.js => chunk-KBTCHML7.min.js} (66%) rename templates/tabulareditor/public/{chunk-C5SK55CT.min.js.map => chunk-KBTCHML7.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-L3PWVFHQ.min.js => chunk-LUSFEUM7.min.js} (84%) rename templates/tabulareditor/public/{chunk-L3PWVFHQ.min.js.map => chunk-LUSFEUM7.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-JXIGGPPB.min.js => chunk-LW6SCGDZ.min.js} (98%) rename templates/tabulareditor/public/{chunk-JXIGGPPB.min.js.map => chunk-LW6SCGDZ.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-7PRAVCJT.min.js => chunk-OYCWXTBX.min.js} (76%) create mode 100644 templates/tabulareditor/public/chunk-OYCWXTBX.min.js.map rename templates/tabulareditor/public/{chunk-ELBPDDB4.min.js => chunk-R5KY77F3.min.js} (99%) rename templates/tabulareditor/public/{chunk-ELBPDDB4.min.js.map => chunk-R5KY77F3.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-ANPX43U5.min.js => chunk-RSHCK4XQ.min.js} (94%) rename templates/tabulareditor/public/{chunk-ANPX43U5.min.js.map => chunk-RSHCK4XQ.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-WNWVX3PL.min.js => chunk-STQM5NEZ.min.js} (99%) rename templates/tabulareditor/public/{chunk-WNWVX3PL.min.js.map => chunk-STQM5NEZ.min.js.map} (100%) rename templates/tabulareditor/public/{chunk-QD4STHJA.min.js => chunk-STULGUR3.min.js} (82%) rename templates/tabulareditor/public/{chunk-QD4STHJA.min.js.map => chunk-STULGUR3.min.js.map} (100%) create mode 100644 templates/tabulareditor/public/classDiagram-4FO5ZUOK-DQPI3RMH.min.js rename templates/tabulareditor/public/{classDiagram-4FO5ZUOK-HLERBCJ4.min.js.map => classDiagram-4FO5ZUOK-DQPI3RMH.min.js.map} (100%) delete mode 100644 templates/tabulareditor/public/classDiagram-4FO5ZUOK-HLERBCJ4.min.js delete mode 100644 templates/tabulareditor/public/classDiagram-v2-Q7XG4LA2-6636GVKU.min.js create mode 100644 templates/tabulareditor/public/classDiagram-v2-Q7XG4LA2-PXMWC4MS.min.js rename templates/tabulareditor/public/{classDiagram-v2-Q7XG4LA2-6636GVKU.min.js.map => classDiagram-v2-Q7XG4LA2-PXMWC4MS.min.js.map} (100%) rename templates/tabulareditor/public/{dagre-BM42HDAG-T24UZ7UM.min.js => dagre-BM42HDAG-YRRYDAWI.min.js} (95%) rename templates/tabulareditor/public/{dagre-BM42HDAG-T24UZ7UM.min.js.map => dagre-BM42HDAG-YRRYDAWI.min.js.map} (100%) rename templates/tabulareditor/public/{diagram-2AECGRRQ-OVQMD2ZW.min.js => diagram-2AECGRRQ-KEQBS5V5.min.js} (95%) rename templates/tabulareditor/public/{diagram-2AECGRRQ-OVQMD2ZW.min.js.map => diagram-2AECGRRQ-KEQBS5V5.min.js.map} (100%) rename templates/tabulareditor/public/{diagram-5GNKFQAL-SYKJIICX.min.js => diagram-5GNKFQAL-LLI6NUAT.min.js} (92%) rename templates/tabulareditor/public/{diagram-5GNKFQAL-SYKJIICX.min.js.map => diagram-5GNKFQAL-LLI6NUAT.min.js.map} (100%) rename templates/tabulareditor/public/{diagram-KO2AKTUF-67V64JXH.min.js => diagram-KO2AKTUF-SQQV2XYA.min.js} (98%) rename templates/tabulareditor/public/{diagram-KO2AKTUF-67V64JXH.min.js.map => diagram-KO2AKTUF-SQQV2XYA.min.js.map} (100%) rename templates/tabulareditor/public/{diagram-LMA3HP47-BEU7RNFX.min.js => diagram-LMA3HP47-K5X3SHWV.min.js} (93%) rename templates/tabulareditor/public/{diagram-LMA3HP47-BEU7RNFX.min.js.map => diagram-LMA3HP47-K5X3SHWV.min.js.map} (100%) rename templates/tabulareditor/public/{diagram-OG6HWLK6-7SJQZU6W.min.js => diagram-OG6HWLK6-6IXDQDO3.min.js} (96%) rename templates/tabulareditor/public/{diagram-OG6HWLK6-7SJQZU6W.min.js.map => diagram-OG6HWLK6-6IXDQDO3.min.js.map} (100%) rename templates/tabulareditor/public/{erDiagram-TEJ5UH35-4VQR4XDQ.min.js => erDiagram-TEJ5UH35-E3J5MK7E.min.js} (98%) rename templates/tabulareditor/public/{erDiagram-TEJ5UH35-4VQR4XDQ.min.js.map => erDiagram-TEJ5UH35-E3J5MK7E.min.js.map} (100%) rename templates/tabulareditor/public/{flowDiagram-I6XJVG4X-QK7UK2JR.min.js => flowDiagram-I6XJVG4X-XT5NVU2M.min.js} (99%) rename templates/tabulareditor/public/{flowDiagram-I6XJVG4X-QK7UK2JR.min.js.map => flowDiagram-I6XJVG4X-XT5NVU2M.min.js.map} (100%) rename templates/tabulareditor/public/{ganttDiagram-6RSMTGT7-LEEYTTRF.min.js => ganttDiagram-6RSMTGT7-XYXKMRH4.min.js} (99%) rename templates/tabulareditor/public/{ganttDiagram-6RSMTGT7-LEEYTTRF.min.js.map => ganttDiagram-6RSMTGT7-XYXKMRH4.min.js.map} (100%) rename templates/tabulareditor/public/{gitGraphDiagram-PVQCEYII-Q4MNVJNA.min.js => gitGraphDiagram-PVQCEYII-VKX7RXFI.min.js} (99%) rename templates/tabulareditor/public/{gitGraphDiagram-PVQCEYII-Q4MNVJNA.min.js.map => gitGraphDiagram-PVQCEYII-VKX7RXFI.min.js.map} (100%) rename templates/tabulareditor/public/{infoDiagram-5YYISTIA-3ACUZLKK.min.js => infoDiagram-5YYISTIA-LNGXWYHF.min.js} (82%) rename templates/tabulareditor/public/{infoDiagram-5YYISTIA-3ACUZLKK.min.js.map => infoDiagram-5YYISTIA-LNGXWYHF.min.js.map} (100%) rename templates/tabulareditor/public/{ishikawaDiagram-YF4QCWOH-ZDIBWQQ7.min.js => ishikawaDiagram-YF4QCWOH-WL7TIAXP.min.js} (98%) rename templates/tabulareditor/public/{ishikawaDiagram-YF4QCWOH-ZDIBWQQ7.min.js.map => ishikawaDiagram-YF4QCWOH-WL7TIAXP.min.js.map} (100%) rename templates/tabulareditor/public/{journeyDiagram-JHISSGLW-A2HCIDHM.min.js => journeyDiagram-JHISSGLW-W5ZAVMLQ.min.js} (99%) rename templates/tabulareditor/public/{journeyDiagram-JHISSGLW-A2HCIDHM.min.js.map => journeyDiagram-JHISSGLW-W5ZAVMLQ.min.js.map} (100%) rename templates/tabulareditor/public/{kanban-definition-UN3LZRKU-HUAJCAXC.min.js => kanban-definition-UN3LZRKU-X3ZEFO2B.min.js} (97%) rename templates/tabulareditor/public/{kanban-definition-UN3LZRKU-HUAJCAXC.min.js.map => kanban-definition-UN3LZRKU-X3ZEFO2B.min.js.map} (100%) delete mode 100644 templates/tabulareditor/public/katex-GDFLULNE.min.js delete mode 100644 templates/tabulareditor/public/katex-GDFLULNE.min.js.map create mode 100644 templates/tabulareditor/public/katex-YKMXVIXW.min.js create mode 100644 templates/tabulareditor/public/katex-YKMXVIXW.min.js.map rename templates/tabulareditor/public/{mermaid.core-6UIGISIE.min.js => mermaid.core-RYCBC6YV.min.js} (89%) rename templates/tabulareditor/public/{mermaid.core-6UIGISIE.min.js.map => mermaid.core-RYCBC6YV.min.js.map} (100%) rename templates/tabulareditor/public/{mindmap-definition-RKZ34NQL-4RGJ3ECU.min.js => mindmap-definition-RKZ34NQL-CZ3S6CUN.min.js} (97%) rename templates/tabulareditor/public/{mindmap-definition-RKZ34NQL-4RGJ3ECU.min.js.map => mindmap-definition-RKZ34NQL-CZ3S6CUN.min.js.map} (100%) rename templates/tabulareditor/public/{pieDiagram-4H26LBE5-ZLQT6OJD.min.js => pieDiagram-4H26LBE5-Y7RZCZRY.min.js} (94%) rename templates/tabulareditor/public/{pieDiagram-4H26LBE5-ZLQT6OJD.min.js.map => pieDiagram-4H26LBE5-Y7RZCZRY.min.js.map} (100%) rename templates/tabulareditor/public/{quadrantDiagram-W4KKPZXB-IQAIETB7.min.js => quadrantDiagram-W4KKPZXB-MG4SWTOH.min.js} (99%) rename templates/tabulareditor/public/{quadrantDiagram-W4KKPZXB-IQAIETB7.min.js.map => quadrantDiagram-W4KKPZXB-MG4SWTOH.min.js.map} (100%) rename templates/tabulareditor/public/{requirementDiagram-4Y6WPE33-JI54LDVT.min.js => requirementDiagram-4Y6WPE33-CBTOTNUO.min.js} (98%) rename templates/tabulareditor/public/{requirementDiagram-4Y6WPE33-JI54LDVT.min.js.map => requirementDiagram-4Y6WPE33-CBTOTNUO.min.js.map} (100%) rename templates/tabulareditor/public/{sankeyDiagram-5OEKKPKP-BMQQFXWT.min.js => sankeyDiagram-5OEKKPKP-FCKJS6UT.min.js} (99%) rename templates/tabulareditor/public/{sankeyDiagram-5OEKKPKP-BMQQFXWT.min.js.map => sankeyDiagram-5OEKKPKP-FCKJS6UT.min.js.map} (100%) rename templates/tabulareditor/public/{sequenceDiagram-3UESZ5HK-WC3O4YBU.min.js => sequenceDiagram-3UESZ5HK-NUHTEM4D.min.js} (99%) rename templates/tabulareditor/public/{sequenceDiagram-3UESZ5HK-WC3O4YBU.min.js.map => sequenceDiagram-3UESZ5HK-NUHTEM4D.min.js.map} (100%) rename templates/tabulareditor/public/{stateDiagram-AJRCARHV-CFQ6H5KG.min.js => stateDiagram-AJRCARHV-CDIB45FK.min.js} (94%) rename templates/tabulareditor/public/{stateDiagram-AJRCARHV-CFQ6H5KG.min.js.map => stateDiagram-AJRCARHV-CDIB45FK.min.js.map} (100%) create mode 100644 templates/tabulareditor/public/stateDiagram-v2-BHNVJYJU-OEB6SCVA.min.js rename templates/tabulareditor/public/{stateDiagram-v2-BHNVJYJU-PDN77SEH.min.js.map => stateDiagram-v2-BHNVJYJU-OEB6SCVA.min.js.map} (100%) delete mode 100644 templates/tabulareditor/public/stateDiagram-v2-BHNVJYJU-PDN77SEH.min.js rename templates/tabulareditor/public/{timeline-definition-PNZ67QCA-PD2EDFDD.min.js => timeline-definition-PNZ67QCA-KIKICTUT.min.js} (99%) rename templates/tabulareditor/public/{timeline-definition-PNZ67QCA-PD2EDFDD.min.js.map => timeline-definition-PNZ67QCA-KIKICTUT.min.js.map} (100%) rename templates/tabulareditor/public/{vennDiagram-CIIHVFJN-GEPMLYRS.min.js => vennDiagram-CIIHVFJN-4KBTSVZQ.min.js} (99%) rename templates/tabulareditor/public/{vennDiagram-CIIHVFJN-GEPMLYRS.min.js.map => vennDiagram-CIIHVFJN-4KBTSVZQ.min.js.map} (100%) rename templates/tabulareditor/public/{wardleyDiagram-YWT4CUSO-KHVI35ND.min.js => wardleyDiagram-YWT4CUSO-CIE4QUO7.min.js} (99%) rename templates/tabulareditor/public/{wardleyDiagram-YWT4CUSO-KHVI35ND.min.js.map => wardleyDiagram-YWT4CUSO-CIE4QUO7.min.js.map} (100%) rename templates/tabulareditor/public/{xychartDiagram-2RQKCTM6-A37RYHOM.min.js => xychartDiagram-2RQKCTM6-IJU5S7TR.min.js} (99%) rename templates/tabulareditor/public/{xychartDiagram-2RQKCTM6-A37RYHOM.min.js.map => xychartDiagram-2RQKCTM6-IJU5S7TR.min.js.map} (100%) diff --git a/templates/tabulareditor/public/architectureDiagram-3BPJPVTR-R6CHV6J7.min.js b/templates/tabulareditor/public/architectureDiagram-3BPJPVTR-OLGG2C47.min.js similarity index 99% rename from templates/tabulareditor/public/architectureDiagram-3BPJPVTR-R6CHV6J7.min.js rename to templates/tabulareditor/public/architectureDiagram-3BPJPVTR-OLGG2C47.min.js index 4ae7946ee..810bfa225 100644 --- a/templates/tabulareditor/public/architectureDiagram-3BPJPVTR-R6CHV6J7.min.js +++ b/templates/tabulareditor/public/architectureDiagram-3BPJPVTR-OLGG2C47.min.js @@ -1,4 +1,4 @@ -import{a as qe}from"./chunk-PPWLQFJD.min.js";import{a as ze}from"./chunk-C5SK55CT.min.js";import{a as Qe}from"./chunk-CCNPHFNE.min.js";import"./chunk-IJMU45IO.min.js";import"./chunk-HWCHFEAH.min.js";import"./chunk-OH5PAVPX.min.js";import"./chunk-RN42Y33E.min.js";import"./chunk-XNJBVM5Z.min.js";import"./chunk-Q5YIQYCF.min.js";import"./chunk-4HQ5XQBY.min.js";import"./chunk-X6TCRES7.min.js";import"./chunk-P3KXGIV7.min.js";import"./chunk-NE3GILF7.min.js";import"./chunk-25XGUDQ5.min.js";import{b as ke,c as Ze,d as he,f as le}from"./chunk-WNWVX3PL.min.js";import{a as me}from"./chunk-G3CW6HDB.min.js";import{o as Be,s as $e}from"./chunk-IXKFR5M2.min.js";import"./chunk-HCOLC5CQ.min.js";import{B as Se,H as Fe,P as be,T as Pe,U as Ge,V as Ue,W as Ye,X as Xe,Y as He,Z as We,_ as se,r as Re}from"./chunk-7PRAVCJT.min.js";import{b as ct,d as ye,j as Ve}from"./chunk-BJGJ3C53.min.js";import{a as pe,c as ur}from"./chunk-MY7PHHTQ.min.js";var Te=pe((re,Ee)=>{(function(w,N){typeof re=="object"&&typeof Ee=="object"?Ee.exports=N():typeof define=="function"&&define.amd?define([],N):typeof re=="object"?re.layoutBase=N():w.layoutBase=N()})(re,function(){return(function(E){var w={};function N(u){if(w[u])return w[u].exports;var l=w[u]={i:u,l:!1,exports:{}};return E[u].call(l.exports,l,l.exports,N),l.l=!0,l.exports}return N.m=E,N.c=w,N.i=function(u){return u},N.d=function(u,l,a){N.o(u,l)||Object.defineProperty(u,l,{configurable:!1,enumerable:!0,get:a})},N.n=function(u){var l=u&&u.__esModule?function(){return u.default}:function(){return u};return N.d(l,"a",l),l},N.o=function(u,l){return Object.prototype.hasOwnProperty.call(u,l)},N.p="",N(N.s=28)})([(function(E,w,N){"use strict";function u(){}u.QUALITY=1,u.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,u.DEFAULT_INCREMENTAL=!1,u.DEFAULT_ANIMATION_ON_LAYOUT=!0,u.DEFAULT_ANIMATION_DURING_LAYOUT=!1,u.DEFAULT_ANIMATION_PERIOD=50,u.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,u.DEFAULT_GRAPH_MARGIN=15,u.NODE_DIMENSIONS_INCLUDE_LABELS=!1,u.SIMPLE_NODE_SIZE=40,u.SIMPLE_NODE_HALF_SIZE=u.SIMPLE_NODE_SIZE/2,u.EMPTY_COMPOUND_NODE_SIZE=40,u.MIN_EDGE_LENGTH=1,u.WORLD_BOUNDARY=1e6,u.INITIAL_WORLD_BOUNDARY=u.WORLD_BOUNDARY/1e3,u.WORLD_CENTER_X=1200,u.WORLD_CENTER_Y=900,E.exports=u}),(function(E,w,N){"use strict";var u=N(2),l=N(8),a=N(9);function r(f,e,c){u.call(this,c),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=c,this.bendpoints=[],this.source=f,this.target=e}r.prototype=Object.create(u.prototype);for(var n in u)r[n]=u[n];r.prototype.getSource=function(){return this.source},r.prototype.getTarget=function(){return this.target},r.prototype.isInterGraph=function(){return this.isInterGraph},r.prototype.getLength=function(){return this.length},r.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},r.prototype.getBendpoints=function(){return this.bendpoints},r.prototype.getLca=function(){return this.lca},r.prototype.getSourceInLca=function(){return this.sourceInLca},r.prototype.getTargetInLca=function(){return this.targetInLca},r.prototype.getOtherEnd=function(f){if(this.source===f)return this.target;if(this.target===f)return this.source;throw"Node is not incident with this edge"},r.prototype.getOtherEndInGraph=function(f,e){for(var c=this.getOtherEnd(f),t=e.getGraphManager().getRoot();;){if(c.getOwner()==e)return c;if(c.getOwner()==t)break;c=c.getOwner().getParent()}return null},r.prototype.updateLength=function(){var f=new Array(4);this.isOverlapingSourceAndTarget=l.getIntersection(this.target.getRect(),this.source.getRect(),f),this.isOverlapingSourceAndTarget||(this.lengthX=f[0]-f[2],this.lengthY=f[1]-f[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},r.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},E.exports=r}),(function(E,w,N){"use strict";function u(l){this.vGraphObject=l}E.exports=u}),(function(E,w,N){"use strict";var u=N(2),l=N(10),a=N(13),r=N(0),n=N(16),f=N(5);function e(t,i,h,g){h==null&&g==null&&(g=i),u.call(this,g),t.graphManager!=null&&(t=t.graphManager),this.estimatedSize=l.MIN_VALUE,this.inclusionTreeDepth=l.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=t,h!=null&&i!=null?this.rect=new a(i.x,i.y,h.width,h.height):this.rect=new a}e.prototype=Object.create(u.prototype);for(var c in u)e[c]=u[c];e.prototype.getEdges=function(){return this.edges},e.prototype.getChild=function(){return this.child},e.prototype.getOwner=function(){return this.owner},e.prototype.getWidth=function(){return this.rect.width},e.prototype.setWidth=function(t){this.rect.width=t},e.prototype.getHeight=function(){return this.rect.height},e.prototype.setHeight=function(t){this.rect.height=t},e.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},e.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},e.prototype.getCenter=function(){return new f(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},e.prototype.getLocation=function(){return new f(this.rect.x,this.rect.y)},e.prototype.getRect=function(){return this.rect},e.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},e.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},e.prototype.setRect=function(t,i){this.rect.x=t.x,this.rect.y=t.y,this.rect.width=i.width,this.rect.height=i.height},e.prototype.setCenter=function(t,i){this.rect.x=t-this.rect.width/2,this.rect.y=i-this.rect.height/2},e.prototype.setLocation=function(t,i){this.rect.x=t,this.rect.y=i},e.prototype.moveBy=function(t,i){this.rect.x+=t,this.rect.y+=i},e.prototype.getEdgeListToNode=function(t){var i=[],h,g=this;return g.edges.forEach(function(s){if(s.target==t){if(s.source!=g)throw"Incorrect edge source!";i.push(s)}}),i},e.prototype.getEdgesBetween=function(t){var i=[],h,g=this;return g.edges.forEach(function(s){if(!(s.source==g||s.target==g))throw"Incorrect edge source and/or target";(s.target==t||s.source==t)&&i.push(s)}),i},e.prototype.getNeighborsList=function(){var t=new Set,i=this;return i.edges.forEach(function(h){if(h.source==i)t.add(h.target);else{if(h.target!=i)throw"Incorrect incidency!";t.add(h.source)}}),t},e.prototype.withChildren=function(){var t=new Set,i,h;if(t.add(this),this.child!=null)for(var g=this.child.getNodes(),s=0;si?(this.rect.x-=(this.labelWidth-i)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(i+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(h+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>h?(this.rect.y-=(this.labelHeight-h)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(h+this.labelHeight))}}},e.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==l.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},e.prototype.transform=function(t){var i=this.rect.x;i>r.WORLD_BOUNDARY?i=r.WORLD_BOUNDARY:i<-r.WORLD_BOUNDARY&&(i=-r.WORLD_BOUNDARY);var h=this.rect.y;h>r.WORLD_BOUNDARY?h=r.WORLD_BOUNDARY:h<-r.WORLD_BOUNDARY&&(h=-r.WORLD_BOUNDARY);var g=new f(i,h),s=t.inverseTransformPoint(g);this.setLocation(s.x,s.y)},e.prototype.getLeft=function(){return this.rect.x},e.prototype.getRight=function(){return this.rect.x+this.rect.width},e.prototype.getTop=function(){return this.rect.y},e.prototype.getBottom=function(){return this.rect.y+this.rect.height},e.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},E.exports=e}),(function(E,w,N){"use strict";var u=N(0);function l(){}for(var a in u)l[a]=u[a];l.MAX_ITERATIONS=2500,l.DEFAULT_EDGE_LENGTH=50,l.DEFAULT_SPRING_STRENGTH=.45,l.DEFAULT_REPULSION_STRENGTH=4500,l.DEFAULT_GRAVITY_STRENGTH=.4,l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,l.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,l.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,l.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,l.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,l.COOLING_ADAPTATION_FACTOR=.33,l.ADAPTATION_LOWER_NODE_LIMIT=1e3,l.ADAPTATION_UPPER_NODE_LIMIT=5e3,l.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,l.MAX_NODE_DISPLACEMENT=l.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,l.MIN_REPULSION_DIST=l.DEFAULT_EDGE_LENGTH/10,l.CONVERGENCE_CHECK_PERIOD=100,l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,l.MIN_EDGE_LENGTH=1,l.GRID_CALCULATION_CHECK_PERIOD=10,E.exports=l}),(function(E,w,N){"use strict";function u(l,a){l==null&&a==null?(this.x=0,this.y=0):(this.x=l,this.y=a)}u.prototype.getX=function(){return this.x},u.prototype.getY=function(){return this.y},u.prototype.setX=function(l){this.x=l},u.prototype.setY=function(l){this.y=l},u.prototype.getDifference=function(l){return new DimensionD(this.x-l.x,this.y-l.y)},u.prototype.getCopy=function(){return new u(this.x,this.y)},u.prototype.translate=function(l){return this.x+=l.width,this.y+=l.height,this},E.exports=u}),(function(E,w,N){"use strict";var u=N(2),l=N(10),a=N(0),r=N(7),n=N(3),f=N(1),e=N(13),c=N(12),t=N(11);function i(g,s,L){u.call(this,L),this.estimatedSize=l.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,s!=null&&s instanceof r?this.graphManager=s:s!=null&&s instanceof Layout&&(this.graphManager=s.graphManager)}i.prototype=Object.create(u.prototype);for(var h in u)i[h]=u[h];i.prototype.getNodes=function(){return this.nodes},i.prototype.getEdges=function(){return this.edges},i.prototype.getGraphManager=function(){return this.graphManager},i.prototype.getParent=function(){return this.parent},i.prototype.getLeft=function(){return this.left},i.prototype.getRight=function(){return this.right},i.prototype.getTop=function(){return this.top},i.prototype.getBottom=function(){return this.bottom},i.prototype.isConnected=function(){return this.isConnected},i.prototype.add=function(g,s,L){if(s==null&&L==null){var y=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(y)>-1)throw"Node already in graph!";return y.owner=this,this.getNodes().push(y),y}else{var p=g;if(!(this.getNodes().indexOf(s)>-1&&this.getNodes().indexOf(L)>-1))throw"Source or target not in graph!";if(!(s.owner==L.owner&&s.owner==this))throw"Both owners must be this graph!";return s.owner!=L.owner?null:(p.source=s,p.target=L,p.isInterGraph=!1,this.getEdges().push(p),s.edges.push(p),L!=s&&L.edges.push(p),p)}},i.prototype.remove=function(g){var s=g;if(g instanceof n){if(s==null)throw"Node is null!";if(!(s.owner!=null&&s.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var L=s.edges.slice(),y,p=L.length,C=0;C-1&&b>-1))throw"Source and/or target doesn't know this edge!";y.source.edges.splice(A,1),y.target!=y.source&&y.target.edges.splice(b,1);var R=y.source.owner.getEdges().indexOf(y);if(R==-1)throw"Not in owner's edge list!";y.source.owner.getEdges().splice(R,1)}},i.prototype.updateLeftTop=function(){for(var g=l.MAX_VALUE,s=l.MAX_VALUE,L,y,p,C=this.getNodes(),R=C.length,A=0;AL&&(g=L),s>y&&(s=y)}return g==l.MAX_VALUE?null:(C[0].getParent().paddingLeft!=null?p=C[0].getParent().paddingLeft:p=this.margin,this.left=s-p,this.top=g-p,new c(this.left,this.top))},i.prototype.updateBounds=function(g){for(var s=l.MAX_VALUE,L=-l.MAX_VALUE,y=l.MAX_VALUE,p=-l.MAX_VALUE,C,R,A,b,W,G=this.nodes,J=G.length,x=0;xC&&(s=C),LA&&(y=A),pC&&(s=C),LA&&(y=A),p=this.nodes.length){var J=0;L.forEach(function(x){x.owner==g&&J++}),J==this.nodes.length&&(this.isConnected=!0)}},E.exports=i}),(function(E,w,N){"use strict";var u,l=N(1);function a(r){u=N(6),this.layout=r,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var r=this.layout.newGraph(),n=this.layout.newNode(null),f=this.add(r,n);return this.setRootGraph(f),this.rootGraph},a.prototype.add=function(r,n,f,e,c){if(f==null&&e==null&&c==null){if(r==null)throw"Graph is null!";if(n==null)throw"Parent node is null!";if(this.graphs.indexOf(r)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(r),r.parent!=null)throw"Already has a parent!";if(n.child!=null)throw"Already has a child!";return r.parent=n,n.child=r,r}else{c=f,e=n,f=r;var t=e.getOwner(),i=c.getOwner();if(!(t!=null&&t.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(i!=null&&i.getGraphManager()==this))throw"Target not in this graph mgr!";if(t==i)return f.isInterGraph=!1,t.add(f,e,c);if(f.isInterGraph=!0,f.source=e,f.target=c,this.edges.indexOf(f)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(f),!(f.source!=null&&f.target!=null))throw"Edge source and/or target is null!";if(!(f.source.edges.indexOf(f)==-1&&f.target.edges.indexOf(f)==-1))throw"Edge already in source and/or target incidency list!";return f.source.edges.push(f),f.target.edges.push(f),f}},a.prototype.remove=function(r){if(r instanceof u){var n=r;if(n.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(n==this.rootGraph||n.parent!=null&&n.parent.graphManager==this))throw"Invalid parent node!";var f=[];f=f.concat(n.getEdges());for(var e,c=f.length,t=0;t=r.getRight()?n[0]+=Math.min(r.getX()-a.getX(),a.getRight()-r.getRight()):r.getX()<=a.getX()&&r.getRight()>=a.getRight()&&(n[0]+=Math.min(a.getX()-r.getX(),r.getRight()-a.getRight())),a.getY()<=r.getY()&&a.getBottom()>=r.getBottom()?n[1]+=Math.min(r.getY()-a.getY(),a.getBottom()-r.getBottom()):r.getY()<=a.getY()&&r.getBottom()>=a.getBottom()&&(n[1]+=Math.min(a.getY()-r.getY(),r.getBottom()-a.getBottom()));var c=Math.abs((r.getCenterY()-a.getCenterY())/(r.getCenterX()-a.getCenterX()));r.getCenterY()===a.getCenterY()&&r.getCenterX()===a.getCenterX()&&(c=1);var t=c*n[0],i=n[1]/c;n[0]t)return n[0]=f,n[1]=h,n[2]=c,n[3]=G,!1;if(ec)return n[0]=i,n[1]=e,n[2]=b,n[3]=t,!1;if(fc?(n[0]=s,n[1]=L,o=!0):(n[0]=g,n[1]=h,o=!0):d===v&&(f>c?(n[0]=i,n[1]=h,o=!0):(n[0]=y,n[1]=L,o=!0)),-T===v?c>f?(n[2]=W,n[3]=G,m=!0):(n[2]=b,n[3]=A,m=!0):T===v&&(c>f?(n[2]=R,n[3]=A,m=!0):(n[2]=J,n[3]=G,m=!0)),o&&m)return!1;if(f>c?e>t?(D=this.getCardinalDirection(d,v,4),O=this.getCardinalDirection(T,v,2)):(D=this.getCardinalDirection(-d,v,3),O=this.getCardinalDirection(-T,v,1)):e>t?(D=this.getCardinalDirection(-d,v,1),O=this.getCardinalDirection(-T,v,3)):(D=this.getCardinalDirection(d,v,2),O=this.getCardinalDirection(T,v,4)),!o)switch(D){case 1:S=h,P=f+-C/v,n[0]=P,n[1]=S;break;case 2:P=y,S=e+p*v,n[0]=P,n[1]=S;break;case 3:S=L,P=f+C/v,n[0]=P,n[1]=S;break;case 4:P=s,S=e+-p*v,n[0]=P,n[1]=S;break}if(!m)switch(O){case 1:Z=A,I=c+-z/v,n[2]=I,n[3]=Z;break;case 2:I=J,Z=t+x*v,n[2]=I,n[3]=Z;break;case 3:Z=G,I=c+z/v,n[2]=I,n[3]=Z;break;case 4:I=W,Z=t+-x*v,n[2]=I,n[3]=Z;break}}return!1},l.getCardinalDirection=function(a,r,n){return a>r?n:1+n%4},l.getIntersection=function(a,r,n,f){if(f==null)return this.getIntersection2(a,r,n);var e=a.x,c=a.y,t=r.x,i=r.y,h=n.x,g=n.y,s=f.x,L=f.y,y=void 0,p=void 0,C=void 0,R=void 0,A=void 0,b=void 0,W=void 0,G=void 0,J=void 0;return C=i-c,A=e-t,W=t*c-e*i,R=L-g,b=h-s,G=s*g-h*L,J=C*b-R*A,J===0?null:(y=(A*G-b*W)/J,p=(R*W-C*G)/J,new u(y,p))},l.angleOfVector=function(a,r,n,f){var e=void 0;return a!==n?(e=Math.atan((f-r)/(n-a)),n=0){var L=(-h+Math.sqrt(h*h-4*i*g))/(2*i),y=(-h-Math.sqrt(h*h-4*i*g))/(2*i),p=null;return L>=0&&L<=1?[L]:y>=0&&y<=1?[y]:p}else return null},l.HALF_PI=.5*Math.PI,l.ONE_AND_HALF_PI=1.5*Math.PI,l.TWO_PI=2*Math.PI,l.THREE_PI=3*Math.PI,E.exports=l}),(function(E,w,N){"use strict";function u(){}u.sign=function(l){return l>0?1:l<0?-1:0},u.floor=function(l){return l<0?Math.ceil(l):Math.floor(l)},u.ceil=function(l){return l<0?Math.floor(l):Math.ceil(l)},E.exports=u}),(function(E,w,N){"use strict";function u(){}u.MAX_VALUE=2147483647,u.MIN_VALUE=-2147483648,E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function e(c,t){for(var i=0;i"u"?"undefined":u(a);return a==null||r!="object"&&r!="function"},E.exports=l}),(function(E,w,N){"use strict";function u(h){if(Array.isArray(h)){for(var g=0,s=Array(h.length);g0&&g;){for(C.push(A[0]);C.length>0&&g;){var b=C[0];C.splice(0,1),p.add(b);for(var W=b.getEdges(),y=0;y-1&&A.splice(z,1)}p=new Set,R=new Map}}return h},i.prototype.createDummyNodesForBendpoints=function(h){for(var g=[],s=h.source,L=this.graphManager.calcLowestCommonAncestor(h.source,h.target),y=0;y0){for(var L=this.edgeToDummyNodes.get(s),y=0;y=0&&g.splice(G,1);var J=R.getNeighborsList();J.forEach(function(o){if(s.indexOf(o)<0){var m=L.get(o),d=m-1;d==1&&b.push(o),L.set(o,d)}})}s=s.concat(b),(g.length==1||g.length==2)&&(y=!0,p=g[0])}return p},i.prototype.setGraphManager=function(h){this.graphManager=h},E.exports=i}),(function(E,w,N){"use strict";function u(){}u.seed=1,u.x=0,u.nextDouble=function(){return u.x=Math.sin(u.seed++)*1e4,u.x-Math.floor(u.x)},E.exports=u}),(function(E,w,N){"use strict";var u=N(5);function l(a,r){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}l.prototype.getWorldOrgX=function(){return this.lworldOrgX},l.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},l.prototype.getWorldOrgY=function(){return this.lworldOrgY},l.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},l.prototype.getWorldExtX=function(){return this.lworldExtX},l.prototype.setWorldExtX=function(a){this.lworldExtX=a},l.prototype.getWorldExtY=function(){return this.lworldExtY},l.prototype.setWorldExtY=function(a){this.lworldExtY=a},l.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},l.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},l.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},l.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},l.prototype.getDeviceExtX=function(){return this.ldeviceExtX},l.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},l.prototype.getDeviceExtY=function(){return this.ldeviceExtY},l.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},l.prototype.transformX=function(a){var r=0,n=this.lworldExtX;return n!=0&&(r=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/n),r},l.prototype.transformY=function(a){var r=0,n=this.lworldExtY;return n!=0&&(r=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/n),r},l.prototype.inverseTransformX=function(a){var r=0,n=this.ldeviceExtX;return n!=0&&(r=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/n),r},l.prototype.inverseTransformY=function(a){var r=0,n=this.ldeviceExtY;return n!=0&&(r=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/n),r},l.prototype.inverseTransformPoint=function(a){var r=new u(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return r},E.exports=l}),(function(E,w,N){"use strict";function u(t){if(Array.isArray(t)){for(var i=0,h=Array(t.length);ia.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(t-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(t>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(t-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},e.prototype.calcSpringForces=function(){for(var t=this.getAllEdges(),i,h=0;h0&&arguments[0]!==void 0?arguments[0]:!0,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,h,g,s,L,y=this.getAllNodes(),p;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&t&&this.updateGrid(),p=new Set,h=0;hC||p>C)&&(t.gravitationForceX=-this.gravityConstant*s,t.gravitationForceY=-this.gravityConstant*L)):(C=i.getEstimatedSize()*this.compoundGravityRangeFactor,(y>C||p>C)&&(t.gravitationForceX=-this.gravityConstant*s*this.compoundGravityConstant,t.gravitationForceY=-this.gravityConstant*L*this.compoundGravityConstant))},e.prototype.isConverged=function(){var t,i=!1;return this.totalIterations>this.maxIterations/3&&(i=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),t=this.totalDisplacement=y.length||C>=y[0].length)){for(var R=0;Re}}]),n})();E.exports=r}),(function(E,w,N){"use strict";function u(){}u.svd=function(l){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=l.length,this.n=l[0].length;var a=Math.min(this.m,this.n);this.s=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(Math.min(this.m+1,this.n)),this.U=(function(Dt){var Nt=function $t(Rt){if(Rt.length==0)return 0;for(var Xt=[],zt=0;zt0;)Nt.push(0);return Nt})(this.n),n=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(this.m),f=!0,e=!0,c=Math.min(this.m-1,this.n),t=Math.max(0,Math.min(this.n-2,this.m)),i=0;i=0;v--)if(this.s[v]!==0){for(var D=v+1;D=0;F--){if((function(Dt,Nt){return Dt&&Nt})(F0;){var Q=void 0,Ut=void 0;for(Q=m-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(r[Q])<=St+Lt*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){r[Q]=0;break}if(Q===m-2)Ut=4;else{var Mt=void 0;for(Mt=m-1;Mt>=Q&&Mt!==Q;Mt--){var at=(Mt!==m?Math.abs(r[Mt]):0)+(Mt!==Q+1?Math.abs(r[Mt-1]):0);if(Math.abs(this.s[Mt])<=St+Lt*at){this.s[Mt]=0;break}}Mt===Q?Ut=3:Mt===m-1?Ut=1:(Ut=2,Q=Mt)}switch(Q++,Ut){case 1:{var et=r[m-2];r[m-2]=0;for(var pt=m-2;pt>=Q;pt--){var mt=u.hypot(this.s[pt],et),Ct=this.s[pt]/mt,Et=et/mt;if(this.s[pt]=mt,pt!==Q&&(et=-Et*r[pt-1],r[pt-1]=Ct*r[pt-1]),e)for(var Tt=0;Tt=this.s[Q+1]);){var lt=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=lt,e&&QMath.abs(a)?(r=a/l,r=Math.abs(l)*Math.sqrt(1+r*r)):a!=0?(r=l/a,r=Math.abs(a)*Math.sqrt(1+r*r)):r=0,r},E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function r(n,f){for(var e=0;e2&&arguments[2]!==void 0?arguments[2]:1,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,t=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;l(this,r),this.sequence1=n,this.sequence2=f,this.match_score=e,this.mismatch_penalty=c,this.gap_penalty=t,this.iMax=n.length+1,this.jMax=f.length+1,this.grid=new Array(this.iMax);for(var i=0;i=0;n--){var f=this.listeners[n];f.event===a&&f.callback===r&&this.listeners.splice(n,1)}},l.emit=function(a,r){for(var n=0;n{(function(w,N){typeof ie=="object"&&typeof Ne=="object"?Ne.exports=N(Te()):typeof define=="function"&&define.amd?define(["layout-base"],N):typeof ie=="object"?ie.coseBase=N(Te()):w.coseBase=N(w.layoutBase)})(ie,function(E){return(()=>{"use strict";var w={45:((a,r,n)=>{var f={};f.layoutBase=n(551),f.CoSEConstants=n(806),f.CoSEEdge=n(767),f.CoSEGraph=n(880),f.CoSEGraphManager=n(578),f.CoSELayout=n(765),f.CoSENode=n(991),f.ConstraintHandler=n(902),a.exports=f}),806:((a,r,n)=>{var f=n(551).FDLayoutConstants;function e(){}for(var c in f)e[c]=f[c];e.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,e.DEFAULT_RADIAL_SEPARATION=f.DEFAULT_EDGE_LENGTH,e.DEFAULT_COMPONENT_SEPERATION=60,e.TILE=!0,e.TILING_PADDING_VERTICAL=10,e.TILING_PADDING_HORIZONTAL=10,e.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,e.ENFORCE_CONSTRAINTS=!0,e.APPLY_LAYOUT=!0,e.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,e.TREE_REDUCTION_ON_INCREMENTAL=!0,e.PURE_INCREMENTAL=e.DEFAULT_INCREMENTAL,a.exports=e}),767:((a,r,n)=>{var f=n(551).FDLayoutEdge;function e(t,i,h){f.call(this,t,i,h)}e.prototype=Object.create(f.prototype);for(var c in f)e[c]=f[c];a.exports=e}),880:((a,r,n)=>{var f=n(551).LGraph;function e(t,i,h){f.call(this,t,i,h)}e.prototype=Object.create(f.prototype);for(var c in f)e[c]=f[c];a.exports=e}),578:((a,r,n)=>{var f=n(551).LGraphManager;function e(t){f.call(this,t)}e.prototype=Object.create(f.prototype);for(var c in f)e[c]=f[c];a.exports=e}),765:((a,r,n)=>{var f=n(551).FDLayout,e=n(578),c=n(880),t=n(991),i=n(767),h=n(806),g=n(902),s=n(551).FDLayoutConstants,L=n(551).LayoutConstants,y=n(551).Point,p=n(551).PointD,C=n(551).DimensionD,R=n(551).Layout,A=n(551).Integer,b=n(551).IGeometry,W=n(551).LGraph,G=n(551).Transform,J=n(551).LinkedList;function x(){f.call(this),this.toBeTiled={},this.constraints={}}x.prototype=Object.create(f.prototype);for(var z in f)x[z]=f[z];x.prototype.newGraphManager=function(){var o=new e(this);return this.graphManager=o,o},x.prototype.newGraph=function(o){return new c(null,this.graphManager,o)},x.prototype.newNode=function(o){return new t(this.graphManager,o)},x.prototype.newEdge=function(o){return new i(null,null,o)},x.prototype.initParameters=function(){f.prototype.initParameters.call(this,arguments),this.isSubLayout||(h.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=h.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=h.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=s.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=s.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=s.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},x.prototype.initSpringEmbedder=function(){f.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/s.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},x.prototype.layout=function(){var o=L.DEFAULT_CREATE_BENDS_AS_NEEDED;return o&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},x.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(h.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),d=this.nodesWithGravity.filter(function(D){return m.has(D)});this.graphManager.setAllNodesToApplyGravitation(d)}}else{var o=this.getFlatForest();if(o.length>0)this.positionNodesRadially(o);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),d=this.nodesWithGravity.filter(function(T){return m.has(T)});this.graphManager.setAllNodesToApplyGravitation(d),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},x.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%s.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var o=new Set(this.getAllNodes()),m=this.nodesWithGravity.filter(function(v){return o.has(v)});this.graphManager.setAllNodesToApplyGravitation(m),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),h.PURE_INCREMENTAL?this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var d=!this.isTreeGrowing&&!this.isGrowthFinished,T=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(d,T),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},x.prototype.getPositionsData=function(){for(var o=this.graphManager.getAllNodes(),m={},d=0;d0&&this.updateDisplacements();for(var d=0;d0&&(T.fixedNodeWeight=D)}}if(this.constraints.relativePlacementConstraint){var O=new Map,P=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(M){o.fixedNodesOnHorizontal.add(M),o.fixedNodesOnVertical.add(M)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var S=this.constraints.alignmentConstraint.vertical,d=0;d=2*M.length/3;K--)Y=Math.floor(Math.random()*(K+1)),X=M[K],M[K]=M[Y],M[Y]=X;return M},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var Y=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;o.nodesInRelativeHorizontal.includes(Y)||(o.nodesInRelativeHorizontal.push(Y),o.nodeToRelativeConstraintMapHorizontal.set(Y,[]),o.dummyToNodeForVerticalAlignment.has(Y)?o.nodeToTempPositionMapHorizontal.set(Y,o.idToNodeMap.get(o.dummyToNodeForVerticalAlignment.get(Y)[0]).getCenterX()):o.nodeToTempPositionMapHorizontal.set(Y,o.idToNodeMap.get(Y).getCenterX())),o.nodesInRelativeHorizontal.includes(X)||(o.nodesInRelativeHorizontal.push(X),o.nodeToRelativeConstraintMapHorizontal.set(X,[]),o.dummyToNodeForVerticalAlignment.has(X)?o.nodeToTempPositionMapHorizontal.set(X,o.idToNodeMap.get(o.dummyToNodeForVerticalAlignment.get(X)[0]).getCenterX()):o.nodeToTempPositionMapHorizontal.set(X,o.idToNodeMap.get(X).getCenterX())),o.nodeToRelativeConstraintMapHorizontal.get(Y).push({right:X,gap:M.gap}),o.nodeToRelativeConstraintMapHorizontal.get(X).push({left:Y,gap:M.gap})}else{var K=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;o.nodesInRelativeVertical.includes(K)||(o.nodesInRelativeVertical.push(K),o.nodeToRelativeConstraintMapVertical.set(K,[]),o.dummyToNodeForHorizontalAlignment.has(K)?o.nodeToTempPositionMapVertical.set(K,o.idToNodeMap.get(o.dummyToNodeForHorizontalAlignment.get(K)[0]).getCenterY()):o.nodeToTempPositionMapVertical.set(K,o.idToNodeMap.get(K).getCenterY())),o.nodesInRelativeVertical.includes(st)||(o.nodesInRelativeVertical.push(st),o.nodeToRelativeConstraintMapVertical.set(st,[]),o.dummyToNodeForHorizontalAlignment.has(st)?o.nodeToTempPositionMapVertical.set(st,o.idToNodeMap.get(o.dummyToNodeForHorizontalAlignment.get(st)[0]).getCenterY()):o.nodeToTempPositionMapVertical.set(st,o.idToNodeMap.get(st).getCenterY())),o.nodeToRelativeConstraintMapVertical.get(K).push({bottom:st,gap:M.gap}),o.nodeToRelativeConstraintMapVertical.get(st).push({top:K,gap:M.gap})}});else{var Z=new Map,tt=new Map;this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var Y=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;Z.has(Y)?Z.get(Y).push(X):Z.set(Y,[X]),Z.has(X)?Z.get(X).push(Y):Z.set(X,[Y])}else{var K=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;tt.has(K)?tt.get(K).push(st):tt.set(K,[st]),tt.has(st)?tt.get(st).push(K):tt.set(st,[K])}});var F=function(Y,X){var K=[],st=[],Lt=new J,St=new Set,Q=0;return Y.forEach(function(Ut,Mt){if(!St.has(Mt)){K[Q]=[],st[Q]=!1;var at=Mt;for(Lt.push(at),St.add(at),K[Q].push(at);Lt.length!=0;){at=Lt.shift(),X.has(at)&&(st[Q]=!0);var et=Y.get(at);et.forEach(function(pt){St.has(pt)||(Lt.push(pt),St.add(pt),K[Q].push(pt))})}Q++}}),{components:K,isFixed:st}},_=F(Z,o.fixedNodesOnHorizontal);this.componentsOnHorizontal=_.components,this.fixedComponentsOnHorizontal=_.isFixed;var B=F(tt,o.fixedNodesOnVertical);this.componentsOnVertical=B.components,this.fixedComponentsOnVertical=B.isFixed}}},x.prototype.updateDisplacements=function(){var o=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(B){var M=o.idToNodeMap.get(B.nodeId);M.displacementX=0,M.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var m=this.constraints.alignmentConstraint.vertical,d=0;d1){var P;for(P=0;PT&&(T=Math.floor(O.y)),D=Math.floor(O.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new p(L.WORLD_CENTER_X-O.x/2,L.WORLD_CENTER_Y-O.y/2))},x.radialLayout=function(o,m,d){var T=Math.max(this.maxDiagonalInTree(o),h.DEFAULT_RADIAL_SEPARATION);x.branchRadialLayout(m,null,0,359,0,T);var v=W.calculateBounds(o),D=new G;D.setDeviceOrgX(v.getMinX()),D.setDeviceOrgY(v.getMinY()),D.setWorldOrgX(d.x),D.setWorldOrgY(d.y);for(var O=0;O1;){var K=X[0];X.splice(0,1);var st=F.indexOf(K);st>=0&&F.splice(st,1),M--,_--}m!=null?Y=(F.indexOf(X[0])+1)%M:Y=0;for(var Lt=Math.abs(T-d)/_,St=Y;B!=_;St=++St%M){var Q=F[St].getOtherEnd(o);if(Q!=m){var Ut=(d+B*Lt)%360,Mt=(Ut+Lt)%360;x.branchRadialLayout(Q,o,Ut,Mt,v+D,D),B++}}},x.maxDiagonalInTree=function(o){for(var m=A.MIN_VALUE,d=0;dm&&(m=v)}return m},x.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},x.prototype.groupZeroDegreeMembers=function(){var o=this,m={};this.memberGroups={},this.idToDummyNode={};for(var d=[],T=this.graphManager.getAllNodes(),v=0;v"u"&&(m[P]=[]),m[P]=m[P].concat(D)}Object.keys(m).forEach(function(S){if(m[S].length>1){var I="DummyCompound_"+S;o.memberGroups[I]=m[S];var Z=m[S][0].getParent(),tt=new t(o.graphManager);tt.id=I,tt.paddingLeft=Z.paddingLeft||0,tt.paddingRight=Z.paddingRight||0,tt.paddingBottom=Z.paddingBottom||0,tt.paddingTop=Z.paddingTop||0,o.idToDummyNode[I]=tt;var F=o.getGraphManager().add(o.newGraph(),tt),_=Z.getChild();_.add(tt);for(var B=0;Bv?(T.rect.x-=(T.labelWidth-v)/2,T.setWidth(T.labelWidth),T.labelMarginLeft=(T.labelWidth-v)/2):T.labelPosHorizontal=="right"&&T.setWidth(v+T.labelWidth)),T.labelHeight&&(T.labelPosVertical=="top"?(T.rect.y-=T.labelHeight,T.setHeight(D+T.labelHeight),T.labelMarginTop=T.labelHeight):T.labelPosVertical=="center"&&T.labelHeight>D?(T.rect.y-=(T.labelHeight-D)/2,T.setHeight(T.labelHeight),T.labelMarginTop=(T.labelHeight-D)/2):T.labelPosVertical=="bottom"&&T.setHeight(D+T.labelHeight))}})},x.prototype.repopulateCompounds=function(){for(var o=this.compoundOrder.length-1;o>=0;o--){var m=this.compoundOrder[o],d=m.id,T=m.paddingLeft,v=m.paddingTop,D=m.labelMarginLeft,O=m.labelMarginTop;this.adjustLocations(this.tiledMemberPack[d],m.rect.x,m.rect.y,T,v,D,O)}},x.prototype.repopulateZeroDegreeMembers=function(){var o=this,m=this.tiledZeroDegreePack;Object.keys(m).forEach(function(d){var T=o.idToDummyNode[d],v=T.paddingLeft,D=T.paddingTop,O=T.labelMarginLeft,P=T.labelMarginTop;o.adjustLocations(m[d],T.rect.x,T.rect.y,v,D,O,P)})},x.prototype.getToBeTiled=function(o){var m=o.id;if(this.toBeTiled[m]!=null)return this.toBeTiled[m];var d=o.getChild();if(d==null)return this.toBeTiled[m]=!1,!1;for(var T=d.getNodes(),v=0;v0)return this.toBeTiled[m]=!1,!1;if(D.getChild()==null){this.toBeTiled[D.id]=!1;continue}if(!this.getToBeTiled(D))return this.toBeTiled[m]=!1,!1}return this.toBeTiled[m]=!0,!0},x.prototype.getNodeDegree=function(o){for(var m=o.id,d=o.getEdges(),T=0,v=0;vZ&&(Z=F.rect.height)}d+=Z+o.verticalPadding}},x.prototype.tileCompoundMembers=function(o,m){var d=this;this.tiledMemberPack=[],Object.keys(o).forEach(function(T){var v=m[T];if(d.tiledMemberPack[T]=d.tileNodes(o[T],v.paddingLeft+v.paddingRight),v.rect.width=d.tiledMemberPack[T].width,v.rect.height=d.tiledMemberPack[T].height,v.setCenter(d.tiledMemberPack[T].centerX,d.tiledMemberPack[T].centerY),v.labelMarginLeft=0,v.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var D=v.rect.width,O=v.rect.height;v.labelWidth&&(v.labelPosHorizontal=="left"?(v.rect.x-=v.labelWidth,v.setWidth(D+v.labelWidth),v.labelMarginLeft=v.labelWidth):v.labelPosHorizontal=="center"&&v.labelWidth>D?(v.rect.x-=(v.labelWidth-D)/2,v.setWidth(v.labelWidth),v.labelMarginLeft=(v.labelWidth-D)/2):v.labelPosHorizontal=="right"&&v.setWidth(D+v.labelWidth)),v.labelHeight&&(v.labelPosVertical=="top"?(v.rect.y-=v.labelHeight,v.setHeight(O+v.labelHeight),v.labelMarginTop=v.labelHeight):v.labelPosVertical=="center"&&v.labelHeight>O?(v.rect.y-=(v.labelHeight-O)/2,v.setHeight(v.labelHeight),v.labelMarginTop=(v.labelHeight-O)/2):v.labelPosVertical=="bottom"&&v.setHeight(O+v.labelHeight))}})},x.prototype.tileNodes=function(o,m){var d=this.tileNodesByFavoringDim(o,m,!0),T=this.tileNodesByFavoringDim(o,m,!1),v=this.getOrgRatio(d),D=this.getOrgRatio(T),O;return DP&&(P=B.getWidth())});var S=D/v,I=O/v,Z=Math.pow(d-T,2)+4*(S+T)*(I+d)*v,tt=(T-d+Math.sqrt(Z))/(2*(S+T)),F;m?(F=Math.ceil(tt),F==tt&&F++):F=Math.floor(tt);var _=F*(S+T)-T;return P>_&&(_=P),_+=T*2,_},x.prototype.tileNodesByFavoringDim=function(o,m,d){var T=h.TILING_PADDING_VERTICAL,v=h.TILING_PADDING_HORIZONTAL,D=h.TILING_COMPARE_BY,O={rows:[],rowWidth:[],rowHeight:[],width:0,height:m,verticalPadding:T,horizontalPadding:v,centerX:0,centerY:0};D&&(O.idealRowWidth=this.calcIdealRowWidth(o,d));var P=function(M){return M.rect.width*M.rect.height},S=function(M,Y){return P(Y)-P(M)};o.sort(function(B,M){var Y=S;return O.idealRowWidth?(Y=D,Y(B.id,M.id)):Y(B,M)});for(var I=0,Z=0,tt=0;tt0&&(O+=o.horizontalPadding),o.rowWidth[d]=O,o.width0&&(P+=o.verticalPadding);var S=0;P>o.rowHeight[d]&&(S=o.rowHeight[d],o.rowHeight[d]=P,S=o.rowHeight[d]-S),o.height+=S,o.rows[d].push(m)},x.prototype.getShortestRowIndex=function(o){for(var m=-1,d=Number.MAX_VALUE,T=0;Td&&(m=T,d=o.rowWidth[T]);return m},x.prototype.canAddHorizontal=function(o,m,d){if(o.idealRowWidth){var T=o.rows.length-1,v=o.rowWidth[T];return v+m+o.horizontalPadding<=o.idealRowWidth}var D=this.getShortestRowIndex(o);if(D<0)return!0;var O=o.rowWidth[D];if(O+o.horizontalPadding+m<=o.width)return!0;var P=0;o.rowHeight[D]0&&(P=d+o.verticalPadding-o.rowHeight[D]);var S;o.width-O>=m+o.horizontalPadding?S=(o.height+P)/(O+m+o.horizontalPadding):S=(o.height+P)/o.width,P=d+o.verticalPadding;var I;return o.widthD&&m!=d){T.splice(-1,1),o.rows[d].push(v),o.rowWidth[m]=o.rowWidth[m]-D,o.rowWidth[d]=o.rowWidth[d]+D,o.width=o.rowWidth[instance.getLongestRowIndex(o)];for(var O=Number.MIN_VALUE,P=0;PO&&(O=T[P].height);m>0&&(O+=o.verticalPadding);var S=o.rowHeight[m]+o.rowHeight[d];o.rowHeight[m]=O,o.rowHeight[d]0)for(var _=v;_<=D;_++)F[0]+=this.grid[_][O-1].length+this.grid[_][O].length-1;if(D0)for(var _=O;_<=P;_++)F[3]+=this.grid[v-1][_].length+this.grid[v][_].length-1;for(var B=A.MAX_VALUE,M,Y,X=0;X{var f=n(551).FDLayoutNode,e=n(551).IMath;function c(i,h,g,s){f.call(this,i,h,g,s)}c.prototype=Object.create(f.prototype);for(var t in f)c[t]=f[t];c.prototype.calculateDisplacement=function(){var i=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=i.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=i.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=i.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=i.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>i.coolingFactor*i.maxNodeDisplacement&&(this.displacementX=i.coolingFactor*i.maxNodeDisplacement*e.sign(this.displacementX)),Math.abs(this.displacementY)>i.coolingFactor*i.maxNodeDisplacement&&(this.displacementY=i.coolingFactor*i.maxNodeDisplacement*e.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},c.prototype.propogateDisplacementToChildren=function(i,h){for(var g=this.getChild().getNodes(),s,L=0;L{function f(g){if(Array.isArray(g)){for(var s=0,L=Array(g.length);s0){var dt=0;it.forEach(function(lt){V=="horizontal"?(q.set(lt,y.has(lt)?p[y.get(lt)]:k.get(lt)),dt+=q.get(lt)):(q.set(lt,y.has(lt)?C[y.get(lt)]:k.get(lt)),dt+=q.get(lt))}),dt=dt/it.length,ot.forEach(function(lt){$.has(lt)||q.set(lt,dt)})}else{var nt=0;ot.forEach(function(lt){V=="horizontal"?nt+=y.has(lt)?p[y.get(lt)]:k.get(lt):nt+=y.has(lt)?C[y.get(lt)]:k.get(lt)}),nt=nt/ot.length,ot.forEach(function(lt){q.set(lt,nt)})}});for(var rt=function(){var it=gt.shift(),dt=H.get(it);dt.forEach(function(nt){if(q.get(nt.id)lt&&(lt=Xt),ztFt&&(Ft=zt)}}catch(_t){Vt=!0,Dt=_t}finally{try{!xt&&Nt.return&&Nt.return()}finally{if(Vt)throw Dt}}var ce=(dt+lt)/2-(nt+Ft)/2,qt=!0,Jt=!1,Kt=void 0;try{for(var Qt=ot[Symbol.iterator](),oe;!(qt=(oe=Qt.next()).done);qt=!0){var jt=oe.value;q.set(jt,q.get(jt)+ce)}}catch(_t){Jt=!0,Kt=_t}finally{try{!qt&&Qt.return&&Qt.return()}finally{if(Jt)throw Kt}}})}return q},z=function(H){var V=0,$=0,k=0,j=0;if(H.forEach(function(ht){ht.left?p[y.get(ht.left)]-p[y.get(ht.right)]>=0?V++:$++:C[y.get(ht.top)]-C[y.get(ht.bottom)]>=0?k++:j++}),V>$&&k>j)for(var ut=0;ut$)for(var ft=0;ftj)for(var q=0;q1)s.fixedNodeConstraint.forEach(function(U,H){T[H]=[U.position.x,U.position.y],v[H]=[p[y.get(U.nodeId)],C[y.get(U.nodeId)]]}),D=!0;else if(s.alignmentConstraint)(function(){var U=0;if(s.alignmentConstraint.vertical){for(var H=s.alignmentConstraint.vertical,V=function(q){var ht=new Set;H[q].forEach(function(vt){ht.add(vt)});var gt=new Set([].concat(f(ht)).filter(function(vt){return P.has(vt)})),rt=void 0;gt.size>0?rt=p[y.get(gt.values().next().value)]:rt=J(ht).x,H[q].forEach(function(vt){T[U]=[rt,C[y.get(vt)]],v[U]=[p[y.get(vt)],C[y.get(vt)]],U++})},$=0;$0?rt=p[y.get(gt.values().next().value)]:rt=J(ht).y,k[q].forEach(function(vt){T[U]=[p[y.get(vt)],rt],v[U]=[p[y.get(vt)],C[y.get(vt)]],U++})},ut=0;uttt&&(tt=Z[_].length,F=_);if(tt0){var Ct={x:0,y:0};s.fixedNodeConstraint.forEach(function(U,H){var V={x:p[y.get(U.nodeId)],y:C[y.get(U.nodeId)]},$=U.position,k=G($,V);Ct.x+=k.x,Ct.y+=k.y}),Ct.x/=s.fixedNodeConstraint.length,Ct.y/=s.fixedNodeConstraint.length,p.forEach(function(U,H){p[H]+=Ct.x}),C.forEach(function(U,H){C[H]+=Ct.y}),s.fixedNodeConstraint.forEach(function(U){p[y.get(U.nodeId)]=U.position.x,C[y.get(U.nodeId)]=U.position.y})}if(s.alignmentConstraint){if(s.alignmentConstraint.vertical)for(var Et=s.alignmentConstraint.vertical,Tt=function(H){var V=new Set;Et[H].forEach(function(j){V.add(j)});var $=new Set([].concat(f(V)).filter(function(j){return P.has(j)})),k=void 0;$.size>0?k=p[y.get($.values().next().value)]:k=J(V).x,V.forEach(function(j){P.has(j)||(p[y.get(j)]=k)})},Ot=0;Ot0?k=C[y.get($.values().next().value)]:k=J(V).y,V.forEach(function(j){P.has(j)||(C[y.get(j)]=k)})},Pt=0;Pt{a.exports=E})},N={};function u(a){var r=N[a];if(r!==void 0)return r.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var l=u(45);return l})()})});var Je=pe((ne,Ce)=>{(function(w,N){typeof ne=="object"&&typeof Ce=="object"?Ce.exports=N(Le()):typeof define=="function"&&define.amd?define(["cose-base"],N):typeof ne=="object"?ne.cytoscapeFcose=N(Le()):w.cytoscapeFcose=N(w.coseBase)})(ne,function(E){return(()=>{"use strict";var w={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(r){for(var n=arguments.length,f=Array(n>1?n-1:0),e=1;e{var f=(function(){function t(i,h){var g=[],s=!0,L=!1,y=void 0;try{for(var p=i[Symbol.iterator](),C;!(s=(C=p.next()).done)&&(g.push(C.value),!(h&&g.length===h));s=!0);}catch(R){L=!0,y=R}finally{try{!s&&p.return&&p.return()}finally{if(L)throw y}}return g}return function(i,h){if(Array.isArray(i))return i;if(Symbol.iterator in Object(i))return t(i,h);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),e=n(140).layoutBase.LinkedList,c={};c.getTopMostNodes=function(t){for(var i={},h=0;h0&&D.merge(I)});for(var O=0;O1){C=y[0],R=C.connectedEdges().length,y.forEach(function(v){v.connectedEdges().length0&&g.set("dummy"+(g.size+1),W),G},c.relocateComponent=function(t,i,h){if(!h.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;if(h.quality=="draft"){var p=!0,C=!1,R=void 0;try{for(var A=i.nodeIndexes[Symbol.iterator](),b;!(p=(b=A.next()).done);p=!0){var W=b.value,G=f(W,2),J=G[0],x=G[1],z=h.cy.getElementById(J);if(z){var o=z.boundingBox(),m=i.xCoords[x]-o.w/2,d=i.xCoords[x]+o.w/2,T=i.yCoords[x]-o.h/2,v=i.yCoords[x]+o.h/2;ms&&(s=d),Ty&&(y=v)}}}catch(I){C=!0,R=I}finally{try{!p&&A.return&&A.return()}finally{if(C)throw R}}var D=t.x-(s+g)/2,O=t.y-(y+L)/2;i.xCoords=i.xCoords.map(function(I){return I+D}),i.yCoords=i.yCoords.map(function(I){return I+O})}else{Object.keys(i).forEach(function(I){var Z=i[I],tt=Z.getRect().x,F=Z.getRect().x+Z.getRect().width,_=Z.getRect().y,B=Z.getRect().y+Z.getRect().height;tts&&(s=F),_y&&(y=B)});var P=t.x-(s+g)/2,S=t.y-(y+L)/2;Object.keys(i).forEach(function(I){var Z=i[I];Z.setCenter(Z.getCenterX()+P,Z.getCenterY()+S)})}}},c.calcBoundingBox=function(t,i,h,g){for(var s=Number.MAX_SAFE_INTEGER,L=Number.MIN_SAFE_INTEGER,y=Number.MAX_SAFE_INTEGER,p=Number.MIN_SAFE_INTEGER,C=void 0,R=void 0,A=void 0,b=void 0,W=t.descendants().not(":parent"),G=W.length,J=0;JC&&(s=C),LA&&(y=A),p{var f=n(548),e=n(140).CoSELayout,c=n(140).CoSENode,t=n(140).layoutBase.PointD,i=n(140).layoutBase.DimensionD,h=n(140).layoutBase.LayoutConstants,g=n(140).layoutBase.FDLayoutConstants,s=n(140).CoSEConstants,L=function(p,C){var R=p.cy,A=p.eles,b=A.nodes(),W=A.edges(),G=void 0,J=void 0,x=void 0,z={};p.randomize&&(G=C.nodeIndexes,J=C.xCoords,x=C.yCoords);var o=function(I){return typeof I=="function"},m=function(I,Z){return o(I)?I(Z):I},d=f.calcParentsWithoutChildren(R,A),T=function S(I,Z,tt,F){for(var _=Z.length,B=0;B<_;B++){var M=Z[B],Y=null;M.intersection(d).length==0&&(Y=M.children());var X=void 0,K=M.layoutDimensions({nodeDimensionsIncludeLabels:F.nodeDimensionsIncludeLabels});if(M.outerWidth()!=null&&M.outerHeight()!=null)if(F.randomize)if(!M.isParent())X=I.add(new c(tt.graphManager,new t(J[G.get(M.id())]-K.w/2,x[G.get(M.id())]-K.h/2),new i(parseFloat(K.w),parseFloat(K.h))));else{var st=f.calcBoundingBox(M,J,x,G);M.intersection(d).length==0?X=I.add(new c(tt.graphManager,new t(st.topLeftX,st.topLeftY),new i(st.width,st.height))):X=I.add(new c(tt.graphManager,new t(st.topLeftX,st.topLeftY),new i(parseFloat(K.w),parseFloat(K.h))))}else X=I.add(new c(tt.graphManager,new t(M.position("x")-K.w/2,M.position("y")-K.h/2),new i(parseFloat(K.w),parseFloat(K.h))));else X=I.add(new c(this.graphManager));if(X.id=M.data("id"),X.nodeRepulsion=m(F.nodeRepulsion,M),X.paddingLeft=parseInt(M.css("padding")),X.paddingTop=parseInt(M.css("padding")),X.paddingRight=parseInt(M.css("padding")),X.paddingBottom=parseInt(M.css("padding")),F.nodeDimensionsIncludeLabels&&(X.labelWidth=M.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).w,X.labelHeight=M.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).h,X.labelPosVertical=M.css("text-valign"),X.labelPosHorizontal=M.css("text-halign")),z[M.data("id")]=X,isNaN(X.rect.x)&&(X.rect.x=0),isNaN(X.rect.y)&&(X.rect.y=0),Y!=null&&Y.length>0){var Lt=void 0;Lt=tt.getGraphManager().add(tt.newGraph(),X),S(Lt,Y,tt,F)}}},v=function(I,Z,tt){for(var F=0,_=0,B=0;B0?s.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=F/_:o(p.idealEdgeLength)?s.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:s.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=p.idealEdgeLength,s.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,s.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},D=function(I,Z){Z.fixedNodeConstraint&&(I.constraints.fixedNodeConstraint=Z.fixedNodeConstraint),Z.alignmentConstraint&&(I.constraints.alignmentConstraint=Z.alignmentConstraint),Z.relativePlacementConstraint&&(I.constraints.relativePlacementConstraint=Z.relativePlacementConstraint)};p.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=p.nestingFactor),p.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=p.gravity),p.numIter!=null&&(s.MAX_ITERATIONS=g.MAX_ITERATIONS=p.numIter),p.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=p.gravityRange),p.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=p.gravityCompound),p.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=p.gravityRangeCompound),p.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=p.initialEnergyOnIncremental),p.tilingCompareBy!=null&&(s.TILING_COMPARE_BY=p.tilingCompareBy),p.quality=="proof"?h.QUALITY=2:h.QUALITY=0,s.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=p.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!p.randomize,s.ANIMATE=g.ANIMATE=h.ANIMATE=p.animate,s.TILE=p.tile,s.TILING_PADDING_VERTICAL=typeof p.tilingPaddingVertical=="function"?p.tilingPaddingVertical.call():p.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof p.tilingPaddingHorizontal=="function"?p.tilingPaddingHorizontal.call():p.tilingPaddingHorizontal,s.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,s.PURE_INCREMENTAL=!p.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=p.uniformNodeDimensions,p.step=="transformed"&&(s.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,s.ENFORCE_CONSTRAINTS=!1,s.APPLY_LAYOUT=!1),p.step=="enforced"&&(s.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,s.ENFORCE_CONSTRAINTS=!0,s.APPLY_LAYOUT=!1),p.step=="cose"&&(s.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,s.ENFORCE_CONSTRAINTS=!1,s.APPLY_LAYOUT=!0),p.step=="all"&&(p.randomize?s.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:s.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,s.ENFORCE_CONSTRAINTS=!0,s.APPLY_LAYOUT=!0),p.fixedNodeConstraint||p.alignmentConstraint||p.relativePlacementConstraint?s.TREE_REDUCTION_ON_INCREMENTAL=!1:s.TREE_REDUCTION_ON_INCREMENTAL=!0;var O=new e,P=O.newGraphManager();return T(P.addRoot(),f.getTopMostNodes(b),O,p),v(O,P,W),D(O,p),O.runLayout(),z};a.exports={coseLayout:L}}),212:((a,r,n)=>{var f=(function(){function p(C,R){for(var A=0;A0)if(v){var P=t.getTopMostNodes(A.eles.nodes());if(o=t.connectComponents(b,A.eles,P),o.forEach(function(at){var et=at.boundingBox();m.push({x:et.x1+et.w/2,y:et.y1+et.h/2})}),A.randomize&&o.forEach(function(at){A.eles=at,G.push(h(A))}),A.quality=="default"||A.quality=="proof"){var S=b.collection();if(A.tile){var I=new Map,Z=[],tt=[],F=0,_={nodeIndexes:I,xCoords:Z,yCoords:tt},B=[];if(o.forEach(function(at,et){at.edges().length==0&&(at.nodes().forEach(function(pt,mt){S.merge(at.nodes()[mt]),pt.isParent()||(_.nodeIndexes.set(at.nodes()[mt].id(),F++),_.xCoords.push(at.nodes()[0].position().x),_.yCoords.push(at.nodes()[0].position().y))}),B.push(et))}),S.length>1){var M=S.boundingBox();m.push({x:M.x1+M.w/2,y:M.y1+M.h/2}),o.push(S),G.push(_);for(var Y=B.length-1;Y>=0;Y--)o.splice(B[Y],1),G.splice(B[Y],1),m.splice(B[Y],1)}}o.forEach(function(at,et){A.eles=at,z.push(s(A,G[et])),t.relocateComponent(m[et],z[et],A)})}else o.forEach(function(at,et){t.relocateComponent(m[et],G[et],A)});var X=new Set;if(o.length>1){var K=[],st=W.filter(function(at){return at.css("display")=="none"});o.forEach(function(at,et){var pt=void 0;if(A.quality=="draft"&&(pt=G[et].nodeIndexes),at.nodes().not(st).length>0){var mt={};mt.edges=[],mt.nodes=[];var Ct=void 0;at.nodes().not(st).forEach(function(Et){if(A.quality=="draft")if(!Et.isParent())Ct=pt.get(Et.id()),mt.nodes.push({x:G[et].xCoords[Ct]-Et.boundingbox().w/2,y:G[et].yCoords[Ct]-Et.boundingbox().h/2,width:Et.boundingbox().w,height:Et.boundingbox().h});else{var Tt=t.calcBoundingBox(Et,G[et].xCoords,G[et].yCoords,pt);mt.nodes.push({x:Tt.topLeftX,y:Tt.topLeftY,width:Tt.width,height:Tt.height})}else z[et][Et.id()]&&mt.nodes.push({x:z[et][Et.id()].getLeft(),y:z[et][Et.id()].getTop(),width:z[et][Et.id()].getWidth(),height:z[et][Et.id()].getHeight()})}),at.edges().forEach(function(Et){var Tt=Et.source(),Ot=Et.target();if(Tt.css("display")!="none"&&Ot.css("display")!="none")if(A.quality=="draft"){var It=pt.get(Tt.id()),Wt=pt.get(Ot.id()),Pt=[],Yt=[];if(Tt.isParent()){var bt=t.calcBoundingBox(Tt,G[et].xCoords,G[et].yCoords,pt);Pt.push(bt.topLeftX+bt.width/2),Pt.push(bt.topLeftY+bt.height/2)}else Pt.push(G[et].xCoords[It]),Pt.push(G[et].yCoords[It]);if(Ot.isParent()){var U=t.calcBoundingBox(Ot,G[et].xCoords,G[et].yCoords,pt);Yt.push(U.topLeftX+U.width/2),Yt.push(U.topLeftY+U.height/2)}else Yt.push(G[et].xCoords[Wt]),Yt.push(G[et].yCoords[Wt]);mt.edges.push({startX:Pt[0],startY:Pt[1],endX:Yt[0],endY:Yt[1]})}else z[et][Tt.id()]&&z[et][Ot.id()]&&mt.edges.push({startX:z[et][Tt.id()].getCenterX(),startY:z[et][Tt.id()].getCenterY(),endX:z[et][Ot.id()].getCenterX(),endY:z[et][Ot.id()].getCenterY()})}),mt.nodes.length>0&&(K.push(mt),X.add(et))}});var Lt=T.packComponents(K,A.randomize).shifts;if(A.quality=="draft")G.forEach(function(at,et){var pt=at.xCoords.map(function(Ct){return Ct+Lt[et].dx}),mt=at.yCoords.map(function(Ct){return Ct+Lt[et].dy});at.xCoords=pt,at.yCoords=mt});else{var St=0;X.forEach(function(at){Object.keys(z[at]).forEach(function(et){var pt=z[at][et];pt.setCenter(pt.getCenterX()+Lt[St].dx,pt.getCenterY()+Lt[St].dy)}),St++})}}}else{var D=A.eles.boundingBox();if(m.push({x:D.x1+D.w/2,y:D.y1+D.h/2}),A.randomize){var O=h(A);G.push(O)}A.quality=="default"||A.quality=="proof"?(z.push(s(A,G[0])),t.relocateComponent(m[0],z[0],A)):t.relocateComponent(m[0],G[0],A)}var Q=function(et,pt){if(A.quality=="default"||A.quality=="proof"){typeof et=="number"&&(et=pt);var mt=void 0,Ct=void 0,Et=et.data("id");return z.forEach(function(Ot){Et in Ot&&(mt={x:Ot[Et].getRect().getCenterX(),y:Ot[Et].getRect().getCenterY()},Ct=Ot[Et])}),A.nodeDimensionsIncludeLabels&&(Ct.labelWidth&&(Ct.labelPosHorizontal=="left"?mt.x+=Ct.labelWidth/2:Ct.labelPosHorizontal=="right"&&(mt.x-=Ct.labelWidth/2)),Ct.labelHeight&&(Ct.labelPosVertical=="top"?mt.y+=Ct.labelHeight/2:Ct.labelPosVertical=="bottom"&&(mt.y-=Ct.labelHeight/2))),mt==null&&(mt={x:et.position("x"),y:et.position("y")}),{x:mt.x,y:mt.y}}else{var Tt=void 0;return G.forEach(function(Ot){var It=Ot.nodeIndexes.get(et.id());It!=null&&(Tt={x:Ot.xCoords[It],y:Ot.yCoords[It]})}),Tt==null&&(Tt={x:et.position("x"),y:et.position("y")}),{x:Tt.x,y:Tt.y}}};if(A.quality=="default"||A.quality=="proof"||A.randomize){var Ut=t.calcParentsWithoutChildren(b,W),Mt=W.filter(function(at){return at.css("display")=="none"});A.eles=W.not(Mt),W.nodes().not(":parent").not(Mt).layoutPositions(R,A,Q),Ut.length>0&&Ut.forEach(function(at){at.position(Q(at))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),p})();a.exports=y}),657:((a,r,n)=>{var f=n(548),e=n(140).layoutBase.Matrix,c=n(140).layoutBase.SVD,t=function(h){var g=h.cy,s=h.eles,L=s.nodes(),y=s.nodes(":parent"),p=new Map,C=new Map,R=new Map,A=[],b=[],W=[],G=[],J=[],x=[],z=[],o=[],m=void 0,d=void 0,T=1e8,v=1e-9,D=h.piTol,O=h.samplingType,P=h.nodeSeparation,S=void 0,I=function(){for(var V=0,$=0,k=!1;$=ut;){q=j[ut++];for(var ot=A[q],it=0;itrt&&(rt=J[nt],vt=nt)}return vt},tt=function(V){var $=void 0;if(V){$=Math.floor(Math.random()*d),m=$;for(var j=0;j=1)break;rt=gt}for(var ot=0;ot=1)break;rt=gt}for(var dt=0;dt0&&($.isParent()?A[V].push(R.get($.id())):A[V].push($.id()))})});var Ut=function(V){var $=C.get(V),k=void 0;p.get(V).forEach(function(j){g.getElementById(j).isParent()?k=R.get(j):k=j,A[$].push(k),A[C.get(k)].push(V)})},Mt=!0,at=!1,et=void 0;try{for(var pt=p.keys()[Symbol.iterator](),mt;!(Mt=(mt=pt.next()).done);Mt=!0){var Ct=mt.value;Ut(Ct)}}catch(H){at=!0,et=H}finally{try{!Mt&&pt.return&&pt.return()}finally{if(at)throw et}}d=C.size;var Et=void 0;if(d>2){S=d{var f=n(212),e=function(t){t&&t("layout","fcose",f)};typeof cytoscape<"u"&&e(cytoscape),a.exports=e}),140:(a=>{a.exports=E})},N={};function u(a){var r=N[a];if(r!==void 0)return r.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var l=u(579);return l})()})});var ir=ur(Je(),1);var Ke={L:"left",R:"right",T:"top",B:"bottom"},je={L:ct(E=>`${E},${E/2} 0,${E} 0,0`,"L"),R:ct(E=>`0,${E/2} ${E},0 ${E},${E}`,"R"),T:ct(E=>`0,0 ${E},0 ${E/2},${E}`,"T"),B:ct(E=>`${E/2},0 ${E},${E} 0,${E}`,"B")},fe={L:ct((E,w)=>E-w+2,"L"),R:ct((E,w)=>E-2,"R"),T:ct((E,w)=>E-w+2,"T"),B:ct((E,w)=>E-2,"B")},dr=ct(function(E){return Ht(E)?E==="L"?"R":"L":E==="T"?"B":"T"},"getOppositeArchitectureDirection"),_e=ct(function(E){let w=E;return w==="L"||w==="R"||w==="T"||w==="B"},"isArchitectureDirection"),Ht=ct(function(E){let w=E;return w==="L"||w==="R"},"isArchitectureDirectionX"),Zt=ct(function(E){let w=E;return w==="T"||w==="B"},"isArchitectureDirectionY"),we=ct(function(E,w){let N=Ht(E)&&Zt(w),u=Zt(E)&&Ht(w);return N||u},"isArchitectureDirectionXY"),vr=ct(function(E){let w=E[0],N=E[1],u=Ht(w)&&Zt(N),l=Zt(w)&&Ht(N);return u||l},"isArchitecturePairXY"),pr=ct(function(E){return E!=="LL"&&E!=="RR"&&E!=="TT"&&E!=="BB"},"isValidArchitectureDirectionPair"),Ae=ct(function(E,w){let N=`${E}${w}`;return pr(N)?N:void 0},"getArchitectureDirectionPair"),yr=ct(function([E,w],N){let u=N[0],l=N[1];return Ht(u)?Zt(l)?[E+(u==="L"?-1:1),w+(l==="T"?1:-1)]:[E+(u==="L"?-1:1),w]:Ht(l)?[E+(l==="L"?1:-1),w+(u==="T"?1:-1)]:[E,w+(u==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),mr=ct(function(E){return E==="LT"||E==="TL"?[1,1]:E==="BL"||E==="LB"?[1,-1]:E==="BR"||E==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),Er=ct(function(E,w){return we(E,w)?"bend":Ht(E)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),Tr=ct(function(E){return E.type==="service"},"isArchitectureService"),Nr=ct(function(E){return E.type==="junction"},"isArchitectureJunction"),tr=ct(E=>E.data(),"edgeData"),ee=ct(E=>E.data(),"nodeData"),Lr=Re.architecture,er=class{constructor(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.elements={},this.diagramId="",this.setAccTitle=Ge,this.getAccTitle=Ue,this.setDiagramTitle=He,this.getDiagramTitle=We,this.getAccDescription=Xe,this.setAccDescription=Ye,this.clear()}static{ct(this,"ArchitectureDB")}setDiagramId(E){this.diagramId=E}getDiagramId(){return this.diagramId}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},this.diagramId="",Pe()}addService({id:E,icon:w,in:N,title:u,iconText:l}){if(this.registeredIds[E]!==void 0)throw new Error(`The service id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The service [${E}] cannot be placed within itself`);if(this.registeredIds[N]===void 0)throw new Error(`The service [${E}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[N]==="node")throw new Error(`The service [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"service",icon:w,iconText:l,title:u,edges:[],in:N}}getServices(){return Object.values(this.nodes).filter(Tr)}addJunction({id:E,in:w}){if(this.registeredIds[E]!==void 0)throw new Error(`The junction id [${E}] is already in use by another ${this.registeredIds[E]}`);if(w!==void 0){if(E===w)throw new Error(`The junction [${E}] cannot be placed within itself`);if(this.registeredIds[w]===void 0)throw new Error(`The junction [${E}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[w]==="node")throw new Error(`The junction [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"junction",edges:[],in:w}}getJunctions(){return Object.values(this.nodes).filter(Nr)}getNodes(){return Object.values(this.nodes)}getNode(E){return this.nodes[E]??null}addGroup({id:E,icon:w,in:N,title:u}){if(this.registeredIds?.[E]!==void 0)throw new Error(`The group id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The group [${E}] cannot be placed within itself`);if(this.registeredIds?.[N]===void 0)throw new Error(`The group [${E}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[N]==="node")throw new Error(`The group [${E}]'s parent is not a group`)}this.registeredIds[E]="group",this.groups[E]={id:E,icon:w,title:u,in:N}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:E,rhsId:w,lhsDir:N,rhsDir:u,lhsInto:l,rhsInto:a,lhsGroup:r,rhsGroup:n,title:f}){if(!_e(N))throw new Error(`Invalid direction given for left hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(N)}`);if(!_e(u))throw new Error(`Invalid direction given for right hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(u)}`);if(this.nodes[E]===void 0&&this.groups[E]===void 0)throw new Error(`The left-hand id [${E}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[w]===void 0&&this.groups[w]===void 0)throw new Error(`The right-hand id [${w}] does not yet exist. Please create the service/group before declaring an edge to it.`);let e=this.nodes[E].in,c=this.nodes[w].in;if(r&&e&&c&&e==c)throw new Error(`The left-hand id [${E}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(n&&e&&c&&e==c)throw new Error(`The right-hand id [${w}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let t={lhsId:E,lhsDir:N,lhsInto:l,lhsGroup:r,rhsId:w,rhsDir:u,rhsInto:a,rhsGroup:n,title:f};this.edges.push(t),this.nodes[E]&&this.nodes[w]&&(this.nodes[E].edges.push(this.edges[this.edges.length-1]),this.nodes[w].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let E={},w=Object.entries(this.nodes).reduce((n,[f,e])=>(n[f]=e.edges.reduce((c,t)=>{let i=this.getNode(t.lhsId)?.in,h=this.getNode(t.rhsId)?.in;if(i&&h&&i!==h){let g=Er(t.lhsDir,t.rhsDir);g!=="bend"&&(E[i]??={},E[i][h]=g,E[h]??={},E[h][i]=g)}if(t.lhsId===f){let g=Ae(t.lhsDir,t.rhsDir);g&&(c[g]=t.rhsId)}else{let g=Ae(t.rhsDir,t.lhsDir);g&&(c[g]=t.lhsId)}return c},{}),n),{}),N=Object.keys(w)[0],u={[N]:1},l=Object.keys(w).reduce((n,f)=>f===N?n:{...n,[f]:1},{}),a=ct(n=>{let f={[n]:[0,0]},e=[n];for(;e.length>0;){let c=e.shift();if(c){u[c]=1,delete l[c];let t=w[c],[i,h]=f[c];Object.entries(t).forEach(([g,s])=>{u[s]||(f[s]=yr([i,h],g),e.push(s))})}}return f},"BFS"),r=[a(N)];for(;Object.keys(l).length>0;)r.push(a(Object.keys(l)[0]));this.dataStructures={adjList:w,spatialMaps:r,groupAlignments:E}}return this.dataStructures}setElementForId(E,w){this.elements[E]=w}getElementById(E){return this.elements[E]}getConfig(){return Be({...Lr,...Se().architecture})}getConfigField(E){return this.getConfig()[E]}},Cr=ct((E,w)=>{qe(E,w),E.groups.map(N=>w.addGroup(N)),E.services.map(N=>w.addService({...N,type:"service"})),E.junctions.map(N=>w.addJunction({...N,type:"junction"})),E.edges.map(N=>w.addEdge(N))},"populateDb"),rr={parser:{yy:void 0},parse:ct(async E=>{let w=await Qe("architecture",E);ye.debug(w);let N=rr.parser?.yy;if(!(N instanceof er))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Cr(w,N)},"parse")},Ar=ct(E=>` +import{a as qe}from"./chunk-PPWLQFJD.min.js";import{a as ze}from"./chunk-KBTCHML7.min.js";import{a as Qe}from"./chunk-CCNPHFNE.min.js";import"./chunk-IJMU45IO.min.js";import"./chunk-HWCHFEAH.min.js";import"./chunk-OH5PAVPX.min.js";import"./chunk-RN42Y33E.min.js";import"./chunk-XNJBVM5Z.min.js";import"./chunk-Q5YIQYCF.min.js";import"./chunk-4HQ5XQBY.min.js";import"./chunk-X6TCRES7.min.js";import"./chunk-P3KXGIV7.min.js";import"./chunk-NE3GILF7.min.js";import"./chunk-25XGUDQ5.min.js";import{b as ke,c as Ze,d as he,f as le}from"./chunk-STQM5NEZ.min.js";import{a as me}from"./chunk-G3CW6HDB.min.js";import{o as Be,s as $e}from"./chunk-BSOUP4V7.min.js";import"./chunk-HCOLC5CQ.min.js";import{B as Se,H as Fe,P as be,T as Pe,U as Ge,V as Ue,W as Ye,X as Xe,Y as He,Z as We,_ as se,r as Re}from"./chunk-OYCWXTBX.min.js";import{b as ct,d as ye,j as Ve}from"./chunk-BJGJ3C53.min.js";import{a as pe,c as ur}from"./chunk-MY7PHHTQ.min.js";var Te=pe((re,Ee)=>{(function(w,N){typeof re=="object"&&typeof Ee=="object"?Ee.exports=N():typeof define=="function"&&define.amd?define([],N):typeof re=="object"?re.layoutBase=N():w.layoutBase=N()})(re,function(){return(function(E){var w={};function N(u){if(w[u])return w[u].exports;var l=w[u]={i:u,l:!1,exports:{}};return E[u].call(l.exports,l,l.exports,N),l.l=!0,l.exports}return N.m=E,N.c=w,N.i=function(u){return u},N.d=function(u,l,a){N.o(u,l)||Object.defineProperty(u,l,{configurable:!1,enumerable:!0,get:a})},N.n=function(u){var l=u&&u.__esModule?function(){return u.default}:function(){return u};return N.d(l,"a",l),l},N.o=function(u,l){return Object.prototype.hasOwnProperty.call(u,l)},N.p="",N(N.s=28)})([(function(E,w,N){"use strict";function u(){}u.QUALITY=1,u.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,u.DEFAULT_INCREMENTAL=!1,u.DEFAULT_ANIMATION_ON_LAYOUT=!0,u.DEFAULT_ANIMATION_DURING_LAYOUT=!1,u.DEFAULT_ANIMATION_PERIOD=50,u.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,u.DEFAULT_GRAPH_MARGIN=15,u.NODE_DIMENSIONS_INCLUDE_LABELS=!1,u.SIMPLE_NODE_SIZE=40,u.SIMPLE_NODE_HALF_SIZE=u.SIMPLE_NODE_SIZE/2,u.EMPTY_COMPOUND_NODE_SIZE=40,u.MIN_EDGE_LENGTH=1,u.WORLD_BOUNDARY=1e6,u.INITIAL_WORLD_BOUNDARY=u.WORLD_BOUNDARY/1e3,u.WORLD_CENTER_X=1200,u.WORLD_CENTER_Y=900,E.exports=u}),(function(E,w,N){"use strict";var u=N(2),l=N(8),a=N(9);function r(f,e,c){u.call(this,c),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=c,this.bendpoints=[],this.source=f,this.target=e}r.prototype=Object.create(u.prototype);for(var n in u)r[n]=u[n];r.prototype.getSource=function(){return this.source},r.prototype.getTarget=function(){return this.target},r.prototype.isInterGraph=function(){return this.isInterGraph},r.prototype.getLength=function(){return this.length},r.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},r.prototype.getBendpoints=function(){return this.bendpoints},r.prototype.getLca=function(){return this.lca},r.prototype.getSourceInLca=function(){return this.sourceInLca},r.prototype.getTargetInLca=function(){return this.targetInLca},r.prototype.getOtherEnd=function(f){if(this.source===f)return this.target;if(this.target===f)return this.source;throw"Node is not incident with this edge"},r.prototype.getOtherEndInGraph=function(f,e){for(var c=this.getOtherEnd(f),t=e.getGraphManager().getRoot();;){if(c.getOwner()==e)return c;if(c.getOwner()==t)break;c=c.getOwner().getParent()}return null},r.prototype.updateLength=function(){var f=new Array(4);this.isOverlapingSourceAndTarget=l.getIntersection(this.target.getRect(),this.source.getRect(),f),this.isOverlapingSourceAndTarget||(this.lengthX=f[0]-f[2],this.lengthY=f[1]-f[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},r.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},E.exports=r}),(function(E,w,N){"use strict";function u(l){this.vGraphObject=l}E.exports=u}),(function(E,w,N){"use strict";var u=N(2),l=N(10),a=N(13),r=N(0),n=N(16),f=N(5);function e(t,i,h,g){h==null&&g==null&&(g=i),u.call(this,g),t.graphManager!=null&&(t=t.graphManager),this.estimatedSize=l.MIN_VALUE,this.inclusionTreeDepth=l.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=t,h!=null&&i!=null?this.rect=new a(i.x,i.y,h.width,h.height):this.rect=new a}e.prototype=Object.create(u.prototype);for(var c in u)e[c]=u[c];e.prototype.getEdges=function(){return this.edges},e.prototype.getChild=function(){return this.child},e.prototype.getOwner=function(){return this.owner},e.prototype.getWidth=function(){return this.rect.width},e.prototype.setWidth=function(t){this.rect.width=t},e.prototype.getHeight=function(){return this.rect.height},e.prototype.setHeight=function(t){this.rect.height=t},e.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},e.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},e.prototype.getCenter=function(){return new f(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},e.prototype.getLocation=function(){return new f(this.rect.x,this.rect.y)},e.prototype.getRect=function(){return this.rect},e.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},e.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},e.prototype.setRect=function(t,i){this.rect.x=t.x,this.rect.y=t.y,this.rect.width=i.width,this.rect.height=i.height},e.prototype.setCenter=function(t,i){this.rect.x=t-this.rect.width/2,this.rect.y=i-this.rect.height/2},e.prototype.setLocation=function(t,i){this.rect.x=t,this.rect.y=i},e.prototype.moveBy=function(t,i){this.rect.x+=t,this.rect.y+=i},e.prototype.getEdgeListToNode=function(t){var i=[],h,g=this;return g.edges.forEach(function(s){if(s.target==t){if(s.source!=g)throw"Incorrect edge source!";i.push(s)}}),i},e.prototype.getEdgesBetween=function(t){var i=[],h,g=this;return g.edges.forEach(function(s){if(!(s.source==g||s.target==g))throw"Incorrect edge source and/or target";(s.target==t||s.source==t)&&i.push(s)}),i},e.prototype.getNeighborsList=function(){var t=new Set,i=this;return i.edges.forEach(function(h){if(h.source==i)t.add(h.target);else{if(h.target!=i)throw"Incorrect incidency!";t.add(h.source)}}),t},e.prototype.withChildren=function(){var t=new Set,i,h;if(t.add(this),this.child!=null)for(var g=this.child.getNodes(),s=0;si?(this.rect.x-=(this.labelWidth-i)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(i+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(h+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>h?(this.rect.y-=(this.labelHeight-h)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(h+this.labelHeight))}}},e.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==l.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},e.prototype.transform=function(t){var i=this.rect.x;i>r.WORLD_BOUNDARY?i=r.WORLD_BOUNDARY:i<-r.WORLD_BOUNDARY&&(i=-r.WORLD_BOUNDARY);var h=this.rect.y;h>r.WORLD_BOUNDARY?h=r.WORLD_BOUNDARY:h<-r.WORLD_BOUNDARY&&(h=-r.WORLD_BOUNDARY);var g=new f(i,h),s=t.inverseTransformPoint(g);this.setLocation(s.x,s.y)},e.prototype.getLeft=function(){return this.rect.x},e.prototype.getRight=function(){return this.rect.x+this.rect.width},e.prototype.getTop=function(){return this.rect.y},e.prototype.getBottom=function(){return this.rect.y+this.rect.height},e.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},E.exports=e}),(function(E,w,N){"use strict";var u=N(0);function l(){}for(var a in u)l[a]=u[a];l.MAX_ITERATIONS=2500,l.DEFAULT_EDGE_LENGTH=50,l.DEFAULT_SPRING_STRENGTH=.45,l.DEFAULT_REPULSION_STRENGTH=4500,l.DEFAULT_GRAVITY_STRENGTH=.4,l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,l.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,l.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,l.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,l.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,l.COOLING_ADAPTATION_FACTOR=.33,l.ADAPTATION_LOWER_NODE_LIMIT=1e3,l.ADAPTATION_UPPER_NODE_LIMIT=5e3,l.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,l.MAX_NODE_DISPLACEMENT=l.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,l.MIN_REPULSION_DIST=l.DEFAULT_EDGE_LENGTH/10,l.CONVERGENCE_CHECK_PERIOD=100,l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,l.MIN_EDGE_LENGTH=1,l.GRID_CALCULATION_CHECK_PERIOD=10,E.exports=l}),(function(E,w,N){"use strict";function u(l,a){l==null&&a==null?(this.x=0,this.y=0):(this.x=l,this.y=a)}u.prototype.getX=function(){return this.x},u.prototype.getY=function(){return this.y},u.prototype.setX=function(l){this.x=l},u.prototype.setY=function(l){this.y=l},u.prototype.getDifference=function(l){return new DimensionD(this.x-l.x,this.y-l.y)},u.prototype.getCopy=function(){return new u(this.x,this.y)},u.prototype.translate=function(l){return this.x+=l.width,this.y+=l.height,this},E.exports=u}),(function(E,w,N){"use strict";var u=N(2),l=N(10),a=N(0),r=N(7),n=N(3),f=N(1),e=N(13),c=N(12),t=N(11);function i(g,s,L){u.call(this,L),this.estimatedSize=l.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,s!=null&&s instanceof r?this.graphManager=s:s!=null&&s instanceof Layout&&(this.graphManager=s.graphManager)}i.prototype=Object.create(u.prototype);for(var h in u)i[h]=u[h];i.prototype.getNodes=function(){return this.nodes},i.prototype.getEdges=function(){return this.edges},i.prototype.getGraphManager=function(){return this.graphManager},i.prototype.getParent=function(){return this.parent},i.prototype.getLeft=function(){return this.left},i.prototype.getRight=function(){return this.right},i.prototype.getTop=function(){return this.top},i.prototype.getBottom=function(){return this.bottom},i.prototype.isConnected=function(){return this.isConnected},i.prototype.add=function(g,s,L){if(s==null&&L==null){var y=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(y)>-1)throw"Node already in graph!";return y.owner=this,this.getNodes().push(y),y}else{var p=g;if(!(this.getNodes().indexOf(s)>-1&&this.getNodes().indexOf(L)>-1))throw"Source or target not in graph!";if(!(s.owner==L.owner&&s.owner==this))throw"Both owners must be this graph!";return s.owner!=L.owner?null:(p.source=s,p.target=L,p.isInterGraph=!1,this.getEdges().push(p),s.edges.push(p),L!=s&&L.edges.push(p),p)}},i.prototype.remove=function(g){var s=g;if(g instanceof n){if(s==null)throw"Node is null!";if(!(s.owner!=null&&s.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var L=s.edges.slice(),y,p=L.length,C=0;C-1&&b>-1))throw"Source and/or target doesn't know this edge!";y.source.edges.splice(A,1),y.target!=y.source&&y.target.edges.splice(b,1);var R=y.source.owner.getEdges().indexOf(y);if(R==-1)throw"Not in owner's edge list!";y.source.owner.getEdges().splice(R,1)}},i.prototype.updateLeftTop=function(){for(var g=l.MAX_VALUE,s=l.MAX_VALUE,L,y,p,C=this.getNodes(),R=C.length,A=0;AL&&(g=L),s>y&&(s=y)}return g==l.MAX_VALUE?null:(C[0].getParent().paddingLeft!=null?p=C[0].getParent().paddingLeft:p=this.margin,this.left=s-p,this.top=g-p,new c(this.left,this.top))},i.prototype.updateBounds=function(g){for(var s=l.MAX_VALUE,L=-l.MAX_VALUE,y=l.MAX_VALUE,p=-l.MAX_VALUE,C,R,A,b,W,G=this.nodes,J=G.length,x=0;xC&&(s=C),LA&&(y=A),pC&&(s=C),LA&&(y=A),p=this.nodes.length){var J=0;L.forEach(function(x){x.owner==g&&J++}),J==this.nodes.length&&(this.isConnected=!0)}},E.exports=i}),(function(E,w,N){"use strict";var u,l=N(1);function a(r){u=N(6),this.layout=r,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var r=this.layout.newGraph(),n=this.layout.newNode(null),f=this.add(r,n);return this.setRootGraph(f),this.rootGraph},a.prototype.add=function(r,n,f,e,c){if(f==null&&e==null&&c==null){if(r==null)throw"Graph is null!";if(n==null)throw"Parent node is null!";if(this.graphs.indexOf(r)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(r),r.parent!=null)throw"Already has a parent!";if(n.child!=null)throw"Already has a child!";return r.parent=n,n.child=r,r}else{c=f,e=n,f=r;var t=e.getOwner(),i=c.getOwner();if(!(t!=null&&t.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(i!=null&&i.getGraphManager()==this))throw"Target not in this graph mgr!";if(t==i)return f.isInterGraph=!1,t.add(f,e,c);if(f.isInterGraph=!0,f.source=e,f.target=c,this.edges.indexOf(f)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(f),!(f.source!=null&&f.target!=null))throw"Edge source and/or target is null!";if(!(f.source.edges.indexOf(f)==-1&&f.target.edges.indexOf(f)==-1))throw"Edge already in source and/or target incidency list!";return f.source.edges.push(f),f.target.edges.push(f),f}},a.prototype.remove=function(r){if(r instanceof u){var n=r;if(n.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(n==this.rootGraph||n.parent!=null&&n.parent.graphManager==this))throw"Invalid parent node!";var f=[];f=f.concat(n.getEdges());for(var e,c=f.length,t=0;t=r.getRight()?n[0]+=Math.min(r.getX()-a.getX(),a.getRight()-r.getRight()):r.getX()<=a.getX()&&r.getRight()>=a.getRight()&&(n[0]+=Math.min(a.getX()-r.getX(),r.getRight()-a.getRight())),a.getY()<=r.getY()&&a.getBottom()>=r.getBottom()?n[1]+=Math.min(r.getY()-a.getY(),a.getBottom()-r.getBottom()):r.getY()<=a.getY()&&r.getBottom()>=a.getBottom()&&(n[1]+=Math.min(a.getY()-r.getY(),r.getBottom()-a.getBottom()));var c=Math.abs((r.getCenterY()-a.getCenterY())/(r.getCenterX()-a.getCenterX()));r.getCenterY()===a.getCenterY()&&r.getCenterX()===a.getCenterX()&&(c=1);var t=c*n[0],i=n[1]/c;n[0]t)return n[0]=f,n[1]=h,n[2]=c,n[3]=G,!1;if(ec)return n[0]=i,n[1]=e,n[2]=b,n[3]=t,!1;if(fc?(n[0]=s,n[1]=L,o=!0):(n[0]=g,n[1]=h,o=!0):d===v&&(f>c?(n[0]=i,n[1]=h,o=!0):(n[0]=y,n[1]=L,o=!0)),-T===v?c>f?(n[2]=W,n[3]=G,m=!0):(n[2]=b,n[3]=A,m=!0):T===v&&(c>f?(n[2]=R,n[3]=A,m=!0):(n[2]=J,n[3]=G,m=!0)),o&&m)return!1;if(f>c?e>t?(D=this.getCardinalDirection(d,v,4),O=this.getCardinalDirection(T,v,2)):(D=this.getCardinalDirection(-d,v,3),O=this.getCardinalDirection(-T,v,1)):e>t?(D=this.getCardinalDirection(-d,v,1),O=this.getCardinalDirection(-T,v,3)):(D=this.getCardinalDirection(d,v,2),O=this.getCardinalDirection(T,v,4)),!o)switch(D){case 1:S=h,P=f+-C/v,n[0]=P,n[1]=S;break;case 2:P=y,S=e+p*v,n[0]=P,n[1]=S;break;case 3:S=L,P=f+C/v,n[0]=P,n[1]=S;break;case 4:P=s,S=e+-p*v,n[0]=P,n[1]=S;break}if(!m)switch(O){case 1:Z=A,I=c+-z/v,n[2]=I,n[3]=Z;break;case 2:I=J,Z=t+x*v,n[2]=I,n[3]=Z;break;case 3:Z=G,I=c+z/v,n[2]=I,n[3]=Z;break;case 4:I=W,Z=t+-x*v,n[2]=I,n[3]=Z;break}}return!1},l.getCardinalDirection=function(a,r,n){return a>r?n:1+n%4},l.getIntersection=function(a,r,n,f){if(f==null)return this.getIntersection2(a,r,n);var e=a.x,c=a.y,t=r.x,i=r.y,h=n.x,g=n.y,s=f.x,L=f.y,y=void 0,p=void 0,C=void 0,R=void 0,A=void 0,b=void 0,W=void 0,G=void 0,J=void 0;return C=i-c,A=e-t,W=t*c-e*i,R=L-g,b=h-s,G=s*g-h*L,J=C*b-R*A,J===0?null:(y=(A*G-b*W)/J,p=(R*W-C*G)/J,new u(y,p))},l.angleOfVector=function(a,r,n,f){var e=void 0;return a!==n?(e=Math.atan((f-r)/(n-a)),n=0){var L=(-h+Math.sqrt(h*h-4*i*g))/(2*i),y=(-h-Math.sqrt(h*h-4*i*g))/(2*i),p=null;return L>=0&&L<=1?[L]:y>=0&&y<=1?[y]:p}else return null},l.HALF_PI=.5*Math.PI,l.ONE_AND_HALF_PI=1.5*Math.PI,l.TWO_PI=2*Math.PI,l.THREE_PI=3*Math.PI,E.exports=l}),(function(E,w,N){"use strict";function u(){}u.sign=function(l){return l>0?1:l<0?-1:0},u.floor=function(l){return l<0?Math.ceil(l):Math.floor(l)},u.ceil=function(l){return l<0?Math.floor(l):Math.ceil(l)},E.exports=u}),(function(E,w,N){"use strict";function u(){}u.MAX_VALUE=2147483647,u.MIN_VALUE=-2147483648,E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function e(c,t){for(var i=0;i"u"?"undefined":u(a);return a==null||r!="object"&&r!="function"},E.exports=l}),(function(E,w,N){"use strict";function u(h){if(Array.isArray(h)){for(var g=0,s=Array(h.length);g0&&g;){for(C.push(A[0]);C.length>0&&g;){var b=C[0];C.splice(0,1),p.add(b);for(var W=b.getEdges(),y=0;y-1&&A.splice(z,1)}p=new Set,R=new Map}}return h},i.prototype.createDummyNodesForBendpoints=function(h){for(var g=[],s=h.source,L=this.graphManager.calcLowestCommonAncestor(h.source,h.target),y=0;y0){for(var L=this.edgeToDummyNodes.get(s),y=0;y=0&&g.splice(G,1);var J=R.getNeighborsList();J.forEach(function(o){if(s.indexOf(o)<0){var m=L.get(o),d=m-1;d==1&&b.push(o),L.set(o,d)}})}s=s.concat(b),(g.length==1||g.length==2)&&(y=!0,p=g[0])}return p},i.prototype.setGraphManager=function(h){this.graphManager=h},E.exports=i}),(function(E,w,N){"use strict";function u(){}u.seed=1,u.x=0,u.nextDouble=function(){return u.x=Math.sin(u.seed++)*1e4,u.x-Math.floor(u.x)},E.exports=u}),(function(E,w,N){"use strict";var u=N(5);function l(a,r){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}l.prototype.getWorldOrgX=function(){return this.lworldOrgX},l.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},l.prototype.getWorldOrgY=function(){return this.lworldOrgY},l.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},l.prototype.getWorldExtX=function(){return this.lworldExtX},l.prototype.setWorldExtX=function(a){this.lworldExtX=a},l.prototype.getWorldExtY=function(){return this.lworldExtY},l.prototype.setWorldExtY=function(a){this.lworldExtY=a},l.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},l.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},l.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},l.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},l.prototype.getDeviceExtX=function(){return this.ldeviceExtX},l.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},l.prototype.getDeviceExtY=function(){return this.ldeviceExtY},l.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},l.prototype.transformX=function(a){var r=0,n=this.lworldExtX;return n!=0&&(r=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/n),r},l.prototype.transformY=function(a){var r=0,n=this.lworldExtY;return n!=0&&(r=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/n),r},l.prototype.inverseTransformX=function(a){var r=0,n=this.ldeviceExtX;return n!=0&&(r=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/n),r},l.prototype.inverseTransformY=function(a){var r=0,n=this.ldeviceExtY;return n!=0&&(r=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/n),r},l.prototype.inverseTransformPoint=function(a){var r=new u(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return r},E.exports=l}),(function(E,w,N){"use strict";function u(t){if(Array.isArray(t)){for(var i=0,h=Array(t.length);ia.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(t-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(t>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(t-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},e.prototype.calcSpringForces=function(){for(var t=this.getAllEdges(),i,h=0;h0&&arguments[0]!==void 0?arguments[0]:!0,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,h,g,s,L,y=this.getAllNodes(),p;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&t&&this.updateGrid(),p=new Set,h=0;hC||p>C)&&(t.gravitationForceX=-this.gravityConstant*s,t.gravitationForceY=-this.gravityConstant*L)):(C=i.getEstimatedSize()*this.compoundGravityRangeFactor,(y>C||p>C)&&(t.gravitationForceX=-this.gravityConstant*s*this.compoundGravityConstant,t.gravitationForceY=-this.gravityConstant*L*this.compoundGravityConstant))},e.prototype.isConverged=function(){var t,i=!1;return this.totalIterations>this.maxIterations/3&&(i=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),t=this.totalDisplacement=y.length||C>=y[0].length)){for(var R=0;Re}}]),n})();E.exports=r}),(function(E,w,N){"use strict";function u(){}u.svd=function(l){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=l.length,this.n=l[0].length;var a=Math.min(this.m,this.n);this.s=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(Math.min(this.m+1,this.n)),this.U=(function(Dt){var Nt=function $t(Rt){if(Rt.length==0)return 0;for(var Xt=[],zt=0;zt0;)Nt.push(0);return Nt})(this.n),n=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(this.m),f=!0,e=!0,c=Math.min(this.m-1,this.n),t=Math.max(0,Math.min(this.n-2,this.m)),i=0;i=0;v--)if(this.s[v]!==0){for(var D=v+1;D=0;F--){if((function(Dt,Nt){return Dt&&Nt})(F0;){var Q=void 0,Ut=void 0;for(Q=m-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(r[Q])<=St+Lt*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){r[Q]=0;break}if(Q===m-2)Ut=4;else{var Mt=void 0;for(Mt=m-1;Mt>=Q&&Mt!==Q;Mt--){var at=(Mt!==m?Math.abs(r[Mt]):0)+(Mt!==Q+1?Math.abs(r[Mt-1]):0);if(Math.abs(this.s[Mt])<=St+Lt*at){this.s[Mt]=0;break}}Mt===Q?Ut=3:Mt===m-1?Ut=1:(Ut=2,Q=Mt)}switch(Q++,Ut){case 1:{var et=r[m-2];r[m-2]=0;for(var pt=m-2;pt>=Q;pt--){var mt=u.hypot(this.s[pt],et),Ct=this.s[pt]/mt,Et=et/mt;if(this.s[pt]=mt,pt!==Q&&(et=-Et*r[pt-1],r[pt-1]=Ct*r[pt-1]),e)for(var Tt=0;Tt=this.s[Q+1]);){var lt=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=lt,e&&QMath.abs(a)?(r=a/l,r=Math.abs(l)*Math.sqrt(1+r*r)):a!=0?(r=l/a,r=Math.abs(a)*Math.sqrt(1+r*r)):r=0,r},E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function r(n,f){for(var e=0;e2&&arguments[2]!==void 0?arguments[2]:1,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,t=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;l(this,r),this.sequence1=n,this.sequence2=f,this.match_score=e,this.mismatch_penalty=c,this.gap_penalty=t,this.iMax=n.length+1,this.jMax=f.length+1,this.grid=new Array(this.iMax);for(var i=0;i=0;n--){var f=this.listeners[n];f.event===a&&f.callback===r&&this.listeners.splice(n,1)}},l.emit=function(a,r){for(var n=0;n{(function(w,N){typeof ie=="object"&&typeof Ne=="object"?Ne.exports=N(Te()):typeof define=="function"&&define.amd?define(["layout-base"],N):typeof ie=="object"?ie.coseBase=N(Te()):w.coseBase=N(w.layoutBase)})(ie,function(E){return(()=>{"use strict";var w={45:((a,r,n)=>{var f={};f.layoutBase=n(551),f.CoSEConstants=n(806),f.CoSEEdge=n(767),f.CoSEGraph=n(880),f.CoSEGraphManager=n(578),f.CoSELayout=n(765),f.CoSENode=n(991),f.ConstraintHandler=n(902),a.exports=f}),806:((a,r,n)=>{var f=n(551).FDLayoutConstants;function e(){}for(var c in f)e[c]=f[c];e.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,e.DEFAULT_RADIAL_SEPARATION=f.DEFAULT_EDGE_LENGTH,e.DEFAULT_COMPONENT_SEPERATION=60,e.TILE=!0,e.TILING_PADDING_VERTICAL=10,e.TILING_PADDING_HORIZONTAL=10,e.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,e.ENFORCE_CONSTRAINTS=!0,e.APPLY_LAYOUT=!0,e.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,e.TREE_REDUCTION_ON_INCREMENTAL=!0,e.PURE_INCREMENTAL=e.DEFAULT_INCREMENTAL,a.exports=e}),767:((a,r,n)=>{var f=n(551).FDLayoutEdge;function e(t,i,h){f.call(this,t,i,h)}e.prototype=Object.create(f.prototype);for(var c in f)e[c]=f[c];a.exports=e}),880:((a,r,n)=>{var f=n(551).LGraph;function e(t,i,h){f.call(this,t,i,h)}e.prototype=Object.create(f.prototype);for(var c in f)e[c]=f[c];a.exports=e}),578:((a,r,n)=>{var f=n(551).LGraphManager;function e(t){f.call(this,t)}e.prototype=Object.create(f.prototype);for(var c in f)e[c]=f[c];a.exports=e}),765:((a,r,n)=>{var f=n(551).FDLayout,e=n(578),c=n(880),t=n(991),i=n(767),h=n(806),g=n(902),s=n(551).FDLayoutConstants,L=n(551).LayoutConstants,y=n(551).Point,p=n(551).PointD,C=n(551).DimensionD,R=n(551).Layout,A=n(551).Integer,b=n(551).IGeometry,W=n(551).LGraph,G=n(551).Transform,J=n(551).LinkedList;function x(){f.call(this),this.toBeTiled={},this.constraints={}}x.prototype=Object.create(f.prototype);for(var z in f)x[z]=f[z];x.prototype.newGraphManager=function(){var o=new e(this);return this.graphManager=o,o},x.prototype.newGraph=function(o){return new c(null,this.graphManager,o)},x.prototype.newNode=function(o){return new t(this.graphManager,o)},x.prototype.newEdge=function(o){return new i(null,null,o)},x.prototype.initParameters=function(){f.prototype.initParameters.call(this,arguments),this.isSubLayout||(h.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=h.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=h.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=s.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=s.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=s.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},x.prototype.initSpringEmbedder=function(){f.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/s.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},x.prototype.layout=function(){var o=L.DEFAULT_CREATE_BENDS_AS_NEEDED;return o&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},x.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(h.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),d=this.nodesWithGravity.filter(function(D){return m.has(D)});this.graphManager.setAllNodesToApplyGravitation(d)}}else{var o=this.getFlatForest();if(o.length>0)this.positionNodesRadially(o);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),d=this.nodesWithGravity.filter(function(T){return m.has(T)});this.graphManager.setAllNodesToApplyGravitation(d),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},x.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%s.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var o=new Set(this.getAllNodes()),m=this.nodesWithGravity.filter(function(v){return o.has(v)});this.graphManager.setAllNodesToApplyGravitation(m),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),h.PURE_INCREMENTAL?this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=s.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var d=!this.isTreeGrowing&&!this.isGrowthFinished,T=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(d,T),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},x.prototype.getPositionsData=function(){for(var o=this.graphManager.getAllNodes(),m={},d=0;d0&&this.updateDisplacements();for(var d=0;d0&&(T.fixedNodeWeight=D)}}if(this.constraints.relativePlacementConstraint){var O=new Map,P=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(M){o.fixedNodesOnHorizontal.add(M),o.fixedNodesOnVertical.add(M)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var S=this.constraints.alignmentConstraint.vertical,d=0;d=2*M.length/3;K--)Y=Math.floor(Math.random()*(K+1)),X=M[K],M[K]=M[Y],M[Y]=X;return M},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var Y=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;o.nodesInRelativeHorizontal.includes(Y)||(o.nodesInRelativeHorizontal.push(Y),o.nodeToRelativeConstraintMapHorizontal.set(Y,[]),o.dummyToNodeForVerticalAlignment.has(Y)?o.nodeToTempPositionMapHorizontal.set(Y,o.idToNodeMap.get(o.dummyToNodeForVerticalAlignment.get(Y)[0]).getCenterX()):o.nodeToTempPositionMapHorizontal.set(Y,o.idToNodeMap.get(Y).getCenterX())),o.nodesInRelativeHorizontal.includes(X)||(o.nodesInRelativeHorizontal.push(X),o.nodeToRelativeConstraintMapHorizontal.set(X,[]),o.dummyToNodeForVerticalAlignment.has(X)?o.nodeToTempPositionMapHorizontal.set(X,o.idToNodeMap.get(o.dummyToNodeForVerticalAlignment.get(X)[0]).getCenterX()):o.nodeToTempPositionMapHorizontal.set(X,o.idToNodeMap.get(X).getCenterX())),o.nodeToRelativeConstraintMapHorizontal.get(Y).push({right:X,gap:M.gap}),o.nodeToRelativeConstraintMapHorizontal.get(X).push({left:Y,gap:M.gap})}else{var K=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;o.nodesInRelativeVertical.includes(K)||(o.nodesInRelativeVertical.push(K),o.nodeToRelativeConstraintMapVertical.set(K,[]),o.dummyToNodeForHorizontalAlignment.has(K)?o.nodeToTempPositionMapVertical.set(K,o.idToNodeMap.get(o.dummyToNodeForHorizontalAlignment.get(K)[0]).getCenterY()):o.nodeToTempPositionMapVertical.set(K,o.idToNodeMap.get(K).getCenterY())),o.nodesInRelativeVertical.includes(st)||(o.nodesInRelativeVertical.push(st),o.nodeToRelativeConstraintMapVertical.set(st,[]),o.dummyToNodeForHorizontalAlignment.has(st)?o.nodeToTempPositionMapVertical.set(st,o.idToNodeMap.get(o.dummyToNodeForHorizontalAlignment.get(st)[0]).getCenterY()):o.nodeToTempPositionMapVertical.set(st,o.idToNodeMap.get(st).getCenterY())),o.nodeToRelativeConstraintMapVertical.get(K).push({bottom:st,gap:M.gap}),o.nodeToRelativeConstraintMapVertical.get(st).push({top:K,gap:M.gap})}});else{var Z=new Map,tt=new Map;this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var Y=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;Z.has(Y)?Z.get(Y).push(X):Z.set(Y,[X]),Z.has(X)?Z.get(X).push(Y):Z.set(X,[Y])}else{var K=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;tt.has(K)?tt.get(K).push(st):tt.set(K,[st]),tt.has(st)?tt.get(st).push(K):tt.set(st,[K])}});var F=function(Y,X){var K=[],st=[],Lt=new J,St=new Set,Q=0;return Y.forEach(function(Ut,Mt){if(!St.has(Mt)){K[Q]=[],st[Q]=!1;var at=Mt;for(Lt.push(at),St.add(at),K[Q].push(at);Lt.length!=0;){at=Lt.shift(),X.has(at)&&(st[Q]=!0);var et=Y.get(at);et.forEach(function(pt){St.has(pt)||(Lt.push(pt),St.add(pt),K[Q].push(pt))})}Q++}}),{components:K,isFixed:st}},_=F(Z,o.fixedNodesOnHorizontal);this.componentsOnHorizontal=_.components,this.fixedComponentsOnHorizontal=_.isFixed;var B=F(tt,o.fixedNodesOnVertical);this.componentsOnVertical=B.components,this.fixedComponentsOnVertical=B.isFixed}}},x.prototype.updateDisplacements=function(){var o=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(B){var M=o.idToNodeMap.get(B.nodeId);M.displacementX=0,M.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var m=this.constraints.alignmentConstraint.vertical,d=0;d1){var P;for(P=0;PT&&(T=Math.floor(O.y)),D=Math.floor(O.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new p(L.WORLD_CENTER_X-O.x/2,L.WORLD_CENTER_Y-O.y/2))},x.radialLayout=function(o,m,d){var T=Math.max(this.maxDiagonalInTree(o),h.DEFAULT_RADIAL_SEPARATION);x.branchRadialLayout(m,null,0,359,0,T);var v=W.calculateBounds(o),D=new G;D.setDeviceOrgX(v.getMinX()),D.setDeviceOrgY(v.getMinY()),D.setWorldOrgX(d.x),D.setWorldOrgY(d.y);for(var O=0;O1;){var K=X[0];X.splice(0,1);var st=F.indexOf(K);st>=0&&F.splice(st,1),M--,_--}m!=null?Y=(F.indexOf(X[0])+1)%M:Y=0;for(var Lt=Math.abs(T-d)/_,St=Y;B!=_;St=++St%M){var Q=F[St].getOtherEnd(o);if(Q!=m){var Ut=(d+B*Lt)%360,Mt=(Ut+Lt)%360;x.branchRadialLayout(Q,o,Ut,Mt,v+D,D),B++}}},x.maxDiagonalInTree=function(o){for(var m=A.MIN_VALUE,d=0;dm&&(m=v)}return m},x.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},x.prototype.groupZeroDegreeMembers=function(){var o=this,m={};this.memberGroups={},this.idToDummyNode={};for(var d=[],T=this.graphManager.getAllNodes(),v=0;v"u"&&(m[P]=[]),m[P]=m[P].concat(D)}Object.keys(m).forEach(function(S){if(m[S].length>1){var I="DummyCompound_"+S;o.memberGroups[I]=m[S];var Z=m[S][0].getParent(),tt=new t(o.graphManager);tt.id=I,tt.paddingLeft=Z.paddingLeft||0,tt.paddingRight=Z.paddingRight||0,tt.paddingBottom=Z.paddingBottom||0,tt.paddingTop=Z.paddingTop||0,o.idToDummyNode[I]=tt;var F=o.getGraphManager().add(o.newGraph(),tt),_=Z.getChild();_.add(tt);for(var B=0;Bv?(T.rect.x-=(T.labelWidth-v)/2,T.setWidth(T.labelWidth),T.labelMarginLeft=(T.labelWidth-v)/2):T.labelPosHorizontal=="right"&&T.setWidth(v+T.labelWidth)),T.labelHeight&&(T.labelPosVertical=="top"?(T.rect.y-=T.labelHeight,T.setHeight(D+T.labelHeight),T.labelMarginTop=T.labelHeight):T.labelPosVertical=="center"&&T.labelHeight>D?(T.rect.y-=(T.labelHeight-D)/2,T.setHeight(T.labelHeight),T.labelMarginTop=(T.labelHeight-D)/2):T.labelPosVertical=="bottom"&&T.setHeight(D+T.labelHeight))}})},x.prototype.repopulateCompounds=function(){for(var o=this.compoundOrder.length-1;o>=0;o--){var m=this.compoundOrder[o],d=m.id,T=m.paddingLeft,v=m.paddingTop,D=m.labelMarginLeft,O=m.labelMarginTop;this.adjustLocations(this.tiledMemberPack[d],m.rect.x,m.rect.y,T,v,D,O)}},x.prototype.repopulateZeroDegreeMembers=function(){var o=this,m=this.tiledZeroDegreePack;Object.keys(m).forEach(function(d){var T=o.idToDummyNode[d],v=T.paddingLeft,D=T.paddingTop,O=T.labelMarginLeft,P=T.labelMarginTop;o.adjustLocations(m[d],T.rect.x,T.rect.y,v,D,O,P)})},x.prototype.getToBeTiled=function(o){var m=o.id;if(this.toBeTiled[m]!=null)return this.toBeTiled[m];var d=o.getChild();if(d==null)return this.toBeTiled[m]=!1,!1;for(var T=d.getNodes(),v=0;v0)return this.toBeTiled[m]=!1,!1;if(D.getChild()==null){this.toBeTiled[D.id]=!1;continue}if(!this.getToBeTiled(D))return this.toBeTiled[m]=!1,!1}return this.toBeTiled[m]=!0,!0},x.prototype.getNodeDegree=function(o){for(var m=o.id,d=o.getEdges(),T=0,v=0;vZ&&(Z=F.rect.height)}d+=Z+o.verticalPadding}},x.prototype.tileCompoundMembers=function(o,m){var d=this;this.tiledMemberPack=[],Object.keys(o).forEach(function(T){var v=m[T];if(d.tiledMemberPack[T]=d.tileNodes(o[T],v.paddingLeft+v.paddingRight),v.rect.width=d.tiledMemberPack[T].width,v.rect.height=d.tiledMemberPack[T].height,v.setCenter(d.tiledMemberPack[T].centerX,d.tiledMemberPack[T].centerY),v.labelMarginLeft=0,v.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var D=v.rect.width,O=v.rect.height;v.labelWidth&&(v.labelPosHorizontal=="left"?(v.rect.x-=v.labelWidth,v.setWidth(D+v.labelWidth),v.labelMarginLeft=v.labelWidth):v.labelPosHorizontal=="center"&&v.labelWidth>D?(v.rect.x-=(v.labelWidth-D)/2,v.setWidth(v.labelWidth),v.labelMarginLeft=(v.labelWidth-D)/2):v.labelPosHorizontal=="right"&&v.setWidth(D+v.labelWidth)),v.labelHeight&&(v.labelPosVertical=="top"?(v.rect.y-=v.labelHeight,v.setHeight(O+v.labelHeight),v.labelMarginTop=v.labelHeight):v.labelPosVertical=="center"&&v.labelHeight>O?(v.rect.y-=(v.labelHeight-O)/2,v.setHeight(v.labelHeight),v.labelMarginTop=(v.labelHeight-O)/2):v.labelPosVertical=="bottom"&&v.setHeight(O+v.labelHeight))}})},x.prototype.tileNodes=function(o,m){var d=this.tileNodesByFavoringDim(o,m,!0),T=this.tileNodesByFavoringDim(o,m,!1),v=this.getOrgRatio(d),D=this.getOrgRatio(T),O;return DP&&(P=B.getWidth())});var S=D/v,I=O/v,Z=Math.pow(d-T,2)+4*(S+T)*(I+d)*v,tt=(T-d+Math.sqrt(Z))/(2*(S+T)),F;m?(F=Math.ceil(tt),F==tt&&F++):F=Math.floor(tt);var _=F*(S+T)-T;return P>_&&(_=P),_+=T*2,_},x.prototype.tileNodesByFavoringDim=function(o,m,d){var T=h.TILING_PADDING_VERTICAL,v=h.TILING_PADDING_HORIZONTAL,D=h.TILING_COMPARE_BY,O={rows:[],rowWidth:[],rowHeight:[],width:0,height:m,verticalPadding:T,horizontalPadding:v,centerX:0,centerY:0};D&&(O.idealRowWidth=this.calcIdealRowWidth(o,d));var P=function(M){return M.rect.width*M.rect.height},S=function(M,Y){return P(Y)-P(M)};o.sort(function(B,M){var Y=S;return O.idealRowWidth?(Y=D,Y(B.id,M.id)):Y(B,M)});for(var I=0,Z=0,tt=0;tt0&&(O+=o.horizontalPadding),o.rowWidth[d]=O,o.width0&&(P+=o.verticalPadding);var S=0;P>o.rowHeight[d]&&(S=o.rowHeight[d],o.rowHeight[d]=P,S=o.rowHeight[d]-S),o.height+=S,o.rows[d].push(m)},x.prototype.getShortestRowIndex=function(o){for(var m=-1,d=Number.MAX_VALUE,T=0;Td&&(m=T,d=o.rowWidth[T]);return m},x.prototype.canAddHorizontal=function(o,m,d){if(o.idealRowWidth){var T=o.rows.length-1,v=o.rowWidth[T];return v+m+o.horizontalPadding<=o.idealRowWidth}var D=this.getShortestRowIndex(o);if(D<0)return!0;var O=o.rowWidth[D];if(O+o.horizontalPadding+m<=o.width)return!0;var P=0;o.rowHeight[D]0&&(P=d+o.verticalPadding-o.rowHeight[D]);var S;o.width-O>=m+o.horizontalPadding?S=(o.height+P)/(O+m+o.horizontalPadding):S=(o.height+P)/o.width,P=d+o.verticalPadding;var I;return o.widthD&&m!=d){T.splice(-1,1),o.rows[d].push(v),o.rowWidth[m]=o.rowWidth[m]-D,o.rowWidth[d]=o.rowWidth[d]+D,o.width=o.rowWidth[instance.getLongestRowIndex(o)];for(var O=Number.MIN_VALUE,P=0;PO&&(O=T[P].height);m>0&&(O+=o.verticalPadding);var S=o.rowHeight[m]+o.rowHeight[d];o.rowHeight[m]=O,o.rowHeight[d]0)for(var _=v;_<=D;_++)F[0]+=this.grid[_][O-1].length+this.grid[_][O].length-1;if(D0)for(var _=O;_<=P;_++)F[3]+=this.grid[v-1][_].length+this.grid[v][_].length-1;for(var B=A.MAX_VALUE,M,Y,X=0;X{var f=n(551).FDLayoutNode,e=n(551).IMath;function c(i,h,g,s){f.call(this,i,h,g,s)}c.prototype=Object.create(f.prototype);for(var t in f)c[t]=f[t];c.prototype.calculateDisplacement=function(){var i=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=i.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=i.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=i.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=i.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>i.coolingFactor*i.maxNodeDisplacement&&(this.displacementX=i.coolingFactor*i.maxNodeDisplacement*e.sign(this.displacementX)),Math.abs(this.displacementY)>i.coolingFactor*i.maxNodeDisplacement&&(this.displacementY=i.coolingFactor*i.maxNodeDisplacement*e.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},c.prototype.propogateDisplacementToChildren=function(i,h){for(var g=this.getChild().getNodes(),s,L=0;L{function f(g){if(Array.isArray(g)){for(var s=0,L=Array(g.length);s0){var dt=0;it.forEach(function(lt){V=="horizontal"?(q.set(lt,y.has(lt)?p[y.get(lt)]:k.get(lt)),dt+=q.get(lt)):(q.set(lt,y.has(lt)?C[y.get(lt)]:k.get(lt)),dt+=q.get(lt))}),dt=dt/it.length,ot.forEach(function(lt){$.has(lt)||q.set(lt,dt)})}else{var nt=0;ot.forEach(function(lt){V=="horizontal"?nt+=y.has(lt)?p[y.get(lt)]:k.get(lt):nt+=y.has(lt)?C[y.get(lt)]:k.get(lt)}),nt=nt/ot.length,ot.forEach(function(lt){q.set(lt,nt)})}});for(var rt=function(){var it=gt.shift(),dt=H.get(it);dt.forEach(function(nt){if(q.get(nt.id)lt&&(lt=Xt),ztFt&&(Ft=zt)}}catch(_t){Vt=!0,Dt=_t}finally{try{!xt&&Nt.return&&Nt.return()}finally{if(Vt)throw Dt}}var ce=(dt+lt)/2-(nt+Ft)/2,qt=!0,Jt=!1,Kt=void 0;try{for(var Qt=ot[Symbol.iterator](),oe;!(qt=(oe=Qt.next()).done);qt=!0){var jt=oe.value;q.set(jt,q.get(jt)+ce)}}catch(_t){Jt=!0,Kt=_t}finally{try{!qt&&Qt.return&&Qt.return()}finally{if(Jt)throw Kt}}})}return q},z=function(H){var V=0,$=0,k=0,j=0;if(H.forEach(function(ht){ht.left?p[y.get(ht.left)]-p[y.get(ht.right)]>=0?V++:$++:C[y.get(ht.top)]-C[y.get(ht.bottom)]>=0?k++:j++}),V>$&&k>j)for(var ut=0;ut$)for(var ft=0;ftj)for(var q=0;q1)s.fixedNodeConstraint.forEach(function(U,H){T[H]=[U.position.x,U.position.y],v[H]=[p[y.get(U.nodeId)],C[y.get(U.nodeId)]]}),D=!0;else if(s.alignmentConstraint)(function(){var U=0;if(s.alignmentConstraint.vertical){for(var H=s.alignmentConstraint.vertical,V=function(q){var ht=new Set;H[q].forEach(function(vt){ht.add(vt)});var gt=new Set([].concat(f(ht)).filter(function(vt){return P.has(vt)})),rt=void 0;gt.size>0?rt=p[y.get(gt.values().next().value)]:rt=J(ht).x,H[q].forEach(function(vt){T[U]=[rt,C[y.get(vt)]],v[U]=[p[y.get(vt)],C[y.get(vt)]],U++})},$=0;$0?rt=p[y.get(gt.values().next().value)]:rt=J(ht).y,k[q].forEach(function(vt){T[U]=[p[y.get(vt)],rt],v[U]=[p[y.get(vt)],C[y.get(vt)]],U++})},ut=0;uttt&&(tt=Z[_].length,F=_);if(tt0){var Ct={x:0,y:0};s.fixedNodeConstraint.forEach(function(U,H){var V={x:p[y.get(U.nodeId)],y:C[y.get(U.nodeId)]},$=U.position,k=G($,V);Ct.x+=k.x,Ct.y+=k.y}),Ct.x/=s.fixedNodeConstraint.length,Ct.y/=s.fixedNodeConstraint.length,p.forEach(function(U,H){p[H]+=Ct.x}),C.forEach(function(U,H){C[H]+=Ct.y}),s.fixedNodeConstraint.forEach(function(U){p[y.get(U.nodeId)]=U.position.x,C[y.get(U.nodeId)]=U.position.y})}if(s.alignmentConstraint){if(s.alignmentConstraint.vertical)for(var Et=s.alignmentConstraint.vertical,Tt=function(H){var V=new Set;Et[H].forEach(function(j){V.add(j)});var $=new Set([].concat(f(V)).filter(function(j){return P.has(j)})),k=void 0;$.size>0?k=p[y.get($.values().next().value)]:k=J(V).x,V.forEach(function(j){P.has(j)||(p[y.get(j)]=k)})},Ot=0;Ot0?k=C[y.get($.values().next().value)]:k=J(V).y,V.forEach(function(j){P.has(j)||(C[y.get(j)]=k)})},Pt=0;Pt{a.exports=E})},N={};function u(a){var r=N[a];if(r!==void 0)return r.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var l=u(45);return l})()})});var Je=pe((ne,Ce)=>{(function(w,N){typeof ne=="object"&&typeof Ce=="object"?Ce.exports=N(Le()):typeof define=="function"&&define.amd?define(["cose-base"],N):typeof ne=="object"?ne.cytoscapeFcose=N(Le()):w.cytoscapeFcose=N(w.coseBase)})(ne,function(E){return(()=>{"use strict";var w={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(r){for(var n=arguments.length,f=Array(n>1?n-1:0),e=1;e{var f=(function(){function t(i,h){var g=[],s=!0,L=!1,y=void 0;try{for(var p=i[Symbol.iterator](),C;!(s=(C=p.next()).done)&&(g.push(C.value),!(h&&g.length===h));s=!0);}catch(R){L=!0,y=R}finally{try{!s&&p.return&&p.return()}finally{if(L)throw y}}return g}return function(i,h){if(Array.isArray(i))return i;if(Symbol.iterator in Object(i))return t(i,h);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),e=n(140).layoutBase.LinkedList,c={};c.getTopMostNodes=function(t){for(var i={},h=0;h0&&D.merge(I)});for(var O=0;O1){C=y[0],R=C.connectedEdges().length,y.forEach(function(v){v.connectedEdges().length0&&g.set("dummy"+(g.size+1),W),G},c.relocateComponent=function(t,i,h){if(!h.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;if(h.quality=="draft"){var p=!0,C=!1,R=void 0;try{for(var A=i.nodeIndexes[Symbol.iterator](),b;!(p=(b=A.next()).done);p=!0){var W=b.value,G=f(W,2),J=G[0],x=G[1],z=h.cy.getElementById(J);if(z){var o=z.boundingBox(),m=i.xCoords[x]-o.w/2,d=i.xCoords[x]+o.w/2,T=i.yCoords[x]-o.h/2,v=i.yCoords[x]+o.h/2;ms&&(s=d),Ty&&(y=v)}}}catch(I){C=!0,R=I}finally{try{!p&&A.return&&A.return()}finally{if(C)throw R}}var D=t.x-(s+g)/2,O=t.y-(y+L)/2;i.xCoords=i.xCoords.map(function(I){return I+D}),i.yCoords=i.yCoords.map(function(I){return I+O})}else{Object.keys(i).forEach(function(I){var Z=i[I],tt=Z.getRect().x,F=Z.getRect().x+Z.getRect().width,_=Z.getRect().y,B=Z.getRect().y+Z.getRect().height;tts&&(s=F),_y&&(y=B)});var P=t.x-(s+g)/2,S=t.y-(y+L)/2;Object.keys(i).forEach(function(I){var Z=i[I];Z.setCenter(Z.getCenterX()+P,Z.getCenterY()+S)})}}},c.calcBoundingBox=function(t,i,h,g){for(var s=Number.MAX_SAFE_INTEGER,L=Number.MIN_SAFE_INTEGER,y=Number.MAX_SAFE_INTEGER,p=Number.MIN_SAFE_INTEGER,C=void 0,R=void 0,A=void 0,b=void 0,W=t.descendants().not(":parent"),G=W.length,J=0;JC&&(s=C),LA&&(y=A),p{var f=n(548),e=n(140).CoSELayout,c=n(140).CoSENode,t=n(140).layoutBase.PointD,i=n(140).layoutBase.DimensionD,h=n(140).layoutBase.LayoutConstants,g=n(140).layoutBase.FDLayoutConstants,s=n(140).CoSEConstants,L=function(p,C){var R=p.cy,A=p.eles,b=A.nodes(),W=A.edges(),G=void 0,J=void 0,x=void 0,z={};p.randomize&&(G=C.nodeIndexes,J=C.xCoords,x=C.yCoords);var o=function(I){return typeof I=="function"},m=function(I,Z){return o(I)?I(Z):I},d=f.calcParentsWithoutChildren(R,A),T=function S(I,Z,tt,F){for(var _=Z.length,B=0;B<_;B++){var M=Z[B],Y=null;M.intersection(d).length==0&&(Y=M.children());var X=void 0,K=M.layoutDimensions({nodeDimensionsIncludeLabels:F.nodeDimensionsIncludeLabels});if(M.outerWidth()!=null&&M.outerHeight()!=null)if(F.randomize)if(!M.isParent())X=I.add(new c(tt.graphManager,new t(J[G.get(M.id())]-K.w/2,x[G.get(M.id())]-K.h/2),new i(parseFloat(K.w),parseFloat(K.h))));else{var st=f.calcBoundingBox(M,J,x,G);M.intersection(d).length==0?X=I.add(new c(tt.graphManager,new t(st.topLeftX,st.topLeftY),new i(st.width,st.height))):X=I.add(new c(tt.graphManager,new t(st.topLeftX,st.topLeftY),new i(parseFloat(K.w),parseFloat(K.h))))}else X=I.add(new c(tt.graphManager,new t(M.position("x")-K.w/2,M.position("y")-K.h/2),new i(parseFloat(K.w),parseFloat(K.h))));else X=I.add(new c(this.graphManager));if(X.id=M.data("id"),X.nodeRepulsion=m(F.nodeRepulsion,M),X.paddingLeft=parseInt(M.css("padding")),X.paddingTop=parseInt(M.css("padding")),X.paddingRight=parseInt(M.css("padding")),X.paddingBottom=parseInt(M.css("padding")),F.nodeDimensionsIncludeLabels&&(X.labelWidth=M.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).w,X.labelHeight=M.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).h,X.labelPosVertical=M.css("text-valign"),X.labelPosHorizontal=M.css("text-halign")),z[M.data("id")]=X,isNaN(X.rect.x)&&(X.rect.x=0),isNaN(X.rect.y)&&(X.rect.y=0),Y!=null&&Y.length>0){var Lt=void 0;Lt=tt.getGraphManager().add(tt.newGraph(),X),S(Lt,Y,tt,F)}}},v=function(I,Z,tt){for(var F=0,_=0,B=0;B0?s.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=F/_:o(p.idealEdgeLength)?s.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:s.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=p.idealEdgeLength,s.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,s.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},D=function(I,Z){Z.fixedNodeConstraint&&(I.constraints.fixedNodeConstraint=Z.fixedNodeConstraint),Z.alignmentConstraint&&(I.constraints.alignmentConstraint=Z.alignmentConstraint),Z.relativePlacementConstraint&&(I.constraints.relativePlacementConstraint=Z.relativePlacementConstraint)};p.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=p.nestingFactor),p.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=p.gravity),p.numIter!=null&&(s.MAX_ITERATIONS=g.MAX_ITERATIONS=p.numIter),p.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=p.gravityRange),p.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=p.gravityCompound),p.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=p.gravityRangeCompound),p.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=p.initialEnergyOnIncremental),p.tilingCompareBy!=null&&(s.TILING_COMPARE_BY=p.tilingCompareBy),p.quality=="proof"?h.QUALITY=2:h.QUALITY=0,s.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=p.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!p.randomize,s.ANIMATE=g.ANIMATE=h.ANIMATE=p.animate,s.TILE=p.tile,s.TILING_PADDING_VERTICAL=typeof p.tilingPaddingVertical=="function"?p.tilingPaddingVertical.call():p.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof p.tilingPaddingHorizontal=="function"?p.tilingPaddingHorizontal.call():p.tilingPaddingHorizontal,s.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,s.PURE_INCREMENTAL=!p.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=p.uniformNodeDimensions,p.step=="transformed"&&(s.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,s.ENFORCE_CONSTRAINTS=!1,s.APPLY_LAYOUT=!1),p.step=="enforced"&&(s.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,s.ENFORCE_CONSTRAINTS=!0,s.APPLY_LAYOUT=!1),p.step=="cose"&&(s.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,s.ENFORCE_CONSTRAINTS=!1,s.APPLY_LAYOUT=!0),p.step=="all"&&(p.randomize?s.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:s.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,s.ENFORCE_CONSTRAINTS=!0,s.APPLY_LAYOUT=!0),p.fixedNodeConstraint||p.alignmentConstraint||p.relativePlacementConstraint?s.TREE_REDUCTION_ON_INCREMENTAL=!1:s.TREE_REDUCTION_ON_INCREMENTAL=!0;var O=new e,P=O.newGraphManager();return T(P.addRoot(),f.getTopMostNodes(b),O,p),v(O,P,W),D(O,p),O.runLayout(),z};a.exports={coseLayout:L}}),212:((a,r,n)=>{var f=(function(){function p(C,R){for(var A=0;A0)if(v){var P=t.getTopMostNodes(A.eles.nodes());if(o=t.connectComponents(b,A.eles,P),o.forEach(function(at){var et=at.boundingBox();m.push({x:et.x1+et.w/2,y:et.y1+et.h/2})}),A.randomize&&o.forEach(function(at){A.eles=at,G.push(h(A))}),A.quality=="default"||A.quality=="proof"){var S=b.collection();if(A.tile){var I=new Map,Z=[],tt=[],F=0,_={nodeIndexes:I,xCoords:Z,yCoords:tt},B=[];if(o.forEach(function(at,et){at.edges().length==0&&(at.nodes().forEach(function(pt,mt){S.merge(at.nodes()[mt]),pt.isParent()||(_.nodeIndexes.set(at.nodes()[mt].id(),F++),_.xCoords.push(at.nodes()[0].position().x),_.yCoords.push(at.nodes()[0].position().y))}),B.push(et))}),S.length>1){var M=S.boundingBox();m.push({x:M.x1+M.w/2,y:M.y1+M.h/2}),o.push(S),G.push(_);for(var Y=B.length-1;Y>=0;Y--)o.splice(B[Y],1),G.splice(B[Y],1),m.splice(B[Y],1)}}o.forEach(function(at,et){A.eles=at,z.push(s(A,G[et])),t.relocateComponent(m[et],z[et],A)})}else o.forEach(function(at,et){t.relocateComponent(m[et],G[et],A)});var X=new Set;if(o.length>1){var K=[],st=W.filter(function(at){return at.css("display")=="none"});o.forEach(function(at,et){var pt=void 0;if(A.quality=="draft"&&(pt=G[et].nodeIndexes),at.nodes().not(st).length>0){var mt={};mt.edges=[],mt.nodes=[];var Ct=void 0;at.nodes().not(st).forEach(function(Et){if(A.quality=="draft")if(!Et.isParent())Ct=pt.get(Et.id()),mt.nodes.push({x:G[et].xCoords[Ct]-Et.boundingbox().w/2,y:G[et].yCoords[Ct]-Et.boundingbox().h/2,width:Et.boundingbox().w,height:Et.boundingbox().h});else{var Tt=t.calcBoundingBox(Et,G[et].xCoords,G[et].yCoords,pt);mt.nodes.push({x:Tt.topLeftX,y:Tt.topLeftY,width:Tt.width,height:Tt.height})}else z[et][Et.id()]&&mt.nodes.push({x:z[et][Et.id()].getLeft(),y:z[et][Et.id()].getTop(),width:z[et][Et.id()].getWidth(),height:z[et][Et.id()].getHeight()})}),at.edges().forEach(function(Et){var Tt=Et.source(),Ot=Et.target();if(Tt.css("display")!="none"&&Ot.css("display")!="none")if(A.quality=="draft"){var It=pt.get(Tt.id()),Wt=pt.get(Ot.id()),Pt=[],Yt=[];if(Tt.isParent()){var bt=t.calcBoundingBox(Tt,G[et].xCoords,G[et].yCoords,pt);Pt.push(bt.topLeftX+bt.width/2),Pt.push(bt.topLeftY+bt.height/2)}else Pt.push(G[et].xCoords[It]),Pt.push(G[et].yCoords[It]);if(Ot.isParent()){var U=t.calcBoundingBox(Ot,G[et].xCoords,G[et].yCoords,pt);Yt.push(U.topLeftX+U.width/2),Yt.push(U.topLeftY+U.height/2)}else Yt.push(G[et].xCoords[Wt]),Yt.push(G[et].yCoords[Wt]);mt.edges.push({startX:Pt[0],startY:Pt[1],endX:Yt[0],endY:Yt[1]})}else z[et][Tt.id()]&&z[et][Ot.id()]&&mt.edges.push({startX:z[et][Tt.id()].getCenterX(),startY:z[et][Tt.id()].getCenterY(),endX:z[et][Ot.id()].getCenterX(),endY:z[et][Ot.id()].getCenterY()})}),mt.nodes.length>0&&(K.push(mt),X.add(et))}});var Lt=T.packComponents(K,A.randomize).shifts;if(A.quality=="draft")G.forEach(function(at,et){var pt=at.xCoords.map(function(Ct){return Ct+Lt[et].dx}),mt=at.yCoords.map(function(Ct){return Ct+Lt[et].dy});at.xCoords=pt,at.yCoords=mt});else{var St=0;X.forEach(function(at){Object.keys(z[at]).forEach(function(et){var pt=z[at][et];pt.setCenter(pt.getCenterX()+Lt[St].dx,pt.getCenterY()+Lt[St].dy)}),St++})}}}else{var D=A.eles.boundingBox();if(m.push({x:D.x1+D.w/2,y:D.y1+D.h/2}),A.randomize){var O=h(A);G.push(O)}A.quality=="default"||A.quality=="proof"?(z.push(s(A,G[0])),t.relocateComponent(m[0],z[0],A)):t.relocateComponent(m[0],G[0],A)}var Q=function(et,pt){if(A.quality=="default"||A.quality=="proof"){typeof et=="number"&&(et=pt);var mt=void 0,Ct=void 0,Et=et.data("id");return z.forEach(function(Ot){Et in Ot&&(mt={x:Ot[Et].getRect().getCenterX(),y:Ot[Et].getRect().getCenterY()},Ct=Ot[Et])}),A.nodeDimensionsIncludeLabels&&(Ct.labelWidth&&(Ct.labelPosHorizontal=="left"?mt.x+=Ct.labelWidth/2:Ct.labelPosHorizontal=="right"&&(mt.x-=Ct.labelWidth/2)),Ct.labelHeight&&(Ct.labelPosVertical=="top"?mt.y+=Ct.labelHeight/2:Ct.labelPosVertical=="bottom"&&(mt.y-=Ct.labelHeight/2))),mt==null&&(mt={x:et.position("x"),y:et.position("y")}),{x:mt.x,y:mt.y}}else{var Tt=void 0;return G.forEach(function(Ot){var It=Ot.nodeIndexes.get(et.id());It!=null&&(Tt={x:Ot.xCoords[It],y:Ot.yCoords[It]})}),Tt==null&&(Tt={x:et.position("x"),y:et.position("y")}),{x:Tt.x,y:Tt.y}}};if(A.quality=="default"||A.quality=="proof"||A.randomize){var Ut=t.calcParentsWithoutChildren(b,W),Mt=W.filter(function(at){return at.css("display")=="none"});A.eles=W.not(Mt),W.nodes().not(":parent").not(Mt).layoutPositions(R,A,Q),Ut.length>0&&Ut.forEach(function(at){at.position(Q(at))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),p})();a.exports=y}),657:((a,r,n)=>{var f=n(548),e=n(140).layoutBase.Matrix,c=n(140).layoutBase.SVD,t=function(h){var g=h.cy,s=h.eles,L=s.nodes(),y=s.nodes(":parent"),p=new Map,C=new Map,R=new Map,A=[],b=[],W=[],G=[],J=[],x=[],z=[],o=[],m=void 0,d=void 0,T=1e8,v=1e-9,D=h.piTol,O=h.samplingType,P=h.nodeSeparation,S=void 0,I=function(){for(var V=0,$=0,k=!1;$=ut;){q=j[ut++];for(var ot=A[q],it=0;itrt&&(rt=J[nt],vt=nt)}return vt},tt=function(V){var $=void 0;if(V){$=Math.floor(Math.random()*d),m=$;for(var j=0;j=1)break;rt=gt}for(var ot=0;ot=1)break;rt=gt}for(var dt=0;dt0&&($.isParent()?A[V].push(R.get($.id())):A[V].push($.id()))})});var Ut=function(V){var $=C.get(V),k=void 0;p.get(V).forEach(function(j){g.getElementById(j).isParent()?k=R.get(j):k=j,A[$].push(k),A[C.get(k)].push(V)})},Mt=!0,at=!1,et=void 0;try{for(var pt=p.keys()[Symbol.iterator](),mt;!(Mt=(mt=pt.next()).done);Mt=!0){var Ct=mt.value;Ut(Ct)}}catch(H){at=!0,et=H}finally{try{!Mt&&pt.return&&pt.return()}finally{if(at)throw et}}d=C.size;var Et=void 0;if(d>2){S=d{var f=n(212),e=function(t){t&&t("layout","fcose",f)};typeof cytoscape<"u"&&e(cytoscape),a.exports=e}),140:(a=>{a.exports=E})},N={};function u(a){var r=N[a];if(r!==void 0)return r.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var l=u(579);return l})()})});var ir=ur(Je(),1);var Ke={L:"left",R:"right",T:"top",B:"bottom"},je={L:ct(E=>`${E},${E/2} 0,${E} 0,0`,"L"),R:ct(E=>`0,${E/2} ${E},0 ${E},${E}`,"R"),T:ct(E=>`0,0 ${E},0 ${E/2},${E}`,"T"),B:ct(E=>`${E/2},0 ${E},${E} 0,${E}`,"B")},fe={L:ct((E,w)=>E-w+2,"L"),R:ct((E,w)=>E-2,"R"),T:ct((E,w)=>E-w+2,"T"),B:ct((E,w)=>E-2,"B")},dr=ct(function(E){return Ht(E)?E==="L"?"R":"L":E==="T"?"B":"T"},"getOppositeArchitectureDirection"),_e=ct(function(E){let w=E;return w==="L"||w==="R"||w==="T"||w==="B"},"isArchitectureDirection"),Ht=ct(function(E){let w=E;return w==="L"||w==="R"},"isArchitectureDirectionX"),Zt=ct(function(E){let w=E;return w==="T"||w==="B"},"isArchitectureDirectionY"),we=ct(function(E,w){let N=Ht(E)&&Zt(w),u=Zt(E)&&Ht(w);return N||u},"isArchitectureDirectionXY"),vr=ct(function(E){let w=E[0],N=E[1],u=Ht(w)&&Zt(N),l=Zt(w)&&Ht(N);return u||l},"isArchitecturePairXY"),pr=ct(function(E){return E!=="LL"&&E!=="RR"&&E!=="TT"&&E!=="BB"},"isValidArchitectureDirectionPair"),Ae=ct(function(E,w){let N=`${E}${w}`;return pr(N)?N:void 0},"getArchitectureDirectionPair"),yr=ct(function([E,w],N){let u=N[0],l=N[1];return Ht(u)?Zt(l)?[E+(u==="L"?-1:1),w+(l==="T"?1:-1)]:[E+(u==="L"?-1:1),w]:Ht(l)?[E+(l==="L"?1:-1),w+(u==="T"?1:-1)]:[E,w+(u==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),mr=ct(function(E){return E==="LT"||E==="TL"?[1,1]:E==="BL"||E==="LB"?[1,-1]:E==="BR"||E==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),Er=ct(function(E,w){return we(E,w)?"bend":Ht(E)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),Tr=ct(function(E){return E.type==="service"},"isArchitectureService"),Nr=ct(function(E){return E.type==="junction"},"isArchitectureJunction"),tr=ct(E=>E.data(),"edgeData"),ee=ct(E=>E.data(),"nodeData"),Lr=Re.architecture,er=class{constructor(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.elements={},this.diagramId="",this.setAccTitle=Ge,this.getAccTitle=Ue,this.setDiagramTitle=He,this.getDiagramTitle=We,this.getAccDescription=Xe,this.setAccDescription=Ye,this.clear()}static{ct(this,"ArchitectureDB")}setDiagramId(E){this.diagramId=E}getDiagramId(){return this.diagramId}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},this.diagramId="",Pe()}addService({id:E,icon:w,in:N,title:u,iconText:l}){if(this.registeredIds[E]!==void 0)throw new Error(`The service id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The service [${E}] cannot be placed within itself`);if(this.registeredIds[N]===void 0)throw new Error(`The service [${E}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[N]==="node")throw new Error(`The service [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"service",icon:w,iconText:l,title:u,edges:[],in:N}}getServices(){return Object.values(this.nodes).filter(Tr)}addJunction({id:E,in:w}){if(this.registeredIds[E]!==void 0)throw new Error(`The junction id [${E}] is already in use by another ${this.registeredIds[E]}`);if(w!==void 0){if(E===w)throw new Error(`The junction [${E}] cannot be placed within itself`);if(this.registeredIds[w]===void 0)throw new Error(`The junction [${E}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[w]==="node")throw new Error(`The junction [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"junction",edges:[],in:w}}getJunctions(){return Object.values(this.nodes).filter(Nr)}getNodes(){return Object.values(this.nodes)}getNode(E){return this.nodes[E]??null}addGroup({id:E,icon:w,in:N,title:u}){if(this.registeredIds?.[E]!==void 0)throw new Error(`The group id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The group [${E}] cannot be placed within itself`);if(this.registeredIds?.[N]===void 0)throw new Error(`The group [${E}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[N]==="node")throw new Error(`The group [${E}]'s parent is not a group`)}this.registeredIds[E]="group",this.groups[E]={id:E,icon:w,title:u,in:N}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:E,rhsId:w,lhsDir:N,rhsDir:u,lhsInto:l,rhsInto:a,lhsGroup:r,rhsGroup:n,title:f}){if(!_e(N))throw new Error(`Invalid direction given for left hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(N)}`);if(!_e(u))throw new Error(`Invalid direction given for right hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(u)}`);if(this.nodes[E]===void 0&&this.groups[E]===void 0)throw new Error(`The left-hand id [${E}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[w]===void 0&&this.groups[w]===void 0)throw new Error(`The right-hand id [${w}] does not yet exist. Please create the service/group before declaring an edge to it.`);let e=this.nodes[E].in,c=this.nodes[w].in;if(r&&e&&c&&e==c)throw new Error(`The left-hand id [${E}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(n&&e&&c&&e==c)throw new Error(`The right-hand id [${w}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let t={lhsId:E,lhsDir:N,lhsInto:l,lhsGroup:r,rhsId:w,rhsDir:u,rhsInto:a,rhsGroup:n,title:f};this.edges.push(t),this.nodes[E]&&this.nodes[w]&&(this.nodes[E].edges.push(this.edges[this.edges.length-1]),this.nodes[w].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let E={},w=Object.entries(this.nodes).reduce((n,[f,e])=>(n[f]=e.edges.reduce((c,t)=>{let i=this.getNode(t.lhsId)?.in,h=this.getNode(t.rhsId)?.in;if(i&&h&&i!==h){let g=Er(t.lhsDir,t.rhsDir);g!=="bend"&&(E[i]??={},E[i][h]=g,E[h]??={},E[h][i]=g)}if(t.lhsId===f){let g=Ae(t.lhsDir,t.rhsDir);g&&(c[g]=t.rhsId)}else{let g=Ae(t.rhsDir,t.lhsDir);g&&(c[g]=t.lhsId)}return c},{}),n),{}),N=Object.keys(w)[0],u={[N]:1},l=Object.keys(w).reduce((n,f)=>f===N?n:{...n,[f]:1},{}),a=ct(n=>{let f={[n]:[0,0]},e=[n];for(;e.length>0;){let c=e.shift();if(c){u[c]=1,delete l[c];let t=w[c],[i,h]=f[c];Object.entries(t).forEach(([g,s])=>{u[s]||(f[s]=yr([i,h],g),e.push(s))})}}return f},"BFS"),r=[a(N)];for(;Object.keys(l).length>0;)r.push(a(Object.keys(l)[0]));this.dataStructures={adjList:w,spatialMaps:r,groupAlignments:E}}return this.dataStructures}setElementForId(E,w){this.elements[E]=w}getElementById(E){return this.elements[E]}getConfig(){return Be({...Lr,...Se().architecture})}getConfigField(E){return this.getConfig()[E]}},Cr=ct((E,w)=>{qe(E,w),E.groups.map(N=>w.addGroup(N)),E.services.map(N=>w.addService({...N,type:"service"})),E.junctions.map(N=>w.addJunction({...N,type:"junction"})),E.edges.map(N=>w.addEdge(N))},"populateDb"),rr={parser:{yy:void 0},parse:ct(async E=>{let w=await Qe("architecture",E);ye.debug(w);let N=rr.parser?.yy;if(!(N instanceof er))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Cr(w,N)},"parse")},Ar=ct(E=>` .edge { stroke-width: ${E.archEdgeWidth}; stroke: ${E.archEdgeColor}; @@ -34,4 +34,4 @@ import{a as qe}from"./chunk-PPWLQFJD.min.js";import{a as ze}from"./chunk-C5SK55C translate(${v*O.width/2}, ${D*O.height/2}) rotate(${-1*v*D*45}, 0, ${T.height/2}) `)}}}}}))},"drawEdges"),Or=ct(async function(E,w,N,u){let a=N.getConfigField("padding")*.75,r=N.getConfigField("fontSize"),f=N.getConfigField("iconSize")/2;await Promise.all(w.nodes().map(async e=>{let c=ee(e);if(c.type==="group"){let{h:t,w:i,x1:h,y1:g}=e.boundingBox(),s=E.append("rect");s.attr("id",`${u}-group-${c.id}`).attr("x",h+f).attr("y",g+f).attr("width",i).attr("height",t).attr("class","node-bkg");let L=E.append("g"),y=h,p=g;if(c.icon){let C=L.append("g");C.html(`${await he(c.icon,{height:a,width:a,fallbackPrefix:ae.prefix})}`),C.attr("transform","translate("+(y+f+1)+", "+(p+f+1)+")"),y+=a,p+=r/2-1-2}if(c.label){let C=L.append("g");await le(C,c.label,{useHtmlLabels:!1,width:i,classes:"architecture-service-label"},se()),C.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),C.attr("transform","translate("+(y+f+4)+", "+(p+f+2)+")")}N.setElementForId(c.id,s)}}))},"drawGroups"),Dr=ct(async function(E,w,N,u){let l=se();for(let a of N){let r=w.append("g"),n=E.getConfigField("iconSize");if(a.title){let t=r.append("g");await le(t,a.title,{useHtmlLabels:!1,width:n*1.5,classes:"architecture-service-label"},l),t.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),t.attr("transform","translate("+n/2+", "+n+")")}let f=r.append("g");if(a.icon)f.html(`${await he(a.icon,{height:n,width:n,fallbackPrefix:ae.prefix})}`);else if(a.iconText){f.html(`${await he("blank",{height:n,width:n,fallbackPrefix:ae.prefix})}`);let h=f.append("g").append("foreignObject").attr("width",n).attr("height",n).append("div").attr("class","node-icon-text").attr("style",`height: ${n}px;`).append("div").html(Fe(a.iconText,l)),g=parseInt(window.getComputedStyle(h.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;h.attr("style",`-webkit-line-clamp: ${Math.floor((n-2)/g)};`)}else f.append("path").attr("class","node-bkg").attr("id",`${u}-node-${a.id}`).attr("d",`M0,${n} V5 Q0,0 5,0 H${n-5} Q${n},0 ${n},5 V${n} Z`);r.attr("id",`${u}-service-${a.id}`).attr("class","architecture-service");let{width:e,height:c}=r.node().getBBox();a.width=e,a.height=c,E.setElementForId(a.id,r)}return 0},"drawServices"),xr=ct(function(E,w,N,u){N.forEach(l=>{let a=w.append("g"),r=E.getConfigField("iconSize");a.append("g").append("rect").attr("id",`${u}-node-${l.id}`).attr("fill-opacity","0").attr("width",r).attr("height",r),a.attr("class","architecture-junction");let{width:f,height:e}=a._groups[0][0].getBBox();a.width=f,a.height=e,E.setElementForId(l.id,a)})},"drawJunctions");Ze([{name:ae.prefix,icons:ae}]);me.use(ir.default);function nr(E,w,N){E.forEach(u=>{w.add({group:"nodes",data:{type:"service",id:u.id,icon:u.icon,label:u.title,parent:u.in,width:N.getConfigField("iconSize"),height:N.getConfigField("iconSize")},classes:"node-service"})})}ct(nr,"addServices");function ar(E,w,N){E.forEach(u=>{w.add({group:"nodes",data:{type:"junction",id:u.id,parent:u.in,width:N.getConfigField("iconSize"),height:N.getConfigField("iconSize")},classes:"node-junction"})})}ct(ar,"addJunctions");function or(E,w){w.nodes().map(N=>{let u=ee(N);if(u.type==="group")return;u.x=N.position().x,u.y=N.position().y,E.getElementById(u.id).attr("transform","translate("+(u.x||0)+","+(u.y||0)+")")})}ct(or,"positionNodes");function sr(E,w){E.forEach(N=>{w.add({group:"nodes",data:{type:"group",id:N.id,icon:N.icon,label:N.title,parent:N.in},classes:"node-group"})})}ct(sr,"addGroups");function hr(E,w){E.forEach(N=>{let{lhsId:u,rhsId:l,lhsInto:a,lhsGroup:r,rhsInto:n,lhsDir:f,rhsDir:e,rhsGroup:c,title:t}=N,i=we(N.lhsDir,N.rhsDir)?"segments":"straight",h={id:`${u}-${l}`,label:t,source:u,sourceDir:f,sourceArrow:a,sourceGroup:r,sourceEndpoint:f==="L"?"0 50%":f==="R"?"100% 50%":f==="T"?"50% 0":"50% 100%",target:l,targetDir:e,targetArrow:n,targetGroup:c,targetEndpoint:e==="L"?"0 50%":e==="R"?"100% 50%":e==="T"?"50% 0":"50% 100%"};w.add({group:"edges",data:h,classes:i})})}ct(hr,"addEdges");function lr(E,w,N){let u=ct((n,f)=>Object.entries(n).reduce((e,[c,t])=>{let i=0,h=Object.entries(t);if(h.length===1)return e[c]=h[0][1],e;for(let g=0;g{let f={},e={};return Object.entries(n).forEach(([c,[t,i]])=>{let h=E.getNode(c)?.in??"default";f[i]??={},f[i][h]??=[],f[i][h].push(c),e[t]??={},e[t][h]??=[],e[t][h].push(c)}),{horiz:Object.values(u(f,"horizontal")).filter(c=>c.length>1),vert:Object.values(u(e,"vertical")).filter(c=>c.length>1)}}),[a,r]=l.reduce(([n,f],{horiz:e,vert:c})=>[[...n,...e],[...f,...c]],[[],[]]);return{horizontal:a,vertical:r}}ct(lr,"getAlignments");function fr(E,w){let N=[],u=ct(a=>`${a[0]},${a[1]}`,"posToStr"),l=ct(a=>a.split(",").map(r=>parseInt(r)),"strToPos");return E.forEach(a=>{let r=Object.fromEntries(Object.entries(a).map(([c,t])=>[u(t),c])),n=[u([0,0])],f={},e={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;n.length>0;){let c=n.shift();if(c){f[c]=1;let t=r[c];if(t){let i=l(c);Object.entries(e).forEach(([h,g])=>{let s=u([i[0]+g[0],i[1]+g[1]]),L=r[s];L&&!f[s]&&(n.push(s),N.push({[Ke[h]]:L,[Ke[dr(h)]]:t,gap:1.5*w.getConfigField("iconSize")}))})}}}}),N}ct(fr,"getRelativeConstraints");function cr(E,w,N,u,l,{spatialMaps:a,groupAlignments:r}){return new Promise(n=>{let f=Ve("body").append("div").attr("id","cy").attr("style","display:none"),e=me({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge[label]",style:{label:"data(label)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${l.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${l.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});f.remove(),sr(N,e),nr(E,e,l),ar(w,e,l),hr(u,e);let c=lr(l,a,r),t=fr(a,l),i=l.getConfigField("iconSize"),h=l.getConfigField("idealEdgeLengthMultiplier")*i,g=.5*i,s=l.getConfigField("edgeElasticity"),L=e.layout({name:"fcose",quality:"proof",randomize:l.getConfigField("randomize"),nodeSeparation:l.getConfigField("nodeSeparation"),numIter:l.getConfigField("numIter"),styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(y){let[p,C]=y.connectedNodes(),{parent:R}=ee(p),{parent:A}=ee(C);return R===A?h:g},edgeElasticity(y){let[p,C]=y.connectedNodes(),{parent:R}=ee(p),{parent:A}=ee(C);return R===A?s:.001},alignmentConstraint:c,relativePlacementConstraint:t});L.one("layoutstop",()=>{function y(p,C,R,A){let b,W,{x:G,y:J}=p,{x,y:z}=C;W=(A-J+(G-R)*(J-z)/(G-x))/Math.sqrt(1+Math.pow((J-z)/(G-x),2)),b=Math.sqrt(Math.pow(A-J,2)+Math.pow(R-G,2)-Math.pow(W,2));let o=Math.sqrt(Math.pow(x-G,2)+Math.pow(z-J,2));b=b/o;let m=(x-G)*(A-J)-(z-J)*(R-G);switch(!0){case m>=0:m=1;break;case m<0:m=-1;break}let d=(x-G)*(R-G)+(z-J)*(A-J);switch(!0){case d>=0:d=1;break;case d<0:d=-1;break}return W=Math.abs(W)*m,b=b*d,{distances:W,weights:b}}ct(y,"getSegmentWeights"),e.startBatch();for(let p of Object.values(e.edges()))if(p.data?.()){let{x:C,y:R}=p.source().position(),{x:A,y:b}=p.target().position();if(C!==A&&R!==b){let W=p.sourceEndpoint(),G=p.targetEndpoint(),{sourceDir:J}=tr(p),[x,z]=Zt(J)?[W.x,G.y]:[G.x,W.y],{weights:o,distances:m}=y(W,G,x,z);p.style("segment-distances",m),p.style("segment-weights",o)}}e.endBatch(),L.run()}),L.run(),e.ready(y=>{ye.info("Ready",y),n(e)})})}ct(cr,"layoutArchitecture");var Ir=ct(async(E,w,N,u)=>{let l=u.db;l.setDiagramId(w);let a=l.getServices(),r=l.getJunctions(),n=l.getGroups(),f=l.getEdges(),e=l.getDataStructures(),c=ze(w),t=c.append("g");t.attr("class","architecture-edges");let i=c.append("g");i.attr("class","architecture-services");let h=c.append("g");h.attr("class","architecture-groups"),await Dr(l,i,a,w),xr(l,i,r,w);let g=await cr(a,r,n,f,l,e);await Mr(t,g,l,w),await Or(h,g,l,w),or(l,g),be(void 0,c,l.getConfigField("padding"),l.getConfigField("useMaxWidth"))},"draw"),Rr={draw:Ir},Wr={parser:rr,get db(){return new er},renderer:Rr,styles:wr};export{Wr as diagram}; -//# sourceMappingURL=architectureDiagram-3BPJPVTR-R6CHV6J7.min.js.map +//# sourceMappingURL=architectureDiagram-3BPJPVTR-OLGG2C47.min.js.map diff --git a/templates/tabulareditor/public/architectureDiagram-3BPJPVTR-R6CHV6J7.min.js.map b/templates/tabulareditor/public/architectureDiagram-3BPJPVTR-OLGG2C47.min.js.map similarity index 100% rename from templates/tabulareditor/public/architectureDiagram-3BPJPVTR-R6CHV6J7.min.js.map rename to templates/tabulareditor/public/architectureDiagram-3BPJPVTR-OLGG2C47.min.js.map diff --git a/templates/tabulareditor/public/blockDiagram-GPEHLZMM-LC63GRO2.min.js b/templates/tabulareditor/public/blockDiagram-GPEHLZMM-3OKIGOBQ.min.js similarity index 99% rename from templates/tabulareditor/public/blockDiagram-GPEHLZMM-LC63GRO2.min.js rename to templates/tabulareditor/public/blockDiagram-GPEHLZMM-3OKIGOBQ.min.js index 096b21707..ab01bc8a3 100644 --- a/templates/tabulareditor/public/blockDiagram-GPEHLZMM-LC63GRO2.min.js +++ b/templates/tabulareditor/public/blockDiagram-GPEHLZMM-3OKIGOBQ.min.js @@ -1,4 +1,4 @@ -import{a as qt}from"./chunk-MZ3CL6N5.min.js";import{D as Gt}from"./chunk-7MS36IQK.min.js";import{a as tt,d as Ut}from"./chunk-AZ7QTF4J.min.js";import{a as Vt,b as Zt}from"./chunk-QD4STHJA.min.js";import{f as lt}from"./chunk-WNWVX3PL.min.js";import{a as Xt,f as jt,p as et,r as kt}from"./chunk-IXKFR5M2.min.js";import"./chunk-HCOLC5CQ.min.js";import{B as $,F as M,H as wt,I as Ft,N as Pt,O as Wt,T as Yt,_ as C,a as At,b as Mt}from"./chunk-7PRAVCJT.min.js";import{J as Ht,N as Kt,b as g,d as L,j as _}from"./chunk-BJGJ3C53.min.js";import"./chunk-MY7PHHTQ.min.js";var Lt=(function(){var e=g(function(T,w,u,b){for(u=u||{},b=T.length;b--;u[T[b]]=w);return u},"o"),t=[1,15],a=[1,7],n=[1,13],s=[1,14],l=[1,19],r=[1,16],i=[1,17],c=[1,18],d=[8,30],o=[8,10,21,28,29,30,31,39,43,46],p=[1,23],y=[1,24],x=[8,10,15,16,21,28,29,30,31,39,43,46],m=[8,10,15,16,21,27,28,29,30,31,39,43,46],v=[1,49],k={trace:g(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:g(function(w,u,b,S,E,h,W){var f=h.length-1;switch(E){case 4:S.getLogger().debug("Rule: separator (NL) ");break;case 5:S.getLogger().debug("Rule: separator (Space) ");break;case 6:S.getLogger().debug("Rule: separator (EOF) ");break;case 7:S.getLogger().debug("Rule: hierarchy: ",h[f-1]),S.setHierarchy(h[f-1]);break;case 8:S.getLogger().debug("Stop NL ");break;case 9:S.getLogger().debug("Stop EOF ");break;case 10:S.getLogger().debug("Stop NL2 ");break;case 11:S.getLogger().debug("Stop EOF2 ");break;case 12:S.getLogger().debug("Rule: statement: ",h[f]),typeof h[f].length=="number"?this.$=h[f]:this.$=[h[f]];break;case 13:S.getLogger().debug("Rule: statement #2: ",h[f-1]),this.$=[h[f-1]].concat(h[f]);break;case 14:S.getLogger().debug("Rule: link: ",h[f],w),this.$={edgeTypeStr:h[f],label:""};break;case 15:S.getLogger().debug("Rule: LABEL link: ",h[f-3],h[f-1],h[f]),this.$={edgeTypeStr:h[f],label:h[f-1]};break;case 18:let R=parseInt(h[f]),q=S.generateId();this.$={id:q,type:"space",label:"",width:R,children:[]};break;case 23:S.getLogger().debug("Rule: (nodeStatement link node) ",h[f-2],h[f-1],h[f]," typestr: ",h[f-1].edgeTypeStr);let V=S.edgeStrToEdgeData(h[f-1].edgeTypeStr),ut=S.edgeStrToEdgeStartData(h[f-1].edgeTypeStr),st=S.edgeStrToThickness(h[f-1].edgeTypeStr),pt=S.edgeStrToPattern(h[f-1].edgeTypeStr);this.$=[{id:h[f-2].id,label:h[f-2].label,type:h[f-2].type,directions:h[f-2].directions},{id:h[f-2].id+"-"+h[f].id,start:h[f-2].id,end:h[f].id,label:h[f-1].label,type:"edge",thickness:st,pattern:pt,directions:h[f].directions,arrowTypeEnd:V,arrowTypeStart:ut},{id:h[f].id,label:h[f].label,type:S.typeStr2Type(h[f].typeStr),directions:h[f].directions}];break;case 24:S.getLogger().debug("Rule: nodeStatement (abc88 node size) ",h[f-1],h[f]),this.$={id:h[f-1].id,label:h[f-1].label,type:S.typeStr2Type(h[f-1].typeStr),directions:h[f-1].directions,widthInColumns:parseInt(h[f],10)};break;case 25:S.getLogger().debug("Rule: nodeStatement (node) ",h[f]),this.$={id:h[f].id,label:h[f].label,type:S.typeStr2Type(h[f].typeStr),directions:h[f].directions,widthInColumns:1};break;case 26:S.getLogger().debug("APA123",this?this:"na"),S.getLogger().debug("COLUMNS: ",h[f]),this.$={type:"column-setting",columns:h[f]==="auto"?-1:parseInt(h[f])};break;case 27:S.getLogger().debug("Rule: id-block statement : ",h[f-2],h[f-1]);let z=S.generateId();this.$={...h[f-2],type:"composite",children:h[f-1]};break;case 28:S.getLogger().debug("Rule: blockStatement : ",h[f-2],h[f-1],h[f]);let Z=S.generateId();this.$={id:Z,type:"composite",label:"",children:h[f-1]};break;case 29:S.getLogger().debug("Rule: node (NODE_ID separator): ",h[f]),this.$={id:h[f]};break;case 30:S.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",h[f-1],h[f]),this.$={id:h[f-1],label:h[f].label,typeStr:h[f].typeStr,directions:h[f].directions};break;case 31:S.getLogger().debug("Rule: dirList: ",h[f]),this.$=[h[f]];break;case 32:S.getLogger().debug("Rule: dirList: ",h[f-1],h[f]),this.$=[h[f-1]].concat(h[f]);break;case 33:S.getLogger().debug("Rule: nodeShapeNLabel: ",h[f-2],h[f-1],h[f]),this.$={typeStr:h[f-2]+h[f],label:h[f-1]};break;case 34:S.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",h[f-3],h[f-2]," #3:",h[f-1],h[f]),this.$={typeStr:h[f-3]+h[f],label:h[f-2],directions:h[f-1]};break;case 35:case 36:this.$={type:"classDef",id:h[f-1].trim(),css:h[f].trim()};break;case 37:this.$={type:"applyClass",id:h[f-1].trim(),styleClass:h[f].trim()};break;case 38:this.$={type:"applyStyles",id:h[f-1].trim(),stylesStr:h[f].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:t,11:3,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:n,29:s,31:l,39:r,43:i,46:c},{8:[1,20]},e(d,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:t,21:a,28:n,29:s,31:l,39:r,43:i,46:c}),e(o,[2,16],{14:22,15:p,16:y}),e(o,[2,17]),e(o,[2,18]),e(o,[2,19]),e(o,[2,20]),e(o,[2,21]),e(o,[2,22]),e(x,[2,25],{27:[1,25]}),e(o,[2,26]),{19:26,26:12,31:l},{10:t,11:27,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:n,29:s,31:l,39:r,43:i,46:c},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},e(m,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},e(d,[2,13]),{26:35,31:l},{31:[2,14]},{17:[1,36]},e(x,[2,24]),{10:t,11:37,13:4,14:22,15:p,16:y,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:n,29:s,31:l,39:r,43:i,46:c},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},e(m,[2,30]),{18:[1,43]},{18:[1,44]},e(x,[2,23]),{18:[1,45]},{30:[1,46]},e(o,[2,28]),e(o,[2,35]),e(o,[2,36]),e(o,[2,37]),e(o,[2,38]),{36:[1,47]},{33:48,34:v},{15:[1,50]},e(o,[2,27]),e(m,[2,33]),{38:[1,51]},{33:52,34:v,38:[2,31]},{31:[2,15]},e(m,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:g(function(w,u){if(u.recoverable)this.trace(w);else{var b=new Error(w);throw b.hash=u,b}},"parseError"),parse:g(function(w){var u=this,b=[0],S=[],E=[null],h=[],W=this.table,f="",R=0,q=0,V=0,ut=2,st=1,pt=h.slice.call(arguments,1),z=Object.create(this.lexer),Z={yy:{}};for(var ft in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ft)&&(Z.yy[ft]=this.yy[ft]);z.setInput(w,Z.yy),Z.yy.lexer=z,Z.yy.parser=this,typeof z.yylloc>"u"&&(z.yylloc={});var xt=z.yylloc;h.push(xt);var De=z.options&&z.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Te(Y){b.length=b.length-2*Y,E.length=E.length-Y,h.length=h.length-Y}g(Te,"popStack");function Rt(){var Y;return Y=S.pop()||z.lex()||st,typeof Y!="number"&&(Y instanceof Array&&(S=Y,Y=S.pop()),Y=u.symbols_[Y]||Y),Y}g(Rt,"lex");for(var P,bt,J,K,ea,yt,Q={},it,G,zt,nt;;){if(J=b[b.length-1],this.defaultActions[J]?K=this.defaultActions[J]:((P===null||typeof P>"u")&&(P=Rt()),K=W[J]&&W[J][P]),typeof K>"u"||!K.length||!K[0]){var mt="";nt=[];for(it in W[J])this.terminals_[it]&&it>ut&&nt.push("'"+this.terminals_[it]+"'");z.showPosition?mt="Parse error on line "+(R+1)+`: +import{a as qt}from"./chunk-MZ3CL6N5.min.js";import{D as Gt}from"./chunk-7MS36IQK.min.js";import{a as tt,d as Ut}from"./chunk-AZ7QTF4J.min.js";import{a as Vt,b as Zt}from"./chunk-STULGUR3.min.js";import{f as lt}from"./chunk-STQM5NEZ.min.js";import{a as Xt,f as jt,p as et,r as kt}from"./chunk-BSOUP4V7.min.js";import"./chunk-HCOLC5CQ.min.js";import{B as $,F as M,H as wt,I as Ft,N as Pt,O as Wt,T as Yt,_ as C,a as At,b as Mt}from"./chunk-OYCWXTBX.min.js";import{J as Ht,N as Kt,b as g,d as L,j as _}from"./chunk-BJGJ3C53.min.js";import"./chunk-MY7PHHTQ.min.js";var Lt=(function(){var e=g(function(T,w,u,b){for(u=u||{},b=T.length;b--;u[T[b]]=w);return u},"o"),t=[1,15],a=[1,7],n=[1,13],s=[1,14],l=[1,19],r=[1,16],i=[1,17],c=[1,18],d=[8,30],o=[8,10,21,28,29,30,31,39,43,46],p=[1,23],y=[1,24],x=[8,10,15,16,21,28,29,30,31,39,43,46],m=[8,10,15,16,21,27,28,29,30,31,39,43,46],v=[1,49],k={trace:g(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:g(function(w,u,b,S,E,h,W){var f=h.length-1;switch(E){case 4:S.getLogger().debug("Rule: separator (NL) ");break;case 5:S.getLogger().debug("Rule: separator (Space) ");break;case 6:S.getLogger().debug("Rule: separator (EOF) ");break;case 7:S.getLogger().debug("Rule: hierarchy: ",h[f-1]),S.setHierarchy(h[f-1]);break;case 8:S.getLogger().debug("Stop NL ");break;case 9:S.getLogger().debug("Stop EOF ");break;case 10:S.getLogger().debug("Stop NL2 ");break;case 11:S.getLogger().debug("Stop EOF2 ");break;case 12:S.getLogger().debug("Rule: statement: ",h[f]),typeof h[f].length=="number"?this.$=h[f]:this.$=[h[f]];break;case 13:S.getLogger().debug("Rule: statement #2: ",h[f-1]),this.$=[h[f-1]].concat(h[f]);break;case 14:S.getLogger().debug("Rule: link: ",h[f],w),this.$={edgeTypeStr:h[f],label:""};break;case 15:S.getLogger().debug("Rule: LABEL link: ",h[f-3],h[f-1],h[f]),this.$={edgeTypeStr:h[f],label:h[f-1]};break;case 18:let R=parseInt(h[f]),q=S.generateId();this.$={id:q,type:"space",label:"",width:R,children:[]};break;case 23:S.getLogger().debug("Rule: (nodeStatement link node) ",h[f-2],h[f-1],h[f]," typestr: ",h[f-1].edgeTypeStr);let V=S.edgeStrToEdgeData(h[f-1].edgeTypeStr),ut=S.edgeStrToEdgeStartData(h[f-1].edgeTypeStr),st=S.edgeStrToThickness(h[f-1].edgeTypeStr),pt=S.edgeStrToPattern(h[f-1].edgeTypeStr);this.$=[{id:h[f-2].id,label:h[f-2].label,type:h[f-2].type,directions:h[f-2].directions},{id:h[f-2].id+"-"+h[f].id,start:h[f-2].id,end:h[f].id,label:h[f-1].label,type:"edge",thickness:st,pattern:pt,directions:h[f].directions,arrowTypeEnd:V,arrowTypeStart:ut},{id:h[f].id,label:h[f].label,type:S.typeStr2Type(h[f].typeStr),directions:h[f].directions}];break;case 24:S.getLogger().debug("Rule: nodeStatement (abc88 node size) ",h[f-1],h[f]),this.$={id:h[f-1].id,label:h[f-1].label,type:S.typeStr2Type(h[f-1].typeStr),directions:h[f-1].directions,widthInColumns:parseInt(h[f],10)};break;case 25:S.getLogger().debug("Rule: nodeStatement (node) ",h[f]),this.$={id:h[f].id,label:h[f].label,type:S.typeStr2Type(h[f].typeStr),directions:h[f].directions,widthInColumns:1};break;case 26:S.getLogger().debug("APA123",this?this:"na"),S.getLogger().debug("COLUMNS: ",h[f]),this.$={type:"column-setting",columns:h[f]==="auto"?-1:parseInt(h[f])};break;case 27:S.getLogger().debug("Rule: id-block statement : ",h[f-2],h[f-1]);let z=S.generateId();this.$={...h[f-2],type:"composite",children:h[f-1]};break;case 28:S.getLogger().debug("Rule: blockStatement : ",h[f-2],h[f-1],h[f]);let Z=S.generateId();this.$={id:Z,type:"composite",label:"",children:h[f-1]};break;case 29:S.getLogger().debug("Rule: node (NODE_ID separator): ",h[f]),this.$={id:h[f]};break;case 30:S.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",h[f-1],h[f]),this.$={id:h[f-1],label:h[f].label,typeStr:h[f].typeStr,directions:h[f].directions};break;case 31:S.getLogger().debug("Rule: dirList: ",h[f]),this.$=[h[f]];break;case 32:S.getLogger().debug("Rule: dirList: ",h[f-1],h[f]),this.$=[h[f-1]].concat(h[f]);break;case 33:S.getLogger().debug("Rule: nodeShapeNLabel: ",h[f-2],h[f-1],h[f]),this.$={typeStr:h[f-2]+h[f],label:h[f-1]};break;case 34:S.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",h[f-3],h[f-2]," #3:",h[f-1],h[f]),this.$={typeStr:h[f-3]+h[f],label:h[f-2],directions:h[f-1]};break;case 35:case 36:this.$={type:"classDef",id:h[f-1].trim(),css:h[f].trim()};break;case 37:this.$={type:"applyClass",id:h[f-1].trim(),styleClass:h[f].trim()};break;case 38:this.$={type:"applyStyles",id:h[f-1].trim(),stylesStr:h[f].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:t,11:3,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:n,29:s,31:l,39:r,43:i,46:c},{8:[1,20]},e(d,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:t,21:a,28:n,29:s,31:l,39:r,43:i,46:c}),e(o,[2,16],{14:22,15:p,16:y}),e(o,[2,17]),e(o,[2,18]),e(o,[2,19]),e(o,[2,20]),e(o,[2,21]),e(o,[2,22]),e(x,[2,25],{27:[1,25]}),e(o,[2,26]),{19:26,26:12,31:l},{10:t,11:27,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:n,29:s,31:l,39:r,43:i,46:c},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},e(m,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},e(d,[2,13]),{26:35,31:l},{31:[2,14]},{17:[1,36]},e(x,[2,24]),{10:t,11:37,13:4,14:22,15:p,16:y,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:n,29:s,31:l,39:r,43:i,46:c},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},e(m,[2,30]),{18:[1,43]},{18:[1,44]},e(x,[2,23]),{18:[1,45]},{30:[1,46]},e(o,[2,28]),e(o,[2,35]),e(o,[2,36]),e(o,[2,37]),e(o,[2,38]),{36:[1,47]},{33:48,34:v},{15:[1,50]},e(o,[2,27]),e(m,[2,33]),{38:[1,51]},{33:52,34:v,38:[2,31]},{31:[2,15]},e(m,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:g(function(w,u){if(u.recoverable)this.trace(w);else{var b=new Error(w);throw b.hash=u,b}},"parseError"),parse:g(function(w){var u=this,b=[0],S=[],E=[null],h=[],W=this.table,f="",R=0,q=0,V=0,ut=2,st=1,pt=h.slice.call(arguments,1),z=Object.create(this.lexer),Z={yy:{}};for(var ft in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ft)&&(Z.yy[ft]=this.yy[ft]);z.setInput(w,Z.yy),Z.yy.lexer=z,Z.yy.parser=this,typeof z.yylloc>"u"&&(z.yylloc={});var xt=z.yylloc;h.push(xt);var De=z.options&&z.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Te(Y){b.length=b.length-2*Y,E.length=E.length-Y,h.length=h.length-Y}g(Te,"popStack");function Rt(){var Y;return Y=S.pop()||z.lex()||st,typeof Y!="number"&&(Y instanceof Array&&(S=Y,Y=S.pop()),Y=u.symbols_[Y]||Y),Y}g(Rt,"lex");for(var P,bt,J,K,ea,yt,Q={},it,G,zt,nt;;){if(J=b[b.length-1],this.defaultActions[J]?K=this.defaultActions[J]:((P===null||typeof P>"u")&&(P=Rt()),K=W[J]&&W[J][P]),typeof K>"u"||!K.length||!K[0]){var mt="";nt=[];for(it in W[J])this.terminals_[it]&&it>ut&&nt.push("'"+this.terminals_[it]+"'");z.showPosition?mt="Parse error on line "+(R+1)+`: `+z.showPosition()+` Expecting `+nt.join(", ")+", got '"+(this.terminals_[P]||P)+"'":mt="Parse error on line "+(R+1)+": Unexpected "+(P==st?"end of input":"'"+(this.terminals_[P]||P)+"'"),this.parseError(mt,{text:z.match,token:this.terminals_[P]||P,line:z.yylineno,loc:xt,expected:nt})}if(K[0]instanceof Array&&K.length>1)throw new Error("Parse Error: multiple actions possible at state: "+J+", token: "+P);switch(K[0]){case 1:b.push(P),E.push(z.yytext),h.push(z.yylloc),b.push(K[1]),P=null,bt?(P=bt,bt=null):(q=z.yyleng,f=z.yytext,R=z.yylineno,xt=z.yylloc,V>0&&V--);break;case 2:if(G=this.productions_[K[1]][1],Q.$=E[E.length-G],Q._$={first_line:h[h.length-(G||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(G||1)].first_column,last_column:h[h.length-1].last_column},De&&(Q._$.range=[h[h.length-(G||1)].range[0],h[h.length-1].range[1]]),yt=this.performAction.apply(Q,[f,q,R,Z.yy,K[1],E,h].concat(pt)),typeof yt<"u")return yt;G&&(b=b.slice(0,-1*G*2),E=E.slice(0,-1*G),h=h.slice(0,-1*G)),b.push(this.productions_[K[1]][0]),E.push(Q.$),h.push(Q._$),zt=W[b[b.length-2]][b[b.length-1]],b.push(zt);break;case 3:return!0}}return!0},"parse")},D=(function(){var T={EOF:1,parseError:g(function(u,b){if(this.yy.parser)this.yy.parser.parseError(u,b);else throw new Error(u)},"parseError"),setInput:g(function(w,u){return this.yy=u||this.yy||{},this._input=w,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:g(function(){var w=this._input[0];this.yytext+=w,this.yyleng++,this.offset++,this.match+=w,this.matched+=w;var u=w.match(/(?:\r\n?|\n).*/g);return u?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),w},"input"),unput:g(function(w){var u=w.length,b=w.split(/(?:\r\n?|\n)/g);this._input=w+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-u),this.offset-=u;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),b.length-1&&(this.yylineno-=b.length-1);var E=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:b?(b.length===S.length?this.yylloc.first_column:0)+S[S.length-b.length].length-b[0].length:this.yylloc.first_column-u},this.options.ranges&&(this.yylloc.range=[E[0],E[0]+this.yyleng-u]),this.yyleng=this.yytext.length,this},"unput"),more:g(function(){return this._more=!0,this},"more"),reject:g(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:g(function(w){this.unput(this.match.slice(w))},"less"),pastInput:g(function(){var w=this.matched.substr(0,this.matched.length-this.match.length);return(w.length>20?"...":"")+w.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:g(function(){var w=this.match;return w.length<20&&(w+=this._input.substr(0,20-w.length)),(w.substr(0,20)+(w.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:g(function(){var w=this.pastInput(),u=new Array(w.length+1).join("-");return w+this.upcomingInput()+` @@ -130,4 +130,4 @@ Expecting `+nt.join(", ")+", got '"+(this.terminals_[P]||P)+"'":mt="Parse error outsidePoint: ${JSON.stringify(t)} insidePoint : ${JSON.stringify(a)} node : x:${e.x} y:${e.y} w:${e.width} h:${e.height}`);let n=e.x,s=e.y,l=Math.abs(n-a.x),r=e.width/2,i=a.xMath.abs(n-t.x)*c){let p=a.y{L.debug("abc88 cutPathAtIntersect",e,t);let a=[],n=e[0],s=!1;return e.forEach(l=>{if(!br(t,l)&&!s){let r=yr(t,n,l),i=!1;a.forEach(c=>{i=i||c.x===r.x&&c.y===r.y}),a.some(c=>c.x===r.x&&c.y===r.y)||a.push(r),s=!0}else n=l,s||a.push(l)}),a},"cutPathAtIntersect"),mr=g(function(e,t,a,n,s,l,r){let i=a.points;L.debug("abc88 InsertEdge: edge=",a,"e=",t);let c=!1,d=l.node(t.v);var o=l.node(t.w);o?.intersect&&d?.intersect&&(i=i.slice(1,a.points.length-1),i.unshift(d.intersect(i[0])),i.push(o.intersect(i[i.length-1]))),a.toCluster&&(L.debug("to cluster abc88",n[a.toCluster]),i=ee(a.points,n[a.toCluster].node),c=!0),a.fromCluster&&(L.debug("from cluster abc88",n[a.fromCluster]),i=ee(i.reverse(),n[a.fromCluster].node).reverse(),c=!0);let p=i.filter(w=>!Number.isNaN(w.y)),y=Kt;a.curve&&(s==="graph"||s==="flowchart")&&(y=a.curve);let{x,y:m}=Ut(a),v=Ht().x(x).y(m).curve(y),k;switch(a.thickness){case"normal":k="edge-thickness-normal";break;case"thick":k="edge-thickness-thick";break;case"invisible":k="edge-thickness-thick";break;default:k=""}switch(a.pattern){case"solid":k+=" edge-pattern-solid";break;case"dotted":k+=" edge-pattern-dotted";break;case"dashed":k+=" edge-pattern-dashed";break}let D=e.append("path").attr("d",v(p)).attr("id",a.id).attr("class"," "+k+(a.classes?" "+a.classes:"")).attr("style",a.style),N="";(C().flowchart.arrowMarkerAbsolute||C().state.arrowMarkerAbsolute)&&(N=Ft(!0)),ur(D,a,N,r,s);let T={};return c&&(T.updatedPath=i),T.originalPath=a.points,T},"insertEdge"),wr=g(e=>{let t=new Set;for(let a of e)switch(a){case"x":t.add("right"),t.add("left");break;case"y":t.add("up"),t.add("down");break;default:t.add(a);break}return t},"expandAndDeduplicateDirections"),kr=g((e,t,a,n)=>{let s=wr(e),l=2,r=t.height+2*a.padding,i=r/l,c=n??t.width+2*i+a.padding,d=a.padding/2;return s.has("right")&&s.has("left")&&s.has("up")&&s.has("down")?[{x:0,y:0},{x:i,y:0},{x:c/2,y:2*d},{x:c-i,y:0},{x:c,y:0},{x:c,y:-r/3},{x:c+2*d,y:-r/2},{x:c,y:-2*r/3},{x:c,y:-r},{x:c-i,y:-r},{x:c/2,y:-r-2*d},{x:i,y:-r},{x:0,y:-r},{x:0,y:-2*r/3},{x:-2*d,y:-r/2},{x:0,y:-r/3}]:s.has("right")&&s.has("left")&&s.has("up")?[{x:i,y:0},{x:c-i,y:0},{x:c,y:-r/2},{x:c-i,y:-r},{x:i,y:-r},{x:0,y:-r/2}]:s.has("right")&&s.has("left")&&s.has("down")?[{x:0,y:0},{x:i,y:-r},{x:c-i,y:-r},{x:c,y:0}]:s.has("right")&&s.has("up")&&s.has("down")?[{x:0,y:0},{x:c,y:-i},{x:c,y:-r+i},{x:0,y:-r}]:s.has("left")&&s.has("up")&&s.has("down")?[{x:c,y:0},{x:0,y:-i},{x:0,y:-r+i},{x:c,y:-r}]:s.has("right")&&s.has("left")?[{x:i,y:0},{x:i,y:-d},{x:c-i,y:-d},{x:c-i,y:0},{x:c,y:-r/2},{x:c-i,y:-r},{x:c-i,y:-r+d},{x:i,y:-r+d},{x:i,y:-r},{x:0,y:-r/2}]:s.has("up")&&s.has("down")?[{x:c/2,y:0},{x:0,y:-d},{x:i,y:-d},{x:i,y:-r+d},{x:0,y:-r+d},{x:c/2,y:-r},{x:c,y:-r+d},{x:c-i,y:-r+d},{x:c-i,y:-d},{x:c,y:-d}]:s.has("right")&&s.has("up")?[{x:0,y:0},{x:c,y:-i},{x:0,y:-r}]:s.has("right")&&s.has("down")?[{x:0,y:0},{x:c,y:0},{x:0,y:-r}]:s.has("left")&&s.has("up")?[{x:c,y:0},{x:0,y:-i},{x:c,y:-r}]:s.has("left")&&s.has("down")?[{x:c,y:0},{x:0,y:0},{x:c,y:-r}]:s.has("right")?[{x:i,y:-d},{x:i,y:-d},{x:c-i,y:-d},{x:c-i,y:0},{x:c,y:-r/2},{x:c-i,y:-r},{x:c-i,y:-r+d},{x:i,y:-r+d},{x:i,y:-r+d}]:s.has("left")?[{x:i,y:0},{x:i,y:-d},{x:c-i,y:-d},{x:c-i,y:-r+d},{x:i,y:-r+d},{x:i,y:-r},{x:0,y:-r/2}]:s.has("up")?[{x:i,y:-d},{x:i,y:-r+d},{x:0,y:-r+d},{x:c/2,y:-r},{x:c,y:-r+d},{x:c-i,y:-r+d},{x:c-i,y:-d}]:s.has("down")?[{x:c/2,y:0},{x:0,y:-d},{x:i,y:-d},{x:i,y:-r+d},{x:c-i,y:-r+d},{x:c-i,y:-d},{x:c,y:-d}]:[{x:0,y:0}]},"getArrowPoints");function fe(e,t){return e.intersect(t)}g(fe,"intersectNode");var Sr=fe;function xe(e,t,a,n){var s=e.x,l=e.y,r=s-n.x,i=l-n.y,c=Math.sqrt(t*t*i*i+a*a*r*r),d=Math.abs(t*a*r/c);n.x0}g(Dt,"sameSign");var vr=me,Er=we;function we(e,t,a){var n=e.x,s=e.y,l=[],r=Number.POSITIVE_INFINITY,i=Number.POSITIVE_INFINITY;typeof t.forEach=="function"?t.forEach(function(m){r=Math.min(r,m.x),i=Math.min(i,m.y)}):(r=Math.min(r,t.x),i=Math.min(i,t.y));for(var c=n-e.width/2-r,d=s-e.height/2-i,o=0;o1&&l.sort(function(m,v){var k=m.x-a.x,D=m.y-a.y,N=Math.sqrt(k*k+D*D),T=v.x-a.x,w=v.y-a.y,u=Math.sqrt(T*T+w*w);return N{var a=e.x,n=e.y,s=t.x-a,l=t.y-n,r=e.width/2,i=e.height/2,c,d;return Math.abs(l)*r>Math.abs(s)*i?(l<0&&(i=-i),c=l===0?0:i*s/l,d=i):(s<0&&(r=-r),c=r,d=s===0?0:r*l/s),{x:a+c,y:n+d}},"intersectRect"),Dr=_r,B={node:Sr,circle:Lr,ellipse:be,polygon:Er,rect:Dr},A=g(async(e,t,a,n)=>{let s=C(),l,r=t.useHtmlLabels||M(s);a?l=a:l="node default";let i=e.insert("g").attr("class",l).attr("id",t.domId||t.id),c=i.insert("g").attr("class","label").attr("style",t.labelStyle),d;t.labelText===void 0?d="":d=typeof t.labelText=="string"?t.labelText:t.labelText[0];let o;t.labelType==="markdown"?o=lt(c,wt(kt(d),s),{useHtmlLabels:r,width:t.width||s.flowchart.wrappingWidth,classes:"markdown-node-label"},s):o=await U(c,wt(kt(d),s),t.labelStyle,!1,n);let p=o.getBBox(),y=t.padding/2;if(M(s)){let x=o.children[0],m=_(o);await Zt(x,d),p=x.getBoundingClientRect(),m.attr("width",p.width),m.attr("height",p.height)}return r?c.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):c.attr("transform","translate(0, "+-p.height/2+")"),t.centerLabel&&c.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),c.insert("rect",":first-child"),{shapeSvg:i,bbox:p,halfPadding:y,label:c}},"labelHelper"),I=g((e,t)=>{let a=t.node().getBBox();e.width=a.width,e.height=a.height},"updateNodeBounds");function j(e,t,a,n){return e.insert("polygon",":first-child").attr("points",n.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-t/2+","+a/2+")")}g(j,"insertPolygonShape");var Tr=g(async(e,t)=>{t.useHtmlLabels||M(C())||(t.centerLabel=!0);let{shapeSvg:n,bbox:s,halfPadding:l}=await A(e,t,"node "+t.classes,!0);L.info("Classes = ",t.classes);let r=n.insert("rect",":first-child");return r.attr("rx",t.rx).attr("ry",t.ry).attr("x",-s.width/2-l).attr("y",-s.height/2-l).attr("width",s.width+t.padding).attr("height",s.height+t.padding),I(t,r),t.intersect=function(i){return B.rect(t,i)},n},"note"),Br=Tr,re=g(e=>e?" "+e:"","formatClass"),H=g((e,t)=>`${t||"node default"}${re(e.classes)} ${re(e.class)}`,"getClassesFromNode"),ae=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=s+l,i=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];L.info("Question main (Circle)");let c=j(a,r,r,i);return c.attr("style",t.style),I(t,c),t.intersect=function(d){return L.warn("Intersect called"),B.polygon(t,i,d)},a},"question"),Ir=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),n=28,s=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return a.insert("polygon",":first-child").attr("points",s.map(function(r){return r.x+","+r.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),t.width=28,t.height=28,t.intersect=function(r){return B.circle(t,14,r)},a},"choice"),Nr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=4,l=t.positioned?t.height:n.height+t.padding,r=l/s,i=t.positioned?t.width:n.width+2*r+t.padding,c=[{x:r,y:0},{x:i-r,y:0},{x:i,y:-l/2},{x:i-r,y:-l},{x:r,y:-l},{x:0,y:-l/2}],d=j(a,i,l,c);return d.attr("style",t.style),I(t,d),t.intersect=function(o){return B.polygon(t,c,o)},a},"hexagon"),Cr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,void 0,!0),s=2,l=n.height+2*t.padding,r=l/s,i=n.width+2*r+t.padding,d=t.positioned&&(t.widthInColumns??1)>1&&t.width>i?t.width:i,o=kr(t.directions,n,t,d),p=j(a,d,l,o);return p.attr("style",t.style),I(t,p),t.intersect=function(y){return B.polygon(t,o,y)},a},"block_arrow"),Or=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:-l/2,y:0},{x:s,y:0},{x:s,y:-l},{x:-l/2,y:-l},{x:0,y:-l/2}];return j(a,s,l,r).attr("style",t.style),t.width=s+l,t.height=l,t.intersect=function(c){return B.polygon(t,r,c)},a},"rect_left_inv_arrow"),Rr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:-2*l/6,y:0},{x:s-l/6,y:0},{x:s+2*l/6,y:-l},{x:l/6,y:-l}],i=j(a,s,l,r);return i.attr("style",t.style),I(t,i),t.intersect=function(c){return B.polygon(t,r,c)},a},"lean_right"),zr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:2*l/6,y:0},{x:s+l/6,y:0},{x:s-2*l/6,y:-l},{x:-l/6,y:-l}],i=j(a,s,l,r);return i.attr("style",t.style),I(t,i),t.intersect=function(c){return B.polygon(t,r,c)},a},"lean_left"),Ar=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:-2*l/6,y:0},{x:s+2*l/6,y:0},{x:s-l/6,y:-l},{x:l/6,y:-l}],i=j(a,s,l,r);return i.attr("style",t.style),I(t,i),t.intersect=function(c){return B.polygon(t,r,c)},a},"trapezoid"),Mr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:l/6,y:0},{x:s-l/6,y:0},{x:s+2*l/6,y:-l},{x:-2*l/6,y:-l}],i=j(a,s,l,r);return i.attr("style",t.style),I(t,i),t.intersect=function(c){return B.polygon(t,r,c)},a},"inv_trapezoid"),Fr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:0,y:0},{x:s+l/2,y:0},{x:s,y:-l/2},{x:s+l/2,y:-l},{x:0,y:-l}],i=j(a,s,l,r);return i.attr("style",t.style),I(t,i),t.intersect=function(c){return B.polygon(t,r,c)},a},"rect_right_inv_arrow"),Pr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=s/2,r=l/(2.5+s/50),i=n.height+r+t.padding,c="M 0,"+r+" a "+l+","+r+" 0,0,0 "+s+" 0 a "+l+","+r+" 0,0,0 "+-s+" 0 l 0,"+i+" a "+l+","+r+" 0,0,0 "+s+" 0 l 0,"+-i,d=a.attr("label-offset-y",r).insert("path",":first-child").attr("style",t.style).attr("d",c).attr("transform","translate("+-s/2+","+-(i/2+r)+")");return I(t,d),t.intersect=function(o){let p=B.rect(t,o),y=p.x-t.x;if(l!=0&&(Math.abs(y)t.height/2-r)){let x=r*r*(1-y*y/(l*l));x!=0&&(x=Math.sqrt(x)),x=r-x,o.y-t.y>0&&(x=-x),p.y+=x}return p},a},"cylinder"),Wr=g(async(e,t)=>{let{shapeSvg:a,bbox:n,halfPadding:s}=await A(e,t,"node "+t.classes+" "+t.class,!0),l=a.insert("rect",":first-child"),r=t.positioned?t.width:n.width+t.padding,i=t.positioned?t.height:n.height+t.padding,c=t.positioned?-r/2:-n.width/2-s,d=t.positioned?-i/2:-n.height/2-s;if(l.attr("class","basic label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",c).attr("y",d).attr("width",r).attr("height",i),t.props){let o=new Set(Object.keys(t.props));t.props.borders&&(dt(l,t.props.borders,r,i),o.delete("borders")),o.forEach(p=>{L.warn(`Unknown node property ${p}`)})}return I(t,l),t.intersect=function(o){return B.rect(t,o)},a},"rect"),Yr=g(async(e,t)=>{let{shapeSvg:a,bbox:n,halfPadding:s}=await A(e,t,"node "+t.classes,!0),l=a.insert("rect",":first-child"),r=t.positioned?t.width:n.width+t.padding,i=t.positioned?t.height:n.height+t.padding,c=t.positioned?-r/2:-n.width/2-s,d=t.positioned?-i/2:-n.height/2-s;if(l.attr("class","basic cluster composite label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",c).attr("y",d).attr("width",r).attr("height",i),t.props){let o=new Set(Object.keys(t.props));t.props.borders&&(dt(l,t.props.borders,r,i),o.delete("borders")),o.forEach(p=>{L.warn(`Unknown node property ${p}`)})}return I(t,l),t.intersect=function(o){return B.rect(t,o)},a},"composite"),Hr=g(async(e,t)=>{let{shapeSvg:a}=await A(e,t,"label",!0);L.trace("Classes = ",t.class);let n=a.insert("rect",":first-child"),s=0,l=0;if(n.attr("width",s).attr("height",l),a.attr("class","label edgeLabel"),t.props){let r=new Set(Object.keys(t.props));t.props.borders&&(dt(n,t.props.borders,s,l),r.delete("borders")),r.forEach(i=>{L.warn(`Unknown node property ${i}`)})}return I(t,n),t.intersect=function(r){return B.rect(t,r)},a},"labelRect");function dt(e,t,a,n){let s=[],l=g(i=>{s.push(i,0)},"addBorder"),r=g(i=>{s.push(0,i)},"skipBorder");t.includes("t")?(L.debug("add top border"),l(a)):r(a),t.includes("r")?(L.debug("add right border"),l(n)):r(n),t.includes("b")?(L.debug("add bottom border"),l(a)):r(a),t.includes("l")?(L.debug("add left border"),l(n)):r(n),e.attr("stroke-dasharray",s.join(" "))}g(dt,"applyNodePropertyBorders");var Kr=g(async(e,t)=>{let a;t.classes?a="node "+t.classes:a="node default";let n=e.insert("g").attr("class",a).attr("id",t.domId||t.id),s=n.insert("rect",":first-child"),l=n.insert("line"),r=n.insert("g").attr("class","label"),i=t.labelText.flat?t.labelText.flat():t.labelText,c="";typeof i=="object"?c=i[0]:c=i,L.info("Label text abc79",c,i,typeof i=="object");let d=await U(r,c,t.labelStyle,!0,!0),o={width:0,height:0};if(M(C())){let v=d.children[0],k=_(d);o=v.getBoundingClientRect(),k.attr("width",o.width),k.attr("height",o.height)}L.info("Text 2",i);let p=i.slice(1,i.length),y=d.getBBox(),x=await U(r,p.join?p.join("
    "):p,t.labelStyle,!0,!0);if(M(C())){let v=x.children[0],k=_(x);o=v.getBoundingClientRect(),k.attr("width",o.width),k.attr("height",o.height)}let m=t.padding/2;return _(x).attr("transform","translate( "+(o.width>y.width?0:(y.width-o.width)/2)+", "+(y.height+m+5)+")"),_(d).attr("transform","translate( "+(o.width{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.height+t.padding,l=n.width+s/4+t.padding,r=a.insert("rect",":first-child").attr("style",t.style).attr("rx",s/2).attr("ry",s/2).attr("x",-l/2).attr("y",-s/2).attr("width",l).attr("height",s);return I(t,r),t.intersect=function(i){return B.rect(t,i)},a},"stadium"),Xr=g(async(e,t)=>{let{shapeSvg:a,bbox:n,halfPadding:s}=await A(e,t,H(t,void 0),!0),l=a.insert("circle",":first-child");return l.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",n.width/2+s).attr("width",n.width+t.padding).attr("height",n.height+t.padding),L.info("Circle main"),I(t,l),t.intersect=function(r){return L.info("Circle intersect",t,n.width/2+s,r),B.circle(t,n.width/2+s,r)},a},"circle"),jr=g(async(e,t)=>{let{shapeSvg:a,bbox:n,halfPadding:s}=await A(e,t,H(t,void 0),!0),l=5,r=a.insert("g",":first-child"),i=r.insert("circle"),c=r.insert("circle");return r.attr("class",t.class),i.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",n.width/2+s+l).attr("width",n.width+t.padding+l*2).attr("height",n.height+t.padding+l*2),c.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",n.width/2+s).attr("width",n.width+t.padding).attr("height",n.height+t.padding),L.info("DoubleCircle main"),I(t,i),t.intersect=function(d){return L.info("DoubleCircle intersect",t,n.width/2+s+l,d),B.circle(t,n.width/2+s+l,d)},a},"doublecircle"),Vr=g(async(e,t)=>{let{shapeSvg:a,bbox:n}=await A(e,t,H(t,void 0),!0),s=n.width+t.padding,l=n.height+t.padding,r=[{x:0,y:0},{x:s,y:0},{x:s,y:-l},{x:0,y:-l},{x:0,y:0},{x:-8,y:0},{x:s+8,y:0},{x:s+8,y:-l},{x:-8,y:-l},{x:-8,y:0}],i=j(a,s,l,r);return i.attr("style",t.style),I(t,i),t.intersect=function(c){return B.polygon(t,r,c)},a},"subroutine"),Zr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),n=a.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),I(t,n),t.intersect=function(s){return B.circle(t,7,s)},a},"start"),se=g((e,t,a)=>{let n=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),s=70,l=10;a==="LR"&&(s=10,l=70);let r=n.append("rect").attr("x",-1*s/2).attr("y",-1*l/2).attr("width",s).attr("height",l).attr("class","fork-join");return I(t,r),t.height=t.height+t.padding/2,t.width=t.width+t.padding/2,t.intersect=function(i){return B.rect(t,i)},n},"forkJoin"),Gr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),n=a.insert("circle",":first-child"),s=a.insert("circle",":first-child");return s.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),I(t,s),t.intersect=function(l){return B.circle(t,7,l)},a},"end"),qr=g(async(e,t)=>{let a=t.padding/2,n=4,s=8,l;t.classes?l="node "+t.classes:l="node default";let r=e.insert("g").attr("class",l).attr("id",t.domId||t.id),i=r.insert("rect",":first-child"),c=r.insert("line"),d=r.insert("line"),o=0,p=n,y=r.insert("g").attr("class","label"),x=0,m=t.classData.annotations?.[0],v=t.classData.annotations[0]?"\xAB"+t.classData.annotations[0]+"\xBB":"",k=await U(y,v,t.labelStyle,!0,!0),D=k.getBBox();if(M(C())){let E=k.children[0],h=_(k);D=E.getBoundingClientRect(),h.attr("width",D.width),h.attr("height",D.height)}t.classData.annotations[0]&&(p+=D.height+n,o+=D.width);let N=t.classData.label;t.classData.type!==void 0&&t.classData.type!==""&&(M(C())?N+="<"+t.classData.type+">":N+="<"+t.classData.type+">");let T=await U(y,N,t.labelStyle,!0,!0);_(T).attr("class","classTitle");let w=T.getBBox();if(M(C())){let E=T.children[0],h=_(T);w=E.getBoundingClientRect(),h.attr("width",w.width),h.attr("height",w.height)}p+=w.height+n,w.width>o&&(o=w.width);let u=[];t.classData.members.forEach(async E=>{let h=E.getDisplayDetails(),W=h.displayText;M(C())&&(W=W.replace(//g,">"));let f=await U(y,W,h.cssStyle?h.cssStyle:t.labelStyle,!0,!0),R=f.getBBox();if(M(C())){let q=f.children[0],V=_(f);R=q.getBoundingClientRect(),V.attr("width",R.width),V.attr("height",R.height)}R.width>o&&(o=R.width),p+=R.height+n,u.push(f)}),p+=s;let b=[];if(t.classData.methods.forEach(async E=>{let h=E.getDisplayDetails(),W=h.displayText;M(C())&&(W=W.replace(//g,">"));let f=await U(y,W,h.cssStyle?h.cssStyle:t.labelStyle,!0,!0),R=f.getBBox();if(M(C())){let q=f.children[0],V=_(f);R=q.getBoundingClientRect(),V.attr("width",R.width),V.attr("height",R.height)}R.width>o&&(o=R.width),p+=R.height+n,b.push(f)}),p+=s,m){let E=(o-D.width)/2;_(k).attr("transform","translate( "+(-1*o/2+E)+", "+-1*p/2+")"),x=D.height+n}let S=(o-w.width)/2;return _(T).attr("transform","translate( "+(-1*o/2+S)+", "+(-1*p/2+x)+")"),x+=w.height+n,c.attr("class","divider").attr("x1",-o/2-a).attr("x2",o/2+a).attr("y1",-p/2-a+s+x).attr("y2",-p/2-a+s+x),x+=s,u.forEach(E=>{_(E).attr("transform","translate( "+-o/2+", "+(-1*p/2+x+s/2)+")");let h=E?.getBBox();x+=(h?.height??0)+n}),x+=s,d.attr("class","divider").attr("x1",-o/2-a).attr("x2",o/2+a).attr("y1",-p/2-a+s+x).attr("y2",-p/2-a+s+x),x+=s,b.forEach(E=>{_(E).attr("transform","translate( "+-o/2+", "+(-1*p/2+x)+")");let h=E?.getBBox();x+=(h?.height??0)+n}),i.attr("style",t.style).attr("class","outer title-state").attr("x",-o/2-a).attr("y",-(p/2)-a).attr("width",o+t.padding).attr("height",p+t.padding),I(t,i),t.intersect=function(E){return B.rect(t,E)},r},"class_box"),ie={rhombus:ae,composite:Yr,question:ae,rect:Wr,labelRect:Hr,rectWithTitle:Kr,choice:Ir,circle:Xr,doublecircle:jr,stadium:Ur,hexagon:Nr,block_arrow:Cr,rect_left_inv_arrow:Or,lean_right:Rr,lean_left:zr,trapezoid:Ar,inv_trapezoid:Mr,rect_right_inv_arrow:Fr,cylinder:Pr,start:Zr,end:Gr,note:Br,subroutine:Vr,fork:se,join:se,class_box:qr},ct={},ke=g(async(e,t,a)=>{let n,s;if(t.link){let l;C().securityLevel==="sandbox"?l="_top":t.linkTarget&&(l=t.linkTarget||"_blank"),n=e.insert("svg:a").attr("xlink:href",t.link).attr("target",l),s=await ie[t.shape](n,t,a)}else s=await ie[t.shape](e,t,a),n=s;return t.tooltip&&s.attr("title",t.tooltip),t.class&&s.attr("class","node default "+t.class),ct[t.id]=n,t.haveCallback&&ct[t.id].attr("class",ct[t.id].attr("class")+" clickable"),n},"insertNode"),Jr=g(e=>{let t=ct[e.id];L.trace("Transforming node",e.diff,e,"translate("+(e.x-e.width/2-5)+", "+e.width/2+")");let a=8,n=e.diff||0;return e.clusterNode?t.attr("transform","translate("+(e.x+n-e.width/2)+", "+(e.y-e.height/2-a)+")"):t.attr("transform","translate("+e.x+", "+e.y+")"),n},"positionNode");function Ot(e,t,a=!1){let n=e,s="default";(n?.classes?.length||0)>0&&(s=(n?.classes??[]).join(" ")),s=s+" flowchart-label";let l=0,r="",i;switch(n.type){case"round":l=5,r="rect";break;case"composite":l=0,r="composite",i=0;break;case"square":r="rect";break;case"diamond":r="question";break;case"hexagon":r="hexagon";break;case"block_arrow":r="block_arrow";break;case"odd":r="rect_left_inv_arrow";break;case"lean_right":r="lean_right";break;case"lean_left":r="lean_left";break;case"trapezoid":r="trapezoid";break;case"inv_trapezoid":r="inv_trapezoid";break;case"rect_left_inv_arrow":r="rect_left_inv_arrow";break;case"circle":r="circle";break;case"ellipse":r="ellipse";break;case"stadium":r="stadium";break;case"subroutine":r="subroutine";break;case"cylinder":r="cylinder";break;case"group":r="rect";break;case"doublecircle":r="doublecircle";break;default:r="rect"}let c=jt(n?.styles??[]),d=n.label,o=n.size??{width:0,height:0,x:0,y:0},p=t.getDiagramId();return{labelStyle:c.labelStyle,shape:r,labelText:d,rx:l,ry:l,class:s,style:c.style,id:n.id,domId:p?`${p}-${n.id}`:n.id,directions:n.directions,width:o.width,height:o.height,x:o.x,y:o.y,positioned:a,intersect:void 0,type:n.type,padding:i??$()?.block?.padding??0,widthInColumns:n.widthInColumns??1}}g(Ot,"getNodeFromBlock");async function Se(e,t,a){let n=Ot(t,a,!1);if(n.type==="group")return;let s=$(),l=await ke(e,n,{config:s}),r=l.node().getBBox(),i=a.getBlock(n.id);i.size={width:r.width,height:r.height,x:0,y:0,node:l},a.setBlock(i),l.remove()}g(Se,"calculateBlockSize");async function Le(e,t,a){let n=Ot(t,a,!0);if(a.getBlock(n.id).type!=="space"){let l=$();await ke(e,n,{config:l}),t.intersect=n?.intersect,Jr(n)}}g(Le,"insertBlockPositioned");async function gt(e,t,a,n){for(let s of t)await n(e,s,a),s.children&&await gt(e,s.children,a,n)}g(gt,"performOperations");async function ve(e,t,a){await gt(e,t,a,Se)}g(ve,"calculateBlockSizes");async function Ee(e,t,a){await gt(e,t,a,Le)}g(Ee,"insertBlocks");async function _e(e,t,a,n,s){let l=new Gt({multigraph:!0,compound:!0});l.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let r of a)r.size&&l.setNode(r.id,{width:r.size.width,height:r.size.height,intersect:r.intersect});for(let r of t)if(r.start&&r.end){let i=n.getBlock(r.start),c=n.getBlock(r.end);if(i?.size&&c?.size){let d=i.size,o=c.size,p=[{x:d.x,y:d.y},{x:d.x+(o.x-d.x)/2,y:d.y+(o.y-d.y)/2},{x:o.x,y:o.y}],y=s?`${s}-${r.id}`:r.id,x=r.thickness==="thick"?"edge-thickness-thick":"edge-thickness-normal",m=r.pattern==="dotted"?"edge-pattern-dotted":"edge-pattern-solid",v=`${x} ${m} flowchart-link LS-a1 LE-b1`;mr(e,{v:r.start,w:r.end,name:y},{...r,id:y,arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:p,classes:v},void 0,"block",l,s),r.label&&(await fr(e,{...r,label:r.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:p,classes:v}),xr({...r,x:p[1].x,y:p[1].y},{originalPath:p}))}}}g(_e,"insertEdges");var Qr=g(function(e,t){return t.db.getClasses()},"getClasses"),$r=g(async function(e,t,a,n){let{securityLevel:s,block:l}=$(),r=n.db;r.setDiagramId(t);let i;s==="sandbox"&&(i=_("#i"+t));let c=s==="sandbox"?_(i.nodes()[0].contentDocument.body):_("body"),d=s==="sandbox"?c.select(`[id="${t}"]`):_(`[id="${t}"]`);hr(d,["point","circle","cross"],n.type,t);let p=r.getBlocks(),y=r.getBlocksFlat(),x=r.getEdges(),m=d.insert("g").attr("class","block");await ve(m,p,r);let v=pe(r);if(await Ee(m,p,r),await _e(m,x,y,r,t),v){let k=v,D=Math.max(1,Math.round(.125*(k.width/k.height))),N=k.height+D+10,T=k.width+10,{useMaxWidth:w}=l;Wt(d,N,T,!!w),L.debug("Here Bounds",v,k),d.attr("viewBox",`${k.x-5} ${k.y-5} ${k.width+10} ${k.height+10}`)}},"draw"),ta={draw:$r,getClasses:Qr},xa={parser:Be,db:qe,renderer:ta,styles:Qe};export{xa as diagram}; -//# sourceMappingURL=blockDiagram-GPEHLZMM-LC63GRO2.min.js.map +//# sourceMappingURL=blockDiagram-GPEHLZMM-3OKIGOBQ.min.js.map diff --git a/templates/tabulareditor/public/blockDiagram-GPEHLZMM-LC63GRO2.min.js.map b/templates/tabulareditor/public/blockDiagram-GPEHLZMM-3OKIGOBQ.min.js.map similarity index 100% rename from templates/tabulareditor/public/blockDiagram-GPEHLZMM-LC63GRO2.min.js.map rename to templates/tabulareditor/public/blockDiagram-GPEHLZMM-3OKIGOBQ.min.js.map diff --git a/templates/tabulareditor/public/c4Diagram-AAUBKEIU-XUDUJAA2.min.js b/templates/tabulareditor/public/c4Diagram-AAUBKEIU-RCWASNEG.min.js similarity index 99% rename from templates/tabulareditor/public/c4Diagram-AAUBKEIU-XUDUJAA2.min.js rename to templates/tabulareditor/public/c4Diagram-AAUBKEIU-RCWASNEG.min.js index b1832fea0..a74fa592c 100644 --- a/templates/tabulareditor/public/c4Diagram-AAUBKEIU-XUDUJAA2.min.js +++ b/templates/tabulareditor/public/c4Diagram-AAUBKEIU-RCWASNEG.min.js @@ -1,4 +1,4 @@ -import{a as ke,f as Ee}from"./chunk-ANPX43U5.min.js";import{i as ve,j as ee,k as Ct}from"./chunk-IXKFR5M2.min.js";import{a as Fe}from"./chunk-HCOLC5CQ.min.js";import{H as te,N as Yt,O as be,U as ge,V as _e,W as xe,X as me,_ as Ot,o as ye}from"./chunk-7PRAVCJT.min.js";import{b as y,d as $t,j as Dt}from"./chunk-BJGJ3C53.min.js";import{c as Ue}from"./chunk-MY7PHHTQ.min.js";var Re=Ue(Fe(),1),Ut=(function(){var e=y(function(_t,x,v,k){for(v=v||{},k=_t.length;k--;v[_t[k]]=x);return v},"o"),t=[1,24],n=[1,25],o=[1,26],l=[1,27],s=[1,28],a=[1,63],r=[1,64],i=[1,65],u=[1,66],d=[1,67],p=[1,68],b=[1,69],m=[1,29],O=[1,30],S=[1,31],P=[1,32],M=[1,33],U=[1,34],H=[1,35],q=[1,36],G=[1,37],K=[1,38],J=[1,39],Z=[1,40],$=[1,41],tt=[1,42],et=[1,43],at=[1,44],it=[1,45],rt=[1,46],nt=[1,47],st=[1,48],lt=[1,50],ot=[1,51],ct=[1,52],ht=[1,53],ut=[1,54],dt=[1,55],ft=[1,56],pt=[1,57],yt=[1,58],bt=[1,59],gt=[1,60],wt=[14,42],Wt=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Rt=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],E=[1,82],A=[1,83],C=[1,84],w=[1,85],T=[12,14,42],ce=[12,14,33,42],It=[12,14,33,42,76,77,79,80],vt=[12,33],Qt=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ht={trace:y(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:y(function(x,v,k,g,R,h,St){var f=h.length-1;switch(R){case 3:g.setDirection("TB");break;case 4:g.setDirection("BT");break;case 5:g.setDirection("RL");break;case 6:g.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:g.setC4Type(h[f-3]);break;case 19:g.setTitle(h[f].substring(6)),this.$=h[f].substring(6);break;case 20:g.setAccDescription(h[f].substring(15)),this.$=h[f].substring(15);break;case 21:this.$=h[f].trim(),g.setTitle(this.$);break;case 22:case 23:this.$=h[f].trim(),g.setAccDescription(this.$);break;case 28:h[f].splice(2,0,"ENTERPRISE"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 29:h[f].splice(2,0,"SYSTEM"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 30:g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 31:h[f].splice(2,0,"CONTAINER"),g.addContainerBoundary(...h[f]),this.$=h[f];break;case 32:g.addDeploymentNode("node",...h[f]),this.$=h[f];break;case 33:g.addDeploymentNode("nodeL",...h[f]),this.$=h[f];break;case 34:g.addDeploymentNode("nodeR",...h[f]),this.$=h[f];break;case 35:g.popBoundaryParseStack();break;case 39:g.addPersonOrSystem("person",...h[f]),this.$=h[f];break;case 40:g.addPersonOrSystem("external_person",...h[f]),this.$=h[f];break;case 41:g.addPersonOrSystem("system",...h[f]),this.$=h[f];break;case 42:g.addPersonOrSystem("system_db",...h[f]),this.$=h[f];break;case 43:g.addPersonOrSystem("system_queue",...h[f]),this.$=h[f];break;case 44:g.addPersonOrSystem("external_system",...h[f]),this.$=h[f];break;case 45:g.addPersonOrSystem("external_system_db",...h[f]),this.$=h[f];break;case 46:g.addPersonOrSystem("external_system_queue",...h[f]),this.$=h[f];break;case 47:g.addContainer("container",...h[f]),this.$=h[f];break;case 48:g.addContainer("container_db",...h[f]),this.$=h[f];break;case 49:g.addContainer("container_queue",...h[f]),this.$=h[f];break;case 50:g.addContainer("external_container",...h[f]),this.$=h[f];break;case 51:g.addContainer("external_container_db",...h[f]),this.$=h[f];break;case 52:g.addContainer("external_container_queue",...h[f]),this.$=h[f];break;case 53:g.addComponent("component",...h[f]),this.$=h[f];break;case 54:g.addComponent("component_db",...h[f]),this.$=h[f];break;case 55:g.addComponent("component_queue",...h[f]),this.$=h[f];break;case 56:g.addComponent("external_component",...h[f]),this.$=h[f];break;case 57:g.addComponent("external_component_db",...h[f]),this.$=h[f];break;case 58:g.addComponent("external_component_queue",...h[f]),this.$=h[f];break;case 60:g.addRel("rel",...h[f]),this.$=h[f];break;case 61:g.addRel("birel",...h[f]),this.$=h[f];break;case 62:g.addRel("rel_u",...h[f]),this.$=h[f];break;case 63:g.addRel("rel_d",...h[f]),this.$=h[f];break;case 64:g.addRel("rel_l",...h[f]),this.$=h[f];break;case 65:g.addRel("rel_r",...h[f]),this.$=h[f];break;case 66:g.addRel("rel_b",...h[f]),this.$=h[f];break;case 67:h[f].splice(0,1),g.addRel("rel",...h[f]),this.$=h[f];break;case 68:g.updateElStyle("update_el_style",...h[f]),this.$=h[f];break;case 69:g.updateRelStyle("update_rel_style",...h[f]),this.$=h[f];break;case 70:g.updateLayoutConfig("update_layout_config",...h[f]),this.$=h[f];break;case 71:this.$=[h[f]];break;case 72:h[f].unshift(h[f-1]),this.$=h[f];break;case 73:case 75:this.$=h[f].trim();break;case 74:let kt={};kt[h[f-1].trim()]=h[f].trim(),this.$=kt;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:70,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:71,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:72,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:73,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{14:[1,74]},e(wt,[2,13],{43:23,29:49,30:61,32:62,20:75,34:a,36:r,37:i,38:u,39:d,40:p,41:b,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(wt,[2,14]),e(Wt,[2,16],{12:[1,76]}),e(wt,[2,36],{12:[1,77]}),e(Rt,[2,19]),e(Rt,[2,20]),{25:[1,78]},{27:[1,79]},e(Rt,[2,23]),{35:80,75:81,76:E,77:A,79:C,80:w},{35:86,75:81,76:E,77:A,79:C,80:w},{35:87,75:81,76:E,77:A,79:C,80:w},{35:88,75:81,76:E,77:A,79:C,80:w},{35:89,75:81,76:E,77:A,79:C,80:w},{35:90,75:81,76:E,77:A,79:C,80:w},{35:91,75:81,76:E,77:A,79:C,80:w},{35:92,75:81,76:E,77:A,79:C,80:w},{35:93,75:81,76:E,77:A,79:C,80:w},{35:94,75:81,76:E,77:A,79:C,80:w},{35:95,75:81,76:E,77:A,79:C,80:w},{35:96,75:81,76:E,77:A,79:C,80:w},{35:97,75:81,76:E,77:A,79:C,80:w},{35:98,75:81,76:E,77:A,79:C,80:w},{35:99,75:81,76:E,77:A,79:C,80:w},{35:100,75:81,76:E,77:A,79:C,80:w},{35:101,75:81,76:E,77:A,79:C,80:w},{35:102,75:81,76:E,77:A,79:C,80:w},{35:103,75:81,76:E,77:A,79:C,80:w},{35:104,75:81,76:E,77:A,79:C,80:w},e(T,[2,59]),{35:105,75:81,76:E,77:A,79:C,80:w},{35:106,75:81,76:E,77:A,79:C,80:w},{35:107,75:81,76:E,77:A,79:C,80:w},{35:108,75:81,76:E,77:A,79:C,80:w},{35:109,75:81,76:E,77:A,79:C,80:w},{35:110,75:81,76:E,77:A,79:C,80:w},{35:111,75:81,76:E,77:A,79:C,80:w},{35:112,75:81,76:E,77:A,79:C,80:w},{35:113,75:81,76:E,77:A,79:C,80:w},{35:114,75:81,76:E,77:A,79:C,80:w},{35:115,75:81,76:E,77:A,79:C,80:w},{20:116,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{12:[1,118],33:[1,117]},{35:119,75:81,76:E,77:A,79:C,80:w},{35:120,75:81,76:E,77:A,79:C,80:w},{35:121,75:81,76:E,77:A,79:C,80:w},{35:122,75:81,76:E,77:A,79:C,80:w},{35:123,75:81,76:E,77:A,79:C,80:w},{35:124,75:81,76:E,77:A,79:C,80:w},{35:125,75:81,76:E,77:A,79:C,80:w},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},e(wt,[2,15]),e(Wt,[2,17],{21:22,19:130,22:t,23:n,24:o,26:l,28:s}),e(wt,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:t,23:n,24:o,26:l,28:s,34:a,36:r,37:i,38:u,39:d,40:p,41:b,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(Rt,[2,21]),e(Rt,[2,22]),e(T,[2,39]),e(ce,[2,71],{75:81,35:132,76:E,77:A,79:C,80:w}),e(It,[2,73]),{78:[1,133]},e(It,[2,75]),e(It,[2,76]),e(T,[2,40]),e(T,[2,41]),e(T,[2,42]),e(T,[2,43]),e(T,[2,44]),e(T,[2,45]),e(T,[2,46]),e(T,[2,47]),e(T,[2,48]),e(T,[2,49]),e(T,[2,50]),e(T,[2,51]),e(T,[2,52]),e(T,[2,53]),e(T,[2,54]),e(T,[2,55]),e(T,[2,56]),e(T,[2,57]),e(T,[2,58]),e(T,[2,60]),e(T,[2,61]),e(T,[2,62]),e(T,[2,63]),e(T,[2,64]),e(T,[2,65]),e(T,[2,66]),e(T,[2,67]),e(T,[2,68]),e(T,[2,69]),e(T,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},e(vt,[2,28]),e(vt,[2,29]),e(vt,[2,30]),e(vt,[2,31]),e(vt,[2,32]),e(vt,[2,33]),e(vt,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},e(Wt,[2,18]),e(wt,[2,38]),e(ce,[2,72]),e(It,[2,74]),e(T,[2,24]),e(T,[2,35]),e(Qt,[2,25]),e(Qt,[2,26],{12:[1,138]}),e(Qt,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:y(function(x,v){if(v.recoverable)this.trace(x);else{var k=new Error(x);throw k.hash=v,k}},"parseError"),parse:y(function(x){var v=this,k=[0],g=[],R=[null],h=[],St=this.table,f="",kt=0,he=0,ue=0,Le=2,de=1,Ne=h.slice.call(arguments,1),D=Object.create(this.lexer),Et={yy:{}};for(var qt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,qt)&&(Et.yy[qt]=this.yy[qt]);D.setInput(x,Et.yy),Et.yy.lexer=D,Et.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var Gt=D.yylloc;h.push(Gt);var Ye=D.options&&D.options.ranges;typeof Et.yy.parseError=="function"?this.parseError=Et.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function je(L){k.length=k.length-2*L,R.length=R.length-L,h.length=h.length-L}y(je,"popStack");function fe(){var L;return L=g.pop()||D.lex()||de,typeof L!="number"&&(L instanceof Array&&(g=L,L=g.pop()),L=v.symbols_[L]||L),L}y(fe,"lex");for(var B,Kt,At,N,I0,Jt,Tt={},Lt,W,pe,Nt;;){if(At=k[k.length-1],this.defaultActions[At]?N=this.defaultActions[At]:((B===null||typeof B>"u")&&(B=fe()),N=St[At]&&St[At][B]),typeof N>"u"||!N.length||!N[0]){var Zt="";Nt=[];for(Lt in St[At])this.terminals_[Lt]&&Lt>Le&&Nt.push("'"+this.terminals_[Lt]+"'");D.showPosition?Zt="Parse error on line "+(kt+1)+`: +import{a as ke,f as Ee}from"./chunk-RSHCK4XQ.min.js";import{i as ve,j as ee,k as Ct}from"./chunk-BSOUP4V7.min.js";import{a as Fe}from"./chunk-HCOLC5CQ.min.js";import{H as te,N as Yt,O as be,U as ge,V as _e,W as xe,X as me,_ as Ot,o as ye}from"./chunk-OYCWXTBX.min.js";import{b as y,d as $t,j as Dt}from"./chunk-BJGJ3C53.min.js";import{c as Ue}from"./chunk-MY7PHHTQ.min.js";var Re=Ue(Fe(),1),Ut=(function(){var e=y(function(_t,x,v,k){for(v=v||{},k=_t.length;k--;v[_t[k]]=x);return v},"o"),t=[1,24],n=[1,25],o=[1,26],l=[1,27],s=[1,28],a=[1,63],r=[1,64],i=[1,65],u=[1,66],d=[1,67],p=[1,68],b=[1,69],m=[1,29],O=[1,30],S=[1,31],P=[1,32],M=[1,33],U=[1,34],H=[1,35],q=[1,36],G=[1,37],K=[1,38],J=[1,39],Z=[1,40],$=[1,41],tt=[1,42],et=[1,43],at=[1,44],it=[1,45],rt=[1,46],nt=[1,47],st=[1,48],lt=[1,50],ot=[1,51],ct=[1,52],ht=[1,53],ut=[1,54],dt=[1,55],ft=[1,56],pt=[1,57],yt=[1,58],bt=[1,59],gt=[1,60],wt=[14,42],Wt=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Rt=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],E=[1,82],A=[1,83],C=[1,84],w=[1,85],T=[12,14,42],ce=[12,14,33,42],It=[12,14,33,42,76,77,79,80],vt=[12,33],Qt=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ht={trace:y(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:y(function(x,v,k,g,R,h,St){var f=h.length-1;switch(R){case 3:g.setDirection("TB");break;case 4:g.setDirection("BT");break;case 5:g.setDirection("RL");break;case 6:g.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:g.setC4Type(h[f-3]);break;case 19:g.setTitle(h[f].substring(6)),this.$=h[f].substring(6);break;case 20:g.setAccDescription(h[f].substring(15)),this.$=h[f].substring(15);break;case 21:this.$=h[f].trim(),g.setTitle(this.$);break;case 22:case 23:this.$=h[f].trim(),g.setAccDescription(this.$);break;case 28:h[f].splice(2,0,"ENTERPRISE"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 29:h[f].splice(2,0,"SYSTEM"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 30:g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 31:h[f].splice(2,0,"CONTAINER"),g.addContainerBoundary(...h[f]),this.$=h[f];break;case 32:g.addDeploymentNode("node",...h[f]),this.$=h[f];break;case 33:g.addDeploymentNode("nodeL",...h[f]),this.$=h[f];break;case 34:g.addDeploymentNode("nodeR",...h[f]),this.$=h[f];break;case 35:g.popBoundaryParseStack();break;case 39:g.addPersonOrSystem("person",...h[f]),this.$=h[f];break;case 40:g.addPersonOrSystem("external_person",...h[f]),this.$=h[f];break;case 41:g.addPersonOrSystem("system",...h[f]),this.$=h[f];break;case 42:g.addPersonOrSystem("system_db",...h[f]),this.$=h[f];break;case 43:g.addPersonOrSystem("system_queue",...h[f]),this.$=h[f];break;case 44:g.addPersonOrSystem("external_system",...h[f]),this.$=h[f];break;case 45:g.addPersonOrSystem("external_system_db",...h[f]),this.$=h[f];break;case 46:g.addPersonOrSystem("external_system_queue",...h[f]),this.$=h[f];break;case 47:g.addContainer("container",...h[f]),this.$=h[f];break;case 48:g.addContainer("container_db",...h[f]),this.$=h[f];break;case 49:g.addContainer("container_queue",...h[f]),this.$=h[f];break;case 50:g.addContainer("external_container",...h[f]),this.$=h[f];break;case 51:g.addContainer("external_container_db",...h[f]),this.$=h[f];break;case 52:g.addContainer("external_container_queue",...h[f]),this.$=h[f];break;case 53:g.addComponent("component",...h[f]),this.$=h[f];break;case 54:g.addComponent("component_db",...h[f]),this.$=h[f];break;case 55:g.addComponent("component_queue",...h[f]),this.$=h[f];break;case 56:g.addComponent("external_component",...h[f]),this.$=h[f];break;case 57:g.addComponent("external_component_db",...h[f]),this.$=h[f];break;case 58:g.addComponent("external_component_queue",...h[f]),this.$=h[f];break;case 60:g.addRel("rel",...h[f]),this.$=h[f];break;case 61:g.addRel("birel",...h[f]),this.$=h[f];break;case 62:g.addRel("rel_u",...h[f]),this.$=h[f];break;case 63:g.addRel("rel_d",...h[f]),this.$=h[f];break;case 64:g.addRel("rel_l",...h[f]),this.$=h[f];break;case 65:g.addRel("rel_r",...h[f]),this.$=h[f];break;case 66:g.addRel("rel_b",...h[f]),this.$=h[f];break;case 67:h[f].splice(0,1),g.addRel("rel",...h[f]),this.$=h[f];break;case 68:g.updateElStyle("update_el_style",...h[f]),this.$=h[f];break;case 69:g.updateRelStyle("update_rel_style",...h[f]),this.$=h[f];break;case 70:g.updateLayoutConfig("update_layout_config",...h[f]),this.$=h[f];break;case 71:this.$=[h[f]];break;case 72:h[f].unshift(h[f-1]),this.$=h[f];break;case 73:case 75:this.$=h[f].trim();break;case 74:let kt={};kt[h[f-1].trim()]=h[f].trim(),this.$=kt;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:70,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:71,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:72,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:73,19:20,20:21,21:22,22:t,23:n,24:o,26:l,28:s,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{14:[1,74]},e(wt,[2,13],{43:23,29:49,30:61,32:62,20:75,34:a,36:r,37:i,38:u,39:d,40:p,41:b,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(wt,[2,14]),e(Wt,[2,16],{12:[1,76]}),e(wt,[2,36],{12:[1,77]}),e(Rt,[2,19]),e(Rt,[2,20]),{25:[1,78]},{27:[1,79]},e(Rt,[2,23]),{35:80,75:81,76:E,77:A,79:C,80:w},{35:86,75:81,76:E,77:A,79:C,80:w},{35:87,75:81,76:E,77:A,79:C,80:w},{35:88,75:81,76:E,77:A,79:C,80:w},{35:89,75:81,76:E,77:A,79:C,80:w},{35:90,75:81,76:E,77:A,79:C,80:w},{35:91,75:81,76:E,77:A,79:C,80:w},{35:92,75:81,76:E,77:A,79:C,80:w},{35:93,75:81,76:E,77:A,79:C,80:w},{35:94,75:81,76:E,77:A,79:C,80:w},{35:95,75:81,76:E,77:A,79:C,80:w},{35:96,75:81,76:E,77:A,79:C,80:w},{35:97,75:81,76:E,77:A,79:C,80:w},{35:98,75:81,76:E,77:A,79:C,80:w},{35:99,75:81,76:E,77:A,79:C,80:w},{35:100,75:81,76:E,77:A,79:C,80:w},{35:101,75:81,76:E,77:A,79:C,80:w},{35:102,75:81,76:E,77:A,79:C,80:w},{35:103,75:81,76:E,77:A,79:C,80:w},{35:104,75:81,76:E,77:A,79:C,80:w},e(T,[2,59]),{35:105,75:81,76:E,77:A,79:C,80:w},{35:106,75:81,76:E,77:A,79:C,80:w},{35:107,75:81,76:E,77:A,79:C,80:w},{35:108,75:81,76:E,77:A,79:C,80:w},{35:109,75:81,76:E,77:A,79:C,80:w},{35:110,75:81,76:E,77:A,79:C,80:w},{35:111,75:81,76:E,77:A,79:C,80:w},{35:112,75:81,76:E,77:A,79:C,80:w},{35:113,75:81,76:E,77:A,79:C,80:w},{35:114,75:81,76:E,77:A,79:C,80:w},{35:115,75:81,76:E,77:A,79:C,80:w},{20:116,29:49,30:61,32:62,34:a,36:r,37:i,38:u,39:d,40:p,41:b,43:23,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{12:[1,118],33:[1,117]},{35:119,75:81,76:E,77:A,79:C,80:w},{35:120,75:81,76:E,77:A,79:C,80:w},{35:121,75:81,76:E,77:A,79:C,80:w},{35:122,75:81,76:E,77:A,79:C,80:w},{35:123,75:81,76:E,77:A,79:C,80:w},{35:124,75:81,76:E,77:A,79:C,80:w},{35:125,75:81,76:E,77:A,79:C,80:w},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},e(wt,[2,15]),e(Wt,[2,17],{21:22,19:130,22:t,23:n,24:o,26:l,28:s}),e(wt,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:t,23:n,24:o,26:l,28:s,34:a,36:r,37:i,38:u,39:d,40:p,41:b,44:m,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(Rt,[2,21]),e(Rt,[2,22]),e(T,[2,39]),e(ce,[2,71],{75:81,35:132,76:E,77:A,79:C,80:w}),e(It,[2,73]),{78:[1,133]},e(It,[2,75]),e(It,[2,76]),e(T,[2,40]),e(T,[2,41]),e(T,[2,42]),e(T,[2,43]),e(T,[2,44]),e(T,[2,45]),e(T,[2,46]),e(T,[2,47]),e(T,[2,48]),e(T,[2,49]),e(T,[2,50]),e(T,[2,51]),e(T,[2,52]),e(T,[2,53]),e(T,[2,54]),e(T,[2,55]),e(T,[2,56]),e(T,[2,57]),e(T,[2,58]),e(T,[2,60]),e(T,[2,61]),e(T,[2,62]),e(T,[2,63]),e(T,[2,64]),e(T,[2,65]),e(T,[2,66]),e(T,[2,67]),e(T,[2,68]),e(T,[2,69]),e(T,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},e(vt,[2,28]),e(vt,[2,29]),e(vt,[2,30]),e(vt,[2,31]),e(vt,[2,32]),e(vt,[2,33]),e(vt,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},e(Wt,[2,18]),e(wt,[2,38]),e(ce,[2,72]),e(It,[2,74]),e(T,[2,24]),e(T,[2,35]),e(Qt,[2,25]),e(Qt,[2,26],{12:[1,138]}),e(Qt,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:y(function(x,v){if(v.recoverable)this.trace(x);else{var k=new Error(x);throw k.hash=v,k}},"parseError"),parse:y(function(x){var v=this,k=[0],g=[],R=[null],h=[],St=this.table,f="",kt=0,he=0,ue=0,Le=2,de=1,Ne=h.slice.call(arguments,1),D=Object.create(this.lexer),Et={yy:{}};for(var qt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,qt)&&(Et.yy[qt]=this.yy[qt]);D.setInput(x,Et.yy),Et.yy.lexer=D,Et.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var Gt=D.yylloc;h.push(Gt);var Ye=D.options&&D.options.ranges;typeof Et.yy.parseError=="function"?this.parseError=Et.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function je(L){k.length=k.length-2*L,R.length=R.length-L,h.length=h.length-L}y(je,"popStack");function fe(){var L;return L=g.pop()||D.lex()||de,typeof L!="number"&&(L instanceof Array&&(g=L,L=g.pop()),L=v.symbols_[L]||L),L}y(fe,"lex");for(var B,Kt,At,N,I0,Jt,Tt={},Lt,W,pe,Nt;;){if(At=k[k.length-1],this.defaultActions[At]?N=this.defaultActions[At]:((B===null||typeof B>"u")&&(B=fe()),N=St[At]&&St[At][B]),typeof N>"u"||!N.length||!N[0]){var Zt="";Nt=[];for(Lt in St[At])this.terminals_[Lt]&&Lt>Le&&Nt.push("'"+this.terminals_[Lt]+"'");D.showPosition?Zt="Parse error on line "+(kt+1)+`: `+D.showPosition()+` Expecting `+Nt.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Zt="Parse error on line "+(kt+1)+": Unexpected "+(B==de?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(Zt,{text:D.match,token:this.terminals_[B]||B,line:D.yylineno,loc:Gt,expected:Nt})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+At+", token: "+B);switch(N[0]){case 1:k.push(B),R.push(D.yytext),h.push(D.yylloc),k.push(N[1]),B=null,Kt?(B=Kt,Kt=null):(he=D.yyleng,f=D.yytext,kt=D.yylineno,Gt=D.yylloc,ue>0&&ue--);break;case 2:if(W=this.productions_[N[1]][1],Tt.$=R[R.length-W],Tt._$={first_line:h[h.length-(W||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(W||1)].first_column,last_column:h[h.length-1].last_column},Ye&&(Tt._$.range=[h[h.length-(W||1)].range[0],h[h.length-1].range[1]]),Jt=this.performAction.apply(Tt,[f,he,kt,Et.yy,N[1],R,h].concat(Ne)),typeof Jt<"u")return Jt;W&&(k=k.slice(0,-1*W*2),R=R.slice(0,-1*W),h=h.slice(0,-1*W)),k.push(this.productions_[N[1]][0]),R.push(Tt.$),h.push(Tt._$),pe=St[k[k.length-2]][k[k.length-1]],k.push(pe);break;case 3:return!0}}return!0},"parse")},Me=(function(){var _t={EOF:1,parseError:y(function(v,k){if(this.yy.parser)this.yy.parser.parseError(v,k);else throw new Error(v)},"parseError"),setInput:y(function(x,v){return this.yy=v||this.yy||{},this._input=x,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:y(function(){var x=this._input[0];this.yytext+=x,this.yyleng++,this.offset++,this.match+=x,this.matched+=x;var v=x.match(/(?:\r\n?|\n).*/g);return v?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),x},"input"),unput:y(function(x){var v=x.length,k=x.split(/(?:\r\n?|\n)/g);this._input=x+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-v),this.offset-=v;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),k.length-1&&(this.yylineno-=k.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:k?(k.length===g.length?this.yylloc.first_column:0)+g[g.length-k.length].length-k[0].length:this.yylloc.first_column-v},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-v]),this.yyleng=this.yytext.length,this},"unput"),more:y(function(){return this._more=!0,this},"more"),reject:y(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:y(function(x){this.unput(this.match.slice(x))},"less"),pastInput:y(function(){var x=this.matched.substr(0,this.matched.length-this.match.length);return(x.length>20?"...":"")+x.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:y(function(){var x=this.match;return x.length<20&&(x+=this._input.substr(0,20-x.length)),(x.substr(0,20)+(x.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:y(function(){var x=this.pastInput(),v=new Array(x.length+1).join("-");return x+this.upcomingInput()+` @@ -8,4 +8,4 @@ Expecting `+Nt.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Zt="Parse error fill: ${e.personBkg}; } `,"getStyles"),B0=P0,U0={parser:Ve,db:ae,renderer:Ce,styles:B0,init:y(({c4:e,wrap:t})=>{Ce.setConf(e),ae.setWrap(t)},"init")};export{U0 as diagram}; -//# sourceMappingURL=c4Diagram-AAUBKEIU-XUDUJAA2.min.js.map +//# sourceMappingURL=c4Diagram-AAUBKEIU-RCWASNEG.min.js.map diff --git a/templates/tabulareditor/public/c4Diagram-AAUBKEIU-XUDUJAA2.min.js.map b/templates/tabulareditor/public/c4Diagram-AAUBKEIU-RCWASNEG.min.js.map similarity index 100% rename from templates/tabulareditor/public/c4Diagram-AAUBKEIU-XUDUJAA2.min.js.map rename to templates/tabulareditor/public/c4Diagram-AAUBKEIU-RCWASNEG.min.js.map diff --git a/templates/tabulareditor/public/chunk-FE5ZIIEJ.min.js b/templates/tabulareditor/public/chunk-35PJYFUZ.min.js similarity index 94% rename from templates/tabulareditor/public/chunk-FE5ZIIEJ.min.js rename to templates/tabulareditor/public/chunk-35PJYFUZ.min.js index 9b8c72a03..3f2208136 100644 --- a/templates/tabulareditor/public/chunk-FE5ZIIEJ.min.js +++ b/templates/tabulareditor/public/chunk-35PJYFUZ.min.js @@ -1,2 +1,2 @@ -import{_ as c}from"./chunk-7PRAVCJT.min.js";import{b as l}from"./chunk-BJGJ3C53.min.js";var m=l(t=>{let{handDrawnSeed:e}=c();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),h=l(t=>{let e=p([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),p=l(t=>{let e=new Map;return t.forEach(o=>{let[a,r]=o.split(":");e.set(a.trim(),r?.trim())}),e},"styles2Map"),d=l(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),S=l(t=>{let{stylesArray:e}=h(t),o=[],a=[],r=[],n=[];return e.forEach(s=>{let i=s[0];d(i)?o.push(s.join(":")+" !important"):(a.push(s.join(":")+" !important"),i.includes("stroke")&&r.push(s.join(":")+" !important"),i==="fill"&&n.push(s.join(":")+" !important"))}),{labelStyles:o.join(";"),nodeStyles:a.join(";"),stylesArray:e,borderStyles:r,backgroundStyles:n}},"styles2String"),w=l((t,e)=>{let{themeVariables:o,handDrawnSeed:a}=c(),{nodeBorder:r,mainBkg:n}=o,{stylesMap:s}=h(t);return Object.assign({roughness:.7,fill:s.get("fill")||n,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||r,seed:a,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:f(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),f=l(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let r=isNaN(e[0])?0:e[0];return[r,r]}let o=isNaN(e[0])?0:e[0],a=isNaN(e[1])?0:e[1];return[o,a]},"getStrokeDashArray");export{m as a,h as b,d as c,S as d,w as e}; -//# sourceMappingURL=chunk-FE5ZIIEJ.min.js.map +import{_ as c}from"./chunk-OYCWXTBX.min.js";import{b as l}from"./chunk-BJGJ3C53.min.js";var m=l(t=>{let{handDrawnSeed:e}=c();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),h=l(t=>{let e=p([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),p=l(t=>{let e=new Map;return t.forEach(o=>{let[a,r]=o.split(":");e.set(a.trim(),r?.trim())}),e},"styles2Map"),d=l(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),S=l(t=>{let{stylesArray:e}=h(t),o=[],a=[],r=[],n=[];return e.forEach(s=>{let i=s[0];d(i)?o.push(s.join(":")+" !important"):(a.push(s.join(":")+" !important"),i.includes("stroke")&&r.push(s.join(":")+" !important"),i==="fill"&&n.push(s.join(":")+" !important"))}),{labelStyles:o.join(";"),nodeStyles:a.join(";"),stylesArray:e,borderStyles:r,backgroundStyles:n}},"styles2String"),w=l((t,e)=>{let{themeVariables:o,handDrawnSeed:a}=c(),{nodeBorder:r,mainBkg:n}=o,{stylesMap:s}=h(t);return Object.assign({roughness:.7,fill:s.get("fill")||n,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||r,seed:a,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:f(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),f=l(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let r=isNaN(e[0])?0:e[0];return[r,r]}let o=isNaN(e[0])?0:e[0],a=isNaN(e[1])?0:e[1];return[o,a]},"getStrokeDashArray");export{m as a,h as b,d as c,S as d,w as e}; +//# sourceMappingURL=chunk-35PJYFUZ.min.js.map diff --git a/templates/tabulareditor/public/chunk-FE5ZIIEJ.min.js.map b/templates/tabulareditor/public/chunk-35PJYFUZ.min.js.map similarity index 100% rename from templates/tabulareditor/public/chunk-FE5ZIIEJ.min.js.map rename to templates/tabulareditor/public/chunk-35PJYFUZ.min.js.map diff --git a/templates/tabulareditor/public/chunk-7PRAVCJT.min.js.map b/templates/tabulareditor/public/chunk-7PRAVCJT.min.js.map deleted file mode 100644 index f36931f69..000000000 --- a/templates/tabulareditor/public/chunk-7PRAVCJT.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../node_modules/khroma/dist/utils/channel.js", "../../node_modules/khroma/dist/utils/lang.js", "../../node_modules/khroma/dist/utils/unit.js", "../../node_modules/khroma/dist/utils/index.js", "../../node_modules/khroma/dist/constants.js", "../../node_modules/khroma/dist/channels/type.js", "../../node_modules/khroma/dist/channels/index.js", "../../node_modules/khroma/dist/channels/reusable.js", "../../node_modules/khroma/dist/color/hex.js", "../../node_modules/khroma/dist/color/hsl.js", "../../node_modules/khroma/dist/color/keyword.js", "../../node_modules/khroma/dist/color/rgb.js", "../../node_modules/khroma/dist/color/index.js", "../../node_modules/khroma/dist/methods/change.js", "../../node_modules/khroma/dist/methods/rgba.js", "../../node_modules/khroma/dist/methods/channel.js", "../../node_modules/khroma/dist/methods/luminance.js", "../../node_modules/khroma/dist/methods/is_light.js", "../../node_modules/khroma/dist/methods/is_dark.js", "../../node_modules/khroma/dist/methods/adjust_channel.js", "../../node_modules/khroma/dist/methods/lighten.js", "../../node_modules/khroma/dist/methods/darken.js", "../../node_modules/khroma/dist/methods/transparentize.js", "../../node_modules/khroma/dist/methods/adjust.js", "../../node_modules/khroma/dist/methods/mix.js", "../../node_modules/khroma/dist/methods/invert.js", "../../node_modules/dompurify/src/utils.ts", "../../node_modules/dompurify/src/tags.ts", "../../node_modules/dompurify/src/attrs.ts", "../../node_modules/dompurify/src/regexp.ts", "../../node_modules/dompurify/src/purify.ts", "../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-CSCIHK7Q.mjs"], - "sourcesContent": ["/* IMPORT */\n/* MAIN */\nconst Channel = {\n /* CLAMP */\n min: {\n r: 0,\n g: 0,\n b: 0,\n s: 0,\n l: 0,\n a: 0\n },\n max: {\n r: 255,\n g: 255,\n b: 255,\n h: 360,\n s: 100,\n l: 100,\n a: 1\n },\n clamp: {\n r: (r) => r >= 255 ? 255 : (r < 0 ? 0 : r),\n g: (g) => g >= 255 ? 255 : (g < 0 ? 0 : g),\n b: (b) => b >= 255 ? 255 : (b < 0 ? 0 : b),\n h: (h) => h % 360,\n s: (s) => s >= 100 ? 100 : (s < 0 ? 0 : s),\n l: (l) => l >= 100 ? 100 : (l < 0 ? 0 : l),\n a: (a) => a >= 1 ? 1 : (a < 0 ? 0 : a)\n },\n /* CONVERSION */\n //SOURCE: https://planetcalc.com/7779\n toLinear: (c) => {\n const n = c / 255;\n return c > .03928 ? Math.pow(((n + .055) / 1.055), 2.4) : n / 12.92;\n },\n //SOURCE: https://gist.github.com/mjackson/5311256\n hue2rgb: (p, q, t) => {\n if (t < 0)\n t += 1;\n if (t > 1)\n t -= 1;\n if (t < 1 / 6)\n return p + (q - p) * 6 * t;\n if (t < 1 / 2)\n return q;\n if (t < 2 / 3)\n return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n },\n hsl2rgb: ({ h, s, l }, channel) => {\n if (!s)\n return l * 2.55; // Achromatic\n h /= 360;\n s /= 100;\n l /= 100;\n const q = (l < .5) ? l * (1 + s) : (l + s) - (l * s);\n const p = 2 * l - q;\n switch (channel) {\n case 'r': return Channel.hue2rgb(p, q, h + 1 / 3) * 255;\n case 'g': return Channel.hue2rgb(p, q, h) * 255;\n case 'b': return Channel.hue2rgb(p, q, h - 1 / 3) * 255;\n }\n },\n rgb2hsl: ({ r, g, b }, channel) => {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (channel === 'l')\n return l * 100;\n if (max === min)\n return 0; // Achromatic\n const d = max - min;\n const s = (l > .5) ? d / (2 - max - min) : d / (max + min);\n if (channel === 's')\n return s * 100;\n switch (max) {\n case r: return ((g - b) / d + (g < b ? 6 : 0)) * 60;\n case g: return ((b - r) / d + 2) * 60;\n case b: return ((r - g) / d + 4) * 60;\n default: return -1; //TSC: TypeScript is stupid and complains if there isn't this useless default statement\n }\n }\n};\n/* EXPORT */\nexport default Channel;\n", "/* MAIN */\nconst Lang = {\n /* API */\n clamp: (number, lower, upper) => {\n if (lower > upper)\n return Math.min(lower, Math.max(upper, number));\n return Math.min(upper, Math.max(lower, number));\n },\n round: (number) => {\n return Math.round(number * 10000000000) / 10000000000;\n }\n};\n/* EXPORT */\nexport default Lang;\n", "/* MAIN */\nconst Unit = {\n /* API */\n dec2hex: (dec) => {\n const hex = Math.round(dec).toString(16);\n return hex.length > 1 ? hex : `0${hex}`;\n }\n};\n/* EXPORT */\nexport default Unit;\n", "/* IMPORT */\nimport channel from './channel.js';\nimport lang from './lang.js';\nimport unit from './unit.js';\n/* MAIN */\nconst Utils = {\n channel,\n lang,\n unit\n};\n/* EXPORT */\nexport default Utils;\n", "/* IMPORT */\nimport _ from './utils/index.js';\n/* MAIN */\nconst DEC2HEX = {};\nfor (let i = 0; i <= 255; i++)\n DEC2HEX[i] = _.unit.dec2hex(i); // Populating dynamically, striking a balance between code size and performance\nconst TYPE = {\n ALL: 0,\n RGB: 1,\n HSL: 2\n};\n/* EXPORT */\nexport { DEC2HEX, TYPE };\n", "/* IMPORT */\nimport { TYPE } from '../constants.js';\n/* MAIN */\nclass Type {\n constructor() {\n /* VARIABLES */\n this.type = TYPE.ALL;\n }\n /* API */\n get() {\n return this.type;\n }\n set(type) {\n if (this.type && this.type !== type)\n throw new Error('Cannot change both RGB and HSL channels at the same time');\n this.type = type;\n }\n reset() {\n this.type = TYPE.ALL;\n }\n is(type) {\n return this.type === type;\n }\n}\n/* EXPORT */\nexport default Type;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport Type from './type.js';\nimport { TYPE } from '../constants.js';\n/* MAIN */\nclass Channels {\n /* CONSTRUCTOR */\n constructor(data, color) {\n this.color = color;\n this.changed = false;\n this.data = data; //TSC\n this.type = new Type();\n }\n /* API */\n set(data, color) {\n this.color = color;\n this.changed = false;\n this.data = data; //TSC\n this.type.type = TYPE.ALL;\n return this;\n }\n /* HELPERS */\n _ensureHSL() {\n const data = this.data;\n const { h, s, l } = data;\n if (h === undefined)\n data.h = _.channel.rgb2hsl(data, 'h');\n if (s === undefined)\n data.s = _.channel.rgb2hsl(data, 's');\n if (l === undefined)\n data.l = _.channel.rgb2hsl(data, 'l');\n }\n _ensureRGB() {\n const data = this.data;\n const { r, g, b } = data;\n if (r === undefined)\n data.r = _.channel.hsl2rgb(data, 'r');\n if (g === undefined)\n data.g = _.channel.hsl2rgb(data, 'g');\n if (b === undefined)\n data.b = _.channel.hsl2rgb(data, 'b');\n }\n /* GETTERS */\n get r() {\n const data = this.data;\n const r = data.r;\n if (!this.type.is(TYPE.HSL) && r !== undefined)\n return r;\n this._ensureHSL();\n return _.channel.hsl2rgb(data, 'r');\n }\n get g() {\n const data = this.data;\n const g = data.g;\n if (!this.type.is(TYPE.HSL) && g !== undefined)\n return g;\n this._ensureHSL();\n return _.channel.hsl2rgb(data, 'g');\n }\n get b() {\n const data = this.data;\n const b = data.b;\n if (!this.type.is(TYPE.HSL) && b !== undefined)\n return b;\n this._ensureHSL();\n return _.channel.hsl2rgb(data, 'b');\n }\n get h() {\n const data = this.data;\n const h = data.h;\n if (!this.type.is(TYPE.RGB) && h !== undefined)\n return h;\n this._ensureRGB();\n return _.channel.rgb2hsl(data, 'h');\n }\n get s() {\n const data = this.data;\n const s = data.s;\n if (!this.type.is(TYPE.RGB) && s !== undefined)\n return s;\n this._ensureRGB();\n return _.channel.rgb2hsl(data, 's');\n }\n get l() {\n const data = this.data;\n const l = data.l;\n if (!this.type.is(TYPE.RGB) && l !== undefined)\n return l;\n this._ensureRGB();\n return _.channel.rgb2hsl(data, 'l');\n }\n get a() {\n return this.data.a;\n }\n /* SETTERS */\n set r(r) {\n this.type.set(TYPE.RGB);\n this.changed = true;\n this.data.r = r;\n }\n set g(g) {\n this.type.set(TYPE.RGB);\n this.changed = true;\n this.data.g = g;\n }\n set b(b) {\n this.type.set(TYPE.RGB);\n this.changed = true;\n this.data.b = b;\n }\n set h(h) {\n this.type.set(TYPE.HSL);\n this.changed = true;\n this.data.h = h;\n }\n set s(s) {\n this.type.set(TYPE.HSL);\n this.changed = true;\n this.data.s = s;\n }\n set l(l) {\n this.type.set(TYPE.HSL);\n this.changed = true;\n this.data.l = l;\n }\n set a(a) {\n this.changed = true;\n this.data.a = a;\n }\n}\n/* EXPORT */\nexport default Channels;\n", "/* IMPORT */\nimport Channels from './/index.js';\n/* MAIN */\nconst channels = new Channels({ r: 0, g: 0, b: 0, a: 0 }, 'transparent');\n/* EXPORT */\nexport default channels;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport ChannelsReusable from '../channels/reusable.js';\nimport { DEC2HEX } from '../constants.js';\n/* MAIN */\nconst Hex = {\n /* VARIABLES */\n re: /^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,\n /* API */\n parse: (color) => {\n if (color.charCodeAt(0) !== 35)\n return; // '#'\n const match = color.match(Hex.re);\n if (!match)\n return;\n const hex = match[1];\n const dec = parseInt(hex, 16);\n const length = hex.length;\n const hasAlpha = length % 4 === 0;\n const isFullLength = length > 4;\n const multiplier = isFullLength ? 1 : 17;\n const bits = isFullLength ? 8 : 4;\n const bitsOffset = hasAlpha ? 0 : -1;\n const mask = isFullLength ? 255 : 15;\n return ChannelsReusable.set({\n r: ((dec >> (bits * (bitsOffset + 3))) & mask) * multiplier,\n g: ((dec >> (bits * (bitsOffset + 2))) & mask) * multiplier,\n b: ((dec >> (bits * (bitsOffset + 1))) & mask) * multiplier,\n a: hasAlpha ? (dec & mask) * multiplier / 255 : 1\n }, color);\n },\n stringify: (channels) => {\n const { r, g, b, a } = channels;\n if (a < 1) { // #RRGGBBAA\n return `#${DEC2HEX[Math.round(r)]}${DEC2HEX[Math.round(g)]}${DEC2HEX[Math.round(b)]}${DEC2HEX[Math.round(a * 255)]}`;\n }\n else { // #RRGGBB\n return `#${DEC2HEX[Math.round(r)]}${DEC2HEX[Math.round(g)]}${DEC2HEX[Math.round(b)]}`;\n }\n }\n};\n/* EXPORT */\nexport default Hex;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport ChannelsReusable from '../channels/reusable.js';\n/* MAIN */\nconst HSL = {\n /* VARIABLES */\n re: /^hsla?\\(\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?(?:deg|grad|rad|turn)?)\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?%)\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?%)(?:\\s*?(?:,|\\/)\\s*?\\+?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?(%)?))?\\s*?\\)$/i,\n hueRe: /^(.+?)(deg|grad|rad|turn)$/i,\n /* HELPERS */\n _hue2deg: (hue) => {\n const match = hue.match(HSL.hueRe);\n if (match) {\n const [, number, unit] = match;\n switch (unit) {\n case 'grad': return _.channel.clamp.h(parseFloat(number) * .9);\n case 'rad': return _.channel.clamp.h(parseFloat(number) * 180 / Math.PI);\n case 'turn': return _.channel.clamp.h(parseFloat(number) * 360);\n }\n }\n return _.channel.clamp.h(parseFloat(hue));\n },\n /* API */\n parse: (color) => {\n const charCode = color.charCodeAt(0);\n if (charCode !== 104 && charCode !== 72)\n return; // 'h'/'H'\n const match = color.match(HSL.re);\n if (!match)\n return;\n const [, h, s, l, a, isAlphaPercentage] = match;\n return ChannelsReusable.set({\n h: HSL._hue2deg(h),\n s: _.channel.clamp.s(parseFloat(s)),\n l: _.channel.clamp.l(parseFloat(l)),\n a: a ? _.channel.clamp.a(isAlphaPercentage ? parseFloat(a) / 100 : parseFloat(a)) : 1\n }, color);\n },\n stringify: (channels) => {\n const { h, s, l, a } = channels;\n if (a < 1) { // HSLA\n return `hsla(${_.lang.round(h)}, ${_.lang.round(s)}%, ${_.lang.round(l)}%, ${a})`;\n }\n else { // HSL\n return `hsl(${_.lang.round(h)}, ${_.lang.round(s)}%, ${_.lang.round(l)}%)`;\n }\n }\n};\n/* EXPORT */\nexport default HSL;\n", "/* IMPORT */\nimport Hex from './hex.js';\n/* MAIN */\nconst Keyword = {\n /* VARIABLES */\n colors: {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyanaqua: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n transparent: '#00000000',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n },\n /* API */\n parse: (color) => {\n color = color.toLowerCase();\n const hex = Keyword.colors[color];\n if (!hex)\n return;\n return Hex.parse(hex);\n },\n stringify: (channels) => {\n const hex = Hex.stringify(channels);\n for (const name in Keyword.colors) {\n if (Keyword.colors[name] === hex)\n return name;\n }\n return;\n }\n};\n/* EXPORT */\nexport default Keyword;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport ChannelsReusable from '../channels/reusable.js';\n/* MAIN */\nconst RGB = {\n /* VARIABLES */\n re: /^rgba?\\(\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?))\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?))\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?))(?:\\s*?(?:,|\\/)\\s*?\\+?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?)))?\\s*?\\)$/i,\n /* API */\n parse: (color) => {\n const charCode = color.charCodeAt(0);\n if (charCode !== 114 && charCode !== 82)\n return; // 'r'/'R'\n const match = color.match(RGB.re);\n if (!match)\n return;\n const [, r, isRedPercentage, g, isGreenPercentage, b, isBluePercentage, a, isAlphaPercentage] = match;\n return ChannelsReusable.set({\n r: _.channel.clamp.r(isRedPercentage ? parseFloat(r) * 2.55 : parseFloat(r)),\n g: _.channel.clamp.g(isGreenPercentage ? parseFloat(g) * 2.55 : parseFloat(g)),\n b: _.channel.clamp.b(isBluePercentage ? parseFloat(b) * 2.55 : parseFloat(b)),\n a: a ? _.channel.clamp.a(isAlphaPercentage ? parseFloat(a) / 100 : parseFloat(a)) : 1\n }, color);\n },\n stringify: (channels) => {\n const { r, g, b, a } = channels;\n if (a < 1) { // RGBA\n return `rgba(${_.lang.round(r)}, ${_.lang.round(g)}, ${_.lang.round(b)}, ${_.lang.round(a)})`;\n }\n else { // RGB\n return `rgb(${_.lang.round(r)}, ${_.lang.round(g)}, ${_.lang.round(b)})`;\n }\n }\n};\n/* EXPORT */\nexport default RGB;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport Hex from './hex.js';\nimport HSL from './hsl.js';\nimport Keyword from './keyword.js';\nimport RGB from './rgb.js';\nimport { TYPE } from '../constants.js';\n/* MAIN */\nconst Color = {\n /* VARIABLES */\n format: {\n keyword: Keyword,\n hex: Hex,\n rgb: RGB,\n rgba: RGB,\n hsl: HSL,\n hsla: HSL\n },\n /* API */\n parse: (color) => {\n if (typeof color !== 'string')\n return color;\n const channels = Hex.parse(color) || RGB.parse(color) || HSL.parse(color) || Keyword.parse(color); // Color providers ordered with performance in mind\n if (channels)\n return channels;\n throw new Error(`Unsupported color format: \"${color}\"`);\n },\n stringify: (channels) => {\n // SASS returns a keyword if possible, but we avoid doing that as it's slower and doesn't really add any value\n if (!channels.changed && channels.color)\n return channels.color;\n if (channels.type.is(TYPE.HSL) || channels.data.r === undefined) {\n return HSL.stringify(channels);\n }\n else if (channels.a < 1 || !Number.isInteger(channels.r) || !Number.isInteger(channels.g) || !Number.isInteger(channels.b)) {\n return RGB.stringify(channels);\n }\n else {\n return Hex.stringify(channels);\n }\n }\n};\n/* EXPORT */\nexport default Color;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport Color from '../color/index.js';\n/* MAIN */\nconst change = (color, channels) => {\n const ch = Color.parse(color);\n for (const c in channels) {\n ch[c] = _.channel.clamp[c](channels[c]);\n }\n return Color.stringify(ch);\n};\n/* EXPORT */\nexport default change;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport ChannelsReusable from '../channels/reusable.js';\nimport Color from '../color/index.js';\nimport change from './change.js';\n/* MAIN */\nconst rgba = (r, g, b = 0, a = 1) => {\n if (typeof r !== 'number')\n return change(r, { a: g });\n const channels = ChannelsReusable.set({\n r: _.channel.clamp.r(r),\n g: _.channel.clamp.g(g),\n b: _.channel.clamp.b(b),\n a: _.channel.clamp.a(a)\n });\n return Color.stringify(channels);\n};\n/* EXPORT */\nexport default rgba;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport Color from '../color/index.js';\n/* MAIN */\nconst channel = (color, channel) => {\n return _.lang.round(Color.parse(color)[channel]);\n};\n/* EXPORT */\nexport default channel;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport Color from '../color/index.js';\n/* MAIN */\n//SOURCE: https://planetcalc.com/7779\nconst luminance = (color) => {\n const { r, g, b } = Color.parse(color);\n const luminance = .2126 * _.channel.toLinear(r) + .7152 * _.channel.toLinear(g) + .0722 * _.channel.toLinear(b);\n return _.lang.round(luminance);\n};\n/* EXPORT */\nexport default luminance;\n", "/* IMPORT */\nimport luminance from './luminance.js';\n/* MAIN */\nconst isLight = (color) => {\n return luminance(color) >= .5;\n};\n/* EXPORT */\nexport default isLight;\n", "/* IMPORT */\nimport isLight from './is_light.js';\n/* MAIN */\nconst isDark = (color) => {\n return !isLight(color);\n};\n/* EXPORT */\nexport default isDark;\n", "/* IMPORT */\nimport _ from '../utils/index.js';\nimport Color from '../color/index.js';\n/* MAIN */\nconst adjustChannel = (color, channel, amount) => {\n const channels = Color.parse(color);\n const amountCurrent = channels[channel];\n const amountNext = _.channel.clamp[channel](amountCurrent + amount);\n if (amountCurrent !== amountNext)\n channels[channel] = amountNext;\n return Color.stringify(channels);\n};\n/* EXPORT */\nexport default adjustChannel;\n", "/* IMPORT */\nimport adjustChannel from './adjust_channel.js';\n/* MAIN */\nconst lighten = (color, amount) => {\n return adjustChannel(color, 'l', amount);\n};\n/* EXPORT */\nexport default lighten;\n", "/* IMPORT */\nimport adjustChannel from './adjust_channel.js';\n/* MAIN */\nconst darken = (color, amount) => {\n return adjustChannel(color, 'l', -amount);\n};\n/* EXPORT */\nexport default darken;\n", "/* IMPORT */\nimport adjustChannel from './adjust_channel.js';\n/* MAIN */\nconst transparentize = (color, amount) => {\n return adjustChannel(color, 'a', -amount);\n};\n/* EXPORT */\nexport default transparentize;\n", "/* IMPORT */\nimport Color from '../color/index.js';\nimport change from './change.js';\n/* MAIN */\nconst adjust = (color, channels) => {\n const ch = Color.parse(color);\n const changes = {};\n for (const c in channels) {\n if (!channels[c])\n continue;\n changes[c] = ch[c] + channels[c];\n }\n return change(color, changes);\n};\n/* EXPORT */\nexport default adjust;\n", "/* IMPORT */\nimport Color from '../color/index.js';\nimport rgba from './rgba.js';\n/* MAIN */\n//SOURCE: https://github.com/sass/dart-sass/blob/7457d2e9e7e623d9844ffd037a070cf32d39c348/lib/src/functions/color.dart#L718-L756\nconst mix = (color1, color2, weight = 50) => {\n const { r: r1, g: g1, b: b1, a: a1 } = Color.parse(color1);\n const { r: r2, g: g2, b: b2, a: a2 } = Color.parse(color2);\n const weightScale = weight / 100;\n const weightNormalized = (weightScale * 2) - 1;\n const alphaDelta = a1 - a2;\n const weight1combined = ((weightNormalized * alphaDelta) === -1) ? weightNormalized : (weightNormalized + alphaDelta) / (1 + weightNormalized * alphaDelta);\n const weight1 = (weight1combined + 1) / 2;\n const weight2 = 1 - weight1;\n const r = (r1 * weight1) + (r2 * weight2);\n const g = (g1 * weight1) + (g2 * weight2);\n const b = (b1 * weight1) + (b2 * weight2);\n const a = (a1 * weightScale) + (a2 * (1 - weightScale));\n return rgba(r, g, b, a);\n};\n/* EXPORT */\nexport default mix;\n", "/* IMPORT */\nimport Color from '../color/index.js';\nimport mix from './mix.js';\n/* MAIN */\nconst invert = (color, weight = 100) => {\n const inverse = Color.parse(color);\n inverse.r = 255 - inverse.r;\n inverse.g = 255 - inverse.g;\n inverse.b = 255 - inverse.b;\n return mix(inverse, color, weight);\n};\n/* EXPORT */\nexport default invert;\n", "const {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!freeze) {\n freeze = function (x: T): T {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x: T): T {\n return x;\n };\n}\n\nif (!apply) {\n apply = function (\n func: (thisArg: any, ...args: any[]) => T,\n thisArg: any,\n ...args: any[]\n ): T {\n return func.apply(thisArg, args);\n };\n}\n\nif (!construct) {\n construct = function (Func: new (...args: any[]) => T, ...args: any[]): T {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString =\n typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString =\n typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\n\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(\n func: (thisArg: any, ...args: any[]) => T\n): (thisArg: any, ...args: any[]) => T {\n return (thisArg: any, ...args: any[]): T => {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n\n return apply(func, thisArg, args);\n };\n}\n\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(\n Func: new (...args: any[]) => T\n): (...args: any[]) => T {\n return (...args: any[]): T => construct(Func, args);\n}\n\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(\n set: Record,\n array: readonly unknown[],\n transformCaseFunc: ReturnType> = stringToLowerCase\n): Record {\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n if (!arrayIsArray(array)) {\n return set;\n }\n\n let l = array.length;\n while (l--) {\n let element = array[l];\n\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n (array as unknown[])[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element as string] = true;\n }\n\n return set;\n}\n\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array: T[]): Array {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n\n return array;\n}\n\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone>(object: T): T {\n const newObject = create(null);\n\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n\n if (isPropertyExist) {\n if (arrayIsArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (\n value &&\n typeof value === 'object' &&\n value.constructor === Object\n ) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n\n return newObject;\n}\n\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value: unknown): string {\n switch (typeof value) {\n case 'string': {\n return value;\n }\n\n case 'number': {\n return numberToString(value);\n }\n\n case 'boolean': {\n return booleanToString(value);\n }\n\n case 'bigint': {\n return bigintToString ? bigintToString(value) : '0';\n }\n\n case 'symbol': {\n return symbolToString ? symbolToString(value) : 'Symbol()';\n }\n\n case 'undefined': {\n return objectToString(value);\n }\n\n case 'function':\n case 'object': {\n if (value === null) {\n return objectToString(value);\n }\n\n const valueAsRecord = value as Record;\n const valueToString = lookupGetter(valueAsRecord, 'toString');\n\n if (typeof valueToString === 'function') {\n const stringified = valueToString(valueAsRecord);\n\n return typeof stringified === 'string'\n ? stringified\n : objectToString(stringified);\n }\n\n return objectToString(value);\n }\n\n default: {\n return objectToString(value);\n }\n }\n}\n\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter>(\n object: T,\n prop: string\n): ReturnType> | (() => null) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(): null {\n return null;\n }\n\n return fallbackValue;\n}\n\nfunction isRegex(value: unknown): value is RegExp {\n try {\n regExpTest(value as RegExp, '');\n return true;\n } catch {\n return false;\n }\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayIsArray,\n arrayLastIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n arraySplice,\n // Object\n entries,\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n isFrozen,\n setPrototypeOf,\n seal,\n clone,\n create,\n objectHasOwnProperty,\n objectToString,\n // RegExp\n regExpTest,\n isRegex,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringTrim,\n // Other conversion\n stringifyValue,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n addToSet,\n // Reflect\n unapply,\n unconstruct,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'search',\n 'section',\n 'select',\n 'shadow',\n 'slot',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n] as const);\n\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'enterkeyhint',\n 'exportparts',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'inputmode',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'part',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n] as const);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feDropShadow',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n] as const);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n] as const);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n 'mprescripts',\n] as const);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n] as const);\n\nexport const text = freeze(['#text'] as const);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'command',\n 'commandfor',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'exportparts',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inert',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'part',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'popover',\n 'popovertarget',\n 'popovertargetaction',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'slot',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'wrap',\n 'xmlns',\n] as const);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'amplitude',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dominant-baseline',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'exponent',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'intercept',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'mask-type',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'pointer-events',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'slope',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'tablevalues',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-orientation',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'vector-effect',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n] as const);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnalign',\n 'columnlines',\n 'columnspacing',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lquote',\n 'lspace',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n] as const);\n", "import { seal } from './utils.js';\n\nexport const MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\nexport const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nexport const ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nexport const COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nexport const FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nexport const SELF_CLOSING_TAG = seal(/\\/>/i);\n", "import type { Config, UseProfilesConfig } from './config';\nimport type { DOMPurify, HooksMap, HookFunction, WindowLike } from './types';\nimport * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n entries,\n freeze,\n seal,\n arrayForEach,\n arrayIsArray,\n arrayLastIndexOf,\n arrayPop,\n arrayPush,\n arraySplice,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringIndexOf,\n stringTrim,\n regExpTest,\n isRegex,\n typeErrorCreate,\n lookupGetter,\n create,\n objectHasOwnProperty,\n stringifyValue,\n} from './utils.js';\n\nexport type { Config } from './config';\n\nexport type {\n DOMPurify,\n RemovedElement,\n RemovedAttribute,\n HookName,\n NodeHook,\n ElementHook,\n DocumentFragmentHook,\n UponSanitizeElementHook,\n UponSanitizeAttributeHook,\n UponSanitizeElementHookEvent,\n UponSanitizeAttributeHookEvent,\n WindowLike,\n} from './types';\n\ndeclare const VERSION: string;\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5, // Deprecated\n entityNode: 6, // Deprecated\n processingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12, // Deprecated\n};\n\n/* HTML-namespace elements whose child text nodes are serialized *literally*\n (unescaped) by the HTML fragment-serialization algorithm. Two reparse-mXSS\n shapes ride on that literal serialization:\n (a) an element child - a tree the HTML parser can never build, but the DOM\n API and an XML/XHTML parse can - after which a ``-bearing text\n sibling breaks the element open on reparse; and\n (b) text-only content that already carries the element's OWN end tag, e.g.\n `` built as a node, which the literal\n serializer emits verbatim for the HTML parser to re-open.\n Shape (a) is handled by the firstElementChild branch in _isUnsafeNode; shape\n (b) by the LITERAL_TEXT_CLOSE probe. Both read textContent (the raw-serialized\n form for these elements) rather than innerHTML, because an XML/XHTML working\n document serializes innerHTML with `<` escaped, which silently blinds the\n innerHTML-based probes (rule 1's second probe and FALLBACK_TAG_CLOSE) there.\n `script` is never allow-listed, but is kept here so the guard matches the\n serializer's own literal-text list exactly. */\nconst LITERAL_TEXT_ELEMENT_NAMES = [\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript',\n];\nconst LITERAL_TEXT_ELEMENTS = freeze(addToSet({}, LITERAL_TEXT_ELEMENT_NAMES));\n\n/* Per-element end-tag matcher. On an HTML reparse the ONLY token that\n terminates a literal-text element's raw content is its own end tag; a foreign\n literal-text close (e.g. `` sitting inside `` built as a node, which the literal\n serializer emits verbatim for the HTML parser to re-open.\n Shape (a) is handled by the firstElementChild branch in _isUnsafeNode; shape\n (b), and any other markup in the text, by the ELEMENT_MARKUP_PROBE branch next\n to it. Both read textContent (the raw-serialized form for these elements)\n rather than innerHTML, because an XML/XHTML working document serializes\n innerHTML with `<` escaped, which silently blinds the innerHTML-based probes\n (rule 1's second probe and FALLBACK_TAG_CLOSE) there.\n `script` is never allow-listed, but is kept here so the guard matches the\n serializer's own literal-text list exactly. */\nconst LITERAL_TEXT_ELEMENT_NAMES = [\n 'style',\n 'script',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext',\n 'noscript',\n];\nconst LITERAL_TEXT_ELEMENTS = freeze(addToSet({}, LITERAL_TEXT_ELEMENT_NAMES));\n\nconst getGlobal = function (): WindowLike {\n return typeof window === 'undefined' ? null : window;\n};\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function (\n trustedTypes: TrustedTypePolicyFactory,\n purifyHostElement: HTMLScriptElement\n) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n },\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nconst _createHooksMap = function (): HooksMap {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: [],\n };\n};\n\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function (\n cfg: Config,\n key: keyof Config,\n fallback: Record,\n options: {\n transform: Parameters[2];\n base?: Record;\n }\n): Record {\n return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key])\n ? addToSet(\n options.base ? clone(options.base) : {},\n cfg[key] as readonly unknown[],\n options.transform\n )\n : fallback;\n};\n\n/**\n * Resolve an object-valued configuration option: a prototype-free clone\n * of cfg[key] when it is an own, truthy object property, else a fresh\n * fallback built by makeFallback (fresh on every parse, so a previous\n * parse can never leak state into the next one).\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param makeFallback builds the fallback value when the option is absent\n * @returns the resolved object\n */\nconst _resolveObjectOption = function >(\n cfg: Config,\n key: keyof Config,\n makeFallback: () => T\n): T {\n const value = objectHasOwnProperty(cfg, key) ? cfg[key] : undefined;\n return value && typeof value === 'object'\n ? clone(value as T)\n : makeFallback();\n};\n\nfunction createDOMPurify(window: WindowLike = getGlobal()): DOMPurify {\n const DOMPurify: DOMPurify = (root: WindowLike) => createDOMPurify(root);\n\n DOMPurify.version = VERSION;\n\n DOMPurify.removed = [];\n\n if (\n !window ||\n !window.document ||\n window.document.nodeType !== NODE_TYPE.document ||\n !window.Element\n ) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n let { document } = window;\n\n const originalDocument = document;\n const currentScript: HTMLScriptElement =\n originalDocument.currentScript as HTMLScriptElement;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || (window as any).MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n // Clobber-safe Attr-node removal. On an HTMLFormElement a descendant named\n // \"removeAttributeNode\" shadows the prototype method via\n // [LegacyOverrideBuiltIns], so element.removeAttributeNode(attr) throws.\n // Calling the cached Element.prototype method with the element as the\n // receiver removes the exact live Attr node regardless of the shadowing.\n const removeAttributeNode = lookupGetter(\n ElementPrototype,\n 'removeAttributeNode'\n );\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n const getNodeType =\n Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n const getNodeName =\n Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n const getOwnerDocument =\n Node && Node.prototype\n ? lookupGetter(Node.prototype, 'ownerDocument')\n : null;\n\n /* Clobber-safe nodeType / nodeName reads through the cached Node.prototype\n getters, with a direct-property fallback for environments that lack\n Node.prototype. Sites that need a different fallback (e.g. _isClobbered\n returns early on a null name) intentionally keep their own reads. */\n const _readNodeType = function (node: Node): number {\n return getNodeType ? getNodeType(node) : (node as any).nodeType;\n };\n\n const _readNodeName = function (node: Node): string {\n return getNodeName ? getNodeName(node) : (node as any).nodeName;\n };\n\n /* Element namespace through the cached Element.prototype getter, so a live\n node's own-property override (Object.defineProperty) cannot steer\n namespace decisions; direct read where the getter does not exist. Only\n call this on Elements - the getter throws on other node types. */\n const getNamespaceURI = lookupAccessor(ElementPrototype, 'namespaceURI');\n const _readNamespaceURI = function (element: Element): string | null {\n return getNamespaceURI\n ? getNamespaceURI(element)\n : (element as any).namespaceURI;\n };\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n let trustedTypesPolicy;\n let emptyHTML = '';\n\n // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n // `TRUSTED_TYPES_POLICY`, this is created at most once \u2014 Trusted Types throws\n // on duplicate policy names \u2014 and is the only policy allowed to persist\n // across configurations and survive `clearConfig()`.\n let defaultTrustedTypesPolicy;\n let defaultTrustedTypesPolicyResolved = false;\n\n // Tracks whether we are already inside a call to the configured Trusted Types\n // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n // re-enter the policy and recurse until the stack overflows. We detect that\n // re-entry and throw a clear, actionable error instead. The guard is shared\n // across both callbacks, because either one re-entering `sanitize` triggers\n // the same unbounded recursion.\n let IN_TRUSTED_TYPES_POLICY = 0;\n const _assertNotInTrustedTypesPolicy = function (): void {\n if (IN_TRUSTED_TYPES_POLICY > 0) {\n throw typeErrorCreate(\n 'A configured TRUSTED_TYPES_POLICY callback (createHTML or ' +\n 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' +\n 'infinite recursion. Do not pass a policy whose callbacks wrap ' +\n 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' +\n 'Types\" section of the README.'\n );\n }\n };\n\n const _createTrustedHTML = function (html: string): string {\n _assertNotInTrustedTypesPolicy();\n\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createHTML(html);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n\n const _createTrustedScriptURL = function (scriptUrl: string): string {\n _assertNotInTrustedTypesPolicy();\n\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createScriptURL(scriptUrl);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n\n // Lazily resolve (and cache) the instance's internal default policy.\n // Resolution is attempted at most once: a successful `createPolicy` cannot be\n // repeated (Trusted Types throws on duplicate names), and a failed or\n // unsupported attempt must not be retried on every parse.\n const _getDefaultTrustedTypesPolicy = function () {\n if (!defaultTrustedTypesPolicyResolved) {\n defaultTrustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n currentScript\n );\n defaultTrustedTypesPolicyResolved = true;\n }\n\n return defaultTrustedTypesPolicy;\n };\n\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName,\n } = document;\n const { importNode } = originalDocument;\n\n let hooks = _createHooksMap();\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof entries === 'function' &&\n typeof getParentNode === 'function' &&\n implementation &&\n implementation.createHTMLDocument !== undefined;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(\n create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false,\n },\n })\n );\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(\n create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n })\n );\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Pristine allowlist bindings captured at setConfig() time. On the\n * persistent-config path sanitize() restores the sets from these before\n * the per-walk hook clone-guard, so a hook's in-call widening cannot\n * carry across calls. Null until setConfig() is called; reset by\n * clearConfig(). */\n let SET_CONFIG_ALLOWED_TAGS = null;\n let SET_CONFIG_ALLOWED_ATTR = null;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (\u00A77.3.3)\n * - DOM Tree Accessors (\u00A73.1.5)\n * - Form Element Parent-Child Relations (\u00A74.10.3)\n * - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n * - HTMLCollection (\u00A74.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* IN_PLACE: nodes processed during the current call */\n let IN_PLACE_VISITED: Set | null = null;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES: UseProfilesConfig | false = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n // mirrors the selected