我需要使用相当复杂的多表查询作为连续表单的数据源,但要让表单保持可编辑状态。我需要编辑的所有表单字段都只链接到一个表,但我仍然需要以不可编辑的方式在一些字段中显示来自多表查询的信息。我已经在“仅显示”字段的记录源查询中使用 DLookUp 完成了此操作,但是由于数据库被拆分并且支持的数据库位于具有链接表的服务器上,因此性能非常糟糕。如果我只是通过对查询字段使用 SELECT 来完成同样的事情,我需要显示的性能很好,但整个表单变得不可编辑。
任何关于如何更有效地完成此任务的想法将不胜感激。我已经链接了表单、表单设计页面、查询设计页面的图片,并在下面粘贴了相关的 SQL。
ITNQuery SQL: ITNQuery
SELECT itn.id,
itn.itnnumber,
itn.portfolio,
itn.topic,
itn.itndate,
itn.statusid,
itn.notes,
itn.delivereddate,
itn.leadlinguistid,
itn.teamid AS Expr1,
itn.newversionentry,
itn.previousitn,
itn.reviewinglinguistid,
itn.itnresponse,
itn.leadresponsecoordinatorid,
itn.datesenttoleadcoordinator,
itn.responsedeadline,
itn.priority,
itn.casemanagerid,
itn.responsecoordinator2id,
itn.datesenttocoordinator2,
itn.responsecoordinator3id,
itn.datesenttocoordinator3,
itn.responsecoordinator4id,
itn.datesenttocoordinator4,
itn.coordinatinglinguistid,
Iif([itn].[statusid] <> 9
AND [itn].[statusid] <> 10
AND [itn].[statusid] <> 19
AND [itn].[statusid] <> 20
AND [itn].[statusid] <> 28
AND [itn].[statusid] <> 30, Iif([itn].[delivereddate] > 0,
Datediff("d", [itn].[itndate], [itn].[delivereddate]),
Datediff("d", [itn].[itndate], Now()))) AS ITNAge,
itn.newversionentry,
itn.teamid,
statuslist.[display order],
itn.cooraspondanceid,
itn.documenttypeid,
Dlookup("ducumentabreviation", "associateditntextquery",
"currentitnid =" & [itn].[id]) AS AssocAbrev,
Dlookup("itnnumber", "associateditntextquery",
"currentitnid =" & [itn].[id])
AS AssocNumber
AssociatedITNTextQuery: AssociatedITNTextQuery
SELECT associateditns.current_itn_id AS CurrentITNID,
associateditns.associated_itn_id,
associateddocstextquery1.maxofitndate,
documenttypes.ducumentabreviation,
itn.itnnumber,
itn.itndate
FROM (itn
INNER JOIN documenttypes
ON itn.documenttypeid = documenttypes.id)
INNER JOIN (associateditns
INNER JOIN associateddocstextquery1
ON associateditns.current_itn_id =
associateddocstextquery1.current_itn_id)
ON itn.id = associateditns.associated_itn_id
WHERE ( ( ( itn.itndate ) IN ( associateddocstextquery1 ! maxofitndate ) )
AND
( ( associateddocstextquery1.current_itn_id ) =
associateditns ! current_itn_id ) );
AssociatedITNTextQuery1: AssociatedITNTextQuery1
SELECT associateditns.current_itn_id,
Max(ITN_1.itndate) AS MaxOfITNDate
FROM itn AS ITN_1
INNER JOIN associateditns
ON ITN_1.id = associateditns.associated_itn_id
GROUP BY associateditns.current_itn_id;