Olá a todos, recebemos uma contribuição do amigo Junior Plácido mostrando de uma forma simples e prática o uso do componente MsNewGetDados e a criação de campos diretos nas tabelas SX2,SX3,SIX e SXB

O programa irá trazer os dados no GRID, assim como exibi-los, após o cadastro. Esta função já vem com a implementação do código de criação das tabelas e campos automáticos, desta forma é só executar a função e começar à inserir os dados. O programa consiste em uma simulação de locadora de veículos ou controle de veículos por motorista, onde você pode atribuir os veículos ao motorista, e assim, saber com quem está cada veículo, se está livre ou quando estará livre.

Estão finalizadas a parte de cadastro de veículos e motoristas, desta forma, a ABA3(locação/empréstimos) está em andamento.

Vamos ao fonte:

//Bibliotecas
#Include 'Protheus.ch'
#include "TOTVS.ch" 
#include "jpeg.ch" 


//Constantes usadas na criação dos campos
#Define _X3_USADO         "€€€€€€€€€€€€€€ "
#Define _X3_USFILIAL     "€€€€€€€€€€€€€€€"
#Define _X3_RESERV         "þA"
#Define _X3_OBRIGA         "€"
#Define _X3_NAO_OBRIGA     ""

//////////
/*
FONTE CRIADO POR ADEILTON PLACID DOS SANTOS JUNIOR
CIENTISTA DA COMPUTAÇÃO ESPECIALISTA EM BANCO DE DADOS, COM EXPERTISE
EM DESENVOLVIMENTO DE SOFTWARE, IMPLANTAÇÃO, MANUTENÇÃO E ADMINISTRAÇÃO DO PROTHEUS.
ADMINISTRADOR DE BANCO DE DADOS, COM EXPERTISE EM SQL SERVER
email: juniorplacidojp@gmail.com 
Tel: 73 981766403
*/
//////////


/*/{Protheus.doc} RESP01
Funcao Padrão que abre uma janela com 3 abas CADASTRO DE VEÍCULOS, MOTORISTAS E EMPRÉSITMO DE VEÍCULOS (não finalizada)
@type function
@author Adeilton Plácido dos Santos Júnior TEL (73) 981766403
@since 20/07/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/USER Function RUTI02()
//VARIÁVEIS DE INTERFACE
Local oDlg
Local oCodigo   
Local oNome  
Local oPlaca   
Local oStatus

//BOTOES
Local oBtnConf   
Local oBtnCanc

//VARIAVEIS DO MSNEWGETDADOS PRINCIPAL, CADASTRO DE VEICULOS
Local aBotoes	:= {}         //Variável onde será incluido o botão para a legenda
Private oLista                    //Declarando o objeto do browser
Private aCabecalho  := {}         //Variavel que montará o aHeader do grid
Private aColsVeic 	:= {}         //Variável que receberá os dados

//Declarando os objetos de cores para usar na coluna de status do grid
Private oVerde  	:= LoadBitmap( GetResources(), "BR_VERDE")
Private oVermelho	:= LoadBitmap( GetResources(), "BR_VERMELHO")
//Private oAmarelo	:= LoadBitmap( GetResources(), "BR_AMARELO") 

/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
VARIAVEIS REFERENTES AOS VEÍCULOS ABA1 DIALOGS[1]
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
//TGETS CADASTRO DE VEICULOS
Private oGetCodigo  
Private cGetCodigo := Space(6)


Private oGetNome
Private cGetNome := Space(25)

Private oGetPlaca    
Private cGetPlaca := Space(8) 

Private aVeiculos := {}

//RADIOBUTTON CADASTRO DE VEICULOS
Private nRadio
Private oRadio  
/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
FIM VARIAVEIS MOTORISTAS
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/

//ABAS
Private oTFolder

/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
VARIAVEIS REFERENTES AOS MOTORISTAS  ABA2 DIALOGS[2]
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
Private aMotoristas   
Private oLMot                    //Declarando o objeto do browser
Private aCabecMot  := {}         //Variavel que montará o aHeader do grid
Private aColsMot 	:= {}   

Private cGCodDriv := Space(6)
Private cGNomDriv := Space(25)
Private cGCnh := Space(8) 
Private cGCateg := Space(2)

Private oGCodDriv  
Private oGNomDriv
Private oGCnh    
Private oGCateg
                 

Private nRdDriv
Private oRdDriv  

/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
FIM VARIAVEIS MOTORISTAS
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/


/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
VARIAVEIS REFERENTES AO EMPRESTIMO DE VEICULOS ABA3 DIALOGS[3]
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
Private oGCodMot1
Private cGCodMot1 := Space(6)

Private oGNomMot
Private cGNomMot

Private oGCNHMot 
Private cGCNHMot

Private oGCatMod
Private cGCatMod
Private oFArial10Neg	:= TFont():New( "Arial",0,-13,,.T.,0,,700,.F.,.F.,,,,,, ) // FONTE UTILIZADA


Private aVeicRent
Private oLRent                    //Declarando o objeto do browser
Private aCabRent  := {}         //Variavel que montará o aHeader do grid
Private aColsRent 	:= {}   
/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
FIM VARIAVEIS AO EMPRESTIMO DE VEICULOS
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/

//Define cor para TSAY porém não funcionou na V12
#define CLR_BLUE        8388608               // RGB(   0,   0, 128 )


//Cria as tabelas utilizadas caso elas não existam no sistema, lembrando que, deve-se ter atençaõ às nomenclaturas SZ1, SZ2, caso no seu banco já
//contenha estas tabelas, trocar toda estrutura do fonte.
If !TCCanOpen("SZ1"+FWCodEmp("SZ1")+"0")
	FillSZ1()
	
endif

If !TCCanOpen("SZ2"+FWCodEmp("SZ1")+"0")
	FillSZ2()
endif



//ODLGPARA TELA   
     oDlg              := MsDialog():New()
     oDlg:cCaption := "..:: CADASTRO DE VEICULOS ::.."
     oDlg:nWidth    := 1300
     oDlg:nHeight   := 600
     oDlg:lCentered := .F.                                           
     // imprime uma imagem na janela
   	//  @ 001,001 Jpeg File "nfp.jpg"          Size 100,430 Pixel Of oDlg                      
  	
  	// Cria a Folder
  	aTFolder := { 'Veículos', 'Motoristas', 'Empréstimo' }
  	oTFolder := TFolder():New( 30,0,aTFolder,,oDlg,,,,.T.,,1200,500)	


/*
TELA DE CADASTRO DE VEICULOS
*/       
     //CÓDIGO
     oCodigo            := TSay():New(,,,oTFolder:aDialogs[1])
     oCodigo:cCaption := "Codigo"
     oCodigo:nLeft      := 015
     oCodigo:nTop       := 20
     oCodigo:nWidth   := 100
     oCodigo:nHeight := 020    
              
     oGetCodigo           := TGet():New(,,,oTFolder:aDialogs[1])
     oGetCodigo:nLeft     := 015
     oGetCodigo:nTop      := 34
     oGetCodigo:nWidth    := 096
     oGetCodigo:nHeight   := 020
     oGetCodigo:cReadVar := "cGetCodigo"
     oGetCodigo:bSetGet   := {|u| if( PCount() > 0, cGetCodigo := u, cGetCodigo ) }               
    
     //NOME
     oNome            := TSay():New(,,,oTFolder:aDialogs[1])
     oNome:cCaption := "Descricao"
     oNome:nLeft       := 130
     oNome:nTop       := 20
     oNome:nWidth   := 100
     oNome:nHeight := 020    
              
     oGetNome           := TGet():New(,,,oTFolder:aDialogs[1])
     oGetNome:nLeft     := 130
     oGetNome:nTop      := 35
     oGetNome:nWidth    := 200
     oGetNome:nHeight   := 020
     oGetNome:cReadVar := "cGetNome"
     oGetNome:bSetGet   := {|u| if( PCount() > 0, cGetNome := u, cGetNome ) }      
      
     //PLACA
     oPlaca            := TSay():New(,,,oTFolder:aDialogs[1])
     oPlaca:cCaption := "Placa"
     oPlaca:nLeft       := 350
     oPlaca:nTop       := 20
     oPlaca:nWidth   := 100
     oPlaca:nHeight := 020    
              
     oGetPlaca           := TGet():New(,,,oTFolder:aDialogs[1])
     oGetPlaca:nLeft     := 350
     oGetPlaca:nTop      := 35
     oGetPlaca:nWidth    := 100
     oGetPlaca:nHeight   := 020
     oGetPlaca:cReadVar := "cGetPlaca"
     oGetPlaca:bSetGet   := {|u| if( PCount() > 0, cGetPlaca := u, cGetPlaca ) }      
          
     //STATUS
     oStatus            := TSay():New(,,,oTFolder:aDialogs[1])
     oStatus:cCaption := "Status"
     oStatus:nLeft       := 500
     oStatus:nTop       := 20
     oStatus:nWidth   := 100
     oStatus:nHeight := 020    

    
	nRadio := 1
	aItens := {'Ativo','Inativo'}
	oRadio 				:= TRadMenu():New(,,,,oTFolder:aDialogs[1])
	oRadio:aItems		:=  aItens
	oRadio:nLeft		:= 500
	oRadio:nTop			:= 35
	oRadio:nWidth    	:= 100
    oRadio:nHeight   	:= 020
	oRadio:bSetGet		:= {|u|Iif (PCount()==0,nRadio,nRadio:=u)}


       //chamar a função que cria a estrutura do aHeader
        CriaCabec()

        //Monta o browser com inclusão, remoção e atualização
		oLista := MsNewGetDados():New(50,005,280,300, /*5*/,/*6*/,/*7*/,/*8*/,/*9*/,1, 999, /*12*/, /*13*/, /*14*/, oTFolder:aDialogs[1], aCabecalho, aColsVeic,{|| FullField()},)

        //Carregar os itens que irão compor o conteudo do grid
        Carregar()

        //Alinho o grid para ocupar todo o meu formulário
        oLista:oBrowse:Align := CONTROL_ALIGN_NONE 

        //Ao abrir a janela o cursor está posicionado no meu objeto
        oLista:oBrowse:SetFocus()

        //Crio o menu que irá aparece no botão Ações relacionadas
        aadd(aBotoes,{"NG_ICO_LEGENDA", {||Legenda()},"Legenda","Legenda"})
	
        EnchoiceBar(oDlg, {|| oDlg:End() }, {|| oDlg:End() },,aBotoes)   
 
 	//Botão de confirmar, que chama a função de salvar os dados na tabela 
     oBtnConf          := TButton():New(,,,oTFolder:aDialogs[1])
     oBtnConf:cCaption := "Confirmar"
     oBtnConf:nLeft    := 620
     oBtnConf:nTop     := 100
     oBtnConf:nWidth   := 060
     oBtnConf:nHeight := 025
     oBtnConf:bAction := {|| fGravar(cGetCodigo, cGetNome, cGetPlaca,nRadio),Carregar(),oLista:ForceRefresh(),CargRent()}//,oLista:Refresh() } 

     oBtnConf          := TButton():New(,,,oTFolder:aDialogs[1])
     oBtnConf:cCaption := "Excluir"
     oBtnConf:nLeft    := 620
     oBtnConf:nTop     := 130
     oBtnConf:nWidth   := 060
     oBtnConf:nHeight := 025
     oBtnConf:bAction := {|| MsgInfo("EXCLUIR REGISTRO")}//,oLista:Refresh() }

	//Chama composição da tela de Motoristas, ABA2 DIALOGS[2]	
	 fDriver()
	 
	//Chama composição da tela de Emprestimo de carros, ABA3 DIALOGS[3]	 
	 fRentVei()
	 
     oDlg:Activate()          
     
Return  


/*/{Protheus.doc} fRentVei
Função ainda não finalizada para empréstimo de veículos, onde um MOTORISTA poderá pegar os VEÍCULOS emprestados
@type function
@author Placido
@since 13/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function fRentVei()
//BOTOES
Local oBtnConf   
Local oBtnCanc
Local oCodMot1  
 
     //CÓDIGO
     oCodMot1            := TSay():New(,,,oTFolder:aDialogs[3])
     oCodMot1:cCaption := "Codigo motorista"
     oCodMot1:nLeft      := 015
     oCodMot1:nTop       := 20
     oCodMot1:nWidth   := 100
     oCodMot1:nHeight := 020
  
              
     oGCodMot1           := TGet():New(,,,oTFolder:aDialogs[3])
     oGCodMot1:nLeft     := 015
     oGCodMot1:nTop      := 34
     oGCodMot1:nWidth    := 096
     oGCodMot1:nHeight   := 020
     oGCodMot1:cReadVar := "cGCodMot1"
     oGCodMot1:Cf3	:= "SZ2"  
     oGCodMot1:bSetGet   := {|u| if( PCount() > 0, cGCodMot1 := u, cGCodMot1) }    
     oGCodMot1:bValid	:=  {|| fRetRent() }         

     //NOME
     oSMotor            := TSay():New(,,,oTFolder:aDialogs[3],,oFArial10Neg)
     oSMotor:cCaption := "MOTORISTA: "
     oSMotor:nLeft       := 130
     oSMotor:nTop       := 20
     oSMotor:nWidth   := 100
     oSMotor:nHeight := 020   
     
     //NOME
     oGNomMot            := TSay():New(,,{||cGNomMot},oTFolder:aDialogs[3],,oFArial10Neg)
     oGNomMot:nLeft       := 250
     oGNomMot:nTop       := 20
     oGNomMot:nWidth   := 100
     oGNomMot:nHeight := 020   
     oGNomMot:nClrText := CLR_BLUE
        
     
     //NOME
     osCNH            := TSay():New(,,,oTFolder:aDialogs[3],,oFArial10Neg)
     osCNH:cCaption := "CNH: "
     osCNH:nLeft       := 130
     osCNH:nTop       := 40
     osCNH:nWidth   := 100
     osCNH:nHeight := 020         
     
     //NOME
     oGCNHMot            := TSay():New(,,{||cGCNHMot},oTFolder:aDialogs[3],,oFArial10Neg)
     oGCNHMot:nLeft       := 250
     oGCNHMot:nTop       := 40
     oGCNHMot:nWidth   := 100
     oGCNHMot:nHeight := 020   
     oGCNHMot:nClrText := CLR_BLUE


       
		//chamar a função que cria a estrutura do aHeader
		CCabRent()
		        
		//Monta o browser com inclusão, remoção e atualização
		oLRent := MsNewGetDados():New(50,005,280,300, /*5*/,/*6*/,/*7*/,/*8*/,/*9*/,1, 999, /*12*/, /*13*/, /*14*/, oTFolder:aDialogs[3], aCabecalho, aColsRent,,)
		 
		//Carregar os itens que irão compor o conteudo do grid
		CargRent()
		        
		//Alinho o grid para ocupar todo o meu formulário
		oLRent:oBrowse:Align := CONTROL_ALIGN_NONE 
		
		//Ao abrir a janela o cursor está posicionado no meu objeto
		oLRent:oBrowse:SetFocus()
         
     oBtnConf          := TButton():New(,,,oTFolder:aDialogs[3])
     oBtnConf:cCaption := "Confirmar"
     oBtnConf:nLeft    := 620
     oBtnConf:nTop     := 100
     oBtnConf:nWidth   := 060
     oBtnConf:nHeight := 025
     oBtnConf:bAction := {||  MsgInfo("CONFIRMAR EMPRESTIMO DE VEICULO")}//,oLista:Refresh() } 

     oBtnConf          := TButton():New(,,,oTFolder:aDialogs[3])
     oBtnConf:cCaption := "Excluir"
     oBtnConf:nLeft    := 620
     oBtnConf:nTop     := 130
     oBtnConf:nWidth   := 060
     oBtnConf:nHeight := 025
     oBtnConf:bAction := {|| MsgInfo("EXCLUIR REGISTRO")}//,oLista:Refresh() }

return



/*/{Protheus.doc} fRetRent
Função que é utilizada ao preencher as SAYS/LABELS com os dados do motorista no momento do empréstimo do veículo,
 é executada pelo TGET, NA ABA3 (EMPRÉSTIMO)
@type function
@author Placido
@since 07/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function fRetRent()

if (len(cGCodMot1) = 6)
	DbSelectArea("SZ2")
	DbSetOrder(1)

	
	if DbSeek(cGCodMot1)
		cGNomMot := SZ2->Z2_NOME
		oGNomMot:CtrlRefresh()
		
		cGCNHMot := SZ2->Z2_CNH
		oGCNHMot:CtrlRefresh()
		//MsgInfo(SZ2->Z2_CATEG)
		*/
	else
		Alert("Motorista não encontrado!","Desculpe")
		oClicod := "      "
	endif
endif
return


/*/{Protheus.doc} fDriver
Função de chamada para tela de motorista, gets e says.
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function fDriver()
//BOTOES
Local oBtnConf   
Local oBtnCanc

Local oCodDriv   
Local oNomDriv  
Local oCnh   
Local oCateg
Local oSttDriv

  

     //CÓDIGO
     oCodDriv            := TSay():New(,,,oTFolder:aDialogs[2])
     oCodDriv:cCaption := "Codigo"
     oCodDriv:nLeft      := 015
     oCodDriv:nTop       := 20
     oCodDriv:nWidth   := 100
     oCodDriv:nHeight := 020    
              
     oGCodDriv           := TGet():New(,,,oTFolder:aDialogs[2])
     oGCodDriv:nLeft     := 015
     oGCodDriv:nTop      := 34
     oGCodDriv:nWidth    := 096
     oGCodDriv:nHeight   := 020
     oGCodDriv:cReadVar := "cGCodDriv"
     oGCodDriv:bSetGet   := {|u| if( PCount() > 0, cGCodDriv := u, cGCodDriv ) }               
    
     //NOME
     oNomDriv            := TSay():New(,,,oTFolder:aDialogs[2])
     oNomDriv:cCaption := "Nome"
     oNomDriv:nLeft       := 130
     oNomDriv:nTop       := 20
     oNomDriv:nWidth   := 100
     oNomDriv:nHeight := 020    
              
     oGNomDriv           := TGet():New(,,,oTFolder:aDialogs[2])
     oGNomDriv:nLeft     := 130
     oGNomDriv:nTop      := 35
     oGNomDriv:nWidth    := 200
     oGNomDriv:nHeight   := 020
     oGNomDriv:cReadVar := "cGNomDriv"
     oGNomDriv:bSetGet   := {|u| if( PCount() > 0, cGNomDriv := u, cGNomDriv ) }      
      
     //CNH
     oCnh            := TSay():New(,,,oTFolder:aDialogs[2])
     oCnh:cCaption := "CNH"
     oCnh:nLeft       := 350
     oCnh:nTop       := 20
     oCnh:nWidth   := 100
     oCnh:nHeight := 020    
              
     oGCnh           := TGet():New(,,,oTFolder:aDialogs[2])
     oGCnh:nLeft     := 350
     oGCnh:nTop      := 35
     oGCnh:nWidth    := 100
     oGCnh:nHeight   := 020
     oGCnh:cReadVar := "cGCnh"
     oGCnh:bSetGet   := {|u| if( PCount() > 0, cGCnh := u, cGCnh ) }      
          
     //CATEG
     oCateg            := TSay():New(,,,oTFolder:aDialogs[2])
     oCateg:cCaption := "Categoria"
     oCateg:nLeft       := 460
     oCateg:nTop       := 20
     oCateg:nWidth   := 100
     oCateg:nHeight := 020    
              
     oGCateg           := TGet():New(,,,oTFolder:aDialogs[2])
     oGCateg:nLeft     := 460
     oGCateg:nTop      := 35
     oGCateg:nWidth    := 100
     oGCateg:nHeight   := 020
     oGCateg:cReadVar := "cGCateg"
     oGCateg:bSetGet   := {|u| if( PCount() > 0, cGCateg := u, cGCateg ) }             
          
          
     //STATUS
     oSttDriv            := TSay():New(,,,oTFolder:aDialogs[2])
     oSttDriv:cCaption := "Status"
     oSttDriv:nLeft       := 650
     oSttDriv:nTop       := 20
     oSttDriv:nWidth   := 100
     oSttDriv:nHeight := 020    

    
	nRdDriv := 1
	aItens := {'Ativo','Inativo'}
	oRdDriv 				:= TRadMenu():New(,,,,oTFolder:aDialogs[2])
	oRdDriv:aItems		:=  aItens
	oRdDriv:nLeft		:= 650
	oRdDriv:nTop			:= 35
	oRdDriv:nWidth    	:= 100
    oRdDriv:nHeight   	:= 020
	oRdDriv:bSetGet		:= {|u|Iif (PCount()==0,nRdDriv,nRdDriv:=u)}


		//chamar a função que cria a estrutura do aHeader
		CrCabDri()
		
		//Monta o browser com inclusão, remoção e atualização
		oLMot := MsNewGetDados():New(50,005,280,300, /*5*/,/*6*/,/*7*/,/*8*/,/*9*/,1, 999, /*12*/, /*13*/, /*14*/, oTFolder:aDialogs[2], aCabecMot, aColsMot,{|| FullFMot()},)
		
		//Carregar os itens que irão compor o conteudo do grid
		CargMotor()
		
		//Alinho o grid para ocupar todo o meu formulário
		oLMot:oBrowse:Align := CONTROL_ALIGN_NONE 
		
		//Ao abrir a janela o cursor está posicionado no meu objeto
		oLMot:oBrowse:SetFocus()

  
     oBtnConf          := TButton():New(,,,oTFolder:aDialogs[2])
     oBtnConf:cCaption := "Confirmar"
     oBtnConf:nLeft    := 620
     oBtnConf:nTop     := 100
     oBtnConf:nWidth   := 060
     oBtnConf:nHeight := 025
     oBtnConf:bAction := {|| fGrvMot(cGCodDriv, cGNomDriv, cGCnh, cGCateg,nRdDriv),CargMotor(),oLMot:ForceRefresh()}//,oLista:Refresh() } 

     oBtnConf          := TButton():New(,,,oTFolder:aDialogs[2])
     oBtnConf:cCaption := "Excluir"
     oBtnConf:nLeft    := 620
     oBtnConf:nTop     := 130
     oBtnConf:nWidth   := 060
     oBtnConf:nHeight := 025
     oBtnConf:bAction := {|| MsgInfo("EXCLUIR REGISTRO")}//,oLista:Refresh() }

return



/*/{Protheus.doc} FullFMot
Função de ação no msnewgetdados paara o motorista, preenche os textbox automaticamente ao clicar em cada linha
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function FullFMot()
IF (len(aColsMot) > 0 .And. len(aMotoristas) >0)	
 cGCodDriv		:= aColsMot[oLMot:oBrowse:nAt,2]
 cGNomDriv   	:= aColsMot[oLMot:oBrowse:nAt,3]
 cGCnh  		:= aColsMot[oLMot:oBrowse:nAt,4]
 cGCateg  		:= aColsMot[oLMot:oBrowse:nAt,5]
 nRdDriv  		:= VAL(aMotoristas[oLMot:oBrowse:nAt,5])
ENDIF 
 oGCodDriv:CtrlRefresh()
 oGNomDriv:CtrlRefresh()
 oGCnh:CtrlRefresh()
 oGCateg:CtrlRefresh()
 oRdDriv:Refresh()
return 


/*/{Protheus.doc} FullField
Função de ação no msnewgetdados paara os veículos, preenche os textbox automaticamente ao clicar em cada linha
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function FullField()
IF (LEN(aColsVeic) > 0)
 cGetCodigo := aColsVeic[oLista:oBrowse:nAt,2]
 cGetNome   := aColsVeic[oLista:oBrowse:nAt,3]
 cGetPlaca  := aColsVeic[oLista:oBrowse:nAt,4]
 nRadio  	:= VAL(aVeiculos[oLista:oBrowse:nAt,4])
endif
 oGetCodigo:CtrlRefresh()
 oGetNome:CtrlRefresh()
 oGetPlaca:CtrlRefresh()
 oRadio:Refresh()

return 


/*/{Protheus.doc} fGrvMot
Grava os dados dos motoristas na tabela SZ2
@type function
@author Placido
@since 06/08/2018
@version 1.0
@param cCodigo, character, (Descrição do parâmetro)
@param cNome, character, (Descrição do parâmetro)
@param cCNH, character, (Descrição do parâmetro)
@param cCateg, character, (Descrição do parâmetro)
@param cStatus, character, (Descrição do parâmetro)
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function fGrvMot(cCodigo, cNome, cCNH,cCateg, cStatus)

DbSelectArea("SZ2")
RecLock("SZ2", .T.)	
SZ2->Z2_FILIAL := xFilial("SZ2")	
SZ2->Z2_COD := 	cCodigo
SZ2->Z2_NOME := cNome
SZ2->Z2_CNH := cCNH
SZ2->Z2_CATEG := cCateg

if cStatus = 1
	SZ2->Z2_STATUS := "1"
else
	SZ2->Z2_STATUS := "2"
end
	 
MsUnLock() // Confirma e finaliza a operação

return



/*/{Protheus.doc} fGravar
Grava os dados dos veículos na tabela SZ1
@type function
@author Placido
@since 06/08/2018
@version 1.0
@param cCodigo, character, (Descrição do parâmetro)
@param cVeic, character, (Descrição do parâmetro)
@param cPlaca, character, (Descrição do parâmetro)
@param cStatus, character, (Descrição do parâmetro)
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function fGravar(cCodigo, cVeic, cPlaca, cStatus)

DbSelectArea("SZ1")
RecLock("SZ1", .T.)	
SZ1->Z1_FILIAL := xFilial("SZ1")	
SZ1->Z1_COD := 	cCodigo
SZ1->Z1_DESC := cVeic
SZ1->Z1_PLACA := cPlaca

if cStatus = 1
	SZ1->Z1_STATUS := "1"
else
	SZ1->Z1_STATUS := "2"
end
	 
MsUnLock() // Confirma e finaliza a operação

return


/*/{Protheus.doc} CriaCabec
Posso fazer de duas formas, incrementando manualmente as descrições das colunas, ou fazendo um laço na SX3, conforme abaixo.
Esta função cria o cabeçalho para o grid do MSNEWGETDADOS veículos
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function CcabRent()
   Aadd(aCabRent, {;
                  "",;//X3Titulo()
                  "IMAGEM",;  //X3_CAMPO
                  "@BMP",;		//X3_PICTURE
                  3,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  ".F.",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "V",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  "",;			//X3_WHEN
                  "V"})	
     Aadd(aCabRent, {;
                  "CODIGO",;//X3Titulo()
                  "CODIGO",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  6,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	

     Aadd(aCabRent, {;
                  "VEICULO",;//X3Titulo()
                  "VEICULO",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  30,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	
                  
     Aadd(aCabRent, {;
                  "VEICULO",;//X3Titulo()
                  "VEICULO",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  30,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	   
                  
     Aadd(aCabRent, {;
                  "PLACA",;//X3Titulo()
                  "PLACA",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  7,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	                                                                               
return


/*/{Protheus.doc} CriaCabec
Posso fazer de duas formas, incrementando manualmente as descrições das colunas, ou fazendo um laço na SX3, conforme abaixo.
Esta função cria o cabeçalho para o grid do MSNEWGETDADOS veículos
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function CriaCabec()
   Aadd(aCabecalho, {;
                  "",;//X3Titulo()
                  "IMAGEM",;  //X3_CAMPO
                  "@BMP",;		//X3_PICTURE
                  3,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  ".F.",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "V",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  "",;			//X3_WHEN
                  "V"})	
     Aadd(aCabecalho, {;
                  "CODIGO",;//X3Titulo()
                  "CODIGO",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  6,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	

                  
     Aadd(aCabecalho, {;
                  "VEICULO",;//X3Titulo()
                  "VEICULO",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  30,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	   
                  
     Aadd(aCabecalho, {;
                  "PLACA",;//X3Titulo()
                  "PLACA",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  7,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	
return


/*/{Protheus.doc} CrCabDri
Esta função cria o cabeçalho para o grid do MSNEWGETDADOS MOTORISTAS
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function CrCabDri()
   Aadd(aCabecMot, {;
                  "",;//X3Titulo()
                  "IMAGEM",;  //X3_CAMPO
                  "@BMP",;		//X3_PICTURE
                  3,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  ".F.",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "V",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  "",;			//X3_WHEN
                  "V"})	
                  
    Aadd(aCabecMot, {;
                  "CODIGO",;//X3Titulo()
                  "CODIGO",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  6,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	

     Aadd(aCabecMot, {;
                  "NOME",;//X3Titulo()
                  "NOME",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  30,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	
                  
     Aadd(aCabecMot, {;
                  "CNH",;//X3Titulo()
                  "CNH",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  7,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	   
                  
     Aadd(aCabecMot, {;
                  "CATEGORIA",;//X3Titulo()
                  "CATEGORIA",;  //X3_CAMPO
                  "@!",;		//X3_PICTURE
                  2,;			//X3_TAMANHO
                  0,;			//X3_DECIMAL
                  "",;			//X3_VALID
                  "",;			//X3_USADO
                  "C",;			//X3_TIPO
                  "",; 			//X3_F3
                  "R",;			//X3_CONTEXT
                  "",;			//X3_CBOX
                  "",;			//X3_RELACAO
                  ""})	
        
return


///CARREGAR VEICULOS

/*/{Protheus.doc} CargMotor
Carrega os dados da tabela de motoristas para o grid
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function CargMotor()
  Local i
  aMotoristas := {}
	dbSelectArea("SZ2")
	DbSetOrder(1)

	SZ2->(dbGotop())
	While !SZ2->(Eof())
		AAdd(aMotoristas,{SZ2->Z2_COD,SZ2->Z2_NOME,SZ2->Z2_CNH,SZ2->Z2_CATEG, SZ2->Z2_STATUS })
		SZ2->(DbSkip())
	EndDo
	dbCloseArea("SZ2")
	
    IF LEN(aMotoristas) > 0
	aColsMot := {}
	    For i := 1 to len(aMotoristas)
	        if(aMotoristas[i,5]="1")
	           aadd(aColsMot,{oVerde,aMotoristas[i,1],aMotoristas[i,2],aMotoristas[i,3],aMotoristas[i,4],.F.})
	        Else
	           aadd(aColsMot,{oVermelho,aMotoristas[i,1],aMotoristas[i,2],aMotoristas[i,3],aMotoristas[i,4],.F.})
	        Endif
	    Next
    ENDIF

	//Setar array do aCols do Objeto.
    oLMot:SetArray(aColsMot,.T.)
    //Atualizo as informações no grid
    oLMot:Refresh()

Return



/*/{Protheus.doc} CargRent
Carrega os dados da tabela de veiculos para o grid, somente veículos com STATUS = 1, ATIVOS
@type function
@author Placido
@since 07/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function CargRent()
  Local i
  aVeicRent := {}
	dbSelectArea("SZ1")
	DbSetOrder(1)

	
	SZ1->(dbGotop())
	While !SZ1->(Eof())
		IF(SZ1->Z1_STATUS = "1")
			AAdd(aVeicRent,{SZ1->Z1_COD,SZ1->Z1_DESC,SZ1->Z1_PLACA, SZ1->Z1_STATUS })
		ENDIF
			SZ1->(DbSkip())
	EndDo
	dbCloseArea("SZ1")

    IF(LEN(aVeicRent) > 0)
		aColsRent := {}
	    For i := 1 to len(aVeicRent)
	           aadd(aColsRent,{oVerde,aVeicRent[i,1],aVeicRent[i,2],aVeicRent[i,3],.F.})
	    Next
    endif
    
	    //Setar array do aCols do Objeto.
	    oLRent:SetArray(aColsRent,.T.)
	    //Atualizo as informações no grid
	    oLRent:Refresh()
Return


/*/{Protheus.doc} Carregar
Carrega os dados da tabela de veículos para o grid
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static Function Carregar()
  Local i
  aVeiculos := {}

	dbSelectArea("SZ1")
	DbSetOrder(1)

	SZ1->(dbGotop())
	While !SZ1->(Eof())
		AAdd(aVeiculos,{SZ1->Z1_COD,SZ1->Z1_DESC,SZ1->Z1_PLACA, SZ1->Z1_STATUS })
		SZ1->(DbSkip())
	EndDo
	dbCloseArea("SZ1")

    IF(LEN(aVeiculos) > 0)
		aColsVeic := {}
	    For i := 1 to len(aVeiculos)
	        if(aVeiculos[i,4]="1")
	           aadd(aColsVeic,{oVerde,aVeiculos[i,1],aVeiculos[i,2],aVeiculos[i,3],.F.})
	        Else
	           aadd(aColsVeic,{oVermelho,aVeiculos[i,1],aVeiculos[i,2],aVeiculos[i,3],.F.})
	        Endif
	    Next
    endif
    
	    //Setar array do aCols do Objeto.
	    oLista:SetArray(aColsVeic,.T.)
	    //Atualizo as informações no grid
	    oLista:Refresh()

Return


/*/{Protheus.doc} Legenda
Legenda de todo o grid (ATIVOS/INATIVOS)
@type function
@author Placido
@since 06/08/2018
@version 1.0
@return ${return}, ${return_description}
@example
(examples)
@see (links_or_references)
/*/Static function Legenda()
    Local aLegenda := {}
    AADD(aLegenda,{"BR_VERDE"    	,"   Veiculo Ativo" })
    AADD(aLegenda,{"BR_VERMELHO" 	,"   Veiculo Inativo" })

    BrwLegenda("Legenda", "Legenda", aLegenda)
Return Nil         

//*******************************
//*******************************
/*CRIAÇÃO DOS CAMPOSA AUTOMÁTICOS SZ1 VEÍCULOS*/
//*******************************
//*******************************
Static Function FillSZ1()

Local aSX2 := {}
Local aSX3 := {}
Local aSIX := {}
Local aSXB := {}

aSX2 := {"SZ1","VEICULOS","C","E","E"}

aAdd(aSX3,{'Z1_FILIAL',.T.,2,0,'C','Filial','Filial do Sistema','@!',1,'',.T.,'','','','','N',.F.,'','','',''})
aAdd(aSX3,{'Z1_COD',.F.,6,0,'C','Cod. Veiculo','Codigo Veiculo','999999',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z1_DESC',.F.,30,0,'C','Desc. Veicul','Descricao Veiculo','',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z1_PLACA',.F.,7,0,'C','Placa','Placa Veiculo','',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z1_STATUS',.F.,1,0,'C','Ativo/Inativ','Ativo/Inativo','',0,'',.T.,'','','A','R','S',.T.,'1="Ativo";2="Inativo"','','',''})


aAdd(aSIX,{'SZ1','1','Z1_COD','Cod. Veiculo','U','0','N'})
aAdd(aSIX,{'SZ1','2','Z1_COD+Z1_DESC','Cod. Veiculo+Desc. Veicul','U','0','N'})
aAdd(aSIX,{'SZ1','3','Z1_PLACA','Placa','U','0','N'})


aAdd(aSXB,{'SZ1','1','01','DB','VEICULOS','SZ1'})
aAdd(aSXB,{'SZ1','2','01','01','Cod. Veiculo',''})
aAdd(aSXB,{'SZ1','2','02','02','Cod. Veiculo+desc. V',''})
aAdd(aSXB,{'SZ1','4','01','01','Cod. Veiculo','Z1_CODZ1_DESC'})
aAdd(aSXB,{'SZ1','4','02','01','Cod. Veiculo','Z1_CODZ1_DESC'})
aAdd(aSXB,{'SZ1','5','01','','','SZ1->Z1_COD+SZ1->Z1_DESC'})
aAdd(aSXB,{'SZ1','6','01','','','SZ1->Z1_STATUS="1"'})

//CHAMA A FUNÇÃO PARA CRIAR O DICIONÁRIO DE DADOS COM OS DADOS DOS 4 ARRAYS (TABELA, CAMPOS,ÍNDICE E CONSULTAS PADRÃO
u_zCriaTab(aSX2, aSX3, aSIX, aSXB)

return


//*******************************
//*******************************
/*CRIAÇÃO DOS CAMPOSA AUTOMÁTICOS SZ2 MOTORISTAS*/
//*******************************
//*******************************
Static Function FillSZ2()

Local aSX2 := {}
Local aSX3 := {}
Local aSIX := {}
Local aSXB := {}

aSX2 := {"SZ2","MOTORISTAS","C","E","E"}

aAdd(aSX3,{'Z2_FILIAL',.T.,2,0,'C','Filial','Filial do Sistema','@!',1,'',.T.,'','','','','N',.F.,'','','',''})
aAdd(aSX3,{'Z2_COD',.F.,6,0,'C','Codigo','Codigo Motorista','999999',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z2_NOME',.F.,25,0,'C','Nome','Nome','',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z2_CNH',.F.,8,0,'C','CNH','CNH','',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z2_CATEG',.F.,2,0,'C','Categoria','Categoria','',0,'',.T.,'','','A','R','S',.T.,'','','',''})
aAdd(aSX3,{'Z2_STATUS',.F.,1,0,'C','Status','Status','',0,'',.T.,'','','A','R','S',.T.,'','','',''})

aAdd(aSIX,{'SZ2','1','Z2_COD','Codigo','U','0','N'})
aAdd(aSIX,{'SZ2','2','Z2_COD+Z2_NOME','Codigo+Nome','U','0','N'})
aAdd(aSIX,{'SZ2','3','Z2_CNH','CNH','U','0','N'})

aAdd(aSXB,{'SZ2','1','01','DB','Codigo Motoristas','SZ2'})
aAdd(aSXB,{'SZ2','2','01','01','Codigo',''})
aAdd(aSXB,{'SZ2','2','02','02','Codigo+nome',''})
aAdd(aSXB,{'SZ2','4','01','01','Codigo','Z2_COD+Z2_NOME'})
aAdd(aSXB,{'SZ2','4','02','01','Codigo','Z2_COD+Z2_NOME'})
aAdd(aSXB,{'SZ2','5','01','','','SZ2->Z2_COD+SZ2->Z2_NOME'})
aAdd(aSXB,{'SZ2','6','01','','','SZ2->Z2_STATUS="1"'})

//CHAMA A FUNÇÃO PARA CRIAR O DICIONÁRIO DE DADOS COM OS DADOS DOS 4 ARRAYS (TABELA, CAMPOS,ÍNDICE E CONSULTAS PADRÃO
u_zCriaTab(aSX2, aSX3, aSIX,aSXB)

return


/*/{Protheus.doc} zCriaTab
Função para criação das tabelas e/ou campos
@author Atilio
@since 06/08/2015
@version 1.0
    @param aSX2, Array, Dados do Dicionário
    @param aSX3, Array, Dados dos Campos
    @param aSIX, Array, Dados da SIX
    @param aSXB, Array, Dados da SXB
    @example
    u_zCriaTab()
    @obs Abaixo a estrutura dos arrays:
    SX2:
        [01] - Chave
        [02] - Descrição
        [03] - Modo
        [04] - Modo Un.
        [05] - Modo Emp.
    SX3:
        [nLinha][01] - Campo
        [nLinha][02] - Filial?
        [nLinha][03] - Tamanho
        [nLinha][04] - Decimais
        [nLinha][05] - Tipo
        [nLinha][06] - Título
        [nLinha][07] - Descrição
        [nLinha][08] - Máscara
        [nLinha][09] - Nível
        [nLinha][10] - Vld.User
        [nLinha][11] - Usado?
        [nLinha][12] - Ini.Padr.
        [nLinha][13] - Cons.F3
        [nLinha][14] - Visual
        [nLinha][15] - Contexto
        [nLinha][16] - Browse
        [nLinha][17] - Obrigatório?
        [nLinha][18] - Lista Opções
        [nLinha][19] - Modo de Edição
        [nLinha][20] - Ini Browse
        [nLinha][21] - Pasta
    SIX:
        [nLinha][01] - Índice
        [nLinha][02] - Ordem
        [nLinha][03] - Chave
        [nLinha][04] - Descrição
        [nLinha][05] - Propriedade
        [nLinha][06] - NickName
        [nLinha][07] - Mostr.Pesq
        
    SXB:
        [nLinha][01] - Alias
        [nLinha][02] - Tipo
        [nLinha][03] - Sequencia
        [nLinha][04] - Coluna
        [nLinha][05] - Descricao
        [nLinha][06] - Contem
        [nLinha][07] - Mostr.Pesq        
/*/


User Function zCriaTab(aSX2, aSX3, aSIX, aSXB)
    Local aArea := GetArea()
    Local aAreaX2 := SX2->(GetArea())
    Local aAreaX3 := SX3->(GetArea())
    Local aAreaIX := SIX->(GetArea())
    Local aAreaXB := SXB->(GetArea())
    Local cTabAux := aSX2[1]
    Local lTabCriada := .F.
    Local lTemAltera := .F.
    Local cMsgAux := ""
    Local nAtual := 0
    Local cOrdemAux := ""
     
    //Setando os índices
    SX2->(dbSetOrder(1)) // X2_CHAVE
    SX3->(dbSetOrder(2)) // X3_CAMPO
    SIX->(dbSetOrder(1)) // INDICE+ORDEM
    SXB->(dbSetorder(1)) // ALIAS + TIPO
     
    //Se não conseguir posicionar na tabela, irá criá-la
    SX2->(DbSetOrder(1))
    If !SX2->(DbSeek(cTabAux))
        RecLock("SX2", .T.)
            SX2->X2_CHAVE        :=    cTabAux
            SX2->X2_PATH        :=    "\data\"
            SX2->X2_ARQUIVO    :=    cTabAux+SM0->M0_CODIGO+"0"
            SX2->X2_NOME        :=    aSX2[2]
            SX2->X2_NOMESPA    :=    aSX2[2]
            SX2->X2_NOMEENG    :=    aSX2[2]
            SX2->X2_ROTINA    :=    ""
            SX2->X2_MODO        :=    aSX2[3]
            SX2->X2_MODOUN    :=    aSX2[4]   
            SX2->X2_MODOEMP    :=    aSX2[5]
            SX2->X2_DELET        :=    0
            SX2->X2_TTS        :=    ""
            SX2->X2_UNICO        :=    ""
            SX2->X2_PYME        :=    ""
            SX2->X2_MODULO    :=    0
        SX2->(MsUnlock())
     
        lTabCriada := .T.
    Else
        lTabCriada := .T.
    EndIf
     
    //Se a tabela tiver sido criada
    If lTabCriada
        //Percorrendo os campos
        For nAtual := 1 To Len(aSX3)
            If !SX3->(DbSeek(aSX3[nAtual][01]))
                fProxSX3(cTabAux, @cOrdemAux)
                                 
                //Se for campo de filial, trata de forma diferente
                If aSX3[nAtual][02]
                    RecLock("SX3", .T.)
                        SX3->X3_ARQUIVO    :=    cTabAux
                        SX3->X3_ORDEM        :=    cOrdemAux
                        SX3->X3_CAMPO        :=    aSX3[nAtual][01]
                        SX3->X3_TIPO        :=    aSX3[nAtual][05]
                        SX3->X3_TAMANHO    :=    aSX3[nAtual][03]
                        SX3->X3_DECIMAL    :=    aSX3[nAtual][04]
                        SX3->X3_TITULO    :=    aSX3[nAtual][06]
                        SX3->X3_TITSPA    :=    aSX3[nAtual][06]
                        SX3->X3_TITENG    :=    aSX3[nAtual][06]
                        SX3->X3_DESCRIC    :=    aSX3[nAtual][07]
                        SX3->X3_DESCSPA    :=    aSX3[nAtual][07]
                        SX3->X3_DESCENG    :=    aSX3[nAtual][07]
                        SX3->X3_PICTURE    :=    aSX3[nAtual][08]
                        SX3->X3_USADO        :=    _X3_USFILIAL
                        SX3->X3_RESERV    :=    "€€"
                        SX3->X3_GRPSXG    :=    "033"
                        SX3->X3_PYME        :=    "S"
                        SX3->X3_IDXSRV    :=    "N"
                        SX3->X3_ORTOGRA    :=    "N"
                        SX3->X3_IDXFLD    :=    "N"
                        SX3->X3_BROWSE    :=    "N"
                        SX3->X3_NIVEL        :=    aSX3[nAtual][09]
                    SX3->(MsUnlock())
                     
                //Senão cria o campo
                Else
                    RecLock("SX3", .T.)
                        SX3->X3_ARQUIVO    :=    cTabAux
                        SX3->X3_ORDEM        :=    cOrdemAux
                        SX3->X3_CAMPO        :=    aSX3[nAtual][01]
                        SX3->X3_TIPO        :=    aSX3[nAtual][05]
                        SX3->X3_TAMANHO    :=    aSX3[nAtual][03]
                        SX3->X3_DECIMAL    :=    aSX3[nAtual][04]
                        SX3->X3_TITULO    :=    aSX3[nAtual][06]
                        SX3->X3_TITSPA    :=    aSX3[nAtual][06]
                        SX3->X3_TITENG    :=    aSX3[nAtual][06]
                        SX3->X3_DESCRIC    :=    aSX3[nAtual][07]
                        SX3->X3_DESCSPA    :=    aSX3[nAtual][07]
                        SX3->X3_DESCENG    :=    aSX3[nAtual][07]
                        SX3->X3_PICTURE    :=    aSX3[nAtual][08]
                        SX3->X3_VLDUSER    :=    aSX3[nAtual][10]
                        SX3->X3_VALID        :=    ""
                        SX3->X3_USADO        :=    Iif(aSX3[nAtual][11], _X3_USADO, _X3_USFILIAL)
                        SX3->X3_RELACAO    :=    aSX3[nAtual][12]
                        SX3->X3_F3            :=    aSX3[nAtual][13]
                        SX3->X3_NIVEL        :=    aSX3[nAtual][09]
                        SX3->X3_RESERV    :=    _X3_RESERV
                        SX3->X3_CHECK        :=    ""
                        SX3->X3_TRIGGER    :=    ""
                        SX3->X3_PROPRI    :=    "U"
                        SX3->X3_VISUAL    :=    aSX3[nAtual][14]
                        SX3->X3_CONTEXT    :=    aSX3[nAtual][15]
                        SX3->X3_BROWSE    :=    aSX3[nAtual][16]
                        SX3->X3_OBRIGAT    :=    Iif(aSX3[nAtual][17], _X3_OBRIGA, _X3_NAO_OBRIGA)
                        SX3->X3_CBOX        :=    aSX3[nAtual][18]
                        SX3->X3_CBOXSPA    :=    aSX3[nAtual][18]
                        SX3->X3_CBOXENG    :=    aSX3[nAtual][18]
                        SX3->X3_PICTVAR    :=    ""
                        SX3->X3_WHEN        :=    aSX3[nAtual][19]
                        SX3->X3_INIBRW    :=    aSX3[nAtual][20]
                        SX3->X3_GRPSXG    :=    ""
                        SX3->X3_FOLDER    :=    aSX3[nAtual][21]
                        SX3->X3_PYME        :=    "S"
                        SX3->X3_CONDSQL    :=    ""
                        SX3->X3_IDXSRV    :=    "N"
                        SX3->X3_ORTOGRA    :=    "N"
                        SX3->X3_IDXFLD    :=    "N"  
                        SX3->X3_TELA        :=    ""
                    SX3->(msUnlock()) 
                EndIf
                lTemAltera := .T.
            EndIf
        Next
         
        //Percorrendo os índices
        For nAtual := 1 To Len(aSIX)
            //Se não conseguir posicionar, quer dizer que não existe o índice, logo será criado
            If ! SIX->(DbSeek(aSIX[nAtual][1] + aSIX[nAtual][2]))
                RecLock("SIX", .T.)
                    SIX->INDICE        :=    aSIX[nAtual][1]
                    SIX->ORDEM            :=    aSIX[nAtual][2]
                    SIX->CHAVE            :=    aSIX[nAtual][3]
                    SIX->DESCRICAO    :=    aSIX[nAtual][4]
                    SIX->DESCSPA        :=    aSIX[nAtual][4]
                    SIX->DESCENG        :=    aSIX[nAtual][4]
                    SIX->PROPRI        :=    aSIX[nAtual][5]
                    SIX->F3            :=    ""
                    SIX->NICKNAME        :=    aSIX[nAtual][6]
                    SIX->SHOWPESQ        :=    aSIX[nAtual][7]
                SIX->(MsUnlock())
                lTemAltera := .T.
            EndIf
        Next

        //Percorrendo as consultas
        For nAtual := 1 To Len(aSXB)
            //Se não conseguir posicionar, quer dizer que não existe A CONSULTA, logo será criado
            If !SXB->(DbSeek(aSXB[nAtual][1] + aSXB[nAtual][2])) //ALIAS + TIPO (ORDEM)
                RecLock("SXB",.T.)
                    SXB->XB_ALIAS        :=    aSXB[nAtual][1]
                    SXB->XB_TIPO         :=    aSXB[nAtual][2]
                    SXB->XB_SEQ          :=    aSXB[nAtual][3]
                    SXB->XB_COLUNA    	 :=    aSXB[nAtual][4]
                    SXB->XB_DESCRI       :=    aSXB[nAtual][5]
                    SXB->XB_DESCSPA      :=    aSXB[nAtual][5]
                    SXB->XB_DESCENG      :=    aSXB[nAtual][5]
                    SXB->XB_CONTEM       :=    aSXB[nAtual][6]
                SXB->(MsUnlock())
                lTemAltera := .T.
            EndIf
        Next
         
        //Se tiver alterações em campo e/ou índices
        if lTemAltera
            //Bloqueia alterações no Dicionário
            __SetX31Mode(.F.)
             
            //Se a tabela tiver aberta nessa seção, fecha
            If Select(cTabAux) > 0
                (cTabAux)->(DbCloseArea())
            EndIf
         
            //Atualiza o Dicionário
            X31UpdTable(cTabAux)
             
            //Se houve Erro na Rotina
            If __GetX31Error()
                cMsgAux := "Houveram erros na atualização da tabela "+cTabAux+":"+Chr(13)+Chr(10)
                cMsgAux += __GetX31Trace()
                Aviso('Atenção', cMsgAux, {'OK'}, 03)
            EndIf                                                        
             
            //Abrindo a tabela para criar dados no sql
            DbSelectArea(cTabAux)
             
            //Desbloqueando alterações no dicionário
            __SetX31Mode(.T.)
        endif
    EndIf
     
    RestArea(aAreaXB) 
    RestArea(aAreaIX)
    RestArea(aAreaX3)
    RestArea(aAreaX2)
    RestArea(aArea)
Return
 
/*---------------------------------------------------------------------*
 | Func:  fProxSX3                                                     |
 | Autor: Daniel Atilio                                                |
 | Data:  06/08/2015                                                   |
 | Desc:  Função que pega a próxima sequencia da SX3                   |
 *---------------------------------------------------------------------*/
 
Static Function fProxSX3(cTabela, cOrdem)
    Local aArea := GetArea()
    Local aAreaX3 := SX3->(GetArea())
    Default cOrdem := ""
     
    //Se não vir ordem, irá percorrer a SX3 para encontrar a ordem atual
    If Empty(cOrdem)
        SX3->(DBSetOrder(1)) //TABELA
         
        //Se conseguir posicionar na tabela
        If SX3->(DBSeek(cTabela))
            //Enquanto houver registros e for a mesma tabela
            While !SX3->(EoF()) .AND. SX3->X3_ARQUIVO == cTabela
                cOrdem := SX3->X3_ORDEM
 
                SX3->(DBSkip())
            EndDo
        Else
            cOrdem := "00"
        EndIf
        cOrdem := Soma1(cOrdem)
         
    //Senão, irá somar 1, pois a tabela não tem nenhuma ordem
    Else
        cOrdem := Soma1(cOrdem)
    EndIf
     
    RestArea(aAreaX3)
    RestArea(aArea)
Return
 
/*/{Protheus.doc} zExistSIX
Função que verifica se o indice já existe, setando a última sequencia disponível
@author Atilio
@since 31/08/2015
@version 1.0
    @param cTabela, Caracter, Tabela buscada
    @param cNickName, Caracter, NickName do índice buscado
    @param cSequen, Caracter, Última sequencia disponível dos índices
    @return lExist, Retorna se o índice já existe ou não
    @example
    u_zExistSIX('SB1', 'CAMPO', @cOrdem)
/*/
 
User Function zExistSIX(cTabela, cNickName, cSequen)
    Local aAreaSIX := SIX->(GetArea())
    Local lExist := .F.
    Local cSequen := "1"
     
    SIX->(DbSetOrder(1)) //Indice + Ordem
    SIX->(DbGoTop())
     
    //Se conseguir posicionar na tabela
    If SIX->(DbSeek(cTabela))
        //Enquanto não for fim da tabela e for o mesmo índice
        While ! SIX->(EoF()) .And. SIX->INDICE == cTabela
            //Se tiver o mesmo apelido, já existe o índice
            If Alltrim(SIX->NICKNAME) == Alltrim(cNickName)
                lExist := .T.
            EndIf
         
            cSequen := SIX->ORDEM
            SIX->(DbSkip())
        EndDo
        cSequen := Soma1(cSequen)
    EndIf
 
    RestArea(aAreaSIX)
Return lExist


 

Colaboração de:
Adeilton Placid dos Santos Junior
Cientista da computação especialista em banco de dados, com expertise
em desenvolvimento de software, implantação, manutenção e administração do Protheus.
administrador de banco de dados, com expertise em sql server
https://www.facebook.com/juniorplacidojp
https://www.instagram.com/juniorplacido
https://www.linkedin.com/in/juniorplacido/


Equipe Blog Advpl

Amantes da tecnologia

0 comentário

Deixe uma resposta