みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
みなさん、こんにちは。Win19.2.1.14を使っています。バックアップしたファイルから8つのテーブルのデータを1回のスクリプトでインポートしたいのです。1つめのテーブルのデータをインポートするときは、取り込むファイルをユーザーに指定させます。ダイアログはありはオフにしています。
2つめのテーブルもインポートするファイルをユーザーが指定しなければなりません。
そこで、1つめのファイルを指定したときにそのファイルを変数に覚えさせておき、2つめ以降のテーブルに取り込むときも自動的にそのファイルを指定して、すべて取り込むようには出来ませんか?
よろしくお願いします。
Offline
一時的に使う、適応tなオブジェクトフィールドを作り、そこにターゲットのファイルをインポートさせるようにダイアログを出します。リンクだけのインポートで十分です。
そのリンクを取得して、データのインポートを行えばいいです。
ただ、そのバックアップファイルということですかが、それ以前にバックアップを行なっているのですよね。その時にパスを保存しておくといいのでは。
Offline
Shin さん、回答ありがとうございました。
なんとなくイメージはわかるのですが、もう少し詳しく教えてください。
まず、スクリプトで、
ファイルを挿入 [フィルタ:参照;圧縮しない;オブジェクトフィールド(グローバル) ]
として、このリンクを取得するには、どうしたら良いのですか?
このリンクを変数にいれて、レコードのインポートをすればいいと言うことでしょうか?
よろしくお願いします。
Offline
リンクを挿入しておき、
GetAsText( オブジェクトフィールド )
を使います。
Offline
関数は
GetContainerAttribute ( フィールド ; "externalfiles" )
方が確実です。
ファイルを選択するスクリプトステップが新設されたと思ったけど勘違いかな?見つからず。フォルダを選択するのはFM14からあるようですが...これだとデフォルトフォルダを指定できるんですよね...
[ファイルを挿入]でファイルを直接選択してパスだけが取得できます。
フィールドを用意せずに変数にパスだけ取得することも可能です。
『関数・スクリプトガイド』の「39. インポートするファイル形式を指定する」に応用例がありますね。
公式トレーニング教材のテキスト
Offline
Shin さん、himadanee さん、Moz さん
回答ありがとうございました。いずれも出来ました。
今回は、Mozさんの方法を採用させていただきます。
その上で、次の質問なのですが、レコードのインポートのスクリプトの作り方を教えてください。
最初の1つめは正常にインポート出来ます。
2つめのテーブルのレコードをインポートするときに、ダイアログ有りで実行し、正常に取り込めることを確認した後、ダイアログオフにしてスクリプトを実行すると、今インポートしたテーブルから、2つめのテーブルへデータをインポートしてしまいます。インポート順は照合名順としています。2つめは、2つめのテーブルから2つめのテーブルへインポートしたいのです。
この場合、レコードのインポートスクリプトを、どのようにスクリプトを作成していったら良いのでしょうか?
よろしくお願いします。
Offline
現在のスクリプトの流れが見えないとどこに問題があるのか分かりません。
[ファイルを挿入]でパスを取得したならば、
1個目のテーブルのレイアウトに切り替えてパスを変数で指定してインポート、
2個目のテーブルのレイアウトに切り替えてパスを変数で指定してインポートするだけです。
インポートはインポート対象のテーブルのレイアウトで実行する必要があります。
それができているならば途中でパスが書き換わっているまたはインポート時に指定する変数を間違えているのでしょう。
スクリプトは完成したら実行ボタンを押すのではなく、デバッガのボタンを押して正しく動くのか確認しながら作りましょう。
データビューアでフィールドや変数の値を確認することも必要です。
スクリプトは希望通りではなく、作られたとおりにしか動きませんからデバッグは必須です。
Last edited by Moz (2020-12-20 07:29:41)
Offline
(ローカル)変数でファイルを指定する場合、スクリプト定義中は変数が存在しないので、代用の固定パスを2行目に指定する
必要があったと思います。
スクリプトでインポートする場合ターゲットを指定できるので、レイアウトを変える必要なかったはず?
himadaneeさんが書かれているように変数でパスを指定する時、
スクリプトを作っているときは変数のままではインポート順が設定できないので
存在するファイルを指定して設定をする必要があります。
※設定ができてしまえば実ファイルのパスは削除しても構いません。
[レコードのインポート]は[レイアウト切り替え]を行わなくてもインポートはできます。
ヘルプやテキストなどドキュメント類でも直前に[レイアウト切り替え]を入れているように
確実に動作させるためには入れておいたほうが良いでしょう。(仕様として明文化されてる?)
レコードのインポート
多くの場合はインポート後に続けて処理をするのでレイアウト切り替えを行って支障はないでしょう。
なお、[レイアウト切り替え]を行わなくても更新インポートもちゃんと動きます。
※更新対象のレコードを対象にしておく必要はあります。
Offline
Moz さん、himadanee さん、
回答ありがとうございました。
スクリプトは下記の様になっています。
#リストア元のファイルを変数に格納
ファイルを挿入[フィルタ:参照;圧縮しない;ターゲット:$impotfile]
#管理テーブルをインポート
レイアウト切替[管理]
レコードのインポート[ダイアログ:オフ;管理テーブル;「$impotfile」;追加;シフトJIS]
#社員テーブルをインポート
レイアウト切替[社員一覧]
レコードのインポート[ダイアログ:オフ;社員テーブル;「$impotfile」;追加;シフトJIS]
変数$impotfileは、きちんと2行に分かれています。
問題は、社員テーブルをインポートするときに、ダイアログを出して、インポート元を社員テーブルにすると正常に社員テーブルをインポートするのですが、ダイアログオフにすると、管理テーブルから社員テーブルにインポートしてしまうのです。
ユーザーにインポートテーブルを指定させること無く自動的に社員テーブルからインポートしたいのです。
スクリプトを作成するときに
一度
レコードのインポート[ダイアログ:オン;社員テーブル;(実体ファイルを指定);追加;シフトJIS]
として、デバックし、インポート順を覚えさせました。
その後、
レコードのインポート[ダイアログ:オフ;社員テーブル;「$impotfile」;追加;シフトJIS]
すると、他のテーブルから読んでしまいます。インポート順はどのように指定したら良いのでしょうか?
よろしくお願いします。
Offline
インポート順は「ダイアログあり」オンオフで覚えさせるものではありません。
スクリプトステップの設定で指定するものです。
※ダイアログありオンで実行しても記憶しませんよ......
1個目2個目というのが分かりづらいですが fmp12 ファイルからのインポートということですね。
その場合でもインポート元の fmp12 ファイルのテーブルを指定してインポート順を覚えさせれば
あとでファイル指定を変数のみに変えても正しくインポートされます。
考えられるのは
・ダイアログありで実行してダイアログありオフに変えてるだけなので設定を記憶していない
・インポート順を変更して保存して変数のみの指定に書き換えたあとでインポート順を開いてOKした
でしょうかね。
Offline
実際にインポートを実行することでインポート順を記憶させるのは、FM6ぐらいの頃の手法では。
手作業でインポート実行後に、新規作成したインポートのステップがデフォルトでは手作業時と同じインポート順を持っていたような気もするけど、これが最新バージョン(たしかFM18から)の変化したインポートダイアログでも有効かどうかは知りません。
>変数$impotfileは、きちんと2行に分かれています。
変数に挿入した場合の2行は、相対パスと絶対パスで、実行時にしか入りません。
変数ではなく固定値でファイル参照を追加する必要がある(インポート順をスクリプトステップで設定するときだけ)ということです。
こんな感じのスクリプトです。インポートのステップの、ファイルとインポート順の設定をみてください。インポート順の設定を見るときには、実ファイルが必要です。(同じファイルのコピーを同じフォルダーにおいてありますが、環境でパスが変わるかもしれません。)
https://www.dropbox.com/s/4uj8mc6p42cwm … 2.zip?dl=0
Offline
Moz さん、himadanee さん、Shin さん、
回答ありがとうございました。
Shin さんのサンプルファイルで、スクリプトの書き方がわかりました。
>>実際にインポートを実行することでインポート順を記憶させるのは、FM6ぐらいの頃の手法では。
Ver6の頃から使っているので、まだそのくせが抜けないようです。
新しいバージョンのインポート順の設定方法がわかりました。
実体ファイルを書くことによってインポート順を設定するのですね。
その上で、Shin さんのサンプルプログラムについて教えていただきたいのですが、
bkファイルのデータ数を変更して、本体とは別の場所にコピーしました。
インポート時にその別の場所を指定しても、元の位置にあるファイルからインポートしてしまいます。
これはどうしてでしょう?
よろしくお願いします。
Offline
デバッグされていますか?
[ファイルを挿入]で参照のみ指定でファイルを選択してパスが取得できているのに
不要な変数定義( GetContainerAttribute ) があるので動かないのですよ。
これまでの流れでせっかくできていたのに新しいものが提示されたらそちらが正しいと思ってしまう。
比較して異なるところを調整すればどこでコケているのか自分で気付けるでしょう。
主体的にスクリプトを書かないと身になりませんよ。まぁそう言っても伝わらないと思いますがネ。
Offline
Moz さん、回答ありがとうございました。
デバッグはもちろん行っています。
変数設定[$link;GetContainerAttribute ( $target ; "externalFiles" )]
をコメントアウトして、$targetだけにすることによって、無事動くようになりました。
まだまだ、勉強不足です。ご迷惑をおかけしますが、今後もよろしくお願いします。
Offline
Pages: 1
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 564.88 KiB (Peak: 585.78 KiB) ]