ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ASP送货单打印系统实战:IIS部署、打印方案与避坑指南

ASP送货单打印系统实战:IIS部署、打印方案与避坑指南 简介这是一份基于ASP的Web送货单打印管理系统源码包面向初学ASP服务端脚本开发的程序员以及需要快速搭建内部送货管理工具的小型团队。系统以送货单的录入、查询、修改与打印为主线集成了客户档案、商品信息、会员销售、供应商采购等配套模块并包含用户权限与会话管理能完整呈现经典ASP与数据库配合实现动态站点的业务流程。压缩包共172个文件其中77个asp页面构成核心逻辑辅以83个gif图标、6个jpg图片、2个htm页面、2个css样式和global.asa等配置文件整体仅525KB结构精简便于部署与逐页研读。目前已有198人学习下载。开发者可从中借鉴登录身份校验、订单CRUD操作、打印页面布局、数据库连接串配置、注入防护等常见写法的落地代码也可按文件命名快速定位模块是快速上手ASP企业级脚本开发的实用参考。1. 一个老 ASP 项目为什么还有人翻出来用打印这件事浏览器始终没做好做过企业内部系统的工程师应该都有同感ERP 上线再顺利到了送货单打印这一步也容易卡壳。业务员开完单仓库要一张能对货、能签字、能留底的纸质单子而浏览器自带的打印功能始终差那么一截——页边距不对、内容被截断、预览和实际打印效果不一致。这套“ASP源码—WEB送货单打印管理系统webshd v1.2.zip”就是这样一类老项目用 ASP 写业务逻辑数据库存单据网页一端负责录入和打印预览。它解决的不是什么高大上的问题就是把“开单→打印→送货”这件事稳定跑起来。适合谁还在用 Windows 服务器、想快速搭建内部送货单管理、或正在维护十年前遗留系统的工程师。企业级 Web 开发里打印永远是老大难这个方向现在依然值得研究。2. 把 webshd 跑起来IIS Access 环境的搭建与十分钟验证2.1 为什么一定是 IISASP 与 Windows 服务器的绑定关系这套系统的文件名里写着 ASP 源码ASPActive Server Pages是微软在 2000 年代主推的服务器端脚本技术运行宿主就是 IIS。和现在用 Spring Boot 写 Java Web、用 Node 写后端不同ASP 页面本身就是脚本文件.asp后缀里同时混着 HTML 和 VBScript 或 JScript 代码。IIS 收到请求后经过 asp.dll 解释执行再把结果回给浏览器。这里有个常见的认知偏差很多人拿到源码后习惯性双击 .asp 文件想看看内容这当然不是运行方式。正确思路是在一台 Windows 服务器上把 IIS 角色装上把这个站点目录指到源码文件夹再让 IIS 按 ASP 方式解析。老版本 IIS 5/6 默认支持 ASPIIS 7 以上则需要手动在“功能视图”里开启“ASP”模块。如果你之前只配过静态网站这一步容易漏——装上 IIS 后没启用 ASP 功能访问 .asp 页面直接返回 404 或空白这是第一个坑。还有一个版本匹配问题。webshd 这类老项目多半跑在 Windows Server 2003 / XP 时代的 IIS 5/6 上数据库多数是 Access.mdb 文件。如果现在你用的是 Windows Server 2019 或 Windows 10/11 上的 IIS 10需要注意 32 位模式和 64 位模式的差异。IIS 应用程序池默认“启用 32 位应用程序”为 False而老 Access 驱动Microsoft.Jet.OLEDB.4.0只有 32 位版本连接时直接报“未找到提供程序”。解决办法是把应用程序池的“启用 32 位应用程序”改成 True或者改用 ACE OLEDB 12.0 驱动64 位并保证 Access 数据库引擎已安装。2.2 最小安装清单与五步配置我先说结论跑通这套系统最少需要一台 Windows 系统Server 或桌面版都行、IIS 角色、ASP 功能、一个能访问 .mdb 文件的 OLEDB 驱动。不需要装 SQL Server不需要装 .NET FrameworkASP 是脚本不是编译型程序也不需要 MySQL。这个轻量特性正是老项目还能翻出来用的理由之一。具体配置步骤我一般按下面这五步走# 以管理员身份打开 PowerShell安装 IIS 核心角色和 ASP 功能 Install-WindowsFeature -Name Web-Server, Web-Asp -IncludeManagementTools这段命令在 Windows Server 上会自动装好 IIS 和 ASP 解释模块。如果系统是 Windows 10/11 专业版IIS 属于“启用或关闭 Windows 功能”里的勾选项不通过 PowerShell 装。打开控制面板 → 程序 → 启用或关闭 Windows 功能勾选“Internet Information Services”和“万维网服务 → 应用程序开发功能 → ASP”点确定即可。参数说明Web-Server是安装 IIS 主体Web-Asp是 ASP 脚本支持模块IncludeManagementTools会把 IIS 管理器一并装上方便后面改配置。接下来创建站点。打开 IIS 管理器右键“网站 → 添加网站”站点名称随便填物理路径指向源码解压后的目录端口号可以设 8080 或 80。如果设 80注意确认没有被其他程序占用——之前遇到过 Web 服务器上装了别的软件抢占 80 端口IIS 站点启动直接失败日志里什么错误都不给查了半天才发现是端口冲突。第三步调整 ASP 设置选中站点下的 ASP 图标双击进入把“启用父路径”设为 True把“调试属性 → 将错误发送到浏览器”设为 True。父路径不开代码里用../访问上级目录就会报 500 错误错误提示不开页面只会显示一片空白完全是黑匣子。第四步处理数据库权限。找到 .mdb 文件所在目录右键 → 属性 → 安全 → 编辑添加IIS_IUSRS用户勾选“读取”和“写入”权限。Access 是文件型数据库ASP 默认身份访问它需要 NTFS 文件系统权限。不少新手在这里翻车IIS 配置全对页面也能开一旦写入数据就报“操作必须使用一个可更新的查询”就是因为没有写权限。第五步打开浏览器访问http://服务器IP:端口/如果看到登录页或菜单页说明 ASP 已经被 IIS 接管了。这一步建议在服务器本机上先测排除防火墙干扰。2.3 局域网内验证打印落地检验的不是页面是打印队列环境搭好后真正要验证的不是网页能打开而是送货单能不能按需打印出来。我的习惯做法是准备一台装了打印驱动、共享了打印机的电脑从另外一台机器上用浏览器访问这个系统走一遍“开单 → 保存 → 打印预览 → 发送到打印机”的完整流程。流程能通这个项目才算真的在你的环境里“活”了。如果打印机是共享的要确认 IIS 站点运行的账号默认是 ApplicationPoolIdentity对打印机的访问没有问题。虽然 ASP 页面本身不直接调打印机——真正的打印动作发生在浏览器端——但如果你在这个系统里集成了打印控件控件在客户端浏览器里加载就不存在服务端跨机器访问打印机的问题。这点要分清服务端 ASP 只负责生成打印内容页面实际打印是浏览器所在电脑的活。所以验证时一定要用真正连着打印机的客户端电脑来测在服务器上测打印没有意义。注意IIS 默认网站路径下的web.config可能会被 ASP 经典模式忽略。老 ASP 项目的配置全写在代码里的 Global.asa 或者数据库连接文件里改 IIS 设置后记得回收一下应用程序池。3. webshd 的打印方案拆解网页里的打印不是纸上的打印3.1 浏览器原生打印为什么不够用以纸张尺寸为例这套系统既然主打“打印管理”核心就在打印这一层。浏览器里按CtrlP能打印所有页面但办公场景尤其打印送货单不是 A4 纸张那么简单。常见的送货单有 A5 横版、241mm 连续纸针式打印机用、宽 80mm 的热敏纸等。浏览器原生打印对话框里纸张大小选项依赖打印机驱动支持如果驱动里没有对应纸型页面就按默认纸型乱打。内容被裁掉、第二页上莫名多出一个空页这些都是原生打印的“玄学”问题——不是代码问题是纸张规格没配对。浏览器还有第二个短板打印预览和实际输出不一致。CSS 里按media print定义的样式在 Chrome 里看是对的同一个页面在国产浏览器内核下输出到打印机字体、边距、缩放全变了。老 ASP 项目最常见的做法是页面里嵌一套打印样式表同时提供“打印预览”按钮先在新窗口打开一个只含单据内容的 HTML再触发打印。这套系统标题里带“打印管理”四个字走的大概率也是这个路线。我处理这种场景的经验是先确定打印机类型再定方案。针式打印机打三联单、241 连续纸用网页直打最简单因为针打的纸张靠机器上的档位去卡纸张尺寸不需要页面关心打印驱动用默认即可。热敏标签机打面单、价格牌就需要精确控制纸张宽度和高度这一块浏览器原生支持基本等于零得依赖专门的打印方案。3.2 webshd 的打印触发方式从 window.print 到打印控件的演进一般来说老项目里打印按钮的触发逻辑是主页面用一个查询条件筛选出需要打印的送货单然后打开一个单独的打印预览页面比如print.asp?id单号这个页面只加载这一单的数据再在页面里放置打印按钮。按钮背后的代码最常见的是调用浏览器自带的window.print()方法或者引入第三方打印控件。看代码时有一个判断技巧如果页面源码里引用了.cab或.ocx文件或者控件 ID 像LodopPrint说明它用了打印控件。打印控件的设计初衷就是为了弥补浏览器原生打印的不足——它能精确控制纸张尺寸、打印份数、双面、直接发送到打印机等。这类控件多是在 IE 活跃的年代流行后来浏览器市场变化老控件在 Chrome 里往往加载不了这就成了这套系统升级时必须处理的兼容性问题。如果源码里的打印方案确实是控件我一般会先看它调用的是哪个控件品牌再找该品牌的 Web 版接口是否有新的替代方案比如部分控件官方发布了支持 WebSocket 的新版本可以在 Chrome 里用同样的 API 调用打印机。3.3 导出 PDF 对比网页直打哪个才是仓库场景的正解在仓库实际作业里网页直打和 PDF 导出两条路线各有各的适用场景。网页直打适合针式打印机和多联单据速度快点一下按钮纸就出来了PDF 导出适合需要留存、回传、给客户发电子版对账的场景。不少新改造的 web 项目会走“先 PDF 后打印”路线但要注意PDF 打印在针式打印机上的体验很差——PDF 是按页面渲染的针打需要按份数连续进纸中间一旦卡纸那份单子就废了。所以在 webshd 这类老系统的场景里我建议以网页直打为主PDF 导出作为辅助功能。你可以在打印页面里提供两个按钮一个“直接打印”走网页打印逻辑一个“导出 PDF”方便存档和发邮件。对仓库人员来说多一个按钮没什么学习成本业务却灵活很多。另外如果有热敏标签打印的需求可以考虑在系统里单独集成一种专门方案不要硬塞进media print样式里——不同打印设备对 CSS 的支持差异太大硬凑只会让两边都打不好。4. 读懂送货单的数据流Access 表结构与四张核心表的关系4.1 数据访问方式OLEDB 连接与 Access 文件这套系统用的数据库大概率是 Access.mdb连接方式走 OLEDB。ASP 代码里常见的连接字符串长这样Dim conn Set conn Server.CreateObject(ADODB.Connection) conn.Open ProviderMicrosoft.Jet.OLEDB.4.0;Data Source Server.MapPath(database/webshd.mdb)这段代码的逻辑是创建一个 ADODB.Connection 对象用 Jet 4.0 提供程序去打开位于站点database目录下的 webshd.mdb 文件。Server.MapPath会把相对路径转成服务器物理磁盘路径这样代码里不需要写死D:\webshd\database\...站点换目录也不用改代码。这是 ASP 项目里最常见的写法好处是部署灵活坏处是安全问题——如果这个 .mdb 文件放在了站点可访问的目录下别人直接访问http://ip/database/webshd.mdb就能把整个数据库下载走。经验做法是把数据库文件放在站点物理目录之外比如D:\App_Data\并且在连接字符串里写绝对路径。但如果源码里已经固定了相对路径修改时就要连带改代码里所有Server.MapPath的指向成本不小。这个风险点先记下后面避坑章节细说。4.2 四张核心表的职责划分主表、明细表、客户表、商品表一个送货单打印管理系统“单”字是核心。业务上它至少包含四类实体送货单本身、送货单里的商品行、收货客户、商品信息。对应的表设计我按常见的业务模型拆给你看。需要说明的是webshd 源码里的字段名未必完全如此但业务关系基本不出这个框架。送货单主表命名为DeliveryMaster或T_Delivery存储每张单据的概括信息核心字段包括单号DeliveryNo、客户编号CustomerID、单据日期DeliveryDate、业务员Salesman、总金额TotalAmount、状态Status。这个表的每一行对应仓库里“一张单”。送货单从表命名为DeliveryDetail或T_DeliveryItem存储该单据里的商品明细核心字段单号DeliveryNo、商品编号ProductID、数量Quantity、单价UnitPrice、行金额LineAmount。这里特别要注意单价要存在明细表里而不是打印时再去商品表查。原因很简单商品表里的价格是“当前价”而送货单上印的是“成交价”——三个月后的价格调整不应该影响三个月前打印过的旧单。客户表T_Customer存客户档案客户编号、客户名称、联系人、电话、送货地址。商品表T_Product存商品档案商品编号、名称、规格、单位、参考价格。有些系统还会把“送货地址”做成独立字段存在送货单主表里而不是关联客户表——因为同一客户可能要求这次送 A 地址、下次送 B 地址打印时以单上的地址为准。这个设计细节在打印系统里特别重要如果写死关联客户表的默认地址仓库就会频繁打错单。4.3 从开单到打印的数据流转一条 SQL 追踪到底理解了表结构再看数据流就简单了。开单时页面插入一条主表记录再循环插入明细记录。打印时页面按单号把主表和明细查出来按客户编号查出客户信息然后渲染成 HTML 输出。追踪一条数据是否完整最直接的方式是打开 Access 数据库手动执行一条查询SELECT m.DeliveryNo, m.DeliveryDate, c.CustomerName, d.ProductName, d.Quantity, d.UnitPrice, d.LineAmount FROM DeliveryMaster m INNER JOIN DeliveryDetail d ON m.DeliveryNo d.DeliveryNo LEFT JOIN Customer c ON m.CustomerID c.CustomerID WHERE m.DeliveryNo HD20250001这条 SQL 把一张送货单的全部关键信息关联到一行一行数据上。INNER JOIN保证只返回有明细的主单LEFT JOIN保留客户信息可能缺失的边界——如果客户表里删了档案但送货单还在INNER JOIN会把单子一起吞掉LEFT JOIN不会。打印页面里大概率是类似逻辑的查询只是写法更分散。排查“单打不出来”问题时先在 Access 里跑这条 SQL就能快速判断是数据缺失还是页面渲染问题不用对着 ASP 代码一行行猜。注意Access 对*通配符和日期函数跟 SQL Server 有差异比如日期过滤要写成WHERE DeliveryDate #2025-06-01#井号不是注释是 Access 的日期定界符。4.4 历史单价为什么要冗余一个让打印系统避免翻车的表设计决策前面提到单价要存在明细表里这一点值得再展开说说。做过电商或进销存系统的人都知道订单明细里的“单价”字段通常是由商品表带入的但打印管理系统必须把它当快照保存。原因很朴素送货单打印出来后可能被用于对账、结算、售后。半年后客户拿着单据来质询“为什么当时单价是 15 块现在系统的商品价格是 18 块”如果打印时单价是实时查的售后人员根本拿不出凭据。而把单价冗余在明细表里打印出来的就是当时的历史事实任何事情都以表里存的那条单价为准。这就是这类系统最值钱的设计它不是给销售看价格的它是给财务和仓库留底稿的。5. webshd 避坑实录从 500 错误到打印乱码的 5 个排查点5.1 ASP 页面空白或 500父路径与 Script Error 双双作梗现象IIS 配好之后访问首页浏览器完全空白或者在 IE 兼容视图里看到“服务器应用程序不可用”。服务器事件查看器里也没有明显报错看起来像什么都没发生。原因有两个叠加项。第一IIS 里 ASP 的“启用父路径”默认是 False而老 ASP 代码里大量使用../相对路径去引用公共包含文件比如!--#include file../conn.asp--一旦禁用父路径加载包含文件直接失败页面就空白了。第二“将错误发送到浏览器”选项默认关闭ASP 脚本里的运行时错误被 IIS 吞掉屏幕上什么都不显示等于是个黑匣子。解决IIS 管理器 → 选中站点 → 双击“ASP”图标 → 找到“行为”区域的“启用父路径”设为 True再找“调试属性”区域的“将错误发送到浏览器”设为 True。改完后点击右侧“应用”再刷新页面。这时如果还有错浏览器会直接把具体的 VBScript 错误信息和行号打出来排错效率高一个量级。5.2 Access 数据库被占用IUSR 权限与并发写入冲突现象页面能打开列表但新建一张送货单保存时页面报“操作必须使用一个可更新的查询”或“数据库或对象为只读”。仓库里两个人同时开单时第二个人的页面报“文件正被另一进程使用”。原因前一个报错是 IIS 运行账号对 .mdb 文件没有写权限后一个报错是 Access 本身并发能力差Jet 引擎对同一个 .mdb 文件的写操作是文件级锁两个人同时写就是会互相阻塞。这不是代码 bug是架构天花板。解决权限问题去 mdb 文件所在目录的“安全”标签里把IIS_IUSRS或Everyone的写权限加上。并发问题治标方法是在数据库目录里放一个LDB锁文件Access 会自动创建并保证磁盘是 NTFS治本方法就是换 SQL Server Express——但那是大工程对老系统来说不值当。实际业务里控制一下开单节奏或者让前台录单的人错峰操作比改架构更现实。5.3 送货单中文乱码编码链路三处不一致现象打印预览页面里中文全部变成问号“”或方框“□”但列表页中文是好的。把同样的打印页面在服务器本地打开正常客户端打开就乱码。原因ASP 页面的 CodePage 设置、Access 数据库内部存储格式、打印机驱动对中文字体的支持这三条链路任何一环断了都会出乱码。老 ASP 页面文件本身是 GB2312 编码如果页面里面用Session.CodePage 65001UTF-8声明而数据库存的是 GBK 内码读出来再输出到页面上就错位了。还有打印机方面如果打印页面指定字体是Arial这类纯英文字体而打印机是低端激光机没有中文字库的情况下会用方框占位。解决在 ASP 页面最顶端加一句% LanguageVBScript CodePage936 %这行代码告诉 IIS 当前页面用简体中文GBK编码输出。同时检查页面里打印区域的 CSS把字体设为SimSun宋体或Microsoft YaHei不要指定Arial。如果页面文件本身是 UTF-8 编码保存的就在页面里把CodePage65001和数据库连接后的conn.Execute(SET NAMES gbk)对齐——注意 Access 没有SET NAMES命令这句只适用于 MySQLAccess 场景下重点就是让页面 CodePage 和 .mdb 文件的文本编码匹配。5.4 老打印控件在 Chrome 里失效ActiveX 的兼容性断层现象打印页面在 IE 里一切正常换了 Chrome 之后打印按钮点了没反应浏览器控制台报“某个 ActiveX 对象未定义”或“控件未加载”。原因老 ASP 系统集成的打印控件多数基于 ActiveXOCXActiveX 是 IE 时代的技术Chrome 从 v45 开始彻底移除了对 NPAPI 插件和 ActiveX 的支持。而现代管理员和业务电脑上 Chrome 几乎是标配这个兼容性断层是老 Web 打印系统最常见的死穴。解决有三个方向按成本从低到高排序。第一在需要打印的电脑上用 Edge 浏览器的 IE 模式打开该站点这个模式能从 Edge 设置里的“默认浏览器”选项开启然后添加站点到“允许在 Internet Explorer 模式下重新加载的网站”列表老控件在 IE 模式下能继续工作。第二检查打印控件品牌是否有新的 H5 版本现在某些打印控件提供了基于 WebSocket 的 Web API 调用方案页面只需引入一个 JavaScript 文件就能在 Chrome 里正常驱动打印机。第三彻底换掉控件方案改用原生打印 纸张规格调整的方式——成本最高但以后不再被控件绑定。我一般先试第二方向因为源码改动最小业务也能保住原有的打印习惯。5.5 单据金额显示异常千分位与四舍五入的分裂现象同一张送货单数据库里存的是 1234.5页面上显示 1234.5点击打印后单据上却变成 1234.4999……或者金额合计差了 0.01 元。原因这是浮点数存储和格式化函数的问题。Access 的Single类型是单精度浮点存 1234.5 会变成 1234.499999...Currency类型是定点数适合金额但如果 ASP 代码里用CDbl把金额转成双精度再拼接字符串末尾的小尾巴就可能暴露出来。多行明细逐条四舍五入再求和和先求和再四舍五入结果碰巧差一分也是这里的经典 bug——Excel 和 Access 都有这个问题。解决金额字段在 Access 表里用Currency类型不要用Single或DoubleASP 里输出时统一用它自带的格式化函数FormatNumber(rs(LineAmount), 2, -1, 0, -1)这段代码把金额固定显示为两位小数负数加括号显示千分位分组。第一个参数是数据值第二个2是小数位数第三个-1表示启用千分位第五个-1表示负数用括号括起来。改完这一处页面上所有金额合计就对齐了如果还有误差就去查明细里是否有一条数据本来就用错了字段类型。6. 把 webshd 挪到新环境迁移、备份与升级打印的收尾技巧老 ASP 项目只要跑起来多半还能再战几年但把它从旧服务器迁到新机器是早晚的事。迁移时最省心的方法不是重新配置 IIS而是整个复制网站目录然后在新的 IIS 里“导入”站点配置。具体做法是在旧服务器上把站点根目录整体打包包括 mdb 文件复制到新服务器后直接新建一个网站物理路径指到这个目录端口沿用原来的再把 ASP 的父路径和错误显示重新打开。如果站点域名没变、数据库路径没变这套流程二十分钟能完成。唯一要注意的是mdb 文件可能被占用复制前要确保 IIS 站点已停止不然拷到一半文件处于锁定状态拷过去的数据库可能损坏。停止 IIS 站点再复制这就是物理文件的后悔药不能省。安全加固也要做一轮。老系统最常见的漏洞就是数据库文件被直接下载。如果你发现 mdb 文件确实在站点目录里并且没法挪走就在 IIS 里加一条请求筛选规则把.mdb扩展名直接拒绝访问。在 IIS 管理器 → 站点 → “请求筛选” → “文件扩展名”里右键“拒绝扩展名”添加.mdb立即生效。这个做法的效果比改代码快得多也省得动源码。服务器上其他 Web 服务如果有暴露端口也该一起检查一轮Web 服务器安全配置在这种场景里花十几分钟就能堵住大多数已知入口。打印部分的升级我的习惯是保留老打印按钮另外加一个“打印预览”新按钮预览页面用 HTML 表格重新排版绑定media print样式。这样一来老流程不中断新流程又能用 Chrome 正常出单。我给一个小仓库做类似改造时就是保留旧按钮不动花了半天把预览页面和打印样式写好业务人员几乎无感知但打印乱码和格式错乱的工单明显少了。最后想叮嘱一句老项目不能只靠经验去猜任何一步改动都要在真实打印机上过一遍。纸面的逻辑再顺打印出来的实际效果才是唯一标准。希望帮到你。本文还有配套的精品资源点击获取
返回列表