发表用户:讨论贴
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=4&ID=6495
信息原始来源:James MapInfo技术论坛

文章标题:代码对表结构修改的几个疑问!

sunny1160

对表结构修改的几个疑问!
Private Sub Command1_Click()
  Dim lyr As MapXLib.Layer
  Dim lyr_new As MapXLib.Layer
  Dim lyrInfo As New MapXLib.LayerInfo
  Dim lyrInfo_new As New MapXLib.LayerInfo
  Dim flds As New MapXLib.Fields
  Dim flds_new As New MapXLib.Fields
  Dim dst As MapXLib.Dataset
  
  With CommonDialog1                           
    .DialogTitle = "Choose the place to save the new table"
    .Filter = "MapInfo Table(*.tab)|*.tab"
    .ShowSave
  End With
  
  flds.AddIntegerField "MapInfo_No"   '建立一个表
  
  lyrInfo.Type = miLayerInfoTypeNewTable
  lyrInfo.AddParameter "FileSpec", CommonDialog1.FileName
  lyrInfo.AddParameter "Name", CommonDialog1.FileTitle
  lyrInfo.AddParameter "Fields", flds
  
  Set lyr = Map1.Layers.Add(lyrInfo, 1)   '把这个表添加到当前图层集中去
  
  'Set dst = Map1.DataSets.Add(miDataSetLayer, lyr)
  'Set lyr = Nothing
  Dim m_sName As String                   '在上表的基础上对它添加新字段,并把这个新表临时存放在另一路径下 
  
  Set flds_new = flds
  
  m_sName = CommonDialog1.FileTitle
  
  flds_new.AddStringField "quanshu", 10, True
  flds_new.AddNumericField "center_x", 10, 4
  
  lyrInfo_new.Type = miLayerInfoTypeNewTable
  lyrInfo_new.AddParameter "FileSpec", "E:\mapinfo\newfold\" + CommonDialog1.FileTitle
  lyrInfo_new.AddParameter "Name", "123"
  lyrInfo_new.AddParameter "Fields", flds_new
  
  Set lyr_new = Map1.Layers.Add(lyrInfo_new)
    
  Set lyr = Nothing                        '删除原表
  
  Map1.Layers.Remove (1)
  
  Kill CommonDialog1.FileName
  
  Dim lyrInfo_3 As New MapXLib.LayerInfo    '把新表复制到原表的路径下
  Dim lyr_3 As MapXLib.Layer
  Dim flds_3 As MapXLib.Fields
  Dim m_sFileName As String
  
  m_sFileName = Left$(CommonDialog1.FileTitle, Len(CommonDialog1.FileTitle) - 4)
  
  Set flds_3 = flds_new
  
  lyrInfo_3.Type = miLayerInfoTypeNewTable
  lyrInfo_3.AddParameter "FileSpec", CommonDialog1.FileName
  lyrInfo_3.AddParameter "Fields", flds_3
  
  Set lyr_3 = Map1.Layers.Add(lyrInfo_3)
  
  Map1.Layers.Remove (lyr_new.Name)          '删除临时文件夹中的表
  
  Kill "E:\mapinfo\newfold\" + m_sFileName + ".tab"
  Kill "E:\mapinfo\newfold\" + m_sFileName + ".ind"
  Kill "E:\mapinfo\newfold\" + m_sFileName + ".dat"
  Kill "E:\mapinfo\newfold\" + m_sFileName + ".map"
  Kill "E:\mapinfo\newfold\" + m_sFileName + ".id"
End Sub

******************************************************************************
以上的只是对表结构进行改动,表里没有数据。试过以后是可以实现的。

我想请教的问题是:
1、以上方法对表的复制操作实在是太麻烦了,翻来倒去地弄得人都胡涂了。不知道还有没有什么比较好的方法实现表的复制吗?
2、如果表中存在数据的话,通过layinfo.addparameter "features",layer.allfeaturesd的方法可以实现表中数据的复制吗? 

James.Liu

1,自古华山一条路,目前来说,这是唯一方法
2,可以,但是原表结构字段需是新表结构的子集才行