Delphi XE6とExcel2013の組み合わせで開発していますが、Excelのタイプライブラリが取り込めません。以前は、この「EXCEL2010を操作してみる」の解説どおりできていたのですが、バージョンがあがったためか, いつのころからか、登録済みのタイプライブラリに含まれなくなっていました。
事情は良くわからぬものの、"C:\Program Files (x86)\Embarcadero\Studio\14.0\OCX\Servers\Excel2010.pas" をプロジェクトに追加して騙しだましでビルドしています。
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
2014年5月3日土曜日
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
バージョン情報の取得や、Enterprise GuideのOLE Automationなど確認するものがいくつかあります。
Delphi XE6 Professional
TMS Component Pack
2014年4月22日火曜日
Enterprise Guide 6.1 とVBAの組み合わせでエラー
2014年3月9日日曜日
分析の本番環境
意外とアクセス数があったので、記事を加筆、修正します。
分析とかリスク計算に携わるお客様からよく相談されるのがテスト環境、本番環境のことです。システム部門からすると、本番環境だけしかないのは信じがたく、分析者から見るとなんで本番環境を構えるかわからないことがままあります。
そのギャップを理解しないまま、システム統制に従うと色々苦労が絶えません。設計書ありません、テストケースありませんというのは、アドホックな分析を生業としている人には普通のことです。未知なる数値、ロジックを追い求めるときに設計書作ってレビューなんてしません。
大概、システム統制をかけようとしてユーザから情報システム部へ引き渡すときに問題が生じます。プログラムやデータ資産の範囲が不明確、計算のパラメータはテストすることなく都度修正、計算結果は回してみないと業務で使えるかどうかわからない、テストケースが無い等々、情報システム部にとっては腹の立つことばかりです。
システムとして統制効かせたり、定型化して業務とリンクさせるときには、環境を分けて実装しなおすのが良いです。この設計を起こして、実装をやり直すというのが、あまり理解されていないと感じます。分析環境で書かれたドキュメントのないコードを、そのまま本番環境に放り込んでというのは、最初の1年ぐらいは持つかもしれません。
数年たって立ち往生しそうなシステムの手当てを、SAS Log Utilityを使って何回か引受けています。
分析とかリスク計算に携わるお客様からよく相談されるのがテスト環境、本番環境のことです。システム部門からすると、本番環境だけしかないのは信じがたく、分析者から見るとなんで本番環境を構えるかわからないことがままあります。
そのギャップを理解しないまま、システム統制に従うと色々苦労が絶えません。設計書ありません、テストケースありませんというのは、アドホックな分析を生業としている人には普通のことです。未知なる数値、ロジックを追い求めるときに設計書作ってレビューなんてしません。
大概、システム統制をかけようとしてユーザから情報システム部へ引き渡すときに問題が生じます。プログラムやデータ資産の範囲が不明確、計算のパラメータはテストすることなく都度修正、計算結果は回してみないと業務で使えるかどうかわからない、テストケースが無い等々、情報システム部にとっては腹の立つことばかりです。
システムとして統制効かせたり、定型化して業務とリンクさせるときには、環境を分けて実装しなおすのが良いです。この設計を起こして、実装をやり直すというのが、あまり理解されていないと感じます。分析環境で書かれたドキュメントのないコードを、そのまま本番環境に放り込んでというのは、最初の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;
登録:
投稿
(
Atom
)






