请教下面的“:LSTITM”中的“:”的含义,请解释并指名如何从delphi的help中查找到(100分)

  • 主题发起人 主题发起人 chenz
  • 开始时间 开始时间
C

chenz

Unregistered / Unconfirmed
GUEST, unregistred user!
//LSTITM是一Tdbedit的name,Datafield亦是LSTITM

USYSLST.InsertSQL.CLEAR;
USYSLST.InsertSQL.Add('INSERT INTO SYSLST ');
USYSLST.InsertSQL.Add(' ( LSTENO, LSTITM, LSTNAM, LSTMRK ) ');
USYSLST.InsertSQL.Add(' VALUES ');
USYSLST.InsertSQL.Add(' ('''+LIST_STR+''',:LSTITM,:LSTNAM,:LSTMRK ) ');
 
:LSTITM,:LSTNAM,:LSTMRK相当于变量的声明。
你上面那段程序完整的写法应该如下:
USYSLST.InsertSQL.Close;
USYSLST.InsertSQL.CLEAR;
USYSLST.InsertSQL.Add('INSERT INTO SYSLST ');
USYSLST.InsertSQL.Add(' ( LSTENO, LSTITM, LSTNAM, LSTMRK ) ');
USYSLST.InsertSQL.Add(' VALUES ');
USYSLST.InsertSQL.Add(' ('''+LIST_STR+''',:LSTITM,:LSTNAM,:LSTMRK ) ');
ParamByName('LSTITM').AsString:=Edit1.text;//LSTITM字段为String型
ParamByName('LSTNAM').AsInteger:=StrToInteger(Edit2.Text);
//LSTHAM字段为Integer型
ParamByName('LSTNRK').AsBoolean:=CheckBox1.Checked;
//LSTNRK字段为Boolean型.
USYSLST.InsertSQL.ExecSQL;
在DELPHI帮助中你可以搜索"ParamByName"可以得到详细的帮助。
 
风中的狼,这是全部代码,请指教:
unit SELOOKUPL;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBTables, Db, Grids, DBGrids, ComCtrls, StdCtrls, Mask, DBCtrls, Buttons,
ToolWin, Menus, JEdit, ExtCtrls;

type
TFMSELOOKUPL = class(TForm)
LBTAEID: TLabel;
LBTAEMRK: TLabel;
Label2: TLabel;
DBGrid1: TDBGrid;
QSYSLST: TQuery;
DSSYSLST: TDataSource;
USYSLST: TUpdateSQL;
LSTITM: TDBEdit;
LSTNAM: TDBEdit;
LSTMRK: TDBEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
QSYSLSTLSTENO: TStringField;
QSYSLSTLSTITM: TStringField;
QSYSLSTLSTNAM: TStringField;
QSYSLSTLSTMRK: TStringField;
BTNINS: TSpeedButton;
BTNUPD: TSpeedButton;
BTNDEL: TSpeedButton;
BTNYES: TSpeedButton;
BTNCAL: TSpeedButton;
BTNQUT: TSpeedButton;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BTNINSClick(Sender: TObject);
procedure BTNUPDClick(Sender: TObject);
procedure BTNDELClick(Sender: TObject);
procedure BTNYESClick(Sender: TObject);
procedure BTNCALClick(Sender: TObject);
procedure BTNSERClick(Sender: TObject);
procedure BTNQUTClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
FORMMODE : STRING;
// CANSAVE:BOOLEAN;
procedure BTNMODE;
procedure INSERTMODE;
procedure UPDATEMODE;
procedure NORMALMODE;

public
{ Public declarations }
LIST_STR : STRING;
end;


var
FMSELOOKUPL: TFMSELOOKUPL;

implementation

uses UN_UTL, FM_UTL, DB_UTL;
{$R *.DFM}



procedure TFMSELOOKUPL.BTNMODE;
begin
//一般模式
BTNINS.Enabled := FALSE;
BTNUPD.Enabled := FALSE;
BTNDEL.Enabled := FALSE;
BTNYES.Enabled := FALSE;
BTNCAL.Enabled := FALSE;
BTNQUT.Enabled := FALSE;
//新增修改模式
if (FORMMODE = 'INS' ) or (FORMMODE = 'UPD' ) then
BEGIN
BTNINS.Enabled := FALSE;
BTNUPD.Enabled := FALSE;
BTNDEL.Enabled := FALSE;
BTNYES.Enabled := TRUE;
BTNCAL.Enabled := TRUE;
BTNQUT.Enabled := FALSE;
END;
//一般模式
if (FORMMODE = 'CAN' ) then
BEGIN
BTNINS.Enabled := TRUE;
BTNUPD.Enabled := TRUE;
BTNDEL.Enabled := TRUE;
BTNYES.Enabled := FALSE;
BTNCAL.Enabled := FALSE;
BTNQUT.Enabled := TRUE;
END;

IF TRIM(LSTITM.Text) = '' THEN
BEGIN
BTNUPD.Enabled := FALSE;
BTNDEL.Enabled := FALSE;
END;

end;

procedure TFMSELOOKUPL.INSERTMODE;
begin
FORMMODE := 'INS';
BTNMODE;

DBGrid1.Enabled := FALSE;

LSTITM.Enabled := TRUE;
LSTNAM.Enabled := TRUE;
LSTMRK.Enabled := TRUE;
end;

procedure TFMSELOOKUPL.UPDATEMODE;
begin
FORMMODE := 'UPD';
BTNMODE;

DBGrid1.Enabled := FALSE;

//LSTITM.Enabled := TRUE;
LSTNAM.Enabled := TRUE;
LSTMRK.Enabled := TRUE;
end;

procedure TFMSELOOKUPL.NORMALMODE;
begin
FORMMODE := 'CAN';
BTNMODE;

LSTITM.Enabled := FALSE;
LSTNAM.Enabled := FALSE;
LSTMRK.Enabled := FALSE;

DBGrid1.Enabled := TRUE;
DBGrid1.SetFocus;
end;






procedure TFMSELOOKUPL.FormCreate(Sender: TObject);
begin
//


end;

procedure TFMSELOOKUPL.FormActivate(Sender: TObject);
begin
QSYSLST.SQL.CLEAR;
QSYSLST.SQL.ADD('SELECT * FROM SYSLST ');
QSYSLST.SQL.ADD('WHERE LSTENO = '''+LIST_STR+'''');
QSYSLST.SQL.ADD('ORDER BY LSTENO,LSTITM ');

USYSLST.InsertSQL.CLEAR;
USYSLST.InsertSQL.Add('INSERT INTO SYSLST ');
USYSLST.InsertSQL.Add(' ( LSTENO, LSTITM, LSTNAM, LSTMRK ) ');
USYSLST.InsertSQL.Add(' VALUES ');
USYSLST.InsertSQL.Add(' ('''+LIST_STR+''',:LSTITM,:LSTNAM,:LSTMRK ) ');

USYSLST.ModifySQL.CLEAR;
USYSLST.ModifySQL.Add('UPDATE SYSLST ');
USYSLST.ModifySQL.Add('SET ');
USYSLST.ModifySQL.Add('LSTITM = :LSTITM ,');
USYSLST.ModifySQL.Add('LSTNAM = :LSTNAM ,');
USYSLST.ModifySQL.Add('LSTMRK = :LSTMRK ');
USYSLST.ModifySQL.Add('WHERE LSTENO = '''+LIST_STR+'''');
USYSLST.ModifySQL.Add(' AND LSTITM = :OLD_LSTITM');

USYSLST.DeleteSQL.CLEAR;
USYSLST.DeleteSQL.Add('DELETE FROM SYSLST ');
USYSLST.DeleteSQL.Add('WHERE LSTENO = '''+LIST_STR+'''');
USYSLST.DeleteSQL.Add(' AND LSTITM = :OLD_LSTITM');

QSYSLST.CLOSE;
QSYSLST.OPEN;

NORMALMODE;
end;



procedure TFMSELOOKUPL.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//Form 要结束前的询问(系统事件)
CanClose := True;
if (FORMMODE = 'INS' ) or (FORMMODE = 'UPD' ) then
begin
MessageDlg('请先结束输入模式后再退出!',mtConfirmation,[mbOk],0);
CanClose := False;
end;

end;



procedure TFMSELOOKUPL.BTNINSClick(Sender: TObject);
begin
INSERTMODE;
QSYSLST.APPEND;
QSYSLSTLSTENO.VALUE := LIST_STR ;
QSYSLSTLSTITM.VALUE := '' ;
QSYSLSTLSTNAM.VALUE := '' ;
QSYSLSTLSTMRK.VALUE := '' ;
LSTITM.SetFocus;
end;

procedure TFMSELOOKUPL.BTNUPDClick(Sender: TObject);
begin
UPDATEMODE;
QSYSLST.Edit;
LSTNAM.SetFocus;
end;

procedure TFMSELOOKUPL.BTNDELClick(Sender: TObject);
begin
NORMALMODE;


IF MessageDlg('是否确定要删除此条记录吗?',mtWarning, [mbYes, mbNo], 0) = mrYes then
BEGIN
IF MessageDlg('如果您按下确定按钮此条记录将会被删除',mtWarning, [mbYes, mbNo], 0) = mrYes then
BEGIN
QSYSLST.Delete;

try
QSYSLST.Database.STARTTRANSACTION;
QSYSLST.ApplyUpdates;
QSYSLST.CommitUpdates;
QSYSLST.Database.COMMIT;
except
QSYSLST.Database.ROLLBACK;
QSYSLST.CANCELUpdates; SHOWMESSAGE('存盘失败!');
end;

NORMALMODE;
END;
END;

end;

procedure TFMSELOOKUPL.BTNYESClick(Sender: TObject);
begin


if (FORMMODE = 'INS' ) then
BEGIN

IF (TRIM(LSTITM.Text) = '' ) OR
(TRIM(LSTNAM.Text) = '' ) THEN
BEGIN
SHOWMESSAGE('编号及名称不能为空!');
EXIT;
END;

//删除空白
QSYSLSTLSTITM.VALUE := TRIM(LSTITM.Text);

if TABLECHECK_RE2('SYSLST','LSTENO','LSTITM',LIST_STR, LSTITM.Text) > 0 THEN
begin
SHOWMESSAGE('此编号已经重复使用!');
EXIT;
end;
END;





Case MessageDlg('是否确定储存此条记录?',mtConfirmation,[mbYes,mbNo,mbCancel],0) of
mrYES :begin
try
QSYSLST.Post;
QSYSLST.Database.STARTTRANSACTION;
QSYSLST.ApplyUpdates;
QSYSLST.CommitUpdates;
QSYSLST.Database.COMMIT;
except
QSYSLST.Database.ROLLBACK;
QSYSLST.CANCELUpdates; SHOWMESSAGE('存盘失败!');
end;

NORMALMODE;
end;
mrNO :begin
NORMALMODE;
end;
end;


end;

procedure TFMSELOOKUPL.BTNCALClick(Sender: TObject);
begin

IF MessageDlg('确定不新增本条记录?',mtConfirmation,[mbYes,mbNo],0)=mrYes Then
begin
QSYSLST.Cancel;
NORMALMODE;
end;

end;

procedure TFMSELOOKUPL.BTNSERClick(Sender: TObject);
begin
NORMALMODE;
end;

procedure TFMSELOOKUPL.BTNQUTClick(Sender: TObject);
begin
NORMALMODE;
close;
end;


procedure TFMSELOOKUPL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FMSELOOKUPL.RELEASE;
end;



procedure TFMSELOOKUPL.N1Click(Sender: TObject);
begin
CLOSE;
end;

end.
 
先给风中的狼加100分,另出200分求最终答案!
 
程序没什么问题。
不过按我的编程习惯,我是喜欢使用两个Query,一个用作查询,和DBGrid连接,另一个
则用来增加、修改、删除记录。
同时另用两个窗口,一个用作增加记录,另一个用作修改记录。删除则只要一条语句就够
了。
这样的好处是显示界面看起来不会太乱,而且错误操作的可能性也小一点。
这样主界面上只需要放置4个SpeedButton:BTNINS,BTNUPD,BTNDEL,BTNQUT
BTNINS用来打开新增记录窗口;BTNUPD用来打开BTNUPD窗口。
因为正常情况下不管有没有记录,BTNINS和BTNQUT的Enabled属性都应该为True
所以只要在查询完记录后,看Query的RecordCount是否为0,如果是,则另两个BTN
的Enabled属性为False,否则为True。
从而也减少了代码。
如果需要,留下你的伊妹儿。明天我把修改好的源程序给你发过去。
 
此代码来自清华出版社的《delphi构建进销存系统-POS系统开发实例》中的一窗体的全部代码,
vcl/dbse/selookupl.pas,非常简单实用,只是对这insert语句中的几个“:”不理解,请指点迷津!
 
Insert语句太长了,就用Select语句来说,反正都是一样。如下面一条语句:
Select * From Tablename Where 字段=.......
当你确定你想查询的是一个常量时,如(风中的狼),上面一条语句
可以写成
Select * From Tablename Where 字段='风中的狼';
但程序在实际运行时,绝大多数都是从程序中取来的不确定值,如Edit1.text
你在编写程序时,不可能知道用户将在Edit1中输入什么。
所以就采用:+一个字符串的方式告诉通知,想要查询的值是一个活动数据。
如:LSTITM相当于在SQL语句中定义了一个变量名为LSTITM的临时变量。
如想按Edit1.text来查询
则用Query的paramByName属性来赋与。如:
ParamByName('LSTITM').AsValue:=Edit1.text;
而语句
Select * From Tablename Where 字段=:LSTITM;
ParamByName('LSTITM').AsValue:=Edit1.text;
等价于
Select * From Tablename Where 字段='''+Edit1.Text+''';

 
非常感谢风中的狼大侠耐心解释,不过要是能告知如何在help中找到相关描述最好,比如说
此"LSTITM相当于在SQL语句中定义了一个变量名为LSTITM的临时变量"为啥未先定义而直接使
 
呵呵,在DELPHI帮助中你可以搜索"ParamByName"可以得到详细的帮助,其实随便哪本
写DELPHI编程的书上,只要是有关于SQL的,都有这方面的详细解释。
如果你手头上没书,可以到网上搜索一下,关于SQL的书到处都有。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
864
DelphiTeacher的专栏
D
S
回复
0
查看
947
SUNSTONE的Delphi笔记
S
后退
顶部