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

PowerApps으로 만드는 조직도 솔루션 - 07. 부서 (새로 만들기)

by 이완주 2024. 9. 24.

 

 

PowerApps으로 만든 조직도 솔루션 제안서

작년에 Power Apps으로 만들어 아직까지 저희 회사에 잘 쓰고 있는 솔루션 입니다.조직도는 연차 결재 솔루션과 연동하여 사용 중에 있습니다. 해당 솔루션의 구성 방법 입니다. 대략 10개 내외 정

leemcse.tistory.com

 

부서 새로 만들기

1. 입력은 최소로하여 이름과 소속 부서만 넣어 만들 수 있어야 한다.

2. 필수 입력값 외에는 자동으로 설정하게 구성

3. 같은 회사에 동일 이름의 부서가 만들어 지면 안되게 구성되어야 한다.

 

 

[구성 전 화면]

 

새로만들기 - 설정

부서를 새로 만들기 위해서 이름과 소속 부서를 선택하면 선택된 부서를 기준으로 나머지 값을 자동으로 설정

 

설정 값은 아래와 같이 설정 후 Name 값과 Description 값을 제외한 모든 값은 Visible = false로 설정하여 화면에 나타나지 않게 구성한다.

 

컬렉션 만들기

 

화면 선택 Default 설정

화면이 나타나면 아래의 옵션 수행

DepartmentScreen 의 OnVisible 내용 수정

컬렉션이 나오지 않게 false로 설정

Department 값을 새롭게 가져오기

// ColDepartment 초기화 및 생성
ClearCollect(ColDepartment,AddColumns(OrgDepartment,NewID,ID));
// OrgCompany의 회사 정보를 ColDepartment에 추가
ForAll(
    OrgCompany,
    Collect(
        ColDepartment,
        {
            No: Text(OrderNo,"00"),
            CompanyID : ID,
            Name: Name,
            Level: 0,
            OrderNo: Text(OrderNo,"00") & "000000000000000000000000000000",
            Visible:true
        }
    )
);
// ColDepartmentSub 보이지 않게 초기화
UpdateContext({varNewSelect:false,editMode: false, newMode: false,deleteMode:false});


 

 

visible 값 true 설정

화면에 표시되는 값은 Visible 값이 true 인 값만 나타나게 되어 있다.

Visible 속성이 Default 가 false로 되어 있어 SubmitForm(DepartmentForm) 하게되면 OrgDepartment 값의 visible 값이 false로 들어가게 되어 원하는 표현이 되지 않게 된다.

 

위의 값의 Default를 true로 변경

Default = true

 

 

 

갤러리의 값을 컬렉션으로 만들기 - Description 항목에 갤러리를 추가하여 구성

부서 계층 구조로 만든 왼쪽 Department 갤러리를 복사하여 수정하여 만듬

그룹 레벨은 5레벨까지로 상위 부서는 4레벨까지 선택이 가능함으로 갤러리에 표시는 Level 4까지 표현 가능하게 구성

OnSelect 로 선택 후 Disable 하여 화면에 나타나지 않음

Items = Filter(Sort(ColDepartmentSub,OrderNo),Visible=true And Level<5)
OnSelect = UpdateContext({ itemSelectedSub: true, CurrentItemSub: ThisItem });UpdateContext({varNewSelect:false})
Visible = varNewSelect

 

 

Description 값

선택된 값의 Level=0 이면 부서이름, 그렇지 않으면 선택된 값의 Description 값에 / 부서이름을 넣어 만들기

해당 값은 화면에 나타날 필요가 없음으로 Visible 속성은 false

Default = If(newMode,If(CurrentItemSub.Level > 0,CurrentItemSub.Description & "/" & DepartmentNameCard.Text,DepartmentNameCard.Text ),Parent.Default)

Visible =
false

 

선택된 상위 부서 이름을 표현

왼쪽 선택된 부서이름을 기본 값으로 하고 소속 부서를 선택하면 선택한 부서가 나타나게 구성

 

새로 만들기에서 왼쪽 선택 값 확인

// DepartmentForm 초기화
NewForm(DepartmentForm);
// 왼쪽 선택된 아이템을 Default로 설정 및 NewMode 선언
UpdateContext({  CurrentItemSub: CurrentItem, varNewSelect:false, newMode: true  });

Default = CurrentItemSub.Name
DisplayMode = DisplayMode.View

 

갤러리 선택하면 선택된 갤러리 값으로 변경

OnSelect = UpdateContext({ itemSelected: true, CurrentItem: ThisItem, newMode:false ,editMode: false, deleteMode:false })

 

버튼 선택하면 DepartmentNameGallery 초기화 및 표시

OnSelect = Reset(DepartmentNameGallery);UpdateContext({varNewSelect:!varNewSelect})

 

선택 값 변수 저장

DepartmentNameGallery 의 OnSelect 하면 선택된 값을 변수에 저장하고 Gallery를 Visible 값을 false로 설정

OnSelect = UpdateContext({ itemSelectedSub: true, CurrentItemSub: ThisItem });UpdateContext({varNewSelect:false})
Visible = varNewSelect

 

OrderNo 설정

newMode 일때 선택된  값의 OrderNo를 가져와 자동으로 OrderNo 설정

If(
    newMode,
   
    // 현재 선택된 값의 OrderNo 의 Level*5+2 길이 만큼의 값
    Left(LookUp(ColDepartmentSub,ID=CurrentItemSub.ID,OrderNo),LookUp(ColDepartmentSub,ID=CurrentItemSub.ID,Level)*5+2)&
   
    // 값이 없으면 10001, 값이 있으면 No의 최대 값에 +1
    If(IsBlank(First(OrgDepartment).No),"10001",First(Sort(OrgDepartment,No,SortOrder.Descending)).No+1)&
   
    // 회사코드 2자리 + 부서 코드 5(자릿 수) * 5 (Level)의 자리수를 만들기 위해 나머지 자리에 0으로 채운 값 설정
    Left("000000000000000000000000000000",25-LookUp(ColDepartmentSub,ID=CurrentItemSub.ID,Level)*5)
    ,
    Parent.Default
)

 

OrderNo 숨기기

Name 과 Description 값을 제외한 모든 Card는 Visible=false로 화면에 보이지 않게 구성

Visible = false

 

No 설정

No의 초기 값은 10001로 이후 만들어지는 값은 최대 값 + 1 으로 자동 설정

Default = If(newMode,If(IsBlank(First(OrgDepartment).No),"10001",First(Sort(OrgDepartment,No,SortOrder.Descending)).No + 1),Parent.Default)

 

ParentNo 설정

갤러리에 선택된 값이 상위 부서로 선택된 값의 No를 ParentNo로 설정

Default = If(newMode,CurrentItemSub.ID,Parent.Default)

 

Level 설정

선택된 레벨 + 1 설정

Default = If(newMode,CurrentItemSub.Level + 1,Parent.Default)

 

CompanyID 설정

선택된 CompanyID로 설정

Default = If(newMode,CurrentItemSub.CompanyID,Parent.Default)

 

Company 설정

선택된 Company로 설정

Default = If(newMode,CurrentItemSub.Company,Parent.Default)

 

저장 버튼 활성화

저장 버튼은 아래 조건을 만족해야 활성화가 된다.

1. 기존에 부서 이름으로 사용하지 않은 경우 (부서 이름 중복 확인)
   editMode의 경우 선택된 이름과 같은 경우는 제외

2. Name 값이 비어 있는 경우

If(
    newMode,
        // 등록된 이름과 이름 값이 비어 있으면 DisplayMode = DisplayMode.Disabled
        If(IsBlank(LookUp(Filter(OrgDepartment,CompanyID=CurrentItemSub.CompanyID),Name=DepartmentNameCard.Text)) And !IsBlank(DepartmentNameCard.Text),DisplayMode.Edit,DisplayMode.Disabled),
    editMode,
        //
        If(
            // 등록된 이름 중 선택된 이름을 제외한 이름과 같은지 확인
            Or(CurrentItem.Name = DepartmentNameCard.Text, IsBlank(LookUp(Filter(OrgDepartment,CompanyID=CurrentItemSub.CompanyID),Name=DepartmentNameCard.Text)))
            // 값이 비어 있는지 확
            And !IsBlank(DepartmentNameCard.Text),DisplayMode.Edit,DisplayMode.Disabled
        )
       
)

 

저장

값을 저장하고 컬렉션을 업데이트

If(editMode,
    // Name 값이 변경되었을 경우 저장
    If(DepartmentGallery.Selected.Name <> DepartmentNameCard.Text,Patch(OrgDepartment,First(Filter(OrgDepartment,ID=DepartmentGallery.Selected.ID)),{Name:DepartmentNameCard.Text}));

    // 순서 변경은 변경된 값을 확인하여 OrderNo를 변경
    If(!IsBlank(LookUp(ColDepartmentEdit,cIsCheck= true )),ForAll(RenameColumns(Filter(ColDepartmentEdit,cIsCheck= true ),ID,NewID),Patch(OrgDepartment,LookUp(OrgDepartment,ID=NewID),{OrderNo:cOrderNo})))
    ,
    // newMode에서 JobtitleForm 저장
    SubmitForm(DepartmentForm)
);

// ColDepartment 초기화 및 생성
ClearCollect(ColDepartment,AddColumns(OrgDepartment,NewID,ID));

// OrgCompany의 회사 정보를 ColDepartment에 추가
ForAll(
    OrgCompany,
    Collect(
        ColDepartment,
        {
            No: Text(OrderNo,"00"),
            CompanyID : ID,
            Name: Name,
            Level: 0,
            OrderNo: Text(OrderNo,"00") & "000000000000000000000000000000",
            Visible:true
        }
    )
);

// ColDepartmentSub - 부서 관리를 위해 생성
ClearCollect(ColDepartmentSub,ColDepartment);

// ColEmployee 초기화 및 생성
ClearCollect(ColEmployee,AddColumns(OrgEmployee,NewID,ID));
ForAll(
    OrgCompany,
    Collect(
        ColEmployee,
        {
            No: Text(OrderNo,"00"),
            CompanyID : ID,
            Name: Name,
            Level: 0,
            OrderNo: Text(OrderNo,"00") & "000000000000000000000000000000",
            Visible:true
        }
    )
);

댓글