首页 / 资讯中心 / 文章详情

经典 ASP 送货单打印系统 webshd v1.2 部署与打印排错实战

经典 ASP 送货单打印系统 webshd v1.2 部署与打印排错实战 ★ FEATURED ARTICLE
简介这是一份基于ASP开发的WEB送货单打印管理系统源码包面向ASP初学者、Web应用开发人员以及需要订单/送货管理功能的中小企业用于实现送货单的录入、维护、查询与网页打印输出。压缩包共172个文件其中77个ASP文件构成核心业务逻辑83个GIF图片提供界面元素另有少量JPG、HTM、CSS、TXT和ASA配置文件整体仅约525KB结构紧凑、便于快速通读。目前已有198人学习下载。系统中包含登录认证、商品/客户/供应商管理、会员购买、销售统计与打印等功能模块并涉及数据库连接ADO、CRUD操作、会话控制与页面间参数传递等关键技术点虽然不是大型项目却覆盖了经典ASP开发的完整链路非常适合作为课程设计参考或入门实战的拆解样本。1. 先搞清楚webshd v1.2 是什么还值不值得碰如果你手头有一台 Windows 服务器或者一个老厂库房要上送货单打印这包 ASP 源码“WEB送货单打印管理系统 webshd v1.2”就是典型的老牌方案用经典 ASPActive Server Pages跑在 IIS 上浏览器打开页面开单、保存、打印数据库藏在服务器端客户机零安装。它的价值不在于代码多新而在于一个 web 项目就能把“开单→审核→打印→对账”这条线收拢起来而且部署成本几乎是零一台内网机器、一个 IIS、一份 Access 文件半天就能让送货单从手写变成电脑打印。适合谁来碰维护老系统的工程师、想快速搞一套内部单据系统的小团队、以及收藏源码做复盘的人。下文我按自己实际搞这套系统的路子把部署、打印、排错一次讲透。2. 拆开 webshd 的底子经典 ASP 的送货单业务与打印架构2.1 经典 ASP 和 ASP.NET 的区别v1.2 为什么还在生产环境服役先分清一个基本功。经典 ASP 是 2000 年代的主流 Web 开发技术文件后缀 .asp页面里用 VBScript 或 JavaScript 写服务端逻辑IIS 直接解释执行ASP.NET 是完全另一套托管框架。webshd v1.2 这种源码特征一眼就能认目录里是大量的 .asp 文件配一个 .mdb 或 .asp 后缀的 Access 数据库几乎没有编译出来的 DLL。不要拿 ASP.NET 的思维去改它很多人栽在这里——把 .asp 当 aspx 找 Web.config找不到就以为源码缺文件其实是拿错了参照系。这套系统在今天还在生产环境跑并不奇怪。送货单打印这种业务单据格式稳定、字段变化少、用户量就是办公室那几个开单员系统一旦稳定下来没人愿意为“技术上新”去动它。经典 ASP 在这种场景下的优点恰好是逻辑直白一个页面从数据库读数据到输出 HTML 全在一个文件里改一改保存就生效不需要编译、发布、重启。缺点也明显代码和 HTML 混在一起可维护性差VBScript 没有强类型字段一多就容易踩运行时错误IIS 的配置项又多又碎换台机器常要折腾半天。我的经验是接这种系统先别急着重构先把它跑起来再把打印环节理顺业务先不断再谈优化。2.2 送货单业务的表结构与状态流转开单、打印、核销怎么落库送货单打印管理系统核心不是“打印”而是“单据生命周期”。不管源码里表名叫什么背后的业务模型基本是一致的。一般会有这么几张主表客户档案表客户编号、名称、地址、联系人、商品表编码、名称、规格、单位、单价、送货单主表单号、日期、客户、收货地址、经手人、状态、送货单明细表主表关联、商品、数量、单价、金额再加上一个系统配置表存公司抬头、电话、打印模板参数。主表和明细表通过单号或自增 ID 关联这个关联字段是调试时的第一检查点——打印不出明细八成是两表关联字段对不上。状态流转更是老系统的命脉。我把这步排错顺序固定下来一看单号生成规则有没有重复、断号二看状态字段草稿/已打印/已核销三看审核和打印之间有没有权限开关。在实际的 ASP 源码里状态最常见的实现就是订单表里一个整数字段0开单未打印1已打印2已核销或已过账。开单页面通过UPDATE 送货单 SET 状态1 WHERE 单号...来打标打印机一响这条单据就锁定不能再改了。懂这个流转你在排“打了单却改不了”“改不了却还能再打”这类问题时一查状态字段就知道是谁的锅。打印页面取数的套路也值得先说破打印页一般是一个print.asp?idxxx的独立页面用 Request 拿单号再分别查主表和明细表拼成单据样式。这里有个典型写法后面改模板时要认得% Dim单号 单号 Request(id) Dim rs主, rs明, sql sql SELECT * FROM 送货单 WHERE 单号 单号 Set rs主 Server.CreateObject(ADODB.Recordset) rs主.Open sql, Conn, 3, 1 If Not rs主.EOF Then 输出主表抬头 Response.Write h2 rs主(客户名称) /h2 End If sql SELECT * FROM 送货单明细 WHERE 单号 单号 Set rs明 Server.CreateObject(ADODB.Recordset) rs明.Open sql, Conn, 3, 1 Do While Not rs明.EOF Response.Write rs明(商品名称) x rs明(数量) br rs明.MoveNext Loop %逻辑说明这种页面没有把数据输出写进 HTML 模板而是用 Response.Write 一行行拼出来好处是逻辑简单坏处是模板和代码全粘在一起。你要改打印格式别去改数据库得改这个 asp 文件里的输出顺序和br、表格标签。参数说明Request(id)拿的是 URL 问号后面的参数rs主.Open的3, 1是只读游标适合查询不用锁表。真正生产修改操作才用1, 3。打印模板里建议把主表字段放在table的thead明细放在tbodyCSS 控制打印时才不会错位。2.3 打印这一环浏览器端打印的三种常见实现与选型Web 打印是整个系统里最容易翻车的部分也是标题里“打印管理”四个字的分量所在。常见的方案有三种一是页面里直接调window.print()整页打印靠 CSS 的media print把菜单、按钮藏掉只留单据区域二是用 IE 的WebBrowser.ExecWB或者 ActiveX 控件能选打印机、能设置纸张但绑定 IE换 Chrome 和 Edge 就失效新版 Edge 的 IE 模式还能勉强兼容配置麻烦三是用 Lodop 这类打印控件用 JavaScript 把单据数据推到控件里排版输出效果最接近“专业票据打印”缺点是要装客户端控件、要注册授权。webshd v1.2 这代系统源码里最可能用的是第一或第二种因为那个年代的浏览器环境就是 IE6/IE8。如果你拿到手的源码打开打印页面一片空白先别怀疑源码坏了先怀疑浏览器拦了 ActiveX 弹窗。我一般建议能改源码的优先把打印改成“新窗口打开单据页面 window.print()”的纯 HTML 打印这是跨浏览器最稳的底线方案代价是页面样式要重新调一版窄幅的适配 A4 或 241mm 连续纸。后面第四章我会把打印的坑逐个列出来。3. 在 Windows 上把 webshd v1.2 跑起来IIS 部署与数据库配置3.1 环境准备Windows 版本、IIS 与 Access 的搭配速查部署经典 ASP 系统环境版本是第一道坎。IIS 6.0Windows Server 2003到 IIS 10Windows Server 2016/2019/2022都能跑经典 ASP但你要在 IIS 里手动开启 ASP 支持默认 IIS 装完并不启用 ASP 脚本引擎装角色时要在“应用程序开发”里勾上 ASP。Windows 10/11 专业版作为开发调试机也可以把“启用或关闭 Windows 功能”里的 Internet Information Services 展开勾选“应用程序开发功能”下的 ASP 项即可。数据库方面如果源码用的是 Access .mdb最稳妥的搭配是服务器装 Office 2007/2010 版带的 ACE 驱动Microsoft Access Database Engine或者是老版 MDAC。装完驱动注意看连接字符串是ProviderMicrosoft.Jet.OLEDB.4.0对应 Jet 驱动适合 .mdb还是ProviderMicrosoft.ACE.OLEDB.12.0对应 ACE 驱动两者都行。这块我吃过亏Windows Server 2016 默认不带 Jet跑起来报“未找到提供程序”其实就是缺驱动别先怀疑源码。操作系统是 64 位的话IIS 应用程序池有个大坑——默认“启用 32 位应用程序”是 False而老 Access 驱动有时只注册了 32 位导致页面报错。这类问题的排查套路我放在 4.2。部署步骤如下常见做法我用这个顺序能少走弯路# 在管理员 PowerShell 里安装 IIS 及 ASP 功能适用于 Windows Server 2016/2019/2022 Install-WindowsFeature Web-Server -IncludeManagementTools Install-WindowsFeature Web-ASP Install-WindowsFeature Web-Mgmt-Console逻辑说明第一条把 IIS 主体装好第二条启用经典 ASP 脚本引擎第三条装 IIS 管理器。三条之间是递进关系漏了第二条你的 .asp 页面会被当成文本下载或者直接 403。装完可以在浏览器访问http://localhost/iisstart.htm验证 IIS 已出界面。参数说明若在 Windows 10/11 上操作用控制面板图形界面勾选上述三项功能即可命令不通用。生产服务器建议关闭“IIS 安装时默认生成的欢迎页”避免把站点根目录指向错误的默认路径。如果你手头暂时连一台 web 服务器都没有IIS 本身就是免费的 web 服务器角色不用额外装第三方环境这一点对先试跑源码特别友好。3.2 站点发布目录权限、默认文档与数据库写权限代码解压到D:\webshd后在 IIS 里“添加网站”或直接往“默认网站”下加应用程序。要注意的权限点有三个D:\webshd目录的 Authenticated Users 要能读Access 数据库文件比如data\webshd.mdb所在目录要给 IIS 进程用户写权限因为 ASP 更新送货单时要往数据库写数据如果源码里有上传附件功能uploads 目录也要放开写权限。这个“写权限”是新手最容易翻车的点报错往往不是“拒绝访问”而是“Microsoft Jet 数据库引擎打不开数据库”老手一看就知道是权限。默认文档一定要把 index.asp、default.asp 加进去很多 ASP 老系统的首页是 index.aspIIS 默认的默认文档清单里没有直接导致访问根目录 403。添加默认文档在 IIS 管理器“默认文档”功能里操作顺序把 index.asp 放在最上面。还有一点如果数据库文件和站点源码放同一个目录且允许下载那*.mdb可能被直接浏览器下载走数据裸奔。我一般把数据库放在站点根目录之外的独立目录如D:\webdata\再在 IIS 里给站点根目录加一条“隐藏文件”规则或直接用请求筛选把 .mdb 后缀拦掉。这一步也是 web 安全的基本功——站点的数据库文件不能被当作静态资源下载。初次启动后最好写一个测试页验证数据库连接和权限是否就绪在站点根目录放一个test.asp% Response.Write 数据库连接测试 Dim Conn, ConnStr ConnStr ProviderMicrosoft.Jet.OLEDB.4.0;Data Source Server.MapPath(data/webshd.mdb) Set Conn Server.CreateObject(ADODB.Connection) Conn.Open ConnStr Response.Write OK Conn.Close Set Conn Nothing %逻辑说明这个页面把“能不能找到库文件”和“能不能建立连接”这两件事一次验证掉。如果返回 OK说明连接字符串和目录权限没问题如果报错看错误信息里带的是路径还是 Provider。参数说明Server.MapPath 把相对路径解析成物理路径前提是站点根目录正确指向D:\webshd。这段代码只是连通性测试测完务必删掉或者改成受限访问否则等于把数据库路径暴露给所有访问者。3.3 连接字符串改库找这三处ASP 连接 Access连接字符串一般写在Conn.asp、Inc/Config.asp、DB.asp这类公共包含文件里。webshd 这代源码常见的写法是一个库连接函数加全局变量% Dim Conn Dim ConnStr ConnStr ProviderMicrosoft.Jet.OLEDB.4.0;Data Source Server.MapPath(data/webshd.mdb) ;Persist Security InfoFalse Set Conn Server.CreateObject(ADODB.Connection) Conn.Open ConnStr 查询示例读取送货单主表 Dim rs, sql sql SELECT 单号, 客户名称, 送货日期, 状态 FROM 送货单 WHERE 状态0 ORDER BY 单号 DESC Set rs Server.CreateObject(ADODB.Recordset) rs.Open sql, Conn, 3, 1 %逻辑说明第一段是打开数据库的标准姿势第二段是一个只读查询的模板。Server.MapPath(data/webshd.mdb)把相对路径解析成服务器物理路径这是经典 ASP 里最常用的定位方式。如果你把数据库移到了站点外的D:\webdata\webshd.mdb这一行就要改成绝对路径D:\webdata\webshd.mdb同时注意数据库目录要加 IIS 进程用户写权限。参数说明Provider 两个常用值 Jet.OLEDB.4.0 和 ACE.OLEDB.12.0 各有适用场景Jet 稳定但缺新驱动时可能要装 AccessDatabaseEngineACE 能读写 .accdb但要注意 64 位/32 位注册版本的坑。查询里rs.Open sql, Conn, 1, 3的第一个参数 1 是游标类型 adOpenKeyset第二个 3 是锁类型 adLockOptimistic只读查询建议改成rs.Open sql, Conn, 3, 1只读游标能降低并发锁冲突。另外注意很多老源码把数据库密码写在连接字符串或单独的密码变量里。如果你不确定密码可以用 Access 附带的“压缩和修复数据库”功能重新设置密码如果源码里压根没提密码建议在部署阶段就改掉防止别人拿到 .asp 文件直接读库。4. 打印与数据安全的避坑清单现象、原因、解决4.1 单据尺寸对不上打印机把 A4 当连续纸出现象点了打印纸张宽度明显不对要么左右裁掉要么整张偏大甚至连续纸打印机吐了半张空白才停下来。 原因老 ASP 页面里打印样式没写page尺寸浏览器按默认 A4 或上次记忆的纸张输出打印控件记了上一张单据的纸张规格。 解决在打印专用页面的 CSS 里显式声明media print和page { size: auto; margin: 0; }连续纸或page { size: A4; margin: 10mm; }A4 纸。如果用打印控件Windows 的“打印机服务器属性”里先新建一个名称为“送货单”的自定义纸张宽度设 241mm、高度按你单据长度设再把打印机默认纸张改成这个名字。这条改完至少 80% 的“打偏”能好。4.2 浏览器兼容三连ActiveX 被拦、打印机不响应、驱动位数混乱现象一台新装的 Win10 客户机打开打印页面页面显示一个错误对话框或者“自动化服务器不能创建对象”或者干脆点打印没反应。另一类现象是页面能打开但点“打印”后数据库报“未找到提供程序”。 原因老系统页面用 VBScript 或 ActiveX 做打印现代浏览器默认禁掉数据库报错则是 64 位 IIS 应用程序池找不到 32 位 Access 驱动。 解决最快的通用路线是让打印页面“降级”——IE 模式搞定 ActiveX或者改源码把打印入口换成window.print()的弹窗打印。数据库驱动问题则在 IIS 应用程序池“高级设置”里把“启用 32 位应用程序”改 True然后重启站点。这一条属于经典 ASP 换新机器必踩我接手的每套老系统几乎都会碰到先改应用程序池再谈其他。4.3 Access 数据库被锁库开着页面就断网再来一次全库只读现象办公室三个人同时开单一个人正在输单另外一个人点保存转圈半天然后报“操作需要使用较新的数据库格式”或“数据库已被锁定”。 原因Access 的并发是文件级锁写操作会把整个 .mdb 锁住长事务或者有页面打开连接没关闭锁时间就会被拉长。 解决先把所有连接用完即关经典的 ASP 里检查每个页面的末尾有没有Set rs Nothing、Conn.Close和Set Conn Nothing。再对繁忙时段做错峰——把开单集中在上午下午做审核打印。如果长时间多人同时写就要考虑把这套系统往 SQL Server 迁移了但那条路要改的 SQL 语法不多主要是连接字符串和几个 SQL 语法的差异这是可以排到下一步的改造。还有一个临时办法给数据库做每日自动备份备份等于后悔药任何时候都不能省。4.4 打印内容乱码或中文变成问号现象打印出来的送货单商品名称、客户名称全部是“”或者乱码。 原因页面编码和数据库编码不一致文件保存的物理编码不是 UTF-8 或页面没有声明charset老 ASP 源码很多是 GB2312 的页面用浏览器强编码访问就会乱。 解决确认数据库字段值和文件物理编码一致。如果源码页面是 GB2312就在head里确认meta http-equivContent-Type contenttext/html; charsetgb2312并在 ASP 文件头部加% Response.CodePage936 %如果全站是 UTF-8则Response.CodePage65001。注意不要两套混用一个站点只用一个 CodePage否则打印预览正常、实际打印乱码这种诡异情况会反复出现。4.5 数据备份把后悔药做进日常别等数据库坏了才想起现象数据库文件损坏或者被误更新单号错乱、历史数据缺失回天乏术。 原因Access 单文件存储异常断电、磁盘满、强杀进程都可能损坏 .mdb老系统没有自动备份机制。 解决在服务器任务计划程序里加一个每日备份任务把数据目录复制一份到另一块硬盘或 NAS保留最近 30 天。示例命令可以是一条简单的复制任务# 每日凌晨 3 点把库文件复制到备份目录文件名带日期 $dst D:\backup\webshd_ (Get-Date -Format yyyyMMdd) .mdb Copy-Item D:\webdata\webshd.mdb $dst -Force # 再顺手清理 30 天前的备份 Get-ChildItem D:\backup\webshd_*.mdb | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item逻辑说明第一行拼出带日期的备份文件名第二行执行复制第三、四行清理旧备份。整套任务不需要第三方工具Windows 自带任务计划程序就能跑。 参数说明数据库路径、备份路径、保留天数三个参数按你机器实际情况改备份目标建议放在另一块物理盘上避免同盘故障一起带走。5. 把打印彻底跑顺的验证套路与进阶思路系统部署完别急着正式用先做一遍“单据全流程验证”开一张测试单走完草稿→打印→核销看打印出的纸质单据核对字段是否和屏幕一致再连打三张连续纸看走纸是否稳定最后从历史记录里找到这张单、确认状态已锁定、明细金额能对上。这套验证半小时就够却能堵掉后面 80% 的客诉。进阶思路方面如果你确认这套系统要长期用优先做三件事一是把打印从 ActiveX 换到弹窗打印省掉客户机兼容问题二是把 Access 历史数据定期归档成只读档案让审计有据三是给开单页面加一个“单号防重复”的校验函数在提交前查一次最大单号这在 Access 多人并发下特别值得做不然断号和撞号会让你每个月都要人工对账。如果业务量继续涨再考虑往 SQL Server 迁那是一次性投入能彻底解决锁库问题。这套系统的架构放到今天的企业级 web 开发里确实老了但它的单据模型和打印流程仍然值得做内部信息化的人参考。我个人的习惯是把这套系统的维护做成一张检查表每周一看一次 IIS 日志里的 500 报错每月检查一次数据库大小和备份是否成功每次重装服务器先把纸张定义导出再重配。这些都是花小钱省大麻烦的事。这些年经手的老 ASP 系统凡是收拾得干净的无一例外都栽过上面这些坑——打印尺寸、驱动位数、数据库锁、字符集。你顺着这篇把环境、权限、打印、备份四个环节都过一遍这套 webshd v1.2 在你们办公室再战几年问题不大。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站