csvファイルとリンクしたい †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | 匿名 |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2010-08-17 11:14:29 (火) |
OS | Windows XP |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
定期的に更新するcsvファイルとのリンクを行いたいです。 更新方法は同じファイル名で上書きを考えています。 csvの内容はコードとその名称のみです(インデックスが必要なら追加します。)
やりたい事ですが、テーブルのコードとcsvのコードをリンクさせて名称を表示したいです。(イメージ的にはCalcのvlookupそのものです。)
これが出来るならBaseにてファイルを作成してみようと思っております。
よろしくお願いします。
(当初のご質問の回答は「CSVファイルのリンク」をご覧ください。以降はフォームの更新をマクロで行う方法についての質問に変わっています。なお、わかりやすくするため、カテゴリー間違いに関する部分は削除しました)
CSVファイルを読み込む機能 †
M.Kamataki (2010-08-17 14:51:41 (火))
BaseにCSVファイルの読み込み機能を実装する要望はOpenOffice.orgの不具合・要望データベースであるIssueTrackerに登録されています。以下の当サイトの質問をご覧ください。
faq/1/375「baseにはMSAccessのようなテーブルのインポートのようなのはないの?」
ただし、Baseで標準のデータベースとしてHSQLDBをお使いの場合は、HSQLDBのSQLを使って、CSVファイルをテーブルとして扱うことができます(実態はリンク)。その方法が、faq/1/375のリンク先と、faq/4/1812「マクロからodbファイル内のテーブルを別のodbファイルにコピーするには?」のコメント「CSVファイルを使う方法」に書かれていますが、わかりにくいようなら、当ページに改めて書きます。
※Baseでは、利用するデータベースによってCSVファイルのインポート方法が変わります。HSQLDBをお使いではない場合は、その旨、お書きください。
CSVファイルのリンクですと †
M.Kamataki (2010-08-17 15:21:28 (火))
faq/4/460「外部DB接続と新規のテーブル作成」という質問もありました。こちらには、MDBファイルを利用する方法も書かれています。IssueTrackerの要望としては、faq/4/460で紹介したものの方が、ご質問に近いですね。
ありがとうございます †
匿名 (2010-08-17 17:28:16 (火))
CSVのインポートはCSVをCalcで開いてすべて選択してD&Dにてインポート出来ました。
これでCalcでいうvlookupの準備が出来ましたので、コードから名称を取得する方法はありますでしょうか?
よろしくお願いします。
追記
クエリを用いて後で結合するのではなく、新しいレコードの入力時にコードを入力したら名称が表示するようなのを考えています。
確認します †
M.Kamataki (2010-08-17 18:10:44 (火))
データベースのテーブルなどの基本設計が固まっていない場合は、先に進まない方が良いので、回答を改めます(一度回答したものをいったん削除しました)。まずは確認すべきことがあります。
>CSVのインポートはCSVをCalcで開いてすべて選択してD&Dにてインポート出来ました。
「定期的に更新するcsvファイルとのリンクを行いたいです」は、実現できないと思いますが、良いのでしょうか。
次にテーブルの確認をします。
>新しいレコードの入力時にコードを入力したら名称が表示するようなのを考えています。
この部分ですが、テーブルにはコードが入力されるのですか、それとも名称が入力されるのですか。
そうでした †
匿名 (2010-08-18 09:01:00 (水))
>「定期的に更新するcsvファイルとのリンクを行いたいです」は、実現できないと思いますが、良いのでしょうか。
すみません全く良くないです。
>この部分ですが、テーブルにはコードが入力されるのですか、それとも名称が入力されるのですか。
CSVにコードと名称があって、その名称を表示したいです。
コードの入力間違いを防ぐためだけなので、テーブルに格納する必要はありません。
イメージとしてはこんな感じです。これのcsvのテーブルを定期的に更新したいです。
よろしくお願いします。
CSVファイルのリンク †
M.Kamataki (2010-08-18 11:27:18 (水))
サンプルファイルを用意しました。
faq5_472sample1.odb
テーブルカテゴリの「csv」テーブルがCSVファイルへのリンクテーブルです。CSVファイルは以下のようなものを用意しておきます。
faq5_472.csv
サンプルのODBファイルは、以下のSQLを「ツール」−「SQL」で実行して作成しました。
- CREATE TEXT TABLE "csv" (CODE VARCHAR(50), NAME VARCHAR(100)) ;
- SET TABLE "csv" SOURCE "faq5_472.csv;encoding='UTF-8'" ;
テーブルカテゴリを表示し、「表示」-「テーブルの更新」を選ぶとリンクされたテーブルが表示されます。なお、CSVファイルはリンクするODBファイルと同じフォルダ(ディレクトリ)に置いておく必要があります。
※(追記)いくつか注意点があります。HSQLDBのCSVは、「"(ダブルクォーテーション)」でテキストを括る形式のCSVには未対応のようです(文字化けします)。また、Base起動中は、リンク中のCSVファイルの変更を他のツールでは行えません。
フォームの件 †
M.Kamataki (2010-08-18 11:29:32 (水))
リストボックスにして、その内容から選択させるようにするのが最も簡単な方法です。ただし、リストボックスの内容が多くなりすぎるなどを理由にリストボックスではない方法を取りたい場合は、マクロを使うしかないと思います。たぶん、faq/4/1315「サブフォームのテーブルから選択」が参考になると思います。
ありがとうございます †
匿名 (2010-08-18 14:06:37 (水))
リストボックスに関してはまた別途考えたいと思います。
実際に入力する場合にタブで項目を進んでいくと思うのですが、その場合NAME項目が一番最後になってしまいます。
また、CODEを変更した場合にNAMEにカーソルを持っていき更新ボタンを押さないと更新されません。
この辺はしょうがないのでしょうか?
イベントマクロ †
ike@九州 (2010-08-18 15:32:59 (水))
フォームの編集から
"txtバルクコード" のプロパティ>イベントタブ>フォーカスを失った時>以下のマクロを割り当てSub SubFormReload(oEvent) oForm = oEvent.Source.getModel().getParent() oForm.getByName("SubForm").reload End Sub
入力後、Tab キーや Enter キーなどでフォーカスを失った時に SubForm 更新になります。(再入力時も有効です)
ありがとうございます †
匿名 (2010-08-18 15:54:14 (水))
希望の動作になりました。
実用に向けて検討させていただきます。
もうひとつのマクロ †
M.Kamataki (2010-08-18 16:30:33 (水))
SubFormはMainFormのレコードが更新されないと、SubForm側のデータを表示できません。「CODEを変更した場合にNAMEにカーソルを持っていき更新ボタンを押さないと更新されません」と、この時の更新動作が必要というわけです。
ike@九州さんマクロが、この更新動作にあたります。直接SubFormを reload してますね。考え方は一緒ですが、MainFormの更新後、SubFormを更新するため次のレコードの表示、更新したレコードに戻るというマクロの記録を利用した以下のマクロでも、NAME欄の更新が可能です。sub Main dim document as object dim dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array()) dispatcher.executeDispatch(document, ".uno:NextRecord", "", 0, Array()) dispatcher.executeDispatch(document, ".uno:PrevRecord", "", 0, Array()) end subやはり、イベント「テキストの変更時」に割り当てます。
サンプルを添付します。
faq5_472sample2.odb
似たような主旨の質問は当Q&Aサイトにたくさん登録されています。Baseの場合、どうしてもマクロを使わないと解決できないことが多いです。将来的には、faq/4/1680「複数のテーブルからちょっとづつレコードを選択して、別のテーブルへ転記したい」あたりも見ておくと良いかもしれません。
タブで進む項目の順序 †
M.Kamataki (2010-08-18 16:43:13 (水))
>実際に入力する場合にタブで項目を進んでいくと思うのですが、その場合NAME項目が一番最後になってしまいます。
同じフォームグループの中の項目ならば、「フォームデザイン」バー上にある「タブの順序」ボタンをクリックして表示される「タブの順序」ダイアログボックスでタブの順番を変更できます。ただし、SubForm上の「NAME」テキストボックスは別のフォームグループに属するので、MainForm上の項目より前の順番に変えることはできません。
ただし、わたしは「NAME」欄をこのフォームで変更する必要性を感じませんでした(確か「NAME」欄があるCSVファイルは、OpenOffice.orgとは別の方法で"定期的に更新する"という話でしたよね)。したがって、上記のサンプル faq5_472sample2.odb では、「txtNAME」のプロパティーで「全般」タブの「読み取り専用」を「はい」に設定しています。そうすると「NAME」欄はタブキーでは選択されなくなります。これで違和感はなくなりませんか。
無題 †
匿名 (2010-08-19 17:49:55 (木))
タブに関しては最初NAME欄を選択しないと結果が表示されなかったので、今は問題ありません。
気になる点は、新規入力のフォームと編集のフォームを分けたいのですが、新規のみにした場合にサブフォームの内容が更新されません。
あと、フォームを作成したあとに新規のみや削除不可などの設計変更はどこからするのでしょうか?
わからないので毎回フォームを作成し直しています…
新規のみでは不可ですね †
ike@九州 (2010-08-19 18:31:41 (木))
以下のようにフォーカスを無理やり txtName に持っていって更新してみましたSub SubFormReload(oEvent) oForm = oEvent.Source.getModel().getParent() oDoc = oForm.getParent().getParent() oSubForm = oForm.getByName("SubForm") oDoc.getCurrentController.getControl(oSubForm.getByName("txtNAME")).setFocus oSubForm.reload oDoc.getCurrentController.getControl(oForm.getByName("txtBATCH")).setFocus End Sub
既存フォームの動作設定 †
ike@九州 (2010-08-20 08:34:41 (金))
フォームの編集からフォームデザインツールバー内のフォームナビゲーターボタンを押し、ナビゲータを使用して各コントロールやフォームの動作設定を編集します。
MainForm を右クリックからコンテキストメニューのプロパティでデータタブを開き各動作を変更します。( SubForm も個別に設定できます)
ありがとうございます †
匿名 (2010-08-20 10:09:26 (金))
新規は不可ですか。。
普通にCalcでvlookupを使った方が無難なような気がしてきました…
新規入力のフォーム †
M.Kamataki (2010-08-20 12:30:22 (金))
「もうひとつのマクロ」の場合は、確認したところ無問題でした。
フォームの使い方ですが、以下のPDFを入手しておくと良いかもです。
http://openoffice-docj.sourceforge.jp/wiki/images/HowToForm2.pdf
なお、当初のご質問からだいぶ離れたご質問が多くなっています。ここでいったん区切りとして、完了にします。新たなご質問は、新しく質問ページから登録しなおしてください。依存するページに当ページの「faq/5/472」と書いていただければ、関連質問とわかります。
当Q&Aサイトは、登録された質問を調べて利用する方もいらっしゃいます。やりとりの途中に、別の質問があるとわかりにくくなります。ご協力おねがいします。