2014年2月23日

Visio最高

 業務設計する時にいろんな四角や矢印を使って図を書くけど、エクセルよりもVisioのほうがいいね。
線を出すとこを自由に決められるし、適度に揃ってくれるし。
 すごいと思ったのは、線の間に四角を持って行くと間を空けて自動的に矢印でつないでくれる。

他には、いろんな図を書きやすくなっているし。


図を書くときは、みんなでVisioを使おうよ。

Accessで既存テーブルにフィールドを追加する方法

 Accessのシステムを作るときは通常(絶対ともいう)、アプリケーション部分とデータ部のファイルは分けて作ると思います。
 で、リリースしたアプリケーションがバグっていたり、機能強化をする時にテーブルに列を追加したりすると思いますのでその方法をメモ。そして解説。


  1. Dim def As DAO.TableDef
  2. Dim fld As DAO.Field
  3. Dim prp As DAO.Property

  4. Set def = CurrentDb.TableDefs("なんとかテーブル")
  5. With def
  6.     .Fields.Append .CreateField("メモ", dbMemo)
  7.     Set fld = .CreateField("一括更新", dbBoolean)
  8.     .Fields.Append fld
  9.     Set prp = fld.CreateProperty("Format", dbText, "Yes/No")
  10.     fld.Properties.Append prp
  11.     Set prp = fld.CreateProperty("DisplayControl", dbInteger, acCheckBox)
  12.     fld.Properties.Append prp
  13. End With


仕様

  • 既存のテーブルに対して"メモ"フィールド(メモ型)、一括更新フィールド(ブール型)の列を追加する。
  • ブール型の列の表示は、チェックボックスにする

解説
  • 5行目:変更するテーブルのTableDefオブジェクトを取得する。
  • 7行目:新しいフィールドを追加する
    TableDefオブジェクトには、CreateFieldというメソッドでフィールドオブジェクトを作成し、FieldsプロパティのAppedメソッドで追加する。
    列を追加するだけだったらこれだけで終わり。
  • 8~13行目:フィールドの追加とそのフィールドのフォーマットや表示形式を指定する。
  • 8~9行目:7行目と同様ですが、新しく追加するフィールドに対してプロパティを追加したりするので変数に格納する。
  • 10行目:テーブルデザインの書式をプロパティオブジェクトに定義します。
    ※他にも表題、規定値、入力規則、エラーメッセージ、インデックス、文字配置などがありますね。
    引数説明
    第1引数:書式の英語名を指定する。書式の場合は、Format。
    第2引数:プロパティの値のデータ型を指定する。第3引数には、"Yes/No"という引数を指定するので、dbText。
    第3引数:設定する値を指定する。テーブルデザインで選択する値をそのまま記載。
  • 11行目:できたプロパティオブジェクトを8行目で作成済みのオブジェクトのPropertiesプロパティにAppendメソッドで追加します。
  • 12~13行目:テーブルをデータシートビューで見た時に、チェックボックスになるようにするための設定です。
  • 12行目:10行目のルックアップタブ内の値を指定します。
    第1引数:書式の英語名を指定する。書式の場合は、Format。
    第2引数:プロパティの値のデータ型を指定する。第3引数には、acCheckBoxという整数型の定数を引数を指するので、dbInteger。
    第3引数:チェックボックスにシたいので、acCheckBoxを指定する。
    ※他にも、acTextBox、acListBox、acComboBoxというのが有ります。
これだけわかれば、VBAを使ってテーブルのレイアウトを自由に変更することができるようになると思います。
 アプリケーションを変更したいだけなのに、既存データを新しいところにインポートするとかいうわけのわからない作業はしなくても良くなります。

※チョット前に引き継いだAccessのアプリケーションがそんなのでした。
テーブルのデータをエクスポートやインポートで移行するならまだしも、CSVファイルに出力して移行するというアホな設計でした。

2014年2月21日

送り状を印刷するソフトウェア

 ある取引先での話です。

 販売業務の中で送り状を手書きしているそうですが誤った送り先に商品が行かないようにするためにダブルチェックを行っているそうです。

流れとしては、

担当者がコンピュータ上に登録されている送り先を運送屋の送り状に手書きをする。

自分で確認する。

チェック担当(上長だったり)が送り状を確認する。

OKであれば送り状を商品に貼って送る。

 誤ったところに送付してしまわないようにするためにダブルチェックは良いと思いますが、1枚の送り状を書くために2人も使ってしまう!
 とっても工数の無駄です。きっと、片手間でやっているんでしょう。

 一応、業務はコンピュータ化されているのでコンピュータから印刷すれば良いと思いますが、Webのシステムなのでなかなか難しいです。

 送り状印刷のソフトに送付先の住所情報の取込ができればこのダブルチェックはいらなくなると思い、何かいいものがないか探してみました。

ありました(他にもあるかもしれませんが…)
送り状職人(http://www.scmcorp.co.jp/okurijou/index.php?FrontPage)

まだ、使っていませんが、要件は満たせそうです。

  • いろいろな送り状にも対応している
  • 送り先情報をCSV取り込みできる


 業務システム側に送付先情報をCSV形式でダウンロードする機能を実装すれば、この送り状職人にCSVデータを取り込ませることで、綺麗に印刷できそうです。

Webシステムなんだけど送り状印刷のいい方法ない?っていう会社有りましたら使ってみたらいかがでしょうか?


2014年2月17日

Access2010のレポートのバグ?並び順が変わる!

 本日、リリースしたAccess2010のレポートで印字明細のソート順が変わってしまうという現象にあってしまいました。


 前回リリースした時は、確実にこのプロパティには、並べ替えをする項目が設定されていたのですが、今回リリースしたレポートはクリアされていました。
 自分でクリアした記憶はないので何が原因かを調べたところ発見しましたよ。


【操作】
レポートのプロパティのレコードソースを開いて閉じる。

【問題点】
レポートのプロパティの「並べ替え」の内容が空になっている。


 レコードソースにクエリを指定しているのですが、そのクエリのデザイナをプロパティから開いて閉じる(保存しなくても)と並べ替えの項目がクリアされてしまうようです。


Access2010は、勝手にプロパティを変更してしまう可能性があるのでちょっと注意が必要かもしれません。
もしかするともう既にバグフィックスされているかもしれませんが。

2014年2月12日

Linuxのいろんなアプリケーションをソースから入れてみた

 詳しいことは後で備忘録としてまとめようと思いますが、初めてApacheやらPHPやらMySQLやらをソースから入れてみました。
 いろんなものが微妙に動かないので辛いです。
ディレクトリのパーミッションが正しくなくて動かないとかいろいろです。

 さっきまで、phpMyAdminが動かなくて四苦八苦してました。

 やっとログインページが出たと思ったら、mysqlのrootアカウントでログインができないし。

原因を調べてみたらPHPのセッションを保存するディレクトリのパーミッションが正しく設定されていない為にPHPがちゃんと動作していなかったとういうのが原因でしたよっ。

 きっと、バイナリパッケージからインストールすればこんな問題は無いんですよね。

でも、でも、自分の好きなバージョンをインストールできるようになるからこれからは、この方法でできるようになろう。


Windowsの世界でお任せ環境にいすぎると面倒に感じるけど、いい練習になった感じ。


2014年2月11日

CakePHP+SmartyでCakeEmailを使う

 CakePHPとSmartyを合わせて使うとViewのテンプレート内でPHPのコードを欠かなくても良くなるのでとても見やすくなります。
 Webページ内で使うことについては、いろんなサイトに記載されているのでそちらを参照していただければと思います。
 SmartyViewというクラスを使用します。
ここからダウンロード(https://github.com/news2u/cakephp-smartyview)。

今回試した環境は以下です。
(開発環境としてWindowsを使っていますが実際の環境では、CentOS上で行います。)

  • Windows7
  • IIS7.5
  • CakePHP 2.4.5
  • PHP 5.4.16
  • Smarty 3.1.16

 CakeEmailで使うテンプレートもSmartyを使いたい

なのでちょっと調べたら、やり方を公開しているサイトがありましたので試してみました。


 やぎLabs(http://blog.koganinja.jp/archives/410)


ですが、CakeEmailの1625行目でエラーが発生してしまいメール送信までできませんでした。
エラーになっている行:$View = new $viewClass(null);
エラーメッセージ:[FatalErrorException] Cannot pass parameter 1 by reference
「引数に値を直接していないで変数を指定してね。」という意味のエラーのようです。

 確かに、CakeEmail内のviewClass変数のクラスのコンストラクタにnullを直接指定指定しています。
なので、null値化した変数を設定するようにしたらエラーもなくなり、メールが送信されました。
 SmartyViewクラスのコンストラクタの仮引数は参照で受けるようになっています。
function __construct (&$controller) {
  :
}

ということは、対応方法は2つあります。
1.SmartyViewクラスのコンストラクタの引数を変更する方法
修正前
 45 function __construct(&$controller)
修正後
 引数を参照で受ける記号(&)を削除します。
 45 function __construct($controller)

2.CakeEmailクラスのviewClassのインスタンス化のやり方を変更する方法
こんな感じに直してみました。
修正前
 1625 $View = new $viewClass(null);
修正後
 $pという変数をnullにして、変数の参照を渡すという感じです。
 1625 $View = new $viewClass($p=null);

通常1.で対応することが正解だと思います。
そもそも、SmartyViewクラスの親クラスのコンストラクタの引数が参照で受けていないのでなぜ、ここは参照で受けているのかが問題です(当然、このクラスの作者には感謝していますよ。)
二年前に作成されたクラスなので、当時は何かの問題で必要だったのかもしれませんね。

もし、1の対応で何か問題が発生した場合は、2.の方法で対応してみてください。


 これで、Viewは全て、Smartyに統一ができて嬉しいです。



追記

先に紹介したSmartyViewクラスのもう一箇所変更が必要なところがあります。
最近のPHPは、変数を参照渡しする場合、「&」は付けないのが正しいので以下の修正が必要になります。

修正前
 164 $this->{$helper}->_registerSmartyFunctions(&$this->Smarty);
修正後
 164 $this->{$helper}->_registerSmartyFunctions($this->Smarty);