记录生活和工作的点滴
0

连锁超市门店的信息化建设

一、门店信息化建设面临的处境

 

 

    我国当前的零售业信息部大多处在一个比较尴尬的位置。

 

 

    一方面,零售业的高层管理者经历了这么多年的磨砺,本身对零售业信息化建设在理论上有一定的认知,在实际经营过程中有一定的支持;另一方面,毕竟信息部是一个非产出部门,在很多高层管理者的想法中,信息部只是一个花钱的部门,所以很多时候会出现高层管理者的想法与实际业务有所偏离(山东济南圣凯摩登城的信息系统选型就是一个典型例子)。

 

 

    在连锁超市也比较明显。首先,门店的信息系统(软硬件)都是由总部直接配发下来的,门店的信息部人员有再好的方案也只能望洋兴叹,总部不可能迅速更换系统。门店信息部人员有好的建议也很难在短时间内产生实际效果,它需要一个漫长的流转过程。而在这个过程中,门店信息部人员的合理建议往往得不到高层管理者的重视,或者高层管理者的观点与实际业务产生偏离。

 

 

    久而久之,零售信息部人员大多会失去了往日的热情与干劲。所以,作为高层管理者应该能经常拿出部分时间与信息部人员和基层工作人员进行交流、沟通。了解他们的思想,支持并协助实施他们好的建议,更好地为公司创造效益。信息化建设需要公司自上而下的重视与努力,离不开高层管理者的支持。同时作为信息部人员,也应该有自己的见解,有自己的立场。信息部人员应该站在公司的立场,要有勇气,对于不符合公司业务流程的高层管理者理念,能据理而争,不能因为是高层管理者的意愿,而眼巴巴地使信息化建设绕弯路。

 

 

 

    二、门店信息与总部信息的共享

 

 

    国内连锁超市信息化建设方面存在以下三个层次:

 

 

    1.一部分连锁超市,虽然总部与门店使用同一套系统,但由于地区局限、费用问题等各种原因还未能联网,各门店相对独立采购、独立销售、独立核算,能提供给总部的只是几个经营报表。

 

 

    2.很多连锁超市已经做到总部与门店联网,整个业务过程中数据同步、实时更新,甚至有自己的大区配送中心。

 

 

    3.部分连锁超市所采用的信息系统能支持集中采购和门店自行采购相结合,支持门店自动补货,按商品的直供、配送等订货属性自动生成订单,支持异地对账、结算等较为先进的功能。

 

 

    以上所列的几个层次,后两种基本上实现了总部与门店的信息共享,但这个信息共享只是单一层面的数据共享,只是低层次的要求。我们今天所提到的信息共享,有其更高层次的要求,真正的信息共享是建立在数据共享基础上的整个公司的企业文化、企业理念、企业规划等方面的共享。门店与总部、员工与企业之间有相融相通的信念、有相融相通的目标,我们的企业还愁做不好吗?

 

 

 

    三、门店信息部与其他部门的协调

 

 

    在信息化建设和日常应用过程中,最了解信息系统的是信息部人员,最全面了解公司业务流程的是信息部人员。在日常工作中,各部门往往因业务数据传输、公司业务流程等各种原因产生种种误解和矛盾,作为信息部人员我们应该尽最大的努力来协调各部门之间因流程、数据等一切有关信息化方面产生的各种误解与矛盾,使公司的信息化建设与应用向最优方面去发展。站在一个更高的高度上,为自己的前途着想,为企业着想。帮助各部门提高对信息系统的认知程度,提升其业务能力,使公司业务流程最优化,效益最大化。

 

 

 

    四、门店信息部人员的自身要求

 

 

    在零售业信息化发展的过程中,因其特殊的处境,造成了很多零售信息部人员职业素养不高、学习能力不强,对工作没热情、消极怠工,整天混日子。这对企业、个人的发展都是有害的。其实这也是整个零售业信息化建设方面很重要的一点。鉴于以上种种原因,门店信息部人员在对自己本身以及对业务方面要有一个更严格的要求,要有一个更高的标准:

 

 

    1.学习。不断的学习!不断提高自身的专业知识,及时了解国内外有关零售业的软硬件信息,这是信息部人员的基础。在这个基础上,要熟悉整个门店乃至整个公司的业务流程,不断学习,充实自己的业务知识。

 

 

    2.沟通。在现代开放、飞速发展的社会,作为一名合格的零售信息部人员不但在专业知识方面要过硬,在与人沟通、处理与协调各部门在信息化建设与应用中产生的各种问题上要有较高的能力和较好的处理技巧。这其中包括与各部门沟通、与高层管理者沟通、与同行沟通。

 

 

    3.思考。对门店信息化建设方面,多用心思考,多提合理化建议。在为公司节省资金的前提下,尽量让门店的信息系统达到最优。相信大家对啤酒尿布原理都耳熟能详了,我相信这个原理的发现肯定与沃尔玛信息部人员的钻研与思考有很大关系。作为信息部人员首先应该是一个服务部门,为公司各部门服务,要发现解决各种问题;在此基础上,我们更应该做一个决策支持部门,做深入详细的数据分析、数据挖掘,为公司高层管理者的决策提供坚实的数据支持。

 

 

    4.记录。有很多零售业信息部人员好像每天都忙忙碌碌,但当你问他每天都做了什么工作的时候,相信很多都回答不上来。为什么会这样呢?答案就是缺少记录。建议大家无论从事哪一方面的工作,无论在一个什么样的职位上都尽量能做到:把想到的事写下来(有计划);把写下的事做出来(有目的);把做过的事写下来(有总结)。

 

 

    这样,日久天长,无论是专业知识、业务流程,还是个人的职业素养,都在一点点的进步,相信总有一天我们会站到一个更高的高度上。

 

 

 

 

    今天所说由大处着眼,逐步详解;从整体到局部,逐步细化,且大部分都是有关人的方面。实际上也是如此,再好的信息系统如果没有人去使用、分析、挖掘,那也是一堆废物,这是基本道理。

 

 

    从构思到完稿,笔者觉得身心俱疲。因为笔者不仅是站在一个信息部主管的高度上来考虑,更是站在一个经营者的角度上来考虑信息化建设与应用方面的各种问题。真正做一个企业,真正做一份事业亦是如此。

0

给年轻工程师的忠告[觉得挺有道理]

[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!   

[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!   

[3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!   

[4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

[5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!   

[6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!   

[7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!   

[8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!   

[9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...   

[10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历

0

传单,JOB提示无法连接数据库

故障前操作:
    信息泵安装的时候出现可以通过查询分析器查询数据,但无法用软件读取,安装人员认为是msdtc没有运行,执行了以下命令:msdtc -install
    之后数据库连接故障,热备服务器其中一个重启

故障处理:
    出现故障是传单和JOB无法连接数据库,但查询分析器可以连接和使用.首先认为是MSDTC的问题,查询网上提供的方式:
----------------------方法一---------------------------
1,Distributed Transaction Coordinator服务依存于 Remote Procedure Call(RPC)和 Security Accounts Manager这两个服务。
在“控制面板”里点“管理工具”,点“服务”,确认这两个服务属性已经设为自动,并且已经启动。
2,在命令提示符里输入
msdtc -resetlog
-----------方法一执行后故障没有解决--------------------

----------------------方法二---------------------------
卸载msdtc:msdtc -uninstall
重启服务 Remote Procedure Call(RPC)
 Security Accounts Manager
Distributed Transaction Coordinator
-----------方法二执行后故障没有解决--------------------

----------------------方法三---------------------------
一 配置错误
jdbc配置语句为: jdbc:microsoft:sqlserver://server_name:1433
其中的sqlserver、server_name和端口号都要看仔细了。
二 1433端口问题
可以通过命令“netstat -an”,来查看是否开了1433端口,如果列表中没有,要增开端口。
要保持jdbc配置语句( jdbc:microsoft:sqlserver://server_name:1433)中的端口与数据库传输协议默认的端口相同。
MSSQL设置端口号步骤如下:
1. 打开企业管理器,依次在控制台根目录 ->Microsoft SQL Servers->SQL Server 组,列出一部分数据库服务器。
2. 右击我们要连接的数据库服务器,选择属性,在常规选项卡点击网络配置弹出新窗口。
3. 在启用的协议区域我们选择 TCP/IP ,点击属性按钮,弹出新窗口。在这个窗口有网络协议默认值设置,一般默认端口是:1433。 如果你在url中用的端口号与这个不同,就会出现错误。应保持二者相同。
三 没打补丁
可以用如下的方式查看MSSQL的版本:
打开企业管理器-〉工具-〉SQL查询分析器-〉帮助-〉关于
查看MSSQL的详细版本号
如果 是 8.00.194 就是还没打补丁
8.00.760 就是SP3
8.00.2039 就是SP4
四 系统防火墙或者杀毒软件
如果系统开防火墙或者杀毒软件,在有些情况下也可以出现类似的问题。
没有遇见过,有人这么说。
-----------方法三执行后故障没有解决--------------------

-----------------咨询软件公司----------------
重新复制配置job和trans,检查数据库dbcc checkdb,检查数据库trans_connectdb
均未发现有问题

---------------
再察看服务器所有服务,发现服务启动的时候,sql server使用的是域用户zjsb\adminstrator,Distributed Transaction Coordinator使用的是本地用户,更改运行用户后,故障解决


回顾:
通过msdtc应该是安装后用本地用户运行服务,双机热备情况下SQL server是一台虚拟出来的服务器,要用域用户访问,而本地服务未使用域用户运行,所以出现了远程数据库连接时候有问题.记录一下下列SQL相关服务用域用户访问,以便以后检查
Cluster Service  群集相关
Distributed Transaction Coordinator msdtc分布式访问
MSSQLSERVER  
SQLSERVERAGENT

0

删除数据表

删除以test开头的表,自己更改下条件就可以了可以试试看
declare @name varchar(20)
while(exists(select * from sysobjects where name like 'test%'))
begin
select @name=name from sysobjects where name like 'test%'
exec ('drop table '+@name)
end

 

若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速、无日志记录的方法。TRUNCATE TABLE 与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE 速度更快,并且使用更少的系统资源和事务日志资源。

与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点:

  • 所用的事务日志空间较少。

    DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。
     
  • 使用的锁通常较少。

    当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。
     
  • 如无例外,在表中不会留有任何页。

    执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。
     

与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义与其索引和其他关联对象一起保留在数据库中。

0

单品转柜错误(购销处理)

begin tran
--删除转柜记帐单
delete unaccsheet0 where sheettype in (2371,2372) and venderid=3210 and shopid='A002'
--更新商品柜组属性
update countergoods set counterid=2501,countgroupid=2501 where goodsid=86075 and shopid='A002'
--更新销售柜组
update salegoods201201 set countgroupid=2501 where goodsid=86075 and shopid='A002' and sdate>='20120110'
--更新成本柜组
update salecost201201 set countgroupid=2501 where goodsid=86075 and shopid='A002' and sdate>='20120110'
 
update rpt_d_shopsstock set countgroupid=2501  where goodsid=86075 and shopid='A002' and sdate>='20120110'
 
commit

0

DOS是怎样进行内存管理的

 

342.DOS是怎样进行内存管理的?
内存是计算机中存储程序代码以及数据的地方,是程序赖以运行的舞台。内存在计算机中编址,形成了内存地址空间,既包括了RAM内存,也包括了ROM内存。通常的内存
编址方法是按字节(8bit进行的,1M内存便是指大小为1兆字节的内存空间。以PC机为例,早期的8086/8088系统共有20根地址线,则可寻址2^20=1M字节;80286系统则有
24根地址线,相应可寻址2^24=16M字节,到了386、486,地址总线宽度扩大到了32根,可寻址的内存空间也扩大为4G字节。
内存地址空间又称为物理地址空间,它是实际主存储器的大小;相对有虚拟地址空间的概念,也称逻辑地址空间,它指的是应用程序的编级地址空间。二者有时等同,有时相互区别,这取决于系统的内存管理策略。
无论是早期的DOS版本,还是最近的6.22;DOS下直接使用的都是物理地址空间。如果要使用逻辑地址空间,你必须自己编程。这一点,我们后面还要讲到。
DOS是单用户单作业操作系统,因此采用的是固定分区内存管理技术,把内存低端部分(1M以下)固定地分成系统区和用户区(TPA),见图4-3。
当前版本的MS—DOS可以管理1MB的物理地址空间。在IBMPC及其兼容机上,由MS-DOS和其他程序所占的内存在地址0000H处开始,并可达地址09FFFFH,此640KB的RAM区域有时称为“常规内存区”。此地址以上的内存区是为ROM硬件驱动程序、视频刷新缓冲区等所保留的。非IBM兼容机有可能使用其他内存区段。在MS—DOS控制下的RAM区可分成两个主要部分:
操作系统区域
临时程序区域(TPA)


操作系统区域在地址0000H处开始,即它占用RAM的最低部分。该处有中断向量表、操作系统模块及其所拥有的表(table)和缓冲区,以及 config.sys)文件中指定的附加可安装设备驱动程序及command.com命令解释程序的驻留部分。操作系统区所占的内存量随MS-DOS版本、磁盘缓冲区数、可安装设备驱动程序个数与大小而改变。
临时程序区为RAM中所存操作系统区上面的剩余部分,是动态可分配的内存。DOS将在应用程序运行时总是试图把这部分内存分配给它,必要时系统区1(参见图4—3)将腾出以扩大TPA区。如果此区过小,则会出现。out of memory内存不够的错误,你的应用程序将无法运行。 
当出现此错误时,在低版本DOS中将是一筹莫展,在8086/8088中亦是如此,最多能做到的是不装载任何TSR程序。这意味着你甚至需要牺牲鼠标器支持;而高版本DOS则可以利用将要讲到的两点功能(1)把DOS自身一部分装载到HMA中,(2)把TSR程序和驱动程序装载到UMB,从而达到扩大 TPA,供应用程序运行的目的。
对于1M以上的内存,DOS将无能为力,除了下面将要讲到HMA以外。


================================================================
343.为什么在386、486的计算机上虽然有4M或更多的内存配置,却总是会出现“内存不够”的错误?

这正是DOS的局限性所带来的。从前面的问题中我们可以看出,在DOS中,真正供应用程序运行区域是TPA。DOS为了保持与8086/8088系统兼容性,把TPA限制在1M以下.所以有时计算机虽有4M或更多内存,你也无法直接使用。当然,1M以上的内存也还是可以利用的。

(1)在保护模式下,你可以直接寻址1M以上空问。DOS是无法做到这一点,而Windows或OS/2等其他操作系统可以做到。
(2)利用DOS提供的工具,间接访问1M以上空间,如EMS或XMS技术。关于EMS和XMS请参见《如何使用扩充内存(Expanded)》和《如何使用扩展内存Extended)》。


===============================
346.什么是常规内存、扩充内存、扩展内存?

常规内存(Conventional Memory)是指从00000H到9FFFPH这640k的内存空间,它是DOS的传统势力范围.DOS对这一段的划分和管理请参阅《DOS是怎样进行内存管理的》。

扩充内存(Expanded Memory)是一种不参与存储器统一统址的内存。其使用规范称作EMS(Expanded Memory Sepecfication),因为是由Lotus,Intel和Microsoft三家公司联合开发的,故也称作LIM EMS。早期XT机型上扩充内存以内存卡的物理形式出现,后来的高档微机上则可以由扩展内存(Extended Memory)来仿真扩充内存,这是CPU开始支持内存映射的结果。

扩展内存是原1MB内存空间的纵向延伸.这种内存只存在于80286以上的机型之中。这种内存,只是在“保护(protected)”方式时是可寻址的; DOS运行于real方式(实模式),仿真8086寻址空间,因此标准的DOS应用程序是不能直接访问它的。对286来说,CPU共有24根地址线,其扩展内存可达15MB,而在386,486或更高档机器上。扩展内存可拥有4GB-1MB的大小,这是因为它们的地址总线宽度为32位。

===============================
347 如何使用扩充内存(Expanded Memory)?

因为扩充内存没有统一编址,所以CPU不能象访问普通的主存那样通过地址线来直接访问它。这中间就需要扩充内存管理程序EMM,也既是软件技术的支持。
对扩充内存的访问有些像日常去图书馆借书。你是没有权力进入书库象查检自己的书柜那样进行“访问”的,只有去到柜台那儿,交给管理员小姐您的索书单,她便进库去找寻您要的书,找到之后回来再为您办理手续——如果把书库看作您自家书柜这一主存的扩充内存的话,管理员小姐便是EMM,您便是CPU。柜台呢,则称作页框.
页框的大小是64K,为什么是64K呢?您一定记得8086的段式访问机制,一个段的大小便是64k。这样,只要知道了页框起始处的段地址,就可以通过一个偏移量指针遍历整个页框,如果超过64K,那就需要调整段地址了.
或许EMS的设计者考虑到内存的使用效率而把扩充内存以16k为单位进行组织划分,而不是一个页框的大小。现在EMS内中的每16k就称作一页,那么 CPU同时也就只能“看见”扩充内存其中四页,虽然程序可以申请到不止四页的扩充内存。这自然类似于图书馆的制度,您可以“借”图书馆的许多书,甚至全部的书,但一次您只能“惜到”十本书,看
完归还之后再来借.
编程中对扩充内存进行访问的步骤大致如下:
(1)EMM安装了没有?
无论是EMM386.EXE还是QEMM386.SYS等EMM程序,具有统一的设备名“EMMxxxx”,我们可以通过判断此设备是否安装来判断EMM存在与否?
(2)页框起始地址在何处?
这是判断EMM已安装后的第二个步骤。页框是我们“看到”EMS内存的窗口,当然首先要找到它。
(3)申请EMS内存

如果您估计您的程序数据量不会超过1MB,那就申请64页的扩充内存好了(当然要实际存在如此多的扩充内存才可以,EMM不可能无中生有),申请到的EMS内存由一个称作句柄的整数来标志管理.
当然您可以随时根据需要多次申请EMS内存,只不过处理多个句柄总是要多些麻烦。
(4)映射EMS内存
申请到了一些EMS内存页面,意味着你可以“看”它们,但迄今为止它们并不“可见”,还需要进行映射。映射的意思,也就告诉EMM,让它把哪一个句柄的哪四页(少一些页自然可以),放到页框这个窗口中来。
做完映射工作之后,您就可以往页框中存放,读取数据了.当这几页用完之后.再映射其它几页到页框中,而原来的四页则不再‘可见’。如此这般,您就可以把您大量的数据存放到EMS内存中。
(5)释放EMS内存
当工作完成之后,还需要把申请到的EMS内存加以释放,因为EMM无法判断程序的结束而主动地来完成这项工作。
这一系列步骤使得EMS内存的使用看起来有些麻烦。的确,EMS内存的使用在一定程度上降低了系统性能.但这是值得的,要知道世界上没有免费的午餐.
。。。。。。

==================================
   348.如何使用扩展内存(Extended Memory)?

早期在DOS下访问扩展内存,必须通过BIOS中断INT l5H,但是因为该接口功能不够严谨,各软件之间容易因为使用扩展内存而发生冲突.有鉴于此,1988年底Microsoft,
Intel,Lotus和AST四家公司共同开发出了关于存取扩展内存的标准,这就是扩展内存规范XMS(Extended Memory Specification).
为了兼容性,大多数XMS驱动程序都可以为INT l5H保留一席之地.
DOS及DOS应用程序无法直接访问扩展内存,必须通过XMS功能接口达到目的.
XMS编程大致可分以下几个步骤:
(1)判断XMS是否已安装
这一点可以通过调用INT 2FH的4300H 号子功能来实现,通常INT 2FH以其“假脱机打印”功能而闻名。
功能调用之后,若寄存器AL=80H 表示XMS驱动程序已安装,反之则否.
(2)申请XMS内存块 ’
XMS编程接口有一点很特殊,不同于一般的中断调用,就是各子功能的执行是要对XMS驱动程序入口点进行远调用,而不是中断调用.
XMS驱动程序的入口地址可以通过INT 2FH的子功能4310H号来得到.调用完毕后,ES:BX即为入口点.
。。。。。。

(3)数据的存取
申请到了扩展内存,但我们并不能直接使用它,仍需要先把数据存放在一个常规内存缓冲区内,待恰当时机再把数据从缓冲区移到扩展内存之中.这一点对应XMS的0BH 号子功能:移动扩展内存块。

(4)释放扩展内存
该子功能号为0AH,入口参数为要释放的扩展内存块的句柄.
对于上面的讨论,请进一步阅读有关资料,以得到更详尽的信息.
下面给出一个完整的例子,供你参考。
。。。。。。


==================================
349.什么是UMB? 如何使用UMB?

640K~1MB这一段地址空间是微机的设计者保留下来给系统以及外部扩展设备来使用的,因此在这一段之中没有系统板上的RAM.如果您的机器配置了 1MB的内存,并且机器没有打开明SHADOW功能的话,将会有384k的扩展内存,此时RAM最高地址为1408K。
这一段地址空间某些部分的分配是比较固定的:
。。。。。。
其他部分的地址空间则没有固定地被占用,由其他硬件扩展设备,如汉卡、网卡等等来选择.一般情况下,这些空闲地址空间可用来再生成上位内存块UMB,供DOS利用.
让我们来看一个VGA配置的PC兼容机有多大的空闲空间。首先B000—B7FF这一段32k的空闲,再就是从C800开始到EFFF结束的这一段,大小为160k——所以我们总共可以有192KB的空间提供给DOS。如果再算上HMA 64K的话,就意味着DOS拥有
了896k=(640+192+64)K 的空间!
事情总要打点折扣,首先如果你安装了网卡,便只有牺牲16K的大小(通常情况);如果您的应用程序需要扩充内存,或者通过扩充内存卡获得,或者通过 EMM386.exe等类似的EMM程序利用扩展内存来仿真得到,但都必须在640k--1MB这一段的空闲区内生成一个EMS页框,又会占去64K的大小.
另外一个问题是保留内存中的空闲区并不连续,在插入其他插卡后有可能被再次分割.如果一个网卡占用了E000~E3FF这16K,原选160k的连续空闲区将被分割为两块,一块96K,一块48K。这就使得DOS在把驱动程序、内存驻留程序装载到UMB运行时,不可避免地造成空间浪费,不能充分利用.
这儿是用MSD察看保留内存区的一个例子。
。。。。。。
保留内存区又称上位内存区UMA,所以利用其间的空闲地址再生成的RAM块被称作UMB,也就是上位内存块的意思。
为了使DOS能够利用UMB,仅仅在CONFIG.SYS中加载EMM386.exe之类的UMB Provider程序还是不够的,必须再通过命令DOS=UMB在二者之间建立起联系,这样DOS的DEVICEHIGH、LH命令才起作用,DOS的中断功能调用也才能够访问UMB。如果没有在CONFIG中运行DOS=UMB,则利用MSD、MEM等实用程序将无法看到UMB的影子,但此时应用程序可以直接向UMB Provider程序申请使用UMB。

==================================
350,什么是HMA?如何使用HMA?

高位内存区HMA可能是最近人摸不着头脑的东西,它是1MB以上的第一个64K,其实要少16个字节,也就是65520字节的大小.这一段可以为DOS直接访问。
不是说DOS只能直接访问1MB以下的内存区域吗? 
我们已知道,DOS的寻址方式是8086/8088的段式机制,16位段地址左移四位再加上16位的偏移量形成20位的地址。这样问题便来了,1MB的绝对地址可以写成段:偏移量的形成为FFFF:000FH,也就是该段起于1MB空间的最后一小节FFFF0H 处;如图4-4所示,很明显,该段还有一部分的空间在1MB以上,也就是扩展内存之内.为FFFF:000FH只是该段的第一个小节结束的地方;偏移量还有FFF0的“余量”,
   这“余量”确定的空间显然可以由DOS直接访问,只得把编移量累加上去就行了.该段的1MB以上区域便是HMA,很显然其大小为64K-16B.
从绝对地址的角度看,HMA的第一个字节地址FFFF:0010H 已是21位地址宽度:1000000H.这在8086/8088中将产生地址绕回错误,因为8086/8088只有20根地址线,
第21根子虚乌有,所以1000000H 处即为0000OH 处.这样,“HMA”便成了0000:0000H至0OOO:FFEFH这一段!
早期的一些应用程序利用这一点来作为特殊技巧,达到所需的编程效果,也就是说,它们依赖于地址回绕.所以,到了后来的286、386等机器,虽然CPU拥有了24根、32根的地址总线,解决了8086/8088中16位地址进位超出总线宽度的问题,却为了保持兼容性,并没有把HMA区直接向DOS开放,而是通过—个“开关”进行控制.
这个“开关”便是我们常常见到的A20 line。A20便是第21根地址线,众所周知,计算
机中的总线都是从0开始编号的.
DOS下HMA区的管理由HIMEM.SYS来提供。程序可以控制A20 line的开、关,可以申请使用HMA,但有一点,HMA不能分割使用,也就是说一次只能有一个程序在其间运行.如果在CONFIG.SYS文件中加载了 HIMEM.SYS驱动程序并且同时有DOS=high命令时,MS-DOS将使A20线有效,并为HMA直新定位系统代码.
。。。。。。
笔者建议在编程中不要试图去使用HMA,免得遇到很多不必要的麻烦,利用HMA的最理想方法便是通过在CONFIG.SYS中加载HIMEM.SYS并运行DOS=high命令,把MS-DOS系统代码加载至其中,从而腾出更多的常规内存来.在DOS 6.2版本中,
DOS=high命令可腾出约49K的空间出来.
关于HMA的使用和编程,请进一步阅读有关的详细资料.


=============================
351.如何使用HIMEM.SYS?
HIMEM.SYS是一扩展(Extended)内存管理程序,也就是常说的XMM,它为扩展内存的使用提供了统一接口标准XMS,避免了早期扩展内存使用当中存在的冲突问题;同时HIMEM.SYS还提供对HMA的管理.
HIMEM.SYS必须在CONFIG.SYS中首先加载,这一点很容易理解,在EMM386.EXE加载之后,保留内存区持有UMB出现, HIMEM.SYS也提供对UMB进行管理的接口.如果在CONFIG.SYS没有运行DOS=UMB命令,也即没有建立起DOS和UMB之间的联系时,应用程序可以直接向HIMEM.SYS申请使用UMB.

=============================
       352.如何使用EMM386.EXE?
EMM386.EXE利用扩展(Extended)内存来仿真扩充(Expanded)内存,以提供对需要扩充内存的应用程序的支持,同时它还提供UMB功能,使得一些设备驱动程序和内存驻留程序能够加载至UMB中,从而腾出更多的常规内存。
EMM386.EXE在CONFIG.SYS中必须位于HIMEM.SYS之后来加载,因为它依赖于HIMEM.SYS的扩展内存支持。这二者也都必须使用DEVICE来加载,而不是DEVICEHIGH,这是因为DEVICEHIGH依赖于EMM386.EXE提供的UMB功能。同理,
要在AUTOEXEC.BAT中使用LOADHIGH(LH)命令也必须在CONFIG.SYS中已加载EMM386.EXE前提之下,并使用DOS=UMB命令在DOS和UMB之间建立起联系。

0

条码第十三位(校验位)计算

 

校验码的计算方法 代码位置序号 代码位置序号是指包括校验码在内的,由右至左的顺序号(校验码的代码位置序号为1)。
 
计算步骤 校验码的计算步骤如下:
a.从代码位置序号2开始,所有偶数位的数字代码求和。
b.将步骤a的和乘以3。
c.从代码位置序号3开始,所有奇数位的数字代码求和。
d.将步骤b与步骤c的结果相加。
e.用大于或等于步骤d所得结果且为10最小整数倍的数减去步骤d所得结果,其差即为所求校验码的值。
示例:代码690123456789X1校验码的计算见表B.1。
表1 校验码的计算方法 步 骤
举 例 说 明
1.自右向左顺序编号 位置序号 13 12 11 10 9 8 7 6 5 4 3 2 1 代码 6 9 0 1 2 3 4 5 6 7 8 9 X
2.从序号2开始求出偶数位上数字之和① 9+7+5+3+1+9=34 ①
3. ①*3=② 34×3=102 ②
4.从序号3开始求出奇数位上数字之和③ 8+6+4+2+0+6=26 ③
5. ②+③=④ 102+26=128 ④
6.用大于或等于结果④且为10最小整数倍的数减去④,其差即为所求校验码的值 130-128=2 校验码X1=2 
 
 
select *,
right((10-
((0+SUBSTRING(plu_no,1,1)+SUBSTRING(plu_no,3,1)+SUBSTRING(plu_no,5,1)+SUBSTRING(plu_no,7,1)+SUBSTRING(plu_no,9,1)+SUBSTRING(plu_no,11,1))+
(0+SUBSTRING(plu_no,2,1)+SUBSTRING(plu_no,4,1)+SUBSTRING(plu_no,6,1)+SUBSTRING(plu_no,8,1)+SUBSTRING(plu_no,10,1)+SUBSTRING(plu_no,12,1))*3)%10),1)
 from ba_multi_plu
0

批处理(bat)实现SQLServer数据库备份与还原

 

--1.数据库备份脚本sqlserverbackup.sql

 

-- SQLServer2000数据库系统清理用户数据库日志和备份用户数据库数据脚本

 

declare@dumpfile varchar(50)

declare@msg varchar(70)

   select @dumpfile = 'd:\backup\north' + datename(dw,getdate())+'.bak'

   select @msg=convert(char(26),getdate(),9)+'-----正在清理日志......'

   print @msg

backuptran northwind with truncate_only

if(@@ERROR <> 0 )

begin

   select @msg=convert(char(26),getdate(),9)+'-----清理日志失败或出现异常......'

   print @msg

end

else

begin

   select @msg=convert(char(26),getdate(),9)+'-----清理日志完毕......'

   print @msg

end

   select @msg=convert(char(26),getdate(),9)+'-----开始备份northwind数据库.....'

   print @msg

backupdatabase northwind to disk=@dumpfile

if(@@ERROR <> 0 )

begin

   select @msg=convert(char(26),getdate(),9)+'-----备份数据失败或出现异常'

   print @msg

end

else

begin

   select @msg=convert(char(26),getdate(),9)+'-----数据库备份完毕'

   print @msg

end

 

 

@net start "mssqlserver"

@isql -Usa -Psa -i d:\backup\sqlserverbackup.sql -o d:\backup\sqlserverbackup.out

@echo ……正在备份中……

@pause

 

--2.数据库还原脚本sqlserverrestore.sql

 

 

declare @dumpfile varchar(50)
declare @msg varchar(70)
select @dumpfile = 'e:\myshopbak01\myshoppos.bak'
select @msg=convert(char(26),getdate(),9)
print @msg
restore database myshoppos from disk=@dumpfile
if (@@ERROR <> 0 )
begin
select @msg=convert(char(26),getdate(),9)+'-----还原数据失败或出现异常'
print @msg
end
else
begin
select @msg=convert(char(26),getdate(),9)+'-----数据库还原完毕'
print @msg
end

 

--将下面的脚本保存为: 备份数据库.bat

 

@net start "mssqlserver"

@isql -Usa -Padmin -i d:\backup\sqlserverbackup.sql -o d:\backup\sqlserverbackup.out

@echo ……正在备份中……

@pause

 

--将下面的脚本保存为:还原数据库.bat

 

@echo ******开始还原数据库*****

@net start "mssqlserver"

@isql -Usa -Psa -i d:\backup\sqlserverrestore.sql -o d:\backup\sqlserverrestore.out

@pause

1/12, 89«1234»
Processed in 0.0849 second(s), 6 queries