Epplus 관련정보를 정리해본다.
이번에 친구 프로그램 만들면서 epplus로 여러 시트를 만들어야 했었다.
그래서 하나 만든게 있다. 엑셀의 특정 시트를 지정해서 읽어서 epplus 구문으로 똑같이 생성하는 코드를 만들어주 주는 소스다.
워낙 셀도 많고, 수식도 많이 걸려있고... 그걸 하나 하나 치려니 너무 빡시니까...
단, 챠트, 이미지, 등등 객체정보는 대상으로 하지 않았다. 작업 대상 시트엔 없는 내용이었으니...
250라인정도 되넹...
#파일 오픈.
using (ExcelPackage package = new ExcelPackage(newTempFile, true))
#엑셀에 따로 정의된 스타일 정보. ( xml로 따로 빼서 생성시 넣어주면 스타일 정보가 똑같이 뜬다. )
string xml = package.Workbook.StylesXml.OuterXml;
# 시트 탭 컬러
@"sheet.TabColor = Color.FromArgb({0}, {1}, {2});",
#셀 배경색 넣을때 먼저 지정! ( 없으면 배경색 넣을때 에러! )
@"sheet.Cells[""{0}""].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.{1};"
#셀 배경색
@"sheet.Cells[""{0}""].Style.Fill.BackgroundColor.SetColor(ColorTranslator.FromHtml(""#{1}""));"
#폰트
@"sheet.Cells[""{0}""].Style.Font.SetFromFont( new Font(""{1}"", {2}f, FontStyle.{3}));"
#폰트색
@"sheet.Cells[""{0}""].Style.Font.Color.SetColor(ColorTranslator.FromHtml(""#{1}""));"
#수식
@"sheet.Cells[""{0}""].Formula = ""{1}"";"
#값
@"sheet.Cells[""{0}""].Value = {1};"
#리치텍스트 ( 셀 안에 컨텐츠에 별도 서식을 지정했을때 value대신 쓴다. )
@"var excelRich{1} = sheet.Cells[""{0}""].RichText.Add(@""{2}"");"
@"excelRich{0}.FontName = ""{1}"";"
@"excelRich{0}.Color = Color.FromArgb({1});"
@"excelRich{0}.Size = {1};"
@"excelRich{0}.Bold = {1};"
@"excelRich{0}.UnderLine = {1};"
@"sheet.Cells[""{0}""].IsRichText = true;"
#숫자포맷 ( 이게 좀 거지 같다. 날짜로 된 컬럼이 숫자로 넘어온다. 다른 숫자와 구분이 안되어 직접 핸들링 해야 함. )
@"sheet.Cells[""{0}""].Style.Numberformat.Format = @""{1}"";"
#셀 병합
@"sheet.Cells[""{0}""].Merge = {1};"
#외곽선 ( 이것도.. 대부분 비슷하게 가져오는데 다른 경우는 만들어진 시트 보면서 직접 변경해줘야 한다. )
@"sheet.Cells[""{0}""].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.{1};"
@"sheet.Cells[""{0}""].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.{1};"
@"sheet.Cells[""{0}""].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.{1};"
@"sheet.Cells[""{0}""].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.{1};"
#셀 가로, 세로 정렬 ( 이것도 다르게 가져오기도 한다. )
@"sheet.Cells[""{0}""].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.{1};"
@"sheet.Cells[""{0}""].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.{1};",
#컨텐츠가 셀 넘어가지 않게 처리 할때. (=true)
@"sheet.Cells[""{0}""].Style.WrapText = {1};"
#컬럼정보
@"sheet.Column({0}).BestFit = {1};"
@"sheet.Column({0}).Collapsed = {1};"
@"sheet.Column({0}).Width = {1}d;"
@"sheet.Column({0}).Hidden = {1};"
#행정보
@"sheet.Row({0}).CustomHeight = {1};"
@"sheet.Row({0}).Collapsed = {1};"
@"sheet.Row({0}).Height = {1}d;"
@"sheet.Row({0}).Hidden = {1};"
#페이지프린트영역
@"sheet.PrinterSettings.PrintArea = sheet.Cells[""{0}""];"
#정렬인데.. ( 에러날때가 있어..try{}catch{}로 묶어서 사용 )
@"sheet.PrinterSettings.Orientation = eOrientation.{0};"
#페이지정보(기타)
@"sheet.PrinterSettings.PageOrder = ePageOrder.{0};"
@"sheet.PrinterSettings.PaperSize = ePaperSize.{0};"
@"sheet.PrinterSettings.FitToPage = {0};"
@"sheet.PrinterSettings.FooterMargin = {0}m;"
@"sheet.PrinterSettings.HeaderMargin = {0}m;"
@"sheet.PrinterSettings.LeftMargin = {0}m;"
@"sheet.PrinterSettings.TopMargin = {0}m;"
@"sheet.PrinterSettings.RightMargin = {0}m;"
@"sheet.PrinterSettings.BottomMargin = {0}m;"
#페이지레이아웃보기
@"sheet.View.PageBreakView = true;"
#확대비율
@"sheet.View.ZoomScale = {0};"
위 정보를 조합으로 소스를 만들면 휘리릭... 1초만에 소스코드를 얻고 바로 시트작업을 할 수 가 있다.
epplus는 왜? 저장하고 나서 열면...
아무것도 안하고 닫는데, "저장하시겠습니까?" 가 뜰까?
저장을 한건데... 왜? 못찾겠다.
## 중요..
Cell 병합관련해서 삽질을 하던 중...
Merge 되는 셀 정보값은 시작되는 셀에만 값을 넣어야 된다.
Sheent.Cells[ 시작되는 셀 ].Value = 값 또는 .Formula = 수식
시작되는 셀이 아니고 병합되는 전체 셀을 모두 지정하면 각 셀에 모두 값을 넣게 되고
이 병합된 셀들을 다른 셀에서 수식으로 연계 할 경우 값이 원하는 값이 나오지 않게 된다.
string.Format( @"sheet.Cells[ ""{0}"" ].Value = {1};", cell.Start.Address, 100 );
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
VsPackage ] 개발 방법! (0) | 2017.01.18 |
---|---|
하루 중 근무시간 9 - 6 와 시간외 근무시간 구하기. (0) | 2016.11.09 |
친구에게 만들어준 프로그램! 작업자 이력관리. (0) | 2016.11.08 |
Sqler 에 올라온 질문 글... (0) | 2016.10.21 |
비동기 처리...를 간단히!!! (0) | 2016.10.18 |
친구에게 만들어준 프로그램! 작업자 이력관리.
친구가 필요하다는 프로그램을 만들었다.
프로그램은 매우 단순하다. 프로젝트별로 작업자의 일일 작업시간을 관리하는 프로그램!
등록화면은 찍을 수 없고... 몇가지 작업화면만 찍었다.
DB없이 파일로 관리한다.
간만에 DataGridView를 이용해서 만들었다. ( 라이센스 있는 컨트롤들을 사용할수 없으니... 순수 컨트롤들을 재정의해서 만들어 사용했다. )
<메인화면 >
<상세화면>
<일별작업시간 기록화면>
저 일별 시간체크할때 저녁시간 빼고 구하는데 애먹었다. 3시간 날려먹었음..
이렇게 저장된 데이타들은 한번에 엑셀로 떨어진다.
많은 수식을 담고 떨어지니까 epplus를 사용해서 엑셀을 생성하였다. ( 시트는 찍어 올릴수 없으니... )
epplus에 세로쓰기 << 프로퍼티는 끝내 찾지 못했다.
추가요청사항이 있어서 모두 수정을 끝냈다.
epplus로 새 파일을 생성하고 저장! 했는데??? 왜???? 파일을 열고 아무것도 안하고 닫는데 "저장하시겠습니까?" 가 뜰까??? 썩을... 못찾겠따.
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
하루 중 근무시간 9 - 6 와 시간외 근무시간 구하기. (0) | 2016.11.09 |
---|---|
Epplus 관련정보를 정리해본다. (0) | 2016.11.09 |
Sqler 에 올라온 질문 글... (0) | 2016.10.21 |
비동기 처리...를 간단히!!! (0) | 2016.10.18 |
데이타 테이블정의서 Excel 생성하기. (0) | 2016.10.18 |
Sqler 에 올라온 질문 글...
string 파싱하는데 늦다는 거였음.
12263,2,3,18321,2,1,19323,3,2,23152,5,4,27354,4,5 요런 문자열을 key1, key2, key3으로 분해하여 테이블형태로 변환하는 문제.
string str = "12263,2,3,18321,2,1,19323,3,2,23152,5,4,27354,4,5";
DataTable dt = new DataTable();
dt.Columns.Add("Key1");
dt.Columns.Add("Key2");
dt.Columns.Add("Key3");
string[] data = str.Split(',');
for (int loop = 0; loop < data.Length; loop += dt.Columns.Count)
{
DataRow newRow = dt.NewRow();
for (int col = 0; col < dt.Columns.Count; col++)
{
newRow[col] = data[(dt.Rows.Count * dt.Columns.Count) + col];
}
dt.Rows.Add(newRow);
}
요렇게 하면... 빠른데... 얼마나 많길래... 느리다고 하는 걸까? 거기에 xml파싱? 인가로 하면 더 빠를까?
음... 다시 가보니 쿼리로 풀어진 답글들이 있다..
그래서 나도...
declare @data xml = '<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">' +
'<num>' + Replace( '12263,2,3,18321,2,1,19323,3,2,23152,5,4,27354,4,5',',','</num><num>')+ '</num>' +
'</ROOT>'
SELECT ( [key] - 1 ) / 3 AS ord
,sum( CASE WHEN [key] % 3 = 1 THEN [value] END ) AS key1
,sum( CASE WHEN [key] % 3 = 2 THEN [value] END ) AS key2
,sum( CASE WHEN [key] % 3 = 0 THEN [value] END ) AS key3
FROM (
SELECT ROW_NUMBER() OVER( ORDER BY num1 ,num2 ,num3 ) AS [key]
,M.tb.query( '.' ) .value( '.' , 'int' ) AS [value]
FROM @data.nodes( '/ROOT/num' ) AS M ( tb )
,(
SELECT 1 num1
,2 num2
,3 num3
)AS nums
) tot
GROUP BY ( [key] - 1 ) /3
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
Epplus 관련정보를 정리해본다. (0) | 2016.11.09 |
---|---|
친구에게 만들어준 프로그램! 작업자 이력관리. (0) | 2016.11.08 |
비동기 처리...를 간단히!!! (0) | 2016.10.18 |
데이타 테이블정의서 Excel 생성하기. (0) | 2016.10.18 |
로또 체크기...? (0) | 2016.10.18 |
SSMS AddIn 기능중 Results Grid 접근!
SSMS에서 쿼리를 실행했을때 결과 그리드에 접근하기 위한 코드를 겨우 완성했다. ( 자료를 못찾는건지 ... 없는건지... )
겨우 소스는
// 참조 : http://www.tsingfun.com/html/2015/dev_0728/478.html
이 소스로 Addin 기능을 구현했었으나... 발견된 버그!
쿼리를 두개 이상 실행했을 때 첫번째 그리드만 접근이 되어 헤더목록을 제대로 취득하지 못했다.
디버거 조사식으로 객체들을 쫒아다니며 겨우 찾았다 "FocusedGrid" 프로퍼티를 이용하여...
/// <summary>
/// 获取当前文档视图窗口中的DataGrid
/// </summary>
/// <returns></returns>
public static IGridControl GetActiveGridControl()
{
try
{
SqlScriptEditorControl sqlEditorCtl = GetDocView() as SqlScriptEditorControl;
object sqlResultsControl = GetNonPublicField(sqlEditorCtl, "m_sqlResultsControl");
object gridResultsPage = GetNonPublicField(sqlResultsControl, "m_gridResultsPage");
var focusedGrid = GetNonPublicProperty(gridResultsPage, "FocusedGrid");
return focusedGrid as IGridControl;
}
catch (Exception e)
{
// Log
return null;
}
}
'# 9) My Program(.NET) > PRJMNG' 카테고리의 다른 글
화면정리 프로그램] 추가 기능. (0) | 2016.12.09 |
---|---|
화면정리프로그램? 으로 이름을 바꾸자. (0) | 2016.12.04 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(3) (0) | 2016.10.15 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(2) (0) | 2016.10.15 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(1) (0) | 2016.10.15 |
비동기 처리...를 간단히!!!
프로그램을 만들때 비동기로 처리하고 싶다거나
프로그래스 바로 진행율같은걸 표시하고 싶을때나...
사용하면 엄청 편하게 사용이 가능하다.
task나 await 같은 비동기... 처리도 있지만... ( 머리가 나쁘니 이해하는데 오래 걸리긴 한데... )
## 소스 사용예제
// todo : Excel Export
AsyncManagerClass async = new AsyncManagerClass();
async.BeforeAsyncCall = () => {
button1.DoInvoke(b => b.Enabled = false); <-- 크로스 쓰레드를 회피! 하는 Invoke!
progressBar1.DoInvoke(p =>
{
p.Minimum = 0;
p.Maximum = src.Rows.Count -1;
});
};
async.AfterAsyncCall = () => {
button1.DoInvoke(b => b.Enabled = true);
};
async.Async(() => {
ExportToExcel(src); <--- 비동기로 뭔가 열심히 처리 할수 있는 Method!
});
async.Async 내에서 호출되는 컨트롤들은 모두
.DoInvoke( c => ... ); 로 묶어서 처리 해주면 된다.
private void ExportToExcel(DataTable src)
{
... 생략 ...
try
{
for (int row = 0; row < src.Rows.Count; row++)
{
progressBar1.DoInvoke( p => p.Value = row );
... 생략 ...
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#region 비동기 처리
public class AsyncManagerClass
{
public Action BeforeAsyncCall = null;
public Action AfterAsyncCall = null;
public void Async(Action doActionMethod)
{
if (BeforeAsyncCall != null)
BeforeAsyncCall();
IsRun = true;
if (doActionMethod != null)
{
doActionMethod.BeginInvoke(ir =>
{
try
{
doActionMethod.EndInvoke(ir);
if (AfterAsyncCall != null)
{
AfterAsyncCall();
}
}
catch
{
// 작업 중!! 예외
}
IsRun = false;
}, null);
}
}
public void Stop()
{
IsRun = false;
}
public bool IsRun { get; set; }
}
public static class Ex
{
public static void DoInvoke<T>(this T ctrl, Action<T> callMethod) where T : Control
{
if (ctrl.InvokeRequired)
{
ctrl.Invoke(new Action<T, Action<T>>(DoInvoke), ctrl, callMethod);
}
else
{
callMethod(ctrl);
}
}
}
#endregion
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
친구에게 만들어준 프로그램! 작업자 이력관리. (0) | 2016.11.08 |
---|---|
Sqler 에 올라온 질문 글... (0) | 2016.10.21 |
데이타 테이블정의서 Excel 생성하기. (0) | 2016.10.18 |
로또 체크기...? (0) | 2016.10.18 |
Class를 XML변환, XML을 Class변환 (0) | 2016.09.12 |
데이타 테이블정의서 Excel 생성하기.
# 데이타 테이블 정의서를 엑셀에 뽑아내는 프로그램.
-- 나한테도 이미 돌아다니며 구한 몇가지 버젼이 있지만...
이번에 새로이 만들었다.
object Like에는 like문 그대로 입력해주면... 필터링 가능하다.
ex ) D[w|a] ( '%'는 뒤에만 소스 주석에서 걸려있음, 파라미터로 전달하니까... )
내려받기를 클릭하면 프로그래스로 진행율을 표시하고... 아래 양식으로 테이블별로 만들어진다.
Column 명( C열 ) 또는 Table 명( E열 ) 을 입력하면
I열은 설명을 추가하는 스크립트가 나온다.
J열은 설명을 삭제하는 스크립트가 나온다.
음 추가가 필요한 기능은 메타!! ( 시간될때 또... 넣자. )
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
Sqler 에 올라온 질문 글... (0) | 2016.10.21 |
---|---|
비동기 처리...를 간단히!!! (0) | 2016.10.18 |
로또 체크기...? (0) | 2016.10.18 |
Class를 XML변환, XML을 Class변환 (0) | 2016.09.12 |
DevExpress WinForm] Layout 보완... (0) | 2014.10.12 |
로또 체크기...?
가끔 로또와 연금복권을 사는데...
이걸 체크하려면 ... 보기 어려울때가 있네, 또 사이트 가니 체크하는게 있던데...
엑셀 수식으로 만들어진 체크기가 있는데... 심심해서 새로 만들어봤다.
api.. 이런게 지원이 되서 편하게 되었다.
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
비동기 처리...를 간단히!!! (0) | 2016.10.18 |
---|---|
데이타 테이블정의서 Excel 생성하기. (0) | 2016.10.18 |
Class를 XML변환, XML을 Class변환 (0) | 2016.09.12 |
DevExpress WinForm] Layout 보완... (0) | 2014.10.12 |
DevExpress WinForm] Layout Control (0) | 2014.10.12 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(3)
http://aseuka.tistory.com/entry/PRJMNG-비전공인-내가-SI를-진행하는-법1
http://aseuka.tistory.com/entry/PRJMNG-비전공자가-SI를-하는-방법2
http://aseuka.tistory.com/entry/PRJMNG-비전공인-내가-SI를-진행하는-법3
프로젝트에 참여하면 보통 PL이 요구사항들을 정리해서 작업을 하나씩 요청해온다.
어떤때는 쿼리를 직접 작성하게 되는 경우도 있기도 있고, 작성해준 것으로 작업을 시작하기도 한다.
아래 내용은 sp작성 완료 후 과정을 적어본다. 화면 정의서가 엑셀로 오는 경우도 있고, ppt도 있고, 말로만 설명하기도 한다.
그러면 우선 화면 디자이너를 이용해서 화면을 그리게 된다.
#### 요구사항을 하나 예를 들고 만드는 순서를 적어본다.
- Col1 이 조회조건이다.
- 그리드에 Col1, Col2, Col3 를 보여줘야 하는 단순 조회용 화면이다.
프로시져는 PL이 만들어 준다는 가정하에 내 프로그램들을 이용해서 화면을 구성해보자.
※ SSMS 추가된 기능
<추가된 메뉴>
※VS 추가된 기능
<솔루션 목록접기>
<프로젝트 셋팅>
<추가된 메뉴>
0. 작업내용을 일정관리 프로그램에 등록한다.
1. 프로시져를 실행하여 SSMS의 SQL결과 그리드에서 Header와 데이타를 뽑아내어 Header만 남기고 지운다.
# sql object 검색
- Control + Q, Control + F
# sql query formatter
-쿼리 정렬전
-쿼리 정렬 후 ( Control + Q, Control + Q )
# 데이타가 없을때도 복사가능
※ 아직 데이타가 조회되지 않는 경우 기본적으로 SSMS에서는 Header를 뽑아낼 수 없다.
- SSMS의 AddIn 을 이용하여 SQL결과 그리드에서 컬럼을 뽑아낼수 있다.
- SP_HelpTxt( Ctrl + 0 )를 이용하여 쿼리문을 편집기로 올려두고 컬럼들을 AddIn의 정렬( Sql_Formatter )기능으로 정렬시킨 후
이 쿼리에서 Header 목록을 얻어낸다.
# 쿼리에서 컬럼정보 얻어내기 ( 쿼리 정렬 후에 뽑아낼 수 있다. )
2. 뽑아낸 Header를 AddIn 기능 중 특정 포맷형태로 바꿔주는 기능을 사용하여 변환 시킨다.
Col1:컬럼1
Col2:컬럼2
Col3:컬럼3
Control + Q, Control + R 단축키를 누르면
{컬럼ID:컬럼명} 으로 정렬시켜준다. ( 추후 그리드 및 상세화면 디자이너 속성으로 사용된다. )
3. 디자이너를 띄워 화면을 디자인하고 소스생성 한다.
#디자인을 한다.
@UI기능
- 도구상자 : 디자인에 사용되는 컨트롤들을 배치되었다. 굿센에 맞춰진 특정 컨트롤, 컨트롤들을로 디자인 한 템플릿컨트롤들이 배치되었다.
동일한 형태의 컨트롤 배치를 계속 사용하게 되는 경우 템플릿으로 저장해두면 매번 재배치 하지 않고 사용가능하다.
- 디자이너
- 속성 : 컨트롤들의 속성값들을 편집 할 수 있다.
- 스크린샷 : 디자인된 소스를 스크린샷으로 찍어 클립보드에 복사해준다.
- Xaml내보내기 : Xaml로 변환하여 클립보드에 복사해준다.
- 프로젝트 생성하기 : 정해진 규칙대로 폴더를 생성하여 프로젝트(폴더,파일포함)를 만들어준다.
#디자이너에서 그리드를 설정한다. ( 그리드 속성창 > 편집 : Editor 버튼 클릭 )
@그리드 편집 기능
- Source Formatted : 이미 만들어진 화면의 소스에서 그리드 설정부분으로 그리드 설정값들을 복원하여 값들을 지정할 수 있다.
기존 화면을 수정해야 할 경우에 그리드를 일일이 다시 그리지 않고 한번에 읽어들일 수 있다.
- 컬럼추가 : 그리드에 컬럼을 추가해야 되는 경우 <, >버튼(오른쪽 아래버튼)으로 컬럼위치를 옮길 수 있다.
- Header + 1, Header - 1 : 그리드의 멀티컬럼을 설정할때 사용한다.
- 병합 : header 병합
- 병합해제 : 병합된 header 병합해제
- Custom Merge : 병합된 Header 정보를 이용하여 구현소스로 변환시켜 클립보드에 복사해준다..
- Const_GridCols_String : 그리드의 컬럼 Index를 상수형으로 설정하는 소스를 만들어 클립보드에 복사해준다..
- InitGridSettings : 그리드를 초기화 하는 소스를 만들어준다. ([Source Formatted]기능으로 읽어들이는 소스와 같은 형태로 생성.)
- DynamicGridInitEvent : 화면 UI에 title 컨트롤 Click이벤트 발생 시 실행되는 소스를 만들어주는데, 이 기능은 실행중에 컬럼Width 값을
데이타를 보면서 적절한 폭으로 조정한 후 Click하면 [InitGridSettings]에서 구현되는 소스와 동일한 형태의 소스를 만들어
클립보드에 복사해준다.
- Export To OpenXML : 그리드 내용을 Excel로 내보내기 기능을 OPEN XML을 이용하여 구현하는 소스를 만들어 클립보드에 복사해준다.
- Export To Excel : 그리드 내용을 Excel로 내보내기 기능을 Microsoft.Excel.Interop을 이용하여 구현하는 소스를 만들어 클립보드에 복사해준다.
- Import From Excel : 엑셀내용을 그리드로 업로드 기능을 구현하는 소스를 만들어 클립보드에 복사해준다.
4. 생성된 소스를 svn관리 폴더에 복사한 후 프로젝트를 visual Studio로 연다.
- 화면 UI에서 우측위쪽에 배치된 프로젝트 생성하기 버튼으로 프로젝트를 생성한다.
5. .xaml을 살짝 조정해준다. Grid의 마지막행, 마지막열의 height, width 값을 적절하고 바꾸고, 컨트롤들의 width값을 조정하여 보기 좋게 만든다.
6. .xaml.cs 에서 쿼리와 관련된 작업을 진행한다.
- 컨트롤에 Event처리
- 프로시져와 관련된 작업을 진행한다.
. sp설정 관련 코드라인 포커스를 두고 마우스 우측버튼 클릭 > MBaseClass Gen 클릭
. 프로시져 검색하고 변환하여 소스생성 > 원하는 위치에 [보내기] 클릭
7. 테스트를 진행하고 배포한 후 PL에게 완료여부를 알린다.
8. svn을 commit ( + add )한다.
9. 일정관리 프로그램에서 완료처리 한다.
#### 요구사항을 하나 예를 들고 만들어보았다.
이렇게 내가 일하는 작업들은 직접 구현하는 일은 많지 않다. 소스구현 툴에서 생성하며 붙여넣기를 반복적으로 하게 된다.
일반 조회는 30분~1시간, CRUD의 경우 그리드일 때 1~2시간 반, 상세화면 일때는 3시간 정도 잡고 일을 할수 있다. 난이도나 복잡도에 따라서 차이가 있다.
첫 언어로 C#닷넷을 선택하게 된 것이 나에겐 운이 좋았던것 같다. 비전공자인 나에게 프로그래밍에 집중 할 수 있게 해준 최고의 도구 Visual Studio와 구현이 너무
쉽게 가능한 C#을 이용해 지금까지 프로그래밍을 해왔다. 자바도 물론 경험 했으나, 알아야 할 것이 너무 많았다.
나에겐 절실함이 있었고, 닷넷 프로그램을 이용해서 풀어낸듯하다. 공부는 계속 하고 있지만...
다음 글은 ...
'# 9) My Program(.NET) > PRJMNG' 카테고리의 다른 글
화면정리프로그램? 으로 이름을 바꾸자. (0) | 2016.12.04 |
---|---|
SSMS AddIn 기능중 Results Grid 접근! (0) | 2016.10.20 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(2) (0) | 2016.10.15 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(1) (0) | 2016.10.15 |
JSFW.PROJECT.REF] 프로젝트 모듈 - SP검색 (0) | 2016.09.26 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(2)
http://aseuka.tistory.com/entry/PRJMNG-비전공인-내가-SI를-진행하는-법1
http://aseuka.tistory.com/entry/PRJMNG-비전공자가-SI를-하는-방법2
http://aseuka.tistory.com/entry/PRJMNG-비전공인-내가-SI를-진행하는-법3
프로젝트에 투입이 되면 내 자리는 PL이나 PM급이 아니라서 지금까지 개발자위치다.
구현단계에 들어가서 PL이 설계한 내용을 구현해주는 일이 곧 내 일인 셈이다. 요구사항은 계속 바뀌며 화면은 여러번 수정해야 한다.
PL과 개발자가 윈윈 하는 방법은 무었일까? PL은 현업이 요구하는 내용들을 무조건 쳐내는 것은 매우 어려운 일이며, 개발자는 무한정 하나의 요구사항 구현에 매달
려 있을 수 없다. 여러 SI프로젝트 현장에서 직접 체감하면서 고민하던 방법은 일과시간내에 구현을 최대한 빨리 끝내며 6시 정각엔 컴퓨터를 끈다.
지금 가진 생성 프로그램을 시간을 측정하면 SP작성이 완료된 시간부터 작업을 시작하여 단순 조회성 화면은 30분~1시간, CRUD는 1시간~2시간반, 그리고 상세화
면 3시간정도로 잡는다. 시간 측정이 가능하니까 할 수 있는 것들이 굉장히 많다.
지금 가지고 있는 프로그램과 프로시져의 목록을 나열해본다.
#일정관리 프로그램 : PL에게 들어온 요청을 최초 기록하고 완료기록등을 해두는 프로그램이다.
관련파일들은 요청작업 상세기록에 첨부하여 관리한다.
스케쥴러에서는 미래 일정보다는 작업해온 내역들을 한눈에 볼수 있도록 만들어져 있다.
#SP_HELP_TEXT : sp_help를 수정해서 쿼리의 탭그대로 유지하고 볼수 있게 만들어놓았음. 단축키 ctrl + 0
#SP_HELP_COLUMNS : sp_help 같이 컬럼 또는 파라미터 목록을 볼 수 있게 만들었다. 또 프로시져일때 프로시져 호출,
cs 코드상에서 만들어야 할 파라미터 구문 생성.
#Table R SP생성.sql : 테이블 조회 SP를 한번에 만들어주는 쿼리문. ( 관계테이블 외래키가 있으면 조인문으로 컬럼들까지 포함해서 만들어줌. )
#Table CUD SP생성.sql : 테이블 입력,수정,삭제 쿼리를 한번에 만들어주는 쿼리문.
#SSMS ADDIN : sp또는 Tabe, View등을 검색. ( 필터 사용하지 않고 검색가능 ) 위에 나열된 쿼리문들을 포함하고 있다.
조회시 나타나는 컬럼 목록을 뽑아내는 기능.
Select 쿼리문에서 Header를 뽑아내는 기능.
쿼리 정렬 기능.
#StoryBoard Designer : 화면정의 관리 프로그램 정도로 만든 것인다. 화면의 구현기능에 대한 기록이 가능하고 버튼에 링크 기능도 있다.
#UI디자이너 : 소스코드를 생산해 내기 위해 와이어프레임( ex: 발사믹, 펜슬... )같은 프로그램을 만들었다.
이 소스에서 ProjectInfo.cs에서 회사마다 개발표준에 맞게 변환 코드를 넣어주면 디자인 마치고 바로 변환하여 소스를 얻어낼수 있다.
( 변환 코드 작성 시간 약 일주일 )
#상세코드프로그램 : 상세화면의 컨트롤들의 데이타 바인딩, 초기화, 이벤트 코드를 생산해 낸다.
#VS AddIn : 소스상에서 프로시져와 관련된 정보를 소스변환하여 소스에 붙여주는 기능.
소스팁을 관리하는 기능.
그리드의 header 를 다시 정렬해서 만드는 기능. ( 새 컬럼 추가 삭제시 필요하다. )
VS2008에서 솔루션 접기 기능. ( 솔루션 하나에 20개정도의 프로젝트 가 묶여있으면..... )
프로젝트 참조DLL 갱신기능 ( 프로젝트에 참조된 다른 프로젝트 dll을 서버에서 내려받아 dll 참조 오류를 방지한다. )
.xaml 정렬기능 ( wpf 화면 정보를 해당 프로젝트에 맞춰 재정렬 및 스타일 강제셋팅한다. )
#프로세스 다이어그램 : PL이 된다면? 이란 가정하게 아직 초기 버젼 정도로 만든 프로그램.
각 프로세스를 정의하고 프로세스의 특정 포지션에서 필요한 화면UI를 디자인( 위에 있는 UI디자이너를 띄움. )
#지금 현재 프로젝트에서만 사용하는 프로그램으로 만든것들이 있다.
- Excel_Report_Gen : 특정 엑셀 양식을 이용하여 보고서 대용으로 사용하는 경우 이 엑셀을 이용하여 데이타 맵핑과 Export생성 소스를 만든다.
- 프로젝트모듈별UIAndSP검색 : 프로젝트의 소스(로컬)에서 화면별로 참조된 다른 화면과 sp목록을 검색해서 excel로 생성해준다.
여기 프로젝트에서만 사용하게 될 것 같다. 코드표준에 맞춰 검색이 되므로 기준이 다른곳에서 사용시 변환필요.
이 목록들이 10년간 만들어온 내 SI 필수목록이다.
다른 프로젝트에 투입이 되어 사용할 수 없는 경우엔 그때에 맞춰 다시 개발하여 사용 후 폐기한다. VS만 있으면 되니까.
다음글은 PL요청이 들어왔을때 부터 완료 찍을 때 까지의 작업에 대해 써본다.
'# 9) My Program(.NET) > PRJMNG' 카테고리의 다른 글
SSMS AddIn 기능중 Results Grid 접근! (0) | 2016.10.20 |
---|---|
PRJMNG] 비전공인 내가 SI를 진행하는 법(3) (0) | 2016.10.15 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(1) (0) | 2016.10.15 |
JSFW.PROJECT.REF] 프로젝트 모듈 - SP검색 (0) | 2016.09.26 |
JSFW.Minutes 회의록 작성기 (0) | 2016.09.12 |
PRJMNG] 비전공인 내가 SI를 진행하는 법(1)
http://aseuka.tistory.com/entry/PRJMNG-비전공인-내가-SI를-진행하는-법1
http://aseuka.tistory.com/entry/PRJMNG-비전공자가-SI를-하는-방법2
http://aseuka.tistory.com/entry/PRJMNG-비전공인-내가-SI를-진행하는-법3
일단 내소개! 나는 대림대학 전자과 출신 개발자이다. 지금으로 부터 10년전 2006년 7월부터 이 일을 시작했다.
동양공고 전자과를 졸업하고 전산을 지원했다가 낙방하고 1년 후 특별전형으로 집가까운 대림대학 전자과를 입학하였다.
그 후 군대와 졸업을 하고서 전자제품 생산공장, A/S기사, 무선중계기 점검기사, 거리에서 도로정비 및 신호등정비, 건물 관리 통신실등 정말 다양한 일들을 했지만,
워낙 박봉인데다가 작업등을 개선하기 위해 이런 저런 개선안을 보여주고 작업의 결과도 보여줬지만, 비용이 조금더 든다하여 매번 거절당하고...
전자쪽 일을 계속하면 굶어죽기 딱 좋겠다 생각해서 직업을 바꿀 기회를 알아보고 있었다. 그러다가 국비지원 임베디드 교육이 있는 것을 알게 되었고,
바로 회사를 퇴사하고 6개월간 교육을 들어갔다.
아침 9시 ~ 저녁 6시 였던것 같은데, 교육 리눅스 포팅과 C, C++, MFC등을 겉핧기 식으로 배웠다. 친구녀석이 전공이 프로그래머라서 C 문법 공부등을 도움받아가
며, 5개월쯤 마쳤을때 전자전공을 살리면서 뭔가 임베디드 배운 것등을 함께 하면 좋지 않을까 해서 결국 미친 짓을 또 시작했다.
처음 간곳이 전광판 개발하는 업체, 두번째가 스크린도어 설치하던 업체, 세번째가 전자제품 검사기만들던 업체였다. 이렇게 1년 허비하고 전자전공을 버렸다.
막연히 소프트웨어 쪽을 해보고 싶어서 전자와 관련없는 직장만 이력서를 넣고 있었는데... "와이즈엠"(현재:와이즈엠 시스템즈)회사의 대표님이 날 뽑아주셨다.
3개월 C# 책을 보고, 중국 하얼빈으로 날아갔다. 1개월간 숙식하며 프로그램을 맘껏 만들었다. 1년간 전공자들의 공부를 따라가기 위해 일하면서 계속 공부를
하였으나 그래도 부족했다. 1년을 버티고 웹 개발을 해보고 싶어서 와이즈엠에서 퇴사하였다. 중간에 다시 들어가고 싶었지만... 그럴 수가 없더라.
웹 개발을 처음 하는 곳에서 샘플을 주며 보고 만들면서 익히라는 말에... 거부의사를 밝히고 부장님과 다투고, 사장님 면담 후 하락하에 1달의 시간을 얻어냈다.
asp.net, javascript, html, css등 웹개발관련 공부를 20일정도에 마치고 바로 작업에 들어가서 망가진 프로젝트를 2달만에 끝마쳤다. 초기 사장님과의 약속이 어긋나서
회사를 그만두고 일찍 프리랜서(용역, 계약직)를 시작했다. 말이 좋아 프리랜서지. 그냥 계약직 아닌가?
롯데, kt, ... 등등... 거치다가 "굿센테크날러지"라는 ERP업체에 차세대 프로젝트에 참여하여 WPF라는 걸 처음 봤다.
잘 만들어진 개발 프레임웍, 하나 하나 뜯어보고 또 뜯어보면서 공부를 했다.
이때 소스 생성 프로그램이 처음 만들어졌다. 막 찍어내야 했으며 하루에 8개까지도 생성해보았다.
계속 생성 프로그램을 업그레이드 해서 10번 정도 다시 만든 프로그램을 지금 "굿센테크" 프로젝트에서 참여하여 사용 중에 있다.
프리로 다니면서 단가 협상을 못해서 오르지 않는 단가에 맘 상해하면서 일을 진행했다. 그러다보니 돈을 쫒게 되었고, 마음이 조급하게 된 것 같다.
프리로 앞으로 얼마나 하게 될지는 모르지만... 든든한 툴 만들어 사용하는데 걸린 시간이 10년!
오키 커뮤니티 글을 보면 학원출신, 비전공자들에 대한 편견들이 좀 있다. 내가 보기엔 지금 프로그래밍 교육 순서가 잘 못 된 것 같다.
문법 보다는 특정 상황을 프로그래밍 할 수 있는 시야를 넓혀주는게 먼저일 듯 한데, 문법만 가르쳤다고 나가서 일하라고 하니 일이 되겠는가?
다음 글에 프로젝트를 진행할때 내가 하는 방법들을 글을 이어 써본다.
'# 9) My Program(.NET) > PRJMNG' 카테고리의 다른 글
PRJMNG] 비전공인 내가 SI를 진행하는 법(3) (0) | 2016.10.15 |
---|---|
PRJMNG] 비전공인 내가 SI를 진행하는 법(2) (0) | 2016.10.15 |
JSFW.PROJECT.REF] 프로젝트 모듈 - SP검색 (0) | 2016.09.26 |
JSFW.Minutes 회의록 작성기 (0) | 2016.09.12 |
JSFW.PJT.Diagram] 추가 기능 [그룹핑] (0) | 2016.07.17 |