Matthew的Blog

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

2008年4月16日 #

http://blog.sina.com.cn/yesdzn
posted @ 2008-04-16 14:43 matthew 阅读(252) | 评论 (0)编辑 收藏

2007年7月18日 #

uses
  ComObj, ActiveX;

var
  ID: TGUID;
  S: string;
begin
  if CoCreateGuid (Id) = s_OK then
  begin
    s := GUIDToString (Id);
  end;
end;
posted @ 2007-07-18 13:48 matthew 阅读(477) | 评论 (0)编辑 收藏

2006年7月26日 #

可用来管理你的代码和文章,可插入图片及OLE对象;内建提醒功能。
(压缩包内未提供数据库,第一次使用时将可执行文件解压到一个目录,运行Collector.exe,此时系统会提示创建数据库,按OK就可以了 )

下载地址:
http://www.cnitblog.com/Files/gffnxk/Collector.rar
posted @ 2006-07-26 15:20 matthew 阅读(704) | 评论 (3)编辑 收藏

TRANSFORM 语句  
创建交叉表查询。

语法
TRANSFORM aggfunction
selectstatement
PIVOT pivotfield [IN (value1[, value2[, ...]])]

TRANSFORM 语句包含以下部分:

部分 说明
aggfunction 操作所选数据的 SQL 聚合函数。
selectstatement SELECT 语句。
pivotfield 希望用于创建查询结果集中列标题的字段或表达式。
value1,value2 用于创建列标题的固定值。


说明
使用交叉表查询汇总数据时,将从作为列标题的指定字段或表达式中选择值,以便能够以一种比使用选择查询更紧凑的方式来查看数据。

TRANSFORM 是可选的,但被包括时则是 SQL 字符串中的第一个语句。它在 SELECT 语句之前以指定作为行标题的字段,在 GROUP BY 子句之前以指定行分组方法。您也可以包含其他子句(如 WHERE),以指定其他选择或排序条件。还可以在交叉表查询中使用子查询作为谓词,特别是在 WHERE 子句中。

pivotfield 中返回的值作为查询结果集中的列标题。例如,在交叉表查询中如果依据月销售量来透视销售数据,将会创建 12 个列。可以约束 pivotfield 以便从可选 IN 子句中所列出的固定值(value1,value2)内选择标题。也可以包含固定值用于没有数据来创建其他列的情况。

举例
TRANSFORM Sum(Score.score) AS score之总计
SELECT Score.Name, Sum(Score.score) AS [总计 score]
FROM Score
GROUP BY Score.Name
PIVOT Score.subject;

posted @ 2006-07-26 14:54 matthew 阅读(1395) | 评论 (1)编辑 收藏

1. 对应SQL Server的 CharIndex 函数
InStr
举例:select instr('asasdfasdf', 'fa')
返回值为6.
2. 对应SQL Server的SubString函数
MID
举例:SELECT MID('ABCDEFG', 2, 3)
返回值为BCD
3. 类型转换
每个函数都可以强制将一个表达式转换成某种特定数据类型。 
 
语法 
CBool(expression) 
 
CByte(expression) 
 
CCur(expression) 
 
CDate(expression) 
 
CDbl(expression) 
 
CDec(expression) 
 
CInt(expression) 
 
CLng(expression) 
 
CSng(expression) 
 
CStr(expression) 
 
CVar(expression) 
 
CStr(expression) 
 
必要的  expression  参数可以是任何字符串表达式或数值表达式。 
 
返回类型 
函数名称决定返回类型,如下所示: 
 
函数  返回类型  expression  参数范围   
CBool    Boolean  任何有效的字符串或数值表达式。   
CByte    Byte  0  至  255。   
CCur  Currency  -922,337,203,685,477.5808  至922,337,203,685,477.5807。   
CDate  Date  任何有效的日期表达式。   
CDbl  Double    负数从  -1.79769313486231E308  至  -4.94065645841247E-324;正数从  4.94065645841247E-324  至  1.79769313486232E308。   
CDec  Decimal  零变比数值,即无小数位数值,为   
+/-79,228,162,514,264,337,593,543,950,335。对于  28  位小数的数值,范围则为   
+/-7.9228162514264337593543950335;最小的可能非零值是  0.0000000000000000000000000001。   
CInt  Integer  -32,768  至  32,767,小数部分四舍五入。   
CLng  Long  -2,147,483,648  至  2,147,483,647,小数部分四舍五入。   
CSng  Single  负数为  -3.402823E38  至  -1.401298E-45;正数为  1.401298E-45  至  3.402823E38。   
CStr  String  依据  expression  参数返回  Cstr。   
CVar  Variant  若为数值,则范围与  Double  相同;若不为数值,则范围与  String  相同。   

说明 
如果传递给函数的  expression  超过转换目标数据类型的范围,将发生错误。 
 
通常,在编码时可以使用数据类型转换函数,来体现某些操作的结果应该表示为特定的数据类型,而不是缺省的数据类型。例如,当单精度、双精度或整数运算发生的情况下,使用  CCur  来强制执行货币运算。 
 
应该使用数据类型转换函数来代替  Val,以使国际版的数据转换可以从一种数据类型转换为另一种。例如,当使用  Ccur  时,不同的小数点分隔符、千分位分隔符和各种货币选项,依据系统的区域设置都会被妥善识别。 
 
当小数部分恰好为  0.5  时,Cint  和  CLng  函数会将它转换为最接近的偶数值。例如,0.5  转换为  0、1.5  转换为  2。Cint  和  CLng  函数不同于  Fix  和  Int  函数,Fix  和  Int  函数会将小数部分截断而不是四舍五入。并且  Fix  和  Int  函数总是返回与传入的数据类型相同的值。 
 
使用  IsDate  函数,可判断  date  是否可以被转换为日期或时间。Cdate  可用来识别日期文字和时间文字,以及落入可接受的日期范围内的数值。当转换一个数字成为日期时,是将整数部分转换为日期,小数部分转换为从午夜起算的时间。 
 
CDate  依据系统上的区域设置来决定日期的格式。如果提供的格式为不可识别的日期设置,则不能正确判断年、月、日的顺序。另外,长日期格式,若包含有星期的字符串,也不能被识别。 
 
CVDate  函数也提供对早期  Visual  Basic  版本的兼容性。CVDate  函数的语法与  CDate  函数是完全相同的,不过,CVDate  是返回一个  Variant,它的子类型是  Date,而不是实际的  Date  类型。因为现在已有真正的  Date  类型,所以  CVDate  也不再需要了。转换一个表达式成为  Date,再赋值给一个  Variant,也可以达到同样的效果。也可以使用这种技巧将其他真正的数据类型转换为对等的  Variant  子类型。 
 
#############注意  CDec  函数不能返回独立的数据类型,而总是返回一个  Variant,它的值已经被转换为  Decimal  子类型
 
posted @ 2006-07-26 14:46 matthew 阅读(1603) | 评论 (0)编辑 收藏

2006年7月5日 #

 

unit ExcelController;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, DateUtils, ComObj;
type
  TExcelController 
=  class(TComponent)
  private
    FxlsApp, FWorkBook: variant;
    HaveCreate: 
boolean ;
    FCenterHeaderText: string;
    FCenterFooterText: string;
    FCaption: TCaption;
    
function  BaseNtoChar(n: integer): string;
    
function  NumberToCol(n: integer): string;
    procedure SetCenterHeaderText(const Value: string);
    procedure SetCenterFooterText(const Value: string);
    procedure SetCaption(const Value: TCaption);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy;
    procedure MergeCell(Cell1, Cell2: string) ; overload;
    procedure MergeCell(Row1, Col1, Row2, Col2: integer); overload;
    procedure SetSheetName(S: string);
    procedure AddSheet;
    procedure WriteCell(ARow, ACol: integer; AValue: OleVariant);
    
function  GetCellValue(ARow, ACol: integer): string;
    procedure CopySheet(FromSheetIndex, ToSheetIndex: integer);
    procedure CopyRange(SourceRange: variant; ToCell: string);
    procedure SetSheetIndex(I: integer);
    procedure DeleteCol(Col: integer);
    procedure DeleteRow(Row: integer);
    
function  GetCellName(ARow, ACol: integer): string;
    
function  GetRange(Cell1, Cell2: string): variant; OverLoad;
    
function  GetRange(Row1, Col1, Row2, Col2: integer): variant; OverLoad;
    procedure SetRangeFontName(ARange: variant; FontName: string);
    procedure SetRangeFontSize(ARange: variant; FontSize: integer);
    procedure SetRangeFontColor(ARange: variant; FontColor: TColor);
    procedure SetColWidth(ACol: integer; Width: integer);
    procedure SetBorderStyle(Range: variant; LineStyle: integer);
    procedure SetRangeRowHeight(Range: variant; Height: integer);
    procedure Show;
  published
    
// 标题
    property Caption: TCaption read FCaption write SetCaption;
  end;

implementation

{ TExcelController }

procedure TExcelController.AddSheet;
begin
  FxlsApp.Sheets.Add;
end;

function  TExcelController.BaseNtoChar(n: integer): string;
var
  S: string;
begin
  
case  n of
    
1 :S: = 'A'; 2 :S: = 'B'; 3 :S: = 'C'; 4 :S: = 'D'; 5 :S: = 'E'; 6 :S: = 'F'; 7 :S: = 'G';
    
8 :S: = 'H'; 9 :S: = 'I'; 10 :S: = 'J'; 11 :S: = 'K'; 12 :S: = 'L'; 13 :S: = 'M'; 14 :S: = 'N';
    
15 :S: = 'O'; 16 :S: = 'P'; 17 :S: = 'Q'; 18 :S: = 'R'; 19 :S: = 'S'; 20 :S: = 'T';
    
21 :S: = 'U'; 22 :S: = 'V'; 23 :S: = 'W'; 24 :S: = 'X'; 25 :S: = 'Y'; 26 :S: = 'Z';
  end;
  Result :
=  S;
end;

procedure TExcelController.CopyRange(SourceRange: variant; ToCell: string);
begin
  SourceRange.Copy;
  FxlsApp.Range[ToCell].PasteSpecial;
end;

procedure TExcelController.CopySheet(FromSheetIndex, ToSheetIndex: integer);
begin
  Self.SetSheetIndex(FromSheetIndex);
  FxlsApp.ActiveSheet.UsedRange.Copy;
  Self.SetSheetIndex(ToSheetIndex);
  FxlsApp.ActiveSheet.Range['A1'].PasteSpecial;
end;

constructor TExcelController.Create(AOwner: TComponent);
begin
  FxlsApp :
=  CreateOleObject( 'Excel.Application' );
  FWorkBook :
=  CreateOleobject('Excel.Sheet');
  FWorkBook :
=  FxlsApp.WorkBooks.Add;
  HaveCreate :
=  True;
  inherited Create(AOwner);
end;

procedure TExcelController.DeleteCol(Col: integer);
begin
  FxlsApp.Columns[Col].Delete;
end;

procedure TExcelController.DeleteRow(Row: integer);
begin
  FxlsApp.Rows[Row].Delete;
end;

destructor TExcelController.Destroy;
begin
  
if  HaveCreate then
  begin
    FWorkBook.Close;
    FxlsApp.Quit;
  end;
end;

function  TExcelController.GetCellName(ARow, ACol: integer): string;
var
  S: string;
begin
  S :
=  Self.NumberToCol(ACol);
  Result :
=  S  +  IntToStr(ARow);
end;

function  TExcelController.GetCellValue(ARow, ACol: integer): string;
begin
if  not HaveCreate then Exit;
  Result :
=  VarToStr(FxlsApp.Cells.Item[ARow, ACol]);
end;

function  TExcelController.GetRange(Row1, Col1, Row2, Col2: integer): variant;
var
  Cell1, Cell2: string;
begin
  Cell1 :
=  Self.GetCellName(Row1, Col1);
  Cell2 :
=  Self.GetCellName(Row2, Col2);
  Result :
=  Self.GetRange(Cell1, Cell2);
end;

function  TExcelController.GetRange(Cell1, Cell2: string): variant;
begin
  Result :
=  FxlsApp.Range[Cell1  +  ':'  +  Cell2];
end;

procedure TExcelController.MergeCell(Row1, Col1, Row2, Col2: integer);
var
  S1, S2: string;
begin
  S1 :
=  Self.GetCellValue(Row1, Col1);
  S2 :
=  Self.GetCellValue(Row2, Col2);
  Self.MergeCell(S1, S2);
end;

procedure TExcelController.MergeCell(Cell1, Cell2: string);
var
  S: string;
begin
  S :
=  Cell1  +  ':'  +  Cell2;
  FxlsApp.Range[S].HorizontalAlignment :
=   3 ;
  FxlsApp.Range[S].merge;
end;

function  TExcelController.NumberToCol(n: integer): string;
var
  S: string;
  x: integer;
begin
  
if  n  <=   26  then
  begin
    Result :
=  Self.BaseNToChar(n);
    Exit;
  end;
  
if  n  <=   52  then
  begin
    x :
=  n  -   26 ;
    Result :
=  'A' + Self.BaseNToChar(x);
    Exit;
  end;
  
if  n  <=   78  then
  begin
    x :
=  n  -   52 ;
    Result :
=  'B' + Self.BaseNToChar(x);
    Exit;
  end;
  
if  n  <=   104  then
  begin
    x :
=  n  -   78 ;
    Result :
=  'C' + Self.BaseNToChar(x);
    Exit;
  end;
  
if  n  <=   130  then
  begin
    x :
=  n  -   104 ;
    Result :
=  'D'  +  Self.BaseNToChar(x);
    Exit;
  end;
end;

procedure TExcelController.SetBorderStyle(Range: variant; LineStyle: integer);
begin
  Range.Borders.LineStyle :
=  LineStyle; 
end;

procedure TExcelController.SetCaption(const Value: TCaption);
begin
  FCaption :
=  Value;
  FxlsApp.Caption :
=  Value;
end;

procedure TExcelController.SetCenterFooterText(const Value: string);
begin
  
end;

procedure TExcelController.SetCenterHeaderText(const Value: string);
begin

end;

procedure TExcelController.SetColWidth(ACol, Width: integer);
begin
  FxlsApp.Columns[ACol].ColumnWidth  :
=  Width;
end;

procedure TExcelController.SetRangeFontColor(ARange: variant;
  FontColor: TColor);
begin
  ARange.Font.Color :
=  FontColor;
end;

procedure TExcelController.SetRangeFontName(ARange: variant; FontName: string);
begin
  ARange.Font.Name :
=  FontName;
end;

procedure TExcelController.SetRangeFontSize(ARange: variant; FontSize: integer);
begin
  ARange.Font.Size :
=  FontSize;
end;

procedure TExcelController.SetRangeRowHeight(Range: variant; Height: integer);
begin
  Range.Rows.RowHeight :
=  Height;
end;

procedure TExcelController.SetSheetIndex(I: integer);
begin
  FxlsApp.WorkSheets[I].Activate;
end;

procedure TExcelController.SetSheetName(S: string);
begin
  FxlsApp.ActiveSheet.Name :
=  S;
end;

procedure TExcelController.Show;
begin
  FxlsApp.Visible :
=  True;
end;

procedure TExcelController.WriteCell(ARow, ACol: integer; AValue: OleVariant);
begin
  FxlsApp.Cells(ARow, ACol) :
=  AValue;
end;

end.
posted @ 2006-07-05 17:28 matthew 阅读(570) | 评论 (0)编辑 收藏

2006年6月6日 #

参考SQL Server联机丛书的 sp_renamedb与sp_rename

一、更改数据库名

sp_renamedb
更改数据库的名称。

语法
sp_renamedb 
[  @dbname =  ]   ' old_name '  ,
    
[  @newname =  ]   ' new_name '

参数
[ @dbname = ]   ' old_name '

是数据库的当前名称。old_name 为 sysname 类型,无默认值。

[ @newname = ]   ' new_name '

是数据库的新名称。new_name 必须遵循标识符规则。new_name 为 sysname 类型,无默认值。

返回代码值
0 (成功)或非零数字(失败)

权限
只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行 sp_renamedb。

示例
下例将数据库 accounting 改名为 financial。

EXEC  sp_renamedb  ' accounting ' ' financial '

 

二、更改表名或列名

sp_rename  [  @objname =  ]   ' object_name '  ,
    
[  @newname =  ]   ' new_name '
    
[  , [ @objtype =  ]   ' object_type '  ]

/////////////////////////////////////////////
A. 重命名表
下例将表 customers 重命名为 custs。

EXEC  sp_rename  ' customers ' ' custs '

B. 重命名列
下例将表 customers 中的列 contact title 重命名为 title。

EXEC  sp_rename  ' customers.[contact title] ' ' title ' ' COLUMN '
posted @ 2006-06-06 09:41 matthew 阅读(3337) | 评论 (0)编辑 收藏

2006年6月5日 #

//将某个近件的名称及Caption存到数据库中的某个表中,当取Caption时从这个表读取就行了
ADOConnection属性:指定当前的数据连接
TableName属性:就是上述存放Caption的表,如以下数据

ID Frm_Nme Ctrl_Nme Txt_CN Txt_TW Txt_EN
1 frmMain frmMain 人力资源管理系统 人力資源管理系統 Human Resource Management System
3 frmNewDept frmNewDept 新增/编辑部门资料 新增/編輯部門資料 Add/Edit Department information
4 frmNewDept Label1 部门名称 部門名稱 Department Name
5 frmNewDept btnOK 确定 确定 OK
6 frmNewDept btnCancel 取消 取消 Cancel
7 frmDepartment frmDepartment 部门资料管理 部門資料管理 Department Management
8 frmDepartment tbNewComp 新建公司 新建公司 Create Company
53 DM ads_countryCountry_Nme 国籍 國籍 Country
54 DM ads_titletitle_Nme 职务 職務 Title
55 DM ads_levelLevel_Nme 级别 級別 Level

LanguageField是指当前系统要抓取的语言字段,如果是简体中文,按上表应该就是Txt_CN,如果是繁体中文,则为Txt_TW
组件提供两个方法来设置控件的文本属性
//设置窗口上控件的文本属性
procedure SetControlCaption(theForm: string);
//设置DataModule里的每一个字段的显示文本。(我习惯将数据相关的组件放在TDataModule里)
procedure SetFieldDispLabel(ADM: TDataModule);
//********************调用代码*************************//
//窗口的调用
procedure TBaseForm.FormCreate(Sender: TObject);
begin
  DM.MultiLang.SetControlCaption(Self.Name);
end;
//DataModule的调用
procedure TDM.DataModuleCreate(Sender: TObject);
begin
  MultiLang.LanguageField := GetSysLanguage;
  ADOConnection.Connected := True;
  MultiLang.SetFieldDispLabel(Self);
end;
//****************************************************//

//控件源码如下:
unit MultiLang;

interface

uses
  SysUtils, Classes, DB, ADODB, Forms, Dialogs, Controls, Menus, ExtCtrls;

type
  TMultiLang = class(TComponent)
  private
    FADOConnection: TADOConnection;
    FTableName: string;
    FLanguageField: string;
    FFormName: string;
    procedure SetFormName(const Value: string);
    procedure SetLanguageField(const Value: string);
    procedure SetTableName(const Value: string);
    procedure SetADOConnection(const Value: TADOConnection);
    { Private declarations }
  protected
    { Protected declarations }
    function GetValue(Command: string): string;
  public
    { Public declarations }
    procedure SetControlCaption(theForm: string);
    procedure SetFieldDispLabel(ADM: TDataModule);
  published
    { Published declarations }
    property ADOConnection: TADOConnection read FADOConnection write SetADOConnection;
    //property FormName: string read FFormName write SetFormName;
    property TableName: string read FTableName write SetTableName;
    property LanguageField: string read FLanguageField write SetLanguageField;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TMultiLang]);
end;

{ TComponent1 }

function TMultiLang.GetValue(Command: string): string;
var
  tmp: TADOQuery;
begin
  tmp := TADOQuery.Create(Self);
  try
    tmp.Connection := Self.ADOConnection;
    with tmp do
    begin
      Close;
      SQL.Clear;
      SQL.Add(Command);
      //ShowMessage(Command);
      Open;
      Result := Fields[0].AsString;
    end;
  finally
    tmp.Free;
  end;
end;

procedure TMultiLang.SetADOConnection(const Value: TADOConnection);
begin
  FADOConnection := Value;
end;

procedure TMultiLang.SetControlCaption(theForm: string);
var
  I, J: integer;
  AForm: TForm;
  Capt, ctrl_nme, S: string;
begin
  if not Assigned(FADOConnection) then
  begin
    MessageDlg('Missing ADOConnection property', mtError, [MBOK], 0);
    Exit;
  end;
  if FTableName = '' then
  begin
    MessageDlg('Missing TableName property', mtError, [MBOK], 0);
    Exit;
  end;
  {if FFormName = '' then
  begin
    MessageDlg('Missing FormName property', mtError, [MBOK], 0);
    Exit;
  end; }
  if FLanguageField = '' then
  begin
    MessageDlg('Missing LanguageField property', mtError, [MBOK], 0);
    Exit;
  end;
  //窗口標題
  S := GetValue('SELECT ' + FLanguageField + ' FROM '
          + FTableName + ' WHERE Frm_Nme=' + QuotedStr(theForm)
          +' and Ctrl_Nme=' + QuotedStr(theForm));

  //
  for I := 0 to Screen.FormCount - 1 do
  begin
    if UpperCase(Screen.Forms[I].Name) = UpperCase(theForm) then
    begin
      AForm := Screen.Forms[I];
      if S <> '' then
    //ShowMessage(S);
      AForm.Caption := S;
      for J := 0 to AForm.ComponentCount - 1 do
      begin
        Ctrl_Nme := AForm.Components[J].Name;
        Capt := GetValue('SELECT ' + FLanguageField + ' FROM '
          + FTableName + ' WHERE Frm_Nme=' + QuotedStr(theForm)
          +' and Ctrl_Nme=' + QuotedStr(Ctrl_Nme));
        //ShowMessage(ctrl_nme+':'+capt);
        if Capt <> '' then
        begin
          if AForm.Components[J] is TMenuItem then
            TMenuItem(AForm.Components[J]).Caption := Capt
          else
          if AForm.Components[J] is TField  then
            TField(AForm.Components[J]).DisplayLabel := Capt
          else
          //if  AForm.Components[J] is TImageList  then
            TControl(AForm.Components[J]).SetTextBuf(Pchar(Capt));
        end;
      end;
      Exit;
    end;
  end;
end;

procedure TMultiLang.SetFieldDispLabel(ADM: TDataModule);
var
  I: integer;
  Nme: string;
  Capt: string;
begin
  for I := 0 to ADM.ComponentCount - 1 do
  begin
    if ADM.Components[I] is TField then
    begin
      Nme := TField(ADM.Components[I]).Name;
      Capt := GetValue('SELECT ' + FLanguageField + ' FROM '
          + FTableName + ' WHERE Frm_Nme=' + QuotedStr(ADM.Name)
          +' and Ctrl_Nme=' + QuotedStr(Nme));
      if Capt <> '' then
        TField(ADM.Components[I]).DisplayLabel := Capt;
    end;
  end; 
end;

procedure TMultiLang.SetFormName(const Value: string);
begin
  FFormName := Value;
end;

procedure TMultiLang.SetLanguageField(const Value: string);
begin
  FLanguageField := Value;
end;

procedure TMultiLang.SetTableName(const Value: string);
begin
  FTableName := Value;
end;

end.

 

posted @ 2006-06-05 14:33 matthew 阅读(1875) | 评论 (1)编辑 收藏

var
  i:integer;
begin
  for i:= 0 to self.ComponentCount-1 do
    TControl(self.Components[i]).SetTextBuf('Hello, world');
end;
posted @ 2006-06-05 14:09 matthew 阅读(457) | 评论 (0)编辑 收藏

当多表join起来的dataset进行处理时,
将DatasetProvider的UpdateMode设为upWhereChanged, Options中如果选择poAllowCommanText会有问题(会更新所有记录);即Options中最好不选

left join 时UpdateMode设为upWhereKeyOnly,并双击dataset添加所有字段,将key字段的ProviderFlag中的pfInkey设为true
但在ClientDataSet中Refresh方法不会更新,要先将Active设为False,再设为True;

posted @ 2006-06-05 13:48 matthew 阅读(4377) | 评论 (0)编辑 收藏

仅列出标题  下一页