我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

CDATA SAS Data Sets FireDAC Components の更新履歴

さて、なんだかバタバタしていて全く更新出来ませんでした。ネタも少しはあるんですが、うまく記事にまとめられず。

とりあえず、手元の開発で使用しているCDATAのSAS Data Sets FireDAC Components の更新履歴でも貼っつけておきます。
これは公式なものではなく、あくまでもリリース後(β版は除く)に私が報告した問題からまとめたものです。
公式できちんと出してくれればいいんですけどね。
今使ってるから、これから使われる方の参考になれば。(ダウンロードできるものが最新とも限らないので)

21.0.8109 : マニュアルの修正

  • update 等、対応していないコマンドの記述が存在する
  • VC++ (x86/x64) redistributable package が必要な旨がマニュアルにない

実はupdate, deleteには対応していません。SAS xptでも同様。未だにトップページでは使えるって言ってるの、結構問題だと思うんですけど。
(私は結局、テーブルをdropしてcreate & Insertで実装しました。)
また、V21U6から(21.0.6xxx?)VC++ (x86/x64) redistributable package が同梱されなくなったため、別途インストールが必要なのですが、この記載も追記されました。

21.0.8115 : テーブルの識別に関する修正

  • CREATE TABLE IF NOT EXISTS文がすでにテーブルが存在する場合にエラーを返す
  • CREATE TABLE直後に作成されたテーブルが識別されない

回避策として、Delphiでテーブルの存在チェックをする、一度FDConnectionを切断して再接続するという方法もあります。

21.0.8145 : 欠損値に関する修正

  • Nの変数に欠損値(NULL)が格納できない

結構致命的ですね。SASSASたらしめる「.」が格納できません。
このバージョンで以下のような感じで使えるように修正されました。

  create table if not exists nullcheck (id integer, text varchar(10));
  insert into nullcheck (id,text) values(null,'YYY'); 

21.0.8149 : 欠損値に関する修正

  • 指定しないNのカラムに欠損値が格納されず、0が格納されてしまう

以下のコードだと、idカラムに欠損値でなく、0が格納されてしまうという問題です。

  create table if not exists nullcheck (id integer, text varchar(10));
  insert into nullcheck (text) values('YYY'); 

21.0.8160 : 特定のデータセットの読み取りに関する修正

  • FDQueryでsortseq=linguistic()を指定したデータセットの1行目に空行が表示されてしまう

proc sortでsortseqなんてめったに使わないと思うんですが、何故か指定していたコードがあり、再現。
これは回避不可でした。

21.0.8163 : 特定のデータセットの読み取りに関する修正

  • FDQueryでsortseq=linguistic(case_first=lower NUMERIC_COLLATION=ON )を指定したデータセットの1行目に空行が表示されてしまう

sortseq=linguistic()の問題は前のビルドで対応出来ていましたが、さらにlinguisticにオプションを追加しても発生することが発覚。
もともとはsortseq=linguistic(case_first=lower NUMERIC_COLLATION=ON )で作成したデータセットで確認していたのですが、最小の再現コードがsortseq=linguistic()だったのです。

21.0.8165 : 小数の扱いに関する修正

  • Bulk Insertにおいて、カラム属性をAsFloatと指定した場合でにキャストエラーとなり、小数がデータセットに格納できない
  FDQuery1.SQL.Text:='create table if not exists floatcheck(id decimal(10,2),text varchar(10));';
  FDQuery1.ExecSQL;
  FDQuery1.Close;
  FDConnection1.ResourceOptions.ServerOutput := True;
  FDQuery1.SQL.Text := 'insert into floatcheck (id, text) values (:id, :text);';
  FDQuery1.Params.ArraySize:= 1;
  FDQuery1.ParamByName('id').DataType   := ftFloat;
  FDQuery1.ParamByName('id').AsFloats[i] := 12.3;
  FDQuery1.ParamByName('text').AsStrings[i] := 'AAAA';
  FDQuery1.Execute(FDQuery1.Params.ArraySize,0);
  FDConnection1.ResourceOptions.ServerOutput := False;
  FDQuery1.Close;

普通にInsert文ならOKでしたが、一気に挿入したかったので。

21.0.8179 : データセットに関する修正

  • 0obsのデータセットにInsertしてもSASで認識できない点を修正

Firedac側では正常にコマンドが終了し、select文でも行を正しく取得できるので問題を認識しづらかったと思います。
SAS側でデータを確認しようとすると、0オブザベーションですと表示されてしまいます。
欠損値のinsertチェックのときに発見しましたが、当時は状況が分からず後回しに。

以上です。