Windows:言語変換された OS に .NET Framework 3.5 をインストールできないとき

OS 言語設定の変更

前回記事に次いで、はまりする問題を挙げましょう。

.net Framework 3.5 を有効化する OS が元々英語版であって、途中から日本語版に変えた場合は、英語版と日本語版の両方をマージした代替ソースパスが必要となる場合があります。‥‥つまり有効化にあたって、英語情報として参照される事項と、日本語情報として参照される事項が出てきて仕舞うということですね。

サーバ環境を構築する際には充分ご注意ください。そして、基本的な有効化手順を長時間掛けて数実施して、初めて OS の真の状態を知るケースも有り得るということを‥‥。

必要な材料を揃えたのにも拘らず、「0x800F081F」のエラー(材料不足 or システム破損)が出た場合は、システム修復を試すか別言語 OS であることを疑ってみましょう!

xobQuery: -d パラメーターでのネットワークパス形式(UNC表記)指定

xobQuery でDBを指定する -d パラメーターですが、パスの先頭が "\\" で始まるネットワークパス形式(UNC表記)で指定するときの留意事項があります。

使用しているインメモリDBエンジンを呼び出すときの、表記上の制約となります。

-d \\share\workdb\sales.db

という指定だとエラーになりますので、

-d \\\\share\\workdb\\sales.db

のように、\ を1個ずつ増やして(エスケープして)指定します。

Designer:CSV 高速抽出時の一時ファイル問題解消

Cドライブに蓄積されない!

前回記事の、CSV ファイルを高速エンジンで抽出する際に出来上がる一時ファイル件ですが、2019/03/21 リリース時の「v1.7.3.2」では、この問題が解消されています。Designer のアップデートは、細目に確認/実施して参りましょう。確認には、業務ファイル(.xob/.xbt)の画面上部、『ヘルプ(H)』→『アップデート確認』を 選択下さい。

但し Excel として抽出する以上、対象の CSVOffice で開いた見た目で抽出することに変わりはありません。以下例を充分にご注意ください。

零始まりの数値‥‥「0001」等が「1」として抽出される。(会社番号/品目コード等)
桁数の長い数値‥‥「123456789012」等が「1.23457E+11」として抽出される。(指数扱い)
日付に近い文字‥‥「10-21」や「10/21」が 2019年現在なら「2019/10/21」として抽出される。(分数/枝番等)

零始まりの数値は、抽出キーワード『前ゼロ付加桁数』や生成キーワード『取得データの前ゼロ付加』で整え切れますが、桁数がルールとして決まっていなければなりません

Designer:『シート分割』の注意事項まとめ

当然シートの仕様が問われる

前回記事で、シート分割の設定例を挙げました。便利な機能ですが、Excel のシートを操作する以上 xoBlos 側だけでなく、Excel 側の仕様も意識しなければなりません。

xoBlos 側‥‥①入力データ(.xml)内のシート分割項目は、最優先でソートされていなければならない。
       ②セクション『追加入力』を持つ制御シートでは使用できない。

Excel  側‥‥③シート名に相当する項目の文字数が 30 文字を超えるとそれ以降は切られる。
        (エラーにならない上、切られた結果が同名であった場合は、無関係データが纏められたり一方しか生成されなかったり等が起こる。)
       ④シート名に相当する項目に、シート名に使えない値("?" "/" 等)が来るとブック破損する。
       ⑤生成キーワード『(高度)選択/スキップ条件』は、キーワードの処理順序上、『シート分割』より後に動作する

特に⑤は問われ易いですよね。xoBlos の基本構成が、"抽出時は問答無用で全件抽出"、"生成時に初めて対象データを絞る"――を推奨していますので、シート分割要件が関わってくると、「あれ?どうして全データ出力されたのであろう。」となります。シート分割要件がある場合は、抽出時にキーワード『(高度な)スキップする行の条件』で絞っておくか、中間処理にて対象データを限らせなければなりません。何せ、抽出は行方向に並んでいる情報しか条件付け出来ませんから‥‥

Designer:複数の CSV を一括抽出

繰り返しの設定は必須

抽出元が複数の Excel である場合は、ワイルドカード「*」の曖昧指定と「%BOOK%」「%SHEET%」の活用ですんなり対応出来ました。では、複数の CSV はどうでしょうか。

f:id:xoblos:20190913161631p:plain

手順種『変換(CSV→抽出)』は、『a.入力ファイル名(必須)』項にワイルドカード「*」が使えません。間接的な理由になりますが、「b.出力ファイル名(必須)」項に「%BOOK%」「%SHEET%」が使えない為――。そもそも CSV ファイルにブックやシートという考えが無い為ですね。

では前回記事のように、手順種を『Excelから抽出』にすれば対応可能なのでは?と挙がるでしょうが、半分正解です。但し、以下の制約は全てクリア出来るでしょうか。

零始まりの数値‥‥「0001」「01」などが「1」で抽出されて仕舞い、『前ゼロ付加桁数』や『取得データの前ゼロ付加』では補正し切れない。
桁数の多い数値‥‥指数に成って仕舞う。
         例:「12345678901234」が「1.23457E+13」に。
日付形式な文字‥‥日付に成って仕舞う。
         例:「01-01」は「(現在は)2019/1/1」で表示は「1月1日」、「50-01」は「1950/1/1」で表示は「Jan-50」に。
etc...

上記から一つでも該当するならば、繰り返し処理で各 CSVXML 変換を行いましょう。繰り返しということは、繰り返しの基準ファイルを作成する必要があります。

f:id:xoblos:20190913161637p:plain

上図のような抽出の制御シートを用意し、無論手順種『Excelから抽出』を使って全 CSV を対象とします。その際抽出する項目は、データ内にある項目は一切不要。必要なのは CSV のファイル名だけであることがポイントです。次に、変換された XML一つにマージします。‥‥ここまで出来れば後は簡単ですね。マージした XML を繰り返し基準ファイルとして、手順種『変換(CSV→抽出)』に繰り返し設定を行ってみましょう。対象の CSV がどう増減しても、何の修正も要らずに xoBlos は処理対応し続けてくれます!

Designer:制御シートの書き換え設定の注意点

一括制御シート要件の書き換え対象は?

f:id:xoblos:20190902165052p:plain

『制御シートの書き換え設定』は、その通り(処理中に一時的に)制御シートを書き換える機能ですが、対象の制御シートは業務ファイル(.xob/.xbt)の『1.制御シート指定』節、『b.制御シート名(必須)』項で指定されたシートのみになります。したがって、たとえブック内に別の制御シートが複数あったとしても、纏めて書き換えてくれる訳ではありません。‥‥一括制御シートは特に注意が必要です。

f:id:xoblos:20190902165100p:plain

一括制御シートは――つまりは個別制御シートを複数実行させる、業務シナリオ表です。しかし "制御シート" に変わりはなく、無論実行の際には一括制御シートの方を設定することになりますので、各個別制御シートの書き換えは行えません。手順を個別制御シート分用意するか、マスタ化して繰り返し処理化する等、工夫が必要です。

Designer:シート名に全角スペースは要注意!

シングルクォーテーションが判断出来ない

生成時、高速エンジンを使用すると結果のブックが破損することがあります。前回記事でも示しましたが、これは大抵のケースで高速エンジンの未使用にて解決します。高速エンジンの未使用は "Excel ならではで動かす" 為、処理は遅くなりますが、高速エンジンよりかは Excel 機能の大部分に対応が行えるという訳です。

f:id:xoblos:20190805163405p:plain

さて上図①ですが、2行の表内で別シートのセルと――更に別のシートのセルをそれぞれ参照しています。列「B」に書かれているのは列「A」が持つ式の内容です。‥‥生成高速エンジンではこの内、明細 1行目に表現されているようなシングルクォーテーションで囲まれる全角の空白(スペース)を含むシート名を解釈することが出来ませんExcel の仕様上、何処までがシート名を示しているのか区別する為に、シングルクォーテーションで囲むことになっているのです。

上図②は、シート「空白 シート」自身が持っている情報です。印刷範囲を設定すると、名前定義には自動でその情報が入ります。しかし下部の「参照範囲」は前述と同様シングルクォーテーションが含まれており、同じ問題が挙げられます。

"高速エンジンの未使用" 以外の対処法としましては(シート名にスペースが無いよう運用化して頂きたいのが本音ですが‥‥)、全角スペースから半角スペースを 2つに変更するか、或いは前回記事のように通常式から INDIRECT 式に記述を変えることです。「=INDIRECT("'空白 シート'!A1")」のように、シート名部分はただの文字列と見做されますので、破損することなく高速生成が成立するでしょう。