这两天在公司给一个客户做个服装类的排序功能,使用的是Access数据库,以前这数据库没怎么用过,
用的最多都是SQL SERVER和Mysql,这次接触觉得果然没SqlServer,但平台方便,绝对的轻量级的!!
项目 结构:C/S 语言:C# 数据库:Access 平台:.net Framewwork2.0
总结一下使用:
1.常用函数
对语法掌控上不少方面都与SQL SERVER不一样,我项目中主要是个字符窜操作函数的控制
StrConv(string,conversion) //string要转换的字符窜 conversion是一种内部转换类型常量
conversion: 1是将字符串文字转成大写、2是小写、3是每个字的开头字母转成大写。。。。还有不少
StrComp(string1,string2[,compare]) 返回整型数值为字符串比较的结果
参数string1 与string2 都是必要的可以是任何有效
的字符串表达式而compare 是可选参数指定字符串比
Access 2000 VBA 一册通
较的类型Compare 的四个常数设置值是
vbUseCompareOption 默认为-1 意义是使用Option
Compare 语句设置执行一个比较VbBinaryCompare 默认
为0 意义是执行一个二进制比较VbTextCompare 默认
为1 执行一个按照原文的比较VbDatabaseCompare 默
认为2 注意仅适用于Microsoft Access 执行一个基于
数据库信息的比较如果string1 小于string2 返回
1 如果string1 等于string2 返回0 如果string1
大于string2 返回1 如果string1 或string2 为Null返回NULL
StrReverse(expression):expression 是一个字符串调用此函数后它的字
符顺序要被反向如果expression 是一个长度为零的字
符串("") 则返回一个长度为零的字符串如果
expression 为Null 则产生一个错误
Left(string,length)两个必要的命名参数 length 表达式指出从左将返回多少个字符
Right(string,length)与Left类似
Mid(string,start,[length])字符窜截取 string要截取的字段 start开始位置 length截取的长度(可选)
InStr([start],string1, string2,[ compare])字符串查找返回integer位置
start开始子搜索的位置 string1是要搜索的字符窜 string2是被搜索的字符串
Len(string) 返回字符窜长度
设置默认日期值函数大全
年Year(Now())
季度DatePart("q",Now())
月Month(Now())
周数 DatePart("ww",Now())
日Day(Now())
星期几DatePart("w",Now(),2)
时Hour(Now())
分Minute(Now())
秒Second(Now())
当前时间Now()
当前日期Date()
2.项目描述
其中最麻烦是显示排序,请看下表
性别 | 型号 | 衣长 | 袖长 | 胸围 | 肩宽 | 备注 | 裤长 | 腰围 | 臀围 | 裤脚 | 裙腰 | 马夹长 |
男 | 70A | 70 | 59-1 | 103 | 48 | |||||||
男 | 70A | 70 | 59 | 103 | 48 | |||||||
男 | 70A | 70 | 59+1 | 103 | 46 | |||||||
男 | 70A | 74-3 | 59 | 103-1 | 47 | |||||||
男 | 70A | 74-3 | 59 | 103-1 | 48 | |||||||
男 | 70A | 74-3 | 59 | 103+2 | 46 | |||||||
男 | 70A | 74-3 | 59 | 103+2 | 46 | |||||||
男 | 70A | 74 | 74+2 | 103 | 46 | |||||||
男 | 70A | 74+1 | 59 | 103 | 46 | 99 | ||||||
男 | 70A | 74+2 | 59-3 | 103-1 | 47 | |||||||
男 | 70A | 76 | 58+1 | 103 | 48 | |||||||
男 | 72A | 74-3 | 59-1.5 | 103-2 | 46-1 | |||||||
男 | 72A | 74-3 | 59-1.5 | 103-2 | 46 | 96 | 72 | 100 | ||||
男 | 72A | 74-2 | 59 | 103-2 | 46 | 100 | ||||||
男 | 72A | 74 | 59+2 | 103 | 46 | 98 | ||||||
男 | 72A | 74+2 | 59+5 | 103 | 46 | 103 | 74 | 108 | 23.5 | |||
男 | 72B | 74-2 | 59 | 107 | 46 | |||||||
男 | 72B | 74-1 | 59 | 107 | 47 | |||||||
男 | 72B | 74 | 59 | 107-2 | 47 | |||||||
男 | 72B | 74 | 59 | 107+2 | 47 | |||||||
男 | 72B | 74 | 59 | 107 | 47 |
都是进行升序排序的。
它是先按型号,然后按衣长,衣长它要先按前面的系数排序 然后在按后面的+或减后的值进行排序,然后是袖长(同一规格衣长,即根据前一项)进行类似衣长的排序,胸围和肩宽也是!
3.具体SQL代码:
SELECT id, name AS 姓名, sex AS 性别, haoxing AS 型号, yichang AS 衣长, xiuchang AS 袖长1, xiongwei AS 胸围1, jiankuai AS 肩宽1, remark1 AS 备注1, kuchang AS 裤长, yaowei AS 腰围, tunwei AS 臀围, kujiao AS 裤脚, remark2 AS 备注2, qunchang AS 裙长, qunyao AS 裙腰, remark3 AS 备注3, majiachang AS 马夹长, xiongwei1 AS 胸围2, remark4 AS 备注4, dayichang AS 大衣长, xiuchang1 AS 袖长2, xiongwei2 AS 胸围3, jiankuai1 AS 肩宽2, remark5 AS 备注5, cheyi AS 衬衣, remark6 AS 备注6
FROM [SELECT id,name,sex,haoxing,
IIf(yichang='' or yichang is null,0,
IIf(InStr(yichang,'+')=0 and InStr(yichang,'-')=0,CDbl(yichang),IIf(InStr(yichang,'+')>0, CDbl(Left(yichang,InStr(yichang,'+')-1))+CDbl(Right(yichang,len(yichang)-InStr(yichang,'+'))),
CDbl(Left(yichang,InStr(yichang,'-')-1))-CDbl(Right(yichang,len(yichang)-InStr(yichang,'-')))))) AS yichang1,
IIf(yichang='' or yichang is null,0,
IIf(InStr(yichang,'+')=0 and InStr(yichang,'-')=0,CDbl(yichang),CDbl(IIf(InStr(yichang,'+')>0,mid(yichang,1,InStr(yichang,'+')-1),mid(yichang,1,InStr(yichang,'-')-1))))) AS yichang2,
yichang,
IIf(xiuchang='' or xiuchang is null,0,
IIf(InStr(xiuchang,'+')=0 and InStr(xiuchang,'-')=0,CDbl(xiuchang),IIf(InStr(xiuchang,'+')>0, CDbl(Left(xiuchang,InStr(xiuchang,'+')-1))+CDbl(Right(xiuchang,len(xiuchang)-InStr(xiuchang,'+'))),
CDbl(Left(xiuchang,InStr(xiuchang,'-')-1))-CDbl(Right(xiuchang,len(xiuchang)-InStr(xiuchang,'-')))))) AS xiuchang1,xiuchang,
IIf(xiuchang='' or xiuchang is null,0,
IIf(InStr(xiuchang,'+')=0 and InStr(xiuchang,'-')=0,CDbl(xiuchang),CDbl(IIf(InStr(xiuchang,'+')>0,mid(xiuchang,1,InStr(xiuchang,'+')-1),mid(xiuchang,1,InStr(xiuchang,'-')-1))))) AS xiuchang2,
IIf(xiongwei='' or xiongwei is null,'0',
IIf(InStr(xiongwei,'+')=0 and InStr(xiongwei,'-')=0,xiongwei,IIf(InStr(xiongwei,'+')>0, CDbl(Left(xiongwei,InStr(xiongwei,'+')-1))+CDbl(Right(xiongwei,len(xiongwei)-InStr(xiongwei,'+'))),
CDbl(Left(xiongwei,InStr(xiongwei,'-')-1))-CDbl(Right(xiongwei,len(xiongwei)-InStr(xiongwei,'-')))))) AS xiongwei1,xiongwei,
IIf(xiongwei='' or xiongwei is null,0,
IIf(InStr(xiongwei,'+')=0 and InStr(xiongwei,'-')=0,CDbl(xiongwei),CDbl(IIf(InStr(xiongwei,'+')>0,mid(xiongwei,1,InStr(xiongwei,'+')-1),mid(xiongwei,1,InStr(xiongwei,'-')-1))))) AS xiongwei2,
IIf(jiankuai='' or jiankuai is null,'0',
IIf(InStr(jiankuai,'+')=0 and InStr(jiankuai,'-')=0,jiankuai,IIf(InStr(jiankuai,'+')>0, CDbl(Left(jiankuai,InStr(jiankuai,'+')-1))+CDbl(Right(jiankuai,len(jiankuai)-InStr(jiankuai,'+'))),
CDbl(Left(jiankuai,InStr(jiankuai,'-')-1))-CDbl(Right(jiankuai,len(jiankuai)-InStr(jiankuai,'-')))))) AS jiankuai1,jiankuai,
IIf(jiankuai='' or jiankuai is null,0,
IIf(InStr(jiankuai,'+')=0 and InStr(jiankuai,'-')=0,CDbl(jiankuai),CDbl(IIf(InStr(jiankuai,'+')>0,mid(jiankuai,1,InStr(jiankuai,'+')-1),mid(jiankuai,1,InStr(jiankuai,'-')-1))))) AS jiankuai2,
remark1,kuchang,yaowei,tunwei,kujiao,remark2,qunyao,qunchang,remark3,majiachang,xiongwei1,remark4,dayichang,xiuchang1,xiongwei2,jiankuai1,remark5,cheyi,remark6
FROM main]. AS [%$##@_Alias]
ORDER BY haoxing, yichang2, yichang1, xiuchang2, xiuchang1, xiongwei2, xiongwei1, jiankuai2, jiankuai1;
看到了没有 几个要排序的字段都有两个临时字段 例如字段yichang而言有yichang1和yichang2,yichang2就是该字段的+或-之前的系数,而yichang1是有+或- 表达式值 所以可以看到order by 那里是先对yichang2排序再对yichang1排序,这样就达到了效果,其它的也类似!
IIf(condition,value1,value2)函数 有点类似于条件表达式,condition为真 显示value1 反之显示value2