Ms access 使用条件的MS Access查询

Ms access 使用条件的MS Access查询,ms-access,Ms Access,我是MS access的新手,我正在努力完成一个查询,以找出哪些合作伙伴在特定的选定月份/年度没有付款 我有两个表格,一个是我所有合伙人的名字(Sócios),第二个是表格(Registro de Pagamento)登记了所有合伙人的所有付款,包括付款的月份和年份 我不知道我正在尝试的方式是否是最好的。但是,首先,我创建了一个表单,允许用户选择他感兴趣的月份(组合框:TBoxMes)和年份(组合框:TBoxAno),以找出哪些合作伙伴没有在所选期间付款 我当时的想法是创建一个查询(名为“Sel

我是MS access的新手,我正在努力完成一个查询,以找出哪些合作伙伴在特定的选定月份/年度没有付款

我有两个表格,一个是我所有合伙人的名字(
Sócios
),第二个是表格(
Registro de Pagamento
)登记了所有合伙人的所有付款,包括付款的月份和年份

我不知道我正在尝试的方式是否是最好的。但是,首先,我创建了一个表单,允许用户选择他感兴趣的月份(组合框:
TBoxMes
)和年份(组合框:
TBoxAno
),以找出哪些合作伙伴没有在所选期间付款

我当时的想法是创建一个查询(名为“Selecionar_Mes_Cobranca”),其中包括合作伙伴的姓名以及从
Registro de Pagamento
表中完成的每次付款的月份和年份,我还将两个表之间的关系设置为显示来自
Socios
表的所有寄存器,如下图所示

但是,在月份和年份的条件字段中,我试图包含以下表达式
[Forms]![Selecionar_Mes_Cobranca]![TBoxMes]
输入月份字段和
[Forms]![Selecionar_Mes_Cobranca]![TBoxAno]
输入年份字段。我们的想法是只从用户处返回所选月份和年份中没有注册的合作伙伴名称,但是,它不起作用,我希望得到一些帮助,以了解为什么以及如何实现这一点

提前感谢

使用“”将不会向您提供所需的结果。这将导致在指定月份内未完成的付款

您最好更改连接原因并使用Codigo字段,而不是名称。这将有更好的表现。我假设Registro de pagamento中的Codigo(社会代码)是一个外键,因此有一个索引,也不能是空值。
修改数据库结构以便将外键分配给数字索引字段确实是个好主意。
建议:在整个数据库中保持字段名称相同。从长远来看,这将使你的生活更轻松。还要避免在其中使用空格。您可以使用大写符号来帮助阅读它们(例如MesDoBoleto)。

那么你需要的是一个不在操作员。这将提取在指定月份不在帕加门托登记处的社会学家: 你需要这样的东西:

SELECT [Socio Nome],Codigo FROM Socios NOT IN (SELECT Codigo FROM [Registro de Pagamento] WHERE [Mes do Boleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxMes] AND [Ano do Boleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxAno]);
请注意,我没有在字段名称中使用重音符号,请进行相应调整

记住,在、存在、不在和不存在都有自己的怪癖。使用前请仔细阅读。您可以在这里找到一个示例:

使用“”将无法提供所需的结果。这将导致在指定月份内未完成的付款

您最好更改连接原因并使用Codigo字段,而不是名称。这将有更好的表现。我假设Registro de pagamento中的Codigo(社会代码)是一个外键,因此有一个索引,也不能是空值。
修改数据库结构以便将外键分配给数字索引字段确实是个好主意。
建议:在整个数据库中保持字段名称相同。从长远来看,这将使你的生活更轻松。还要避免在其中使用空格。您可以使用大写符号来帮助阅读它们(例如MesDoBoleto)。

那么你需要的是一个不在操作员。这将提取在指定月份不在帕加门托登记处的社会学家: 你需要这样的东西:

SELECT [Socio Nome],Codigo FROM Socios NOT IN (SELECT Codigo FROM [Registro de Pagamento] WHERE [Mes do Boleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxMes] AND [Ano do Boleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxAno]);
请注意,我没有在字段名称中使用重音符号,请进行相应调整

记住,在、存在、不在和不存在都有自己的怪癖。使用前请仔细阅读。您可以在这里找到一个示例:

如果您不能或不想更改表字段,我在这里添加代码:

SELECT [SocioNome] FROM Socios NOT IN (SELECT [NomeSocio] FROM [RegistroDePagamento] WHERE [MesDoBoleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxMes] AND [AnoDoBoleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxAno]);

请检查查询中的字段名是否与您设置的字段名相同。

请注意,这样的结构可能会产生较差的性能。如果[SocialNome]和[NomeSocial]未编制索引,则更是如此。

我在这里添加了代码,以防您无法或不想更改表字段:

SELECT [SocioNome] FROM Socios NOT IN (SELECT [NomeSocio] FROM [RegistroDePagamento] WHERE [MesDoBoleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxMes] AND [AnoDoBoleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxAno]);

请检查查询中的字段名是否与您设置的字段名相同。

请注意,这样的结构可能会产生较差的性能。如果[SocialNome]和[NomeSocial]没有编入索引,情况会更糟。

感谢您的支持@Duncan Drake,我已经按照您的建议替换了空格和重音。我在SQL上使用了您的代码,它返回了一条错误消息“来自from子句的Sytax错误,您知道什么可能是错误的吗?”?提前感谢您,您是否也将字段codigo添加到“Registro do pagamento”表中?现在看起来你没有这个领域,因为你是在“Nome Social”领域加入的。正如我写的,您最好为foring键字段使用数字字段。向表中添加索引并将其设置为非空。表
RegistroPagamento
中的信息来自一个表单,其中用户选择社会团体名称、支付金额和支付日期,该表拥有codigo,但不带社会团体ID,我如何设置为
RegistroPagamento
表格社会ID?感谢您的支持@Duncan Drake,我已经按照您的建议替换了空格和重音符号。我在SQL上使用了您的代码,它返回了一条错误消息“来自from子句的Sytax错误,您知道什么可能是错误的吗?”?提前感谢您,您是否也将字段codigo添加到“Registro do pagamento”表中?现在看起来你没有这个领域,因为你是在“Nome Social”领域加入的。正如我写的,您最好为foring键字段使用数字字段。向表中添加索引并将其设置为NOTNULL。表
RegistroPagamento
中的信息是从用户