プログラマ38の日記

主にプログラムメモです。

Salesforce: 開発でちょっと便利になる関数のメモ(トリガ用:参照項目をSet<Id>で取得、文字列操作:lenb、leftb、 rightb)

いくつか関数を作ったのでメモです。

 

用意した関数は次の4つです。

  1. トリガでよく使う参照項目のIdのSetを作る
  2. 文字のバイト数(Excelのlenbと同等)
  3. 文字のバイト数(Excelのleftbと同等)
  4. 文字のバイト数(Excelのrightbと同等)

 

1. トリガでよく使う参照項目のIdのSetを作る

トリガで参照項目(参照関係や主従関係)の項目のIdのSetを作り、参照先のオブジェクト情報を取得することは多いですが、その時にいちいちfor文を作るのが手間なので作りました。

    public static Set<Id> idSetOfField(List<Sobject> rows, String idFieldName ){
        
        if(rows == null){
            return null;
        }
        
        Set<Id> retset = new Set<Id>();
        
        for(Sobject row : rows){
            Object val = row.get(idFieldName );
            
            if(val != null){
                retset.add( (Id)val );
            }
        }
        return retset;
    }

文字列で項目名を指定すればIdのSetが取得できます。

使う時は、
    Set<Id> ownerset = SampleUtils.idSetOfField(Trigger.New, 'OwnerId');
などとなります。


2. 文字のバイト数(Excelのlenbと同等)

    public static Integer lenb(String val){
    
        String ex_hankakumoji = '。、・ヲィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙';
    
        
        if( val == null ){
            return null;
        }
    
        Integer bytelength = 0;
        for(Integer idx=0; idx< val.length(); idx++ ){
            String charval = val.substring(idx, idx+1);
            
            if( charval.isAsciiPrintable() ){
                bytelength = bytelength +1;
            } else if( ex_hankakumoji.indexof(charval) != -1 ){
                bytelength = bytelength +1;
            } else {
                bytelength = bytelength +2;
            }
        
        }
    
        return bytelength;
    }


3. 文字のバイト数(Excelのleftbと同等)

2のlenbを使っているのでlenbと同じクラス内に定義します。

    public static String  leftb(String val, Integer bytelength){
        
        if(bytelength <= 0 ){
            return null;
        }
        
        if( val == null ){
            return null;
        }
        
        
        Integer bytecount = 0;
        String retstr = '';
        
        for(Integer idx=0; idx < val.length(); idx++ ){
            
            String charstr = val.substring(idx,idx+1);
            
            Integer strlenb = lenb(charstr);
            
            if( bytelength < (bytecount + strlenb) ){
                
                if( strlenb == 2  && (bytecount + strlenb - bytelength) == 1 ){
                    retstr = retstr + ' ';
                }
                
                break;
            } else {
                retstr = retstr + charstr;
                bytecount = bytecount + strlenb;
            }
        }
    
        return retstr;    
    }


4. 文字のバイト数(Excelのrightbと同等)

2のlenbを使っているのでlenbと同じクラス内に定義します。

    public static String  rightb(String val, Integer bytelength){
        
        if(bytelength <= 0 ){
            return null;
        }
        
        if( val == null ){
            return null;
        }
        
        
        Integer bytecount = 0;
        String retstr = '';
        
        for(Integer idx=val.length()-1; idx > -1; idx-- ){
            
            String charstr = val.substring(idx,idx+1);
            
            Integer strlenb = lenb(charstr);
            
            if( bytelength < (bytecount + strlenb) ){
                
                if( strlenb == 2  && (bytecount + strlenb - bytelength) == 1 ){
                    retstr = ' ' + retstr;
                }
                
                break;
            } else {
                retstr = charstr + retstr;
                bytecount = bytecount + strlenb;
            }
        }
    
        return retstr;    
    }