每个进度4GL并从cust

时间:2016-10-31 23:19:22

标签: progress-4gl openedge

我经常做以下进展4GL代码

  output to /OUTText.txt.
  def var dRow as char.
  dRow = "cmpid|CustNum|Cur".
  put unformatted dRow skip.  
  for each Cust no-lock:
    dRow = subst("&1|&2|&3", Cust.CmpId, Cust.CustNum, Cust.Curr).
    put unformatted dRow skip.       
  end.
  output close. 

为了模仿

select * from cust (in MS SQL)

我的问题是有没有办法制作这个代码块,甚至使用4GL非常相似“ select * ”。这样我就不必键入每个列名,它将打印所有列中的所有值。我的想法是。像这样的东西。

 output to /OUTText.txt.
  def var dRow as char.
  dRow = "cmpid|CustNum|Cur".
  put unformatted dRow skip.  
  for each Cust no-lock:
    if row = 1 then do:
      for each Column in Cust:
        **'PRINT THE COLUMN HEADER**
      end.
    end.
    else do:
      **'PRINT EACH CELL**
    end.
  end.
  output close. 

如果有这样的话。然后我不必在dRow中保留显式列名。

2 个答案:

答案 0 :(得分:2)

如果您首先输出所有字段标签(或名称),然后使用EXPORT输出表格内容,您可以执行以下操作。

要更改为字段名称而不是标签:将:LABEL更改为:NAME

例如:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

OUTPUT TO c:\temp\somefile.txt.

DO i = 1 TO BUFFER Customer:NUM-FIELDS.

    PUT QUOTER(BUFFER Customer:BUFFER-FIELD(i):LABEL).

    IF i < BUFFER Customer:NUM-FIELDS THEN 
        PUT UNFORMATTED ";".
    ELSE IF i = BUFFER Customer:NUM-FIELDS THEN 
        PUT SKIP.

END.

FOR EACH Customer NO-LOCK:
    EXPORT DELIMITER ";" Customer.
END.
OUTPUT CLOSE.

您可以将标题部分放在单独的程序中,以便在每次要执行类似操作时动态调用:

DEFINE STREAM str.

OUTPUT STREAM str TO c:\temp\somefile.txt.

RUN putHeaders.p(INPUT BUFFER Customer:HANDLE, INPUT ";", INPUT STREAM str:HANDLE).

FOR EACH Customer NO-LOCK:
    EXPORT STREAM str DELIMITER ";" Customer.
END.
OUTPUT STREAM str CLOSE.


putHeaders.p
============
DEFINE INPUT  PARAMETER phBufferHandle AS HANDLE      NO-UNDO.
DEFINE INPUT  PARAMETER pcDelimiter    AS CHARACTER   NO-UNDO.
DEFINE INPUT  PARAMETER phStreamHandle AS HANDLE      NO-UNDO.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

DO i = 1 TO  phBufferHandle:NUM-FIELDS.
    PUT STREAM-HANDLE phStreamHandle UNFORMATTED  QUOTER(phBufferHandle:BUFFER-FIELD(i):LABEL).

    IF i < phBufferHandle:NUM-FIELDS THEN 
        PUT STREAM-HANDLE phStreamHandle  UNFORMATTED pcDelimiter.
    ELSE IF i = phBufferHandle:NUM-FIELDS THEN 
        PUT STREAM-HANDLE phStreamHandle SKIP.
END.

答案 1 :(得分:1)

output to "somefile".

for each customer no-lock:  
  display customer.
end.

我不会普遍提到这一点,因为4GL中的嵌入式SQL-89是通往地狱的高速公路(SQL的方言仅适用于最基本和最简单的目的而且不应该被使用完全在生产代码中),但实际情况如下:

output to "somefile".
select * from customer.

恰好符合原始问题的规范(尽管,就像DISPLAY解决方案一样,它也不支持分隔符......)