我编写了一个简单的代码来搜索数据库中的一些数据并将其显示在浏览器中(br1),它包含以下布局screenshot
DO:
Enable
oadd oupdate odelete ocancel with frame default-frame.
Find First Customer where Customer.Cust-Num =input oCustNum exclusive-lock NO-ERROR .
if available customer
THEN DO:
message "1" view-as alert-box.
update
Customer.Name = input oName
Customer.Balance = input oBalance
Customer.Discount = input oDiscount
Customer.Credit-Limit = input oCredit-Limit
Customer.Phone = input oPhone
Customer.Contact = input oContact .
br1:refresh().
end.
if not available customer
THEN DO:
message "2" view-as alert-box.
Create Customer.
assign
Customer.Cust-Num = input oCustNum
Customer.Name = input oName
Customer.Balance = input oBalance
Customer.Discount = input oDiscount
Customer.Credit-Limit = input oCredit-Limit
Customer.Phone = input oPhone
Customer.Contact = input oContact .
end.
END.
我已经编写了保存更新的代码并添加了保存按钮 .
现在当按下取消按钮时,我需要在添加/更新完成之前撤消/回滚数据到原始值 .
有人可以帮我吗?
2 回答
我想你需要重新考虑你的设计!
“撤消”意味着事务处于打开状态,并且特定事务将被回滚 . 例如,您可以通过在事务中封装整个GUI来实现此目的,但这是不好的做法 . 如果有人离开会话,它将提供长事务,锁定问题,双文件增长和潜在崩溃 . 不是一个好主意 - 你想让你的交易变小!
您需要研究一种更基于服务的方法 . 例如:
当界面加载时,您将感兴趣的记录加载到临时表中 .
当您单击“添加”,“更新”,“删除”等时,您对这些记录进行了更改 . “添加”在临时表中创建新记录,“更新”对记录进行更改并删除临时表中的删除(或删除标记)记录 .
单击“保存”时,首先检查数据库中是否没有更改记录,否则将更改从临时表保存到数据库中 . 如果更改它们,您可能需要提醒用户 .
单击“取消”时,您只需退出并忽略更改 .
通过使用数据集,您可以获得对此方式的部分支持 . 阅读那些!
https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvpds/preface.html#
************************************************** ***************************** / / ************** ****** VARIABLES DEFINITION ************************************* /
DEF VAR部分LIKE pt_part NO-UNDO . DEF VAR m_desc1 LIKE pt_desc1 NO-UNDO . DEF VAR m_desc2 LIKE pt_desc2 NO-UNDO . DEF VAR m_can AS LOGICAL NO-UNDO .
/ ******************* ************ /
/ ***************************** FR**** ********************* *********************** /
FORM部分COLON 30 m_desc1 COLON 30 m_desc2 COLON 30 m_can COLON 30,框架宽100面标签 . SETFRAMELABELS(框架a:手柄) .
/ ******************* ***************************** / mainloop:使用框架更新部分a .
对于每个pt_mstr WHERE pt_domain = global_domain AND pt_part = part NO-LOCK:ASSIGN m_desc1 = pt_desc1 m_desc2 = pt_desc2 . 显示m_desc1 m_desc2 WITH FRAME a . 结束 .
如果不可用(pt_mstr)则执行:更新m_desc1 m_desc2 m_can COLUMN-LABEL使用框架“取消”a .
创建pt_mstr . ASSIGN pt_part = part pt_desc1 = m_desc1 pt_desc2 = m_desc2 . 结束 .
如果m_can = YES则执行:UNDO mainloop,RETRY mainloop . 结束 . / ******************* ************** /