CIMLOAD 时系统中的F2以及ESC在程序中用什么表示,是不是用 .
执行用换行;ESC用. ;删除用X
//======
如何增加DB.b文件個數
因為.B文件太大數據庫無法啟動,我現在想增加一個db.b2,但都告訴我要先要移除db.b1的變動長度,然後.st文件應該如何設定
st文件里就一行 b . ( . 代表当前路径,你可以写完全的路径)
然后执行 prostrct add xxxx.st
//======
PROGRESS程序架构。
PROGRESS启动应用程序,通常都是先启动一个主程序,比如mf.p,这个mf.p做一些全局变量设置,并初始化应用程序菜单。当用户执行菜单功能时,实际上是运行菜单所指定的程序!在这种模式下,PROGRESS的程序一般都不大,结构明了可读性很强,每个程序目的非常明确,但是也要遵循一定的准则,方便以后的阅读和修改。
一、程序扩展名的设定。
.p 主程序(可直接运行,或者编译以后挂主菜单被调用)
.i 子程序(经常使用的执行某一特定功能,或者为了使主程序易于阅读脱离出来)
.v 验证程序
.w Windows的程序(Windows版的Progress支持可视化的组件编程,组件拉一拉放一放,就自动生成.w的文件了)
.r 编译后的程序(菜单调用时,实际上是执行.r的程序)
二、程序的命名规则。
主程序格式: aa+ bb + cc + dd.p
其中:
aa --- 系统模块ID
bb --- 系统功能
cc --- 程序类型(mt-维护、iq-查询或者rp-报表等)
dd --- 序列号
子程序格式:通常是 主程序a.i 主程序b.i 这样子
//关于程序的命名,个人觉得也没必要一定要遵循特定格式,一家公司有自己固定的命名方式,容易区分即可;如果是咨询公司或者系统集成公司,则要先了解客户的命名习惯和规则;同理,下面的“程序头”。
三、程序头。
以注释的形式,标明尽可能多的程序相关的信息,比如:程序名(路径,不过路径一般都是企业自己规定好了)、作者、菜单号、功能(菜单标题)、创建日期、修改日志等。至于格式,也就是POSE,爱怎么摆怎么摆,清楚明了即可。但是,在同一家公司,风格应该统一。另外,关于修改日志,个人觉得最好在程序头和程序体,都明显说明一下修改的日期和原因,要点。(注释不记入程序长度,所以不要担心程序太长,:p )
四、维护类程序模板。
注意:为方便说明,注释暂时用“//”,但是在PORGRESS程序里是错误的哈!
define variables.
{mfdtitle.i} //程序头,全局变量定义等,是标准QAD的菜单程序就请加上这个,不要问为什么
form with frame a. //定义格局(包含输入输出)
Mainloop:
repeat:
prompt-for … editing: //通常这里输入主要字段(如果比如订单号,料件名称等)
{mfnp.i} //前后记录显示功能,常用
end.
/* ADD/MODI/DELETE */
assign global…
find …
if not available … //新记录
{mfmsg.i 1 1} //类似mfmsg的子程序,都是信息提示类
create …
assign …
end.
Status = stline{2}.
update go-on (F5 or Ctrl-D) //继续维护剩余字段
if F5 or CTRL-D then d //判断是否按了删除键,一般定义是F5或者Ctrl+ D
del-yn = yes.
{mfmsg01.i 11 1del-yn}
end.
End.
Status input.
五、报表类程序的模板。
{mfdtitle.i}
form definition [selection criteria]
part colon 15 part1 colon 40 label {t001.i}
effdate colon 15 effdate1 colon 40 label {t001.i}
with frame a side-labels width 80.
//以上4行定义用户输入“限制报表输出”的条件,比如生效日期啊什么的
repeat:
if part1 = hi_charthen part1 = “”. //如果用户不输任何东西,则默认最大字符或者最小字符,以下类似
if effdate = low_date then effdate = ?.
if effdate1 = hi_datethen effdate1 = ?.
data statements [selection criteria]
bcdparm = "".
{mfquoter.i part } //BATCH专用,至今没用过,体会不到好处,哪位帮忙解释一下?
{mfquoter.i part1}
{mfquoter.i effdate}
{mfquoter.i effdate1}
{mfselbpr.i “printer” 132}//选择打印机的子程序
if part1 = “” thenpart1 = hi_char.
if effdate = ? Then effdate = low_date.
if effdate1 = ? Theneffdate1 = hi_date.
{mfphead.i or mfphead2.i} //报表头
for each…
display
{mfrpchk.i} or {mfrpexit..i} //报表结束
end.
{mfrtrail.i} or {mftr0801.i}or {mfreset.i} //报表结束、打印结束等
end.
六、查询类程序模板。
这个比报表来得要简单些了:
{mfdtitle.i}
form definition [selection criteria]
with frame a side-labels width 80.
repeat:
data statement [selection criteria] withframe a.
{mfselprt.i “terminal” 80 }
for each [selection criteria]
display …
{mfrpchk.i} (max page)
end.
{mfreset.i} (scroll output)
{mfmsg.i 8 1}
end.
//======
以下是我发贴子后根据手册上的内容改定的具有添加,修改,删除三个基本功能的程序,希望能给和我一样的初学者一点参考。
{mfdtitle.i}
DEFINE VAR isdel AS LOG./*用于判断是否同意删除的变量*/
DEFINE VAR curr-id AS ROWID./*获取行号*/
DEFINE QUERY q1 FOR pt_mstr./*定义查询*/
DEFINE BROWSE curr-brow QUERY q1 DISP pt_part pt_abc WITH 10 DOWN WIDTH 19.
DEFINE BUTTON a LABEL "DELETE A RECORD"./*删除按钮*/
DEFINE BUTTON b LABEL "INSERT OR UPDATE"./*插入与更新按钮*/
DEFINE VAR isinsertorupdate AS LOG./*判断是否插入与更新的逻辑值*/
FORM /*定义放置控件的窗体*/
a COLON 8 SKIP(.5) b COLON 8 SKIP(.5) curr-brow COLON 8 WITH FRAME T CENTERED TITLE "delete insert update" WIDTH 40.
OPEN QUERY q1 FOR EACH pt_mstr.
ON VALUE-CHANGED OF curr-brow /*当前浏览页的行值改变所产生的事件*/
D
curr-id=ROWID(pt_mstr)./*取行值*/
END.
ON CHOOSE OF a D/*删除按钮产生的事件*/
MESSAGE "will you delete the record?" VIEW-AS ALERT-BOX BUTTONS YES-NO UPDATE isdel./*询问是否同意删除*/
IF isdel THEN /*是否同意删除*/
D
FIND pt_mstr WHERE rowid(pt_mstr)=curr-id EXCLUSIVE-LOCK./*定位到所选行*/
DELETE pt_mstr./*删除*/
curr-brow:REFRESH()./*更新*/
END.
END.
ENABLE ALL WITH FRAME T.
ON CHOOSE OF b D/*插入或更新按钮被点击的事件*/
MESSAGE "DO YOU WANT TO INSERT OR UPDATE A RECORD!" VIEW-AS ALERT-BOX BUTTONS YES-NO UPDATE isinsertorupdate.
IF isinsertorupdate THEN D/*同意的话,则进行以下操作*/
PROMPT-FOR pt_part pt_abc COLON 20.
FIND pt_mstr USING pt_part NO-ERROR.
IF NOT AVAILABLE pt_mstr THEN D/*pt_mstr如果没此记录,则当作增加记录处理*/
MESSAGE "YOU HAVE INSERTED A RECORD SUCCESSFUL!" VIEW-AS ALERT-BOX./*
CREATE pt_mstr.
ASSIGN pt_abc
pt_part.
curr-brow:REFRESH()./*刷新动作,奇怪。。这个动作在BROW上没反应,请高手说明该如何解决?*/
END.
ELSE D/*如果存在记录,则对记录进行更新*/
MESSAGE "YOU HAVE UPDATED A RECORD SUCCESSFUL" VIEW-AS ALERT-BOX.
ASSIGN pt_part
pt_abc.
curr-brow:REFRESH()./*刷新记录*/
END.
END.
ELSE D
LEAVE.
END.
END.
WAIT-FOR WINDOW-CLOSE OF CURRENT-WINDOW.
//======
ERP中修改Table索引問題
我以前试过也不行,然后我看文档,就是得用 proutil db-name -C idxbuild [ all ] [ -TB ] [ -TM ] 命令
define variable WodEffDate as Date.
display "r72221" @ wod_nbr today @ wodeffdate with frame a .
prompt-for Wod_Nbr WodEffDate colon 15 with frame a.
QAD表有两个文件,一个是表定义DB Define.pdf,另一个是表关系图Entity Diagrams.pdf,你们的顾问应该给你们了。
DEF TEMP-TABLE xx
FIELD xx_tablename LIKE qaddb._file._file-name
FIELD xx_order LIKE qaddb._field._order
FIELD xx_fieldname LIKE qaddb._field._field-name
FIELD xx_fieldlabel LIKE qaddb._field._label
FIELD xx_Datype LIKE qaddb._field._data-type
FIELD xx_format LIKE qaddb._field._format
FIELD xx_lbllong LIKE lbl_long
FIELD xx_lblmedium LIKE lbl_medium
FIELD xx_lblshort LIKE lbl_short
.
FOR EACH qaddb._FIELD NO-LOCK ,
EACH qaddb._FILE OF qaddb._field NO-LOCK:
CREATE xx.
ASSIGN xx_tablename = qaddb._FILE._file-name
xx_order = qaddb._field._order
xx_fieldname = qaddb._FIELD._field-name
xx_fieldlabel = qaddb._field._label
xx_Datype = qaddb._field._data-type
xx_format = qaddb._field._format.
FIND FIRST lbld_det WHERE lbld_fieldname = qaddb._FIELD._field-name NO-LOCK NO-ERROR.
IF AVAIL lbld_det THEN
FIND FIRST lbl_mstr WHERE lbl_term = lbld_term NO-LOCK NO-ERROR.
IF AVAIL lbl_mstr THEN
ASSIGN xx_lbllong = lbl_long
xx_lblmedium = lbl_medium
xx_lblshort = lbl_short.
END.
OUTPUT TO c:\tmp\qadtable.txt.
FOR EACH xx BREAK BY xx_ta