퇴근5분전

- 12월 초 ~ 2월 말 까지  프로젝트를 직접 진행하며 개발까지의 과정을 담아본다.


11월 말쯤 부장님으로 부터 파견 제의가 들어왔다. 
Two Man Month Power 라는 계약이 되어 있어 2달간 프로젝트가 끝나든 안끝나든 철수하면 된다는 조건이었고
간단히 그룹웨어를 사용하는 일부 사용자들에 대해 보안형태의 제약을 걸어주면 되는 프로젝트였다.

 업무설명은 대략 듣고 들어갔지만, 실제적으로 들어가서 혼자 협의 해가면서 업무정의 및 개발을 하면 되는것이었는데 우려되는 문제가 있었으니 
 1. 기존 그룹웨어와 관련된 내용을 모르고 들어감.
 2. 문서도 없음. 
 3. 혼자 다해야 됨. 
 
 어릴적 축구를 워낙 좋아했고 늘 포지션에서는 온 운동장을 다 뛰어다닐정도로 좋아했지만... 기존 프레임웍에 대한 이해도 없이 플젝을 혼자 해야된다는 부담감이 있는 상황에 계약조건이 Power 라는 계약이므로 해도 그만 안해도 그만... 이라는 얘기만 듣고 갔는데.... 

 들어가서 초기 kcc내에서의 해야 될 내용을 들으면서 이런 저런 업무정의 및 일정을 잡아갔다. 
- 목표
   : 기왕 하는거 잘 하자.
   : 종이보다 문서를 작성하는 툴을 좀더 자유롭게 익히자!

- 사용툴 
   : 마인드맵( FreeMind ) : 업무정의하면서 구분별로 해야할 일들을 리스트화 하고 상세 내용들을 꼬리로 달아놓았는데 보기도 좋고 정의하기도 좋았음. 
   : 파워포인트 : 업무내용 관련해서 실제 코멘트 및 그림을 포함해서 그려가면서 수정을 반복 해서 20본 정도 수정한듯 함. 일단 글과 그림을 함께 둘수 있어 편하긴 한데... 이쁘게? 란는 압박이 ... 

 업무 협의를 하면서 대략적으로 어떤 흐름으로 이끌어 가면 되겠구나 하고 생각은 했으나, 정작 기존 프레임웍을 모르니 어떻게 합칠까? 라는게 고민이 되었는데... 본사들어와서 협의 하고 물어보고 해서 대략적으로 잡아갔음...

일정 
 - 12월 초 : 업무정의 
 - 12월 중 : 뷰어 관련 작업 
 - 12월 말 : 집중 코딩작업 ( 관리 페이지, 뷰어 페이지, 기존 페이지 수정 )
 - 1월 초 : 집중 코딩( 메일 수정 및 신규 프로세스 ) 
 - 1월 중 : 테스트 
 - 1월 말 : 테스트 
 - 2월 초 : 오픈예정

 12월 2주간 업무정의 및 구현 방법등 정리하면서 기존 프레임웍을 하나 하나 분석하다보니 훌쩍 시간이 갔고
드디어 뷰어가 설치되었고 관련 스크립트를 작성하였다.  이것도 뷰어가 3일 늦게 설치되고 소스 만들고 테스트 하는데 2일 정도 해먹고 거의 일주일 일정이 밀리기 시작했다. 워~~ 고생길이 점점 보이는데...? 

 작업들은 다음과 같이 진행되었다. 
 - 결과물을 예상하고 테스트 시나리오 간단히 정의 
 - 기존 페이지 중 작업페이지 선별 
 - 로직들 추가. 기존 로직들과 연계 시킴. 
 - 테스트

이중 가장 오래 걸린 작업은 기존 페이지들에서 로직들이 추가될 위치를 찾는 것이었다.
4줄 코딩하고 찾기를 30분씩 했으니.. 오래 찾은건 3시간도 찾았다. 

 하루 하루 퇴근시간이 늦어지면서 지치기 시작하지만 KCC에서는 그룹웨어만 아닌 가상화 도입으로 다른 업체들 일정까지 있으니 기간에 맞춰달라는 얘기를 하며 거의 맡겨놓고 가상화 관련 작업들에 몰두해 있었다. 

 그러던중 일이 터졌다! 그룹웨어에 결재가 12월말이어서 폭주? 했다고 할까나... Agent에 처리 성능에 뭔가 문제가 있어 난리가 났다. 전화벨소리, 여기저기 아우성 ... 정작 난 결재가 어떻게 도는지도 모르는 상황!! 이고 본사에서 Agent 작업문제로 본사에서도 대응한다고 밤새고 .....   이렇게 해서 내가 게으름 피울상황이 사라졌음을 느꼈다. 젠장~!!!

To be...


문제가 좀 있는 쿼리로.. 해결방법을 고민중...


부서 정보를 끌어올리고  사용자 정보를 모아서

부서별 직원정보를 만든 후

>>  각 직원별 자기 상급자들을 하나의 컬럼에 순서대로 나열하고자 만든 쿼리이나..

>> 중간 부서에 다수의 상급자가 존재 시 이하 부서직원들의 갯수가 뻥튀기 되는 현상이 CTE에서 발생하는데

이를 해결할 다른 방법은 없는 것일까???



declare @BaseDept table
(
 deptcode varchar(40 ),
 parentdeptcode varchar(40),
 deptname varchar(40)
)

insert into @BaseDept values( '000', null ,  '플랜트')
insert into @BaseDept values( 'a00', '000' , '공장1')
insert into @BaseDept values( 'b00', '000' , '공장2')
insert into @BaseDept values( 'c00', 'a00' , '검사')
insert into @BaseDept values( 'd00', 'a00' , '조립')
insert into @BaseDept values( 'e00', 'c00' , '수리')
insert into @BaseDept values( 'f00', 'b00' , '출하')

declare @BaseUser table
(
 userId varchar(40),
 deptcode varchar(40),
 userName varchar(100)
)

insert into @BaseUser values ( 'u01', '000' , '사장1' )
insert into @BaseUser values ( 'u02', 'a00' , '공장1장장' )
insert into @BaseUser values ( 'u03', 'b00' , '공장2장장' )
insert into @BaseUser values ( 'u04', 'c00' , '테스터' )
insert into @BaseUser values ( 'u05', 'd00' , '조립맨' )
insert into @BaseUser values ( 'u06', 'e00' , 'A/s맨' )
insert into @BaseUser values ( 'u07', 'f00' , '오라이' )
insert into @BaseUser values ( 'u08', 'a00' , '잉여' )

declare @ttt table ( userid varchar(40) )


;with dept( deptcode , parentdeptCode , deptname , lvl , sort )as

 select  deptcode , parentdeptCode , deptname , 0 , cast( deptcode as varbinary(900))
 from @BaseDept
 where deptcode = '000'
 union all
 select a.deptcode , a.parentdeptCode , a.deptname , lvl + 1 , cast( sort + cast( a.deptcode as binary(3) ) as varbinary(900))
 from @BaseDept a inner join dept b
 on a.parentdeptCode = b.deptcode
)
, [user]( userid , deptcode , userName )as

 select userid , deptcode , userName from @BaseUser
)

, dept_user( deptcode , parentdeptCode , deptname , lvl , sort,   userid , userName)as
(
 
 select a.deptcode , a.parentdeptCode , a.deptname , a.lvl , a.sort,   b.userid , b.userName
 from dept a left outer join [user] b on a.deptcode = b.deptcode
)
 
select  row_number() over( order by b.deptcode ),  replicate( '.------> ',  lvl ) + deptName [Tree] , b.deptcode , parentdeptCode , deptname , lvl , sort,   userid , userName, cnt, no
from  dept_user  b
left outer join
(
 select  row_number() over (order by deptcode, userid ) no,  deptcode , count( 1 ) cnt
 from  dept_user
 group by deptcode, userid
) c
on b.deptcode = c.deptcode
order by sort


--/* 각자의 상급자 컬럼을 추가 */
--
--,aboveDept_user ( [no], [no2], deptcode , parentdeptCode , deptname , ltl , srt ,   userid , userName , aboveuser  ) as
--(
-- select  cast( row_number() over( order by userid ) as int), 100,  deptcode , parentdeptCode , deptname , 0 , cast( deptcode as varbinary(900)) , userid ,  userName , cast( '/' + userName as varchar(3000))
-- from dept_user
-- where deptcode = '000'
-- union all
-- select  au.no , cast( row_number() over( order by du.userid ) as int) no2,  du.deptcode, du.parentdeptCode, du.deptname , ltl +1 , cast( srt + cast( du.deptcode as binary(3) ) as varbinary(900)) ,   du.userid , du.userName, cast( aboveuser + '/' + du.username as varchar( 3000 ))
-- from dept_user du inner join aboveDept_user au
-- on  du.parentdeptcode = au.deptcode
--)
--
--select replicate( '.------>',  ltl ) + deptName [Tree] , *
--from aboveDept_user ms
--inner join
--(
-- select deptcode, max( isnull( case when no = 1 then  userid+'('+ username+')' else '' end  , '') ) +  max( isnull( case when no = 2 then  userid+'('+ username+')' else '' end  , '') ) as [desc]
-- from aboveDept_user
-- group by deptcode 
--) sl
--on ms.deptcode = sl.deptcode
----order by srt;


옛날 꼰날... 작업하던중

XML을 통째로 DataTable에 쿼리 하려고 했던적이 있었는데...

잊어버렸다가... 지금 하는 일에 다시 적용해야 될 사항이 생겨서 찾아서 예제로 남김.

어려운거 없다...

-- 예제 결과



-- XML 데이타

<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <INFO>
    <SEQ>1</SEQ>
    <OLDNM>a군</OLDNM>
    <NEWNM />
  </INFO>
  <INFO>
    <SEQ>2</SEQ>
    <OLDNM>b군</OLDNM>
    <NEWNM />
  </INFO>
  <INFO>
    <SEQ>3</SEQ>
    <OLDNM>c군</OLDNM>
    <NEWNM />
  </INFO>
</ROOT>




-- 예제 소스
DECLARE @INFO TABLE
(
    SEQ  VARCHAR(100),
    NM  VARCHAR(100)
)

 

INSERT INTO @INFO VALUES ('1', 'a군' )
INSERT INTO @INFO VALUES ('2', 'b군' )
INSERT INTO @INFO VALUES ('3', 'c군' )

SELECT SEQ, NM as OLDNM, '' [NEWNM] FROM @INFO


DECLARE @XML XML

SET @XML = REPLACE( (SELECT SEQ, NM as OLDNM, '' [NEWNM] FROM @INFO  FOR XML PATH('INFO'), ROOT ('ROOT')) , '<ROOT>' , '<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >')

SELECT @XML AS [XML]

declare @RegistXML XML
set @RegistXML = '
<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <INFO>
    <SEQ>1</SEQ>
    <OLDNM>a군</OLDNM>
    <NEWNM>x군</NEWNM>
  </INFO>
  <INFO>
    <SEQ>2</SEQ>
    <OLDNM>b군</OLDNM>
    <NEWNM>b군</NEWNM>
  </INFO>
  <INFO>
    <SEQ>3</SEQ>
    <OLDNM>c군</OLDNM>
    <NEWNM></NEWNM>
  </INFO>
</ROOT>'

SELECT
 M.Item.query('./SEQ').value('.','VARCHAR(100)') SEQ,
 M.Item.query('./OLDNM').value('.','VARCHAR(100)') [OLDNM],
 M.Item.query('./NEWNM').value('.','VARCHAR(100)') [NEWNM]
FROM @RegistXML.nodes('/ROOT/INFO') AS M(ITEM)

UPDATE @INFO
SET NM = T.[NEWNM]
FROM  (
  SELECT
   M.Item.query('./SEQ').value('.','VARCHAR(100)') SEQ,
   M.Item.query('./OLDNM').value('.','VARCHAR(100)') [OLDNM],
   M.Item.query('./NEWNM').value('.','VARCHAR(100)') [NEWNM]
  FROM @RegistXML.nodes('/ROOT/INFO') AS M(ITEM)
) T
INNER JOIN @INFO B
ON T.SEQ = B.SEQ and T.[NEWNM] <> ''

SELECT * FROM @INFO

/* XML을TABLE로*/
 
--SELECT * FROM TB_BASE_USER
--WHERE USER_NM LIKE 'KCC%'

반대로 table을 다시 xml로 바꿀때

declare @xxx xml = '<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">' + ( SELECT * FROM @INFO FOR XML PATH ('INFO') ) + '</ROOT>'
 
select @xxx