数据库编程十大难题征解 (10分)

  • 主题发起人 主题发起人 Qingzhong
  • 开始时间 开始时间
谢谢
我刚看到NICROSOFT兄以前写RAD和非RAD的看法http://www.sunistudio.com/nicrosoft
如果阁下眼光不在国内这样的“技术中转市场”,而是直接取道第一生产线,我知道你应该明白我的意思
那我们的看法应该很快就接近了,RAD是一种思想,在历史看来不可能是最好的,但对于现在的开发工具来说
是最需要和最快速的
DELPHI有的很多让人“骄傲”的特性其实很多已经被“他们”抄袭去了
你的“恨”让我想到了人们对VCL的争论
想到OO的“出现”?现在到了CBD,我很感慨DELPHI一开始就先人5年以上提出CBD的概念,在全世界
引起三方控件的big party!
http://www.borland.com/bww/uk/programs/bsp/connections/connections.html
Borland的技术朋友们整天开心地在设计新的结构(姑且这么称呼吧),例如,语言多了需要分流和下岗,
因此有人想到Language Swich...
在做开发方案的时候如果一个程序员说这个不能实现那个不能实现的时候,他是否考虑在句子中加个我字?
要相信自己,DELPHI让你尽力去“只有想不到,没有做不到”
没有厚积,哪来的。。。
重复劳动可以用VCL/CLX,LIB,DLL/BPL来解决,不可否认现在的VCL的组织管理确实不够人性化,
这是可以改善的,这也好比是一个坎,你会问,问什么COMPONENT为什么这么难做?
不是抄抄就行的吗?但抄只会把你现在每月3000的工资抄到更低,最后不是VB kill you 而是我们自己
对吗?
软件开发和计算科学又不一样,一个是行业,需要的是CASE,不是科学贡献
如果觉得基础不扎实,可以找机会把《DELPHI技术手册》看两遍(不是打广告[:D])
如果实在觉得自己已经很牛,可以找机会加自己工资,或者转做其他有价值的事
我不知道是报纸还是电视告诉我们BBS或者CHATROOM是不是到处能找到ANSWER
不过我很明白任何有能力自己找到解决方案,而且能发现到底什么样的回答当初提示了自己
这样的朋友是今后还会继续找到更多方案的答案
哪怕是在没有一行CODE的BBS,or somewhere else
 
既然这样说,那我也说一些吧:
没有万能的,也没有完美的和通用的,只有较好的;
5--http://delphi.mychangshu.com/default.asp里好象有一个号称的万能查询控件,
可惜今天进不了,没办法查证了;
6--RM:http://rmachine.y365.com/index1.html较好,但不是万能;
7、10可以使用Sql Server、Interbase的数据库服务器的触发器和存储过程解决;
GridEh是一个很好的控件,只是打印系统不是最好,可以用RM中TRMFormReport控件代替;
8--http://www.delphibbs.com/delphibbs/dispq.asp?lid=958559对你可能有所帮助;
2--每人可能各有一套方法,但没法用控件实现;
1--delphi的后继版本可能会实现。
3--我不会用数据字典,做的也很好(用IBX,IBX与Ado差不多)。

能否解释数据字典,我到现在还不知怎么回事呢?
 
TO zjjzl:
我不是专家,数据字典我说不准,自己试验一下:
Form中: 加入(DBE) TTable: databaseName: dbdemos
tableName: customer.db
打开TTable的Field Editor:
Add all fields
选中字段CustNO, 点右键弹出Popupmenu,
选Associate Attributes..., 再选Custno, ok!
然后看Table1CustNo的属性,发现很多东西吧?

每次从Field Editor中将字段拖入Form后, 修改相应Label的Caption,
修改Grid中的Title的Caption, 为相应的中文(因为我从来不用中文做字段名),
...很痛苦吧

有了数据字典,只需在字典中定义,修改定义即可.
当然DisplayLabel只是其中一项, 其它的有Alignment, Customconstraint, CustomconstraintErrorMessage,
DisplayFormat, EditFormat, fieldKind, Lookup..., MaxValue, MinValue, 等等
集中定义集中修改, 相关引用自动更新, 很爽吧....,
例如:你的程序中不同表中有200个字段关于数量的, 200个字段关于金额的, 那么你定义
两个Attribute然后引用这两个Attribute即可....,修改时也只需修改Attribute, 程序中
这400个地方的Field property自动更新了.

VFP中有简单的数据字典功能, 很好用. Delphi中也有, 不过必须使用BDE, ADO不行,实在让
人遗憾!
 
问题1的方案:
1. Ratioanl Rose
2 Rational <=> Delphi 工具: 1) BoldSoft: Rose Bold for Delphi Link
或2) Ensemble: Rose Delphi Link
这是Borland Enterprise Studio for Windows的方案: Rose + Bold
Rational认可的Partner: 1) 或 2)

 
顶楼:Delphi不是光做数据库的,
如果你有兴趣,可以把这十个功能做成一组控件,应该是有市场的[:)]
 
补充:
5--http://delphi.mychangshu.com/dispdoc.asp?id=861
 
试了一下boldsoft, 感触颇深, 原来数据库程序居然可以这么做, 开了眼界.
虽然我不喜欢boldsoft塞给我的一堆控件.
Ensemble的Rose Delphi Link虽然不强加一套控件给我们, 但是他无法自动将
Delphi的pas或者dcu转换成对应的cat, 只能使用他自带的cat, 这不能不说是他的巨大
缺陷
要是能有一种中间件就好了, 既能读写和解释rose模型, 又能自动扫描Delphi的
vcl控件, 最后能在rose中利用Delphi的类, 也能自动生成应用程序(App或com)的框架.
这样就有了一种充分的选择我喜欢的控件的自由, 又能支持正向或反向工程!则完美矣.

 


我来回答你:
1. Rose, PowerDesigner, ERWin等Case工具与Delphi的集成
//没有必要,我自己的看法。您Fox时用这些大东东吗?如果用,恭喜你。你快成Fox的ProjectManager了
2. Master/Detail的完美解决方案(含c/s, MultiTier)
//现在的MD模式有什么致命问题?你需要解决什么问题?没有说清楚。看来Rose使的不熟
3. ADO下的DataDictioanry(仿BDE的数据字典、PowerBuilder的数据字典)
//我三年前就做了,基于BDE的,Delphi自己的不好用,现在已经可以在BDE, ADO....下使用了,基于接口的,不过我想以后只支持ADO了,因

为BDE问题多多
4. dbLookupComboBox的改良,既能DropDown, 又能输入代码、汉字、助记码并根据输入的内 容自动ReSelect。
//我做了,可以为任何的Edit输入值,类似于Delphi IDE 的Tip,可以自动弹出。
5.万能查询,支持字段选择、各种sql操作符(如:like, between,=, <>等)、Example
支持DbLookupcombobox。查询条件可用(、)、and、or组合。查询条件自动生成相应的汉字
说明以及相应的Sql语句。//我三年前就做了一个,可以完成你说的功能。也可以手工输入。但是后来观察用户,没有人使用,想想也是。中国

现在的用户,谁给你写SQL呢?而叫我用,我肯定用手工输入,你看
select * from yd_gcgk gk where
gk.上级代码 <> '断开' and
(select count(*) from pw_dlj_gt gt
where gk.上级代码 <> null and gk.上级代码=gt.线路代码 and gk.连接点杆号=gt.杆号
) = 0
这个用“万能”工具怎么生成呢?
6.万能打印(SingleTable、Master/Detail)
//拜托,又是“万能”,FastReport可否,起码比Fox强多了。
7.单据号(例如:记账凭证号)的自动连续编号,考虑多用户以及单据的删除。
//AdoDataset.RecNo,没有问题,呵呵,MS的Ado真好!虽然比BDE慢,但是功能真强。BDE看来可以退休了。
8.通用的权限管理方案
//三年前做的,现在改进了,可以自定义权限,用户,角色,可以控制到字段和Form上的每一个Control,不用编一句代码
9。Grid中添加Control,例如dbchechbox、dbLookupcombobox
//做了,可以嵌入任何的Control,不过还有些问题,有时Focus丢失了,还有有时会导致Grid重复刷新。还没有找到原因。
10. 记账时同时更新数十个表(例如:记账凭证记账、入库单记账。。。)的方案
//别夸张了,如果计一个帐就刷新数十个表,你的数据库设计肯定不合理,不要和我说项目很大,呵呵,大项目也是,看来不但Rose不熟,

PowerDesigner也白菜,你怎么在PowerDesigner表达呢?意大利面条?就是更新,在Dataset的事件里写,或者做成Trigger,或者在AppServer

,办法那么多,你不使我也没有办法

综上:
1、各种工具各有长处短处,比这个没有意思
2、使用一种工具,就像爱一个人,不能光看到他的优点,还能容忍他的缺点
3、Delphi这个工具,确实功能超强,但是BUG多多,有的时候气的你指着屏幕骂!这和Borland公司的情况有关,就那么几个人,而且都是顶尖

高手。做出的东东肯定是这个样子,而MS人员众多,能够合理搭配。出的东东稳定性好,容易上手。你看两家的帮助就能看出来。
4、Delphi很多东东需要你自己钻研,很多方面的技术,书上都没有的(因为写Delphi大全的,往往使原来写Foxpro大全的),比如Stream,

RTTI等等,现在很多人拿Delphi当Foxpro使,这样好不了
5、不要再提那个eReport了,嗡嗡翁嗡嗡翁嗡嗡翁嗡嗡翁嗡嗡翁嗡嗡翁的烦人,你不知道的事太多了。难道谁在网上卖个元件还到你那里登记

一下?你写个Foxpro的元件我帮你卖好不好?
 
>>1. Rose, PowerDesigner, ERWin等Case工具与Delphi的集成
可能我把问题说严重了. 有方案, 只是我不满意. 因为我原来做的系统有78个表,一个用户
每年的数据量在40M左右,这肯定不合理,我想重新写,自然希望有个工具整理一下自己的思路。

>> 2. Master/Detail的完美解决方案
关于主从表的问题:
看一看: http://www.delphibbs.com/delphibbs/dispq.asp?lid=777037
我就碰到了同样的问题. 看完回复后, 觉得没有一个答案可行.其中不乏
论坛中的得分高手.比如说: 先Post主表, 然后才开始输入明细表的内容, 这样的
事我是不干的, 留下一条孤独的主表记录? 那可真是"独孤求败"了.
自己又100分问了一次, 还是一样.
于是, 自己研究, 最后解决了该贴说的问题.最后达到了
1. 主/从设置为: 缓存更新模式
2. 当主表在新增状态下, 不会出现明细只会显示一个记录的问题
3. 明细表对应主表的Key不会出现Null
当时很多人提出说这是bug, 其实根本不是什么bug, 可能很多人跟我的水平差
不多, 动不动就叫bug?

>>3. ADO下的DataDictioanry(仿BDE的数据字典、PowerBuilder的数据字典)
//我三年前就做了,基于BDE的,Delphi自己的不好用,现在已经可以在BDE, ADO....下使用了,基于接口的
很羡慕DelphiSwords的水平

4. dbLookupComboBox的改良,既能DropDown, 又能输入代码、汉字、助记码并根据输入的内 容自动ReSelect。
//我做了,可以为任何的Edit输入值,类似于Delphi IDE 的Tip,可以自动弹出。
看来有人与我的想法相同. 看一看"用友"面对上万个客户要从中找到一个用户要输入的客户时的
尴尬就知道了. 一是Dropdown, 二是就用户写sql语句.

5.万能查询
//我三年前就做了一个,可以完成你说的功能。现在的用户,谁给你写SQL呢?
我做的万能查询用户从来没有见到一个sql语句.

6.万能打印(SingleTable、Master/Detail)
//拜托,又是“万能”,FastReport可否,起码比Fox强多了。
我用Fox是,从来没有写过一个报表打印程序。 全部是自动的,且WYSIWYG。

7.单据号(例如:记账凭证号)的自动连续编号,考虑多用户以及单据的删除。
//AdoDataset.RecNo,没有问题,呵呵,MS的Ado真好!虽然比BDE慢,但是功能真强。BDE看来可以退休了。
例如一个表里存有多类单据(如入库单、出库单),每月从1#开始连续编号,我不知道AdoDataset.RecNo还
行不行,我现在还没有试。

8.通用的权限管理方案
//三年前做的,现在改进了,可以自定义权限,用户,角色,可以控制到字段和Form上的每一个Control,不用编一句代码
这正是我所想的和所想要的。可惜我没有足够的银子买一份。

9。Grid中添加Control,例如dbchechbox、dbLookupcombobox
//做了,可以嵌入任何的Control,不过还有些问题,有时Focus丢失了,还有有时会导致Grid重复刷新。还没有找到原因。
例如:录入发票时,需要在grid中输入产品,我当然会Lookup, 但绝对不是简单的dropdown.
只是那时候M$让我在有限的智慧内完成了。

10. 记账时同时更新数十个表(例如:记账凭证记账、入库单记账。。。)的方案
//别夸张了,如果计一个帐就刷新数十个表,你的数据库设计肯定不合理,不要和我说项目很大,呵呵,大项目也是,看来不但Rose不熟,
可能只有我干过这样的傻事,那是在销售员回款后计算提成时,要求:
1)记录回款 2)核销相应的应收帐款记录 3)按照产品、销售员、客户、地区、销区、发货时间、
开发票时间、回款时间、数量、单价、金额等17个因素计算提成、让利、超价扣税、提前回款奖励
积量返点等8个项目 4)生成相应的记帐凭证传递到用友帐务处理系统。
我不知道如果数据库设计好了,是不是一个post就可以做到。尽管在生活中偶尔也吃意大利面条,当然
在程序中我和你一样不喜欢意大利面条。

Foxer用VFP同样也能做FlatFile, c/s, b/s, com+, xml/Soap/webService, 并且在一定程度上较Delphi容易。
只是code太容易被Un了,所以只好改行了。至少我可以说同样的应用VB+ACESS做的话,完成同样的功能,我的
程序跑完了,回来至少还有时间去踹VB100脚。
 
1、不管了
2、可以在Post之前Connection.BeginTrans,然后在所有的过帐完后用 Connection.CommitTrans,如果有异常,用Connection.RollbackTrans
3、骂我呢 :)
4、其实解决办法很多,比如将关键的字段值的拼音码自动提出,也可以用户输入,然后用户就输入码就行了:大富翁=DFW;或者DropDown Tree,或者。。。我自己觉得Delphi 的 DropDown只要多于10条记录,就很失败,如果要定位一条记录,我仿照Fox做了一个DBFind,可以象Fox那样定位记录(经过了Foxer的验收,他一天不停的嗡嗡翁要这个,不过做了看看还真的方便了用户 :-)
5、当然我也不会叫用户看到SQL了,手工输入SQL是我留给自己用的。用户用选择和拖动就可以了。但是实际使用中发现问题:1、用户根本就不用;2、复杂的SQL不能形成,就像我上面说得,那还是简单的,如果需要几条SQL语句才能返回结果,怎么办?
6、WYSIWYG不会吧,象多数的国外报表一样,Fox的报表也是基于Band的,可能这两年Fox有了飞速发展,这我就不知道了 :)
7、没有问题,ADO的RecNo只反映一个位置,这正是我们要的
8、呵呵,给银子我也不给你,开玩笑呢,不过真的不能。
9、这个太容易了,比如按一个?,弹出一个Pannel,我管他叫PopupPanel,至于Panel上有什么,随你的便,可以不写一行代码,运行时刻可以设计,可以了吧?
10、当然了,用Delphi语句,Trigger,AppServer都可以,Trigger我认为是最简便的,但是移植到不同数据库时会有问题,因为不同的数据Trigger语法有差异,至于用什么,要看实际情况

应用程序<>数据库程序,Delphi的指针,链表,流。。。。这些才是用Delphi的理由,比如有一个程序,原来用Fox(设计者是老Foxer)做的,出一张图要用27分钟,我用Delphi重写的出一张图<1s,你看着办吧。
xml/Soap/webService我一点也不懂,但是我的开发组里老一辈的程序员,99%都是用的Fox,他们都转到了Delphi,理由有很多,运行效率高(不光是数据库的),各种函数丰富,界面设计方便漂亮。。。。就是没有怕Un的,你想想,就算你Un了用友,金蝶的程序(当然不是UnFox),你就能赚钱了?,

“至少我可以说同样的应用VB+ACESS做的话,完成同样的功能,我的
程序跑完了,回来至少还有时间去踹VB100脚”,说什么呐,不懂 :)
 
>>1. Case工具
UML工具对Delphi的支持不够。看别人C++, Java能Forward/Reverse地Roundtrip, 而Delphi?

>>2. 主从表问题
>>可以在Post之前Connection.BeginTrans,然后在所有的过帐完后用 Connection.CommitTrans,
>>如果有异常,用Connection.RollbackTrans
例如录入一张发票:
录入完Master部分后=>beginTrans=>post=>得到Master ID,
然后再录入Detail(OnNewRecord: DetailDataset.fieldByname('MID').value := MasterDataset.Fieldbyname('MID').value)
=>CommitTrans-> On Execption DO RollTrans
问题1: 主表的Post可能无法完成, 例如主表录入不完整,或者用户上来就先录入明细表呢?
2: 用户上午11点录入完Master=>beginTrans=>post后去吃中午饭了, 又上了一趟街,
下午3点才回来....一个事务持续了4个小时, Oh! My God! 连Foxer都不会干这样
的Transaction, 因为有3个5个用户这样, 这个系统就玩完了.

>>3. ADO下的DataDictioanry(仿BDE的数据字典、PowerBuilder的数据字典)
>>很羡慕DelphiSwords的水平
是真的很羡慕, 因为查遍了Delphi资源(可能有点夸张), 也无人谈及这一问题,
要是商品化一下? 真的有市场!

>>6、WYSIWYG不会吧,象多数的国外报表一样,Fox的报表也是基于Band的,
>>可能这两年Fox有了飞速发展,这我就不知道了
VFP有三个东西不是对象: 数据库及表、菜单、报表, 但不是对象的报表也可以
自己编程让它成为Object.

>>7、单据号
>>没有问题,ADO的RecNo只反映一个位置,这正是我们要的
这是一个很好的思路。谢谢!

>>8.通用的权限管理方案
给银子都不能卖,我理解你的苦衷,不过很遗憾。

>>Grid嵌入其它控件
>>9、这个太容易了,比如按一个?,弹出一个Pannel,我管他叫PopupPanel
幸亏你没告诉我弹出一个Form, 然后选按代码、名称、助记码那个查询,再输入条件,
再在查询结果中选择,最后关闭Form。 操作太不方便了!
我过去做的不需要?号:
例如: 000101 维生素C, 用户可输入000(则所用代码开头为000的拉出),
可输入WSSC(則所用助记码含WSSC的拉出),
可输入'生素'(则所用名称中含'生素'的拉出)
但那是M$替我做的,现在用Delphi'贴膏药'的方法, 效果很差。毕竟我的Delphi水平...555...
我推测M$也是'贴膏药',不过手法高明罢了。

>>10、当然了,用Delphi语句,Trigger,AppServer都可以
我的思路还是Fox的, 所用的操作集中在客户端, 肯定是行不通的。但全部依赖服务器端,
Trigger,Stored Procedure等只能得到半生不熟的米饭,还得加工。
这些天突然有一个想法:用Fox做中间层利用远程视图,可充分利用Fox的本地灵活的Cursor,
(因为有太多的中间结果以便进一步加工),又不至于加重客户端的负担。

“还有时间去踹VB100脚”意思是VB这只乌龟太慢了,让人敬而远之。

谢谢DelphiSwords, 为了我个人而不是全世界的这十个难题花费了这么多时间。
 
1、呵呵,里面的英文一个不懂,中文也不明白,^_^,这方面很白菜
2、如果你设置了MD,不用手工赋值,比如用MID关联的,Detail的MID会自动设置;
经过测试,我开了50个Trans,没有问题,如果3,5个就玩完,那可能是Fox;
如果还怕,可以设置AdoDataset.LockType := ltBatchOptimistic,然后在最后
BeginTrans
try
Master.ApplyUpdates
Detail.ApplyUpdates
CommitTrans
except
RollbackTrans
end;
如果非要先录明细,那你只能不用DBGrid,用DrawGrid,或者结合Edit。。。自己接收用户的录入,然后统一更新数据库。对于票据录入界面,这种情况常有。
再有,如果用你系统的用户有擅自离岗的变态行为。你应该考虑加上一个自动注销的功能。否则,和他就说不清了
3、很多软件公司的MIS模块都有类似的思想,差别在做的深浅,这个不是什么新鲜事。
4、看不懂在说什么,所答非所问。
7、Pass了^_^
8、苦衷?我有什么苦衷?只是想将自己所有的思想整体做出后商品化。在IT,技术不能成为钱,或者钱不是通过技术来的。只能是书生或者是骗子。
9、当然了,你以为我叫你弹出Form?骂我呢?你说的只是其中的一个功能,比如录入dfw,定位到“大富翁”,录入*83定位到第一个结尾是83的编号,或者只显示结尾是83的编号。按Enter确定,弹出位置和Dropdown一样,不是Form一样在屏幕中间。当然是铁膏药了,谁做都是,只是做的很像DropDown罢了,而且自动弹出,有些情况,尽量避免用户使用鼠标
10、按你的思路,当然可以,写代码吧,想怎么写,就怎么写,Delphi可能比Fox要写多的代码来换取灵活和效率,这个我不在乎,你呢?

很高兴认识你,DFW中你这样的少,多数人只对名词和MM感兴趣。和他们说一千句还不如MM发个嗲,或者MS放屁蹦出两个词。^_^
 
10分真的很少,不过谢谢DelphiSwords. 谢谢你的不厌其烦,谢谢你的一些思路。
很高兴认识你。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
后退
顶部