不知道微软还有没有脸,用VB的ADO后期绑定测试了一下相同的流程,竟然要一个多小时! 如何提高ADO简单过程(Edit…Post Next)的效率(500分)

  • 主题发起人 主题发起人 jsxjd
  • 开始时间 开始时间

1 两者兼有。其实这种库结构我已经给了较高效率的代码,
只需要一次扫描库,即可完成。至于效率的问题,是想把
这样的表转换成 “父-子” 结构表时产生的一个问题。一个
cpdm 不管后面补不补0,它的父的 cpdm 必须由前面几条
记录来决定。就拿不补0的情况:
11
1111
111111 这个代码的父代码是 1111
但如果没有 1111,而有 11,则它的父代码是 11,等等!
2 由于cpdm 层次的不完全,相对层次很好确定,绝对层次必须动态获得.
这和获得父节点代码的情况类似。

3 上面已有讨论,是为了提高构造树的效率
4 VFP对SQL的支持是极有限的,上面也提及。
 
KAO,还没放分!
 
提出有效的解决方案,你的方法我都知道的。
 
是不是这样呀?
代码:
const
  Levels: array [1..8] of byte = (1,1,2,3,4,4,5,5);
  LevelLen: array [0..5] of byte = (0, 2, 3, 4, 6, 8);
var
  PNode, Node: TTreeNode;
  code, s, sql: string;
  lv, n: Integer;

  function GetLevel(const s: string): Integer;
  begin
    Result:=1;
    if copy(s,3,6)='000000' then exit;
    Result:=2;
    if copy(s,4,5)='00000' then exit;
    Result:=3;
    if copy(s,5,4)='0000' then exit;
    Result:=4;
    if copy(s,7,2)='00' then exit;
    Result:=5;
  end;

begin
  pnode := nil;
  code := '';
  sql := '';
  lv := 1;
  Treeview1.items.BeginUpdate;
  Treeview1.Items.Clear;
  with adoDataset1 do
  begin
    ConnectionString:=getVFConnStr('d:/dbTest');
    adocommand1.connectionstring := connectionstring;
    commandtext := 'select cpdm, cpcm from gypcbz order by cpdm';
    open;
    while not eof do
    begin
      code := fields[0].asstring;
      n := getlevel(code);
      if n > lv then
      begin
        pnode := node;
        lv := lv+1;
      end
      else if n < lv then
        while lv > n do
        begin
          pnode := pnode.parent;
          dec(lv);
        end;
      s :=copy(code, 1, levellen[lv]);
      node := treeview1.items.AddChild(pnode, '['+s+']'+fields[1].asstring);
      // 如果想在最后一起执行
      sql := sql + 'update gypcbz set id='''+s+''', p_id='''+copy(code, 1, levellen[lv-1])+''''#13#10;
      {如果不想在最后一起执行
      adocommand1.commandtext := 'update gypcbz set id='''+s+''', pid='''+copy(code, 1, levellen[lv-1])+'''';
      adocommand1.execute;
      }
      next;
    end;
    close;
    { 如果最后一起执行
    adocommand1.commandtext := sql;
    adocommand1.execute;
    }
  end;
end;
 
不知道VFP是否支持以后Sql语句,没测试,只提供参考:
构造更新字符串的过程:
function UpdateStr(Id,p_id :string) :string;
var
sql1,sql2 :string;
begin
sql1 :='';
sql2 :='';
while ... do
begin
sql1 :=Sql1 +' when 当前Id值 then Id(新值) ';
sql2 :=sql2 +' when 当前Id值 then p_id(新值)';
end;
Sql1 :=' Set Id= case Id '+Sql1+' end ';
Sql2 :=' p_id case Id '+Sql2+' end ';
Result :='Update 表名 '+Sql1 +' , '+Sql2;
end;

请参照 case ... when ... then 的用法
good luck!
 
泥这个偶知道,深度优先原则,不过编码是有层次限制的!!! 比较适合用在财务等编码较固定的地方。
偶要的是没有层次限制的,

http://www.delphibbs.com/delphibbs/dispq.asp?LID=1508737
继续讨论。。。
 
用DAO啦,如果ADO好的话,MS早就把它封装到MFC里啦,[:(!]以后不准骂MS。
 
dao已经过时了吧!
 
后退
顶部