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'.
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
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.