在PB中如何把数据库中行的数据,在数据窗口中以列显示

在PB中如何把数据库中行的数据,在数据窗口中以列显示,第1张

可以自己写代码来做。
先用一个datastore或者隐藏的dw数据窗口把原有数据取出来放到这里,然后再设计一个前台展示的数据窗口。
然后逐个字段处理,一个字段就增加一行。

通常所指的数据窗口包括:数据窗口控件与数据窗口对象
数据窗口控件:有一组属性、事件和函数,不过它们的数量比较庞大。
数据窗口对象: 设计中,有两个基本概念,一是数据来源,指数据是选自哪个数据库的哪个(些)表中。PB提供了5种数据来源:Quick Select、SQL Select、Query、External、Stored Procedure。二是数据的表现方式,即数据以何种方式呈现在用户前,有如下几大类:Freeform、Tabular、Grid、Label、Group、Graph、N-Up、Cross Tab、OLE20、RichText、Composite。

不太明白你说的真实意思。
你说的是一个数据窗口中是反应的多张表的关联关系的数据而不能保存到数据库中还是你想把一个数据窗口的数据分别保存到不同的数据库表中呢?
如果是第一种情况:那只需要在数据窗口的update属性中选择你要保存的表、字段就可以了。
如果是第二种情况:PB是不能直接做到的。你可以在窗口中多+几个隐藏的数据窗口控件。分别对应不同的表。然后在保存的时候,将原始表中的数据分开到相应的各个隐藏的数据窗口中,然后对这些隐藏窗口进行保存就可以了。你还可以直接用sql语句来实现。但是用数据窗口来做的话简单直接。毕竟PB最大的优势就是数据窗口,你不用不是浪费了!

对于整个数据窗口设置为只读后不可编辑,修正一下只读属性就可以了,
dw_1objectdatawindowreadonly = "no"
对于数据窗口里面某一列设置Tab=0后也是无法编辑,需要将其调整过来
dw_1modify( "某列名TabSequence = 某一具体数值" )
还想到的一种就是将数据窗口某一列的protect属性设置了表达式,进行保护,将表达式删除即可
这样回答不知道够不,其他的暂时未想到…… :)

当 们把用powerbuilder(以下简称pb)开发的数据库客户端应用程序交给用户后,还需要在用户的服务器端的数据库系统上进行一系列配置工作,如建立业务数据库和建表、视图、主键、索引等数据对象。只有正确配置了数据库服务器上的数据结构,应用程序才能正常运行。通常由经验丰富的数据库管理员,使用数据库系统提供的工具,手工或通过其他辅助工具,来完成数据库端的配置工作。本文以微软的sql server 2000为例,介绍用pb开发一个生成业务数据库及各种业务数据对象的程序,用户只要运行这个程序,就可以建立数据库端的数据结构。 程序功能及结构 程序的主要功能是建立客户应用程序运行时需要的业务数据库和在新建立的业务数据库上建立数据对象。 程序的输入信息通过4个单行编辑文本框获得: ●sle_database:新建立的数据库名称; ●sle_datafile:新建数据库所用的数据文件; ●sle_logfile:新建数据库所用的日志文件; ●sle_script:建立数据库中的数据对象所用的脚本文件。 完成程序功能的两个按钮分别为:cb_create 用于建立数据库;cb_table用于在新建的数据库中建立表、主键等数据对象。 在两个输出窗口中输出结果:dw_database 用于显示新建的数据库名称及数据文件;dw_objects用于显示通过cb_table按钮建立的数据对象。 具体实现 考虑到对于一个特定的应用,在系统分析阶段就已经确定数据库所需要的数据空间、日志空间的大小等一些系统物理信息,不会等到程序运行时由用户确定,所以这些信息不需要用户输入。数据库的名称一般来说也是固定的,用户输入的数据库名称(sle_database),可用来检查数据库系统中是否已经有同名的数据库。数据文件和逻辑文件的物理位置和名称,由用户根据服务器上的磁盘空间空闲情况输入(sle_datafile、sle_logfile),程序中给出了初始值,指定的文件位置是sql server通常的数据文件存放位置。 1.建立数据对象的脚本文件(sle_script) 该文件是普通的文本文件类型,其内容由建立表、主键等数据对象的数据定义语言(ddl)组成,其语法符合数据库系统的规则。例如,脚本testsql内容为建立两个带有主键的表: create table xz_tj_all ( gxjg char(4) not null, nian smallint not null, yue tinyint not null, bz1 tinyint not null, bz2 tinyint not null, a1 integer , a2 integer , a3 integer , primary key (gxjg, nian, yue, bz1, bz2) ) create table xz_tj_4_1 ( gxjg char(4) not null, nian smallint not null, yue tinyint not null, bz1 tinyint not null, bz2 tinyint not null, a1 integer , primary key (gxjg, nian, yue, bz1, bz2) ) 2.窗口的open事件 应用程序只用到一个窗口(w_create_database),在其open事件中,对两个全局事务对象进行创建,并利用其中的一个事务对象(tr_sql)与系统数据库(master)进行连接。此时还没有进行业务数据库的创建工作,业务数据库不存在,所以不能在这里进行与新建业务数据库的连接。w_create_database 的open事件脚本如下: //创建与master系统数据库相连接的事务对象 tr_sql = create transaction tr_sqldbms =“mss microsoft sql server 6x” tr_sqldatabase = “master” //数据库系统管理员 tr_sqllogpass = “sa” //服务器名 tr_sqlservername = “station4” //系统管理员口令 tr_sqllogid = “sa” tr_sqlautocommit = false tr_sqldbparm = “” //连接到master系统数据库 connect using tr_sql; if tr_sqlsqlcode <> 0 then messagebox (“数据库连接错误”,“不能连接到sql server数据库master。请确认sql server数据库是否启动。~n~r” + “错误信息:”+ tr_sqlsqlerrtext) return end if //从系统表sysdatabases中检索数据库信息 dw_databasesettransobject(tr_sql); //创建与新建业务数据库相连接的事务对象 tr_newbase = create transaction tr_newbasedbms =“mss microsoft sql server 6x” tr_newbaselogpass =“sa” tr_newbaseservername =“station4” tr_newbaselogid =“sa” tr_newbaseautocommit = false tr_newbasedbparm =“” 3.cb_create按钮的单击事件 根据业务需要,这里创建的数据文件和日志文件的初始大小为100mb,最大值为200mb,增量为20mb。按钮cb_create根据输入参数构造动态sql语句,创建数据库。cb_create的clicked事件脚本如下: //数据库名 string ls_database //数据文件路径及文件名 string ls_datafile //日志文件路径及文件名 string ls_logfile //创建数据库的sql语句 string ls_mysql //逻辑数据文件名 string ls_logicalfilename //逻辑日志文件名 string ls_logicallogname setpointer(hourglass!) //取得用户输入的数据库名称 ls_database = trim(sle_databasetext) //取得数据文件位置和名称 ls_datafile = trim(sle_datafiletext) //取得日志文件位置和名称 ls_logfile = trim(sle_logfiletext) ls_logicalfilename = ls_database +“arch1” ls_logicallogname = ls_database +“archlog1” tr_sqlautocommit = true //建立数据库的语句 ls_mysql=“create database ”+ls_database+“on”& +“( name =”+ls_logicalfilename+“,”& +“filename = ‘”+ls_datafile+“',”& +“size = 100mb,”& +“maxsize = 200,”& +“filegrowth = 20)”& +“log on ”& +“( name = ”+ls_logicallogname+“,”& +“filename = ‘”+ls_logfile+“',”& +“size = 100mb,”& +“maxsize = 200,”& +“filegrowth = 20)” execute immediate :ls_mysql using tr_sql; tr_sqlautocommit = false //检索出刚刚建立的数据库 dw_databaseretrieve(ls_database) cb_tableenabled = true setpointer(arrow!) 4.cb_table按钮的单击事件 按钮cb_table从指定的脚本文件(sle_scripttext)中读取内容,构造动态的sql语句,创建数据对象。为简化程序,对于脚本文件大于32765字节的情况,本文没做处理,读者可用多次读文件等技术自行处理。 cb_table的clicked事件脚本如下: //创建数据对象前的时间 datetime ldt_create //数据库名 string ls_database //创建数据对象的sql语句 string ls_sql //存储脚本文件名 string ls_filename //打开文件的文件号 int li_fileno //文件长度,读取的文件字节数 long ll_filelength, ll_number //取得新建的数据库名称 ls_database = trim(sle_databasetext) if messagebox(“请确认”,“将要在”+ls_database+“数据库中生成表结构?”, question!,yesno!,2) = 2 then return end if setpointer(hourglass!) //为连接业务数据库的事务对象设置数据库值 tr_newbasedatabase = ls_database connect using tr_newbase; if tr_newbasesqlcode <> 0 then messagebox (“数据库连接错误”,“不能连接到sql server数据库:”+ls_database +“。~n~r”+“错误信息:”+ tr_newbasesqlerrtext) return end if //取得建立数据对象的时间,并从系统表sysobjects中提取建立的数据对象 select distinct getdate() into :ldt_create from sysobjects using tr_newbase; //此数据窗口将显示新建事务对象 dw_objectssettransobject(tr_newbase) //从输入中取得脚本文件名 ls_filename = trim(sle_scripttext) ll_filelength = filelength(ls_filename) //对大于32765字节的文件不做处理 if ll_filelength > 32765 then messagebox(“”,“脚本文件太大”) disconnect using tr_newbase; return elseif ll_filelength > 0 then //读取文件内容,执行动态sql语句 li_fileno = fileopen(ls_filename, streammode!) ll_number = fileread(li_fileno, ls_sql) if ll_number > 0 and ll_number <= 32765 then tr_newbaseautocommit = true execute immediate :ls_sql usingtr_newbase; tr_newbaseautocommit = false end if fileclose(li_fileno) else //不能正确读取文件信息 sle_scriptsetfocus() sle_scriptselecttext(1,len(sle_scripttext)) messagebox(“打开脚本文件出错”,“请输入正确的表结构脚本文件名称”) disconnect using tr_newbase; return end if //检索刚刚建立的数据对象 dw_objectsretrieve(ldt_create) disconnect using tr_newbase; setpointer(arrow!)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13344408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-18
下一篇 2023-07-18

发表评论

登录后才能评论

评论列表(0条)

保存