起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: sydneyyue

【结帖】通过数据集更新的sql语句中,where语句部分主键丢失**

[复制链接]
 楼主| 发表于 2008-6-16 10:23:10 | 显示全部楼层
bd_p_fields 中存的是字段和表的对应关系;ordername是动态获取过来的表名;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-16 10:36:04 | 显示全部楼层
顶下
回复 支持 反对

使用道具 举报

发表于 2008-6-16 10:49:36 | 显示全部楼层
楼主,在代码修改sql.text时,同时修改一下数据集的UpdateOptions(更新选项)试试:
1、设置更新模式为:主键
2、或者:直接设置更新的sql语句

NameSpace: Business.Data
--------------------------------------------------------------------------------
TDataSetUpdateOptions = class(Business.System.TPersistent)
protected
  procedure AssignTo(Dest: Business.System.TPersistent); override;
  function GetValue: TObject; virtual;
public
  constructor create;
  procedure Assign(Source: Business.System.TPersistent); override;
  procedure Destroy; override;
  function IsStored: Boolean;
  property AllowMultiRecordUpdates: Boolean;
  property DeleteSQL: string;
  property Enabled: Boolean;
  property Fields: TFieldUpdateOptionsConnection;
  property InsertSQL: string;
  property ResolveMode: TResolveMode;
  property SQL[TUpdateKind]: string;
  property UpdateMode: TUpdateMode;
  property UpdateSQL: string;
  property Value: TObject;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-16 14:12:52 | 显示全部楼层
好的,我试下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-17 14:30:13 | 显示全部楼层
在代码修改sql.text时,同时修改一下数据集的UpdateOptions(更新选项),不行会报错:

报错.jpg

12.17 KB, 下载次数: 125

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-17 14:31:34 | 显示全部楼层
按下面方法修改,也报上面的错误
procedure TMAINFORM.DataNavigatorBeforeAction(Sender: TObject; var Accept: Boolean);
var
datasourcename:string;
begin
  //得到当前代理的数据集id
  datasourcename:=TBizDataSetAction(DataNavigator.Buttons[0].Action).CurrentDataSource.DataSet.Name;
  if SysUtils.LowerCase(datasourcename)='datasetsbsjj' then
  begin
    if (TBizDataSetAction(Sender).ID = BizActnConsts.ActionDataSetSave )then
    begin
      DataSetBroker1.DataSet.UpdateOptions.UpdateMode:=TUpdateMode.upWhereKeyOnly;
    end;
  end;

end;
回复 支持 反对

使用道具 举报

发表于 2008-6-17 14:40:45 | 显示全部楼层
DataSetBroker1.DataSet.UpdateOptions.UpdateMode:=TUpdateMode.upWhereKeyOnly

要放在数据集打开事件之前设置,应该是30楼代码部分
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-17 17:33:31 | 显示全部楼层
//为数据集赋SQL,并显示某一具体记录
  with TSQLDataSet(DataSetBroker1.DataSet) do
  begin
    DataGrid1.DataSource:=nil;
    Close;
    sql.Clear;
    DataSetBroker1.DataSet.UpdateOptions.UpdateMode:=TUpdateMode.upWhereKeyOnly;
    SQL.Text:=ssql;
    DataSetBroker1.DataSet.Filtered:=true;
    DataGrid1.DataSource:=DataSetBroker1;
    open;
  end;

用上面的代码也是和35楼同样的错误
回复 支持 反对

使用道具 举报

发表于 2008-6-17 17:59:53 | 显示全部楼层
我这个测试的,可以的。
procedure TMainForm.Button1Click(Sender: TObject);
begin


  DataSetBroker1.DataSet.Close;
    Tsqldataset(DataSetBroker1.DataSet).sql.Clear;
   DataSetBroker1.DataSet.UpdateOptions.UpdateMode:=TUpdateMode.upWhereKeyOnly;
    Tsqldataset(DataSetBroker1.DataSet).SQL.Text:= 'SELECT *  FROM GXXXCSB ' ;
   DataSetBroker1.DataSet.Open;

end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-20 08:31:51 | 显示全部楼层
恩,也许是数据的问题。将编辑时间,在plsql中使用plsql下拉选择,保存,并提交后。在X3中就可以保存了。不过,只能提交一个,解决一个。解决问题的速度太慢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-19 07:23 , Processed in 0.040307 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表