2015-09-24 81 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

非常有幫助,非常感謝 –