List 템플릿 추가 중에 아래와 같은 오류가 끊임없이 발생하여,

추가 List 템플릿으로 web.Lists.Add(".....", "......", listTemplate) 메소드로 SPList를 추가할 수 없는 경우가 있습니다.

System.Data.SqlClient.SqlException:

테이블 'WSS_Content.dbo.EventReceivers', 'Name' NULL 값을 삽입할 수 없습니다. 열에는 NULL을 사용할 수 없습니다.

INSERT() 실패했습니다.  문이 종료되었습니다.    

 

위치: System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
위치: System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)

위치: System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler,
 SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
위치: System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
위치: System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,
 String methodName, Boolean sendToPipe)    

위치: System.Data.SqlClient.SqlCommand.ExecuteNonQuery()    

위치: Microsoft.SharePoint.Utilities.SqlSession.ExecuteNonQuery(SqlCommand command)

 

이 내용을 확인해 본 결과 List Template 안의 Event Add 하는 부분에서 아래와 같은 부분을 확인 할 수 있었습니다.

List Template Element.xml 을 살펴본 결과 아래와 같습니다.

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

  <!-- 리스트 템플릿 정의부분 -->

  <ListTemplate

        Name="FreeTalk_Board"

        Type="8000"

        BaseType="0"

        OnQuickLaunch="TRUE"

        SecurityBits="12"

        Sequence="392"

        DisplayName="FreeTalk_Board"

        Description="FreeTalk_Board"

        Image="/_layouts/images/itann.gif"       

        />

  <!-- 이벤트 리시버 정의부분 -->

  <Receivers ListTemplateId="8000">

    <Receiver>

      <Name>CollectBoardEventReceivers</Name>

      <Type>ItemAdded</Type>

      <SequenceNumber>50000</SequenceNumber>

      <Assembly>SKT.TSquare.SPS.FreeTalk, Version=1.0.0.0, Culture=neutral, PublicKeyToken=388b774ba96c947e</Assembly>

      <Class>SKT.TSquare.SPS.FreeTalk.CollectBoardEventReceivers</Class>

      <Data />

      <Filter />

    </Receiver>

    <Receiver>

      <Name>CollectBoardEventReceivers</Name>

      <Type>ItemDeleting</Type>

      <SequenceNumber>50000</SequenceNumber>

      <Assembly>SKT.TSquare.SPS.FreeTalk, Version=1.0.0.0, Culture=neutral, PublicKeyToken=388b774ba96c947e</Assembly>

      <Class>SKT.TSquare.SPS.FreeTalk.CollectBoardEventReceivers</Class>

      <Data />

      <Filter />

    </Receiver>  

  </Receivers>

</Elements>

 

일단  <Receivers> .... </Receivers> 부분에 있는 내용을 모두 삭제해 보고 리스트를 추가해 본 결과,

위의 오류가 발생하지 않았습니다.

이번에 다시 추가해서 적용해 본 결과 오류가 재발하였습니다.

그래서 이번에는 각 Event의 이름을 다르게 적용해 보았습니다.

 

   ....

  <Receivers ListTemplateId="8000">

    <Receiver>

      <Name>FTEventItemAdded</Name>

      <Type>ItemAdded</Type>

      <SequenceNumber>50000</SequenceNumber>

      <Assembly>SKT.TSquare.SPS.FreeTalk, Version=1.0.0.0, Culture=neutral, PublicKeyToken=388b774ba96c947e</Assembly>

      <Class>SKT.TSquare.SPS.FreeTalk.CollectBoardEventReceivers</Class>

      <Data />

      <Filter />

    </Receiver>

    <Receiver>

      <Name>FTEventItemUpdated</Name>

      <Type>ItemDeleting</Type>

      <SequenceNumber>50000</SequenceNumber>

      <Assembly>SKT.TSquare.SPS.FreeTalk, Version=1.0.0.0, Culture=neutral, PublicKeyToken=388b774ba96c947e</Assembly>

      <Class>SKT.TSquare.SPS.FreeTalk.CollectBoardEventReceivers</Class>

      <Data />

      <Filter />

    </Receiver>  

  </Receivers>

   ....

 

확인해 본 결과 위와 같이 변경하니, 그 이상의 오류는 발생하지 않았습니다.

그 이후에는 이름이 동일해도 오류가 발생하지 않았습니다.

초기에 리스트 템플릿 상에서 동일한 이름으로 등록할 때 발생되는 오류로 생각됩니다.

728x90

금일 작업 중에, 일정 되풀이된 일정들을 SPQuery를 이용하여 SPListItemCollection을 가져오는 방법에 대해서

분석했습니다.

 

문제원인

만일 오늘 날짜에 해당하는 일정(되풀이 포함) 사항을 가져오려면 아래와 같이 작성하게 됩니다.

 

SPQuery query = new SPQuery();

// 쿼리문생성

query.Query = "<Where>"

               + "<DateRangesOverlap>"

               + "<FieldRef Name=\"EventDate\" />"

               + "<FieldRef Name=\"EndDate\" />"

               + "<FieldRef Name=\"RecurrenceID\" />"

               + "<Value Type=\"DateTime\">"

               + "<Today />"

               + "</Value>"

               + "</DateRangesOverlap>"

               + "</Where>";

SPListItemCollection listItems = list.GetItems(query);

 

위의 코드대로 작성하게 되면, listItems( SPListItemCollection )의 목록은

오늘 날짜에 해당하는 일정을 가져오는 동시에, 오늘 날짜의 이전 되풀이 일정(한주 기준)들도 함께 나오게 됩니다.

만일 오늘이 목요일이라고 하는 경우, 그 주의 월, , , 에 있는 되풀이들도 모두 나오게 됩니다.

(되풀이가 아닌 경우에는 정상적으로 나옵니다.)

 

즉 되풀이에 대한 별도 필터링 작업이 필요해지게 됩니다.

 

해결 방법

GetItems를 실행하기 전에, 아래와 같이 설정하면 됩니다.

(CalendarDate 부분은 읽어오려는 기준 날짜를 넣어주시면 됩니다.)

 

query.CalendarDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day);

query.RecurrenceOrderBy = true;

query.ExpandRecurrence = true;

 

위와 같이 넣고, GetItems를 하시면 정확히 원하는 되풀이만 가져올 수 있습니다.

728x90
예전에 가상 함수를 만들어 엘리베이트 태우는 방법을 프로젝트 할 떄 배웠다.
그런데, 그 방법은 좀 아름 답지 않게 만들 수 밖에 없었다.
그런데, 이번에 SharePoint SDK 문서를 읽던 중... 참으로 아름 다운 방법을 발견해서
적는다.

SPSecurity.CodeToRunElevated elevatedGetSitesAndGroups
        = new SPSecurity.CodeToRunElevated(엘리베이트 태울 함수이름);
SPSecurity.RunWithElevatedPrivileges(elevatedGetSitesAndGroups);

예를 들자면... 만일 Button Click Event 중에, DoElevate 라는 함수를 권한 상승 처리를 해야 한다면 다음과 같이 구성될 수 있다.

private void DoElevate()
{
      // 관리자 권한이 있어야만 실행되는 코드....
}

protected void Button1_Click(object sender, EventArgs e)
{
     SPSecurity.CodeToRunElevated elevatedGetSitesAndGroups
        = new SPSecurity.CodeToRunElevated(DoElevate);
     SPSecurity.RunWithElevatedPrivileges(elevatedGetSitesAndGroups);
}

728x90

사용자 삽입 이미지

WSS 3.0 에서 추가적인 기능 중에, RSS Feed를 구독하는 기능이 있다.
일정, 작업, 목록 등등에서 위의 메뉴 바의 내용 중 작업 -> RSS 피드 보기를 선택하면 된다.

그러면 RSS 피드가 활성화 되게 되는데, 이 내용을 그대로 클릭하게 되면 Xml 문서가 꺼내지고 그에 맞는 Xslt 파일과 연동되면서 화면에 보여지게 된다.

그런데, Internet Explore 7.0 같은 경우에는 이 RSS 리더 기능을 자체적으로 가지고 있다보니 다소 희안하게 표시되게 된다.

같은 일정 목록을 가지고 RSS 피드 보기를 각각 IE 6.0과 IE 7.0에서 돌려보았다.
차이는 아래의 그림을 참조하면 된다.  보면 알 수 있듯이 IE 7.0 같은 경우에는 무슨 dll 이라고 표시되고 IE 6.0 같은 경우에는 그냥 XSLT에서 제공한 내용대로 우수하게 표시된다.

버그라면 버그겠지만, WSS 3.0 서비스 팩이 나오면 아마도 해결될 수 있을 만한 내용이라고 생각한다. 설마하니 외국 사람들 중에서 아래와 같은 문제점을 발견하지 않았으리라 생각된다.

[IE 7.0]

사용자 삽입 이미지















[IE 6.0]
사용자 삽입 이미지

728x90
MOSS 2007 개발을 할 때, 가상 디렉토리를 만들어 별도의 ASPX 페이지를 만들어
추가적인 기능을 꾸미려고 할 때가 있다.
그러나 임의대로 만들거나, 기본적으로 생성되는 대로 만들게 되면 MOSS 2007의 기능을
사용할 수 없거나 혹은, 아예 페이지 자체가 뜨지 않는 경우가 있다.
그래서 대부분의 개발자들은 _layouts 에 ASPX 페이지를 저장하는 경우가 많다.
그러나 자신만의 파일들을 별도로 구성해 관리하려면 역시 별도의
가상 디렉토리를 구성하는 것이 좋고, 그를 위한 방법을 정확히 파악하는 것이 좋다.

1. INETMGR - 인터넷 정보 서비스 관리자 실행을 한다.  그리고 난 뒤 가상 디렉토리 생성을 시작한다. 가상 디렉토리 만들려면 만들려는 사이트에서 오른쪽 버튼을 클릭한 뒤, 새로 만들기 -> 가상 디렉토리를 선택한다.
사용자 삽입 이미지


2. 가상 디렉토리 만들기 마법사가 실행되면 다음을 누르면 가상 디렉터리 이름을 넣는다. 이 부분은 사이트 경로 URL을 누를 떄 사용되는 이름이다.
사용자 삽입 이미지


3. 가상 디렉터리 상에서 보여줄 내용이 담긴 HDD상에 있는 경로를 넣는다. 직접 넣어도 되며, 찾아보기를 사용해서 경로를 넣어도 된다.
사용자 삽입 이미지
사용자 삽입 이미지

4. 다음을 클릭하면 디렉토리 액세스 권한을 설정하게 되는데, 여기서 읽기/스크립트 실행/실행 만 체크해주고 다음을 클릭한다.
사용자 삽입 이미지

5. 가상 디렉터리 만들기 마법사의 마지막이 나오고 마침을 클릭하면 가상 디렉터리가 만들어진다.

6. 만들어진 가상 디렉터리를 위에서 오른쪽 버튼을 클릭해서 속성을 클릭한다.
사용자 삽입 이미지


7. 속성 창이 뜨면 제일 먼저 자동으로 생성되어 있는 웹 응용 프로그램을 삭제해준다. 삭제하는 방법은 응용 프로그램 이름 옆에 있는 제거 버튼을 클릭하면 된다. 삭제한 후 적용 -> 확인하면 된다.
사용자 삽입 이미지
 


여기까지는 기본적으로 해주어야 되는 사항들이다.
그 이후에는 2가지 형태로 나뉘어 구성해야 하는데, 그 구분의 기준은 접근 권한이다.
1. 모든 사용자들이 접근 가능한 경우
2. 로그인한 사용자들이 접근 가능한 경우
3. 관리자 권한을 가진 사용자들이 접근 가능한 경우

이런 권한별로 구성하려면 접근 권한 셋팅이 달라지기 때문에, 이에 대한 설명은 다음 부분에서 다루려고 한다.
728x90

MOSS 2007에서 사이트 내 마스터 페이지를 추가/삭제/편집 하는 페이지가 있다.

사용자 삽입 이미지
일반적인 설정으로 모든 권한을 Administrators 그룹에 속한 계정에게 주고,
그 계정으로 로그인 하면 모든 페이지를 접근 할 수 있으며, 지금 말하려는
마스터 페이지 및 페이지 레이아웃 안의 설정 페이지에도 들어갈 수 있다.

그러나 Form 인증과 같은 전혀 다른 Login을 하거나 Administrators 그룹내의 계정이 아니면,
저 안의 페이지에 접근 할 수 없다.
심지어 사이트의 소유자 권한을 가지고 있어도 불가하다.

이 안에 들어가려면, 사이트의 모음(Site Collection)의 관리자에 등록되어 있어야 한다.
여기에 등록하려면, 최소한 SharePoint 3.0 중앙관리에 들어가야 가능하다.
사용자 삽입 이미지

중앙관리에 들어가 응용 프로그램 관리SharePoint 사이트 관리 목록 중 사이트 모음 관리자를 선택하면 된다.























모음 관리자에서 자신이 원하는 계정을 하나 추가하면 된다.
보통 사이트를 처음에 만들때 정한 계정이 들어가 있는데, Form 인증으로 중간에 설정시에는 안들어가 있는 경우가 많다. 그러므로 여기서 추가해주는 것이다.
사용자 삽입 이미지
위의 그림에서 처름 보조 사이트 모음 관리자 같이 윈도우 인증 계정이 아니는 Form 인증과 같은 별도 인증 계정을 저런 식으로 등록해주어야 저 계정으로 완벽한 사이트 관리를 수행할 수 있다.

현재까지 사이트 관리에서 안되는 부분은 이 마스터 페이지 등록/삭제/편집 페이지 뿐인데,
가급적 저런식으로 등록하여 준비해 놓는 것이 좋다.

728x90

+ Recent posts

728x90