2014年5月3日土曜日

Delphi XE6 + Excel2013のタイプライブラリ

Delphi XE6とExcel2013の組み合わせで開発していますが、Excelのタイプライブラリが取り込めません。以前は、この「EXCEL2010を操作してみる」の解説どおりできていたのですが、バージョンがあがったためか, いつのころからか、登録済みのタイプライブラリに含まれなくなっていました。


事情は良くわからぬものの、"C:\Program Files (x86)\Embarcadero\Studio\14.0\OCX\Servers\Excel2010.pas" をプロジェクトに追加して騙しだましでビルドしています。

SAS Option Report 1.3.0.6

SAS 9.4のバージョンアップ作業に備えて、SAS Option Reportを更新しました。
微妙に字句が変わっているので、以前のバージョンではうまく設定値を拾うことが出来ませんでした。字句定義を変えて、Delphi XE6でリビルドしています。


次もまた仕事で使うツール手直ししないといけません。
埃をかぶっているSRXはまた出番がありそうです。

2014年5月1日木曜日

Delphi XE6でバージョン情報を取得, GetFileVersionInfo

Delphi XE2に乗り換えてから、既存のコードでバージョン情報が取れなくなりました。気合を入れなおして、サンプルコードを探し出して修正しました。XE6でも動作確認取れました。

unit version;

interface

type
  TEXEVersionData = record
    CompanyName,
    FileDescription,
    FileVersion,
    InternalName,
    LegalCopyright,
    LegalTrademarks,
    OriginalFileName,
    ProductName,
    ProductVersion,
    Comments,
    PrivateBuild,
    SpecialBuild: string;
  end;

var
  theVersion: TEXEVersionData;

implementation

uses Windows, SysUtils, Forms;

procedure LoadVersionInfo;
type
  PLandCodepage = ^TLandCodepage;
  TLandCodepage = record
    wLanguage,
    wCodePage: word;
  end;
var
  dummy,
  len: cardinal;
  buf, pntr: pointer;
  lang, key: string;
begin
  len := GetFileVersionInfoSize(PChar(Application.ExeName), dummy);
  if len = 0 then
    RaiseLastOSError;
  GetMem(buf, len);
  try
    if not GetFileVersionInfo(PChar(Application.ExeName), 0, len, buf) then
      RaiseLastOSError;

    if not VerQueryValue(buf, '\VarFileInfo\Translation\', pntr, len) then
      RaiseLastOSError;

    lang := Format('%.4x%.4x', [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]);

    key := '\StringFileInfo\' + lang + '\CompanyName';
    if VerQueryValue(buf, PChar(Key), pntr, len) then
      theVersion.CompanyName := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\FileDescription';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.FileDescription := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\FileVersion';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.FileVersion := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\InternalName';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.InternalName := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\LegalCopyright';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.LegalCopyright := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\LegalTrademarks';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.LegalTrademarks := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\OriginalFileName';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.OriginalFileName := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\ProductName';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.ProductName := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\ProductVersion';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.ProductVersion := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\Comments';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.Comments := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\PrivateBuild';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.PrivateBuild := PChar(pntr);
    key := '\StringFileInfo\' + lang + '\SpecialBuild';
    if VerQueryValue(buf, PChar(key), pntr, len) then
      theVersion.SpecialBuild := PChar(pntr);
  finally
    FreeMem(buf);
  end;
end;

initialization
  LoadVersionInfo;

end.

Delphi XE6 + TMS Component Pack

開発環境を更新しました。
バージョン情報の取得や、Enterprise GuideのOLE Automationなど確認するものがいくつかあります。
Delphi XE6 Professional

TMS Component Pack


2014年4月22日火曜日

Enterprise Guide 6.1 とVBAの組み合わせでエラー

EG6.1とVBAの連携でエラーが出て調査中です。
SAS Enterprise Guide 6.1をEXCEL VBAから使おうとしていますが、何故かエラーが出ます。EG4.3だと問題なくオブジェクトを生成できます。同じことをDelphi XE2から実行しても class not registeredのエラーが出ます。

2014年3月9日日曜日

分析の本番環境

意外とアクセス数があったので、記事を加筆、修正します。

分析とかリスク計算に携わるお客様からよく相談されるのがテスト環境、本番環境のことです。システム部門からすると、本番環境だけしかないのは信じがたく、分析者から見るとなんで本番環境を構えるかわからないことがままあります。


そのギャップを理解しないまま、システム統制に従うと色々苦労が絶えません。設計書ありません、テストケースありませんというのは、アドホックな分析を生業としている人には普通のことです。未知なる数値、ロジックを追い求めるときに設計書作ってレビューなんてしません。

大概、システム統制をかけようとしてユーザから情報システム部へ引き渡すときに問題が生じます。プログラムやデータ資産の範囲が不明確、計算のパラメータはテストすることなく都度修正、計算結果は回してみないと業務で使えるかどうかわからない、テストケースが無い等々、情報システム部にとっては腹の立つことばかりです。


システムとして統制効かせたり、定型化して業務とリンクさせるときには、環境を分けて実装しなおすのが良いです。この設計を起こして、実装をやり直すというのが、あまり理解されていないと感じます。分析環境で書かれたドキュメントのないコードを、そのまま本番環境に放り込んでというのは、最初の1年ぐらいは持つかもしれません。

数年たって立ち往生しそうなシステムの手当てを、SAS Log Utilityを使って何回か引受けています。

2014年3月1日土曜日

マクロ %varlist

変数の値をカンマでつないだリストを作りマクロ変数にセットします。よく使う割りに忘れます。変数が数値でも文字型でも動くように修正しました。

/*
*++
* データセット(dsn)の変数(keep)をリストにして、マクロ変数(macvar)にセット
*--
*/
%macro varlist(dsn=, keep=, macvar=);
 %global &macvar;
 %local i dsid n type rc;
 %let i=;
 %let dsid=%sysfunc(open(&dsn,i));
 %let n=%sysfunc(varnum(&dsid,&keep));
 %let type=%sysfunc(vartype(&dsid,&n));
 %let rc=%sysfunc(close(&dsid));
 %let &macvar=;

 %if &type=C %then
  %do;
   /* 変数が文字型 */
   data _null_;
    set &dsn(keep=&keep) end=eod;
    length list $1024;
    retain list;

    if _n_ eq 1 then
     do;
      list = '"' || compress(&keep) || '"';
     end;
    else
     do;
      list = trim(list) || ',"' || compress(&keep) || '"';
     end;

    if eod eq 1 then
     do;
      call symput("&macvar", compress(list));
     end;
   run;

  %end;
 %else
  %do;
   /* 変数が数値型 */
   data _null_;
    set &dsn(keep=&keep) end=eod;
    length list $1024;
    retain list;

    if _n_ eq 1 then
     do;
      list = put(&keep, best.);
     end;
    else
     do;
      list = trim(list) || ',' || put(&keep, best.);
     end;

    if eod eq 1 then
     do;
      call symput("&macvar", compress(list));
     end;
   run;

  %end;
%mend;

%varlist(dsn=sashelp.class, keep=name, macvar=test);
%put test=&test;