Problema em UPC

Discussão em 'Progress 4GL' iniciado por alcampos, Maio 7, 2010.

  1. alcampos

    alcampos Sem Pontuação

    Boa tarde, pessoal.

    Estou com um probleminha numa UPC desenvolvida para o programa CP0321 - Reporte de Produção por Ponto de Controle.

    A UPC faz várias coisas: cria campo específico na tela, faz validação e um processo de acordo com informações fornecidas nesse campo específico. Tudo isso funciona perfeitamente bem, o problema é o seguinte: em uma determinada condição, a UPC executa uma rotina que utiliza a API de reporte de produção (CPAPI001) para fazer outros reportes na mesma OP e, quando retorna dessa rotina e volta para o ponto de chamada da UPC no programa chamador, aparece a seguinte mensagem na tela:

    **FIND FIRST/LAST FAILED FOR TABLE tt-erro. (565)

    Esse erro ocorre no programa chamador, não no programa de UPC e eu não consigo descobrir o que está provocando esse erro. E o processo é realizado inteiro, não é interrompido, só aparece a mensagem mesmo.

    Nota que, mesmo com a UPC ativa, se o programa não executa essa rotina que chama a API de reporte, o erro não acontece!

    Será que alguém já viu isso acontecer e tem idéia do que eu posso fazer para descobrir a causa???

    Obrigada pela ajuda.
    Segue o código da UPC e da rotina que executa a API. O processo é feito no evento END-UPDATE.
    Código:
    CP0321-U00:
    
    {include/i-prgvrs.i cp0321-u00 2.04.00.000}
    
    DEF INPUT PARAM p-ind-event        as char          no-undo.
    DEF INPUT PARAM p-ind-object       as char          no-undo.
    DEF INPUT PARAM p-wgh-object       as handle        no-undo.
    DEF INPUT PARAM p-wgh-frame        as widget-handle no-undo.
    DEF INPUT PARAM p-cod-table        as char          no-undo.
    DEF INPUT PARAM p-row-table        as rowid         no-undo.
    
    define new global shared var adm-broker-hdl  as handle no-undo.
    
    /* DEF NEW GLOBAL SHARED VAR g-wgh-cp0321-quantidade-reporte AS WIDGET-HANDLE NO-UNDO. */
    DEF NEW GLOBAL SHARED VAR g-wgh-cp0321-lote-serie-acabado AS WIDGET-HANDLE NO-UNDO.
    DEF NEW GLOBAL SHARED VAR g-wgh-cp0321-label-unidades     AS WIDGET-HANDLE NO-UNDO.
    DEF NEW GLOBAL SHARED VAR g-wgh-cp0321-num-unidades       AS WIDGET-HANDLE NO-UNDO.
    DEF NEW GLOBAL SHARED VAR g-wgh-cp0321-label-lote-final   AS WIDGET-HANDLE NO-UNDO.
    DEF NEW GLOBAL SHARED VAR g-wgh-cp0321-lote-serie-final   AS WIDGET-HANDLE NO-UNDO.
    
    DEF VAR tx-lb-lote-final     AS WIDGET-HANDLE NO-UNDO.
    DEF VAR tx-lb-num-unidades   AS WIDGET-HANDLE NO-UNDO.
    DEF VAR fi-num-unidades      AS WIDGET-HANDLE NO-UNDO.
    DEF VAR fi-lote-serie-final  AS WIDGET-HANDLE NO-UNDO.
    
    DEF VAR wh-objeto AS WIDGET-HANDLE NO-UNDO.
    DEF VAR wh-aux    AS WIDGET-HANDLE NO-UNDO.
    
    DEF VAR i-num-lote      AS INT   NO-UNDO.
    DEF VAR i-num-reporte   AS INT   NO-UNDO.
    DEF VAR i-ult-num-serie AS INT   NO-UNDO.
    DEF VAR c-lote          AS CHAR  NO-UNDO.
    DEF VAR rw-oper         AS ROWID NO-UNDO.
    
    def var c-handle        as char no-undo.
    
    DEF BUFFER b-ord-prod FOR ord-prod.
    
    {esupc/cp0321-u00.i} /* FUNCTION f-retorna-ult-oper */
    
    
    /* Início */
    
    IF  p-ind-event = 'BEFORE-INITIALIZE' AND
        p-ind-object = "VIEWER" AND 
        p-wgh-object:FILE-NAME = 'invwr/v38in271.w' THEN DO:
    
        wh-objeto = p-wgh-frame:FIRST-CHILD.
        DO WHILE wh-objeto <> ? :
            IF wh-objeto:TYPE = "FIELD-GROUP" THEN DO:
                wh-aux = wh-objeto:FIRST-CHILD.
                DO WHILE wh-aux <> ?:
    
                    IF wh-aux:NAME = 'fi-lote-serie-acabado' THEN DO:
    
                        /* Cria campo para informar quantidade de unidades que deverá ser reportada */
                        CREATE TEXT tx-lb-num-unidades
                            ASSIGN FRAME             = wh-aux:FRAME
                                   WIDTH             = 13
                                   FORMAT            = "x(13)"
                                   HEIGHT            = .88
                                   ROW               = wh-aux:ROW - 1
                                   COLUMN            = wh-aux:COL + 19
                                   SCREEN-VALUE      = 'Num.Unidades:'.
    
                        CREATE FILL-IN fi-num-unidades
                            ASSIGN FRAME             = wh-aux:FRAME
                                   ROW               = wh-aux:ROW - 1
                                   COL               = wh-aux:COL + 32
                                   WIDTH             = wh-aux:WIDTH
                                   HEIGHT            = .88
                                   FORMAT            = ">>>,>>9"
                                   DATA-TYPE         = "INTEGER"
                                   SIDE-LABEL-HANDLE = tx-lb-num-unidades
                            TRIGGERS:
                                ON LEAVE PERSISTENT RUN esupc/cp0321-u02.p (INPUT p-wgh-object).
                            END TRIGGERS.
    
                        /* Cria campo para exibir os números de lotes que serão reportados */
                        CREATE TEXT tx-lb-lote-final
                            ASSIGN FRAME             = wh-aux:FRAME
                                   WIDTH             = 17
                                   FORMAT            = "x(17)"
                                   HEIGHT            = .88
                                   ROW               = wh-aux:ROW
                                   COLUMN            = wh-aux:COL + 19
                                   SCREEN-VALUE      = 'Lote/Serie Final:'.
    
                        CREATE FILL-IN fi-lote-serie-final
                            ASSIGN FRAME             = wh-aux:FRAME
                                   ROW               = wh-aux:ROW
                                   COL               = wh-aux:COL + 32
                                   WIDTH             = wh-aux:WIDTH
                                   HEIGHT            = .88
                                   FORMAT            = wh-aux:FORMAT
                                   SIDE-LABEL-HANDLE = tx-lb-lote-final.
    
                        /* Obtem o handle do campo Lote/Série */
                        ASSIGN g-wgh-cp0321-label-unidades     = tx-lb-num-unidades
                               g-wgh-cp0321-num-unidades       = fi-num-unidades
                               g-wgh-cp0321-label-lote-final   = tx-lb-lote-final
                               g-wgh-cp0321-lote-serie-final   = fi-lote-serie-final 
                               g-wgh-cp0321-lote-serie-acabado = wh-aux.
                        
                        LEAVE.
                    END.
                    wh-aux = wh-aux:NEXT-SIBLING.
                END. /* DO WHILE wh-aux <> ? */
            END. /* IF wh-objeto:TYPE = "FIELD-GROUP" */
    
            IF VALID-HANDLE(g-wgh-cp0321-lote-serie-acabado) THEN
                LEAVE.
    
            ASSIGN wh-objeto = wh-objeto:NEXT-SIBLING.
    
        END. /* DO WHILE wh-objeto <> ? */
    
    END. /* IF p-ind-event = 'BEFORE-INITIALIZE' - v38in271.w */
    
    
    IF p-ind-event = 'Fim-habilita-campos' AND
       p-wgh-object:FILE-NAME = 'invwr/v38in271.w' THEN DO:
    
        FIND ord-prod WHERE ROWID(ord-prod) = p-row-table NO-LOCK NO-ERROR.
    
        IF AVAIL ord-prod THEN DO: 
    
            FIND ITEM WHERE ITEM.it-codigo = ord-prod.it-codigo
                 NO-LOCK NO-ERROR.
    
            IF AVAIL ITEM AND ITEM.tipo-con-est = 2 THEN DO:   /* 2-Número de Série */
                RUN get-link-handle IN adm-broker-hdl
                   (INPUT p-wgh-object, INPUT "record-source", OUTPUT c-handle).
    
                run get-attribute in widget-handle (c-handle) (input "rw-oper").
                rw-oper = TO-ROWID(RETURN-VALUE).
    
                /* Se for a última operação da OP */
                IF rw-oper = f-retorna-ult-oper (ord-prod.nr-ord-prod) THEN DO:
                    IF ord-prod.lote = "" THEN DO:
                        FIND FIRST es-param-cp EXCLUSIVE-LOCK NO-ERROR.
                        IF AVAIL es-param-cp THEN DO:
                            i-num-lote = es-param-cp.num-ult-lote + 1.
                            REPEAT:
                                FIND FIRST b-ord-prod WHERE
                                    ENTRY(1,b-ord-prod.lote-serie,"/") = STRING(i-num-lote,"99999")
                                    NO-LOCK NO-ERROR.
                                IF NOT AVAIL b-ord-prod THEN
                                    LEAVE.
                                i-num-lote = i-num-lote + 1.
                            END.
    
                            /* Atualiza número do lote na ordem de produção */
                            RUN esupc/cp0321-u01.p (INPUT ROWID(ord-prod), INPUT STRING(i-num-lote,"99999")).
    
                            ASSIGN es-param-cp.num-ult-lote = i-num-lote.
                            RELEASE es-param-cp.
                        END. /* IF AVAIL es-param-cp */
                    END. /* IF ord-prod.lote = "" */
    
                    FIND oper-ord WHERE ROWID(oper-ord) = rw-oper NO-LOCK NO-ERROR.
    
                    /* Acha último número de série reportado para a OP */
                    i-ult-num-serie = 0.
                    FOR EACH ord-rep WHERE
                        ord-rep.nr-ord-produ = ord-prod.nr-ord-produ
                        NO-LOCK 
                        BY ord-rep.nr-reporte DESC:
                        
                        FIND rep-prod WHERE
                             rep-prod.nr-reporte = ord-rep.nr-reporte
                             NO-LOCK NO-ERROR.
        
                        IF AVAIL rep-prod AND rep-prod.qt-reporte > rep-prod.qt-estorno AND
                            rep-prod.lote-serie <> "" THEN DO:
                            IF NUM-ENTRIES(rep-prod.lote-serie,"/") >= 2 THEN DO:
                                ASSIGN i-ult-num-serie = INT(ENTRY(2,rep-prod.lote-serie,"/")) NO-ERROR.
        
                                IF ERROR-STATUS:ERROR THEN
                                    i-ult-num-serie = 0.
                                
                                LEAVE.
                            END.
                        END. /* IF AVAIL rep-prod */
                    END. /* FOR EACH ord-rep */
    
                    /* De acordo com a quantidade reportada, alimenta os números de série inicial e final que serão reportados */
                    IF VALID-HANDLE(g-wgh-cp0321-num-unidades) THEN DO:
                        IF g-wgh-cp0321-num-unidades:INPUT-VALUE = 0 THEN
                            ASSIGN g-wgh-cp0321-num-unidades:SCREEN-VALUE = "1"
                                   i-num-reporte = 1.
                        ELSE
                            i-num-reporte = g-wgh-cp0321-num-unidades:INPUT-VALUE.
                    END.
                    ELSE
                        i-num-reporte = 1.
    
                    ASSIGN i-ult-num-serie = i-ult-num-serie + 1
                           i-num-reporte   = i-num-reporte - 1
                           c-lote          = ENTRY(1,ord-prod.lote-serie,"/").
    
                    IF VALID-HANDLE(g-wgh-cp0321-lote-serie-acabado) THEN
                        ASSIGN g-wgh-cp0321-lote-serie-acabado:SCREEN-VALUE = c-lote + "/" + STRING(i-ult-num-serie,"9999")
                               g-wgh-cp0321-lote-serie-acabado:SENSITIVE    = NO.
    
                    IF VALID-HANDLE(g-wgh-cp0321-lote-serie-final) THEN
                        g-wgh-cp0321-lote-serie-final:SCREEN-VALUE = c-lote + "/" + STRING(i-ult-num-serie + i-num-reporte,"9999").
    
                END. /* IF TO-ROWID (return-value) = f-retorna-ult-oper (ord-prod.nr-ord-prod) */
    
                /* Habilita campo Número de Unidades */
                IF VALID-HANDLE(g-wgh-cp0321-num-unidades) THEN
                    g-wgh-cp0321-num-unidades:SENSITIVE = YES.
    
            END. /* IF AVAIL ITEM AND ITEM.tipo-con-est = 2 - Número de Série */
        END. /* IF AVAIL ord-prod */
    
        IF VALID-HANDLE(g-wgh-cp0321-label-unidades) THEN
            g-wgh-cp0321-label-unidades:SCREEN-VALUE = 'Num.Unidades:'.
    
        IF VALID-HANDLE(g-wgh-cp0321-label-lote-final) THEN
            g-wgh-cp0321-label-lote-final:SCREEN-VALUE = 'Lote/Serie Final:'.
    
    END. /* IF  p-ind-event = 'fim-habilita-campos' - v38in271.w */
    
    
    IF p-ind-event = 'DISPLAY' AND
       p-ind-object = "VIEWER" AND 
       p-wgh-object:FILE-NAME = 'invwr/v35in271.w' THEN DO:
    
        IF VALID-HANDLE(g-wgh-cp0321-label-unidades) THEN
            g-wgh-cp0321-label-unidades:SCREEN-VALUE = 'Num.Unidades:'.
    
        IF VALID-HANDLE(g-wgh-cp0321-label-lote-final) THEN
            g-wgh-cp0321-label-lote-final:SCREEN-VALUE = 'Lote/Serie Final:'.
    
    END. /* IF  p-ind-event = 'DISPLAY' - v35in271.w */
    
    
    IF p-ind-event = 'DISABLE' AND
       p-ind-object = "VIEWER" AND 
       p-wgh-object:FILE-NAME = 'invwr/v35in271.w' THEN DO:
    
        IF VALID-HANDLE(g-wgh-cp0321-num-unidades) THEN
            ASSIGN g-wgh-cp0321-num-unidades:SENSITIVE    = NO
                   g-wgh-cp0321-num-unidades:SCREEN-VALUE = "".
    
        IF VALID-HANDLE(g-wgh-cp0321-lote-serie-final) THEN
            ASSIGN g-wgh-cp0321-lote-serie-final:SENSITIVE    = NO
                   g-wgh-cp0321-lote-serie-final:SCREEN-VALUE = "".
    
        IF VALID-HANDLE(g-wgh-cp0321-lote-serie-acabado) THEN
            ASSIGN g-wgh-cp0321-lote-serie-acabado:SCREEN-VALUE = "".
    END.
    
    
    IF  p-ind-event = 'VALIDATE' AND
        p-ind-object = "VIEWER" AND 
        p-wgh-object:FILE-NAME = 'invwr/v38in271.w' THEN DO:
    
        FIND ord-prod WHERE ROWID(ord-prod) = p-row-table NO-LOCK NO-ERROR.
    
        IF AVAIL ord-prod THEN DO: 
            FIND ITEM WHERE ITEM.it-codigo = ord-prod.it-codigo
                 NO-LOCK NO-ERROR.
    
            IF AVAIL ITEM AND ITEM.tipo-con-est = 2 THEN DO:   /* 2-Número de Série */
                IF VALID-HANDLE(g-wgh-cp0321-num-unidades) THEN
                    i-num-reporte = g-wgh-cp0321-num-unidades:INPUT-VALUE.
    
                IF i-num-reporte = 0 THEN DO:
                    RUN utp/ut-msgs.p (input "show":U, INPUT 17006, 
                                       input "Número de Unidades Inválido!~~" +
                                             "Número de Unidades que devem ser reportadas deve ser diferente de zero.").
                    RETURN 'ADM-ERROR'.
                END.
            END. /* IF AVAIL ITEM AND ITEM.tipo-con-est = 2 - Número de Série */
        END. /* IF AVAIL ord-prod */
    
    END. /* IF  p-ind-event = 'VALIDATE' - v38in271.w */
    
    IF p-ind-event = 'END-UPDATE' AND
       p-ind-object = "VIEWER" AND 
       p-wgh-object:FILE-NAME = 'invwr/v35in271.w' THEN DO:
    
        /* Nesse momento o programa já fez o reporte do primeiro lote/num série */
        FIND ord-prod WHERE ROWID(ord-prod) = p-row-table NO-LOCK NO-ERROR.
    
        IF AVAIL ord-prod THEN DO: 
            FIND ITEM WHERE ITEM.it-codigo = ord-prod.it-codigo
                 NO-LOCK NO-ERROR.
    
            IF AVAIL ITEM AND ITEM.tipo-con-est = 2 THEN DO:   /* 2-Número de Série */
                IF VALID-HANDLE(g-wgh-cp0321-num-unidades) THEN
                    i-num-reporte = g-wgh-cp0321-num-unidades:INPUT-VALUE.
    
                IF i-num-reporte > 1 THEN DO:
                    RUN GET-ATTRIBUTE IN p-wgh-object (INPUT "rw-oper").
                    rw-oper = TO-ROWID (return-value).
    
                    RUN esupc/cp0321-u03.p (INPUT ROWID(ord-prod), INPUT i-num-reporte - 1,
                                            INPUT rw-oper).
    
                    IF RETURN-VALUE = 'ADM-ERROR' THEN
                        RETURN 'ADM-ERROR'.
    
                END. /* IF i-num-reporte > 1 */
            END. /* IF AVAIL ITEM AND ITEM.tipo-con-est = 2 - Número de Série */
        END. /* IF AVAIL ord-prod */
    
        RETURN 'OK'.
    
    END. /* IF  p-ind-event = 'END-UPDATE' - v35in271.w */
    
    IF p-ind-event = 'FinalizaOrdem' AND
        p-wgh-object:FILE-NAME = 'invwr/v35in271.w' THEN DO:
        RETURN p-ind-object.
    END. /* IF  p-ind-event = 'FinalizaOrdem' - v35in271.w */
    
    
    IF p-ind-event = 'FinalizaOperacao' AND
        p-wgh-object:FILE-NAME = 'invwr/v35in271.w' THEN DO:
        RETURN p-ind-object.
    END. /* IF  p-ind-event = 'FinalizaOperacao' - v35in271.w */
    
    
    IF p-ind-event = 'DESTROY' AND 
       p-ind-object = 'CONTAINER' THEN DO:
    
        IF VALID-HANDLE(g-wgh-cp0321-label-lote-final) THEN
            DELETE OBJECT g-wgh-cp0321-label-lote-final.
    
        IF VALID-HANDLE(g-wgh-cp0321-label-unidades) THEN
            DELETE OBJECT g-wgh-cp0321-label-unidades.
    
        IF VALID-HANDLE(g-wgh-cp0321-num-unidades) THEN
            DELETE OBJECT g-wgh-cp0321-num-unidades.
    
        IF VALID-HANDLE(g-wgh-cp0321-lote-serie-final) THEN
            DELETE OBJECT g-wgh-cp0321-lote-serie-final.
    
        ASSIGN g-wgh-cp0321-lote-serie-acabado = ?.
    
    END. /* IF p-ind-event = 'DESTROY' AND ... */
    
    RETURN.

    Código:
    CP0321-U03:
    
    {include/i-prgvrs.i cp0321-u03 2.04.00.000}
    
    DEF INPUT PARAM p-rw-ord-prod  AS ROWID NO-UNDO.
    DEF INPUT PARAM p-num-reportes AS INT   NO-UNDO.
    DEF INPUT PARAM p-rw-oper-ord  AS ROWID NO-UNDO.
    
    DEF NEW GLOBAL SHARED VAR h-acomp AS HANDLE NO-UNDO.
    
    def var h-handle  as handle no-undo.
    def var c-retorno as char   no-undo.
    
    DEF VAR i-aux           AS INT   NO-UNDO.
    DEF VAR i-ult-num-serie AS INT   NO-UNDO.
    DEF VAR i-seq           AS INT   NO-UNDO.
    DEF VAR l-ultima        AS LOG   NO-UNDO.
    DEF VAR c-lote          AS CHAR  NO-UNDO.
    DEF VAR c-rep-lote      AS CHAR  NO-UNDO.
    
    {cdp/cdcfgman.i} /* Include com preprocessador para release 2.02 */ 
    {cpp/cpapi001.i} /* Temp-tables para utilizacao da API de reporte */
    {cdp/cd0666.i}   /* Temp-table de erro */
    
    
    {esupc/cp0321-u00.i} /* FUNCTION f-retorna-ult-oper */
    
    /* Início */
    
    FIND ord-prod WHERE ROWID(ord-prod) = p-rw-ord-prod
        NO-LOCK NO-ERROR.
    
    FIND oper-ord WHERE ROWID(oper-ord) = p-rw-oper-ord /* Operação da OP que está sendo reportada */
        NO-LOCK NO-ERROR.    
    
    IF AVAIL ord-prod AND AVAIL oper-ord THEN DO:
    
        /* API de Reporte */
        RUN cpp/cpapi001.p PERSISTENT SET h-handle (INPUT-OUTPUT TABLE tt-rep-prod,
                                                    INPUT        TABLE tt-refugo,
                                                    INPUT        TABLE tt-res-neg,
                                                    INPUT        TABLE tt-apont-mob,
                                                    INPUT-OUTPUT TABLE tt-erro,
                                                    INPUT        YES).
    
        l-ultima = ROWID(oper-ord) = f-retorna-ult-oper (ord-prod.nr-ord-prod).
    
        /* Se for a última Operação da OP */
        IF l-ultima THEN DO:
            /* Acha último número de série reportado para a OP */
            ASSIGN c-lote          = ''
                   i-ult-num-serie = 0.
            FOR EACH ord-rep WHERE
                ord-rep.nr-ord-produ = ord-prod.nr-ord-produ
                NO-LOCK 
                BY ord-rep.nr-reporte DESC:
        
                FIND rep-prod WHERE
                     rep-prod.nr-reporte = ord-rep.nr-reporte
                     NO-LOCK NO-ERROR.
        
                IF AVAIL rep-prod AND rep-prod.qt-reporte > rep-prod.qt-estorno AND
                    rep-prod.lote-serie <> "" THEN DO:
                    c-lote = ENTRY(1,rep-prod.lote-serie,"/").
                    IF NUM-ENTRIES(rep-prod.lote-serie,"/") >= 2 THEN DO:
                        ASSIGN i-ult-num-serie = INT(ENTRY(2,rep-prod.lote-serie,"/")) NO-ERROR.
        
                        IF ERROR-STATUS:ERROR THEN
                            i-ult-num-serie = 0.
        
                        LEAVE.
                    END.
                END. /* IF AVAIL rep-prod */
            END. /* FOR EACH ord-rep */
        END. /* IF l-ultima */
    
    /*     EMPTY TEMP-TABLE tt-rep-prod. */
    /*     EMPTY TEMP-TABLE tt-erro.     */
    
        i-seq = 0.
        DO i-aux = 1 TO p-num-reportes:
    
            IF l-ultima THEN /* Gera o número do próximo lote */
                c-rep-lote = c-lote + '/' + STRING(i-ult-num-serie + i-aux,"9999").
            ELSE
                c-rep-lote = "".
    
            /* Último reporte feito para a operação que está sendo reportada */
            FIND LAST rep-oper WHERE
                rep-oper.nr-ord-produ = oper-ord.nr-ord-produ AND
                rep-oper.op-seq       = oper-ord.sequencia    AND
                rep-oper.tipo-trans   = 1  /* 1-Reporte */
                NO-LOCK NO-ERROR.
    
            IF AVAIL rep-oper THEN DO:
                FIND rep-prod WHERE
                     rep-prod.nr-reporte = rep-oper.nr-reporte
                     NO-LOCK NO-ERROR.
    
                IF AVAIL rep-prod THEN DO:
                    /* Cria temp-table */
                    CREATE tt-rep-prod.
                    BUFFER-COPY rep-prod EXCEPT nr-reporte TO tt-rep-prod.
    
                    ASSIGN i-seq                      = i-seq + 1
                           tt-rep-prod.nro-ord-seq    = i-seq
                           tt-rep-prod.nr-ord-prod    = ord-prod.nr-ord-produ
                           tt-rep-prod.lote-serie     = c-rep-lote
                           tt-rep-prod.prog-seg       = "cp0321-u03"
                           tt-rep-prod.tipo           = 3 /* 3-Ponto de Controle */
                           tt-rep-prod.un             = ord-prod.un
                           tt-rep-prod.pto-controle   = oper-ord.pto-controle
                           tt-rep-prod.finaliza-ordem = NO
                           tt-rep-prod.finaliza-oper  = NO.
                END.
            END. /* IF AVAIL ord-rep */
        END. /* DO i-aux = 1 TO p-num-reportes */
    
        /* Processa reportes */
        run utp/ut-acomp.p persistent set h-acomp.
    
        run pi-inicializar in h-acomp ("Processando Reporte - Lote/Serie: " + c-rep-lote).
        run pi-desabilita-cancela in h-acomp.
    
        run pi-processa-reportes in h-handle (input-output table tt-rep-prod,
                                              input        table tt-refugo,
                                              input        table tt-res-neg,
                                              input-output table tt-erro,
                                              input yes,
                                              input YES).
        assign c-retorno = return-value.  
    
        if valid-handle (h-acomp) then
           run pi-finalizar in h-acomp.
    
        /* Finaliza API */
        RUN pi-finalizar IN h-handle.
    
        find first tt-erro no-error.
        if avail tt-erro then
           RUN cdp/cd0666.w (input table tt-erro).
    
        if c-retorno = "nok" THEN
            return "adm-error".  
    
    END. /* IF AVAIL ord-prod AND AVAIL oper-ord */
    
    RETURN 'OK'.
  2. fdantas

    fdantas Administrator Moderador

    Nao deu tempo de eu olhar seu código...

    Mas veja as seguintes sugestões.
    Colocar no-error no find.
    Trocar find por for each.
    colocar um if avail na temp-table tt-erro antes de usa-la...

    Abraço
  3. alcampos

    alcampos Sem Pontuação

    Bom dia.

    Consegui resolver o problema. Realmente era um problema no FIND FIRST tt-erro, que tinha um NO-ERROR, mas não sei porque ele não estava sendo considerado no comando. Alterei o FIND FIRST por FOR EACH LEAVE e funcionou, parou de dar o erro.

    Vai entender o progress de vez em quando...

    Obrigada pela ajuda.

Compartilhe esta Página