table1: noid为主健noid     name     jdk       je     num
a001    张三     类型一    9000     1   
a002    李四     类型一    3000     1   
a003   刘波     类型一    2000     1   
a004   黄喇     类型一    1000     1   
a005    爱夺     类型一    5000     1  table2:  noid和suq为主健 与table1对应noid noid  suq   mxje    
a001  1     3000
a001  2     2999
a001  3     3001
a002  1     1200
a002  2     1800
a003  1     900
a003  2    1100
a004  1    300
a004  2    700
a005  1    5000要把它导出到文本文件里去一行就生成以name字段命名的一个文件,这个文件包括table1和table2里的数,各字段用逗号分开,比如:
张三.txt
a001,张三,类型一,9000,1 
a001,1,3000
a001,2,2999
a001,3,3001李四.txt
a002,李四,类型一,3000,1  
a002,1,1200
a002,2,1800 

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3338/3338069.xml?temp=.5772211
    导出一个表,
      

  2.   

    原来写的一个,不整理了,VariantIn是自己打的一个包,也可不打包,直接把这几个TTable按你自己定义的格式存在文本去,到时再解析出来就好了Function varPack(var VariantPack: Variant;MasterInfo:RJbDjMainTableInfo;PriMemData:TdxMemData;strTalbeName:String):Integer;overload;
    var
      pMasterFlds:array of string;
      pMasterTypes:array of string;
      pMasterValues:array of variant;
      i:Integer;
    begin
      VariantPack:=VarArrayCreate([0,3],varVariant);
      setlength(pMasterFlds,Length(MasterInfo));
      setlength(pMasterTypes,Length(MasterInfo));
      setlength(pMasterValues,Length(MasterInfo));
      for i:=low(MasterInfo) to high(MasterInfo) do
      begin
        pMasterFlds[i]:=MasterInfo[i].strFldName;
        pMasterTypes[i]:=MasterInfo[i].strFldType;
        pMasterValues[i]:=PriMemData.FieldByName(MasterInfo[i].strFldName).Value;
      end;
      VariantPack[0]:=strTalbeName;
      VariantPack[1]:=pMasterFlds;
      VariantPack[2]:=pMasterTypes;
      VariantPack[3]:=pMasterValues;
    end;Function varPack(var VariantPack: Variant;DetailInfo:RJbDjMxTableInfo;PriMemData:TdxMemData;MainMemData:TdxMemData;strTalbeName:String;strPkFld:String;strPkValue:String):Integer;overload;
    var
      pDetailFlds:array of string;
      pDetailTypes:array of string;
      pDetailValues:array of variant;
      pDetailValue:array of variant;
      i,j,k:integer;
    begin
      //明细数据
      k:=0;
      for j:=low(DetailInfo) to high(DetailInfo) do
      begin
        if DetailInfo[j].intFldKind<>0 then
          Continue;
        Inc(k);
      end;
      VariantPack:=VarArrayCreate([0,3],varVariant);
      setlength(pDetailFlds,k);
      setlength(pDetailTypes,k);
      k:=0;
      for j:=low(DetailInfo) to high(DetailInfo) do
      begin
        if DetailInfo[j].intFldKind<>0 then
          Continue;
        pDetailFlds[k]:=DetailInfo[j].strFldName;
        pDetailTypes[k]:=DetailInfo[j].strFldType;
        Inc(k);
      end;
      pDetailValues:=nil;
      PriMemData.First;
      setlength(pDetailValues,PriMemData.RecordCount);
      for i:=0 to PriMemData.RecordCount-1 do
      begin
        setlength(pDetailValue,Length(pDetailFlds));
        for j:=low(pDetailFlds) to high(pDetailFlds) do
        begin
          pDetailValue[j]:=PriMemData.FieldByName(pDetailFlds[j]).Value;
          if pDetailFlds[j]=strPkFld then
            pDetailValue[j]:=MainMemData.FieldByName(strPkFld).AsString;
        end;
        pDetailValues[i]:=pDetailValue;
        PriMemData.Next;
      end;
      VariantPack[0]:=strTalbeName;
      VariantPack[1]:=pDetailFlds;
      VariantPack[2]:=pDetailTypes;
      VariantPack[3]:=pDetailValues;
    end;Function SaveDataPack(const VariantIn:Variant;const Filter:String):Integer;
    var
      FileName:String;
      F:TextFile;
      i,j,k:Integer;
      MasterArr,FieldNameArr,FieldTypeArr,FieldValueArr,FieldValueDetailArr:Array of variant;
      FieldNameStr,FieldTypeStr,FieldValueStr:String;
      SaveDialogDataPack:TSaveDialog;
      DetailRecordCount:Integer;
      CurFilter:String;
      procedure SavePack(FileLabel:String;VariantRec:Variant);
      var
        j,k:Integer;
      begin
        FieldNameStr:='';
        FieldNameArr:=nil;
        FieldNameArr:=VariantRec[1];
        FieldTypeStr:='';
        FieldTypeArr:=nil;
        FieldTypeArr:=VariantRec[2];
        FieldValueArr:=nil;
        FieldValueArr:=VariantRec[3];
        if VarType(FieldValueArr[0])<>varEmpty then
          DetailRecordCount:=Length(FieldValueArr)
        else
          DetailRecordCount:=0;
        Writeln(F,FileLabel+SPLIT);
        Writeln(F,VarToStr(VariantRec[0])+SPLIT+IntToStr(Length(FieldNameArr))+SPLIT+IntToStr(DetailRecordCount)+SPLIT);
        for j:=low(FieldNameArr) to High(FieldNameArr) do
        begin
          FieldNameStr:=FieldNameStr+VarToStr(FieldNameArr[j])+SPLIT;
          FieldTypeStr:=FieldTypeStr+VarToStr(FieldTypeArr[j])+SPLIT;
        end;
        Writeln(F,FieldNameStr);
        Writeln(F,FieldTypeStr);
        if VarType(FieldValueArr[0])=varEmpty then
          Exit;
        for j:=low(FieldValueArr) to high(FieldValueArr) do
        begin
          FieldValueStr:='';
          FieldValueDetailArr:=nil;
          FieldValueDetailArr:=FieldValueArr[j];
          for k:=low(FieldValueDetailArr) to high(FieldValueDetailArr) do
          begin
            FieldValueStr:=FieldValueStr+VarToStr(FieldValueDetailArr[k])+SPLIT;
          end;
          Writeln(F,FieldValueStr);
        end;
      end;
    begin
      Result:=0;
      SaveDialogDataPack:=TSaveDialog.Create(nil);
      CurFilter:='*.'+Filter+'|*.'+Filter;
      SaveDialogDataPack.Filter:=CurFilter;
      SaveDialogDataPack.FileName:=VariantIn[0][1]+'.'+Filter;
      if (SaveDialogDataPack.Execute) and (Trim(SaveDialogDataPack.FileName)<>'') then
      begin
        FileName:=SaveDialogDataPack.FileName;
        if Pos(Filter,FileName)=0 then
          FileName:=FileName+'.'+Filter;
      end
      else begin
        SaveDialogDataPack.Free;
        Result:=0;
        Exit;
      end;
      try
        AssignFile(F,FileName);
        Rewrite(F);
        Writeln(F,'单据编号'+SPLIT);
        Writeln(F,VarToStr(VariantIn[0][0])+SPLIT+VarToStr(VariantIn[0][1])+SPLIT);
        Writeln(F,'主表数据'+SPLIT);
        MasterArr:=VariantIn[1];
        FieldNameStr:='';
        FieldNameArr:=nil;
        FieldNameArr:=MasterArr[1];
        FieldTypeStr:='';
        FieldTypeArr:=nil;
        FieldTypeArr:=MasterArr[2];
        FieldValueStr:='';
        FieldValueArr:=nil;
        FieldValueArr:=MasterArr[3];
        Writeln(F,VarToStr(MasterArr[0])+SPLIT+IntToStr(Length(FieldNameArr))+SPLIT);
        for i:=low(FieldNameArr) to high(FieldNameArr) do
        begin
          FieldNameStr:=FieldNameStr+VarToStr(FieldNameArr[i])+SPLIT;
          FieldTypeStr:=FieldTypeStr+VarToStr(FieldTypeArr[i])+SPLIT;
          FieldValueStr:=FieldValueStr+VarToStr(FieldValueArr[i])+SPLIT;
        end;
        Writeln(F,FieldNameStr);
        Writeln(F,FieldTypeStr);
        Writeln(F,FieldValueStr);    Writeln(F,'明细数据'+SPLIT);
        Writeln(F,VarToStr(VariantIn[2])+SPLIT);
        MasterArr:=nil;
        MasterArr:=VariantIn;
        for i:=0 to VariantIn[2]-1 do
          SavePack('明细数据'+IntToStr(i),VariantIn[3+i]);
        {if VariantIn[2]>1 then
          SavePack('配码数据',VariantIn[2+VariantIn[2]-1]);
        if VariantIn[2]>2 then
          SavePack('装箱数据',VariantIn[2+VariantIn[2]]); }
      except
        Result:=-1;
        ShowMessage('另存异常!');
      end;
      CloseFile(F);
      SaveDialogDataPack.Free;
    end;
      

  3.   

    var
      i: Integer;
      slist: TStringList;
    begin
      slist := TStringList.Create;
      adoQuery.active:=false;
      adoQuery.sql.text:='select * from table1 '
      adoQuery.active:=true;
      adoQuery_main.First;
      while not adoQuery_main.eof do
      begin
        sList.clear;
        sList.Add(adoQuery_main.FieldByName('noid').AsString + ','
            + adoQuery_main.FieldByName('name').AsString);
        with adoQuery_sub do
        begin
           active:=false;
           sql.text:='select * from table where noid='''
                  +adoQuery_main.fieldbyname('noid').asstring+'''';
           active:=true;
           first;
          while not eof do
          begin
            sList.add(adoQuery_main.FieldByName('noid').AsString + ','
            + adoQuery_main.FieldByName('suq').AsString)
          end;
          next;
        end;
        slist.SaveToFile(adoQuery_main.FieldByName('name').AsString+'.txt');
        adoQuery_main.next;
      end;
    slist.free;
    end;