2007.07.03 17:30
MS Project에서 일정 조정이 끝난 다음 조정된 일정이 들어 있는 파일에서
필요한 항목들을 잘 연동하면 MS Project와 업무솔류션을 연동할 수 있다.

업무솔류션 -> MS Project 연동은 아래 아티클을 참조하시고

  1. 2007/06/26 MS Access를 사용하기 위한 AccessUtil.cs 소스
  2. 2007/06/25 ProcessUtil.cs와
  3. 2007/06/22 MS Project 연동하기 [2/2]
  4. 2007/06/21 MS Project 연동하기 [1/2]


MS Project -> 업무솔류션 연동은 아래 항목들만 잘 연동하면 된다.

TASK_BASE_START
TASK_BASE_FINISH
TASK_EARLY_START
TASK_EARLY_FINISH
TASK_LATE_START
TASK_LATE_FINISH

신고
2007.06.22 10:40

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
-------------------------------------------------------

신고
2007.06.21 14:51

사용자 삽입 이미지

<그림1> Microsoft Office Project


MS Project는 Microsoft에서 만든 일정관리 도구이다.
완전 전문적인 도구는 아니지만 실제 업무를 진행하기에는 충분한 기능이 제공된다.
따라서 MS Project와 기존의 시스템을 연동하거나 하는 일이 발생된다.
일정관리뿐 아니라 인원이나 장비와 같은 자원관리도 함께 지원하기 때문에
MS Project의 파일구조는 다소 복잡하고 상당히 많은 테이블과 컬럼들로 구성되어
있어서 핸들링 하기에 다소 난해해 보인다.

사용자 삽입 이미지
<그림2> MS Project의 실행모습


사용자 삽입 이미지

<그림3> MS Project에서 다른 이름으로 저장하기


하지만 실제로 일정만 연동하는 경우에는 그렇게 어렵지 않다. MS Project 파일을 직접핸들링 하는 것은 매우 어렵다. 그래서 좀 쉽게 가기 위해서는 다른이름으로 저장을 선택해서 MS Project 파일을 Microsoft Access 파일인 *.mdb 파일로 저장한 다음 다루는 방법이 좋다.

사용자 삽입 이미지
<그림4> Microsoft Office Access 2007

저장된 mdb파일을 열어보면 다소 많은 테이블 갯수에 일단 깜짝 놀라게 된다. 많은 테이블 중에서 일정을 연동하기 위해서는 두개의 테이블만 다루면 되니까 일단 걱정은 잠시 보류해도 좋다.

- MSP_PROJECTS
- MSP_TASKS

위의 두개의 테이블에 필요한 자료를 써 넣고 다시 MS Project에 열게 되면
변경된 내용을 확인 할 수 있다.
사용자 삽입 이미지
<그림5> 일정 연동에 필요한 테이블

-------------------------------------------------------
김영욱 Microsoft
MVP 2006~2007
-------------------------------------------------------
Email:
iwinkey@hotmail.com
Blog: winkey.tistory.com
Phone: 016-817-0063
www.winkey.pe.kr
www.vismuri.com
-------------------------------------------------------
신고