PowerBuilder相关开发操作总结.doc_第1页
PowerBuilder相关开发操作总结.doc_第2页
PowerBuilder相关开发操作总结.doc_第3页
PowerBuilder相关开发操作总结.doc_第4页
PowerBuilder相关开发操作总结.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Peterevanss Development Notes1. 数据窗口中点击相同行同时选中:LongiStringls_testnoDateTime ldt_opstimeIF row = 0 Or IsNull(row) THENThis.SelectRow(0,False)RETURNEND IFIF row = GetSelectedRow(0) THEN RETURNThis.SelectRow(0,False)ls_Test_No = This.GetItemString(row,pat_master_index_inp_no)ldt_opstime = This.GetItemDateTime(row,operation_schedule_scheduled_date_time)FOR i = This.RowCount() To 1 Step -1IF This.GetItemString(i, pat_master_index_inp_no) = ls_Test_No And This.GetItemDateTime(i, operation_schedule_scheduled_date_time) = ldt_opstime THENThis.SelectRow(i,True)END IFNEXT2. 创建数据通道语句:datastore lds_opslds_ops = Create datastorelds_ops.DataObject = d_schedule_arrangelds_ops.SetTransObject(sqlca)3. 在已过滤后的数据基础上对datawindow进行过滤dw_1.setfilter(dw_1.describe(datawindow.table.filter)+your_join+your_new_filter)dw_1.filter()4. 在datawindow中显示动态时间建立一个计算域,表达式为string(datetime(today(),now(),yyyy年mm月dd日 hh点mm分ss秒),同时设置datawindow的属性dw_1.Object.DataWindow.Timer_Interval=5005. 在数据窗口中只显示不同的数据dw_1.filter(isnull(columnname-1) and columnnamecolumnname-1)dw_1.filter()6. 统计数据窗口中处于选中状态的行数方法一: long ll_Selected ll_Selected = long(dw_1.describe(evaluate(sum( if(IsSelected(), 1, 0) for all),1)方法二: long ll_Selected ll_Selected = long(dw_1.describe(evaluate(count(IsSelected() for all),1)方法三:upperbound(dw_1.Object.Data.Selected)7. 在数据窗口中选定想要打印的几条记录long ll_posdataStore lds_dslds_ds = create dataStorelds_ds.dataObject = dw_1.dataObjectfor ll_pos = 1 to dw_1.rowCount() if dw_1.IsSelected(ll_pos) then dw_1.RowsCopy(ll_pos,ll_pos,Primary!,lds_ds,lds_ds.rowCount()+1,Primary!) end ifnextlds_ds.print()8. 单击编辑框选中其中内容自定义事件ue_clicked,代码是:this.selecttext(1,len(this.text),getfocus事件的代码改为:This.Post Event ue_clicked()。9. 得到字符串中汉字的个数For i = 1 to Len(aString) ls_ch = Mid(aString,i,1) If Asc(ls_ch) = 128 then /是汉字 li_num+ i = i+1 End if Next/li_num就是汉字的个数10. 数据窗口双击标题进行排String ls_old_sort,ls_column,ls_name,ls_criteriaChar lc_sortIF Right(dwo.Name,2) = _t THEN /取得是否是列标题名 ls_column = LEFT(dwo.Name, LEN(String(dwo.Name) - 2) ls_old_sort = this.Describe(Datawindow.Table.sort) IF ls_column = LEFT(ls_old_sort,LEN(ls_old_sort) - 2) THEN lc_sort = RIGHT(ls_old_sort,1) IF lc_sort = A THEN lc_sort = D ELSE lc_sort = A END IF this.SetSort(ls_column + + lc_sort) ELSE ls_criteria = ls_column + A this.SetSort(ls_criteria) END IF this.Sort()END IF11. 数据窗口单击按Ctrl或Shift进行多选int il_last_row /il_last_row为实例变量,记录上次单击的行int li_current_row /当前单击行int li_row /中间变量/未选择就返回if row = 0 then returnelse li_current_row = rowend ifif keydown(keyshift!) then /按下SHIFT键 if il_last_row = 0 then this.selectRow(row,true) il_last_row = li_current_row else this.selectRow(0,false) if li_current_row il_last_row then for li_row = il_last_row to li_current_row this.selectrow(li_row,true) end for else for li_row = il_last_row to li_current_row step -1 this.selectrow(li_row,true) end for end if end ifelse /未按下SHIFT键 il_last_row = li_current_row if keydown(keycontrol!) then /按下CTRL键 if this.isSelected(li_current_row) then this.selectrow(li_current_row,false) else this.selectrow(li_current_row,true) end if else /无CTRL键或SHIFT键按下 this.selectrow(0,false) this.selectrow(li_current_row,true) end ifend if12. 按某字段进行排序IF = fee_id_t THEN this.setSort(fee_id a) this.sort()elseif = fee_position_t then this.setsort(fee_position a, fee_id a) this.sort()END IF13. 按条件对某行数据进行颜色区分case(cj when is = 90 then rgb(255,0,0) when is 60 then rgb(0,255,0) else rgb(0,0,255)14. 数据窗口中按enter键实现tab功能(在数据窗口的Enter事件中)send(handle(this),256,9,long(0,0)return 115. 生成固定长度的前面加零的数字编号例如:12生成00012,1234生成01234。方法很简单:String(ll_number, 00000)16. 数据窗口读取规则dw_1.getItemX(row,col) /读取单笔数据比点状表示法更快dw_1.object.data /读取多笔数据函数表示法更快dw_1.object.data1dw_1.object.data1,2/例子1(只用执行一次)string ls_namels_name = dw_1.object.col.current /读取列col所有数据/例子2(得执行dw_1.rowCount()次)string ls_namefor li_row = dw_1.rowCount() to 1 step -1 ls_nameli_row = dw_1.getItemString(li_row,col)next17. 关于sqlca.SQLCode在利用Embedded SQL 的时候,每运行一次SQL指令就应该检查一次交易对象中的属性SQLCode,而不是等到所有的SQL指令运行完毕后再去运行检查交易对象中的SQLCode属性.当我们使用数据窗口所提供的函数时,要记住不要检查SQLCode来判断是否运行成功.而是要依照每一个函数运行后所返回的值来判断是否运行成功.update tab_test set col1 = testif sqlca.sqlCode = -1 then rollback using sqlca; if sqlca.sqlCode = -1 then messageBox(错误,连接失败!) end if messageBox(错误,连接失败!)else commit using sqlca;end if/确保数据保存的成功if dw_1.update() = -1 then RollBack Using SQLCA; MessageBox(警告!,数据保存失败!)else Commit Using SQLCA;End if18. 同一个数据窗口某列的值是根据另一列的值进行检索dataWindowChild dwcif = vw_type_type1 then /省的字段名 s_type1 = data this.getChild(vw_type_type2,dwc) /县的字段名 this.setItem(this.getRow(),vw_type_type2,) this.setItem(this.getRow(),vw_type_type3,) this.setItem(this.getRow(),type,i_null) s_sql = Select distinct type2 From vw_type Where type1_code = + + s_type1 + /动态生成SQL语句 dwc.setTransObject(sqlca) dwc.SetSQLSelect(s_sql) dwc.retrieve()end if19. dw的update属性Where 条件子句的产生方式:1. Key Columns:比较原始数据缓冲区和当前数据库的数据时所产生的where子句条件不够严谨,所以在同一个时间内,当很多的用户在一起使用数据库时有可能会发生将别人所更改过的数据覆盖的情况.为了避免这样的情况发生,通常我们会将KeyColumns的方式用在单一用户或是关系表格中,所有的字段都是Primary Key的情况.2.Key and Updateable Columns:因为在比较原始数据缓冲区内的数据和当前数据库的数据时所产生的where条件子句非常的严谨,所以在同一个时间内,当很多的用户一起使用数据库时,不会发生将别人所更改过的数据覆盖的情况.因此,我们可以得到数据保存时最大的一致性.3.Key and Modified Columns:因为在比较数据缓冲区内的数据与当前数据库的数据时所产生的where子句条件比较有弹性(当前所要修改Modified的字段的数值),所以在同一个时间内,当很多用户一起使用数据库时,可能会发生将别人所更改过的数据覆盖的情况.主要字段(Key Column)的修改的方式:1.Use Delete then Insert:这是数据窗口在主要字段(Key Column)的修改时的缺省选项,选用这种方式修改数据时,数据会先被删除然后再重新增加一笔数据.但是在使用上要特别注意的是,如果在关系数据库中,当设计删除为Cascade Delete时,在修改数据时候可能会导致其它不希望删除的数据被删除.另外,在选择字段时必须要选择所有的字段,否则会没有办法再重增加一笔数据.2.Use Update:这个选项会直接修改Key字段的数值,但是并不是所有的关系数据库(DBMS)都提供这样的功能.20. 得到下拉数据窗口中的显示值ls_value = dw_1.Describe(Evaluate(LookupDisplay(column_name),+string(row_number)+)21. 数据窗口的GRID格式下,根据实际情况控制每一行的背景/调整detail的属性中的color的expression就可以了,如:if(currentrow()=getrow(),rgb(255,240,194),if(mod(getrow(),2)=1, rgb(255,254,249) , rgb(247,247,239)/表达式中rgb(255,240,194)为黄色,rgb(255,254,249)为浅白色,rgb(247,247,239)为浅黄色。22. 取得单击的列标题、列名、数据库字段名string ls_dwolong ll_posstring ls_typestring ls_titlestring ls_columnstring ls_dbnameif Not KeyDown(KeyControl!) then returnls_dwo = dwo.Nameif trim(ls_dwo) = or isnull(ls_dwo) then returnls_type = This.describe(ls_dwo + .type)if ls_type = column thenls_title = This.describe(ls_dwo + _t.text)/标题ls_column = This.describe(ls_dwo + .Name) /数据窗口列名ls_dbname = This.describe(ls_dwo + .dbname) /数据库中字段名messagebox(信息, 标 题 文 本 : + ls_title + &rn数据窗口列名 : + ls_column + &rn数据库中字段名: + ls_dbname )end if23. 用代码取得数据窗口汇总带计算列的值String ls_valuels_value = dw_1.Describe(Evaluate(compute_1,1)/如果是数值型,要转换。24. 得到所有列标题ll_colnum = Long(dw_1.object.datawindow.column.count)for i = 1 to ll_colnum/得到标题头的名字ls_colname = dw_1.describe(# + string(i) + .name) + _tls_value = dw_1.describe(ls_colname + .text)next25. 判断当前行是不是当前页中的最后一行if dw_1.getrow()=long(dw_1.describe(datawindow.lastrowonpage) thenelseend if26. 复制grid类型的所选择的行的数据到系统剪切板string ls_selectedls_selected=dw_1.Object.DataWindow.Selected.Dataclipbord(ls_selected)27. 检索参数有些不需要传入则传%.28. 在数据窗口的clicked或doubleclicked事件中写上注释/可解决一些意外的bug!29. 数据窗口画板里面,在写表达式的时候,试着用一些用户自定义的全局变量和全局函数,你会发现在某些特殊的场合,这个小窍门还是很有用的。30. 数据窗口画板里面我们如果想要比较当前行和上一行或者下一行的值:if ( yw_bc_circuit_dlcode = yw_bc_circuit_dlcode -1 and yw_bc_circuit_dlname = yw_bc_circuit_dlname -1 and yw_bc_circuit_xtno = yw_bc_circuit_xtno -1 ,0,1)31. 两个结构相同的数据窗口之间快速复制数据dw_1.object.data = dw_2.object.data32. 取数据窗口中列的总数string ls_countls_count = dw_1.describe(datawindow.column.count)33. 清空数组string a,ba1 = 1;a1 = 2;a1 = 3a = b/即可以清空a34. Excel相关操作一.从EXCEL中导入数据到数据窗口的程序:/*/ 函数名称: GF_EXCEL_TO_DATAWINDOW / 函数功能: EXCEL文件导入DATAWINDOW / 参数类型: DWTAWINDOW / 参数名称: DW / RETURN : 1 SUCCEED -1 ERROR / DATE : 2004 3.1 /*/string str_savename,named,s_grxhint excelok,li_netlong li_count,ioleobject excelserverexcelserver=create oleobject excelok=excelserver.connecttonewobject(excel.application)/检查返回值,以确保已成功地连接到了Excelif excelok 0 then messagebox(信息提示,连接EXCEL失败,请检查计算机中是否安装了EXCEL!) return -1end if li_net = GetFileOpenName(选择文件, str_savename,named,xls,Excel文件(*.xls),*.xls) if li_net 0 thenif str_savename = then return -1dw.settransobject(sqlca)dw.reset()excelserver.workbooks.open(str_savename) excelserver.activesheet.cells.copyli_count = dw.importclipboard(2) /导入数据 clipboard()excelserver.quit() excelserver.disconnectobject() destroy excelserver return 1elsemessagebox(信息提示,没有指定导入文件!)return -1end ifcfc_exceltodw(datawindow adw, string excelname)参数是导出的dw和excel文件的完整路径OLEObject ole_objectole_object = CREATE OLEObjectinteger li_ret1,valuestring namedli_ret1 = ole_object.ConnectToObject(,Excel.Application)IF li_ret1 = 0 THEN value = MessageBox(提示, 你已打开Excel(注意保存),关闭吗?, Question!, YesNo!)if value = 1 thenole_object.quit()ole_object.disconnectobject()elsereturn 0end ifend ifvalue = GetFileOpenName(Select File, excelname, named, XLS, Excel Files (*.XLS),*.XLS)if value1 then return 0end ifli_ret1 = ole_object.ConnectToNewObject(Excel.Application)if li_ret1 0 thenMessageBox(提示,OLE无法连接Execl!)return 0end ifopenwithparm(w_daopop,1)w_daopop.st_2.text=正在准备.ole_object.workbooks.open(excelname)int rtn,i,jlong ll_colnum,ll_rownumstring ls_valuestring ls_objects,ls_obj,ls_objs,ls_objtaglong ll_pos,ll_len,ll_num = 0,ll_objls_objects = trim(adw.Describe(datawindow.Objects)+tdo while (pos(ls_objects,t) 0)ll_pos = pos(ls_objects,t)ll_len = ll_pos - 1ls_obj = left(ls_objects,ll_len)if (adw.Describe(ls_obj + .type) = column or adw.Describe(ls_obj + .type) = compute) and (adw.Describe(ls_obj + .band) = detail) and (ls_obj asd) thenll_num += 1ls_objsll_num = ls_objls_objtagll_num = adw.Describe(ls_obj + _t.text)end ifls_objects = right(ls_objects,len(ls_objects) - ll_pos)loopstring str,strtypej=1getremote(r1c1,str,excel,excelname)str= lower(left(trim(str),len(str)-2)if len(str)=0 thenmessagebox(错误,没有表头数据!)ole_object.quit()ole_object.disconnectobject()destroy ole_objectclose(w_daopop)return 0end ifdo while len(str)0i=1do while lower(trim(ls_objtagi) str i= i+1if i ll_num thenmessagebox(错误,没有找到+str+列!)ole_object.quit()ole_object.disconnectobject()destroy ole_objectclose(w_daopop)return 0end ifloopll_objj=ij=j + 1getremote(r1c+string(j),str,excel,excelname)str= lower(left(trim(str),len(str)-2)loopll_num = j - 1i=2getremote(r+string(i)+c1,str,excel,excelname)str= left(str,len(str)-2)do while len(str)0ll_rownum=adw.insertrow(0)w_daopop.st_2.text=正在导入第+string(i - 1)+条记录.for j=1 to ll_numgetremote(r+string(i)+c+string(j),str,excel,excelname)str= left(str,len(str)-2)strtype = adw.Describe( ls_objsll_objj + .coltype)ll_pos = pos(strtype,()if ll_pos0 then strtype=left(strtype,ll_pos - 1)CHOOSE CASE strtypeCASE number,decimal,longadw.setitem(ll_rownum,ll_objj,dec(str)case dateadw.setitem(ll_rownum,ll_objj,date(str)case datetimeadw.setitem(ll_rownum,ll_objj,datetime(date(str)CASE ELSEadw.setitem(ll_rownum,ll_objj,str)END CHOOSEnexti=i+1getremote(r+string(i)+c1,str,excel,excelname)str= left(str,len(str)-2)loopole_object.quit()ole_object.disconnectobject()destroy ole_objectclose(w_daopop)return 1-/*/ /Function : 转换数据到 excel /parm : / 1. as_title : excel 的标题 /return : 1 is success and -1 is fail /Author : hzh /date : 2003.12.08 /Modifier : / 1. 2003.12.10 by hzh /Reason : / 1. 增加对计算列的处理 /*/ IF NOT FileExists(as_excelfile) THEN MessageBox(数据读入,没有指定的文件) RETURN 1 END IF OLEObject xlapp IF NOT IsValid(xlApp) THEN xlApp = CREATE OLEObject END IF IF xlApp.ConnectToNewObject(Excel.Application ) 0 THEN MessageBox(ga_app.dwmessagetitle,不能连接 EXCEL 服务器,请检查你的计算机中是 rn +& 否安装了MS EXCEL ? 假如安装,请与程序供应商联系 !,QuesTion!) RETURN -1 END IF /增加空文档 (EXCEL table) xlApp.Workbooks.Open(as_excelfile) /xlApp.Application.Visible = FALSE xlApp.DisplayAlerts = false /定位到第一格 Long l_cnt,l_rows,l_cols Long l_row,l_i Int i_cnt l_rows = 30 l_cols = 23 Long l_cno String s_cno,s_temp Long l_newrow /一次处理两行 DataStore ds_todb IF NOT IsValid(ds_todb) THEN ds_todb = CREATE DataStore END IF ds_todb.DataObject = dw_getdatafromexcel ds_todb.SetTransObject(at_sqlca) FOR l_cnt = 2 TO l_rows STEP 2 Yield() l_row = l_cnt s_cno = String(xlapp.activeworkbook.activesheet.cellsl_row - 1,1.value) IF NOT IsNumber(s_cno) THEN CONTINUE FOR l_row = l_cnt - 1 TO l_cnt s_cno = xlapp.activeworkbook.activesheet.cellsl_row,1.FormulaR1C1 IF IsNull(s_cno) OR s_cno = THEN /非新行 FOR l_i = 4 TO l_cols STEP 2 s_temp = String(Trim(xlapp.activeworkbook.activesheet.cellsl_row,l_i.FormulaR1C1) IF IsNull(s_temp) OR s_temp = THEN CONTINUE i_cnt+ ds_todb.SetItem(l_newrow,i_cnt,s_temp) NEXT ELSE /新行开始,清空数组 IF NOT IsNumber(s_cno) THEN CONTINUE l_newrow = ds_todb.InsertRow(0) ds_todb.SetItem(l_newrow,1,s_cno) /ds_todb.SetItem(l_newrow,2,gnvo_db.uf_todate(Long(xlapp.activeworkbook.activesheet.cellsl_row,2.FormulaR1C1) ds_todb.SetItem(l_newrow,3, Dec(xlapp.activeworkbook.activesheet.cellsl_row,3.FormulaR1C1) i_cnt = 3 FOR l_i = 4 TO l_cols STEP 2 s_temp = String(Trim(xlapp.activeworkbook.activesheet.cellsl_row,l_i.FormulaR1C1) IF IsNull(s_temp) OR s_temp = THEN CONTINUE i_cnt+ ds_todb.SetItem(l_newrow,i_cnt,s_temp) NEXT END IF NEXT NEXT xlApp.activeworkbook.close(false) xlapp.Application.quit() xlApp.DisConnectObject() /xlApp.Application.Workbooks.quit() IF IsValid(xlApp) THEN DESTROY xlapp END IF /gnvo_db.uf_closewin(Microsoft excel) IF ds_todb.Update() = 1 THEN COMMIT USING at_sqlca; MessageBox(导入数据,保存成功) ELSE ROLLBACK USING at_sqlca; MessageBox(导入数据,保存失败) END IF IF IsValid(ds_todb) THEN DESTROY ds_todb END IF /FileDelete(as_excelfile) RETURN 1 Is_syspath=space(255) GetCurrentDirectoryA(255,Is_syspath) value=GetFileopenname(请选择要导入BOM的EXECL类型文件!,ls_path,ls_filename,xls,EXECL 文件(*.xls),*.xls) is_filename = mid(ls_filename,1,len(ls_filename) - 4) if value 1 then /没取到、或者取消返回 Return false end ifTop7 楼workhand(我可憨了.)回复于 2004-04-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论