검색결과 리스트
2007/06 에 해당되는 글 15건
- 2007.06.22 MS Project 연동하기 [2/2]
- 2007.06.21 Silverlight 1.1 alpha 버전에서 한글 문제 해결하기 (1)
- 2007.06.21 MS Project 연동하기 [1/2]
- 2007.06.20 리소스에 필요한 파일을 첨부하는 방법
- 2007.06.19 WPF 강좌를 곧 시작할 예정입니다. (1)
MS Project와 연동하기 두번째 아티클이다.
첫번째 아티클에서 MS Project에는 많은 테이블들이 있지만 실제로 업무와 연동하기 위한
테이블은 두 개만 잘 활용하면 된다고 했다.
- MSP_PROJECT
- MSP_TASKS
먼저 아래쪽의 코드를 보자
string strTodayFrom = System.DateTime.Now.ToString("yyyy-MM-dd") + " 08:00";
string strTodayTo = System.DateTime.Now.ToString("yyyy-MM-dd") + " 17:00";
//Project 정보를 업데이트 한다.
string strQryUpdate = "update msp_projects " +
" set proj_name = '" + cdhSiteCode.Text + "', " + //프로젝트 코드
" proj_prop_company = '회사', " + //프로젝트 소유자
" proj_info_current_date = '" + strStartDate + "', " + //시작일
" proj_opt_def_finish_time = '" + strFinishDate + "', " + //종료일
" proj_opt_def_start_time = '" + strStartDate + "', " +
" proj_info_start_date = '" + strStartDate + "', " +
" proj_info_finish_date = '" + strFinishDate + "', " +
" proj_last_saved = '" + strStartDate + "', " +
" proj_creation_date = '" + System.DateTime.Now.ToString("yyyy-MM-dd") + "', " +
" proj_ext_edited = true, " +
" proj_ext_edited_date = true, " +
" proj_ext_edited_text = true, " +
" proj_ext_edited_num = true, " +
" proj_prop_title = '" + cdhSiteCode.Text + "' "; //프로젝트 코드
LEC.Win.PL.COCM.AccessUtil oAu = new LEC.Win.PL.COCM.AccessUtil("C:\\temp\\" + cdhSiteCode.Text + ".mdb");
oAu.ExecuteSQL(strQryUpdate);
<리스트1> 프로젝트 정보를 입력한다.
<리스트1>에서 처럼 필요한 프로젝트 정보를 먼저 입력해야 한다.
MSP_PROJECTS에서 해당 프로젝트의 정보를 입력하고 나서 해당 프로젝트의 하나 하나의
업무에 관한 정보(Activity)는 MSP_TASKS에 입력하면 된다.
<리스트1>의 코드에서 보면
LEC.Win.PL.COCM.AccessUtil oAu = new LEC.Win.PL.COCM.AccessUtil("C:\\temp\\" + cdhSiteCode.Text + ".mdb");
oAu.ExecuteSQL(strQryUpdate);
이런 두줄이 있는데 이부분은 MS Access를 다루기 위해서 본인이 만든 공통 클래스이다.
(이 부분도 원하신다면 주저않고 공개하겠다. ^^)
여기 까지 끝나고 나면 이제 본격적으로 업무에 관련된 Activity정보를 입력할 차례이다.
//Task 정보를 입력한다.
int nCnt = 0;
string strWbs = null;
string strTaskName = null;
string strGlvl = null;
string strSummuryYN = null;
string strTaskType = null;
if (dsPrgs.Tables[0].Rows.Count > 0)
{
foreach (DataRow drRow in dsPrgs.Tables[0].Rows)
{
nCnt++;
if (drRow[0].ToString() != null) strWbs = drRow["마스타WBS코드"].ToString();
if (drRow[1].ToString() != null) strTaskName = drRow["액티비티명칭"].ToString();
if (drRow[2].ToString() != null) strGlvl = drRow["액티비티레벨"].ToString();
if (drRow["최하위레벨여부"] != null)
{
if (drRow["최하위레벨여부"].ToString().Equals("Y"))
{
strSummuryYN = "0";
strTaskType = "1";
}
else
{
strSummuryYN = "1";
strTaskType = "0";
}
}
strQryUpdate =
"insert into msp_tasks " +
" (proj_id, " +
" task_id, " +
" task_uid," +
" task_dur," +
" task_dur_fmt," +
" task_base_dur_fmt, " +
" task_early_start," +
" task_early_finish," +
" task_late_start," +
" task_late_finish, " +
" task_start_date, " +
" task_finish_date," +
" task_priority," +
" task_type," +
" task_creation_date, " +
" task_wbs," +
" task_is_summary," +
" task_outline_level," +
" EXT_EDIT_REF_DATA," +
" task_name) " +
"values " +
"(1," +
nCnt.ToString() + "," +
nCnt.ToString() + "," +
4800 + "," +
" 53," +
" 53," +
" '" + strTodayFrom + "'," +
" '" + strTodayTo + "'," +
" '" + strTodayFrom + "'," +
" '" + strTodayTo + "', " +
" '" + strTodayFrom + "'," +
" '" + strTodayTo + "'," +
" 500," +
" " + strTaskType + "," +
" '" + strTodayFrom + "'," +
" '" + strWbs + "'," +
" " + strSummuryYN + "," +
" " + strGlvl + "," +
" 1," +
" '" + strTaskName.Replace("'", "''") + "' )"; // string에 '이 들어있는 경우 odbc에러나므로 ''로 변경
oAu.ExecuteSQL(strQryUpdate);
} // end of foreach
}
<리스트2> MSP_TASKS에 데이터를 입력하는 소스
MSP_TASKS에 데이터를 입력하기 위해서는 <리스트2>의 소스를 참고하면 된다.
먼저 하나씩 잘 살펴보면
if (drRow[0].ToString() != null) strWbs = drRow["마스타WBS코드"].ToString();
if (drRow[1].ToString() != null) strTaskName = drRow["액티비티명칭"].ToString();
if (drRow[2].ToString() != null) strGlvl = drRow["액티비티레벨"].ToString();
위의 부분은 strWbs, strTaskName, strGlvl 변수를 셋팅하는데
Activity에 사용할 고유한 WBS코드와 액티비티명칭 그리고 레벨을 설정하기 위한 부분이다.
액티비티를 설정할 때 또 중요한 부분이 해당 액티비티가 최하위 레벨인가를 설정해야
하는 부분이 있는데
if (drRow["최하위레벨여부"] != null)
{
if (drRow["최하위레벨여부"].ToString().Equals("Y"))
{
strSummuryYN = "0";
strTaskType = "1";
}
else
{
strSummuryYN = "1";
strTaskType = "0";
}
}
위의 부분 처럼 최하위 여부를 strSummuryYN, strTaskType에 각각 설정해야 한다.
그 외 나머지 부분은 모두 MDB파일에 던지기 위한 쿼리를 설정하는 부분이기 때문에
설명을 생략한다.
사실 어느 컬럼들을 사용할 것인지만 잘 설정되어 있으면 생각보다 아주 간단한 작업이다.
이렇게 설정된 MDB파일을 이제 MS Project와 연계해서 실행시키기만 하면 작업은 완료된다.
생성된 MDB파일을 MS Project에 넘겨주면서 실행시키는 방법은
string strMsProject = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\Microsoft Office\\OFFICE11\\WINPROJ.EXE";
if (System.IO.File.Exists(strMsProject))
LEC.Win.PL.COCM.ProcessUtil.StartProcess(strMsProject, " ", "C:\\TEMP\\" + projectCode + ".mdb");
else
LEC.Framework.Win.MsgBox.ShowMsg("MS Project가 설치되지 않았습니다.");
<리스트3> MS Project를 실행시키기
<리스트3>에서 Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) 이부분은 환경 정보를 가지고 있는 Environment 객체에서 시스템에서 사용하고 있는 폴더에 관한 정보를 가져오는 방법으로 이 방법을 잘 이용하면 MyDocument와 같이 미리 설정된 폴더들의 정보를 가져올 수 있다.
여기서는 ProgramFiles 폴더의 정보를 가져온다.
시스템의 ProgramFiles 폴더에 MS Project가 있는지 확인해보고 없으면 경고창을 띄워주고 존재하면
LEC.Win.PL.COCM.ProcessUtil.StartProcess(strMsProject, " ", "C:\\TEMP\\" + projectCode + ".mdb"); 를 통해서 MS Project파일을 실행시킨다.
물론 LEC.Win.PL.COCM.ProcessUtil 객체도 본인이 공통으로 따로 만들어 놓은것이다.
(음 다음 아티클에서 공개해버리겠다. ^^)
두 개의 공통 모듈로 인해서 설명의 다소 부족한 상태가 되어 버렸지만
전반적인 모습은 충분히 이해할 수 있었으리라 생각된다.
다음 아티클에서 두 개의 공통 모듈(사실 안을 들여다 보면 별거 없지만...)을
모두 공개해 버리겠다. ^^
-------------------------------------------------------
김영욱 Microsoft MVP 2006~2007
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------
- XPS문서를 통해서 해결할 수 있는 방법이 있었네요~
아무래도 가장 가벼운 방법인것 같습니다.
http://freelog.net/main/link.php?key=airlover&url=http://9eye.net/entry/Silverlight-%ED%95%9C%EA%B8%80-Korean&mcid=77349
- Glyph 객체를 통해서 해결하는 방법도 있습니다.
http://www.uxkorea.net/blog_post_62.aspx
-------------------------------------------------------
김영욱 Microsoft MVP 2006~2007
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------
댓글을 달아 주세요
-
all inclusive destinations 2011.07.31 16:25 ADDR EDIT/DEL REPLY
당신이 여기있어 이러한 관심과 좋은 정보를 제공합니다. 나는 그것은 다른 사람에서 더 많은 관심을 끌 것입니다 확신 해요. 내가 찾은 다행이 좋은 동영상을 주셔서 감사합니다.
MS Project는 Microsoft에서 만든 일정관리 도구이다.
완전 전문적인 도구는 아니지만 실제 업무를 진행하기에는 충분한 기능이 제공된다.
따라서 MS Project와 기존의 시스템을 연동하거나 하는 일이 발생된다.
일정관리뿐 아니라 인원이나 장비와 같은 자원관리도 함께 지원하기 때문에
MS Project의 파일구조는 다소 복잡하고 상당히 많은 테이블과 컬럼들로 구성되어
있어서 핸들링 하기에 다소 난해해 보인다.
하지만 실제로 일정만 연동하는 경우에는 그렇게 어렵지 않다. MS Project 파일을 직접핸들링 하는 것은 매우 어렵다. 그래서 좀 쉽게 가기 위해서는 다른이름으로 저장을 선택해서 MS Project 파일을 Microsoft Access 파일인 *.mdb 파일로 저장한 다음 다루는 방법이 좋다.
저장된 mdb파일을 열어보면 다소 많은 테이블 갯수에 일단 깜짝 놀라게 된다. 많은 테이블 중에서 일정을 연동하기 위해서는 두개의 테이블만 다루면 되니까 일단 걱정은 잠시 보류해도 좋다.
- MSP_PROJECTS
- MSP_TASKS
위의 두개의 테이블에 필요한 자료를 써 넣고 다시 MS Project에 열게 되면
변경된 내용을 확인 할 수 있다.
-------------------------------------------------------
김영욱 Microsoft MVP 2006~2007
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------
댓글을 달아 주세요
MS Project와 상호 연동하는 부분인데 mdb파일을 통해서 일정을 상호 핸들링하는 모듈 개발이
있었다. (MS Project와 연동하는 부분도 조만간 올리도록 하겠다. .. ^^)
MS Project에서 사용하는 형식으로 mdb파일을 생성하면
생각보다 꽤많은 테이블이 들어 있고 각각의 테이블에는 엄청난 갯수의 컬럼들이 설정되어 있다.
이렇게 엄청난 수의 테이블과 컬럼을 매번 코드로 생성하는
것이 좋은 방법은 아닌 것 같아서 기본 구조를 미리 생성해서
닷넷 어셈블리의 리소스로 첨부하고 필요할 때 리소스에서
해당 파일을 생성해 내는 편이 프로그램도 간단해지고
성능에도 오히려 도움이 될 것이라는 생각이 들었다.
리소스에 첨부될 수 있는 파일의 종류는
제한이 없다. 필요하다면 어떤 파일이라도 첨부할 수 있다.
이를 잘 활요하면 엑셀이나 워드도 포함시킬 수 있기
때문에 다양한 활용이 가능하다.
1.아래 그림에서 처럼 리소스를 추가 시키려고 하는 프로젝트에서 찾기쉽게 적당한 폴더를 만들고
폴더에서 오른쪽 마우스 버튼을 클릭해서 추가->기존 항목 추가 를 선택해서 추가할 파일을
선택한다.
위의 과정을 거치면서 파일을 프로젝트에 추가했지만 아직 어셈블리 안에 함께 포함되지는
않는데 추가시킨 파일의 속성에서 빌드 작업을 포함 리소스로 수정해 두어야한다.
여기까지 하면 프로젝트에 포함된 파일은 빌드작업시에 어셈블리내의 리소스로 함께 포함되어서
배포되게 된다.
이제 포함된 리소스를 가지고 원래 파일로 복원하는 방법을 설명하자면
리소스로 포함된 파일의 바이너리 형태의 스트림을 가지고 와서 로컬에 직접 써주기만 하면 파일로
복원이 가능하다.
//리소스에 포함된 내용을 가져와서 로컬에 파일로 복원시키는 코드
using (BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("LEC.Win.PL.CPNetworkPlan.Resources.Sample_Project.mdb")))
{
using (BinaryWriter writer = new BinaryWriter(new FileStream("C:\\temp\\" + cdhSiteCode.Text + ".mdb", FileMode.Create)))
{
int count = (int)reader.BaseStream.Length;
byte[] butter = reader.ReadBytes(count);
writer.Write(butter);
}
}
위의 소스 중에서 특히 아래부분을 주의해야 한다.
GetManifestResourceStream("LEC.Win.PL.CPNetworkPlan.Resources.Sample_Project.mdb")
스트림으로 가져올 리소스의 namespace를 정확하게 기술해 주지 않으면
절대로!!! 동작하지 않는다. ^^
-------------------------------------------------------
김영욱 Microsoft MVP 2006~2007
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------
댓글을 달아 주세요
한동안 아티클 쓰기를 게을리 했더니 인터넷에서 순위가
많이 밀린듯한(완전 제 혼자 생각입니다만... ^^) 생각에 빠져듭니다.
WPF와 Expression blend, Silverlight에 대한 동영상 강좌를
곧 시작할 예정입니다.
지난 한 주간 Microsoft에 연락받아서 진행했던 업체대상의
WPF 1주일 교육과정을 잘 진행했던터라 강좌 자료도 충분히 쌓였습니다. ^^
시간이 얼마나 허락될찌 모르기 때문에 조용히 몰래 시작해 봅니다. ^^
WPF를 하면서 가끔 제 정체성에 대한 의미를 묻게 됩니다.
저는 개발자인지 혹인 디자이너인지..
아니면 그 중간에 어떤 영역에 있는 것인지..
하지만 다시 생각해보면 역시 할 줄 아는 것은 프로그래밍 밖에 없기 때문에
디자이너가 아닌 것은 확실합니다. ^^
-------------------------------------------------------
김영욱 Microsoft MVP 2006~2007
-------------------------------------------------------
Email: iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------
댓글을 달아 주세요