应用程序分类

做通用型软件没有出路,所以现在选择的是走按需订做的路子,这种方式的特点是归纳业务模式难、需求变化大、造价高。看在最后一点的面子上,不管想什么办法也得把合同签下。

程序分类的标准有很大,对于企业MIS来说,数据库是少不了的,根据企业的部署结构,分为本地和联网型:
一,本地型
此种类型指的是程序和数据库在同一台PC或者同一局域网(VPN也算),程序直接连接数据库,对数据库进行操作。
有些程序会允许多个客户端连接同一数据库,但一般情况各客户端对数据库的操作不会破坏数据完整性。

二,联网型
当本地型应用不能满足业务需求时,就要考虑联网型应用了。
1)纯在线型
此部署结构一般是指B/S结构,现阶段主流是Web应用。
它最大的特点是不需安装客户端,但同时也存在不能充分利用客户端PC资源的缺点。
编写此类型程序时,程序和数据库都处于服务器端。与本地型程序不同的是,它需要考虑并发状况。
另外需要特别指出的WPF的XBAP类型应用是一种伪在线型程序,它本质上还是本地型应用程序。

2)瘦客户端型
这种类型的应用程序可以弥补前两种类型的不足,这也意味着它更复杂、更高级。
一般来说,客户端只是对某一服务发出请求,并对结果进行呈现。服务端里封装了几乎所有的数据操作,并且对外提供服务。数据库一般都与服务端处于同一服务器或同一局域网。

Openbravo POS 简体中文语言包

一个朋友开七匹狼专卖店,需要POS收银系统,叫我帮忙找一个。对比多个后发现Openbravo POS不错,唯一的问题是纯英文介界面,于是根据官方文档里介绍的办法,使用Netbeans把语言文件大概翻译一些,没有全部翻译,但至少保证正常收银的界面是全中文的。

现在已经把语言包放到官方,地址是:http://forge.openbravo.com/projects/china/

软件通过审核

软件名称: 运营管理系统
版         本: 3.0
开发语言: C# + WPF + SQL SERVER + .net 4.0 + NH2.1.2
运行结构: Browse Application
开发周期: 120天(coding)
总   代 码: 61000行
功        能: 商品管理
                   采购管理
                   销售管理
                   促销活动管理
                   顾客信息管理
                   现金、库存报表
                   通知管理
                   考勤打卡
                   权限管理
                   指纹验证
                   条码打印

WPF DataGrid神异的现象

一个WPF的DataGrid,绑定到一个集合List<MyClass>,模式为OneWay,从DataGrid里选择一行,传递到另个弹出页面,并绑定到TextBox等控件,模式为TwoWay,这个神异的现象是这样子的:

我添加了两条测试数据到List<MyClass>集合里,这时DataGrid显示两条记录,我选择第一条记录,传递到弹出页面显示,我在这里修改其中的任何数据,DataGrid的显示数据都不会随着修改而发生变化。

然而,当我在DataGrid里选择的是第二条记录,并传递到弹出页面显示,我在这里修改的任何数据,都会同步反映到DataGrid里。

我又尝试更换这两条记录的位置,还是编辑位于第一条的记录时不能同步。

有个页面的DataGrid,只有第三条记录能同步显示,其余记录在修改时均不能同步显示。

有两个页面的DataGrid所有记录都能同步显示。

另外,即使不能同步显示,但DataGrid里记录的值其实是修改后的值。

SQL字符类型介绍

一,名词定义
char为 定长字符型,如char(10),你实际数据是‘hello’,这时Sql  Server   会自动补充空格,填满10位。varchar:可变长字符,没有上述问题,是多长就保存多长的数据。另外, char  和 varchar 在存储数据时,每个英文字符和数字都占一个字节,而一个中文的字符会占两个字节.

nchar 与 nvarchar 的用法基本相同,只不过在存储数据时采用的是 Unicode元码, 一个英文字符和一个中文字符所占的空间是相同的.都是两个字节.

二、名词解释
1、当使用非unicode时慎用以下这种查询:
select f from t where f = N’xx’
原因:无法利用到索引,因为数据库会将f先转换到unicode再和N’xx’比较

2、char 和相同长度的varchar处理速度差不多(后面还有说明)

3、varchar的长度不会影响处理速度(看后面解释)

4、索引中列总长度最多支持总为900字节,所以长度大于900的varchar、char和大于450的nvarchar,nchar将无法创建索引

5、text、ntext上是无法创建索引的

6、O/R Mapping中对应实体的属性类型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性来说,可变长度的类型更加吻合

7、一般基础资料表中的name在实际查询中基本上全部是使用like ‘%xx%’这种方式,而这种方式是无法利用索引的,所以如果对于此种字段,索引建了也白建

8、其它一些像remark的字段则是根本不需要查询的,所以不需要索引

9、varchar的存放和string是一样原理的,即length {block}这种方式,所以varchar的长度和它实际占用空间是无关的

10、对于固定长度的字段,是需要额外空间来存放NULL标识的,所以如果一个char字段中出现非常多的NULL,那么很不幸,你的占用空间比没有NULL的大,这时候,你可以使用特殊标识来存放,如:’NV’

11、同上,所以对于这种NULL查询,索引是无法生效的,假如你使用了NULL标识替代的话,那么恭喜你,你可以利用到索引了

12、char和varchar的比较成本是一样的,现在关键就看它们的索引查找的成本了,因为查找策略都一样,因此应该比较谁占用空间小。在存放相同数量的字符情况下,如果数量小,那么char占用长度是小于varchar的,但如果数量稍大,则varchar完全可能小于char,而且要看实际填充数值的充实度,比如说varchar(3)和char(3),那么理论上应该是char快了,但如果是char(10)和varchar(10),充实度只有30%的情况下,理论上就应该是varchar快了。因为varchar需要额外空间存放块长度,所以只要length(1-fillfactor)大于这个存放空间(好像是2字节),那么它就会比相同长度的char快了。

13、nvarchar比varchar要慢上一些,而且对于非unicode字符它会占用双倍的空间,那么这么一种类型推出来是为什么呢?对,就是为了国际化,对于unicode类型的数据,排序规则对它们是不起作用的,而非unicode字符在处理不同语言的数据时,必须指定排序规则才能正常工作,所以n类型就这么一点好处。

三、名词总结
1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char
2、能确定长度又不一定是ansi字符或者,那么用nchar;
3、不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400;
4、不查询的话没什么好说的,用nvarchar(4000)
5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度为X位的数据

按回车键跳到下一输入框或激活按钮事件的方法

登录窗口有两个输入框:txtUserName、txtPassWrod,两个按钮:btnOK、btnCancel

现需实现txtUserName输入回车键时光标跳到txtPassWord,办法是添加txtUserName组件的KeyPress事件

        private void txtUserName_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                txtPassWord.Focus();
            }
        }

另需实现txtPassWord输入回车键时激活btnOK的Click事件,开始也想用上面的办法,后google到更简单的办法:

设置窗体的属性AcceptButton为btnOK即可!
同样道理,设置窗体的属性CancelButton为btnCancel,就可以响应Esc键了!

2009.09.07小帖士

1,Chrome现阶段的windows环境程序默认是不支持windows2003的, 但如果在启动的快捷方式里加上参数–single-process就可以了, 不过这也有局限性, 当设置Chrome为默认浏览器时, 外部程序引用网页时启动的Chrome还是不能启动.

2,24900+的产品, 分别导入到compiere3.1和adempiere3.41中去, 花费的时间分别是:

compiere 10:30 am – 3:50 pm = 320′
adempiere 16:58 pm – 17:40 pm =  42′

在订单中使用扫描条码的方式找出某产品, compiere需要20”±, 而adempiere只需要<1”.

3,openerp中的报表可以直接在openoffice writer中设置并上传, 而所需要的准备工作仅仅是给openoffice安装一个扩展. adempiere的报表设计是由ireport来完成, 不过相比openerp, 它上传并使用定制的报表要复杂许多.

edb无法启动

安装完毕后无法启动,查系统日志:

事件类型: 错误
事件来源: PostgreSQL
事件种类: 无
事件 ID: 0
日期:  2008-8-27
事件:  11:08:05
用户:  N/A
计算机: LYN
描述:
事件 ID ( 0 )的描述(在资源( PostgreSQL )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: edb-postgres: 无法找到数据库系统
预期在目录 “D:/enterprisedb/data” 找到,
但是无法打开文件 “D:/enterprisedb/data/global/pg_control”: No such file or directory
.

感觉是数据库初始化问题,于是清空数据目录D:/enterprisedb/data,再手动初始化:

D:\enterprisedb\dbserver\bin>initdb -D d:\enterprisedb\data -E UTF8 –locale=C
属于此数据库系统的文件宿主为用户 “it”.
此用户也必须为服务器进程的宿主.
数据库簇将带有 locale C 初始化.

修复已存在目录 d:/enterprisedb/data 的权限 … initdb: 无法改变目录 “d:/enterpri
sedb/data” 的权限: Permission denied

 

看来是d:\enterprisedb\data目录权限开放的不够,于是手工修改它的权限为最高,再次执行数据库初始化就成功了。

XE、APEX、Compiere、Session

这是一个顺序,是折腾了我许久的问题,在我快要发狂的时候,得出了这么一个顺序。

修改XE的session必须在升级至APEX3.1.1之后,否则升级APEX会报错。同时,也必须是在安装完Compiere之后,否则导入数据库阶段就像是老牛拉破车。而在升级至APEX3.1.1之后,安装Compiere的导入数据库阶段必须要有活跃的网卡。

而始终没有解决的问题是:升级到APEX3.1.1之后,http://localhost:8080/apex/已经不能管理用户了。

PostgreSQL on Ubuntu使用更多的内存

/etc/sysctl.conf

fs.file-max = 65535
kernel.shmall = 4235264
kernel.shmmax = 4294967296
kernel.shmmni = 8192
kernel.sem = 8192 4194304 8192 512

/etc/postgresql/8.2/main/postgresql.conf

max_connections = 4096
shared_buffers = 1GB
temp_buffers = 2GB
work_mem = 512MB
maintenance_work_mem = 4GB
effective_cache_size = 4GB