2015-03-10 3 views
0

Я просто натолкнулся на следующий код в устаревшем приложении Powerbuilder, и мне интересно, есть ли в нем какая-то настоящая необходимость, или кто-то был в настроении ремня и подтяжки.Зачем копировать состояние перед обновлением окна данных?

// Create a datastore that we can capture database errors in 
lds_ds = create n_cst_base_datastore 

// set up the datastore with the state of the datawindow 
ll_Rc = adw_the_dw.GetFullState (lblob) 
ll_rc = lds_ds.SetFullState(lblob) 

// set the transaction object 
li_rc = lds_ds.SetTransObject(sqlca) 

// call the update 
li_Rc = lds_ds.update() 

if li_rc = 1 then // if successful then commit 
    if ab_reset then 
     adw_the_dw.ResetUpdate() 
     COMMIT using sqlca; // should check the commit return code 
    end if 
    li_return = 1 
elseif li_rc = -1 then // otherwise show error message 
    if lds_ds.of_get_error() then 
     lnv_error.of_process_sql_error(lds_ds.of_get_sql_code(), lds_ds.of_get_sql_errtext()) 
    end if 
    ROLLBACK; 
    li_return = -1 
else // better never happen 
    ROLLBACK; 
    li_return = -1 
end if 

Он смотрит на меня, как вы могли бы получить тот же эффект, просто обновляя DataWindow непосредственно в этом случае, так как мы не координируя между несколькими теории DWs

ответ

1

One, чтобы объяснить это было бы, что функциональность этих двух объектов-предков (DataStore и DataWindow) как-то отличается. В n_cst_base_datastore или его предках очень явно настроена настройка (функции из префикса указывают на это), но из этого кода невозможно сказать о предке DataWindow (или даже если у него есть предок).

Существуют также различия в функциональности между DataWindows и DataStores, ориентированные на визуальный характер. Например, некоторые сбои функции DataWindow будут давать визуальные сообщения, тогда как эквивалентные отказы для DataStore re не будут. (SetFilter() приходит на ум, но я не могу подтвердить, является ли это примером сейчас.)

Трудно сказать цель из фрагмента кода, который вы предоставили, но я могу себе представить.

Удачи.

1

В этом разделе:

elseif li_rc = -1 then // otherwise show error message 
if lds_ds.of_get_error() then 
    lnv_error.of_process_sql_error(lds_ds.of_get_sql_code(), lds_ds.of_get_sql_errtext()) 
end if 
ROLLBACK; 
li_return = -1 

может привести к фиксации проблем, в зависимости от того, когда сообщение об ошибке отображается для пользователя. Если почтовый ящик взломан, и пользователь ушел на день, вы можете оставить открытую транзакцию. Поскольку обновление в любом случае потерпело неудачу, лучше зафиксировать ошибку, отменить транзакцию, а затем отобразить ошибку пользователю.

+0

Хорошая добыча! К сожалению, многие системы делают это. – Terry

Смежные вопросы