自分の使っている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.

引用元: Knowing which folder a document is in – @WhichFolders.

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が埋め込まれるのでこれによってフォルダ階層を割り出すことが可能になるのだが、もうちょっとスマートな方法を模索中・・・

と、またまた、ためにならない投げっぱなしな投稿でおわり。

About ktatsuki

ktatsuki

ケートリック株式会社 代表をしています。 が、根っからのエンジニア脳です。 IBM Notes/Dominoの開発を得意としますが、 C++ / Java / PHP / Javascript などの言語を使ってWEBアプリ、iPhone / Android アプリ開発などをしたりします。 XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。 I am owner of KTrick Co., Ltd. and Notes/Domino developer. IBM Champion for 2015 - 2017. I am interested in web application development and preferred languages are Notes/Domino, C++ / Java / PHP / Javascript.

4 Comments

  1. otsuka

    はじめまして、日本でdominoを使用して開発しておりますものです。失礼かと存じますが
    書き込みをさせていただきました。実はNotes CAPIを使用してユーザー登録を使用としているのですが
    うまくいきません。(バージョン等関係なくです)
    ローミングの設定をすると、エラーで落ちてしまいます。
    なにかご存知でしたら教えていただけたら幸いです。

    REGNewPerson関数でローミングの引数を指定するとエラーとなります。

  2. ktatsuki
    Viruke

    はじめまして、
    残念ながら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):

    という注意書きが書いてあるので、ちゃんと構造体をゼロリセットしているか確認してみてはいかがでしょうか?
    すいません、これぐらいしかアドバイスできること思い浮かばないです(><)

  3. otuska

    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, &REGCallback, 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);

    }

  4. TheVega

    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)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です