ラベル

2013年7月13日土曜日

SAP R/3用 手作りフロントエンド Part3

暫らくぶりにPart3として「SAP R/3のスクリプトの記録と再生」で気づいたこと。

このスクリプトの記録は何番目の画面でも出来ますが再生(実行)すると必ず第一画面で実行されます。

※画面番号・・・SAPを起動した最初の画面を第一画面、セッション開始で追加した画面を第二、第三・・・
とします。 但し私の部門ではMAX、6画面で制限されています。


1、記録されるスクリプトの例。

If Not IsObject(application) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject application, "on"
End If


2、動作確認用に1行追加します。

If Not IsObject(application) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject application, "on"
End If

msgbox session.findById("wnd[0]").text   'これで画面のタイトルをメッセージボックスで表示します。


3、例えば第三画面で上記2のサンプルを実行するなら。

If Not IsObject(application) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(2)   'この行を変えます。第三画面指定。
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject application, "on"
End If

msgbox session.findById("wnd[0]").text   'これで画面のタイトルをメッセージボックスで表示します。


※ Set session = Connection.Children(2) この様に括弧内で画面番号を指定します。
0 ・・・ 第一画面
1 ・・・ 第二画面
2 ・・・ 第三画面 以下同様


4、変数で画面番号を指定する例。

n = 3      '3 ・・・ 第三画面

If Not IsObject(application) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then

   Select Case n
   Case 1
      Set session = Connection.Children(0)   '第一画面指定。
   Case 2
      Set session = Connection.Children(1)   '第二画面指定。
   Case 3
      Set session = Connection.Children(2)   '第三画面指定。
   Case 4
      Set session = Connection.Children(3)   '第四画面指定。
   Case 5
      Set session = Connection.Children(4)   '第五画面指定。
   Case 6
      Set session = Connection.Children(5)   '第六画面指定。
   Case Else
   End Select

End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject application, "on"
End If

msgbox session.findById("wnd[0]").text   'これで画面のタイトルをメッセージボックスで表示します。



※ Set session = Connection.Children(n) とすれば1行で指定できそうですが、私の環境ではエラーでした。



以上。

2013年1月26日土曜日

php-cli の時間がずれている!

前回の「php-web-socket+ie8+nadesikoを使う。 完結。」でコマンドプロンプトで実行して
echoの出力は出る様になったのですが、表示する時間がWindowsの時間と違ってました。

私は広く浅い知識なので、何でずれる?

で調べてましたが、やっと判りました!

php-cli 使う時、いや、PHPの基本でした。

「デフォルトタイムゾーンの設定」をしてなかっただけでした。

Googleでいろいろ検索してもなかなか判らず、php-cliで検索していて判ったのです。

PHPマニュアルのdate_default_timezone_setに書いていました。

また

スクリプト内でこの関数を使用してデフォルトタイムゾーンを設定するかわりに、 INI 設定 date.timezone でデフォルトタイムゾーンを設定することもできます。

となっています。



デフォルトタイムゾーンの設定前




とりあえず、iniファイルは触らず、この1行を追加しました。(時差 9時間ですね)

date_default_timezone_set('Asia/Tokyo');


デフォルトタイムゾーンの設定後



これで、デバッグ環境が整いました。


以上です。

2013年1月13日日曜日

php-web-socket+ie8+nadesikoを使う。 完結。

php-web-socket+ie8+nadesikoを使う。の3回目ですが此処までの不明点を
それなりに自己解決したので完結編とします。
今回もまた、自分のメモレベルでソースコードの不具合や認識間違いも
多々有ると思いますので、参考にされる方は自己責任でお願い致します。



これまでの問題点

1、php demo.php をコマンドプロンプトで実行したがechoの出力が出ない?

    自宅PCはOKですが職場のPCでphp CLIで「php demo.php」を実行すると
    echo出力が出ず、デバックが出来ません!
    調べた結果、自宅PCは phpのバージョンが5.3.8で職場は5.3.1でした。
    取り敢えず、職場もphpのバージョンを5.3.8に入れ替えました。
    何と!echo出力が正常に出る様になりました。
    5.3.1で不具合が有るのか原因は判りませんが、デバックが出来るのでOKとします。


2、「なでしこ」のWeb部品から接続完了やデータ受信のイベントを取得出来ない。

    これも悩みました。
    自分のスキルではTCPソケットとWebソケットの相互接続は無理と考え
    「なでしこ」のWeb部品を経由して「なでしこ」で作ったアプリとイントラの
    Webでリアル通信を考え、php-websocketまでの接続に目処が着いたのに
    「なでしこ」で接続完了やデータ受信を取得出来ませんでした。
    php-websocketのソースを見ながら、これにTCPのソケット通信を追加しようと
    考え、かなり好い加減(無茶?)な追加ですが、何とか動きました。

    websocket.protocol.phpとdemo.phpにコードを追加しました。


3、php-websocketにTCP接続を追加したが機種依存コードの文字化けが発生する。

    「なでしこ」からTCP接続はSJISでweb-socketからの接続がUTF8で
    mb_convert_encodingやiconvを試しましたが①等の変換がNGでした。
    たまたま古い参考書を読み直したら、jcode.phpsが載っていました。
    早速、TOMOさんのホームページからjcodeをダウンロードして試したら、
    希望どうりの変換結果です。(jcode_1.35a.zip を使わせて頂きました。)
    文字コードの変換問題は以前から合ってそのままなんですね。


上記の対応を行ったソースを添付しようとしましたが、このBloggerでは
画像の添付のみなのでGoogleのホームページを作ってそちらに添付しました。

ホームページは hiro-kenbun です。
ソースファイルは このページ に有ります。



以下に関連するスクリーンショットを添付します。

<<TCP接続の追加>>





<<jcodeでコード変換>>



<<demo.php実行中>>






以上

2013年1月5日土曜日

普通のプログラムを Windows のサービスにする

「普通のプログラムを Windows のサービスとして動作させることができるプログラム」が有りました。

フリーソフトです。(不具合は無いと思いますが、ご利用は自己責任で!)

有限会社軟式ソフトウエア  さんの「sexeです。

上記のリンク先のとおり、扱い方も簡単で「GUI」でも「CLI」のアプリでも登録出来ました。

ソースも公開されています。(見ても判んないので見てませんが(^^;) )

使ってみた環境は Windows-XP です。

32Bitタイプのsexeを使いました。


使用した感想等ですが

1、かなり以前からこういうソフトを探していて、凄く有難いです。
2、サービスの登録、削除が簡単です。
3、「デスクトップとの対話を許可」「終了方法」「シャットダウン以外でプログラムが終了したら再起動」の
選択が有り、簡単に設定出来ました。
4、WindowsVista/7 64bit(x64)版も有ります。・・これは試していません。(環境を持っていないので)



php-web-socketデモサーバーの登録した例を添付します。

「テスト起動」ボタンで動作確認して「OK」でサービスに登録されます。
※テスト起動はしなくても「OK」でサービス登録します。



サービスのコントロール画面に登録されました。(この画面は手動で起動です)


「デスクトップとの対話を許可」をオフで開始するとコマンドプロンプトが出ませんがタスクマネージャで
phpの起動が確認出来ました。

chat.htmlで動作も確認出来ました。



有限会社軟式ソフトウエア  さん、ありがとうございます。


以上です。

2013年1月3日木曜日

php-web-socket+ie8+nadesikoを使う。 続き。

前回、ie8でphp-web-socketと通信まで出来て、最後に「なでしこ」からブラウザ部品で
接続しましたが、上手く行かず調べた結果を記録しておきます。
※ここでは、日本語プログラミング言語なでしこ を「なでしこ」とします。

「なでしこ」のブラウザ部品からchat.htmlでphp-websocketへ接続して
接続完了、送信、エコー受信も出来ました。

しかし、接続、エコー受信、切断等のイベントを「なでしこ」で検知する方法は
判りませんでした。

また、ie8ではchat.htmlの再読込でスクリプトのエラーは起きないのに「なでしこ」の
ブラウザ部品では再読込すると必ずスクリプトのエラーが発生します。


1、この動作の違いを調べた結果

1)ブラウザ部品では同一のhtmlを再読込しても実際にはhttpサーバーに要求を送信していない。
  別のhtmlを読み込むとhttpサーバーに要求を送信しています。
  ブラウザ部品内にキャッシュしているみたい。

2)スクリプトエラーにならない再読み込みは出来ない様です。
  方法が有るのか不明ですがスクリプトエラーの回避としてchat.html内に
  再接続ボタンとjavascriptを追加しました。
  この再接続によってphp-websocketと再接続し送受信するのを確認しました。


2、調査に使ったプログラム

1)「なでしこ」簡易サーバー

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!「nakonet.nako」を取り込む。#1
ログメモとはメモ
そのレイアウトは『全体』
Iは1

サーバーとはTCPサーバー。そのポートは80。サーバーを開始。#2
サーバーの受信した時は~ #3
ログメモ=ログメモ & 改行 & 今 & 「-{I}」 & 改行 & サーバーの受信データ。
I=I+1
サーバーの受信データを「 」で区切る。#4
ファイル名はそれ[1]の「/」を「」に置換したもの。#5
もし、ファイル名が空ならば、ファイル名は「index.html」#6
もし、ファイル名が存在するならば、ファイル名を開く。違えば、それは「なし」#7
内容は「HTTP/1.0 200 OK{改行}Content-Type: text/html{改行}{改行}{それ}」#8
(サーバーの相手IP)へ(内容)をサーバーで送信。#9
サーバーの送信完了した時は~サーバーの相手IPをサーバーが切断。#10
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~ で囲んだ中の16行が「なでしこ」のプログラムです。
【コラム】日本語で10行プログラミング (29) HTTPサーバーを作るを参考にログメモを追加しました。

2)再接続を追加したchat.html
  追加・変更部分のみ記載します。

function onReconnectClick() {
init();
}

<button onclick="onReconnectClick(); return false;" id="reconnect">reConnect</button>


3)php-websocketへ接続する「なでしこ」のプログラム

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//web-socketと接続
※※※積み木デザイナ:ここから※
※ 以下はデザインデータです。
※ コメントを削除しないようにしてください。
※ ---
※母艦とはフォーム##生成
母艦は「メインフォーム」
そのクライアントW=630#数値
そのクライアントH=520#数値
そのタイトル=「なでしこ」#文字列
※ ---
入力メモとはメモ##生成
そのX=8#数値
そのY=104#数値
そのW=352#数値
そのH=24#数値
そのテキスト=「」#文字列
そのスクロールバー=「」#文字列
※ ---
ログメモとはメモ##生成
そのX=8#数値
そのY=8#数値
そのW=464#数値
そのH=88#数値
そのテキスト=「」#文字列
そのスクロールバー=「」#文字列
※ ---
送信ボタンとはボタン##生成
そのX=368#数値
そのY=104#数値
そのW=40#数値
そのH=24#数値
そのテキスト=「送信」#文字列
そのクリックした時は~送信ボタン__クリックした時#イベント
※ ---
切断ボタンとはボタン##生成
そのX=424#数値
そのY=104#数値
そのW=40#数値
そのH=24#数値
そのテキスト=「切断」#文字列
そのクリックした時は~切断ボタン__クリックした時#イベント
※ ---
再読込ボタンとはボタン##生成
そのX=480#数値
そのY=104#数値
そのW=64#数値
そのH=24#数値
そのテキスト=「再接続」#文字列
そのクリックした時は~再接続ボタン__クリックした時#イベント
※※※積み木デザイナ:ここまで※

WEB閲覧とはブラウザ
そのWは600
そのHは320
そのYは190
#そのURLは『http://localhost/chat.html』・・・・1)の簡易サーバーに接続する時使った記述
そのURLは『http://localhost/phpws/chat.html』
WEB閲覧のブラウザ読み込み待機。

●送信ボタン__クリックした時
WEB閲覧の「input」に入力メモをブラウザINPUT値設定
入力メモは「」。
WEB閲覧の「send」をブラウザ要素クリック

●切断ボタン__クリックした時
WEB閲覧の「close」をブラウザ要素クリック

●再接続ボタン__クリックした時
WEB閲覧の「reconnect」をブラウザ要素クリック

母艦の閉じた時は
WEB閲覧の「close」をブラウザ要素クリック
母艦の終了可能はオン
終了
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~ で囲んだ中が「なでしこ」のプログラムです。

このプログラム例ではブラウザ部品でchat.htmlの画面が下側に表示され
上側は「なでしこ」の入力部品とボタンです。
動作は
(1)画面の様に文字列を入れて「送信」ボタン押下でブラウザ部品経由で送信します。
  ※下側のブラウザ部品で直接操作した時と同じ動作です。
(2)「切断」ボタン、「再接続」ボタンも押下でブラウザ部品経由で送信します。
(3)一番大きい(一番上)のテキストBOXは今回使っていません。
  ブラウザ部品のイベントが拾えればここにログを表示するつもりでした。(残念!)



以上です。