Urgente UPC para FT2200 - campo dt-cancela

Discussão em 'EMS , HCM e Totvs 11' iniciado por Marcelo Goncalves, Julho 1, 2025.

  1. Marcelo Goncalves

    Marcelo Goncalves Membro Participativo

    Boa tarde pessoal!
    Estou criando uma upc para a FT2200 que deve fazer a busca na minha tabela específica para verificar se a data de entrega está preenchida. Caso esteja, retornar a mensagem dizendo que a nota fiscal não pode ser cancelada pois já foi entregue!
    Gostaria de fazer isso no leave do campo dt-cancela, só que não estou conseguindo ajustar da forma correta, pois ele passa batido pelo campo e não checa.
    Inclui um msg para verificar os eventos e objetos a cada campo, conforme vai passando, mas quando chega no campo dt-cancela, já é preenchida automaticamente com a data do dia e no leave desse campo não faz nada!
    Como é uma tela do produto padrão, verifiquei que ela já possui a execução da piCliData no leave dos campos série e nr-nota-fisc.
    Segue abaixo o código da minha upc. Se alguém puder me dar um help, agradeço muito!

    /*============================================================================*/
    /* Programa: ft2200-upc01.p */
    /* Objetivo: Verifica se a nota já possui data de entrega na tabela */
    /* os-canhoto-nf ao sair dos campos nr-nota-fis ou dt-cancela. */
    /* */
    /* Autor: Marcelo Goncalves */
    /* Data : 30/06/2025 */
    /*============================================================================*/

    {utp/ut-glob.i}

    /* Parâmetros padrão de entrada da UPC */
    DEFINE INPUT PARAMETER p-ind-event AS CHAR NO-UNDO.
    DEFINE INPUT PARAMETER p-ind-object AS CHAR NO-UNDO.
    DEFINE INPUT PARAMETER p-wgh-object AS HANDLE NO-UNDO.
    DEFINE INPUT PARAMETER p-wgh-frame AS WIDGET-HANDLE NO-UNDO.
    DEFINE INPUT PARAMETER p-cod-table AS CHAR NO-UNDO.
    DEFINE INPUT PARAMETER p-row-table AS ROWID NO-UNDO.

    DEF VAR buffer-nota AS HANDLE NO-UNDO.

    MESSAGE
    "EVENTO: " p-ind-event SKIP
    "OBJETO: " p-ind-object SKIP
    "TABELA: " p-cod-table SKIP
    "CAMPO: " (IF VALID-HANDLE(p-wgh-object) THEN p-wgh-object:NAME ELSE "N/D")
    VIEW-AS ALERT-BOX INFO TITLE "UPC Ativa".

    /* Só executa no LEAVE dos campos específicos da tt-nota-fiscal */
    IF p-ind-event = "LEAVE"
    AND p-ind-object = "VIEWER"
    AND p-cod-table = "tt-nota-fiscal"
    AND VALID-HANDLE(p-wgh-object)
    AND (p-wgh-object:NAME = "dt-cancela")
    THEN DO:

    /* Cria e prepara o buffer dinâmico para a tt-nota-fiscal */
    CREATE BUFFER buffer-nota FOR TABLE "tt-nota-fiscal".

    IF NOT buffer-nota:AVAILABLE THEN
    buffer-nota:FIND-BY-ROWID(p-row-table) NO-ERROR.

    IF NOT buffer-nota:AVAILABLE THEN DO:
    DELETE OBJECT buffer-nota.
    RETURN.
    END.

    DEF VAR c-cod-estabel AS CHAR NO-UNDO.
    DEF VAR c-nr-nota-fis AS CHAR NO-UNDO.
    DEF VAR c-serie AS CHAR NO-UNDO.

    ASSIGN
    c-cod-estabel = buffer-nota:BUFFER-FIELD("cod-estabel"):BUFFER-VALUE
    c-nr-nota-fis = buffer-nota:BUFFER-FIELD("nr-nota-fis"):BUFFER-VALUE
    c-serie = buffer-nota:BUFFER-FIELD("serie"):BUFFER-VALUE.

    FIND FIRST os-canhoto-nf NO-LOCK
    WHERE os-canhoto-nf.cod-estabel = c-cod-estabel
    AND os-canhoto-nf.nr-nota-fis = c-nr-nota-fis
    AND os-canhoto-nf.serie = c-serie
    AND os-canhoto-nf.dt-entrega-nf <> ?
    NO-ERROR.

    IF AVAILABLE os-canhoto-nf THEN DO:
    RUN utp/ut-msgs.p (
    'show',
    17006,
    "Nota fiscal " + c-nr-nota-fis + " / Série " + c-serie +
    " já possui data de entrega registrada: " +
    STRING(os-canhoto-nf.dt-entrega-nf, "99/99/9999")).
    END.

    DELETE OBJECT buffer-nota.
    END.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Primeiro tu precisa checar se existe esse evento de LEAVE, está entrando no IF??
  3. Marcelo Goncalves

    Marcelo Goncalves Membro Participativo

    Não entra no IF! Não entendi! Essa msg é a primeira do código, ocorre no leave do campo nr-nota-fis. O próximo campo é o dt-cancela e não exibe a msg com os eventos!
    upload_2025-7-1_15-19-7.png
    Vale lembrar que nessa tela do produto padrão, no leave da nr-nota-fis é executada a piCliData.
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Então, como não existe evento LEAVE para o campo, tu tem que atribuir um evento persistent de LEAVE no handle do campo que tu deseja.

    se não me falha a memória, em algum evento que só ocorra apenas uma vez, como INITIALIZE, tu pega o handle do campo e faz:

    ON LEAVE OF meuCampoHandle PERSISTENT RUN minhaPasta\estaMesmaUPC.p(INPUT "LEAVE",
    INPUT "nomeCampo",
    INPUT meuCampoHandle,
    INPUT meuCampoHandle:FRAME,
    INPUT "Sem Tabela",
    INPUT ?).

    tenta e avisa a gente aqui
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Se tu precisar, eu tenho uma procedure recursiva que passa por todos os handles dos objetos da tela pra tu pegar o handle de qualquer botão, campo, frame...

    Porque o certo não é usar variável global, pois dá erro se o usuário abre 2 programas iguais ao mesmo tempo, muito comum nos ambientes corporativos.
    Última edição: Julho 1, 2025
  6. Marcelo Goncalves

    Marcelo Goncalves Membro Participativo

    Não entra no IF! Não entendi! Essa msg é a primeira do código, ocorre no leave do campo nr-nota-fis. O próximo campo é o dt-cancela e não exibe a msg com os eventos!
    Ver anexo 2495
    Vale lembrar que nessa tela do produto padrão, no leave da nr-nota-fis é executada a piCliData.
    legal, consegue me enviar? Essa tela do produto padrão normalmente não tem mesmo, por isso tô sofrendo pra poder implementar isso! rsrs
    Obrigado!

Compartilhe esta Página