有 表1(CNO,MESSAGE)CNO                MESSAGE
-----------------------------------------
001    2021|AA|20070902
002    2022|CC|20070905
003    2058|BB|20070906在 Edit1.text输入 "001", 点击BitBtn1后 ,则在DBGridEh1显示如下CNO C1 c2    C3
-----------------------------------------
001 2021 AA 20070902通过分界符"|" 把MESSAGE字符串 “2021|AA|20070902“ 分为3列
在Edit1.text再次输入“002“ ,点击BitBtn1后  DBGridEh1 结果如下CNO C1 c2 C3 
--------------------------------- 
001 2021 AA 20070902
002 2022 CC 20070905
只有当点击BitBtn2后,才将DBGridEh1的结果集 插入到
表2(CNO, C1, c2, C3)
数据库是sybase,新手发帖,帮忙回答一下,谢了!

解决方案 »

  1.   

      with TStringList.Create do
      try
        CommaText := StringReplace(S, '', ',', [rfReplaceAll]);    ....
      finally
        Free;
      end;
      

  2.   

    谢谢,budded 
    能不能具体一点啊,这样对于现在的我来说太难了啊~
      

  3.   

    uses IdStrings;
    var
      s : string;
      sl : TStringList;
      i : Integer;
    begin
      s := 'asd 3243|435 456346|4364654';
      sl :=TStringList.Create;
      SplitColumns(s,sl,'|');
      for i:=0 to sl.Count-1 do
        ShowMessage(sl.Strings[i]);
      sl.Free;
    end;
      

  4.   

    SplitColumns是自定义函数吧,楼上的代码没贴全
      

  5.   


    实现大概也就是这样var
      stringList:TStringList;
      IntI:Integer;
      procedure SplitColumns(subStr:string;s:string;var strList:TStringList);
      var
        Index:Integer;
      begin
        Index:=Pos( subStr, s );
        while Index > 0 do
        begin
          strList.Add( Trim( Copy( s, 1, Index-1 ) ) );
          s:=copy( s, Index+1, length( s ) - Index );
          Index:=Pos( subStr, s );
        end;
        strList.Add( Trim( s ) );
      end;
    begin
      stringList:= TStringList.Create;
      SplitColumns( '&','2021 &brvbarAA &brvbar20070902',stringList );
      self.ListBox1.Items.Assign( stringList );
      stringList.Free;
    end;
      

  6.   

    我不会用Sybase,SQL函数如下(自己转化为Sybase):
    CREATE function GetIndexStr(@s varchar(30),@Idx int,@c char) returns varchar(30)
    as
    begin
      declare @strTmp varchar(30)
      if (@Idx <= 0) or (CharIndex(@c,@s) = 0)
        set @strTmp = @s
      else if @Idx = 1
        set @strTmp = SubString(@s,1,CharIndex(@c,@s)-1)
      else
        set @strTmp = GetIndexStr(SubString(@s,CharIndex(@c,@s)+1,len(@s)),@Idx-1,@c)
      return @strTmp
    end然后再用SQL语句得出数据集
    select CNO,GetIndexStr(Message,1,'¦') C1,GetIndexStr(Message,2,'¦') C2,
    GetIndexStr(Message,3,'¦') C3 from 表1 where CNO <= ''' + Edit1.text +'''
      

  7.   

    SplitColumns是IdStrings.pas里的函数,
    它修正了TStrings.DelimitedText和TStrings.Delimiter将空格也作为分隔符的问题IdStrings.pas是Indy提供的一个字符单元,D6以上版本自带
      

  8.   

    谢谢 sdzeng 的提供的函数!ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select  CNO,MESSAGE  from 表1 where CNO='''+edit1.Text+'''');  //函数如何套用在语句里面实现如下结果???
    ADOQuery1.Open;
    CNO     C1       C2          C3
    ----------------------------------------- 
    001    2021      AA       20070902 还有怎样实现在Edit1.text再次输入“002“ ,点击BitBtn1后  DBGridEh1 结果如下 CNO C1         C2       C3  
    ---------------------------------  
    001    2021    AA    20070902 
    002    2022    CC    20070905 
    只有当点击BitBtn2后,才将DBGridEh1的结果集 插入到 
    表2(CNO, C1, c2, C3) 
      

  9.   

    使用adoquery缓存更新就可以了
      

  10.   

    DataSet不是有计算字段吗?用它。
      

  11.   

    DELPHI 怎么就不能像SQLSERVER 那么活跃呢??? 晕~~~~~~~~
      

  12.   

    jing12的方法可以实现你的目的