存档

‘C/AL’ 分类的存档

NAV技巧之调试程序

2015年5月22日 评论已被关闭

Debug-2015

 

在NAV2015中, Debug调试时允许在我们按照记录变动设置断点. 这样可以非常方便的在程序对数据进行变动时. 获得此时的程序位置. 已经相应的调用过程.

 

在Classics for SQL中, 也有一个相似的技巧, 在我们日常过账时, 可能会遇到报错提示, 那么我们如何来最快的排查这些错误呢?

下面介绍排查步骤:

1.  启动Debugger\Active. 这样就可以对Error错误进行断点.

2. 在执行过账中报错时, 程序将自动打开调试器, 并定位到相应的报错位置.

3. 这时我们再启动一个NAV客户端或SQL Server. 查询相应的表记录, 如G/L Entry记录.  在最后面我们能看到本次过账过程已经提交到G/L Entry的记录值. 将这些数据复制出来并保存.

4. 返回到调试器中, 继续执行.

5. 这时我们再次查看G/L Entry, 会看到数据已经回滚. 刚才报错提交的记录已经不存在.

 

通过上面的排查步骤, 我们获得了程序已经提交的部分数据, 结合的调试方法, 我们可以迅速了解到程序的错误原因.

 

分类: C/AL 标签:

NAV中的过账组在程序上是如何运转的

2015年3月21日 评论已被关闭

在NAV中, 我们知道业务模块与财务模块的联系纽带是过账组. 那么过账组是如何运作的, 我们可否在过账组上进行开发实现自定义功能呢? 下面以销售业务的过账组运行进行分析和介绍.

 

1. 我们首先来看销售订单的过账过程. 发货与开发票的执行都指向Codeunit 80 Sales-Post.

2. 在Sales-Post中, 首先将当前过账单据通过PostItemJnlLine() 将当前过账行创建为物料日记账待过账行.

3.  接着运行ItemJnlPostLine()过账物料日记账行.  这时转入Codeunit 22 Item Jnl.-Post Line进行过账操作.

4. 这时重点看Codeunit 22中的InvtPost在过程PostInventoryToGL()中的执行. 这时我们看到系统已经完成Item Ledger Entry的创建, Value Entry的创建. 即将进入General Journal Line的创建. 这时系统应该会要去找寻相应的过账组了.

5. 切换到Codeunit 5802, 我们看到SetAccNo(), 这里就是一系列的存货/成本相关过账组来源.

6. 我们返回到Codeunit 80 Sales-Post中, 看接下来系统的FillInvPostingBuffer(), 这里可以查看到销售收入/折扣这些的过账组来源.

7. 经过上面5/6两个步骤, 系统已经完成General Journal Line的创建. 这时的General Journal Line基本结构如下:

行1/2, 成本借贷分录

行3, 销售收入科目

行4, 客户科目. (注意, 这里的行4 如同我们平时日记账记账中的科目类型=客户一样, 这里的客户编号等于当前客户号)

8. 接着在Codeunit 80中转到Codeunit 12 Gen. Jnl.-Post Line的GenJnlPostLine.RunWithCheck. 即总帐过账操作.

9. 在Codeunit 12 Gen. Jnl.-Post Line中, 行1/2/3, 已经指定科目, 即可自动生成相应的G/L Entry. 而行4, 则通过PostCust()过程获得相应的AR科目. 同时生成相应的Cust. Ledger Entry/ Detailed Cust. Ledg. Entry / G/L Entry.

10. 以上步骤执行完毕, 则相应的日记账分录生成完毕. 这时系统还将把Sales Header/Sales Line复制为相应的Sales Shipment Header/Sales Shipment Line. Sales Invoice Header/Sales Invoice Line.

 

Tips-利用内部错误, 实现禁止用户登录到NAV中的指定公司

2015年3月10日 评论已被关闭

NAV Classic版本中, 有时我们会遇到一些未知错误, 通常原因是相应的Object异常所致. 如使用了高版本的Object(NAV5.0 用了2009Object, 2009用了2013Object). 那么我们利用此未知错误, 可以构建一个特殊功能. 即拒绝用户登录到NAV中的指定公司.

下面介绍应用方法(场景: NAV5.0 Classic)

1. NAV2009中导出一个Report.  Report 26 Setup Checklist, 导入到当前NAV 5.0数据库中, 覆盖此Object.

2. User表或[Windows Login]表中增加Deny Company.  Code类型(250字符长度)

3. Codeunit 1 ApplicationManagementCompanyOpen()函数中增加代码.

isFound := False;

if User.[Deny Company]<>” THEN Begin

Comp.SetFilter(Name, User.[Deny Company]);

if Comp.find(‘-‘) Then Repeat

   isFound := (Comp.Name = COMPANYNAME);

Until Comp.Next=0 and isFound=True;

IF isFound THEN

BEGIN

  F.MsgBox(Text800,100,Text801,16);

  REPORT.RUN(26,FALSE,FALSE);

END;

END;

4. 完毕后, 关闭NAV, 并设置用户表的Deny Company.  即可看到, 当用户打开被拒绝访问的公司时, 系统会提示不允许登录. 然后提示系统执行了非法操作. 点击后确定后系统自动关闭并退出NAV.

分类: C/AL, System 标签:

使用sp_$ndo$loginproc禁止用户登录到NAV

2015年2月26日 评论已被关闭

在Navision – MSSQL版本中, 客户端在执行时首先会检查sp_$ndo$loginproc是否存在, 如果存在, 则会先执行此存储过程.

 

使用此存储过程, 可以在系统层面做到一些辅助操作, 如记录登录到系统中的用户和时间. 也可以拒绝用户登录.

 

如下存储过程, 用于拒绝用户登录.

–Copyright by Yeats. —

IF EXISTS (SELECT name FROM sysobjects

WHERE name = ‘sp_$ndo$loginproc’ AND type = ‘P’)

DROP PROCEDURE [sp_$ndo$loginproc]

GO

CREATE PROCEDURE [sp_$ndo$loginproc]

@appname VARCHAR(64) = NULL,

@appversion VARCHAR(16) = NULL

AS

BEGIN

DECLARE @uid AS VARCHAR(100),@message as VARCHAR(500)

set @uid=UPPER(SUBSTRING(SUSER_SNAME(),PATINDEX(‘%\%’,SUSER_SNAME())+1,100))

set @message=@uid+’ have been template deny login into navision system.’

IF EXISTS

(Select * from [Deny User Logins] where [UserID]=@uid and [Deny]=1)

RAISERROR (@message,11,1)

END

GO

GRANT EXECUTE ON [sp_$ndo$loginproc] TO public

GO

 

 

 

分类: C/AL, Installation 标签:

RapidStart导入包错误修复

2015年2月16日 评论已被关闭

Error-1

在NAV2013开始, 系统提供了RapidStart功能, 用以取代早期版本的Data Migration. 其基本原理和Data Migration相似.
但是此功能在备份和恢复方面由于使用了ZIP压缩, 并且恢复压缩包时采用了压缩包检测技术. 这样就造成在亚洲国家普遍使用时产生如上的错误截图.

博主在这里提供暴力修复方法.
打开Codeunit 8619, 定位到OpenFileAndInStream;
将下面的代码

EXIT((Text[1] = 31) AND (Text[2] = 239));

更改为

EXIT((Text[1] = 37) AND (Text[2] = 213));

然后就可以实现修复.

 

国外博文较多介绍的修复方法如下, 我们这里使用的是第二种暴力修复法.

We have found out that the problem was in Codeunit 8619 Config. Pckg. Compression Mgt. The function IsGZip did not return true in our case, although the file was created with the same database for NAV 2013.

The source of the problem was that the Windows Server, on which our NAV Server was installed, had Regional Settings for Language for non-Unicode programs set to “Serbian (Latin, Serbia and Montenegro (Former))”.

So we had two options to resolve the error.

First solution

This was simple as setting the Regional Settings for Language for non-Unicode programs set back to English (United States). After restarting the Windows Server the error was gone. I would recommend this solution wherever this setting does not interfere with other software installed on NAV Server.

Second solution

This solution is “not the best option” but it is focused on changing the IsGZip function in Codeunit 8619 Config. Pckg. Compression Mgt. so it returns TRUE after uploading file to NAV Server. I would not recommend this solution but if there are no other options then…

分类: C/AL, RTC 标签:

Nav中使用ADO将数据快速输出为txt格式

2015年1月30日 评论已被关闭

1. 将数据存储到mdb中, 或者直接使用Adodb连接到文本文件数据库

2. 使用下面的代码执行SQL.

sql := ”;
sql := sql + ‘Select ResxName’;
sql := sql + ‘ INTO [text;Format=Delimited(“|”);Database=C:\;CharacterSet=65001].[ab.txt]’;
sql := sql + ‘ from [CHS & ENU]’;
F.ExeCuteSQL(‘D:\Users\yxq1003\Documents\2013R2Translate.mdb’,sql);

上面的驱动必须要
Adodb_Conn.ConnectionString:=’Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’+dbName;

[text; 表示文件格式
Format=Delimited(|) 表示分隔符
HDR=Yes 表示是否输出标题
Database=C:\ 表示文件保存目录, 注意 \ 要使用\\作为分隔
CharacterSet=65001 表示UTF-8, 实际不起作用, 建议OEM
.[ab.txt] 表示文件名称, 即表名称

附: Schema.ini 文件

[ab.txt]
ColNameHeader=False
CharacterSet=OEM
TextDelimiter=|
Format=Delimited( )
MaxScanRows=0
DecimalSymbol=,
NumberDigits =3
NumberLeadingZeros=true
CurrencySymbol =$
CurrencyPosFormat=($1)
CurrencyDigits =2
CurrencyNegFormat =-$1
CurrencyThousandSymbol=,
CurrencyDecimalSymbol =.
DateTimeFormat=ddmmyyyy
Col1=ResxName LongChar Attribute 32

文件名
是否列标题
字符集
文本前后分隔符
字段分隔符, 可以设置为字段固定长度
最多获取记录数
小数点分隔符
小数位数
小数是否包含前面的0
货币符号
货币符号位置
货币数据小数位数
货币负数金额表示形式
货币千位分隔符
货币小数点风格
日期时间格式
列的信息 LongChar 表示长字符串 属性 字符长度

列信息可以使用的字符类型如下表
Parameter Description
ColumnName The text name of the column. If the column name contains embedded spaces, you must enclose it in double quotation marks.
type Data types are as follows:
Microsoft Jet data types
Bit
Byte
Short
Long
Currency
Single
Double
DateTime
Text
Memo
ODBC data types Char (same as Text)
Float (same as Double)
Integer (same as Short)
LongChar (same as Memo)
Date date format
Width The literal string value Width. Indicates that the following number designates the width of the column (optional for character-delimited files; required for fixed-length files).
# The integer value that designates the width of the column (required if Width is specified).

分类: C/AL 标签:

Navision 2013中RapidStart服务应用与Bug修复

2014年3月29日 评论已被关闭

在Navision 2013中, 开始启用了RapidStart服务, 用以取代2009/5.0版本中的Data Migration.
敏捷部署在整个系统实施周期中, 可以为快速搭建环境做准备. 如主数据导入/导出, 开账数据准备, 业务数据准备等. 在2013R2中, RapidStart服务尤其重要, 因为本版本不再提供fbk备份和恢复, 如果需要建立测试帐套, 则使用RapidStart是非常快速的部署工具.

不过由于Navision 2013发布的关系, RapidStart服务在使用中均存在不同程度的故障, 下面简单描述修复方案.

1. RapidStart建立并配置以后, 却报授权错误无法再次打开并应用, 建议打补丁到最新版本. (2013W1更新到3月的Hotfix后, 就已经解决此问题)

2. RapidStart包导出后无法导入. 这里简单描述下这个包的原理, 其实这个包是一个zip压缩文件, 其内容是xml. 导出包会由系统自动完成输出并压缩成zip格式文件. 不过由于字符集的原因, zip文件头有稍微一些差别. 那么会造成系统在读入的时候无法进行识别, 简单解决方案是在Codeunit 8619的IsGZip(FilePath : Text)判断文件头函数中, 将文件头标志的31 (1F) / 239 (EF) 判断改为 Exit(True);

3. RapidStart服务无法启动, 不能使用, 建议配置默认角色为Rapid角色. 重新启动即可使用敏捷部署.

在敏捷部署过程中, 大家有什么相关的问题, 也欢迎到群里进行讨论.

分类: C/AL, NAV2013 标签:

常见calcdate的用法

2014年1月8日 评论已被关闭

Calcdate是Navision中非常通用的一个函数, 在系统中, 灵活运用此函数可以为各项日期计算带来灵活性.

下面是一些Calcdate的常见用法.

1. 付款日期设置为 20日之前过账, 则次月25日到期, 20日之后过账, 则下月25日到期. 25日到期是一个固定日期. 则可以用 D21+11D-1M+CM+25D 来作为Calcdate
2. 5-4-4日历的开始日期 M1-1Y+W2-8D

5-4-4日历的 Q1
M1-1Y+W2-8D 至 M1-1Y+W2-8D+13W-1D
5-4-4日历的 Q2
M1-1Y+W2-8D+13W 至 M1-1Y+W2-8D+26W-1D
5-4-4日历的 Q3
M1-1Y+W2-8D+26W 至 M1-1Y+W2-8D+39W-1D
5-4-4日历的 Q4
M1-1Y+W2-8D+39W 至 +1Y+M1-1Y+W2-9D

3. 固定日期
M1 – M12 表示1月1日, M12表示12月1日
D1-D31
W1-W53
Q1
WD1

4. 变动日期:
+1D
+1M
+1Y
+1Q
+1W
+1WD

5. 结束日期:
CM
CW
CQ
CY

分类: C/AL 标签:

Business Solution – Budgeting Control

2013年12月1日 评论已被关闭

时间: 2013年11月28日 晚20:00 – 21:30

地点: QQ群视频 29624829

内容: Dynamics Navision Business Solution – Budgeting

视频:

课程讲义:

财务预算 Financial Budgeting

资金预算 capital budgeting

采购预算 Purchase Budgeting

销售预算 Sales Budgeting & Forecast

成本预算 Cost Budgeting

NAV 2009 – Course 80055 – CSIDE Solution Development – 02

2013年10月18日 评论已被关闭

时间: 2013年10月17日 晚20:00 – 21:30
地点: YY频道 40215226
内容: NAV 2009 – Course 80055 – CSIDE Solution Development – 02

视频:

课程讲义:

Dynamicsnav://

TXT的结构:

Table
Form
Report
Dataport
XMLport
Codeunit

MenuSuite

Page

了解一个系统进行了何种开发, 则可以导出Object为TXT.
然后进行比较.

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