【问题标题】:List of files from a directory ordered by date按日期排序的目录中的文件列表
【发布时间】:2016-03-30 02:37:09
【问题描述】:

如何从 NAV 中按日期排序的目录中获取文件列表? 我不能使用 File 虚拟表,因为没有日期键。 我尝试过使用 DotNet,但实现 IComparer 接口对我来说太复杂了。

有什么想法吗?

干杯

【问题讨论】:

    标签: microsoft-dynamics dynamics-nav dynamics-nav-2013 dynamics-nav-2015


    【解决方案1】:

    作为一种技术含量低的解决方案(即不需要任何外部组件),如何创建一个临时文件记录变量来缓冲文件记录,使用文件日期和时间字段的可排序字符串表示填充路径字段合并成一个日期时间? [请忽略那个 PAGE.RUN - 那里只是为了调试目的。]

    在我的机器上,第一次调用 ShowFileOrder 会显示:

    第二次调用显示:

    这就是文件在 Windows 资源管理器中的样子:

    我希望这会有所帮助! :)

    【讨论】:

    • 嗨@uncommonsense,这也是我所做的。谢谢!
    【解决方案2】:

    File 表的键到底有什么问题?据我所见,日期和时间都是可排序的。于 2015 年导航测试。

    无论如何,如果你真的想用 .net 来做,这里就是例子。基表是File。页面属性SourceTableTemporary = Yes。将所有文件信息获取到 arrey 后,您可以使用它并按照您喜欢的方式对其进行排序。 或者你可以用数组中的值填充临时文件表并使用setcurrentkey哈哈

    di  DotNet  System.IO.DirectoryInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
    fi  DotNet  System.IO.FileSystemInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    arr DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    i   Integer     
    
    di := di.DirectoryInfo('c:\Temp\Tmp');
    //arr.CreateInstance(GETDOTNETTYPE(fi),1); //not needed
    arr := di.GetFileSystemInfos();
    for i := 0 to arr.Length-1 do
     begin
      fi := arr.GetValue(i);
      Name := fi.Name;
      evaluate(Date, format(fi.LastWriteTime,8,1));
      insert;
     end;
    

    或者您甚至可以使用.Net 列出sort 文件列表

    di  DotNet  System.IO.DirectoryInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
    fi  DotNet  System.IO.FileSystemInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    arr DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    arrKey  DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    i   Integer     
    TYPE    DotNet  System.Type.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
    MethodInfo  DotNet  System.Reflection.MethodInfo.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    Parameters  DotNet  System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
    Object  DotNet  System.Object.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
    
    di := di.DirectoryInfo('c:\Temp\Tmp');
    arr := di.GetFileSystemInfos();
    fi := arr.GetValue(0);
    arrKey := arrKey.CreateInstance(GETDOTNETTYPE(fi.LastWriteTime), arr.Length);
    FOR i := 0 TO arr.Length-1 DO
     BEGIN
      fi := arr.GetValue(i);
      arrKey.SetValue(fi.LastWriteTime, i);
     END;
    
    TYPE := GETDOTNETTYPE(arr);
    MethodInfo := TYPE.GetMethods().GetValue(80);
    Parameters := Parameters.CreateInstance(GETDOTNETTYPE(Object),2);
    Parameters.SetValue(arrKey,0);
    Parameters.SetValue(arr,1);
    MethodInfo.Invoke(TYPE, Parameters);
    
    FOR i := 0 TO arr.Length-1 DO
     BEGIN
      fi := arr.GetValue(i);
      MESSAGE(FORMAT(fi.LastWriteTime()));
     END;
    

    【讨论】:

    • 该问题(也)被标记为“NAV2013”​​;在那个版本中,SETCURRENTKEY() 仍然需要一个现有的表键。 :-)
    • @uncommonsense 这是真的。
    • 嗨@MakSim,感谢您的回答,但是,您已经说过它可以按任何字段排序:是的,它在 RTC 中,但不在代码中。我会试试你的第二个答案。谢谢
    • @MakSim 没有 dotnet 怎么办? Nav 2009 SP1 不支持 dotnet interop,并且文件表在 2009 SP1 中不适用于共享文件夹/UNC 路径(已确认错误)
    • @MarkSim 没关系,我为此任务使用了 Windows 脚本主机自动化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2010-09-15
    相关资源
    最近更新 更多