Thursday, May 14, 2009

自定义列表模板的运用

自定义列表在SharePoint中有很多机会用到,由于标准的文档库、列表等等不可能满足到企业的所有需要,对于有需要用列表来处理某一种信息时候,就会用上自定义列表。不管是自定义列表还是文档库,操作都是类似的。

首先,需要先弄好一个列表作为模板。比方说银行账户信息,如下图:


这张表在单一网站已经是可以用的了,但是比如在集团公司有好几家分公司,他们都需要统一用此列表填写银行信息,那就可以把此表做成模板,方法如下:

1. 选择列表设置


2. 在设置界面选择“将列表另存为模板”


3. 在以下界面输入需要的信息

  • 第一个是模板文档的名称,它将会以档案的形式出现在列表模板库
  • 第二是模板的名称,可以输入个容易识别的名字
  • 第三是模板说明,在这里输入说明方便将来查看模板库时候方便理解模板用途
  • 最后是选择是否把现在有的资料也保存进去模板,意思是现在这列表有的现有资料,存在模板内,将来应用模板时候资料一拼带出。举例,文件夹等等。

填好就按确定,这样就完成了。

之后在“创建”页面(这有很多方法进入,比如点击“查看所有网站内容”然后选“创建”),找不到的话,创建的页面是 /_layouts/create.aspx。在这页面的“自定义列表栏”就可以看到此模板了,点击即可创建。如下图:


要查看所有的列表模板,可以到顶层网站的模板库。默认的网址是这个:
/_catalogs/lt/Forms/AllItems.aspx

《完》

Wednesday, May 13, 2009

Reporting Services 报表字段消失和乱码 - 语言问题

如果用 Microsoft SQL 的报表服务,写出来的报表一切正常但字段无法显示,我遇到过好几次,一般的原因是语言设置错误。

首先,报表定义档 RDL (report definition language) 是一份 XML 档。打开看到的第一句:
<?xml version="1.0" encoding="utf-8"?>

看看是否 UTF-8 编码。

第二,看看报表的语言是否正确,这在RDL档的最后:
......
  <Language>en-US</Language>

  <TopMargin>2.5cm</TopMargin>

  <PageHeight>29.7cm</PageHeight>

</Report>

看看<Language>是否是你想要的。

第三,看看报表里面没显示的地方,看看属性是否正确,比如我的报表中有个textbox86没有显示出来的话,在报表设计软件(比如Business Intelligent Studio)切换到“配置”界面,点击textbox86带出它的属性:

看看这里的属性是否你想要的。
  • Calendar 是指资料是日期的时候,你想用的历法,一般选Default即可
  • Language 是指语言,我一般出问题都在这里,Default 就用了整张报表定义的,见上面第二点。比如你特别这一个文字框是显示日语的,需要在这里调
  • WritingMode 指书写的方向,有编程经验的应该熟悉了,lr-tb 是指 Left to Right - Top to Bottom

最后是 font, 如果我这textbox86是显示简体中文的,字体却选了Times New Roman,选错了当然出来乱码了。
《完》

Tuesday, May 5, 2009

Tag Cloud JS 代码

有点丢脸,我看一会,想来想去才知道 log()在以下代码中的作用。以下是我在这个 Blog 中用的 Tag Cloud,我改动了一点点。没什么注释的了,也没什么好说的了,很简单。

log()是用作algorithmic interpolation(对数插值)。不知道是什么的话,自行查阅初中的数学书。要用是因为没有log()的话,linear interpolation(直线插值)在tag数量不平均时候算出的字体大小不合理。

<script type='text/javascript'>

// Label Cloud User Variables
var cloudMin = 0;
var maxFontSize = 20;
var maxColor = [85,136,170];
var minFontSize = 8;
var minColor = [0,0,0];
var lcShowCount = false;

// Cloud function s() ripped from del.icio.us
function s(a,b,i,x)
{
if(a>b)
{
var m=(a-b)/Math.log(x), v=a-Math.floor(Math.log(i)*m)
}
else
{
var m=(b-a)/Math.log(x), v=Math.floor(Math.log(i)*m+a)
}
return v
}

var c=[];
var labelCount = new Array();
var ts = new Object;

<b:loop values='data:labels' var='label'>
var theName = "<data:label.name/>";
ts[theName] = <data:label.count/>;
</b:loop>

for (t in ts)
{
if (!labelCount[ts[t]])
{
labelCount[ts[t]] = new Array(ts[t])
}
}

var ta=cloudMin-1;
tz = labelCount.length - cloudMin;
lc2 = document.getElementById('labelCloud');
ul = document.createElement('ul');
ul.className = 'label-cloud';

for(var t in ts)
{
if(ts[t] < cloudMin)
{
continue;
}
for (var i=0;3 > i;i++)
{
c[i]=s(minColor[i],maxColor[i],ts[t]-ta,tz)
}

var fs = s(minFontSize,maxFontSize,ts[t]-ta,tz);
li = document.createElement('li');
li.style.fontSize = fs+'px';
li.style.lineHeight = '1';
a = document.createElement('a');
a.title = ts[t]+' Posts in '+t;
a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';
a.href = '/search/label/'+encodeURIComponent(t);

if (lcShowCount)
{
span = document.createElement('span');
span.innerHTML = '('+ts[t]+') ';
span.className = 'label-count';
a.appendChild(document.createTextNode(t));
li.appendChild(a);
li.appendChild(span);
}
else
{
a.appendChild(document.createTextNode(t));
li.appendChild(a);
}

ul.appendChild(li);
abnk = document.createTextNode(' ');
ul.appendChild(abnk);
}
lc2.appendChild(ul);
</script>

首先从<b:loop>取得data:labels的数组,然后用for loop把data:labels数据用s()公式算出字体大小,颜色控制亦是如此,同时准备html的a标志、资料和字体格式写入gadget内,就是这样了。其他还有些除错和个性化的处理,例如lcShowCount,自己看吧。

Saturday, May 2, 2009

SharePoint SDK updated to 1.5

微软的SharePoint Server 2007 SDK 1.5版本在 2009年4月底推出了,同时间WSS3.0的SDK 亦更新到 1.5版本。需要的赶快去下一份啦。

这是发放的通告:SharePoint SDK 1.5 (April 2009) Released

  • 这是MOSS 2007 SDK的下载页面:MOSS 2007 SDK 1.5
  • 这是WSS 3.0 SDK的下载页面:WSS 3.0 SDK 1.5
  • 在线看MSDN的可以到以下地址:

  • MSDN MOSS 2007 SDK
  • MSDN WSS 3.0 SDK
  • Friday, May 1, 2009

    XSL 条件格式化

    前言
    在下的公司用Microsoft的SharePoint作为协作平台,各部门对系统的要求层出不穷,但大都可以归类为Record Management和搜索两方面。搜索方面我用得最多的是数据视图,而数据视图的数据是XML,显示格式化用的是XSLT。

    SharePoint Designer (SPD)是可以处理的,Microsoft官方说明看起来你不用懂XSLT亦可以,在SPD点这点那,拖放一下就搞定。但是,当我用SPD来处理比较复杂的数据视图时候,经常出错,它生成的XSLT源码其实并不可靠,而且冗长。最理想的是,连好数据,带出需要字段后,所有的格式化手工处理。本文是有关条件格式化,不限于应用在SharePoint的数据视图,是可以应用于所有XSL。

    实现
    XSL 条件格式化,用<xsl:choose>可以实现。

    Choose 是 XSL 的flow control 之一,按逻辑测试结果来执行特定代码,需要与 when 和 otherwise 一起使用,格式如下:
    <xsl:choose>
      <xsl:when test="expression">
        ......
      </xsl:when>
      <xsl:otherwise>
        ......
      </xsl:otherwise>
    </xsl:choose>

    expression 是逻辑测试条件。<xsl:choose>与其他编程语言的switch很相似,choose内可以包含多个<xsl:when>,处理多个逻辑分支,而<xsl:otherwise>就处理各个when都不符合的情况,类似其他编程语言switch中的default。这是它与<xsl:if>的最大分别。

    例子
    以下是要显示的XML。连到一张名为new.xsl的XSL档。
    <?xml version="1.0"?>
    <?xml:stylesheet type="text/xsl" href="new.xsl"?>
    <EMPDETAILS>
      <EMP EMPID="E001">
        <ENAME>Karen</ENAME>
        <DESG>MANAGER</DESG>
        <DEPT>SALES</DEPT>
        <SALARY>250</SALARY>
        <HP>http://www.baidu.com/</HP>
      </EMP>
      <EMP EMPID="E002">
        <ENAME>Lepton</ENAME>
        <DESG>Executive</DESG>
        <DEPT>MIS</DEPT>
        <SALARY>300</SALARY>
        <HP>http://leptonation.blogspot.com/</HP>
      </EMP>
    </EMPDETAILS>


    以下是new.xsl的源码,注意看<xsl:choose>部分:
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="EMPDETAILS">
    <html>
    <body>
    <table border="1" cellspacing="0">
    <tr><td>EMPID</td><td>NAME</td><td>DESF</td><td>DEPT</td><td>SALARY</td><td>HP</td></tr>
    <xsl:for-each select="EMP">

      <xsl:choose>
        <xsl:when test="SALARY &gt; 260">
          <tr style="color:red">
            <td><xsl:value-of select="@EMPID"/></td>
            <td><xsl:value-of select="ENAME"/></td>
            <td><xsl:value-of select="DESG"/></td>
            <td><xsl:value-of select="DEPT"/></td>
            <td><xsl:value-of select="SALARY"/></td>
          </tr>
        </xsl:when>

        <xsl:otherwise>
          <tr style="color:green">
            <td><xsl:value-of select="@EMPID"/></td>
            <td><xsl:value-of select="ENAME"/></td>
            <td><xsl:value-of select="DESG"/></td>
            <td><xsl:value-of select="DEPT"/></td>
            <td><xsl:value-of select="SALARY"/></td>
          </tr>
        </xsl:otherwise>
      </xsl:choose>

    </xsl:for-each>
    </table>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>


    说明
    1. <xsl:choose>的摆放位置,是在for-each之内,这是理所当然的,因为我这例子每个EMP我都要进行条件格式化
    2. <xsl:when test="SALARY &gt; 260">这里,"SALARY &gt; 260"是条件,「>」符号要 html encode为「&gt;」,这里我设的条件是「SALARY大于260」
    3. <xsl:when>与<xsl:otherwise>两组代码的唯一分别是<tr>的style,SALARY大于260的显示整行为红色,否则的话就显示整行为绿色
    4. 用choose可以实现无限的可能,你要符合条件的单单更改SALARY元素的颜色亦可,你要把SALARY显示为超链接亦可,如下:
    tr 的style不要,单单更改 SALARY的td...

    <td style="color:red"><xsl:value-of select="SALARY"/></td>

    或者把SALARY的值显示为超链接...

    <td><a href="{HP}"><xsl:value-of select="SALARY"/></a></td>


    《完》