Ponto de Entrada para alterar o número do Borderô
Exemplo da Rotina:
User Function F240BORD()
Exemplo 1- Filtrando de modo simples:
/* Bibliotecas */ #Include 'Protheus.ch' #Include 'TbiConn.ch' /*/{Protheus.doc} F240BORD Ponto de Entrada para alterar o número do Borderô conforme o Tipo de Pagamento do Título @author Caio César Henrique @since 29/05/2019 @version 1.0 @type function @example U_F240BORD() @obs No exemplo abaixo, caso o cliente selecione mais de uma forma de pagamento para um único borderô, seleciono todos os títulos gerados e crio novos borderôs separados por Forma de Pagamento. Esta ação é necessária, pois na hora da geração do arquivo SISPAG, o Protheus não efetua a quebra das Formas de Pagamento, causando rejeição do arquivo no banco. /*/ User Function F240BORD() /* Variáveis Locais */ Local aArea := GetArea() Local cBord := cNumBor Local cQuery := '' Local cAlias := GetNextAlias() Local lPrimeiro := .T. Local cModelo := '' Local aBord := {} Local cString := '' Local n := 0 /* Abre tabela de Borderô */ dbSelectArea("SEA") SEA->(dbSetOrder(1)) /* Query para busca dos títulos do Borderô */ cQuery := "SELECT EA_NUMBOR, EA_MODELO, R_E_C_N_O_ RECNO " cQuery += " FROM "+RetSqlName("SEA")+" SEA " cQuery += " WHERE EA_NUMBOR = '"+cNumBor+"' " cQuery += " AND EA_FILIAL = '"+xFilial("SEA")+"' " cQuery += " AND SEA.D_E_L_E_T_ = ' ' " cQuery += "ORDER BY EA_MODELO " dbUseArea( .T., "TOPCONN", TCGenQry(,,cQuery), (cAlias), .F., .T.) /* Pega o primeiro Modelo encontrado */ (cAlias)->(dbGoTop()) cModelo := (cAlias)->EA_MODELO (cAlias)->(dbGoTop()) /* Guarda para histórico e mensagem */ aAdd(aBord,cNumBor) /* Percorre todos os títulos encontrados */ Do While (cAlias)->(!Eof()) /* Descarta o primeiro Borderô localizado */ If lPrimeiro Do While (cAlias)->(!Eof()) .and. (cAlias)->EA_MODELO == cModelo (cAlias)->(dbSkip()) End Do lPrimeiro := .F. EndIf /* Se for final de arquivo após o Primeiro, sai do Looping */ If (cAlias)->(Eof()) Exit EndIf /* Pega o número do novo Modelo */ cModelo := (cAlias)->EA_MODELO /* Verifica numero do ultimo Bordero Gerado */ DbSelectArea("SX6") cBord := Soma1(Pad(GetMV("MV_NUMBORP"),Len(SEA->EA_NUMBOR)),Len(SEA->EA_NUMBOR)) While !MayIUseCode( "EA_NUMBOR"+SX6->X6_FIL+cBord) cBord := Soma1(cBord) EndDo /* Grava novo número do Borderô paga o Novo Modelo */ Do While (cAlias)->(!Eof()) .and. (cAlias)->EA_MODELO == cModelo SEA->(MSGOTO((cAlias)->RECNO)) If RecLock("SEA",.F.) SEA->EA_NUMBOR := cBord SEA->(MsUnlock()) EndIf (cAlias)->(dbSkip()) End Do /* Guarda para histórico e mensagem */ aAdd(aBord,cBord) /* Grava o numero do bordero atualizado Utilize sempre GetMv para posicionar o SX6. */ dbSelectArea("SX6") GetMv("MV_NUMBORP") /* Garante que o numero do bordero seja sempre superior ao numero anterior */ If SX6->X6_CONTEUD < cBord RecLock("SX6",.F.) SX6->X6_CONTEUD := cBord msUnlock() Endif End Do /* Monta mensagem com todos os Borderôs gerados */ If Len(aBord) > 0 For n := 1 To Len(aBord) cString += "Borderô: "+aBord[n]+" gerado com sucesso!"+Chr(13)+Chr(10) Next EndIf /* Exibe mensagem */ MsgInfo(cString) /* Restaura área de trabalho */ RestArea(aArea) Return ( Nil )
Observações:
– Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
– Se tiver sugestões de rotinas, pode entrar em contato;
– Função e documentação enviada por Caio Henrique;
Referências:
– TDN