0

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

有任何想法吗?

干杯

4

2 回答 2

1

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

代码

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

按名称排序

第二个电话显示了这一点:

在此处输入图像描述

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

在此处输入图像描述

我希望这有帮助!:)

于 2015-12-24T08:21:17.503 回答
0

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

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

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对文件列表进行排序

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;
于 2015-12-24T09:38:03.033 回答