過去の桐井戸端BBS (桐ver.9)
28515 「フォームに解析できない式が含まれています(編集対象表がありません)」というエラーが出る ぽち 2004/12/17-16:42
はじめまして。

最近桐を勉強し始めたものですが、以下の状況でエラーが発生して行き詰まっております。

▼ 状況説明

メインフォーム(イベントファイルあり、編集対象表なし)にAボタンとBボタンの
2つのボタンを配置しています。
どちらのボタンをクリックしても同じフォーム(編集対象表あり)を呼び出します。
Aボタン、Bボタンはいずれもクリックすると

表 "open.tbl", 終了状態=&実行確認

で編集対象表を開きます。その後、Aボタンは

フォーム呼び出し "open.wfm", 編集表=する

によってフォームを表示し、Bボタンでは

メソッド呼び出し @フォーム.フォーム選択("open.wfm")

によってフォームを表示します。Aボタンの方法では問題ないのですが、
Bボタンによってフォームを表示する方法では、

「フォームに解析できない式が含まれています(編集対象表がありません)」

といったエラーが表示されます。

まだ桐を始めたばかりで流れがうまくつかめないのですが、
どなたかご教示お願い致します。
28517 Re:フォーム解析エラー(編集対象表がありません) 宮城 2004/12/17-17:03
記事番号28515へのコメント
ぽちさん、こんにちは。

メソッド呼び出し フォーム選択は、リファレンスでは次のように説明されています。

> ■説明
> 対象表の使用フォームを、指定したフォームに切り替えます。

> ■構文
> メソッド呼び出し ハンドル = <ハンドル>,戻り値 = <変数名>,\
> @フォーム.フォーム選択( <フォーム ファイル名> )

ゆえに、Aボタン→Bボタンなら機能するのかもしれませんが、
いきなりBボタンだと、「編集対象表がありません」となるのは当然でしょう。

# Aボタン→Bボタンでも、フォームファイル名が入るべきとことに表明
# が入ったら、動かないような気もしますが。

リファレンスは、ヘルプ→トピック検索→目次のタブ→一括処理&イベントシファレンスとたどってください。
28523 Re:フォーム解析エラー(編集対象表がありません) ぽち 2004/12/18-12:09
記事番号28517へのコメント
さっそくのご回答ありがとうございます。
確かに当然といえば当然ですね(^^)
リファレンスには何度も目を通したのですが、
桐の挙動をよく理解できていない私には、

> 対象表の使用フォームを、指定したフォームに切り替えます。

の部分をよく吟味せずに流していました。ありがとうございます。


ところで、もう1つ桐でよく分からないところがあるのですが、
フォームで編集対象表を扱う場合、

A. フォームの定義画面で編集対象表に対象表へのパスを指定する
B. フォームを表示する前にコマンドで編集対象表を開いてからフォームを表示する

の2つの方法があると思いますが、この部分についてよく理解できません。
例えば、

パターンAによって編集対象表へのパスを指定し、パターンBによってフォームを表示するといった方法をとると内部的には

順序1. パターンBによりコマンドで編集対象表を開く
順序2. パターンAにより再び編集対象表を開く

という流れになるのでしょうか?
もし、そうであるなら

1. フォーム定義画面で編集対象表へのパスを空欄にして、パターンBによりフォーム表示
2. フォーム定義画面で編集対象表へのパスを指定してフォーム表示

のいずれの場合でもエラーなくうまく処理できるということですよね?
ここの流れがよくわかりませんのでどなたかご教示お願い致します。

28524 Re:フォーム解析エラー(編集対象表がありません) 宮城 2004/12/18-19:29
記事番号28523へのコメント
>ところで、もう1つ桐でよく分からないところがあるのですが、

ホントは別の質問は別のツリーを立てるというのがここに限らず、一般的に
こうした BBSのルールですが、実質そんな別内容でもないよう(しゃれにあらず。)なので・・・。

ちょっとお書きになっていることがよくわからないのですが、フォームと表はセットと考えたほうがよろしいかと思います。

>B. フォームを表示する前にコマンドで編集対象表を開いてからフォームを表示する

なんてケースはめったになく、フォームを開くことによりに同時に表を開くのが普通です。

このやりかたになじめないか、このやりかたでなにか行き詰っているとかいうことですか?

どうもフォームと表の関係を変えたいというふうに拝察しますが、フォームだけ変えたいなら
「フォーム選択」でやれそうだし、今のフォームはそのままで、同じ表で別のフォームを開きたいなら、表を「多重化」します。

28525 表の多重化 宮城 2004/12/18-19:57
記事番号28524へのコメント
いきなり「表を『多重化』します。」だけというのもなんなので。
(実は私自身今ひとつ釈然とせず、希望通り動いたからいいやというレベル)

一覧表フォームがあり、当然表は開いていて、本体表に新規レコードを追加するためのフォームを開く KEVです。

手続き定義開始 b追加登録click()
 メソッド呼び出し @フォーム(ホントは半角です。以下同様).更新モード設定(0)
 多重化
 フォーム呼び出し "宛先追加登録.wfm"¥
         ,ボタン=&ボタン名¥
         ,編集表=する¥
         ,終了状態=&終了状態
 終了 表 編集対象表
手続き定義終了

これで「多重化」や「終了 表 編集対象表」をコメントアウト(行頭にアスタリスク「*」をつける)して
試してみればなんとなくわかってくると思います。

ちなみに、宛先追加登録.KEVのほうにはこうしております。

手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 行追加
 ジャンプ 行番号=最終
 メソッド呼び出し @フォーム.更新モード設定(2)
手続き定義終了

こうしないと2行ずつ追加されちゃいます。行追加の位置もここが正しいのかわかりませんが、一応ここで無事に動いております。

こちらのフォームからは「閉じて」戻ります。

全然関係なかったらごめんなさい。

28529 【解説】フォームと編集対象表について 佐田 守弘 2004/12/18-23:50
記事番号28523へのコメント
ぽちさん
宮城さんも書かれている様に、これは別コメントツリーとすべきと思いますが、
以下について基本的な話をいたします。

●フォームと編集対象表
 >A. フォームの定義画面で編集対象表に対象表へのパスを指定する
「編集表へのパスを指定する」という意味は私には分らないのですが、これは
フォームの定義画面で編集対象表を指定するという意味に解釈させて頂きます。

フォームには編集対象表を1つだけ指定することができます。メニュー画面として使う
フォームは別として、編集を行うフォームの場合には、編集対象表を指定します。
この指定によって、フォームと表が関連づけられ、ペアの関係になります。

フォームを直接開いたり、あるいはコマンドボタンの機能名などでフォーム呼び出し
ないしは「開く <フォーム名>」などで開くと、フォームが開くと同時に設定されている編集対象表が開きます。
フォームを開く場合には、編集表は自動で開かれるので、指定する必要はありませんし指定することもできません。

この様にしてフォームと表が開かれた状態からは、フォームを切り替えることは可能ですが、
編集表を切り替えることはできません。

●表編集状態からフォームを指定する
 >B. フォームを表示する前にコマンドで編集対象表を開いてからフォームを表示する
これは会話処理の表編集から、使用フォームを選択する事を言っているものと解釈しますが、
それで良いでしょうか。
あるいは、一括処理で表コマンドで表を開いた後、
使用フォームコマンドで使用フォームを指定する場合も同じです。

表を先に開き、使用フォームを指定する方法では、その表が編集対象表に指定されていないフォームであっても、
使用フォームとして指定できます。ただし、そのフォームでソース値として指定されている項目が表に存在しないとエラーになります。

●表とフォームの関係
この様に、基本的にはフォームと表は1対1の関係にあり、通常、イベントでシステムを組む場合には、
フォームから開きますから、自動的に編集表が決まる事になります。
ただし表の方から見れば、1つの表を異なるフォームで編集することは可能です。
この場合、それぞれのフォームの編集対象表にその表を指定しておくことによって、
どのフォームを開いても、その表が開かれる様にします。

逆に1つのフォームで複数の表を編集するという事は、基本的な使い方では行いません。
(不可能とは言いませんが、免許皆伝の腕前が必要になります。)

佐田守弘(KS-00119)
28532 Re:フォーム解析エラー(編集対象表がありません) ぽち 2004/12/19-13:18
記事番号28524へのコメント
>B. フォームを表示する前にコマンドで編集対象表を開いてからフォームを表示する
>
>なんてケースはめったになく、フォームを開くことによりに同時に表を開くのが普通
>です。

めったにないことはないと思います。というのも、

"フォームを呼び出す前にその編集対象表に対していくつかの処理を施した上でフォームを表示する"

というような場合はどうでしょうか?
といっても、まだ桐をはじめたばかりなので複雑に考えすぎているだけかもしれませんが。

28533 Re:表の多重化 ぽち 2004/12/19-14:59
記事番号28525へのコメント
>多重化を使用する

すばらしいご回答ありがとうございます。
これによって現在悩んでいる問題がほぼ解決致しました。
ただ、多重化の過程で以下のような問題(疑問)が出てきました。

▼ 状況説明

メインフォームにボタンAがあり、これをクリックすると
フォーム呼び出しによって一覧表フォームA.wfm(編集対象表はA.tbl)を表示する。
また、この一覧表フォームのフッタにBボタンがあり
これをクリックするとカード形式のフォームB.wfm(編集対象表はA.tbl)を表示する。

ここで以下の2とおりの方法でカード形式のフォームを表示するとします。

方法1. Bボタンのコマンドボタン機能名に多重化_フォーム編集、機能パラメタリストにB.wfmを設定
方法2. イベントファイルで多重化を指定し、フォーム呼び出しでフォームを表示

▼ 問題点

方法1. フォームB.wfmを呼び出すと呼び出したフォームが一覧表フォームA.wfmの影に隠れてしまう。
方法2. フォームB.wfmが問題なく一覧表フォームA.wfmの前に(上)に表示される。


できれば、1の方法で一覧表フォームA.wfmを呼び出せれば簡単なのですが、
なぜこのような違いが発生するのかがわかりません。
ご教示お願い致します。
28534 Re:【解説】フォームと編集対象表について ぽち 2004/12/19-15:15
記事番号28529へのコメント
>フォームの定義画面で編集対象表を指定するという意味に解釈させて頂きます。

そのとおりの解釈で間違いありません。

>この様にしてフォームと表が開かれた状態からは、フォームを切り替えることは可能で
>すが、編集表を切り替えることはできません。

この点に関しましては宮城さんよりご説明がありましたが、
編集表を切り替えることができないことまでは理解していませんでした。

>●表編集状態からフォームを指定する
> >B. フォームを表示する前にコマンドで編集対象表を開いてからフォームを表示する
>これは会話処理の表編集から、使用フォームを選択する事を言っているものと解釈しま
>すが、それで良いでしょうか。あるいは、一括処理で表コマンドで表を開いた後、
>使用フォームコマンドで使用フォームを指定する場合も同じです。

そのとおりの解釈で間違いありません。

>逆に1つのフォームで複数の表を編集するという事は、基本的な使い方では行いません。
>(不可能とは言いませんが、免許皆伝の腕前が必要になります。)

実はこの方法でなんとかできないものかと考えていましたが、
多重化という方法で問題を解決できました。
免許皆伝の技術を要するコーディングには興味をそそられますが、
順を追って勉強していきたいと思います。
ご丁寧な説明ありがとうございます。

28535 Re:【解説】フォームと編集対象表について 佐田 守弘 2004/12/19-16:07
記事番号28534へのコメント
ぽちさん
 >実はこの方法でなんとかできないものかと考えていましたが、
 >多重化という方法で問題を解決できました。
1つのフォームで複数の表の編集に1つのフォームを共用したいという事ですね。

しかしもしその通りであると、上記引用の2行目の多重化という方法でと言うのが
私には理解できません。何かとても面倒なことをしている様に見えます。

●表とフォームの関係を比喩で説明
喩え話になります。舞台に立つ俳優さんに喩えれば、表は俳優さんであり、フォームはその衣装です。
俳優さんは何か衣装をまとって舞台に立ちます。
表とフォームとの関係は、この様なものと理解して下さい。

本来DBでは、表そのものを直接見せるのではなくて、フォームという衣装を着せて見せるべきものなのです。

さて、俳優さんは複数の衣装を持っていて、時に応じてその1つを着て舞台に立ちます。
今、衣装を着て舞台に立っている俳優さんがいるとして、衣装をそのままにして他の
俳優さんと入れ替わることはできません(まあそういう芸当もないとは言いませんが)。
逆に、別の俳優さんがその衣装を借りて舞台に立ちたいとしたら、予めその衣装を借りて
楽屋で着てからでないと舞台には出られません。
桐の表とフォームの関係は、この様な関係です。

●1つのフォームで複数の表を編集
過去ログに関連記事があると思いますから、詳しくはそれを見て頂くことにして、
ここでは要点だけを述べます。

フォームが開かれて、編集対象表が開かれた後は、表示されている編集対象表を他の表に
切り替えることはできません(上記の喩えで舞台に立っている俳優さんの状態)。
だから切り替えるなら、編集対象表が開かれる前に切り替える必要があります。

フォームを開くと、まずフォームファイルがまず開かれて解析されます。
次いでイベントが設定されていれば、イベントが開かれて、メイン部分だけが実行されます。
そして続いて表が開かれます。

つまりイベントのメイン部分の中で編集対象表の指定変更をすれば、他の表を編集対象表に変更できます。
ただし表コマンドで行うのではなくて、フォームのオブジェクト属性の変更で行います。
(編集対象表はフォームの属性の1つであるため)

また実際にはどの表を編集対象表として指定するかといった事を、イベントのメイン部分に伝える必要があります。
これは変数値で引渡せば良いのですが、どこでどの変数に表名を代入しておくかなどは、
状況によって変わりますから、御自身で考えて頂く必要があります。

佐田守弘(KS-00119)
28536 Re:フォーム解析エラー(編集対象表がありません) 宮城 2004/12/19-18:40
記事番号28532へのコメント
>めったにないことはないと思います。というのも、
>
>"フォームを呼び出す前にその編集対象表に対していくつかの処理を
>施した上でフォームを表示する"
>
>というような場合はどうでしょうか?
>といっても、まだ桐をはじめたばかりなので複雑に考えすぎているだけかもしれませんが。

あえて申し上げますが、やはりめったにないと思います。フォームを呼び出した上で
いくつかの処理をフォーム上で施すぐらいに考えた方がいいと思いますよ。

28537 Re:表の多重化 宮城 2004/12/19-18:58
記事番号28533へのコメント
>方法1. Bボタンのコマンドボタン機能名に多重化_フォーム編集、機能パラメタ
>リストにB.wfmを設定

>方法1. フォームB.wfmを呼び出すと呼び出したフォームが一覧表フォームA.wfm
>の影に隠れてしまう。

よく、分かりませんけど一覧表フォームA.wfmの「ウィンドウの形式」はどうなっていますか?
 (フォームのオブジェクト属性→フォームのタブにあり)

ポップアップだとか(苦し紛れ)。あるいはB.wfmをポップアップにしちゃう。

28539 Re:表の多重化 ぽち 2004/12/20-15:35
記事番号28538へのコメント
すいません、コメントなしで返信してしまいました(^^;

>ポップアップだとか(苦し紛れ)。あるいはB.wfmをポップアップにしちゃう。

B.wfmのウィンドウ形式はチャイルドです。
宮城さんのご説明通りポップアップにするとうまくいきました。

しかしなぜ、このような違いが生じるのかよくわかりません。
多重化_フォーム編集によるフォーム表示と
多重化+フォーム呼び出しによるフォーム表示のどこで
このような違いが発生するのでしょうか?
28540 Re:【解説】フォームと編集対象表について ぽち 2004/12/20-15:46
記事番号28535へのコメント
>●表とフォームの関係を比喩で説明
>喩え話になります。舞台に立つ俳優さんに喩えれば、表は俳優さんであり、フォームは
>その衣装です。俳優さんは何か衣装をまとって舞台に立ちます。
>表とフォームとの関係は、この様なものと理解して下さい。
>
>本来DBでは、表そのものを直接見せるのではなくて、フォームという衣装を着せて見せる
>べきものなのです。
>
>さて、俳優さんは複数の衣装を持っていて、時に応じてその1つを着て舞台に立ちます。
>今、衣装を着て舞台に立っている俳優さんがいるとして、衣装をそのままにして他の
>俳優さんと入れ替わることはできません(まあそういう芸当もないとは言いませんが)。
>逆に、別の俳優さんがその衣装を借りて舞台に立ちたいとしたら、予めその衣装を借りて
>楽屋で着てからでないと舞台には出られません。
>桐の表とフォームの関係は、この様な関係です。

素晴らしい比喩でよくわかりました(^^)

>●1つのフォームで複数の表を編集
>過去ログに関連記事があると思いますから、詳しくはそれを見て頂くことにして、ここでは
>要点だけを述べます。
>
>フォームが開かれて、編集対象表が開かれた後は、表示されている編集対象表を他の表に
>切り替えることはできません(上記の喩えで舞台に立っている俳優さんの状態)。
>だから切り替えるなら、編集対象表が開かれる前に切り替える必要があります。
>
>フォームを開くと、まずフォームファイルがまず開かれて解析されます。次いでイベントが
>設定されていれば、イベントが開かれて、メイン部分だけが実行されます。そして続いて
>表が開かれます。

このご説明により不可解だった部分の桐の流れが理解できした。

>つまりイベントのメイン部分の中で編集対象表の指定変更をすれば、他の表を編集対象表
>に変更できます。
>ただし表コマンドで行うのではなくて、フォームのオブジェクト属性の変更で行います。
>(編集対象表はフォームの属性の1つであるため)
>
>また実際にはどの表を編集対象表として指定するかといった事を、イベントのメイン部分に
>伝える必要があります。これは変数値で引渡せば良いのですが、どこでどの変数に表名を
>代入しておくかなどは、状況によって変わりますから、御自身で考えて頂く必要があります。

ちょっとした質問でここまで親切・丁寧にお答え下さる佐田さんに感嘆いたします。
これからもお世話になると思いますが、宜しくお願い致します。
28541 Re:表の多重化 宮城 2004/12/20-16:56
記事番号28539へのコメント
「フォーム呼び出し」はフォームをポップアップで開くコマンドで、
コマンドボタンはフォームのプロパティに従ったウィンドウ形式で
フォームを開くということでいかが。

戻る