本部長は管理ができない

Salesforceに関わっているエンジニアの技術メモ。ときどきそれ以外。

apex:commandLinkをボタン風に変更する

apex:commandButtonを使って別画面起動が出来なくて、苦肉の策でapex:commandLinkをボタン風にしてごまかした記録。

やり方は、スタイルで「btn」をあてる。
押下不可状態にしたければ、スタイルは「btnDisabled」となる。

<apex:commandLink value="commandLink" styleClass="btn" />
<apex:commandLink value="commandLink" styleClass="btnDisabled" />

これの結果。
f:id:gren_dken:20130905220111p:plain

これだけだと、リンクのアンカーラインが表示されてしまう。
なので、aタグに対してスタイルをあてる。

a{ text-decoration: none; }

これの結果。
f:id:gren_dken:20130905221117p:plain

しかし、まだ課題が。
カーソルをあてると、アンカーラインが表示される。色が変わる。
カーソルがキャプチャ出来ていないが、こんな感じ。
f:id:gren_dken:20130905221344p:plain

これの対応は少し面倒。

/* 押下可能ボタン */
a:link.lnk2btn{ text-decoration: none; color: black; }
a:visited.lnk2btn{ text-decoration: none; color: black; }
a:hover.lnk2btn{ text-decoration: none; color: black; }
a:active.lnk2btn{ text-decoration: none; color: black; }

/* 押下不可ボタン */
a:link.lnk2btnD{ text-decoration: none; }
a:visited.lnk2btnD{ text-decoration: none; }
a:hover.lnk2btnD{ text-decoration: none; }
a:active.lnk2btnD{ text-decoration: none; }

リンク先表示済みの場合など色が変わるので、それぞれのスタイルを作成する。
なお、上記順番で記述しないと反応しない。

押下可能可否でクラスを分けたのは、押下不可の場合、文字色を変えるため。黒ではおかしい。

そのため、apex:commandLinkの方も書き換える

<apex:commandLink value="commandLink" styleClass="btn lnk2btn" />
<apex:commandLink value="commandLink" styleClass="btnDisabled lnk2btnD" />


最後に、押下不可ボタンを押下したときに無反応にさせる。
onclickを追加する。

<apex:commandLink value="commandLink" styleClass="btn lnk2btn" />
<apex:commandLink value="commandLink" styleClass="btnDisabled lnk2btnD" onclick="return false;" />


元々がリンクであるため、縦に配置するとボタン同士がくっついたりするので、適宜調整は必要。

オブジェクトのAPI参照名を取得する

標準オブジェクトのSOQLを書こうとすると、あれ?API参照名何だっけ?となるので取得する処理を書いてみた。
標準オブジェクトと同名のカスタムオブジェクトを作成していた場合、カスタムオブジェクトが取得される可能性がある。まあ、そこはSchema#getGlobalDescribeの気まぐれなので・・・

public void getObjectApiName(String targetObjectName){
    Boolean fined = false;
    Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe();
    for (String sKey : gd.keySet()) {
        Schema.DescribeSObjectResult targetObject = gd.get(sKey).getDescribe();

        if(targetObject.getLabel() == targetObjectName){
            System.debug('★' + ' : '+ targetObjectName + ' -> ' + targetObject.getName());
            fined = true;
            break;
        }
    }
    if(!fined){
        System.debug('★' + ' : '+ targetObjectName + ' -> 不明');
    }
}

ファイルリスト作成マクロ

ファイルリストを作成するExcelマクロ。
拡張子は「xls;xlsx」のように指定。セパレータは何でも良い。
さぼったので、見つけたファイルの拡張子が上記文字列に含んでいるかのチェックしかしていない。
なので、「xlsx」と指定しても「xls」も拾えてしまう。
セパレータを定数にして、splitでリストに入れて、リストをチェックすれば回避可能かと。

' ------------------------------------------------------------------
' ファイルリストの生成
'  A列にファイルのフルパス、B列にファイル名を出力
' targetFolder      :検索対象のフォルダパス
' targetExtensions  :検索対象の拡張子(何かで区切ってあること)
' outputSheet       :ファイルリストの出力先シート
' outputStartRow    :ファイルリストの出力先開始行番号
' ------------------------------------------------------------------
Private Sub createFileList(targetFolder As String, targetExtensions As String, outputSheet As Worksheet, outputStartRow As Integer)
    Dim fileList As Object
    Dim fileObj As Variant
    Dim folderList As Object
    Dim folderObj As Variant
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim fileExtension As String
    
    ' ファイルを取得
    Set fileList = CreateObject("Scripting.FileSystemObject").GetFolder(targetFolder).Files
    For Each fileObj In fileList
        ' 拡張子をチェック
        fileExtension = fso.GetExtensionName(fileObj.Path)
        If targetExtensions = "" Or InStr(targetExtensions, fileExtension) <> 0 Then
            outputStartRow = outputStartRow + 1
            outputSheet.Cells(outputStartRow, 1) = fileObj.Path
            outputSheet.Cells(outputStartRow, 2) = fso.GetBaseName(fileObj.Path)
        End If
    Next
    
    ' サブフォルダを取得し、そのサブフォルダ内のリストを生成
    Set folderList = CreateObject("Scripting.FileSystemObject").GetFolder(targetFolder).SubFolders
    For Each folderObj In folderList
        Call createFileList(folderObj.Path, targetExtensions, outputSheet, outputStartRow)
    Next
End Sub

表の行番号表示

apex:variableを使う
page内で使用可能な変数
文字列型(?)なので、VALUEを使用し数値に変換し加算する

<apex:variable var="rowNum" value="1" />
<apex:repeat value="{!list}" var="detail">
    <tr>
        <td>
            <apex:outputLabel value="{!rowNum}" />
        </td>
        <td>
            <apex:outputLabel value="{!detail}" />
        </td>
    </tr>
    <apex:variable var="rowNum" value="{!VALUE(rowNum) + 1}" />
</apex:repeat>

List、Mapの宣言時の初期化

List<String> listFoo =
    new List<String> {
        'Red', 'Yellow', 'Pink', 'Green', 'Purple'
    };

Map<String, String> mapFoo =
    new Map<String, String>{
        'アントニオ猪木' => '猪木寛至',
        'ジャイアント馬場' => '馬場正平',
        '北斗晶' => '佐々木久子',
        'アジャ・コング' => '宍戸江利花'
    };

ファイル名の末尾に更新日時を付与するVBScript

エビデンスの画像ファイルに日時を付与したくて作ったもの。
以下のコードを拡張子vbsにして保存。
vbsファイルにリネーム対象のファイル(複数可)をD&Dする。

'----------------------------------------
' ファイル名の末尾に更新日時を付与する
'----------------------------------------

Option Explicit

' 引数確認
if WScript.Arguments.Count < 1 then
    WScript.Quit
end if

' FileSystemObject生成
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Dim targetPath, changePath

For Each targetPath In WScript.Arguments
    ' パスがファイルで、存在する場合に処理
    if fso.FileExists(targetPath) then
        ' 更新日付を付与したパスを取得
        changePath = createNewFilePath(targetPath)

        ' リネーム
        Call fso.MoveFile(targetPath, changePath)

        ' コピー
        'Call fso.CopyFile(targetPath, changePath)
    end if
Next

'------------------------------
' 更新日付を付与したパスを生成
'------------------------------
Function createNewFilePath(targetPath)
    Dim fo
    Set fo = fso.GetFile(targetPath)

    ' ファイル更新日時取得 + 不要文字削除
    Dim lastModified
    lastModified = fo.DateLastModified
    lastModified = Replace(lastModified, "/", "")
    lastModified = Replace(lastModified, ":", "")
    lastModified = Replace(lastModified, " ", "_")

    ' ファイルパス分割
    Dim targetDir
    Dim targetBaseName
    Dim targetExt
    targetDir = fso.GetParentFolderName(targetPath)
    targetBaseName = fso.GetBaseName(targetPath)
    targetExt = fso.GetExtensionName(targetPath)

    ' 変更後ファイルパス生成し、返却
    createNewFilePath = targetDir & "\" & targetBaseName & "_" & lastModified & "." & targetExt
End Function