存档

2010年10月 的存档

通过SQL Script组合G/L Entry和Ledger Entry Dimension

2010年10月28日 没有评论

在这里主要是用到SQL的游标控制,能够非常方便的进行Script的循环操作。

而对于Navision,对于G/L Entry的维在Ledger Entry Dimension中存储,实际本身不存储。

DECLARE @Dim varchar(50)
DECLARE @SQLScript varchar(8000)
DECLARE @CompanyPrefix varchar(50)
SET @CompanyPrefix=’CRONUS’
Declare cursor1 cursor for
Select Code from dimension
where Code in
(select Distinct [Dimension Code] from [dimension value])
SET NOCOUNT ON;
Set @SQLScript =’select top 1000 [Entry No_],[G_L Account No_],[Posting date],[Document No_],Description,’
open cursor1
fetch next from cursor1 into @Dim
while @@FETCH_STATUS=0
begin
set @SQLScript=@SQlscript+
‘(select [Dimension Value Code] from [‘+@CompanyPrefix+’$Ledger Entry Dimension] where [Table ID] =17 AND [Entry No_] = GLEntry.[entry No_] AND [Dimension Code] = ‘+””+@Dim+””+
‘) as Dim_’+@Dim+’, ‘
fetch next from cursor1 into @Dim
end
close cursor1;
DEALLOCATE cursor1;
set @SQLScript=@SQLScript+’ Amount from [‘+@CompanyPrefix+’$G_L Entry] GLEntry’
print @SQLScript

EXEC (@SQLScript)

对上面语句稍加改造,生成一个新表,每隔1段时间更新,就可以得到一个对于科目+维分析的总表。

同样,也可以把 Item Ledger Entry / Value Entry 等与Ledger Entry Dimension组合得到结果。

在Navision中创建并使用Access Mdb.

2010年10月27日 没有评论

在Navision中,提供了Automation 自动化访问控件,所以能很方便的与Access MDB连接。

1. 如果数据库不存在,则使用’Microsoft ADO Ext. 2.8 for DDL and Security’.Catalog 创建数据库:

比如Adox 是’Microsoft ADO Ext. 2.8 for DDL and Security’.Catalog.

IF ISCLEAR(AdoX) THEN
  IF NOT CREATE(AdoX,TRUE) THEN
    ERROR(‘Ado Database Engineer is not start’);
IF NOT(FileExists(dbName)) THEN
  AdoX.Create(‘Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’+dbName)

2. 使用Adodb.Connection创建表:

IF ISCLEAR(Adodb_Conn) THEN

  IF NOT CREATE(Adodb_Conn,TRUE) THEN

    ERROR(‘Ado Database Engineer is not start’);
Adodb_Conn.ConnectionString:=’DRIVER={Microsoft Access Driver (*.mdb)};DBQ=’+dbName;
Adodb_Conn.Open;
Adodb_Conn.Execute(
‘Create Table [‘+TableName+’] (‘+
‘ [ID] integer,’+
‘ [Names] varchar(50)’+
‘);’
);
Adodb_Conn.Close;

3. 使用Adodb.Connection插入记录:

IF ISCLEAR(Adodb_Conn) THEN

  IF NOT CREATE(Adodb_Conn,TRUE) THEN

    ERROR(‘Ado Database Engineer is not start’);

Adodb_Conn.ConnectionString:=’DRIVER={Microsoft Access Driver (*.mdb)};DBQ=’+dbName;
Adodb_Conn.Open;
FOR i:=1 TO 1000 DO
  Adodb_Conn.Execute(‘Insert into test values (‘+FORMAT(i)+’,’+Chr(39)+’test’+Chr(39)+’)’);
Adodb_Conn.Close;

这是简单的在Navision中Adodb操作Access数据库的方式。

分类: C/AL 标签: , , ,

在终端登录上检查用户是否打开Navision及打开程序数

2010年10月25日 没有评论

采用下面的cmd+vbs可以实现,帮助IT部门同事监管在终端登录上当前用户是否运行Navision, 以及运行客户端数。

     首先,了解下终端登录的背景,终端登录是自采用RDP方式远程登录到Win2000/2003/2008的Server上,打开一个Session进行操作,整个操作过程中和本地客户机资源可以实现充分交换访问,如 本地文件夹访问,打印机调用等,同时使用的资源全是服务器资源,不论客户端是32Bit还是64Bit, 登录到服务器后使用的就是服务器的版本。

     比如,在终端服务器上安装了SQL Server+Navision Client,那么直接登录到终端服务器上使用Navision访问本地数据库,速度比起使用Navision Client在本地访问远端SQL Server快很多.

 

在终端服务器上,使用Tasklist 可以列出当前运行任务的Session. 采用下面的命令就可以列出当前用户使用:

tasklist /FI "imagename eq finsql.exe" /FI "USERNAME eq MBS%USERNAME%" /fo csv /NH

当前环境的域是MBS, 非域环境,去掉 MBS 使用下面的语句就可以了。

tasklist /FI "imagename eq finsql.exe" /FI "USERNAME eq %USERNAME%" /fo csv /NH

/fo 表示输出是csv格式   /NH表示不输出Header条,就是上方的字段名这一条。

如果当前在运行Navison,运行后得到的结果是:

"finsql.exe","3608","Console","0","28,836 K"

可以查看到 finsql.exe 正在运行中,3608是Session ID. 占用内存是28,836K

 

有了上面的命令,就配合vbs里面的WScript.exec执行批处理,将批处理的结果读取到vbs中进行处理。

TaskListCmd="tasklist /FI “&""""&"imagename eq finsql.exe"&""""&" /FI "&""""&"USERNAME eq %USERNAME%"&""""&" /fo csv /NH"

Set NavisionSessionList=Wsc.exec(TaskListCmd)

NavisionSessionBuffer=NavisionSessionList.StdOut.ReadAll()

NavisionSessionItems=split(NavisionSessionBuffer,VBCrlf)

i=0

For each NavisionSession In NavisionSessionItems

  If Instr(NavisionSession,"finsql")>1 Then i=i+1

Next

If i>0 Then

  msg="您已经打开了"&cstr(i)&"个Navision客户端,要继续打开吗?"

  If Msgbox(msg,vbyesno+vbinformation,"Warning")=vbyes Then

     wsc.run ‘用户坚持要再打开Navision客户端,则执行继续打开客户端的操作.’

Else

wsc.run ‘如果用户未打开任何客户端,就直接运行这个命名,比如navcmd’

End If

使用StdOut.ReadAll客户读取这个命令执行后的输出结果,使用VBCrlf可以将输出后的结果用回车符进行分隔,分隔后的内容就使用For Each来进行一条条的检查,检查结果就是对应的Navision运行客户端数。

也可以直接使用i=Ubound(NavisionSessionItems) 来取得finsql.exe的打开数

 

总结:通过上面的cmd运行可以做到仅检查当前用户的Navision运行数量,如果将下面的控制变成不运行再运行Navision, 则可以确保每个用户只运行一个Navision 客户端。节约License使用。

分类: Installation 标签:

关于Navision 里中文字符的问题.

2010年10月22日 没有评论

以下文章转自EdwardMao。感谢EdwardMao的共享。

 

现象: 我在一个Report里要把一个表里的一段Text的文字拿出来,结果不管是Preview还是Export到Excel,都会出现有些汉字变为另一个汉字:比如 "国"会变成 "冠".

Debug: Report用来存取这个表的变量是Code类型,而Table里的字段类型是Text, 只要把Report里的字段类型改为Text类型即可.

结论:double-byte类型字符在Code与Text中的转换会有一些信息缺失.

分类: C/AL 标签: ,

使用Automation在Navision中进行Base64解码

2010年10月18日 没有评论

使用下面的方法,可以在Navision中对 文字/文件等进行Base64解码。

使用到的组件如下:

Navision系统组件Automation ‘CG Request Client’.Base64

     Base64的解码功能 Decode(编码文件名, XML节点)

Ado组件Stream. ‘Microsoft ActiveX Data Objects 2.6 Library’.Stream

XML组件 ‘Microsoft XML, v3.0’.DOMDocument

首先,将编码后的字符保存到文件中,比如保持为C:a.txt中.然后使用Stream.LoadFromFile读取内容。并将读取的内容放入DOM中,接着用Decode进行解码,解码后仍存入C:a.txt中。

Create(Stream);

Stream.Open;

Stream.LoadFromFile(‘C:a.txt’);

Create(XMLDoc);

XMLNode:=XMLDoc.CreateElement(‘jm’);

XMLNode.nodeTypedValue:=Stream.ReadText;

Stream.Close;

Base64.Decode(‘C:a.txt’,XMLNode);

读取界面后的C:a.txt就完成了。

分类: C/AL 标签: ,

在Navision中获取指定日期的可用BOM/Routing版本

2010年10月18日 没有评论

使用Navision的Codeunit 99000756 VersionManagement可以得到指定日期可用的BOM/Routing Version Code.

用法如下:

GetBOMVersion(BOMHeaderNo : Code[20];Date : Date;OnlyCertified : Boolean) : Code[10]

BOMHeaderNo:表示BOM的版本头编号

Date: 表示指定的日期期间,如Workdate

OnlyCertified: True表示只获取认证后的BOM版本,false表示不使用认证标志。

返回的是BOM的Version Code, 所以在程序中使用时可以直接用:

BOMLine.SetFilter("Version Code", versionMgt.GetBOMVersion("Code",Workdate,True));

 

GetRtngVersion(RoutingNo : Code[20];Date : Date;OnlyCertified : Boolean) : Code[10]

GetRtngVersion是返回Routing的Version Code, 和BOM Version的用法一致。

分类: C/AL, Manufacturing 标签:

Navision 2009 R2 C/SIDE环境新变化

2010年10月18日 没有评论

Navision 2009 R2版本MS预计在2010 Q4发行,下面来看看C/SIDE环境的新变化:

1. C/AL代码编辑器

在代码编辑中,语法高亮已经在Navision 2009中实现,那么这次2009 R2又带来什么新功能呢?

在对象上面点击鼠标右键,或者 查看菜单Goto Definition,如果对象是表,那么就会打开对应表的设计界面。

如果这里用的表的字段,则会打开对应表的设计界面,并定位到这个字段。

 

2. 锁定/解除锁定对象

在多个用户开发环境下,使用Navision 2009 R2进行开发可以实现Lock 对象,Lock对象后,会显示出是谁进行的锁定操作,那么进行代码编辑时就可以很好的避免出现覆盖现象了。

分类: C/AL, Installation 标签:

Navision菜单权限控制

2010年10月13日 没有评论

在Navision中,菜单权限分为2方面.

1. Role中设置,建议在Role中设置一个Public Role. 里面设置Menusuite 0的权限.

2. Menu Bar的权限设置,通过打开Navigation Pane Designer. 然后在每一个Menu Bar上右键,选择Assign Users.  对应的用户,比如 test1 需要用到这个Menu Bar. 就划上勾。 不需要使用,就去掉这个勾。

 

进行Menu权限划分后,用户到底最终能看到多少菜单呢?

1. Menu Bar,如果Assign Users中选中过test1用户,那么test1 用户就可以查看到Menu Bar.

2. Menu Bar中的项目,比如Table/Form/Report/DataPort/XMLPort/Codeunit这些Object,如果在角色权限分配中没有给予对应的权限. 那么在Menu Bar下面的详细Menu中是查看不到。

分类: Installation 标签: ,

实现Navision输出到Excel的4种方式

2010年10月13日 没有评论

要从Navision输出到Excel. 常用的有4种方案:

1. 使用T370或自己写XlsApp. 按照Range输出

2. 输出文本文件,采用file.createOutStream. 用"和,分割. 保存名字为csv, 然后Shell方式打开.

3. 输出为单独xml文件,采用file.createoutstream. 文件结构和Excel保存的xml格式结构保持一致。然后打开xml. 就会用Excel打开了. 在里面可以保存图片/设置格式等.

4. 输出为2个文件, xsd和xml.  xsd定义结构. xml里面像csv一样保存数据. 然后打开Excel. 采用xPath方式调入xsd和xml.

 

4种方法的优势与区别是:
第一种简单,好用,可以设置格式,速度慢
第二种简单,好用,速度最快,但格式最差,内容基本很难看
第三种复杂,好用,可以设置格式,速度排第三名
第四种非常复杂,不太好用,勉强可以设置格式,速度排第二名

分类: C/AL 标签: ,

控制Navision用户菜单权限

2010年10月12日 没有评论

下面以Windows环境为例,控制Navision中的用户菜单权限。

首先 建立Windows帐户 Template Account No. ,设定权限为所有菜单都不能访问。

然后在Table 2000000061 User Menu Level的Insert触发器中,编写下面的代码:

Template.SETRANGE(ID,’Template Account No.’);
Template.SETRANGE("ID Type","ID Type"::Windows);
Template.SETRANGE(Level,Level);
Template.FINDFIRST;
Template.CALCFIELDS(Object);
Template.Object.EXPORT(‘C:temp.dat’,FALSE);
Object.IMPORT(‘c:temp.dat’,FALSE);
MODIFY;

 

上面的 C:temp.dat 可以自己调整为临时文件夹, “ID Type”::Windows 也可以调整为"ID Type"::Databse的。

 

完成以后,以后新建用户时,就可以自动分配为没有一个菜单,而不是Navision默认的所有菜单都可以用。

分类: Installation 标签: