Delphi之MIDAS三层完美解决方案

Delphi之MIDAS三层完美解决方案
Delphi之MIDAS三层完美解决方案

思路:中间层与客户端通过三个关键的接口过程进行交互操作(GetData,SetData,GetspData)

GetData:获取数据集。客户端传递数据集名称给中间层,中间层根据请求的数据集名称从数据库的配置文件中获取相关信息,与客户的的条件集合一起给合成SQL语句

SetData:提交数据集。客户端传递修改后的数据集Delta与名称给中间层,中间层根据请求的数据集名称从数据库的配置文件中获取相关信息,然后解释Delta并执行相关规则进行数据更新

GetRecStrs:获取下拉列表信息

GetspData:执行存储过程,并返回结果集

ExecProd:执行存储过程,返回提示信息

优点:

因为获取数据与更新数据过程的配置文件在存储在数据库中,那么更改与配置更为灵活,对SQL语句不再存在限据,对权限方面可进行更格的控制(达到录入记录控制)

数据提交时使用自定义更新过程,无论从速度、控制、安全等方面来说,都不是一件坏事(能使用附加工具快速生成标准的存储过程与配置信息)

维护简单,更新业务逻辑时仅需更新相应的存储过程中,无需更改中间层与客户端

能应付多变的系统开发过程,即使系统的流程或逻辑发生重大变更修改也相当简单,尤其是在需求不是相当明确的时候(有几个系统在上线实施之前能做到需求明细呢?^_^)

缺点:

即使系统再简单,若仅存在一个窗体的话,也必须将基类架设完整,与书本上一般开发过程存在差异,新手需一周左右时候才能上手

中间层代码:

/////***********************************************************///

/////单元文件U_RDM.pas

unit U_RDM;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr, DBClient, MRPManange_TLB, StdVcl, DB, ADODB, Provider, Variants, StrUtils;

type

THPMRP = class(TRemoteDataModule, IHPMRP)

sp_Pub_Ref: TADOStoredProc;

get_Q_RecStrs: TADOQuery;

BesConnection: TADOConnection;

TmpCDS: TClientDataSet;

tmpdsp: TDataSetProvider;

Q_tmp: TADOQuery;

sp_get_apply: TADOStoredProc;

sp_get_spNm: TADOStoredProc;

dsp_get_spQuery: TDataSetProvider;

sp_get_Data: TADOStoredProc;

sp_exec: TADOStoredProc;

procedure RemoteDataModuleCreate(Sender: TObject);

private { Private declarations }

app_ChkNull, app_ParameStr, app_ParamSet: WideString; //不为空约束,更新参数

Procedure LoginServer;

Function GetSQL(UserID, dstNm, Corp_No, Cust_No, swhExpr: WideString; ParamStr: OleVariant): WideString; //取数据语句

Function CannotNull(FieldStr: String; DeltaDS:TCustomClientDataSet; UpdKind: String=''): String; //不为空校验

Function UpdKindStr(var Kind: TUpdateKind): String; //数据更改的状态:Ins, Upd, Del

Function SetspParam(spName:String; DeltaDS:TCustomClientDataSet; //存储过程更新数据

ParameStr,ParamSet:WideString; UpdKind: String=''): WideString;

procedure PubBeforeUpdateRecord(Sender: TObject; //数据提交公用过程

SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;

UpdateKind: TUpdateKind; var Applied: Boolean);

Function SetspParameters(UserID, dstNm: String; ParamStr: OleVariant; run_sp_Nm: TADOStoredProc): Boolean;

Function varTypeCntInt(varType: TDataType): Integer;

protected

class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;

procedure GetRecStrs(const UserID, Corp_No, TabName, ColName,

ExprStr: WideString; out RstStrs: OleVariant); safecall;

function GetData(const UserID, dstNm, Corp_No, Cust_No: WideString;

ParamStr: OleVariant; const sExpr: WideString): OleVariant; safecall;

function SetData(const UserID, dstNm, ParamStr: WideString;

vData: OleVariant): OleVariant; safecall;

function GetAuth(const UserID, dstNm, GrpTyp: WideString): OleVariant;

safecall;

function GetspData(const UserID, dstNm: WideString;

ParamStr: OleVariant): OleVariant; safecall;

procedure GetColStrs(const UserID, Corp_No, TabName, ColName,

ExprStr: WideString; out RstStrs: OleVariant); safecall;

function ExecProc(const UserID, Corp_No, dstNm: WideString;

ParamStr: OleVariant): Shortint; safecall;

public { Public declarations }

end;

implementation

uses U_PublicFun, U_MRPServer;

{$R *.DFM}

class procedure THPMRP.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); begin

if Register then

begin

inherited UpdateRegistry(Register, ClassID, ProgID);

EnableSocketTransport(ClassID);

EnableWebTransport(ClassID);

end else

begin

DisableSocketTransport(ClassID);

DisableWebTransport(ClassID);

inherited UpdateRegistry(Register, ClassID, ProgID);

end;

end;

{ 创建数据模块数据库连接 BES96261 }

Procedure THPMRP.LoginServer;

begin

BESConnection.Connected := False;

BESConnection.ConnectionString := GetServerConnetionStr;

BESConnection.Connected := True;

end;

procedure THPMRP.RemoteDataModuleCreate(Sender: TObject);

var I: Integer;

begin

LoginServer;

{ 使用自定义更新过程 }

For I := 0 to https://www.360docs.net/doc/8f293203.html,ponentCount - 1 do

begin

If (Components[I] is TDataSetProvider) and (Components[I].Tag = 100) then

(Components[I] as TDataSetProvider).BeforeUpdateRecord := PubBeforeUpdateRecord; end;

end;

{ 根据条件返回指定列字段数据 BES96261 }

procedure THPMRP.GetRecStrs(const UserID, Corp_No, TabName, ColName,

ExprStr: WideString; out RstStrs: OleVariant);

var sSQL, sExpr: String;

I: Integer;

begin

sExpr := ExprStr;

If Trim(sExpr) <> '' then sExpr := ' where '+sExpr;

sSQL := Format('select %s from %s'+sExpr,[ColName,TabName,ExprStr]);

with get_Q_RecStrs do

begin

Close;

SQL.Clear;

SQL.Add(StringReplace(ReplaceSQLSafe(sSQL),',',GetUnChar,[rfReplaceAll]));

Open;

RstStrs := VarArrayCreate([0,NegToZero(RecordCount-1)],VarOleStr);

I := 0;

First;

while not Eof do

begin

RstStrs[I] := Fields[0].AsString;

Inc(I);

Next;

end;

Close;

end;

end;

{ 根据用户及条件提取相关需求数据 BES96261

UserID: 用户编码

dstNm: 需求数据集名称

Corp_No: 公司编码

Cust_No 客户编码(提取指定客户的数据)

ParamStr: 条件值的集合,使用'@' 作分隔符

sExpr: 前台传来的附带查询条件的SQL语句 }

function THPMRP.GetData(const UserID, dstNm, Corp_No, Cust_No: WideString; ParamStr: OleVariant; const sExpr: WideString): OleVariant;

begin

Try

TmpCDS.Close;

https://www.360docs.net/doc/8f293203.html,mandText := GetSQL(UserID,dstNm,Corp_No,Cust_No,sExpr,ParamStr);

TmpCDS.Open;

Result := TmpCDS.Data;

Finally

TmpCDS.Close;

End;

end;

{ 根据用户和请求的数据及条件返回取值SQL语句 BES96261 }

Function THPMRP.GetSQL(UserID, dstNm, Corp_No, Cust_No, swhExpr: WideString; ParamStr: OleVariant): WideString;

var sSQL, sExpr, sCrpExpr, sCstExpr: String;

I: Integer;

{ sSQL: 最终组合的SQL语句

sExpr: 数据库表中的指定条件,通常为主从连接

sCrpExpr: 提取指定公司的数据条件

sCstExpr: 提取指定客户的数据条件

}

begin

If Trim(UserID) = '' then UserID := U_PublicFun.Pubchar;

//临时赋值{ ------------------------ }

UserID := 'SUPER';

sSQL := Format('select * from Sys_GetData where UserID=%s and FrmNm=%s',

[Quotedstr(UserID),Quotedstr(dstNm)]);

with get_Q_RecStrs do

begin

Close;

SQL.Clear;

SQL.Add(ReplaceSQLSafe(sSQL));

Open;

sSQL := '';

If RecordCount <> 0 then

begin

If (not VarIsArray(ParamStr)) or (VarArrayHighBound(ParamStr,1) < 0) then sExpr := ''

else sExpr := FieldByName('Expr').AsString;

{ 根据条件初始化SQL语句将条件中的参数变量具体化 }

I := 0;

while Pos('@',sExpr)<>0 do

begin

if VarIsArray(ParamStr) and (VarArrayHighBound(ParamStr,1)>= I) then

sExpr := StringReplace(sExpr,'@',ParamStr[I],[rfIgnoreCase])

else sExpr := StringReplace(sExpr,'@',QuotedStr('0'),[rfIgnoreCase]);

Inc(I);

end;

{ 客户权限 }

sCstExpr := FieldByName('CstExpr').AsString;

If Trim(sCstExpr) <> '' then

sCstExpr := StringReplace(sCstExpr,'@Cust_No',QuotedStr(Cust_No),[rfIgnoreCase])

else

sCstExpr := '';

//公司权限

sCrpExpr := FieldByName('CrpExpr').AsString;

If Trim(sCrpExpr) <> '' then

sCrpExpr := StringReplace(sCstExpr,'@Corp_No',QuotedStr(Corp_No),[rfIgnoreCase])

else

sCrpExpr := '';

//处理附带的SQL条件表达式

If Trim(swhExpr) <> '' then

begin

If (UpperCase(LeftStr(Trim(swhExpr),2)) <> 'OR') and (UpperCase(LeftStr(Trim(swhExpr),3)) <> 'AND') then

begin

If Trim(sExpr+sCstExpr+sCrpExpr)<>'' then swhExpr := ' And '+swhExpr

else swhExpr := ' where '+swhExpr;

end else

begin

If Trim(sExpr+sCstExpr+sCrpExpr) ='' then swhExpr := ' where 1=1 '+swhExpr;

end;

end;

{ 生成SQL语句 }

sSQL := 'Select '+FieldByName('MaxRec').AsString+' '+FieldByName('ColNm').AsString+ ' '+FieldByName('TabNm').AsString+

' '+sExpr+' '+sCrpExpr+' '+ sCstExpr+' '+swhExpr +

' '+FieldByName('OrdSQL').AsString;

end;

Close;

end;

Result := sSQL;

end;

{ 校验字段是否为空BES96261 }

Function THPMRP.CannotNull(FieldStr: String; DeltaDS:TCustomClientDataSet; UpdKind: String=''):String; var I:Integer;

FieldNm, VisField:String; //Field Name

begin

Result := '';

If UpdKind = 'Del' then Exit;

If Trim(FieldStr)='' then Exit;

While Trim(FieldStr)<>'' do

begin

I:=Pos(';',FieldStr);

If I<=0 then

begin

FieldNm := FieldStr;

FieldStr := '';

end else

begin

FieldNm := Copy(FieldStr,1,I-1);

FieldStr := Copy(FieldStr,I+1,Length(FieldStr)-I);

End;

VisField := Copy(FieldNm,Pos(',',FieldNm)+1,length(FieldNm)-Pos(',',FieldNm));

FieldNm := Trim(Copy(FieldNm,1,Pos(',',FieldNm)-1));

If (VarIsEmpty(DeltaDS.FieldByName(FieldNm).NewValue) or

(VarToStr(DeltaDS.FieldByName(FieldNm).NewValue) = ''))

and ((UpdKind='Ins') or ((UpdKind='Upd') and VarIsEmpty(DeltaDS.FieldByName(FieldNm).OldValue))) then

begin

Result := 'Please input '+quotedstr(VisField)+' value.';

Exit;

End;

End;

end;

{ 使用存储过程更新数据集时赋相应参数值 BES96261

spName: 需调用的更新存储过程名

DeltaDS: 需更新的数据集

ParmaeStr: 存储过程参数名及对应的取值字段名

ParameSet: 存储过程参数名及对应的取(Oldvalue)值字段名,用于关键字

UpdKind: 数据更新类型 --修改,新增,删除}

Function THPMRP.SetspParam(spName:String; DeltaDS:TCustomClientDataSet;

ParameStr,ParamSet:WideString; UpdKind: String=''): WideString;

var I: Integer;

S, ParamName,FieldName: String;

begin

If Trim(ParameStr) = '' then Exit;

{ 获取存储过程名及相关参数}

sp_pub_ref.ProcedureName := spName;

sp_pub_ref.Parameters.Refresh;

{ 根据参数名赋需更新数据集对应字段值 }

While Trim(ParameStr) <> '' do

begin

I := Pos(';',ParameStr);

If I <= 0 then

begin

S := ParameStr;

ParameStr := '';

end else

begin

S := Copy(ParameStr,1,I-1);

ParameStr := Copy(ParameStr,I+1,Length(ParameStr)-I);

End;

ParamName := Trim(Copy(S,1,Pos(',',S)-1));

FieldName := Trim(Copy(S,Pos(',',S)+1,length(S)-Pos(',',S)));

if FieldName = '-' then FieldName := Trim(copy(ParamName,2,length(ParamName)-1));

if (VarIsEmpty(DeltaDS.FieldByName(FieldName).NewValue) and (UpdKind<>'Ins')) or (UpdKind='Del') then

sp_pub_ref.Parameters.ParamByName(ParamName).Value :=

DeltaDS.FieldByName(FieldName).OldValue

else

sp_pub_ref.Parameters.ParamByName(ParamName).Value :=

DeltaDS.FieldByName(FieldName).NewValue;

End; //end while

{ 赋数据更新类型值}

if Trim(UpdKind) <> '' then

sp_pub_ref.Parameters.ParamByName('@UpdateKind').Value := UpdKind;

{ 根据关键字参数名赋所对应Old值 }

While Trim(ParamSet) <> '' do

begin

I := Pos(';',ParamSet);

If I <= 0 then

begin

S := ParamSet;

ParamSet := '';

end else

begin

S := Copy(ParamSet,1,I-1);

ParameStr := Copy(ParamSet,I+1,Length(ParamSet)-I);

End;

ParamName := Trim(Copy(S,1,Pos(',',S)-1));

FieldName := Trim(Copy(S,Pos(',',S)+1,length(S)-Pos(',',S)));

if FieldName = '-' then FieldName := Trim(copy(ParamName,2,length(ParamName)-1));

sp_pub_ref.Parameters.ParamByName(ParamName).Value := DeltaDS.FieldByName(FieldName).OldValue End; //end while

sp_pub_ref.ExecProc;

Result := sp_pub_ref.Parameters.ParamByName('@rststr').Value;

end;

{ 根据数据集更新状态返加对应的字符串BES96261 }

Function THPMRP.UpdKindStr(var Kind: TUpdateKind): String;

begin

if Kind = ukModify then Result := 'Upd';

if Kind = ukInsert then Result := 'Ins';

if Kind = ukDelete then Result := 'Del';

end;

{ 数据公用更新过程 BES96261 2003-12-25 17:02 }

procedure THPMRP.PubBeforeUpdateRecord(Sender: TObject;

SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;

UpdateKind: TUpdateKind; var Applied: Boolean);

var sMsg, spName: String;

ChkNull, ParameStr, ParamSet:WideString;

UpdKind: ShortString;

begin

spName := app_spName;

ParameStr := app_ParameStr;

ParamSet := app_ParamSet;

ChkNull := app_ChkNull;

sMsg := '';

UpdKind := UpdKindStr(UpdateKind);

{ 不为空检测 }

sMsg := CannotNull(ChkNull, DeltaDS, UpdKind);

if Trim(sMsg) <> '' then //

raise Exception.Create(IntToStr(DeltaDS.RecNo) + Unchar + UpdKind + Unchar + sMsg); { 数据更新 }

If Trim(sMsg) = '' then

begin

sMsg := SetspParam(spName,DeltaDS,ParameStr,ParamSet,UpdKind);

if Trim(sMsg) <> '' then //

raise Exception.Create(IntToStr(DeltaDS.RecNo) + Unchar + UpdKind + Unchar + sMsg); end;

Applied := True;

end;

{ 数据公用提交过程 BES96261

UserID: 用户编码,用以权限判断

dstNm: 提交的功能数据集

Parmastr: 更新参数

vData: 需更新的数据集

Result: 更新过程中需返回的列表}

function THPMRP.SetData(const UserID, dstNm, ParamStr: WideString;

vData: OleVariant): OleVariant;

var ErrCount: Integer;

begin

If GetAuth(UserID,dstNm,'Apply') = 1000 then

begin

{ 此次更新与上次更新数据集不相同则从后台取更新数据参数值 }

If dstNm <> app_dspName then

begin

app_dspName := dstNm;

with sp_get_apply do

begin

Close;

Parameters.ParamByName('@dsp_nm').Value := app_dspName;

ExecProc;

app_spName := Parameters.ParamByName('@spName').Value;

app_ParameStr :=

Parameters.ParamByName('@Pstr1').Value+Parameters.ParamByName('@Pstr2').Value;

app_ParamSet := Parameters.ParamByName('@Pstr3').Value;

app_ChkNull := Parameters.ParamByName('@Chkstr').Value;

end;

end;

Result := tmpdsp.ApplyUpdates(vData,-1,ErrCount);

end;

{ 操作数据集时权限判断BES96261 }

function THPMRP.GetAuth(const UserID, dstNm, GrpTyp: WideString): OleVariant; begin

Result := 1000;

end;

{ 使用存储过程查询,并返回结果值 BES96261 }

function THPMRP.GetspData(const UserID, dstNm: WideString;

ParamStr: OleVariant): OleVariant;

begin

FrmServer.Memo1.Lines.Add(UserID + '---' + dstNm);

{ Open Query and Result Data}

If SetspParameters(UserID, dstNm, ParamStr, sp_get_Data) then

begin

sp_get_Data.Open;

Result := dsp_get_spQuery.Data;

sp_get_Data.Close;

end;

end;

{ 执行存储过程,无结果集返回 }

function THPMRP.ExecProc(const UserID, Corp_No, dstNm: WideString; ParamStr: OleVariant): Shortint;

begin

Result := -1;

FrmServer.Memo1.Lines.Add(UserID + '---Exec Procedure---' + dstNm);

{ Exec Procedure }

If SetspParameters(UserID, dstNm, ParamStr, sp_exec) then

sp_exec.ExecProc;

Result := 1;

end;

end;

{ 执行存储过程或通过存储过程查询数据时设置存储过程参数 BES96261 } Function THPMRP.SetspParameters(UserID, dstNm: String; ParamStr: OleVariant; run_sp_Nm: TADOStoredProc): Boolean;

var spNm: String; //存储过程名称

I: Integer;

begin

Result := False;

If Trim(dstNm) = '' then Exit;

If GetAuth(UserID,dstNm,'Query') <> 1000 then Exit;

with sp_get_spNm do

begin

Close;

Parameters.ParamByName('@UserID').Value := UserID;

Parameters.ParamByName('@dstnm').Value := dstNm;

ExecProc;

spNm := Parameters.ParamByName('@spNm').Value;

end;

If Trim(spNm) = '' then Exit;

{ Exec Proc }

run_sp_Nm.Close;

run_sp_Nm.ProcedureName := spNm;

run_sp_Nm.Parameters.Refresh;

If not varIsNull(ParamStr) and VarIsArray(ParamStr) then

begin

For I:=0 to VarArrayHighBound(ParamStr,1) do

begin

case varTypeCntInt(run_sp_Nm.Parameters[I+1].DataType) of

2: run_sp_Nm.Parameters[I+1].Value := StrToFloat(ParamStr[I]);

3: run_sp_Nm.Parameters[I+1].Value := VarCntbool(ParamStr[I]);

else run_sp_Nm.Parameters[I+1].Value := ParamStr[I];

end;

FrmServer.Memo1.Lines.Add(ParamStr[I]);

end; //end for

end;

Result := True;

end;

{ 判数参数类型 }

Function THPMRP.varTypeCntInt(varType: TDataType): Integer;

begin

Case varType of

ftString, ftDate, ftTime, ftDateTime, ftWideString,ftFixedChar :

Result := 1;

ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftLargeint,

ftBytes, ftVarBytes :

Result := 2;

ftBoolean : Result := 3;

else

Result := 1;

end;

end;

{ 根据条件返回指定列字段数据BES96261 } procedure THPMRP.GetColStrs(const UserID, Corp_No, TabName, ColName,

ExprStr: WideString; out RstStrs: OleVariant);

var sSQL, sExpr: String;

I: Integer;

begin

sExpr := ExprStr;

If Trim(sExpr) <> '' then sExpr := ' where '+sExpr;

sSQL := Format('select %s from %s'+sExpr,[ColName,TabName,ExprStr]); with get_Q_RecStrs do

begin

Close;

SQL.Clear;

SQL.Add(sSQL);

Open;

RstStrs := VarArrayCreate([0,NegToZero(Fields.Count-1)],VarOleStr);

If RecordCount > 0 then

begin

For I := 0 to Fields.Count - 1 do

RstStrs[I] := Fields[I].AsString;

end;

Close;

end;

end;

initialization

TComponentFactory.Create(ComServer, THPMRP,

Class_HPMRP, ciMultiInstance, tmFree);

end.

/////***********************************************************///

object HPMRP: THPMRP OldCreateOrder = False

OnCreate = RemoteDataModuleCreate Left = 196

Top = 124

Height = 203

Width = 481

object sp_Pub_Ref: TADOStoredProc

Connection = BesConnection

Parameters = <>

Left = 32

Top = 80

end

object get_Q_RecStrs: TADOQuery

Connection = BesConnection

Parameters = <>

Left = 112

Top = 16

end

object BesConnection: TADOConnection ConnectionTimeout = 5

LoginPrompt = False

Provider = 'SQLOLEDB.1'

Left = 32

Top = 16

end

object TmpCDS: TClientDataSet

Aggregates = <>

Params = <>

ProviderName = 'tmpdsp'

Left = 192

Top = 16

end

object tmpdsp: TDataSetProvider

Tag = 100

DataSet = Q_tmp

Options = [poAllowCommandText] UpdateMode = upWhereKeyOnly

Left = 240

Top = 16

end

object Q_tmp: TADOQuery

Connection = BesConnection

CursorType = ctStatic

Parameters = <>

SQL.Strings = (

'')

Left = 288

Top = 16

end

object sp_get_apply: TADOStoredProc Connection = BesConnection ProcedureName = 'Bes_S_GetApplyParame;1' Parameters = <

item

Name = '@RETURN_VALUE'

DataType = ftInteger

Direction = pdReturnValue

Precision = 10

酒店完美联盟

酒店完美联盟 ●业务介绍 针对不同类型酒店客户的经营管理需求以及酒店住客的信息通信服务诉求和消费行为特征,整合并定制差异化的基础通信、信息服务和行业应用整体解决方案,通过与合作酒店建立优势互补、利益分成、共赢发展的合作关系,签订合作协议,形成“酒店完美联盟”的统一名称和商业模式,以更好地满足酒店客户提高运营管理、提高服务水平和酒店住客消费需求,并实现合作拓展。 ●办理方式 营业厅商务领航专区 10000号自动受理 专职客户经理 ●常见问题 1、长、市话包天服务对住客的吸引力 A总:与以往酒店客房长话服务相比,长、市话包天服务对住客有什么吸引力? 客户经理:酒店长话以往总是给住客一种较高的印象,开通还必须支付押金,很麻烦,而手机的漫游长途费在1.3元~1.5元左右,比较贵,因此很多客人与单位和家人不能进行充分

联系,“长、市话包天服务”提供了这种可能;有些出差的住客,可以将话费计在房费内,回单位还可以报销,因此对这个服务也会产生较大的兴趣,这也是酒店价值提升很好的方式。 2、如何选择面向住客的销售模式 A总:长、市话包天免费打的模式对酒店能起到很好的宣传作用,我酒店的商务客人较多,应该较易接受,但是具体如何操作? 客户经理:我们已经考虑了这一问题,可以有两种模式。模式一:选择合适的时机,通过调整销售折扣或将客房价格适当上调等方式,将客房长、市话包天服务纳入客房标准服务中;模式二:客房的销售折扣或价格不做调整,两种计费方式(0.7元/分钟计时收费和15元国内长话包天)并存,由前台小姐进行业务推荐和登记。考虑到价值提升和便利性,我们建议采用客房提价方式。 3、如何循序渐进推广包天方案 A总:方案的执行需要一定过程,住客接受我们的方案并改变其消费习惯也需要一个过程,我们如何循序渐进地实施推广? 客户经理:客房长、市话包天服务能够让入住的客人获得实惠,酒店的客房服务也能实现价值提升,因此只要宣传和推

DELPHI 中WEBBROWSER控件详解实例

Delphi中WebBrowser控件详解实例 2008-10-18下午06:58 很久都没有原创了,前几天帮朋友做了个网址发布程序,主要应用到了WebBrowser控件。今天主要给大家演示一下过程,让大家学习一下Delphi工具。 WebBrowser功能: 1。自动加载网页 2。去除WebBrowser滚动条 3。WebBrowser自身打开页面 4。禁止右键 1。首先,新建一个FROM窗体: 2。加入一个WEBBROWSER控件

3。调整后如下: 4.这样一个webbrowser就完成了,下一步我们来让程序打开后自动加载一个网页。 核心代码:WebBrowser1.Navigate('https://www.360docs.net/doc/8f293203.html,'); 双击窗体灰色处,对窗体进行初始化,在代码窗口中输入(Begin与End间输入核心代码): procedure TForm1.FormCreate(Sender:TObject); begin WebBrowser1.Navigate('https://www.360docs.net/doc/8f293203.html,');//窗体初始化完成WEBBROWSER加载一个网页end; 5。下面我们来实现禁止WEBBROWSER控件的滚动条功能:

核心代码:WebBrowser1.oleobject.Document.body.Scroll:=‘no’; 利用这个代码去掉滚动条的前提是webbrowser中必须有打开的网页,也就是在网页加载完完毕后再去掉滚动条。所以首先要判断页面是否加载完毕,如果加载完毕,就执行上面的语句 去掉滚动条。这时就要引入一个按扭控件来触发程序 加入SPEEDBUTTEN 调整形后:

中国电信酒店完美联盟协议模板

协议编号: 龙海快捷 与 中国电信股份有限公司南阳分公司 综合通信业务合作协议 2018年 5 月

本协议由甲乙双方于2018年月在南阳市签订。 甲方: 负责人: 地址: 联系人: 电话: 乙方:中国电信股份有限公司南阳分公司 负责人:邵琰涛 地址:南阳市高新区信臣中路966号 联系人: 电话: 甲乙双方依据《中华人民共和国合同法》、《中华人民共和国电信条例》等有关法律、法规的规定,本着平等互利、互相信赖、有偿使用、共同发展的原则,经双方友好协商,就甲方使用乙方综合通信业务的相关事宜达成协议如下: 第一条协议标的物 1.1 乙方提供甲方\部固定电话业务。 1.2 乙方提供甲方一条\M精品光宽带(或极速版专线)业务。 1.3乙方提供甲方三合一组合业务(含宽带+WIFI+iTV)间,iTV单产品\间。 1.4 乙方提供甲方\部天翼对讲业务。 1.5 乙方提供甲方\部天翼手机业务。 1.6 乙方为甲方单位固定电话和员工天翼手机组建综合虚拟网。 1.7 乙方为甲方提供\等行业应用。 鉴于双方已在以上综合通信业务合作的基础上,甲方可享受乙方的综合优惠,但各电信业务不可独立分割享受优惠。 第二条双方权利和义务 2.1 甲方权利和义务 2.1.1 甲方合理使用乙方提供的设备和业务,本协议所涉及的各项业务只能由甲方用于地址:办公使用,不得将租用的设备和业务进行经营性活动或以转租、转让、转借等方式提供给其他任何单位或个人使用。甲方使用乙方电话网或宽带互联网须签订《网络信息安全责任书》。 2.1.2甲方对租用的乙方网络设备负有代管义务,如相关网络设备出现丢失或人为损坏,甲方应承担赔偿责任,赔偿金额为:光收发终端盒300元/台、三

Delphi与各数据库数据类型比较

Delphi与各数据库数据类型比较 Delphi数据类型与各数据库数据类型对比如下表,如有具体说明见表中脚注: Delphi Type Oracle Types SQL Server Types MySQL Types[1] ftSmallint NUMBER(p,0)[2] (p<5) SMALLINT TINYINT(M)(M>1) SMALLINT ftWord-TINYINT TINYINT(M)UNSIGNED(M> 1) SMALLINT UNSIGNED YEAR ftInteger NUMBER(p,0)[2] (4 (4

【VIP专享】delphi 三层架构CS简单例子一步步做

delphi 三层CS架构一步步建立的简单例子 所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服务器来访问数据库。提高了系统的安全性。 在Delphi中可以使用Socket或者Dcom组件来连接他们相互间的通讯。 本例使用SOCKET组件. DCOM用在局域网, SOCKET用在互联网. 环境为windows xp+ delphi 7 + access2000 创建过程: 1、请用ACCESS2000新建一个数据库database02.mdb. 2、请在delphi7执行file-new- application, 新建一个桌面, 上面放一个label, label.caption =’服务器端已运行….’

3、接下来在delphi7执行file --new--other,选择"Multitier"--"Remote data module"。在跳出来的对话框里面输入名称(任意),例如: AppSqlConn。选择确定,进入remote data module窗口。 界面如下图所示

4、加入组件:adodataset,点击connectionstring属性,点击后面的…,进 入设定连接窗口。在选择数据库中选择自己想要使用的数据库 database02.mdb。一般只要地址正确、用户名和密码无误,肯定可以连接通过。确定。 3、ADODATASET1在commandtext中点击后面的…,啥也不用设定,默认 配置; 4、ADODATASET1将active属性设置为false。

5、再加入组件:datasetprovider。设定其dataset属性为上面的adodataset1。 5.1 接着设置datasetprovider1的属性,poallowcommandtext=true, 其他的参数默认即可. datasetprovider1的属性如下图所示

分公司年终述职报告

分公司年终述职报告 分公司年终述职报告篇1 20xx年电信分公司在省市公司各级领导的关心支持下,在全体员工的奋力拼搏下,按照省市公司的各项工作部署,以绩效考核过百分为主线,认真承接省、市公司的七个跨越,切实做好内强素质、外树形象基础管理工作。在竞争激烈、地方经济不景气的严峻形势下,各项工作稳步推进,取得了较好的成效,现将20xx年主要工作总结如下: 一、经营发展工作 今年,分公司在面临省公司收入确认方式发生重大变化、致富通发展已趋于饱和、收入增长计划达4.67%的情况下,确定了以收入为核心、以存量保持和欠费追收为支撑、以增量发展和重点转型业务为拉动的总体工作思路。一年来,通过全体员工的共同努力,取得了一定的成绩。 (一)以收入为核心,指导各方面工作的开展20xx年,分公司始终以收入为主线,多方面开展各项工作,取得了一定的成绩。至10月,主营业务收入完成559.76万元,完成年计划667万元的83.92%,同比增长5.05%;其他业务收入完成7.07万元,完成年计划8万元的88.41%,同比增长-78.83%;总收入完成566.83万元,完成年计划675万元的83.97%,同比增长0.10%,(超进度0.67%。经营收入计划完成率排全市第三名,是主营收入正增长的四家公司之一。 (二)经营工作开展情况1月初召开电信工作会,分解下

达收入,发展计划,讨论相关办法(到人、到月)。1、春分满堂营销活动取得好成绩。2、二季度正向拼搏战圆满完成。 3、三、四季度跨越计划稳步推进。 4、重点转型业务发展稳步推进。 5、宽带私接整治持续推进。 6、聚类营销虚拟团队,每周至少外出营销一天。 7、推广酒店完美联盟,上半年发展10户112部电话,15部宽带,11月前完成商务领航105户发展计划。 8、以收入为核心,做好局域网上网用户的整治。执行情况:1、在分公司各部门支撑下我的e家、宽带、小灵通发展居全市前列,局域网上网用户的整治取得了较好的效果,但新业务发展乏力。2、在政企部支持下电子政务进入试运行,平安城市已勘点制定出方案。 (三)品牌推广情况1、我的e家专席。2、针对性寄送宣传资料。3、尊享e8体验点。4、上门推广商务领航。5、电瓶车广告。6、差异化服务开展。7、三项服务、营业服务、关注细节。执行情况:1、我的e家-e8发展较好,目前有1458户,占家庭宽带客户1842户的79.15%。2、已启动商务领航两版套餐的推广工作,目前已完成10月套餐签约计划105户。 (四)欠费管理方面1、制定《20xx年欠费追收管理办法》。 2、加重绩效考核。 3、派单。 4、晚上集中催费。 5、上门催收。 6、提前提取准欠费户电话催。 7、人工双停。执行情况:欠费呈逐月下降趋势,至10月隔月欠费率为3.73%。 二、运维方面工作 1、抗雪灾、迎奥运全体动员。

自动创建数据库(DELPHI+SQL SERVER)

自动创建数据库(DELPHI+SQL SERVER) 转载自小李飞刀 procedure TForm1.Btn_OKClick(Sender: TObject); var sqlconn:string; begin Sqlconn:='Provider=SQLOLEDB.1;'+'password='+Edit_Password.Text +';Persist Security Info=true;User ID='+Edit_Name.Text +';Data Source='+Edit_Server.Text; if Edit_Server.Text=EmptyStr then begin showmessage('请输入SQL服务器的名称或者IP地址!'); Edit_Server.SetFocus; exit; end; if Edit_Name.Text=EmptyStr then begin ShowMessage('请输入登陆数据库的用户名!'); Edit_Name.SetFocus; exit; end; with ADO_Test do begin Close; ConnectionString :=Sqlconn; end; Try Try Ado_Test.LoginPrompt:=false; Ado_Test.Connected:=true; Messagebox(Handle,'连接成功。','提示',MB_OK or MB_ICONINFORMATION); Button2.Click; except Messagebox(Handle,Pchar('连接['+Edit_Server.Text+']失败!'),'警告',MB_OK or MB_ICONWARNING); end; Finally Ado_Test.Connected:=false; end; end; procedure TForm1.Button2Click(Sender: TObject); Var memExec,s:TStringList; I,J:integer; strSql,sqlstr,sqlconnstr:string;

酒店完美联盟客户方案建议书

合作共赢提升服务 酒店完美联盟客户方案建议书 中国电信深圳分公司 2007年12月日

酒店完美联盟客户方案建议书 (红色字为备注,请客户经理注意修改删除) 一、酒店行业发展环境概述 1.1机遇与挑战 广东酒店业目前正处于机遇与挑战并存的发展环境,一方面,社会经济和旅游文化的快速发展、大型活动的举办、大量商务旅游人士的光临,为酒店带来无数潜在客源;另一方面,各类新建酒店和外资酒店纷纷拥入广东市场,市场细分度越来越高,行业内竞争日益激烈,酒店客人对服务要求不断提升,酒店经营和发展面临巨大的挑战。 1.2酒店客人需求 随着信息技术和互联网络的迅猛发展,人们对信息交流的需求越来越多,交流方式越来越丰富。目前中国网民已超过1.3亿人,而酒店的高端目标客户群,如商务、自助游人士基本都有利用电话、网络、远程会议交流的需要,酒店客人越来越关注客房的通信网络配套服务。目前许多酒店已开始提供相关服务,但信息服务作为专业性较强的服务项目,如何解决设备投资、人员支撑、资源管理等问题,需要酒店经营和管理者重点考量,正确抉择。 1.3酒店完美联盟 鉴于上述情况,中国电信针对不同类型酒店客户(包括酒店管理集团)的经营管理需求以及酒店住客的信息通信服务需求和消费行为特征,整合并定制差异化的基础通信、信息服务和行业应用整体解决方案,通过与合作酒店建立优势互补、利益分成、共赢发展的合作关系,适时推出“酒店完美联盟”这一全新业务和合作模式,较好地满足了酒店客户提升运营管理水平,满足酒店住客消费需求,提高酒店服务质量,增创酒店核心价值的迫切要求。 针对贵酒店,我们提出两种业务和服务合作建议: 二、酒店完美联盟之“客房电话免费打”服务

Delphi调用WebService的实例(非常经典)

Delphi 调用webservice 经典实例 Dispatch: 派遣,分派 Invoke: 调用 Invokable: 可调用接口 TReomtable: WebService中自定义类都是继承自该类 TSOAPAttachment: Attachment:附件,一种流类型,可以返回流数据 CGI:(EXE) ISAPI:(DLL) Base64编码: uses EncdDecd; s := EncodeString(s); //加 base64 编码 s := DecodeString( str ); //解码 UTF8: UTF8 是8位的UNICODE字符,而ASCII是7位 ,gb2312和unicode是2字节/字,utf8是3字节/字utf8类似以前的8位转7位的编码,是为了在网络间不同系统的通讯方便而作的转换。几乎所有用.Net写的WebService只支持DOC方式、Delphi写的只支持RPC方式;J2ME目前对Web Service的支持仅限于RFC172,而 RFC172要求必须为DOC方式(sun怎么偏袒MS?)! 为了在设计中减少障碍,下面还介绍几个概念。 1) SOAP:SOAP是一种简单有效的数据传输协议,用于分布式网络环境下数据信息交换,它以XML 作为数据传输的格式,搭配Internet上标准的传输协议HTTP、SMTP、TCP等来传送信息。从本质上看,SOAP事实上只是将Request和Response经由XML格式把数据打包,达到双方沟通的目的。 2) WSDL:WSDL(Web Service Description Language)是一种以XML格式描述的Web Service语言,当Web Service Provider 要对外公布提供的 Web Service,就需要通过WSDL来构建描述语言。在WSDL中有两个非常重要的要素::此WSDL文件所要描述的Web Service集合;每一个Port代表外界Client可以和此Service沟通的一个进入点,一个Port会指定一个Binding方式。 3):处理中文乱码的问题: 将HttpRio的 Converter 的 Options 的 soUTF8InHeader 设为 True 将生成soap消息的HTTPSoapDispatcher控件,添加encoding为gb2312 https://www.360docs.net/doc/8f293203.html,eUTF8InHeader := True; 4)在Delphi中,能够传递的自定义类型的对象要继承TRemotable, 5:修正一个服务器端的一个Bug:将ISAPIThreadPool和ISAPIApp的次序变一下:ISAPIApp必须在 ISAPIThreadPool之前: uses ... ISAPIApp, ISAPIThreadPool 解决如下错误: Received content of invalid Content-Type setting:text/html -SOAP"expects"text/xml" 6:"XML document must have a top level element. Line: 0" 错误,我该如何解决??哈纳斯 (2002-08-05 17:26:00) 我也曾碰到同样的问题解决方法是:别设httprio的wsdllocation,设它的url 如http://localhost/mydir/project1.exe/wsdl/IFIRST mydir是你的可执行的虚拟目录,IFIRST是你定义的接口名 ********************************************************************* **************************

Delphi7.0中如何用代码访问数据库的方法

Delphi7.0中如何用代码访问数据的方法 一、第一种方法: 1、设计的界面如下: 2、主要代码: (1)启动窗口中的主要代码: Se:= ExtractFilePath(Application.ExeName) + 'data\jczk.mdb'; //动态取出系统文件的路径ADOADOQuery1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ Se+';Persist Security Info=False'; ADOADOQuery1.Close; ADOADOQuery1.SQL.Clear; ADOADOQuery1.SQL.Add('select * from yhz'); ADOADOQuery1.Open;//ADOADOQuery1.ExecSQL;本句表示不返回值时的记录集合ADOADOQuery1.Active:=true; (2)查询其它表时的代码: ADOADOQuery1.Close; ADOADOQuery1.SQL.Clear; ADOADOQuery1.SQL.Add('select * from jf11'); ADOADOQuery1.Open; ADOADOQuery1.Active:=true; (3)提示窗口:Application.MessageBox('ss','提示',64); (4)说明:DataSource1必须要与ADOADOQuery1连接在一起;DBGrid1必须要与DataSource1连接在一起。 (5)取值:EDIT1.Text:=ADOADOQuery1.FieldByName('yhz04').AsString (6)怎么使用ADOQuery1给数据库添加数据? ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('insert into "Tab_Contron_record"'); ADOQuery1.SQL.Add('('+str_V+')'); ADOQuery1.SQL.Add('values('+str_T+')'); ADOQuery1.ParamByName('用户名').AsString:='admin'; ADOQuery1.ParamByName('连接设备IP').AsString:='192.168.18.66'; ADOQuery1.ParamByName('用户类型').AsString:='管理员'; ADOQuery1.ParamByName('连接时间').AsString:=datetimetostr(now); ADOQuery1.ParamByName('备注').AsString:='无'; ADOQuery1.ExecSQL; (7)、怎么样查询数据库中表的值,即条件查询(注意:Quotedstr()函数的使用):cnn:='select * from sinfo where sid=200601001'; //“sid”字段为数值型可以直接使用; cnn:='select * from sinfo where sclass='+Quotedstr('高一一');//“sclass”字段为字符类型; //多条件进行查询的例子 cnn:='select * from sinfo where sclass='+Quotedstr('高一一')+' and ssex='+quotedstr('男'); ADOQuery1.Close ;

delphi7串口通信(spcomm控件)实例

Delphi7串口通信(spcomm控件)实例 最近在用delphi7做串口通信,网上找了很多例程,复制粘贴运行就没有能通过的,再次鄙视一下列位先行者,你们帮人倒是帮到底啊,没一个是拿过来能用的,太坑了,在N天的努力下(鄙人比较笨)终于通过串口接收到数据,希望给后来人予以帮助,程序如下: 功能简介 功能比较简单,只是从串口接收单片机发送的数据,给memo1 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, SPComm, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Comm1: TComm; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); procedure Comm1ModemStateChange(Sender: TObject; ModemEvent: Cardinal); private { Private declarations } public { Public declarations } end; var

Delphi数据库处理组件

Delphi数据库处理组件 BDE、ADO、InterBase和dbExpress详细说明 第一节BDE、ADO、InterBase和dbExpress Delphi中处理数据库主要有两种方法,也就是BDE、ADO,从Delphi6.0开始还加入了一种dbExpress方法。另外,Delphi还提供了专门处理Borland公司自己的数据库产品InterBase数据库的专门的方法。 BDE(Borland Databas Engine),是Delphi中最古老的技术,从delphi2.0加入BDE技术以后,一直是Delphi处理数据库的事实上的标准。BDE是一个基于驱动程序的体系结构,每一种数据格式或数据源都有一种驱动程序来驱动相近的数据源。BDE可以很好的支持现在最流行的ODBC API方法,ODBC是一种C/C++应用程序编程接口(API),无论是对任何一种客户/服务器关系型数据库管理系统(RDBMS),还是最流行索引顺序访问方法(ISAM)数据库(Jet、Foxpro),都能很好的访问。 同时,由于BDE的驱动程序主要直接来自于第三方开发商,所以,对于像Oracle这些非微软的数据库,执行效率上比较高。正是这些特点,使BDE技术还是得到了很多数据库开发程序员的欢迎。 ADO技术是微软提出来的处理关系型数据库和非关系型数据库的新技术,它基于微软被称为OLE DB的数据访问模式,它是专门为了给大范围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件系统、图形格式、Internet资源等。ADO所需内存更少,更适合大流量和大事务量的网络计算机系统。 ADO顶层有三个对象:Connection、Command、Recordset。 Connection用以指定数据源,建立和数据源的连接。 Command对象用以对数剧源执行指定的命令,可以接受SQL语句,表和存储过程的名称,执行SQL查询,更新数据,插入纪录等。 Recordset对象表示的是来自表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据。 由于ADO技术的迅速普及,从Delphi5.0开始,加入了ADO技术的模块,并逐步成为Delphi数据库设计的主流。但是,和VB的ADODC相比,它还是有所不同的,在数据绑定上,它更多的吸收了BDE的特点,以做到和原来的程序兼容,同时,它又可以接受标准ADO技术的各种属 性和方法,在接受这些属性和方法时,它是和数据绑定控件脱离的,当然从某种意义上来说,这种方案提高了执行效率,给设计人员以更多的选择。 dbExpress是Delphi6.0加入的最新的数据库模块,它不使用缓存,可以快速浏览大量的数据,但是,不使用缓存就不能更改,所以它的标准方式是只读的。它一个重要的特点是交叉平台,可以和Linux数据库连接,速度相当快。 下面的讨论,将以ADO技术为主线,最后再说明BDE和dbExpress的应用方式。Top

delphi_三层架构简单例子.

delphi 三层架构简单例子(经测试成功2009-01-22 下午 02:45所谓三层: (1 客户端 (2 服务器端 (3 数据库在数据访问时,使得客户端必须通过服务器来访问数据库。提高了系统的安全性。在Delphi中可以使用Socket或者Dcom来连接他们相互间的通讯。如果使用Scocket在系统使用时必须提供Scocket连接器,而Dcom 则不用。客户端和服务器的连接需要Broker来联系。环境为winxp sp2 + delphi 7 + db7.(MSSQL2000 创建过程: 1、请不要新建application.file-new-activex-activex library,file --new--other,选择"Multitier"--"Remote data module"。在跳出来的对话框里面输入名称(任意),例如:AppSqlConn。选择确定,进入remote data module窗口。 2、加入组件:adodataset,点击connectionstring属性,点击后面的…,进入 设定连接窗口。选择:use connection string--build,在提供程序中选择:"Microsoft ole db provider for sql server",在连接中:服务器名称输入sql server的ip地址,登录信息中输入用户名和密码(sql server),在选择数据库中选择自己想要使用的数据库。一般只要地址正确、用户名和密码无误,肯定可以连接通过。确定退出。 3、在commandtext中点击后面的…,进入sql 语句设定,根据自己的要求设定。 4、将active属性设置为true。只要前面的设定是正确的,这里应该顺利通过。 5、加入组件:datasetprovider。设定其dataset属性为上面的adodataset。 6、到此服务器端已经设置完成。请保存并且运行一次,从而使服务注册。 7、运行delphi的bin目录下面的scktsrvr,因为下面要使用socket连接。运行后任务栏中出现socket server的图标。 8、新建程序(application),然后file--new--data module,会创建客户端的data module。 9、加入组件:socketconnection,在address中输入sql server的ip地址,然后在servername中输入刚才创建的remote data module的服务程序。程序会自动在serverguid中加入id。然后选择connected属性为true。只要 此处不报告错误,此程序基本成功了。 10、加入组件:clientdataset,选择remoteserver属性为socketconnection,选择providename为服务器程序的datasetprovider。然后选择active属性为true。 11、到程序的form窗口状态,首先选择file--use unit,选择上面创建的data module,确定。然后加入组件datasource 和dbgrid。选择datasourece的dataset属性为data module的clientdataset,选择dbgrid的datasource为这里的datasource组件。现在应该可以看到dbgrid的窗口中

Delphi两个经典数据库控件集详解

Delphi两个经典数据库控件集详解 Delphi强大的数据库功能一直是Delphi程序员们的最爱,然而,BDE强大功能的后面,却有太多的限制。当程序员们绞尽脑汁编出短小精悍的程序而兴高采烈时,他们不得不尴尬的面对发布程序时BDE那几兆大的附加文件。有没有其他控件,既可以使用Delphi强大的数据库功能而又不要那几兆大的BDE?答案时肯定的,那就是使用第三方控件或者Delphi5的ADO控件。在这里,我将具体介绍Delphi第三方数据库控件集:DiamondAccess1.7和ODBCExpress5.06。DiamondAccess控件集使用微软数据访问对象DAO访问数据库。利用此控件集访问数据库,可以完全摆脱BDE,当然,发布程序时也就无需考虑BDE的麻烦了。而且,DAO的访问速度比BDE更快。ODBCExpress控件集使用大家都很熟悉的ODBC访问数据库,只要设置好数据源,就可以访问大部分类型的数据库;而且,使用ODBC接口的程序具有更大的可移植和通用性。ADO数据库访问控件在Delphi5中已经加入进来,假如要在Delphi4或者更低的版本使用ADO,就必须使用第三方控件,比如:DiamondDAO,同样可以提供强大的更能。以下,我们通过实例的形式具体介绍DiamondAccess1.7和ODBCExpress5.06的使用,我们将利用这两个控件集实现同样的功能:在DBGrid中列出数据库所有数据,通过输入检索数据。通过这些实例,我们可以基本了解以下内容:1)Delphi 中应用这两个控件集访问数据库的基本技术;2)发布采用这两个控件集的程序需要注重的问题和基本方法;3)两个控件集的优缺点和下载安装方法; DiamondAccess控件集演示 >一、控件说明DiamondAccess是一套高速连接MicrosoftAccess数据库的控件集,包括TDAODatabase,TDAOTable,TDAOQuery和TDAOQueryDef四个控件。它不依靠BDE访问数据库,而是使用微软的DataAccessObjects3.5和JetDatabaseEngine访问数据库,利用Access自带数据库引擎,DiamondAccess可以提供高速的数据库访问接口。 图1DiamondAccess控件集 控件TDAODatabase用于定义要访问的Access数据库,主要属性是DataBaseName;TDAOTable和Delphi自带数据库控件Tabel相似;TDAOQuery和Delphi自带控件Query相似;TDAOQueryDef和DAOQueryDefobject一起使用,平时编程中较少用到。二、演示程序现在,我们用实例了解DiamondAccess的用法。在程序中,我们将用到TDAODatabase 控件,TDAOQuery控件,Delphi自带Datasource控件,Edit和Button控件。程序打开数据库DataBase的main表并列出所有数据,Edit1控件用于输入数据检索。为了更好的了解,我们先看看main的表结构。1)数据库DataBase表main的结构字段名数据类型字段大小/格式ID自动 编号长整型姓名文本50电话文本50生日日期/时间常规日期说明文本100 表1数据库DataBase表main的结构 2)程序中控件属性为了程序有更好的可迁移性,我们尽量不再属性面板中设置控件属性,而是在程序代码中设置。以下属性,只是控件最基本的要求,进一步设置请看程序源代码。控件属性Form1Caption:DiamondAccess演示;DAODatabase1默认;DAOQuery1Database:DAODatabase1;SQL:selectfrommain;DBGrid1DataSource:DataSource1;DataSource1Dataset:DAOQuery1;Edit1 Text:空;Button1Caption:检索

2020{酒类与营销}酒店完美联盟解决方案

酒店完美联盟解决方案

酒店完美联盟解决方案 中国电信合肥分公司 二○○八年三月 一、产品背景 当前在本地酒店以下现象仍然普遍存在: 1.客房娱乐休闲方式单一,客人在房间内只能观看电视,无法进行视频点播和网上娱乐等; 2.客房宽带使用率很低,其主要原因是酒店只提供了宽带信息点,客人需自备电脑,酒店宽带未能发挥应有的作用。 3.客人使用客房电话拨打长话手续繁琐,费用高,客人对客房电话服务不满意; 4.外地出差客人在本地使用手机需支付高昂的漫游费用; 以上问题,反映出当前本地酒店业在信息服务提供上所存在的短板和不足,这些问题的存在会降低客户满意度,在一定程度上削弱合肥市整体旅游业的竞争力。 为此,中国电信合肥分公司希望由合肥市旅游局牵头,各大酒店参与合作,在合肥市共同打造“酒店完美联盟”,通过多元化信息产品推动合肥市整个旅游市场的发展。 “酒店完美联盟解决方案”就是旨在以个性化、切合客人需求的

信息通信产品,充分满足旅游商务人士的需求,增加加盟酒店的市场竞争力,最终实现“与加盟酒店合作共赢、提高旅游市场收入”目的。 二、方案简介 解决方案分为二个部分:“长市话畅聊”和“数码e房”业务。 (一)“长市话畅聊” 业务说明:酒店客房开通“长市话畅聊”业务后,客人可使用客房电话免费无限量拨打国内长途电话以及市话。 (二)“数码e房” 业务说明:“数码e房”是酒店客房宽带上网的一揽子解决方案,通过在客房配备电脑,满足住客网上冲浪、浏览信息、影视点播视频、远程办公等需求。同时“数码e房”为酒店提供量身定制的桌面系统,方便酒店发布自身服务信息,便于住客使用酒店的各类服务。 三、业务合作 (一)“长市话畅聊” 电信按照酒店要求开通“长市话畅聊”业务,酒店不需要任何投入,只需按月支付月租费用。标准资费:180元/间/月(签约年限3年以上) (二)“数码e房”

Delphi数据库开发完美教程 第1章 Delphi数据库应用系统基础

数据库应用技术Delphi应用系统开发

第1章Delphi数据库应用系统基础 学习要点 学习Delphi数据库应用系统的基本概念 理解Delphi应用系统的组成 学习Delphi基本概念和术语 掌握Delphi可视化编程的基本步骤 学习创建简单的数据库应用系统 理解本书实例数据库应用系统需求

概述: Borland公司的Delphi是一个非常优秀的数据库应用系统前端开发工具。这是由于Borland Delphi自1995年2月诞生Version 1.0以后,1996年3月,Borland Delphi Client/Server Suite 2.0以其高效的数据重用功能得以在美国国家软件测试实验室进行的软件评估中获得了最高评价。随后,Borland又推出Delnhi的第三代版本——Delphi 3.0多层Client/Server的32位快速开发工具。

※1.1 数据库应用系统概述 数据库应用系统是一种应用计算机技术完成数据处理的计算机应用系统,数据处理则指对各种形式的数据进行采集、存储、加工和传播的一系列活动的总和。进行数据处理的目的是为了从大量原始数据中获得对人类社会活动有价值的信息,以作为行动和采取对策的依据。 数据处理的中心问题是数据管理,包括对数据的分类、组织、编码、存储、检索和维护,这就构成了数据库应用系统的功能需求。

可见,数据库应用系统包括如下三个部分: (1)数据库; (2)数据库管理系统; (3)数据库应用程序。 因此,开发数据库应用系统需要选择一种数据库管理系统;然后,在其支持之下建立数据库;最后,使用一种开发工具编制数据库应用程序。本书所要介绍的Borland Delphi就是一种可用于编制数据库应用程序的开发工具。

DELPHI 数据库(基本编辑操作)

五、数据库1(基本编辑操作) 步骤一:开始---程序---Borland Delphi 6---BDE---Object---New---OK(默认STANDARD)---PATH---设置为含有数据库文件的目录下。 步骤二:向Form1中添加Table组件(BDE组中),DatabaseName---STANDARD1(上一步创建的),TableName---Pza.DBF。添加DataSource 组件(Data Access组中),DataSet---Table1。添加DBGrid组件(Data Controls 组中)DataSource---DataSource1。添加DBNavigator1组件(Data Controls 组中)DataSource---DataSource1。 向Form1中添加6个Button(Button1…Button6) , Caption依次为”添加”,”删除”,”修改”,”确定”,”取消”,”退出”

步骤三: 1.声明一个procedure (public后面一行): procedure setstate(s:integer); //0:browse;1:edit or insert 定义这个procedure(implementation {$R *.dfm}后面一行): procedure TForm1.setstate(s:integer); begin if s=0 then begin button1.Enabled:=True; button2.Enabled:=True; button3.Enabled:=True; button4.Enabled:=False; button5.Enabled:=False; button6.Enabled:=True; end else begin button1.Enabled:=False; button2.Enabled:=False; button3.Enabled:=False; button4.Enabled:=True; button5.Enabled:=True; button6.Enabled:=False; end; end; 2.定义变量x(implementation下面一行): var x:integer; 3.打开Table(Form1---OnActivate) : Table1.Open; setstate(0);

DELPHIXE移动开发调用的例子方法

调用的例子方法: uses Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, https://www.360docs.net/doc/8f293203.html,; procedure Call_URI(const AAction : JString;const AURI: string); var uri: Jnet_Uri; Intent: JIntent; begin uri := StrToJURI(AURI); Intent := TJIntent.JavaClass.init(AAction, uri); {Intent.putExtra() 如果是要发短信等复杂的应用,需要传递各种其他的参数.要用到Intent.putExtra()传递多个参数. 这里只封装最简单的,具体Intent.putExtra()的用法,可以查询Java的资料.大把的 } SharedActivityContext.startActivity(Intent); end; //使用例子: //打电话 Call_URI(TJIntent.JavaClass.ACTION_CALL, 'tel:137114553XX'); //打开地图显示某个坐标点 Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'geo:38.899533,-77.036476'); //发送电子邮件 Call_URI(TJIntent.JavaClass.ACTION_SENDTO, 'mailto:wr960204@https://www.360docs.net/doc/8f293203.html,'); //播放音乐 Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'file:///sdcard/download/最炫民族风.mp3'); 调用的例子方法: ===========================我是分割线================================================== android 系统常用URI: android 系统常用URI: android 系统常用URI: android 系统常用URI: 显示网页: 1. Uri uri = Uri.parse("https://www.360docs.net/doc/8f293203.html,"); 2. Intent it = new Intent(Intent.ACTION_VIEW,uri); 3. startActivity(it); 显示地图:

相关文档
最新文档