在PB中动态修改SQL语句

合集下载

PB获取或操作数据窗口语句的方法

PB获取或操作数据窗口语句的方法

PB获取或操作数据窗⼝语句的⽅法1、setsqlselect⽤法:ls_select=getsqlselect //通过getsqlselect取得当前数据窗⼝的查询语句ls_where=" " //给变量ls_where赋值,将所要添加的限定条件赋给此变量,但应考虑到select⼦句与where⼦句之前的空格dw_1.setsqlselect(ls_select+ls_where) //通过setsqlselect将⽣成的查询语句更新⾄数据窗⼝dw_1.event ue_retrieve()2、dw_1.modify⽤法:Old_Select=dw_1.Describe("DataWindow.Table.SQLSelect ")ls_select=getsqlselectls_where=" "dw_1.modify("DataWindow.Table.Select='" + ls_select+ls_where + " ' ")dw_1.settransobject(SQLCA)dw_1.retrieve()dw_1.object.DataWindow.Table.Select=Old_Select更新完后可⽤以下语句取出select语句查看并调试messagebox("",string(dw_1.Describe("DataWindow.Table.SQLSelect ")))⽹上有贴⼦说此语句只能更改DW查询语句中的where⼦句,暂未证实3、dw_1.object.DataWindow.Table.Select=" " ⽤法:此种⽤法与dw_1.modify()基本相同,只是使⽤dw_1.modify()时,在()中需要使⽤双引号把其中的DataWindow.Table.Select以及其后的变量引起来,需要考虑引号的对应关系问题,⽽此种⽤法则相对简单⼀些Old_Select=dw_1.Describe("DataWindow.Table.SQLSelect ")ls_select=" select …… from ……"ls_where=" ……"ls_having=" …… "ls_groupby=" …… "dw_1.object.DataWindow.Table.Select=ls_select+ls_where+ls_having+ls_groupbydw_1.settransobject(SQLCA)dw_1.retrieve()dw_1.object.DataWindow.Table.Select=Old_Select感觉此语句最为强⼤,⽤起来也顺⼿,我喜欢注意:在动态修改sql语句时,select段可以修改,但应确保select后⾯跟随的字段个数以及类型应与建⽴数据窗⼝时选择的字段个数和类型相同,否则报错。

在PB中动态修改SQL语句

在PB中动态修改SQL语句

在PB中动态修改SQL语句数据库应用程序通常进行一项确定的工作,在编写和编译时就可以确定完整的SQL语句,但是在编译时不能确定SQL语句的具体格式和参数时,只能在程序运行过程中构造SQL语句,需要使用动态SQL语句。

以Format 4 动态SQL语句为例,使用格式如下:DECLARE Cursor | ProcedureDYNAMIC CURSOR | PROCEDUREFOR DynamicStagingArea ;PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject} ;DESCRIBE DynamicStagingAreaINTO DynamicDescriptionArea ;OPEN DYNAMIC Cursor | ProcedureUSING DESCRIPTOR DynamicDescriptionArea} ;EXECUTE DYNAMIC Cursor | ProcedureUSING DESCRIPTOR DynamicDescriptionArea ;FETCH Cursor | ProcedureUSING DESCRIPTOR DynamicDescriptionArea ;CLOSE Cursor | Procedure ;---- 在使用动态SQL语句时,需准备DynamicStagingArea对象(全局对象SQLSA)和DynamicDescriptionArea对象(全局对象SQLDA)。

定义游标或过程,读取PREPARE语句中的SQL语句以及语句中说明的参数和类型,执行FETCH语句后,调用相关的函数逐条读取并处理检索结果。

---- 动态SQL语句虽然解能够在程序运行过程中构造SQL语句,但在实际应用中较少使用。

若SELECT语句的结果序列一定,可以通过重新指定DataWindow对象的SELECT语句的方法,达到动态修改SQL语句的功能。

PB动态SQL语句

PB动态SQL语句

PB动态SQL语句PowerBuilder的嵌入式SQL语句只能支持一些固定的标准的SQL语句,即在进行程序代码编译处理时这些SQL语句必须是确定的,另外这种方式也不能执行像Creat Table,Creat Database等这些数据库定义的语句(DDL)。

因此这种嵌入式SQL语句在实际应用中有一定的局限性。

为克服这种方式的局限性,可以使用动态SQL语句,这种方式可以完成嵌入式SQL语句无法实现的功能。

如建库、建表这一类的数据库定义语句(DDL);其次,由于动态SQL语句允许在执行时才确定到底要执行怎样的SQL语句,因此使用动态SQL语句可以使程序实现参数化设计,具有很大的灵活性和通用性。

一、动态SQL语句的应用分析 PowerBuilder提供了四种格式的动态SQL语句,每种格式都有自己不同的特点和作用。

(一)第一种格式当执行没有输入参数并且没有返回结果集的SQL语句时可以使用这种格式,这种格式使用比较简单,其实现的操作也比较少。

1 语法EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};其中SQLStatement是要执行的SQL语句,可以直接用引号将要执行的SQL 引起来用,或者用字符串变量的形式提供SQL语句。

通过使用字符串变量可以在具体执行的时候才指定要执行什么样的SQL语句。

TransactionObject是用户所使用的事务对象,缺省为SQLCA。

2 应用实例①建立一张数据库表(base),SQL语句的表述用引号引起来直接使用。

EXECUTE IMMEDIATE‘CREATE TABLE base(code char(6),name char(30))’USING SQLCA;②执行对数据库记录的操作,在表base中插入一条记录,SQL语句通过字符串变量传递执行语句。

STRING lsSQLLsSQL=”INSERT INTO TABLE base VALUES(’320201’,’市中区支行’)”EXECUTE IMMEDIATE :lsSQL;(二)第二种格式当执行带输入参数但没有返回结果集时的SQL语句可以采用第二种格式。

PB插入、删除和修改数据

PB插入、删除和修改数据

1.插入数据在数据库中插入一条数据使用INSERT语句,格式如下:INSERT INTO 表名(字段列表)VALUES (值列表){USING 事务对象};不同的字段使用逗号(“,”)分隔,并且不包含blob类型的字段;值列表中不同的值之间用逗号分隔,和字段列表中字段的类型对应兼容(最好类型相同),并且字符型和日期型取值用引号引起来。

省略事务对象时使用默认的全局事务对象SQLCA。

下面是一个向表中增加记录的SQL语句:insert into dept (deptno,deptname,workers) values (:ls_deptno, "销售部",10);该例子向表dept中插入一条记录,给该表中的字段deptno赋值为变量ls_deptno的取值,给字段deptname赋值为“销售部”,给字段workers赋值为10。

可能该表中还包含其他的字段,但是一般情况下,这三个字段中最起码应该有主键,除非使用了Identify类型的字段,因为主键肯定是不允许为空的。

如果该表就包含这三个字段,上面的SQL语句可以简写成:insert into dept values (:ls_deptno, "销售部",10);2.删除数据SQL语句删除数据是以行为单位删除的,不能删除某行中某字段的数据。

删除数据的SQL 语句格式是:DELETE FROM 表名WHERE 条件表达式{USING 事务对象};删除游标中和当前数据对应的记录可以使用下面格式的语句:DELETE FROM 表名WHERE CURRENT OF 游标名称;例如,下面的例子删除表dept中workers=10的所有记录:delete from dept where workers=10;再如,下面的例子是删除和光标中当前数据对应的记录:delete from dept where current of dept_cur;3.修改数据使用修改语句可以修改数据表中的一条或多条记录中的一个或多个字段的取值。

PB动态数据窗口

PB动态数据窗口

[PB]-动态数据窗口〓创建动态数据窗口若要动态创建数据窗口,需要使用函数Create,该函数的语法如下:dw_1.Create(syntax{,errorbuffer})其中,dw_1是数据窗口控件的名称,该数据窗口控件要和新创建的数据窗口对象相关联。

syntax是用来描述创建数据窗口对象的确切语法的字符串。

errorburrer是可选项,用来保存创建数据窗口对象过程中发生的错误信息。

如果不指定该参数,就会在发生错误时显示一个错误信息的提示窗口。

如果创建成功该函数返回1,否则返回-1,如果参数为null则函数返回null。

由于Create函数成功创建数据窗口对象后,要改变dw_1数据窗口控件所关联的数据窗口对象,因此,需要重新为数据窗口设置事务对象(使用函数SetTransObject或者SetTrans)。

获取创建数据窗口的语法有多种方法,可以对相关的SQL语句使用SyntaxFromSQL函数,也可以使用对已经创建好的数据窗口对象使用LibraryExport函数。

因为创建数据窗口的语法比较复杂,即使使用了LibraryExport输出已有数据窗口对象的语法,操作起来也相当费劲。

所以,更为通用的是前面一种方法。

这种方法配合一定的编程技巧,让用户指定要创建的数据窗口对象的SQL语句,使用户有更多的自由和选择。

使用这种方法,肯定用到函数SyntaxFromSQL,它的语法是:transaction.SyntaxFromSQL(SQLselect,presetation,err)其中,transaction是事务对象的名称,该事务对象必须正确地设置了相关参数,并且和数据库建立了联结。

SQLselect是用来创建数据窗口的SQL语句,为String 类型。

presentation是要创建的数据窗口对象的显示风格,为String类型。

简单的格式是:Style(Type=presentationstyle)其中Style和Type都是保留字,presentationstyle的取值有Tabular,Grid,Form,Graph,Group,Label和Nup,其中Tabular是缺省类型。

pb问题与解答

pb问题与解答

Q: 如何在PB5中自动生成行号A1:自动生成行号的方法很多,你可以看看PB的例子就知道了。

目前我用的方法是,先用SQL语句统计表中最大的行号,把结果保存到一个变量中去,然后再对此变量进行加1不就可以了吗?但这种做法只是从最大的行号开始产生行号,产生最小的行号也是类似的。

--------------------------------------------------------------------------------Q: delelte数据窗口中若干行,然后update,出现: “rows changed between retrieve and update No changes made to database... Delete from table where ...." 请教是何缘故,该数据窗口是updatable 的,未设置关键字。

A1 : 试试更改数据窗口的Update Properties中的'Where Clause for Update/Delete'中的选项。

--------------------------------------------------------------------------------Q: 如何能够作到,在打印一个DataWindows后不自动换页,而继续打印下一个DataWindows?谢谢A1:在PrintPage事件中返回0--------------------------------------------------------------------------------Q:我在table中改了一个字段的类型,回来一看,相应的datawindow字段在运行时再也无法输入东西了,请问哪位大虾帮我分析一下.Thanks.A1: datawindow具有自己的SQL语法,该语法和数据库后台中的变化不能时时响应,因此,当后台的数据库发生修改后,应该手工修改datawindow中的列定义,如:将变化的列删除,再次添加就可以了。

PB数据窗口技巧大全

PB数据窗口技巧大全

PB数据窗口技巧大全PB数据窗口是PowerBuilder语言中的一种常用控件,用于显示和操作数据。

在实际项目开发中,掌握一些PB数据窗口的技巧能够提高开发效率和用户体验。

下面是一些常用的PB数据窗口技巧的详细介绍,包括动态数据源、处理数据更新、格式化数据、控制数据窗口行为等方面。

1. 动态数据源:PB数据窗口支持通过修改SQL语句和参数实现动态查询。

可以通过修改dw_1.sqlsyntax和dw_1.settransobject等属性实现动态数据源切换或过滤。

2. 处理数据更新:PB数据窗口提供了一些方法来处理数据的插入、更新和删除。

可以使用dw_1.insertrow、dw_1.updaterow和dw_1.deleterow等方法来实现数据的增删改操作。

3. 格式化数据:PB数据窗口提供了一些格式化数据的方法,可以通过修改数据窗口列的format属性来实现对数据的格式化。

例如,可以使用dw_1.modify表示列的format属性来自定义数据的显示格式。

4. 排序和过滤数据:PB数据窗口提供了排序和过滤数据的功能。

可以通过修改dw_1.setsort和dw_1.setfilter等方法实现对数据的排序和过滤。

5. 控制数据窗口行为:PB数据窗口提供了一些属性和方法来控制数据窗口的显示效果。

例如,可以使用dw_1.retrieve来重新检索数据,使用dw_1.setitemstatus来设置数据窗口的状态等。

6.多表连接查询:PB数据窗口支持多表连接查询,可以通过在SQL 语句中使用连接符号和条件来实现多表连接查询的功能。

7.数据窗口插入计算列:PB数据窗口支持插入计算列,可以通过在SQL语句中使用函数和表达式来插入计算列实现对数据的计算和处理。

8.数据窗口多级分组:PB数据窗口支持多级分组,可以通过在数据窗口中设置分组列和聚合函数来实现数据的分组和统计。

9.数据窗口嵌套:PB数据窗口支持嵌套,可以在一个数据窗口中插入另一个数据窗口,实现数据的嵌套显示和处理。

pb常用操作技巧

pb常用操作技巧

这是刚毕业时在某一“大”公司使用PB6.5开发联通营帐系统时的笔记虽然好久没有也许以后也不会再使用pb开发程序了但这算是我使用过的唯一一个前端专业开发工具把笔记记录下来权当作纪念吧_ //PB中标准调用sql语句ls_sql quotselectroad_name from bb_data_wide_bus_temp_t where register_number quotls_register_number quotquot declare cur_get dynamic cursor for sqlsa prepare sqlsa from :ls_sql open dynamic cur_get fetch cur_get into :ls_value if sqlca.sqlcode ltgt 0 then messagebox操作信息提取失败exclamation end if close cur_get //PB中标准循环调用sql语句DECLARE cur_sql DYNAMIC CURSOR FOR SQLSA PREPARE SQLSA FROM :ls_sql OPEN DYNAMIC cur_sql do while sqlca.sqlcode 0 FETCH cur_sql INTO :ls_register_number:ls_complete_note ll_sqlcode sqlca.sqlcode if ll_sqlcode lt 0 then CLOSE cur_sql af_disconnect messagebox错误提示检索受理编号错误StopSign return elseif ll_sqlcode 100 then exit end ifddlb_register_number.additemtrimls_register_number ls_complete_note loop CLOSE cur_sql //窗口open事件通用脚本//置窗口居中af_center_windowthis //连接数据库af_connect //定义变量dataWindowChild dwc //获取城市代码下拉列表并取值dw_city_code.getChildcity_codedwc dwc.setTransObjectsqlcadwc.Retrievegs_citycodegi_citylevel dw_city_code.setTransObjectsqlcadw_city_code.Retrieve dw_city_code.setItem1city_codedwc.getItemString1city_codeis_city_code dw_city_code.getItemStringdw_city_code.getRowcity_code //获取业务类型下拉列表并取值dw_service_kind.getChildservice_kinddwcdwc.setTransObjectsqlca dwc.Retrieve dw_service_kind.setTransObjectsqlcadw_service_kind.Retrieve dw_service_kind.setItem1service_kind10 ii_service_kinddw_service_kind.getItemNumberdw_service_kind.getRowservice_kind //获取申请事项下拉列表并取值dw_apply_event.getChildapply_eventdwc dwc.setTransObjectsqlca dwc.Retrieveii_service_kind dw_apply_event.setTransObjectsqlcadw_apply_event.Retrievedw_apply_event.setItem1apply_eventdwc.getItemNumber1apply_event ii_apply_event dw_apply_event.getItemNumberdw_apply_event.getRowapply_event //激发查询事件cb_query.TriggerEventclicked //断开数据库af_disconnect //查询按钮通用脚本//连接数据库af_connect //定义变量dataWindowChild dwc //dw_1检索数据dw_1.setTransObjectsqlca dw_1.Retrieveii_service_kind //dw_2检索数据intli_rowli_row_temp dw_2.getChildactiondwc dwc.setTransObjectsqlcadwc.Retrieveii_service_kind dw_2.setRowFocusIndicatorhand dw_2.setTransObjectsqlca li_row_temp dw_2.Retrieveii_apply_eventii_service_kindis_city_codedw_2.scrollToRowli_row_temp //如果未检索到数据插入一空行有数据就过滤string ls_filter int li_action if li_row_temp 0 then dw_2.insertRow0 else for li_row 1 todw_2.rowCount li_action dw_2.getItemNumberli_rowaction ls_filter action ltgt stringli_action dw_1.setFilterls_filter dw_1.filter next end if //断开数据库af_disconnect //增加按钮通用脚本//变量定义int li_stepli_actionli_auto_statusli_row //确认选择要增加的记录if dw_1.getSelectedRow0 0 then MessageBox提示信息请选择要添加的记录exclamation return end if //取出要增加的信息li_stepdw_2.getItemNumberdw_2.getRowstep li_actiondw_1.getItemNumberdw_1.getSelectedRow0action li_auto_statusdw_1.getItemNumberdw_1.getSelectedRow0auto_status //添加信息li_rowdw_2.insertRow0 dw_2.setItemli_rowstepli_step dw_2.setItemli_rowactionli_actiondw_2.setItemli_rowauto_statusli_auto_status dw_2.scrollToRowli_row //删除按钮通用脚本//删除前先确认IF dw_2.GetRow 0 THEN MessageBox提示信息请选择要删除的记录exclamation Return ELSE IF MessageBoxquot提示信息quotquot确实要删除指定的记录quotQuestionYesNo2 2 THEN Return dw_2.DeleteRowdw_2.getRow END IF //保存按钮通用脚本//连接数据库af_connect //定义变量stringls_city_codels_error int li_service_kindli_apply_eventli_rowli_step dataWindowChild dwc //检测数据是否发生变化dw_2.AcceptText IF dw_2.ModifiedCountdw_2.DeletedCount 0 THEN MessageBoxquot操作提示quotquot数据未发生变化无需保存quotexclamation return END IF //检测是否为空或零dw_2.setSortstep adw_2.sort FOR li_row 1 TO dw_2.RowCount li_stepdw_2.GetItemNumberli_rowstep IF IsNullli_step OR li_step 0 THEN MessageBox操作提示步骤不能为空或零请重新输入exclamation dw_2.setRowli_row Return END IF NEXT //保存dw_2.SetTransObjectsqlca if dw_2.update 1 then commit messageboxquot提示信息quotquot保存成功quot dw_2.ScrollToRowdw_2.RowCount else ls_error sqlca.sqlErrText rollback messageboxquot提示信息quotquot保存失败quot char13 ls_errorstopSign return end if //断开数据库af_disconnect //打印按钮通用脚本if dw_1.rowCount gt 0 then if PrintSetup -1 then messagebox提示信息打印机设置出错Exclamation return else if dw_1.printtrue 1 then //显示可以取消打印的对话框Messagebox提示信息quot打印成功quot else Messagebox提示信息quot打印失败quotstopSign end if end if else Messagebox提示信息quot没有数据可以打印请先查询数据quotexclamation return end if //导出按钮通用脚本if dw_1.rowcount lt 0 then messageBox提示信息没有数据可以导出请先查询exclamation return end if ifdw_1.SaveAStexttrue 1 then messageBox提示信息导出成功end if //导入按钮通用脚本//变量定义string ls_pathfilels_filels_titlels_extls_filter int li_posli_fileid longll_buffer //变量赋值ls_title quot请选择数据文件quot ls_ext quottxtquot ls_filter quot文本文件.txt.txt全部文件..quot li_fileidGetFileOpenNamels_titlels_pathfilels_filels_extls_filter ifli_fileid 0 or ls_file quotquot then return end if sle_file_name.text ls_pathfile cb_ok.enabled true //退出按钮通用脚本closeparent 或closeWithReturnparentreturnvalue //调用过程通用脚本if dw_wp.rowcount lt 0 then return //变量定义string ls_sqlls_err_info stringls_register_numberls_accept_cityls_departmentls_oper_person integerli_err_codeli_apply_event //变量赋值ls_register_numberdw_wp.getitemstring1register_number ls_accept_city gs_citycode li_apply_eventdw_wp.getitemnumber1apply_event ls_department gl_dealerid ls_oper_persongs_workerid //连接数据库af_connect //调用配号撤单过程ls_sql quotexecutebb_pstn_assign_no_repeal_pquot declare proc_assign_no_repeal dynamic cursor for sqlsa prepare sqlsa from :ls_sql open dynamic proc_assign_no_repealusing :ls_register_number:ls_accept_city:li_apply_event:ls_department:ls_oper_person if sqlca.sqlcode -1 then ls_err_info sqlca.sqlErrText close proc_assign_no_repeal Rollback Messageboxquot错误信息1quotquot执行异常quot ls_err_infostopSignaf_disconnect return End if fetch proc_assign_no_repeal into :li_err_code:ls_err_info if li_err_code lt 0 then close proc_assign_no_repeal Rollback Messageboxquot错误信息2quotquot执行异常quot ls_err_infostopSign af_disconnect return end if closeproc_assign_no_repeal commit //断开数据库af_disconnect //撤单成功后打印工单dw_wp.print //PB某些控件的中文显示问题假如PB 的ListView 不能正常显示中文则应该将ListView 的FontCharSet 属性设置成其他类型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在PB中动态修改SQL语句
数据库应用程序通常进行一项确定的工作,在编写和编译时就可以确定完整的SQL语句,但是在编译时不能确定SQL语句的具体格式和参数时,只能在程序运行过程中构造SQL语句,需要使用动态SQL语句。

以Format 4 动态SQL语句为例,使用格式如下:
DECLARE Cursor | Procedure
DYNAMIC CURSOR | PROCEDURE
FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement
{USING TransactionObject} ;
DESCRIBE DynamicStagingArea
INTO DynamicDescriptionArea ;
OPEN DYNAMIC Cursor | Procedure
USING DESCRIPTOR DynamicDescriptionArea} ;
EXECUTE DYNAMIC Cursor | Procedure
USING DESCRIPTOR DynamicDescriptionArea ;
FETCH Cursor | Procedure
USING DESCRIPTOR DynamicDescriptionArea ;
CLOSE Cursor | Procedure ;
---- 在使用动态SQL语句时,需准备DynamicStagingArea对象(全局对象SQLSA)和DynamicDescriptionArea对象(全局对象SQLDA)。

定义游标或过程,读取PREPARE语句中的SQL语句以及语句中说明的参数和类型,执行FETCH语句后,调用相关的函数逐条读取并处理检索结果。

---- 动态SQL语句虽然解能够在程序运行过程中构造SQL语句,但在实际应用中较少使用。

若SELECT语句的结果序列一定,可以通过重新指定DataWindow对象的SELECT语句的方法,达到动态修改SQL语句的功能。

运用时首先用Describe函数读取DataWindow对象的SELECT 语句,用Replace等函数修改出符合要求的SELECT语句,并且可以增加检索条件,再用SetSQLSelect函数为DataWindow控件指定修改后的SELECT语句。

---- 程序代码:
string sql_string,sql_new
long start_pos=1
string old_str //select语句中需要替换的字符串
string new_str //替换字符串,可以是结构相同的表名
dw_1.settransobject(sqlca)
sql_string=dw_1.Describe("DataWindow.Table.Select")
// Find the first occurrence of old_str.
start_pos = Pos(sql_string, old_str, start_pos)
// Only enter the loop if you find old_str.
DO WHILE start_pos > 0
// Replace old_str with new_str.
sql_string = Replace(sql_string, start_pos, &
Len(old_str), new_str)
// Find the next occurrence of old_str.
start_pos = Pos(sql_string, old_str, &
start_pos+Len(new_str))
LOOP
sql_new=sql_string+" where ……" //增加where字句
//判断setsqlselect 函数调用是否成功,不成功则返回
if (dw_1.setsqlselect(sql_new)=-1) then
messagebox("错误","不能修改SQL语句!",Exclamation!)
return
end if
dw_1.settransobject(sqlca)
dw_1.retrieve()
---- 使用SetSQLSelect有一定的要求和限制,更改后的SELECT语句在结构上必须与原先的语句匹配,在执行SetSQLSelect函数之前必须用SetTrans或SetTransObject函数设置DataWindow 控件的内部事务对象。

另外,DataWindow对象的数据源必须是一个不带参数的SELECT语句,如果需要使用检索参数,可以在程序代码中修改SQL Select语句。

相关文档
最新文档