我的问题怎么没有人回答?是因为分少吗?我那个ID只有11分了,只好重新申请了一个!(200分)

  • 主题发起人 主题发起人 helpmehelpme
  • 开始时间 开始时间
H

helpmehelpme

Unregistered / Unconfirmed
GUEST, unregistred user!
BDE+ORACLE+delphi5
我一次写入一个月的记录,但有一个字段所有该月的记录都相同,所以我想用个edit,让
录入者只输入一次,然后统一提交!
Qry.CachedUpdates:=true;
Qry.RequestLive:=True;
Qry.UpdateObject:=UpdateSql1;
我QryUpdateRecord事件里这样写了一句
procedure frmMain.QryUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
inherited;
Qry.fieldbyname('MonthAction').asstring:=edtMonthAction.text;
end;
为什么老是报错说Qry is readonly?
我跟踪进去时,Qry.CanModify属性为true;

怎么解决?
 
Qry.RequestLive:=True;这句去掉,快试一下,有问题再说。
 
这个属性不能去掉,要不我就没法玩了!
我需要查询记录,然后在修改后提交!
 
怎么不能去掉。
Qry.CachedUpdates:=true;
说明你是用tupdatesql来实现update的!!!!
 
对不起,没说完,你的udpate的语句必须写在UpdateSql1的里modifysql里。
 
Qry.RequestLive:=False的话,我查询出来的数据是只读的数据,我怎么修改后提交?
 
sonie 说的对。如果你的 Query 是单表查询,则只要设 RequestLive 为 True,就可以自动
更新,无需为 UpdateObject 指定 UpdateSQL 组件。若是多表连结,则BDE 无法自动帮你
更新,设 RequestLive 是没用的,不要设为 True,必须为 UpdateObject 指定一个 UpdateSQL
组件,在 UpdateSQL 的 XXXSQL 属性中手工写好你的多表更新 SQL 语句,然后在 UpdateRecord
事件中调用 UpdateSQL 的 ExecSQL 或 Apply 方法分别更新所连结的各表,注意成功则设
UpdateAction 为 uaApplied。具体可以看看Delphi 带的 Demos/Db/Cacheup/ 目录下的那个
例子的。
 
我用Query单表查询,
我试了试若不指定UPDATEOBJECT组件,则会报错!
用了就不会!
我已经用别的方法解决了!

不过UpdateSql怎么用我还得好好看看书!
 
单表时设了 RequestLive 为 True 吗?要不可能跟你的 SQL 语句有关,贴出来看看?
 
你仔细看吧!
都是自动生成的!
我已经将REQUESTLIVE设置为TRUE

update Ma_calendar
set
CALENDAR_TYPE_ID = :CALENDAR_TYPE_ID,
CALENDAR_DATE = :CALENDAR_DATE,
SHIPPING_LT = :SHIPPING_LT,
HOLIDAY_SIGN = :HOLIDAY_SIGN,
SHIPPING_SIGN = :SHIPPING_SIGN,
SHIFT_SIGN = :SHIFT_SIGN,
M_WEEK_NUMBER = :M_WEEK_NUMBER,
Y_WEEK_NUMBER = :Y_WEEK_NUMBER,
CREATE_DATE = :CREATE_DATE,
CREATE_USER = :CREATE_USER,
UPDATE_DATE = :UPDATE_DATE,
UPDATE_USER = :UPDATE_USER
where
CALENDAR_TYPE_ID = :OLD_CALENDAR_TYPE_ID and
CALENDAR_DATE = :OLD_CALENDAR_DATE

insert into Ma_calendar
(CALENDAR_TYPE_ID, CALENDAR_DATE, SHIPPING_LT, HOLIDAY_SIGN,
SHIPPING_SIGN,
SHIFT_SIGN, M_WEEK_NUMBER, Y_WEEK_NUMBER, CREATE_DATE,
CREATE_USER,
UPDATE_DATE, UPDATE_USER)
values
(:CALENDAR_TYPE_ID, :CALENDAR_DATE, :SHIPPING_LT, :HOLIDAY_SIGN,
:SHIPPING_SIGN,
:SHIFT_SIGN, :M_WEEK_NUMBER, :Y_WEEK_NUMBER, :CREATE_DATE,
:CREATE_USER,
:UPDATE_DATE, :UPDATE_USER)

delete from Ma_calendar
where
CALENDAR_TYPE_ID = :OLD_CALENDAR_TYPE_ID and
CALENDAR_DATE = :OLD_CALENDAR_DATE
 
你得先
edit;
...
Qry.fieldbyname('MonthAction').asstring:=edtMonthAction.text;
..
post;
 
用了UpdateObject 就不用把 RequestLive 设为 True,上面我已说了。试试只设 RequestLive
为 True 而不要设 UpdateObject 怎么样?
 
我觉得在 CachedUpdates 为 True 时,应改为:
...
Qry.fieldbyname('MonthAction').NewValue:=edtMonthAction.text;
...
 
运行到
Qry.Prepare就报错!capability not support !
 
当我把REQUESTLIVE设置为FALSE时则不会有上面错误,可以查询数据,但不能修改数据!
 
贴一下你的 Query 的 SQL 语句?
 
const
strQry='select * from MA_CALENDAR where CALENDAR_TYPE_ID=:type '+
'and trunc(CALENDAR_DATE)>=trunc(:firstDayOfMonth) '+
'and trunc(CALENDAR_DATE)<=trunc(:lastDayOfMonth) order by CALENDAR_DATE';

procedure TPmms110.Search ;
begin
if trim(edtCaleTypeId.text)='' then
begin
DispErr('PMMS110-001: Invalid Value!');
edtCaleTypeId.SetFocus;
abort;
end;
if (trim(edtYear.text)='') or (strtoint(edtYear.text)<1980) or (strtoint(edtYear.text)>3000) then
begin
DispErr('PMMS110-001: Invalid Value!');
edtYear.SetFocus;
abort;
end;
if (trim(edtMonth.Text)='') or (strtoint(edtMonth.Text)>12) or (strtoint(edtMonth.Text)<1) then
begin
DispErr('PMMS110-001: Invalid Value!');
edtMonth.SetFocus;
abort;
end;
with dmPmms110.QryMA_CALENDAR do
begin
close;
Sql.Clear;
Sql.Add(strQry);
Parambyname('type').asstring:=edtCaleTypeID.Text ;
Parambyname('firstDayOfMonth').asdate:=getFirstDay(edtYear.Text,edtMonth.Text);
Parambyname('lastDayOfMonth').asdate:=getLastDay(edtYear.Text,edtMonth.Text);
Prepare;
Open;
if recordcount>0 then
DispQueryCount(recordcount);
end;
end;


 
bbkxjy:非常感谢你能帮我!
 
查了一下 RequestLive 的帮助,要真正能更新查询出来的数据,还需要后台数据库驱动
程序能够支持,看来只好按多表更新的方式去做。将 RequestLive 设成 False, 为
UpdateObject 指定一个 UpdateSQL 组件,为 UpdateSQL 组件的 XXXSQL 写 SQL 语句,
再在 Query 的 UpdateRecord 事件中根据 UpdateKind 执行 UpdateSQL 中相应的 SQL
语句进行更新。
procedure TdmPmms110.QryMA_CALENDARUpdateRecord(DataSet: TDataSet; UpdateKind:
TUpdateKind; var UpdateAction: TUpdateAction);
begin
UpdateSQL1.SetParams(UpdateKind);//假设 Query 的 UpdateObject 为 UpdateSQL1
UpdateSQL1.ExecSQL(UpdateKind);
UpdateAction := True;
end;
注意 UpdateSQL 的 Update 和 Delete 的 SQL 中,where 的条件应包含表的关键字字段,
才能在表中定位需要更新的记录。
 
Qry.RequestLive:=False
qry.close;
qry.sql.clear;
qry.sql.add('update MA_CALENDAR set MonthAction = "'+edtMonthAction.text+'"');
qry.execsql
 
后退
顶部