• 读取Info内容


    后记:
    最近发现其实AX里的类Info已经提供了相应的静态方法infoCon2Str来实现这个功能,所以可以直接调用这个方法去实现本文所说的功能,本文不看也罢。
    AX用Infolog去管理用户操作中的出错或者提示信息,最后用SysInfologBrowser这个窗体去展现,但如果通过.NET Business Connector之类的去调用AX的系统类就不可能用这种方法了,因为不可能将窗体通过.NET Business Connector去展现,如果想知道调用的系统类到底发生了什么事情,可以把Infolog的内容转换成字符串返回给调用者。
    窗体SysInfologBrowser的数据是通过类info的viewBuild来构造的,所以可以把这个方法简化一下,返回一个字符串,在Global中添加一个静态方法:

    static str viewBuildExpress(InfologData _data)
    {
        SysInfologMessageStruct logLine;

        
    int                  i = 1, j;
        Exception            exception;

        
    int                  parentId;

        TmpInfolog           tmpLookup;
        str                  returnValue;

        
    int                  oldParentId;
        
    int                  seq = 0;

        str                  splitStr 
    = '';
        TmpInfoLog           tmpInfoLog;
        SysInfologEnumerator 
    enum = SysInfologEnumerator::newData(_data);


    TmpInfolog selectInfolog(SysInfologPrefix _prefix, 
    int _parentid)
    {
        TmpInfolog tmpinfolog2;
        tmpinfolog2.setTmpData(tmpInfoLog);

        select tmpinfolog2
            
    where tmpinfolog2.Parent == _parentid   &&
                  tmpinfolog2.Prefix 
    == _prefix;

        
    if (tmpinfolog2)
            
    return tmpinfolog2;
        
    return null;
    }


        
    if (conlen(_data)==0)
            
    return '';

        
    enum.reset();
        
    enum.moveNext();
        logLine  
    = SysInfologMessageStruct::construct(enum.currentMessage());
        tmpInfoLog.recordLevelSecurity(
    true);
        
    enum.reset();
        i 
    = 1;
        
    while (enum.moveNext())
        
    {
            logLine  
    = SysInfologMessageStruct::construct(enum.currentMessage());
            exception 
    = enum.currentException();

            parentId 
    = 1;   //header has id = 1

            
    for (j=1; j<=logLine.prefixDepth(); j++)
            
    {
                tmpLookup.setTmpData(tmpInfoLog);
                tmpLookup 
    = selectInfolog(logLine.preFixTextElement(j), parentid);

                
    if (tmpLookup)
                
    {
                    parentId 
    = tmpLookup.Seq;
                }

                
    else
                
    {
                    tmpInfoLog.Name         
    = logLine.preFixTextElement(j);
                    tmpInfoLog.Parent       
    = parentId;
                    tmpInfolog.Prefix       
    = tmpInfolog.Name;
                    tmpInfolog.ConIdx       
    = j;
                    seq
    ++;
                    tmpInfoLog.Seq          
    = seq;
                    tmpInfoLog.insert();
                    parentId                
    = tmpInfoLog.Seq;
                }

            }

            
    if (parentId != oldParentId)
            
    {
                oldParentId 
    = parentId;
            }


            tmpInfoLog.Parent   
    = parentId;
            seq
    ++;
            tmpInfoLog.Seq      
    = seq;
            tmpInfoLog.Name     
    = logLine.message();
            tmpInfoLog.doInsert();
        }


        
    while select * from tmpInfoLog
        order by seq
        
    {
            splitStr 
    = '';
            
    for(i=1;i<=tmpInfolog.ConIdx;i++)
            
    {

                splitStr 
    += '\t';
            }

            returnValue 
    += splitStr + tmpInfolog.Name;
            returnValue 
    +='\n';
        }

        
    return returnValue;



    }
    调用示例:
    static void viewBuildExpressTest(Args _args)
    {
        InfologData             data;
        
    int                     beforeLine,endLine;
        InventJournalTable      inventJournalTable 
    = InventJournalTable::find('000079_061');
        InventJournalCheckPost  journalCheckPost   
    = InventJournalCheckPost::newPostJournal(inventJournalTable);
        SalesFormLetter         salesFormLetter 
    = SalesFormLetter::construct(DocumentStatus::PackingSlip);
        SalesTable              salesTable;
        ;

        select 
    * from salesTable
        
    where salesTable.SalesId == '00415_036';
        
    try
        
    {
            beforeLine 
    = infolog.line()+1;
            journalCheckPost.run();
            salesFormLetter.update(salesTable);
            endLine     
    = infolog.line()+1;
            box::info(Global::viewBuildExpress(infolog.copy(beforeLine,endLine)));

        }

        
    catch
        
    {
            endLine     
    = infolog.line()+1;
            box::info(Global::viewBuildExpress(infolog.copy(beforeLine,endLine)));
        }


    }

  • 相关阅读:
    利用栈进行表达式的求值
    最近的一些安排
    一点碎语
    POJ 1008
    目前的进度~
    算是一个决定吧~
    C语言知识点注意事项分类整理[不定期更新]
    一年多了,该回来了……
    真悲剧
    google面试题一道
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/1172938.html
Copyright © 2020-2023  润新知