从临时表创建数据库表(按代码)

时间:2014-06-03 12:13:41

标签: progress-4gl openedge

我有一个名为tt的临时表。我想使用temp-table创建一个具有相同字段名称和类型的数据库表。

我无法弄清楚如何在进度-4gl 中进行操作。这可能吗 ?

感谢。

4 个答案:

答案 0 :(得分:4)

简答:是的

最安全的方法是通过代码来创建增量df,然后加载它。 这是一个非常局部的开始,应该让你去:

DEFINE TEMP-TABLE tt NO-UNDO
   FIELD ii AS INT
   FIELD cc AS CHAR
INDEX ttix IS UNIQUE PRIMARY ii.

DEF VAR hb     AS HANDLE NO-UNDO.
DEF VAR hf     AS HANDLE NO-UNDO.
DEF VAR ifield AS INT NO-UNDO.

hb = TEMP-TABLE tt:DEFAULT-BUFFER-HANDLE.

OUTPUT TO "tt.df".

PUT UNFORMATTED SUBSTITUTE( "ADD TABLE &1", QUOTER( hb:NAME ) ) SKIP.

DO  ifield = 1 TO hb:NUM-FIELDS:

   hf = hb:BUFFER-FIELD( ifield ).

   PUT UNFORMATTED 
      SUBSTITUTE( 
         "ADD FIELD &1 OF &2 AS &3", 
         QUOTER( hf:NAME ), 
         QUOTER( hb:NAME ), 
         hf:DATA-TYPE 
      ) SKIP.

   /* to do: add other field attributes like label, initial value, decimals, format */

END.         

/* to do: add indices */

OUTPUT CLOSE.

生成的df可以加载:

RUN prodict/load_df.p ( "tt.df" ).

答案 1 :(得分:2)

虽然这可能是可能的,但这不是一个好主意。您可能会损坏您的数据库。这可能会导致数据丢失。即使可能存在一些问题,最好还是坚持使用提供的工具。

先备份

在应用任何更改之前始终备份!

单一用途数据库

您可以直接在数据字典中在线修改单个使用情况数据库(如果您已在本地连接)。这很直截了当。只需使用GUI添加表格,它的字段和索引。确保您提交更改。

多用户数据库

可以离线更改多用户数据库或在线更改(稍微有限)。添加具有相应字段和索引的新表是可以在线进行的更改。离线添加更改的方式与"单一使用数据库"完全相同。

在线更改需要更多工作:

首先,您需要两个连接的数据库。我打电话给他们"生活"和"开发"在这种情况下。 "开发"将包含一个完整的" live"说到架构。它不必包含任何数据。数据库可以具有相同的名称 - 然后您将使用"逻辑名称"连接其中一个时的别名。

  1. 在"开发中进行更改"就像在离线数据库或单一用法数据库中一样(使用数据字典)。确保您提交更改。

  2. 输入数据管理工具。确保你有"开发"被选为默认数据库。转到管理员 - >转储数据和定义 - >创建增量.df文件。选择你的" live"数据库作为比较数据库并选择一个好的文件名(delta.df是默认的)。

    创建的文件是您的" live"之间的差异文件。和"开发"数据库。检查它是否明智,以确保您不会错误地丢弃任何表格或类似的东西。

  3. 现在选择" live"数据库默认并转到管理员 - >加载数据和定义。您可以在此处选择离线(默认)或在线添加更改(选中'在线添加新对象')。

  4. 某些架构更改需要您再次编译源代码!

    Load Data and Definitions

答案 2 :(得分:1)

使用@Stefan Drissen的例子,做了一些修改。

{temp-tables.i}

def input param table-handle tt.

def var hb     as handle no-undo.
def var hf     as handle no-undo.
def var ifield as int no-undo.
def var vindex as char no-undo.
def var vi as int. 

hb = tt:default-buffer-handle.

output to value("/home/user/teste.df") append.

    put unformatted substitute( "ADD TABLE &1", quoter(hb:name)) skip.

    DO  ifield = 1 to hb:num-fields:

        hf = hb:buffer-field( ifield ).

       put unformatted
          substitute( 
             "ADD FIELD &1 OF &2 AS &3", 
             quoter( hf:name ), 
             quoter( hb:name ), 
             hf:data-type 
          ) skip.

       put unformatted 
           substitute(
               "FORMAT &1",
                   quoter(hf:format)
                   ) skip.

       put unformatted 
            substitute (
                "LABEL &1",
                    quoter( hf:name )
                    ) skip.

        put unformatted "ORDER " + string(ifield * 10) skip.

        if ifield < hb:num-fields then put unformatted skip (1).   

    end. 

    put unformatted skip(1).

    /*=== INDEX CREATION ===*/
    assign vindex = hb:index-information(1).

    if lookup("default",vindex) <= 0 
    then do:    
        put unformatted(
            substitute(
                "ADD INDEX &1 ON &2",
                    quoter(entry(01,vindex,",")),
                    quoter( hb:name ))) skip.

        if entry(02,vindex,",") = "1" 
        then put unformatted "UNIQUE" skip.

        if entry(03,vindex,",") = "1" 
        then put unformatted "PRIMARY" skip.

        do vi = 5 to 20 by 2:
            if num-entries(vindex,",") > vi 
            then put unformatted "INDEX-FIELD " entry(vi,vindex,",") " " (if entry(vi + 1,vindex,",") = "0" then "ASCENDING" else "DESCENDING") skip.
        end.   
    end.
    /*=== INDEX CREATION ===*/

    put unformatted skip(1).
output close.

要使其正常工作,只需在program.p。

上调用此代码即可
run createDF.p(input table nameOfYourTempTable).

答案 3 :(得分:-2)

CREATE TABLE new_table   AS(SELECT * FROM tt);

只需将new_table替换为您要提供的表名