Buscar a última entrada de um produto via AdvPL

Você já precisou buscar as informações da última entrada de um produto via AdvPL? Veja como no artigo de hoje.

A ideia é receber um código de produto via parâmetro, e com isso buscar as informações da última entrada registrada na SD1.

 

Foi criado então uma função genérica com esse propósito, que retorna os conteúdos de Valor, Quantidade, Data e Fornecedor.

 

Abaixo o exemplo da função desenvolvida:

#include "Totvs.ch"
#include "TopConn.ch"

/*/{Protheus.doc} zUltCom
    Função que retorna um array com informações da ultima compra do produto
    @type user function
    @author Reies (vinicius@atiliosistemas.com)
    @since 04/03/2026
    @version 1.0
    @param cCodEmp, Character, Código da empresa, se vazio, utiliza a empresa logada
    @param cCodFil, Character, Código da filial, se vazio, utiliza a filial logada
    @param cCodPro, Character, Código do produto, se vazio, não filtra por produto
    @param cCodFor, Character, Código do fornecedor, se vazio, não filtra por fornecedor (nem loja)
    @param cLojaFor, Character, Código da loja, só filtra se vier código do fornecedor
    @return aInfos, Array, Informações da ultima compra do produto
    @example 
        zUltCom(Empresa, Filial, Produto, Fornecedor, Loja)
/*/

User Function zUltCom(cCodEmp, cCodFil, cCodPro, cCodFor, cLojaFor)
	Local aArea     := FWGetArea()
	Local aInfos    := {}
	Local cQuery    := ""
    Default cCodEmp := cEmpAnt
    Default cCodFil := FWxFilial("SD1")
    Default cCodPro := ""
    Default cCodFor := ""
    Default cLojaFor := ""
    
	//Busca a ultima entrada do produto
	cQuery := " SELECT TOP 1 "                                         + CRLF
	cQuery += "     D1_VUNIT, "                                        + CRLF     
    cQuery += "     D1_QUANT,  "                                       + CRLF     
    cQuery += "     D1_DTDIGIT, "                                      + CRLF     
    cQuery += "     D1_FORNECE, "                                      + CRLF     
    cQuery += "     D1_LOJA "                                          + CRLF     
	cQuery += " FROM "                                                 + CRLF
    
    //Se tiver filtro de empresa, monta o Alias ta tabela
	If !Empty(cCodEmp)
		cQuery +=  "SD1" + Alltrim(cCodemp) + "0 as SD1 "              + CRLF

	//Se não, utiliza a tabela logada
    Else
		cQuery += RetSqlName("SD1")+" as SD1 "                         + CRLF
	EndIf	

	cQuery += " WHERE "                                                + CRLF
	cQuery += "         D1_FILIAL = '"+cCodFil+"'  "                   + CRLF
	
    //Se tiver fornecedor.
    If !Empty(cCodFor)
        cQuery += "     AND D1_FORNECE = '"+cCodFor+"'  "              + CRLF

        //Só vai filtrar loja, se tiver código do fornecedor e loja.
        If !Empty(cLojaFor)
            cQuery += "     AND D1_LOJA = '"+cLojaFor+"'  "              + CRLF
        EndIf
	EndIf

    //Se tiver código fo produto.
    If !Empty(cCodPro)
	    cQuery += "     AND D1_COD = '"+cCodPro+"'  "                  + CRLF
	EndIf

	cQuery += "     AND D1_TIPO NOT IN ('B', 'D')  "                   + CRLF
	cQuery += "     AND SD1.D_E_L_E_T_ = ' ' "                         + CRLF
	cQuery += " ORDER BY "                                             + CRLF 
    cQuery += "     D1_DTDIGIT DESC "                                  + CRLF

    //Execução da query
	TCQuery cQuery New Alias "QRY_ULTCOM"
    
    //Definição da coluna de data da ultima compra, como tipo data.
	TCSetField("QRY_ULTCOM","D1_DTDIGIT","D")
	
	//Se tiver dados, atualiza o retorno
	If ! QRY_ULTCOM->(Eof())

        //Preenche o array de retorno com as informações da ultima compra
		aAdd(aInfos, {;
            QRY_ULTCOM->D1_VUNIT, ;         //Valor unitário
            QRY_ULTCOM->D1_QUANT, ;         //Quantidade
            QRY_ULTCOM->D1_DTDIGIT, ;       //Data de digitação
            QRY_ULTCOM->D1_FORNECE, ;       //Código do fornecedor
            QRY_ULTCOM->D1_LOJA ;           //Código da loja
        })

	EndIf

    //Encerrando query
	QRY_ULTCOM->(DBCloseArea())

    //Encerrando área
	FWRestArea(aArea)
Return aInfos

Essa função foi gentilmente disponibilizada por Vinicius Reies ( LinkedIn ).

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação