! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

세로(row)를 가로로 출력하기(동적 컬럼 생성하기) > 지식 쉐어링

본문 바로가기

Spread.NET

지식 쉐어링

개발꿀팁 세로(row)를 가로로 출력하기(동적 컬럼 생성하기)

페이지 정보

작성자 하늘을날자 작성일 2021-02-15 09:36 조회 2,695회 댓글 0건

본문

안녕하세요? 대한민국의 워라벨을 책임지고 계시는 프로그래머 분들,

항상 존경합니다. 밤샘도 마다하지 않고 애쓰시는 분들! 최고이십니다.


전산정보처리 분야에서 세월은 흘러 어느덧 28년이 흘렀습니다.  

30년이 채워지면 뭔가 이벤트를 하나 해 볼까 합니다.(하하하)

Cobol과 Clipper를 지나 닷넷과 Java/Kotlin까지... 많은 것들이 변했고 변하고 있습니다.

전 졸업작품을 코볼로 만들었습니다. 이 코드가 아쉽게도 남아있지가 않네요.(RM-COBOL 85?)

286컴퓨터에서 코딩을 했습니다. 286을 100만원 넘게 주고 샀었죠.ㅠㅠ


  요즘은 전산학을 전공한 전공자와 비전공자의 벽이 허물어 진 것 같습니다.(누구나 쉽게 접근할 수 있죠)

오히려 비전공자가 더 두각을 나타낼 때도 있는 것 같습니다.(제 생각입니다. 업무를 잘 아시니까요)

단지 전산학에 대한 기본기가 좀 부족한거 빼고요.


보통  레코드는 세로 구조로  많이 출력을 합니다.

때로는 가로로 출력해야 할 경우가 생깁니다.


DB마다 심플한 함수를 지원하고 안하고의 차이도 있겠지만 

저는  SQLite 기반에서 만들어 보겠습니다.

a769cc0c561b17883affd65392df1cc5_1613430150_972.PNG
 

[사전 준비사항]

1) 닷넷프레임워크: 4.5.2

2) 스프레드 닷넷 

3) 데이터베이스:  SQLite

4) 필수 어셈블리: System.Data.Sqlite 1.0.113.0


[세로 구조를 가로로 출력하기]

주문번호별 송장번호가 몇 개일지 모르니 컬럼 생성은 동적으로 생성해야겠습니다.

(분석해 보니 수량 1개당 송장번호 1개가 만들어집니다)

68fb3398fbb9baa72e5c6cfcfde36c88_1613357961_8378.PNG
 

저는  SQLite도 가로 출력이 가능하냐는 의문에서 출발합니다.  데이터베이스를 활용할 계획입니다.

가로 출력이 필요할 때가 생겼습니다. 온라인 커뮤니티에 올라온 간절한 질문이 있었습니다.

맘이 약해서 그냥 지나치지 못하고 어떻게 만들까 고민하기 시작했습니다.


Spread.NET의 기본 기능을 대부분 활용 할겁니다. 

코딩 없이(또는 최소한 코딩으로) 할 수 있는 게 정말 많거든요.


2개의 파일을 Load해서 기준 테이블 기준으로 송장 번호를 추출하는 유틸리티입니다.

(PO번호=주문번호 ==> 키 값)

사용자는 이 작업을 수작업으로 하면서 밤샘을 했다고 하네요. 생각만 해도 끔찍합니다.

쇼핑몰 관리자이신 것으로 추측됩니다.


프로그래머가 해야 할 일은 바로 여기에 있는 거죠. 프로그래머란 직업에 애착이 가는 이유입니다.

(덕분에 야근이나 밤샘하지 않고 정상 퇴근합니다.!!) 이런 말 들으면 정말 뿌듯하죠.


최대한 신속하게 만들어 무료로 드렸습니다.(사실 쿼리만 만들면 나머지는 다 되어 있으니..ㅎㅎㅎ)

스프레드의 생산성을 재확인하는 시간이었습니다. 

사실 요구사항 (데이터)분석이 어렵지 코딩은 어떻게든 다 처리하잖아요.

(데이터 분석 시간: 80%, 코딩하는 데 20%  이 정도 맞지요?)


그림1에서 보이시나요? 테스트 한다고 송장번호를 20개까지 보이게 세팅했습니다.(현재는 컬럼 수 고정)

처음 생각에서 계속 업데이트되는 과정도 보여드리겠습니다.


처음에는 SQLit 함수가 있는지 몰랐으니 그 함수를 직접 구현하려고 했습니다.

데이터베이스 구조를 동적으로 변경하면서 하면 되지 않느냐?하고 그렇게 로직을 잡았습니다.

계속해서 Alter Table? 이건 뭔가 아닌 것 같은데.....ㅠㅠㅠ


하지만 또 다른 방법도 고민하던 차에... 

row number를 생성하는 함수가 필요했습니다.모르면 손발이 고생이긴 하지만 그 원리를 알기 위해서는 직접 만들어 보는 고생(?)도 필요하긴 합니다.


[그림1]

68fb3398fbb9baa72e5c6cfcfde36c88_1613349178_6372.PNG
 

기준 테이블의 데이터는 전부 나와야 하기에 외부조인을 했습니다.

작업 순서는 간단합니다. 스프레드가 도와주니 금방 끝났습니다.

1) 기준 테이블 로드(전 OLEDB 사용)

 임시 테이블에 저장

2) 참조 테이블 로드(역시 OLEDB 사용)

 임시 테이블에 저장

3) 2개의 테이블을 외부조인하여 결과 출력

 나머지는 스프레드 설정으로 끝입니다.


좀 더, 자세하게 알려 드리겠습니다.


[데이터베이스 구조 예시]

전 2개의 테이블을 만들었습니다. 


CREATE TABLE "BaseTbl" (

"poNo" TEXT,

"qty" INTEGER

)


CREATE TABLE "LookupTbl" (

"poNo" TEXT,

"invoiceNo" TEXT,

"iid" INTEGER

)


iid 필드는   row number를 저장할 필드입니다.


핵심 쿼리는 1개입니다.  

DB 에서 제공하는 기본 함수를 사용하는 것이죠.


[참조 테이블 출력]

string sql = "Select ROW_NUMBER() OVER (";

sql += "PARTITION BY poNo ORDER BY poNo) No, poNo,invoiceNo from LookupTbl";


68fb3398fbb9baa72e5c6cfcfde36c88_1613359928_8709.PNG
 

파워풀한 쿼리네요. 이 쿼리의 기능은 그룹별 row 번호를 생성하는 것입니다.

사실 전 저 함수를 몰라서 순환문으로 메서드를 먼저 만들었습니다.ㅠㅠㅠ


이제 마지막으로 컬럼을 생성해야 겠네요. 더 좋은 쿼리도 있겠지만 전 이렇게 만들었어요.

MAX(CASE WHEN a.poNo=b.poNo and b.iid=1 THEN b.invoiceNo END) AS INVOICE1

동적 생성이 충분히 가능하겠습니다. 조건문과 순환문을 사용해서요.


[쿼리 실행 결과]

68fb3398fbb9baa72e5c6cfcfde36c88_1613359840_1323.PNG
 

[컬럼헤더 정리 후]

상품 최대 수량(송장 수량)이 최대 10이라 10개의 송장번호 컬럼 10개가 생성되었습니다.

68fb3398fbb9baa72e5c6cfcfde36c88_1613362299_4332.PNG
 

 이 방법의 장점은 데이터베이스 구조 변경이 없다는 것입니다.

스프레드가 지원하는 컬럼 수 만큼 생성이 가능하겠습니다.

(제가 알기로 20억개 까지 컬럼 생성이 가능하다고 알고 있습니다)


마지막으로 해야 할 일이 하나 더 있습니다.

스프레드의 컬럼헤더 구성입니다. 이 또한 동적으로 바뀌어야 합니다.

간단합니다. 상품 주문 수량의 최댓값을 구해서 순환문으로 돌리면 됩니다.

[코드 예시]

for (int i = 1; i <= colCnt; i++) {

sv.ColumnHeader.Cells[0, i + 1].Text = "송장번호 "+ i +"";               

}

완성하였습니다. 

엑셀 저장, PDF 저장은 코딩이 필요 없죠. 생각할 것도 없어요.

보너스로 그냥 기능을 달아 줍니다.


오늘은 세로 구조를 가로 출력 방법 하나를 알아 보았습니다.

세로 출력이 아닌 가로 출력이 필요할 때 참고해 보십시오.


더 최적화 된 방법을 완성하여 하나의 관용구로 만들어 놓으면 좋을 것 같습니다.

즐프 되세요^^

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.