Listar a última saída do item

79 views
Skip to first unread message

Marcelo Faria

unread,
Feb 15, 2019, 4:51:47 AM2/15/19
to progre...@googlegroups.com
Oi pessoal,
Bom dia!

Como estou me arriscando nos meus primeiros passos em Progress e precisava de um relatório simples que me exibisse a última saída de cada item, então escrevi o seguinte programa:

OUTPUT TO "C:\TEMP\ULTIMA-SAIDA-ITEM.csv" NO-CONVERT.
EXPORT DELIMITER ";".

FOR EACH item NO-LOCK:
            FIND LAST movto-estoq WHERE movto-estoq.it-codigo = item.it-codigo AND (movto-estoq.dt-trans >= 01/01/2006 AND movto-estoq.dt-trans <= 12/31/2017) NO-LOCK NO-ERROR.
            IF AVAILABLE movto-estoq THEN
                DO:
                    EXPORT  DELIMITER ";"
                            item.it-codigo
                            item.descricao-1
                            item.descricao-2
                            movto-estoq.it-codigo
                            movto-estoq.tipo-trans
                            movto-estoq.quantidade
                            movto-estoq.serie-docto
                            movto-estoq.dt-trans
                            movto-estoq.valor-mat-m
                            movto-estoq.valor-ggf-m
                            movto-estoq.valor-mob-m.
                END.
END.

OUTPUT CLOSE.

Gostaria se possível que vocês avaliassem se está correto e se realmente "peguei" a informação que eu precisava.

Valeu galera.

--

Marcelo Claudio Faria
Campinas-SP
(19) 99308-5660

Marcelo Faria

unread,
Feb 15, 2019, 5:12:45 AM2/15/19
to progre...@googlegroups.com
Pessoal,
Fiz algumas correções e melhorias e quando chequei com mais calma o resultado, vi que ele está gerando colunas além do que foi solicitado (planilha anexa):
OUTPUT TO "C:\TEMP\ULTIMA-SAIDA-ITEM.csv" NO-CONVERT.
EXPORT DELIMITER ";" "Código" "Desc-1" "Desc-2" "Tipo Trans" "Qtde" "Série" "Data Trans" "Valor Material" "Valor GGF" "Valor MOB".

FOR EACH item NO-LOCK:
            FIND LAST movto-estoq WHERE movto-estoq.it-codigo = item.it-codigo AND (movto-estoq.dt-trans >= 01/01/2006 AND movto-estoq.dt-trans <= 12/31/2017) NO-LOCK NO-ERROR.
            IF AVAILABLE movto-estoq THEN
                DO:
                    EXPORT  DELIMITER ";"
                            item.it-codigo
                            item.descricao-1
                            item.descricao-2
                            movto-estoq.tipo-trans
                            movto-estoq.quantidade
                            movto-estoq.serie-docto
                            movto-estoq.dt-trans
                            movto-estoq.valor-mat-m
                            movto-estoq.valor-ggf-m
                            movto-estoq.valor-mob-m.
                END.

END.

OUTPUT CLOSE.

O que eu estou fazendo de errado?
 
ULTIMA-SAIDA-ITEM.csv

Marcelo Torres

unread,
Feb 15, 2019, 5:51:29 AM2/15/19
to progre...@googlegroups.com
Bom dia Marcelo.

Te peço licença para reescrever seu código. Segue minha sugestão:

OUTPUT TO "C:\TEMP\ULTIMA-SAIDA-ITEM.csv" CONVERT TARGET "ISO8859-1".
PUT UNFORMATTED
    "Código;Desc-1;Desc-2;Tipo Trans;Qtde;Série;Data Trans;Valor Material;Valor GGF;Valor MOB"
    SKIP.

FOR EACH ITEM NO-LOCK,
    LAST movto-estoq OF ITEM
    WHERE movto-estoq.dt-trans >= 01/01/2006 AND
          movto-estoq.dt-trans <= 12/31/2017
    USE-INDEX data-item
    NO-LOCK:

    PUT UNFORMATTED
        ITEM.it-codigo          ";"
        ITEM.descricao-1        ";"
        ITEM.descricao-2        ";"
        movto-estoq.tipo-trans  ";"
        movto-estoq.quantidade  ";"
        movto-estoq.serie-docto ";"
        movto-estoq.dt-trans    ";"
        movto-estoq.valor-mat-m ";"
        movto-estoq.valor-ggf-m ";"
        movto-estoq.valor-mob-m
        SKIP.
END.

OUTPUT CLOSE.


Algumas considerações:
Para pegar a última movimentação tem de usar o índice com a data de transação na tabela "movto-estoq".

Prefiro trabalhar com PUT do que EXPORT (questão pessoal mesmo, mania de programador).

Vi que colocou os campos descricao-1 e descricao-2. Poderia usar o campo "desc-item" que contém os dois concatenados. Mas vai da sua necessidade.

Você estava usando o "NO-CONVERT", mas eu forcei uma página de código para garantir os acentos (mais uma mania que tenho).


É isto.

Precisando, estamos aqui!


Abraço,
Marcelo Torres


--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progress_4gl...@googlegroups.com.
Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.

Marcelo Faria

unread,
Feb 16, 2019, 8:20:45 AM2/16/19
to progre...@googlegroups.com
Marcelo,
Cara, que legal. Aprendi muito agora. Suas dicas foram fantásticas.
Só um detalhe.
Tenho que rodar esta coleta desde 2006. Tem algum índice que possa me ajudar a acelerar o processo?

Marcelo Torres

unread,
Feb 18, 2019, 6:22:21 AM2/18/19
to progre...@googlegroups.com
Bom dia!

Desculpe a demora, fim de semana normalmente sou abduzido (sempre me devolvem no domingo a noite pra eu vir trabalhar na segunda cedo, eita luta).

Mas, respondendo a sua pergunta: Sim! Tem uma forma de fazer a coisa andar mais rápido um pouquinho. Te peço para comparar a velocidade com períodos pequenos e decidir qual é a melhor alternativa.

DEFINE VARIABLE dt-data AS DATE FORMAT "99/99/9999" NO-UNDO.
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.

RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
RUN pi-inicializar IN h-acomp (INPUT "Processando").

OUTPUT TO "C:\TEMP\ULTIMA-SAIDA-ITEM.csv" CONVERT TARGET "ISO8859-1".
PUT UNFORMATTED
    "Código;Desc-1;Desc-2;Tipo Trans;Qtde;Série;Data Trans;Valor Material;Valor GGF;Valor MOB"
    SKIP.

FOR EACH ITEM
    NO-LOCK:
        
    DO dt-data = DATE("01/01/2006") TO DATE("31/12/2017"):
        RUN pi-acompanhar IN h-acomp (INPUT "Item " + ITEM.it-codigo +
                                            " - Data " + STRING(dt-data, "99/99/9999").
        
        FIND LAST movto-estoq
            WHERE movto-estoq.dt-trans  = dt-data AND
                  movto-estoq.it-codigo = ITEM.it-codigo
            USE-INDEX data-item
            NO-LOCK NO-ERROR.
        
        IF AVAIL movto-estoq THEN DO:
            PUT UNFORMATTED
                ITEM.it-codigo          ";"
                ITEM.descricao-1        ";"
                ITEM.descricao-2        ";"
                movto-estoq.tipo-trans  ";"
                movto-estoq.quantidade  ";"
                movto-estoq.serie-docto ";"
                movto-estoq.dt-trans    ";"
                movto-estoq.valor-mat-m ";"
                movto-estoq.valor-ggf-m ";"
                movto-estoq.valor-mob-m
                SKIP.
        END.
    END.
END.

OUTPUT CLOSE.

RUN pi-finalizar IN h-acomp.




Considerações:
O índice da tabela "movto-estoq" é data e item. Então estou forçando a utilização deste índice na íntegra. Como estou usando o índice, um FIND acontece bem rápido.

Com isto eu faço um loop da data inicial até a data final e busco registro a registro na tabela "movto-estoq".

Coloquei uma janela de acompanhamento. Você pode colocar no código anterior que fiz para que possa comparar a velocidade que ele passa de um item para outro. Pode colocar também um display de tempo decorrido (pesquise sobre ETIME). É uma boa forma de testar o tempo entre um código e outro.

Qualquer coisa é só gritar.


Att,
Marcelo Torres













Marcelo Torres

unread,
Feb 18, 2019, 6:33:39 AM2/18/19
to progre...@googlegroups.com
Tem um erro no código!

A linha que começa com "OUTPUT TO" deve ser assim:

OUTPUT TO VALUE("C:\TEMP\ULTIMA-SAIDA-ITEM.csv") CONVERT TARGET "ISO8859-1".


Abraço,
Marcelo Torres

Marcelo Faria

unread,
Feb 20, 2019, 6:10:46 AM2/20/19
to progre...@googlegroups.com
Marcelo,
Mais uma vez, gostaria de te agradecer. Sua ajuda foi além da conta. Valeu pelo aprendizado e pelo resultado.

Grande abraço!!!!!!!

Marcelo Torres

unread,
Feb 20, 2019, 6:21:29 AM2/20/19
to progre...@googlegroups.com
Estou a disposição amigo!

Abraço,
Marcelo Torres

Marcelo Faria

unread,
Jan 22, 2020, 10:55:16 AM1/22/20
to progre...@googlegroups.com
Oi Marcelo, oi pessoal,
Boa tarde!

Voltando a este tópico antigo, novamente vou precisar de ajuda.
Quando gerei o relatório deste ano usando o código que você me passou, ele gerou o seguinte:

Codigo;Desc-1;Desc-2;Tipo Trans;Qtde;Serie;Data Trans;Valor Material;Valor GGF;Valor MOB
;DEBITO DIRETO;;2;1;UN;13/07/06;17,826,40;000;000
;DEBITO DIRETO;;2;0;UN;14/07/06;273,1100;000;000
;DEBITO DIRETO;;2;0;MOB;17/07/06;000;111,2100;000
;DEBITO DIRETO;;2;1;A;18/07/06;350126,370;000;000
;DEBITO DIRETO;;2;1;A;19/07/06;17563,720;000;000
;DEBITO DIRETO;;2;1;UN;20/07/06;279,8101,870;000;000
;DEBITO DIRETO;;2;1;A;21/07/06;800289,260;000;000
;DEBITO DIRETO;;2;1;UN;24/07/06;53,519,20;000;000
;
;

A formatação veio totalmente diferente.
O que está acontecendo? Fiz algo errado.
Eu anexei o programa gerado - que está exatamente igual a listagem acima.

Se alguém puder me ajudar, já agradeço.
ultima-saida-item-v3.p

Marcelo Torres

unread,
Jan 23, 2020, 7:23:25 AM1/23/20
to progre...@googlegroups.com
Bom dia Marcelo.

Onde está, exatamente, o problema? Eu pequei o código fonte que colocou na mensagem e dei uma olhada. Não vi nada demais.

O que não está saindo como você previu?


Abraço,
Marcelo Torres


Marcelo Faria

unread,
Jan 23, 2020, 7:35:42 AM1/23/20
to Progress - 4GL
Oi Marcelo,
Bom dia!

No arquivo final, saiu assim:
DEBITO DIRETO;;2;1;UN;13/07/06;17,826,40;000;000

Só que consultando no Datasul, o valor seria de R$ 17,82 e os valores sairam de forma muito estranha.
Não consegui achar uma lógica entre o valor que é exibido no programa e o valor que gerou no arquivo.
Será que fiz algo errado?
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.

--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.


--

Marcelo Claudio Faria
Campinas-SP
(19) 99308-5660

--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.

--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.


--

Marcelo Claudio Faria
Campinas-SP
(19) 99308-5660

--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.

--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Para publicar uma mensagem neste grupo, envie um email para progre...@googlegroups.com.
Visite este grupo em https://groups.google.com/group/progress_4gl.
Para mais opções, visite https://groups.google.com/d/optout.


--

Marcelo Claudio Faria
Campinas-SP
(19) 99308-5660

--
Recebeu esta mensagem porque subscreveu ao grupo "Progress - 4GL" do Grupos do Google.
Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progre...@googlegroups.com.

Marcelo Torres

unread,
Jan 23, 2020, 8:30:32 AM1/23/20
to progre...@googlegroups.com

Tem duas coisas.
A primeira é que o campo "valor-mat-m" tem um "extent" de 3. Então você tem de declarar qual valor você quer mostrar. Normalmente é o primeiro. Então seria "movto-estoq.valor-mat-m[1]" e a segunda é que você pode forçar o formato de saída do campo. Algo similar a:

PUT UNFORMATTED
    ...
    ...
    ...
    STRING(movto-estoq.valor-mat-m[1], ">>>>>>>>>9.9999") ";"
    ....
    ...
    SKIP.

Com relação ao "extent", o mesmo acontece para os campos "valor-ggf-m" e "valor-mob-m", que devem ser colocados com "valor-ggf-m[1]" e "valor-mob-m[1]".

Força o formato para os outros campos também).

Tenta aí e me conta o resultado.


Abraço,
Marcelo Torres







Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para progress_4gl...@googlegroups.com.
Para ver este debate na Web, visite https://groups.google.com/d/msgid/progress_4gl/dfaf291a-5b03-4508-8f66-d5a62bcd3433%40googlegroups.com.

Marcelo Faria

unread,
Jan 24, 2020, 8:41:24 PM1/24/20
to progre...@googlegroups.com
Cara!!! Mais uma vez um muito obrigado gigante!!!!
Valeu.
Saiu certinho.

Só uma perguntinha besta...o que são esses "extent"?

Marcelo Torres

unread,
Jan 27, 2020, 8:36:15 AM1/27/20
to progre...@googlegroups.com
Conhece o conceito de "array"? É um campo indexado.

Algumas tabelas do HCM usam muito isto. Vou dar um exemplo:
Suponhamos que você tenha um acumulador mensal.

Você poderia criar uma tabela com a estrutura:
- CHAVE (chave para encontrar o registro que quer, depende do seu contexto)
- ANO - INT - >>>9
- JAN - DECIMAL - >>>>>>>>9.99
- FEV - DECIMAL - >>>>>>>>9.99
- MAR - DECIMAL - >>>>>>>>9.99
- ABR - DECIMAL - >>>>>>>>9.99
- MAI - DECIMAL - >>>>>>>>9.99
- JUN - DECIMAL - >>>>>>>>9.99
- JUL - DECIMAL - >>>>>>>>9.99
- AGO - DECIMAL - >>>>>>>>9.99
- SET - DECIMAL - >>>>>>>>9.99
- OUT - DECIMAL - >>>>>>>>9.99
- NOV - DECIMAL - >>>>>>>>9.99
- DEZ - DECIMAL - >>>>>>>>9.99

Ou pode ter uma outra estrutura assim:
- CHAVE (chave para encontrar o registro que quer, depende do seu contexto)
- ANO - INT - >>>9
- MES - INT - >9
- VALOR - DECIMAL - >>>>>>>>9.99

Ou, usando o "extent", que seria assim:
- CHAVE (chave para encontrar o registro que quer, depende do seu contexto)
- ANO - INT - >>>9
- VALOR - EXTENT 12 - DECIMAL - >>>>>>>>9.99


Desta forma o campo "valor" é acessado assim:
VALOR[1]
VALOR[2]
VALOR[3]
VALOR[4]
VALOR[5]
VALOR[6]
VALOR[7]
VALOR[8]
VALOR[9]
VALOR[10]
VALOR[11]
VALOR[12]

É como se houvessem 12 campos "embutidos" em um só.

Como exemplo, veja a tabela "inform_dirf".

Se você buscar a estrutura dela vai ter o seguinte:

Table: inform_dirf

Field Name                  Data Type  Flg Format
--------------------------- ---------- --- --------------------------------
cdn_empresa                 char       im  x(3)
cdn_estab                   char       im  x(5)
num_ano_refer_inform_dirf   inte       im  9999
cdn_funcionario             inte       im  zzzzzzz9
idi_tip_inform_dirf         inte       im  99
qti_depend_irf              inte[12]       z9
val_deduc_depend_irf        deci-2[12]     zzz,zz9.99
val_deduc_palim_irf         deci-2[12]     zzz,zzz,zz9.99
val_deduc_inss_irf          deci-2[12]     zzz,zzz,zz9.99
val_deduc_previd_privad     deci-2[12]     >>>,>>>,>>9.99
val_base_brut_calc_irf      deci-2[12]     zzz,zzz,zz9.99
val_base_liq_irf            deci-2[12]     zzz,zzz,zz9.99
val_irf_retid               deci-2[12]     zzz,zzz,zz9.99
cdn_empres_centrdor         char           x(3)
cdn_estab_centrdor          char           x(5)
val_resto_previd_privad     deci-2[12]     >>>,>>>,>>9.99
cod_usuar_ult_atualiz       char           x(12)
dat_ult_atualiz             date           99/99/9999
hra_ult_atualiz             char           99:99:99
cod_livre_1                 char           x(100)
cod_livre_2                 char           x(100)
dat_livre_1                 date           99/99/9999
dat_livre_2                 date           99/99/9999
log_livre_1                 logi           Sim/Não
log_livre_2                 logi           Sim/Não
num_livre_1                 inte           >>>>>9
num_livre_2                 inte           >>>>>9
val_livre_1                 deci-4         zzz,zzz,zz9.9999
val_livre_2                 deci-4         zzz,zzz,zz9.9999
log_inic_atualiz_irf_ppr    logi[12]   m   Sim/Não
val_irf_depos_judic         deci-2[12]     zzz,zzz,zz9.99
idi_tip_gerac_dirf          inte           9



Veja que alguns campos tem o "[12]", indicando que o campo trata-se de um "extent".
Neste caso específico, é um índice para cada mês.

A chave primária desta tabela são os campos:
cdn_empresa
cdn_estab
cdn_funcionario
num_ano_refer_inform_dirf
idi_tip_inform_dirf

Com isto existe um único registro por ano, sendo que neste registro existem dados para todos os meses do referido ano.

Tem um exemplo no "help" do Progress que eu acho bem interessante para aprender.

EXTENT function
DEFINE VARIABLE int_value AS INTEGER NO-UNDO EXTENT 3 INITIAL [1, 2, 3].
DEFINE VARIABLE ix        AS INTEGER NO-UNDO .
DEFINE VARIABLE tot       AS INTEGER NO-UNDO LABEL "The total is".

DO ix = 1 TO EXTENT(int_value):
  tot = tot + int_value[ix].
END.

DISPLAY tot.


Precisando de algo mais a respeito, estou a disposição.


Abraço,
Marcelo Torres








Reply all
Reply to author
Forward
0 new messages