You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dynamics NAV 2018记录状态自动变Error无法定位修改来源

问题现象

在Dynamics NAV 2018环境中,选中页面行后点击Validar按钮,所有选中行状态会先变更为Pendiente,操作界面如下:
Validar操作界面
操作完成一段时间后,对应行状态会自动变为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:33:17