過去の桐井戸端BBS (桐ver.8)
12044 桐で書き出そうとしたCSVファイルが使用中の場合の処理について HERB 2001/06/30-16:11
HERBです、以下、イベントについてアドバイスください。
桐V8SP6です。

手続き定義開始 入力日受注一覧印刷 ()
結合 "日別出荷.viw",,表番号 = 1,変数使用 = する
条件 (.NOT #行集計状態 .AND .NOT #絞り込み状態 .AND #整列状態) 整列解除

表 "日別出荷.tbl",表番号=2,モード=専有
条件 (.NOT #行集計状態 .AND .NOT #絞り込み状態 .AND #整列状態) 整列解除
行削除 *
読み込み 表,条件名="日別出荷.viw"
表整理 余白割合 = 10

終了 表 1

ケース開始
ケース (.not #空ファイル)
if (&プレビュー="する")
レポート印刷 出金A4w,プレビュー=する
else
レポート印刷 出金A4w
end
ケース その他
確認 "印刷するデータがありません."
ケース終了

編集表 "日別出荷.tbl"
絞り込み [出荷日]{#日時値生成(&開始年,&開始月,&開始日)}
書き出し CSV,条件名="日別出荷.csv",終了状態=&OK

ケース開始
ケース (&OK=1)
編集表 "日別出荷.tbl"
解除 1

ケース (&OK=-2)
メッセージボックス "ファイルが使用中です", \
"ネットワークに繋がっている他のパソコンでファイルが使用中です。\n使用中の日別出荷.csvファイルを閉じて再試行するか。\nキャンセルボタンを押して処理を中断してください。", \
,アイコン=E,ボタン指定=6,制御文字展開=する
ケース終了

項目集計 [商品合計]
行集計 条件名="日別出荷割合"
データ行 無効
書き出し CSV,条件名="日別出荷割合.csv"
行集計解除

終了 表 2

 オブジェクト操作 ハンドル=&hwindow,@印刷実行.画面表示="0"
手続き定義終了

結合表「日別出荷」はSQLサーバーからフォームで指定した該当月データを取り込み、桐表「受注」「顧客台帳」を結合しています。

その日受注があった件数分レポート印刷後、レポートに印字した内容を表計算ソフトでも見られるよう書き出しを行います、
書き出しの時CSVファイルが他のネットワークで繋がっているパソコンで使用中の場合の処理についての質問です。

書き出し終了状態変数でケース分けをしています、
CSVファイルが使用中、一旦ファイルを閉じてもらい再試行するか、
処理そのものをキャンセルさせたいのですが、
ケースコマンド内にさらにケースコマンド処理を行えばよいのか、繰り返しコマンドを使うのか、
また、繰り返しコマンドがよくわかりません、
イベント記述についてもおかしな点がございましたら、アドバイスよろしくお願いします。


12047 Re:CSVファイル使用中の処理 toshi-chan 2001/06/30-19:33
記事番号12044へのコメント
HERBさん。

1.「処理そのものをキャンセルさせたい」はCSV書き出しを中止し、次の処理に移るという意味に解釈しました。
2.メッセージボックスで押したボタン番号を代入する変数を勝手に &ボタン としました。
3.その他のエラー(&OK=0の場合)の場合の処理も必要では?

次のような感じでいかがでしょうか。
***********************************************************************
編集表 "日別出荷.tbl"
絞り込み [出荷日]{#日時値生成(&開始年,&開始月,&開始日)}

繰り返し

  書き出し CSV,条件名="日別出荷.csv",終了状態=&OK

  ケース開始
    ケース (&OK=-2)
      メッセージボックス "ファイルが使用中です", \
      "ネットワークに繋がっている他のパソコンでファイルが使用中です。 \
      \n使用中の日別出荷.csvファイルを閉じて再試行するか、 \
      \nキャンセルボタンを押して処理を中断してください。", \
      ,アイコン=E,ボタン指定=6,制御文字展開=する,&ボタン

    ケース (&OK=0)
      メッセージボックス "エラー", \
      "その他のエラーが発生しました。 \
      \n再試行するか、キャンセルボタンを押して処理を中断してください。" \
      ,アイコン=E,ボタン指定=6,制御文字展開=する,&ボタン
  ケース終了

  条件 ( &OK=1) 繰り返し中止
  条件 ( &ボタン=2) 繰り返し中止
  
繰り返し終了

編集表 "日別出荷.tbl"
解除 1
************************************************************************

★繰り返しコマンドを使用するときは、繰り返しループから抜け出す仕掛けを作ることが必要です。

★&OK=1のとき(書き出しが正常終了したとき)は、ケース範囲内の処理はされません。
 条件コマンドの部分の  &OK=1 が成立するので、繰り返し中止コマンドが実行され、
制御は繰り返し終了コマンドの次の編集表コマンドに移ります。

★&OK=-2 または &OK=0 のときはいずれもケース範囲内のメッセージボックスコマンドが実行されます。
 「再試行」を押すと  &ボタン=4  となり、2つの条件コマンドのいずれも成立しません。
それで 繰り返しループの先頭に戻って再び書き出しが実行されます。
 「キャンセル」を押すと  &ボタン=2  となり、2つ目の条件コマンドが成立して繰り返しループから抜けます。

★HERBさんの書いたプログラムでは、&OK=1のときのみ解除コマンドが実行されますね。
上記のよ うにケース範囲外に出した方がいいのではないでしょうか。(処理する内容にもよりますが・・・・・)

自分で書いておいて言うのも何ですが、繰り返しループの書き方がいまいちセンスがないような気がします。
もっといい書き方があったらアドバイスして下さい。
12051 Re:CSVファイル使用中の処理 尾形 2001/06/30-21:16
記事番号12044へのコメント
HERBさん、こんばんは

> 書き出し CSV,条件名="日別出荷.csv",終了状態=&OK
> 書き出し CSV,条件名="日別出荷割合.csv"
と2行書出しがありますが、下の書出しではエラー対策は要らないのですか?
これにより、最善の方法も変わるでしょうし

12065 Re:CSVファイル使用中の処理 HERB 2001/07/01-10:40
記事番号12051へのコメント
HERBです。

toshi-chanさんへ

> 1.「処理そのものをキャンセルさせたい」はCSV書き出しを中止し、
> 次の処理に移るという意味に解釈しました。

確認のため、意図的に書き出しCSVファイルを開いたまま実行するとエラーがでました、
これを回避したくキャンセルを選択したときは次の処理移る、解釈の通りです。

> 2.メッセージボックスで押したボタン番号を代入する変数を勝手に 
> &ボタンとしました。

変数名はイベントを見直し、変数名を決めます。

> 3.その他のエラー(&OK=0の場合)の場合の処理も必要では?

そうですね、処理をどう行うかアドバイスいただき、次のステップで考えようと思っていました。

> ★繰り返しコマンドを使用するときは、繰り返しループから抜け出す仕掛けを
> 作ることが必要です。

中略

> 自分で書いておいて言うのも何ですが、繰り返しループの書き方がいまいちセ
> ンスがないような気がします。もっといい書き方があったらアドバイスして下
> さい。

繰り返し処理で行えばよいのではと、考えてはいたのですが今ひとつ繰り返し処理がよくわかりませんでした、
おかげさまで少し理解できました、私が記述できなかった繰り返し処理を補足していただいたことで理解しやすかったです。

ありがとうございました。

尾形さんへ

>と2行書出しがありますが、下の書出しではエラー対策は
>要らないのですか?

もちろん必要です、一行目をどう処理するか解らなかったのでそのままにしてあります、
処理方法をどうすればよいかよろしくお願いします。


12082 Re:CSVファイル使用中の処理 佐田 守弘 2001/07/02-00:47
記事番号12044へのコメント
HERBさん
書き出そうとしているCSVファイルが別のアプリで開かれていると、
同じファイル名で桐が書き出す事ができない事については、理解されていると思います。

さて、私の考えですが、本来は他のアプリで開かれる可能性があるCSVファイル名を使うかもしれないところに課題がある様に思います。
例えば桐が書き出すCSVファイルは、桐専用にし、桐が書き出した後、別のアプリ(別のタスクとしたきりでも構わない)で読み込む際に、
そのCSVファイルを別名のCSVファイルにコピーするといった方法はどうでしょうか。

他のアプリで開かれていたら、書き出しを中止するといった考え方より、
とにかく書き出してしまっておく方が良いのではないかと思います。

佐田守弘(KS-00119)
12085 Re:CSVファイル使用中の処理 HERB 2001/07/02-10:44
記事番号12082へのコメント
佐田 守弘さん、HERBです

>他のアプリで開かれていたら、書き出しを中止するといった考え方より、
>とにかく書き出してしまっておく方が良いのではないかと思います。

なるほどその手もありましたか、一旦適当なフォルダーに書出、その後ネットーワーク上で使用するためのフォルダーに丸ごとコピーする、
ヘルプを見るとファイル複写コマンドがありますが、ワイルドカードですべてのCSVファイルを選択するか、フォルダー内ファイルを
すべてコピー、といった方法も可能でしょうか。

ヘルプのエラー番号116の解説に、「同名のファイルがすでに存在する」とあります、
CSVファイルは上書き保存しており同名ファイルです、
ファイル複写コマンドは上書き保存はできないのでしょうか。

よろしくお願いします。


12098 Re:CSVファイル使用中の処理 toshi-chan 2001/07/02-17:54
記事番号12085へのコメント
HERBさん。

★私は「ファイル複写」コマンドをよく使用していますが、同名ファイルがある場合でもきちんと上書きされています。
「桐5ユーザのための桐ver7一括処理ガイド」という本があります。
この本のファイル複写コマンドの項には、
「指定するファイルを複写する。複写先に同じ名前のファイルが存在するときは上書きする。」
と書いてあります。桐のオンラインヘルプには何も書いてありませんが・・・・・・・

★エラー番号に関しては、私の推測ではありますが、ファイル操作系コマンドすべてに共通なのではないでしょうか。

一括処理コマンドの

ファイル名変更 <旧ファイル名>,<新ファイル名>,終了状態=<変数名>

の<新ファイル名>にすでに存在するファイル名を指定すると、エラー番号=116となりました。

★HERBさんが考えている、
>ワイルドカードですべてのCSVファイルを選択するか、フォルダ
>ー内ファイルをすべてコピー
は、オンラインヘルプの記述例にそのものズバリがありますね
12104 Re:CSVファイル使用中の処理 HERB 2001/07/03-10:14
記事番号12098へのコメント
toshi-chanさん、HERBです

>この本のファイル複写コマンドの項には、
>「指定するファイルを複写する。複写先に同じ名前のファイルが存在するときは上書きする。」
>と書いてあります。桐のオンラインヘルプには何も書いてありませんが・・・・・・・

コピー先のファイルが使用されていなければ上書きOKですね。

>ファイル名変更 <旧ファイル名>,<新ファイル名>,終了状態=<変数名>
>
>の<新ファイル名>にすでに存在するファイル名を指定すると、エラー番号=116となりました。

ファイル名変更は上書きしない、できないということですね。

>★HERBさんが考えている、
>>ワイルドカードですべてのCSVファイルを選択するか、フォルダ
>>ー内ファイルをすべてコピー
>は、オンラインヘルプの記述例にそのものズバリがありますね

CSV書出後、フォルダー、もしくはワイルドカードを使ったファイル複写を行うようにします、
その際に教えていただいた繰り返しコマンドを使って、使用中のファイルがあるときはエラーメッセージを表示させる処理を考えてみます。

ありがとうございました、今後ともよろしくお願いします。

戻る