Object Oriented XBASE Forum


FoxProコマンドライン初級講座

FoxProにはコマンドラインで操作するための強力な環境が装備されてい ます。
いちいちプログラミングするまでも無いような簡単な作業はコマンドラインだ けで済んでしまいます。
アプリケーション開発の前処理やデータファイルの準備、一時的な例外作業に も有効に利用出来ます。
このコマンドライン・インタープリタ環境が有って初めてXBASEの実力が 発揮出来ます。
この講座では、簡単な例を交えて必要最低限の操作方法を解説致します。
コマンドラインについては、DOSの
dBASE解説本(図書館等に置いてあります)なども、とても参考になります。

※スクリーンに表示される文字のFontはコマンドラインウインドウで
 _Screen.FontName = "MS ゴシック"
 _Screen.FontSize = 11
 このようにすると変更出来ます。


目次

1.画面に情報を表示
2.テーブルを作成
3.テーブルにデータを入力してみる
4.テーブル構造の変更
5.テーブルデータの変更
6.テーブルデータの検索
7.インデックスファイルを作成
8.インデックスとテーブルを連動させてみる
9.データのソート
10.データの集計/平均値計算
11.データの削除と復活概念


INDEXへ



1.画面に表示

文字列を表示させてみましょう
FoxProのデスクトップウインドウの中にコマンドウインドウというウインドウ が浮いています。
見つからない時は、メニューのWindow−Command Windowをクリックすると表示 されます。
コマンドウインドウを最大表示にしておくとデスクトップウインドウが隠れて しまうので、適度な大きさにして右下あたりに浮かせておきます。
コマンドウインドウの中にマウスでファーカスを移動させ、そこで以下の文字 列を記入し最後にリターンキーを押して下さい

? "テスト表示"

さあどうですか?デスクトップの左上に文字が表示されましたね。?はBAS ICのPRINTと同様に文字列を出力します。
では、さらに続けてコマンドウインドウの中で

A = 10
B = 20

? A+B

計算結果が表示されましたか?
もう少し親切に

? "A = "
?? A
? "B = "
?? B
? "A+B = "
?? A+B

さてどのように表示されたでしょう?
?で表示した後に??で表示をさせると 改行せずに続けて表示されるのが確 認出来たと思います。
もうちょっと手が込んだものを

A = 10000000
? "A =" + Transform(A, "###,###,###") + "円"

というような書式制御も簡単に表示出来ます

画面を消去したい場合は

CLEAR

です

その他にMS−DOSコマンドのような
DIR
DIR *.*
についても試してみましょう。

目次へ

2.テーブルを作成

テーブルとは拡張子がdbfである、データファイルのことを言います。
dbfファイルはそのヘッダー部分にデータベースの構造情報を保持していま す。
xbaseの特徴はデータファイルの構造変更が手軽に行えることにあります 。既にデータが登録されているデータファイルであっても拡張や削除が簡単に出 来、データ内容も変更に合わせて変換されます。

データ構造はフィールドとそれが1つの集合体となったレコードと言う概念で 扱います。
表計算ソフトで考えれば表の横方向に並ぶデータ列と考えれば分かりやすいか もしれません。
フィールド構造は分かりやすく表現しますと、文字型、数値型、論理型、日付 型、メモ型、バイナリ型、OLEデータ用等の設定が行えます。
データベースのフィールド構造はアプリケーション全体の動作を考えて構築す る必要があります。しかし、ここではあまり難しい事を考えずにテーブル作成演 習を行ってみましょう。

コマンドウインドウへマウスでフォーカスを移して、

CREATE

とタイプして下さい。
するとtable1.dbfとプリセットされたファイルオープンダイアログが表示され ます。ここで設置したいディレクトリとデータファイル名称に変更します。
演習ではそのままtable1.dbfとします。
OKボタンを押すとTable Designerダイアログが開きます。
フィールドタイプのタブページでNameに設定したいフィールド名称を記入 します。全角名称も利用出来ますが、一応安全のため(英語版ですから)半角英 文字とアンダーバー、または先頭を除く位置に数字で名称を構成します。

とりあえず以下のように記入してみましょう。

Name Type Width Decimal Index NULL
id Character 4      
name Character 20      
sex logical 1      
weight numeric 5 1    


weightの値は数値で幅が5バイトに設定されDecimalは小数点以下の値を何桁 取るかの指定となります。実際は999.9で整数位3桁 + ドット1桁 +  小数点位1桁 = 5桁でフィールド幅を設定します。
この他ダイアログでは種々設定出来るようになっていますが、これ以上触らず このままOKボタンを押して下さい。

このまま続けてデータ入力作業に移行するか聞いてきますので、NOを選択し て一度作業を終了しましょう。
この状態のままですとウインドウのステータスバーに表示されているようにtable1.dbf が開いたままになっています。

データファイルをCLoseすることにしましょう。
データファイルを閉めるのは

use

です。useと聞くと使うと言うように感じてしまいますね。そのとおりでデ ータファイルをオープンする時は
use datafilename
です。

一度閉めたtable1.dbfを開けてみます。

use table1

この場合拡張子の.dbfは省略出来ます。

作成したデータファイルのフィールド構造を見てみます
list structure

データファイルに何レコードが登録されているかを見てみます
? Reccount()

Reccont()は関数でレコード総数を数値型で戻します。この場合は当 然何も登録していないので0です。

使ったデータファイルはちゃんと閉めましょう
use

目次へ


3.テーブルにデータを入力してみる

2.の演習で行った続きでtable1.dbfを利用します。
use table1

入力の方法にはいくつか有るのですが、ワークシート型と一覧型で入力する方 法があります。
ただその前にデータファイル操作の基本的な事項をここで覚えないとなりませ ん。と言いますのもtable1.dbfにはまだ1行もレコードがありません、レコード を作成するにはどのようにしたら良いでしょう。1行の空レコードを作るには
append blank

とタイプします。
? reccount()
としてみて下さい、1が返されるが確認出来ましたか?
もうちょっと空のレコードを作りましょう、ここでお手軽な方法として先にタ イプしたコマンド文字のところをマウスでクリックした後にリターンキーを押し てみて下さい。ヒストリーが簡単に利用出来ることがお分かりになったと思いま す。
append blankで10レコード程作ってみましょう。

ここで以下のコマンドをタイプして下さい。
? reccount()
? recno()
どちらも同じ値を返しましたね。recno()は現在ポインター(レコードポイン ターとかカレントレコードと表現する)が指し示しているレコード番号を数値型 で返します。
次に
goto top
? reccount()
? recno()
さあどのようになりましたか? 作成した総レコード数とrecno()は1を戻し たと思います。合っていますか?

goto bottom
? reccount()
? recno()
これは最後レコードへジャンプします。

さらに
goto 3
? reccount()
? recno()
第3レコードへ移動していることが確認出来ましたか

もう1つ重要なレコード移動コマンドを覚えて下さい
skip
? recno()
skip
? recno()
skip -1
? recno()
skip 3
? recno()

skipはそれに続く数値を省略した場合+1、そして正負数値により相対レコー ド移動が出来るコマンドです。多用するコマンドですので必ず覚えておきましょ う。

それでは入力方法を演習してみましょう。
goto top
browse

browseは一覧入力でのデータ編集が出来ます。ESCまたはCtrl+Wをキ ー入力すると入力画面が閉じます。

goto top
edit
フォーム形式での入力が行えます。
入力フォームで入力する場合、logicalフィールドはTrueがT Fals eがFになります。
CharacterフィールドでIMEが自動ONになるのをやめたい場合は、メニュ ーから[Tools]-[Option]-[General]-[]Browse IME Modeのチェックボックスを消 して下さい。

コマンドウインドウで何か制御した場合はもう一度、browseを発行して表示を リフレッシュします。
操作やスクロールスピード、カラムの移動等、色々試してみて下さい。それぞ れのレコードにダミーデータを入力して下さい。idは1レコード1意で重複
しないようにします。操作が終了しましたら
use

をちゃんと発行しましょう。

目次へ


4.テーブル構造の変更

XBASEで扱うデータファイルはそのテーブル構造の変更とデータ資源の継承が とても容易に扱えるようになっていることが特徴です。
では、既に演習で作成したデータファイルで試してみましょう。

前に作ったtable1.dbfのフィールドリスト

Name Type Width Decimal Index NULL
id Character 4      
name Character 20      
sex logical 1      
weight numeric 5 1    


ではまずデータファイルを開けます
use table1

次にテーブル構造の編集を行うために
MODIFY structure

以前に新規テーブル構造の作成で開けたテーブルデザイナーがオープンしまし たね。
ここで以下の構造に変更して見ましょう。黄色の字が変更した部分です。1つ はフィールドの長さを延ばし、1つはフィールドの追加です。

Name Type Width Decimal Index NULL
id Character 4      
name Character 30      
sex logical 1      
weight numeric 5 1    
salary numeric 7 0    

変更がうまく行きましたら、OKボタンを押して下さい。変更しても良いか聞 いてきますのでOKとして下さい。
さあ実際にどのようになったでしょう?フィールド構造表示で確認して見まし ょう。
LIST structure あるいは DISP structuer
データ構造等の情報が確認できましたか? LISTはこの後も色々なデータ を一連で表示させるコマンドなので覚えて下さい。また、ディスプレイで表示デ ータがスクロールしてしまって見辛い場合は、DISP 〜 が便利です。

では、一覧で実際の中身と今まで入れてあったデータがどのようになったか、 確認して見ましょう。
browse

如何ですか、新しく文字幅を広げたデータもちゃんと変更され新たな給与フィ ールドが付加されているのがお分かり頂けたと思います。
終了はESCキーまたはCtrl+WでBrowser表示を閉じます。
必ずuseを忘れないようにしましょう。

目次へ

5.テーブルデータの変更

テーブルデータ、つまりレコードの内容を変更する方法について学びます。
browseやeditでの変更は、視認しながら直接データに変更を加える方法ですが 、ここではコマンドによるデータの変更を行ってみます。

データ変更に最も重要なコマンドはreplaceです。このコマンドはとても多機 能なので、詳細についてはヘルプを読んで研究してみて下さい。
演習にあたりデータファイルを用意しましたので、お手数ですがダウンロード して下さい。

演習用ファイルダウンロード: vfpcmd05.lzh 圧縮ファイルですから解凍して下さい。vfpcmd05.dbfが解凍されてきます。

では一端このファイルの内容を確認してみます。
use vfpcmd05
list structure
browse

内容は旧郵便番号5桁の住所ファイルです。このファイルを7桁郵便番号対応 にコマンドを利用して変換してみます。
一覧を終了します。Ctrl+Wで良いです。

modify structure

テーブル構造でZIP_CODEを6桁から8桁に拡張します。OKボタンを 押して下さい。
念のため。list structureで変更がうまく行われたか確認して下さい。

browse

テーブルの内容をご確認頂けるとわかりますが、かなりいい加減な住所録で入 力の方法が決まり無く行われたようです。この住所をたよりに郵便番号7桁化に 挑戦してみましょう。

まず中央区銀座(104−0061)を変換してみます。

replace zip_code with "104-0061" for "中央区銀座" $ alltrim(address1)+alltrim(address2)

次に、本町のうち渋谷区本町(151−0071)を変換します。ヒストリー で上記の中央区銀座部分と郵便番号のみ書き換えれば手間が省けます。

replace zip_code with "151-0071" for "渋谷区本町" $ alltrim(address1)+alltrim(address2)

同様に豊島区池袋本町(170−0011)もやってみましょう。如何ですか ?とても簡単に変更が出来ましたね。

文字式1$文字式2 は右辺の文字列に左辺の文字列が含まれている場合に真(.T.) を戻すようになっています。
replace フィールド with 変数/計算式/他フィールド/他フィールド*計算 式 for 条件式〜
でデータ内容が一発変換出来ます。詳細はマニュアルを参照してお試し下さい 。

付記:REPLACEの色々な例

replace KINGAKU with TANKA*SURYO,TAX with round(TANKA*SURYO*0.05,0) all
replace GOUKEI with KINGAKU+TAX all
replace GOUKEI with KINGAKU+TAX for KUBUN != "内税"

目次へ


6.テーブルデータの検索

テーブルのデータを簡単に検索する方法としてLOCATEというコマンドが 用意されています。
replace文と同様にfor〜の条件式を書くようになっておりそこに検索条件を書 きます。
検索を先頭から行うか、現在のレコード以後を対象にするか等の条件も設定出 来ます。


locate for CODE ="1105000" .and. KUBUN = "返品"

locate for ADDRESS = "東京都" .and. NAME = "山田"

locate for XRAD*0.02/100 > 3.14 .or. YRAD*0.015/96 < 2.56

検索が失敗した場合はFOUND()が.F.をEOF()が.T.を返します
? EOF()

検索が成功した場合はレコードポインターは検索がヒットしたポインターへ移 動します。
FOUND()が.T.で、さらにそれ以降のレコードについて検索したい場合は、単に

continue

で良いです。同じ条件式でさらに検索を続けます。この結果もlocateと同様にEOF() やFOUND()で検索結果が分かります。

locateコマンドは実装のアルゴリズムがたいへん高速に出来ており。1レコー ドづつループを回して検索するより数段早いので、複雑な検索条件でなければこ のコマンドを使用した方が良いです。


目次へ


7.インデックスファイルの作成

FoxProの場合は索引を多項で作成出来ますが、ここではシンプルな1対 1のインデックスファイル作成について学んでみましょう。
インデックスファイルと言うのは、データファイルのレコード内容について高 速に検索を行いたい場合、その検索に必要なデータを切り出し、切り出しもとの レコード位置が特定できるような情報と共に検索木に配置したファイルのことを このように呼びます。
たんに検索対象としたいデータだけを切り出してシーケンシャル(順次)に並 べてあるわけではなく、高速に該当するデータにたどり着けるようなアルゴリズ ムを利用して形成されています。実際には、切り出しもとのレコードデータで切 り出したい情報がすでにソートされた状態ですとインデックスファイルの検索木 にもシーケンシャルに近い状態で登録され検索スピードは著しく低下します。大 きなレコードになればなるほど切り出しデータがランダムにレコード上に存在す ることが理想となります。ですからデータファイルはあまり整列していることを 気にすることは無く。必要が無ければわざわざソートしてからインデックスファ イルを作るような事はやめましょう。

では、以前に作成しましたテーブルデータを利用してインデックスの作り方を 演習してみます。

Name Type Width Decimal Index NULL
id Character 4      
name Character 20      
sex logical 1      
weight numeric 5 1    


use table1
ここでidについてインデックスファイルを作ってみます index onidtocIndexFileName

idについてはデータファイルのフィールド名称であります。cIndexFileNameは インデックスファイルの固有ファイル名称で、拡張子はNDXがつけられます。 例としてShain_No.NDXにしてみましょう。

index on id to shain_no
use
これでOKです
エクスプローラでこのファイルが出来ているか確認してみましょう。shai n_no.ndxがありましたでしょうか。


目次へ

8.インデックスとテーブルを連動させてみる

では前の7.に続けて、インデックスを伴ってデータファイルを開けてみまし ょう。
use table1 index shain_no
use データファイル index インデックスファイル1,インデック スファイル2・・・というように同時に多数のインデックスを連動して開けるこ とが出来ます。
このうち記述した順に1番目、2番目というような順番がつけられます。
では、ここでブラウザーを開けてデータがどのように連動するか確認してみま しょう。
Browse
表示データはなんらid順にはならんでいないと思います。
set order to 1
としてみてから、もう一度Browsebコマンドをタイプして下さい。すると今度 はちゃんとid順に表示されていることが確認できましたね。
実は、オープンしたてはインデックスファイルの影響を受けないset order to 0 と言うのと同じ条件になっています。set order toというのは前述しました ように、多数のインデックスファイルを同時に開けた場合どのインデックスと連 携させるかを記述順に1番目、2番目というように指定するコマンドです。
0番はインデックスの影響を何も受けないようになっています。

目次へ


9.データのソート

データのソートは物理的にレコードの中身を条件によってデータ順に並び替え る動作で対象となるデータファイルからソート結果を別ファイルへ書き出します 。
テーブルデータの物理的な並び替えについては毛嫌いされる方も多いのですが 、FoxProのソートアルゴリズムは超がつく高速ですので、あまり気にしないでソ ートを使う方が結果として見通しの良いプログラミングになる事もあります。1 0万件程度の伝票データあたりを一度ソートして見て下さい。その早さにびっく りされることと思います。


use table1
sort on ID,NAME to table2
use
use table2
browse
use
どうですかtable1のデータがIDとNAMEをキーとしてソートされtable2の 新しいデータファイルに作成されたことが確認出来ましたでしょうか?


use table1
sort on ID,NAME to table2 for ADDRESS = "東京都"
use
この例では ADDRESSフィールドのうち東京都の者だけを対象にソートし抽出し た結果をtable2へ書き出しています
この他に色々な使い方が出来ますのでヘルプの書式を試してみて下さい

目次へ


10.データの集計/平均値計算

SQLのデータ集計コマンドに類したものがxBASEにも有ります。
一般的な伝票のヘッダー部分集計でしたら最近の166Mhz以上のマシンです と1万件あたり1秒以下で集計してしまいます。
ソートと同様に驚異的な早さです。データの集計を行う場合はへたにレコード を一行づつ読むようなループを回すより、計算しやすいようにワークファイルへ 整形出力したデータファイルに於いて集計コマンドを発行した方が高速に結果が 得られることの方が多いです。

単純な積算は sumを使用します。また平均値の算出にはaverageを使用します 。


use table1
sum
average
use
如何ですか? とてつもなく高速に、かつ数値フィールドのみを自動で計算し 結果を表示しましたのがお分かり頂けましたでしょうか?


use denpyou
sum for "0100" <= unitID .and. unitId <= "0500"
sum for price >= 0
sum for price <= 0 .and. kubun = "返品"
use
この例はfor以下の条件に合致するレコードのみを集計させる方法を示しまし た

sum/averageともに集計したいフィールドや結果をストアしたい変数を自由に 利用出来ます。


nTaxTotal = 0
nSubTotal = 0
use denpyou
sum TAXPRICE,PRICE to nTaxTotal,nSubTotal for UNITID = "0100"

use

? "商品コード0100消費税額総計:" + transform( nTaxTotal, "999,999,999" )
? "商品コード0100税抜き額総計:" + transform( nSubTotal, "999,999,999" )
? "商品コード0100総合計金額 :" + transform( nSubTotal + nTaxTotal, "999,999,999" )

ようやく本格的な利用方法になってきました。案外簡単に利用できますよね。


目次へ

11.データの削除と復活概念

xBASEファイルはレコードの1つ1つに1バイトのデリートマークフィー ルドを持っています。この部分にアスタリスクが書き込まれるとこのレコードは 利用者が削除対象にしているということを認識するようになっています。この削 除対象レコードは物理的にディスクから排除されるわけではありません。
レコードを削除する場合はDELETEと書きます。また、デリートマークを はずすときはRECALLとします。
DELETE文やRECALL文には他のコマンドと同様に条件を設定出来ま す

 例:
DELETE for TANKA DELETE for empty( CUST_ID ) .and. empty( CUST_NAME )
DELETE ALL

xBASE文法中にSET DELETE ON/OFFというコマンドがあ ります。このコマンドによりデリートマークが設定されたレコードの取り扱いが 変わってきます。SET DELETE ONにしておくとデリートマークをつ けたレコードは、存在しないように扱うことが出来ます。OFFにしておくとデ リートマークの有無は無視されます。
SET DELETE OFF
USE TABLE1
BROWSE

ここで開いたブラウザーの最左カラムとレコードポインター表示部の間にある 長方形のスペースをクリックすると黒く塗りつぶされるのが確認出来ると思いま す。もう一度クリックするともとに戻るというスイッチ動作になっています。こ れはマウスでそのレコードにデリートノマークをつける方法です。マークをつけ る方法は前述のように、コマンドウインドウにて、例えば
GOTO TOP
DELETE
BROWSE
のようにすると1レコード目のDELETEインジケータが黒くなっているの が分かるでしょう
GOTO TOP
RECALL
BROWSE
のようにすると1レコード目のDELETEインジケータが元に戻っているの が分かるでしょう
さてもう一度
SET DELETE ON
GOTO TOP
DELETE
BROWSE
どうですか?第一レコードのデータはなくなってしまいましたね。
SET DELETE OFF
GOTO TOP
BROWSE
どうですか?第一レコードのデータがまた見えるようになりましたか?

レコードマークを完全にディスクから排除する方法はPACKコマンドを使用しま す。
USE TABLE1 EXCLUSIVE && ファイルを占有モードで開けないとPACK出来ませ ん
PACK
USE

以上で初級コマンドライン操作説明を終わります
目次へ