【发布时间】:2015-05-04 22:22:29
【问题描述】:
我的数据库中有一组记录集中了关于我的 .W 的信息,例如窗口名称、父目录、文件名、程序类型(用于内部处理),用于构建我的主菜单。有了这些数据,我正在为我维护的 ERP 开发一个新的启动程序,并利用这个机会重写一些真正过时的功能和程序并实现新功能。到目前为止,我没有任何问题,但是当我开始开发 .P 程序时,它将检查从这个新启动程序的菜单中调用的程序的数据库寄存器 - 检查它是否需要接收固定参数以运行及其数据类型 - 我发现了一个我无法找到解决方案的问题。
在这个表中,我在其中一个字段中存储了程序所需的参数,每个参数都有对应的数据类型。问题在于如何仅根据存储的数据将不同的数据类型传递给过程。我尝试使用 CASE 子句和包含来预转换数据以检查参数字段是否正确发送参数,但包含没有按预期工作。
我的数据库字段是这样存储的:
Description | DATATYPE | Content
我已经声明了一些变量并将存储的数据正确转换为正确的数据类型变量。
DEF VAR c-param-exec AS CHAR NO-UNDO EXTENT 9 INIT ?.
DEF VAR i-param-exec AS INT NO-UNDO EXTENT 9 INIT ?.
DEF VAR de-param-exec AS DEC NO-UNDO EXTENT 9 INIT ?.
DEF VAR da-param-exec AS DATE NO-UNDO EXTENT 9 INIT ?.
DEF VAR l-param-exec AS LOG NO-UNDO EXTENT 9 INIT ?.
DEF VAR i-count AS INT NO-UNDO.
blk-count:
DO i-count = 0 TO 8:
IF TRIM(programa.parametro[i-count]) = '' THEN
LEAVE blk-count.
i-count = i-count + 1.
CASE ENTRY(2,programa.parametro[i-count],CHR(1)):
WHEN 'CHARACTER' THEN
c-param-exec[i-count] = ENTRY(3,programa.parametro[i-count],CHR(1)).
WHEN 'INTEGER' THEN
i-param-exec[i-count] = INT(ENTRY(3,programa.parametro[i-count],CHR(1))).
WHEN 'DECIMAL' THEN
de-param-exec[i-count] = DEC(ENTRY(3,programa.parametro[i-count],CHR(1))).
WHEN 'DATE' THEN
da-param-exec[i-count] = DATE(ENTRY(3,programa.parametro[i-count],CHR(1))).
WHEN 'LOGICAL' THEN
l-param-exec[i-count] = (ENTRY(3,programa.parametro[i-count],CHR(1)) = 'yes').
OTHERWISE
c-param-exec[i-count] = ENTRY(3,programa.parametro[i-count],CHR(1)).
END CASE.
END.
然后我尝试使用包含传递参数来运行程序(在此示例中,程序有 3 个INPUT 参数)。
RUN VALUE(c-prog-exec) ({util\abrePrograma.i 1},
{util\abrePrograma.i 2},
{util\abrePrograma.i 3}).
这是我的abrePrograma.i
/* abrePrograma.i */
(IF ENTRY(2,programa.parametro[{1}],CHR(1)) = 'CHARACTER' THEN c-param-exec[{1}] ELSE
IF ENTRY(2,programa.parametro[{1}],CHR(1)) = 'INTEGER' THEN i-param-exec[{1}] ELSE
IF ENTRY(2,programa.parametro[{1}],CHR(1)) = 'DECIMAL' THEN de-param-exec[{1}] ELSE
IF ENTRY(2,programa.parametro[{1}],CHR(1)) = 'DATE' THEN da-param-exec[{1}] ELSE
IF ENTRY(2,programa.parametro[{1}],CHR(1)) = 'LOGICAL' THEN l-param-exec[{1}] ELSE
c-param-exec[{1}])
如果我从包含中抑制第 2、第 3、第 4 和第 5 个IF 或在所有IF 中仅使用一种数据类型(例如,仅 CHAR、仅 DATE 等),则程序正常工作并像魅力一样执行,但我需要调用一些旧程序,这些程序在其 INPUT 参数中需要不同的数据类型,并且使用所描述的程序 OpenEdge 不会编译调用者,触发错误号 223。
---------------------------
Erro (Press HELP to view stack trace)
---------------------------
** Tipos de dados imcompativeis em expressao ou atribuicao. (223)
** Nao entendi a linha 86. (196)
---------------------------
OK Ajuda
---------------------------
谁能帮我解决这个问题? 提前致谢。
【问题讨论】:
标签: progress-4gl openedge