DBCHART的使用

来源:互联网 发布:装修精美淘宝店 编辑:程序博客网 时间:2024/05/18 01:37

Delphi(程序人生)

Delphi Programer DoubleCat
导航
博客园
首页
新随笔
联系
订阅 
管理<2008年6月>

日一二三四五六
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

留言簿(2)
给我留言 
查看公开留言 
查看私人留言 
随笔分类
BS(IntraWeb)(8) (rss)
CS(WebService) (rss)
Delphi For .NET(1) (rss)
Delphi报表 (rss)
delphi开发工具使用(49) (rss)
Delphi与ASM (rss)
Indy(网络开发) (rss)
开发陷井(5) (rss)
软件帮助的制作 (rss)
软件加密 (rss)
数据库开发(25) (rss)
专题(4) (rss)
随笔档案
2008年12月 (18) 
2008年9月 (2) 
2008年8月 (1) 
2008年7月 (1) 
2008年6月 (71) 
阅读排行榜
1. Delphi与Ole,Word,Excel,查找与替换等(1113) 
2. Pchar与String的区别 (612) 
3. 问答区(517) 
4. raise抛出异常 (473) 
5. Delphi中的引号(442) 
评论排行榜
1. Delphi中的引号(2) 
2. RAVE Report(2) 
3. ACCESS库(1) 
4. Random(1) 
5. 问答区(1) 
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
统计
随笔 - 93 
文章 - 0 
评论 - 7 
引用 - 0 
最新评论 
关于#号的用法
①# 后面跟一个字符编码可以表示这个字符, 字符编码可以用十进制或十六进制表示;譬如字符 "A" 的编码是 65(十进制) 或 $41(十六进制).
---------------------------------
var
  c: AnsiChar;
begin
  c := #65;
  ShowMessage(c); {A}
  c := #$41;
  ShowMessage(c); {A}
end;
ANSII 编码表参见(http://www.cnblogs.com/28088191/archive/2008/06/13/1220352.html)
--------------------------------
②用 # 也可以表示双字节字符, 所有汉字编码参见(http://www.cnblogs.com/28088191/archive/2008/06/13/1220366.html)
var
  wc: WideChar;
begin
  wc :=# $732B;
  ShowMessage(wc); {猫}
  wc := 29483;
  ShowMessage(wc); {猫}

  {双字节兼容单字节}
  wc := #65;
  ShowMessage(wc); {A}
  wc := #$41;
  ShowMessage(wc); {A}
end;
------------------------------------------
③多个 # 表示的字符连接时, 可以省略 + 号.表示字符相连,这在SQL语句中常用
--------------------------------------------
var
  str: string;
begin
  str := #65 + #66 + #67;
  ShowMessage(str); {ABC}

  str := #65#66#67;
  ShowMessage(str); {ABC}

  str := '猫猫的' + #32 + #68 + #101 + #108 + #112 + #104 + #105 + #32 + '博客';
  ShowMessage(str); {猫猫的 Delphi 博客}

  str := '猫猫的#32#68#101#108#112#104#105#32'博客';
  ShowMessage(str); {猫猫的Delphi 博客}
end;

---------------------------------------
SQL语句中是这样用的:
-------------------------
var SQL:String;
SQL:='Select * From 表 Where 日期字段 Between #' +DateTimeToStr(DateTimePicker1.Date)+'# And #'+DateTimeToStr(DateTimePicker2.Date) +'#';



posted @ 2008-06-13 22:21 DoubleCat 阅读(25) | 评论 (0) | 编辑 
打开网页
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
begin
//用IE打开
ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL);
//用火狐打开
ShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL);
//用默认浏览器打开
ShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL);
end;
//另一种调用IE打开的方法
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
procedure OpenInIE(aURL: string);
var
IE: Variant;
begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Visible := true;
IE.Navigate(aURL);
end;
begin
OpenInIE('www.132435.com');
end;
//第二种方法可以有更多控制
procedure TForm1.Button1Click(Sender: TObject);
procedure OpenInIE(aURL: string); //need uses ComObj;
var
IE: Variant;
begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Visible := true; //可见
IE.left := 0;
IE.top := 0;
IE.height := 600; //高度
IE.width := 800; //宽度
IE.menubar := 0; //取消菜单栏
IE.addressbar := 0; //取消地址栏
IE.toolbar := 0; //取消工具栏
IE.statusbar := 0; //取消状态栏
//IE.resizable := 0; //不允许用户改变窗口大小
IE.Navigate(aURL);
end;
begin
OpenInIE('www.132435.com/blog');
end;

posted @ 2008-06-13 21:53 DoubleCat 阅读(73) | 评论 (0) | 编辑 
With语句创建窗体
//一般写法
var
  MyForm1: TForm1;
begin
  MyForm1 := TForm1.Create(nil);
  MyForm1.ShowModal;
  MyForm1.Free;
end;


//用 with 语句重写
with TForm1.Create(nil) do begin
  ShowModal;
  Free;
end;

posted @ 2008-06-13 21:51 DoubleCat 阅读(30) | 评论 (0) | 编辑 
获取所有汉字与 Unicode 的对照表 
var
  w: WideString;
  i: Integer;
  s: string;
  List: TStringList;
begin
  List := TStringList.Create;

  for i := $4e00 to $9fa5 do
  begin
  s := #36 + IntToHex(i,4); {#36 是 $ 字符}
  w := WideChar(i);
  List.Add(s + '=' + w);
  end;

  List.SaveToFile('c:/temp/Unicode-Hz.txt');
  List.Free;
end;

posted @ 2008-06-13 21:50 DoubleCat 阅读(55) | 评论 (0) | 编辑 
调用Windows的About框
uses ShellAPI;
procedure TForm1.AbortClick(Sender: TObject);
begin
ShellAbout(0, 'MySoft', 'Copyright (c) 2007-2008', Application.Icon.Handle);
end;

posted @ 2008-06-13 21:42 DoubleCat 阅读(18) | 评论 (0) | 编辑 
代码折叠
{$REGION '我的函数'}
...
{ENDREGION} 

posted @ 2008-06-13 21:38 DoubleCat 阅读(49) | 评论 (0) | 编辑 
Delphi注释
①{...}
②(*...*)
③//...
④{$IFDEFF DONTCOMPILEME}...{$ENDIF}


posted @ 2008-06-13 21:35 DoubleCat 阅读(108) | 评论 (0) | 编辑 
Delphi的快截键分类快捷键解释备注





类Escape选择当前组件容器 
Shift + Click选择多个组件;选择窗体 
Tab选择下一个组件 
Shift + Tab选择上一个组件 
方向键选择此方向的下一个组件 
Ctrl + 方向键将所选组件的位置移动 1 个像素 
Shift + 方向键将所选组件的大小改变 1 个像素 
Ctrl + Shift + 方向键将所选组件的位置移动 1 个栅格 
Del删除所选组件 
Ctrl + 鼠标拖动选择一个容器内的多个组件可以一起修改共同属性
Tab(在 Object Inspector 中使用)搜索属性或事件 





类F1; Ctrl + F1光标所在单词的帮助 
Ctrl + Shift + Enter光标所在单词的参考 
Ctrl + Click(标识符)寻找标识符的声明处可配合工具条的:后退/前进
Ctrl + A全选 
Ctrl + C复制 
Ctrl + X剪切 
Ctrl + V粘贴 
Ctrl + S保存 
Ctrl + F查找 
F3; Ctrl + L继续查找 
Ctrl + R替换 
Ctrl + E高级查找 
Ctrl + Shift + F查找文件 
Ctrl + ZUndo 
Del删除选中的代码 
Ctrl + Home到开始 
Ctrl + End到结束 
Ctrl + ←按词左移 
Ctrl + →按词右移 
Ctrl + ↑窗口上滚 
Ctrl + ↓窗口下滚 
Ctrl + PgUp本屏首行 
Ctrl + PgDn本屏尾行 
Alt + G; Ctrl + O + G到指定行 
Ctrl + Shift + 0..9; Ctrl + K + 0..9设置(或取消)书签 
Ctrl + 0..9; Ctrl + Q + 0..9跳到书签 
Ctrl + 空格输入提示 
Ctrl + J代码模版 
Ctrl + Shift + J(选定后)进入同步编辑模式 
Ctrl + Shift + 空格重新提示参数列表 
Ctrl + K + T选定光标前的单词 
Ctrl + N插入新行和 Enter 的区别是光标位置不变
Shift + 方向键/Home/End/PgUp/PgDn扩选 
Shift + Alt + 方向键/Home/End/PgUp/PgDn区域选择 
Shift + Alt + PgUp/PgDn区域选择 
Ctrl + Shift + Alt + PgUp/PgDn区域选择 
Ctrl + Shift + PgUp/PgDn区域选择 
Ctrl + Shift + 水平方向键按单词扩选 
Ctrl + O + C变换选区 
Ctrl + O + I变换选区 
Ctrl + O + L变换选区 
Ctrl + O + K恢复选区的变换选区 
Alt + 左键拖动区域选择区域选择的东西,粘贴也是区域
Ctrl + O + L选择当前行 
Ctrl + Y删除当前行 
Ctrl + Shift + Y删除行右边部分 
Ctrl + T向右删除词 
Ctrl + BackSpace向左删除词 
Ctrl + K + W将文本块写入文件 
Ctrl + K + R读入文本块 
Ctrl + K + C文本再制 
Ctrl + K + N代码转大写 
Ctrl + K + O代码转小写 
Ctrl + K + F代码转大写, 并取消选择 
Ctrl + K + E代码转小写, 并取消选择 
Ctrl + O + U改变光标后面的字母大小写 
Ctrl + Shift + I; Ctrl + K + I右移代码块 
Ctrl + Shift + U; Ctrl + K + U左移代码块 
Ctrl + I似Tab 
Ctrl + M似Enter 
Ctrl + N似Enter,但光标位置不变 
Ctrl + Enter打开光标所在单词的文件光标在对象观察器时进入代码编辑
Alt + ]/[查找本组定界符 
Ctrl + Shift + V把选定的字符声明为变量 
Ctrl + Alt + ↓光标从声明区跳到代码区 
Ctrl + /注释与取消注释 
Ctrl + Shift + R录制(开始/停止)宏 
Ctrl + Shift + P播放宏 
Ctrl + Shift + T加入TO DO注释 
Alt + V + i打开 TO DO List 
Ctrl + Shift + C类自动生成可以反向
Ctrl + Shift + ↑/↓从接口到实现; 到程序第一行 
Ctrl + Shift + G为接口加入新的GUID 
Ctrl + Alt + PgUp第一个函数 
Ctrl + Alt + PgDn最后一个函数 





类Shift + F12查找窗体 
Alt + F12窗体与窗体代码切换 
Ctrl + F12查找模块 
Alt + F11查找自定义uses模块 
Ctrl + F11打开工程 
Ctrl + Alt + F11打开或激活 Project manager 
F12代码窗口/窗体之间切换 
Ctrl + Alt + F12已打开单元的列表 
F11对象观察器/代码窗口/窗体切换 
Alt + 0窗口列表 
Alt + PgUp/PgDn Code/Design/History 切换 
Ctrl + Alt + F11工程管理器 
Shift + Alt + F11打开或激活 Structure 
Ctrl + Alt + PTool Palette 
Ctrl + Alt + LLocal Variables 窗口 
Ctrl + F5; Ctrl + Alt + WWatch List 窗口 
Ctrl + Alt + TThreads 窗口 
Ctrl + F7Evaluate/Modify 窗口 
Alt + F8Message 窗口 
Alt + 0Window List 窗口 
Ctrl + BBuffer List 窗口 
Ctrl + Alt + BBreakpoint 窗口 
Ctrl + F3; Ctrl + Alt + SCall Stack 窗口 
Ctrl + Alt + VEvent Log 窗口 
Ctrl + Alt + FFPU 窗口调试时有效
Ctrl + Alt + CCPU 窗口调试时有效
Ctrl + Alt + MModules 窗口 
Ctrl + Shift + AFind Unit 窗口 
Ctrl + Shift + F11Project Options 窗口 
Ctrl + Q + W到下一个信息窗口 
F10; Ctrl + F10使菜单获得焦点 
Shift + F10; Alt + F10同鼠标右键 
Ctrl + Down在对象观察器中, 下拉该窗体的组件列表 
Alt + Down在对象观察器中,下拉属性列表 
Tab + 输入搜索对象观察器的属性或事件列表 
Ctrl + Enter在对象观察器中, 切换属性值 
Ctrl + Tab属性/事件切换; 在代码窗口中是已打开的窗口切换 
Shift + F11添加工程窗口 
Ctrl + F4关闭打开的窗口,但不关闭项目 
Alt + F4关闭程序 



类F4运行到光标位置 
F5设置/取消断点 
F7调试,进入子过程 
Shift + F7Trace into next source line 
F8调试,不进子过程(除非有断点) 
Shift + F8Run until return 
F9运行 
Ctrl + F9编译工程 
Shift + F9; Alt + P + B编译 DLL 
Ctrl + Shift + F9Run without debugging 
Ctrl + O + O插入编译选项 


posted @ 2008-06-13 21:28 DoubleCat 阅读(26) | 评论 (0) | 编辑 
ASCII 码对照表 
  ASCII值 控制字符 注释
0NUT 
1SOH标题开始
2STX正文开始
3ETX正文结束
4EOT传输结束
5ENQ询问字符
6ACK承认
7BEL报警
8BS(Backspace)退格
9HT横向制表
10LF换行
11VT垂直制表
12FF走纸控制
13CR(Enter)回车
14SO移位输出
15SI移位输入
16DLE空格
17DCI设备控制1
18DC2设备控制2
19DC3设备控制3
20DC4(Caps Lock)设备控制4(大写锁定)
21NAK否定
22SYN空转同步
23ETB信息组传送结束
24CAN作废
25EM纸尽
26SUB换置
27ESC换码
28FS文字分隔符
29GS组分隔符
30RS记录分隔符
31US单元分隔符
32space空格
33! 
34" 
35# 
36$ 
37% 
38& 
39' 
40( 
41) 
42* 
43+ 
44, 
45- 
46. 
47/ 
480 
491 
502 
513 
524 
535 
546 
557 
568 
579 
58: 
59; 
60< 
61= 
62> 
63? 
64@ 
65A 
66B 
67C 
68D 
69E 
70F 
71G 
72H 
73I 
74J 
75K 
76L 
77M 
78N 
79O 
80P 
81Q 
82R 
83X 
84T 
85U 
86V 
87W 
88X 
89Y 
90Z 
91[ 
92/ 
93] 
94^ 
95_ 
96` 
97a 
98b 
99c 
100d 
101e 
102f 
103g 
104h 
105i 
106j 
107k 
108l 
109m 
110n 
111o 
112p 
113q 
114r 
115s 
116t 
117u 
118v 
119w 
120x 
121y 
122z 
123{ 
124| 
125} 
126~ 
127DEL删除


posted @ 2008-06-13 21:25 DoubleCat 阅读(43) | 评论 (0) | 编辑 
GroupBy的用法

GroupBy的用法


 

Group By 是分组,当字段中有一样的记录时,用Group By 后,只会出现一条记录,这在做同类统计的时候特有效,

如:统计所有的大类销售,这时就必须用Group By


 

Select 酒水大类, Sum(价格) as [销售] From 点单表 Group By 酒水大类 Order By 销售



posted @ 2008-06-13 16:54 DoubleCat 阅读(77) | 评论 (0) | 编辑 
Decision控件 

Decision控件 

1,Delphi中提供了大量的决策图表控件

Decision->决策,决断

Cube->立方体

Chart->图表

Series->系列

TeeChart->T型图表

Gallery->图库

Axis->轴线

Gradient->渐变

Legend->图例 传奇


 

Delphi7中

TChart组件---------->Additional

TDBChart组件----------->Data Controls

Decision Cube组件组里有一整套

TVTChart->ActiveX

ChartFx->ActiveX 

 

图表(Chart)组件的属性绝大多数一样,用法也一样

1,去掉Chart的3D效果 View3D->False

2,标题文字 Title->Text 有字体属性

3,底部文字 Foot->Text 有字体属性

4,去掉轴线->AxisVisible->false

5,BottomAxis RightAxis LeftAxis TopAxis->上下左右的坐标线

6,Frame->Mode->区域色与底色的模式

7,Frame->Style->边框样式

8,Gradient->渐变设置

9,很多属都可在双击Chart进行设置

10,MaxPointsPerPage->每页中容纳的最大数据量->如果为0则表示全部数据都装在一页中,当显示的数据较多时,要设这个属性,只有设了这个属性,才能把数据分页显示!

---------------------------------------------

设置这些就可以得到一个带渐变的Panel

------------------------------------------------------

如何动态增加一个图表? 

 

注意:TChart, TDBChart只是一个图表的容器控件,继承自Panel,而真正的图表是一个不可视的类

-----------------------------------------------------------------------------------------

定义条型(反映不同数据的变化情况,如,每月,每天销售的各大类情况,哪类销售最多,那类销售最少)  

var a:TBarSeries;

定义饼型(主要用于不同数据所占的比例,如销售中,各大类的销售情况)

var a:TPieSeries;

定义折线型(反映同一数据的变化,如每天,每月的销售变化, 这样可以看出,哪天,哪月的销售情况最好,最不好)

var a:TLineSeries

注意必须引用Series


 

如何给一个图表赋值并显示在Chart中???


 

procedure TForm1.Button2Click(Sender: TObject);
var
  a:TLineSeries;
begin
  a:=TLineSeries.Create(a);
  Chart1.AddSeries(a);
  a.AddArray([1,3,5,9,4,2])
end;


 

如何在已显示出来的图表中增加数据?


 

方法1

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chart1.Series[0].AddXY(12,20,'新加的',clLime);

//12->X轴的坐标 20->Y轴的坐标 Clime是颜色
   
end;


 

方法2

procedure TForm1.Button3Click(Sender: TObject);
begin
  Chart1.Series[0].Add(14,'打印机',clTeeColor);
  Chart1.Series[0].Add(18,'主板',clTeeColor);
  Chart1.Series[0].Add(23,'显示器',clTeeColor);

end;


 

如何动态改变图表背景的渐变


 

procedure TForm1.Button4Click(Sender: TObject);
begin
  Chart1.Gradient.Visible:=True;
  Chart1.Gradient.EndColor:=clTeal;
  Chart1.Gradient.StartColor:=clWhite;
end;


 

如何让数据块以不同颜色显示(除了TPieSeries是以不同颜色显示数据块外,其它的默认都是红色),并动态改变标题与页角及Y坐标的标题


 

procedure TForm1.Button5Click(Sender: TObject);
begin
  Chart1.Series[0].ColorEachPoint:=True; //数据块不同色
  Chart1.LeftAxis.Title.Caption:='产品销售表';//Y坐标标题
  Chart1.Title.Text.Clear;
  Chart1.Title.Text.Add('哪个月份的销售记录');//图表标题
  Chart1.Foot.Text.Add('图表的说明文字'); //页脚内容
end;

 

效果如下:



 


 

数据太多了,想翻页显示怎么做?


 

1,设置Chart->MaxPointsPerPage(每页的最大数据量)->只有设置了这个置才可能分页,如果是0表示,全部数据都在一页上

2,可以使用点击左右坐标进行上下翻页也可以点击鼠标的左右键进行翻页
-----------------
procedure TForm1.Chart1ClickBackground(Sender: TCustomChart;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then Chart1.NextPage;
  if Button=mbRight then Chart1.PreviousPage;
end; 

 

如何标显特殊数据(当点特殊数据时以不同颜色进行显示)


 

procedure TForm1.Chart1ClickSeries(Sender: TCustomChart;
  Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Series.ValueColor[ValueIndex]:=clRed;
end; 

 

动态图表分析技术


 

DBChart

-------------------------------

动态图表的连接方式分2种

①手工方式连接数据库

②运用DBChart属性,在动行时动态连接数据库

---------------------------------------

1,DBChart对于数据是只图的,所以他连接数据库表,关不是直接挂连ACCESS组件,而是直接连接DataSet,Table,Query,ClientDataSet这样的数据集组件

2,首先要设好数据据组件的连接,再设置DBChart与数据组件连接

方法如下:

①双击DBChart->Series->设置标题,X的数据,Y(Bar)的数据



②,如果是在动行时设置是设置是设置DBChart的如下属性

DBChart->DataSet

DBChart->XLabelSource

DBChart->XValues

DBChart->YValues

----------------------------

procedure TForm1.Button3Click(Sender: TObject);
begin
  DBChart1.Series[0].DataSource:=ADODataSet1;
  DBChart1.Series[0].XLabelsSource:='酒水名称';
  DBChart1.Series[0].XValues.ValueSource:='单价';//写的都是字段名称
  DBChart1.Series[0].YValues.ValueSource:='单价';
end;

----------------------------------------



如何让DBChart自动更新数据显示 

 

1,手动更新需设置DBChart->AutoRefresh->Rrue或False

2,自动更新设置DBChart->RefreshInterval的值,以秒为单位,每隔多少秒更新一次数据


 

如何刷新当前图表? 

 

如果要刷新当前图表而不是所有图表,可以用DBChart->RefreshDataSet过程

如:

DBChart1.RefreshDataSet(ADOQuery1,DBChart.Series[0]);


posted @ 2008-06-13 16:47 DoubleCat 阅读(327) | 评论 (0) | 编辑 
DBGRID列描红

DBGRID列描红(用于特殊数据行的显示,不因RowSelect->True而改变) 

 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
  procedure Drawnumber;
  var
  TextWidth:Integer;
  TextHeigh:Integer;
  begin
  DBGrid1.Canvas.Brush.Color := clRed;
  DBGrid1.Canvas.FillRect(Rect);
  DBGrid1.Canvas.Font.Color := clWhite;
  //设置数据重画位置
  TextWidth := DBGrid1.Canvas.TextWidth(Column.Field.AsString);
  TextWidth := Rect.Left+(Rect.Right-Rect.Left)-TextWidth-3;
  TextHeigh := DBGrid1.Canvas.TextHeight(Column.Field.AsString);
  TextHeigh := Rect.Top+(Rect.Bottom-Rect.Top-TextHeigh) div 2;
  DBGrid1.Canvas.TextOut(TextWidth,TextHeigh,Column.Field.AsString);
  end;
  procedure DrawText(Field:TField;Rect:TRect);
  var
  TextWidth:Integer;
  TextHeigh:Integer;
  Leng:Integer;
  begin
  Leng := DBGrid1.Columns[2].Width+1;
  Rect.Right := Rect.Left;
  Rect.Left := Rect.Left-leng;

  DBGrid1.Canvas.Brush.Color := clRed;
  DBGrid1.Canvas.FillRect(Rect);
  DBGrid1.Canvas.Font.Color := clWhite;
  //设置数据重画位置
  TextWidth := Rect.Left+1;
  TextHeigh := DBGrid1.Canvas.TextHeight(Field.AsString);
  TextHeigh := Rect.Top+(Rect.Bottom-Rect.Top-TextHeigh) div 2;
  DBGrid1.Canvas.TextOut(TextWidth,TextHeigh,Field.AsString);
  end;
begin
  if (Drawing) and (DataCol = 3) and
  (Column.Field.DataSet.FieldByName('Subject').AsString = ComboBox1.Text) then
  begin
  case ComboBox2.ItemIndex of
  0:begin
  if Column.Field.AsInteger > StrToInt(Edit1.Text) then
  begin
  Drawnumber;
  DrawText(Column.Field.DataSet.FieldByName('Subject'),Rect);
  end;
  end;
  1:begin
  if Column.Field.AsInteger < StrToInt(Edit1.Text) then
  begin
  Drawnumber;
  DrawText(Column.Field.DataSet.FieldByName('Subject'),Rect);
  end;
  end;
  2:begin
  if Column.Field.AsInteger = StrToInt(Edit1.Text) then
  begin
  Drawnumber;
  DrawText(Column.Field.DataSet.FieldByName('Subject'),Rect);
  end;
  end;
  end;
  end
  else
  begin
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

procedure TForm1.GetSubject;
var
  i:Integer;
begin
  with DMFrm.ADOCommand do
  begin
  Active := False;
  CommandText := 'Select Subject From StudentGrade_Tab Group By Subject';
  Active := True;
  ComboBox1.Clear;
  for i:=0 to RecordCount-1 do
  begin
  ComboBox1.Items.Add(FieldByName('Subject').AsString);
  Next;
  end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetSubject;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if (ComboBox1.Text <> '') and
  (ComboBox2.Text <> '') and
  (Edit1.Text <> '') then
  begin
  Drawing := True;
  DBGrid1.Refresh;
  end;
end; 

 
 

posted @ 2008-06-13 16:38 DoubleCat 阅读(42) | 评论 (0) | 编辑 
单条件多字段查询

单条件多字段查询


 

procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  i:Integer;
begin
  if Edit1.Text = '' then
  Exit;
  Accept := False;
  for i := 0 to DataSet.Fields.Count-1 do
  begin
  if Pos(UpperCase(Edit1.Text),UpperCase(DataSet.Fields[i].AsString)) > 0 then
  begin
  Accept := True;
  Break;
  end;
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ADODataSet1.Filtered := False;
  ADODataSet1.Filtered := True;
end; 

 

建议在要频凡使用查询且数据集中的数据不是很大的情况下,用DataSet组件,或Tabe给组,把所有数据读到内存中,用过滤,或定位的方法查询数据

这样做的好处是快,不会像SQL那样,产生很多临时Buff文件,如果用SQL语句的方式,会很快的数据库增大.特别是ACCESS库,最后不得已,再去压缩库. 

posted @ 2008-06-13 16:33 DoubleCat 阅读(95) | 评论 (0) | 编辑 
DBGRID标题排序上放↑ 

DBGRID标题排序上放↑ 

 
procedure TF_StockReport.FlatDBGrid1TitleClick(Column: TColumn);
var
  TheTitleName:string;
begin
  if DM.GoodsInfo.IsEmpty then Exit;
  TheTitleName:=Column.Title.Caption;
  if Pos('↑',TheTitleName)>0 then begin
  DM.GoodsInfo.SQL.Clear;
  DM.GoodsInfo.SQL.Add('Select * From 商品信息 Order By '+StringReplace(TheTitleName,'↑','',[rfReplaceAll]));
  DM.GoodsInfo.Open;
  Column.Title.Caption:=StringReplace(Column.Title.Caption,'↑','↓',[rfReplaceAll]);
  end;
  if Pos('↓',TheTitleName)>0 then begin
  DM.GoodsInfo.SQL.Clear;
  DM.GoodsInfo.SQL.Add('Select * From 商品信息 Order By '+StringReplace(TheTitleName,'↓','',[rfReplaceAll])+' DESC');
  DM.GoodsInfo.Open;
  Column.Title.Caption:=StringReplace(Column.Title.Caption,'↓','↑',[rfReplaceAll]);
  end;
end; 
------------------------------------------------------------------------------------ 

posted @ 2008-06-13 16:31 DoubleCat 阅读(166) | 评论 (0) | 编辑 
关联表查询 

关联表查询 

 

关联表查询有如下二种方法,

①内关联,

②外关联

关联表查询,首先有个条件,就是,二个表中必须要有一个字段的属性,与值是相同的,其核心思想,就是把二个表中有关系的数据合并成一个表

1,内关联

Select A.人员姓名,B.人员工资 From 表A(人员信息表),表B(工资表) Where A.人员编号=B.人员编号

B表中可以没有人员姓名,只有人员编号,这样得出的合并表为:人员表B中,人员编号改显为人员姓名

2,外关联

分为,左关联,右关联,全关联

①左关联 Lefe Join 

  左关联是以左侧数据表为基表(A它的数据全列出),以后每一行中的数据为条件,列出右表(B)中的数据 ,如果B中没有A表中的数据,将以Null代表B表中的数据

如:

Select A.人员姓名,B.人员工资 From 表A(人员信息表) Left Join B表(工资表) On A.工号=B.工号

说明,这里的 Left Join, Right Join 是以 Join这个关键字来区分那个表为基表

②全关联 Full Join这个最没意思 与 Select *,* From A,B Where A.ID=B.ID一样,做一个笛卡尔查询


 

共性,

这种的共性,

1,Select 后面必须要有二个表的字段 From 后面也必须 跟上二个表名,

2,内关联中,以Select 表字段的顺序 最好和 From 中的表顺序一样,这样,就以先写的表为基本进行查询

内关联表中有个优点,就是,B,中没有A中的条件时,A中的记录也不显出来 

 

DoubleCat

posted @ 2008-06-13 16:30 DoubleCat 阅读(93) | 评论 (0) | 编辑 
SQL如何向应用程序发送消息? 

SQL如何向应用程序发送消息? 

 

  RaisError('出错拉!来自SQL-Server',16,1)

这是的16表示级别,可以更改,1表示状态,可以更改,后面二个数,必须写! 

 

这个函数,在结合触发器使用时,当库存少于多少,就向应用程序提出一个报警,很好用

当某些字段或值不许更改时,也可以向应用程序报告消息

posted @ 2008-06-13 16:29 DoubleCat 阅读(51) | 评论 (0) | 编辑 
SQL处理方案数据处理方案

SQL处理方案数据处理方案


 

数据处理方案分2种:

①应用程序数理处理方案,这种是数常用的,处理数据主要使用数据库控件及代码实现

②SQL数据处理方案,数据处理的大部分工作放在SQL服务器,使用触发器,存储过程等,应用程序主要向SQL服务器发送调用叁数


 

1,Delphi中能执行存储过程的控有二种

①StoredProc 这类组件BDE里有,DBG里有,DBExpress也有 

②Query类型组件,同样,BDE里有,DBG里有,DBExpress里也有

Query,StroProc是调用有返回值和无返回值的都可以,StroProc用起来要比Query方便些,必竟他是专门用于执行存储过程的,它会自动读入存储过程所需要传入的叁数,


 

如果要执行有返回数据集的视图,只能用Query类的组件,其实视图与表的用法是一样的,Select * From 视图文件 

 

如何用Query,StoredProc组件去执行一个存储过程呢?


 

下面是一个用存储过程增加记录的例子

存储过程代码如下:
--------------------------------------
CREATE PROCEDURE ADDMENU(@ID VARCHAR(10),@WINENAME VARCHAR(20)) AS
BEGIN
  Set NoCount On
  Insert Into 菜单 (酒水编号,酒水名称) Values (@ID,@WINENAME)
  Set NoCount Off
END
GO
---------------用Query来执行是这样子的(必须动态传入叁数)------------------------------------------------

应用程序中用ADOQuery来执行这个存储过程(不要去给ADOQuery->Parameters设叁数名称)
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('ADDMENU;1:@ID,:@WineName');//存储过程名称后面加上(;1),后面跟的就是要传入的叁数
  ADOQuery1.Parameters.ParamByName('@ID').Value := Edit1.Text;//为叁数赋值
  ADOQuery1.Parameters.ParamByName('@WINENAME').Value := Edit2.Text;
  ADOQuery1.ExecSQL;
end;
------------------用StroedProc是这样子的(可以动态也可以静态)--------------------------------------------------
  ADOStoredProc1.Parameters.ParamByName('@ID').Value:=Edit1.Text;
  ADOStoredProc1.Parameters.ParamByName('@WINENAME').Value:=Edit2.Text;
  ADOStoredProc1.ExecProc;
----------------------------------------------------------------------------

 

 

再出一个例子

存储过程代码如下(返回A+B的值):
CREATE PROCEDURE HaHa (@a int , @b int, @c int OutPut) 
AS 
begin
 Select @c = @a + @b
end
GO
-----------------动态设置StroedProc叁数,并调用存储过程的方法-------------------------------------------------------------
procedure TForm1.Button3Click(Sender: TObject);
var
  s : string;
begin
  //-----写入第1个叁数----------
  ADOStoredProc1.ProcedureName:='HaHa;1'; //改变存储过程名称
  ADOStoredProc1.Parameters.Clear;//清除叁数
  ADOStoredProc1.Parameters.AddParameter;//叫用增加叁数过程
  ADOStoredProc1.Parameters[0].Name:='@a';//设置叁数名称
  ADOStoredProc1.Parameters[0].DataType:=ftInteger;//叁数的数据类型
  ADOStoredProc1.Parameters[0].Direction:=pdInput;//出叁还是入叁
  //-----写入第2个叁数----------
  ADOStoredProc1.Parameters.AddParameter;
  ADOStoredProc1.Parameters[1].Name:='@b';
  ADOStoredProc1.Parameters[1].DataType:=ftInteger;
  ADOStoredProc1.Parameters[1].Direction:=pdInput;
  //-----写入第3个叁数----------
  ADOStoredProc1.Parameters.AddParameter;
  ADOStoredProc1.Parameters[2].Name:='@c';
  ADOStoredProc1.Parameters[2].DataType:=ftInteger;
  ADOStoredProc1.Parameters[2].Direction:=pdInputOutput;
  //------给叁数赋值---------------
  ADOStoredProc1.Parameters.ParamByName('@a').Value:=12;
  ADOStoredProc1.Parameters.ParamByName('@b').Value:=13;
  ADOStoredProc1.ExecProc;
  ShowMessage(VarToStr(ADOStoredProc1.Parameters.ParamByName('@c').Value));
end;
---------Query调用有返回叁数的存储过程只能动态设置叁数,方法如下-----------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  c:Variant;
begin
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('HaHa;1 :@a,:@b,:@c output');//注意如果是出叁一定要在动态设置叁数时,指明它是出叁,默认的都是入叁
  ADOQuery2.Parameters.ParamByName('@a').Value:=12;
  ADOQuery2.Parameters.ParamByName('@b').Value:=13;
  ADOQuery2.ExecSQL;
  c := ADOQuery2.Parameters.ParamByName('@c').Value;
  ShowMessage(VarToStr(c));
end;


 



posted @ 2008-06-13 16:28 DoubleCat 阅读(59) | 评论 (0) | 编辑 
SQLServer如何建立内存表

SQLServer如何建立内存表


Select * Into 内存表名 From 表


 




 

select * into #HaHa From 菜单 //建立内存表,如果后面加个Where 1=2的话,只在内存中建立一个表结构
select * from #HaHa //读取内存表
Drop Table #HaHa //删除内存表,否则只有等应用程序退出才会自动删除


 

 

 

posted @ 2008-06-13 16:28 DoubleCat 阅读(183) | 评论 (0) | 编辑 
SQL的触发器

SQL的触发器


 

触发器是什么?做什么用的?怎么用?

---------------------------------------------------------------------

1,触发器是附在表上,或视图上的一种特殊的存储过程,当表或视图发生,数据更新,增加数据,删除数据时自动执行的一个过程

2,触发器不用调用,它自动执行,它仅执行在SQL服务器上,不执行在DELPHI的应用程序中

-----------------------------------------------------------------------

如何创建触发器?

-------------------------------------------------------------------------

Create Trigger 触发器名 On 表名 For [Insert,Update,Delete] //使用中不要[]号,里面的内容可以选1个,也可以选3个中间用(,)隔开

语句

 

-----------特定的列不许更改----------------------- 

如果更新酒水名称列,将回滚事务
-------------------------------------
CREATE Trigger TheDelete On 菜单 For Delete,Update,Insert As 
   
  if Update(酒水名称) RollBack Transaction
-------------------------------------

 

----------------------特定行中的特中值不可更改-----------------------
 Declare @TheID Char(10)
Select @TheID = 酒水编号 From Deleted
if @TheID = '1805' begin
  RollBack Transaction  
end 
-----------------------------------------------------------------

其实这二个事务可以写在一起,代码如下
-------------------------------------------------
CREATE Trigger TheDelete On 菜单 For Delete,Update,Insert As 
   
  if Update(酒水名称) RollBack Transaction
 Declare @TheID Char(10)
Select @TheID = 酒水编号 From Deleted
if @TheID = '1805' begin
  RollBack Transaction  
end 
-----------------------------------------------------
触发器的另一种应用就是当更改某列的值时,触发另一个表的计算工作,或本表的计算工作.

如:当销售数量更变时,自动减少库,并计算库存金额可以用下面的变通方法

触发器代码如下
-------------------------
CREATE Trigger TheDelete On 菜单 For Delete,Update,Insert As 
 if Update(单价) begin
  Update 菜单 Set 单价 = 单价*2 Where 单价=(Select 单价 From Inserted)
end
--------------------------

----------------------------------------------------------------------

对上表的代码做个说明
---------------------------------

事实上,SQL-Server2000会为每个触发器创建2个专用表①Deleted表②Inserted表,他们存放在内存中,它们保存着变更记录的原始数据信息(所有字须都保存),这二个表的结构总是与触发器作用的表结构相同,当触发器用完成时,与这个触发器相关的内存表Deleted表与Inserted就会自动删除,

①Deleted表:如果是Insert触发器,当Delete操作发生时,表中存放着要删除的数据行,如果是Update触发器,当进行Update操作时,表中存放着更新前的记录行

②Inserted表:如果是Insert触发器,当Insert操作发生时,表中放着待Insert的新数据行,如果是Update触发器,当进行Update操作时,表中存放着更新后的记录行 

注意,没有Updated这个内存表!

------------------------------------------

DoubleCat

posted @ 2008-06-13 16:27 DoubleCat 阅读(55) | 评论 (0) | 编辑 
SQL的游标

SQL的游标


 

什么是游标?游标是做什么用的?怎么用?

-----------------------------------------------------------------------------------------------

1,其实Select 返回的结果集是一个数据表视图,这个视图是没有记录指针的,如果要改变其中的值,只能对这个视图中的数据全体改变

游标,本质上就是数据视图的记录指针

如,A表中价格字段中,大于20的全部打9折,小于20的,打8折,怎么办呢?

二种办法

①用DDL语句

  Update 菜单 Set 单价=单价*0.8 Where 单价<20 

 Update 菜单 Set 单价=单价*0.9 Where 单价>20 

②用Select 语句采用游标

代码如下

declare @Price Money//定义变量

Declare TheCursor Cursor For Select 单价 From 菜单 For Update Of 单价//这里定义这个游标是在哪个视图上是做什么用的?
Open TheCursor//打开游标

Fetch From TheCursor InTo @Price //取游标中的数据,(取记录指针所指的整条记录)

While @@Fetch_Status =0 //如果记录指针没到尾部
begin
  if @Price<20 begin
  Update 菜单 Set 单价=@Price*0.8 Where Current Of TheCursor //更新当前记录指针所指的数据
  end 

  if (@Price>20) and (@Price<100) begin
  Update 菜单 Set 单价=@Price*0.9 Where Current Of TheCursor  
  end
Fetch Next From TheCursor InTo @Price//记录指针向下走一行
end

Close TheCursor//关掉记录指针(关闭游标)
DeAllocate TheCursor//释放游标

-------------------------------------------------------------------------------------------------

1,记住,游标是附在数据视图上的,就像记录指针附在数据表视图上一样

2,使用视图是件很麻烦的事情,虽然他一次可以全搞定,而用DDL语句要二次才搞定,其实用DDL语言也可以一次搞定

Update 菜单 Set 单价=单价*0.8 Where 单价 Between 1 and 20 or 单价 between 21 and 100

-------------------------------------

DoubleCat

 

posted @ 2008-06-13 16:26 DoubleCat 阅读(46) | 评论 (0) | 编辑 
Select语句

Select语句


 

1,选择部份列

  Select 列,列 From 表

注意,最后一列不要加','号

----------------------------------------

2,产生新的空列

Select '空列',列 From 表

注意:空列要用引号引起来,默认的情况下,列值与列名同

如:select '空列'='Hello' From 菜单

---------------------------------------------

3,相同数据类型的列可以加起来



Select 列+列 From 表

这样会产生一个新列,列值为二个列加来,可以字串,也可以数字

--------------------------------------------------

4,更改列名

select 新列名=旧列名, 新列名=旧列名 From 表



Select 旧列名 As 新列名, 旧列名 As 新列名 From 表

---------------------------------------------------------------

5,不显示重复行

Select Distinct * From 表

6,列出前多少行

Select TOP 100 * From 表 TOP后面最大为4294967295=DWORD=Cardinal

也可以这样,前5行,且不重复

select Distinct Top 5 * From 菜单

注意:多开关中间用空格隔开

------------------------------------------------------------------

7,查询介于某一范围内的数据

Select * From 表 Where 字段 Between 50 And 100

注意:可以查询数字,也可以查询字串,一般Between后写较小的, And 后面写较大的

----------------------------------------------------------------------

在这里也可以于>= <= <>等罗辑表达式

-----------------------------------------------------------------------------

8,IN 条件,用于查询属于某集合的数据

Select * From 表 Where 字段 In (11,22,33,100)

当然也可以用字串字段,In条件用于多条件选择查询是有特效,比字段=值好用

-------------------------------------------------------------------------------

9,Like条件

Select * From 表 Where 字段 Like '%-----%';

Select * From 表 Where 字段 Not Like '%-----%';

注意: Like后面是一个单引号引起的字串

----------------------------------------------------------------------------

10.多表关联查询

Select Distinct 帐单表.帐单号,点单表.酒水名称,点单表.数量,点单表.价格 From 帐单表,点单表 Where 帐单表.帐单号 = 点单表.帐单号 and 点单表.价格>30 Order by 帐单表.帐单号

这里是有条件的,

1,表 A 与 表 B 必须要有一个字段类型是一样的,且有相同的数据,

查询中,最少有一个是A表的字段,有一个是B表的字段

这样的结果是,产生一个,动态传入SQL语句的主从表合集,

Where 条件中,把相等的字段关联起来

------------------------------------------------------------------------------

11,Order By 子句

Order By 可以对多列进行排序,列之间用(,)隔开,默认是ASC(升序排列),如果要用DESC(降序)要用工指定

----------------------------------------------------------------------------------

12.Group By 分组子句

很少使用Group By,

Group By的作用是:把From 子句(前面的列名)中的关系按分组属性划分为若干组,同一组内所有记录在分组属性上具有相同的值.用Gropu By + Having 可以不使用 Where 条件语句

如:

Select A,B,C,D From 表 Goup By A,B,C,D Having D='Hello';

如果这个语句中不用Group 那么Having 相当于Where

-------------------------------------------------------------------------------------------

13,Select InTo

如:

Select * InTo A From B Where 1=2;

这样A表的数据结构与B是一样的,A表无记录

-------------------------------------------------------------------------------

14,删除表

Drop Table A

------------------------------------------------------------------------------

15,嵌套Select

原理,Select 本身就是从数据集或数据视图上产生一个数据视图,

Select (Select 字段 From A表 Where 唯一条件) 列名,(Select 字段 From B表 Where 唯一条件) 列名 (这后面不要加 Where条件)

这样就从A表,B表中的2个列产生一个新表且只有一条记录,(注意,子查询中的记录必须是唯一)

如:

select (Select col002 from temp2 where col001='350000') 省 ,(Select Col002 From Temp2 where col001='350400') 市 ,(Select Col002 From Temp2 where col001='350429') 区 

posted @ 2008-06-13 16:25 DoubleCat 阅读(68) | 评论 (0) | 编辑 
SQL-Server2000的存储过程 

SQL-Server2000的存储过程 


 

 

SQL-Server2000是有函数的,不过仅限于自定义函数和系统函数,要让Delphi使用SQL-Server2000中的方法必须写成存储过程,存储过程,其实指的就是用自定义的方法,当然可以有返回值,也可以没有返回值.


 

函数的写法

CREATE Function aa (@a int , @b int) Returns int As//这里是Returns 不是Return
begin
  Return @a + @b //这里才是Return
end//不要在这里加分号

---------------------------------------------------

存储过程的写法(带输入叁数与返回值)

CREATE PROCEDURE HaHa (@a int , @b int, @c int OutPut) //叁数表用()号引起来,叁数表中默认是进叁
AS //如果要做输出叁数 必须在叁数后面加上 
begin //OutPut
 Select @c = @a + @b //存储过程的赋值是用Select方法赋值
end
GO

------------------------------------------

调用这个过程的方法

1,DBG->ADOStoredProc1设置好它的连接

2,ADOStoredProc1->ProcedureName设置他要执行的存储过程名,设好后,ADOStoredProc1->Parameters属

性中自动会把存储过程的使用到的参数读过来

Delphi中的为存储过程的入叁赋值及取出叁的值代码如下

---------------------------------------------------------------


  ADOStoredProc1.Parameters.ParamByName('@a').Value:=12;
  ADOStoredProc1.Parameters.ParamByName('@b').Value:=13;
  ADOStoredProc1.ExecProc;
  ShowMessage(IntToStr(ADOStoredProc1.Parameters.ParamByName('@c').Value));

---------------------------------------------------------------

 

下面是一个用SQL-Server2000的存储过程取得SQL-Server2000服务器的时间,这个方法,在做时间同步时很有用,如所有工作站都要同步成一个时间,无论在局哉网软件中还是C/S软件中,都有很广的用途

存储过程的写法如下

---------------------------

CREATE PROCEDURE GetServerDateTime ( @DateTime DateTime OutPut) AS
begin
  Select @DateTime=GetDate()
end;
GO

------------------------------

调用的方法如下

-------------------------------

//---这是一个同步SqlServer服务器的时间,使用有工作站都和服务器同一日期时间
procedure TDM.SynchronizationDateTime;
var
TheServerDateTime:TDateTime;//定义服务器时间
TheLocalDateTime:_SystemTime;//定义本地系统时间
Year,Month,Day:Word;//定义年月日
Hour,Min,Sec,MSec:Word;//定义时分秒毫秒
begin
  Synchronization.ExecProc;
  TheServerDateTime:=Synchronization.Parameters.ParamByName('@DateTime').Value;
  DecodeDate(TheServerDateTime,Year,Month,Day);//分解服务器年月日
  DecodeTime(TheServerDateTime,Hour,Min,Sec,MSec);//分解服务器时间
  //-------设定本地系统时间
  TheLocalDateTime.wYear:=Year;
  TheLocalDateTime.wMonth:=Month;
  TheLocalDateTime.wDay:=Day;
  TheLocalDateTime.wHour:=Hour;
  TheLocalDateTime.wMinute:=Min;
  TheLocalDateTime.wMilliseconds:=MSec;
  SetlocalTime(TheLocalDateTime);//更改本地系统时间
end;

-------------------------------

注意:存储过程只能执行DDL语句,如果要返回数据集结果就不能用存储过程,存储过程的最大用处是对整个数据表中的数据进行调整.

posted @ 2008-06-13 16:24 DoubleCat 阅读(120) | 评论 (0) | 编辑 
SQL中的数据类型

SQL中的数据类型


 

字符

①Char->固定长度非UNICODE字符最大8000字符

②NChar->固定长度UNICODE最大4000字符

③VarChar->可变长度非UNICODE字符最大8000字符

④NVarChar->可变长度UNICODE最大4000字符

-------------------------------------------------------

文本

①Text,NText->文本,Memo用

-----------------------------------------------------

图像

Image

-----------------------------

Int->整型

SmallInt->-32767-32768

TinyInt->0..255

BigInt=Int

Real实数

Float浮点>Real

Decimal(number)->整型<Int

Money->货币

-----------------------------------------

日期

DateTime->日期/时间(精确到3.33毫秒)

SmallDateTime->日期/时间(精确到分钟)

posted @ 2008-06-13 16:24 DoubleCat 阅读(16) | 评论 (0) | 编辑 
SQL函数

SQL函数


 

STR->把日期,数字等字段,转为字串字段



select Str(单价,8,2) from 点单表 

1,8->长度

2,2->2位小数

当然也可以

select Str(单价) from 点单表 

这样无小数位数,长度默认为10


 

Convert()->转换函数,当然它不只是转成字串也可以转成其它的

如:

Select Convert(varchar(10),GetDate(),20);

--------------------------------------------

select Convert(varchar(10),单价,3) from 菜单


 

LEFT->返回字串字段左边的个数,

如:

select LEFT(拼音,2) from 菜单

这里的2表示返回字符的个数为2个,如果是中文返回二个汉字

RIGHT->返回字段字串右边字符个数,在做身份证后6位为密码时特有效用法与LEFT一样


 

LEN->返回字串字段的长度,不算右边空格,汉字为汉字个数,字个在做统计字数,或接字数查找有特效

如:

select *, 拼音长度=LEN(拼音) from 菜单

注意:*号与新字段(拼音长度)中间用','隔开


 

REVERSE->把字串字段中的字串,按字符反转->ABC变为CBA,我一般把它用于简单的加密,如把用户名,反转后,再计算注册码符不符

如:

select *, REVERSE(拼音) from 菜单


 

LOWER

UPPER

把字串字段中的字符转成大字或转成小写

如:把整个字段中的字符全部转成小写

Update 菜单 Set 拼音=LOWER(拼音)


 

 

LTrim->去掉字串字段左边的空格

RTrim->去掉字串字段的右边空格,这个在应用程序中常用,否则,出现右边出现大量空格

注意:没有Trim函数,


 

 

SQL中如何定义变量?

Declare @变量名 数据类型

给变量赋值方法如下

Set @变量名 = 值

如:

declare @i int;这里的';'号(行结束符可有可无)
set @i = 12;
select @i;//用Select 显示出来

-----------------------------------------------------

declare @s Varchar(20)
set @s = 'Hello Word'
select @s

-------------------------------------------------


 

 

Power->次方



select power(4,5)

--------------------------

ABS->绝对值

如:

select ABS(-12.4)

--------------------------

PI->圆周率

---------------------------

FLOOR->不大于某数的最小整数

---------------------------------------

SQUARE->开平方

---------------------------------------

GetDate()->返回当前日期,除Delphi外,函数名后面必须带()号

---------------------------------------------------------------------

posted @ 2008-06-13 16:23 DoubleCat 阅读(35) | 评论 (0) | 编辑 
SQL-Server的数据文件

SQL-Server的数据文件


 

一个SQL-Server数据库至少需要二个文件

1,MDF文件->存放数据库表,索引,存储过程,游标,触发器等数据库对像信息,我叫他主数据文件

MDF=MastDataFile

2,LDF文件->存放数据库事务日志

LDF=LogDataFile


 

DoubleCat

posted @ 2008-06-13 16:21 DoubleCat 阅读(10) | 评论 (0) | 编辑 
SQL聚合函数

SQL聚合函数


 

AVG->求平均值

Select 新列名=AVG(数值字段) From 表

注意:Select 后面不要加 * 号

如:

select AVG=AVG(单价) from 点单表

重复的值只计算一次的方法

如:

select AVG=AVG(DISTINCT 单价) from 点单表

注意:DISTINCT与字段名之间要用空格隔开

同样在Select 语句中也可以使用 DISTINCT 条件


 

注意:使用聚合函数Select 后面一律不加*号


 

SUM->它的用法与AVG一样,只是用于统计数字字段的和


 

COUNT->也可以用DISTINCT 用于统计有多少条记录


 

MIN MAX->用于求数字字段中的最小值与最大值


 

DoubleCat

posted @ 2008-06-13 16:21 DoubleCat 阅读(330) | 评论 (0) | 编辑 
SQL更改记录

更改记录(更新已存在的记录数据)


 

Update 表名 Set字段名=值,字段名=值 Where 条件表达式 and 条件表达式

注意:

1,Update 后面不要加*号

2,必须指定条件表达式,否则,整个字段中的值将会全部被改掉

3,要更改的字段用 字段名=字段值 的方式,更改多字段中间用','号隔开

如:

update 点单表 Set房台名称='天津',酒水名称='Haha' Where 房台名称='重庆' and 酒水名称='水果圣代'


 

DoubleCat

posted @ 2008-06-13 16:20 DoubleCat 阅读(130) | 评论 (0) | 编辑 
删除指定记录

删除指定记录


 

Delete From 表名 Where 条件表达式

注意:

1,必须加条件表达式,否则,删除所有记录

2,Delete 后面不要加*,也不要加字段名称

只有Select语句才要指定字段名称,其它的都不要


 
DoubleCat 

posted @ 2008-06-13 16:18 DoubleCat 阅读(31) | 评论 (0) | 编辑 
清空表

清空表


 

1,Truncate Table 表名 (注意这里要写上Table)

2,Delete From 表名  

 (注意表名后面不要加条件语句Where)

(Delete 后面不要加* Select 后面必须加*)


 

对表的清空,Truncate Table 表名 要比 Delete From 表名 更有效

DoubleCat 

posted @ 2008-06-13 16:17 DoubleCat 阅读(59) | 评论 (0) | 编辑 
Insert增加数据

Insert增加数据

 

Insert Into 表名 (字段名,字段名) Values (值,值) 

在这里Into可以写也可以不写,列名与列值都得用()号包含起来,中间用Values隔开,

最少要一个列与一个列值,字串值要用引号引起来

如:

insert 帐单表 (帐单号,房台名称) values (1001,'重庆')


 

DoubleCat QQ:28088191

posted @ 2008-06-13 16:16 DoubleCat 阅读(24) | 评论 (0) | 编辑 
ToDo及代码定位的使用

书签ToDo与代码定位

 

每次开发前应该有个计划先建立程序框架,先做什么、后做什么;最后检查完成情况。


定义ToDo ->Ctrl+Shift+T

打开ToDo列表->Alt+V+I 


 

书签的作用是当代码很长,在书写时,又跑去定义全局变量或申明数据类型时,让你快速回到原来的编写处

定义书签->Ctrl+Shift+数字

定位书签->Ctrl+数字


 

方法的定义部份与方法实现部份切换

Ctrl+Shift+↑或↓


 

Ctrl+空格->显示类变量的成员信息


 

Ctrl+J->叫出代码模板


 

Ctrl+Shift+U->代码块前移Tab位

Ctrl+Shift+I->代码块后移Tab位



posted @ 2008-06-13 16:12 DoubleCat 阅读(38) | 评论 (0) | 编辑 
Pchar与String的区别 

Pchar与String的区别 

 

PChar 串是以 Null 结束的, 或者说是以 "空字节" 结束的;

PChar 串见到 "空字节" 就认作结束了;

"空字节" 在 Delphi 中可以用 #0 或 Chr(0) 来表示. 
//举例:
var
pc: PChar;
begin
pc := 'ABCD' + #0 + 'EFGHIJKLMNOPQRSTUVWXYZ';
ShowMessage(pc); {ABCD}
end;


posted @ 2008-06-13 16:11 DoubleCat 阅读(612) | 评论 (0) | 编辑 
raise抛出异常 

raise抛出异常 

 
//例1:
begin
  raise Exception.Create('抛出异常');
end;


//例2:
begin
  raise Exception.CreateFmt('%s %d', ['错误代码:', 999]);
end;


//例3:
var
  exc: Exception;
begin
  exc := Exception.Create('发现异常');
  raise exc;
end;

posted @ 2008-06-13 16:10 DoubleCat 阅读(473) | 评论 (0) | 编辑 
GoTO语句

GoTo语法

 
procedure TForm1.Button1Click(Sender: TObject);
var
  x: Integer;
  label n1,n2,n3,4; //goto的标签可以是标识符, 也可以是0..9999的数字
begin
  x := 0;
  goto n3;
  n1: x := x+1;
  n2: x := x+2;
  n3: x := x+3;
  4: x := x+4;
  ShowMessage(IntToStr(x)); //返回7而不是10
end;
其实Case语句本质上就是GoTo语句 

posted @ 2008-06-13 16:09 DoubleCat 阅读(115) | 评论 (0) | 编辑 
DupeString重复字串 与StringOfChar的区别 

DupeString重复字串 与StringOfChar的区别 

 
StringOfChar 是反复 "字符" 成 "字符串" 的函数;

DupeString 是反复 "字符串" 成 "新字符串" 的函数;

StringOfChar 来自 System 单元, 可以直接使用;

DupeString 来自 StrUtils 单元, 使用时需要 uses StrUtils;

如果仅仅是反复 "字符", 当然应该用 StringOfChar , 它是用汇编代码实现的, 速度会稍好一些.

下面是测试代码: 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses StrUtils; {DupeString 来自这个单元}
procedure TForm1.FormCreate(Sender: TObject);
var
str: string;
begin
str := System.StringOfChar('A', 5);
ShowMessage(str); {AAAAA}
str := StrUtils.DupeString('A', 5);
ShowMessage(str); {AAAAA}
str := StrUtils.DupeString('ABC', 5);
ShowMessage(str); {ABCABCABCABCABC}
end;
{如果只是反复字符, StringOfChar 肯定会更快一些; 速度测试:}
procedure TForm1.Button1Click(Sender: TObject);
var
t1,t2: Cardinal;
i: Integer;
begin
t1 := GetTickCount;
for i := 0 to 1000000 do DupeString('A', 5);
t1 := GetTickCount - t1;
t2 := GetTickCount;
for i := 0 to 1000000 do StringOfChar('A', 5);
t2 := GetTickCount - t2;
ShowMessageFmt('DupeString: %d; StringOfChar: %d', [t1,t2]);
end;
end.


posted @ 2008-06-13 16:09 DoubleCat 阅读(97) | 评论 (0) | 编辑 
For循环

For循环


 


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
  Button1: TButton;
  Button2: TButton;
  Button3: TButton;
  Button4: TButton;
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  procedure Button3Click(Sender: TObject);
  procedure Button4Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  List: TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
  List := TStringList.Create;
  List.Add('aaa');
  List.Add('bbb');
  List.Add('ccc');
  List.Add('ddd');
end;


// for 循环的一般用法
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  for i := 0 to List.Count - 1 do
  begin
  s := List[i];
  ShowMessage(s);
  end;
end;


//还有这样用的
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  for i := 0 to Pred(List.Count) do
  begin
  s := List[i];
  ShowMessage(s);
  end;
end;


//还是 for in 最方便
procedure TForm1.Button3Click(Sender: TObject);
var
  s: string;
begin
  for s in List do
  begin
  ShowMessage(s);
  end;
end;


//反向
procedure TForm1.Button4Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  for i := List.Count - 1 downto 0 do
  begin
  s := List[i];
  ShowMessage(s);
  end;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  List.Free;
end;

end.


 

原创粉丝点击