Dynamics NAV 2018记录状态自动变Error无法定位修改来源
问题现象
在Dynamics NAV 2018环境中,选中页面行后点击Validar按钮,所有选中行状态会先变更为Pendiente,操作界面如下:
操作完成一段时间后,对应行状态会自动变为Error,异常状态界面如下:
通过调试器只能观测到状态从Registrando变更为Pendiente的过程,无法捕获状态变更为Error、以及Descripción Estado字段写入数据的逻辑。Validar按钮OnAction触发器的完整代码如下:
Validar - OnAction() UserSetup.GET(USERID); UserSetup.TESTFIELD("Superusuario SII",TRUE); //++SII V.08 CurrPage.SETSELECTIONFILTER(SII); WITH SII DO BEGIN IF FINDSET(TRUE,TRUE) THEN REPEAT //--SII V.08 //++SII JUL-2018 IF SII."Pendiente de validar" THEN BEGIN TempHistSII.RESET; TempHistSII.SETCURRENTKEY("N Doc NAV","Fecha Registro"); TempHistSII.SETRANGE("N Doc NAV",SII."N Doc NAV"); TempHistSII.SETRANGE("Fecha Registro",SII."Fecha Registro"); TempHistSII.SETRANGE(TempHistSII."Nº Mov",SII."Nº Mov"); //++SII JUL-2018 12/06/18 //IF TempHistSII.FINDFIRST THEN BEGIN IF TempHistSII.FINDLAST THEN BEGIN //--SII JUL-2018 12/06/18 HistRegSII.INIT; HistRegSII.TRANSFERFIELDS(TempHistSII); HistRegSII."Usuario modificación" := USERID; HistRegSII."Fecha modificación" := TODAY; HistRegSII."Hora modificación" := TIME; HistRegSII.INSERT; //++SII JUL-2018 12/06/18 //Inserto en tabla temporal TempHistSII.INIT; TempHistSII.TRANSFERFIELDS(SII); TempHistSII."Nº línea registro" := HistRegSII."Nº línea registro" + 10000; TempHistSII.INSERT; //--SII JUL-2018 12/06/18 END; SII."Pendiente de validar" := FALSE; END; //--SII JUL-2018 CASE Estado OF //++SII JUL-2018 //Estado::"Registrada con error",Estado::Registrada: //++SII V.07 Estado::"Registrada con error",Estado::Registrada,Estado::"Error por inmuebles adicionales": //--SII JUL-2018 BEGIN "Tipo comunicacion" := "Tipo comunicacion"::A1; Estado := Estado::Pendiente; "Descripción Estado" := ''; END; //++SII V.06 //Estado::Error: Estado::Error,Estado::"Error configuración": //--SII V.06 BEGIN Estado := Estado::Pendiente; "Descripción Estado" := ''; END; //++SII V.07 Estado::Pendiente,Estado::"Pendiente Devengo": "Descripción Estado" := ''; //--SII V.07 ELSE ERROR(Text001,Estado); END; MODIFY; //++SII V.08 UNTIL NEXT = 0; END; //--SII V.08
已完成排查
- 检查NAV内的Job Queue Entries,未发现会影响对应字段的后台任务
- 使用whereused工具检索全对象,未找到相关字段赋值逻辑
- 检查对应表的所有C/AL触发器,均为空无自定义逻辑
- 导出全对象为txt文件后搜索
"Descripción Estado" :=、No existe el Registro关键字,无匹配结果
问题结论
符合“不出现在导出的C/AL对象txt中、不触发C/AL调试器断点”特征的写入逻辑,通常有以下几类,结合SII(西班牙税务申报)模块的常见定制方案,优先级从高到低为:
- 独立部署的外部同步服务:多数SII定制场景会单独部署一个独立于NAV服务运行的可执行程序/Windows服务,定时轮询数据库中状态为
Pendiente的记录,调用西班牙税局接口完成申报后,直接通过SQL连接回写表内的状态、错误描述字段。这类逻辑完全独立于NAV的C/AL对象体系,不会被导出到txt对象文件,C/AL调试器也无法捕获其执行过程。 - SQL Server层面的自定义逻辑:检查对应数据库的SQL Server代理作业、表触发器、自定义存储过程。很多实施会直接在数据库层编写定时逻辑,轮询待处理记录调用外部接口后回写数据,这类数据库层面的对象不会被包含在NAV的对象导出文件中,C/AL调试器也无法监控数据库层的写入操作。注意之前排查的是NAV内置的Job Queue,和SQL Server代理作业是完全独立的两个体系。
- 编译为DLL的Add-in/Interop逻辑:如果定制开发时用.NET编写了NAV Add-in控制项、或者通过COM Interop调用了外部DLL,且DLL内部直接通过SQL连接写入数据,这类逻辑编译在二进制DLL文件中,不会出现在C/AL源码导出结果里,C/AL调试器默认也不会进入托管/非托管DLL内部调试,无法捕获赋值过程。
内容的提问来源于stack exchange,提问作者kuhi
相关产品推荐
相关产品推荐

