<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>跑马圈地 &#187; Delphi</title>
	<atom:link href="http://www.ukuang.com/tag/delphi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ukuang.com</link>
	<description>一切恩爱会，无常难久得。声势多畏惧，命危于晨露。 因爱故生忧，因爱故生怖。若离于爱者，无忧亦无怖。</description>
	<lastBuildDate>Mon, 16 Jan 2012 17:51:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Delphi7 中使用ODAC存取图片</title>
		<link>http://www.ukuang.com/2010/03/16/delphi7-%e4%b8%ad%e4%bd%bf%e7%94%a8odac%e5%ad%98%e5%8f%96%e5%9b%be%e7%89%87/</link>
		<comments>http://www.ukuang.com/2010/03/16/delphi7-%e4%b8%ad%e4%bd%bf%e7%94%a8odac%e5%ad%98%e5%8f%96%e5%9b%be%e7%89%87/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 07:06:28 +0000</pubDate>
		<dc:creator>bluffstone</dc:creator>
				<category><![CDATA[技术经验帖]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.ukuang.com/2010/03/16/delphi7-%e4%b8%ad%e4%bd%bf%e7%94%a8odac%e5%ad%98%e5%8f%96%e5%9b%be%e7%89%87/</guid>
		<description><![CDATA[<p>最近很少写技术贴，前几天协助王锋师兄解决了在delphi7中，使用ODAC组件存取图片的问题。事后，他整理了一个经验文档，争得他同意，我贴出来，以备以后查询之用。 说明：ODAC组件我不熟悉，在使用它存取图片的时候，特别注意sql的写法。</p> <p>ODAC 组件支持 Oracle8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值，BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中；实际的 BLOB 和 CLOB 数据存储在独立的表空间中。当存取 LOB 列时，返回的是定位器。要初始化 LOB 定位器，你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器，应在同样的语句中使用 RETURNING 子句。ODAC 写 LOB 数据到 Oracle 且返回初始值字段，需使用：值参数. 对 ODAC 来说，在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput ， ODAC 写数据到服务器，如果 ParamType 是 [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>最近很少写技术贴，前几天协助王锋师兄解决了在delphi7中，使用ODAC组件存取图片的问题。事后，他整理了一个经验文档，争得他同意，我贴出来，以备以后查询之用。<br />
说明：ODAC组件我不熟悉，在使用它存取图片的时候，特别注意sql的写法。</p>
<p>ODAC 组件支持 Oracle8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值，BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中；实际的 BLOB 和 CLOB 数据存储在独立的表空间中。当存取 LOB 列时，返回的是定位器。要初始化 LOB 定位器，你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器，应在同样的语句中使用 RETURNING 子句。ODAC 写 LOB 数据到 Oracle 且返回初始值字段，需使用：值参数. 对 ODAC 来说，在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput ， ODAC 写数据到服务器，如果 ParamType 是 ptOutput，它则读取数据。<br />
以下两个例子是从Oracle10g中存/取jpg和bmp图片，需要注意的是在存图片的时候SQL语句的写法。</p>
<p><span id="more-191"></span><br />
（1）存图片<br />
procedure TNewStamp.BitBtn3Click(Sender: TObject);<br />
var<br />
pic:TMemoryStream;<br />
pjpg:tjpegimage;<br />
pjpeg:tjpegimage;<br />
bmp:tbitmap;<br />
begin<br />
{ //jpg图片<br />
pjpeg:=tjpegimage.Create;<br />
pjpg:=tjpegimage.Create;<br />
pjpg.LoadFromFile(&#8216;C:\1112.jpg&#8217;);<br />
pic:=TMemoryStream.Create;</p>
<p>pjpg.SaveToStream(pic);<br />
pic.Position:=0;<br />
pjpeg.LoadFromStream(pic);<br />
image1.Picture.Assign(pjpeg);</p>
<p>login.SmartQuery1.Close;<br />
login.SmartQuery1.SQL.Clear;<br />
login.SmartQuery1.SQL.Add(&#8216;insert into TEST(TEST1,TEST2) VALUES(:t1,EMPTY_BLOB()) returning TEST2 into :TEST2&#8242;);<br />
login.SmartQuery1.ParamByName(&#8216;t1&#8242;).AsString:=&#8217;123&#8242;;<br />
login.SmartQuery1.ParamByName(&#8216;TEST2&#8242;).ParamType:=ptInput;<br />
login.SmartQuery1.ParamByName(&#8216;TEST2&#8242;).AsOraBlob.LoadFromStream(pic);<br />
login.SmartQuery1.Prepare;<br />
login.SmartQuery1.ExecSQL;</p>
<p>}<br />
//bmp图片<br />
bmp:=tbitmap.Create;<br />
pic:=TMemoryStream.Create;<br />
bmp.LoadFromFile(&#8216;C:\122.bmp&#8217;);<br />
bmp.SaveToStream(pic);<br />
pic.Position:=0;</p>
<p>login.SmartQuery1.Close;<br />
login.SmartQuery1.SQL.Clear;</p>
<p>login.SmartQuery1.SQL.Add(&#8216;insert into TEST(TEST1,TEST2) VALUES(:t1,EMPTY_BLOB()) returning TEST2 into :TEST2&#8242;);<br />
login.SmartQuery1.ParamByName(&#8216;t1&#8242;).AsString:=&#8217;124&#8242;;<br />
login.SmartQuery1.ParamByName(&#8216;TEST2&#8242;).ParamType:=ptInput;<br />
login.SmartQuery1.ParamByName(&#8216;TEST2&#8242;).AsOraBlob.LoadFromStream(pic);<br />
login.SmartQuery1.Prepare;<br />
login.SmartQuery1.ExecSQL;<br />
end;</p>
<p>（2）取图片<br />
procedure TNewStamp.BitBtn2Click(Sender: TObject);<br />
var<br />
pic:TMemoryStream;<br />
pjpeg:tjpegimage; //jpg格式图片<br />
bmp:tbitmap; //bmp格式图片<br />
begin</p>
<p>login.OraQuery1.SQL.Clear;<br />
login.OraQuery1.SQL.Add(&#8216;select * from TEST &#8216;);<br />
login.OraQuery1.AutoCommit := false;<br />
login.OraQuery1.FetchAll := true;<br />
login.OraQuery1.Open;</p>
<p>if login.OraQuery1.RecordCount = 0 then<br />
begin<br />
showmessage(&#8216;没有记录&#8217;);<br />
exit;<br />
end;</p>
<p>bmp:=tbitmap.Create;<br />
pjpeg:=tjpegimage.Create;<br />
pic:=TMemoryStream.Create;</p>
<p>TBlobField(login.OraQuery1.fieldbyname(&#8216;TEST2&#8242;)).savetostream(pic);<br />
pic.Position:=0;<br />
bmp.LoadFromStream(pic);<br />
bmp.SaveToFile(&#8216;C:\122.bmp&#8217;);<br />
image1.Picture.Assign(bmp);<br />
pic.Free;<br />
end;</p>
<div class="shr-publisher-191"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.ukuang.com/2010/03/16/delphi7-%e4%b8%ad%e4%bd%bf%e7%94%a8odac%e5%ad%98%e5%8f%96%e5%9b%be%e7%89%87/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用绑定变量和不使用绑定变量操作数据库</title>
		<link>http://www.ukuang.com/2009/11/05/%e4%bd%bf%e7%94%a8%e7%bb%91%e5%ae%9a%e5%8f%98%e9%87%8f%e5%92%8c%e4%b8%8d%e4%bd%bf%e7%94%a8%e7%bb%91%e5%ae%9a%e5%8f%98%e9%87%8f%e6%93%8d%e4%bd%9c%e6%95%b0%e6%8d%ae%e5%ba%93/</link>
		<comments>http://www.ukuang.com/2009/11/05/%e4%bd%bf%e7%94%a8%e7%bb%91%e5%ae%9a%e5%8f%98%e9%87%8f%e5%92%8c%e4%b8%8d%e4%bd%bf%e7%94%a8%e7%bb%91%e5%ae%9a%e5%8f%98%e9%87%8f%e6%93%8d%e4%bd%9c%e6%95%b0%e6%8d%ae%e5%ba%93/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 03:52:06 +0000</pubDate>
		<dc:creator>bluffstone</dc:creator>
				<category><![CDATA[技术经验帖]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.ukuang.com/?p=107</guid>
		<description><![CDATA[<p>以下例子是在delphi中编程实现，数据库为oracle，具体的代码省略了，只说明情况。</p> <p>1、不使用绑定变量</p> <p>例子：删除同一张表的两条记录。</p> <p>sql语句如下：</p> <p>（1）delete from t_englishscore_score where STUDENTNUM=&#8217;200431500123&#8242;</p> <p>and LESSONNAME=&#8217;test&#8217; and YEAR=&#8217;2005&#8242; and TERM=&#8217;上&#8217;；</p> <p>（2）delete from t_englishscore_score where STUDENTNUM=&#8217;200431500123&#8242;</p> <p>and LESSONNAME=&#8217;毕业设计&#8217; and YEAR=&#8217;2007&#8242; and TERM=&#8217;下&#8217;</p> <p>此时查询v$sqltext视图（它能够反映oracle 中share pool中的sql解析共享情况）：</p> <p align="left">ADDRESS</p> <p align="left">HASH_VALUE</p> <p align="left">SQL_ID</p> <p align="left">COMMAND_TYPE</p> <p align="left">PIECE</p> <p align="left">SQL_TEXT</p> <p align="left">0000000173D47990</p> <p align="right">2193311325</p> <p align="left">1mhba361bqjkx</p> <p align="right">7</p> <p align="right">0</p> <p align="left">delete from t_englishscore_score [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>以下例子是在delphi中编程实现，数据库为oracle，具体的代码省略了，只说明情况。</p>
<p>1、不使用绑定变量</p>
<p>例子：删除同一张表的两条记录。</p>
<p>sql语句如下：</p>
<p>（1）delete from t_englishscore_score where STUDENTNUM=&#8217;200431500123&#8242;</p>
<p>and LESSONNAME=&#8217;test&#8217; and YEAR=&#8217;2005&#8242; and TERM=&#8217;上&#8217;；</p>
<p>（2）delete from t_englishscore_score where STUDENTNUM=&#8217;200431500123&#8242;</p>
<p>and LESSONNAME=&#8217;毕业设计&#8217; and YEAR=&#8217;2007&#8242; and TERM=&#8217;下&#8217;</p>
<p>此时查询v$sqltext视图（它能够反映oracle 中share pool中的sql解析共享情况）：</p>
<table border="0" cellspacing="0" cellpadding="0" width="735">
<tbody>
<tr>
<td width="121" valign="bottom">
<p align="left"><strong>ADDRESS</strong></p>
</td>
<td width="96" valign="bottom">
<p align="left"><strong>HASH_VALUE</strong></p>
</td>
<td width="96" valign="bottom">
<p align="left"><strong>SQL_ID</strong></p>
</td>
<td width="82" valign="bottom">
<p align="left"><strong>COMMAND_TYPE</strong></p>
</td>
<td width="50" valign="bottom">
<p align="left"><strong>PIECE</strong></p>
</td>
<td width="290" valign="bottom">
<p align="left"><strong>SQL_TEXT</strong></p>
</td>
</tr>
<tr>
<td width="121" valign="bottom">
<p align="left">0000000173D47990</p>
</td>
<td width="96" valign="bottom">
<p align="right">2193311325</p>
</td>
<td width="96" valign="bottom">
<p align="left">1mhba361bqjkx</p>
</td>
<td width="82" valign="bottom">
<p align="right">7</p>
</td>
<td width="50" valign="bottom">
<p align="right">0</p>
</td>
<td width="290" valign="bottom">
<p align="left">delete from t_englishscore_score where   STUDENTNUM=&#8217;200431500123&#8242;</p>
</td>
</tr>
<tr>
<td width="121" valign="bottom">
<p align="left">0000000173D47990</p>
</td>
<td width="96" valign="bottom">
<p align="right">2193311325</p>
</td>
<td width="96" valign="bottom">
<p align="left">1mhba361bqjkx</p>
</td>
<td width="82" valign="bottom">
<p align="right">7</p>
</td>
<td width="50" valign="bottom">
<p align="right">1</p>
</td>
<td width="290" valign="bottom">
<p align="left">and   LESSONNAME=&#8217;test&#8217; and YEAR=&#8217;2005&#8242; and TERM=&#8217;上&#8217;</p>
</td>
</tr>
<tr>
<td width="121" valign="bottom">
<p align="left">0000000188BDAC00</p>
</td>
<td width="96" valign="bottom">
<p align="right">321412224</p>
</td>
<td width="96" valign="bottom">
<p align="left">3jjk8tn9khr40</p>
</td>
<td width="82" valign="bottom">
<p align="right">7</p>
</td>
<td width="50" valign="bottom">
<p align="right">0</p>
</td>
<td width="290" valign="bottom">
<p align="left">delete from t_englishscore_score where   STUDENTNUM=&#8217;200431500123&#8242;</p>
</td>
</tr>
<tr>
<td width="121" valign="bottom">
<p align="left">0000000188BDAC00</p>
</td>
<td width="96" valign="bottom">
<p align="right">321412224</p>
</td>
<td width="96" valign="bottom">
<p align="left">3jjk8tn9khr40</p>
</td>
<td width="82" valign="bottom">
<p align="right">7</p>
</td>
<td width="50" valign="bottom">
<p align="right">1</p>
</td>
<td width="290" valign="bottom">
<p align="left">and   LESSONNAME=&#8217;毕业设计&#8217; and YEAR=&#8217;2007&#8242; and TERM=&#8217;下&#8217;</p>
</td>
</tr>
</tbody>
</table>
<p>可见，没有使用绑定变量，两次删除的语句都分别对应不同的Hash_Value，在共享池中占据两个条目，而且关键是这两个条目能够被以后删除记录操作共享的几率大致趋于0，除非有同样的记录需要删除，这样就大大降低了共享池“共享”的功能。</p>
<p>2、使用绑定变量</p>
<p>例子：更新同一张表多条记录。</p>
<p>sql语句：在delphi中sql语句代码如下：</p>
<p>（1）update t_englishscore_score set LESSONNUM=:newLessonnum,LESSONNAME=:newLessonname,</p>
<p>YEAR=:newYear,TERM=:newTerm,COURSESORT=:newCourseSort,</p>
<p>CREDIT=:newCredit,SCORE=:newScore,ISDELETE=:newIsDelete</p>
<p>where STUDENTNUM=:oldStudentnum and LESSONNAME=:oldLessonname</p>
<p>and YEAR=:oldYear and TERM=:oldTerm</p>
<p>每次更新，只要赋予相应的参数即可。多次更新后，查看v$sqltext：</p>
<table border="0" cellspacing="0" cellpadding="0" width="852">
<tbody>
<tr>
<td width="100" valign="bottom">
<p align="left"><strong>ADDRESS</strong></p>
</td>
<td width="123" valign="bottom">
<p align="left"><strong>HASH_VALUE</strong></p>
</td>
<td width="99" valign="bottom">
<p align="left"><strong>SQL_ID</strong></p>
</td>
<td width="99" valign="bottom">
<p align="left"><strong>COMMAND_TYPE</strong></p>
</td>
<td width="47" valign="bottom">
<p align="left"><strong>PIECE</strong></p>
</td>
<td width="386" valign="bottom">
<p align="left"><strong>SQL_TEXT</strong></p>
</td>
</tr>
<tr>
<td width="100" valign="bottom">
<p align="left">00000001735AF2B0</p>
</td>
<td width="123" valign="bottom">
<p align="right">1453164333</p>
</td>
<td width="99" valign="bottom">
<p align="left">gfdbw8db9v1td</p>
</td>
<td width="99" valign="bottom">
<p align="right">6</p>
</td>
<td width="47" valign="bottom">
<p align="right">0</p>
</td>
<td width="386" valign="bottom">
<p align="left">update t_englishscore_score set   LESSONNUM=:1,LESSONNAME=:2,YEAR=</p>
</td>
</tr>
<tr>
<td width="100" valign="bottom">
<p align="left">00000001735AF2B0</p>
</td>
<td width="123" valign="bottom">
<p align="right">1453164333</p>
</td>
<td width="99" valign="bottom">
<p align="left">gfdbw8db9v1td</p>
</td>
<td width="99" valign="bottom">
<p align="right">6</p>
</td>
<td width="47" valign="bottom">
<p align="right">1</p>
</td>
<td width="386" valign="bottom">
<p align="left">:3,TERM=:4,COURSESORT=:5,CREDIT=:6,SCORE=:7,ISDELETE=:8  where S</p>
</td>
</tr>
<tr>
<td width="100" valign="bottom">
<p align="left">00000001735AF2B0</p>
</td>
<td width="123" valign="bottom">
<p align="right">1453164333</p>
</td>
<td width="99" valign="bottom">
<p align="left">gfdbw8db9v1td</p>
</td>
<td width="99" valign="bottom">
<p align="right">6</p>
</td>
<td width="47" valign="bottom">
<p align="right">2</p>
</td>
<td width="386" valign="bottom">
<p align="left">TUDENTNUM=:9 and LESSONNAME=:10 and   YEAR=:11 and TERM=:12</p>
</td>
</tr>
</tbody>
</table>
<p>可见使用绑定变量后，多次更新操作，都很好的共享了一条sql解析，大大降低了硬解析的数量，相应的提供了软解析的数量，从而真正发挥了共享池“共享”的作用。</p>
<div class="shr-publisher-107"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.ukuang.com/2009/11/05/%e4%bd%bf%e7%94%a8%e7%bb%91%e5%ae%9a%e5%8f%98%e9%87%8f%e5%92%8c%e4%b8%8d%e4%bd%bf%e7%94%a8%e7%bb%91%e5%ae%9a%e5%8f%98%e9%87%8f%e6%93%8d%e4%bd%9c%e6%95%b0%e6%8d%ae%e5%ba%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在PL/SQL中计算采用四舍五入和delphi 6中计算采用四舍五入之间的误差</title>
		<link>http://www.ukuang.com/2009/10/10/%e5%9c%a8plsql%e4%b8%ad%e8%ae%a1%e7%ae%97%e9%87%87%e7%94%a8%e5%9b%9b%e8%88%8d%e4%ba%94%e5%85%a5%e5%92%8cdelphi-6%e4%b8%ad%e8%ae%a1%e7%ae%97%e9%87%87%e7%94%a8%e5%9b%9b%e8%88%8d%e4%ba%94%e5%85%a5/</link>
		<comments>http://www.ukuang.com/2009/10/10/%e5%9c%a8plsql%e4%b8%ad%e8%ae%a1%e7%ae%97%e9%87%87%e7%94%a8%e5%9b%9b%e8%88%8d%e4%ba%94%e5%85%a5%e5%92%8cdelphi-6%e4%b8%ad%e8%ae%a1%e7%ae%97%e9%87%87%e7%94%a8%e5%9b%9b%e8%88%8d%e4%ba%94%e5%85%a5/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 12:10:27 +0000</pubDate>
		<dc:creator>bluffstone</dc:creator>
				<category><![CDATA[技术经验帖]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.ukuang.com/?p=87</guid>
		<description><![CDATA[<p></p> <p>有系统用户反映，在其中使用delphi6的程序中计算一个数值为2.64，但是在另外一个模块中，相同的参数，计算出来却是2.63，之间相差了0.01。一查，后者是调用oracle中存储过程实现的，而前者在delphi6中实现。</p> <p>在 仔细分析原因后，发现delphi 6中使用roundto或者simpleroundto都不是我们通常说的四舍五入，前者是采用银行家的四舍五入，即四舍六入五奇偶，而 simpleroundto这个函数也令人有点琢磨不透，有些是四舍五入，有些不是，比如对于 simpleroundto（12.95，-1）=12.9。</p> <p>而在PL/SQL中，一律保留了1位，四舍五入，所以两种方法一比较，最后累计，就出现了误差。</p> <p>解决方法，可以自己编辑一个函数处理，也可以按照下面一个网友的解释进行处理：</p> <p>http://www.2ccc.com/idea.asp?articleid=1300 网友iamdream</p> <p>以下是研究的结果(Delphi6)：</p> <p>RoundTo(及Round)函数使用所谓“银行家舍入法”&#60;Banker&#8217;s Rounding&#62;（对于舍入位后为5的情况，则舍入位为偶数，则舍，为奇数，则入），而Format函数则为正常的四舍五入法，取例如下：</p> <p>0.145 RoundTo(0.145, -2) = 0.14</p> <p>0.145 Format(&#8216;%8.2f&#8217;, 0.145) = 0.15</p> <p>0.155 RoundTo(0.155, -2) = 0.16</p> <p>0.155 Format(&#8216;%8.2f&#8217;, 0.155) = 0.16</p> <p>另在进行浮点数的运算时，可能会出现0.14499999999999的情况，此时的值按数学上要求实际应为0.145，如用以上方法舍入到小数点后两位时，均不能达到想要的效果。</p> <p>另SimpleRoundTo比RoundTo更接近四舍五入法，但不完全是四舍五入，如对0.145用SimpleRoundTo(0.145, -2)舍入时仍为0.14；</p> <p>如果后面还有小数，如0.1450000001，此时舍入，则三者均为0.15！对1.145，SimpleRoundTo舍入为1.15！</p> <p>故而如用RoundTo来四舍五入，则可在舍入位后的第二位加上5，如0.145，则加上0.0005，此时成为0.1455，再舍入时，就为0.15了！</p> <p>因此四舍五入取两位小数时，只要先加上0.0001，然后用RoundTo或SimpleRoundTo即可。 <p></p> ]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"></p>
<div id="msgcns!378A3196AFD42482!206">
<p>有系统用户反映，在其中使用delphi6的程序中计算一个数值为2.64，但是在另外一个模块中，相同的参数，计算出来却是2.63，之间相差了0.01。一查，后者是调用oracle中存储过程实现的，而前者在delphi6中实现。</p>
<p>在 仔细分析原因后，发现delphi 6中使用roundto或者simpleroundto都不是我们通常说的四舍五入，前者是采用银行家的四舍五入，即四舍六入五奇偶，而 simpleroundto这个函数也令人有点琢磨不透，有些是四舍五入，有些不是，比如对于 simpleroundto（12.95，-1）=12.9。</p>
<p>而在PL/SQL中，一律保留了1位，四舍五入，所以两种方法一比较，最后累计，就出现了误差。</p>
<p>解决方法，可以自己编辑一个函数处理，也可以按照下面一个网友的解释进行处理：</p>
<p><a href="http://www.2ccc.com/idea.asp?articleid=1300">http://www.2ccc.com/idea.asp?articleid=1300</a> 网友iamdream</p>
<p><em>以下是研究的结果(Delphi6)：</em></p>
<p><em>RoundTo(及Round)函数使用所谓“银行家舍入法”&lt;Banker&#8217;s Rounding&gt;（对于舍入位后为5的情况，则舍入位为偶数，则舍，为奇数，则入），而Format函数则为正常的四舍五入法，取例如下：</em></p>
<p><em>0.145 RoundTo(0.145, -2) = 0.14</em></p>
<p><em>0.145 Format(&#8216;%8.2f&#8217;, 0.145) = 0.15</em></p>
<p><em>0.155 RoundTo(0.155, -2) = 0.16</em></p>
<p><em>0.155 Format(&#8216;%8.2f&#8217;, 0.155) = 0.16</em></p>
<p><em>另在进行浮点数的运算时，可能会出现0.14499999999999的情况，此时的值按数学上要求实际应为0.145，如用以上方法舍入到小数点后两位时，均不能达到想要的效果。</em></p>
<p><em>另SimpleRoundTo比RoundTo更接近四舍五入法，但不完全是四舍五入，如对0.145用SimpleRoundTo(0.145, -2)舍入时仍为0.14；</em></p>
<p><em>如果后面还有小数，如0.1450000001，此时舍入，则三者均为0.15！对1.145，SimpleRoundTo舍入为1.15！</em></p>
<p><em>故而如用RoundTo来四舍五入，则可在舍入位后的第二位加上5，如0.145，则加上0.0005，此时成为0.1455，再舍入时，就为0.15了！</em></p>
<p><em>因此四舍五入取两位小数时，只要先加上0.0001，然后用RoundTo或SimpleRoundTo即可。</em></div>
<p></span></p>
<div class="shr-publisher-87"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.ukuang.com/2009/10/10/%e5%9c%a8plsql%e4%b8%ad%e8%ae%a1%e7%ae%97%e9%87%87%e7%94%a8%e5%9b%9b%e8%88%8d%e4%ba%94%e5%85%a5%e5%92%8cdelphi-6%e4%b8%ad%e8%ae%a1%e7%ae%97%e9%87%87%e7%94%a8%e5%9b%9b%e8%88%8d%e4%ba%94%e5%85%a5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【fastreport使用】fastreport中显示表格和打印空白表格</title>
		<link>http://www.ukuang.com/2009/10/10/%e3%80%90fastreport%e4%bd%bf%e7%94%a8%e3%80%91fastreport%e4%b8%ad%e6%98%be%e7%a4%ba%e8%a1%a8%e6%a0%bc%e5%92%8c%e6%89%93%e5%8d%b0%e7%a9%ba%e7%99%bd%e8%a1%a8%e6%a0%bc/</link>
		<comments>http://www.ukuang.com/2009/10/10/%e3%80%90fastreport%e4%bd%bf%e7%94%a8%e3%80%91fastreport%e4%b8%ad%e6%98%be%e7%a4%ba%e8%a1%a8%e6%a0%bc%e5%92%8c%e6%89%93%e5%8d%b0%e7%a9%ba%e7%99%bd%e8%a1%a8%e6%a0%bc/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 12:05:50 +0000</pubDate>
		<dc:creator>bluffstone</dc:creator>
				<category><![CDATA[技术经验帖]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.ukuang.com/?p=75</guid>
		<description><![CDATA[<p></p> 8月19日 【fastreport使用】fastreport中显示表格和打印空白表格 <p>1、 使数据显示在表格中：在数据的Band中，选择每一个“text”，设置其上下左右的边框；然后把每个“Text”排整齐即可。</p> <p>2、 在页末尾打印空白表格行：添加一个child band，同时在该band中设置跟数据band中相应的text；再添加一个footer band，设置其高度为0，同时为该footer band的onbeforePrint事件添加代码如下：</p> <p>while Engine.freespace &#62; 60 do</p> <p>Engine.showband(Child1);</p> <p>如图1：</p> <p></p> <p align="center">图1 表格显示和打印空白表格</p> <p></p> ]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"></p>
<div id="LastMDatecns!378A3196AFD42482!195">8月19日</div>
<h4 id="subjcns!378A3196AFD42482!195">【fastreport使用】fastreport中显示表格和打印空白表格</h4>
<div id="msgcns!378A3196AFD42482!195">
<p>1、 使数据显示在表格中：在数据的Band中，选择每一个“text”，设置其上下左右的边框；然后把每个“Text”排整齐即可。</p>
<p>2、 在页末尾打印空白表格行：添加一个child band，同时在该band中设置跟数据band中相应的text；再添加一个footer band，设置其高度为0，同时为该footer band的onbeforePrint事件添加代码如下：</p>
<p>while Engine.freespace &gt; 60 do</p>
<p>Engine.showband(Child1);</p>
<p>如图1：</p>
<p><a rel="WLPP" href="https://lj1cta.blu.livefilestore.com/y1mB7CnqHqpA60dKDs0au_5VYKB4uF0qybQtNKi-nHsGJlCiDwvE6iu1AFGYI0HJ1Wbf7N8OJz3BUznFNeloYrzzDPBjFE_QX7IYz0us5BLLxBKOUztwYGOV7biM45Lg2cmu3Xy-LjDdta_1YMLAx5FZw/%E6%9C%AA%E5%91%BD%E5%90%8D%5B5%5D.jpg"><img style="border: 0px none ; display: block; float: none; margin-left: auto; margin-right: auto;" title="未命名" src="https://lj1cta.blu.livefilestore.com/y1mgF5pOd5z_6wwkJcsC3u0QBySLaT_LOzTVPd7ZnyUr0AOS73cUO-CnhSr1lQnJMAgO1Gul586tuUzfdEPl63OSvH9BDE4YdmNDVFlfrCOkF2QErGz1m5pPwwB8UbZ1ZfheOxrK6ApxHdKvWLAywChiA/%E6%9C%AA%E5%91%BD%E5%90%8D_thumb%5B3%5D.jpg" border="0" alt="未命名" width="469" height="72" /></a></p>
<p align="center">图1 表格显示和打印空白表格</p>
</div>
<p></span></p>
<div class="shr-publisher-75"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.ukuang.com/2009/10/10/%e3%80%90fastreport%e4%bd%bf%e7%94%a8%e3%80%91fastreport%e4%b8%ad%e6%98%be%e7%a4%ba%e8%a1%a8%e6%a0%bc%e5%92%8c%e6%89%93%e5%8d%b0%e7%a9%ba%e7%99%bd%e8%a1%a8%e6%a0%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

