承接MOSS各种工作流开发 联系人:王先生.电话:13691349686 QQ:252385878 MSN:wanghao-3@hotmail.com

寻找网络安全产品代理商(主要产品有:主机审计与监控系统,移动介质管理系统,文件集中管理安全存储系统,硬盘锁等)主要针对内网安全和数据防泄密 联系人:张小姐 电话:13522877350 QQ:419919940

2007年6月19日 #

K2 实现流程节点动态配置

以前本blog有讲关于 K2 blackpearl 结合MOSS表单库实现请假流程
K2.net 2003 

我接触K2是首先接触 k2 blcakpearl 开发过基于MOSS的流程。感觉K2 blcakpearl 非常强大,为用户提供过
很多向导,很多东西都需要配置 配置就OK,或者根据他自己生成的代码修改修就OK ,K2 blcakpearl  还有一个更大的优点就是K2 blcakpearl  底层是基于WF,所以跟MS接触的更紧密。由于他都是提供很多向导 感觉操作界面没有K2。net 简洁 。让一般开发者上手不是很容易。仍然给予WF ,WCF ,WPF 但是还是有很多不够灵活的地方 。
最近 又用K2。net 开发过项目。感觉k2.net 很容易上首。,也非常简单。扩展性也非常强悍。。

这个是最近实现的一个流程:
流程很简单。。这个流程的重点是,用户可以在数据库灵活的配置节点。很容易禁用节点。启用节点

此流程的实现原理: 用户提交流程-〉level Activity ,来判断当前的申请人的级别来走流程。
走流程的时候,来判弹审批节点是否禁用,如果禁用,在走向下一个流程节点 ,
下个节点 如果没有被禁用 然后审批。审批后  流程再次流转到 level Activity 再次判断 流程的下级是否禁用。如果禁用 ,再次走下一级。。。来回循环。。就很容易解决流程节点动态问题
流程图如下:

 

 

 

希望给大家一些帮助 ...

posted @ 2008-07-24 20:38 A A 阅读(124) | 评论 (3)编辑

用友软件工程公司招聘moss




我朋友委托我帮忙招聘一些moss开发的工程师 !!
待遇优厚。。。
要求:3年asp.net开发经验 1年MOSS经验
工资比一般公司待遇要高,目前公司急需MOSS 人才,会moss 开发就OK。。(有几个moss的项目)
有大项目,项目奖金丰厚。。

地址: 北京
有兴趣可以帮简历: yanglei2@use.com.cn  或者 hovic.wang@gmail.com




posted @ 2008-06-10 23:36 A A 阅读(238) | 评论 (6)编辑

列表查询WebPart

SmartListSearchWebPart
简单列表查询WebPart.本代码只是一个简单的Demo,代码没有实际的价值,但是很有学习价值.
在项目中可以得到很好的应用!


输入key





Code :

using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Xml;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace SmartListSearchWebPart
{
    [Guid("34903418-36da-45cb-ae81-27cd82b628dd")]
    public class SmartListSearchWebPart : System.Web.UI.WebControls.WebParts.WebPart
    {
        public SmartListSearchWebPart()
        {
            this.ExportMode = WebPartExportMode.All;
        }

        private Button btnSearch;
        private TextBox tbKey;
        /// <summary>
        /// create child controls
        /// </summary>
        protected override void CreateChildControls()
        {
            btnSearch = new Button();
            btnSearch.Text = "查询";
            btnSearch.Click += new EventHandler(btnSearch_Click);
            this.Controls.Add(btnSearch);

            tbKey = new TextBox();
            this.Controls.Add(tbKey);

            base.CreateChildControls();
        }

        private SPList List
        {
            get
            {
                return SPContext.Current.List;
            }
        }
        /// <summary>
        /// search
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void btnSearch_Click(object sender, EventArgs e)
        {
  
            if (this.tbKey.Text != "")
            {
                string cmal = string.Format("<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>{0}</Value></Contains></Where>", this.tbKey.Text.ToString());
                this.SetCurrentListViewSchemaQuery(cmal);
            }
           

        }
        /// <summary>
        /// set current list view schema query
        /// </summary>
        /// <param name="cmal"></param>
        private void SetCurrentListViewSchemaQuery(string cmal)
        {
            if (!string.IsNullOrEmpty(cmal))
            {
                string str = "{" +this.List.ID.ToString() +"}";

               
                foreach (System.Web.UI.WebControls.WebParts.WebPart webPart in base.Zone.WebParts)
                {
                    if (webPart is ListViewWebPart)
                    {
                        ListViewWebPart listViewWebPart = (ListViewWebPart)webPart;
                        if (string.Compare(listViewWebPart.ListName, str, true) != 0)
                        {
                            continue;
                        }

                        if (string.IsNullOrEmpty(cmal))
                        {
                            listViewWebPart.ListViewXml = this.List.Views[new Guid(listViewWebPart.ViewGuid)].HtmlSchemaXml;

                        }
                        else
                        {
                            XmlDocument xmlDocument = new XmlDocument();
                            xmlDocument.LoadXml(listViewWebPart.ListViewXml);
                            this.ChangeSchemaXmlCaml(xmlDocument, cmal);
                            listViewWebPart.ListViewXml = xmlDocument.InnerXml;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// move where
        /// </summary>
        /// <param name="q"></param>
        /// <returns></returns>
        private string GetInnerQuery(string q)
        {
            XmlDocument docuemnt = new XmlDocument();
            docuemnt.LoadXml(q);
            return docuemnt.DocumentElement.InnerXml;
        }
        /// <summary>
        /// change schema xml query
        /// </summary>
        /// <param name="xmlDocument"></param>
        /// <param name="query"></param>
        private void ChangeSchemaXmlCaml(XmlDocument xmlDocument,string query)
        {
            if (!string.IsNullOrEmpty(query))
            {
                string innerXml = this.GetInnerQuery(query);
                if (innerXml != "")
                {
                    XmlNode node = xmlDocument.DocumentElement.SelectSingleNode("Query");
                    XmlNode oldChild = node.SelectSingleNode("Where");

                    if (oldChild != null)
                    {
                        node.RemoveChild(oldChild);
                    }

                    XmlNode newChild = xmlDocument.CreateElement("Where");
                    newChild.InnerXml = innerXml;
                    node.AppendChild(newChild);
                    xmlDocument.DocumentElement.SelectSingleNode("ViewEmpty").InnerXml = "<HTML><![CDATA[<font color='red'><b>AA Say:未找到符合查询条件的记录。</b></font>]]></HTML>";
                }

            }
        }
        /// <summary>
        /// render
        /// </summary>
        /// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("<table><tr><td>");
            writer.Write("关键字:");
            tbKey.RenderControl(writer);
            btnSearch.RenderControl(writer);
            writer.Write("</td></tr></table>");
        }
    }
}

这个webPart 核心就是修改它的Scheam就OK
listViewWebPart.ListViewXml = xmlDocument.InnerXml;(主要代码)


jianyi 的文章对我很大帮助。。。希望更多的朋友向建议学习。分享





posted @ 2008-05-15 16:43 A A 阅读(366) | 评论 (1)编辑

Feature Action List Settings


今天很无赖。。很痛苦。。。很郁闷。 。。。。


首先 code .cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace ActionDemo
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ListSettingsMenu runat=server></{0}:ListSettingsMenu>")]
    public class ListSettingsMenu : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }


        protected override void CreateChildControls()
        {
            //base.CreateChildControls();
            SubMenuTemplate listSettings = new SubMenuTemplate();
            listSettings.Text = "List Settings";
            listSettings.Description = "Manage settings for lists on this site";
            listSettings.ImageUrl = "/_layouts/images/lg_ICASCX.gif";

            foreach (SPList list in SPContext.Current.Web.Lists)
            {
                if (!list.Hidden)
                {
                    MenuItemTemplate listItem = new MenuItemTemplate();
                    listItem.Text = list.Title;
                    listItem.Description = string.Format(
                        "Manage settings for {0}", list.Title);

                    listItem.ImageUrl = list.ImageUrl;

                    string url = string.Format(
                        "{0}/_layouts/listedit.aspx?List={{{1}}}",
                        SPContext.Current.Web.Url, list.ID.ToString());
                    listItem.ClientOnClickNavigateUrl = url;

                    listSettings.Controls.Add(listItem);


                }
            }

            this.Controls.Add(listSettings);
        }
        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}


Feature
feature.xml

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

         Id="{abeaae41-f8bc-4d60-b793-1ab65e633009}"
         Title="AA is great "
         Description="default Site Actions menu of WSS site by adding extra menu options."
         Scope="Site"
        
         >
 <ElementManifests>
  <ElementManifest Location="manifest.xml"/>
 </ElementManifests>

</Feature>

manifest.xml

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

 <CustomAction Id="{99777c4a-55d9-459b-aefe-e38b0d610ee1}"
      Location="Microsoft.SharePoint.StandardMenu"
      GroupId="SiteActions"
      ControlAssembly="ActionDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bf2af071df56a875"
      ControlClass="ActionDemo.ListSettingsMenu"
    >
 </CustomAction>

</Elements>


Dll放在 GAC 或者BIN

然后 二个xml 文件放在
Feature  下面,自己建立一个文件夹

在 站点的Web.Config 文件里面注册 这个dll
这个不用我写吧。。一般的WebPart 都需要。。

然后安装

 

@SET TEMPLATEDIR="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\"

@SET STSADM="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm"

xcopy /e /y TEMPLATE\* %TEMPLATEDIR%\Template

@ECHO ON

REM %STSADM% -o installfeature -name MyCustomListSettings -force
REM %STSADM% -o activatefeature -name MyCustomListSettings -force -url http://server:8000/

REM IISRESET /timeout:0


CustomAction 可以设置 Microsoft.SharePoint.StandardMenu

当然别的都可以设置。。。发挥你的想象去吧。/。。。


代码没有任何价值。。只是一种方式。。。


今天特烦。。。。








posted @ 2008-05-09 16:29 A A 阅读(136) | 评论 (0)编辑

SPPropertyBag Type



我们在使用一个site 保存信息的时候,可以使用 SPPropetryBag来很方便的存储!
Code:
 SPWeb spWeb = (new SPSite("http://AA.local")).OpenWeb();
SPPropertyBag spProperties = spWeb.Properties;
 
foreach (DictionaryEntry entry in spProperties)
  Console.WriteLine("   {0,-25} {1}", entry.Key, entry.Value);

我们还可以增加一个新的key and value

Code:

private void SetValue(String key, String value, String siteUrl) {
SPWeb spWeb = (new SPSite("http://AA.local")).OpenWeb();
SPPropertyBag spProperties = spWeb.Properties;
 
if (spProperties.ContainsKey(key)) {
spProperties[key] = Value;
} else {
spProperties.Add(Key, Value);
}
 
spProperties.Update();
}


posted @ 2008-05-09 14:20 A A 阅读(64) | 评论 (0)编辑

InfoPath 获取重复表的Value

    看到很多人需要,所以我写下来。。
   在以下示例中,将使用 SelectNodes(XPathNavigator,XPathNavigator,String) 方法选择绑定到 group2 的“重复表”控件的第一行中的节点。然后使用 GetContextNodes 方法基于当前所选项和指定节点返回上下文节点的集合。最后,代码将遍历上下文节点的集合,并显示每个节点的名称、内部 XML 和值。

// Create XPathNavigator and specify XPath for nodes.
XPathNavigator repeatingTableRow1 = MainDataSource.CreateNavigator().SelectSingleNode(
   "/my:myFields/my:group1/my:group2[1]", NamespaceManager);

// Select nodes in specified XPathNavigator.
CurrentView.SelectNodes(repeatingTableRow1,repeatingTableRow1,"CTRL5");

// Get context nodes in selection.
XPathNodeIterator contextNodes = CurrentView.GetContextNodes(repeatingTableRow1,"CTRL5");

// Loop through collection and display information.
foreach (XPathNavigator contextNode in contextNodes)
{
   MessageBox.Show(contextNode.Name);
   MessageBox.Show(contextNode.InnerXml);
   MessageBox.Show(contextNode.Value);
}

很简单就获取到重复表的Value..
希望对各位有帮助。。。

本文代码 。。来之MSDN。。 。

posted @ 2008-05-07 14:55 A A 阅读(199) | 评论 (3)编辑

MOSS WebPart and Link

     摘要: ActiveX Scripting Web Part (Simon Mourier) AD Management Web Part (Fabian) Alert Manager, Subweb Viewer Web Parts (Mart Muller) Avail Lists & Libraries (Sig Weber) Blogparts (Steen Molberg) Breadc... 阅读全文

posted @ 2008-04-14 23:01 A A 阅读(228) | 评论 (1)编辑

MOSS 文章置顶

posted @ 2008-04-13 22:28 A A 阅读(139) | 评论 (0)编辑

记录中心配置

在"文档中心"里面点击某个需要归档的文档,选择下拉菜单里的“发送到”,再选择“记录中心”,这个文档就会归档到记录中心里对应的文档库里了。

配置步骤:

0. 创建需要分类归档的内容类型

在根网站上点击“网站操作”,选择“网站设置”-->“修改所有网站设置”进入网站内容类型库,创建一个名为“Contract”的,继承自“文档”的自定义内容类型。

1. 创建“记录中心”网站

在根网站上点击“网站操作”,选择“创建网站”。

在创建网站界面里选择“记录中心”模板。

假设此网站的URL为http://moss/records

2. 在“记录中心”网站里创建保存归档Contract的文档库

进入记录中心网站,“网站操作”-->“创建”-->“文档库”,选择此文档库名称为“Contracts”

3. 添加路由信息

在记录中心网站中,进入“记录路由”列表(应该叫这个吧,手头没有中文版。。。),点击“新建”,标题填“Contracts”,位置也填“Contracts”,Aliases(别名?)填“Contract”(即那个内容类型的标题)

image

4. 设置记录中心关联

进入SharePoint管理中心-->“Web应用程序”-->“记录中心”

选择“连接到一个记录中心”,URL里填:http://moss/records/_vti_bin/officialfile.asmx 

image

5. 使用“发送到”功能进行试用

在文档中心里,创建一个“Contract”类型的文档,点击之,在下拉选单中,可找到“发送到-->记录中心”

image

操作成功后,记录中心的“Contracts”文档库就会多出这条记录:

image

感觉很不错,所以留下做备份

http://blog.joycode.com/choral/archive/2008/03/13/114965.aspx 原作者

posted @ 2008-04-08 11:27 A A 阅读(124) | 评论 (1)编辑

MOSS审批工作流实现动态会签

      好久没有更新我的 Blog啦 。。可能是由于我最近比较忙,也可能是我的访问量太少,写的没有啥动力哦。。。如果大家想看到更多的好文章,请大家多多来骚扰!!!

言归正传:
应用场景:

(5.4 文件批准        
5.4.1 管理体系手册由总经理批准。                
5.4.2 程序文件由相关部门经理会签,总经理或管理者代表批准。   
5.4.3 作业文件由起草部门经理批准。当涉及到其它部门时需要由相关部门会签。)


如果同一个文件作者主管多种产品或编写多种文件则会有多种审批流程,没有固定的标准。

问题1
5.4.2 (关于部门经理可以在流程页面初始化的时候,在外面输入几个人会签,我会根据当前会签人数,但是我的流程设计会签渠道的时候,我都设计死拉,如果想要灵活的,
需要动态创建activity,根据人数来画会签渠道)  难度是不是很大哦。..

大家看看上面需求.MOSS+InfoPath+WF.你解决??
关键是会签是动态的。不知道几个人一起会签 ?


上面有一点就是需要动态会签,不知道有几个人审批,
经过朋友提点 。。需要用到WF 的复制组件,就可以解决这个问题。。。
不过首先我们还需要自己建立一个Activity,然后用复制组件 复制这个 Activity就可以啦 。。。
Activity :

WORKFLOW:

仔细观察我这个Workflow界面,这个里面只放一个replicatorActivity,然后在 这个里面放一个Activity
这样就可以用复制组件实现
Code:

Activity :Code

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;

namespace ManageHandBook
{
 public partial class ReTasksActivity: SequenceActivity
 {
  public ReTasksActivity()
  {
   InitializeComponent();
  }

        private static DependencyProperty InstanceDataProperty = DependencyProperty.Register("InstanceData", typeof(SPWorkflowTaskProperties), typeof(ReTasksActivity));

        [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
        [BrowsableAttribute(true)]
        public SPWorkflowTaskProperties InstanceData
        {
            get
            {
                return ((SPWorkflowTaskProperties)(base.GetValue(ReTasksActivity.InstanceDataProperty)));
            }
            set
            {
                base.SetValue(ReTasksActivity.InstanceDataProperty, value);
            }
        }

        private string comment;
        public string Comment
        {
            set { comment = value; }
            get { return comment; }
        }

 

        public Guid taskId1 = default(System.Guid);
        public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties taskProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
        public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties afterProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
        public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties beforeProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();

        private void createTask1_MethodInvoking(object sender, EventArgs e)
        {
            taskId1 = Guid.NewGuid();
            taskProperties1.TaskType = 0;
            taskProperties1.ExtendedProperties["afterComments"] = comment;
        }

        private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e)
        {
            comment = onTaskChanged1.AfterProperties.ExtendedProperties["comments"].ToString();
        }
 }
}


这个是 Activity里面的代码 很简单吧。。主要用 SPWorkflowTaskProperties   动态创建任务。。

Workflow.cs

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;
using System.Xml;
using System.Xml.Serialization;
namespace ManageHandBook
{
 public sealed partial class Workflow1: SequentialWorkflowActivity
 {
  public Workflow1()
  {
   InitializeComponent();
  }

        private void rePlicatorActivity_ChildCompleted(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
          
            comments = string.Format("{0}Approved {1}:{2}\n", comments, workflowProperties1.Web.AllUsers[activity.taskProperties1.AssignedTo].Name, activity.Comment);
 
        }

        private void rePlicatorActivity_ChildInitialized(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
            activity.taskProperties1 = e.InstanceData as SPWorkflowTaskProperties;
            activity.Comment = comments;
        }
        public Guid workflowId = default(System.Guid);
        public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties workflowProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties();

        private string comments = string.Empty;
        private Person[] allPerson = null;
        private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
        {
            workflowId = workflowProperties1.WorkflowId;

            //反序列化workflowProperties.InitiationData以得到初始窗体的实例
            XmlSerializer xs = new XmlSerializer(typeof(Inits));
            XmlTextReader xtr = new XmlTextReader(new System.IO.StringReader(workflowProperties1.InitiationData));
            Inits init = (Inits)xs.Deserialize(xtr);
            allPerson = init.Contact;
            ArrayList Initlist = new ArrayList();
            for (int i = 0; i < allPerson.Length; i++)
            {
                SPWorkflowTaskProperties taskProperty = new SPWorkflowTaskProperties();
                taskProperty.AssignedTo = allPerson[i].AccountId;
                taskProperty.TaskType = 0;
                taskProperty.Title = string.Format("请审批 {0}", workflowProperties1.Item.DisplayName);
                Initlist.Add(taskProperty);
            }

            replicatorActivity.InitialChildData = Initlist;
        }
    }

}

Workflow 的代码更简单 。。。
复制组件的2个方法 更重要的哦。。
  private void rePlicatorActivity_ChildCompleted(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
          
            comments = string.Format("{0}Approved {1}:{2}\n", comments, workflowProperties1.Web.AllUsers[activity.taskProperties1.AssignedTo].Name, activity.Comment);
 
        }

        private void rePlicatorActivity_ChildInitialized(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
            activity.taskProperties1 = e.InstanceData as SPWorkflowTaskProperties;
            activity.Comment = comments;
        }

看起来 代码很简单。却能实现很复杂的流程。动态会签当然不是问题。。
如果大家仿照 扩展 扩展。。确实可以实现很多应用。。

/Files/wanghao-3/ManageHandBook.rar

posted @ 2008-04-02 11:31 A A 阅读(674) | 评论 (6)编辑

MOSS精英峰会2008暨群友见面会 MOSS应用开发商参观门票(企业票)预订

 SharePoint  Conference  2008
 
    应众多群友的响应,由赏梅斋群委会承办 MOSS精英峰会2008于三月到四月间于北京举行。
 
     届时,全国众多MOSS精英将齐聚北京,进行交流与联谊!同时,将邀请微软MOSS技术专家、解决方案专家、销售经理、咨询顾问等,进行产品技术、市场、人材等多方面的交流。   
 
      欢迎微软合作伙伴(MOSS应用开发商)代表参加交流,参观门票2000元一张,做为峰会赞助,用于活动的组织。每个公司限购三张。购票公司可获得峰会活动MOSS精英通讯录一份以及其他重要礼品。  
 
     预订时间从2月20到3月20日,为期一个月,3月21日将公告活动的具体时间安排。 


地址:http://www.msotec.net/poc/mossdev/Lists/2008/overview.aspx

posted @ 2008-03-03 11:13 A A 阅读(149) | 评论 (1)编辑

K2 blackpearl 结合MOSS表单库实现请假流程


              下一个项目需要使用K2,所以提前学习下K2,学习几天后,感觉K2还不错,基于WF,和MOSS集成也还可以.今天熬夜写一些简单的MOSS和K2结合的信息
需求:

        1、公司人员填写假期申请单,单上面有姓名、时间,等信息
        2、如果请假天数是3天以下的话,该请假申请单将由人事部审批,如果是3天以上则由总经理审批后再交人事部审批
        3、人事部审批结果用邮件通知申请人,有3种结果:同意、拒绝
图1: 比较简单

首先用户申请:



申请后,可以在表单库里面到一个Process1 的任务表单,这个就是用户申请表单.


然后经理审批:
经理可以直接到worklist里面去审批.也可以直接点这个连接审批



经理审批后,流程跑到HR.



HR 再次审批 发送 Email  给用户.流程结束.


可以在worklist 的view里面查看流程的流转状态... K2真强大..

MOSS 和K2结合 感觉还行,如果在MOSS项目中,流程需要的很多,需要考虑上K2建议使用K2这个产品。
如果流程不是很多,可以直接用WF开发.也不难...


学历代表过去,能力代表现在,学习能力代表未来

posted @ 2008-01-13 00:26 A A 阅读(613) | 评论 (9)编辑

用户权限管理模块

              08年第一帖,祝自己过得越来越好,能力有所提高
 今天介绍一个关于MOSS用户权限管理模块,这个wsp主要是管理员来管理当前网站的文档库和列表的一些用户的使用权限
可以很方便的管理和控制所有的文档和列表的权限。
如图:


大家看,是不是很容易很方便的控制用户权限?(不可否认界面确实难看)。。。。

/Files/wanghao-3/UserRoleManage.rar
是一个wsp文件 直接安装就好
安装:直接 进入 12\bin目录
然后在控制台运行 :stsadm.exe -o addsolution -filename  c:\UserRoleManage.wsp

 然后到管理中心选择站点启用这个解决方案。
然后就可以创建和体验这个模块。。

希望大家提点建议,有利于这个模块的完整。

学历代表过去,能力代表现在,学习能力代表未来



posted @ 2008-01-11 11:44 A A 阅读(717) | 评论 (11)编辑

MOSS自动备份

   
     备份!备份!还是备份!
MOSS自动备份,根据当前时间生成不同的文件名:

"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin\stsadm" -o backup -url http://AA:80 -filename D:\AA_backup\%date:~0,10%_AA.bak -overwrite

\%date:~0,10% 取当前时间

将以上命令保存在一个cmd文件中,然后利用计划任务自动运行。





posted @ 2007-12-31 18:52 A A 阅读(253) | 评论 (2)编辑

ajax实现google效果

    

     以前完ajax都是用控件糊里糊涂的用,也没有看他的原理, ajax无刷新,就是通过javascript 调用另一个页面,然后在另一个页面刷新,然后获取数据

原理就是这样简单,代码更简单,,效果图

这个demo,原理很简单,就是首先获取 getHttpObject的对象模型,然后去post,WebForm1.aspx,然后还回结果,然后解析!
default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AjaxWebApp._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
    <script language="javascript">
        function getHttpObject()
        {
            var waystation = null;
            if(window.ActiveXObject)
            {
                waystation = new ActiveXObject("Microsoft.XMLHTTP");
            }
            else if(window.XMLHttpRequest)
            {
                waystation = new XMLHttpRequest();
            }
            else
            {
                waystation = false;
            }
            return waystation;
        }
       
        function addTest()
        {
            inputField = document.getElementById("textfield");
            completeTable = document.getElementById("table1");
            completeDiv = document.getElementById("popup");
            completeBody = document.getElementById("body1");
      
            var s = document.all.item("textfield").value;
           // alert(s);
            var aa= encodeURI(s);
            if(s=="")
            return;
            var xmlrequest =getHttpObject();
            xmlrequest.open("post","WebForm1.aspx?id="+aa);
            xmlrequest.onreadystatechange = function()
            {
                if(xmlrequest.readyState==4)
                {
                   //xmlrequest.responseText为你AddCity中输出的那段字符串;
                    setNames(xmlrequest.responseText);

                }
            }
            xmlrequest.send(null);
        }
       
        function setNames(names)
        {
            if(names=="")
            {
                clearNames();
                return ;
            }
            clearNames();
            setOffsets();
            var row,cell,txtNode;
           
            var s = names.split("$");
           
            for (var i = 0; i < s.length; i++)

               {

                 //s[i]为td的
                    var nextNode =s[i];
                    row = document.createElement("tr");
                    cell = document.createElement("td");
                    cell.onmouseout = function() {this.style.backgroundColor='';};
                    cell.onmouseover = function() {this.style.backgroundColor='#ffff00';};
                    cell.onclick = function() { completeField(this); } ;
                    cell.pop="T";
                    txtNode = document.createTextNode(nextNode);
                   cell.appendChild(txtNode);
                    row.appendChild(cell);
                    document.getElementById("body1").appendChild(row);
              }


        }
       
        //用来设置当鼠标失去焦点后文本框的隐藏
        document.onmousedown=function()
        {
            if(!event.srcElement.pop)
             clearNames();
         }//填写输入框

        function completeField(cell)
        {
            inputField.value = cell.firstChild.nodeValue;
            clearNames();
        }
       
        function clearNames()
        {
            completeBody = document.getElementById("body1");
            var ind = completeBody.childNodes.length;
           
            for(var i= ind-1;i>=0;i--)
            {
                completeBody.removeChild(completeBody.childNodes[i]);
            }
            completeDiv= document.getElementById("popup");
            completeDiv.style.border = "none";
           
        }
       
        function setOffsets()
        {
            completeTable.style.width = inputField.offsetWidth;+"px";
            var left = calculateOffset(inputField,"offsetLeft");
            var top = calculateOffset(inputField,"offsetTop")+inputField.offsetHeight;
              completeDiv.style.border = "black 1px solid";
               completeDiv.style.left = left + "px";
               completeDiv.style.top = top + "px";
        }
       
        function calculateOffset(field, attr) {
    var offset = 0;
     while(field) {
     offset += field[attr];
     field = field.offsetParent;
    }
    return offset;
   }

   
    </script>
</head>
<body>
       <input name="textfield" id="textfield" type="text" class="input1" onkeyup="addTest();" maxlength="20" style="width: 68px" /><div  id="popup" style="POSITION: absolute">
       <table id="table1" cellspacing="0" cellpadding="0" bgcolor="#fffafa"  border="0" >
        <tbody id="body1"   >
        </tbody>
       </table>
      </div>

</body>


</html>
WebForm1.aspx 是用来后台刷新的,所以
不需要前台页面,可以把前台页面的html去掉
如图:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="AjaxWebApp.WebForm1" %>

 


WebForm1.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace AjaxWebApp
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            string result = Request.QueryString["id"].ToString();
            //可以在这里面进行数据库的操作,然后把得到的结果作为字符串返回过去,然后再去解析那段字符串;主意看看这个页面的HTML
            Response.Write("A$AA$AAA$AAAA");

           //测试demo所以比较简单,刷新在这个页面,所以你可以在这个页面做任何事情
        }
    }
}


 

 Demo不是最好,只是说明一些问题.../

posted @ 2007-12-23 21:46 A A 阅读(528) | 评论 (1)编辑

Excel Services 中UDF的简单使用

Excel Services 中UDF的简单使用:
       需要开发UDF ,需要到12\ISAPI下面引用UDF的DLL,Name: Microsoft.office.Excel.Server.Udf.dll
然后在 VS里面建立类库,

因为是测试,代码所以比较简单如下:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Excel.Server.Udf;

namespace UdfDemo
{
    [UdfClass]    //这个地方必须要,如果不要,Excel Services 会忽略它的
    public class Class1
    {

        [UdfMethod]  //这里也一样
        public double Hovic(double Money)
        {
            if (Money < 500)
            {
                return Money * 0.05;
            }
            else if (Money < 2000)
            {
                return Money * 0.1 - 25;
            }
            else
            {
                return Money * 0.2;
            }
        }

    }
}

然后把DLL,Copy 到一个地方如:c:\UdfDemo.dll


如果需要使用 Excel Services 中UDF,必须首先到管理中心的 SSP ,配置excel services 用户定义函数 注册


然后到excel 2007 中 编辑如下图: 把B3单元格中输入公式:"=Hovic(B2)",这个Hovic就是我们UDF中定义的方法
然后把B2单元格修改成 money,然后发布到excel Services中,并发布参数money





发布前面文章里面有讲,如果不明白.看前面连接.

下图就是UDF最后效果,



还是那句话,测试代码很简单,只是说明一些问题.实际应用,我们可以灵活控制..

UDF,我感觉什么都可以做,只有想不到,没有做不到...嘿嘿..

posted @ 2007-12-16 20:22 A A 阅读(145) | 评论 (1)编辑

Excel Services 的 web Services 接口应用




  笔记:
     使用 Excel Services 的 web Services 接口应用,当时首先需要在工程里面引用这个excel这个web services ,然后在工程里面添加

这个Excel Services 的 web Services 可以直接在服务器的本地查找就可以!

直接通过 Excel Services 的 web Services 接口 直接访问文档库里面的excel,并传递传送,或者数据还回结果.大家问我们为什么要使用这个Excel Services 的 web Services 接口?,因为有时候我们在实际的应用中,有些excel不想公布全部数据,有些数据是保密的,所以通过Excel Services 的 web Services 接口 可以很好的控制权限.通过Excel Services 的 web Services 接口来操作,可以通过我们webApp程序来操作,可以做出更人性化的程序.

测试代码如下:


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace ExcelDemo
{
    public partial class ExcelUserControl : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSum_Click(object sender, EventArgs e)
        {
            localhost.Status[] status;
          

            string SessionId = null;

            localhost.ExcelService es = new ExcelDemo.localhost.ExcelService();


            //设置验证信息
            es.Credentials = System.Net.CredentialCache.DefaultCredentials;
            //开始访问一个session
            try
            {
                SessionId = es.OpenWorkbook("http://wh/sites/report/ExcelDocument/sheet.xlsx", string.Empty, string.Empty,out status);
            }
            catch
            {
                SessionId = null;
            }

            //设置参数
            if (SessionId != null)
            {
                es.SetCellA1(SessionId, "sheet2", "employee", tbEmployee.Text.Trim());
                es.SetCellA1(SessionId,"sheet2","saler",tbSaler.Text.Trim());

            }
            //取回结果
            object payment = es.GetCellA1(SessionId, "sheet2", "B3", true,out status);

            if (payment != null)
            {
                lbSUM.Text = Convert.ToString(payment);
            }

            status = es.CloseWorkbook(SessionId);

 

        }
    }
}


简单demo下载:/Files/wanghao-3/ExcelDemo.rar
代码不是最后,只是本人学习用!

posted @ 2007-12-16 19:44 A A 阅读(229) | 评论 (1)编辑

Excel Service 简单使用方法

   

   excel 学习笔记:

 
    首先肯定还是需要配置受信任站点,这个就不用我说拉,在前面的文章中有截图.
然后设计好我们的