2011-01-05 11 views
0

dwで表示される列の一覧を取得するにはどうすればよいですか? dwobject.object.datawindow.column.countを使用して列をループすると、SQLのすべての列が取得されます。それらのうちのどれが表示されていないか把握する方法はありますか?私は自分でそれを見つけることができたDWで表示される列のリストを取得する

答えて

0

Integer li_col_idx, & 
     li_pos 

String ls_objects, & 
     ls_contorl, & 
     ls_columns[], & 
     ls_type, & 
     ls_visible 


li_col_idx = 1 
ls_objects = dw_tab.object.datawindow.objects // Forgot to add this row 

DO while ls_objects <> "" 
    li_pos = Pos(ls_objects, "~t") 

    IF li_pos > 0 THEN 
     ls_control = left(ls_objects, li_pos - 1) 
     ls_objects = mid(ls_objects, li_pos + 1) 
    ELSE 
     ls_control = ls_objects 
     ls_objects = "" 
    END IF 

    ls_type = dw_tab.describe(ls_control + ".type") 
    ls_visible = dw_tab.describe(ls_control + ".visible") 
    IF ls_type = "column" AND ls_visible = "1" THEN 
     ls_columns[li_col_idx] = ls_control 
     li_col_idx++ 
    END IF 
LOOP 
+3

良いコードですが、いくつかの潜在的な短所があります。 Visible属性の式の可能性を考慮していません。一部の開発者は、UI列を削除する恐れがあります(必要はなく、データセットの列で取得/設定することができます)。これがアプリで実行されている場合、「可視性」の基準はより複雑になる必要があります。要件に応じて、計算を考慮する必要があるかもしれません。リストに使用したDescribe()は含まれていませんが、正しいトラックがあると思われます。 Out of space – Terry

+0

他のオブジェクトの背後にコントロールが隠されているデータウィンドウも見てきました。そのことも考慮に入れる必要があります。 Terryと私が言及したケースを扱う最も簡単な方法は、タグに属性を追加することです。隠し=はい; –

+0

良い点、ご意見ありがとうございます。 – Guy

1
Long li_Loop 
    String ls_ColName, lsa_ColNames[] 

    FOR li_Loop = 1 TO dwobject.object.datawindow.column.count 
    ls_ColName = dwobject.Describe("#" + String(ll_Loop) + ".Name") 
    IF Long(dwobject.Describe(ls_ColName + ".Visible")) > 0 THEN 
     lsa_ColNames[ UpperBound(lsa_ColNames[]) + 1] = ls_ColName 
    END IF 

next 

//配列lsa_ColNamesは、[]は、すべての可視列名が含まれています。

+0

Visible式に式がある場合(Long()関数には有効なパラメーターがない)、**クラッシュ**します。また、特定の列のUIコンポーネントがないとクラッシュすることがあります( "DataWindow.Column"はデータセットに逆らっていますが、特定の列のUI要素が削除されたり作成されなかった場合、Visibleは?または!、もう一度、Long()のための悪いparm)。ガイの解答に対する他のコメントが適用されます。 – Terry

0

最近のコードでは、私は(上手に)上の編集スタイルを見て改善しました。アクティブ/表示列だけでなく、ソートが非表示の列(ビジュアルコントロール(VC)なし)で設定され、表示できないようにする必要がありました(「列ソートインジケータ」のスレッドを参照)。

ls_control = idw.describe(ls_next_column + ".type") 
if f_IsEmpty(ls_control) then continue 

choose case ls_control 
case 'column' 
    // EDIT STYLE; dddw, ddlb, edit, mask... 
    ls_control = idw.Describe(ls_next_column + ".Edit.Style") 

    if f_IsEmpty(ls_control) then continue 

    choose case ls_control 
    case '?', '!' 
     continue 

    case else 
     . . . 

THUS編集スタイルは空ですか?または! にVCがない場合。それがVCであることがわかったら、それが可視かどうかを確認します。私のコードでは、私はVCの唯一のリストを保持し、それがOKかどうかをチェックしてください...

0

私はオブジェクト(列、計算、テキストなどの属性を正しく評価するために次の関数を書いた)をデータオブジェクトに格納します。

例:次のコードは、location_id列が現在表示されている場合は '1'を返し、現在表示されていない場合は '0'を返します。表示式に複雑な式が含まれているかどうかは関係ありません。

gfs_evaluate_dw_attribute (dw_mydatawindow, 1, 'location_id', 'visible') 



global function string gfs_evaluate_dw_attribute (datawindow adw_data, long al_row, string as_columname, string as_attribute); 
/*    
    FUNCTION:  gfs_evaluate_dw_attribute 
    ARGUMENT:  datawindow adw_data 
         long al_row - row number, 0 or greater 
         string as_columname - dw column or object with attribute to evaluate. This can also be an object on the DW, ie. "DataWindow", "DataWindow.Print", "DataWindow.Trailer.<group #>" 
         string as_attribute - column or object attrbiute to evaluate  
    RETURN:   string 
    DESCRIPTION: returns the attribute setting whether or not there is an expression 
    HISTORY:  Chis Daugherty 01/14/2014 INITIAL VERSION 

*/ 
////////////////////////////////////////////////////////////////////////////// 

string ls_expression, ls_result, ls_evaluate , ls_type 
long ll_tab_pos, ll_Pos_quote 

ls_expression = adw_data.Describe (as_columname + "." + as_attribute ) 

if ls_expression = '!' or isnull(ls_expression) then return '' 

IF Left(ls_expression, 1) = "~"" AND Right(ls_expression, 1) = "~"" THEN 
    // PB quirk will SOMETIMES return an expression in quotes! 
    ls_expression= Mid (ls_expression, 2 , Len (ls_expression) - 2) 
END IF 

ll_tab_pos = Pos(ls_expression, "~t") 

ls_type = adw_data.Describe(as_columname + ".Type" ) 

IF ls_type = 'compute' THEN 

    IF ll_tab_pos > 0 AND lower(as_attribute) <> 'expression' THEN 
     choose case lower(trim(Mid(ls_expression, 1, ll_tab_pos ),true)) 
     case '1','0' 
      ls_expression = Mid(ls_expression, ll_tab_pos + 1) 
     case else 
     end choose 
    END IF 

    ll_Pos_quote = Pos (upper(ls_expression) , "'") 
    do while ll_Pos_quote > 0 
     ls_expression = Replace(ls_expression, ll_Pos_quote , 0, "~~") //insert tilda! 
     ll_Pos_quote += 2 //move past quote and tilda 
     ll_Pos_quote = Pos (upper(ls_expression) , "'", ll_Pos_quote ) 
    loop  
ELSEIF ll_tab_pos > 0 THEN // conditional value 
    ls_expression = Mid(ls_expression, ll_tab_pos + 1) 
    //check for single quote that gets in way of quote below 
    ll_Pos_quote = Pos (upper(ls_expression) , "'") 
    do while ll_Pos_quote > 0 
     ls_expression = Replace(ls_expression, ll_Pos_quote , 0, "~~") //insert tilda! 
     ll_Pos_quote += 2 //move past quote and tilda 
     ll_Pos_quote = Pos (upper(ls_expression) , "'", ll_Pos_quote ) 
    loop 
else 
    //NO expression just the value was set 
    ls_result = ls_expression 
    return ls_result 
END IF 

if isnull(al_row) or al_row < 0 then al_row = 0 
ls_evaluate = "Evaluate('" + ls_expression + "', " + string(al_row) +") " 

ls_result = adw_data.describe(ls_evaluate) 



return ls_result 


//end of function 

私は1つの形式で何年も使ってきました。楽しい! Chris Daugherty

関連する問題