在Protocol Buffers (PB)中,日期变量一般使用标准的 UNIX 时间戳来表示。UNIX 时间戳是一个以秒为单位的整数值,从1970年1月1日零点开始计算,表示从那个时刻到当前时刻的秒数。
如果要实现日期变量减去1天的 *** 作,可以按照以下步骤进行:
将日期变量转换为 UNIX 时间戳,即将日期变量转换为距离 1970 年 1 月 1 日零点的秒数。
将这个时间戳减去 24 小时(即 24 60 60 秒),得到新的时间戳。
将新的时间戳转换回日期变量的格式。
具体实现方式可以根据所使用的编程语言和 PB 库来进行。以 Python 中使用 googleprotobuf 库为例,代码如下所示:
python
from googleprotobuftimestamp_pb2 import Timestamp
import datetime
# 假设 date1 是一个日期变量
# 将 date1 转换为 Timestamp 对象
ts = Timestamp()
tsFromDatetime(date1)
# 将 Timestamp 对象转换为 datetime 对象
dt = datetimedatetimefromtimestamp(tsToSeconds())
# 将 datetime 对象减去 1 天
dt -= datetimetimedelta(days=1)
# 将 datetime 对象转换回 Timestamp 对象
tsFromDatetime(dt)
# 将 Timestamp 对象转换回日期变量
date1 = ts
需要注意的是,以上代码中的 date1 是一个 Protobuf 的 Timestamp 类型对象。如果你的 PB 文件中日期变量的类型不是 Timestamp,而是其它类型,那么在转换时间戳和日期变量时可能会有所不同。
1引言
在管理信息系统的开发中,经常需要获取本地计算机中的树形目录结构和相应的文件信息,如进行目录的选择和特殊文件的选取,在PowerBuilder(简称PB)中并没有提供专门的树形目录对象,这样就需要程序开发人员自己来实现相应的树形目录。本文针对这种情况,提供了一种用纯PB代码实现树形结构的方法。
2PB中树形目录的实现方法
PB中实现树形目录可以利用Windows本身的API函数SHBrowseForFolderA(包括在shell32dll文件中),但该API函数只能显示相应的树形目录,不能显示文件信息,而且用户对它不能进行灵活的控制。因此,如果需要进行灵活控制,就需要程序人员自己编写相应代码。
PB中的ListBox列表框控件提供了显示目录和文件的能力。在程序中可以利用PB的树形控件TreeView动态生成树形目录结构。我们使用ListBox控件的函数DirList来实现,函数DirList以满足条件的文件名填充列表框的列表项,其使用方法如下:
listboxnameDirList(文件模式,文件类型)
其中文件类型的值如下所示:
0 可读/可写文件 2 隐含文件 16 子目录 16384 驱动器
1 只读文件 4 系统文件 32 归档文件 32768 除可读/可写外所有类型
在程序中可将几种类型的值相加以获取相应的文件或目录信息。下面结合一个实例介绍树形目录的实现方法,程序界面如图1所示。
图1 树形目录实现的实例
通过树形目录可以获取计算机中的任意目录,然后显示需要显示的文件(本例中显示浏览器可以查看的文件类型:htm,html,swf,gif,jpg,txt等)。程序中主要使用的控件如下所示:
控件名 类型 说明
tv_dir TreeView 显示树形目录
lb_file ListBox 显示相应目录中的文件
ole_disp Microsoft Web浏览器控件 对选定文件进行浏览
lb_dir ListBox 显示驱动器信息
lb_next ListBox 显示当前目录下级目录信息
实现原理
PowerBuilder中有一种以PSR为后缀的特殊的保存报表的文件格式(本文简称PSR文件) 数据窗口可以直接读取PSR文件生成报表 而程序通过生成PSR文件 就可以实现动态报表格式的保存
首先 通过设置数据窗口对象(dataobject)中的文本 列等的Resizeable和moveable属性为 来实现对象位置的拖动控制 通过数据窗口的Modify函数实现对象值的更改(包括增加和删除)
其次要保存报表格式 在一个应用中 数据窗口对象的名称总是惟一的 将每一个数据窗口对象转化成PSR文件存于数据库表中 在窗口打开时 程序先校验报表格式是否存在 如果存在 将报表格式读出来放在一个临时文件当中 然后设置数据窗口(datawindow)的数据对象(dataobject)为这个报表文件 并提取数据 如果不存在 直接提取数据即可
实现过程
建立一个数据库表用以保存报表格式文件
建立一个窗口w_temp 定义实例变量如下
string is_dwtype is_dwobject
//保存报表中对象的类型及名称
在窗口的Open事件中加入如下代码 校验报表格式是否存在 如果存在 读取定义好的报表格式到数据窗口
blob emp_pic
long ll_handle
string ls_dwobject ls_reportfile ls_path
ls_dwobject = dw_print dataobject
//判断是否存在该数据窗口的报表格式
select count() into:ll_count from dyn_report where dwobject =:ls_dwobject;
if ll_count> then
//读取报表格式文件到大文本变量
selectblob memo into:emp_pic from dyn_report where dwobject =:ls_dwobject;
//创建PSR临时文件并保存到硬盘
ls_reportfile = \temp psr
ll_handle = FileOpen(is_reportfile StreamMode! write! LockWrite! Replace!)
FileWrite(ll_handle emp_pic)
FileClose(ll_handle)
dw_print dataobject = ls_reportfile
dw_print settransobject(sqlca)
else
Dw_print settransobject(sqlca)
End if
Dw_print retrieve()
保存报表格式 这可以通过Cb_savereport按钮的clicked事件实现
string ls_filename
long ll_count
blob Emp_id_pic
ls_filename = temp psr
//保存报表格式到硬盘临时文件
dw_print saveas(ls_filename PSReport! false)
sqlca automit = true
select count() into :ll_count from dyn_report where dwobject =:is_dwobject;
if ll_count = then
insert into dyn_report(dwobject rptitle)
values( is_dwobject :ls_filename :ls_path)
end if
//从硬盘临时文件读取数据保存到数据库表中
emp_id_pic = of_readbmpfile(ls_filename)
//该函数将二进制文件内容读到大文本对象中
UPDATEBLOB dyn_report SET memo = :Emp_id_pic where dwobject = :is_dwobject;
//更新数据库
sqlca automit = false
动态报表的实现 通过数据窗口dw_print的clicked事件捕获数据窗口中的对象 并将对象名存放在实例变量is_dwobject中 为下一步修改报表做准备
string ls_type ls_dwoname
//得到对象类型和名称
ls_type = trim(upper(dwo type))
ls_dwoname = trim(dwo name)
is_dwtype = ls_type
choose case ls_type
case TEXT CommandButton GROUPBOX
is_dwobject = ls_dwoname
//设置为可以拖动和改变大小
this modify(ls_dwoname+ Resizeable= + )
this modify(ls_dwoname+ moveable= + )
case LINE
//直线对象不能通过设置Resizeable和moveable属性进行调整 必须通过其他途径
is_dwobject = ls_dwoname
case RECTANGLE ELLIPSE GRAPH BITMAP
is_dwobject = ls_dwoname
this modify(ls_dwoname+ Resizeable= + )
this modify(ls_dwoname+ moveable= + )
case COLUMN PUTE
is_dwobject = ls_dwoname
this modify(ls_dwoname+ Resizeable= + )
this modify(ls_dwoname+ moveable= + )
end choose
最后再通过modify()函数就可以实现基本的动态报表 *** 作 这一类的文章较多 PB中也有大量的例子可直接使用 在此不再赘述
在cb_exit按钮的clicked()事件中加入 close(parent)
在应用的open事件中加入 open(w_temp) 然后保存并运行 全部工作到此结束!
本程序在PB Oracle 下调试通过
编辑推荐
ASP NET开发培训视频教程
lishixinzhi/Article/program/PB/201311/24637
pb
powerbuilder
太有感情了,2000年时一领数据库应用开发风骚的软件,还以为没有人用pb了呢,和许多开发人员谈到pb,多数人都没听说过,呵呵。记得从pb35-pb7一直伴随着我的开发生涯,pb数据窗口技术,从某种意义上来讲直至今日感觉都没有什么比它更好用的,简直太方便和快捷了。说了一堆废话只是看到pb这个词语掀动了以往的很多记忆,呵呵。
我记得pb本身就有文件系统对话框,包括驱动器、目录系统、文件系统3个对话框,只要互相传递路径就可以,驱动对话框将用户选择驱动器给目录对话框,目录对话框给文件对话框,文件对话框直接可以遍历所有文件系统,因为大概10多年没用过,具体名称忘了,不过方式就是这样,如果要用全代码后台 *** 作,不适用控件,pb好像就要用api了。
最后再抒发一下怀旧心情。。。pb真好,数据窗口技术牛的不得了。祝你好运
; 本文介绍一种在Power Builder(以下简称为PB)中利用OLE把数据库中的数据传送到Word文档的方法 通过这种方法 用户可以根据需求而改变内容 以Word方式打印结果文档 例如 在处理学生成绩时 如果要将每个学生的成绩报告生成Word文档 不同的学生只改变姓名 学号和年度等数据 其他的格式不改变 只要从学生成绩数据库中调出特定数据 插入或替换到已经制作好的Word模版中 即可解决问题
一 创建Word模版文档
Word模板文档的创建根据用户的要求进行 在固定的内容输入完成后 将需要变换内容(例如姓名 年度 系别和证书编号等)的位置输入 student_name student_year department 以及 student_id 等编码 注意: 尽量使用英文来表示这些变量 目的是避免某些汉字相同而造成的误替换
在需要动态改变内容的位置 不需要输入文字 可以通过插入书签的方法实现 具体 *** 作如下 首先 选择在Word中 选择 插入 书签 d出 书签 对话框(如图 所示) 在 书签名 文本框中输入书签名称后 点击 添加 按钮 即在当前光标位置上增加了一个书签 假设我们增加了 个书签 分别是 name year department以及id 分别代表姓名 年度 系别以及证书编号
二 PB实现方法
在窗体中新建一OLE控件 在d出的 insert object 属性窗口的 create new tab 选项卡中选择 Microsoft Word 文档 选项 点击 OK 按钮后将该控件放在窗体中适当位置 PB系统会自动出现Microsoft Word应用程序 将控件命名为 OLE_Word 并创建 打开文件 替换数据 和 存盘 按钮 编写如下代码
.打开文件 string docname named integer value value = getfileopenname( Select File docname named DOC Doc Files ( DOC) DOC ) if value = THEN // 将模版文件另存为实际 *** 作文件(程序略) if ole_Word open(docname)= then ole_Word activate(inplace!) end if end if
这里使用 GetFileOpenName 函数让用户自行选择文件 实际应用时可以进行条件的限定 注意: 需要将模版文件另存为实际 *** 作文件后再打开 不能直接 *** 作模版文件 打开文件参数有 种 其中 inplace 表示在PB程序内部窗口调用Word 部分提供Word的功能菜单; 另一种参数是 offsite 表示PB程序外启动Word应用程序 提供Word的所有功能菜单 简单的演示文档如图 所示
lishixinzhi/Article/program/PB/201311/24577
以上就是关于pb中日期变量减1天如何实现date1全部的内容,包括:pb中日期变量减1天如何实现date1、树形目录在PB中的实现与应用、PB动态报表的实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)