懋 的个人资料懋·博照片日志列表 工具 帮助

日志


7月15日

网页设计标准尺寸

1、800*600下,网页宽度保持在778以内,就不会出现水平滚动条,高度则视版面和内容决定。
2、1024*768下,网页宽度保持在1002以内,如果满框显示的话,高度是612-615之间.就不会出现水平滚动条和垂直滚动条。
3、在ps里面做网页可以在800*600状态下显示全屏,页面的下方又不会出现滑动条,尺寸为740*560左右
4、在PS里做的图到了网上就不一样了,颜色等等方面,因为WEB上面只用到256WEB安全色,而PS中的RGB或者CMYK以及LAB或者HSB的色域很宽颜色范围很广,所以自然会有失色的现象.
页面标准按800*600分辨率制作,实际尺寸为778*434px
页面长度原则上不超过3屏,宽度不超过1屏
每个标准页面为A4幅面大小,即8.5X11英寸
全尺寸banner为468*60px,半尺寸banner为234*60px,小banner为88*31px
另外120*90,120*60也是小图标的标准尺寸
每个非首页静态页面含图片字节不超过60K,全尺寸banner不超过14K
标准网页广告尺寸规格一、120*120,这种广告规格适用于产品或新闻照片展示。
二、120*60,这种广告规格主要用于做LOGO使用。
三、120*90,主要应用于产品演示或大型LOGO。
四、125*125,这种规格适于表现照片效果的图像广告。
五、234*60,这种规格适用于框架或左右形式主页的广告链接。
六、392*72,主要用于有较多图片展示的广告条,用于页眉或页脚。
七、468*60,应用最为广泛的广告条尺寸,用于页眉或页脚。
八、88*31,主要用于网页链接,或网站小型LOGO。
广告形式         像素大小                                最大尺寸            备注
BUTTON         120*60(必须用gif)                    7K  
                         215*50(必须用gif)                    7K
通栏                 760*100                                    25K               静态图片或减少运动效果
                         430*50                                      15K
超级通栏         760*100 to 760*200              共40K            静态图片或减少运动效果
巨幅广告         336*280                                    35K
                         585*120
竖边广告         130*300                                    25K
全屏广告         800*600                                    40K               必须为静态图片,FLASH格式
图文混排                                                                                 各频道不同 15K
弹出窗口         400*300(尽量用gif)                 40K
BANNER         468*60(尽量用gif)                   18K
悬停按钮          80*80(必须用gif)                      7K
流媒体             300*200(可做不规则形状但尺寸不能超过300*200) 30K 播放时间 小于5秒60帧(1秒/12帧)
网页中的广告尺寸
1.首页右上,尺寸120*60      2.首页顶部通栏,尺寸468*60      3.首页顶部通栏,尺寸760*60
4.首页中部通栏,尺寸580*60    5.内页顶部通栏,尺寸468*60    6.内页顶部通栏,尺寸760*60
7.内页左上,尺寸150*60或300*300    8.下载地址页面,尺寸560*60或468*60
9.内页底部通栏,尺寸760*60     10.左漂浮,尺寸80*80或100*100
11.右漂浮,尺寸80*80或100*100以上几种说法可能有点小的出入,大家可以探讨一下。
IAB和EIAA发布新的网络广告尺寸标准
在这6种格式中,除了去年iab发布的4种“通用广告包”中的格式:160x600, 300x250, 180x150及728x90,还包括新公布的468x60 和120x600(擎天柱)2种。
12月1日

[总结]企业网站建设中常用中英文对照

 

  门户网站 portals website

  网站导航 site map

  公司简介 profile / company profile / company

  公司设备 equipment

  公司荣誉 glories

  企业文化 culture

  产品展示 product

  资质认证 quality certification

  企业规模 scale

  营销网络 sales network

  组织机构 organization

  合作加盟 join in cooperation

  技术力量 technology

  经理致辞 manager`s oration

  发展历程 development history

  工程案例 engineering projects

  业务范围 business scope

  分支机构 branches

  供求信息 supply & demand

  经营理念 operation principle

  产品销售 sales

  联系我们 contact us

  信息发布 information

  返回首页 homepage

  产品定购 order

  分类浏览 browse by category

  电子商务 e-business

  公司实力 strength

  版权所有 copy right

  友情连结 hot link

  应用领域 application fields

  人力资源 human resource / hr

  领导致辞 leader`s oration

  企业资质 enterprise qualification

  行业新闻 trade news

  行业动态 trends

  客户留言 customer message

  客户服务 customer service

  新闻动态 news & trends

  公司名称 company name

  销售热线 sales hot-line

  联系人 contact person

  您的要求 your requirements

  建设中 in construction

  证书 certificate

  地址 address / add

  邮编 postal code zipcode

  电话 tel

  传真 fax

  产品名称 product name

  产品说明 description

  价格 price

  品牌 brand

  规格 specification

  尺寸 size

  生产厂家 manufacuturer

  型号 model

  产品标号 item no.

  技术指标 technique data

  产品描述 description

  产地 production place

  销售信息 sales information

  用途 application

  论坛 forum

  在线订购 on-line order

  招商 enterprise-establishing

  招标 bid inviting

  综述 general

  业绩 achievements

  招聘 join us

  求贤纳士 join us

  大事 great event

  动态 trends

  服务 service

  投资 investment

  行业 industry

  规划 programming

  环境 environment

  发送 delivery

  提交 submit

  重写 reset

  登录 enter

  注册 login

  某公司技术支持 powered by sdw.cn

  社区 community

  业务介绍 business introduction

  在线调查 online inquiry / inquiry

  下载中心 download

  会员登陆 member entrance

  意见反馈 feedback

  常见问题 FAQ / Frequently Asked Questions

  中心概况 general profile

  教育培训 education & training

  游乐园 amusement park

  在线交流 online communication

11月15日

用JS判断一个网页中的图片是否下载结束

  <script>  
  var   oImage   =   new   Image();  
  oImage.src="xxxx.gif";  
  if(oImage.readyState   ==   "complete")  
  alert("complete.");  
  else   if(oImage.readyState   ==   "uninitialized")  
  alert("uninitialized");  
  </script>  

var oimgAry=new Array();

var oImage = new Image();  
 oImage.src = imageUrl;
 oimgAry.push(oImage);
...

function chkIsImageLoaded()
{
 var isAllLoaded = 1;
 for(var j=0;j<oimgAry.length;j++)
 {
  var oImage = oimgAry[j];
  if(oImage.readyState == "uninitialized")
  {
   isAllLoaded = 0;
   break;
  }
 }
 if(isAllLoaded==0)
 {
  setTimeout("chkIsImageLoaded()", 1000);
 }
 else if(isAllLoaded==1)
 {
  document.getElementById("LoadingTD").style.display = "none";
  document.getElementById("ADareaTD").style.display = "block";
 }
}
chkIsImageLoaded();
11月13日

asp.net生成高清晰缩略图

  1.         /// <summary>
  2.         /// 生成缩略图
  3.         /// </summary>
  4.         /// <param name="originalImagePath">源图路径(物理路径)</param>
  5.         /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
  6.         /// <param name="width">缩略图宽度</param>
  7.         /// <param name="height">缩略图高度</param>  
  8.         public  void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height)
  9.         {
  10.           System.Drawing.Image   originalImage = System.Drawing.Image.FromFile(originalImagePath);
  11.            int towidth = 0;
  12.            int toheight =0;
  13.             if(originalImage.Width>width &&originalImage.Height<height)
  14.             {
  15.                 towidth = width;
  16.                 toheight = originalImage.Height;
  17.             }
  18.             if (originalImage.Width<width && originalImage.Height >height)
  19.             {
  20.                 towidth = originalImage.Width;
  21.                 toheight = height;
  22.             }
  23.             if (originalImage.Width > width && originalImage.Height > height)
  24.             {
  25.                 towidth = width;
  26.                 toheight = height;
  27.             }
  28.             if (originalImage.Width < width && originalImage.Height < height)
  29.             {
  30.                 towidth = originalImage.Width;
  31.                 toheight = originalImage.Height;
  32.             }
  33.             int x = 0;//左上角的x坐标
  34.             int y = 0;//左上角的y坐标
  35.            
  36.             //新建一个bmp图片
  37.          System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
  38.             //新建一个画板
  39.             Graphics g = System.Drawing.Graphics.FromImage(bitmap);
  40.             //设置高质量插值法
  41.             g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  42.             //设置高质量,低速度呈现平滑程度
  43.             g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  44.             //清空画布并以透明背景色填充
  45.             g.Clear(Color.Transparent);
  46.             //在指定位置并且按指定大小绘制原图片的指定部分
  47.             g.DrawImage(originalImage,x,y,towidth,toheight);
  48.             try
  49.             {
  50.                 //以jpg格式保存缩略图
  51.                 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
  52.             }
  53.             catch (System.Exception e)
  54.             {
  55.                 throw e;
  56.             }
  57.             finally
  58.             {
  59.                 originalImage.Dispose();
  60.                 bitmap.Dispose();
  61.                 g.Dispose();
  62.             }
  63.         }
9月18日

[推荐]模拟多浏览器兼容测试工具-IETester

  在IE7刚出道时,涉及到不同IE前的表现标准不统一时,当制作者需要测试不同IE之间的页面CSS兼容性时,需要在不同电脑上测试。

  随后 multiple-ie 出来了,让我惊喜了一段时间,因为它可以在同一台电脑上,同时使用IE5.5/IE6/IE7,确实在很大的程度上增加了页面制作测试的便利。

  现在,又出现了一个让人激动人心的工具,那就是IETester,以下是IETester的简介:

j2008917171456

IETester是一个非常棒的网页设计师的必备工具,有了这个工具,就可以知道网页在IE6,或者IE7,或者IE8 beta2的显示情况。IETester v0.2.3可以测试IE5.5,IE6,IE7,IE beta2等4个IE浏览器

下载地址:
http://www.greendown.cn/soft/11658.html
IETester 0.2.3┊可测试IE5.5/IE6/IE7/IE8beta2等浏览器┊多国语言纯净安装版

安装时注意直接选择中文语言
y2008917171449
9月17日

Javascript动态生成表格的性能调优

  客户端动态输出table数据并展示表格,是web应用中较为常见的工作。对于循环打印输出tr,td本身是一件非常僵硬和暴力的编程办法,再加上最后绑定元素innerHTML字符流输出,
系统所消耗的性能代价是非常高昂的,如果我们需要展现的数据非常庞大时,那么代价也是成倍的。然而这种动态输出表格的方法是大多数客户端程序员最常用的方法。那么基于最常用的方法,
如何才能降低性能成本,改善用户体验,快速安全的显示我们所需要的数据呢?
我认为从根本上调优需要从两个方面去考虑。
1:server的数据吐出和client的数据解析。这里涉及的知识点较多,今后再做详细的说明。但是对于较为复杂的xml的数据格式来说,client的解析应该用xpath寻址和dom内置对象相结合的方法,高速定位。
2:DHTML的优化。包括dom,css,js的优化,也就是MVC(model, view, control)的优化。
这里我们用js动态生成一个table, 构建一个3000行,8列的表格,代码分多个版本,便于清晰的比较每个版本不同的性能消耗。
vision 0.1 【耗时14694ms】
貌似以下的写法是没有任何错误,但是确是最暴力,效率最低,性能消耗最大的写法。对于大量的数据行和列,用for循环拼接元素字符串,最后innerHTML输出是不可取的。
3000记录页面加载耗时14694毫秒,近15秒。这样的页面数据加载是近乎灾难的,应该竭力避免。
<html>
 <body>
  <div id="tableDiv"></div>
  <script>
   var maxRow =3000;
   var maxCol = 8;
   var strTbl = "<table border='1'><tbody>";
   var strTbody = '';
  
   for(var i = 0; i < maxRow; i++){
    strTbody +="<tr>";
     for(var j = 0; j < maxCol; j++){
      strTbody += "<td>test</td>";
     }
    strTbody += "</tr>";
   }
   strTbl = strTbody + "</tbody></table>";
  
   var obj = document.getElementById("tableDiv");
   obj.innerHTML = strTbl;
  
  </script>
 </body>
</html>

vision 0.2 【耗时3623ms】
这个版本的代码有非常大的改进,采用DOM技术动态添加元素,说明在需要处理展现大量数据的情况下,运用DOM快速定位并添加绑定元素的方法,效率远比拼接html元素字符串的方法要高许多。
整个页面加载完成所耗的时间为3623毫秒。3000行的记录耗时不到4秒,这个版本的代码结构和编程思路也无可挑剔, 那么这样的加载速度是否可以再快些呢?
<html>
<body>
<script>
  var _table, _tbody, tr, td, text, maxRow, maxCol;
  maxRow = 3000;
  maxCol = 8;
 
  _table = document.createElement("table");
  _table.border = "1";
  _tbody = document.createElement("tbody");
  _table.insertBefore(_tbody, null);
 
  document.body.insertBefore(_table, null);
  for (var i=0; i<maxRow; i++) {
  tr = document.createElement("tr");
  for(var j = 0; j<maxCol; j++){
   td = document.createElement("td");
   text = document.createTextNode("Text");
   td.insertBefore(text, null);
   tr.insertBefore(td, null);
  }
     _tbody.insertBefore(tr, null);
  }
</script>
</body>
</html>

vision 0.3 【耗时3320ms】
基于vision 0.2中的代码,我们可以看到,整个代码段有多处用到了"body","window","document"这样的对象,在js中类似这样的对象都为全局对象,对他们的引用操作势必会消耗性能,
对这些全局变量引用要比简单通过局部变量引用的代价要昂贵的多。
这里我们可以将"document.body"的引用缓存到局部变量中,这样就完成了一个将全局对象转换成局部变量的过程。
在代码中添加:var docBody = document.body;并且将行:document.body.insertBefore(_table, null);替换为:docBody.insertBefore(_table, null);
在代码中对"document"单个全局对象的引用就达到8×3000=24000次之多,获取一个document变量比局部变量大约多花费4ms时间, 所以我们下一步把document对象也缓存起来。
在代码中添加:var _doc = document;
这样,我们重新加载页面,所耗时间为3320毫秒。只比上个版本所耗的时间减少了10%,似乎性能相差不大,但是在我们日常的开发习惯中,将全局的对象缓存到局部变量中是一个好的开始。
<html>
<body>
<script>
  var _table, _tbody, tr, td, text, maxRow, maxCol;
  var docBody = document.body;
  var _doc = document;
  maxRow = 3000;
  maxCol = 8;
 
  _table = _doc.createElement("table");
  _table.border = "1";
  _tbody = _doc.createElement("tbody");
  _table.insertBefore(_tbody, null);
 
  docBody.insertBefore(_table, null);
  for (var i=0; i<maxRow; i++) {
  tr = _doc.createElement("tr");
  for(var j = 0; j<maxCol; j++){
   td = _doc.createElement("td");
   text = _doc.createTextNode("Text");
   td.insertBefore(text, null);
   tr.insertBefore(td, null);
  }
     _tbody.insertBefore(tr, null);
  }
</script>
</body>
</html>
vision 0.4 【耗时2779ms】
一个document对象加载速度的优化就是在<script>标签指定defer属性。首先在这里简单介绍一下defer属性。defer作用是文档加载完毕了再执行脚本,这样回避免找不到对象的问题,
加上defer等于在页面完全在入后再执行,相当于window.onload,但应用上比window.onload 更灵活。设置这个属性仅适合不需要立即运行<SCRIPT>中代码的情况。
(立即运行的代码指不在函数体内的--这些代码将会在脚本块加载后立即执行)当defer属性设置后,IE不会等待加载和转换这段脚本。这就也为着页面加载会快很多。
通常这意味着立即运行的脚本应该封装放在一个函数内,并通过document或者body的onload的事件处理。如果你的脚本是依赖于页面加载后的用户动作,如点击按钮,或者移动鼠标到某个区域,会更加有用!
最后请注意两点:
1、不要在defer型的脚本程序段中调用document.write命令,因为document.write将产生直接输出效果。
2、不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。
<html>
<body onload="init()">
<script defer>
function init() {
  var _table, _tbody, tr, td, text, maxRow, maxCol;
  var docBody = document.body;
  var _doc = document;
  maxRow = 3000;
  maxCol = 8;
 
  _table = _doc.createElement("table");
  _table.border = "1";
  _tbody = _doc.createElement("tbody");
  _table.insertBefore(_tbody, null);
 
  docBody.insertBefore(_table, null);
  for (var i=0; i<maxRow; i++) {
  tr = _doc.createElement("tr");
  for(var j = 0; j<maxCol; j++){
   td = _doc.createElement("td");
   text = _doc.createTextNode("Text");
   td.insertBefore(text, null);
   tr.insertBefore(td, null);
  }
     _tbody.insertBefore(tr, null);
  }
}
</script>
</body>
</html>
 
 vision 0.5 【耗时2650ms】
 上一个版本中的页面加载速度已经缩短到了2779ms。下面我们对代码进行进一步的优化。
 我们看到代码中dom操作,绑定子元素的方法是由下至上包裹,这样的元素绑定方式会相对较慢。
  create <TR>
  create <TD>
  create TextNode
第一步 insert TextNode into <TD>
第二步 insert <TD> into <TR>
第三步 insert <TR> into TBODY
 
 现在我们将元素的绑定顺序颠倒过来,由上至下的包裹绑定元素
  create <TR>
  create <TD>
  create TextNode
第一步 insert <TR> into TBODY
第二步 insert <TD> into <TR>
第三步 insert TextNode into <TD>
<html>
<body onload="init()">
<script defer>
function init() {
  var _table, _tbody, tr, td, text, maxRow, maxCol;
  var docBody = document.body;
  var _doc = document;
  maxRow = 3000;
  maxCol = 8;
 
  _table = _doc.createElement("table");
  _table.border = "1";
  _tbody = _doc.createElement("tbody");
  _table.insertBefore(_tbody, null);
  docBody.insertBefore(_table, null);
 
  for (var i=0; i<maxRow; i++) {
  tr = _doc.createElement("tr");
   _tbody.insertBefore(tr, null);
  for(var j = 0; j<maxCol; j++){
   td = _doc.createElement("td");
   text = _doc.createTextNode("Text");
   td.insertBefore(text, null);
   tr.insertBefore(td, null);
  }
  }
}
</script>
</body>
</html>

vision 0.6 【耗时2580ms】
这个版本中我们要调优的是修改table的css属性,使用fixed-table布局(layout)。指定了fixed-table布局后的表格的列宽使用<col>标签设置。
fixed-table布局样式将改善table的性能,因为每个单元格的内容的尺寸不需要进行计算了。这是一个非常实用的性能改善方法,特别是那些有很多列的大型表格。
这个操作也可以通过简单增加css样式实现:
<html>
<body onload="init()">
<script defer>
function init() {
  var _table, _tbody, tr, td, text, maxRow, maxCol;
  var docBody = document.body;
  var _doc = document;
  maxRow = 3000;
  maxCol = 8;
 
  _table = _doc.createElement("table");
  _table.border = "1";
  _table.style.tableLayout = "fixed";
  _tbody = _doc.createElement("tbody");
  _table.insertBefore(_tbody, null);
  docBody.insertBefore(_table, null);
 
  for (var i=0; i<maxRow; i++) {
  tr = _doc.createElement("tr");
   _tbody.insertBefore(tr, null);
  for(var j = 0; j<maxCol; j++){
   td = _doc.createElement("td");
   text = _doc.createTextNode("Text");
   td.insertBefore(text, null);
   tr.insertBefore(td, null);
  }
  }
}
</script>
</body>
</html>

vision 0.7 【耗时2210ms】
最后的一个版本的调优就是给单元格赋值的方式。在所有的示例中,创建了一个TextNode,并添加给TD。而在这个版本中我们将使用innerText代替插入一个text节点,代码调整为:
td.innerText = "Text";
(注意:innerText只在IE中受支持,属于IE扩展,兼容FireFox可使用innerHTML,但是innerHTML正如文章开头所说的,效率非常低下,不建议使用)
<html>
<body onload="init()">
<script defer>
  function init() {
  var _table, _tbody, tr, td, text, maxRow, maxCol;
  var docBody = document.body;
  var _doc = document;
  maxRow = 3000;
  maxCol = 8;
 
  _table = _doc.createElement("table");
  _table.border = "1";
  _table.style.tableLayout = "fixed";
  _tbody = _doc.createElement("tbody");
 
  docBody.insertBefore(_table, null);
  _table.insertBefore(_tbody, null);
 
  for (var i=0; i<maxRow; i++) {
  tr = _doc.createElement("tr");
   _tbody.insertBefore(tr, null);
  for(var j = 0; j<maxCol; j++){
   td = _doc.createElement("td");
   td.innerText = "Text";
   tr.insertBefore(td, null);
  }
  }
}
</script>
</body>
</html>

vision 0.8 【耗时672ms】终极优化
将字符串作为数组对象的方式是目前效率最高,性能最优的方式。
<script>
 var t1 = new Date();
</script>
<html>
 <head>
  <title></title>
  <script>
   function testTime(){
    var t2 = new Date();
    alert(t2-t1+"ms");
   }
  
  </script>
 
 </head>
 <body onload="init();testTime();">
  <div id="tableDiv"></div>
  <script>
   var maxRow =3000;
   var maxCol = 8;
   var strTbody = ["<table border='1'><tbody>"];
  
   for(var i = 0; i < maxRow; i++){
    strTbody.push("<tr>");
     for(var j = 0; j < maxCol; j++){
      strTbody.push("<td>test</td>");
     }
    strTbody.push("</tr>");
   }
  
   strTbody.push("</tbody></table>");
  
   var obj = document.getElementById("tableDiv");
   obj.innerHTML = strTbody.join("");
  </script>
 </body>
</html>

来源:http://qihonghui1016.blog.163.com/blog/static/116397892007919101332430/

7月21日

SEO标准模板

一些站长、专业程序员对于重要而基本的网页知识非常不了解,编写的代码非常混乱。基于此种原因,发布《SEO标准模板》,给不清楚什么是规范的网页代码的人以启示和启发。

下面的模板是创建规范网页的基础,是命根。这些极端重要的东西,你在一般的教程上是学不到的,但却影响着每一个站的搜索质量。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>$$网页内容标题$$——$$频道标题$$——$$网站名$$</title>
<meta name="Keywords" content="$$网页内容标题$$ $$频道标题$$">
<meta name="Description" content="描述性语句,$$网页内容标题$$ 描述性语句">
<link href="style.css" rel="stylesheet" type="text/css">
<script language="javascript" type="text/javascript" src="header.js"></script>
</head>
<body>
$$网站导航$$

<h1>$$网页内容标题$$</h1>

$$网页内容$$


<br>
$$相关内容链接$$

<br>

$$值得全站网民方便查看的固定内容链接$$

<br>
$$隐私条款,友情链接,版权声明,http://www.wangjianran.com/ 联系方式,留言等等$$
</body>
</html>

seo标准模板 注释:
1 css样式表代码尽量和htm、asp等文件分离
2 js代码也尽量和htm、asp等文件分离
3 模块化,规范化。世界上没有高深的知识,全是基础知识。基本而重要的html代码知识http://tech.china.com/zh_cn/netschool/homepage/html/599/20010205/html01.html
4 每个标记都应该出现在应该出现的位置。
5 还可以给不同的内容块加大div包围标记,运用css控制内容布局。这样可以较少网页大小,方便搜索引擎索引。

7月18日

总结Web打印方法

对Web的打印方法总结一下,方便日后查阅。

一.用JS自带函数打印
直接调用 <a href="javascript:window.print();">打印</a> 

二.IEWebBrowser组件
组件的相关介绍
http://support.microsoft.com/default.aspx?scid=kb%3BEN-US%3BQ267240#top
http://support.microsoft.com/kb/q247671/#appliesto

实例代码:
  1. <OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT>    
  2. <input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开>   
  3. <input name=Button onClick=document.all.WebBrowser.ExecWB(2,1) type=button value=关闭所有>   
  4. <input name=Button onClick=document.all.WebBrowser.ExecWB(4,1) type=button value=另存为>    
  5. <input name=Button onClick=document.all.WebBrowser.ExecWB(6,1) type=button value=打印>   
  6. <input name=Button onClick=document.all.WebBrowser.ExecWB(6,6) type=button value=直接打印>   
  7. <input name=Button onClick=document.all.WebBrowser.ExecWB(7,1) type=button value=打印预览>   
  8. <input name=Button onClick=document.all.WebBrowser.ExecWB(8,1) type=button value=页面设置>   
  9. <input name=Button onClick=document.all.WebBrowser.ExecWB(10,1) type=button value=属性>   
  10. <input name=Button onClick=document.all.WebBrowser.ExecWB(17,1) type=button value=全选>   
  11. <input name=Button onClick=document.all.WebBrowser.ExecWB(22,1) type=button value=刷新>   
  12. <input name=Button onClick=document.all.WebBrowser.ExecWB(45,1) type=button value=关闭>  

三.使用ScriptX.cab控件

1.下载ScriptX.cab控件
官网http://www.meadroid.com/scriptx/index.asp

2.使用object元素,修改codebase,classid的值
这里调用控件ScriptX.cab
<OBJECT id="factory" style="DISPLAY: none" codeBase="${rootUrl}js/smsx.cab#VVersion=6,3,435,20"  classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" viewastext></OBJECT>  
以上这段代码用来加载cab文件,clsid和codebase必须要和你下载的cab中的信息对应,否则组件会加载错误,这两项其实不难找,只要你用winrar打开你下载的cab文件,然后找到扩展名是.inf的文件,然后打开之,就能看到了。

3.调用控件脚本
Print.js文件内容如下:
function setPrintBase(headerText,footerText,rootUrl) {  
 
    // -- advanced features  ,未曾使用过,有待确认。  
 
        //factory.printing.SetMarginMeasure(2); // measure margins in inches  
 
        //factory.SetPageRange(false, 1, 3);// need pages from 1 to 3  
 
        //factory.printing.printer = "HP DeskJet 870C";  
 
        //factory.printing.copies = 2;  
 
        //factory.printing.collate = true;  
 
        //factory.printing.paperSize = "A4";  
 
        //factory.printing.paperSource = "Manual feed"  
 
    var header = (headerText==null||headerText=="")?'默认页眉':headerText;  
 
    var footer = (footerText==null||footerText=="")?'默认页角':footerText;  
 
  factory.printing.header = "&b"+header+"&b" ;  
 
  factory.printing.footer = "&b"+footer;  
 
  factory.printing.portrait = false;  
 
  factory.printing.leftMargin =10.00;  
 
  factory.printing.topMargin =10.00;  
 
  factory.printing.rightMargin =10.00;  
 
  factory.printing.bottomMargin =10.00;  
 
}
 
说明:注释掉的部分是要注册收费的哦,所以不用看了,呵呵
factory.printing.portrait  =  false      //这个属性值等于false时就是横打(默认是true纵向打印)


实例页面如下:
<%@ page contentType="text/html;charset=GBK"%>  
 
<html>  
<head>  
<meta http-equiv="imagetoolbar" content="no">  
<script language="javascript" src="print.js"></script>  
<style media="print">  
.Noprint   {DISPLAY:   none;}  
</style>  
<title>打印测试</title>  
</head>  
<OBJECT id="factory" style="DISPLAY: none" codeBase="smsx.cab#VVersion=6,3,435,20"  classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" viewastext></OBJECT>  
 
<script defer>  
function window.onload() {     
setPrintBase('页眉','页脚');  
}  
</script>  
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" marginwidth="0" marginheight="0">  
<center class="Noprint">  
 <input type=button value="打印" onclick="factory.printing.Print(true)">   
<input type=button value="页面设置" onclick="factory.printing.PageSetup()">   
 <input type=button value="打印预览" onclick="factory.printing.Preview()">             
<input type="button" value="关闭" onclick="window.close();">  
</center>  
   <center>  
      <table width="100%" border="0" cellpadding="0" cellspacing="0">  
          <tr><td align="center"><b>内容</b></td></tr>  
       </table>  
    </center>  
</body>  
</html> 

四.对比

1.Window.print调用方便,但功能简单
2.功能更强大,但使用IEWebBrowser有时会报JS没有权限的错误。
3.ScriptX控件功能也比较强大,目前在使用这种方式。

7月9日

javascript 获取屏幕及浏览器大小和坐标等

document.body.offsetHeight是获得<body>内的高度信息

window.screen.width是获取整个屏幕的高度信息,浏览器最大化的情况下是”1024”

window.screen.width是获取整个屏幕去除任务栏后的高度信息,浏览器最大化的情况下是”1004”

网页可见区域宽:document.body.clientWidth
网页可见区域高:document.body.clientHeight
网页可见区域宽:document.body.offsetWidth (包括边线的宽)
网页可见区域高:document.body.offsetHeight (包括边线的宽)
网页正文全文宽:document.body.scrollWidth
网页正文全文高:document.body.scrollHeight
网页被卷去的高:document.body.scrollTop
网页被卷去的左:document.body.scrollLeft
网页正文部分上:window.screenTop
网页正文部分左:window.screenLeft
屏幕分辨率的高:window.screen.height
屏幕分辨率的宽:window.screen.width
屏幕可用工作区高度:window.screen.availHeight
屏幕可用工作区宽度:window.screen.availWidth

6月25日

解决JBuilderX中文字体的问题

JbuilderX中光标对不齐,输入中文都会显示“口”
JbuilderX中,默认只有两种字体,光标对不齐,而且,输入中文都会显示“口”

修改文件C:\Documents and Settings\Administrator\.primetimeX\user_zh.properties

添加一行:
editor.display;fixed_fonts.3=DialogInput

同样也可以添加其它字体,只要在
editor.display;known_fonts
列表中有的,都可以添加,顺序编号
6月24日

SQL和ORACLE函数比较

SQLServer和Oracle是大家经常用到的数据库,在此感谢作者总结出这些常用函数以供大家参考。

数学函数:
   1.绝对值
   S:SELECT abs(-1) value
   O:SELECT abs(-1) value from dual

  2.取整(大)
   S:SELECT ceiling(-1.001) value
   O:SELECT ceil(-1.001) value from dual

  3.取整(小)
   S:SELECT floor(-1.001) value
   O:SELECT floor(-1.001) value from dual

  4.取整(截取)
   S:SELECT cast(-1.002 as int) value
   O:SELECT trunc(-1.002) value from dual

  5.四舍五入
   S:SELECT round(1.23456,4) value 1.23460
   O:SELECT round(1.23456,4) value from dual 1.2346

  6.e为底的幂
   S:SELECT Exp(1) value 2.7182818284590451
   O:SELECT Exp(1) value from dual 2.71828182

  7.取e为底的对数
   S:SELECT log(2.7182818284590451) value 1
   O:SELECT ln(2.7182818284590451) value from dual; 1

  8.取10为底对数
   S:SELECT log10(10) value 1
   O:SELECT log(10,10) value from dual; 1

  9.取平方
   S:SELECT SQUARE(4) value 16
   O:SELECT power(4,2) value from dual 16

  10.取平方根
   S:SELECT SQRT(4) value 2
   O:SELECT SQRT(4) value from dual 2

  11.求任意数为底的幂
   S:SELECT power(3,4) value 81
   O:SELECT power(3,4) value from dual 81

  12.取随机数
   S:SELECT rand() value
   O:SELECT sys.dbms_random.value(0,1) value from dual;

  13.取符号
   S:SELECT sign(-8) value -1
   O:SELECT sign(-8) value from dual -1

  14.圆周率
   S:SELECT PI() value 3.1415926535897931
   O:不知道

  15.sin,cos,tan 参数都以弧度为单位
   例如:SELECT sin(PI()/2) value 得到1(SQLServer)

  16.Asin,Acos,Atan,Atan2 返回弧度

  17.弧度角度互换(SQLServer,Oracle不知道)
   DEGREES:弧度-〉角度
   RADIANS:角度-〉弧度

数值间比较:
   18. 求集合最大值
   S:SELECT max(value) value from
   (SELECT 1 value
   union
   SELECT -2 value
   union
   SELECT 4 value
   union
   SELECT 3 value)a

  O:SELECT greatest(1,-2,4,3) value from dual

  19. 求集合最小值
   S:SELECT min(value) value from
   (SELECT 1 value
   union
   SELECT -2 value
   union
   SELECT 4 value
   union
   SELECT 3 value)a

  O:SELECT least(1,-2,4,3) value from dual

  20.如何处理null值(F2中的null以10代替)
   S:SELECT F1,IsNull(F2,10) value from Tbl
   O:SELECT F1,nvl(F2,10) value from Tbl

  21.求字符序号
   S:SELECT ascii('a') value
   O:SELECT ascii('a') value from dual

  22.从序号求字符
   S:SELECT char(97) value
   O:SELECT chr(97) value from dual

  23.连接
   S:SELECT '11'+'22'+'33' value
   O:SELECT CONCAT('11','22')  33 value from dual

  23.子串位置 --返回3
   S:SELECT CHARINDEX('s','sdsq',2) value
   O:SELECT INSTR('sdsq','s',2) value from dual

  23.模糊子串的位置 --返回2,参数去掉中间%则返回7
   S:SELECT patindex('%d%q%','sdsfasdqe') value
   O:oracle没发现,但是instr可以通过第四个参数控制出现次数
   SELECT INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

  24.求子串
   S:SELECT substring('abcd',2,2) value
   O:SELECT substr('abcd',2,2) value from dual

  25.子串代替 返回aijklmnef
   S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
   O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

  26.子串全部替换
   S:没发现
   O:SELECT Translate('fasdbfasegas','fa','我' ) value from dual

  27.长度
   S:len,datalength
   O:length

  28.大小写转换 lower,upper

  29.单词首字母大写
   S:没发现
   O:SELECT INITCAP('abcd dsaf df') value from dual

  30.左补空格(LPAD的第一个参数为空格则同space函数)
   S:SELECT space(10)+'abcd' value
   O:SELECT LPAD('abcd',14) value from dual

  31.右补空格(RPAD的第一个参数为空格则同space函数)
   S:SELECT 'abcd'+space(10) value
   O:SELECT RPAD('abcd',14) value from dual

  32.删除空格
   S:ltrim,rtrim
   O:ltrim,rtrim,trim

  33. 重复字符串
   S:SELECT REPLICATE('abcd',2) value
   O:没发现

  34.发音相似性比较(这两个单词返回值一样,发音相同)
   S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
   O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
   SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
  返回0-4,4为同音,1最高

日期函数:
   35.系统时间
   S:SELECT getdate() value
   O:SELECT sysdate value from dual

  36.前后几日
   直接与整数相加减

  37.求日期
   S:SELECT convert(char(10),getdate(),20) value
   O:SELECT trunc(sysdate) value from dual
   SELECT to_char(sysdate,'yyyy-mm-dd') value from dual

  38.求时间
   S:SELECT convert(char(8),getdate(),108) value
   O:SELECT to_char(sysdate,'hh24:mm:ss') value from dual

39.取日期时间的其他部分
   S:DATEPART 和 DATENAME 函数 (第一个参数决定)
   O:to_char函数 第二个参数决定

  参数---------------------------------下表需要补充
   year yy, yyyy
   quarter qq, q (季度)
   month mm, m (m O无效)
   dayofyear dy, y (O表星期)
   day dd, d (d O无效)
   week wk, ww (wk O无效)
   weekday dw (O不清楚)
   Hour hh,hh12,hh24 (hh12,hh24 S无效)
   minute mi, n (n O无效)
   second ss, s (s O无效)
   millisecond ms (O无效)
   ----------------------------------------------

  40.当月最后一天
   S:不知道
   O:SELECT LAST_DAY(sysdate) value from dual

  41.本星期的某一天(比如星期日)
   S:不知道
   O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

  42.字符串转时间
   S:可以直接转或者SELECT cast('2004-09-08'as datetime) value
   O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

  43.求两日期某一部分的差(比如秒)
   S:SELECT datediff(ss,getdate(),getdate()+12.3) value
   O:直接用两个日期相减(比如d1-d2=12.3)
   SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

  44.根据差值求新的日期(比如分钟)
   S:SELECT dateadd(mi,8,getdate()) value
   O:SELECT sysdate+8/60/24 vaule FROM DUAL;

  45.求不同时区时间
   S:不知道
   O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

  -----时区参数,北京在东8区应该是Ydt-------
   AST ADT 大西洋标准时间
   BST BDT 白令海标准时间
   CST CDT 中部标准时间
   EST EDT 东部标准时间
   GMT 格林尼治标准时间
   HST HDT 阿拉斯加?夏威夷标准时间
   MST MDT 山区标准时间
   NST 纽芬兰标准时间
   PST PDT 太平洋标准时间
   YST YDT YUKON标准时间

PL/SQL教程(三)

  控制结构

  控制结构控制PL/SQL程序流程的代码行,PL/SQL支持条件控制和循环控制结构。

  语法和用途

   IF..THEN

  语法:

IF condition THEN
 Statements 1;
 Statements 2;
 ....
END IF

  IF语句判断条件condition是否为TRUE,如果是,则执行THEN后面的语句,如果condition为false或NULL则跳过THEN到END IF之间的语句,执行END IF后面的语句。

  IF..THEN...ELSE

  语法:

IF condition THEN
 Statements 1;
 Statements 2;
 ....
ELSE
 Statements 1;
 Statements 2;
 ....
END IF

  如果条件condition为TRUE,则执行THEN到ELSE之间的语句,否则执行ELSE到END IF之间的语句。

  IF 可以嵌套,可以在IF 或IF ..ELSE语句中使用IF或IF..ELSE语句。

if (a>b) and (a>c) then
  g:=a;
else
  g:=b;
  if c>g then
   g:=c;
  end if
end if

  IF..THEN..ELSIF

  语法:

IF condition1 THEN
 statement1;
ELSIF condition2 THEN
 statement2;
ELSIF condition3 THEN
 statement3;
ELSE
 statement4;
END IF;
 statement5;

  如果条件condition1为TRUE则执行statement1,然后执行statement5,否则判断condition2是否为TRUE,若为TRUE则执行statement2,然后执行statement5,对于condition3也是相同的,如果condition1,condition2,condition3都不成立,那么将执行statement4,然后执行statement5。

  循环控制

  循环控制的基本形式是LOOP语句,LOOP和END LOOP之间的语句将无限次的执行。LOOP语句的语法如下:

  LOOP
   statements;
  END LOOP

  LOOP和END LOOP之间的语句无限次的执行显然是不行的,那么在使用LOOP语句时必须使用EXIT语句,强制循环结束,例如:

X:=100;
LOOP
 X:=X+10;
 IF X>1000 THEN
  EXIT;
 END IF
END LOOP;
Y:=X;

  此时Y的值是1010.

  EXIT WHEN语句将结束循环,如果条件为TRUE,则结束循环。

X:=100;
LOOP
X:=X+10;
EXIT WHEN X>1000;
X:=X+10;
END LOOP;
Y:=X;

  WHILE..LOOP

  WHILE..LOOP有一个条件与循环相联系,如果条件为TRUE,则执行循环体内的语句,如果结果为FALSE,则结束循环。

X:=100;
WHILE X<=1000 LOOP
 X:=X+10;
END LOOP;
Y=X;

  FOR...LOOP

  语法:

FOR counter IN [REVERSE] start_range....end_range LOOP
statements;
END LOOP;

  LOOP和WHILE循环的循环次数都是不确定的,FOR循环的循环次数是固定的,counter是一个隐式声明的变量,他的初始值是start_range,第二个值是start_range+1,直到end_range,如果start_range等于end _range,那么循环将执行一次。如果使用了REVERSE关键字,那么范围将是一个降序。

X:=100;
FOR v_counter in 1..10 loop
x:=x+10;

end loop
y:=x;

  如果要退出for循环可以使用EXIT语句。

  标签

  用户可以使用标签使程序获得更好的可读性。程序块或循环都可以被标记。标签的形式是<>。

  标记程序块

<>
[DECLARE]
... ... ...
BEGIN
........
[EXCEPTION]
.......
END label_name

  标记循环

<>
LOOP
.........
<>
loop
..........
<>
loop
....

EXIT outer_loop WHEN v_condition=0;
end loop innermost_loop;
..........
END LOOP inner_loop;
END LOOP outer_loop;

  GOTO语句

  语法:

  GOTO LABEL;

  执行GOTO语句时,控制会立即转到由标签标记的语句。PL/SQL中对GOTO语句有一些限制,对于块、循环、IF语句而言,从外层跳转到内层是非法的。

X :=100;
FOR V_COUNTER IN 1..10 LOOP
 IF V_COUNTER =4 THEN
  GOTO end_of_loop
 END IF
 X:=X+10;
 <>
 NULL
END LOOP

Y:=X;

  注意:NULL是一个合法的可执行语句。

  嵌套

  程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样GOTO语句不能由父块跳转道子块中,反之则是合法的。

《OUTER BLOCK》
DECLARE
 A_NUMBER INTEGER;
 B_NUMBER INTEGER;
BEGIN
 --A_NUMBER and B_NUMBER are available here
 <>
 DECLARE
 C_NUMBER INTEGER
 B_NUMBER NUMBER(20)
BEGIN
 C_NUMBER:=A_NUMBER;
 C_NUMBER=OUTER_BLOCK.B_NUMBER;
END SUB_BLOCK;
END OUT_BLOCK;

  小结

  我们在这篇文章中介绍了PL/SQL的基础语法以及如何使用PL/SQL语言设计和运行PL/SQL程序块,并将PL/SQL程序整合到Oracle服务器中,虽然PL/SQL程序作为功能块嵌入Oracle数据库中,但PL/SQL与ORACLE数据库的紧密结合使得越来越多的Oracle数据库管理员和开发人员开始使用PL/SQL。

PL/SQL教程(二)

变量和常量

  变量存放在内存中以获得值,能被PL/SQL块引用。你可以把变量想象成一个可储藏东西的容器,容器内的东西是可以改变的。

  声明变量

  变量一般都在PL/SQL块的声明部分声明,PL/SQL是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。

  声明变量的语法如下:

Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]

  注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。

  给变量赋值

  给变量赋值有两种方式:

  . 直接给变量赋值

   X:=200;
   Y=Y+(X*20);

  . 通过SQL SELECT INTO 或FETCH INTO给变量赋值

SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;

  常量

  常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,,他的声明方式与变量相似,但必须包括关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。

ZERO_VALUE CONSTANT NUMBER:=0;

  这个语句定了一个名叫ZERO_VALUE、数据类型是NUMBER、值为0的常量。

  标量(scalar)数据类型

  标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:

   . number
   . character
   . date/time
   . boolean

  表1显示了数字数据类型;表2显示了字符数据类型;表3显示了日期和布尔数据类型。

  表1 Scalar Types:Numeric
Datatype Range Subtypes description
BINARY_INTEGER -214748-2147483647 NATURAL
NATURAL
NPOSITIVE
POSITIVEN
SIGNTYPE
用于存储单字节整数。
要求存储长度低于NUMBER值。
用于限制范围的子类型(SUBTYPE):
 NATURAL:用于非负数
 POSITIVE:只用于正数
 NATURALN:只用于非负数和非NULL值
 POSITIVEN:只用于正数,不能用于NULL值
 SIGNTYPE:只有值:-1、0或1.
NUMBER 1.0E-130-9.99E125 DEC
DECIMAL
DOUBLE
PRECISION
FLOAT
INTEGERIC
INT
NUMERIC
REAL
SMALLINT
存储数字值,包括整数和浮点数。可以选择精度和刻度方式,语法:
number[( [,])]。
缺省的精度是38,scale是0.
PLS_INTEGER -2147483647-2147483647   与BINARY_INTEGER基本相同,但采用机器运算时,PLS_INTEGER提供更好的性能 。

  表2 字符数据类型
datatype rang subtype description
CHAR 最大长度32767字节 CHARACTER 存储定长字符串,如果长度没有确定,缺省是1
LONG 最大长度2147483647字节   存储可变长度字符串
RAW 最大长度32767字节   用于存储二进制数据和字节字符串,当在两个数据库之间进行传递时,RAW数据不在字符集之间进行转换。
LONGRAW 最大长度2147483647   与LONG数据类型相似,同样他也不能在字符集之间进行转换。
ROWID 18个字节   与数据库ROWID伪列类型相同,能够存储一个行标示符,可以将行标示符看作数据库中每一行的唯一键值。
VARCHAR2 最大长度32767字节 STRINGVARCHAR 与VARCHAR数据类型相似,存储可变长度的字符串。声明方法与VARCHAR相同

  表3 DATE和BOOLEAN
datatype range description
BOOLEAN TRUE/FALSE 存储逻辑值TRUE或FALSE,无参数
DATE 01/01/4712 BC 存储固定长的日期和时间值,日期值中包含时间

  LOB数据类型

  LOB(大对象,Large object) 数据类型用于存储类似图像,声音这样的大型数据对象,LOB数据对象可以是二进制数据也可以是字符数据,其最大长度不超过4G。LOB数据类型支持任意访问方式,LONG只支持顺序访问方式。LOB存储在一个单独的位置上,同时一个"LOB定位符"(LOB locator)存储在原始的表中,该定位符是一个指向实际数据的指针。在PL/SQL中操作LOB数据对象使用ORACLE提供的包DBMS_LOB.LOB数据类型可分为以下四类:

  . BFILE
  . BLOB
  . CLOB
  . NCLOB

  操作符

  与其他程序设计语言相同,PL/SQL有一系列操作符。操作符分为下面几类:

  . 算术操作符

  . 关系操作符

  . 比较操作符

  . 逻辑操作符

  算术操作符如表4所示

operator operation
+
-
/
*
** 乘方

  关系操作符主要用于条件判断语句或用于where子串中,关系操作符检查条件和结果是否为true或false,表5是PL/SQL中的关系操作符

operator operation
< 小于操作符
<= 小于或等于操作符
> 大于操作符
>= 大于或等于操作符
= 等于操作符
!= 不等于操作符
<> 不等于操作符
:= 赋值操作符

  表6 显示的是比较操作符
operator operation
IS NULL 如果操作数为NULL返回TRUE
LIKE 比较字符串值
BETWEEN 验证值是否在范围之内
IN 验证操作数在设定的一系列值中

  表7.8显示的是逻辑操作符
operator operation
AND 两个条件都必须满足
OR 只要满足两个条件中的一个
NOT 取反

  执行部分

  执行部分包含了所有的语句和表达式,执行部分以关键字BEGIN开始,以关键字EXCEPTION结束,如果EXCEPTION不存在,那么将以关键字END结束。分号分隔每一条语句,使用赋值操作符:=或SELECT INTO或FETCH INTO给每个变量赋值,执行部分的错误将在异常处理部分解决,在执行部分中可以使用另一个PL/SQL程序块,这种程序块被称为嵌套块

  所有的SQL数据操作语句都可以用于执行部分,PL/SQL块不能再屏幕上显示SELECT语句的输出。SELECT语句必须包括一个INTO子串或者是游标的一部分,执行部分使用的变量和常量必须首先在声明部分声明,执行部分必须至少包括一条可执行语句,NULL是一条合法的可执行语句,事物控制语句COMMIT和ROLLBACK可以在执行部分使用,数据定义语言(Data Definition language)不能在执行部分中使用,DDL语句与EXECUTE IMMEDIATE一起使用或者是DBMS_SQL调用。

  执行一个PL/SQL块

  SQL*PLUS中匿名的PL/SQL块的执行是在PL/SQL块后输入/来执行,如下面的例子所示:

declare
 v_comm_percent constant number:=10;
begin
 update emp
 set comm=sal*v_comm_percent
 where deptno=10;
 end
SQL> /
PL/SQL procedure successfully completed.

SQL>

  命名的程序与匿名程序的执行不同,执行命名的程序块必须使用execute关键字:

create or replace procedure update_commission
 (v_dept in number,v_pervent in number default 10) is
begin
 update emp
 set comm=sal*v_percent
 where deptno=v_dept;
end

SQL>/

Procedure created

SQL>execute update_commission(10,15);

PL/SQL procedure successfully completed.

SQL>


  如果在另一个命名程序块或匿名程序块中执行这个程序,那么就不需要EXECUTE关进字。

declare
 v_dept number;
begin
 select a.deptno
 into v_dept
 from emp a
 where job='PRESIDENT'
 update_commission(v_dept);
end
SQL>/
 PL/SQL procedure successfully completed
SQL>

PL/SQL教程(一)

  PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序。

  PL/SQL的优点

  从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

  PL/SQL的优点如下:

  . PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

  . PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

  . PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

  . 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。

  . PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的

  . 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。

  PL/SQL块结构

  PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:

  声明部分(Declaration section)

  声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

  执行部分(Executable section)

  执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。

  异常处理部分(Exception section)

  这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

  PL/SQL块语法

[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END

  PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。

  PL/SQL块的命名和匿名

  PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。

  命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

  PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:

   . 函数

   . 过程

   . 包

   . 触发器

  函数

  函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]

  过程

  存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:

PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]

  包(package)

  包其实就是被组合在一起的相关对象的集合,当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。
包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。

  触发器(trigger)

  触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发。

Oracle的左连接和右连接

在Oracle PL-SQL中,左连接和右连接以如下方式来实现

查看如下语句:
SELECT emp_name, dept_name 
FORM Employee, Department
WHERE Employee.emp_deptid(+= Department.deptid
此SQL文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个员工的情况,这个部门的名字都会在查询结果中出现。

反之:
SELECT emp_name, dept_name 
FORM Employee, Department
WHERE Employee.emp_deptid = Department.deptid(+)

则是左连接,无论这个员工有没有一个能在Department表中得到匹配的部门号,这个员工的记录都会被显示

例子:

SQL> select * from a;

A
----------
1
2
3
4

SQL> select * from b;

A B C
---------- ---------- ----------
1 4 10
2 5 11
5 6 12
6 7 13

SQL>select A.a,B.A,B.b,b.c
from A,B
where A.a=B.a;

A A B C
---------- ---------- ---------- ----------
1 1 4 10
2 2 5 11


SQL>select A.a,B.A,B.b,b.c
from A,B
where A.a=B.a(+);

A A B C
---------- ---------- ---------- ----------
1 1 4 10
2 2 5 11
3
4

SQL>select A.a,B.A,B.b,b.c
from A,B
where A.a=B.a(+) and b.c>10;

A A B C
---------- ---------- ---------- ----------
2 2 5 11


SQL>select A.a,B.A,B.b,b.c
from A,B
where A.a=B.a(+) and b.c(+)>10;
A A B C
---------- ---------- ---------- ----------
1
2 2 5 11
3
4

(+)的是接条件  的是对连过滤

6月20日

SQL SERVER 清除日志文件

  1. 清空日志:DUMP TRANSACTION 数据库名称 WITH NO_LOG
  2. 截断事务日志: BACKUP LOG 数据库名称 WITH NO_LOG
  3. 收缩数据库文件, 步骤如下: 企业管理器 -> 右键选择你要压缩的数据库 -> 选择所有任务 -> 缩收数据库 -> 选择收缩文件 -> 选择日志文件, 然后选择缩收至最少兆数, 按旁边提示的最少兆数输入既可.

另外一种做法是先分离数据库, 然后删除LOG文件, 再附加数据库, SQL SERVER会自动重新生成LOG文件, 但此种方法我实际操作发现分离时间比较久而且可能另外的一些评论说可能会造成数据库损坏无法使用, 因此还是上面的办法更加保险一点.

用VS 2005调试ASP

  1. 在IIS中允许启用调式ASP应用程序, 具体步骤是在你的网站中点击属性 -> Home Directory 面板 -> 点击Configuration按钮 -> 在Debugging面板中选择 Enable asp server side script debugging, 点确定
  2. 与调试ASP.NET应用程序不同, 你不需要在VS中按F5启动调式, 而是打开IE, 浏览要调试的ASP页面, 然后在VS的Debug菜单中选择Attach to process菜单, 在弹开的窗口中选择w3wp.exe, 注意, 你可以会看到两个w3wp.exe, 一个可能是for asp.net, 一个是for asp, 选择那个for asp的(只需要看type类型包含script的就是for Asp的), 选择Attach即可
  3. 设置断点, 这时候浏览页面执行页面中的ASP代码即可进入调试状态
6月18日

iframe高度自适应,兼容IE,FF

有时在项目中会遇到通过在页面中采用iframe的方式include其它页面,这时就会考虑不要因出现滚动条而影响页面效果,但include页面的内容高度是未知的,所以大家都会利用javascript来解决这个问题。
在网上曾看见过解决此问题的代码,不过拷贝到本地进入调试时有些不正常,在IE下无法正确获得嵌套页面的高度,通过各种尝试,最终代码如下:

  1. <script type="text/javascript">
  2.  function SetCwinHeight(iframeObj){
  3.   if (document.getElementById){
  4.    if (iframeObj && !window.opera){
  5.     if (iframeObj.contentDocument && iframeObj.contentDocument.body.offsetHeight){
  6.      iframeObj.height = iframeObj.contentDocument.body.offsetHeight;
  7.     }else if(document.frames[iframeObj.name].document && document.frames[iframeObj.name].document.body.scrollHeight){
  8.      iframeObj.height = document.frames[iframeObj.name].document.body.scrollHeight;
  9.     }
  10.    }
  11.   }
  12.  }
  13.  </script>
  14.  <iframe width="100%" name="frameContent" onload="SetCwinHeight(this)" frameborder="0" src="*"></iframe>

扩展:

在一个页面含有某个iframe,其id="myframe" name="myframe",此时使用document.getElementById("myframe")取到的是iframe标签对象,通过该对象可以获取iframe的各个属性,例如src、frameborder、style等等,但是不能获取到iframe所包含的子页面的各个对象。如果使用document.frames("myframe")取到的是iframe组件对象,通过该对象可以获取到iframe所包含的页面的子页面的各个对象,例如子页面的window对象,但是不能获得iframe标签得各个属性,例如上面说到的src等等。

6月16日

一种有创意的CSS命名规则

    关于CSS中的命名规则(其实我觉得是XHTML元素的命名规则更加合理些)这个问题,已经有很多人在说了,其中也不乏一些真知灼见。不过这种东西也是仁者见仁,智者见智,只要一个团队有统一的命名规则要求,在日常开发和维护中不至于出现混乱就应该说是好的命名规则。比如下面这条基本的命名规则:

CSS开发命名规则
外 套 wrap 主导航 mainnav 子导航 subnav
 页 脚  footer  整个页面  content  页 眉  header
 商 标  label  标 题  title  顶导航  topnav
 边导航  sidebar  左导航  leftsidebar  右导航  rightsidebar
 旗 志  logo  标 语  banner  子菜单  submenu
 容器  container  内容  content  当前的  current

     问题是,上面的诸如leftsidebar,rightsidebar等拥有很强指向性的命名在以后的布局变化中会怎么样呢?如果left出现的位置不是左侧,是中间或者是右侧怎么办呢?如果rightsidebar出现在左侧怎么办呢?这时的命名似乎有点不合逻辑了。有人常和我说,你这样的考虑有意义吗?多余的!真正有几个网站会用同样的结构去做两次不一样的布局,顶多就是改版了,改版的时候连结构都变了,这样的考虑完全多余。的确,经常会有这样的问题,有些网站不一次成形到下次改版前风格基本上不会改变,但是有些网站,比如我的博客,你再去看看PJBlog的官方博客,同样的结构却有截然不同的表现。

    看下面的代码:

<div>
  <div>content</div>
  <div>bar1</div>
  <div>bar2</div>
</div>

怎么去命名他们呢?bar1和bar2可以出现在两侧,也可能出现在一侧,无论使用right、left、middle都不太合适。那么怎么去命名会比较合适一点呢?

    这里提供一个来自Adobe.com的创意,它使用的是 父元素-栏目组-栏目,其中栏目(column)使用无实际意义的字符表示,如A、B、C等。例如 wrap-AB-A,意思已经ID为wrap的元素下包含着两个div——A和B,现在要进行操作的是A。这样的命名完全和元素没有关系,而且意义还比较清晰。例如上面的命名就可以写成:

<div id="container">
  <div id="container_ABC_A">content</div>
  <div id="container_ABC_A">bar1</div>
  <div id="container_ABC_A">bar2</div>
</div>

"container_ABC_A",说明是对container下有三个并列的元素(它们的ID分别是A、B、C),目前指向的是第一个,即A。这样做的好处就是不受布局的影响,名称和页面最终表现想分离,不过一个缺点就是,下因为A、B、C的意义使得再次嵌套的时候命名有点“乱”,如 id="container_ABC_A_abc_a",层次深了就不太清晰了。

    个人感觉这样的命名比较新颖,非常值得借鉴。不过正如一开始所说的,“只要一个团队有统一的命名规则要求,在日常开发和维护中不至于出现混乱就应该说是好的命名规则”。