4D 数据库 ORDA 查询:使用相关记录长度查询

问题描述

背景

我正在使用 4D 数据库 (v17.5) 并尝试查询记录。我有以下简化的架构:

Customers (table)
    -CustomerID (field)
    -CompanyName (field)
    -City (field)
    -State (field)

SalesOrders (table)
    -CustomerID (field)
    -OrderTotal (field)

它们通过多对一的自动关系联系在一起:

[Customers]CustomerID (O)<-------------------------(M) [SalesOrders]CustomerID
            (ParentCustomer)              (ChildSalesOrders)

我可以使用以下任一方法查询获取一组 [SalesOrders] 记录:

ds.SalesOrders.query("OrderTotal > 500 AND ParentCustomer.State = 'New York'")
ds.Customers.query("State = 'New York' AND ChildSalesOrders.OrderTotal > 500").ChildSalesOrders

问题

有些客户根本没有订单,如果我想找到一组零相关订单的客户,我就遇到麻烦了。

我已经完成了以下工作:

$voCustomerstocheck:=ds.Customers.query("State = 'New York')
$voCustomersWithoutOrders:=ds.Customers.newSelection()

For each($voCustomer;$voCustomerstocheck)
    If ( $voCustomer.ChildSalesOrders.length > 0 )
        $voCustomersWithoutOrders.add($voCustomer)
    End if
End for each

我想做的是:

$voCustomersWithoutOrders:=ds.Customers.query("State = 'New York' AND ChildSalesOrders.length = 0')

不过这行不通。

问题

我正在努力实现的目标可行吗?

解决方法

Classic 4D 可以做到这一点。我不确定 ORDA。这是一个例子;

CREATE EMPTY SET([Companies];"NoSales")

ALL RECORDS([Companies])
CREATE SET([Companies];"AllRecsSet")

ALL RECORDS([Invoices])
RELATE ONE SELECTION([Invoices];[Companies])

CREATE SET([Companies];"InvoiceSet")

DIFFERENCE("AllRecsSet";"InvoiceSet";"NoSales")

USE SET("NoSales")

CLEAR SET("InvoiceSet")
CLEAR SET("InvoiceSet")
CLEAR SET("NoSales")
,

在 ORDA 中,您可以使用 NULL 关键字;所以解决方案是写:

$voCustomersWithoutOrders:=ds.Customers.query("State = 'New York' AND ChildSalesOrders = NULL')