CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  基础类

******一个但愿不是无解的问题. ******

楼主trouble()2001-11-28 16:32:33 在 PowerBuilder / 基础类 提问

 
    我想把一个   DW   的第一列全部设为同一个值   。  
   
  datawindow.object.data[1,1,dw_1.rowcount(),1]='ss'  
   
  以上语法没用   。  
   
  用   FOR   NEXT   一把又太慢(我的数据量很大)  
   
  我想要的是,   的DW   的某一列设为同一个值   ,   请问有什么好办法(速度比循环快就行了)。  
   
  问题点数:100、回复次数:22Top

1 楼kanghl()回复于 2001-11-28 16:40:37 得分 0

update   不就行了Top

2 楼keani(基恩)回复于 2001-11-28 16:43:49 得分 0

kao,真是个让人郁闷的问题Top

3 楼angelideng(百合)回复于 2001-11-28 17:18:22 得分 0

第一列的值确不确定?Top

4 楼daizhihui_1()回复于 2001-11-28 18:25:27 得分 0

datawindow.object.data[1,1,dw_1.rowcount(),1]取出的是一个数组,肯定不能这样赋值。还是用循环简单!Top

5 楼trouble()回复于 2001-11-28 18:31:27 得分 0

to   angelideng(PB幼儿)   
   
          第一列的值确定   ,   只有(是、否)   分别用1、2来表示.  
   
  Top

6 楼trouble()回复于 2001-11-28 18:32:46 得分 0

世风日下啊!!!!!!!!!Top

7 楼dingxiaojun(免费回答)回复于 2001-11-28 18:40:06 得分 0

dw_1.object.col.current='ss'Top

8 楼PBVC(圆砣)回复于 2001-11-28 18:54:29 得分 0

TO   dingxiaojun(免费回答) 你说的可以将   COL   列全部设为   ‘SS’   吗?  
   
  就如以下语句所做的一样吗?  
   
          FOR   LL_ROW   =   1   TO   DW_1.ROWCOUNT()  
                dw_1.object.col[LL_ROW]='ss'    
          NEXT  
   
  我试了不行.    
  Top

9 楼fjfzyufan(羽帆)回复于 2001-11-28 19:23:20 得分 100

这个问题应该是无解的。  
  因为要赋的值是一个数组。  
  除非你用数组去赋值。  
  但你得先给数组赋值,  
  还是要用到循环。Top

10 楼killerdanny(堕落的瓦拉斯塔兹)回复于 2001-11-28 19:32:07 得分 0

fjfzyufan(羽帆)  
  如是所说!Top

11 楼trouble()回复于 2001-11-28 21:28:12 得分 0

      我要设的字段   .   是一个   CHECKBOX   用来表示已选或是未选。(   1   /   0   )  
   
  为了让用户可以实现全选及全不选.   所以要用到该功能   .   没想到5000行数据却要近3   分钟.  
   
        这样看来我只能这样做了.   先循环出一个数组.再一次性对DW赋值   .   这样应该比直接  
   
  赋值会快   .     快多少我也不知道.       我去试一下.  
   
          抱   1/100000000   的希望再等一等。   神啊!!!!!   你帮帮我吧.  
  Top

12 楼fjfzyufan(羽帆)回复于 2001-11-28 21:49:41 得分 0

用数组吧。  
  我试了一下,5000行1秒搞定。Top

13 楼purpleflame(紫焰)回复于 2001-11-28 22:01:47 得分 0

我有个思路,不过没有试过,你可以去试试看,如果可以的话就告诉我:  
  是这样,对于datawindow,   其应该有四个缓冲区,你看看能不能用   Select   语句  
  直接更改缓冲区的内容。  
  Top

14 楼Dagan(小新)回复于 2001-11-29 13:59:10 得分 0

你在datawindow中设置就可以了,  
  在datawindow的菜单的rows中的column   specifications..  
  将第一列的initial   value   设为'ss'即可.  
  Top

15 楼pbdesigner(MIS/ERP开发)回复于 2001-11-29 14:06:45 得分 0

我想出了四种不用循环的方法和两种用循环的方法,一共12种形式,代码全部写好,并且全部测试OK,也已进行了性能比较,晚上贴出来.  
  实现这个功能很简单,每种方法不超过30行,全部使用PB内置函数,不管你是对哪列赋值,使用于字符、数字、日期时间、日期、时间各种形态。Top

16 楼kinglaw(wang)回复于 2001-11-29 14:28:35 得分 0

关键在setredraw吧。    
        dw_1.setredraw(false)  
        FOR   LL_ROW   =   1   TO   DW_1.ROWCOUNT()  
              dw_1.object.col[LL_ROW]='ss'    
        NEXT  
        dw_1.setredraw(True)  
  Top

17 楼pbdesigner(MIS/ERP开发)回复于 2001-11-29 20:23:27 得分 0

下面给出我的解决方法,望各位兄弟指教。  
  方法一:importstring法  
  string   ls_columnname='bank_id',ls_data  
  any   la_data='adfsfds'  
  integer   li_column  
   
  dw_1.setredraw(false)  
  datastore   ds_1  
  ds_1=   create   datastore  
  ds_1.dataobject   =   dw_1.dataobject  
  ds_1.settransobject(sqlca)  
   
  li_column   =   integer(dw_1.describe(ls_columnname+'.id'))  
  ls_data   =   string(la_data)+'~r~n'  
  ls_data   =   fill(ls_data,len(ls_data)   *   dw_1.rowcount())  
  ls_data   =   left(ls_data,len(ls_data)   -   2)  
   
  ds_1.importstring(ls_data,1,dw_1.rowcount(),1,1,li_column)  
  dw_1.object.data[1,li_column,dw_1.rowcount(),li_column]=   ds_1.object.data[1,li_column,ds_1.rowcount(),li_column]  
  destroy   ds_1  
   
  方法二:ImportClipboard法  
  string   ls_columnname='bank_id',ls_data  
  any   la_data='adfsfds'  
  integer   li_column  
   
  dw_1.setredraw(false)  
  datastore   ds_1  
  ds_1=   create   datastore  
  ds_1.dataobject   =   dw_1.dataobject  
  ds_1.settransobject(sqlca)  
   
  li_column   =   integer(dw_1.describe(ls_columnname+'.id'))  
  ls_data   =   string(la_data)+'~r~n'  
  ls_data   =   fill(ls_data,len(ls_data)   *   dw_1.rowcount())  
  ls_data   =   left(ls_data,len(ls_data)   -   2)  
   
  Clipboard(ls_data)  
  ds_1.ImportClipboard(1,dw_1.rowcount(),1,1,li_column)  
  dw_1.object.data[1,li_column,dw_1.rowcount(),li_column]=   ds_1.object.data[1,li_column,ds_1.rowcount(),li_column]  
  destroy   ds_1  
  dw_1.setredraw(true)  
   
  方法三:ImportFile法  
  string   ls_columnname='bank_id',ls_data,ls_filename   =   "C:\temp\kangjianmin_setitem.txt"  
  any   la_data='adfsfds'  
  integer   li_column,li_FileNum  
   
  dw_1.setredraw(false)  
  datastore   ds_1  
  ds_1=   create   datastore  
  ds_1.dataobject   =   dw_1.dataobject  
  ds_1.settransobject(sqlca)  
   
  li_column   =   integer(dw_1.describe(ls_columnname+'.id'))  
  ls_data   =   string(la_data)+'~r~n'  
  ls_data   =   fill(ls_data,len(ls_data)   *   dw_1.rowcount())  
  ls_data   =   left(ls_data,len(ls_data)   -   2)  
  if   fileexists(ls_filename)   then   filedelete(ls_filename)  
  li_FileNum   =   FileOpen(ls_filename,   StreamMode!,   Write!,   LockWrite!,   Replace!)  
  FileWrite   (   li_FileNum,   ls_data   )  
  Fileclose(li_filenum)  
   
  ds_1.ImportFile(ls_filename,1,dw_1.rowcount(),1,1,li_column)  
  dw_1.object.data[1,li_column,dw_1.rowcount(),li_column]=   ds_1.object.data[1,li_column,ds_1.rowcount(),li_column]  
  destroy   ds_1  
  if   fileexists(ls_filename)   then   filedelete(ls_filename)  
  dw_1.setredraw(true)  
   
  方法四:Modify法  
  string   ls_columnname='bank_id',ls_data,ls_coltype  
  any   la_data='adfsfds'  
  integer   li_column  
  string   ls_modify  
   
  dw_1.setredraw(false)  
  li_column   =   integer(dw_1.describe(ls_columnname+'.id'))  
  ls_data   =   string(la_data)  
  ls_coltype   =   dw_1.describe(ls_columnname+'.coltype')  
  ls_modify   =   "create   compute(band=Detail   x='0'   y='0'   height='0'   width='0'   visible   =   '0'   name=kangjianmin_setitem   expression="  
  choose   case   trim(left(ls_coltype,5))  
  case   'char(','varch'  
  ls_modify   =   ls_modify   +   "~"'"+ls_data+"'~")"  
  case   'numer','long','integ','decim'  
  ls_modify   =   ls_modify   +"~""+ls_data+"~")"  
  case   'datet'  
  ls_modify   =   ls_modify   +"~"datetime('"+ls_data+"')~")"  
  case   'date'  
  ls_modify   =   ls_modify   +"~"date('"+ls_data+"')~")"  
  case   'time'  
  ls_modify   =   ls_modify   +"~"time('"+ls_data+"')~")"  
  end   choose  
   
  dw_1.Modify(ls_modify)  
  dwobject   dwo_dw,dwo_obj  
  dwo_dw   =   dw_1.object  
  dwo_obj   =   dwo_dw.__get_attribute   (   ls_columnname,   false   )  
  dwo_obj.primary[1,dw_1.rowcount()]=   dw_1.object.kangjianmin_setitem[1,dw_1.rowcount()]  
   
  dw_1.Modify("destroy   kangjianmin_setitem")  
  dw_1.setredraw(true)  
   
  方法五:循环数组法  
  string   ls_columnname='bank_id',ls_data,ls_coltype  
  any   la_data='adfsfds',la_data_list[]  
  integer   li_column  
  string   ls_modify  
  long   ll_rowcount,i  
   
  dw_1.setredraw(false)  
  li_column   =   integer(dw_1.describe(ls_columnname+'.id'))  
  ll_rowcount=   dw_1.rowcount()  
  for   i   =   1   to   ll_rowcount  
  la_data_list[i]   =   la_data  
  next  
  dwobject   dwo_dw,dwo_obj  
  dwo_dw   =   dw_1.object  
  dwo_obj   =   dwo_dw.__get_attribute   (   ls_columnname,   false   )  
  dwo_obj.primary[1,dw_1.rowcount()]=   la_data_list[]  
  dw_1.setredraw(true)  
   
  方法六:循环setitem法  
  string   ls_columnname='bank_id'  
  any   la_data='adfsfds'  
  long   ll_rowcount,i  
   
  dw_1.setredraw(false)  
  ll_rowcount=   dw_1.rowcount()  
  for   i   =   1   to   ll_rowcount  
  dw_1.setitem(i,ls_columnname,la_data)  
  next  
  dw_1.setredraw(true)  
  Top

18 楼pbdesigner(MIS/ERP开发)回复于 2001-11-29 20:49:45 得分 0

测试的结果太长,这里又不能划表格,不公布了。我分别用了10、100、500、10000笔资料对每种方法(每种方法又分为加setredraw(false)和不加两种情况)做测试,得出的结论是:资料不多时,循环数组法最快;资料稍多时,循环数组法最快;资料很多时,Modify法最快。要详细的测试的报告和方法,请发信到kangjianmin1@chinaren.com。  
  Top

19 楼killerdanny(堕落的瓦拉斯塔兹)回复于 2001-11-29 20:53:11 得分 0

pbdesigner(MIS/ERP开发) 回来了!呵呵  
   
  欢迎!欢迎!我的CB的底色问题,有没有方法解决呀!呵呵!Top

20 楼trouble()回复于 2001-11-29 22:28:38 得分 0

pbdesigner(MIS/ERP开发)    不愧为我心目中三大高手.   在下对您的仰慕之情   ...  
   
  以下有一把问题(都是我一个人的).   大部份都还没有最终答案.   麻烦你进去看看.  
   
  合计有   1000   多分.   (你要可用分   ,   还是专家分   )我一次性全部给你.   刚好我也在深圳.  
   
  并外加请您吃餐饭   ..   如能有有幸相见.此生无憾啊   !  
     
   
    其中有一题请一定看看.   或是在这里回答.   PB   调存储过程的最佳方法是???  
   
  列表如下:  
   
  http://www.csdn.net/expert/topic/390/390091.shtm  
   
  http://www.csdn.net/expert/topic/363/363375.shtm  
   
  http://www.csdn.net/expert/topic/382/382066.shtm  
   
  http://www.csdn.net/expert/topic/381/381124.shtm  
   
  http://www.csdn.net/expert/topic/370/370593.shtm  
   
  http://www.csdn.net/expert/topic/388/388787.shtm  
   
  http://www.csdn.net/expert/topic/384/384996.shtm  
   
  http://www.csdn.net/expert/topic/387/387545.shtm  
   
  http://www.csdn.net/expert/topic/386/386207.shtm  
   
   
        不过   ,   这题的分我会给     fjfzyufan(羽帆),  
   
      谢谢   (羽帆)   ,   我现用的就是数据赋值.   速度上可以接受了9000行   2   秒左右.    
  Top

21 楼pbdesigner(MIS/ERP开发)回复于 2001-11-30 10:23:39 得分 0

很抱歉,我的工作仍然很紧,至少还有500页的文档要在近期内完成,所以我没有时间在网上,CSDN有很多高手的,只要互相帮助应该可以解决的.有时间我一定会跟大家一起学习的.Top

22 楼PBVC(圆砣)回复于 2001-11-30 10:31:50 得分 0

其中有一题请一定看看.   或是在这里回答.  
   
  问题是   :   PB   调存储过程的最佳方法是什么   ,要求得到返回值   ???  
   
                            我已经在这转了,   三个星期了   .Top

相关问题

  • 大家快来看看呀!一个不是问题的问题?无解呀!!!
  • syx0001(无解の毒药),我错了,下次不敢了!
  • @@@@servlet问题!!(但愿我这最后5分不要又是泥牛入海a!!!!!!)@@@@
  • 一个简单的问题,可能无解,但还是问问看,权当散分
  • 是30天还是31天,但愿不是29天,哪位日期玩的好,帮一把
  • 100分的问题:相信这是很菜的问题,困扰了我1个小时但无解。是专家就进来看看
  • 查遍MSDN,CSDN无解:派生一个CEdit,预先设置几个字符,允许用户插入其他字符但不能修改这几个。
  • 关于ASp的FileSystemObject的看似简单的问题!!;已问过两遍,无解,请大家帮帮我阿!!!!分不够再加
  • jmail 接收稍大的邮件时会超时,请教是何缘故?有无解决方法?急急急,UP给分
  • 很水的问题,看有无解?

关键词

  • .net
  • 循环
  • csdn
  • ds
  • pb
  • 资料
  • 数据
  • shtmhttp
  • 数组
  • 赋值

得分解答快速导航

  • 帖主:trouble
  • fjfzyufan

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo