自部門のイントラでWeb-Socketを使ってリアルタイムでデータ更新する為に
Googleで調べていましたが、決まりました。
といっても、浅い知識?(浅く広くです)なので、自分のメモです。
1、必要な要件として
  1)ie8が使える。
  2)既存のWebサーバー(WAMP)と連携出来る。
  3)Socket Server のアプリをPHPで書ける。
  4)「日本語プログラム言語なでしこ」 と連携出来る。
  ※データはテキストのみ扱います。
 これらの必須条件でいくつかのweb-socket-serverを試してみました。
 前回書いたnodejs他、各サーバーはサンプル通りに使えましたが
 ie8で使うために選択として、socket-ioかweb-socket-jsか迷いました。
 また、既存のWebはPHPで作っているのと「なでしこ」とも送受信できる・・・・
 結果として、「Devristo phpws」と「gimite web-socket-js 」 で構成する事にしました。
 決め手はPHPで書かれているうえにweb-socket-jsに対応していた事です。
 これで上記の1)、2)、3)の条件がクリア出来ました。
 「なでしこ」からweb-socket-serverへの連携はTCP-IPで出来るのでしょうが
 イロイロと試して、調べて、断念。(各種プロトコルとか・・理解不能でした!奥が深すぎる!)
 しかし、「なでしこ」のサンプルを見直したら「なでしこ」内にブラウザを部品として
 組み込めるので、その部品を経由してデータのやり取りすれば、出来る!
 これで、4)がクリア出来ます。
2、環境の構築
 「Devristo phpws」と「gimite web-socket-js 」はgithubから使わせて頂きました。
 githubの使い方は素人です、それぞれZIP形式でダウンロードして解凍しました。
  1)まず、php-web-socketですが解凍すると、phpws-masterフォルダーができます。
    中のphpwsフォルダーをxamppのhtdocsへコピー。
  2)次にweb-socket-jsの解凍、web-socket-js-masterフォルダーが出来ます。
    中の「swfobject.js」「web_socket.js」「WebSocketMain.swf」の3ファイルを
    xamppのhtdocのphpwsフォルダーへコピーします。
    これで準備完了。
3、web-socket-server起動
  1)phpwsフォルダー内のdemo.phpを見ますとPORT:12345となっています。
    機能はechoを使います。
    コマンドプロンプトで「php demo.php」で起動。
    すんなりと「Server Started」が出ました。
    ?職場で起動した時は無表示で作動してたな?(まいいか!)
  2)Apacheを起動してChromeからhttp://localhost/phpws/client.htmlを開きます。
    「WebSocket - status 0」「Welcome - status 1」が出て接続完了。
    入力欄へ文字を適当に入れてsendボタンまたはエンターでエコーを受信!。
  3)ie8からhttp://localhost/phpws/client.htmlを開きます。
    [object Error]を表示します。
    では次にweb-socket-jsですね。
4、web-socket-jsでアクセス
  1)先程の「web-socket-js-master」フォルダー内に有る「sample.html」のPORTを変更
    ws = new WebSocket("ws://localhost:10081/"); ここを12345/echoに変えて
    ws = new WebSocket("ws://localhost:12345/echo"); のsample.htmlを
    htdocs/phpwsフォルダーへ入れます。
  2)Chromeからhttp://localhost/phpws/sample.htmlを開きます。
     onopen が出て接続完了。
    入力欄へ文字を適当に入れてsendボタンまたはエンターでエコーを受信!。
  3)ie8からhttp://localhost/phpws/sample.htmlを開きます。
    「Fatal error: Call to undefined method
    WebSocketConnectionFlash::setRole()
    in C:\xampp\htdocs\phpws\websocket.protocol.php on line 18」が出て
    demo.phpが落ちました。
  4)phpwsフォルダー内のwebsocket.protocol.phpの変更
    12行目の「$s = new WebSocketConnectionFlash($socket, $data);」の下に
    return $s; を挿入して上書き保存します。
  5)コマンドプロンプトで「php demo.php」を再起動。
    ie8からhttp://localhost/phpws/sample.htmlを開きます。
     onopen が出て接続完了。
    無事に繋がってエコーも動作します。
    Chromeからも接続OK。
    コンソールのログを見比べるとChromeは自前のweb-socketで接続し
    ie8はweb-socket-jsで接続されていますね。
    「return $s;」を入れたのはソースを見てて何となく感です。
    これで本当に良いのか?
    なぜかな?。もしかして、開発した方はie8でテストしてない?
    私は自宅は「Windows-XPでie8とChrome(メイン)」
    職場では「Windows-XPでie8(メイン)とFirefox」です。
    取り敢えず動いたので次にchat機能をdemo.phpに追加します。
5、demo.phpサーバーへchat機能の追加
以下にchat追加後のソースを記載します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#!/php -q
php demo.php
require_once("websocket.server.php");
/**
* This demo resource handler will respond to all messages sent to /echo/ on the socketserver below
*
* All this handler does is echoing the responds to the user
* @author Chris
*
*/
class DemoEchoHandler extends WebSocketUriHandler {
  public function onMessage(IWebSocketConnection $user, IWebSocketMessage $msg) {
   $this->say("[ECHO] " . strlen($msg->getData()) . " bytes");
   // Echo
    $user->sendMessage($msg);
   }
  public function onAdminMessage(IWebSocketConnection $user, IWebSocketMessage $obj) {
   $this->say("[DEMO] Admin TEST received!");
   $frame = WebSocketFrame::create(WebSocketOpcode::PongFrame);
  }
}
//2012.12.29 追加したchat機能
class DemoChatHandler extends WebSocketUriHandler {
  public function onMessage(IWebSocketConnection $user, IWebSocketMessage $msg) {
    $usera = $user ;
    foreach ($this->users as $user) {
     if($usera == $user){    //使い分けしたいので分離しました。
      $user->sendMessage($msg);  //送信者へエコー
     }else{
      $user->sendMessage($msg);  //送信者以外へ送信
     }
    }
  }
}
/**
* Demo socket server. Implements the basic eventlisteners and attaches a resource handler for /echo/ urls.
*
*
* @author Chris
*
*/
class DemoSocketServer implements IWebSocketServerObserver {
  protected $debug = true;
  protected $server;
  public function __construct() {
   $this->server = new WebSocketServer("tcp://0.0.0.0:12345", 'superdupersecretkey');
   $this->server->addObserver($this);
   $this->server->addUriHandler("echo", new DemoEchoHandler());
   //2012.12.29 追加したchatの呼び出し。
   $this->server->addUriHandler("chat", new DemoChatHandler());
  }
  public function onConnect(IWebSocketConnection $user) {
   $this->say("[DEMO] {$user->getId()} connected");
  }
  public function onMessage(IWebSocketConnection $user, IWebSocketMessage $msg) {
  //$this->say("[DEMO] {$user->getId()} says '{$msg->getData()}'");
  }
  public function onDisconnect(IWebSocketConnection $user) {
   $this->say("[DEMO] {$user->getId()} disconnected");
  }
  public function onAdminMessage(IWebSocketConnection $user, IWebSocketMessage $msg) {
   $this->say("[DEMO] Admin Message received!");
   $frame = WebSocketFrame::create(WebSocketOpcode::PongFrame);
   $user->sendFrame($frame);
 }
  public function say($msg) {
   echo "$msg \r\n";
  }
  public function run() {
   $this->server->run();
  }
}
// Start server
$server = new DemoSocketServer();
$server->run();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6、htmlファイルの変更
 1)chat機能を呼び出すhtmlファイルを作成
  上記、4、web-socket-jsでアクセスの1)で使った「sample.html」の
    ws = new WebSocket("ws://localhost:12345/echo"); を
    ws = new WebSocket("ws://localhost:12345/chat"); に変えてchat.htmlで保存します。
 2)ie8とChromeからhttp://localhost/phpws/chat.htmlを開きます。
     お互いにテキストのやりとりが確認出来ました!
7、日本語プログラミング言語「なでしこ」からchatへ接続
 1)上記の chat.html の78、79行目の内容を修正 id="send" id="close" を追加。
    変更前
     value="Send">
    return false;">close
    変更後
     value="Send" id="send">
    return false;" id="close">close
 2)「なでしこ」のプログラム内容
    ここでハマッタ!
    ブラウザで閲覧を改造して何となく出来そうだと思ったが
    送信は出来たが、受信のイベントをナデシコで取れない?
    chat.htmlを読み直すとスクリプトのエラーが出る。
    暫く考えます。
以上です。
2012年12月22日土曜日
WebSocketの使い方
自部門内の管理用でイントラのWebを作り、管理してますが
特定のページにアクセスが集中していて重くなっています。
理由は表示データの更新の為です。
以前からWebSocketを使うとリアルな通信が出来そうだな~
とは思っていたのですが、なにせ素人ですから、出来るかどうか
Googleで検索しながらサンプルを調べていました。
ここで学んだ内容を整理しておきます。
あくまでも自分で理解した内容のメモですから
間違った事を書いてたらご容赦を。
1、nodejs
WebSocktのサーバーは色々と出ていますのでどれが良いのか?
で自分が必要な機能と経験とを考えつつ(悩みつつ)試したのが
nodejs です。
意外にも簡単に動作しました。
動いたけど理解には及ばず、Googleでまた調べ直し
⇒ Nodeビギナーズブック
これを見ました。(買ってはいませんが)
どう見ても、本のコマーシャル?(Goolgleの検索で何度も見かけてました)
と思いつつ、下へスクロールしてみると(結構長いページです)
解説が始まりました。(~~)
これ見ながら半日、サンプルを動作させて、nodejsに対する頭のモヤモヤが
スッキリしてきました。
このサンプルは多分、Linux環境で書かれているのと、1箇所だけサンプルを保存する
ファイル名が抜けてました。
記述の前後関係で気がつきますが、メモしときます。
以下のサンプルソースを保存する時 requestHandlers.js です。
「本当のリクエストハンドラへのルーティング
さて、仕事に戻るとしましょう。HTTPサーバとリクエストルータは、・・・・・
・・・・・・・モジュールのメソッドとしてエクスポートしましょう:
function start() {
console.log("Request handler 'start' was called.");
}
function upload() {
console.log("Request handler 'upload' was called.");
}
exports.start = start;
exports.upload = upload;
こうして、ルータにルーティングする先のものを渡すことで・・・・」
更に下へ行くと(ページの真ん中より少し下)以下のサンプル(「」で括った)で
exec("ls -lah", ここの ls が linux の記述ですね。
私はWindowsしか使ってないので dir とか tree を入れて試しました。
exec("dir", function (error, stdout, stderr) {
content = stdout;
});
「もう一度startリクエストハンドラを使います。 下記を反映するよう、修正して下さい
(requestHandlers.jsファイル):
var exec = require("child_process").exec;
function start() {
console.log("Request handler 'start' was called.");
var content = "empty";
exec("ls -lah", function (error, stdout, stderr) {
content = stdout;
});
return content;
}
function upload() {
console.log("Request handler 'upload' was called.");
return "Hello Upload";
}
exports.start = start;
exports.upload = upload;
おわかりのとおり、新しいNode.jsモジュールchild_processを使っています。」
以上。
この他に
PHPでWebSocketサーバー作ってみた
と
[Windows]node.js(0.8)+express(3.0)+ejs+socket.ioを使ったサンプルアプリを動かすまでのメモ
☆このサンプルでIE-8も socket-io 経由で接続されます。
が凄く参考になりましたのでメモで残します。
特定のページにアクセスが集中していて重くなっています。
理由は表示データの更新の為です。
以前からWebSocketを使うとリアルな通信が出来そうだな~
とは思っていたのですが、なにせ素人ですから、出来るかどうか
Googleで検索しながらサンプルを調べていました。
ここで学んだ内容を整理しておきます。
あくまでも自分で理解した内容のメモですから
間違った事を書いてたらご容赦を。
1、nodejs
WebSocktのサーバーは色々と出ていますのでどれが良いのか?
で自分が必要な機能と経験とを考えつつ(悩みつつ)試したのが
nodejs です。
意外にも簡単に動作しました。
動いたけど理解には及ばず、Googleでまた調べ直し
⇒ Nodeビギナーズブック
これを見ました。(買ってはいませんが)
どう見ても、本のコマーシャル?(Goolgleの検索で何度も見かけてました)
と思いつつ、下へスクロールしてみると(結構長いページです)
解説が始まりました。(~~)
これ見ながら半日、サンプルを動作させて、nodejsに対する頭のモヤモヤが
スッキリしてきました。
このサンプルは多分、Linux環境で書かれているのと、1箇所だけサンプルを保存する
ファイル名が抜けてました。
記述の前後関係で気がつきますが、メモしときます。
以下のサンプルソースを保存する時 requestHandlers.js です。
「本当のリクエストハンドラへのルーティング
さて、仕事に戻るとしましょう。HTTPサーバとリクエストルータは、・・・・・
・・・・・・・モジュールのメソッドとしてエクスポートしましょう:
function start() {
console.log("Request handler 'start' was called.");
}
function upload() {
console.log("Request handler 'upload' was called.");
}
exports.start = start;
exports.upload = upload;
こうして、ルータにルーティングする先のものを渡すことで・・・・」
更に下へ行くと(ページの真ん中より少し下)以下のサンプル(「」で括った)で
exec("ls -lah", ここの ls が linux の記述ですね。
私はWindowsしか使ってないので dir とか tree を入れて試しました。
exec("dir", function (error, stdout, stderr) {
content = stdout;
});
「もう一度startリクエストハンドラを使います。 下記を反映するよう、修正して下さい
(requestHandlers.jsファイル):
var exec = require("child_process").exec;
function start() {
console.log("Request handler 'start' was called.");
var content = "empty";
exec("ls -lah", function (error, stdout, stderr) {
content = stdout;
});
return content;
}
function upload() {
console.log("Request handler 'upload' was called.");
return "Hello Upload";
}
exports.start = start;
exports.upload = upload;
おわかりのとおり、新しいNode.jsモジュールchild_processを使っています。」
以上。
この他に
PHPでWebSocketサーバー作ってみた
と
[Windows]node.js(0.8)+express(3.0)+ejs+socket.ioを使ったサンプルアプリを動かすまでのメモ
☆このサンプルでIE-8も socket-io 経由で接続されます。
が凄く参考になりましたのでメモで残します。
2012年7月22日日曜日
SAP R/3用 手作りフロントエンド Part2
前回に続きを書きます。
1、4番目に作ったツール
  4番目のツールも「なでしこ」を使って作りました。
  3番目までは単体で動作するツールでしたが今回のツールから処理したログをMySQLへ
  記録しました。
  XAMPPを使い、記録したログはイントラで確認、検索出来るものです。
  目的は処理毎に掛かった時間を把握する事でした。
  「なでしこ」ではローカルにmdb、SOLiteも使えますが、集中管理する為MySQLにしました。
  色々とテストして気がついたのはMyODBCをインストールして
  MySQLへ書き込む都度にDBのオープンをすると処理時間が掛かり動作が遅くなります。
  また処理の依頼が少ない時に長時間、MySQLへのアクセスがないと
  MyODBCのタイムアウトになるようですが詳しくは調べていません。
  「なでしこ」のコンパイル前に『エラー無視』を入れています。(汗)
  いつか詳しく調べて対応を考えてみます。
  2011年3月に試したのが、mdbとMyODBCの両方をオープンして使い分けです。
  この同時利用はレスポンスが非常に遅くなるので諦めました。
2、5番目のツール(今現在改良中です)
  5番目のツールは2012年6月中旬から始まりました。
  今までに受信BOXの自動更新とツールからの操作、ログの記録を実装しましたが
  残った問題として、処理の取り合い、取れない人の不満が出てきました。
  そこで考えた(周りから要望された)のがバッテイングの回避と割り当て方式です。
  SAPの外付けで処理するので何か処理状況を通知(共有)する手段が必要と考え
  チャットサーバーの考え方を取り入れました。
  既存のフリーソフトやサンプルソースを見るといくつか利用出来そうでしたが
  MicrosoftのVisualStudio等が必要そうで私には敷居が高く、「なでしこ」の
  TCPのコマンドを使って試してみました。
  「なでしこ」のサンプルのサーバーで試すと問題なく動作しました。
  そして、プロトコルは自分で決めれば良いと気づきました。
  TCPで通信するけどやり取りする電文の内容はコマンドとステータスを含め
  自分でルールを決めました。
  これで処理を最初に取った人以外は同じ物件を取れないようにする仕組みが
  できました。
  また割り当てするツールも「なでしこ」で作りました。
  これまでに作ってきたツールの変形で作り、割り当てをした事をTCPで送信します。
  今現在も改良中ですが、フロントエンド、イベント中継サーバ、割り当てツールと
  すべて日本語プログム言語「なでしこ」で作る事ができました。
  ちなみに私は有料版のライセンスを購入しています。
  部門内に配布する時にexeファイル1個で処理する為です。
  日本語プログム言語「なでしこ」の開発者の「クジラ飛行机」さんに感謝です!
以上です。
1、4番目に作ったツール
  4番目のツールも「なでしこ」を使って作りました。
  3番目までは単体で動作するツールでしたが今回のツールから処理したログをMySQLへ
  記録しました。
  XAMPPを使い、記録したログはイントラで確認、検索出来るものです。
  目的は処理毎に掛かった時間を把握する事でした。
  「なでしこ」ではローカルにmdb、SOLiteも使えますが、集中管理する為MySQLにしました。
  色々とテストして気がついたのはMyODBCをインストールして
  MySQLへ書き込む都度にDBのオープンをすると処理時間が掛かり動作が遅くなります。
  また処理の依頼が少ない時に長時間、MySQLへのアクセスがないと
  MyODBCのタイムアウトになるようですが詳しくは調べていません。
  「なでしこ」のコンパイル前に『エラー無視』を入れています。(汗)
  いつか詳しく調べて対応を考えてみます。
  2011年3月に試したのが、mdbとMyODBCの両方をオープンして使い分けです。
  この同時利用はレスポンスが非常に遅くなるので諦めました。
2、5番目のツール(今現在改良中です)
  5番目のツールは2012年6月中旬から始まりました。
  今までに受信BOXの自動更新とツールからの操作、ログの記録を実装しましたが
  残った問題として、処理の取り合い、取れない人の不満が出てきました。
  そこで考えた(周りから要望された)のがバッテイングの回避と割り当て方式です。
  SAPの外付けで処理するので何か処理状況を通知(共有)する手段が必要と考え
  チャットサーバーの考え方を取り入れました。
  既存のフリーソフトやサンプルソースを見るといくつか利用出来そうでしたが
  MicrosoftのVisualStudio等が必要そうで私には敷居が高く、「なでしこ」の
  TCPのコマンドを使って試してみました。
  「なでしこ」のサンプルのサーバーで試すと問題なく動作しました。
  そして、プロトコルは自分で決めれば良いと気づきました。
  TCPで通信するけどやり取りする電文の内容はコマンドとステータスを含め
  自分でルールを決めました。
  これで処理を最初に取った人以外は同じ物件を取れないようにする仕組みが
  できました。
  また割り当てするツールも「なでしこ」で作りました。
  これまでに作ってきたツールの変形で作り、割り当てをした事をTCPで送信します。
  今現在も改良中ですが、フロントエンド、イベント中継サーバ、割り当てツールと
  すべて日本語プログム言語「なでしこ」で作る事ができました。
  ちなみに私は有料版のライセンスを購入しています。
  部門内に配布する時にexeファイル1個で処理する為です。
  日本語プログム言語「なでしこ」の開発者の「クジラ飛行机」さんに感謝です!
以上です。
2012年7月21日土曜日
SAP R/3用 手作りフロントエンド Part1
日常業務の不便を解消する為に自作したフロントエンドの概念を整理しておきます。
具体的なコードは掲載しません。
解りやすい図解とかも予定はしていません。
SAP R/3 といっても使っている企業毎にカストマイズしていたり、基本機能でも使っていない
部分が有ると思うので、自分の環境でしか動作確認はしていません。(出来ません)
最初のツールから改良・拡張を繰り返しています、5年くらい続いています。
1、自部門の業務
  自分の受け持ちはSAPのワークフローで社内から受注の処理依頼が来る部門です。
  常に受信BOXを手動で更新して処理依頼が見えたら処理を取ります。
  20名程で取り合いになるのです。
  取った後は受注処理から購買依頼まで行います。
2、自作するキッカケ
  上に書きましたが、処理の依頼を取るまでの不便さを解消したい!
  が始まりでした。
  1)手動の画面更新・・・手が疲れます。
  2)処理の取り合い・・・取れないことのストレス、処理件数が少ない。ロスタイム。
3、最初に作ったツール
  SAP R/3にVBスクリプトの連携機能が有る事を社内で知りました。
  ネットで検索してもサンプルソースは見つかりませんでした。
  社内でもフォローはしないので使えれば使っても良いだけでした。
  そこでSAP R/3のスクリプトの記録と再生(Excelと同様な発想?)を使って受信BOXの
  更新スクリプトを確認しました。
  このスクリプトをNSBASICに入れて小さな自動更新専用のツールを作りました。
  更新間隔は120秒から30秒プラスで6分までコンボボックスで選択しました。
  これで手動更新から開放されました。
4、2番目に作ったツール
  受信BOXには数項目の表示(依頼の日時や部門、伝票番号、処理の種類)が有りますが
  ソートやフィルターだけでは見にくい。
  そこで受信BOXの表示内容をVBで取り込んで部門別件数、処理別件数の表示と
  フィルター機能を追加したのが2番目のツールです。
  これはNSBASICにOWC11のスプレッドシートを組み込み集計表示のクリックした項目で
  受信BOXにフィルターを掛ける事ができます。
  ご参考->スプレッドシートのサンプル(NSBASIC)
5、3番目に作ったツール(ここからフロントエンドらしくなったのです)
  2番目のツールでも実際の処理を取る動作からはSAPの受信BOXを直接操作しました。
  最初のツールから2年くらい掛かりました。
  3番目のツールでは受信BOXで行う操作をツールから出来る様に各機能を追加しました。
  処理依頼の照会、実行、予約、解除(置換)、表題の編集、ソート、フィルター等です。
  通常はツールが最前面にいて処理を照会や実行するとSAP画面を最前面にし処理が終わると
  またツールを最前面にします。
  上に有る様に必要なタイミングで最前面に見せるウィンドウを切り替えるのに苦労しました。
  私のレベルではNSBASICでは記述が判らず、最終的に日本語プログラム言語「なでしこ」で
  作り直しです。
  以降の説明では「なでしこ」と記述します。
  「なでしこ」でOWC11は組み込めず、グリッドと言う機能を使って集計表示を作り
  2番目のツールと同等のツールを作ってから今回の目的の機能を追加して行きました。
  簡単に書いていますが、表題の解析やウィンドウの状態の取得が複雑になりました。
  「なでしこ」でウィンドウハンドルの取得は簡単に記述出来ますが突然出る
  システムメッセージが色々と邪魔になるので想定している状況と存在するウィンドウを
  チェックしています。
  外見的には「なでしこ」からSAP R/3を操作していますが「なでしこ」にはVBスクリプトが
  記述出来るのでそこにVBでSAPのインターフェースを書いています。
  計画した機能の追加・デバックは実際の業務で使いながら行いました。(汗)
長くなったので、Part2で続きを書きます。
具体的なコードは掲載しません。
解りやすい図解とかも予定はしていません。
SAP R/3 といっても使っている企業毎にカストマイズしていたり、基本機能でも使っていない
部分が有ると思うので、自分の環境でしか動作確認はしていません。(出来ません)
最初のツールから改良・拡張を繰り返しています、5年くらい続いています。
1、自部門の業務
  自分の受け持ちはSAPのワークフローで社内から受注の処理依頼が来る部門です。
  常に受信BOXを手動で更新して処理依頼が見えたら処理を取ります。
  20名程で取り合いになるのです。
  取った後は受注処理から購買依頼まで行います。
2、自作するキッカケ
  上に書きましたが、処理の依頼を取るまでの不便さを解消したい!
  が始まりでした。
  1)手動の画面更新・・・手が疲れます。
  2)処理の取り合い・・・取れないことのストレス、処理件数が少ない。ロスタイム。
3、最初に作ったツール
  SAP R/3にVBスクリプトの連携機能が有る事を社内で知りました。
  ネットで検索してもサンプルソースは見つかりませんでした。
  社内でもフォローはしないので使えれば使っても良いだけでした。
  そこでSAP R/3のスクリプトの記録と再生(Excelと同様な発想?)を使って受信BOXの
  更新スクリプトを確認しました。
  このスクリプトをNSBASICに入れて小さな自動更新専用のツールを作りました。
  更新間隔は120秒から30秒プラスで6分までコンボボックスで選択しました。
  これで手動更新から開放されました。
4、2番目に作ったツール
  受信BOXには数項目の表示(依頼の日時や部門、伝票番号、処理の種類)が有りますが
  ソートやフィルターだけでは見にくい。
  そこで受信BOXの表示内容をVBで取り込んで部門別件数、処理別件数の表示と
  フィルター機能を追加したのが2番目のツールです。
  これはNSBASICにOWC11のスプレッドシートを組み込み集計表示のクリックした項目で
  受信BOXにフィルターを掛ける事ができます。
  ご参考->スプレッドシートのサンプル(NSBASIC)
5、3番目に作ったツール(ここからフロントエンドらしくなったのです)
  2番目のツールでも実際の処理を取る動作からはSAPの受信BOXを直接操作しました。
  最初のツールから2年くらい掛かりました。
  3番目のツールでは受信BOXで行う操作をツールから出来る様に各機能を追加しました。
  処理依頼の照会、実行、予約、解除(置換)、表題の編集、ソート、フィルター等です。
  通常はツールが最前面にいて処理を照会や実行するとSAP画面を最前面にし処理が終わると
  またツールを最前面にします。
  上に有る様に必要なタイミングで最前面に見せるウィンドウを切り替えるのに苦労しました。
  私のレベルではNSBASICでは記述が判らず、最終的に日本語プログラム言語「なでしこ」で
  作り直しです。
  以降の説明では「なでしこ」と記述します。
  「なでしこ」でOWC11は組み込めず、グリッドと言う機能を使って集計表示を作り
  2番目のツールと同等のツールを作ってから今回の目的の機能を追加して行きました。
  簡単に書いていますが、表題の解析やウィンドウの状態の取得が複雑になりました。
  「なでしこ」でウィンドウハンドルの取得は簡単に記述出来ますが突然出る
  システムメッセージが色々と邪魔になるので想定している状況と存在するウィンドウを
  チェックしています。
  外見的には「なでしこ」からSAP R/3を操作していますが「なでしこ」にはVBスクリプトが
  記述出来るのでそこにVBでSAPのインターフェースを書いています。
  計画した機能の追加・デバックは実際の業務で使いながら行いました。(汗)
長くなったので、Part2で続きを書きます。