首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个进程4GL并从cust中选择*

每个进程4GL并从cust中选择*
EN

Stack Overflow用户
提问于 2016-10-31 23:19:21
回答 2查看 747关注 0票数 0

我经常执行以下进度4GL代码

代码语言:javascript
复制
  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. 

为了模仿

代码语言:javascript
复制
select * from cust (in MS SQL)

我的问题是,是否有一种方法可以使这个代码块,甚至非常类似于使用4GL的"select *“。这样,我就不必键入每个列名,它将打印所有列中的所有值。我的想法是。就像这样。

代码语言:javascript
复制
 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中保留显式的列名了。

EN

回答 2

Stack Overflow用户

发布于 2016-11-01 07:58:12

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

若要更改为字段名而不是标签:将下面的:LABEL更改为:NAME

例如:

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
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.
票数 2
EN

Stack Overflow用户

发布于 2016-10-31 23:54:01

代码语言:javascript
复制
output to "somefile".

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

我一般不会提到这一点,因为4GL中的嵌入式SQL-89是通往地狱的公路( SQL的方言只为最基本和最琐碎的目的工作,实际上根本不应该在生产代码中使用),但碰巧:

代码语言:javascript
复制
output to "somefile".
select * from customer.

是否恰好符合原始问题的规范(尽管,与显示解决方案一样,它也不支持分隔符.)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40351975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档