Course A-1

[신고 사업장 정보] 개발

목표

  • GPM을 통해 테이블을 정의하고 저장 프로시저를 생성한 다음 Visual Studio에서 폼 템플릿을 이용하여 프로젝트를 생성. 개발된 폼을 실행하기까지의 기본적인 GST Platform 도구 사용 방법을 익힙니다.

  • 학습 인정 시간: 4 시간 30 분

주의 사항

  • 실습 내용의 "_xxx" 부분에는 본인 성명의 이니셜로 대체합니다.

  • ex) 성명이 '김개발'일 때 orgTaxSite_xxx → orgTaxSite_kgb

개발 화면

1. 테이블 정보

2. 모델링

2.1) 데이터 컴포넌트 등록 [GPM→모델링→데이터 컴포넌트]

  • "[Dev1] 사업장 정보_xxx" 그룹 생성합니다.

  • 위에서 생성한 그룹 아래 "테이블 정보" 를 참고하여 Data Component 정보를 생성합니다.

2.2) 비즈니스 컴포넌트 등록 [GPM→모델링→비즈니스 컴포넌트]

  • 업종 콤보에 대한 BizComponent를 등록합니다. ( 컴포넌트ID : L_COM002_xxx )

  • 우편 번호 팝업에 대한 BizComponent를 등록합니다. ( 컴포넌트ID : P_COM004_xxx )

2.3) 데이터 컴포넌트 정보에 비즈니스 컴포넌트 정보 연결 [GPM→모델링→데이터 컴포넌트]

  • "업종", "우편번호" 데이터 컴포넌트에 "업종 정보", "우편 번호 팝업" 비즈니스 컴포넌트를 BizComponent ID 항목에 각각 설정합니다.

2.4) 테이블 생성 [GPM→모델링→테이블 관리]

  • 앞에서 만든 데이터 컴포넌트로 테이블을 생성합니다.

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • 테이블 명 : orgTaxSite_xxx

  • 테이블 설명 : 신고 사업장 정보

  • 업무용어 탭에서 사용 할 업무용어를 선택(더블클릭)하여 오른쪽 테이블 필드리스트로 추가하여 등록합니다.

  • 필드를 구성하고 ‘UP’, ‘DOWN’ 버튼으로 컬럼 순서를 변경할 수 있고 ‘행삭제’ 버튼으로 필드를 삭제할 수 있습니다.

  • PK설정, NULL옵션 및 기본값 등을 설정합니다.

  • 컬럼 구성을 완료하였으면 테이블 디자인 탭으로 이동 해서 ‘DB반영’ 버튼을 클릭하면 테이블이 생성됩니다.

3. 비즈니스 로직 생성

3.1) 신고 사업장 정보 조회 프로시저 생성 [GPM→개발→SP편집]

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • SP 명 : P_DEV001_xxx_Q

  • SP 설명 : 신고 사업장 정보 조회

  • 테이블 탭으로 이동하여 적용할 테이블을 검색합니다.

  • [SP 생성 정보] 탭으로 이동해 앞에서 검색한 테이블을 '적용 테이블' 그룹박스 안에 드래그 드랍 합니다.

  • 적용 템플릿을 "기본프로시저_조회"로 선택 후 Select, Parameter에 사용할 필드를 드래그 드랍 합니다.

  • 완료 후 하단의 "SP 편집창에 적용" 버튼을 클릭합니다.

  • 수정할 구문이 있으면 수정을 하고 하단의 "SP 생성" 버튼을 클릭 하면 SP가 생성됩니다.

    ----------------------------------------------------------------------------------------------------------------------- 
    -- 리스트 조회
    IF @p_work_type IN ( 'Q' ) 
    BEGIN
    ----------------------------------------------------------------------------------------------------------------------- 
    
        SELECT A.tax_site_code_xxx,
               A.tax_site_name_xxx,
               A.biz_regno_xxx,
               A.biz_type_xxx,
               A.biz_items_xxx,
               A.chief_name_xxx,
               A.chief_socialno_xxx,
               A.zip_code_xxx,
               A.address_xxx,
               A.tel_xxx,
               A.fax_xxx,
               A.memo_xxx,
               A.use_yn_xxx
    
          FROM orgTaxSite_xxx A
    
         WHERE A.tax_site_code_xxx LIKE '%' + @p_tax_site_code_xxx + '%'
           AND A.tax_site_name_xxx LIKE '%' + @p_tax_site_name_xxx + '%'
           AND A.biz_regno_xxx LIKE '%' + @p_biz_regno_xxx + '%'
    
        SELECT @p_row_count = @@ROWCOUNT
    
        IF @p_row_count > 0  
            SET @p_error_code = 'MSG0001'                                -- 정상적으로 조회가 되었습니다  
        ELSE 
            SET @p_error_code = 'MSG0006'                                -- 조회된 자료가 없습니다.                 
    
    END -- 리스트 조회 끝 
    -----------------------------------------------------------------------------------------------------------------------

3.2) 신고 사업장 정보 저장 프로시저 생성 [GPM→개발→SP편집]

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • SP 명 : P_DEV001_xxx_S

  • SP 설명 : 신고 사업장 정보 저장

  • 적용 템플릿을 "기본프로시저_저장"으로 선택 후 Insert, Update, Delete, Parameter에 사용할 필드를 드래그 드랍 합니다.

  • 수정할 구문이 있으면 수정을 하고 하단의 "SP 생성" 버튼을 누르면 SP가 생성됩니다.

    ----------------------------------------------------------------------------------------------------------------------- 
    -- 신규 등록
    IF @p_work_type = 'N'
    BEGIN
    ----------------------------------------------------------------------------------------------------------------------- 

        -- 중복 체크
        IF EXISTS(      SELECT * 
			FROM orgTaxSite_xxx
	                WHERE tax_site_code_xxx = @p_tax_site_code_xxx)
        BEGIN
                SET @p_error_code = 'P_DEV001_xxx_S_001'
                RETURN
        END

        -- Insert
        INSERT INTO orgTaxSite_xxx
                  ( tax_site_code_xxx,      tax_site_name_xxx,      biz_regno_xxx,          biz_type_xxx,
                    biz_items_xxx,          chief_name_xxx,         chief_socialno_xxx,     zip_code_xxx,
                    address_xxx,            tel_xxx,                fax_xxx,                memo_xxx,
                    use_yn_xxx )
             SELECT @p_tax_site_code_xxx,    @p_tax_site_name_xxx,    @p_biz_regno_xxx,       @p_biz_type_xxx,
                    @p_biz_items_xxx,       @p_chief_name_xxx,      @p_chief_socialno_xxx,    @p_zip_code_xxx,
                    @p_address_xxx,         @p_tel_xxx,             @p_fax_xxx,             @p_memo_xxx,
                    @p_use_yn_xxx


        SELECT @p_row_count = @@ROWCOUNT
    
        SET @p_return_str = @p_tax_site_code_xxx

        -- 에러가 없을 경우에 정상적인 처리 진행  
        IF @p_row_count > 0  
            SET @p_error_code = 'MSG0002'                                   -- 정상적으로 등록되었습니다.  
        ELSE 
            SET @p_error_code = 'MSG0029'                                   -- 등록된 레코드가 없습니다. 

    END -- 신규 등록
    ----------------------------------------------------------------------------------------------------------------------- 

    ----------------------------------------------------------------------------------------------------------------------- 
    -- 수정
    IF @p_work_type = 'U' 
    BEGIN
    ----------------------------------------------------------------------------------------------------------------------- 

        -- Update Query  
        UPDATE	orgTaxSite_xxx SET
                tax_site_name_xxx = @p_tax_site_name_xxx,
                biz_regno_xxx = @p_biz_regno_xxx,
                biz_type_xxx = @p_biz_type_xxx,
                biz_items_xxx = @p_biz_items_xxx,
                chief_name_xxx = @p_chief_name_xxx,
                chief_socialno_xxx = @p_chief_socialno_xxx,
                zip_code_xxx = @p_zip_code_xxx,
                address_xxx = @p_address_xxx,
                tel_xxx = @p_tel_xxx,
                fax_xxx = @p_fax_xxx,
                memo_xxx = @p_memo_xxx,
                use_yn_xxx = @p_use_yn_xxx
        WHERE tax_site_code_xxx = @p_tax_site_code_xxx


        SELECT @p_row_count = @@ROWCOUNT

        SET @p_return_str = @p_tax_site_code_xxx

        -- 에러가 없을 경우에 정상적인 처리 진행  
        IF @p_row_count > 0  
            SET @p_error_code = 'MSG0004'                                   -- 정상적으로 수정되었습니다.  
        ELSE 
            SET @p_error_code = 'MSG0030'                                   -- 수정된 레코드가 없습니다.  

    END -- 수정
    ----------------------------------------------------------------------------------------------------------------------- 

    ----------------------------------------------------------------------------------------------------------------------- 
    -- 삭제
    IF @p_work_type = 'D' 
    BEGIN
    ----------------------------------------------------------------------------------------------------------------------- 

        DELETE 
        FROM orgTaxSite_xxx
        WHERE tax_site_code_xxx = @p_tax_site_code_xxx

        SELECT @p_row_count = @@ROWCOUNT

        IF @p_row_count > 0  
            SET @p_error_code = 'MSG0003'                                   -- 정상적으로 삭제되었습니다.  
        ELSE 
            SET @p_error_code = 'MSG0031'                                   -- 삭제된 레코드가 없습니다.  

    END -- 삭제
    ----------------------------------------------------------------------------------------------------------------------- 

3.3) 저장 프로시저 사용자 메시지 등록 [GPM→개발→SP 메시지]

  • 위에서 생성했던 "P_DEV001_xxx_S"를 선택하고 "행 추가" 버튼을 클릭하여 메시지를 등록합니다.

4. 화면 개발

4.1) 폼 생성 [Visual Studio→도구→GPM Tools]

  • 폼 ID, 폼 명, 프로그램 그룹, 폼 템플릿 등을 선택하고 "폼 생성하기" 버튼을 누릅니다.

  • 관련 SP 텍스트란에 생성한 SP를 검색하여 오른쪽 '조회SP'와 '저장SP' 칸에 각각 드래그 드랍 합니다.

  • 오른쪽 '데이터셋' 영역에 SP의 파라미터 항목들과 조회SP의 경우 반환하는 필드들을 확인합니다.

  • "코드 적용" 버튼을 눌러 SP 처리에 필요한 코드를 생성합니다.

4.2) 화면 디자인

  • 디자인 탭에서 화면을 디자인합니다.

  • 오른쪽 데이터셋 탭에 보여지는 DB Object를 다음 사진과 같이 컨트롤 리스트에 드래그 드랍하여 생성시킬 컨트롤을 구성합니다.

  • 데이터셋 영역의 'Parameters' 항목은 조회SP의 파라미터로서 조회조건을 의미합니다.

  • 데이터셋 영역의 'DataTable' 항목은 조회SP의 SELECT문 결과를 의미합니다.

  • 아직 컨트롤이 생성되지 않은 ("+" 표시) 행에 대하여 '행 삭제' 기능을 통해 제거할 수 있습니다.

  • 디자인 리스트 구성을 완료하고 하단의 "디자인 적용하기" 버튼을 클릭하면 디자인이 적용되어 컨트롤들이 생성 됩니다.

  • Visual Studio 디자인 화면으로 이동해서 자동 생성된 컨트롤을 "결과 화면"을 참고하여 배치를 조정하고, [보기→탭 순서] 메뉴로 컨트롤의 탭 순서를 재지정 합니다.

5. 기능 구현

저장 프로시저를 처리하는 코드 패턴은 폼 템플릿에 미리 작성되어 있는 #region [예시 코드]를 참고합니다.

5.1) 조회 프로시저 실행 메서드 [Func_P_DEV001_xxx_Q]

  • 조회 조건 영역에 배치된 컨트롤들에 입력된 값을 받아 프로시저의 파라미터로 사용합니다.

public override void ClickRetrieveButton()
{
    int beforeRowHandle = gvwList.FocusedRowHandle;
    int findIndex = 0;

    if (Func_P_DEV001_xxx_Q("Q"))
    {
        if (!string.IsNullOrEmpty(_FindRowValue))
        {
            findIndex = gvwList.LocateByValue("tax_site_code_xxx", _FindRowValue);
            
            if (findIndex == 0)
                beforeRowHandle = 0;
                
            _FindRowValue = null;

            gvwList.FocusedRowHandle = findIndex;
        }
    }

    if (gvwList.FocusedRowHandle < 0
        || (beforeRowHandle <= 0 && gvwList.FocusedRowHandle == 0)
        || findIndex < 0)
    {
        FocusedRowChanged(gvwList);
    }
}


private bool Func_P_DEV001_xxx_Q(string workType)
{
    string siteCode = txtTax_site_code_xxx.Text;
    string siteName = txtTax_site_name_xxx.Text;
    string bizRegno = txtBiz_regno_xxx.Text;
    
    try
    {
        P_DEV001_xxx_Q procInfo = new P_DEV001_xxx_Q();
        
        procInfo.AddParamData(
            workType,
            siteCode,
            siteName,
            bizRegno);

        ResultSet result = ExecuteProcedure(procInfo);
        
        if (workType.Equals("Q"))
        {
            SetData(grdList, result?[0]);
        }
        
        return result?.IsSuccess ?? false;
    }
    catch (Exception ex)
    {
        ShowErrorMessageBox(ex);
        return false;
    }
}

5.2) 저장 프로시저 실행 메서드 [Func_P_DEV001_xxx_S]

  • 기본 정보 영역에 배치된 컨트롤들에 입력된 값을 받아 프로시저의 파라미터로 사용합니다.

private bool Func_P_DEV001_xxx_S(string workType)
{
    if (!ValidateControls(grpMaster))
    {
        return false;
    }

    string siteCode = txtTax_site_code_xxx1.Text;
    string siteName = txtTax_site_name_xxx1.Text;
    string bizRegno = txtBiz_regno_xxx1.Text;
    
    string bizType = cboBiz_type_xxx.EditValue?.ToString() ?? string.Empty;
    string bizItems = txtBiz_items_xxx.Text;
    string chiefName = txtChief_name_xxx.Text;
    string chiefSocialno = txtChief_socialno_xxx.Text;
    
    string zipCode = txtZip_code_xxx.Text;
    string address = txtAddress_xxx.Text;
    string tel = txtTel_xxx.Text;
    string fax = txtFax_xxx.Text;
    string memo = memoMemo_xxx.Text;
    string useYN = chkUse_yn_xxx.EditValue?.ToString() ?? string.Empty;

    try
    {
        P_DEV001_xxx_S procInfo = new P_DEV001_xxx_S();

        procInfo.AddParamData(
            workType,
            siteCode,
            siteName,
            bizRegno,
            bizType,
            bizItems,
            chiefName,
            chiefSocialno,
            zipCode,
            address,
            tel,
            fax,
            memo,
            useYN);
        
        ResultSet result = ExecuteProcedure(procInfo);

        _FindRowValue = result?.ReturnString;

        return result?.IsSuccess ?? false;
    }
    catch (Exception ex)
    {
        ShowErrorMessageBox(ex);
        return false;
    }
}

5.3) GridColumn 요약 정보

  • GridView Footer영역에 현재 표현되는 GridView의 행(Row)의 수를 나타내기 위해 SummaryItem 속성을 설정합니다.

5.4) 공통 팝업 설정

  • 우편번호 및 주소에 대한 팝업 매핑 작업을 처리합니다.

  • 우편번호 컨트롤(ButtonEditEx)을 선택하고 속성 창의 Popup 속성을 찾아 버튼 클릭

  • 아래 사진과 같이 팝업 정보를 세팅합니다.

5.5) 필수 입력 제한 처리

  • "신고 사업장 코드"와 "신고 사업장 명"의 TextEditEx 컨트롤에 AllowBlank 속성을 false로 설정합니다.

  • AllowBlank 속성을 false로 설정하면 런타임 시점에 화면에서 분홍색으로 표현됩니다.

  • 참고) BaseEdit 파생 클래스의 AllowBlank 속성에 대하여 값 입력 확인은 ValidateControls 메서드에서 수행합니다.

5.6) Grid 영역에 입력 제한 처리

  • Grid Designer 팝업을 열어 모든 GridColumn을 선택하고 'Column options' 탭에서 AllowEdit 속성을 False로 설정합니다.

  • ※ 첫 번째 GridColumn을 선택하고, Shift 키를 누른 상태에서 마지막 컬럼을 선택하면 모두 선택 가능

5.7) 테이블의 기본 키에 대한 수정 제한 처리

  • 테이블의 기본키인 '신고 사업장 코드(tax_site_code_xxx)'는 신규로 등록하는 상태에서만 입력이 가능하도록 합니다.

  • ReadOnlyControl 메서드를 이용하여 신규 버튼 클릭에 해당하는 ClickNewButton 메서드와, GridView의 Row가 변경되었을때의 FocusedRowChanged 메서드를 수정합니다.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    EnabledRetrieveButton = true;
    EnabledNewButton = true;
    EnabledDeleteButton = true;

    ReadOnlyControl(txtTax_site_code_xxx1, true);
    
    ResetParameters();
}

public override void ClickNewButton()
{
    InitControls(grpMaster);

    ReadOnlyControl(txtTax_site_code_xxx1, false);

    chkUse_yn_xxx.Checked = true;

    txtTax_site_code_xxx1.Focus();
}

private void FocusedRowChanged(GridView view)
{
    if (view.Equals(gvwList))
    {
        if (view.RowCount > 0 && view.FocusedRowHandle >= 0)
        {
            if (string.IsNullOrEmpty(_FindRowValue))
            {
                SetDataFromReferenceControl(grpMaster, grdList);
            }
        }
        else
        {
            InitControls(grpMaster);
        }

        ReadOnlyControl(txtTax_site_code_xxx1, true);
    }
}

5.8) 조회 조건 영역의 초기화 버튼 기능

  • [GPM Tools→기본값 설정]에서 [폼 디자인 정보] 영역의 대상 컨트롤들을 더블 클릭하여 [처리영역]에 등록하고 "Type"과 "Caption"을 입력 후 저장 버튼을 클릭합니다.

  • 설정한 기본값 정보를 코드에서 ResetParameters 메서드에 구현합니다. (※ GetDefault 메서드)

private void ResetParameters()
{
    txtTax_site_code_xxx.EditValue = GetDefault("PARAM1", nameof(txtTax_site_code_xxx), string.Empty);
    txtTax_site_name_xxx.EditValue = GetDefault("PARAM1", nameof(txtTax_site_name_xxx), string.Empty);
    txtBiz_regno_xxx.EditValue = GetDefault("PARAM1", nameof(txtBiz_regno_xxx), string.Empty);
}

6. 실행

6.1) 빌드 및 실행

  • [Visual Studio→빌드→솔루션 빌드] 메뉴를 실행합니다.

  • GSTBrowser를 실행하여 [폼 오픈] 버튼을 클릭하고 윈도우 탐색기에서 "프로젝트 폴더→bin→Debug" 경로로 이동하여 작업했던 폼 어셈블리 파일을 선택합니다.

  • ex) C:\workspace_edu\DEV001_xxx\DEV001_xxx\bin\Debug

6.2) 디버깅 방법

  • 조회 버튼 클릭했을때 호출되는 메서드의 시작 부분에 Break Point를 설정합니다.

  • 솔루션 빌드 후 출력 결과에 "성공"을 확인하고, [Visual Studio→디버그→프로세스에 연결] 메뉴를 실행하여 "프로세스 연결" 창에서 GSTBrowser를 선택하고 "연결" 버튼을 클릭합니다.

  • Visual Studio가 디버깅 상태로 변경되면 GSTBrowser에서 다시 "폼 오픈"을 통해 어셈블리를 실행하고 조회 버튼을 클릭하여 Break Point에서 중단이 되는지 확인합니다.

7. 체크 리스트

  • 검색 / 신규→저장 / 수정→저장 / 삭제 기능이 올바르게 동작하는지 확인합니다.

  • 사업장 코드는 신규 시에만 수정이 가능한지 확인합니다.

  • 저장 시 필수 입력 항목 체크가 정확히 이루어지는지 확인합니다.

  • [기본 정보] 영역에 탭 순서가 제대로 지정되었는지 확인합니다.

  • 업종 LookUp이 제대로 바인딩 되어있는지 확인합니다.

  • 우편번호 팝업이 제대로 동작하는지 확인합니다.

  • [조회조건] 영역에 입력된 조건에 맞게 데이터가 정상 조회되는지 확인합니다.

  • [조회조건] 영역의 '초기화 버튼' 클릭 시 조회조건이 정상적으로 초기화 되는지 확인합니다.

  • 요약정보의 데이터 건 수 집계가 제대로 표현되는지 확인합니다.

  • 이미 등록된 사업장 코드와 동일한 코드를 신규로 등록했을때 설정한 SP메시지("이미 등록된 신고 사업장 코드입니다.""이미 등록된 신고 사업장 코드입니다.")가 제대로 출력되는지 확인합니다.

Last updated

Was this helpful?