ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4722|回复: 10

[求助] 比较两个表有何不同

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-23 10:24 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
附件包含两个表,1)旧表 2) 新表
想建立一个查询,查询新表和旧表的不同之处,并增添备注列
“订单号” 为主键,对于订单号
如果旧表有而新表没有,则备注“取消”
如果旧表无而新表有,则备注“新增”

如果订单号旧表,新表都有,但数量不同,则备注“更改数量”
如果订单号旧表,新表都有,但交货期不同,则备注“更改交货期”
如果如果订单号旧表,新表都有,但数量和交货期都不同,则备注“更改数量和交货期”

初学Access,请指教

ttt.zip

6.68 KB, 下载次数: 17

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-25 17:25 | 显示全部楼层
自己想了一些办法,但不是很满意。

请看附件

IIF函数对于多条件查询的能力有限。如果能用一个自定义函数来代替IIF填写条件就解决问题了。
请高手,帮我看看。 以前只在Excel里自己写过自定义函数。
在Access里还没有过。

ttt.zip

19.34 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2013-4-25 19:57 | 显示全部楼层
Function BJ(ByVal M1 As Double, ByVal M2 As Double, ByVal D1 As Date, ByVal D2 As Date) As String
  'M1----用来比较的表1的数量
  'M2----用来比较的表2的数量
  'D1----用来比较的表1的日期
  'D2----用来比较的表2的日期
  If M1 = 0 Or D1 = 0 Then
    BJ = "新增"
    Exit Function
  End If
  If M2 = 0 Or D2 = 0 Then
    BJ = "新增"
    Exit Function
  End If
  
  If M2 = M1 Then
    If D1 = D2 Then
      BJ = ""
    Else
      BJ = "日期不同"
    End If
  Else
    If D1 = D2 Then
      BJ = "数量不同"
    Else
      BJ = "数量、日期不同"
    End If
  End If
End Function

TA的精华主题

TA的得分主题

发表于 2013-4-25 19:58 | 显示全部楼层
用法:
SELECT Query2.订单号, Query2.新表数量, Query2.旧表数量, Query2.新表日期, Query2.旧表日期, BJ(NZ([新表数量],0),NZ([旧表数量],0),NZ([新表日期],0),NZ([旧表日期],0)) AS 备注
FROM Query2

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-26 10:29 | 显示全部楼层
ASLXT 发表于 2013-4-25 19:58
用法:
SELECT Query2.订单号, Query2.新表数量, Query2.旧表数量, Query2.新表日期, Query2.旧表日期, BJ ...

多谢指导,我按照这个方案试了试,但提示有错误,请帮忙看看附件。谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-26 10:30 | 显示全部楼层
上传附件{:soso_e110:}

ttt.zip

43.63 KB, 下载次数: 14

TA的精华主题

TA的得分主题

发表于 2013-4-26 11:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. SELECT 旧表.订单号,新表.订单号,旧表.数量,新表.数量,旧表.交货期,新表.交货期,
  2. IIF(新表.订单号 IS NOT NULL,
  3. SWITCH(旧表.数量<>新表.数量 AND 旧表.交货期<>新表.交货期,'更改数量和交货期',
  4. 旧表.交货期=新表.交货期 AND 旧表.数量<>新表.数量,'更改数量',
  5. 旧表.数量=新表.数量 AND 旧表.交货期<>新表.交货期,'更改交货期'),
  6. '取消') AS 备注
  7. FROM 旧表 LEFT JOIN 新表 ON 旧表.订单号=新表.订单号
  8. UNION
  9. SELECT 旧表.订单号,新表.订单号,旧表.数量,新表.数量,旧表.交货期,新表.交货期,
  10. IIF(旧表.订单号 IS NOT NULL,
  11. SWITCH(新表.数量<>旧表.数量 AND 新表.交货期<>旧表.交货期,'更改数量和交货期',
  12. 新表.交货期=旧表.交货期 AND 新表.数量<>旧表.数量,'更改数量',
  13. 新表.数量=旧表.数量 AND 新表.交货期<>旧表.交货期,'更改交货期'),
  14. '新增')
  15. FROM 新表 LEFT JOIN 旧表 ON 新表.订单号=旧表.订单号
复制代码
QQ截图20130426113007.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-4-26 13:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Query3的sql语法:
SELECT 订单号, Query2.新表.数量, 旧表.数量, Query2.新表.交货期, 旧表.交货期, BJ(Nz(Query2.新表.数量),Nz(旧表.数量),Nz(Query2.新表.交货期),Nz(旧表.交货期)) AS 备注
FROM Query2;

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-26 14:00 | 显示全部楼层
ASLXT 发表于 2013-4-26 13:32
Query3的sql语法:
SELECT 订单号, Query2.新表.数量, 旧表.数量, Query2.新表.交货期, 旧表.交货期, BJ(N ...

太棒了,这个可以了。

我有一个疑惑,如果不用Nz函数,由他去。
能否在自定义函数里来处理。

比如 将下列代码
================
If M1 = 0 Or D1 = 0 Then
    BJ = "新增"
    Exit Function
  End If

==============
改造成

If IsNull(M1) Or IsNull(D1)l Then
    BJ = "新增"
    Exit Function
  End If
================
试了试,这样子行不通。但却不明白为什么。

TA的精华主题

TA的得分主题

发表于 2013-4-26 14:23 | 显示全部楼层
获得当前行的某字段数据,然后送给自定义函数处理,自定义函数返回处理完的值,填充到字段中。
错误发生在取数的时候:就是获得当前行的某字段数据,应该在取数的时候处理。具体我也不明白。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-31 03:38 , Processed in 1.039624 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表