起步软件技术论坛-X3

 找回密码
 立即注册
搜索
123
返回列表 发新帖
楼主: hero419

【结贴】自动排序问题请教**

[复制链接]
发表于 2008-9-8 10:03:28 | 显示全部楼层
你默认有排序字段吗?是以序号排序的?还是以行号排序的?你以行号字段来排序吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-8 19:13:40 | 显示全部楼层
我是以序号来排序的。
如果以行号来排序,我又如何去修改排序呢(新增一条数据,让它排在前面)?行号只能取,不能改~~
回复 支持 反对

使用道具 举报

发表于 2008-9-9 09:56:37 | 显示全部楼层
楼主,你按照我这个试试看(我是在一个功能窗体中实现的效果):
1、定义私有变量
  private
    {private declarations}
    //记录旧序号和新序号
    vOldXH,vNewXH : Integer;
    //ID,表的关键字
    bh : String;
    //更新标志
    vFlag : Boolean;

2、窗体的OnShow事件里让vflag为真
procedure TMainForm.BizFormShow(Sender: TObject);
begin
  vFlag := True;
end;

3、在datasetbroker的OnBeforeEdit事件中记录旧序号
procedure TMainForm.DataSetBroker1BeforeEdit(DataSet: TDataSet);
begin
  if vFlag then
  begin
    //记录修改前的值
    vOldXH := DataSet.FieldByName('XH').AsInteger;
    bh := DataSet.FieldByName('ID').AsString;
  end;
end;

4、在datasetbroker的OnAfterPost事件中实现序号的更新
procedure TMainForm.DataSetBroker1AfterPost(DataSet: TDataSet);
var
  i : Integer;
begin
  if vFlag then
  begin
    vFlag := False;
    vNewXH := DataSet.FieldByName('XH').AsInteger;//ObjectHelper.ToInt(DataSet.FieldByName('XH').NewValue) ;//

    if vNewXH > vOldXH then
    begin
      DataSet.DisableControls;
      DataSet.Filter := ' XH >= ' + Business.System.SysUtils.IntToStr(vOldXH)
                      + ' AND XH <= ' + Business.System.SysUtils.IntToStr(vNewXH)
                      + ' AND ID <> '''+bh+''' ';
      DataSet.Filtered := True;
      DataSet.First;
      while not DataSet.Eof do
      begin
        DataSet.Edit;
        DataSet.FieldByName('XH').AsInteger := DataSet.FieldByName('XH').AsInteger - 1;
        DataSet.Next;
      end;
    end
    else
    begin
      DataSet.DisableControls;
      DataSet.Filter := ' XH <= ' + Business.System.SysUtils.IntToStr(vOldXH)
                      + ' AND XH >= ' + Business.System.SysUtils.IntToStr(vNewXH)
                      + ' AND ID <> '''+bh+''' ';
      DataSet.Filtered := True;
      DataSet.First;
      while not DataSet.Eof do
      begin
        DataSet.Edit;
        DataSet.FieldByName('XH').AsInteger := DataSet.FieldByName('XH').AsInteger + 1;
        DataSet.Next;
      end;
    end;
    DataSet.Filter := '';
    DataSet.Filtered := True;
    DataSet.EnableControls;
    vFlag := True;
  end
  else
    vFlag := True;
end;

5、控制新增数据的时候,不进行序号的重新编排
procedure TMainForm.DataSetBroker1BeforeInsert(DataSet: TDataSet);
begin
  vFlag := False;
end;

6、新增数据的时候,序号自增加
procedure TMainForm.DataSetBroker1AfterInsert(DataSet: TDataSet);
begin
  TSQLDataSet(DataSetBroker1.DataSet).FieldByName('XH').AsInteger := TSQLDataSet(DataSetBroker1.DataSet).RecordCount+1;
end;
回复 支持 反对

使用道具 举报

发表于 2008-9-9 09:59:53 | 显示全部楼层
以上仅供参考,未做详细测试,楼主自己调试一下吧
(另外,建议新增,保存之类的动作最好用自己的按钮来实现,不要用数据导航,这样自己好控制些)
效果图

snap11.png

10.91 KB, 下载次数: 162

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-9 21:45:57 | 显示全部楼层
我已经大概明白你的意思了,谢谢方工,结帖吧~~
回复 支持 反对

使用道具 举报

发表于 2008-9-10 08:34:41 | 显示全部楼层
ok,客气。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-22 06:51 , Processed in 0.043364 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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