SOQL文での集計関数
SOQLで集計関数を使用する際に調べたことをメモしていきます。
今回の記事の説明用に下記のサンプルデータを使って例を記載していきます。
売上日/SalesDate | 名前/Name | 年齢/Age | 性別/Gender | 売上/Sales |
---|---|---|---|---|
2016-08-01 | Tom | 26 | 男性 | 280,000 |
2016-08-04 | Mary | 28 | 女性 | 275,000 |
2016-08-07 | John | 31 | 男性 | 310,000 |
2016-08-10 | Mary | 28 | 女性 | 360,000 |
2016-08-13 | Tom | 26 | 男性 | 240,000 |
SOQLの集計関数
SOQLで集計関数を使うにはAggregateResult
型を使用しなければいけません。
まずここがSQLと違うのでハマりやすいポイント。
// 全員の売上の合計を求めるSOQL AggregateResult[] aResults = [SELECT SUM(Sales__c) summary FROM Hoge__c]; System.debug('売上合計:' + aResults[0].get(summary) + '円'); // 売上合計:1465000円
サンプルでは合計を求めるSUM()
を使用していますが、最大値を求めるMAX()
等他にも関数があります。
詳細は公式リファレンスを参照。
GROUP BY句
GROUP BY
を使うことによって、指定した値別に結果を求めることが出来ます。
今回の例ではGROUP BY
で性別を指定しているので、男女別の売上の合計値を求めることが出来ます。
// 男女別に売上の合計を求めるSOQL AggregateResult[] aResults = [SELECT Gender, SUM(Sales__c) summary FROM Hoge__c GROUP BY Gender]; for(AggregateResult ar : aResults){ System.debug(ar.Gender + 'の売上合計:' + ar.get(summary) + '円'); } // 男性の売上合計:830000円 // 女性の売上合計:635000円
HAVING句
Having
を使うことによって、GROUP BY
で指定した値別の結果に絞り込み条件を指定することが出来ます。
Where
と似ていますが、Having
はグルーピングした後の値に条件を指定しているので、違いに注意が必要です。
今回の例ではGROUP BY
で名前を指定しているので、名前別の売上の合計値を求めることが出来ます。
// 名前別に売上の合計を求めるSOQL(売上合計が500,000円以上のみ) AggregateResult[] aResults = [SELECT Name, SUM(Sales__c) summary FROM Hoge__c GROUP BY Name Having summary >= 500000]; for(AggregateResult ar : aResults){ System.debug(ar.Name + 'の売上合計:' + ar.get(summary) + '円'); } // Tomの売上合計:520000円 // Maryの売上合計:635000円 // Johnは売上合計が500,000円未満なので取得されない
参考
レコードタイプのIDをSOQLで取得する
オブジェクトのレコードタイプのIDを取得したい時があったので、その時に調べたことをメモします。
レコードタイプはレコードタイプオブジェクトの中にあるレコードなので、そこからSOQLで引っ張ってくるような文を書きます。
下記のサンプルコードはContactオブジェクトのhogeという名前のレコードタイプのIDを抽出する内容になっています。
※レコードタイプの表示ラベル名(Name)ではなく、API名(DeveloperName)の方で検索すること。
// SobjectTypeでオブジェクト指定 // Nameでレコードタイプの名前指定 String sobjectTypeName = 'Contact'; String recordTypeName = 'hoge'; Sobject recordType = [SELECT Id FROM RecordType WHERE SobjectType = :sobjectTypeName AND DeveloperName = :recordTypeName ];
参考ページによるとSOQL以外での取得方法もあるみたいですが、今のところ僕にはこちらで十分。
参考
メールアドレス不達フラグによるメール送信エラー
以前メール送信のタイマーセット機能を実装したんですが、セットした時間になっても送信されなかったことがあり、その時に色々調べたことをメモします。
過去にApexでメール送信機能(SingleEmail)についての記事を書きました。
この時に送信対象者の中に、メールアドレス不達フラグがTrueの人が一人でもいると送信自体が失敗してしまいます。
レコードのメールアドレス不達フラグがTrueなら画面がこんな感じになっているはずです。 (因みにメールアドレスを編集したら不達フラグはFalseになり、このエラーメッセージは表示されなくなります。)
なので送信対象者をSOQL文で引っ張ってくる時に、送信対象者のメールアドレス不達フラグがTrueの人を除外するような文に変更することで解決しました。
項目名 | API名 |
---|---|
メール不達発生日 | EmailBouncedDate |
メール不達の理由 | EmailBouncedReason |
Contact[] conList = new List<Contact>(); conList = [SELECT Email FROM Contact WHERE EmailBouncedDate = null AND EmailBouncedReason = null ];
参考
【J-HIPHOP】Lion's ROCK - NO’17
大阪は高槻発のHIPHOPユニット、Lion’s ROCKが2008年に出したファーストアルバムが才能の塊過ぎて凄いです。
メンバーはMC/TrackMakerのatius(TrackMaker名義は吹田2000)とエンジニアのFULL-HOUSE。
かつてダメレコ1,000円CDシリーズで発売された本作ですが、この時atiusはまだ若干22~23歳くらい。
当時大阪のタワレコで偶然見つけて、安かったし何となく買って、帰って聞いたら良すぎて感動したのを覚えてます。
特徴的な高い声とトリッキーかつスキルフルで歌心も感じるフロウ、Jazzサンプリングを基調にした軽快なトラックで、完成度もオリジナリティも他のJapanese HIPHOPとは一線を画してました。
ドープなんだけどポップで、ポップなんだけどひねくれている感じがツボです。
feat.勢も現在同じクルー'高槻POSSE'に所属するJAB,八空,IPPey(BYG daddy)の3名で、彼らもアクが強くいい仕事してます。
クルーでの動きも面白いんですけど、個人的にはソロでセカンドアルバムを聴いてみたいですね。
持ってない人は購入を激プッシュ!
レコードへのアクセス制限について(随時更新)
Salesforceのレコードへのアクセス制限がややこしかったので、使った範囲でメモしていきます。
新しいことが分かったら随時更新していくと思います。
プロファイル
ユーザーの管理 > プロファイル
各オブジェクトへのアクセスを制限することができます。(下記参照)
- 参照
- 作成
- 編集
- 削除
- すべて表示
- すべて変更
組織の共有設定
設定 > セキュリティのコントロール > 共有設定
レコードの所有者以外のユーザーのレコードへのアクセス権限を設定できます。(下記参照)
- 非公開
- 公開/参照
- 公開/参照・更新可能
- 公開/参照・更新可能/所有権の移行
「非公開」にすればレコードの所有者以外のユーザーはレコードを参照することができません。 所有者はフルアクセス権を擁します。
ただし、ロールの設定によって所有者以外もレコードにアクセスすることが可能になります。
ロール
ユーザーの管理 > ロール
共有設定でレコードへのアクセス権限を設定したが、ロールを設定することでアクセス権限を拡張することができます。
ロールには階層というものがあり、上位の階層に位置するロールのユーザーは、下位のロールのユーザーが所有者のレコードにもアクセスすることができます。
例えば下記の様なロール階層があったとします。
部長 └課長 └平社員
そして、リードオブジェクトのあるレコードの所有者Aさんのロールが「平社員」で、組織の共有設定ではリードオブジェクトのアクセス権限は「非公開」だとします。
この場合、通常はレコードの所有者であるAさんしかそのレコードにはアクセスできませんが、ロールが「課長」のBさん、「部長」のCさんは、「平社員」よりも上位の階層のロールを割り当てられているので、そのレコードにアクセスすることができます。
参考
【J-HIPHOP】Amp-refive - Coming Out
大阪発のHIPHOP CREW Amp-refiveが2010年にリリースした1stアルバム
メンバーはMC兼TrackMakerのCosaqu,MCのpLRayer,SEAMAN、DJ兼TrackMakerのFUKUMURA,DMCでも実績を残しているDJの比我の5人。
キャラ立ちした3MCのスキルフルなラップが映える。
トラックやサビはいい意味でポップなものが多く、音楽センスの高さを感じます。
あとボーカルの入れ方がうまいというか、重ねやコーラスの入れ方がライブ感あって気持ち良いです。
アルバムのメガミックス1曲目の'The Session'が凄いかっこよくて、買うのを即決めしたのを覚えています。 ジャケットも回路図みたいで面白いですね。
今はグループでは全然活動していない感じで残念なんですが、次のアルバムをとても楽しみにしているので活動再開を心待ちにしております。
全国流通はしておらず、現在購入できる所が無さげなので欲しい人は本人達に直接問い合わせてもらった方が確実かと。
Windows 7からWindows 10 アップグレード時のトラブル
以前職場のPCをアップグレードした際にトラブルに見舞われ、下記の様な記事を書きました。
今回は自宅のWindows 7(自作PC)をアップグレードした際、そしてアップグレード後のトラブルに見舞われたので、その際の解決方法を書きたいと思います。
何かの参考になれば幸いです。
アップグレード時のトラブル
まず通常通りWindows 7のデスクトップ画面にWindows 10にアップグレードする通知が来ていますので、「今すぐアップグレード」をクリックしてアップグレード開始。
アップグレードが始まってしばらくすると下記の様な画面になると思います。
時間が経つにつれてどんどんパーセンテージが上がっていきます。 順調、順調とか思っていたら値が76%のところでストップしてしまい、先に進めなくなりました。
1~2時間待ってみたんですが一向に進まないので、やむなく電源ボタンを長押しして強制終了。
これを三回ほど繰り返しましたが、一向に進まないので原因を突き止めるべく調査を開始しました。 下記のリンクに色々な解決パターンが書いてあり、参考にさせて頂きました。
参考
結論から言うと、僕の場合は「レガシーUSBのサポートを無効」にすることで解決することが出来ました。
BIOS画面にて無効にすることが出来ます。
無効にした後はすんなりアップグレードしてくれました。
「なんだ、Windows 10思ったより楽勝じゃん!」とかこの時は思っていましたが、地獄はその先に待っていました。
アップグレード後はフリーズの嵐!
アップグレード後はデバイスマネージャーから、各種ドライバーを手動でアップデート。
「これで完了!」とか思って、新しく生まれ変わったMy PCを触っていると、急にソフトが動かなくなりフリーズ...。 仕方ないので強制終了→再起動。
しかしまたフリーズフリーズフリーズのオンパレード。 何が原因か探るためにタスクマネージャーで監視してみました。
デスクトップ画面で何もせずに10~15分経つと急にディスク使用率が10、20、30...とぐんぐん上昇しついに100%になってしまいました。
なにこれ、怖い。
サービス・OneDriveの停止
PCで調べててもフリーズしちゃうので、スマホで「Windows10 ディスク使用率 100%」で検索。
すると出てくる出てくる。
要はWindows 10で起動しているサービスやアプリが悪さしてるんだろうということで、下記記事を参考に色んなサービスを停止してみました。××と×は全て、△もできる限り停止しました。
OneDriveも停止。
これでいけるか?と思ったがディスク使用率は無慈悲にもぐんぐん上昇。Oh...。
他のフリーズ対策をするも...
仕方ないので「Windows10 フリーズ」で検索。 下記記事を参考に色々実行してみました。
最後の希望!?SSDのLPM問題!
何か解決策はないものかと絶望しながらネットを彷徨っていたところ、下記の記事を発見しました。
Windows10+(Crucial) SSDだと・・。
実はWindows 10にするちょっと前にCドライブのSSDをPlextor製の物からCrucial製の物に変更していました。 この記事によると僕の使用しているSSDもこのLPMの問題に当てはまる型の様です。
これを試してみるっきゃねえ!ということで記事を参考にLPMを無効化すると・・・
フリーズしなくなりました!
やっと!ついに!きました!
しかし、まさか直前に変えたパーツにそんな落とし穴があるとは。。
自作PCの怖い所ですが、今後同じことが起こってもこれで対応できるので良かったと思うことにします。