1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

first-of e last-of

Discussão em 'Progress 4GL' iniciado por reissobr, Agosto 26, 2014.

  1. reissobr

    reissobr Membro Participativo

    Pessoal,

    Estou utilizando um for each com break by(item.fm-codigo) e testando o first-of e last-of.

    Estou com um unico problema.
    Quando existe um unico item na familia, para o first-of o retorno é TRUE mas para o last-of o retorno é FALSE.

    O comportamento é este mesmo, ou existe alguma maneira de quando a quebra tiver somente um registro o retorno ser TRUE para o first-of e para o last-of ?

    Att;
    Russo.
  2. jaisonantoniazzi

    jaisonantoniazzi Membro Ativo

    Bom dia @reissobr tudo bom?
    Poderia compartilhar o teu código?
    Fiz o exemplo abaixo e o erro citado não ocorreu

    FOR EACH salesrep
    WHERE salesrep.salesrep = 'DOS' NO-LOCK
    BREAK BY salesrep.salesrep:

    DISP
    LAST-OF(salesrep.salesrep) COLUMN-LABEL 'LAST-OF?'
    FIRST-OF(salesrep.salesrep) COLUMN-LABEL 'FIRST-OF?'
    WITH STREAM-IO.

    END.


    LAST-OF? FIRST-OF?
    -------- ---------
    yes yes
  3. reissobr

    reissobr Membro Participativo

    Bom dia @jaisonantoniazzi

    O código está abaixo.
    Os comandos MESSAGE coloquei para acompanhar a execucao, e foi por ai que vi o que estava oocorrendo.

    DEF VAR w-ctd AS INTEGER.

    FOR EACH ITEM NO-LOCK USE-INDEX familia
    WHERE ITEM.compr-fabric = 2 BREAK BY item.fm-codigo:
    IF FIRST-OF(ITEM.fm-codigo)
    THEN DO:
    MESSAGE "first" fm-codigo.
    w-ctd = 1.
    NEXT.
    END.
    IF LAST-OF(ITEM.fm-codigo)
    THEN DO:
    MESSAGE "last" fm-codigo.
    w-ctd = w-ctd + 1.
    DISP item.fm-codigo w-ctd.
    NEXT.
    END.
    w-ctd = w-ctd + 1.
    END.
  4. reissobr

    reissobr Membro Participativo

    O que eu estou querendo é contar o numero de itens fabricados por familia.
    A ideia é o FIRST-OF colocar um no contador.
    No LAST-OFF somar mais um e dar um display do codigo da familia e total de itens.
    Nas outras situações, somar um no contador.
    Se a familia tiver mais de um item, funciona, mas quando tem somente um item nao.
  5. Eilleen

    Eilleen Membro Ativo

    Olá!
    O "problema" com seu código é o "NEXT"... Não é aconselhado usar NEXT em FOR EACH com BREAK-BY.
    Como o registro é único, entra no FIRST-OF e após a atribuição do valor o NEXT vai para o próximo registro, nem chegando a passar pelo LAST-OF.
    Acredito que somente tirando os NEXT do código já vai resolver.

    ;)
    Agnaldo, reissobr e jaisonantoniazzi curtiram isso.
  6. jaisonantoniazzi

    jaisonantoniazzi Membro Ativo

    Boa tarde @reissobr

    Veja se isso te ajuda.

    FOR EACH familia-mat NO-LOCK:

    DISP familia-mat.fm-codigo.

    FOR EACH ITEM NO-LOCK USE-INDEX familia
    WHERE ITEM.fm-codigo = familia-mat.fm-codigo:

    ACCUMULATE item.fm-codigo (COUNT).

    END.


    DISP ( ACCUM COUNT item.fm-codigo ) COLUMN-LABEL 'Acumulado'.

    END.


    Atenciosamente,
    Jaison Antoniazzi

Compartilhe esta Página