다음을 통해 공유


TripPin 4부 - 데이터 원본 경로

이 다중 파트 자습서에서는 파워 쿼리에 대한 새 데이터 원본 확장의 생성에 대해 설명합니다. 이 자습서는 순차적으로 수행됩니다. 각 단원은 이전 단원에서 만든 커넥터를 기반으로 하여 커넥터에 새 기능을 증분 방식으로 추가합니다.

이 단원에서는 다음을 수행합니다.

  • 커넥터에 대한 연결 논리 간소화
  • 탐색 테이블 환경 개선

이 단원에서는 필요한 함수 매개 변수를 제거하고 동적으로 생성된 탐색 테이블로 이동하여 사용자 환경을 개선하여 이전 단원에서 빌드된 커넥터를 간소화합니다.

자격 증명을 식별하는 방법에 대한 자세한 설명은 인증 처리의 데이터 원본 경로 섹션을 참조하세요.

데이터 원본 경로

데이터 원본 함수호출할 때 M 엔진은 데이터 원본 종류데이터 원본 경로 값을 기반으로 조회를 수행하여 평가 중에 사용할 자격 증명을 식별합니다.

이전 단원에서는 단일 Uri.Type 매개 변수를 사용하여 두 개의 데이터 원본 함수를 공유했습니다.

[DataSource.Kind="TripPin"]
shared TripPin.Feed = Value.ReplaceType(TripPinImpl, type function (url as Uri.Type) as any);

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents =  Value.ReplaceType(TripPinNavTable, type function (url as Uri.Type) as any);

함수 중 하나를 사용하는 쿼리를 처음 실행할 때 경로 및 인증 유형을 선택할 수 있는 드롭다운이 포함된 자격 증명 프롬프트가 표시됩니다.

경로가 있는 자격 증명입니다.

동일한 매개 변수를 사용하여 동일한 쿼리를 다시 실행하는 경우 M 엔진은 캐시된 자격 증명을 찾을 수 있으며 자격 증명 프롬프트가 표시되지 않습니다. 기본 경로가 url 더 이상 일치하지 않도록 함수에 대한 인수를 수정하면 새 경로에 대한 새 자격 증명 프롬프트가 표시됩니다.

M 쿼리 출력 창의 자격 증명 테이블에서 캐시된 자격 증명을 볼 수 있습니다.

자격 증명 탭.

변경 유형에 따라 함수의 매개 변수를 수정하면 자격 증명 오류가 발생할 수 있습니다.

커넥터 간소화

이제 데이터 원본 함수(TripPin.Contents)에 대한 매개 변수를 제거하여 커넥터를 간소화합니다. 또한 한정TripPin.Feed자를 shared 제거하고 내부 전용 함수로 둡니다.

파워 쿼리의 디자인 철학 중 하나는 초기 데이터 원본 대화 상자를 가능한 한 간단하게 유지하는 것입니다. 가능한 경우 연결 대화 상자 대신 탐색기 수준에서 선택 항목을 사용자에게 제공해야 합니다. 사용자가 제공한 값을 프로그래밍 방식으로 확인할 수 있는 경우 함수 매개 변수가 아닌 탐색 테이블의 최상위 수준으로 추가하는 것이 좋습니다.

예를 들어 관계형 데이터베이스에 연결할 때 서버, 데이터베이스 및 테이블 이름이 필요할 수 있습니다. 연결할 서버를 알고 자격 증명이 제공되면 데이터베이스의 API를 사용하여 데이터베이스 목록과 각 데이터베이스에 포함된 테이블 목록을 가져올 수 있습니다. 이 경우 초기 연결 대화 상자를 가능한 한 간단하게 유지하려면 서버 이름만 필수 매개 변수Database 여야 하며 Table 탐색 테이블의 수준이 됩니다.

TripPin 서비스에 고정 URL 엔드포인트가 있으므로 사용자에게 값을 묻는 메시지를 표시할 필요가 없습니다. 함수에서 URL 매개 변수를 제거하고 커넥터에서 BaseUrl 변수를 정의합니다.

BaseUrl = "https://services.odata.org/v4/TripPinService/";

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents = () => TripPinNavTable(BaseUrl) as table;

함수를 TripPin.Feed 유지하지만 더 이상 공유하지 않고, 더 이상 데이터 원본 종류와 연결하지 않으며, 해당 선언을 간소화합니다. 이 시점부터는 이 섹션 문서 내에서 내부적으로만 사용합니다.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source)
    in
        json;

파일의 TripPin.query.pq 호출을 TripPin.Contents() 업데이트하고 Visual Studio Code에서 실행하는 경우 새 자격 증명 프롬프트가 표시됩니다. 이제 단일 데이터 원본 경로 값인 TripPin이 있습니다.

경로가 없는 자격 증명입니다.

탐색 테이블 개선

첫 번째 자습서 에서는 기본 제공 OData 함수를 사용하여 TripPin 서비스에 연결했습니다. 이렇게 하면 더 이상 코드가 없는 TripPin 서비스 문서를 기반으로 하는 멋진 탐색 테이블이 제공됩니다. OData.Feed 함수는 자동으로 작업을 수행했습니다. OData.Feed 대신 Web.Contents를 사용하여 "거칠게"하기 때문에 이 탐색 테이블을 직접 다시 만들어야 합니다.

OData 탐색기.

다음과 같이 변경합니다.

  1. 탐색 테이블에 표시할 항목 목록 정의
  2. 엔터티별 함수(GetAirlineTablesGetAirportsTable) 사용 안 함

목록에서 탐색 테이블 생성

탐색 테이블에 노출하려는 엔터티를 나열하고 액세스하기 위한 적절한 URL을 작성합니다. 모든 엔터티가 동일한 루트 경로 아래에 있으므로 이러한 URL을 동적으로 빌드할 수 있습니다.

예제를 간소화하기 위해 M에서 테이블로 노출되는 세 개의 엔터티 집합(항공사, 공항, 피플)만 노출하고 레코드로 노출되는 싱글톤(Me)을 건너뜁니다. 이후 단원까지 함수 추가를 건너뜁니다.

RootEntities = {
    "Airlines",
    "Airports",
    "People"
};

그런 다음 한 번에 열을 작성하도록 함수를 업데이트 TripPinNavTable 합니다. 각 엔터티에 대한 [데이터] 열은 엔터티에 대한 전체 URL을 사용하여 호출 TripPin.Feed 하여 검색됩니다.

TripPinNavTable = (url as text) as table =>
    let
        entitiesAsTable = Table.FromList(RootEntities, Splitter.SplitByNothing()),
        rename = Table.RenameColumns(entitiesAsTable, {{"Column1", "Name"}}),
        // Add Data as a calculated column
        withData = Table.AddColumn(rename, "Data", each TripPin.Feed(Uri.Combine(url, [Name])), Uri.Type),
        // Add ItemKind and ItemName as fixed text values
        withItemKind = Table.AddColumn(withData, "ItemKind", each "Table", type text),
        withItemName = Table.AddColumn(withItemKind, "ItemName", each "Table", type text),
        // Indicate that the node should not be expandable
        withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each true, type logical),
        // Generate the nav table
        navTable = Table.ToNavigationTable(withIsLeaf, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

URL 경로를 동적으로 빌드할 때 슬래시(/)가 어디에 있는지 확인해야 합니다. Uri.Combine는 경로를 결합할 때 다음 규칙을 사용합니다.

  • 매개 변수가 relativeUri /로 시작하면 매개 변수의 전체 경로가 baseUri 바뀝니다.
  • 매개 변수relativeUri /로 시작하지 않고 /baseUri로 끝나는 경우 경로가 추가됩니다.
  • 매개 변수가 relativeUri /로 시작하지 않고 /baseUri로 끝나지 않으면 경로의 마지막 세그먼트가 바뀝

다음 이미지는 이 예제를 보여 줍니다.

Uri.Combine 예제입니다.

엔터티별 함수 제거

커넥터를 더 쉽게 유지 관리할 수 있도록 이전 단원GetAirlineTables 에서 사용한 엔터티별 서식 함수를 GetAirportsTable제거하고 대신 모든 엔터티에 대해 작동하는 방식으로 JSON 응답을 처리하도록 업데이트 TripPin.Feed 합니다. 특히 반환된 OData JSON 페이로드의 필드를 가져와 value 레코드 목록에서 테이블로 변환합니다.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source),
        // The response is a JSON record - the data we want is a list of records in the "value" field
        value = json[value],
        asTable = Table.FromList(value, Splitter.SplitByNothing()),
        // expand all columns from the record
        fields = Record.FieldNames(Table.FirstValue(asTable, [Empty = null])),
        expandAll = Table.ExpandRecordColumn(asTable, "Column1", fields)
    in
        expandAll;

참고 항목

엔터티를 처리하는 일반적인 방법을 사용하는 경우의 단점은 엔터티에 대한 좋은 형식 지정 및 형식 정보가 손실된다는 것입니다. 이 자습서의 이후 섹션에서는 REST API 호출에 스키마를 적용하는 방법을 보여 줍니다.

결론

이 자습서에서는 데이터 원본 경로 값을 수정하고 탐색 테이블에 보다 유연한 형식으로 이동하여 커넥터를 정리하고 간소화했습니다. 이 단계를 완료하거나 이 디렉터리의 샘플 코드를 사용하여 함수는 TripPin.Contents Power BI Desktop에서 탐색 테이블을 반환합니다.

탐색기.

다음 단계

TripPin 5부 - 페이징