begin
    with DataModule6.ADOQuery1 do
    begin
      Close;
      sql.Text := 'select * from 客户档案 order by ' ;      sql.Text := sql.Text + Combobox12.Text;
      if (RadioGroup1.ItemIndex=1) then
        sql.Text := sql.Text + ' Desc';      sql.Text := sql.Text + ',' + Combobox13.Text;
      if (RadioGroup2.ItemIndex=1) then
        sql.Text := sql.Text + ' Desc';      sql.Text := sql.Text + ',' + Combobox14.Text;
      if (RadioGroup3.ItemIndex=1) then
        sql.Text := sql.Text + ' Desc';
      Open;
    end;
end;上面的代码的问题在于:当我同时选择Combobox12,Combobox13,Combobox14里的字段时,程序能运行。如果我有一个没选,则程序会出现错误……我问了一些人,估计是没有做出判断,但是我又不会写代码,望高手留步,解决一下,不甚感激!顺便说明一下,这里要考虑优先级,类似excel的排序!combobox12优于Combobox13,Combobox13优于Combobox14.
还有我在询问的时候,发现一个问题,貌似desc是只能弄一次……所以、可能我这个程序是不是全部要改的啊?

解决方案 »

  1.   

    看你是要 怎么个选择法,添加Or  或者 and 
      

  2.   

    begin
      with DataModule6.ADOQuery1 do
      begin
      Close;
      sql.Text := 'select * from 客户档案 order by ' ;if Combobox12.Text<>'' then
    begin
      sql.Text := sql.Text + Combobox12.Text;
      if (RadioGroup1.ItemIndex=1) then
      sql.Text := sql.Text + ' Desc';
    end;if Combobox13.Text<>'' then
    begin
      sql.Text := sql.Text + ',' + Combobox13.Text;
      if (RadioGroup2.ItemIndex=1) then
      sql.Text := sql.Text + ' Desc';
    end;if Combobox14.Text<>'' then
    begin
      sql.Text := sql.Text + ',' + Combobox14.Text;
      if (RadioGroup3.ItemIndex=1) then
      sql.Text := sql.Text + ' Desc';
    end;  Open;
      end;
    end;
      

  3.   

    sql.Text := 'select * from 客户档案 order by ' ;三个都没选择 order by 后面没有字段
      

  4.   

    var
      sOrderBy: string;
    begin
      with DataModule6.ADOQuery1 do
      begin
        Close;
        sOrderBy := '';
        if Trim(Combobox12.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox12.Text +
            IfThen(RadioGroup1.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox13.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox13.Text +
            IfThen(RadioGroup2.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox14.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox14.Text +
            IfThen(RadioGroup3.ItemIndex = 1, ' desc ', '');
        end;
        if sOrderBy <> EmptyStr then
          sOrderBy := Copy(sOrderBy, 2, Length(sOrderBy) - 1); //去掉开始的逗号
        SQL.Text := 'select * from 客户档案 ' + sOrderBy;
        Open;
      end;
    end;
      

  5.   

    我的选择已经讲的很清楚啊,用的是radiogroup组件,column属性是2,items为升序、降序……{sql.Text := 'select * from 客户档案 order by ' ;三个都没选择 order by 后面没有字段 }
    这个问题,因为字段在combobox中,我这个是DBgrid与combobox相连的,当表格中的字段名改变,同时combobox的下拉内容的字段也改变……
    楼上说道德没有字段,我不知道怎么添加?……
       
      

  6.   


    s1:='select * from 客户档案 ';
    s2:='';if Combobox12.Text<>'' then
    begin
      s2 := s2 + Combobox12.Text;
      if (RadioGroup1.ItemIndex=1) then
      s2 := s2 + ' Desc';
    end;if Combobox13.Text<>'' then
    begin
      if s2<>'' then
        s2:=s2+',';
      s2 := s2 + Combobox13.Text;
      if (RadioGroup2.ItemIndex=1) then
      s2 := s2 + ' Desc';
    end;if Combobox14.Text<>'' then
    begin
      if s2<>'' then
        s2:=s2+',';
      s2 := s2 + Combobox14.Text;
      if (RadioGroup3.ItemIndex=1) then
      s2 := s2 + ' Desc';
    end;if s2<>'' then
      sql.text:=s1+' order by '+s2
    else
      sql.text:=s1;
      

  7.   

    我的少写一个order by
    var
      sOrderBy: string;
    begin
      with DataModule6.ADOQuery1 do
      begin
        Close;
        sOrderBy := '';
        if Trim(Combobox12.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox12.Text +
            IfThen(RadioGroup1.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox13.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox13.Text +
            IfThen(RadioGroup2.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox14.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox14.Text +
            IfThen(RadioGroup3.ItemIndex = 1, ' desc ', '');
        end;
        if sOrderBy <> EmptyStr then
          sOrderBy :=' order by ' +Copy(sOrderBy, 2, Length(sOrderBy) - 1); //去掉开始的逗号
        SQL.Text := 'select * from 客户档案 ' + sOrderBy;
        Open;
      end;
    end;
      

  8.   

    楼上的,系统不知道ifthen,我也不知道还可以这么用……你是不是写错了?
      

  9.   

    7楼,我验证了一下你的,发现S1,S2没有定义,然后我自行写了S1,S2:string,可是还是有问题……汗!
      

  10.   

    你看看执行前的sql.text是什么,就知道是什么问题了
      

  11.   


    你应该是没有引用单元 你需要引用一下 StrUtils原型是:
    function IfThen(AValue: Boolean; const ATrue: string;
      AFalse: string = ''): string;
    begin
      if AValue then
        Result := ATrue
      else
        Result := AFalse;
    end;
      

  12.   

    我要写你的那个function吗?我本来黏上去了,可是系统说这问题那问题的,然后我就把它删了……只有这个我没加,其他就是根据你的来的……是不是这样才造成这种错误?如果要加的,你是通过什么途径写进去的,还是我直接可以在写确定按钮时写上去……
      

  13.   

    procedure TForm1.btn4Click(Sender: TObject);
    function IfThen(AValue: Boolean; const ATrue: string;
      AFalse: string = ''): string;
    begin
      if AValue then
        Result := ATrue
      else
        Result := AFalse;
    end;
    var
      sOrderBy: string;
    begin
      with DataModule6.ADOQuery1 do
      begin
        Close;
        sOrderBy := '';
        if Trim(Combobox12.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox12.Text +
            IfThen(RadioGroup1.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox13.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox13.Text +
            IfThen(RadioGroup2.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox14.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox14.Text +
            IfThen(RadioGroup3.ItemIndex = 1, ' desc ', '');
        end;
        if sOrderBy <> EmptyStr then
          sOrderBy :=' order by ' +Copy(sOrderBy, 2, Length(sOrderBy) - 1); //去掉开始的逗号
        SQL.Text := 'select * from 客户档案 ' + sOrderBy;
        Open;
      end;
    end;
      

  14.   

    procedure TForm1.btn4Click(Sender: TObject);
      function IfThen(AValue: Boolean; const ATrue: string;
        AFalse: string = ''): string;
      begin
        if AValue then
          Result := ATrue
        else
          Result := AFalse;
      end;
    var
      sOrderBy: string;
    begin
      with DataModule6.ADOQuery1 do
      begin
        Close;
        sOrderBy := '';
        if Trim(Combobox12.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox12.Text +
            IfThen(RadioGroup1.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox13.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox13.Text +
            IfThen(RadioGroup2.ItemIndex = 1, ' desc ', '');
        end;
        if Trim(Combobox14.Text) <> EmptyStr then
        begin
          sOrderBy := sOrderBy + ',' + Combobox14.Text +
            IfThen(RadioGroup3.ItemIndex = 1, ' desc ', '');
        end;
        if sOrderBy <> EmptyStr then
          sOrderBy := ' order by ' + Copy(sOrderBy, 2, Length(sOrderBy) - 1); //去掉开始的逗号
        SQL.Text := 'select * from 客户档案 ' + sOrderBy;
        Open;
      end;
    end;
      

  15.   

    现在的问题是,我单独选择combobox13,则程序会提示combobox12无效,然后出错……这个又怎么解决?
      

  16.   

    单独选择combobox12,则说combobox13列名无效!  疯掉!
    18楼,我等你的解决方案!
      

  17.   

    正好我比较闲,你加我QQ  [email protected]
      

  18.   

    procedure TForm3.Button6Click(Sender: TObject);
    function IfThen(AValue: Boolean; const ATrue: string;
      AFalse: string = ''): string;
    begin
      if AValue then
        Result := ATrue
      else
        Result := AFalse;
    end;var
      sOrderBy: string;
    begin
      with DataModule6.ADOQuery1 do
      begin
        Close;
        sOrderBy := '';
        if Trim(Combobox9.Text) <> EmptyStr then
        begin
          sOrderBy := Combobox9.Text +
            IfThen(RadioGroup1.ItemIndex = 1, ' desc ',' ');
        end;  if Trim(Combobox10.Text) <> EmptyStr then
          begin
          if  Trim(Combobox9.Text) <> EmptyStr then
              sOrderBy := sOrderBy + ' ,' + Combobox10.Text +
                          ifThen(RadioGroup2.ItemIndex = 1, ' desc ', ' ')
          else
              sOrderBy := sOrderBy + Combobox10.Text +
                          IfThen(RadioGroup2.ItemIndex = 1, ' desc ', ' ') ;
          end;  if Trim(Combobox12.Text) <> EmptyStr then
         begin
          if  (Trim(Combobox9.Text) <> EmptyStr )or (Trim(Combobox10.Text) <> EmptyStr )then
              sOrderBy := sOrderBy + ' ,' + Combobox12.Text +
                          ifThen(RadioGroup3.ItemIndex = 1, ' desc ', ' ')
          else
              sOrderBy := sOrderBy + Combobox12.Text +
                          IfThen(RadioGroup3.ItemIndex = 1, ' desc ', ' ');
         end;  if sOrderBy <> EmptyStr then
          SQL.Text := 'select * from 客户档案 order by ' + sOrderBy;      Open;
      end;
    end;
    这个就是没有问题的代码,希望能帮助那些和我一样有这困扰的人们……嘿嘿!