Course B-1
[공통 코드 관리] 개발
목표
이미 등록된 데이터 컴포넌트를 이용하여 두 개의 새로운 테이블을 정의하고, 가장 많이 사용되는 list-master-detail 패턴의 화면을 구성한 다음 테이블 반환 함수를 사용한 데이터 처리 과정을 이해합니다.
학습 인정 시간: 5 시간
주의 사항
GPM에서 데이터 컴포넌트는 새로 등록하지 않고 테이블만 새로 정의합니다.
이전 과정에서 진행했던 내용과 중복되거나 응용하여 해결할 수 있는 부분은 생략했습니다.
개발 화면

1. 테이블 정보


2. 모델링
2.1) 코드 그룹 정보 테이블 생성 [GPM→모델링→테이블 관리]
신규 버튼 클릭 - 상위 메뉴 "EDU" 선택
테이블 명 : comCodeGroup_xxx
테이블 설명 : 코드 그룹 정보

2.2) 코드 세부 정보 테이블 생성 [GPM→모델링→테이블 관리]
신규 버튼 클릭 - 상위 메뉴 "EDU" 선택
테이블 명 : comCodeMaster_xxx
테이블 설명 : 코드 세부 정보

3. 비즈니스 로직 생성
3.1) 공통 코드 관리 조회 프로시저 생성 [GPM→개발→SP편집]
신규 버튼 클릭 - 상위 메뉴 "EDU" 선택
SP 명 : P_DEV002_xxx_Q
SP 설명 : 공통 코드 관리 조회
테이블 탭으로 이동하여 'comCodeGroup_xxx' 테이블만 드래그 드랍하여 Parameter 탭에만 세팅 후 "SP 편집창에 적용" → "SP 생성" 순서로 처리합니다.
SP 정보 생성 후 SSMS 도구를 이용해 아래 쿼리를 참고하여 저장 프로시저 내용을 완성합니다.

-----------------------------------------------------------------------------------------------------------------------
-- 요약 정보
IF @p_work_type IN ( 'list' )
BEGIN
-----------------------------------------------------------------------------------------------------------------------
SELECT A.*
FROM comCodeGroup_xxx A
WHERE group_code LIKE '%' + @p_group_code + '%'
AND group_name LIKE '%' + @p_group_name + '%'
AND group_category LIKE @p_group_category + '%'
SELECT @p_row_count = @@ROWCOUNT
IF @p_row_count > 0
SET @p_error_code = 'MSG0001' -- 정상적으로 조회가 되었습니다
ELSE
SET @p_error_code = 'MSG0006' -- 조회된 자료가 없습니다.
END -- 요약 정보 끝
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
-- 상세 정보
IF @p_work_type IN ( 'detail' )
BEGIN
-----------------------------------------------------------------------------------------------------------------------
SELECT A.*
FROM comCodeMaster_xxx A
WHERE group_code = @p_group_code
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_DEV002_xxx_S
SP 설명 : 공통 코드 관리 저장
조회용 프로시저와 마찬가지로 아래 사진과 같이 Parameter 탭에만 세팅 후 "SP 편집창에 적용" → "SP 생성" 순서로 처리합니다.

4. 저장용 프로시저 완성
4.1) 파라미터 수정

4.2) 테이블 변수 처리
하나의 문자열로 받아온 여러 행(Row)에 대한 각 필드별 값을 파싱하여 테이블 형태로 보관하기 위해 변수를 정의합니다.

테이블 반환 함수 "SplitTableNVarchar"를 사용해 테이블 변수(
@tb_comCodeMaster_xxx)에 데이터를 삽입합니다.

4.3) 작업 타입: 신규 (@p_work_type = 'N')
신규 저장은 새로운 그룹 코드(
group_code)에 대한 세부 코드(sub_code)들을 한 번에 입력하고 저장한다는 의미입니다.입력된 그룹코드가 이미 등록된 코드인지 확인 후 comCodeGroup_xxx, comCodeMaster_xxx 테이블 순서로 데이터를 삽입합니다.

4.4) 작업 타입: 수정 (@p_work_type = 'U')
처리하려는 세부 코드 대상 중 신규(row_status='N')인 데이터의 중복 여부를 확인합니다.
comCodeGroup_xxx 테이블의 데이터 수정 → comCodeMaster_xxx 테이블의 데이터 삭제 → 수정 → 삽입 순서로 처리합니다.



4.5) 작업 타입: 삭제 (@p_work_type = 'D')
삭제는 그룹 코드(
group_code)에 대한 삭제를 의미하므로 comCodeGroup_xxx, comCodeMaster_xxx 두 테이블에 전달받은 그룹 코드 파라미터(@p_group_code)로 등록된 모든 데이터를 삭제합니다.

5. 화면 개발
5.1) 폼 생성 [Visual Studio→도구→GPM Tools]

5.2) 화면 디자인
디자인 리스트를 아래 사진처럼 구성하고 "디자인 적용" 버튼을 누른 다음 [개발 화면]의 이미지를 참고하여 컨트롤을 재배치 합니다.

5.3) 컨트롤 배치
[개발 화면]과 같이 화면 구성과 컨트롤들을 배치합니다.
6. 기능 구현
6.1) 조회용 프로시저 실행 메서드 [Func_P_DEV001_xxx_Q]
private bool Func_P_DEV002_xxx_Q(string workType)
{
string groupCode = string.Empty;
string groupName = string.Empty;
string groupCategory = string.Empty;
if (workType.Equals("list"))
{
groupCode = txtGroup_code.Text;
groupName = txtGroup_name.Text;
groupCategory = cboGroup_category.EditValue?.ToString() ?? string.Empty;
}
else if (workType.Equals("detail"))
{
groupCode = gvwList.GetValue("group_code")?.ToString() ?? string.Empty;
}
try
{
P_DEV002_xxx_Q procInfo = new P_DEV002_xxx_Q();
procInfo.AddParamData(
workType,
groupCode,
groupName,
groupCategory);
ResultSet result = ExecuteProcedure(procInfo);
if (workType.Equals("list"))
{
SetData(grdList, result?[0]);
}
else if (workType.Equals("detail"))
{
SetData(grdDetail, result?[0]);
}
return result?.IsSuccess ?? false;
}
catch (Exception ex)
{
ShowErrorMessageBox(ex);
return false;
}
}6.2) 저장용 프로시저 실행 메서드 [Func_P_DEV001_xxx_S]
ParameterBuilder에 대한 자세한 내용은 [기능 문서]를 확인바랍니다.
private bool Func_P_DEV002_xxx_S(string workType)
{
if (!ValidateControls(grpMaster))
return false;
string groupCode = txtGroup_code1.Text;
string groupName = txtGroup_name1.Text;
int codeLength = Convert.ToInt32(numCode_length.Value);
string category = cboGroup_category1.EditValue?.ToString() ?? string.Empty;
string fieldCaption1 = txtField_caption1.Text;
string fieldCaption2 = txtField_caption2.Text;
string numCaption1 = txtNumref_caption1.Text;
string numCaption2 = txtNumref_caption2.Text;
string useYN = chkUse_yn.EditValue?.ToString() ?? string.Empty;
string memo = memoMemo.Text;
ParameterBuilder paramBuilder = new ParameterBuilder();
if (!workType.Equals("D"))
{
DataTable datas = BindingData(grdDetail);
if (datas == null)
return false;
foreach (DataRow row in datas.Rows)
{
paramBuilder.Append(row, "row_status");
paramBuilder.Append(row, "sub_code");
paramBuilder.Append(row, "code_name");
paramBuilder.Append(row, "system_yn");
paramBuilder.Append(row, "extra_field1");
paramBuilder.Append(row, "extra_field2");
paramBuilder.Append(row, "numref1");
paramBuilder.Append(row, "numref2");
paramBuilder.Append(row, "sort_seq");
paramBuilder.Append(row, "use_yn");
}
}
try
{
P_DEV002_xxx_S procInfo = new P_DEV002_xxx_S();
procInfo.AddParamData(
workType,
groupCode,
groupName,
codeLength,
category,
fieldCaption1,
fieldCaption2,
numCaption1,
numCaption2,
useYN,
memo,
SessionInfo.UserId,
$"{GetClientPCName()}/{GetIPAddress()}",
paramBuilder.GetParameter("row_status"),
paramBuilder.GetParameter("sub_code"),
paramBuilder.GetParameter("code_name"),
paramBuilder.GetParameter("system_yn"),
paramBuilder.GetParameter("extra_field1"),
paramBuilder.GetParameter("extra_field2"),
paramBuilder.GetParameter("numref1"),
paramBuilder.GetParameter("numref2"),
paramBuilder.GetParameter("sort_seq"),
paramBuilder.GetParameter("use_yn"));
ResultSet result = ExecuteProcedure(procInfo);
if (!workType.Equals("D"))
{
_FindRowValue = result?.ReturnString;
}
return result?.IsSuccess ?? false;
}
catch (Exception ex)
{
ShowErrorMessageBox(ex);
return false;
}
}6.3) 테이블의 기본 키에 대한 수정 제한 처리
테이블의 기본키인 [기본 정보] 영역에 '그룹 코드(
group_code)'는 신규로 등록하는 상태에서만 입력이 가능하도록 합니다.GridView를 통해 입력받는 '세부 코드(
sub_code)'는 GridColumn 속성을 통해 처리하는데, 필수로 값을 입력 받기 위해 AllowBlank 속성을 false로 설정하고, ColumnOperation 속성의 값을 ColumnLock으로 지정하여 새로 추가된 행(Row)일 때만 입력이 가능하도록 합니다.참고) GridColumn에 설정된 AllowBlank 속성에 대하여 값 입력 확인은 BindingData 메서드에서 수행합니다.

6.4) 조회 조건 영역의 초기화 버튼 기능
[GPM Tools→기본값 설정]에서 조회 조건 기본값 설정 정보를 등록하고 기능을 구현합니다.

6.5) 저장 시 작업 타입(workType) 판단 방법 수정 수정
workType) 판단 방법 수정 수정"그룹 코드" 컨트롤(
txtGroup_code1)의 ReadOnly 속성의 값이 true이면 수정 상태, false이면 신규 상태로 판단하여 신규 상태일 때"N"으로, 수정 상태일 때"U"로 전달합니다.
public override void ClickSaveButton()
{
if (Func_P_DEV002_xxx_S(txtGroup_code1.ReadOnly ? "U" : "N"))
{
ClickRetrieveButton();
}
}7. 체크 리스트
검색 / 신규→저장 / 수정→저장 / 삭제 기능이 올바르게 동작하는지 확인합니다.
그룹 코드는 신규 시에만 수정이 가능한지 확인합니다.
저장 시 [기본정보]영역에 필수 입력 항목 체크가 정확히 이루어지는지 확인합니다.
저장 시 [상세정보]영역에 필수 입력 항목 체크가 정확히 이루어지는지 확인합니다.
[요약정보]영역과 [상세정보]영역에 데이터 건 수 집계가 제대로 표현되는지 확인합니다.
이미 등록된 그룹 코드(group_code)와 동일한 코드를 신규로 등록했을때 설정한 SP메시지가 제대로 출력되는지 확인합니다.
이미 등록된 세부 코드(sub_code)와 동일한 코드를 신규로 등록했을때 설정한 SP메시지가 제대로 출력되는지 확인합니다.
이미 등록된 세부 코드(sub_code)에 대하여 수정이 되지 않도록 설정되었는지 확인합니다.
조회 조건 영역의 초기화 버튼 기능이 정상 동작하는지 확인합니다.
[요약정보]영역의 GridView의 행을 선택하고 Alt+F2 키를 눌러 등록 정보, 수정 정보가 정상 표현되는지 확인합니다.
Last updated
Was this helpful?