* パラメータクエリで並べ替えた後行番号を表示するには [#j8ccdb17]
|RIGHT:|LEFT:|c
|~ページ|[[OpenOffice.org FAQの登録ページ]]|
|~投稿者|GAKU|
|~分類|#listbox3(Q&A,faq03,class)|
|~優先順位|#listbox3(普通,faq03,priority)|
|~状態|#listbox3(完了,faq03,state)|
|~カテゴリー|#listbox3(Base データベース,faq03,category)|
|~投稿日|2010-04-29 09:12:39 (木)|
|~OS|Windows XP|
|~依存するページ|faq/5/172|
|~バージョン|#listbox3(3.2.0,faq03,version)|

** メッセージ [#afe81ad6]
|LEFT:|c
|回答ページでは行末に「~」を付加する必要はありません|
いつもお世話になっております。~
~
faq/5/172「クエリで並べ替えた後行番号を表示するには」と同様の方法を、パラメータクエリでトライしたところ、1から1ずつ増える行番号にはならず、飛び飛びの番号がつきます。~
正しく、1から順番につけることは可能でしょうか?~
~
添付したsample2.odbでは、イベントの参加者をBaseで管理しています。~
年度別データ抽出クエリはパラメータクエリで、開催年度を入力すると、その年度に参加履歴のある参加者だけを抽出し、ふりがなの50音順に並べ替えます。~
例えば、"2008"と入力すれば、2008年度に参加した人のデータだけを抽出しますが、faq /5/172にならって追加したNOフィールドは、1から始まり1ずつ増えていく行番号にはならず、飛び飛びで番号が入ってしまいます。~
~
よろしくお願いします。

----
***パラメータクエリーが絡むと難しい [#m46bd1dc]
>M.Kamataki (2010-04-29 18:26:33 (木))~
~
添付していただいたサンプルを基にクエリーを作成してみました。下記です。~
~
&attachref(faq5_348sample3.odb);~
~
意図どおり、作成できたのは、q_test2クエリーです。開催年度を「2008」で絞り込むq_2クエリーをサブクエリーとして利用して、番号付けしてみました。~
~
クエリーには実行順があるようで、添付された sample2.odb のクエリーでは、番号付けのNOフィールドを作成した後、パラメータの内容で絞り込まれているようです。したがって番号が飛び飛びになってしまっているのではと思います。わたしのサンプルでは、予め絞り込まれたq_2クエリーの結果を利用して、番号付けを実行したので、通し番号になっています。~
~
ただし、同じ理屈でパラメータクエリーを利用したq_1クエリーを作成し、そのクエリーを基にしたq_test1クエリーではうまくいきませんでした。~
~
参考にされた過去の質問ページ、faq/5/172でも紹介されていますが、マクロを使って番号付けしたクエリーを作成する方法が、今回の目的には適しているのかな、と思いました。faq/5/332でも触れましたが、マクロではパラメータクエリーは利用できないので、InputBox 関数などを使って値を得るようにしてください。~

//
***フォームからクエリの書き換え [#v30ac191]
>ike@九州 (2010-04-30 09:58:00 (金))~
~
Kamataki さんのサンプルから q_2 クエリの内容を書き換えればよいので~
フォーム上に配置したリストボックスから申込年度を選択すると q_2 クエリの SQL 文の右4文字を書き換えてフォームをリロードするようにしてみました~
~
#ref(faq5_348sample4.odb)~

//
***回答ありがとうございます。 [#k4e48f0c]
>GAKU (2010-04-30 19:50:04 (金))~
~
M.Kamatakiさま、ike@九州さま~
~
確認が遅くなり、申し訳ありません。~
回答ありがとうございます。~
マクロではパラメータクエリが使えないのですね。~
開催年度を指定し抽出した結果に、1から順番をつけて、最終的にはCSVファイルにエクスポートすることを実現したいと考えています。~
Input関数などを使う方法を検討していくのが良いのでしょうか?~
~
ikeさんに作っていただいたフォームでは、確かに開催年度毎に1から順番がつけられています。~
こちらを利用して最終的にCSVファイルへエクスポートすることも可能でしょうか?~

//
***CSVファイルにエクスポート [#wa350d2e]
>M.Kamataki (2010-04-30 20:57:23 (金))~
~
自動化するなら、マクロを使うしかないですね。~
~
CSVファイルにエクスポートする方法は、faq/4/1812「マクロからodbファイル内のテーブルを別のodbファイルにコピーするには?」で紹介されています。マクロ例も紹介されています。~

//
***クエリのCSVエクスポート [#o18a658e]
>ike@九州 (2010-05-02 11:18:28 (日))~
~
Calc へ書き出しCSVへエクスポートの手順で試作です~
フォーム上にボタンを配置し以下のマクロを割り当てます~
(データベースの登録が必要です)~
 Sub MakeCSV(oEvent)
  Dim args(0) As New com.sun.star.beans.PropertyValue
  Dim args1(2) As New com.sun.star.beans.PropertyValue
  Dim args2(1) As New com.sun.star.beans.PropertyValue
 
  'データベース登録した名前
  sDBName = "faq5_348sample4"
 
  '作成したいCSVファイルURL
  sFileName = "D:\text.csv"
 
  'Calcを新規に非表示で開く
  On Error Goto ErrorHandler
  args(0).Name = "Hidden"
  args(0).Value = True  
  oCalcDoc = StarDesktop.loadComponentFromURL("private:factory/scalc","_blank",0,args)
  
  'Calcにフォームのソース元のクエリを書き出し(上限65536行)
  oForm = oEvent.Source.getModel().getParent()  
  TargetSheet = oCalcDoc.getSheets().getByIndex(0)   
  oImportRange = TargetSheet.getCellRangeByName("A1")
  args1(0).Name = "DatabaseName"
  args1(0).Value = sDBName
  args1(1).Name = "SourceType"
  Select case oForm.CommandType
   case 0
   args1(1).Value = com.sun.star.sheet.DataImportMode.TABLE
   case 1
   args1(1).Value = com.sun.star.sheet.DataImportMode.QUERY
   case 2
   args1(1).Value = com.sun.star.sheet.DataImportMode.SQL
  End Select
  args1(2).Name = "SourceObject"
  args1(2).Value = oForm.Command
  oImportRange.doImport(args1)
  
  'CSVのエクスポート(既存CSVは上書きされる)
  args2(0).Name = "FilterName"
  args2(0).Value = "Text - txt - csv (StarCalc)"
  args2(1).Name = "FilterOptions"
  args2(1).Value = "44,0,60,1"
  oCalcDoc.storeToURL(ConvertToUrl(sFileName),args2)
  
  MsgBox(sFileName & " 作成しました")
  ErrorHandler:
  oCalcDoc.close(True)
 End sub
~
但し、件数が多いとフォーム参照クエリの実行に時間が掛かります。~
実用に耐えられない時間の場合は faq/5/172 のようにシーケンスクエリの作成マクロの応用&CSV作成になりますね。~
~
又は以下をマクロで~
・q_2クエリをCalcに書き出し~
・列挿入~
・番号付け~
・CSVエクスポート~
~
#汎用的な記述に修正~

//
***ありがとうございます。 [#s294929a]
>GAKU (2010-05-03 07:39:06 (月))~
~
M.Kamatakiさま、ike@九州さま~
~
回答ありがとうございます。~
確認が遅くなり、申し訳ありませんでした。~
ikeさんに作っていただいたマクロで、意図するCSV作成ができることを確認しました。~
これを元に、本番データベースのフォームを作らせていただきます。~
本当に、ありがとうございます。~
~
完了とさせていただきます。~

//
#article