经典模式

简洁实用,快捷灵活

当前位置:首页>平台开发>经典模式
全部 1208 平台特色 8 经典模式 77 流行模式 108 技术论坛 1014 经典视频 1

信睿一些技术积累

时间:2022-05-07   访问量:3432

睿哥(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

本期节目到此结束,感谢您的收看,观众朋友们再见。


上一篇:宏达软件公司技术培训详解

下一篇:日期转换

发表评论:

评论记录:

未查询到任何数据!

在线咨询

点击这里给我发消息 售前咨询专员

点击这里给我发消息 售后服务专员

在线咨询

免费通话

24小时免费咨询

请输入您的联系电话,座机请加区号

免费通话

微信扫一扫

微信联系
返回顶部
备案号码:鲁ICP备09000001号-2