如何仅将 table 中的必填字段添加到动态临时 table? - 进步 4GL

How add only required fields from table to dynamic temp table? - PROGRESS 4GL

我是 progress 4gl 的新手,下面是用于将 table 中的所有字段添加到动态临时 table 的查询,少数字段除外,但我不确定如何仅添加必填字段到动态温度 table。请帮忙修改我分享的query

/* p-ttdyn2.p - a join of 2 tables */
DEFINE VARIABLE tth4 AS HANDLE.
DEFINE VARIABLE btth4 AS HANDLE.
DEFINE VARIABLE qh4 AS HANDLE.
DEFINE VARIABLE bCust AS HANDLE.
DEFINE VARIABLE bOrder AS HANDLE.
DEFINE VARIABLE i AS INTEGER.
DEFINE VARIABLE fldh AS HANDLE EXTENT 15.

bCust = BUFFER customer:HANDLE.
bOrder = BUFFER order:HANDLE.

CREATE TEMP-TABLE tth4.
tth4:ADD-FIELDS-FROM(bCust,"address,address2,phone,city,comments").
tth4:ADD-FIELDS-FROM(bOrder,"cust-num,carrier,instructions,PO,terms").
tth4:TEMP-TABLE-PREPARE("CustOrdJoinTT").
btth4 = tth4:DEFAULT-BUFFER-HANDLE.

FOR EACH customer WHERE cust.cust-num < 6, EACH order OF customer:
  btth4:BUFFER-CREATE.
  btth4:BUFFER-COPY(bCust).
  btth4:BUFFER-COPY(bOrder).
END.

/* Create Query */
CREATE QUERY qh4.
qh4:SET-BUFFERS(btth4).
qh4:QUERY-PREPARE("for each CustOrdJoinTT").
qh4:QUERY-OPEN.

REPEAT WITH FRAME zz DOWN:
 qh4:GET-NEXT.
IF qh4:QUERY-OFF-END THEN LEAVE.
 REPEAT i = 1 TO 15:
  fldh[i] = btth4:BUFFER-FIELD(i).
  DISPLAY fldh[i]:NAME FORMAT "x(15)"
  fldh[i]:BUFFER-VALUE FORMAT "x(20)".
 END.
END.

btth4:BUFFER-RELEASE.
DELETE OBJECT tth4.
DELETE OBJECT qh4.

ADD-FIELDS-FROM只支持排除不需要的字段。相反,您可以多次使用 ADD-LIKE-FIELD:

CREATE TEMP-TABLE tth4.

tth4:ADD-LIKE-FIELD("address", "customer.address"). 
tth4:ADD-LIKE-FIELD("address2", "customer.address2"). 
tth4:ADD-LIKE-FIELD("phone", customer.phone").
...

tth4:ADD-LIKE-FIELD("cust-num", "Order.cust-num").
...
tth4:TEMP-TABLE-PREPARE("CustOrdJoinTT").
btth4 = tth4:DEFAULT-BUFFER-HANDLE.

根据您的用例,您还可以将必填字段列表反转为例外字段列表:

var handle ht,hb.
var longchar lcjson.

function invertFields returns character (
    i_hb as handle,
    i_crequired as char  
):

    var char cexcept,cfield.
    var int ic. 

    do ic = 1 to i_hb:num-fields:
        cfield = i_hb:buffer-field( ic ):name.
        if lookup( cfield, i_crequired ) = 0 then
            cexcept = cexcept + ',' + cfield.

    end.

    return substring( cexcept, 2 ).

end function.

create temp-table ht.
ht:add-fields-from(
    buffer customer:handle,
    invertFields( buffer customer:handle, "CustNum,Name" )
).
ht:temp-table-prepare( 'tt' ).
hb = ht:default-buffer-handle.

hb:buffer-create().
assign
    hb::CustNum = 1
    hb::Name = 'test'
    .
hb:write-json( 'longchar', lcjson, true ).
message string( lcjson ).

https://abldojo.services.progress.com/?shareId=624993253fb02369b25437c4