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

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

CDATAのSAS.ds対応が正式版に!

気づいたら9/27に正式版がリリースされていたみたいです。

問い合わせをしたら前回の担当者が申し訳なさげに、前回報告してくれた不具合は直ったよ、ここから最新版をダウンロードしてみてね、と連絡が来ました。
ウッキウッキしながら洗い物を終わらせ、検証を始めます…。

CDATA SAS Dataset対応についての経緯はこちらからどうぞ
CDATAにSAS.ds対応が来た! - 我輩はブロガーではない。ネタもまだない
CDATAにSAS.ds対応が来た! その2 - 我輩はブロガーではない。ネタもまだない
CDATA SAS.dsを使ってみる(その1:データセットアクセス編) - 我輩はブロガーではない。ネタもまだない
CDATA SAS.dsを使ってみる(その2:属性編) - 我輩はブロガーではない。ネタもまだない
CDATA SAS.dsを使ってみる(その3:CRUD編) - 我輩はブロガーではない。ネタもまだない
CDATA SAS.dsを使ってみる(その4:追加検証編) - 我輩はブロガーではない。ネタもまだない

前回の検証後、使えないからもういらないや、と捨ててしまった環境を再度構築します。
ブログが役に立ちました。人様には役に立たなくても自分に役に立てばいいですね!

1. まず、CDATAから最新のコンポーネントをダウンロードしてインストールします。
f:id:japelin:20211019003257p:plain
バージョンは21.0.7961です
f:id:japelin:20211019003312p:plain
Delphi11にはまだ対応していない模様

今回はVCLで行きます。

2. Delphiの新規アプリケーション作成で

TFDPhysCDataSASDataSetsDriverLink
TFDConnection
TFDQuery
TFDGUIxWaitCursor
TFDMetaInfoQuery
TDBGrid
TDatasource
TCombobox
TButton
をフォームに貼り付けます。

3. FDConnection1をダブルクリックしてドライバIDから「CDataSASDataSets」を選択して閉じます。
4. フォームをダブルクリックしてonFormCreateに以下のコードを書きます
  FDConnection1.Params.Add('URI=C:\Temp');
  combobox1.Text:='';
  combobox1.Items.Clear;
  combobox1.Items.Add('');
  FDMetaInfoQuery1.Connection := FDConnection1;
  FDMetaInfoQuery1.MetaInfoKind := mkTables;
  FDMetaInfoQuery1.Open;
  while(not(FDMetaInfoQuery1.Eof))do begin
    combobox1.Items.Add(FDMetaInfoQuery1.FieldByName('TABLE_NAME').AsString);
    FDMetaInfoQuery1.Next;
  end;
  FDMetaInfoQuery1.Close;
5. Button1をダブルクリックして、onClickに以下のコードを書きます
  fdquery1.Close;
  fdquery1.SQL.Text:='select * from '+combobox1.Items[combobox1.ItemIndex]+';';
  fdquery1.Open();
  DataSource1.DataSet:=fdquery1;

これだけ。すげー簡単。

SASでは以下のコードをsubmitし、テストデータを作成します。
/* サンプルデータ */
data temp.test;
  length char $5;
  do i=1 to 50;
    char=' '||byte(64+i)||' ';
    output;
  end;
run;
/* PWでパスワードを指定 */
data temp.pw(pw=abc);
  set temp.test(firstobs=2);
run;
/* READ、WRITE、ALTERパスワードを別々に指定 */
data temp.rwa(read=a write=b alter=c);
  set temp.test(firstobs=4);
run;

/* パスワード+暗号化 */
data temp.enc(pw=abc encrypt=yes);
  set temp.test(firstobs=6);
run;

/* 圧縮 */
data temp.cmp(compress=yes);
  set temp.test(firstobs=7);
run;

/* フォーマット確認 */
data temp.fmt;
length char $10;
format 
time time8.
yymmdd yymmdd10.
e8601dt e8601dt19.
date date9.
weekdate weekdate21.
nengo nengo9.
jnengo jnengo16.
jdateymd jdateymd14.
datetime datetime16.
yen yen8.
dollar dollar12.2
comma comma7.
z z7.
hex hex6.
best12 best12.
best32 best32.
;
  array n{*} _numeric_;
  do i=1 to dim(n);
    n{i}=10000;
  end;
  char='SAMPLE';
  best12=1234567890.1234567;
  best32=1234567890.1234567;
  drop i;
run;
最後に、DelphiF9実行し、動作を確認します。
  • 相変わらず、パスワードは無視してくれます。
f:id:japelin:20211019004016p:plain
パスワードをつけたデータセット
  • 圧縮データセットは正しくアクセスできるようになりました
f:id:japelin:20211019004120p:plain
圧縮データセット
f:id:japelin:20211019004217p:plain
暗号化データセットに対してはエラーメッセージが出る

続いて、SQLを実行してみます。
FDConnectionのSQLタブから

create table NEWDS (name VARCHAR(20), age INT);

で新しいデータセットを作成し、

insert into NEWDS (name,age) values ('Taro',30),('山田',31);

でobsを追加し、

update NEWDS set name='' where age=30;

でupdatぉぉ…
f:id:japelin:20211019004640p:plain
同じエラーです。


やっぱり対応してないんですね。(deleteも同じでした)

ちゃんちゃん。