2013-08-16 42 views
4

問題非常普遍,讓我們從代碼可讀性,靈活性和偏離表現的角度來看OpenEdge中的每個優缺點。
OpenEdge中的靜態查詢和動態查詢

靜態查詢:

+ readability: convenient `buffer.field` notation 
+ performance: higher (supposedly, need comments) 
-/+ "global scope" allows to handle all previously used buffers, but could lead 
       to ambiguousness, so you'll have to clarify it with a table 
       name (table.field instead of field) 
- flexibility: you cannot alternate predicate-expression much, 
       even IF function is not recommended (can affect performance)  

動態查詢:

+ flexibility: you can build predicate-expression completely runtime 
+ flexibility: you can work with each field not specifying its name, 
       f.e. you can process all fields of certain record in cycle 
+ flexibility: are reusable (need comments on this point) 
+/- "local scope" allows to use only buffers specified in `SET-BUFFERS` method 
- readability: a little more code to write 
- performance: slightly slower (not sure) 

補充和更正的歡迎。以及任何相關閱讀的鏈接。

+0

這其實不是問題嗎? – Jensd

+0

@Jensd我改變了公式 – Progressive

回答

4

靜態查詢的過濾條件可以「飛」來改變,像這樣:

DEFINE QUERY q-name FOR table-name. 
DEFINE VARIABLE h-qry AS HANDLE  NO-UNDO. 
h-qry = QUERY q-name:HANDLE. 
h-qry:QUERY-PREPARE("for each table-name where table-name.field-name = 1"). 

從這裏查詢被視爲與任何正常的靜態查詢。可讀性:「buffer-handle:buffer-field(」field-name「):buffer-value」結構指動態緩衝區 - 在動態查詢中使用靜態緩衝區是完全可以接受的(通過BUFFER表名:HANDLE),所以動態查詢緩衝區可以使用w /靜態緩衝區,並不總是需要使用它的句柄去引用一個字段。

性能:上次我做了比較,動態查詢對於相同查詢條件比靜態查詢慢。好處是它們比靜態查詢更靈活。

可重用性:一旦設置了動態查詢的緩衝區結構AFAIK,它就無法更改。雖然它可以重新打開一個新的過濾條件相同的靜態查詢。

+1

謝謝。沒有注意到使用動態查詢和靜態緩衝區的可能性。這非常有用! – Progressive