我有一张叫tt的临时桌子。我希望使用临时表创建一个具有相同字段名和类型的数据库表。
我不知道在Progress 4GL中该如何做。这有可能吗?
谢谢。
发布于 2014-06-04 05:51:32
简短回答:是
最安全的方法是通过代码来完成这一任务,即创建一个增量的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" ).发布于 2014-06-03 12:48:10
虽然这可能是可能的,但这不是一个很好的主意。很可能你会损坏你的数据库。这可能导致数据丢失。您最好还是坚持使用所提供的工具,即使它们可能有一些问题。
备份第一
在应用任何更改之前,请始终备份!
单用数据库
您可以在“数据字典”中直接在线修改单个使用数据库(如果您是本地连接的)。这很直截了当。只需使用GUI添加表,它就是字段和索引。确保您提交了更改。
多用户数据库
多用户数据库可以脱机更改,也可以在线更改(稍微有限一些)。添加具有相应字段和索引的新表是可以在线进行的更改。脱机添加更改的方式与“单用数据库”完全相同。
在线更改需要更多的工作:
首先,您需要两个连接的数据库。在这种情况下,我会称它们为"live“和"development”。当涉及到模式时,"Development“将包含一个完美的"live”副本。它不需要有任何数据。数据库可以具有相同的名称,然后在连接到其中一个数据库时使用“逻辑名称”别名。
一些模式更改将要求您再次编译源代码!

发布于 2016-02-11 18:31:26
使用@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).https://stackoverflow.com/questions/24014933
复制相似问题