Archive for January, 2007
January 31, 2007
目里面有上传文件的需求,我想了一下不外乎下面两种处理方法: 1. 在数据库表中建立一个blob字段存放用户上传文件. 2. 在服务器上建立一个文件夹保存用户上传文件,数据库表中只存放该文件的url地址. 我本人现在比较倾向于第2种方案, 主要原因是担心方案1的效率(我用的是mysql数据库)。 但是处理过程中除了维护数据库中表的字段还要维护上传的文件,稍微麻烦一点。 大家在项目里面又是怎么做呢? 给我点建议!谢谢 讨论内容见: javaeye robin更建议第二种方案,放在数据库中主要的问题是 AppServer吃不消,开销比较大. 上面是摘录,不过我们这里用的是Oracle9i AS,在Oracle的协作套间里一般文档或者上传的文件都是保存在数据库里,还把这个特性作为Oracle 与别的协作套件之间不同的卖点。 大家以为如何? 我直觉是Oracle的DB和oc4j的AppServer对付这个似乎没有开销上的担心,但是没有实际检测过。 换句话说,文件的管理是放在文件夹里方便还是数据库里方便? 有点为难 update (2007-5-13): 还有一种方案结合了数据库和IO,我认为比较可行,就是文件存在数据库,但是下载的时候第一次从数据库下载,然后第一次这个文件保存在一个临时文件夹下面,以后每次下载的时候总是先检查此临时文件夹,如果已经存在则直接下载,如果没有则从数据库重复这个动作。当然,保存在临时文件夹下的文件的命名需要唯一,这个应该没有问题。
VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
January 31, 2007
key words: pd, powerdesigner,外建
在PD中建立外键碰到一个问题,如: forum(id,name)表,forum_thread(id,forum_id)表,需要将forum的id设为forum_thread的外建,指向forum_id,默认的在 PD中是将主键设为外建.
需要如下设置才可以:

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
January 25, 2007
key words : hibernate spring dao
come from : http://lpacec.javaeye.com/blog/46220
1. package infoweb.dao;
2.
3. import java.util.List;
4. import java.util.Iterator;
5.
6. import infoweb.pojo.Info;
7.
8. import net.sf.hibernate.HibernateException;
9. import net.sf.hibernate.Query;
10. import net.sf.hibernate.Session;
11.
12. import org.springframework.orm.hibernate.HibernateCallback;
13. import org.springframework.orm.hibernate.support.HibernateDaoSupport;
14.

15. /** *//**
16. *

Title:

17. *

Description:

18. *

Copyright: Copyright (c) 2004

19. *

Company:

20. * @author 段洪杰
21. * @version 1.0
22. */
23.

24. public class InfoDAOImpl extends HibernateDaoSupport implements IInfoDAO
{

25. /** *//**
26. * 构造函数
27. */

28. public InfoDAOImpl()
{
29. super();
30. }
31.

32. /** *//**
33. * 增加记录
34. * @param info Info
35. */

36. public void setInfo(Info info) throws Exception
{
37. getHibernateTemplate().save(info);
38. }
39.

40. /** *//**
41. * 通过ID取得记录
42. * @param id String
43. * @return Info
44. */

45. public Info getInfoById(String id) throws Exception
{
46. Info info = (Info) getHibernateTemplate().load(Info.class, id);
47. return info;
48. }
49.

50. /** *//**
51. * 修改记录
52. * @param Info info
53. */

54. public void modifyInfo(Info info) throws Exception
{
55. getHibernateTemplate().update(info);
56. }
57.

58. /** *//**
59. * 删除记录
60. * @param Info info
61. */

62. public void removeInfo(Info info) throws Exception
{
63. getHibernateTemplate().delete(info);
64. }
65.
66. ////////////////////////////////////////////////////////
67. ///// ///
68. /////以下部份不带审核功能 ///
69. ///// ///
70. ////////////////////////////////////////////////////////
71.

72. /** *//**
73. * 取记录总数
74. * @return int
75. */

76. public int getInfosCount() throws Exception
{
77. int count = 0;
78. String queryString = “select count(*) from Info“;
79. count = ((Integer) getHibernateTemplate().iterate(queryString).next()).
80. intValue();
81. return count;
82. }
83.

84. /** *//**
85. * 取所有记录集合
86. * @return Iterator
87. */

88. public Iterator getAllInfos() throws Exception
{
89. Iterator iterator = null;
90. String queryString = “ select info from Info as info order by info.id desc“;
91. List list = getHibernateTemplate().find(queryString);
92. iterator = list.iterator();
93. return iterator;
94. }
95.

96. /** *//**
97. * 取记录集合
98. * @return Iterator
99. * @param int position, int length
100. */

101. public Iterator getInfos(int position, int length) throws Exception
{
102. Iterator iterator = null;
103. String queryString = “ select info from Info as info order by info.id desc“;
104. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
105. //设置游标的起始点
106. query.setFirstResult(position);
107. //设置游标的长度
108. query.setMaxResults(length);
109. //记录生成
110. List list = query.list();
111. //把查询到的结果放入迭代器
112. iterator = list.iterator();
113. return iterator;
114. }
115.

116. /** *//**
117. * 取第一条记录
118. * @throws Exception
119. * @return Station
120. */

121. public Info getFirstInfo() throws Exception
{
122. Iterator iterator = null;
123. Info info = null;
124. String queryString = “select info from Info as info order by info.id desc“;
125. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
126. //记录生成
127. List list = query.list();
128. //把查询到的结果放入迭代器
129. iterator = list.iterator();

130. if (iterator.hasNext())
{
131. info = (Info) iterator.next();
132. }
133. return info;
134. }
135.

136. /** *//**
137. * 取最后一条记录
138. * @throws Exception
139. * @return Station
140. */

141. public Info getLastInfo() throws Exception
{
142. Iterator iterator = null;
143. Info info = null;
144. String queryString = “select info from Info as info order by info.id asc“;
145. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
146. //记录生成
147. List list = query.list();
148. //把查询到的结果放入迭代器
149. iterator = list.iterator();

150. if (iterator.hasNext())
{
151. info = (Info) iterator.next();
152. }
153. return info;
154.
155. }
156.
157. ////////////////////////////////////////////////////////
158. ///// ///
159. ///// 以下部份表中要有特定字段才能正确运行 个人和企业 ///
160. ///// ///
161. ////////////////////////////////////////////////////////
162.

163. /** *//**
164. * 取符合条件记录总数, [表中要有 isperson 字段]
165. * @return int
166. * @param int isPerson
167. */
168.

169. public int getInfosCountByIsperson(int isPerson) throws Exception
{
170. int count = 0;
171. String queryString =
172. “select count(*) from Info as info where info.isperson =“ + isPerson;
173. count = ((Integer) getHibernateTemplate().iterate(queryString).next()).
174. intValue();
175. return count;
176. }
177.

178. /** *//**
179. * 取所有符合条件记录集合, 模糊查询条件.[表中要有 isperson 字段]
180. * @return Iterator
181. * @param int isPerson
182. */
183.

184. public Iterator getAllInfosByIsperson(int isPerson) throws Exception
{
185. Iterator iterator = null;
186. String queryString = “ select info from Info as info where info.isperson =“ +
187. isPerson + “ order by info.id desc“;
188. List list = getHibernateTemplate().find(queryString);
189. //把查询到的结果放入迭代器
190. iterator = list.iterator();
191. return iterator;
192. }
193.

194. /** *//**
195. * 取符合条件记录集合, 模糊查询条件.[表中要有 isperson 字段]
196. * @return Iterator
197. * @param int isPerson,int position, int length
198. */
199.
200. public Iterator getInfosByIsperson(int isPerson, int position, int length) throws

201. Exception
{
202. Iterator iterator = null;
203. String queryString = “ select info from Info as info where info.isperson =“ +
204. isPerson + “ order by info.id desc“;
205. //创建查询
206. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
207. //设置游标的起始点
208. query.setFirstResult(position);
209. //设置游标的长度
210. query.setMaxResults(length);
211. //记录生成
212. List list = query.list();
213. //把查询到的结果放入迭代器
214. iterator = list.iterator();
215. return iterator;
216. }
217.
218. ////////////////////////////////////////////////////////
219. ///// ///
220. ///// 以下部份表中要有特定字段才能正确运行 查询部份 ///
221. ///// ///
222. ///////////////////////////////////////////////////////

223. /** *//**
224. * 取符合条件记录总数, 模糊查询条件.[表中要有 title 字段]
225. * @return int
226. * @param String text
227. */

228. public int getInfosCount(String text) throws Exception
{
229. int count = 0;
230. count = ((Integer) getHibernateTemplate().iterate(
231. “select count(*) from Info as info where info.title like ’%“ + text +
232. “%’“).next()).intValue();
233. return count;
234. }
235.

236. /** *//**
237. * 取所有符合条件记录集合, 模糊查询条件.[表中要有 title 字段]
238. * @return Iterator
239. * @param String text
240. */
241.

242. public Iterator getAllInfos(String text) throws Exception
{
243. Iterator iterator = null;
244. String queryString =
245. “ select info from Info as info where info.title like ’%“ + text +
246. “%’ order by info.id desc“;
247. //创建查询
248. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
249. //记录生成
250. List list = query.list();
251. //把查询到的结果放入迭代器
252. iterator = list.iterator();
253. return iterator;
254. }
255.

256. /** *//**
257. * 取符合条件记录集合, 模糊查询条件.[表中要有 title 字段]
258. * @return Iterator
259. * @param String text,int position, int length
260. */
261. public Iterator getInfos(String text, int position, int length) throws

262. Exception
{
263. Iterator iterator = null;
264. String queryString =
265. “ select info from Info as info where info.title like ’%“ + text +
266. “%’ order by info.id desc“;
267.
268. //创建查询
269. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
270. //设置游标的起始点
271. query.setFirstResult(position);
272. //设置游标的长度
273. query.setMaxResults(length);
274. //记录生成
275. List list = query.list();
276. //把查询到的结果放入迭代器
277. iterator = list.iterator();
278. return iterator;
279. }
280.
281. ////////////////////////////////////////////////////////
282. ///// ///
283. ///// 以下部份表中要有特定字段才能正确运行 注册相关 ///
284. ///// ///
285. ////////////////////////////////////////////////////////
286.

287. /** *//**
288. * 取符合条件记录总数.[ 表中要有 registername 字段]
289. * @return int
290. * @param String text
291. */

292. public int getInfosCountByRegisterName(String registerName) throws Exception
{
293. int count = 0;
294. count = ((Integer) getHibernateTemplate().iterate(
295. “select count(*) from Info as info where info.registername = ’“ +
296. registerName + “‘“).next()).intValue();
297. return count;
298. }
299.

300. /** *//**
301. * 通过注册名取得一条记录,如有多条,只取第一条.[表中要有 registername字段]
302. * @param registername String
303. * @return Info
304. */

305. public Info getInfoByRegisterName(String registerName) throws Exception
{
306. Iterator iterator = null;
307. Info info = null;
308. String queryString =
309. “ select info from Info as info where info.registername=’“ +
310. registerName + “‘ order by info.id desc“;
311. //创建查询
312. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
313. //记录生成
314. List list = query.list();
315. //把查询到的结果放入迭代器
316. iterator = list.iterator();

317. if (iterator.hasNext())
{
318. info = (Info) iterator.next();
319. }
320. return info;
321. }
322.

323. /** *//**
324. * 通过注册名取得所有记录集合.[表中要有 registername字段]
325. * @param registername String
326. * @return Iterator
327. */
328. public Iterator getAllInfosByRegisterName(String registerName) throws

329. Exception
{
330. Iterator iterator = null;
331. String queryString =
332. “ select info from Info as info where info.registername=’“ +
333. registerName + “‘ order by info.id desc“;
334. //创建查询
335. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
336. //记录生成
337. List list = query.list();
338. //把查询到的结果放入迭代器
339. iterator = list.iterator();
340. return iterator;
341. }
342.

343. /** *//**
344. * 通过注册名取得记录列表.[表中要有 registername字段]
345. * @param registername String
346. * @return Iterator
347. */
348. public Iterator getInfosByRegisterName(String registerName, int position,

349. int length) throws Exception
{
350. Iterator iterator = null;
351. String queryString =
352. “ select info from Info as info where info.registername=’“ +
353. registerName + “‘ order by info.id desc“;
354. //创建查询
355. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
356. //设置游标的起始点
357. query.setFirstResult(position);
358. //设置游标的长度
359. query.setMaxResults(length);
360. //记录生成
361. List list = query.list();
362. //把查询到的结果放入迭代器
363. iterator = list.iterator();
364. return iterator;
365. }
366.
367. ////////////////////////////////////////////////////////
368. ///// ///
369. ///// 以下部份表中要有特定字段才能正确运行 树型版块 ///
370. ///// ///
371. ////////////////////////////////////////////////////////
372.

373. /** *//**
374. * 取记录总数.[ 表中要有 board_id 字段]
375. * @return int
376. * @param String boardId
377. */

378. public int getInfosCountByBoard(String boardId) throws Exception
{
379. int count = 0;
380.
381. count = ((Integer) getHibernateTemplate().iterate(
382. “select count(*) from Info as info where info.boardId = ’“ + boardId +
383. “‘“).next()).intValue();
384.
385. return count;
386. }
387.

388. /** *//**
389. * 通过版块名取得所有记录集合.[表中要有 board_id字段]
390. * @param BoardId String
391. * @return Iterator
392. */

393. public Iterator getAllInfosByBoard(String boardId) throws Exception
{
394. Iterator iterator = null;
395. String queryString = “ select info from Info as info where info.boardId=’“ +
396. boardId + “‘ order by info.id desc“;
397. //创建查询
398. Query query = getHibernateTemplate().createQuery(getSession(), queryString);
399. //记录生成
400. List list = query.list();
401. //把查询到的结果放入迭代器
402. iterator = list.iterator();
403. return iterator;
VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
January 23, 2007
key words: REST webservice
转自廖宇雷的Weblog
REST 是由 Roy Fielding 在他的论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。
REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”(参考:《SIP/IMS网络中的Representational State Transfer (REST)和数据分布》)。
—————————————
前面的内容比较枯燥,我说说我自己的理解。
但是 REST 到底是什么呢?论文我看不懂,不过找到一篇更简单易懂的东西:《Building Web Services the REST Way》。
根据这篇文章,我整理了一下我自己对 REST 的理解:
REST 首先只是一种架构样式,不是一种标准。这点和 Ajax 类似,两者都是利用现有的成熟技术。
在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源。
URI 是英文 Uniform Resource Identifier 的缩写,中文翻译“通用资源标志符”。
“通用资源标志符”是指唯一标识一个资源(xhtml 文件、图片、css 样式表)的字符串。当然了,RFC 中定义的 URI 复杂得多,不过我们此处将 URI 想象成一个人的身份证号码就行了(你不能有两个同时有效的身份证号码,一个号码也不可能同时对应两个人)。而我们天天挂在嘴边的 URL 地址就是 URI 的一种表现形式(个人理解,有错请纠正)。
知道什么是 URI 后,我们来看一个实际例子:
http://www.example.com/photo/logo 指向 example.com 网站(可以视为一个 Web 应用)中类型为 photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 xhtml 文档,其中用 <img src=”……” /> 来显示实际的照片。
http://www.example.com/photo/logo 很容易让你想到 URL 重写。事实上,这个地址很可能会在服务器内部处理为 http://www.example.com/photo.php?name=logo 这样的地址。photo.php 是服务器端的一个动态脚本文件,根据 name 参数生成 xhtml 文档返回给浏览器。
现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取“同一个资源的不同表现形式的数据”。对于这个要求,我们可以很容易的用另一个 URL 地址达到:http://www.example.com/xml/logo。
但是,这就违背了“URI 唯一标识一个资源”的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI。
而在 REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 http://www.example.com/photo/logo。
那这是怎么办到的呢?Ruby On Rails 中是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。
看到这里,聪明的家伙应该知道了。只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。
如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了。比如我写了一个 Delphi 程序,现在只需要构造一个包含 Accept: text/xml 的 HTTP 请求头,然后将请求发送到 http://www.example.com/photo/logo 就可以了。返回的结果就是一个 XML 文档,而不是 xhtml 文档。
因为我们的 HTTP 请求头信息有不同的状态,从而可以获得不同的数据,所以叫做“具象状态传输” 
—————————————
除了上面的用法,REST 还有进一步的扩展。
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:
- POST: 创建
- GET: 读取
- PUT: 更新
- DELETE: 删除
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:
http://www.example.com/photo/logo(读取)
仍然保持为 [GET] http://www.example.com/photo/logo
http://www.example.com/photo/logo/create(创建)
改为 [POST] http://www.example.com/photo/logo
http://www.example.com/photo/logo/update(更新)
改为 [PUT] http://www.example.com/photo/logo
http://www.example.com/photo/logo/delete(删除)
改为 [DELETE] http://www.example.com/photo/logo
从而进一步规范了资源标识的使用。
通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并提供对资源的操作服务。这对于以资源为中心的 Web 应用来说非常重要。例如照片共享网站、用户社区等。
—————————————
Ruby On Rails 1.2 版对 REST 有很好的支持,但要在 PHP 中应用 REST 还需要解决不少问题:
- 如何在服务端判断 PUT、DELETE 请求方法;
- 如何获取用 PUT、DELETE 请求方法中传递的数据;
- 如何获取 HTTP 请求头信息中的 Accept 参数值;
- 如何在浏览器端发起 PUT 和 DELETE 请求。
不过我仔细看了 PHP 文档,我觉得上面几个问题都是可以解决的。
服务端综合使用 $_SERVER[’HTTP_ACCEPT’]、$_SERVER[’REQUEST_URI’]、$_SERVER[’REQUEST_METHOD’]、$_SERVER[’QUERY_STRING’] 这些变量应该可以搞定前面三个问题。而第四个问题则可以用 JavaScript 的 XMLHttpRequest 对象来实现。
不过我想 REST 的真正价值在于 Web Services,而不是通过浏览器操作的应用程序。
—————————————
参考:
VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
January 20, 2007
key words : web快速开发
web快速开发是一个值得期待的东西,最早我接触过codecharge,是一个商业软件,功能据说很强大,我试用过,支持php,asp,jsp等多语言,但是感觉对java的支持不是很顺手,接着就是asp,这个好也不好,原因就不说了,因为我对java关注。
2. 接着就是dorado ,刚看到的,感觉也不错,有asp的风格,不过更适合j2ee的环境 ,这里是他们的在线演示demo,有兴趣的可以看一下
3. 最后,刚google了一下,Oracle也有一个基于Oracle数据库的快速开发产品 : APEX,基于浏览器做DB 开发,原来的名字叫做HTML DB,名字很直观,据说Oracle的metalink就是用这个实现的,应该功能不赖。
4.对了,再补充一个现在很热的,Ror,听说javaeye的网站要重新用ruby1.2开发,试用过一点,感觉确实令人震惊,值得关注。
java的技术其实是看着很热闹,比较大的东西也不少,但是真正关注web这一块的其实不多,无论是struts还是webwork,离我们所说的真正的“快速开发”的距离很远,而以上一些工具的出现也许会逐步改善j2ee在这一领域的现状。
我之所以对这个目前有点兴趣,确实有一种强烈的反差在折磨着我,因为我相信在j2ee的web开发里确实存在本来要开发1周多的工作量很可能用一个好的工具几个小时就搞定了,这是一件多么荒唐搞笑的事情?如果dorado在它的产品中真的能做到这样那我们的java开发那么坑吃坑吃的折腾个什么劲啊? 也许真的有奇迹,我宁愿相信有这样的奇迹。
大家有什么好的想法可以讨论一下。
VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
January 17, 2007
key words: powerdesign,power , design
引言:
发现powerdesign的文档真的是不多,不过powerdesign还是很有用的,见到此类文档就收藏下吧.
转自edeed
附上一些使用pd11的心得:
1、安装PD v11.0版
2、由pdm生成建表脚本时,字段超过15字符就发生错误(oracle)
原因未知,解决办法是打开PDM后,会出现Database的菜单栏,进入Database - Edit Current DBMS -script-objects-column-maxlen,把value值调大(原为30),比如改成60。出现表或者其它对象的长度也有这种错误的话都可以选择对应的objects照此种方法更改!
或者使用下面的这种方法:
生成建表脚本时会弹出Database generation提示框:把options - check model的小勾给去掉,就是不进行检查(不推荐)!
或者可以修改C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\DBMS\oracl9i2.xdb文件
修改好后,再cdm转为pdm时,选择“Copy the DBMS definition in model”把把这个资源文件拷贝到模型中。
3、生成的建表脚本中如何把对象的双引号去掉?
打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase或者Lowercase,只要不是Mixed Case就行!
或者选择Database->Edit current database->Script->Sql->Format,有一项CaseSensitivityUsingQuote,它的 comment为“Determines if the case sensitivity for identifiers is managed using double quotes”,表示是否适用双引号来规定标识符的大小写,可以看到右边的values默认值为“YES”,改为“No”即可!
或者在打开pdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase就可以!
4、建立一个表后,为何检测出现Existence of index的警告
A table should contain at least one column, one index, one key, and one reference.
可以不检查 Existence of index 这项,也就没有这个警告错误了!
意思是说没有给表建立索引,而一个表一般至少要有一个索引,这是一个警告,不用管也没有关系!
5、创建一个表在修改字段的时候,一修改name的内容,code也跟着变化,如何让code不随着name变化
Name和Code 的右侧都有一个按钮“=”,如果需要不同步的话,把这个按钮弹起来就可以了。
Tools->General Options->Dialog->Name to Code Mirroring (去掉)
6、由CDM生成PDM时,自动生成的外键的重命名
PDM Generation Options->Detail->FK index names默认是%REFR%_FK,改为FK_%REFRCODE%,其中%REFRCODE%指的就是CDM中Relationship的code!另外自动生成的父字段的规则是PDM Generation Options->Detail->FK column name template中设置的,默认是%.3:PARENT%_%COLUMN%,可以改为Par%COLUMN%表示是父字段!
7、如何防止一对一的关系生成两个引用(外键)
要定义关系的支配方向,占支配地位的实体(有D标志)变为父表。
在cdm中双击一对一关系->Detail->Dominant role选择支配关系
8、修改报表模板中一些术语的定义
即文件:C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\Report Languages\Chinese.xrl
Tools-Resources-Report Languages-选择Chinese-单击Properties或双击目标
修改某些对象的名称:Object Attributes\Physical Data Model\Column\
ForeignKey:外键
Mandatory:为空
Primary:主键
Table:表
用查找替换,把“表格”替换成“表”
修改显示的内容为别的:Values Mapping\Lists\Standard,添加TRUE的转化列为是,FALSE的转化列为空
另外Report-Title Page里可以设置标题信息
VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
January 3, 2007
key words: 2007 plans
新的一年开始了,制定一个计划吧
说说你有什么计划
如图:

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]