口座番号でいろいろ振り分ける
Hiroです。
EAからWebアプリなどを利用する場合アクセス集中を回避するためにタイミングをずらしたいですよね。
今回はそんな時に使える手法のお話です。
概要
流れとしては
・口座番号取得
・利用する数値を取得
・計算式で使いたい数字に変換
・EAで利用
といった感じです。
この記事では”AM8時台の0分〜59分に振り分けて情報を取得する”前提で口座番号から自動的に0-59の値を取り出す方法を紹介します。
口座番号の取得
AccountNumber() 関数を利用して口座番号を取得します。
利用する数字を取り出す
口座番号から使いたい部分だけを取り出します。
int last_two_digits = AccountNumber() % 100;
%100で口座番号の下2桁を取り出し、last_two_digits変数に格納しています。
(%は”余り”を計算する演算子です。%100で下2桁が余りとして計算されます)
使いたい数字に整える
口座番号の下二桁を0-59の数値に変換します。
int minutes_temp = last_two_digits / 100 * 60;
口座番号末尾2桁は0-99となりますので、100で割って60をかけることで0-59.4の値となります。
(使いたい数値によってここの計算式を変更します)
本来はRoundDownを行う関数を実装して桁落としをするんですが、ココでは手抜きでint型に格納することで無理やり整数にしています。(コンパイル時にWorningが出ますので気になる方はちゃんとRoundDowしましょう)
これで0-59の値ができました。
EAで利用する
8時台で計算値と”分”が一致した場合に処理を行うコードをOnTick内に記述します。
datetime currJPTime = TimeCurrent() + 7; //サーバー時間に時差を反映
if (TimeHour(currJPTime) == 8 && TimeMinute(currJPTime) == minutes_temp) //8時台で計算した値と”分”が一致した場合に処理を実施
{
//ここに処理を記述
}
このままですとTickが動く度に処理が実行されてしましますので、1回だけ処理したい場合などはフラグを立てて重複処理を回避します。
bool flag = true;
datetime currJPTime = TimeCurrent() + 7; //サーバー時間に時差を反映
if (TimeHour(currJPTime) == 8 && TimeMinute(currJPTime) == minutes_temp && flag) //8時台で計算した値と”分”が一致しflagがtrueの場合に処理を実施
{
//ここに処理を記述
flag = false; //flagの値をfalse変更
}
if (TimeHour(currJPTime) == 9 && !flag) //9時台かつflagがfalseなら・・
{
flag = true; //flagの値をtrueに変更
}
上記の処理で8時台に1回だけ処理を行い、9時代にリセットするという挙動になります。(9時台にEA止まっている場合、リセットされませんが。。。)
応用でさまざまな使い方ができます
この手法を用いれば、例えば月1回だけ日を分散して何か処理を行う、などユーザー様の口座番号ベースで自動的に負荷の振り分けを行うことが可能です。
(口座番号のWeb認証に関する記事はこちら)
いつものように有料で時短用ソースコード置いておきます。
(内容は毎月1日-20日に振り分けて口座登録確認を行うものです)
Hiro
ここから先は
この記事が気に入ったらチップで応援してみませんか?