Criando um CRUD do zero no Protheus | Ti Especial 0009

No vídeo de hoje, vamos demonstrar em como criar uma tela para cadastro de informações do tipo CRUD (Create, Read, Update e Delete) no Protheus.

Abaixo o vídeo do nosso canal no YouTube:

Abaixo a estrutura da tabela:

Tabela (SX2):
	ZA1 - Artistas - Totalmente compartilhada

Campos (SX3):
	Campo      | Tipo      | Tamanho | Contexto | Visual?    | Título      | Usado | Browse | Obrigatório | Inic Padrão                    | Validação Usuário     | Opções do ComboBox
	===========*===========*=========*==========*============*=============*=======*========*=============*================================*=======================*===============================================================================================
	ZA1_CODIGO | Caractere | 6       | Real     | Visualizar | Código      | Sim   | Sim    |             | GetSXENum('ZA1', 'ZA1_CODIGO') |                       | 
	ZA1_DATA   | Data      | 8       | Real     | Visualizar | Data Cad.   | Sim   |        |             | Date()                         |                       | 
	ZA1_HORA   | Caractere | 8       | Real     | Visualizar | Hora Cad.   | Sim   |        |             | Time()                         |                       | 
	ZA1_NOME   | Caractere | 100     | Real     | Alterar    | Nome        | Sim   | Sim    | Sim         |                                | NaoVazio()            | 
	ZA1_TIPO   | Caractere | 1       | Real     | Alterar    | Tipo        | Sim   | Sim    | Sim         |                                | Pertence("ACDELMOPT") | A=Audiovisual;C=Cinema;D=Dança;E=Escultura;L=Literatura;M=Música;O=Outros;P=Pintura;T=Teatro;
	ZA1_OBRAS  | Numérico  | 6,2     | Real     | Alterar    | Qtd. Obras  | Sim   |        |             |                                | Positivo()            | 
	ZA1_OBSERV | Memo      | 10      | Real     | Alterar    | Observações | Sim   |        |             |                                |                       | 

Índices (SIX):
	ZA1_FILIAL + ZA1_CODIGO
	ZA1_FILIAL + ZA1_NOME

Separadores (SXA):
	Cadastro: ZA1_CODIGO, ZA1_DATA, ZA1_HORA
	Artista: ZA1_NOME, ZA1_TIPO, ZA1_OBRAS, ZA1_OBSERV

Abaixo o código fonte desenvolvido para fazer o cadastro de informações na tabela:

//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"

//Variveis Estaticas
Static cTitulo := "Artistas"
Static cAliasMVC := "ZA1"

/*/{Protheus.doc} User Function zCadZA1
Cadastro de Artistas
@author Daniel Atilio
@since 10/04/2025
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

User Function zCadZA1()
	Local aArea   := FWGetArea()
	Local oBrowse
	Private aRotina := {}

	//Definicao do menu
	aRotina := MenuDef()

	//Instanciando o browse
	oBrowse := FWMBrowse():New()
	oBrowse:SetAlias(cAliasMVC)
	oBrowse:SetDescription(cTitulo)
	oBrowse:DisableDetails()

	//Adicionando as Legendas
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'A'", "BLACK",    "Audiovisual" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'C'", "BLUE",    "Cinema" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'D'", "BROWN",    "Dança" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'E'", "GRAY",    "Escultura" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'L'", "GREEN",    "Literatura" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'M'", "ORANGE",    "Música" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'O'", "PINK",    "Outros" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'P'", "RED",    "Pintura" )
	oBrowse:AddLegend( "ZA1->ZA1_TIPO == 'T'", "VIOLET",    "Teatro" )

	//Ativa a Browse
	oBrowse:Activate()

	FWRestArea(aArea)
Return Nil

/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zCadZA1
@author Daniel Atilio
@since 10/04/2025
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function MenuDef()
	Local aRotina := {}

	//Adicionando opcoes do menu
	ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zCadZA1" OPERATION 1 ACCESS 0
	ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zCadZA1" OPERATION 3 ACCESS 0
	ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zCadZA1" OPERATION 4 ACCESS 0
	ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zCadZA1" OPERATION 5 ACCESS 0
	ADD OPTION aRotina TITLE "Copiar" ACTION "VIEWDEF.zCadZA1" OPERATION 9 ACCESS 0

Return aRotina

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zCadZA1
@author Daniel Atilio
@since 10/04/2025
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ModelDef()
	Local oStruct := FWFormStruct(1, cAliasMVC)
	Local oModel
	Local bPre := Nil
	Local bPos := Nil
	Local bCancel := Nil


	//Cria o modelo de dados para cadastro
	oModel := MPFormModel():New("zCadZA1M", bPre, bPos, /*bCommit*/, bCancel)
	oModel:AddFields("ZA1MASTER", /*cOwner*/, oStruct)
	oModel:SetDescription("Modelo de dados - " + cTitulo)
	oModel:GetModel("ZA1MASTER"):SetDescription( "Dados de - " + cTitulo)
	oModel:SetPrimaryKey({})
Return oModel

/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zCadZA1
@author Daniel Atilio
@since 10/04/2025
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ViewDef()
	Local oModel := FWLoadModel("zCadZA1")
	Local oStruct := FWFormStruct(2, cAliasMVC)
	Local oView

	//Cria a visualizacao do cadastro
	oView := FWFormView():New()
	oView:SetModel(oModel)
	oView:AddField("VIEW_ZA1", oStruct, "ZA1MASTER")
	oView:CreateHorizontalBox("TELA" , 100 )
	oView:SetOwnerView("VIEW_ZA1", "TELA")

Return oView

Leitura Complementar:

 

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.

Deixe uma resposta

Terminal de Informação