2007年3月14日

使用AJAX的自定义对象来传递前后台的数据

在AJAX应用程序开发复杂业务逻辑的企业级应用程序中,在前台与后台传递数据时,我个人认为可以使用AJAX的自定义对象来传递数据。比如:
public classs Order
{
        public decimal CustID;
        public string CustName;
        public decimal Amount;
        public decimal Money;
        //....
}
 
在ASPX.CS中就可以写
[WebMethod]
[Scriptmethod]
public static decimal SaveOrder(Order order)
{
       //....
 }
 
 
在前台
Order o = new Order();
o.CustName="Test";
o.CustID = 123;
o.Amount =123;
 
 
PageMethods.Save(o,GetOrder_Callback)
function GetOrder_Callback(order)
{
 
}
 
//这样会使我们的前台数据类型相当紧,但要注意:在定义Order时,一定要加上一个PUblic的New();

posted @ 2007-03-14 22:16 DaiWei 阅读(630) 评论(1) 编辑

2006年4月21日

触发器

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

 

 


ALTER       trigger SalesOrderD_T_Checking on dbo.SalesOrderD
for insert , update
as
declare @a int

if exists(select * from inserted
inner join SalesOrderH on inserted.ReceiptCode = SalesOrderH.ReceiptCode
where not exists(select * from CustProd
where CustProd.CustomerCode = SalesOrderH.CustomerCode 
and CustProd.CustomerType = SalesOrderH.CustomerType
and CustProd.TradingConditionCode = SalesOrderH.TradingConditionCode
and CustProd.ItemNo = inserted.ItemNo))

begin

raiserror('Save error ! , You do not insert Item which is not in Customer Product List .',16,1)
end

--raiserror('DaiWei is stupid ! ,  .',16,1)


/*
select CustomerCode,CustomerType,TradingConditionCode,ItemNo from SalesOrderD
inner join SalesOrderH on SalesOrderD.ReceiptCode = SalesOrderH.ReceiptCode
where not exists(select * from CustProd
where CustProd.CustomerCode = SalesOrderH.CustomerCode 
and CustProd.CustomerType = SalesOrderH.CustomerType
and CustProd.TradingConditionCode = SalesOrderH.TradingConditionCode
and CustProd.ItemNo = SalesOrderD.ItemNo)

select * from custprod where CustomerCode = 'TZ'
*/

 

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 

posted @ 2006-04-21 11:34 DaiWei 阅读(33) 评论(0) 编辑

2006年4月19日

TZ ERP项目的随想

时间过得真快,到深圳来已快五个月了.在这段时间内,我们集中力量做ITC的TZ项目.在这个项目里面,我尽了自己最大的努力去做了.但从现在看起来,收效还不是太明显.再过一个星期就要离开深圳了,觉得有必要对这段时间的工作进行回顾和总结.
这段时间,我想我的最大精力都花费在框架的搭建上面.主要是从主从表的框架到主从从的框架的搭建.现在虽然框架已做好了.也能正常运行.但问题还是有一些.
第一是类层次继承过多,因为太过份得视继承,而造成了强耦合,而忽略了组合的方式 .
第二是好多东西还是面向数据编程,而不是面向对象编程(在这上面,重点体现在主从表的架构上面),事实上,我们要做的却是:面向对象编程,将对象绑定于前台的DataGrid之中.一切都对对象进行操作(这上面已经有了些尝试).

最主要是这两个.当然,也有好多值得提的地方:单据的一起保存.我们把表与表之间关联的复杂性,这部分工作任务集成到了视图之中了.我个人认为这是一个好办法.这样就可以减少程序的复杂性.在以后的系统架构将继续发挥这样的优势.
第二还是在数据库方面.我们加强了表与表之间的约束.主键,外键.等.我以前的观点就是一切由程序去控制,现在想起来,这是错误的,可笑的.

在前面显示方式,这个项目的用户体验要求相当严酷.可以说是到了分析过度的程度了.这是我不赞同的地方.另外在UI方面,NICOL给了我在后台加载控件这样的方法.有时候我也会使用它.但我与他观点不同的是:不会太多的使用这后台无界面的加载.

另外,在我们的项目中,还使用到了一些AJAX轻量回调的这样的技术.用户体验比较好的.
以上是一些技术方面的感受,下面是一些非技术类的感受.

要说这个项目最大的失误的地方,就是刚开始的分析过度.刚开始时,什么都要求通用,万能的.一个LIST会同时显示60多个列,在一个画面中.还需要支持列移动.权限的万能控件(行权限\列权限).现在看起来,又能实现多少.整天在这些里面做,结果把用户最关心的功能给忽视了.

由于分析过度,或者刚开始太过注重细节性的东西,而真正的业务分析又会很少,而造成了项目的进度严重缓慢.
我们团队有八个人,我来了都五个月了,前期他们工作了2个月,就算6个月吧.连一个进销存另外财务接口的软件都没有能完成.到现在只不过完成了30%的工作量.想起来真的有些脸红.

至于说为什么要离开ITC,我想跟我的开发理念有关系吧.我从来不认为有一个通用的万能的ERP系统,可以解决所有的问题.而公司的上层却认为这是可能的.所以所有的设计都是讲究通用和万能的.在这样的前提下,我们都努力去做了,但项目进度还是很慢,这不由得让我怀疑我们的开发思想,并坚定自己的开发理念.另外,就是感觉开发得并不舒畅,好多东西都是没有必要去做的,或者是在家里拍脑想出来的.
这时候又会想起CA说过的<<炒粉和龙虾>>的故事.整天把大部分精力花在前面UI页面上面.

炒粉和龙虾比,一定比不过龙虾了.

做一个项目的软件,一定比不上一个通用的万能的系统给投资人的诱惑力了.

希望在自己的以后的职业过程中,少犯这样的错误.

最后总结一下吧
这个项目中的可以用于以后项目的:单据框架\视图定义\表与表关联.
部分用户体验(包括采集\导入\导出\拆分等).


就写到这里吧/.

posted @ 2006-04-19 16:55 DaiWei 阅读(55) 评论(0) 编辑

2006年4月3日

C#加密与解密

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Secrituy
{
   
   


    public class Secure
    {
        private static byte[] DESKey = new byte[]{11,23,93,102,72,41,18,12};
        private static byte[] DESIV = new byte[] { 75, 158, 46, 97, 78, 57, 17, 36 };

        public static string Encode(string Encode_String)
        {
            DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
            MemoryStream objMemoryStream = new MemoryStream();
            CryptoStream objCryptoStream = new CryptoStream(objMemoryStream, objDES.CreateEncryptor(DESKey, DESIV), CryptoStreamMode.Write);
            StreamWriter objStreamWriter = new StreamWriter(objCryptoStream);
            objStreamWriter.Write(Encode_String);
            objStreamWriter.Flush();
            objCryptoStream.FlushFinalBlock();
            objMemoryStream.Flush();
            return Convert.ToBase64String(objMemoryStream.GetBuffer(), 0, (int)objMemoryStream.Length);
        }

        public static string Decode(string Encode_String)
        {
            DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
            byte[] input = Convert.FromBase64String(Encode_String);
            MemoryStream objMemoryStream = new MemoryStream(input);
            CryptoStream objCryptoStream = new CryptoStream(objMemoryStream, objDES.CreateDecryptor(DESKey, DESIV), CryptoStreamMode.Read);
            StreamReader objStreamReader = new StreamReader(objCryptoStream);
            return objStreamReader.ReadToEnd();
        }
    }
}

posted @ 2006-04-03 19:48 DaiWei 阅读(207) 评论(0) 编辑

2006年4月1日

动态加载用户控件的心得

动态加载的控件,在父窗体中,一般都应该会有一个IsFirstLoad这样的属性来代替它的Ispostback这样的属性。
 
动载加载的控件用户接口定义必须尊重控件的生命周期,而不在随便定义一下破坏生命周期的方式。
 
动态加载的控件必须在ONINIT事件中完成加载。
 
(在加载时,需要记得上次加载的是什么控件,只能使用REQUEST.FORM中去完成,因为VIEWSATAT尚未加载)
 
动态加载的控件必须有固定的ID

posted @ 2006-04-01 11:35 DaiWei 阅读(167) 评论(0) 编辑

2006年3月26日

开发跨浏览器的JavaScript

摘要: 最近,看了AJAX的开发基础这本书.发现有几行代码对我们编程也有好处.具体如下 :1向表中追加行2通过JAVASCRIPT设置元素的样式3设置元素的CLASS属性4创建输入元素5向输入元素增加事件处理程序6创建单选按钮1<table id="MyTable><tbody id="MyTableBody"></tbody></table>var cel...阅读全文

posted @ 2006-03-26 19:40 DaiWei 阅读(113) 评论(0) 编辑

2006年3月7日

Remoting中的配置

摘要: 配置Remoting共有如下二个方面 ,一个是服务端配置,一个是客户端配置服务端配置如何(宿主为IIS)<system.runtime.remoting><application><service><wellknown mode="Singleton" type="ComPlusLibrary.Test,ComPlusLibrary" objectUri=...阅读全文

posted @ 2006-03-07 10:26 DaiWei 阅读(212) 评论(1) 编辑

导航

<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

公告

昵称:DaiWei
园龄:5年10个月
粉丝:0
关注:0

搜索

 
 

常用链接

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜