简洁实用,快捷灵活
睿哥(12018327) 15:37:35
现在讲解一下如何在系统中记录(输入)日期+时间
睿哥(12018327) 15:38:15
首先,将该字段设置为日期类型
注:日期类型既可以存储日期,也可以存储日期+时间
睿哥(12018327) 15:40:10
如果想要在增加记录的时候自动记录当前时间
睿哥(12018327) 15:41:22
则在“信息计算-->信息计算与验证”中将该字段的计算公式设置为“#^nulldatetime()”
睿哥(12018327) 15:41:43
#^nulldate()仅仅记录当前日期,#^nulldatetime()则会记录日期+时间
睿哥(12018327) 15:42:27
设置好后,还需要进行表格界面设置,使系统可以正常显示和输入日期+时间
睿哥(12018327) 15:42:56
打开“表格界面-->表格界面设置”,在列属性中选择该字段
睿哥(12018327) 15:43:24
将其“编辑格式”修改为“!9999/99/00;1; 00:00:00”
睿哥(12018327) 15:43:49
将其“显示格式”修改为“yyyy-mm-dd hh:mm:ss”
睿哥(12018327) 15:44:17
这样就实现了该功能。
睿哥(12018327) 15:44:26
下面介绍一下对日期和时间的操作。
睿哥(12018327) 15:44:36
如果要计算两个日期(时间)的差值
睿哥(12018327) 15:45:33
可以利用 datediff("标识",起始日期,截止日期) 函数来实现
睿哥(12018327) 15:47:46
其中标识有:
yyyy 年
m 月
d 日
h 小时
n 分钟
s 秒
睿哥(12018327) 15:47:58
比如要计算差多少天,就使
睿哥(12018327) 15:48:00
是
睿哥(12018327) 15:48:12
datediff("d",起始日期,截止日期)
睿哥(12018327) 15:48:31
计算差多少小时,就是 datediff("h",起始日期,截止日期)
睿哥(12018327) 15:49:31
如果要在现有日期和时间的基础上增加的话,可以利用dateadd("标识",数量,日期)
睿哥(12018327) 15:49:39
标识同datediff()函数
睿哥(12018327) 15:50:28
如果要在当天的基础上增加5天,就是dateadd("d",5,date())
7.28
刘经理(12018327) 09:28:04
现在讲一下:联合查询语句 union [all]
刘经理(12018327) 09:28:40
很多时候我们要将多个表中的数据组成一个记录集,然后再从中进行统计查询
刘经理(12018327) 09:30:26
union [all] 语句就是实现这个功能的语句
刘经理(12018327) 09:30:38
比如说:有一个男生表,有一个女生表
刘经理(12018327) 09:30:48
要查询所有学生的信息
刘经理(12018327) 09:31:11
就可以这样写
select 姓名 from 男生
union all
select 姓名 from 女生
刘经理(12018327) 09:32:16
大家注意到了 union 后面跟了一个 all
他的作用就是 返回所有记录(包括用union所连接的记录集中重复的记录)
刘经理(12018327) 09:33:01
也就是如果男生里由一个叫做李冰的,女生里也有一个叫做李冰的。
那么系统将返回两条姓名为李冰的记录
刘经理(12018327) 09:33:10
如果不加 all
select 姓名 from 男生
union
select 姓名 from 女生
刘经理(12018327) 09:33:17
那么系统将合并重复记录
刘经理(12018327) 09:33:28
仅显示 一条姓名为李冰的记录
刘经理(12018327) 09:34:11
如果要从多表联合的记录集中进行查询,可以这样写
刘经理(12018327) 09:35:07
select 姓名,成绩 from
(select 姓名,成绩 from 男生
union all
select 姓名,成绩 from 女生) as 学生
8.4
刘经理(12018327) 08:46:07
计算是指:进行单纯的数据处理,
数据处理分为前台替换和后台更新
刘经理(12018327) 08:47:16
前台替换表现为:
通过执行语句得到相应字段,并在“字段替换关系”中替换相应前台字段内容
刘经理(12018327) 08:48:02
后台更新表现为:
只执行一行或多行语句,不进行字段替换,通过update等语句直接更新数据库表格内容
刘经理(12018327) 08:48:18
前台和后台分别对应于:平台和数据库
刘经理(12018327) 08:48:45
平台将数据读出来,就是将数据从后台(数据库)读入到前台
刘经理(12018327) 08:49:38
如果要更新的是当前表格的当前记录,那么必须使用前台替换。
应用后台更新将使前后台内容不一致,导致系统报错
刘经理(12018327) 08:50:15
如果更新的是当前表格的当前记录,那么则必须使用后台更新。
因为前台替换的范围仅限于当前记录。
刘经理(12018327) 08:51:55
数据验证是指的:根据所设置SQL语句的执行结果及所选验证方式;
阻止或允许某些操作(处罚执行点)的执行并向用户返回提示信息
刘经理(12018327) 08:53:47
常用于以下方面:
1,将某些字段设置为必读字段,如果字段为空,则提示用户输入;
2,防止关键字段重复,如已有重复字段,则提示用户信息重复;
3,禁止已经存在的符合某种条件的记录再进行修改;
刘经理(12018327) 08:54:24
验证方式说明:
记录存在时提示:所设置SQL语句返回的记录数大于0
刘经理(12018327) 08:54:38
记录为空时提示:所设置SQL语句返回的记录数等于0
刘经理(12018327) 08:55:13
首字段True值提示:
返回的第一条记录的第一个字段值为非0
刘经理(12018327) 08:55:29
首字段False值提示:
返回的第一条记录的第一个字段值为0
刘经理(12018327) 08:55:59
验证一般将处罚执行点放在“记录保存前”和“记录删除前”
刘经理(12018327) 08:56:12
这样可以起到提示加禁止的作用。
刘经理(12018327) 08:56:24
如果放到记录保存后或删除后。那么只能起到提示作用
刘经理(12018327) 08:56:34
保存和删除记录的动作已经被执行了。
8.5
刘经理(12018327) 17:18:00
现在给大家讲一下单机版自动生成编号的语句:
刘经理(12018327) 17:18:08
生成示例:RK20070120001
刘经理(12018327) 17:18:26
前两位为编号前缀,用于区分编号用途,这里的RK代表入库
刘经理(12018327) 17:18:44
中间8位代表编号生成时的日期
刘经理(12018327) 17:19:21
后边的3位是当天流水号,不断递增。
新的一天讲重001开始编号。
刘经理(12018327) 17:19:35
示例语句:
刘经理(12018327) 17:19:56
SELECT "RK" & year(#:入库日期#) & right('0' & month(#:入库日期#),2) & right('0' & day(#:入库日期#),2) & (right(int((10000 + ("0001" & A.ID))),3)) AS 入库单编号 FROM (SELECT MAX(right(入库.入库单编号,11))+1 AS ID FROM 入库 where 入库日期=#:入库日期#) AS A
刘经理(12018327) 17:20:30
这个语句用于单机版生成编号
刘经理(12018327) 17:20:52
& 为单机版的连字符,用于将多个字符串连接成一个
刘经理(12018327) 17:21:12
year()函数取得当前的年份
刘经理(12018327) 17:22:20
取得当前的月份和日期的时候,并没有仅仅使用month(#:入库日期#)
刘经理(12018327) 17:22:29
和 day(#:入库日期#)
刘经理(12018327) 17:22:38
因为月和日有两种情况
刘经理(12018327) 17:22:50
1-9月为1位数
刘经理(12018327) 17:22:56
10,11,12为2位数
刘经理(12018327) 17:23:05
因此需要特殊处理
刘经理(12018327) 17:23:15
我们使用:right('0' & month(#:入库日期#),2)
刘经理(12018327) 17:23:28
即在月份前先连一个0
刘经理(12018327) 17:23:37
1月会成为 01
2月会成为02
刘经理(12018327) 17:23:43
10月会成为010
刘经理(12018327) 17:23:49
然后截取右边两位
刘经理(12018327) 17:24:03
最终结果为:01,02.。。。。。10,11,12
刘经理(12018327) 17:24:11
对日子的处理同对月份的处理
刘经理(12018327) 17:24:26
这样就保证了最终得到以下字符串:20080805
刘经理(12018327) 17:24:38
然后是生成当天流水号
刘经理(12018327) 17:24:46
(right(int((10000 + ("0001" & A.ID))),3))
刘经理(12018327) 17:26:31
其中的A.ID是由后面的select子查询得到的
刘经理(12018327) 17:26:38
(SELECT MAX(right(入库.入库单编号,11))+1 AS ID FROM 入库 where 入库日期=#:入库日期#) AS A
刘经理(12018327) 17:26:48
这里其实展示了 select 语句的嵌套
刘经理(12018327) 17:27:01
即一个select 语句可以包含另一个select 语句
刘经理(12018327) 17:28:03
MAX(right(入库.入库单编号,11))
这个用于取得当前最大的入库单编号
刘经理(12018327) 17:28:10
因为入库单编号含有RK前缀
刘经理(12018327) 17:28:15
因此首先截取后面11位
刘经理(12018327) 17:28:24
后面的 where 入库日期=#:入库日期#
刘经理(12018327) 17:28:43
保证了只从当前日期的记录中查找
刘经理(12018327) 17:29:02
这样做的目的就是每到新的一天,后面3位流水号都从001开始
刘经理(12018327) 17:29:25
(right(int((10000 + ("0001" & A.ID))),3))
刘经理(12018327) 17:29:53
先用 "0001"连接 A.ID 是为了第一条记录做特殊处理
刘经理(12018327) 17:30:06
第一条记录的时候,A.ID的值为真空 null
刘经理(12018327) 17:30:16
用0001连接的结果是 0001
刘经理(12018327) 17:30:26
这样就使得第一个 001编号得以生成
刘经理(12018327) 17:30:52
如果是以后的记录比如说第二条
刘经理(12018327) 17:31:08
这里得到的结果就是 0001002
刘经理(12018327) 17:31:20
然后我们用10000加这个值
刘经理(12018327) 17:31:32
+号执行的是数值运算
刘经理(12018327) 17:31:42
会得到结果 10001
刘经理(12018327) 17:31:54
和 11002
11003
刘经理(12018327) 17:32:06
然后我们截取其后3位
刘经理(12018327) 17:32:11
就得到了流水号
刘经理(12018327) 17:32:40
流水号的递增是由后面的select子句中的MAX(right(入库.入库单编号,11))+1 实现的
刘经理(12018327) 17:32:47
先找出最大的,然后加1
刘经理(12018327) 17:33:08
这样,一个形式为RK20070120001的编号就生成了
刘经理(12018327) 17:33:25
最后 as 一个字段名称,替换到记录中就可以了
刘经理(12018327) 17:33:37
生成编号最好是在“记录新增后”
刘经理(12018327) 17:33:55
这样避免了记录保存前或保存后编号会变的问题。
刘经理(12018327) 17:35:33
好了,自动生成编号的问题就讲到这里。
再实际运用中,可以根据客户要求灵活变通。
8.7
大师姐(37897634) 18:04:26
SELECT ':编号'+right(str((cast(100 as varchar(3))+ cast('00' as varchar(2))+ (case
when A.ID is null then '1'
else A.ID
end) )),2) AS 入库单号
FROM (SELECT cast(right(max(入库明细.入库单号),3) as int)+1 as ID FROM 入库明细 where 编号=':编号') AS A
大师姐(37897634) 18:04:46
这是采用个别计价法的从表的编号的语句
大师姐(37897634) 18:05:16
':编号'是主表中的自动生成的那个编号
大师姐(37897634) 18:05:48
另外再做一下验证,让从表中的编号不能重复
大师姐(37897634) 18:06:22
从表中的这个编号放在记录新增后不会产生重复
8.8
刘经理(12018327) 10:53:28
下面给大家说一下从表字段合计到主表字段需要注意的一个地方。
刘经理(12018327) 10:53:37
所谓从表字段合计到主表字段
刘经理(12018327) 10:54:05
举个例子就是:将从表入库金额合计到主表总金额中。
刘经理(12018327) 10:55:33
如果有此类计算或者有对从表的计算。
那么需要在“信息计算”-->“触发器设置”中
刘经理(12018327) 10:55:48
数据集选择为从表
刘经理(12018327) 10:55:56
然后在下边的语句框中
刘经理(12018327) 10:56:01
加入 --
刘经理(12018327) 10:56:11
两个横杠
刘经理(12018327) 10:56:33
这样会解决从表合计到主表以及从表计算总是慢一步的问题。
刘经理(12018327) 10:56:39
--是SQL中的注释语句
刘经理(12018327) 10:56:53
加到了这里是起到强制系统刷新的作用
8.11
刘经理(12018327) 10:57:50
现在说一下多表查询的语句书写规则
刘经理(12018327) 10:58:17
多表查询一般用于统计查询中,从多个表中查询(汇总)字段
刘经理(12018327) 10:59:31
我们已以下语句为例子:
select 废品名称,sum(( 出库单价*出库数量)-(收购单价*出库数量)) as 总利润 from 出库从表,出库主表 where 出库主表.出库日期 between #:起始日期# and #:截止日期# group by 废品名称
刘经理(12018327) 10:59:40
这个语句有一个严重的错误
刘经理(12018327) 10:59:55
就是没有设置出库从表和出库主表两个表格的连接条件
刘经理(12018327) 11:00:12
导致统计出来的结果会成倍的增加
刘经理(12018327) 11:00:23
正确的书写方式应该是
刘经理(12018327) 11:00:48
select 废品名称,sum(( 出库单价*出库数量)-(收购单价*出库数量)) as 总利润 from 出库从表,出库主表 where 出库从表.出库单编号=出库主表.出库单编号 and 出库主表.出库日期 between #:起始日期# and #:截止日期# group by 废品名称
张慧大姐(475389032) 11:00:49
select sum(( 出库单价*出库数量)-(收购单价*出库数量)) as 总利润 from 出库从表,出库主表 where 出库从表.出库单编号=出库主表.出库单编号 and 出库主表.出库日期 between #:起始日期# and #:截止日期#
刘经理(12018327) 11:03:46
from 后面两个表格,就至少写一个连接条件。如果有三个表,就需要至少写两个连接条件
8.15
刘经理(12018327) 08:49:11
咳咳,和平年代,周末开讲。
刘经理(12018327) 08:49:34
涉及库存计算的同志们注意了,涉及库存计算的同志们注意了。
刘经理(12018327) 08:50:05
首先祝贺大家的库存计算基本上都正确了。
刘经理(12018327) 08:50:26
不过还有一点需要大家注意(有则改之无则加勉)
刘经理(12018327) 08:50:37
就是对计算量的控制
刘经理(12018327) 08:52:30
每次计算库存都需要占用计算机资源,
这个在一开始可能体会不到,因为系统内数据很少。
等系统运行一段时间后,数据量急剧扩张,对计算量不加以控制的语句,就会造成系统变慢、假死。直到真死。
刘经理(12018327) 08:53:25
比如下面这条语句
刘经理(12018327) 08:53:31
delete * from 出入库汇总1
go
insert into 出入库汇总1 select 物品编号,sum(数量) as 数量 ,round(sum(总额),2) as 总额 from 入库详细 group by 物品编号
刘经理(12018327) 08:53:42
在每次保存后执行
刘经理(12018327) 08:53:54
它将所有的入库详细数据全部进行了统计。
刘经理(12018327) 08:54:14
这是很庞大的一个计算量。
刘经理(12018327) 08:54:22
我们分析一下,其实这是没有必要的。
刘经理(12018327) 08:54:48
因为每次出入库的都只是一种货品。
它只改变自己的库存,并不影响其他货品。
刘经理(12018327) 08:55:07
因此我们应该加入 where条件,使语句只处理该货品的库存
刘经理(12018327) 08:55:10
变成如下
刘经理(12018327) 08:55:19
delete * from 出入库汇总1
go
insert into 出入库汇总1 select 物品编号,sum(数量) as 数量 ,round(sum(总额),2) as 总额 from 入库详细 where 物品编号=':物品编号' group by 物品编号
刘经理(12018327) 08:55:28
中间加入了: where 物品编号=':物品编号'
刘经理(12018327) 08:55:42
如果系统中总共有100个物品
刘经理(12018327) 08:55:55
那么前一条的语句计算量是100的话
刘经理(12018327) 08:56:01
后一条的计算量就是 1
刘经理(12018327) 08:56:09
两者相差100倍
刘经理(12018327) 08:56:16
这是很惊人的。
刘经理(12018327) 08:57:13
因此:我们的语句中应该加入筛选条件,使计算量尽量减小。
刘经理(12018327) 08:57:53
不仅仅是库存计算,在其他处理中,我们也应该考虑到以后系统实际运行过程中的效率问题,语句能减则减,筛选条件能加就加。
刘经理(12018327) 08:58:37
本期节目到此结束,感谢您的收看,观众朋友们再见。
上一篇:宏达软件公司技术培训详解
下一篇:日期转换