No programa que eu fiz gostaria que quando o mesmo item estivesse em mais de 1 lote que ficasse conforme exemplo abaixo: SEQ.| CODIGO | Quantidade - Lote | DESCRICAO | 010 | 50-6540-1000 | 48,0000 - inicial | 6540 10 TEE UNIAO PARA TUBO 10MM | 270,0000 - teste lote e Esta saindo na OP conforme abaixo o mesmo item esta saindo conforme a quantidade de lotes que este item contempla onde se eu tiver 5 lotes para o item sairá o mesmo item 5 vezes: SEQ.| CODIGO | Quantidade - Lote | DESCRICAO | 010 | 50-6540-1000 | 48,0000 - inicial | 6540 10 TEE UNIAO PARA TUBO 10MM 020 | 50-6540-1000 | 270,0000 - teste lote | 6540 10 TEE UNIAO PARA TUBO 10MM | Alguém poderia me ajudar? Segue abaixo o código do meu programa /*include de controle de versÆo*/ {include/i-prgvrs.i Camozzi-rp 1.00.00.000} /* pr‚processador para ativar ou nÆo a sa¡da para RTF &GLOBAL-DEFINE RTF YES*/ /* pr‚processador para setar o tamanho da p gina */ &SCOPED-DEFINE pagesize 999999999 /* defini‡Æo das temp-tables para recebimento de parƒmetros */ define temp-table tt-param no-undo field destino as integer field arquivo as char format "x(35)" field usuario as char format "x(12)" field data-exec as date field hora-exec as integer field modelo-rtf as char format "x(35)" field l-habilitaRtf as LOG FIELD planejador-ini AS CHAR FIELD planejador-fim AS CHAR FIELD nr-ord-ini AS INT FIELD nr-ord-fim AS INT FIELD nr-linha-ini AS INT FIELD nr-linha-fim AS INT. DEF TEMP-TABLE tt-digita LIKE ord-prod FIELD imprimir AS LOGICAL. DEFINE TEMP-TABLE tt-raw-digita NO-UNDO FIELD raw-digita AS RAW. /* recebimento de parƒmetros */ DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO. DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita. /* DEFINE INPUT PARAMETER TABLE FOR tt-digita. */ CREATE tt-param. RAW-TRANSFER raw-param TO tt-param. FOR EACH tt-raw-digita: CREATE tt-digita. RAW-TRANSFER tt-raw-digita.raw-digita TO tt-digita. END. /* include padrÆo para vari veis de relat¢rio */ {include/i-rpvar.i} /* defini‡Æo de vari veis */ DEF VAR h-acomp AS HANDLE NO-UNDO. DEF VAR i-linha AS INT NO-UNDO. /*Vari veis do cabe‡alho*/ DEF VAR c-ord-prod-estado AS CHAR FORMAT "x(12)" NO-UNDO. DEF VAR c-ord-prod-item AS CHAR NO-UNDO. DEF VAR i-cont-pag AS INT NO-UNDO. /*Vari veis da parte1*/ DEF VAR i-linha-narrativa AS INT NO-UNDO. DEF VAR i-linha-processo AS INT NO-UNDO. DEF VAR d-tot-tempo-homem LIKE oper-ord.tempo-maquin NO-UNDO. DEF VAR d-tot-tempo-setup LIKE oper-ord.tempo-maquin NO-UNDO. DEF VAR d-tot-tempo-maq LIKE oper-ord.tempo-maquin NO-UNDO. /*Defini‡Æo de temp-table p g1*/ DEF TEMP-TABLE tt-narrativa NO-UNDO FIELD narrativa AS CHAR FORMAT "x(140)". /*Vari veis da part2*/ DEF VAR i-cont-componente AS INT FORMAT "999" NO-UNDO. DEF VAR l-parte2 AS LOGICAL INITIAL NO NO-UNDO. /*Vari veis do processo p g1*/ DEF VAR c-tempo-med AS CHAR FORMAT "x(8)" NO-UNDO. /*Defini‡Æo de buffer's*/ DEF BUFFER b-oper-ord FOR oper-ord. DEF BUFFER b-oper-ord2 FOR oper-ord. DEF BUFFER b-item FOR ITEM. DEF BUFFER b-item2 FOR ITEM. /* include padrÆo para output de relat¢rios */ {include/i-rpout.i &STREAM="stream str-rp"} /* include com a defini‡Æo da frame de cabe‡alho e rodap‚ */ {include/i-rpcab.i &STREAM="str-rp"} /*include para quebrar de linhas*/ {include/tt-edit.i} {include/pi-edit.i} /* executando de forma persistente o utilit rio de acompanhamento */ RUN utp/ut-acomp.p PERSISTENT SET h-acomp. {utp/ut-liter.i Imprimindo *} RUN pi-inicializar IN h-acomp (INPUT RETURN-VALUE). /* bloco principal do programa */ /* ASSIGN c-programa = "" */ /* c-versao = "" */ /* c-revisao = "" */ /* c-empresa = "CAMOZZI DO BRAZIL" */ /* c-sistema = "" */ /* c-titulo-relat = "". */ /* VIEW STREAM str-rp FRAME f-cabec. */ FOR EACH tt-digita WHERE tt-digita.imprimir = YES BREAK BY tt-digita.nr-ord-prod: RUN pi-acompanhar IN h-acomp(INPUT "Nr. Ordem " + STRING(tt-digita.nr-ord-prod)). /*Encontra a ordem de produ‡Æo e "desflega" a emissÆo requisitante e ordem*/ FIND FIRST ord-prod EXCLUSIVE-LOCK WHERE ord-prod.nr-ord-prod = tt-digita.nr-ord-prod NO-ERROR. IF AVAIL ord-prod THEN DO: ASSIGN ord-prod.emite-requis = NO ord-prod.emite-ordem = NO. END. /*Zerando variav‚is*/ ASSIGN c-ord-prod-estado = "" c-ord-prod-item = "" i-linha-narrativa = 0 i-linha-processo = 0 i-cont-componente = 0 i-cont-pag = 0 i-linha = 0 d-tot-tempo-homem = 0 d-tot-tempo-setup = 0 d-tot-tempo-maq = 0. EMPTY TEMP-TABLE tt-editor. /*Chamada de procedure para constru‡Æo do cabe‡alho*/ RUN pi-cabec-pag. /*ImpressÆo da Narrativa*/ RUN pi-print-editor(INPUT tt-digita.narrativa, INPUT 140). FOR EACH tt-editor: CREATE tt-narrativa. ASSIGN tt-narrativa.narrativa = tt-editor.conteudo. END. PUT STREAM str-rp "Narrativa ordem" AT 62 SKIP. FOR EACH tt-narrativa: PUT STREAM str-rp tt-narrativa.narrativa AT 3. ASSIGN i-linha-narrativa = i-linha-narrativa + 1. IF i-linha-narrativa = 3 THEN LEAVE. END. PUT STREAM str-rp SKIP(3 - i-linha-narrativa) FILL("-",150) AT 1 FORMAT "x(150)". ASSIGN i-linha = i-linha + 5. EMPTY TEMP-TABLE tt-narrativa. /*ImpressÆo do Processo, parte1*/ RUN pi-cab-processo. FIND FIRST b-oper-ord NO-LOCK WHERE b-oper-ord.nr-ord-prod = tt-digita.nr-ord-prod NO-ERROR. IF AVAIL b-oper-ord THEN DO: /*Dados da Opera‡Æo*/ FOR EACH b-oper-ord2 NO-LOCK WHERE b-oper-ord2.nr-ord-prod = b-oper-ord.nr-ord-prod BREAK BY(b-oper-ord2.nr-ord-prod) BY(b-oper-ord2.sequencia): FIND FIRST gm-estab no-lock WHERE gm-estab.gm-codigo = b-oper-ord2.gm-codigo NO-ERROR. /*Verica‡Æo de unidade de medida de tempo*/ IF b-oper-ord2.un-med-tempo = 1 THEN ASSIGN c-tempo-med = "Horas". IF b-oper-ord2.un-med-tempo = 2 THEN ASSIGN c-tempo-med = "Minutos". IF b-oper-ord2.un-med-tempo = 3 THEN ASSIGN c-tempo-med = "Segundos". IF b-oper-ord2.un-med-tempo = 4 THEN ASSIGN c-tempo-med = "Dias". /*ImpressÆo dos processos*/ /*Verifica se nÆo falta linha para impressÆo, se faltar sÆo puladas linhas para a pagina seguinte e impresso cabe‡alhos*/ IF i-linha + 3 > 64 THEN DO: PUT STREAM str-rp SKIP(64 - i-linha). ASSIGN i-linha = 0. /*Chamada de procedure para constru‡Æo do cabe‡alho*/ RUN pi-cabec-pag. /*ImpressÆo do Processo*/ RUN pi-cab-processo. END. /*Valor total do tempo utilizado*/ ASSIGN d-tot-tempo-homem = d-tot-tempo-homem + b-oper-ord2.tempo-homem d-tot-tempo-setup = d-tot-tempo-setup + b-oper-ord2.tempo-prepar d-tot-tempo-maq = d-tot-tempo-maq + b-oper-ord2.tempo-maquin. PUT STREAM str-rp b-oper-ord2.op-codigo AT 1 "|" b-oper-ord2.gm-codigo AT 8 "|" gm-estab.cc-codigo AT 18 "|" b-oper-ord2.fi-codigo AT 29 "|" c-tempo-med AT 38 "|" AT 46 b-oper-ord2.tempo-homem AT 48 "|" AT 59 b-oper-ord2.tempo-prepar AT 60 "|" AT 71 b-oper-ord2.tempo-maquin AT 72 "|" AT 83 "|" AT 103 "|" AT 125 "|" AT 150 SKIP b-oper-ord2.descricao AT 1 "|" AT 150 SKIP FILL("-",150) AT 1 FORMAT "x(150)". ASSIGN i-linha = i-linha + 3. /*ImpressÆo de totais do Processo*/ IF LAST-OF(b-oper-ord2.nr-ord-prod) THEN DO: PUT STREAM str-rp "Totais: " AT 38 "|" AT 46 d-tot-tempo-homem AT 48 "|" AT 59 d-tot-tempo-setup AT 60 "|" AT 71 d-tot-tempo-maq AT 72 "|" AT 83 "|" AT 103 "|" AT 125 "|" AT 150 FILL("-",150) AT 1 FORMAT "x(150)". ASSIGN i-linha = i-linha + 2. END. END. /*ImpressÆo de Processo*/ IF i-linha + 14 > 64 THEN DO: /*Pulo de linhas para ser impresso a segunda parte do relat¢rio*/ PUT STREAM str-rp SKIP(64 - i-linha). ASSIGN i-linha = 0. /*Chamada de procedure para constru‡Æo do cabe‡alho*/ RUN pi-cabec-pag. /*Chamada de procedure para constru‡Æo de cabe‡ado dos componentes*/ RUN pi-cabec-componentes. ASSIGN l-parte2 = YES. END. END. ELSE DO: /*O cliente pediu para que seja impresso direto os componetes sem pular linhas ou for‡ar quebras de p gina*/ /* /*Caso nÆo exista opera‡äes para o item*/ */ /* PUT STREAM str-rp SKIP(64 - INT(i-linha MODULO 64 ) ). */ /* ASSIGN i-linha = i-linha + ((i-cont-pag * 64) - i-linha). */ END. /*Caso o cabe‡alho de p gina parte 2 j fora impressa esse nÆo permitir que o processo se repita*/ IF l-parte2 = NO THEN DO: /*Chamada de procedure para constru‡Æo de cabe‡ado dos componentes*/ RUN pi-cabec-componentes. END. /*Carrega os componentes, parte2*/ FOR EACH reservas WHERE reservas.nr-ord-prod = tt-digita.nr-ord-prod, each aloca-reserva where aloca-reserva.nr-ord-produ = reservas.nr-ord-produ and aloca-reserva.item-pai = reservas.item-pai and aloca-reserva.cod-roteiro = reservas.cod-roteiro and aloca-reserva.op-codigo = reservas.op-codigo and aloca-reserva.it-codigo = reservas.it-codigo and aloca-reserva.cod-refer = reservas.cod-refe: ASSIGN i-cont-componente = i-cont-componente + 10. FIND ITEM NO-LOCK WHERE ITEM.it-codigo = reservas.it-codigo. IF i-linha + 3 > 64 THEN DO: PUT STREAM str-rp SKIP(64 - i-linha). ASSIGN i-linha = 0. /*Chamada de procedure para constru‡Æo do cabe‡alho*/ RUN pi-cabec-pag. /*Chamada de procedure para constru‡Æo de cabe‡ado dos componentes*/ RUN pi-cabec-componentes. END. PUT STREAM str-rp i-cont-componente AT 1 "|" AT 5 ITEM.it-codigo AT 7 "|" AT 67 reservas.cod-localiz AT 68 " - " reservas.cod-depos AT 81 "|" AT 85 reservas.un AT 86 "|" AT 89 reservas.quant-orig AT 90 "|" AT 105 reservas.quant-atend AT 106 "|" AT 121 "|" AT 150 SKIP "|" AT 5 ITEM.desc-item AT 7 "|" AT 67 "|" AT 85 "|" AT 89 "|" AT 105 "|" AT 121 "|" AT 150 FILL("-",150) AT 1 FORMAT "x(150)". ASSIGN i-linha = i-linha + 3. END. /*Verifica se o rodap‚ nÆo ser cortado, se cortar sÆo "puladas" as linhas necess rias e imprime o cabe‡alho*/ IF i-linha + 10 > 64 THEN DO: PUT STREAM str-rp SKIP(64 - i-linha). ASSIGN i-linha = 0. /*Chamada de procedure para constru‡Æo do cabe‡alho*/ RUN pi-cabec-pag. END. /*ImpressÆo do Rodap‚*/ PUT STREAM str-rp "|" AT 150 SKIP "|" AT 150 SKIP "Materiais entreg. por: ____________________________________ " AT 1 "Data _____/_____/_____" AT 63 "Hora: ______ : ______" AT 90 "|" AT 150 SKIP FILL("-",150) AT 1 FORMAT "x(150)" "|" AT 150 SKIP "Observacao:" AT 1 FILL("_",138) AT 12 FORMAT "x(138)" "|" AT 150 SKIP "|" AT 150 SKIP FILL("_",149) AT 1 FORMAT "x(149)" "|" AT 150 SKIP "|" AT 150 SKIP FILL("_",149) AT 1 FORMAT "x(149)" "|" AT 150 SKIP(1). ASSIGN i-linha = i-linha + 10. /*Verifica se a ImpressÆo de Controle de Qualidade nÆo ser cortada*/ IF i-linha + 12 > 64 THEN DO: PUT STREAM str-rp SKIP(64 - i-linha). ASSIGN i-linha = 0. /*Chamada de procedure para constru‡Æo do cabe‡alho*/ RUN pi-cabec-pag. END. PUT STREAM str-rp FILL("-",150) AT 1 FORMAT "x(150)" SKIP "Controle de Qualidade" AT 58 FILL("-",150) AT 1 FORMAT "x(150)" SKIP "Qtde aprovada: " AT 1 "Qtde rejeitada: " AT 35 "RNC: " AT 70 "|" AT 150 SKIP FILL("-",150) AT 1 FORMAT "x(150)" SKIP "Emissao" AT 28 "|" AT 75 "Reporte" AT 76 "|" AT 150 SKIP "|" AT 75 "|" AT 150 SKIP FILL("_",30) AT 1 FORMAT "x(30)" "_____/_____/_____" AT 34 "|" AT 75 FILL("_",30) AT 76 FORMAT "x(30)" "_____/_____/_____" AT 109 "|" AT 150 SKIP "Responsavel" AT 1 "Data" AT 34 "|" AT 75 "Responsavel" AT 76 "Data" AT 109 "|" AT 150 SKIP FILL("-",150) AT 1 FORMAT "x(150)" . /*Realiza o Pulo da linhas necess rias para impressÆo de um novo relat¢rio*/ ASSIGN i-linha = i-linha + 10. PUT STREAM str-rp SKIP(64 - i-linha). END. /*Procedure para cria‡Æo do cabe‡alho do relat¢rio*/ PROCEDURE pi-cabec-pag: /*Defini‡Æo do cabe‡alho*/ PUT STREAM str-rp "CAMOZZI DO BRAZIL" AT 65 SKIP FILL("-",150) AT 1 FORMAT "x(150)". /*Busca do item para utilizar a descri‡Æo*/ FIND FIRST b-item2 NO-LOCK WHERE b-item2.it-codigo = tt-digita.it-codigo NO-ERROR. ASSIGN c-ord-prod-item = b-item2.it-codigo + " - " + b-item2.desc-item. /*Carrega o estado da ordem*/ IF tt-digita.estado = 1 THEN ASSIGN c-ord-prod-estado = "Nao iniciada". IF tt-digita.estado = 2 THEN ASSIGN c-ord-prod-estado = "Liberada". IF tt-digita.estado = 3 THEN ASSIGN c-ord-prod-estado = "Alocada". IF tt-digita.estado = 4 THEN ASSIGN c-ord-prod-estado = "Separada". IF tt-digita.estado = 5 THEN ASSIGN c-ord-prod-estado = "Requisitada". IF tt-digita.estado = 6 THEN ASSIGN c-ord-prod-estado = "Iniciada". IF tt-digita.estado = 7 THEN ASSIGN c-ord-prod-estado = "Finalizada". IF tt-digita.estado = 8 THEN ASSIGN c-ord-prod-estado = "Terminada". ASSIGN i-cont-pag = i-cont-pag + 1 /*Contador de p gina*/ i-linha = i-linha + 7. /*Contador de linhas*/ /*ImpressÆo do cabe‡alho - pag1*/ PUT STREAM str-rp "ORDEM DE PRODUCAO" AT 1 "Pagina: " AT 120 STRING(i-cont-pag) AT 130 SKIP "Numero de OP:" AT 1 tt-digita.nr-ord-prod AT 14 "Emissao: " AT 45 TODAY AT 54 STRING(TIME, "HH:MM") AT 64 "Data Termino:" AT 80 STRING(tt-digita.dt-termino, "99/99/99") AT 94 SKIP "Situacao:" AT 1 c-ord-prod-estado AT 11 SKIP "Material:" AT 1 c-ord-prod-item AT 11 FORMAT "x(50)" "Linha de Producao:" AT 66 tt-digita.nr-linha AT 84 "Quantidade :" AT 110 tt-digita.qt-ordem AT 125 SKIP FILL("-",150) AT 1 FORMAT "x(150)". END. /*ImpressÆo do cabe‡alho de processo*/ PROCEDURE pi-cab-processo: PUT STREAM str-rp "PROCESSO" AT 65 SKIP FILL("-",150) AT 1 FORMAT "x(150)". PUT STREAM str-rp "Oper." AT 1 "|" "Grupo Maq." AT 7 "|" "C.Custo" AT 19 "|" "Fch mtd" AT 27 "|" "Un. Med." AT 37 "|" AT 46 "Tempo previsto" AT 57 "|" AT 83 "Tempo realizado" AT 97 "|" AT 125 "|" AT 150 SKIP "Descricao" AT 1 "|" AT 46 "Homem" AT 50 "|" AT 59 "Setup" AT 63 "|" AT 71 "Maquina" AT 74 "|" AT 83 "Inicio" AT 90 "|" AT 103 "Fim" AT 112 "|" AT 125 "Executor" AT 134 "|" AT 150 . PUT STREAM str-rp FILL("-",150) AT 1 FORMAT "x(150)". ASSIGN i-linha = i-linha + 5. /*Contador de linhas*/ END. /*ImpressÆo dos componentes p g2*/ PROCEDURE pi-cabec-componentes: PUT STREAM str-rp "COMPONENTES / MATERIAS-PRIMAS" AT 52 SKIP FILL("-",150) AT 1 FORMAT "x(150)" SKIP "SEQ." AT 1 "|" AT 5 "CODIGO" AT 7 "|" AT 67 "LOC.Fisica - Dep" AT 68 "|" AT 85 "Un" AT 86 "|" AT 89 "Qtde req." AT 93 "|" AT 105 "Qtde atend." AT 108 "|" AT 121 "Lote" AT 133 "|" AT 150 SKIP "|" AT 5 "DESCRICAO" AT 7 "|" AT 67 "|" AT 85 "|" AT 89 "|" AT 105 "|" AT 121 "|" AT 150 SKIP FILL("-",150) AT 1 FORMAT "x(150)". ASSIGN i-linha = i-linha + 5. /*Contador de linhas*/ END. /*fechamento do output do relat«rio*/ {include/i-rpclo.i &STREAM="stream str-rp"} RUN pi-finalizar IN h-acomp. RETURN "OK":U.