如大家要转载,请保留本人的版权:
/*
*Description:SQL数据库数据分页技术
*Auther:chongchong2008-天真的好蓝啊
*MSN:chongchong2008@msn.com
*QQ:154674958
*Blog:chongchong2008.cnblogs.com
*Dates:2010-01-13
*Copyright:ChongChong2008 YiChang HuBei China
*/
说说SQL数据库按照降序排列的情况,如下:
方法一:Select Top Min(Max) Select Top 方法
问题,第一页的时候有bug
问题,不能多字段排序,必须要求主键,即排序字段唯一不能重复,且此主键的类型必须是int类型,如果多字段排序,还要求主键是连续的,不能断裂。
读取第二页数据的基本SQL代码,每页10条数据
如下降序排序:
SELECT TOP 10 * FROM table_test where table_ID<(
SELECT MIN(table_ID) FROM (
SELECT TOP 20 table_ID FROM table_test ORDER BY table_ID DESC
) t
)ORDER BY table_ID DESC
方法二:Select In Select Top 方法
问题,最后一页的时候有bug
问题,要求有主键,即要求一个不能重复的唯一字段,主键的类型可以任意,可以多字段排序,多个字段都可以有自己单独的排序方式
读取第二页数据的基本SQL代码,每页10条数据
如下降序排序:
SELECT * FROM table_test where table_ID in (
SELECT top 10 table_ID FROM (
SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID DESC,table_ID DESC
) t order by table_OrderID ASC,table_ID ASC
)order by table_OrderID DESC,table_ID DESC
如下升序排序:
SELECT * FROM table_test where table_ID in (
SELECT top 10 table_ID FROM (
SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID ASC,table_ID ASC
) t order by table_OrderID DESC,table_ID DESC
)order by table_OrderID ASC,table_ID ASC
第一种方法其实很好,如果你不要求用其他的非主键排序的话,那绝对是你的首选。
不过,在要求非主键字段排序的场合下,就得用上第二种方法了,而且还可以多字段排序,下下主要说说这种排序方法。
这种排序方法要求排序字段的排序方式反转,在你写SQL语句的时候要用到,为了支持多字段的自动反转,下面我写了一个函数,方便调用。
如下:
-- =============================================
-- Description: 反转排序字段的排序方式
-- Author: chongchong2008 - 天真的好蓝啊
-- QQ: 154674958
-- Email: yc_mingzi@tom.com
-- MSN: chongchong2008@msn.com
-- Create Date: 2009-11-13
-- =============================================
ALTER FUNCTION [dbo].[fn_chongchong_ReversOrder]
(
@orderFields nvarchar(255)
)
RETURNS nvarchar(256)
AS
BEGIN
declare @sourceString nvarchar(255)
declare @resultString nvarchar(255)
declare @tempString nvarchar(32)
declare @index int
declare @len int
declare @len2 int
set @sourceString = @orderFields + ',';
--计算长度
set @len = len(@sourceString)
set @index = CHARINDEX(',', @sourceString)
set @resultString = ''
--循环
while(@index!=0)
BEGIN
set @tempString = SUBSTRING(@sourceString, 1, @index-1)
if( CHARINDEX('desc', @tempString) !=0 )
SET @tempString = replace(@tempString,'desc','ASC')
else
SET @tempString = replace(@tempString,'asc','DESC')
SET @resultString = @resultString + @tempString+ ',' ;
SET @sourceString = SUBSTRING(@sourceString, @index+1, @len-@index)
SET @index = CHARINDEX(',', @sourceString)
END
SET @len2 = len(@resultString)
SET @resultString = substring(@resultString,1,@len2-1)
RETURN @resultString
END
此SQL函数的功能如下:(用来反转任意多个排序字段的排序方式)
declare @strSource nvarchar(255)
set @strSource = dbo.fn_chongchong_ReversOrder('test_OrderID ASC,test_OtherID DESC,test_Date DESC')
print @strSource
返回输出 test_OrderID DESC,test_OtherID ASC,test_Date ASC
利用第二种方法写出如下的代码:
SET @orderKey = @orderKey + CASE @orderType WHEN 0 THEN ' ASC' ELSE ' DESC' END;
SET @orderKeyRevers = dbo.fn_chongchong_ReversOrder(@orderKey); -- 反转
SET @orderFields = replace(replace(@orderKey,'ASC',''),'DESC',''); --去掉排序标记符
SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName
+ @where1 + @primaryKey + 'in('
+'SELECT TOP '+ CAST(@pageSize as varchar) + @primaryKey + ' FROM ('
+'SELECT TOP '+ CAST(@pageSize*(@pageIndex) as varchar) + @orderFields +' FROM '+ @tableName
+ @where2 + ' ORDER BY ' + @orderKey
+ ') t ORDER BY '+ @orderKeyRevers
+ ') order by ' + @orderKey;
注意这种方法,当翻页到最后一页的时候有个Bug,下面这段用来修正这个Bug.
IF(@pageIndex >= @totalPage) -- 修正第后一页
SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName + @where1 + @primaryKey + 'in('
+ 'SELECT TOP ' + CAST(@lastRecords as varchar) + @primaryKey + ' FROM '+ @tableName + ' ORDER BY ' + @orderKey + + CASE @orderType WHEN 0 THEN ' DESC' ELSE ' ASC' END
+') order by ' + @orderKey + CASE @orderType WHEN 0 THEN ' ASC' ELSE ' DESC' END;
OK,就是这样...
B2C电子商务系统概念数据模型分析设计
如大家要转载,请保留本人的版权:
/*
*Description:B2C电子商务系统概念数据模型分析设计
*Auther:chongchong2008-天真的好蓝啊
*MSN:chongchong2008@msn.com
*QQ:154674958
*Blog:chongchong2008.cnblogs.com
*Dates:2010-01-13
*Copyright:ChongChong2008 YiChang HuBei China
*/
我大概浏览了下网路上的购物网站,体验了一些”免费“(天下掉下馅饼可能吗,呵呵)的电子商务系统,了解了些业务,有些确实很不错,各个不同语言实现的都有,我是说很不错,可是对于我来说是用起来有点晕,可能和自己的使用理念有些区别,干脆自己来造一个吧,不是很好玩吗?于是,有想写个电子商务程序的念头。
下面开始设计这个电子商务程序。经过我的了解,B2C电子商务数据模型分下面这几部分:
一。数据概念模型基本定义,暂不包括各个模型之间的关系
1。会员部分:
==============================
1.1 会员基本数据
1.2 会员角色数据
1.3 会员个性化数据
1.4 会员等级数据
2。商品部分:
==============================
2.1 商品类型数据模型
2.2 商品品牌数据模型
2.3 供应商数据模型
2.4 商品分类数据模型
2.5 商品数据数据模型
2.6 商品标签数据模型
2.7 商品属性数据模型
2.8 商品属性值数据模型
2.9 商品选项数据模型
2.10 商品选项值数据模型
2.11 商品参数组数据模型
2.12 商品参数数据模型
2.13 商品相册数据模型
2.14 商品配件数据模型
2.15 相关商品数据模型
2.16 相关商品类型数据模型
2.17 捆绑商品数据模型
2.18 捆绑商品项数据模型
2.19 商品咨询数据模型
2.20 商品咨询回复数据模型
2.21 商品评论数据模型
2.22 商品收藏数据
3。促销部分:
==============================
3.1 促销打折数据模型
3.2 优惠劵数据模型
4。订单部分:
==============================
4.1 订单
4.2 订单项
4.3 订单选项
4.4 订单状态
4.5 订单赠品
4.6 支付方式
5。配送部分:
==============================
5.1 送货方式及费用
通过分析,决定把其中的几个东西单独的提出来:
1. 会员系统从电子商务系统提出来,用成员管理子系统接入。
2. 把电子商务显示,显示模板也提出来,用CMS子系统接入。
3. 把商品相册也提出来,用相册子系统接入。
4. 把评论也提出来,用评论子系统接入,也可以不提出来,在电子商务子系统多建1个表来实现,看个人规划了。
5. 把留言及回复也提出来,用留言子系统接入,也可以不提出来,在电子商务子系统多建2个表来实现,看个人规划了。
发现我所体验的多个B2C电子商务系统,把模板都放入里面了,我更觉得这块要交给CMS来完成。
二。电子商务需求的复杂度
1. 商品扩展属性,选项,参数的复杂度
电子商务系统的复杂度在于,商品类型(页可以说是顶级分类,看自己怎么设计了)所特有的扩展属性,选项,参数,
拿服装类型举例:
属性
================================
材质 : 纯棉,40%棉+60%涤纶等
.
.
.
选项
================================
颜色:红色,蓝色等
尺码:XL,L等
.
.
.
这些属性和选项数据模型的设计是个让人头疼的东东,有多种不同的解决方案,有的可以按照纯关系数据库那样来关联,另外也可以用序列化的对象来存储,还有就是可以利用多沉余字段来设计数据表。至于效率也要自己来取舍了,看自己怎么来定了,一但定型程序就要按照数据模型来写了。
2. 促销打折规则的复杂度
2.1 促销打折对象
这个需要对业务有所了解,简单一点的就只有对订单的打折,而不包括单品的打折促销,这样一来,在计算订单总价的时候比较方便。
当然,我们自己要规划好。
2.2 促销打折规则定义
2.2.1 针对订单的规则如下:
2.2.1.1 满额直接优惠
就是说满800,优惠30(即从800里减去30)
2.2.1.2 满额直接折扣
就是说满1500,打9.5折(即优惠 = 1500 * (1 - 0.95) )
2.2.1.3 满额送优惠劵
就是说满5000,送你价值等值人民币500的优惠劵,下次购物,在买单时可以直接当人民币来使用,感觉是不是很诱惑啊。
2.2.1.4 满额赠送物品
就是说满2000送运动水壶一个,或送三峡苕酥一盒,可以让客户自己在下单时候选择
2.2.2 针对单品的规则如下:
2.2.2.1 满件直接折扣
就是说同一件商品,单价是1500,客户同时购买30件,就打9.5折(即优惠 = 1500 * (1 - 0.95) ),就是像批发一样的
有些规则是互相排斥的,就是说不能同时启用的,这个要好好规划一下。
其实针对订单的规则里满额直接优惠和直接折扣是雷同的,只是换了个马甲而已,如果可以的话把直接优惠可以去掉不要的。
哎,商家可谓是机关算尽,就是要你多掏钱,正所谓无商不“精”嘛,呵呵。
三 订单的处理
订单里需要很多的沉余字段,因为商品价格和促销活动是会随时变化的,所以你得把客户下单时的商品当前价格,当前的促销活动给记录下来,以方便统计商品金额。
订单金额处理起来要和自己的促销规则结合起来,不然很容易算错商品金额的。
订单赠品的处理。
好了,分析到此,至于用什么编程语言实现,大家各自爱好了,数据概念模型设计中.................
欢迎指正,互相学习!
如大家要转载,请保留本人的版权:
/*
*Description:PV3D类继承体系结构
*Auther:崇崇-天真的好蓝啊
*MSN:chongchong2008@msn.com
*Blog:chongchong2008
*Dates:2009-06-02
*Copyright:ChongChong2008 YiChang HuBei China
*/
Flex 4 SDK源码浅析!
最近下了Flex 4 SDK (flex_sdk_4.0.0.7219_mpl_src)的源代码
此目录下包含如下相关的几个部分:
1。mx 核心 frameworks,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx
2。rpc frameworks,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> rpc --> src --> mx
3。air framework,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> airframework --> src --> mx
4。皮肤相关,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> haloclassic --> src
一。熟悉Flex SDK
Flex SDK真的很庞大,包罗万象,一开始真的很难入手,不知道从哪里开始读。
首先是熟悉Flex定义的基本接口,把各个接口都看一遍。就是在flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx -->core 里面的基本接口文件,熟悉Flex的UIComponent组件,Container容器,特别是要熟悉Application类(如何与SystemManager类建立联系,组建是如何进入队列,怎样延迟调用)。
熟悉UICommpontent
public function callLater(method:Function,args:Array /* of Object */ = null):void {
methodQueue.push(new MethodQueueElement(method, args));
var sm:ISystemManager = systemManager;
if (sm && (sm.stage || sm.useSWFBridge()))
{
if (!listeningForRender)
{
sm.addEventListener(FlexEvent.RENDER, callLaterDispatcher);
sm.addEventListener(FlexEvent.ENTER_FRAME, callLaterDispatcher);
listeningForRender = true;
}
if (sm.stage)
sm.stage.invalidate();
}
}
熟悉FlexModuleFactory类的运作方式,系统单件类的注册,如何加载模块。
addFrameScript(docFrame, docFrameHandler);
// Frame 1: module factory
// Frame 2: document class
// Frame 3+: extra classes
for (i = docFrame + 1; i < totalFrames; i++){
addFrameScript(i, extraFrameHandler);
}
接下来看Flex定义的管理接口,在flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx -->managers里面,这个要先熟悉,才能知道Application是怎么运行的,这里的东西有些复杂,得认真看。特别是要认真的读SystemManager这块,这块就如同基本接口里的UIComponent一样重要。
还有一些概念要熟悉,需要知道什么是document,swfRoot,sandboxRoot,topLevelSystemManager。
Flex Application 运行:
=======================================================
FlexApplicationBootstrap.as
==================================
package mx.core{
import flash.display.DisplayObject;
import flash.events.Event;
import mx.events.FlexEvent;
[ExcludeClass]
public class FlexApplicationBootstrap extends FlexModuleFactory{
include "../core/Version.as";
public function FlexApplicationBootstrap(){
addEventListener("ready", readyHandler);
super();
}
public function readyHandler(event:Event):void{
removeEventListener("ready", readyHandler);
var o:Object = create();
if (o is DisplayObject){
addChild(DisplayObject(o));
o.dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));
}
}
}
}
=======================================================
FlexModuleFactory.as
=======================================================
package mx.core{
[ExcludeClass]
/**
* @private
*/
public class FlexModuleFactory extends MovieClip implements IFlexModuleFactory, ITextLineCreator{
private static const INIT_STATE:int = 0;
private static const RSL_START_LOAD_STATE:int = 1;
private static const APP_LOAD_STATE:int = 2;
private static const APP_START_STATE:int = 3;
private static const APP_RUNNING_STATE:int = 4;
private static const ERROR_STATE:int = 5;
private static const RSL_LOADING_STATE:int = 6;
public function FlexModuleFactory(){
super();
var rsls:Array = info()["rsls"];
var cdRsls:Array = info()["cdRsls"];
// Put cross-domain RSL information in the RSL list.
var rslList:Array = [];
var n:int;
var i:int;
if (cdRsls && cdRsls.length > 0){
var crossDomainRSLItem:Class = Class(getDefinitionByName("mx.core::CrossDomainRSLItem"));
n = cdRsls.length;
for (i = 0; i < n; i++){
var cdNode:Object = new crossDomainRSLItem(
cdRsls[i]["rsls"],
cdRsls[i]["policyFiles"],
cdRsls[i]["digests"],
cdRsls[i]["types"],
cdRsls[i]["isSigned"]);
rslList.push(cdNode);
}
}
if (rsls != null && rsls.length > 0){
n = rsls.length;
for (i = 0; i < n; i++)
{
var node:RSLItem = new RSLItem(rsls[i].url);
rslList.push(node);
}
}
rslListLoader = new RSLListLoader(rslList);
mixinList = info()["mixins"];
stop();
loaderInfo.addEventListener(Event.COMPLETE, moduleCompleteHandler);
var docFrame:int = totalFrames == 1 ? 0 : 1;
addFrameScript(docFrame, docFrameHandler);
// Frame 1: module factory
// Frame 2: document class
// Frame 3+: extra classes
for (i = docFrame + 1; i < totalFrames; i++)
{
addFrameScript(i, extraFrameHandler);
}
timer = new Timer(100);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
update();
}
public function create(... params):Object
{
var mainClassName:String = info()["mainClassName"];
if (mainClassName == null)
{
var url:String = loaderInfo.loaderURL;
var dot:Number = url.lastIndexOf(".");
var slash:Number = url.lastIndexOf("/");
mainClassName = url.substring(slash + 1, dot);
}
var mainClass:Class = Class(getDefinitionByName(mainClassName));
return mainClass? new mainClass() : null;
}
public function info():Object
{
return {};
}
private function docFrameHandler(event:Event = null):void
{
// Register singleton classes.
// Note: getDefinitionByName() will return null
// if the class can't be found.
Singleton.registerClass("mx.managers::IBrowserManager",
Class(getDefinitionByName("mx.managers::BrowserManagerImpl")));
Singleton.registerClass("mx.managers::ICursorManager",
Class(getDefinitionByName("mx.managers::CursorManagerImpl")));
Singleton.registerClass("mx.managers::IDragManager",
Class(getDefinitionByName("mx.managers::DragManagerImpl")));
Singleton.registerClass("mx.managers::IHistoryManager",
Class(getDefinitionByName("mx.managers::HistoryManagerImpl")));
Singleton.registerClass("mx.managers::ILayoutManager",
Class(getDefinitionByName("mx.managers::LayoutManager")));
Singleton.registerClass("mx.managers::IPopUpManager",
Class(getDefinitionByName("mx.managers::PopUpManagerImpl")));
Singleton.registerClass("mx.resources::IResourceManager",
Class(getDefinitionByName("mx.resources::ResourceManagerImpl")));
Singleton.registerClass("mx.styles::IStyleManager",
Class(getDefinitionByName("mx.styles::StyleManagerImpl")));
Singleton.registerClass("mx.styles::IStyleManager2",
Class(getDefinitionByName("mx.styles::StyleManagerImpl")));
Singleton.registerClass("mx.managers::IToolTipManager2",
Class(getDefinitionByName("mx.managers::ToolTipManagerImpl")));
appReady = true;
// The resources must be installed before update() creates components
// (such as DateChooswer) that might need them immediately.
installCompiledResourceBundles();
update();
if (currentFrame < totalFrames)
deferredNextFrame();
}
private function deferredNextFrame():void
{
if (currentFrame + 1 <= framesLoaded)
{
nextFrame();
}
else
{
// Next frame isn't baked yet, we'll check back...
nextFrameTimer = new Timer(100);
nextFrameTimer.addEventListener(TimerEvent.TIMER,
nextFrameTimerHandler);
nextFrameTimer.start();
}
}
private function extraFrameHandler(event:Event = null):void
{
var frameList:Object = info()["frames"];
if (frameList && frameList[currentLabel])
{
var c:Class;
try
{
c = Class(getDefinitionByName(frameList[currentLabel]));
c["frame"](this);
}
catch(e:Error)
{
}
}
if (currentFrame < totalFrames)
deferredNextFrame();
}
private function timerHandler(event:TimerEvent):void
{
if (totalFrames > 2 && framesLoaded >= 2 ||
framesLoaded == totalFrames)
{
appLoaded = true;
}
update();
}
private function nextFrameTimerHandler(event:TimerEvent):void
{
if (currentFrame + 1 <= framesLoaded)
{
nextFrame();
nextFrameTimer.removeEventListener(TimerEvent.TIMER,
nextFrameTimerHandler);
// stop the timer
nextFrameTimer.reset();
}
}
}
}
二。Flex继承体系
比较重要的类和接口在flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx -->core
1。接口继承体系,从底层接口到高层接口如下:
IFlexDisplayObject --> IBitmapDrawable, IEventDispatcher
IUIComponent --> IFlexDisplayObject
IContainer --> IUIComponent
IDeferredInstantiationUIComponent --> IUIComponent
IButton --> IUIComponent
IBorder
IRectangularBorder -- > IBorder
ILayoutElement --> IEventDispatcher
IID
IRawChildrenContainer
IChildList
IConstraintClient
IDataRenderer
IEmbeddedFontRegistry
IFontContextComponent
IFactory
IFlexModule
IFlexModuleFactory
IInvalidating
IProgrammaticSkin
对flash本身的包装
IDisplayObjectInterface
IInteractiveObjectInterface
IDisplayObjectContainerInterface
内部命名空间
mx_internal
2。类继承体系
FlexSprite --> Sprite
UIComponent --> FlexSprite implements IAutomationObject, IChildList, IConstraintClient,
IDeferredInstantiationUIComponent, IFlexDisplayObject, IFlexModule, IID,
IInvalidating, ILayoutManagerClient, IPropertyChangeNotifier,
IRepeaterClient, IStateClient, IAdvancedStyleClient, IToolTipManagerClient,
IUIComponent, IValidatorListener, IVisualElement, ILayoutElement
Container --> UIComponent implements IContainer, IDataRenderer,
IFocusManagerContainer, IListItemRenderer,
IRawChildrenContainer, IChildList, IVisualElementContainer
LayoutContainer --> Container implements IConstraintLayout
LayoutManager --> EventDispatcher implements ILayoutManager
ClassFactory implements IFactory
全局类:
FlexGlobals
UIComponentGlobals
ContainerGlobals
SystemManagerGlobals
Singleton(Flex单件类,静态类型,很多地方都会引用到)
应用程序相关:
Application --> LayoutContainer
FlexApplicationBootstrap --〉FlexModuleFactory
系统管理相关:
ISystemManager --> IEventDispatcher, IChildList, IFlexModuleFactory
SystemManager --> MovieClip implements IChildList, IFlexDisplayObject, IFlexModuleFactory,
ISWFBridgeProvider, ISystemManager, ITextLineCreator
SystemManagerProxy --> SystemManager
SystemRawChildrenList implements IChildList
拖动管理相关:
IDragManager
DragManagerImpl implements IDragManager
DragManager
DragProxy --> UIComponent
DragSource
DragEvent --> MouseEvent
其他还有ToolTipManager,CursorManager,FocusManager,PopUpManager,LayoutManager,BrowserManager,HistoryManager
三。事件钩子,函数调用队列以及单件
Flex SDK内部大量的用到单件,事件钩子,队列调用。
Singleton.registerClass(
"mx.resources::IResourceManager",
Class(getDefinitionByName("mx.resources::ResourceManagerImpl"))
);
。。。。。未完