【问题标题】:Filtering with Listboxes in Access 2010在 Access 2010 中使用列表框进行过滤
【发布时间】:2014-06-30 09:49:04
【问题描述】:

设置:Microsoft Access 2010(目前没有其他可能),项目表包含projectName(文本)和statusID(整数)和generationID(整数)的列。整数列指的是它们各自的表,我可以在其中检索它们的短名称和长名称。

目标:

我/用户可以在列表框中选择某个代的名称的表单,然后该表单将显示具有所选代的所有项目。在现实生活中,这有点复杂,因为当然还有更多的列。 ;-)

过滤值后,我需要创建报告,然后将其导出为 PDF

LibreOffice Base 使用子表单和过滤表实现了目标(表单、报告所有内容)。我有用于执行所有操作的 SQL 查询的工作代码。但是ooBase是不可能的。

SELECT "ftse"."stateTextShort", "ftgn"."genName", IFNULL( "p"."projGen", 9999 ) AS "pGn",
FROM "01_Projects" AS "p", "filterTable" AS "fT"
LEFT OUTER JOIN "10_State" AS "s" ON "p"."projState" = "s"."stateID"
LEFT OUTER JOIN "20_Generation" AS "g" ON "p"."projGen" = "g"."genID"
LEFT OUTER JOIN "10_State" AS "ftse" ON "fT"."filterState" = "ftse"."stateID"
LEFT OUTER JOIN "20_Generation" AS "ftgn" ON "fT"."filterGen" = "ftgn"."genID"
WHERE "pIx" = IFNULL( ( SELECT "filterProjIndex" FROM "filterTable" ), "pIx" )
AND "pSe" = IFNULL( ( SELECT "filterState" FROM "filterTable" ), "pSe" )
ORDER BY "p"."projName" ASC

我希望我没有用那个 SQL 语句生成完整的垃圾,因为它更长并且包含更多列。

问题:

  • 我无法在我的 Access 版本中使用 IFNULLCOALESCE。如何忽略没有值的过滤器?
  • 使用过滤器列的方法是否正确?
  • 如何在Access中实现上面的查询。我生成了以下内容:已解决

[格式化中断。我是新手,不知道更好]

SELECT ps.prjNameIntern, ss.stateShort, gn.genShort
FROM 001_projects AS ps
LEFT JOIN 010_status AS ss ON ps.prjStateID = ss.stateID
LEFT JOIN 020_generation AS gn ON ps.prjGenID = gn.genID
WHERE ps.prjStateID=(SELECT [ft].[fltrState] FROM [999_filterTable] AS ft)

但是对于这两个 JOIN 语句,它不起作用。一旦我遗漏了第二个或第一个和相应的列,它就可以正常工作。 已解决

很多问号……

更新:

好的,我现在可以使用多个 JOIN 语句。偶然发现了draftview和SQL-View的区别,不理解Access的括号样式。

剩下的问题是如何在不使用VBA的情况下直接在SQL中解决IFNULLCOALESCE的缺失问题。

我尝试了类似以下代码来测试 CASEIIF 的使用

SELECT fr.fltrState, fr.fltrPltf,
CASE WHEN fr.fltrPltf = 0 THEN 9999 ELSE fr.fltrPltf END
FROM 999_filterTable AS fr

但我只给我:Syntaxerror (missing operator) in statement...

我现在有

SELECT
IIF(fr.fltrState=0, 9999, fr.fltrState) AS IIFState,
IIF(fr.fltrGen=NULL, 9999, fr.fltrGen)  AS IIFGen
FROM 999_filterTable AS fr

它返回 fltrState 的值,但如果该列为空,它不会返回 9999。

【问题讨论】:

    标签: sql ms-access ms-access-2010


    【解决方案1】:

    你快到了:

    SELECT IIF(fr.fltrState=0 or fr.fltrState IS NULL, 9999, fr.fltrState) AS IIFState,
           IIF(fr.fltrGen IS NULL, 9999, fr.fltrGen)  AS IIFGen
    FROM 999_filterTable AS fr
    

    【讨论】:

    • 非常感谢!它确实有效。但为什么?我用=0 尝试过,我用=NULL 尝试过,但没有想到IS NULL。那是一回事。另一个是您在fltrStatefltrGen 之间所做的区别。第一个你有or,后者只有IS NULL。你能详细说明一下吗?
    • 好问题。这是公认的 SO 答案(因为与 NULL 进行任何算术比较的结果也是 NULL,所以您无法从此类比较中获得任何有意义的结果)请参阅 stackoverflow.com/questions/9581745/sql-is-null-and-null 。至于第二个比较,我没有包含 = 0 测试,因为它没有包含在问题中。如果它对您的数据有意义,您当然可以进行此测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多