【问题标题】:MS Access Query using criteria使用条件的 MS Access 查询
【发布时间】:2020-04-26 01:51:51
【问题描述】:

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

我有 2 张表,一张我有所有合作伙伴的姓名 (Sócios),第二张表 (Registro de Pagamento) 记录了所有合作伙伴的所有付款,包括付款的月份和年份。

如果我尝试的方式是最好的,我不知道。但是,首先,我创建了一个表单以允许用户选择月份(组合框:TBoxMes)和年份(组合框:@987654326 @) 他有兴趣了解哪些合作伙伴在选定的时期内没有付款。

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

但是,在月份和年份的条件字段中,我试图将以下表达式 <>[Forms]![Selecionar_Mes_Cobranca]![TBoxMes] 包含在 Month 字段中,并将 <>[Forms]![Selecionar_Mes_Cobranca]![TBoxAno] 包含在 Year 字段中。这个想法是只返回用户选择的月份和年份中没有注册的合作伙伴名称,但是,它没有奏效,我需要一些帮助来理解为什么以及如何实现它。

提前致谢

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    使用“”不会为您提供您正在寻找的结果。这将导致获得在指定月份内未完成的付款。

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

    那么你需要的是一个 NOT IN 运算符。这将提取在指定月份内不在 Registro de Pagamento 中的 Socios: 你需要这样的东西:

    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]);
    

    请注意,我没有在字段名称中使用重音符号,请相应调整。

    请注意,IN、EXISTS、NOT IN 和 NOT EXISTS 各有特点。使用前请仔细阅读它们。你可以在这里找到一个例子: Consider Using NOT EXISTS instead of NOT IN

    【讨论】:

    • 感谢您的支持@Duncan Drake,我已按照您的建议替换了空格和重音符号。我在 SQL 上使用了你的代码,它返回了一条错误消息“来自 FROM 子句的语法错误,你知道有什么问题吗?提前致谢
    • 您是否还将字段 codigo 添加到“Registro do pagamento”表中?现在看起来您没有该字段,因为您在“Nome social”字段上进行了 JOIN。正如我所写的那样,您最好将数字字段用于外键字段。为其添加索引并将其设置为不为空。
    • 表格RegistroPagamento的信息是从用户选择社会名称,支付金额和付款日期的表格中完成的,表格有它拥有codigo,但不带社会ID,怎么办我将社交 ID 设置为 RegistroPagamento 表?
    【解决方案2】:

    我在此处添加代码以防您无法或不想更改表格字段:

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


    请检查查询中的字段名称是否与您设置的一致。
    请注意,您可能期望这种结构的性能不佳。如果 [SocioNome] 和 [NomeSocio] 未编入索引,则更是如此。

    【讨论】:

    • 我已经输入了followjng代码SELECT [SocioNome] FROM Socios NOT IN (SELECT [SocioNome] FROM [RegistroPagamento] WHERE [MesBoleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxMes] AND [AnoBoleto]=[Forms]![Selecionar_Mes_Cobranca]![TBoxAno]);,但是错误还是一样。当变量相同时,我也已将所有标签更改为相同的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多