机器名称 操作名称
M1  O1
M1  O2
M1  O3
M2  O1
M2  O2
M2  O4
M3  O2
M3  O3
M3  O4
上面的数据是从数据库中取出来的,要求把完成一次操作O1,O2,O3,O4所有可能用到的机器顺序都列出来,
想要的M的排序结果是:   O1   O2   O3   O4
                      M1   M1   M1   M2
                      M1   M1   M1   M3
                      M1   M1   M3   M2
                      M1   M1   M3   M3
                      M1   M2   M1   M2
                      M1   M2   M1   M3
                      M1   M2   M3   M2
                      M1   M2   M3   M3
                      M2   M1   M1   M2
                      M2   M1   M1   M3
                      M2   M1   M3   M2
                      M2   M1   M3   M3
                      M2   M2   M1   M2
                      M2   M2   M1   M3
                      M2   M2   M3   M2
                      M2   M2   M3   M3
请各位高手帮我看看,怎么编程阿?

解决方案 »

  1.   

    用SQL直接得到这样的结果可以不?
      

  2.   

    定义四个数组,用四个FOR循环就可以了吧.
      

  3.   

    create table  [tmp ](
             m [char](10) null,
             o [char](2) null
    )on [primary]
    go
        
    insert into tmp
    select' M1','O1'
    union
    select 'M1', 'O2'
    union
    select 'M1', 'O3'
    union
    select 'M2', 'O1'
    union
    select 'M2', 'O2'
    union
    select 'M2', 'O4'
    union
    select 'M3',  'O2'
    union
    select 'M3',  'O3'
    union
    select 'M3',  'O4'select distinct  a.m as '01', b.m as '02'  ,c.m as '03', d.m as '04'
     from tmp a , tmp b , tmp c, tmp d
    where a.o= 'O1'  and b.o = 'O2'  and c.o = 'O3' and  d.o = 'O4' 结果:
     M1        M1         M1         M2        
     M1        M1         M1         M3        
     M1        M1         M3         M2        
     M1        M1         M3         M3        
     M1        M2         M1         M2        
     M1        M2         M1         M3        
     M1        M2         M3         M2        
     M1        M2         M3         M3        
     M1        M3         M1         M2        
     M1        M3         M1         M3        
     M1        M3         M3         M2        
     M1        M3         M3         M3        
    M2         M1         M1         M2        
    M2         M1         M1         M3        
    M2         M1         M3         M2        
    M2         M1         M3         M3        
    M2         M2         M1         M2        
    M2         M2         M1         M3        
    M2         M2         M3         M2        
    M2         M2         M3         M3        
    M2         M3         M1         M2        
    M2         M3         M1         M3        
    M2         M3         M3         M2        
    M2         M3         M3         M3        
      

  4.   

    啊呀,是少了,不好意思,就是全排序,用循环语句实现显示在memo控件里,怎么办?
      

  5.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      a,b,c,d,i:integer;
    begin
    ary1[1]:=1;
    ary1[2]:=2;
    ary2[1]:=1;
    ary2[2]:=2;
    ary2[3]:=3;
    ary3[1]:=1;
    ary3[2]:=3;
    ary4[1]:=2;
    ary4[2]:=3;
    i:=1;
    for a:=1 to 2 do
    begin
      for b:=1 to 3 do
      begin
        for c:=1 to 2 do
        begin
          for d:=1 to 2 do
          begin
            i:=I+1;
            ary5[i]:='M'+inttostr(ary1[a])+' M'+inttostr(ary2[b])+' M'+inttostr(ary3[c])+' M'+inttostr(ary4[d]);
            memo1.Lines.Add(ary5[i]);
          end;
        end;
      end;
    end;
    end;这个也能排出来就是比较笨一点,呵呵
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      sql: String;
      i : Integer;
    begin
       sql := 'select distinct  a.m as ''01'', b.m as ''02''  ,c.m as ''03'', d.m as ''04'' '
         + ' from tmp a , tmp b , tmp c, tmp d where a.o= ''O1''  and b.o = ''O2'' '
         + ' and c.o = ''O3'' and  d.o = ''O4'' ';
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(sql);
      ADOQuery1.Open;
      ADOQuery1.First;
      while not(ADOQuery1.Eof) do
      begin
        for i := 0 to 3 do
        begin
          Memo1.Lines.Add(ADOQuery1.FieldByName('01').AsString)
             + '   ' + ADOQuery1.FieldByName('02').AsString)
             + '   ' + ADOQuery1.FieldByName('03').AsString)
             + '   ' + ADOQuery1.FieldByName('04').AsString))
        end;
        ADOQuery1.Next;
      end;
    end;
      

  7.   

    上面写错了
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sql: String;
    begin
       sql := 'select distinct  a.m as ''01'', b.m as ''02''  ,c.m as ''03'', d.m as ''04'' '
         + ' from tmp a , tmp b , tmp c, tmp d where a.o= ''O1''  and b.o = ''O2'' '
         + ' and c.o = ''O3'' and  d.o = ''O4'' ';
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(sql);
      ADOQuery1.Open;
      ADOQuery1.First;
      while not(ADOQuery1.Eof) do
      begin
          Memo1.Lines.Add(ADOQuery1.FieldByName('01').AsString)
             + '   ' + ADOQuery1.FieldByName('02').AsString)
             + '   ' + ADOQuery1.FieldByName('03').AsString)
             + '   ' + ADOQuery1.FieldByName('04').AsString))
        ADOQuery1.Next;
      end;
    end;
      

  8.   

    你把我的sql语句中的字段名,表名 改一下就可用了
      

  9.   

    我设了一个二维的动态数组,mz[i][j],i位代表操作;j位代表执行i位的操作所用到的机器,
    请问:怎么实现上面的问题阿?
      

  10.   

    谢谢 meiqingsong(阿飛),你的帖子对我很有启发
      

  11.   

    直接用M的排序结果实现
    “把完成一次操作O1,O2,O3,O4所有可能用到的机器顺序都列出来”?
    还是把结果放到M的排序结果中?
      

  12.   

    把m1,m1,m2,m3这样的排序结果放在memo控件里显示,现在的问题如何把二维的动态数组中的数据
    排列出来,mz[o1][m2]:表示操作1在机器上进行
      

  13.   

    都忙胡涂了mz[1][2]:表示操作1在机器2上进行,mz[1][2]的值为m2
      

  14.   

    我的已经把m1,m1,m2,m3这样的排序结果从数据集中取出 放在memo控件里显示了。
    你的二维的动态数组中的数据是哪里来的,是用来做什么的?
      

  15.   

    meiqingsong(阿飛) 的方法可以实现,我一开始就用二维的动态数组来实现排序,我想知道用这个能实现么?
      

  16.   

    二维动态数组的实现
    procedure TForm1.Button2Click(Sender: TObject);
    var
      m: array of array of String;
      mz: array of array[0..3] of String;
      i,j, k,n, p,q,len: Integer;
    begin
      setLength(m, 4);
      setLength(m[0], 2);
      setLength(m[1], 3);
      setLength(m[2], 2);
      setLength(m[3], 2);  m[0][0] := 'M1';
      m[0][1] := 'M2';  m[1][0] := 'M1';
      m[1][1] := 'M2';
      m[1][2] := 'M3';  m[2][0] := 'M1';
      m[2][1] := 'M3';  m[3][0] := 'M2';
      m[3][1] := 'M3';
      len := Length(m[0]) * Length(m[1]) * Length(m[2]) * Length(m[2]);
      setLength(mz, len);
       {for i := Low(m[0]) to High(m[0]) do
        for j := Low(m[1]) to High(m[1]) do
         for k := Low(m[2]) to High(m[2]) do
          for n := Low(m[3]) to High(m[3]) do  }   i := len div Length(m[0]);
       K := len div Length(m[1]);
       n := len div Length(m[2]);
       p := len div Length(m[3]);
       j := 0;
       while (j < len) do
       begin
         mz[j][0] := m[0][j div i];
         mz[j][1] := m[1][j div (k div Length(m[0])) mod Length(m[1])];
         mz[j][2] := m[2][j div (n div Length(m[0]) div Length(m[1])) mod Length(m[2])];
         mz[j][3] := m[3][j div (p div Length(m[0]) div Length(m[1]) div length(m[2])) mod length(m[3])];
         Inc(j);
       end;
       memo1.Lines.Clear;
       for j := 0 to 23 do
         memo1.Lines.Add(mz[j][0]+ '   ' + mz[j][1]+ '   ' + mz[j][2]+ '   ' + mz[j][3]);
    end;