퇴근5분전

+ CTE도 정렬 마쳤다.

+ declare 문

+ while

+ exec

+ Merge

+ pivot

 

 기타 버그.

 

디테일이 조금 떨어지는? 공백이 어쩌다 원하지 않은 공간에 들어간다.

 

Merge 구문을 ..? 할까 말까 고민된다...  필요한 구문인가 싶어서...

 

 

UI 작업을 시작해야지!!

 

 + 추가 기능

 - 주석문 템플릿

 - 쿼리 백업기능

 

 

라인수를 보니 3500 라인을 쳤네...  타수도 느린데 많이도 쳤네.

 

 

음  sql formatter 소스...

https://github.com/TaoK/PoorMansTSqlFormatter

 

검색해서 소스를 열어봤는데... 잠깐 봤지만 완전 다른 세상의 코드...

 

어떻게 소스를 처음 생각할때 코드를 저렇게 만들까? 영어가 가능하니까 그럴까???

 

외국에 소스코드를 볼때마다 뭔가 내 코드는 아쉬운점이 있다.

 

 

 

오전에 투표하고 와서 계속 디버깅을 하며 1차 작업을 완성했다.

 

미진한 부분은 다양한 쿼리를 직접 돌려보면서 테스트하면서 디버깅을 하면 될 것 같다.

 

-- sql은 웹사이트에 긁어온 쿼리를 정렬해본것.

 

-- 간단 간단한 쿼리들 해봤고.

 

http://www.dpriver.com/pp/sqlformat.htm  이 포맷터의 예문으로 테스트 해봤는데 조금 손델곳이 보임.

 

이 포맷터의 C#버젼이 지금 내 프로그램 양식과 많이 흡사하네...

 

 

## 내 프로그램 추가 할 내용은 컬럼에 주석 자동으로 넣어주기!!!

 

SP 2개를 작성해서 테이블에 대한 CRUD 프로시져를 통째로 만들어내는 걸 이미 만들어놓았으니...

 

이번주엔 일하면서 버그 찾아야지...

 

+ While 조건문

   begin

         ...

   end

 

+ declare @tb table

   (

         ...

   )

 

 

 

 

 

 드디어!!! 드디어 case문에 대하 정렬 방법을 제대로 찾았다. 아싸!

 

괄호 ( ), begin ~ end, case ~ end

 

바로 전 버젼도 case문을 여러개 겹쳐놓으면 제대로 위치 못찾고 해맸는데... 해결이 되었다.

 

앞에서 계속 칸수 계산했었는데... 퇴근전에 떠오른 아이디어가 해결해줬다.

 

툴 개발은 이제 뭐... 다른건 칸수 맞춰서 띄워주고 newline 넣는 것만 남았다.

 

굿... 굿... 낼 투표하고 와서 수정하면 이번주에 끝날 수 도 있겠는데...

 

 

# CASE ~ END와 괄호'(', ')'를 테스트 한 결과

 

 

case문에 막 끼워넣는 것.. 위치 잘 잡고.. 내가 원하는 포맷대로 맞춰졌다.

 

 

 

 지난 번에 만든 프로그램으론 1개의 쿼리뿐이 정렬을 못시키니... 사용하면서 1년 동안 sp를 직접 작업하지 않으니 크게 쓸일도 없었지만,

 

지금은 시간도 좀 여유롭고 해서 자격증이나 딸까, 프로그램을 만들까 하다가... 마음 가는데로 하다보니 프로그램을 다시 만들게 되었다.

 

처음엔 지난번에 만든 프로그램을 수정하는 것으로 시작했으나... 역시나, 지난번 프로그램 소스가 워낙 복잡하고 고정된 양식에 추가될때마다

 

하드코딩으로 예외처리를 해놓은 터라, 조금만 손대도 다른데서 터지거나 꼬여서 안돌아가서 다시 설계하여 만들기 시작했다.

 

 이틀정도 출퇴근 지하철에서 수첩에 열심히 그려서 코딩한게 성공할 것 같은 느낌이 든다.

 

여러 쿼리들을 돌려봤는데 우선 변환에 필요한 기초 자료 구성까지 원하는데로 만들어져 간다. 

 

제일 처리하기 힘들었던 case문도 쉽게 잡혔고, 코드가 보기 좋아져서 오류 잡기도 쉬워졌다.

 

 해결방법에 대한 걸 써놓을까 한다.

 

 1. 우선 이전버전 처럼 각 요소들을 모두 분리한다.

    - 1개의 단어는 1개의 요소가 된다.

    - 주석은 주석으로 묶어서 1개의 요소로 만든다.

    - 문자열은 '로 시작해서 ' 끝나는 지점을 찾아서 묶는데 중간에 '' 인것은 패스해서 마지막 ' 을 찾아 1개의 문자열 요소로 만든다.

    - 연산자도 1개의 요소가 되는데 이때 주석문에 사용되는 /, * - 는 각각 다음 또는 이전 조합에 따라서 주석문으로 판단되면 건너띈다.

 

 2. 요소들이 모두 분해가 되면 리스트로 묶어서 줄세우는데, 이때 리스트의 특정 요소들은 하위 요소목록을 가질수 있게 된다. ( 컴포짓트 패턴 )

 

 3. 요소들 줄세우기가 끝났으면 위에서부터 순차적으로 접근하여 각각 경로값을 만들어준다.

  ex)   

    select 1 from tb

--줄세우면..

  select

  1

  from

  tb

-- 여기에 각 요소의 경로값은

  select         select

  1               select.Column : 1

  from          from

  tb             from.Table : tb

 

 4. 정해놓은 규칙에 따라 정렬 시켜가면 된다. ( 지하철에서 스치듯 떠오른 아이디어를 활용한다. )

 

이제 3번을 진행중이다. 여러 쿼리로 경로값들을 확인해야 하므로... 좀더 타이핑을 해야 된다.

800라인 정도 쳤는데.. 기존 소스는 두페이지 인데 한페이지는 2500라인 정도에 또 한페이지도 900라인 정도.. 많이도 쳤네.

 

주말에 완성할것 같다. ^^;;

 

쿼리가 정렬되면 마음에 평화가 올려나???

 

 

 

 

 # 디자인은 어렵다 ㅡ.,ㅡ;;

 # 이틀내내 아이콘 찾아넣고 색 바꾸고 위치바꿨는데... 고급지게는 안보이네...

 

 # 내가 만들어보고 싶었던 프로그램은 화면설계를 PL이나 PM이 했을때 개발자가 정보를 쉽게 얻을 수 있었으면 했다.

또한 개발자의 개발 능력은 워낙 다양(?)하기 때문에 이에 대해 회사내에 개발프레임웍이 존재하더라고 그 사양에 맞춰

개발하는 개발자는 많지 않았다. SI는 만들기 바쁘니까. 흐흣! 나역시 그랬으니까.

 개발하는 시간이 항상 쫒기다보니 소스를 일일이 치는 것보다는 만들어내는 것이 좋겠다 싶었고, 다른 폼에서 가져다

쓰면 변수들이 섞이는 경우가 있어서 그것도 싫었다.

 그래서 만든 디자이너가 몇번씩이나 업그레이드되고 새로 다시 만들며 만들었네... 대략,,, 뭐, 그래도 혼자 쓸꺼다.

 

 - 왼쪽 메뉴를 편집해서 프로젝트의 메뉴들을 모두 등록가능하다.

 - 우측 디자인버튼을 클릭하면 아래 그림처럼 디자이너가 뜬다.

 - 디자인을 마치고 저장하면 디자인된 화면을 보여주고, 상세내역 처럼 1,2 ... 등 화면에 설명을 넣을수 있다.

 - Link를 클릭하면 위 버튼중 action에클릭시 다른 메뉴화면으로 바로 이동이 가능하다.  

 

 - 아래 디자이너이다.

 - 화면을 그리는데 필요한 컨트롤들도 있고, 컨트롤들 조합으로 템플릿을 지원한다.

   : 응용프로그램을 많이 검색해봤는데, 조합으로 충분히 만들수 있을 것 같더라.

 

 

 


화면정의 관리 프로그램으로 화면정의서 같은 문서 대용으로 만들었다.


메뉴는 쉽게 편집 관리할 수 있도록 마일스톤 뷰 만들때 사용했던 방법을 썼다.

#그룹1

###전표조회

###메뉴2

#그룹2

##그룹2-1

###메뉴3

을 으로 편집하면 좌측 메뉴 트리가 구성된다.


디자인 버튼 클릭하면 Mockup 프로그램이 떠서 디자인을 할 수 있다.  

물론 Mockup 프로그램으로 만들었으니 소스변환도 된다.


그리고 상세 내역에 번호를 지정해서 화면내 특이사항등 체크할 내역등등 기록해줄수 있다.

메뉴별로 번호라벨의 위치값들을 기억해서 읽어들일때 다시 읽어준다.



 

음 ERD 라고 첨 만들었는데... 굳이 다이어그램으로 표시되지 않기때문에... ERV 라고 바꿨다.

 

 

 전에 만들까 하다가...

 

이번에 뭔가 생각난게 있어서 프로세스를 만들다가 테스트 삼아 만들어봤다.

둘다 비슷한 프로세스니까 우선 만든거지만...

 

금요일 저녁부터 일요일... 지금까지 코딩해서 겨우 만들었는데.. 우선 좀 디자인이나 코드 정리해서 DB랑 붙여서 땡겨봐야지...

 

테이블에 컬럼을 추가하기 위해서 메타를 먼저 등록하고, 메타를 드랍!

다른 테이블에 연결된 컬럼과 연결( FK )해야 할때는 테이블을 드랍!

 

PK 설정할때는 컬럼을 더블클릭 하면 색이 바뀐다.

 

테이블 설정이 끝나면 추가적으로 여러 쿼리를 만들어내는 일을 추가하면 되는데... 버튼은 나중에 붙이자.

 

 

 

조회 조건이 바뀔때 조회를 버튼클릭없이 자동으로 하도록 하는 처리임.

 

이때 조회 조건이 일정 시간내에 다른 항목이 변경시 다시 조회대기시간을 늘려서 바로 조회가 일어나지 않도록 한다.

 

## 조회 항목이 변경될때마다 DelayQuery(); 호출해주면서 조회 대기시간이 초기화 되도록 처리함.

한번 호출되면 일정시간을 대기한 후 입력이 없으면 조회를 실행한다.


###################################   지연 쿼리 ########################
 #region 지연 쿼리호출

        bool isDelayRun = false;
        DateTime triggerTime = DateTime.MaxValue;
 
        void DelayCheckFunction()
        {
            while (isDelayRun)
            {
                var Span = DateTime.Now - triggerTime;
                if (Span.Seconds >= 1)
                {
                    Action query = 조회_메서드명;
                    Dispatcher.BeginInvoke(query, System.Windows.Threading.DispatcherPriority.Render, null);
                    isDelayRun = false;
                }
                System.Threading.Thread.Sleep(100);
            }
        }
        void DelayQuery()
        {
            triggerTime = DateTime.Now;
            if (isDelayRun == false)
            {
                isDelayRun = true;
                Action chkAction = DelayCheckFunction;
                chkAction.BeginInvoke(null, chkAction);
            }
        }
        #endregion

 

크리스탈 리포트에서 필드에 고정된 폰트를 글자수에 맞춰 폰트사이즈를 줄여 꽉 차도록 만드는 소스!

 

## 크리스탈 리포트 TextBoxObject 의 꽉 채우기 : 글자수에 따라 FontSize조정하는 방법

-- 바인딩 될 데이타 중 FontSize조정 할 대상 목록을 만듬.
Dictionary<string, string> KeyValues = new Dictionary<string, string>();

 

-- 데이타 바인딩
                        KeyValues.Add("{필드오브젝트ID}", "{필드오브젝트에 바인딩 될 때의 값}" );
                        ...

 

-- 로드 이벤트!
        bool IsContentLoaded = false;
        void Form_Loaded(object sender, RoutedEventArgs e)
        {
            if (IsContentLoaded == false)
            {
                if (CrystalReportViewer1.Created)
                {
                    IsContentLoaded = true;
                    foreach (var tar in KeyValues)
                    {
                        var fieldObject = crRpt.ReportDefinition.ReportObjects[tar.Key];
                        var field = ((CrystalDecisions.CrystalReports.Engine.FieldObject)(fieldObject));
                        Font font = CalcFont(tar.Value, field.Width, field.Font);
                        field.ApplyFont(font);
                    }

                    CrystalReportViewer1.Refresh();
                }
            }
        }


-- 폰트사이즈 조정.

       private Font CalcFont(string txt, double limitTwipsWidth, Font font)
        {
            const double TwipsPerInch = 1440d;

            // todo : 박스안에 들어갈 폰트사이즈 구하기
            // Font.Size 에서 8pt까지 줄여가면서 계산.
            // 1 inch = 1440 twip
            // 1 cm   =  567 twip
            Font newFont = font;
         
            using (var g = CrystalReportViewer1.CreateGraphics())
            {
                //http://stackoverflow.com/questions/1918877/how-can-i-get-the-dpi-in-wpf
                //http://stackoverflow.com/questions/4044397/how-do-i-convert-twips-to-pixels-in-net
                int limitWidth = (int)((limitTwipsWidth / TwipsPerInch) * (g.DpiX));

                for (float size = font.Size; size >= 3f; )
                {
                    SizeF szf = g.MeasureString(txt, newFont);

                    if (szf.Width <= limitWidth)
                    {
                        break;
                    }
                    newFont = new Font(newFont.FontFamily, size, System.Drawing.FontStyle.Bold);
                    size -= 0.1f;
                }
            }

            return newFont;
        }
        

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

Flow 상세내용 입력하기...  (0) 2018.05.01
지연자동 조회 처리  (0) 2016.03.10
Excel 만들기, 엑셀 닫기  (0) 2016.02.17
변환] Unicode <--> 한글  (0) 2013.10.24
ppt 처럼 썸네일과 본화면이 있는 컨트롤!  (0) 2013.09.26

WPF 의 WindowsFormHost 로 Winform Control을 올렸을때

ScrollViewer를 추가하였을때 스크롤이 발생하면 호스팅되는 컨트롤이 WPF컨트롤을 덮어버리는 현상...

 

  찾다보니 안재우님 블로그에서 발견한 http://www.rsdn.ru/forum/dotnet.gui/3740163.1.aspx 

 이건 몇년전 프로젝트에서 적용해서 잘 사용하였다.

 

 그러나 이번 Windows 10 업그레이드를 하면서 위 화면이 깨진다.

DPI 96 ( 100% ) 일때는 괜찮지만 125% 일때 깨지는데...!!!!

 

이걸 이번에 내 노트북을 업그레이드 해서 디버깅해서 잡았다.

 

쉽지 않은데... 이거 골때리게 잡았음!!

 

버그인듯함.