どのフォルダにドキュメントが格納されているかを知る @WhichFolders
自分の使っているLotus Notes 8.5.1のメールで「All Documents」にフォルダ情報が表示されているのが不思議で、Designerで($All) view を開いてみたら「Folder」columnに@WhichFolders ってのが記載されていました。
@WhichFoldersなんて便利なコマンドあったっけ?と思ってググってみました。
Knowing which folder a document is in – @WhichFolders
Steve Castledine 8 September 2008 09:28:53
Sometimes people don’t see the release notes (I’m not saying this is definitely in them), or new formula etc can be forgotten, but a nice new formula in 8.5 was @WhichFolders which can be used to determine, surprisingly, which folder the current document is in.
To see it in action, it was added to the mail template, all documents view.
Funny, I’m not even sure this made it into the designer help db, I will have to check.
Lotus Notes 8.5から出来たFormula だったんですね。
しかもドキュメントにはなっていないみたい。 隠しコマンド?
ちなみに、@WhichFolders を調べているときに発見した別のブログ「Interesting undocumented formulas」( http://lotus-blogs.blogspot.com/2009/01/interesting-and-undocumented-formulas.html )
にもいろいろと紹介されています。
さて、こんな便利なコマンドが@Formulaには用意されたみたいなんですが、自分への命題は「Lotus Notes C API」を使って同等の機能を実装できるか?
これが、簡単なようで上手くいかない。 IMAPコマンドをメールDBに対して掛けてやると$FolderRefが埋め込まれるのでこれによってフォルダ階層を割り出すことが可能になるのだが、もうちょっとスマートな方法を模索中・・・
と、またまた、ためにならない投げっぱなしな投稿でおわり。
ktatsuki
ケートリック株式会社 CEO & CTOをしています。
Notes/Dominoの開発を得意としますが、 C++ / Java / PHP / Javascript などの言語を使ってWEBアプリ、iPhone / Android アプリ開発などをしたりします。
XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。
I am owner of KTrick Co., Ltd. and Notes/Domino developer. HCL Ambassador (IBM Champion for 2015 - current). I am interested in web application development and preferred languages are Notes/Domino, C++ / Java / PHP / Javascript.
Related Posts
4 Comments
Add comment Cancel reply
This site uses Akismet to reduce spam. Learn how your comment data is processed.
はじめまして、日本でdominoを使用して開発しておりますものです。失礼かと存じますが
書き込みをさせていただきました。実はNotes CAPIを使用してユーザー登録を使用としているのですが
うまくいきません。(バージョン等関係なくです)
ローミングの設定をすると、エラーで落ちてしまいます。
なにかご存知でしたら教えていただけたら幸いです。
REGNewPerson関数でローミングの引数を指定するとエラーとなります。
はじめまして、
残念ながらREGNewPerson関数を使ったことは未だないです。
関数からエラーSTATUSが返される前に落ちてしまうということだと思うのですが、こういうのが一番難しいですよね。
REG_ROAMING_INFO構造体をREG_PERSON_INFO構造体で指定しているってことだと思ったので、リファレンスをちょっとみてみたんですが
This structure defines roaming registration information for the REGNewPerson function. The entire structure must be initialized to zero.
The fields in the structure are (all fields that are not used must be NULL/O):
という注意書きが書いてあるので、ちゃんと構造体をゼロリセットしているか確認してみてはいかがでしょうか?
すいません、これぐらいしかアドバイスできること思い浮かばないです(><)
Virukeさん、ご親切に回答ありがとうございます。
ゼロリセットしています。
こういう書き込みを行ってもいいのかわかりませんが
以下、ソースです。本当にすみません。
あつかましいのは重々、承知です。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LOGFILE “c:\temp\testperson.log”
#define ORG_CERT_ID “c:\Program Files\IBM\lotus\notes704\data\cert.id”
#define PASSWORD “password01”
#define ORG_CERTNAME “XXXX”
#define MIN_PASS_LEN 3
FILE *fp;
int RegPerson();
void LNCALLBACK REGCallback (char far *msg);
STATUS GetCertCtx (char far *pCertFile, HCERTIFIER *phCertCtx, char far *szPassword);
void PrintAPIError (STATUS api_error);
void GetTime(char * ct);
int main(int argc, char *argv[])
{
int val = 0;
if (fopen_s(&fp, LOGFILE, “a”)) {
printf(“File Open Error”);
return (1);
}
val = RegPerson();
fclose(fp);
return val;
}
int RegPerson()
{
REG_ID_INFO IDInfo = {0,0,0,0,””,0,0,0,0,0,0,0,0};
REG_MAIL_INFO_EXT MailInfoExt = {0,0,0,0,0,””,””,””,””,””,0,0,0,0,0,0,0,0,0,0};
REG_ROAMING_INFO RoamingInfo = {0,””,””,0,0,0,0,0,0,0,0,0,0,0,0};
REG_MISC_INFO MiscInfo = {0,””,””,””,0,0,0,0,0,0,0,0};
REG_PERSON_INFO PersonInfo = {0,””,””,””,””,””,””,””,””,””,0,0,””,””,””,””,””,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//REG_MAIL_INFO_EXT *MailInfoExt;
//REG_PERSON_INFO *PersonInfo;
STATUS error; /* return code from API calls */
char *DbServer = “idm-test01/XXXX”;
char *IDFileName = “c:\Program Files\IBM\lotus\notes802\data\test7.id”;
char FullDBPath[MAXPATH];
REGSIGNALPROC signalstatus = NULL;
HCERTIFIER hCertCtx;
//DBHANDLE hNABook;
void *spare = NULL;
FullDBPath[0] = ”;
if (error = NotesInit()) {
PrintAPIError(error);
return (1);
}
if (error = GetCertCtx(ORG_CERT_ID, &hCertCtx, PASSWORD)) {
PrintAPIError(error);
NotesTerm();
return (1);
}
//IDInfo
memset(&IDInfo, 0x00 ,sizeof(REG_ID_INFO));
IDInfo.Size = sizeof(REG_ID_INFO);
IDInfo.KeyWidth = 0;
IDInfo.PasswordKeyWidth = 0;
IDInfo.Type = KFM_IDFILE_TYPE_ORG;
IDInfo.FileName = “c:\Program Files\IBM\lotus\notes802\data\test7.id”;
//MailInfo
memset(&MailInfoExt, 0x00 ,sizeof(REG_MAIL_INFO_EXT));
MailInfoExt.Size = sizeof(REG_MAIL_INFO_EXT);
MailInfoExt.pMailServerName = DbServer;
MailInfoExt.DbQuotaSizeLimit = 100000;
MailInfoExt.pMailFileName = “mail\MTest7.nsf”;
MailInfoExt.pMailTemplateName = “mail7.ntf”;
MailInfoExt.MailSystem = 0;
//MailInfoExt = malloc(sizeof(REG_MAIL_INFO_EXT));
//memset(MailInfoExt, 0x00 ,sizeof(REG_MAIL_INFO_EXT));
//MailInfoExt->Size = sizeof(REG_MAIL_INFO_EXT);
//MailInfoExt->pMailServerName = DbServer;
//MailInfoExt->DbQuotaSizeLimit = 100000;
//MailInfoExt->pMailFileName = “mail\MTest7.nsf”;
//MailInfoExt->pMailTemplateName = “mail7.ntf”;
//MailInfoExt->MailSystem = 0;
//RoamingInfo
memset(&RoamingInfo, 0x00 ,sizeof(REG_ROAMING_INFO));
RoamingInfo.Size = sizeof(REG_ROAMING_INFO);
RoamingInfo.ServerName = NULL;
RoamingInfo.SubDirectory = “aaa”;
RoamingInfo.OnDuplicate = REG_FILE_DUP_OVERWRITE;
RoamingInfo.CleanupPeriod = 0;
RoamingInfo.CleanupSetting = REG_ROAMING_CLEANUP_NEVER;
//MiscInfo
memset(&MiscInfo, 0x00 ,sizeof(REG_MISC_INFO));
MiscInfo.Size = sizeof(REG_MISC_INFO);
MiscInfo.Comment = “Test”;
MiscInfo.LocalAdminName = “idm administrator/XXXX”;
MiscInfo.Location = “Internet”;
//PersonInfo
memset(&PersonInfo, 0x00 ,sizeof(REG_PERSON_INFO));
PersonInfo.Size = sizeof(REG_PERSON_INFO);
PersonInfo.FirstName = “M”;
PersonInfo.LastName = “Test7”;
PersonInfo.ShortName = “MTest7”;
PersonInfo.ProfileName = “”;
PersonInfo.OrgUnit = ORG_CERTNAME;
PersonInfo.AlternateName = “”;
PersonInfo.AltLanguage = “”;
PersonInfo.AltOrgUnit = “”;
PersonInfo.InternetAddress = “”;
PersonInfo.MiddleName = “”;
PersonInfo.PreferredLanguage = “”;
PersonInfo.Password = “12345678”;
PersonInfo.PasswordQuality = 8;
PersonInfo.Flags = fREGCreateAddrBookEntry;
PersonInfo.FlagsExt = fREGExtRoamingUserNow;
PersonInfo.MailInfo = &MailInfoExt;
PersonInfo.IDInfo = &IDInfo;
PersonInfo.MiscInfo = &MiscInfo;
PersonInfo.RoamingInfo = &RoamingInfo;
//PersonInfo = malloc(sizeof(REG_PERSON_INFO));
//memset(PersonInfo, 0x00 ,sizeof(REG_PERSON_INFO));
//PersonInfo->Size = sizeof(REG_PERSON_INFO);
//PersonInfo->FirstName = “M”;
//PersonInfo->LastName = “Test7”;
//PersonInfo->ShortName = “MTest7”;
//PersonInfo->ProfileName = “”;
//PersonInfo->OrgUnit = ORG_CERTNAME;
//PersonInfo->AlternateName = “”;
//PersonInfo->AltLanguage = “”;
//PersonInfo->AltOrgUnit = “”;
//PersonInfo->InternetAddress = “”;
//PersonInfo->MiddleName = “”;
//PersonInfo->PreferredLanguage = “”;
//PersonInfo->Password = “12345678”;
//PersonInfo->PasswordQuality = 8;
//PersonInfo->Flags = fREGCreateAddrBookEntry | fREGCreateDesktopClient;
//PersonInfo->FlagsExt = fREGExtRoamingUserNow;
//PersonInfo->MailInfo = MailInfoExt;
//PersonInfo->IDInfo = &IDInfo;
//PersonInfo->MiscInfo = &MiscInfo;
//PersonInfo->RoamingInfo = &RoamingInfo;
//PersonInfo->MailInfo = NULL;
//PersonInfo->IDInfo = NULL;
//PersonInfo->MiscInfo = NULL;
//PersonInfo->RoamingInfo = NULL;
error = REGNewPerson(hCertCtx, DbServer, &PersonInfo, ®Callback, FullDBPath, NULL);
/* Free the certifier context */
SECKFMFreeCertifierCtx (hCertCtx);
//free(MailInfoExt);
//free(PersonInfo);
if (error) {
PrintAPIError(error);
NotesTerm();
return (1);
}
NotesTerm();
return (0);
}
void LNCALLBACK REGCallback (char far *msg)
{
char out[200];
time_t timer;
char ct[50];
struct tm t_st = {0,0,0,0,0,0,0,0,0};
/* 現在時刻の取得 */
time(&timer);
/* 現在時刻を構造体に変換 */
localtime_s(&t_st, &timer);
sprintf_s(ct, sizeof(ct), “%d/%2.2d/%2.2d-%2.2d:%2.2d:%2.2d”,t_st.tm_year+1900, t_st.tm_mon+1, t_st.tm_mday, t_st.tm_hour, t_st.tm_min, t_st.tm_sec);
OSTranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, msg, strlen(msg), out, sizeof(out));
/* Print it. */
fprintf_s(fp, “%s –> %sn”, ct, out);
fflush(fp);
}
STATUS GetCertCtx (char far *pCertFile, HCERTIFIER *phCertCtx, char far *szPassword)
{
TIMEDATE ExpDate;
STATUS error;
char CertName[MAXSPRINTF];
BOOL IsHierarchical;
WORD FileVersion;
KFM_PASSWORD KFMPassword, *pKFMPassword; /* encoded password */
OSCurrentTIMEDATE(&ExpDate);
/* set the expiration date to two years from today (Domino and Notes default) */
error = TimeDateAdjust(&ExpDate, 0, 0, 0, 0, 0, 2);
if (error) return (error);
/* get the encoded password */
if (szPassword == NULL) {
pKFMPassword = NULL;
} else {
pKFMPassword = &KFMPassword;
SECKFMCreatePassword (szPassword, pKFMPassword);
}
/* get the certifier context */
error = SECKFMGetCertifierCtx (
pCertFile, /* Certifier file path spec */
pKFMPassword, /* encoded password */
“certlog.nsf”, /* certifier log */
&ExpDate, /* expiration date */
CertName, /* returned name of certifier */
phCertCtx, /* returned handle to certifier context */
&IsHierarchical, /* returned TRUE if certifier is hierarchical */
&FileVersion); /* returned file version */
return (error);
}
void PrintAPIError (STATUS api_error)
{
STATUS string_id = ERR(api_error);
char error_text[200];
char error_out[200];
WORD text_len;
char ct[50];
/* 現在時刻の取得 */
GetTime(ct);
/* Get the message for this Lotus C API for Domino and Notes error code
from the resource string table. */
text_len = OSLoadString (NULLHANDLE,
string_id,
error_text,
sizeof(error_text));
OSTranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, error_text, sizeof(error_text), error_out, sizeof(error_out));
/* Print it. */
fprintf_s(fp, “%s –> %sn”, ct, error_out);
}
void GetTime(char * ct)
{
time_t timer;
struct tm t_st = {0,0,0,0,0,0,0,0,0};
/* 現在時刻の取得 */
time(&timer);
/* 現在時刻を構造体に変換 */
localtime_s(&t_st, &timer);
sprintf_s(ct, 50, “%d/%2.2d/%2.2d-%2.2d:%2.2d:%2.2d”,t_st.tm_year+1900, t_st.tm_mon+1, t_st.tm_mday, t_st.tm_hour, t_st.tm_min, t_st.tm_sec);
}
Hello,
i have tried your code example and faced the problem that the server crahes, eve if i set all values of the structures inside structures to zero/null. Did you find a way to use the RegNewPerson function until now?
I need it for the IDInfo KeyWidth, i have to set it to 630 Bits, custom Lotusscript-functions don’t work, so i made a dll of your code.
I would be very happy to get help from you.
Greetings
Dirk
(from germany writing in english, so excuse my bad english)