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

신고