Excel:「SYLK」ファイルのエラー

冒頭項目「ID」の落とし穴

f:id:xoblos:20190408112455p:plain

‥‥筆者は人にサンプル業務を提示する時や、急ぎのテストデータを作る時、上図のような簡単なものを用意します。一先ず、これだけあれば大凡のパターン(単票/クロス表/シート分割/ブック分割/集計/並べ替え/エリア生成/対象データの条件付け等)は、直ぐに例示することが出来ます。変換入力や追加入力のような複数入力ファイルを要するものは、上図をコピーしてキー値以外を変えて仕舞えば早いですね。

さて、下方の CSV ですがある日、どはまりするエラーを得て仕舞いました。

f:id:xoblos:20190408112501p:plain

そう、xoBlos 側ではないのです。偶々 CSV を Office で開こうとしたら、上図の上方‥‥次いで下方のエラーが Excel 側で出て仕舞ったのです。前者は後者に比べ専門的ではありませんが、ダブルクォーテーションが無い CSV も世に存在する中、思わず「えっ?」と口にしました。しかし原因を調べてみると、次いで出た後者のエラーとはセットの存在でした。

Excel の仕様

CSV 上で "ID" 始まりの情報があると、Office は SYLK(Symbolic Link File) というファイルで解釈して仕舞います。エラーメッセージで示されているとおりですね。

ではこの CSV を xoBlos で、Excel として抽出(手順種『Excelから抽出』で抽出高速エンジンを未使用に)すると同じエラーが xoBlos でも出て仕舞うのでは?という心配があります。‥‥ご安心ください、xoBlos では正常に抽出することが出来ます。

Designer:整形記号「#U」のある行/列の書式設定


生成先のセル書式は無関係!?

f:id:xoblos:20190311115603p:plain

前回記事で、「#U」は直前のキー値を保持することをお話しました。ではこのキー値を生成している部分の書式変更は、どのように行うのでしょうか。試しに、普段通りの方法で "事業所の文字色は赤" という要件をこなしてみましょう。

f:id:xoblos:20190311115610p:plain

事業所はセル「B3」に生成しますので、セル「B3」に赤色を事前設定します‥‥が、生成結果は冒頭から変化がありませんでした。

整形記号「#U」が施された行/列――そこに生成するキー項目の書式は、何と「#U」を記述した行/列上の書式を前提とします。この為、続いてはセル「B7」の文字色を赤にして‥‥序でにセル「C7」の背景色も紫で塗り潰してみましょう。

f:id:xoblos:20190311115617p:plain

無事、反映されましたね。

しかし「#U」を記述した行/列上であったのに、何故セル「C7」の書式は反映され、セル「B3」の書式は反映されなかったのでしょうか。‥‥今回の帳票、項目「事業所」が分類項目である為です。分類は、"行" の考えに成ります。一方見出しは、"列" の考えに成ります。単純に「#U」と記述しただけでも、分類項目の生成上にあるのか見出し項目の生成上にあるのかで、役割は明確に分かれます。これはいずれの整形記号に於いても、共通の事項です。

Designer+Windows:batファイルの実行

batファイルを、外部アプリとして実行するときの設定例です。

f:id:xoblos:20190303163141p:plain

[a.関連付けられたアプリケーションで実行しますか?] を「はい」にし、[b.実行するファイル(必須)] に実行するbatファイルのファイルパス名、引数のコマンドラインを指定して実行できる環境もありますが、実行できない環境の場合は上図のような設定を行います。

[a.関連付けられたアプリケーションで実行しますか?]

いいえ

[b.実行するファイル(必須)]

%ComSpec%

[c.コマンドライン引数]

batファイルをコマンドプロンプトで実行するときのコマンドラインと引数を、/c オプション付きで指定します。 例: /c bat\filelist.bat 100 200 ”3番目の引数”

2.動作の設定 [a.作業フォルダ]
.
※通常、xobファイルのあるカレントフォルダ「.」を指定します。

解説

「%ComSpec%」は、「c:\windows\system32\cmd.exe」などに展開される環境変数です。[値の編集] ダイアログで [環境変数] タブから選び、ダブルクリックしてエディターに設定することもできます。

cmd.exeは、コマンドプロンプトを実行するWindowsのプログラムです。

batファイル名の前に /c オプションを入れるようにしてください。設定の結果、下記のようなコマンドラインが組み立てられます。

c:\windows\system32\cmd.exe /c bat\filelist.bat 100 200 ”3番目の引数”

Designer:生成キーワード『日時指定』

基本文字列なのを忘れずに!

私達が普段 Excel に日付の値を入力する時は、そのセルの書式に応じて、入力時点の値から自動変換されるパターンがありますね。下図のような例があります。

f:id:xoblos:20190219112913p:plain

日付の手入力は、xoBlos の生成処理で XML から渡される値がセルにあて込まれるのと同じ扱いに成ります。しかし忘れてはなりません。xoBlos で扱われる(XML にある)値は、共通で文字列扱いです。その為、他システムや私達の一見で「見た目日付」である値も、xoBlos は文字列としか意識がありません。

これにより、Excel で真意に日付として扱われる「2019/02/19」を XML に持っていたとしても、文字列が前提であることで、生成時はシリアル値である「43515」が扱われます。これを避ける為に、生成キーワード『日時指定』は活躍します。対象項目の当該キーワードの設定値を「Date」にし、「これは日付(年月日部分)として扱う」ということを、xoBlos に伝えます。‥‥雛形シート上の見出し/分類の走査情報が日付値であって、どうにも上手く生成されない(アンマッチ扱いになる)場合は、本件を気にしてみましょう。

『日時指定』は xoBlos が日付と判断できる値を前提にして、初めて利用できます。無論――例えば「20190219」はただの数値ですので、これに対し日時指定を行っても何も前提付けは行えません。

Designer:重要な情報が空白は有り得ない!

キー項目

生成キーワード『区分』は、分類類いにすれば行方向へ出力する項目の集約、そして見出し類いにすれば列方向へ出力する項目の集約を成しますね。これは結局のところ、今現在読み込まれた 1データの集約項目の値と、これまでに出力した既存データ或いは雛形シート上の既存情報と、値を照らし合わせていることを表します。このように重要な役目を持った主要情報は、キー項目(情報)とも表現されます。

f:id:xoblos:20190208110654p:plain

上図のように項目「ID」は『区分』を「詳細行」にしているので、そのキー項目に成ります。しかし項目「Desc」の値が「item4」であるデータはいずれも、キー項目「ID」に値が入っていませんね。一応抽出の時点では全てのデータが対象に成りましたが、果たしてキーが「null」のものは「null」同士、集約されるのでしょうか。‥‥いいえ、処理対象外に成ります。

重要な情報であるのにも拘らず値が無いというのは、システムの世界では考えられないものである為です。選択/スキップ条件も何も施していないのに、生成データの件数が合わないと思われた場合には、続いてキー関連(分類/見出し/エリアキー)を『区分』に設定した項目の値に、「null」のものが無いかを確認しましょう。データだけではなく、雛形シート上の既存情報も同じです。分類や見出しの並びに、途中空白セルが無いかを注視しましょう。特に結合されたセルは要注意です!(参考‥‥結合されたセルの役割

Designer+SQL:異なる環境のデータベース参照

ポート番号を目印に

自環境であれば、比較的設定が容易なデータベース抽出。これが他環境へ跨いでの参照と成ると、xoBlos 以外にも設定事項が色々と出てきます。‥‥我々と同じです。見ず知らずの方と、即座に「ご自宅お邪魔します。」「どうぞどうぞ。」というスムーズな交わしは成立しません。

f:id:xoblos:20190125111753p:plain

いくら相手から「どうぞどうぞ。」と言われても、場所が分からなければ訪問できません。その為、目印としてポート番号を任意の値で決定し、関連する通り道に全て示しておきます。簡単に表現すれば住所の番号です。

先ずアクセス元は、Designer でいつもどおり接続設定を行います。ただ環境を跨ぐことで一つだけポイントに成るのは、『Data Source』項に「対象マシン名\対象インスタンス名」だけではなく、更に「,対象ポート番号」(カンマ対象ポート番号)を指定することです。コロン「:」ではありません!

次にアクセス先は、このポート番号に対して外部からのアクセスを、ファイアウォールの設定で許可します。更に、対象インスタンスプロトコルTCP/IP」のポートにも、同じ番号を設定します。「どうぞどうぞ。」はここで初めて表現出来ますね。

<アクセス元>
・Designer で Data Source 項に「,ポート番号」は忘れずに!

<アクセス先>SQL Server
 - Management Studio で対象 DB のプロパティから「リモート接続」を許可!
 - Configuration Manager で対象インスタンスプロトコルTCP/IP」の
  IPアドレスを有効にし、「TCPポート」にポート番号を設定!

Designer:不定な数の項目を連結する

最初の項目が定まらない

抽出と生成の両方にあるキーワード『取得データの組合せ』。複数の項目の値同士、或いは固定の文字列を連結する要件で活躍します。しかしその内、値が無い(空白の可能性がある)項目が対象と成った場合、文字列の連結はどのようにすれば良いのでしょうか。‥‥何ということはありません。空白は空白でしか置き換わらないので、通常と同様で特別な設定は要りません――

では。‥‥いえ寧ろ普通はあると思いますが、項目(値)間に区切り文字がある場合は、どのようにすれば良いでしょうか。

f:id:xoblos:20190104135917p:plain

ここでは、区切り文字を全角のスペース「 」にしましょう。上図は入力データですが、「a b c」等のように成れば期待値です。値の文頭前と文末後にもスペースは合ってはなりません。つまるところ、左詰めに文字列が収まり、各値の間にのみ全角スペースが入れば完成です。

f:id:xoblos:20190104135935p:plain

曲者なのは、最初と最後の項目が徹底していないことです。これをカバーする為、上図の抽出制御シートは少々乱暴ですが、4つの項目いずれも『取得データの組合せ』で全角スペースを頭に付加し、それらをすぐさま連結しています。また空白をカバーする為に、『データが無いときの値』で「ネコ」という値を設定しています。これにより、どのデータも必ず「 文字 文字 文字 文字」となります。

これを前提に、生成の制御シートでは先ず空白情報を持つデータから対処します。‥‥抽出の段階で空白は、正式には「 ネコ」に成りましたね。これを、『文字列編集』で Null(文字列無し)に置換します。すると、個数が不定でも「 文字」×nを持ったデータに成ります。

残された共通問題は‥‥もう簡単ですね。各データ、最初の(項目分の)全角スペースが "固定で" 残っていますので、『取得データの切り出し』で、2文字目から取り扱うことにしましょう。

f:id:xoblos:20190104135942p:plain

期待する生成結果に成りました。参考で列「A」~「D」も出力していますが、不要であれば無論、『セット先セル』を未設定にすれば良いだけです。

これが最終生成結果でなく中間処理であって、且つ Excel の関数に慣れている人は、これまでの面倒な設定は一切不要とし、雛形シート上(列「E」等)に「=TRIM(" "&A2&" "&B2&" "&C2&" "&D2)」等を置かれることでしょう。