みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
サーバ,ProともV12を使用している初心者です。
番号フィールドにバーコードリーダで入力すると検索し、未検索であれば新規レコード作成し、番号をそのまま入力させたいのですが、
フィールドへ移動もできません。
どの様に修正すれば良いのでしょうか。
宜しくお願い致します。
検索モードに切り替え「一時停止」
フィールドへ移動「番号」
変数を設定「$no;番号」
エラー処理「オン」
検索実行
エラー処理「オフ」
新規レコード/検索条件
フィールド設定「番号;$no」
グローバルフィールドを作り、そこへ入力する形にしておく、入力され確定すれば、トリガーでスクリプトを起動するようにしておきます。
グローバルフィールドから番号フィールドへリレーションを張っておけば、そのリレーションを通してレコードの有無が確認できます。それを検知して、関連レコードへ移動するか、新規レコードを作成するか、をすれば簡単でしょう。
レコードの更新が起こっても良いのでしたら、リレーションを通して番号フィールドへ入力された値を設定し、関連レコードへ移動、でいいのでシンプルになります。
Offline
グローバルフィールドを作り、そこへ入力する形にしておく、入力され確定すれば、トリガーでスクリプトを起動するようにしておきます。
グローバルフィールドから番号フィールドへリレーションを張っておけば、そのリレーションを通してレコードの有無が確認できます。それを検知して、関連レコードへ移動するか、新規レコードを作成するか、をすれば簡単でしょう。
レコードの更新が起こっても良いのでしたら、リレーションを通して番号フィールドへ入力された値を設定し、関連レコードへ移動、でいいのでシンプルになります。
新規にグローバルテーブルを作成し、グローバルフィールドを作成しました。
番号フィールドとリレーションを張ると、グローバルテーブルで番号フィールドが同じレコードを見ることができました。
これで良いのでしょうか?
済みませんが、これ以降の具体的な設計方法がわかりません。
グローバルテーブルは要りませんが。
そのリレーションで、新規レコードの作成を許可しておきます。
見つからない番号を設定すると、リレーション先の番号フィールドも見つかりませんね。そこにグローばりフィールドと同じ番号を設定すれば、その番号の新しいレコードが作成されます。
Offline
グローバルテーブルは要りませんが。
そのリレーションで、新規レコードの作成を許可しておきます。
見つからない番号を設定すると、リレーション先の番号フィールドも見つかりませんね。そこにグローばりフィールドと同じ番号を設定すれば、その番号の新しいレコードが作成されます。
グローバルテーブル無しでリレーションするにはどうすれば良いのでしょうか?
取りあえず、どちらのテーブルにも新規レコードの作成を許可しました。
リレーション先の番号フィールドが見つからない場合に、グローバルフィールドと同じ番号を入力すると新規レコードが作成できましたが、入力が2か所になります。
グローバルフィールド入力すると見つからない場合は自動で番号が入力された新規レコードが出来ないでしょうか?
> グローバルテーブル無しでリレーションするにはどうすれば良いのでしょうか?
自己リレーションができます。
リレーションシップグラフでテーブルを複製すればいいんですよ。
> グローバルフィールド入力すると見つからない場合は自動で番号が入力された新規レコードが出来ないでしょうか
スクリプトにすればいいんですが、、
スクリプト、作れませんか?
Offline
自己リレーション
番号テーブルを複製し、番号テーブルの番号フィールドと番号テーブル2のグローバルフィールドをリレーションしました。
グローバルフィールドに入力すると番号フィールドが表示しますが、無い場合は表示しません。
これで良いのでしょうか?
初心者なので下記スクリプトの作成は難しいです。
グローバルフィールド入力すると見つからない場合は自動で番号が入力された新規レコード作成。
グローバルフィールドに入力した値を空白。
合わせて、ご指導をお願いします。
> 番号テーブルの番号フィールドと番号テーブル2のグローバルフィールドをリレーションしました
逆の方がいいでしょう
番号テーブル::グローバルフィールド = 番号テーブル 2::番号フィールド
とした方が間違いが減りますよ。
このリレーションの設定で番号テーブル 2の
このリレーションシップを使用して、
このテーブルでのレコード作成を許可
にチェックを入れます。
スクリプトの考え方
(グローバルフィールドに入力)
If [ not IsValid ( 番号テーブル 2::番号フィールド ) ]
フィールド設定 [番号テーブル 2::番号フィールド ; グローバルフィールド ]
End If
関連レコードへ移動
これでいいでしょう。
Offline
色々試しましたが、やっとできたと思います。
こちらで宜しいでしょうか。
作成ボタンのスクリプト
レイアウト切り替え「作成」
フィールドへ移動「番号テーブル::グローバルフィールド」
フィールド設定「番号テーブル::グローバルフィールド;””」
グローバルフィールドの設定
番号テーブルのグローバルフィールドに対し、スクリプトトリガ設定「OnObjectSave」で番号入力のスクリプトを設定
番号入力のスクリプト
If[not IsValid(番号テーブル2::番号フィールド)]
フィールド設定[番号テーブル2::番号フィールド;番号テーブル::グローバルフィールド]
End If
関連レコードへ移動[番号テーブル2;使用するレイアウト:「番号テーブル」(入力)][関連レコードだけを表示]
色々試しましたが、やっとできたと思います。
こちらで宜しいでしょうか。作成ボタンのスクリプト
レイアウト切り替え「作成」
フィールドへ移動「番号テーブル::グローバルフィールド」
フィールド設定「番号テーブル::グローバルフィールド;””」グローバルフィールドの設定
番号テーブルのグローバルフィールドに対し、スクリプトトリガ設定「OnObjectSave」で番号入力のスクリプトを設定番号入力のスクリプト
If[not IsValid(番号テーブル2::番号フィールド)]
フィールド設定[番号テーブル2::番号フィールド;番号テーブル::グローバルフィールド]
End If
関連レコードへ移動[番号テーブル2;使用するレイアウト:「番号テーブル」(入力)][関連レコードだけを表示]
今朝、バーコードを使い、番号フィールドの入力テストを繰り返し行いました。
有る条件で関連レコードに移動しない事例がありました。
レコードの該当件数(未ソート)が 0/100 のように0の場合がそうです。
全てのレコードに変更すると移動します。
番号入力のスクリプトは0の場合は駄目なのでしょうか?
あるいはグローバルフィールドの設定が間違っているのでしょうか?
対象レコードがなしの状態でグローバルフィールドの動きは、きちんと動く事もあるのですが、不安定ですね。全レコードを対象にしてから移動させた方がいいかもしれません。
Offline
対象レコードがなしの状態でグローバルフィールドの動きは、きちんと動く事もあるのですが、不安定ですね。全レコードを対象にしてから移動させた方がいいかもしれません。
作成ボタンに「全レコードを表示」を追加しました。
又、一番初めの入力前に1レコードを入力しておく必要もありました。
バーコード入力出来るようになりましたが、2回入力が必要です。
1回目は番号フィールドが空白のレコードが出来、2回目で番号が入力できます。
2回目でもレコード数は増えないので修正?されたことになるのでしょうか。
下記スクリプトをどの様に修正すれば宜しいのでしょうか。
宜しくお願い致します。
作成ボタンのスクリプト
全レコードを表示
レイアウト切り替え「作成」
フィールドへ移動「番号テーブル::グローバルフィールド」
フィールド設定「番号テーブル::グローバルフィールド;””」
番号テーブルのグローバルフィールドの設定
スクリプトトリガ設定「OnObjectSave」で番号入力のスクリプトを設定
番号入力のスクリプト
If[not IsValid(番号テーブル2::番号フィールド)]
フィールド設定[番号テーブル2::番号フィールド;番号テーブル::グローバルフィールド]
End If
関連レコードへ移動[番号テーブル2;使用するレイアウト:「番号テーブル」(入力)][関連レコードだけを表示]
> 作成ボタンに「全レコードを表示」を追加しました。
対象レコードが無い状態からなら、
番号入力スクリプトを
If [ not IsValid ( 番号テーブル2::番号フィールド ) ]
新規レコード作成
フィールド設定 [ 番号テーブル::番号フィールド;番号テーブル::グローバルフィールド]
End If
関連レコードへ移動
とすればいいでしょう。
最初の
全レコードを表示
は不要になります。
書かれた2回入力の件は分りませんが、
おそらく、上記のスクリプトに変更すればいいのではないかと。
Offline
フィールド設定した後で、「レコードを確定」 しておいたほうがいいでしょう。
Offline
番号入力スクリプトを
If [ not IsValid ( 番号テーブル2::番号フィールド ) ]
新規レコード作成
フィールド設定 [ 番号テーブル::番号フィールド;番号テーブル::グローバルフィールド]
レコード/検索条件確定
End If
関連レコードへ移動
に変更すると全レコード表示,1レコード入力済み,2回入力もしないで解決しました。
番号フィールドを入力するテーブルが複数あります。
そのために先輩のスクリプトを参考にElse If[Get(スクリプト引数)を追加し複数テーブルに使えるスクリプトにしました。
但し同じ番号をバーコード入力してもそのままで、レイアウトが切り替わらない不具合があります。
何度も申し訳ありません。
If[0]
Else If[Get(スクリプト引数)=1
If [ not IsValid ( 番号テーブル2::番号フィールド ) ]
新規レコード作成
フィールド設定 [ 番号テーブル::番号フィールド;番号テーブル::グローバルフィールド]
レコード/検索条件確定
End If
関連レコードへ移動
Else If[Get(スクリプト引数)=2
・
・
Else If[Get(スクリプト引数)=3
End If
> 番号フィールドを入力するテーブルが複数あります
それを最初に言わないと。。
作成ボタンが入力テーブル分有るのですか?
全体の構造等もっと説明した方がいいかもしれませんね。
Offline
> 番号フィールドを入力するテーブルが複数あります
それを最初に言わないと。。作成ボタンが入力テーブル分有るのですか?
全体の構造等もっと説明した方がいいかもしれませんね。
大変申し訳ありません。
重要な事とは思わず、また自力で出来ると思っていたのですが、駄目でした。
5種類の入力レイアウト(A~E)を作成しています。
将来は増える可能性もあります。
各々関係ないためテーブルを5個に分けています。
DBを開いた最初のレイアウトにはボタンを5個作成(A~E)しています。
操作は、Aボタンを押すとグローバルフィールドがあるレイアウトに切り替わり、Aグローバルフィールドに、番号をバーコード入力します。
バーコード入力すると入力レイアウトに切り替わり、初めての番号の場合は新規レコード作成し、番号フィールドに、その番号を自動入力。
既に入力済みである番号は、それを表示させます。
宜しくお願い致します。
一般的には、商品番号等の一覧表を作り、そこから詳細を入力していく、という構造が多いと思います。その一覧表を作るのでしたら、新規でしたら一覧に新規レコードとして作成し、その関連レコードとして他のテーブルへレコードを作っていく、という運用になります。この形ならばレイアウトを分けないで、タブコントロールを使って入力画面を切り替える事ができますので、作りやすくなるかもしれません。
Offline
五つのテーブルの必要性は分りませんが、
現在の方法の疑問点を、、
> DBを開いた最初のレイアウトにはボタンを5個作成(A~E)しています。
> 操作は、Aボタンを押すとグローバルフィールドがあるレイアウトに切り替わり
この切り替わるレイアウトは五つに分かれるのですか?
> バーコード入力すると入力レイアウトに切り替わり
これができていない?
書かれたスクリプトでは
レイアウト切り替え
していませんよね。
Offline
五つのテーブルの必要性は分りませんが、
現在の方法の疑問点を、、紙記入していたフォームが5種類ありデータに関連がないため、テーブルを分けるのが普通であると考えました。
> DBを開いた最初のレイアウトにはボタンを5個作成(A~E)しています。
> 操作は、Aボタンを押すとグローバルフィールドがあるレイアウトに切り替わり
この切り替わるレイアウトは五つに分かれるのですか?グローバルフィールドがあるレイアウトも5つのテーブル毎に分かれます。
> バーコード入力すると入力レイアウトに切り替わり
これができていない?グローバルフィールドにバーコードで番号を入力しますが、異なる番号は入力レイアウトに切り替わりますが、登録済み番号は切り替わらずそのままです。
書かれたスクリプトでは
レイアウト切り替え
していませんよね。
グローバルフィールドに
スクリプトトリガ設定 OnObjectValidate で 下記スクリプトを実行させていますが。
If[0]
Else If[Get(スクリプト引数)=1
If [ not IsValid ( Aテーブル2::番号フィールド ) ]
新規レコード作成/検索条件
フィールド設定 [ Aテーブル::番号フィールド;番号テーブル::グローバルフィールド]
レコード/検索条件確定
End If
関連レコードへ移動[テーブル:Aテーブル2;使用するレイアウト:A入力レイアウト]
Else If[Get(スクリプト引数)=2
If [ not IsValid ( Bテーブル2::番号フィールド ) ]
新規レコード作成/検索条件
フィールド設定 [ Bテーブル::番号フィールド;番号テーブル::グローバルフィールド]
レコード/検索条件確定
End If
関連レコードへ移動[テーブル:Bテーブル2;使用するレイアウト:B入力レイアウト]
Else If[Get(スクリプト引数)=3
・
Else If[Get(スクリプト引数)=4
・
Else If[Get(スクリプト引数)=5
・
End If
書かれたスクリプト
> If[0]
Else If[Get(スクリプト引数)=1
これは単に
If [ Get ( スクリプト引数 ) = 1 ]
でいいでしょう。
他に間違いは無い様にみえますが、
うまく動かないのなら、
スクリプトパラメータの設定、
リレーションの設定、
レイアウト、
グローバルフィールドのテーブル
等チェックしてみたらいかがでしょう。
Offline
また一つ疑問が。
コード番号のみが入り、他にデータが入っていない空レコードが、その5個のテーブルに存在することはありますか。必ず何らかのデータが入力されている、という状況でしたら、それらのレイアウトへのデータ入力でレコードを作成すれば良い訳で、トリガーでレコードを作りに行く必要性は全く無くなります。
Offline
また一つ疑問が。
コード番号のみが入り、他にデータが入っていない空レコードが、その5個のテーブルに存在することはありますか。必ず何らかのデータが入力されている、という状況でしたら、それらのレイアウトへのデータ入力でレコードを作成すれば良い訳で、トリガーでレコードを作りに行く必要性は全く無くなります。
5個のテーブルとも、空きレコードは無いです。
番号入力がきっかけで、レコード作成したいので。
但し、登録済み番号のレコードを修正することもあるので、初めに番号を検索し、無ければレコード作成したいですが。
4つ上の回答頂いた内容が理解できず申し訳ありません。
抽象的な書き方をされているので具体的な例示が出来ませんが、
例えば、学習塾の管理ファイルだとして、一覧は、塾生一覧、それぞれのテーブルは、家庭環境情報、選択教科、テスト成績管理、志望校管理 などとなりますね。この塾生一覧テーブルがあると、そのテーブルでのレイアウトの中で、それぞれのテーブルを関連フィールドとして配置したり、ポータルを配置したタブコントロールがあればいいのでは、という事です。
バーコード入力を行うのは、塾生番号になり、その検索先は塾生一覧にすると良いかと思います。
Last edited by Shin (2016-04-27 16:58:52)
Offline
抽象的な書き方をされているので具体的な例示が出来ませんが、
例えば、学習塾の管理ファイルだとして、一覧は、塾生一覧、それぞれのテーブルは、家庭環境情報、選択教科、テスト成績管理、志望校管理 などとなりますね。この塾生一覧テーブルがあると、そのテーブルでのレイアウトの中で、それぞれのテーブルを関連フィールドとして配置したり、ポータルを配置したタブコントロールがあればいいのでは、という事です。
バーコード入力を行うのは、塾生番号になり、その検索先は塾生一覧にすると良いかと思います。
例をもとに、ご説明いただき大変有難う御座います。
この様な作り方は初めてで、私にとってはスキルアップになりました。
塾生一覧の使用方法は異なっていると思いますが「関連レコードとして配置したり」までについては、これまでご指導頂いた内容で設定しているのではと思うのですが。
1.自己リレーション
2.このリレーションを使用してレコード作成を許可
3.フィールド設定のスクリプトやスクリプトトリガ設定
そのあとのポータルやタブコントロールについては経験が無く理解が難しいです。
こちらのQ&A内にサンプルなど、ご存じであればご紹介頂ければ助かります。
[ Generated in 0.022 seconds, 7 queries executed - Memory usage: 612.38 KiB (Peak: 648.92 KiB) ]