阅读:2549回复:6
mapbasic中关于取层的问题????谢谢include "mapbasic.def" include "menu.def" include "icons.def" declare sub main dim i,j,m,n as integer dim a,b as string dim myobj as obj sub main n=mapperinfo(frontwindow(),MAPPER_INFO_LAYERS) '得到已经打开的地图窗 口中的层的数量n(即表的数量)。 for i=1 to n a=layerinfo(frontwindow(0),i,LAYER_INFO_NAME) '得到第i层的(表的)名字 m=tableinfo(a,TAB_INFO_NROWS) '得到第i层的表的行数 m for j=1 to m fetch rec j from a b=objectinfo(a.obj,OBJ_INFO_TEXTSTRING) '得到第j行的对象的 if ((b like "%公司%") or (b like "%厂%") or len(b)=1) then '字符串如果该 select obj from a where rowid=j '字符串与条件相符 myobj=a.obj ' 合则把他们挑出来 insert into cuijie(obj) value(myobj) '放到另一个表中 delect from a where rowid=j '(cuijie中), end if '并且删除原来的对象 next next end sub 程序的大概意思就是:各个层(注记层)放在一个窗口中,然后分别选择各个层, 把每个层中的注记的字符串符合条件的挑出来,放到一个指定的层中,然后把原来选 中的对象从层(表)中删除。 总是通不过,又不知道是为什么,有人帮忙看看么??谢谢各位大哥。 |
|
1楼#
发布于:2004-08-04 10:36
编译通不过?select obj from a where rowid=j可以删掉 |
|
2楼#
发布于:2004-08-04 11:57
你这样编程极不妥当。 ------------------------------------------------------------------------ for j=1 to m fetch rec j from a b=objectinfo(a.obj,OBJ_INFO_TEXTSTRING) '得到第j行的对象的 if ((b like "%公司%") or (b like "%厂%") or len(b)=1) then '字符串如果该 select obj from a where rowid=j '字符串与条件相符 myobj=a.obj ' 合则把他们挑出来 insert into cuijie(obj) value(myobj) '放到另一个表中 delect from a where rowid=j '(cuijie中), end if '并且删除原来的对象 next ---------------------------------------------------------------- 首先你不应该用fetch rec j from a语句,如果表中有空记录你就比较麻烦,其次你至少要对对象进行一下判断[点/线/面/文字],再使用objectinfo(a.obj,OBJ_INFO_TEXTSTRING)函数,第三你一条记录一条记录的删除增加麻烦更大,一是大量耗费资源,二是增加了程序运行的不稳定性,你可以在程序运行前或程序运行中给表增加一个字段,如何对象符合条件的话可以在增加的字段上做一个记号,在整个表历遍后再整体将符合条件的记录一次性加入到另一个表和删除。 |
|
|
3楼#
发布于:2004-08-04 14:41
受教! ![]() |
|
4楼#
发布于:2004-08-09 13:06
不客气,难得有认真问题的帖子。
|
|
|
5楼#
发布于:2004-08-09 19:39
加精华拉?谢谢头, 贴字沉了几天就没回来看,难的有人这么耐心指点,谢谢。 程序我修改通过了,但是不大明白为什么,就是在第2个循环内改为以下的。 for j=1 to m select obj from a where rowid=j b=objectinfo(selection.obj,OBJ_INFO_TEXTSTRING) if ((b like "%公司%") or (b like "%厂%") or len(b)=1)then myobj=selection.obj insert into cuijie(obj) value(myobj) delect from a where rowid=j end if next 就是把 b=objectinfo(a.obj,OBJ_INFO_TEXTSTRING)和 myobj=a.obj这两句中的a.obj都改为selection.obj 我有点不大明白,什么时候使用tablename.obj,什么时候 使用selection.obj这样的表达啊,有什么区别么?? 使用selection.obj的时候每次操作或者每次循环都能取到当前的 选择集么??谢谢 |
|
6楼#
发布于:2004-08-10 11:24
select * from a where object into seltab m=selectioninfo(sel_info_nrows) fetch first from seltab for j=1 to m myobj=seltab.obj b=objectinfo(myobj,OBJ_INFO_TEXTSTRING) if ((b like "%公司%") or (b like "%厂%") or len(b)=1)then ... end if next |
|
|