APOSTILA BIZUS advpl

11
APOSTILA BIZUS - ADVPL Diferenças entre datas Abaixo algumas funções para obter diferenças entre datas ( inclusive em meses ). DaySum( dDate , nDays ) //Soma Dias em Uma Data DaySub( dDate , nDays ) //Subtrai Dias em Uma Data MonthSum( dDate , nMonth ) //Soma Meses em Uma Data MonthSub( dDate , nMonth ) //Subtrai Meses em Uma Data YearSum( dDate , nYear ) //Soma Anos em Uma Data YearSub( dDate , nYear ) //Subtrai Anos em Uma Data DateDiffDay( dDate1 , dDate2 ) //Apura Diferenca em Dias DateDiffMonth( dDate1 , dDate2 ) //Apura Diferenca em Meses DateDiffYear( dDate1 , dDate2 ) //Apura Diferenca em Anos DateDiffYMD( dDate1 , dDate2 ) //Retorna Array contendo a Diferenca de Anos/Meses/Dias entreduas Data MSExecAuto Objetivo Fazer manutenção automática (inclusão, alteração e exclusão) das rotinas de manipulação de dados do sistema, automatizando o processo de entrada de dados sem a necessidade de desenvolver rotinas especificas. Aplicação Esta tecnica é aplicada em todas as versões Protheus. Vantagens 1) Interface : Os dados de entrada são enviados a rotina em forma de campos e conteudos (array) e desta forma não é necessario a apresentação de nenhuma inteface ao usuário. 2) Segurança : A utilização de rotinas automáticas aumenta consideravelmente a segurança do sistema, uma vez que utiliza as validações padrões e diminui os problemas causados por atualização de versão ou inclusão de customizações nas rotinas padrões do sistema. 3) Agilidade no processo : Aumenta consideravemente o tempo de desenvolvimento das customizações que necessitam de entrada de dados. Exemplo: Importação de pedido de venda. Procedimentos Existem duas maneiras de utilizar a rotina automatica, sendo elas:

description

APOSTILA BIZUS advpl

Transcript of APOSTILA BIZUS advpl

APOSTILA BIZUS - ADVPLDiferenas entre datasAbaixo algumas funes para obter diferenas entre datas ( inclusive em meses ).DaySum( dDate , nDays ) //Soma Dias em Uma DataDaySub( dDate , nDays ) //Subtrai Dias em Uma DataMonthSum( dDate , nMonth ) //Soma Meses em Uma DataMonthSub( dDate , nMonth ) //Subtrai Meses em Uma DataYearSum( dDate , nYear ) //Soma Anos em Uma DataYearSub( dDate , nYear ) //Subtrai Anos em Uma DataDateDiffDay( dDate1 , dDate2 ) //Apura Diferenca em DiasDateDiffMonth( dDate1 , dDate2 ) //Apura Diferenca em MesesDateDiffYear( dDate1 , dDate2 ) //Apura Diferenca em AnosDateDiffYMD( dDate1 , dDate2 ) //Retorna Array contendo a Diferenca de Anos/Meses/Dias entreduas Data

MSExecAutoObjetivoFazer 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.AplicaoEsta tecnica aplicada em todas as verses Protheus.Vantagens1) 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.ProcedimentosExistem duas maneiras de utilizar a rotina automatica, sendo elas:1. Sem Interface2. Com InterfacePara 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 := {} Local nOpc := 3 // inclusao Private lMsHelpAuto := .t. // se .t. direciona as mensagens de help para o arq. de log Private lMsErroAuto := .f. // necessario a criacao, pois sera //atualizado quando houver // alguma incosistencia nos parametros PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' MODULO 'FAT' Begin Transaction aRotAuto:= {{'B1_COD' ,'1010' ,Nil},; {'B1_DESC' ,'Produto teste',Nil},; {'B1_TIPO' ,'PA' ,Nil},; {'B1_UM' ,'UN' ,Nil},; {'B1_LOCPAD' ,'01' ,Nil},; {'B1_PICM' ,0 ,Nil},; {'B1_IPI' ,0 ,Nil},; {'B1_PRV1' ,100 ,Nil},; {'B1_LOCALIZ' ,'N' ,Nil},; {'B1_CODBAR' ,'789888800001' ,Nil}} MSExecAuto({|x,y| mata010(x,y)},aProduto,nOpc) If lMsErroAuto DisarmTransaction() breakEndIf End Transaction If lMsErroAuto /* Se estiver em uma aplicao normal e ocorrer alguma incosistencia nos parametros passados,mostrar na tela o log informando qual coluna teve a incosistencia. */ Mostraerro() Return .f. EndIfReturn .t.

Funo que retorna as decries das mensagens de erro do Protheus em PortugusFuno que retorna as decries das mensagens de erro do Protheus em Portugus #INCLUDE "RWMAKE.CH"#INCLUDE "PROTHEUS.CH"

User Function DescErro(_nr)Local cMensagem := ""Do Case case _nr == -1 ; cMensagem:=' A operao falhou ou erro indefinido ' case _nr == 0 ; cMensagem:=' sucesso da operao ' case _nr == 1 ; cMensagem:=' (Cdigo de erro inesperado) ' case _nr == 2 ; cMensagem:=' Caminho / Arquivo no encontrado ' case _nr == 3 ; cMensagem:=' (Cdigo de erro inesperado) ' case _nr == 4 ; cMensagem:=' Bad file descriptor ' case _nr == 5 ; cMensagem:=' Muitas ligaes simblicas encontradas durante atravessando o caminho. ' case _nr == 6 ; cMensagem:=' Endereo errado. ' case _nr == 7 ; cMensagem:=' Falta de memria. '

Funo que retorna todas as imagens de botes do ProtheusFuno que retorna todas as imagens de botes do Protheus No reparem na funo foi feita as pressas, hehehe#include "protheus.ch"User Function ImgBotoes()Local a1Buttons := {}DEFINE MSDIALOG oDlg TITLE "Imagens para botes EnchoiceBar" FROM 000, 000 TO 600, 900 PIXELAADD(a1Buttons, { "AFASTAME" ,{||oDlg:End()}, "AFASTAME"} )AADD(a1Buttons, { "ALTERA" ,{||oDlg:End()}, "ALTERA"} )AADD(a1Buttons, { "AMARELO" ,{||oDlg:End()}, "AMARELO"} )... EnchoiceBar(oDlg, {||oDlg:End()}, {||oDlg:End()},,a14Buttons)ACTIVATE MSDIALOG oDlg CENTEREDReturn

Enviando e-mail atravs de rotinasO envio de e-mails pelo Protheus algo bem simples, desde que todas as informaes necessrias tenham sida registradas nos parametros corretamente.1) Ousuriode 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 empresa3) Na finalizao do atendimento informar a conta e a senha do usuario no servidor de e-mails.Ex: Conta: [email protected]: 1234Segue abaixo uma funo bem simples para envio:#include "protheus.ch"#include "apwebsrv.ch"#include "apwebex.ch"#include "ap5mail.ch"

User function enviar(cMailDe,cMailPara,cAssunto,cCorpo)local cServer := getMV('MV_RELSERV') //endereo SMTPlocal lAutentic := getMV('MV_RELAUTH') //utilize em caso de necessidade de autenticaolocal cAccount := getmv('MV_RELACNT') //contalocal cPassword := getMV('MV_RELAPSW') //senhaLOcal cQL := CHR(13) + CHR(10)local cRemoteip:=Getclientip()local cRemoteComputer:=GetComputerName()local lConectou := .f.// conecta com o servidor de e-mailCONNECT SMTP SERVER cServer ACCOUNT cAccount PASSWORD cPassword Result lConectou mailAuth(cAccount, cPassword)If lConectoucCorpo+= cQL + cQL + "==========================================================="cCorpo += cQL + " Enviado por: " + cUsernamecCorpo+= cQL + " Computador: " + cRemoteComputercCorpo+= cQL + " IP: " + cRemoteipcCorpo+= cQL + "===========================================================" SEND MAIL FROM cMailDe TO cMailPara SUBJECT cAssunto BODY cCorpo FORMAT TEXT RESULT lEnviadoif !lEnviado alert("ALERTA: No foi possivel enviar a mensagem") //, pois ocorreu o seguinte erro: " + sMensagem + ".") else alert("E-mail transmitido com sucesso para " + cMailPara +"!")endifelsealert("No foi possivel executar sua solicitao, pois no houve resposta do servidor de e-mail."+cQL+cQL+"Informe ao Administrador do Sistema!")return .f.Endif DISCONNECT SMTP SERVER Result lDisConectouReturn

Usando mBrowser com tabela temporriaAlguns 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 := "[REST002] - Etiqueta de Produtos" 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", "B1_CODMES" , "@!", TamSx3("B1_CODMES")[1] , 0, ,"","C","",""}) AADD(aTitulos,{"Sufixo" , "B1_SUFIXO" , "@!", TamSx3("B1_SUFIXO")[1] , 0, ,"","C","",""}) AADD(aTitulos,{"Produto" , "B1_COD" , "@!", TamSx3("B1_COD")[1] , 0, ,"","C","",""}) AADD(aTitulos,{"Descrio" , "B1_DESC" , "@!", TamSx3("B1_DESC")[1] , 0, ,"","C","",""}) cQuery := " SELECT B1_CODMES,B1_SUFIXO,B1_COD,B1_DESC " cQuery += " FROM " + RETSQLNAME("SB1") + " SB1 " cQuery += " WHERE B1_FILIAL = '"+xFilial("SB1")+"' AND " cQuery += " SB1.D_E_L_E_T_ != '*' " if(!empty(mv_par02))cQuery += " AND B1_COD >= '"+mv_par01+"' AND B1_COD