웹 개발/IBSheet8

[IBSheet] CASE WHEN 사용하기 (DB 데이터 이용해서 조건 체크할 때)

cha430 2025. 12. 17. 11:43

 

기능을 구현하다보면 이런 경우가 있다.

 

tbl_item_master : item_seq , item_name

tbl_set_items : mst_item_seq,  item_seq, item_name

 

item 테이블에는 품목 정보가 있고

set 테이블에는 품목들이 세트로 구성된 세트 품목 정보가 있다.

예를 들면 세트품1에는 품목1,품목2 데이터가 속하는 경우..

(mst_item_seq 컬럼 [tbl_item_master] 에는 세트품인 품목의 itemSeq 품목 시퀀스가 들어감)

 

화면에 아이템 정보를 출력하면서,

이 아이템이 세트품목인지 그냥 품목인지 체크박스에 표시를 한다고 할 때

 

set 테이블의 mst_item_seq [master테이블] 에   item_seq가 저장되어있는지 확인하면 된다.

이 품목 코드가 세트품 테이블에 master 코드로 저장되어있는지를 확인하는 것이다.

 

 

 

이때 세트인지 여부를 hasSetItems 에 담아 화면으로 보내고

SELECT
    item_name, item_seq, 
    CASE WHEN si.mst_item_seq IS NOT NULL THEN 1 ELSE 0 END AS hasSetItems, 
    CASE WHEN oi.item_seq IS NOT NULL THEN 1 ELSE 0 END AS isOrdered
FROM 테이블
WHERE 조건

 

 

컬럼명을 동일하게 연결해주면 된다.

{Header: "구성여부", Name: "hasSetItems", Type: "Bool", Align: "Center", NoChanged: true, CanEdit: 1, RelWidth: 2},

 

그럼 hasSetItems 가 1이면 (true) check박스에 표시가 되고

0이면 (false) 표시되지 않는다.

 

 

만약, alias 와 시트 컬럼명을 다르게 하는 경우

 

예를 들어 쿼리의 alias는 hasSetItems인데   시트 컬럼의 Name : "set" 인 경우라면

 

데이터를 조회해서 받는 이벤트에

(IBSheet의 경우 onReceiveData )

hasSetItems가 있으면 row.check 에 true 값을 담는다. 아니면 false !

 

 

아마 이건 IBSheet 가 자동으로 처리하는 것 같은데

Bool 타입인 컬럼은 check 가 됐냐 안됐냐로 인식하기 때문에

row.check 를 true 로 주면 체크표시가 된다.

 

근데 check 열이 두 개 이상인 경우엔 어떻게 구분하는지 모르겠네 ?

 

 

// 체크값, 발주여부 세팅
list.forEach(row => {
	row.check = !!row.hasSetItems;
	row.isOrdered = row.isOrdered === 1;
});

 

 

 

 

 

그리고 데이터 필터링(조회) 기능으로

데이터를 받는 IBSheet 이벤트에서 동일하게

 

const filtered = list.filter(row => {
    switch(itemCheck.value) {
        case 1: // ALL
            return true;
        case 2: // 존재하는 항목만
            return row.hasSetItems === 1;
        case 3: // 존재하지 않는 항목만
            return row.hasSetItems === 0;
        default:
            return true;
    }
});

 

템플릿

<v-select
    v-model="itemCheck"
    :items="optionsCheck"
    @update:modelValue="doSearchSheet1"
    item-title="text"
    item-value="value"
    :label="_t('page.setItems.setInclusion')"
    density="compact"
    variant="outlined"/>

 

v-select 필드에 itemCheck 를 v-model 로 해두면

데이터가 필터링되어 조회된다.

 

 

 

 

이건 이벤트 전체 코드

onReceiveData: (param) => {
    try {
        const raw = JSON.parse(param.data);
        const list = raw.data?.list || [];

        // 체크값, 발주여부 세팅
        list.forEach(row => {
            // row.check = !!row.hasSetItems;
            row.isOrdered = row.isOrdered === 1;
        });

        // itemCheck 필터링
        const filtered = list.filter(row => {
            switch(itemCheck.value) {
                case 1: // ALL
                    return true;
                case 2: // 존재하는 항목만
                    return row.hasSetItems === 1;
                case 3: // 존재하지 않는 항목만
                    return row.hasSetItems === 0;
                default:
                    return true;
            }
        });

        return {
            data: filtered
        };
    } catch (e) {
        consoleLog("onReceiveData JSON 파싱 오류:", e);
        return {
            data: []
        };
    }
}