为何这些语句有问题呢?急,谢谢!!!!(100分)

  • 主题发起人 主题发起人 mystergirl
  • 开始时间 开始时间
M

mystergirl

Unregistered / Unconfirmed
GUEST, unregistred user!
[?][?][?]procedure Tfrmxsmx.Button3Click(Sender: TObject);
var
vxh,vid,vcsrq,vrxnf,lqsj,vzzmmdm,vmzdm,vxbdm,vzydm,vbjdm,vxzdm,vyzbm: string;
begin
if Edit35.Text='' then begin
ShowMessage('考生号不能为空,请重新输入~~!');
Edit35.SetFocus;
Exit;
end;
if Edit33.Text='' then begin
ShowMessage('姓名不能为空,请重新输入~~!');
Edit33.SetFocus;
Exit;
end;

begin
if length(StrToInt(Edit30.Text))<>15 and length(StrToInt(Edit30.Text))<>18 then
begin
ShowMessage('身份证号不能为空、位数不够或太长,请重新输入~~!');
Edit30.SetFocus;
Exit;
end;
end;

if Edit29.Text ='' then
begin
Showmessage('政治面貌不能为空,请选择政治面貌!');
Edit29.SetFocus;
Exit;
end
else
begin
with DM.ADOzzmmdmQuery do
begin
Close;
Parameters.ParamByName('zzmmmc').Value:=Edit35.Text;
Open;
vzzmmdm :=FieldValues['zzmmdm'];
Close;
end;
end;
if mzmc.Text='' then begin
ShowMessage('民族不能为空,请选择正确的民族~~!');
mzmc.SetFocus;
Exit;
end
else
begin
with DM.ADOmzdmQuery do
begin
Close;
Parameters.ParamByName('mzmc').Value:=mzmc.Text;
Open;
vmzdm :=FieldValues['mzdm'];
Close;
end;
end;
if xbmc.Text='' then begin
ShowMessage('系部名称不能为空,请选择正确的系部名称输入~~!');
xbmc.SetFocus;
Exit;
end
else
begin
with DM.ADOxbmcQuery do
begin
Close;
Parameters.ParamByName('xbmc').Value:=xbmc.Text;
Open;
vxbdm :=FieldValues['xbdm'];
Close;
end;
end;
if Edit40.Text='' then begin
ShowMessage('专业不能为空,请选择正确的专业~~!');
Edit40.SetFocus;
Exit;
end
else
begin
with DM.ADOzydmQuery do
begin
Close;
Parameters.ParamByName('zymc').Value:=Edit40.Text;
Open;
vxbdm :=FieldValues['zydm'];
Close;
end;
end;
if Edit41.Text='' then begin
ShowMessage('班级不能为空,请选择正确的班级~~!');
Edit41.SetFocus;
Exit;
end
else
begin
with DM.ADObjdmQuery do
begin
Close;
Parameters.ParamByName('bjmc').Value:=Edit41.Text;
Open;
vbjdm :=FieldValues['bjdm'];
Close;
end;
end;
if xzComboBox.Text='' then
begin
Showmessage('学制不能为空,请选择正确的学制!');
end
else
begin
with DM.ADOxzdmQuery do
begin
Close;
Parameters.ParamByName('xzmc').Value:=xzComboBox.Text;
Open;
vxzdm :=FieldValues['xzdm'];
Close;
end;
end;
if Edit36.Text='' then begin
ShowMessage('来源地区不能为空,请重新输入~~!');
Edit36.SetFocus;
Exit;
end;
if Edit31.Text='' then begin
ShowMessage('联系电话不能为空,请重新输入~~!');
Edit31.SetFocus;
Exit;
end;
if length(Edit28.Text)<>6 then begin
ShowMessage('邮政编码输入有误,请重新输入~~!');
Edit28.SetFocus;
Exit;
end;
begin
vRXNF :=FormatDateTime('yyyy',DateTimepicker2.DateTime);
begin
with DM.ADOxbrxQuery DO
begin
Close;
Parameters.ParamByName['rxnf'] :=vrxnf;
Parameters.ParamByName['xbdm'] :=vxbdm;
Open;
vid :=FieldValues['vid'];
Close;
end;
end;

end;
if length(xh.Text)=10 then
begin
if vid >right((xh.Text),4) or vid=right((xh.Text),4)then
begin
Showmessage('你输入的学号不对或已经存在,学号:2005040001,2005代表入学年份,04代表你所在系部编号,0001是序号,请选择生成学号或重新输入!');
xh.SetFocus;
end;
end;
SQL.Clear;
SQL.Add('Select * from xsjbxx Where xh='''+vxh+'''');
Open;
if RecordCount=0 then
begin
Break;
end
else
begin
Edit;
InsertRecord([xh.Text,Edit35.Text,Edit34.Text,Edit33.Text,Edit32.Text,Edit31.Text,FormatDateTime('yyyy-mm-dd',DateTimepicker1.DateTime),Edit30.Text,vzzmmdm,vmzdm,vxbdm,vzydm,vbjdm,ComboBox12.Text,vxzdm,Edit38.Text,Edit36.Text,jzxm.Text,Edit31.Text,Edit39.Text,Edit28.Text,Edit27.Text,Edit26.Text,Edit37.Text,FormatDateTime('yyyy-mm-dd',DateTimepicker2.DateTime)]);
post;
Button9.Click;
end;
end;

end.

在判断身份证号是否满足15或18位时,用上面的语句怎么会有错误呢?
ADOxbrxQuery:select right(max(id),4) AS VID FROM XSRX_VIEW
where rxnf =:rxnf and xbdm =:xbdm,用于取出学号满足用户输入为入学年份+系部代码(2004020012)时的最大值,这样的语句也是问题,请问是怎么会有错误呢?
InsertRecord插入新的数据时,为了省去界面不需要的字段值,只插入界面需要的字段值。
以上是用户输入学生基本信息时进行判断的语句,但调试时却出现很多的问题?请各位大师指点,急!!!
 
先从前往后一个一个问题来解决,你的这句是有问题的:
if length(StrToInt(Edit30.Text))<>15 and length(StrToInt(Edit30.Text))<>18 then
改成:
if (length(Edit30.Text)<>15) and (length(Edit30.Text)<>18) then
//...
 
length(StrToInt(Edit30.Text))<>15 and length(StrToInt(Edit30.Text))<>18
改成
(length(Edit30.Text)<>15) and (length(Edit30.Text)<>18)
因为and 的操作优先级高于<>

至于另两个问题,说明一下出错提示,别人才好帮你判断
 
看来楼主对delphi的语法不是很熟,对数据库的操作也不是很通。你想实现的功能即是要向数据库添加一条新记录吧。
首先,if判断语法有问题,不管用and 还是or连接条件,各条件之间必须用()括起来
其次,向数据库写记录完全可以用sql语句直接执行,即insert into table(field1,field2...fieldN) values(value1,value2,...valueN),关键是要正确给出value1,value2,...valueN字段值,并确保类型跟数据库中字段类型一致,否则报错。
可通过adoquery 或adocommand来执行sql语句完成数据插入、更新、删除操作
 
是编译间出错,但if length(Trim(Edit30.Text))<>15 or length(Trim(Edit30.Text))<>18 then还是提示为Incompatible types,
ADOxbrxQuery:select right(max(id),4) AS VID FROM XSRX_VIEW
where rxnf =:rxnf and xbdm =:xbdm,用于取出学号满足用户输入为入学年份+系部代码(2004020012)时的最大值,这个主要表现为从表里取出入学年份+系部代码为200402时,学号后四位为最大,取出与用户输入的学号的后四位作比较,从而验证用户输入的学号是否正确,但编译时还是提示为[Error] Unit2.pas(984): Undeclared identifier: 'right'
[Error] Unit2.pas(984): Operator not applicable to this operand type
InsertRecord插入新的数据时,为了省去界面不需要的字段值,只插入界面需要的字段值。用这个语句,因为我的表里字段很多,而界面反应出来的并不是所有字段,所有想用这个语句实现插入新的数据进入表里,而没有涉及到的字段默认为NULL,难道这样的语句不能实现吗?急,请各位大师指点!谢谢!!!![?][?][?]
 
你没看仔细,这句不是这样写的:
if length(Trim(Edit30.Text))<>15 or length(Trim(Edit30.Text))<>18 then
应为:
if (length(Trim(Edit30.Text))<>15) or (length(Trim(Edit30.Text))<>18) then
 
谢谢!已经解决身份证号的验证了,但想问一个问题:若有两个查询ADOQUERY1和ADOQUERY2, 在第一个查询中,是从表里查询出一个字段A的值,能不能传给第二个查询里的一个字段值呢?如Parameters.ParamByName['xbdm'] :=vxbdm中的vxbdm,是由begin
with DM.ADOxbmcQuery do
begin
Close;
Parameters.ParamByName('xbmc').Value:=xbmc.Text;
Open;
vxbdm :=FieldValues['xbdm'];
Close;
end;
这里得到的值,这样能实现吗?
 
可以的。
 
后退
顶部