Vídeo Aula – AdvPL 011 – Gravação de Registros via MsExecAuto

Olá pessoal…

Na vídeo aula de hoje, vou falar um pouco sobre gravação de registros rotinas automáticas (MsExecAuto) e Controle de transações.



Abaixo o código fonte utilizado para os testes:

//Bibliotecas
#Include "Protheus.ch"
#Include "RwMake.ch"
#Include "TBIConn.ch"

/*/{Protheus.doc} zExecAuto
Exemplo de gravação via ExecAuto
@author Atilio
@since 29/11/2015
@version 1.0
	@example
	u_zExecAuto()
/*/

User Function zExecAuto()
	Local aArea	:= GetArea()
	Local aVetor	:= {}
	//Variáveis utilizadas pelo ExecAuto (caso queira gravar o log em arquivo texto, utilize as duas variáveis abaixo
	/*Private lMSHelpAuto		:= .T.
	Private lAutoErrNoFile	:= .T.*/
	Private lMsErroAuto		:= .F.
	
	//Adicionando dados no produto para testar inclusão
	aVetor :=	{;
					{"B1_COD",			"99999Z",									Nil},;
					{"B1_DESC",		"PRODUTO TESTE - ROTINA AUTOMATICA",	Nil},;
					{"B1_TIPO",		"P+",										Nil},;
					{"B1_UM",			"UN",										Nil},;
					{"B1_LOCPAD",		"01",										Nil},;
					{"B1_PICM",		0,											Nil},;
					{"B1_IPI",			0,											Nil},;
					{"B1_CONTRAT",	"N",										Nil},;
					{"B1_LOCALIZ",	"N",										Nil};
				}
	
	//Iniciando controle de transação
	Begin Transaction
		//Chamando o cadastro de produtos de forma automática
		MSExecAuto({|x,y| Mata010(x,y)},aVetor,3)
		
		//Se houve erro
		If lMsErroAuto
			//Caso queira gravar o log em arquivo texto, não se deve usar a rotina MostraErro, mas sim o trecho abaixo:
			/*
			aLogAuto	:= {}
			cLogTxt	:= ""
			
			//Pegando log do ExecAuto
			aLogAuto := GetAutoGRLog()
			
			//Percorrendo o Log
			For nAux:=1 To Len(aLogAuto)
				cLogTxt += aLogAuto[nAux] + Chr(13)+Chr(10)
			Next
			*/
		
			//Mostrando a janela de erro
			MostraErro()
			
			//Disarmando a transação
			DisarmTransaction()
		EndIf
	             
	End Transaction

	RestArea(aArea)
Return

Se quiser fazer o download desse código ou do conteúdo mostrado na vídeo aula, acesse nosso GitHub pelo link github.com/dan-atilio/AdvPL (Exemplos > Vídeo Aulas > 011 – Gravação de Registros via MsExecAuto).

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.

14 Responses

  1. Diego Sousa disse:

    Parabéns pelo vídeo, ficou bom. Geralmente não ensinam sobre os campos obrigatórios no Execauto e no início quebramos a cabeça.

  2. Anizio Souza disse:

    Bom dia Dan_Atilio. Seu post é antigo, mas pra mim foi muito útil. Estou com uma dúvida e se voce puder me responder agradeço. Segue: Há possibilidade de criar um msexecauto entre empresas? No meu caso seria a rotina FINA100 – Transferencia.

    Valeu!!!

    • Dan_Atilio disse:

      Boa noite Anizio, tudo bem?

      Não entendi muito bem, você quer rodar a FINA100 para todas as empresas? Filiais?

      Se sim, você pode criar uma variável com as empresas / filiais (ou usar rotinas padrão, como a FWAllFilial), e depois alterar as variáveis cEmpAnt e cFilAnt (respectivamente Empresa e Filial), lembrando de tomar cuidado de sempre fazer um backup dessas variáveis (pois são variáveis públicas do Protheus).

      Abaixo um pequeno exemplo:

      aEmpresas := {"01"}
      aFiliais  := {"01","02"}
      cEmpBkp   := cEmpAnt
      cFilBkp   := cFilAnt
      
      //Percorrendo as empresas
      For nEmpAtu := 1 To Len(aEmpresas)
          cEmpAnt := aEmpresas[nEmpAtu]
      
          //Percorrendo as filiais
          For nFilAtu := 1 To Len(aFiliais)
              cFilAnt := aFiliais[nFilAtu]
              //Seus tratamentos e ExecAuto
          Next
      Next
      
      //Voltando os backups
      cEmpAnt := cEmpBkp
      cFilAnt := cFilBkp
      

      Espero ter ajudado.
      Um grande abraço.

  3. Shava disse:

    Que tal Daniel tengo un problema con la msexecauto de la mata 265, me manda error en la fecha y no se porque si asi es como debe ser, el error es el siguiente
    (argument #0 error, expected D-C, function dtoc on MSLOGITENS(MATXFUNB.PRX))
    La linea la traigo asi:
    Aadd(_aItem2, {{“DB_ITEM” ,”0001″ ,NIL},{“DB_LOCALIZ” ,aWBrowse1[nDA][6] ,NIL},{“DB_DATA” ,ddatabase ,NIL},;
    {“DB_QUANT” ,Val(aWBrowse1[nDA][7]) ,NIL}})//,{“DB_DOC” ,cDocu ,NIL}})
    Agradeceria tu ayuda

    • Dan_Atilio disse:

      Boa noite Shava, tudo bem?
      Rapaz, que estranho, ele está dizendo que esperava um tipo Data e recebeu um Caracter.
      Tente primeiramente alterar no seu fonte o dDataBase para Date().
      Caso o erro continue, por favor, me envie o error log completo para eu dar uma olhada.
      Um grande abraço.

  4. Shava disse:

    Que tal Daniel, tengo la Imagen del Error, podrías proporcionarme tu correo para enviarte el Archivo (Imagen), Saludos

  5. Armando Lima disse:

    Olá amigo!
    me ajuda numa dúvida?

    Dá pra usar o MSExecAuto em uma rotina customizada? Pra explicar, essa rotina usa um MBrowse para gerir uma determinada tabela, então conta com AxInclui, AxAltera, AxExclui, etc… Por exemplo ao incluir, abre a interface com os campos (e seus diversos gatilhos) que salva o registro após clicar em Confirmar.

    O que eu penso em fazer é alimentar um array com diversos registros e incluir por lote (automaticamente, de uma só vez). Então a ideia é colocar num laço e mandar cada linha desse array para ser incluído. O mais importante é aproveitar a estrutura de gatilhos já configurado por trás dessa rotina, então enviando os dados, deve-se incluí-lo considerando as interações dos gatilhos. Assim como funciona com o MSExecAuto, entrentanto no meu caso a rotina é customizada.

    Alguma ideia?

    Grato!

  6. Jorge disse:

    Boa tarde Daniel, tudo bem?
    Como faço para identificar quais rotinas possuem Execauto ou FWMVCRotAuto?

    Exemplo : JURA162 ou JURA095.

    Muito Obrigado.

    Atenciosamente,
    Jorge Miguel

  7. Alexandre AS disse:

    Muito bom rapaz! Parabéns pela iniciativa e muito obrigado!

Deixe uma resposta

Terminal de Informação