Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接的解决方案,用于基于主查询中的字段获取主查询中不存在的所有数据_Sql_Sql Server_Crystal Reports_Sapb1 - Fatal编程技术网

Sql 联接的解决方案,用于基于主查询中的字段获取主查询中不存在的所有数据

Sql 联接的解决方案,用于基于主查询中的字段获取主查询中不存在的所有数据,sql,sql-server,crystal-reports,sapb1,Sql,Sql Server,Crystal Reports,Sapb1,我在crystal reports中有下面的例子 具有显示发票批次详细信息的查询的主报表 显示主报告中包含但未包含在该文档中的批次详细信息的子报告。比如说 发票A有10个项目,所有项目都属于同一批次,这将显示在主报告中 发票B、C、D在同一批中还有3个项目,因此该批共有13个项目在4个不同的文件中,而文件A中没有的3个项目显示在子报告中。 现在,在Crystal Reports中很容易实现这一点,因为您可以将子报表与字段链接以直接过滤,而无需链接查询,但是,由于CR不是一个数据库引擎,因此过滤速

我在crystal reports中有下面的例子

具有显示发票批次详细信息的查询的主报表 显示主报告中包含但未包含在该文档中的批次详细信息的子报告。比如说

发票A有10个项目,所有项目都属于同一批次,这将显示在主报告中 发票B、C、D在同一批中还有3个项目,因此该批共有13个项目在4个不同的文件中,而文件A中没有的3个项目显示在子报告中。 现在,在Crystal Reports中很容易实现这一点,因为您可以将子报表与字段链接以直接过滤,而无需链接查询,但是,由于CR不是一个数据库引擎,因此过滤速度非常慢,为了解决这一问题,我需要SQL查询中的解决方案:

我试着把它转换成UNION,所以

Main Report
Union ALL
Sub Report
问题是我无法复制子报告案例,因为分组需要先按文档进行,然后按批次进行,并且子报告中的3项不在同一文档中,因此它们现在没有按相同维度进行分组,这会破坏报告

我知道这不符合逻辑,但在尝试了我想到的所有解决方案后,我想可能有更有经验的人会有不同的意见,基本上对于主报告中的每个发票,我需要显示不在特定发票中的所有项目,所以现在我没有链接,因为项目不同,文档不同,只有批次相同,但这是一个多对多链接

编辑:为了简单起见,假设这是主查询

SELECT 

T0.DocumentNumber,
T2.ItemCode,
T2.ItemName,
T3.BatchNumber,
T3.Quantity 

FROM DocHeader T0 

JOIN DocRows T1 ON T0.DocumentEntry = T1.DocumentEntry
JOIN ItemMaster T2 ON T1.ItemCode = T2.ItemCode
JOIN BatchTransaction T3 ON T1.Document Entry = T3.DocumentEntry and
T3.DocumentType = T1.DocumentType and T3.DocumentLine = T1.DocumentLine 

报告是按文档编号分组的,因此我需要的是相同的查询,但对于不在主查询中且与主查询关联的每个其他文档编号。这两个问题是1。他们可以将documentnumber参数保留为空,并选择表中的所有文档,因此此过程需要分别针对每个文档进行。2.子查询中的文档编号永远不会相同,因此分组是一个问题,因为报表需要按主查询文档编号分组

如果您写出了您尝试过的主查询和一些辅助查询,这会有所帮助,但假设我正确理解您的问题,您应该能够在Batches表上创建一个附加联接。这将使您的SQL查询列表脱离批处理的所有项目行,然后您可以尝试在Crystal中使用条件格式和/或分组来根据需要显示/隐藏行

或者,使用上面描述的查询,您可以使用现在从主报表查询中获得的链接发票号来驱动子报表,而不是按批处理—这可能会提高性能

编辑:根据您的评论和更新,我认为正确的方法是创建一个存储过程。做一个查询可能是行不通的,我尝试了一下,不值得这么麻烦

使用存储过程,您可以在内存中创建一个表变量,将主发票记录添加到表中,然后添加由批号链接的辅助发票的记录。在表中使用某种列/标志指示它是否为“主发票”记录,并使用此标志驱动水晶显示逻辑,以显示主发票与次发票/链接发票的显示方式


这是可行的

如果您写出了您尝试过的主查询和一些辅助查询,这会有所帮助,但假设我正确理解您的问题,您应该能够在Batches表上创建一个附加联接。这将使您的SQL查询列表脱离批处理的所有项目行,然后您可以尝试在Crystal中使用条件格式和/或分组来根据需要显示/隐藏行

或者,使用上面描述的查询,您可以使用现在从主报表查询中获得的链接发票号来驱动子报表,而不是按批处理—这可能会提高性能

编辑:根据您的评论和更新,我认为正确的方法是创建一个存储过程。做一个查询可能是行不通的,我尝试了一下,不值得这么麻烦

使用存储过程,您可以在内存中创建一个表变量,将主发票记录添加到表中,然后添加由批号链接的辅助发票的记录。在表中使用某种列/标志指示它是否为“主发票”记录,并使用此标志驱动水晶显示逻辑,以显示主发票与次发票/链接发票的显示方式


这是可行的

添加到主帖子中。批对批是多对多的,因为我可以在主发票中有多行,在子发票中有多行
. 多对多链接可以用于分组,这意味着如果我链接m2m,我可以按主文档对它们进行分组,但我仍然无法标记sub和main,因为所有数据都会相互冲突。添加在主帖子中。批次对批次是多对多的,因为我可以在主发票中有多行,在sub中有多行。很多to many link可用于分组,这意味着如果我链接m2m,我可以按主文档对它们进行分组,但我仍然无法标记sub和main,因为所有数据都会相互冲突。