MSExecAuto
Objetivo
Fazer manuteno automtica (incluso, alterao e excluso) das rotinas de manipulao de dados do
sistema, automatizando o processo de entrada de dados sem a necessidade de desenvolver rotinas
especificas.
Aplicao
Esta tecnica aplicada em todas as verses Protheus.
Vantagens
1) Interface : Os dados de entrada so enviados a rotina em forma de campos e conteudos (array) e desta
forma no necessario a apresentao de nenhuma inteface ao usurio.
2) Segurana : A utilizao de rotinas automticas aumenta consideravelmente a segurana do sistema, uma
vez que utiliza as validaes padres e diminui os problemas causados por atualizao de verso ou incluso
de customizaes nas rotinas padres do sistema.
3) Agilidade no processo : Aumenta consideravemente o tempo de desenvolvimento das customizaes que
necessitam de entrada de dados. Exemplo: Importao de pedido de venda.
Procedimentos
Existem duas maneiras de utilizar a rotina automatica, sendo elas:
1. Sem Interface
2. Com Interface
Para a utilizacao da rotina automatica sem interface deve-se, configurar o ambiente utilizando-se o comando
PREPARE ENVIRONMENT e chamar diretamente o nome da funo.
Exemplo:
User Function IncProd()
Local aRotAuto := {}
TO 600, 900
O envio de e-mails pelo Protheus algo bem simples, desde que todas as informaes necessrias tenham
sida registradas nos parametros corretamente.
1) O usurio de ter o e-mail configurado na cadastro de usuarios (SIGACFG).
2) Configurar o parmetro MV_RELSERV com o endereo SMTP do servidor de e-mails da empresa
3) Na finalizao do atendimento informar a conta e a senha do usuario no servidor de e-mails.
Ex: Conta: admin@empresa.com.br
Senha: 1234
Segue abaixo uma funo bem simples para envio:
#include
#include
#include
#include
"protheus.ch"
"apwebsrv.ch"
"apwebex.ch"
"ap5mail.ch"
cServer
lAutentic
cAccount
:= getmv('MV_RELACNT') //conta
cPassword := getMV('MV_RELAPSW') //senha
cQL
:= CHR(13) + CHR(10)
cRemoteip
:=
Getclientip()
cRemoteComputer :=
GetComputerName()
lConectou := .f.
Result
Alguns colegas me perguntaram como se utiliza o mbrowse para mostrar o resultado de tabelas temporrias,
segue abaixo um exemplo, existem outras maneiras, mas este um bem simples.
#include "topconn.ch"
#include "protheus.ch"
User Function _fMBROWSE()
Local cArquivo
Local cQuery
Private cCadastro
Private aRotina
:= {}
Private _aArqTmp
:= {}
Private aTitulos
:= {}
Private aIndexQRY
:= {}
Private cPerg
:= 'REST002'
Private cDelFunc := ".F."
CriaSx1(cPerg)
cCadastro
Pergunte(cPerg,.T.)
AADD(aRotina,{"Imprimir Etiqueta","U_fResumo2(QRY->B1_COD)",0,6})
_aArqTmp:= {}
AADD(_aArqTmp,{"B1_CODMES"
,
"C",TamSx3("B1_CODMES")[1], 0})
AADD(_aArqTmp,{"B1_SUFIXO"
,
"C",TamSx3("B1_SUFIXO")[1], 0})
AADD(_aArqTmp,{"B1_COD"
,
"C",TamSx3("B1_COD")[1]
, 0})
AADD(_aArqTmp,{"B1_DESC"
,
"C",TamSx3("B1_DESC")[1] , 0})
AADD(aTitulos,{"Equivalente",
,"","C","",""})
AADD(aTitulos,{"Sufixo"
,
,"","C","",""})
AADD(aTitulos,{"Produto"
,
,"","C","",""})
AADD(aTitulos,{"Descrio" ,
,"","C","",""})
"B1_CODMES"
, "@!",
TamSx3("B1_CODMES")[1]
, 0,
"B1_SUFIXO"
, "@!", TamSx3("B1_SUFIXO")[1]
, 0,
"B1_COD"
, "@!", TamSx3("B1_COD")[1]
, 0,
"B1_DESC"
, "@!", TamSx3("B1_DESC")[1]
, 0,
Hoje precisei descobrir quais eram os vencimentos de acordo com a condio de pagamento no Pedido de
Venda
Pesquisa daqui, pesquisa dali e achei um pequena funo chamada Condicao()
Condicao(nTotPed,cCondPag,,dEmissao)
onde:
nTotPed = Total do Pedido
cCondPag = Codigo da Condio de Pagamento
dEmissao = Data de Emisso
Exemplificando:
User Function
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
MFAT001A()
i
nDias
:= 0
nQtde
:= 0
aParcelas := {}
dVencto
:= CTOD("")
cCondPag := M->C5_CONDPAG
cTipo
nTotPed := 0
dEmissao := M->C5_EMISSAO
dParc1:=dParc2:=dParc3:=dParc4:= CTOD("")
cTipo := POSICIONE("SE4",1,xFilial("SE4")+cCondPag,"E4_TIPO")
nTotPed := iif(Inclui,1,getTotPed(SC5->C5_NUM) )
If cTipo != "9"
aParcelas := Condicao(nTotPed,cCondPag,,dEmissao)
For i := 1 to Len(aParcelas)
If aParcelas[i][1] > dVencto
nDias += aParcelas[i][1] - dEmissao
nQtde++
dVencto:= aParcelas[i][1]
EndIf
Next
Else
dParc1
dParc2
dParc3
dParc4
:=
:=
:=
:=
M->C5_DATA1
M->C5_DATA2
M->C5_DATA3
M->C5_DATA4
If !Empty(dParc1)
nDias += dParc1 - dEmissao
nQtde++
else
Alert("Voc escolheu a condio de pagamento do tipo
9"+chr(10)+chr(13)+"Informe a data da 1 Parcela!")
nDias := 0
endif
If !Empty(dParc2)
nDias += dParc2 - dEmissao
nQtde++
endif
If !Empty(dParc3)
nDias += dParc3 - dEmissao
nQtde++
endif
If !Empty(dParc4)
nDias += dParc4 - dEmissao
nQtde++
endif
EndIf
nDias := nDias / nQtde
Return(nDias)
/
***************************************************************************************
***************************
static function getTotPed( cCodPed )
retorna o valor total do pedido de vendas
***************************************************************************************
**************************/
static function getTotPed( cCodPed )
// retorno da funcao
local nRet := 0
// total do pedido
local nTotSc6 := 0
// total de desconto
local nTotDes := 0
// area
local aArea := getArea()
// posiciona o SC6 para calcular o valor total do pedido
SC6->(dbSetOrder(1))
SC6->(dbSeek(xFilial("SC6") + cCodPed))
// loop sobre os itens do pedido
while ( SC6->C6_FILIAL == xFilial("SC6") ) .and. (SC6->C6_NUM == cCodPed) .and. (!
SC6->(eof()))
// acumula a soma do valor dos itens
nTotSc6 += SC6->C6_VALOR
// verifica o desconto
if ( SC6->C6_PRUNIT == 0 )
else
nTotDes += SC6->C6_VALDESC
o desconto no pedido
SC5->C5_DESCONT
SC5->C5_DESCONT
A410Arred(nTotSc6 * (SC5->C5_PDESCAB / 100), "C6_VALOR")
A410Arred(nTotSc6 * (SC5->C5_PDESCAB / 100), "C6_VALOR")