Вопрос или проблема
Я совершенно новый в Power Query M и практически не знаю, что делаю. Я читал серию статей о том, как изучить M, но, очевидно, все еще не очень опытен. Я заставил программу работать в виде отдельных шагов, но когда я пытаюсь объединить их все в один (чтобы было легко копировать/вставлять в новые файлы и просто менять путь к файлу), возникает ошибка “Formula.Firewall: Query ‘FY25_2YC’ (step ‘Source’) ссылается на другие запросы или шаги, поэтому он не может напрямую получить доступ к источнику данных. Пожалуйста, перестройте это совмещение данных.”
= let
AllData = Folder.Files("C:\Users\Me\Desktop\Trial Automation\Append Yearly Data\FY25_2YC"),
PartNumber = Table.SelectRows(AllData, each Text.StartsWith([Name], "12345")),
ExcelFileCheck = Table.SelectRows(PartNumber, each Text.StartsWith([Extension], ".xlsx")),
FilterHiddenFiles = Table.SelectRows(ExcelFileCheck, each [Attributes]?[Hidden]? <> true),
CreateDataTables = Table.AddColumn(FilterHiddenFiles, "Transform File from FY25_2YC", each #"Transform File from FY25_2YC"([Content])),
IdentifySourceColumn = Table.RenameColumns(CreateDataTables, {"Name", "Source.Name"}),
CutFilePath = Table.TransformColumns(IdentifySourceColumn, {{"Folder Path", each Text.AfterDelimiter(_, "_2YC\"), type text}}),
GetMonthYear = Table.TransformColumns(CutFilePath, {{"Folder Path", each Text.Start(_, 6), type text}}),
AppendDay = Table.TransformColumns(GetMonthYear, {{"Folder Path", each "1-" & _, type text}}),
GetDate = Table.TransformColumnTypes(AppendDay,{{"Folder Path", type date}}),
SortDate = Table.Sort(GetDate,{{"Folder Path", Order.Ascending}}),
RemoveNonData = Table.SelectColumns(SortDate, {"Source.Name", "Transform File from FY25_2YC"}),
ExpandData = Table.ExpandTableColumn(RemoveNonData, "Transform File from FY25_2YC", Table.ColumnNames(#"Transform File from FY25_2YC"(#"Sample File"))),
SetDataTypes = Table.TransformColumnTypes(ExpandData,{{"Date", type date}, {"Time", type time}, {"Collector ID", Int64.Type}, {"OPERATOR", type text}, {"MODEL", type text}, {"EVENT", type text}, [redacted for security but you get the idea]
Result = Table.RemoveColumns(SetDataTypes,{"Source.Name"})
in
Result
Для контекста, CutFilePath до GetDate все преобразует “месяц-год” в имени файла в фактическую дату, которую я могу отсортировать.
Ответ или решение
Ошибка "Formula.Firewall: Query ‘FY25_2YC’ (step ‘Source’) references other queries or steps, so it may not directly access a data source" возникает в Power Query из-за ограничения, связанного с конфиденциальностью данных. Это сообщение указывает на то, что один из шагов вашего запроса обращается к другим запросам или шагам, и при этом Power Query не может безопасно организовать данные в одном процессе. Чтобы решить эту проблему, рассмотрим несколько ключевых моментов и шагов.
1. Понимание Проблемы
Конфиденциальность и Безопасность Данных: Power Query использует уровень конфиденциальности для защиты данных при комбинировании запросов из разных источников. Когда вы обращаетесь к другому запросу (например, #"Transform File from FY25_2YC"
), это может вызвать ошибки, если вы пытаетесь объединить данные из нескольких источников или шагов.
2. Избегаем Проблемы через Изменение Структуры Запроса
Чтобы обойти ограничение, вы можете преобразовать структуру своего запроса. Вместо обращения к шагам внутри самого запроса, вы можете предварительно подготовить отдельные запросы и использовать их как источники данных.
Пример Решения:
-
Создайте отдельные запросы:
Изготовьте запросTransform File from FY25_2YC
отдельно, так чтобы он возвращал нужные вам данные. Убедитесь, что он работает независимо. -
Используйте функцию вместо явного запроса:
Если вы можете сделать функцию, чтобы обрабатывать файл, вам нужно будет использовать ее так, чтобы все данные обрабатывались в пределах единого логического шага.
Обновленный Код Примера:
let
// Получение всех файлов
AllData = Folder.Files("C:\Users\Me\Desktop\Trial Automation\Append Yearly Data\FY25_2YC"),
// Фильтрация по номеру детали
PartNumber = Table.SelectRows(AllData, each Text.StartsWith([Name], "12345")),
// Проверка файлов Excel
ExcelFileCheck = Table.SelectRows(PartNumber, each Text.StartsWith([Extension], ".xlsx")),
// Фильтрация скрытых файлов
FilterHiddenFiles = Table.SelectRows(ExcelFileCheck, each [Attributes]?[Hidden] <> true),
// Применение преобразования файла внутри одного шага
CreateDataTables = Table.AddColumn(FilterHiddenFiles, "Transform File", each
let
Source = [Content],
ProcessedData = #"Transform File from FY25_2YC"(Source)
in
ProcessedData
),
// Остальные шаги остаются прежними...
Таким образом, вы сохраняете логическую последовательность и избегаете ссылки на другие шаги во время обработки данных.
3. Включение Уровня Конфиденциальности
Как альтернативный шаг для устранения проблемы, вы можете также изменить настройки уровня конфиденциальности в Power Query:
-
Перейдите в Файл → Параметры → Параметры запроса → Конфиденциальность.
-
Установите уровень конфиденциальности на «Никогда не сохранять» или на «Объединенный». Это позволит избежать ошибку Firewall, но стоит помнить о возможных последствиях для безопасности данных.
Заключение
Ошибка "Formula.Firewall" является распространенной проблемой для пользователей Power Query, однако ее можно решить с помощью изменения структуры запросов и правильного обращения с данными. Следуйте вышеизложенным рекомендациям, чтобы создать эффективный и безопасный процесс обработки данных. Обязательно проводите отладку после внесения изменений, чтобы подтвердить успешное исправление проблемы.