ACS活用法:ワンショット リクエストと引用符で囲まれた列名
長年にわたって、誰かから依頼を受けてデータの照会をしてきましたが、そうするたびに1ドルもらえていたとすれば、私はとっくに引退できていたでしょう( 引退していたでしょう 、ではなく、 引退できていたでしょう 、です)。ITの助けを借りることなく、ユーザーが業務に必要な情報を取得できるのであれば結構なことですが、求められたことがユーザーにとって手間が掛かり過ぎるようであれば、私はいつでも喜んでお手伝いします。
長年にわたって、生データに対するワンショット リクエストのために数多くのツールを使用してきました。最近では、私が一番に選ぶツールと言えば、IBM Access Client Solutions(ACS)に組み込みの「SQLスクリプトの実行」ツールということになるかと思います。「SQLスクリプトの実行」では、結果セットをExcelファイルに保存することができるため、ユーザーはそこから作業を始めることができます。
ただし、ユーザーが列のデータを理解できていなければ、そうすることもできません。このようなことは、保存したスプレッドシートの1行目に、プログラマーが使い慣れている省略形でフィールド名が記されている場合に起こります。考えてみてください。すでに別の業務に注意が向いているところに、ユーザーから「RCMLL」という列はどういう意味なのかと問い合わせの電話が掛かってくるとしたらどうでしょうか。
そうした煩わしい事態を避ける方法が2つあります。まずは、各フィールドに列見出しを定義することができます。DDSにおいてはCOLHDGキーワードを使用しますが、SQLではLABEL ON COLUMNを使用します。次いで、「SQLスクリプトの実行」で、メニュー バーから「 編集(E)」 > 「設定...」 > 「Results」を選択します。「Column headings:」ドロップダウン ボックスを「ラベル」に設定します(図1を参照)。
しかし、照会しているデータベース ファイルまたは表に対して、列見出しを定義した人はおそらくいないでしょう。もしかすると、ソフトウェア パッケージを使用していて、列見出しを追加することが許されていないのかもしれません。また、列見出しを追加できるとしても、躊躇なくそれを行う時間はないでしょう。あるいは、1つまたは複数のフィールドに対する列見出しというのがお気に召さないのかもしれません。
そのようなケースでは、列別名を使用することができます。
select i.ID as "Item number",
i.ItemName as "Item name",
i.SRP as "Catalog price"
from items as i
order by i.ID;
列別名は、引用符で囲んでもよいですし、囲まなくても構いません。別名を照会の中で使用するのみの場合は、私は引用符で別名を囲みません。しかし、エンド ユーザーがその別名を目にすることになる場合は、引用符で別名を囲むようにしています。引用符で囲むことで、ブランクおよびその他の特殊文字も含めることができるようになるため、その列のデータについての記述として、より分かりやすいものになります。
ASキーワードを使用して式と別名を区切る必要はありませんが、私は常にそうするようにしています。私が初めてSQLを学んだ頃(1984年、Oracleシステムでした)には、ASキーワードは存在していませんでした。ASキーワードがいつ標準に追加されたのかは覚えていませんが、初めて見てすぐに気に入ったことは覚えています。ASキーワードを使用することで、照会が読みやすくなります。
ユーザーに提供するスプレッドシートを作成する場合は、「SQLスクリプトの実行」で、結果セットを別ウィンドウに表示するように設定します。メニュー バーから「 編集(E)」 > 「設定...」 > 「Results」 > 「Open new results in a separate window」を選択します(図2を参照)。
照会を実行したときに、新しいウィンドウからの結果を保存することができます(お使いのACSのバージョンで、結果セットを保存するには、このオプションを有効にする必要があるという場合は、最新バージョンへアップデートしてください)。メニュー バーから「 ファイル(F)」 > 「結果の保存(S)...」を選択します。 ファイル タイプを「Microsoft Excel (.xlsx)」に設定し、ファイル名を入力します。必要に応じて適切な保存先フォルダーを指定し、「列見出しを出力行の先頭として組込み」オプションにチェックを入れます。
ファイルを保存すると、システムはファイルが正常に保存されたと応答し、保存したファイルを開くかどうかを尋ねてきます。ここで「はい(Y) 」を選択すると、ユーザーのために親切な設定をここで行っておくことができます。スプレッドシートを開いて、左側にある行番号をクリックして1番目の行を選択し、「ホーム」リボンの「 折り返して全体を表示する 」をクリックします。1つまたは複数の列の列幅を調節しても構いませんが、スプレッドシートについてはあまり触らないでおくこととします。Excelについては、私よりユーザーの方が使い慣れているでしょうし、スプレッドシートがユーザーにとって少しでも分かりやすくなればそれで十分です。
別のシナリオを見てみましょう。ある顧客から、すべての価格を3%値上げするように言われたとします。また、この顧客は、データベースを更新する前に、前後の値を確認することを望んでいるとします。以下の照会は、正しい情報を生成する照会です。
select i.ID as "Item number",
i.ItemName as "Item name",
i.SRP as "Current price",
i.SRP * 1.03 as "Price after 3% increase"
from items as i
order by i.ID;
現行値と新しい値が、隣り合う列にあることに注目してください。図3は、スプレッドシート版の結果セットです。1行目に、判読しやすい列見出しがあります。
データが問題なさそうだとユーザーから確認をもらえたら、いよいよデータベースを更新できます。少し編集して、照会を更新に変えます。私にとって重要なことは、列式の編集は行わないということです。
update items set
select i.ID as "Item number",
i.ItemName as "Item name",
i.SRP = as "Current price",
i.SRP * 1.03 as "Price after 3% increase"
from items as i
order by i.ID;
最後の例です。新価格は計算されるのではなく、データベース表から取得されるとします。おそらくスプレッドシートからアップロードされます。以下は、現行価格と更新後の価格を、記述的な列見出し付きでユーザーに表示する照会です。
select i.ID as "Item number",
i.ItemName as "Item name",
i.SRP as "Current price",
u.NewPrice as "New price"
from items as i
join PriceUpd as u
on i.ID = u.ID
order by i.ID;
このケースでは、少し編集することで、式をキー入力し直すことなく、MERGEステートメントのSET節を作成することができます。
merge into items as i
using (select * from PriceUpd) as u
on i.ID = u.ID
when matched then
update set i.SRP = u.NewPrice;
列名がどの程度記述的であるかということは本当に重要なのでしょうか。私は重要だと思います。この業界で長年過ごしてきて確信したことは、コミュニケーション不足の方が、技術的スキルの不足よりはるかに大きな失敗要因になるということです。顧客とのコミュニケーションを深めるために行えることがあるとしたら、どのようなものでも大事にするべきです。この照会を思い出してください。
select i.ID as "Item number",
i.ItemName as "Item name",
i.SRP as "Current price",
i.SRP * 1.03 as "Price after 3% increase"
from items as i
order by i.ID;
図4は、別名がある場合とない場合で、スプレッドシートでそれぞれがどのように表示されるかを示しています。どちらが分かりやすいでしょうか。
記述的な列見出しを作成すること以外に、引用符で囲んだ別名を使用するべき理由は思い浮かびません。けれども、その理由だけで十分だと思います。その他の理由が思い浮かんだ方がいらっしゃるようでしたら、それをご紹介いただければと思います。