2015-09-24 50 views
1

我是一个进步的新手,下面是我当前的代码,其中tableNames和fieldnames更改为保护无辜者。我想循环访问数据库中的记录,并在该循环内包含一个按钮,以便在每个记录逐一循环时,如果有人想要改变他们可以做的事情。我有下面的代码循环通过记录罚款(没有下面的按钮元素),我有按钮元素在单独的缓冲区中工作正常,但是当我把按钮放入循环循环运行正常,但停止后的第一个按钮。当我尝试继续运行按钮代码时。我想包含一个按钮,但它只在单击时运行该过程。如果我删除'WAIT-FOR WINDOW-CLOSE OF CURRENT-WINDOW'行。循环继续,因为我想和按钮出现,但该按钮呈现不可点击。任何帮助apprecaited。循环中的按钮

define variable cInsertCompany as character format "x(50)" label "Enter the company name:" no-undo. 
define variable cCompanyName as character format "x(50)". 
prompt-for cInsertCompany. 
assign cCompanyName = input cInsertCompany. 

for each tableName where client = 'tgl', 
each otherTableName where tableName.ref = otherTableName.ref and TableName.name matches '*' + cCompanyName + '*': 
display 
tablename.nrname 
tablename.otherfield. 

DEFINE BUTTON bUpdate LABEL "Update". 
DEFINE FRAME btn-frame WITH SIZE 10 BY 2. 
ENABLE bUpdate WITH FRAME btn-frame. 

ON CHOOSE OF bUpdate DO: 
RUN btn-mess. 
END. 

VIEW FRAME btn-frame. 

WAIT-FOR WINDOW-CLOSE OF CURRENT-WINDOW. 


PROCEDURE btn-mess. 
MESSAGE "Hello" SKIP "You have selected the new button" 
VIEW-AS ALERT-BOX INFO BUTTONS OK. 
END PROCEDURE. 

end. 
+0

你如何期待按键反应?您显示该按钮并将其显示出来,但随后会继续循环,除非您单击该按钮。您的循环中没有任何内容可以停止每条记录,并等待按钮被按下或不按。你是否期望用户以某种方式承认他们已经完成了当前的记录?如果没有等待,你在程序中没有意义处理事件。我认为你需要预先选择而不是每个,然后根据其他事件(按键向上/向下)手动推进bufffer。 – Screwtape

+0

我认为你正在尝试为此使用错误的技术。查询查询和浏览 - 它们使您能够放置用户可以滚动浏览的浏览窗口,然后可以使用按钮指示用户何时想要更改记录。 –

+0

您将启动.p'异步',并在返回之前使.p进程成为循环的一部分,然后您可以检查按钮是否已单击,但“异步”可能非常复杂。这绝对是你想要完成你正在谈论的内容。 – Bill

回答

2

只是为了证明,这同样是这样做的,但使用浏览非常原始的方式:

DEFINE TEMP-TABLE tt 
    FIELD a AS INT 
    FIELD b AS CHAR. 

DEFINE BUTTON bt LABEL "Modify". 
DEFINE BUTTON btS LABEL "Save". 


DEFINE QUERY qr FOR tt. 
DEFINE BROWSE br QUERY qr DISPLAY tt.a tt.b WITH SIZE 60 BY 4 . 


DEFINE FRAME f 
    br bt 
    tt.a SKIP tt.b btS WITH THREE-D SIDE-LABELS. 

ON 'choose':U OF bt IN FRAME f 
DO: 
    RUN updateRecord. 
END. 

ON 'choose':U OF btS IN FRAME f DO: 
    FIND FIRST tt WHERE tt.a = INPUT FRAME f tt.a NO-ERROR. 
    ASSIGN tt.a = INPUT FRAME f tt.a 
      tt.b = INPUT FRAME f tt.b. 
    BROWSE br:REFRESH(). 
    CLEAR FRAME f. 
END. 

/* Create some test records */ 
CREATE tt. ASSIGN a = 1 b = 'first'. 
CREATE tt. ASSIGN a = 2 b = 'second'. 
CREATE tt. ASSIGN a = 3 b = 'third'. 

OPEN QUERY qr FOR EACH tt. 
ENABLE ALL EXCEPT tt.a tt.b WITH FRAME f. 

WAIT-FOR CLOSE OF CURRENT-WINDOW. 

PROCEDURE updateRecord: 
    DISPLAY tt.a tt.b WITH FRAME f. 
    ENABLE tt.a tt.b WITH FRAME f. 
END PROCEDURE. 
+0

谢谢@bupereira,优秀的代码,正是我所需要的,我很欣赏支持 –

1

好吧,首先,我赞同蒂姆上面所说的。我相信浏览是一种更好的方式,因此您可以查看记录,选择它,然后填充下面的第二个屏幕或字段,然后允许用户发疯。但是如果你想在这里实现你想要的,我做了这个模拟程序来展示。它切断你的where子句和提示,为第一,但是这不是你的问题,所以我的目标是让按钮工作:

DEFINE TEMP-TABLE tt 
    FIELD a AS INT 
    FIELD b AS CHAR. 

DEFINE BUTTON bt LABEL "Modify". 

DEFINE FRAME f 
    tt.a SKIP tt.b bt. 

ON 'choose':U OF bt IN FRAME f DO: 
    MESSAGE 'you pressed a button' 
     VIEW-AS ALERT-BOX INFO BUTTONS OK. 
END. 

/* Create some test records */ 
CREATE tt. ASSIGN a = 1 b = 'first'. 
CREATE tt. ASSIGN a = 2 b = 'second'. 
CREATE tt. ASSIGN a = 3 b = 'third'. 

FOR EACH tt: 
    DISPLAY tt WITH FRAME f. 
    ENABLE bt WITH FRAME f. 
END. 

WAIT-FOR CLOSE OF CURRENT-WINDOW. 

现在,再次:这是不是这样做的最佳方式,并我真的认为两个GUI窗口可以使这个更加专业和可视化。但为了学习,我就是这么做的。

让我知道如果您有任何问题,但代码是非常简单的,我希望。

+0

非常有帮助,非常感谢 –