ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

コンビニで、POSレジに登録してない商品が売っているんだけど。。

2005-09-13 22:03:32 | Weblog

いま、ファミリーマートでヤマヨシのポテトチップス 「極辛横濱カレビーフ」(これ、ただしPDF)をかったんだけど。。。

 POSレジでエラーになる。

 どうも、商品マスタに登録されてない。

 値札は。。。
 ウイリアムのいたずらも勘違いしてた。それは隣の値札で。。。
 値札もない!

 つーことで、商品台帳をだしてきて、調べること数分。。。
 やっと110円とわかり、買えたんだけど。。。

 POSレジに登録されてない商品売ってるって、それって、ありなのか?
 システム的に。。。
 どーやって注文したんだろう?それともEOS(コンピューターで発注する。あのタブレット(=液晶の板にチェックしてるやつ)をもってやってるやつ)の商品マスタと、POSの商品マスタは違うの。。。??

 なーんてことを食べる前は、いや、食べた瞬間も考えてたけど、

 ちょっとたべたら、飛んでしまった。。。

 たしかに、からいっす(>_<!)
 そんなこと、どーでもいいくらいに。。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

別にExcelの仕様書でも、CSVファイルにしちゃえば、自動化は簡単

2005-09-13 18:07:16 | 開発ネタ

前のブログ&今までの連載「DB等の入出力の設計とテストについて考える」のオチ。

 結局、OSSを使っても、仕様書からの自動化という作業は、必要だったりするんだけど、じゃあ、仕様書がExcelで書かれている場合(っていうか、たいてい、自動化させることが目的の仕様書はExcelだったりする)、ExcelのVBAを知らないとだめかっていうと、そんなこたーない。

 のに、みんな、そう思っているらしく、ウィリアムのいたずらのお仕事が続いたりする。




 あのですね、ExcelシートをCSVに書き出してしまえば、あとは、言語は関係ないのですよ。

 Excelの仕様書中、テーブルの項目名や型など、必要なことが書いてある部分を、コピーして
 それをメモ帳(notepad)に貼り付けると、タブ区切りテキストになりますから、それを保存してもいいし、素直に「別名で保存」で、「ファイルの種類をテキスト(タブ区切り)」にしてもOK。

 CSVになったら、あとはJavaだったら、たとえば、ファイル全体を読んできて、まずsplitで改行を指定して、1行ごとに配列に入れた後、その1行ごとにsplitで今度はタブを指定すれば、各セルごとの内容は取れる。

 セルまで取り出したら、こっちのもんだよね。




 とはいえ、CSVファイルをいちいちコピーしたり、保存したりするのは大変!
 という場合は、こういうマクロを書いておくと
Sub Macro1()
Dim i As Integer

' 今開いているブックのすべてのシートに対して
For i = 1 To ActiveWorkbook.Sheets.Count
' シートをアクティブにする
Sheets(i).Activate
' アクティブなシートをCSVで保存する
ActiveWorkbook.SaveAs Filename:=Sheets(i).Name & ".txt", FileFormat:=xlText, CreateBackup:=False
Next i
End Sub


 XPの場合だと、自分のマイドキュメントに、シート名.txtで、全シート書き出してくれる。
 今度、覚えていたら、そんなプログラム(シートの中のファイルを全部CSVで書き出す)も、作っておくね。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

DB等の入出力の設計とテストについて考える(その3:フリーソフトのほうが手間なケース)

2005-09-13 14:10:57 | 開発ネタ

前のブログ(その2)では、DBをアクセスするクラスの4種類のうち

1.DBの場合なんですけどO/Rマッピングを使う
2.J2EEなら、セッションBean
3.入出力用のハッシュマップを使い、テーブルごとにクラスを作成する
4.入出力用のハッシュマップを使い、1つのクラスで行う

 3.のケースについて書きました。この手のものは、自動生成で、仕様書から作ると思うんですけど、その場合、今多いのは、WHERE句のところを引数で渡して、SELECTしたり、UPDATEしたりなどなどする(insertやUPDATEの場合は、追加、変更する項目と値をハッシュマップで与える)っていう話。

 このほかに、ちょっとプログラムをかいたけど、ハッシュマップには、値をいれる=値の型もわかるので、その型を見て、WHERE句を作ることができる。ただ、この場合、4のように、1つクラスを作ってしまえばいいだけになり、今、主流ではないと思う。
 このやりかたは、いつか、覚えていたら書きます。今日の話には、関係ないので。




 で、これらは、手作業で書くと大変なので、自動生成でプログラムも、テスト(仕様書とドライバ)も、つくってしまう。

 そして、設計書にテストデータを記入して、そこから、テストデータも自動生成するっていう感じじゃないかな(そうしないと、間に合わない)

 その場合、プログラムは、

 if ( whereMap.containsKey("項目1") == true )
 {
if ( whereBuf.equals("") == false)
   {
     whereBuf = whereBuf + " AND ";
   }
   if ( whereMap.get("項目1") == null )
   whereBuf = whereBuf + " 項目1 IS NULL ";
   else
   whereBuf = whereBuf + " 項目1 = " + whereMap.get("項目1");
 }

てなかんじなプログラムが続くと思う。
自動生成の場合、項目名(項目1)のところを、テーブル定義から読み込み、null指定が可能かどうか、と、値を""で囲む必要があるかどうかを確認して、プログラムの後半部分を書き分けるのね。




で、本題のテストなんだけど、命令網羅でいいとすれば、Selectのテスト項目は、

・WHERE句に指定しなかった場合
・WHERE句に指定して、値がNULLのとき
・WHERE句に指定して、ちゃんとした値が入っているとき
・Where句のはじめが、この項目からのとき
・Where句のはじめが、この項目以前のとき

の5種類になる。ただし、はじめの3つは、ほかの項目についてもいえるので、これだけしか調べないとなると、

・WHERE句になにも指定しないケース場合
・WHERE句にNOT NULL項目以外のすべての項目を指定して、値をNULLにしておく
・WHERE句にすべての項目を指定して、ちゃんとした値が入っているとき

でいいんだけど、これだとたった3通りになってしまい、
行数のわりにテストが少なくなってしまうので、
(でも、これで大丈夫なこともおおいんだけど、マネージャーさんとか上の人に
おこられそうなので)まあ、上の5通りを各項目に対して行う。

 どうせ自動生成でつくるので。。

 でも、そうすると、今度、上のプログラム10行にたいして、テストが5個
(^^;)
やたらこまかいとなってしまったりするんだけどね。。。




 で、こんなかんじでやるので、テーブル数が増えても、プログラムは問題ない。

 一方、O/Rマッピングのソフトを使う場合なんだけど、項目をXMLなんかで書かないといけない場合、テーブル数が増えると、やっぱ、自動生成を使わざる終えない。
 また、O/Rマッピングツールを使ったら、項目のテストをしないでいいか?といわれると、設定ミスとかもありえるので、一応テストしないとということになる。
 で、全項目をテストするとすると。。。結局、O/Rマッピングツールをつかっても、自動生成プログラムを作って、テストと仕様書を作成しないといけないから、O/Rマッピングツールを導入する分だけ、てまになっちゃうのよね
(^^;)

 自動生成の場合、ドキュメントやプログラムが1種類、2種類増えても、たいして手間ではないので(というか、手間にならないように、プログラムを生成する手段がある)。




 てなかんじで、自動生成はなざかり?なのかしら。

 でも、そーすると、仕様書はExcelファイルで書かれているから、自動生成するためには、ExcelのVBAを知らないといけないように勘違いされてる風潮がある気がする。
 そんなことはない。

 っていうところが、実はオチなんだけど。。。
 ひえー、こんな時間、仕事しなくちゃ!

 っていうことで、オチの部分は、またこんど。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする