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

如何用SQL每日从Microsoft Navision导出数据至Excel并保留手动列?

解决方案:用SQL实现从Microsoft Navision每日自动提取数据到Excel并保留手动编辑列

完全可以实现你的需求,以下是分步落地的方案:

1. 核心:通过SQL从Navision提取目标字段

Navision后台基于SQL Server,直接编写SQL查询即可获取所需的15个标准字段。需要注意Navision的表和字段名通常包含空格或特殊字符,需用双引号或方括号包裹。

示例SQL查询(适配Navision常见表结构)

SELECT 
  sh."No_" AS "Order Number",
  sl."Line No_" AS "Order Line",
  sh."Your Reference" AS "Customer Reference",
  sh."Salesperson Code" AS "Account Manager",
  sh."Sell-to Customer No_" AS "Customer Code",
  sc."Name" AS "Customer Name",
  sc."Country/Region Code" AS "Country",
  sl."No_" AS "Sales Item Code",
  il."Item No_" AS "Item Code",
  il."Description" AS "Description",
  il."Cross-Reference No_" AS "Cross Reference",
  sh."Payment Terms Code" AS "Payment Terms"
FROM 
  [YourNavisionDBName].[dbo].[Sales Header] sh
JOIN 
  [YourNavisionDBName].[dbo].[Sales Line] sl ON sh."No_" = sl."Document No_"
JOIN 
  [YourNavisionDBName].[dbo].[Customer] sc ON sh."Sell-to Customer No_" = sc."No_"
JOIN 
  [YourNavisionDBName].[dbo].[Item] il ON sl."No_" = il."No_"
-- 可根据需求添加过滤条件,比如只提取近30天的订单
WHERE 
  sh."Document Date" >= DATEADD(day, -30, GETDATE())

2. 保留手动填写列的关键方案

不能直接覆盖整个工作表,需将自动提取数据与手动编辑数据分离:

  • 新建两个工作表:Navision_原始数据(仅存放SQL提取的字段,每日更新)、手动编辑区(存放DATE字段和3个YES/NO字段)
  • 再建一个合并视图工作表,用XLOOKUP或VLOOKUP通过**唯一键(Order Number + Order Line)**关联两个表的内容,用户日常查看和使用合并视图即可
  • 若必须在同一工作表,可先将手动列数据临时存入Excel隐藏工作表或名称管理器,更新完SQL数据后再写回对应列

3. 每日自动执行两次的实现方式

方案A:VBA宏 + Windows任务计划

  • 编写VBA宏执行SQL查询并更新Navision_原始数据工作表(示例代码如下)
  • 用Windows任务计划程序设置每日两次触发,命令行调用Excel并运行宏:
    "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" "C:\路径\你的文件.xlsm" /e"RefreshNavisionData"
    

示例VBA宏代码

Sub RefreshNavisionData()
    Dim conn As Object, rs As Object
    Dim sqlStr As String, ws As Worksheet
    Dim lastRow As Long
    
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    Set ws = ThisWorkbook.Sheets("Navision_原始数据")
    
    ' 清空现有数据(保留表头)
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow > 1 Then ws.Rows("2:" & lastRow).ClearContents
    
    ' 连接Navision SQL服务器,替换为你的实际连接信息
    conn.Open "Provider=SQLOLEDB;Server=你的NavisionSQL服务器地址;Database=你的Navision数据库名;UID=有权限的账号;PWD=密码;"
    
    ' 替换为你的SQL查询语句
    sqlStr = "SELECT sh.""No_"" AS ""Order Number"", sl.""Line No_"" AS ""Order Line"", sh.""Your Reference"" AS ""Customer Reference"", sh.""Salesperson Code"" AS ""Account Manager"", sh.""Sell-to Customer No_"" AS ""Customer Code"", sc.""Name"" AS ""Customer Name"", sc.""Country/Region Code"" AS ""Country"", sl.""No_"" AS ""Sales Item Code"", il.""Item No_"" AS ""Item Code"", il.""Description"" AS ""Description"", il.""Cross-Reference No_"" AS ""Cross Reference"", sh.""Payment Terms Code"" AS ""Payment Terms"" FROM [你的Navision数据库名].[dbo].[Sales Header] sh JOIN [你的Navision数据库名].[dbo].[Sales Line] sl ON sh.""No_"" = sl.""Document No_"" JOIN [你的Navision数据库名].[dbo].[Customer] sc ON sh.""Sell-to Customer No_"" = sc.""No_"" JOIN [你的Navision数据库名].[dbo].[Item] il ON sl.""No_"" = il.""No_"""
    
    rs.Open sqlStr, conn
    ws.Range("A2").CopyFromRecordset rs
    
    ' 清理资源并刷新合并视图公式
    rs.Close: conn.Close
    Set rs = Nothing: Set conn = Nothing
    ThisWorkbook.Sheets("合并视图").Calculate
End Sub

方案B:Power Query自动刷新

  • 用Excel Power Query连接Navision SQL数据库,导入查询结果
  • 在Power Query设置中配置自动刷新计划,或用PowerShell脚本配合任务计划触发刷新,无需启用宏

4. 共享文件被使用时的更新处理

  • 不要直接更新共享文件的原始数据,而是将SQL提取的原始数据存放在服务器上的一个独立中间文件(如Navision_数据缓存.xlsx)
  • 共享文件通过Power Query或VBA从中间文件读取数据,手动列直接保存在共享文件内,这样即使共享文件被打开,中间文件的更新也不会冲突
  • 若使用Power Query,开启后台刷新选项,避免占用用户操作资源

内容的提问来源于stack exchange,提问作者Divad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:12:02