神戸のシステム屋ブログ

神戸のソフトウェア開発会社。Access製システムの開発&メンテナンス、Webサービス構築に関する事をつづります。

航空会社の新システム

2006-05-17 | システム開発
ANAが国内線に関するシステムを全面刷新する。

現在はメインフレーム上で開発言語FORTRANによって開発された
システムが稼働中。予約・発券・搭乗すべてをable-Dというシステムで管理している。なんと1万台の端末が繋がり、1日最大650万件の処理をする、まさにメインフレームならではの力技だ。

2012年稼働を目指し、今年4月から200億円かけて新システムの開発が始まっている。WindowsサーバまたはUNIXサーバ(おそらくUNIXになるだろうと推測)上で稼働し、開発言語はJAVAで行われる。米ユニシス製のパッケージ「AirCore」のカスタマイズとなる。実に6年がかりの壮大なリニューアルである。


リアルタイムな更新処理の話をするとき、よく飛行機や新幹線の
予約システムを例に挙げ、そのプロセスを説明する。
それを理解することが、リアルタイムな処理を求めるクライアントの良き判断材料となる。

リアルタイムな環境もメインフレームやUNIXが中心なわけだが、オープン系での構築話は非常に興味をそそる。しかし6年後には開発状況は一変していると思われ、より柔軟な設計が求められるだろう。パッケージのカスタマイズで6年がかりというのはちょっと動きが重いように感じるが、失敗は許されない大プロジェクトとなる事は間違いない。


日本ユニシスによるニュースリリース


ZenCart最新版1.3.0ついにリリース

2006-03-30 | 雑感
待望の最新版1.3がついにリリースされました^^
http://www.zen-cart.com/modules/mydownloads/singlefile.php?lid=14

ただし英語版の本家によるリリースで、日本語化プロジェクトによるローカライズはこれから始動するようです。ZenCart日本語版開発Wikiの方ではレビューが公開されています。

新しいZenCartはこちらで体験できます。

ページ単位で異なるCSSを適用できるようになり、オーバーライトというカスタマイズの上書き機能が大幅に向上。今後の機能拡張の前に礎を強化といった内容になっています。

インストール項目にも若干の変更が見られました。
事前に把握されたい方のために、1.3最新(英語)版と1.2.5日本語版の画面比較をまとめたpdfを公開しています。たいした資料ではありませんが、ご興味のある方はダウンロードしてください。

IT100選(IT百撰)の優秀企業賞に選ばれました

2006-03-08 | システム開発
弊社クライアントである有限会社アーカムさんが、このたびIT100選(IT百撰)の優秀企業賞に選ばれました
おめでとうございます!

IT100選は関西の経済団体の共同プロジェクトで、ITを活用している優秀な企業を1年に1度、認定・表彰するもので、アーカムさんが応募されました。

アーカムシステムは、コミック本を主軸にCD・DVDなどの中古商材を管理するシステムで、買取・在庫管理・ネットでの販売・大口注文処理などを行います。

拠点間をローカル環境下で同一のマスタを管理するために、マスタ配信・マスタ受信機能も備えています。

また書籍に関しては、セット管理機能が他社より優れている機能で、任意に自由なセット構成をいくつでも組む事が可能です。

また、マンガ喫茶の卸し販売用機能として、卸し商材の見積機能、新刊案内、新刊カレンダーといったマンガ喫茶向け機能も充実しています。

他にもまだまだ優秀な機能があるのですが、またの機会にしたいと思います。
何はともあれ、おめでとうございました。


IEブラウザを起動~AccessVBAでシステム開発4

2005-12-06 | システム開発

今回は、Accessのボタンで目的のURLをインターネットエクスプローラで表示する方法をご紹介する。

通常はハイパーリンクを張る事で簡単に実現できるが、動的に表示したい場合や、独立した画面で複数表示したい場合には当関数は役立つだろう。

今回も有限会社パーツの業務システム開発で実際に使用されている共用関数だ。

■U_BrouseIE インターネットエクスプローラ表示
《使用方法》URLを引数として渡し、IEで表示する。

Call U_BrouseIE("http://www.parts-soft.com")

 《関数》
Public Sub U_BrouseIE(ByVal I_URL As String)
'IE表示
  Dim objIE As Object
 
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Navigate I_URL
  objIE.Visible = True
  Set objIE = Nothing
End Sub

カンタンな関数だが、割と重宝する関数だ。
ブラウザをIEではなくFireFoxにしたりすることで、デザイナーの方のブラウザチェック機能を作る、などの用途も可能だ。


消費税率を返す関数~AccessVBAでシステム構築3

2005-12-05 | システム開発

消費税率のアップが検討されている。
ということは、数年後には必ず消費税アップは実施される。

システムの寿命はおよそ3年~5年。
固定資産として原価償却する事も考えて、そのくらいのスパンになる。

であると将来の税率アップを見込んだシステム作りが必要となる。
税込価格の算出に、本体価格*1.05としてしまうのはお勧めしない。
仮に消費税が10%になったとして、業務終了後に税率を力技で1.10に変更したとしても、システムで1週間前の売上を再計算させることはできない。

ここは柔軟に税率を返す関数を使用することが望ましい。
今回も有限会社パーツの業務システム開発で実際に使用されている共用関数をご紹介する。

■U_GetZei 消費税率取得
《使用方法》指定日を引数として渡し、指定日時点の税率を返す。

'2005/12/5時点の消費税を取得する
wZeiritu = U_Marume(2005/12/5)

 《関数》
Function U_GetZei(ByVal I_day As Date) As Single
'消費税率取得
  Select Case I_day
    Case Is >= #4/1/1997# 'H09
      U_GetZei = 0.05
    Case Is >= #4/1/1989# 'H01
      U_GetZei = 0.03
    Case Else
      U_GetZei = 0
  End Select
End Function

過去の3%時点の計算にも対応している。

ちなみに将来の税率移行時に備えるのであれば、今から項目に税率と税額の欄を売上データ上に保持しておくのもお勧めする。



AccessVBAでシステム構築 Vol.2 桁丸め

2005-12-02 | システム開発

前回に引き続き、有限会社パーツの業務システム開発で実際に使用されている共用関数をご紹介してみようと思う。

第2回目は『桁丸めの処理』

円未満を切り捨てるのでしたら、 Int(変数)Fix(変数) といった関数が便利です。
うちでは官公庁向け財務パッケージの開発も行っているので、1億円未満を切り捨てたり、10万円単位に丸める処理をよく行います。

また、家のローンなどでよく見かける元利が一定額である「元利金等償還」方式の計算には「賦金率」という小数点第3位までの率を算出します。

このような背景から、桁のまるめ処理を関数で安全に行い、保守性を高めることにしました。

コンセプトは以下のとおりです。

 ■まるめを行う桁位置(小数点を含む)を指定できること。
 ■切捨てができること。
 ■切り上げができること。
 ■四捨五入が出来ること。

関数は以下のとおりです。

■U_Marume 桁まるめ関数

《使用方法》
引数に、まるめを行う値、丸める桁位置、丸め方を渡して呼び出す。
次の画面へ行くボタンで関数を呼び出す。

 '10万未満を切り上げる
wMarumeGankin = U_Marume(wGankin, -5, cnKiriage)

 '円未満を切り捨てる切り捨てる
wMarumeGankin = U_Marume(wGankin, 0, cnKirisute)

 '小数点第3位を四捨五入する
wMarumeGankin = U_Marume(wGankin, 3, cnKirisute)

 《関数》
'まるめ区分 Enum typeMarume cnNone = 0 '何もしない cnKirisute = 1 '切捨て cnKiriage = 2 '切上げ cnSishagonyu = 3 '四捨五入 End Enum Function U_Marume(ByVal I_Num As Variant, ByVal I_Keta As Integer, ByVal I_Shori As Byte) As Variant '桁まるめ処理 'I_Num :数字 'I_Keta :丸め位置 'I_Shori :処理(0:何もしない、1:切り捨て、2:切り上げ、3:四捨五入) Dim wKingaku As Variant Dim wshift As Variant Dim WMODE As Byte Const MARU_CUT As Byte = 0 Const MARU_45 As Byte = 5 Const MARU_UP As Byte = 9 If I_Shori = 0 Then U_Marume = CDec(I_Num) Exit Function End If Select Case I_Shori Case 1 WMODE = MARU_CUT Case 2 WMODE = MARU_UP Case 3 WMODE = MARU_45 Case Else Exit Function End Select wKingaku = CDec(I_Num) wshift = CDec(10 ^ (I_Keta + 1)) U_Marume = CDec(Fix((wKingaku * wshift + CDec(WMODE)) / 10) / CDec(wshift / 10)) End Function


 
もし使われた場合はご報告いただければ嬉しいです。
しかし、いかなる責任も負いませんのでご理解のほどを^^


AccessVBAでシステム構築1 画面遷移のプログラミング

2005-11-28 | システム開発
今回から『AccessVBAでシステム構築』と銘打ち、
うちの業務システムで実際に使われているVBAの共通関数をご紹介してみようと思う。

まず第1回目は『画面遷移のプログラミング』。


普通、A画面からB画面に移る場合、

DoCmd.OpenForm "formB"
DoCmd.Close acForm, "formA"


と記述することと思う。
しかし、本格的にシステムを組むと次のような問題点が起こる。

  検索画面Aから一覧画面Bを表示し、選択を行って詳細画面Cに遷移。
  しかし、検索画面Aには直接番号を指定して詳細画面Cに遷移することも可能。
  その場合、詳細画面Cからの戻り先はAの場合とBの場合があり、


  DoCmd.Close acForm, "formA"

  とも

  DoCmd.Close acForm, "formB"

  とも記述できず前の画面が何であったかを記憶して動的に戻す必要がある。

各種照会画面への縦横無尽な遷移を実現するために、こういった関数の必要性が出てくる。

それに毎度作りこんでいては保守性が低下する上に工数も増大してしまいます。


そこで、有限会社パーツでは、以下の3つの関数を使用しています。


■U_FormNext
次の画面に遷移する関数

■U_FormPrev
前の画面に戻る関数

■U_FormMenu
メニュー画面に戻る関数


これらの関数を利用して、

A→B→C→D→E→F→G

A→E→G

A→B→C→メニュー

などの自由な画面遷移を行い、かつ保守性が低下することもありません。


次の画面に遷移する際に、現在の画面情報をテーブルに書き込み、戻りの際に最新のものを取り出して消すことで、網の目のように機能間をまたがった画面遷移も可能となります。First In First Out のスタック形式です。

そのテーブル構造は、

・テーブル名:tc50
・項目
・FormIndex   バイト型 主キー
・FormName  テキスト型 フォーム名
・FormBatch  テキスト型 バッチファイルによる画面起動の場合のバッチ名
・FormWhere テキスト型 一覧表示時の抽出条件
・FormParm テキスト型 受け渡しパラメタ
・FormBtnName テキスト型 戻りの際にフォーカスを当てたいボタン名
・FormDialog Yes/No型 ダイアログ形式でのオープン指定


としている。



それでは実際に関数を見ていくことにする。


■次の画面に遷移する関数

《使用方法》
次の画面へ行くボタンで関数を呼び出す。

Call U_FormNext(Me.Name, "formA", "", "", "", "")

 ・抽出を行いたい場合
Call U_FormNext(Me.Name, "formA", "", "", "shouhin_no=100", "")

 ・戻ってきたとき、フォーカスを「戻る」ボタンにしたい場合
Call U_FormNext(Me.Name, "formA", "", "", "", "modoru_btn")


Public Sub U_FormNext(ByVal I_CloseForm As String, _
ByVal I_NextForm As String, _
Optional ByVal I_Batch As String = "", _
Optional ByVal I_WHERE As String = "", _
Optional ByVal I_Parm As String = "", _
Optional ByVal I_FormBtnName As String)
'次のフォーム表示
Dim RS As ADODB.Recordset
Dim SQL As String
Dim wNextIndex As Integer
On Error GoTo Err_Handler
'次画面インデックスを取得
wNextIndex = DMax("tc050", "FormIndex") + 1

'画面遷移テーブル更新
SQL = "SELECT FormIndex, FormName, FormBatch, FormWhere, FormParm, FormBtnName FROM tc050;"

Set RS = New ADODB.Recordset
Call RS.Open(SQL, CurrentProject.Connection, adOpenDynamic, adLockPessimistic)
With RS
.AddNew
.Fields("FormIndex") = wNextIndex
.Fields("FormName") = I_NextForm
.Fields("FormBatch") = I_Batch
.Fields("FormWhere") = I_WHERE
.Fields("FormParm") = I_Parm
.Fields("FormBtnName") = I_FormBtnName
.Update
End With
Call RS.Close
Set RS = Nothing

'G_FORM_OLDはグローバル変数で、ひとつ前のフォーム名を格納する
 G_FORM_OLD = I_CloseForm
If I_CloseForm = I_NextForm Then
DoCmd.Close acForm, I_CloseForm, acSaveNo
End If

'次画面展開
If Nz(I_Batch, "") <> "" Then
Call Eval(I_Batch)
Else
DoCmd.OpenForm I_NextForm, , , I_WHERE, , acWindowNormal, I_Parm
End If

'特別パッチ(次の画面が同じ画面ではないとき(通常)、後で画面を閉じる)
If I_CloseForm <> I_NextForm Then
DoCmd.Close acForm, I_CloseForm, acSaveNo
End If
Exit Sub

Err_Handler:
MsgBox "コード:" & Err.Number & Chr(13) & Chr(10) & wErrMsg, vbCritical, "エラー処理"
End Sub


■ひとつ前の画面に遷移する関数

《使用方法》
ひとつ前の画面へ戻るボタンで関数を呼び出す。

Call U_FormPrev(Me.Name)


Public Sub U_FormPrev(ByVal I_CloseForm As String)
'ひとつ前の画面を表示
Dim RS As ADODB.Recordset
Dim SQL As String
Dim wPrevIndex As Integer

Dim FormPrevFRM As Form
Dim FormPrevCTL As Control
Dim wFormBtnName As String
Dim wFormName As String

On Error GoTo Err_Handler
wPrevIndex = DMax("FormIndex", "tc050") '最大番号

SQL = "SELECT * FROM tc050"
SQL = SQL & " WHERE FormIndex=" & wPrevIndex & ";"

Set RS = New ADODB.Recordset
Call RS.Open(SQL, CurrentProject.Connection, adOpenDynamic, adLockPessimistic)
If RS.EOF = False Then
wFormBtnName = Nz(RS!FormBtnName)
RS.Delete
Else
wFormBtnName = ""
End If
Call RS.Close
Set RS = Nothing

'前画面を格納
G_FORM_OLD = I_CloseForm

wPrevIndex = Nz(DMax("FormIndex", "tc050"), 0) '最大番号
If wPrevIndex = 0 Then
Call U_FormMenu(I_CloseForm)
DoCmd.Close acForm, I_CloseForm
Exit Sub
End If

SQL = "SELECT * FROM tc050"
SQL = SQL & " WHERE FormIndex=" & wPrevIndex & ";"

Set RS = New ADODB.Recordset
Call RS.Open(SQL, CurrentProject.Connection, adOpenDynamic, adLockPessimistic)
If RS.EOF = False Then
If Nz(RS!FormBatch) <> "" Then
Call Eval(RS!FormBatch)
Else
'特別パッチ(前の画面が同じ画面のとき(照会などで)、先に画面を閉じる)
wFormName = RS!FormName
If I_CloseForm = wFormName Then
DoCmd.Close acForm, I_CloseForm, acSaveNo
End If

DoCmd.OpenForm RS!FormName, , , Nz(RS!FormWhere), , acWindowNormal, Nz(RS!FormParm)
If wFormBtnName <> "" Then
Set FormPrevFRM = Forms(RS!FormName)
Set FormPrevCTL = FormPrevFRM.Controls(wFormBtnName)
FormPrevCTL.SetFocus
Set FormPrevFRM = Nothing
Set FormPrevCTL = Nothing
End If
End If
End If
Call RS.Close
Set RS = Nothing

'特別パッチ(前の画面が同じ画面ではないとき、先に画面を閉じる)
If I_CloseForm <> wFormName Then
DoCmd.Close acForm, I_CloseForm, acSaveNo
End If
Call U_HourglassOFF
Exit Sub

Err_Handler:
Select Case Err
Case 2110
Resume Next
Case Else
  MsgBox "コード:" & Err.Number & Chr(13) & Chr(10) & wErrMsg, vbCritical, "エラー処理"
End Select
End Sub



■メニュー画面に戻る関数

《使用方法》
メニューへ戻るボタンで関数を呼び出す。

Call U_FormMenu(Me.Name)


Public Sub U_FormMenu(ByVal I_CloseForm As String)
'メニュー画面表示
Dim SQL As String

SQL = "DELETE FROM tc050;"
CurrentProject.Connection.Execute SQL

DoCmd.OpenForm "fMenu"
DoCmd.Close acForm, I_CloseForm

G_FORM_OLD = I_CloseForm
Call U_HourglassOFF
End Sub



■グローバル変数

モジュールに記述しておきます。

'*****************************************************
' SYSTEM グローバル変数定義
'*****************************************************
Public G_FORM As String
Public G_FORM_OLD As String



まだまだ改良の余地はあるが、現在の要件はこれですべてカバーできている。
将来的にはスタックテーブルをXMLに置き換える予定。

ブログをスタート

2005-11-27 | 雑感
会社のブログをはじめてみようと思う。

ココログとどっちにしようか迷ったが、gooを選んだ。

理由は無料であることと、gooのRSSリーダーが結構好評で
利用者が多いこと。

amazonのAWSが利用できる事も大きい。
仕事がら、ネットショップを経営する方々ともいろいろと交流があるので、amazon、ヤフー、楽天のサービスには強くなっておきたい。これらは2006年の課題のひとつ。

私が開発のテーマにしているのは、Windows環境からのWeb制御。

セキュリティホールやハッキングに対する100%の安全策は無い。
であれば、ローカルで作成できるものはローカルで、というコンセプトだ。
共用サーバ上で出来る限りレスポンスを良くしたいという狙いもある。

そんなこんなの奮闘記をTipsも織り交ぜながら書いていければと思う。

このブログを通じて親近感を持ってもらえたら幸いです。