首頁

2013年5月31日 星期五

**Moss 開發..唯一的碼**~~CAML中比较**日期*时间*类型*~

**Moss 開發..唯一的碼**~~

*MOSS开发~*^
日期*时间*类型*~
**在做Sharepoint的列表查询的时候,
经常要用到CAML,今天我在做一个
工作流授权列表的查询,里面要求根据人员
、工作流名称、授权开始时间和授权结束
时间找到对应的授权人,没有找到就返回
本人。使用CAML QueryBuilder生成了
查询,然后修改了其中的对应的变量,
进行查询。结果发现查询结果有问题。
原来是在CAML中使用的日期类型的表示
必须是一种国内很少用的特殊的格式,,
形如"2009-04-09T15:11:20Z"网上找了
一下,使用SPUtility.
CreateISO8601DateTimeFrom
SystemDateTime
这个函数就可以生成这种格式,当然,
其实是有Datetime.ToString(“格式”)
也是可以的。查询的CAML是这样的:
string dString = SPUtility.CreateISO
8601DateTimeFromSystemDateTime(DateTime.Now);
            q.Query =
                   @"<Where>
      <And>
         <And>
            <And>
               <Contains>
                  <FieldRef Name='_x5de5__x4f5c__x6d41_' />
                  <Value Type=
'LookupMulti'>" + wfName + @"</Value>
               </Contains>
               <Eq>
                  <FieldRef Name='Author' LookupId='TRUE'/>
                  <Value Type='User'>" + us.ID + @"</Value>
               </Eq>
            </And>
            <Lt>
               <FieldRef Name='_x5f00__x59cb__
x65f6__x95f4_'/>
               <Value Type=
'DateTime'>" + dString + @"</Value>
            </Lt>
         </And>
         <Gt>
            <FieldRef Name='_x7ed3__x675f__
x65f6__x95f4_'/>
            <Value Type=
'DateTime'>" + dString + @"</Value>
         </Gt>
      </And>
   </Where>";
这样做以后进行查询,大部分情况都对了,
但是有时候还是会不对,那就是在当天的
时候。比如我设置了开始时间是
2009-4-9 10:00:00,而现在的时间是
9号的14点,但是查询却没有返回结果,
经过多次试验,终于找到原因,
原来是根本没有对时间字段进行比较,
而只是对日期进行比较,
由于4月9号并不大于4月9号,
所以就找不到结果。
要进行时间字段的比较,那么需要在CAML
中的Value字段上
添加IncludeTimeValue='TRUE',
添加后就可以进行时间字段的比较了。
string dString = SPUtility.
CreateISO8601Date
TimeFromSystemDateTime
(DateTime.Now);
            q.Query =
                   @"<Where>
      <And>
         <And>
            <And>
               <Contains>
                  <FieldRef Name='_x5de5__x4f5c__x6d41_' />
                  <Value Type=
'LookupMulti'>" + wfName + @"</Value>
               </Contains>
               <Eq>
                  <FieldRef Name='Author' LookupId='TRUE'/>
                  <Value Type='User'>" + us.ID + @"</Value>
               </Eq>
            </And>
            <Lt>
               <FieldRef Name='_x5f00__x59cb__
x65f6__x95f4_'/>
               <Value Type='DateTime' IncludeTimeValue='TRUE'>" + dString + @"</Value>
            </Lt>
         </And>
         <Gt>
            <FieldRef Name='_x7ed3__
x675f__x65f6__x95f4_'/>
            <Value Type='DateTime' IncludeTimeValue='TRUE'>" + dString + @"</Value>
         </Gt>
      </And>
   </Where>";
这里我写的时候,犯了个错,把 IncludeTimeValue='TRUE'写
到FieldRef中去了,以为就跟LookupId=
'TRUE'一样,结果老是查询不比较时间字段,
这里大家也要注意啊。
另外,再附上一个CAML语法:
CAML语法-Query写法
元素 说明
And 并且
BeginsWith 以某字符串开始的
Contains 包含某字符串
Eq 等于
FieldRef 一个字段的引用 (在GroupBy 中使用)
Geq 大于等于
GroupBy 分组
Gt 大于
IsNotNull 非空
IsNull 空
Leq 小于等于
Lt 小于
Neq 不等于
Now 当前时间
Or 或
OrderBy 排序
Today 今天的日期
TodayIso 今天的日期(ISO格式)
Where Where子句  **~

                    ha~^
********************************************************************
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&




沒有留言:

張貼留言


if you like make fds, wellcome you here~~anytime***

my free place for everyones who want the good software,

come & download them~ wellcome!!