使用Access 2010中的列表框进行筛选

时间:2014-06-30 09:49:05

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

设置: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语句正常工作。我偶然发现了草案和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。

1 个答案:

答案 0 :(得分:0)

你快到了:

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