본문 바로가기
기술자료 (KB)/Power Platform

PowerApps Sharepoint 5000개 이상의 값에서 최대값 구하기

by 이완주 2024. 11. 12.

Power Automate 에서도 Sharepoint의 값이 5000개가 넘어가면 한번에 가져오지 못하는 것을 확인했다.

이는 Sharepoint의 제한 조건으로 한번에 가져오면 아래와 같이 오류가 발생한다.

 

 

Power Apps에서 한번에 값을 가져 올 수 있는 임계값은 기본 500개 에서 최대 2000개 까지이다.

 

필터 조건을 이용하면 한번에 2000개의 데이터를 가져올 수 있게 된다.

여기서 고민 그렇다면 필터 조건을 활용하여 2000개씩 반복해서 가져오면 되지 않을까?

 

아래 필터 조건을 수행하면 값을 2000개를 가져오게 된다.

ID 값을 사용하지 않는 이유는 위임 경고로 정상적인 값을 얻을 수 없기 때문이다.

Filter(Num6000Code,Num > 0)

 

문제는 위에 2000개로는 값을 얻을 수 없다.

그래서 10,000개 까지 2,000개 단위로 검색하여 최대 값을 구하고 최대 10,000개 까지 확인 할 수 있는 방법은 아래와 같다.

 

아래 조건의 If 조건으로 반복하여 구성하였으며 해당 값을 재귀쿼리형식을 고려하였으나 한번에 2,000개를 불러오는 시간이 있어 문제가 계속 발생하여 아래 단순 조건으로 구성 함.  (이 글을 읽고 성공하신 분은 알려주세요...한계가..)

// 기본 값이 ID를 가져오게 되면 위임 경고가 발생하여 별도의 Num를 생성하여 작성함
// [설정] - [데이터 행 제한]에 설정되어 있는 값이 2,000으로 설정하여 최대 2,000개까지 가지고 옴
// 10000개까지 검색 하는 조건 식

// --블록1--
// Num6000Code의 Filter 조건이 Num 값이 0 이상인 값을 불러 값을 저장 한다.
With({result1: Filter(Num6000Code,Num > 0)},
    // 현재 가지고 온 값이 없으면 0을 출력
    If(IsBlank(First(result1.Num)),0,
        // maxNo에 현재 가지고온 값의 마지막 Num를 maxNo로 설정
        With({maxNo1: Last(Sort(result1,Num)).Num},
           
           // --블록2--
           // 가지고온 값이 2000개가 맞으면 전체 값의 마지막의 값이거나 혹은 그 이상의 값이 있음을 나타냄
           // 조건 1  
           If(CountRows(result1)=2000,
                // 조건 1이 만족하는 경우 Num의 값이 maxNo 보다 큰 값 2000개를 가져와서 result에 저장 한다.
                With({result2: Filter(Num6000Code,Num > maxNo1)},
                    // 조건2
                    // result2 값이 비어 있는지 확인
                    If(!IsBlank(Last(Sort(result2,Num)).Num),
                        //  maxNo에 현재 가지고온 값의 마지막 Num를 maxNo로 설정
                        With({maxNo2: Last(Sort(result2,Num)).Num},
                           
                            // --블록3--
                            // 가지고온 값이 2,000개가 맞으면 전체 값의 마지막의 값이거나 혹은 그 이상의 값이 있음을 나타냄
                            // 조건3  
                            If(CountRows(result2)=2000,
                                // 조건 3이 만족하는 경우 Num의 값이 maxNo 보다 큰 값 2000개를 가져와서 result에 저장 한다.
                                // 2001 ~ 4000개의 값 가지고와서 result에 저장
                                With({result3: Filter(Num6000Code,Num > maxNo2)},
                                    // 조건4
                                    // result3 값이 비어 있는지 확인
                                    If(!IsBlank(Last(Sort(result3,Num)).Num),
                                        // 값이 비어 있지 않으면
                                        With({maxNo3: Last(Sort(result3,Num)).Num},
                                           
                                            // --블록4--
                                            // 가지고온 값이 2,000개가 맞으면 전체 값의 마지막의 값이거나 혹은 그 이상의 값이 있음을 나타냄
                                            // 조건5  
                                            If(CountRows(result3)=2000,
                                                // 조건 3이 만족하는 경우 Num의 값이 maxNo 보다 큰 값 2000개를 가져와서 result에 저장 한다.
                                                // 4001 ~ 6000개의 값 가지고와서 result에 저장
                                                With({result4: Filter(Num6000Code,Num > maxNo3)},
                                                    // 조건6
                                                    // result3 값이 비어 있는지 확인
                                                    If(!IsBlank(Last(Sort(result4,Num)).Num),
                                                        // 값이 비어 있지 않으면
                                                        With({maxNo4: Last(Sort(result4,Num)).Num},

                                                            // --블록5--
                                                            // 가지고온 값이 2,000개가 맞으면 전체 값의 마지막의 값이거나 혹은 그 이상의 값이 있음을 나타냄
                                                            // 조건7  
                                                            If(CountRows(result4)=2000,
                                                                // 조건7 만족하는 경우 Num의 값이 maxNo 보다 큰 값 2000개를 가져와서 result에 저장 한다.
                                                                // 6001 ~ 8000개의 값 가지고와서 result에 저장
                                                                With({result5: Filter(Num6000Code,Num > maxNo4)},
                                                                    // 조건8
                                                                    // result3 값이 비어 있는지 확인
                                                                    If(!IsBlank(Last(Sort(result5,Num)).Num),
                                                                        // 값이 비어 있지 않으면
                                                                        With({maxNo5: Last(Sort(result5,Num)).Num},
                                                                           
                                                                            // --블록6--
                                                                            // 가지고온 값이 2,000개가 맞으면 전체 값의 마지막의 값이거나 혹은 그 이상의 값이 있음을 나타냄
                                                                            // 조건9  
                                                                            If(CountRows(result5)=2000,
                                                                                // 조건9 만족하는 경우 Num의 값이 maxNo 보다 큰 값 2000개를 가져와서 result에 저장 한다.
                                                                                // 8,001 ~ 10,000개의 값 가지고와서 result에 저장
                                                                                With({result6: Filter(Num6000Code,Num > maxNo5)},
                                                                                    // 조건10
                                                                                    // result6 값이 비어 있는지 확인
                                                                                    If(!IsBlank(Last(Sort(result6,Num)).Num),
                                                                                        // 값이 비어 있지 않으면
                                                                                        With({maxNo6: Last(Sort(result6,Num)).Num},
                                                                                            maxNo6
                                                                                        ),
                                                                                        // 조건10 result 값이 비어 있다는 것은 전체 값의 마지막 값 즉 2000번째 값이 마지막 값
                                                                                        maxNo5
                                                                                    )
                                                                                ),
                                                                                // 조건9 만족 하지 않으면 maxNo 값을 출력 CountRows(result4)=2000
                                                                                // !IsBlank(Last(Sort(result6,Num)).Num)
                                                                                maxNo5
                                                                            )//-- 블록6 --

                                                                        ),
                                                                        // 조건8 result 값이 비어 있다는 것은 전체 값의 마지막 값 즉 2000번째 값이 마지막 값
                                                                        maxNo4
                                                                    )
                                                                ),
                                                                // 조건7 만족 하지 않으면 maxNo 값을 출력 CountRows(result4)=2000
                                                                // !IsBlank(Last(Sort(result5,Num)).Num)
                                                                maxNo4
                                                            )//-- 블록5 --

                                                        ),
                                                        // 조건6 result 값이 비어 있다는 것은 전체 값의 마지막 값 즉 2000번째 값이 마지막 값
                                                        maxNo3
                                                    )
                                                ),
                                                // 조건5 만족 하지 않으면 maxNo 값을 출력 CountRows(result3)=2000
                                                // !IsBlank(Last(Sort(result4,Num)).Num)
                                                maxNo3
                                            )//-- 블록4 --

                                        ),

                                        // 조건4 result 값이 비어 있다는 것은 전체 값의 마지막 값 즉 2000번째 값이 마지막 값
                                        // !IsBlank(Last(Sort(result3,Num)).Num)
                                        maxNo2
                                    )
                                ),
                                // 조건3 만족 하지 않으면 maxNo 값을 출력 CountRows(result2)=2000
                                maxNo2
                            )//-- 블록3 --

                        )
                        // 조건2 result 값이 비어 있다는 것은 전체 값의 마지막 값 즉 2000번째 값이 마지막 값
                        // !IsBlank(Last(Sort(result2,Num)).Num)
                        ,maxNo1
                    )
                ),
                // 조건1 만족 하지 않으면 maxNo 값을 출력 CountRows(result1)=2000
                maxNo1
            )// -- 블록2 --
        )
    )
) // --블록1--

 

위의 내용을 간략하게 정리하면 

컬렉션으로 데이터를 모두 가져와서 Max 값을 구하면 쉽게 구할 수 있다.

 

아래 내용은 원하는 수 만큼 계속 추가해 주어야 한다.

ClearCollect(colNum,Filter(Num6000Code,Num > 0));
Collect(colNum,Filter(Num6000Code,Num > 2000 And Num <= 4000 ));
Collect(colNum,Filter(Num6000Code,Num > 4000 And Num <= 6000 ));
Collect(colNum,Filter(Num6000Code,Num > 6000 And Num <= 8000 ));
Collect(colNum,Filter(Num6000Code,Num > 8000 And Num <= 10000 ));
Collect(colNum,Filter(Num6000Code,Num > 10000 And Num <= 12000 ));
Collect(colNum,Filter(Num6000Code,Num > 12000 And Num <= 14000 ));
조건식으로 간단하게 - 22,000개의 데이터 수집 가능 여기서 Sequence 값을 조정하면 더 많은 데이터를 가져올 수 있다.
ClearCollect(colNum,Filter(Num6000Code,Num > 0));
ForAll(
    Sequence(10),
    With({num: 2000 * Value},
        Collect(colNum,Filter(Num6000Code,Num > num ));
    )
)

 

[참고자료]

아래 자료에서 제가 했던 방법보다 훨씬 쉽게 구현해 놓았네요.

아래 로코남 동영상에 좋은 자료가 많으니 참고하시면 도움이 될 듯 합니다.

저도 많은 도움이 되고 있습니다.

https://www.youtube.com/watch?v=P38Zzu_RuOs

 

 

댓글