PC SOFT
ONLINE REPOSITORY
FOR WINDEVWEBDEV AND WINDEV MOBILE

Home |  | Sign in | English US
Framework Classe Oop CRUD WX Solucoes - WINDEV, WEBDEV - WINDEV Mobile - Revisado sem variaveis globais e com paginacao
Published by Boller
in the category Tools
New features



Description
REVISADO

Framework Classe Oop CRUD WX Solucoes - WINDEV, WEBDEV - WINDEV Mobile - Revisado sem variaveis globais e com paginacao

video
https://youtu.be/cTO3dG1P79Y

ATUALIZACAO 05/10/2024

EXEMPLO BASICO DE ESTUDO
/////////////////////////////////////////////////////

// criação da classe

Classe_Crud is a Class
n_classe is array of st_classe
END
st_classe is Structure
nome_tabela is string
campo_chave is string
busca_id is 8-byte int
btn_alterar is string
nome_grid is string
END

// como usar a classe

PROCEDURE MyWindow()

obj01 is Classe_Crud
ArrayAdd(obj01:n_classe)
obj01.n_classe[1].btn_alterar = "btn_alterar"
obj01.n_classe[1].busca_id = 0
obj01.n_classe[1].campo_chave = "AgostoID"
obj01.n_classe[1].nome_tabela = "Agosto"
obj01.n_classe[1].nome_grid = "table_agosto"

obj02 is Classe_Crud
ArrayAdd(obj02:n_classe)
obj02.n_classe[1].btn_alterar = "btn_incluir"
obj02.n_classe[1].busca_id = 0
obj02.n_classe[1].campo_chave = "SetembroID"
obj02.n_classe[1].nome_tabela = "Setembro"
obj02.n_classe[1].nome_grid = "table_setembro"

/////////////////////////////////////////////////////


Essa classe pode ser usada e melhorada para os 3 WX (WINDEV, WEBDEV e WINDEV Mobile)

A finalidade dela reduzir o código de suas aplicações

Os métodos usados nela são para formulários com planes camadas que permite ter o browser e form na mesma tela sendo a gestão mais simples.

Qualquer melhoria ou dúvida me comunique para atualizar aqui a última versão

Criamos em txt para que qualquer versão possa usar sem nenhum problema.

Compartilhe seu conhecimento e ajude a melhorar essa classe Crud com mais técnicas crie um novo método e melhore a mesma mas mantendo os métodos originais isso é muito importante.

Quanto mais melhorar esse código melhor para todos da comunidade internacional WX (WINDEV, WEBDEV e WINDEV Mobile).

ABERTURA DA JANELA
////////////////////////////////////////

PROCEDURE MyWindow()

obj_01 is Classe_OOP
ArrayAdd(obj_01:m_Tabela)

obj_01.m_Tabela[1].gs_TipoBusca = 1
obj_01.m_Tabela[1].gs_nomeJanela = MyWindow..Name
obj_01.m_Tabela[1].gs_GrupoCampos = GR_CAMPOS..Name
obj_01.m_Tabela[1].gs_BotaoAlterar = BTN_Alterar..Name
obj_01.m_Tabela[1].gs_TableFile = t000_pessoas..Name
obj_01.m_Tabela[1].gs_TableGrid_Coluna_ID = COL_T000_pessoa_ID..Name
obj_01.m_Tabela[1].gs_TableGrid_Coluna_Name = COL_T000_pessoa_ID..Name
obj_01.m_Tabela[1].gs_TableGrid = TABLE_T000_pessoas..Name
obj_01.m_Tabela[1].gs_CampoChave = t000_pessoas.t000_pessoa_ID..Name
obj_01.m_Tabela[1].gs_imagem_lateral = IMG_Lateral
obj_01.m_Tabela[1].gb_lockRec = True
obj_01.m_Tabela[1].gn_PlanoBrowser = 1
obj_01.m_Tabela[1].gn_PlanoForm = 2

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Abaixo o código original da classe

Classe_OOP is Class

END



// Summary: <specify the procedure action>
// Syntax:
//evento_alterar (<tabela>, <chave>, <tableGrid>)
//
// Parameters:
// tabela: <specify the role of tabela>
// chave: <specify the role of chave>
// tableGrid: <specify the role of tableGrid>
// Example:
// <Specify a usage example>
//
// Return value:
// acao: <specify the role of acao>
// nomeJanela: <specify the role of nomeJanela>
// ID: <specify the role of ID>
PROCEDURE PUBLIC GLOBAL evento_alterar(tabela, chave, tableGrid)

//Info("alterar",tabela, nomeJanela, tableGrid, acao, ID)

// Verificar se uma linha foi selecionada

IF tabela = "" THEN
RETURN
END

IF chave = "" THEN
RETURN
END

IF tableGrid = "" THEN
RETURN
END

// no controle de tela
IF TableSelect(tableGrid) = -1 OR gn_ID = 0

gn_ID = 0

gs_acao = ""

gb_Status = False

RETURN

ELSE

gb_Status = True

gs_acao = "alterar"

IF evento_lock_record(tabela,gn_ID) = True THEN

HReset(tabela)

IF HReadSeek(tabela,chave,gn_ID,hIdentical) = True THEN

FileToScreen()

evento_go_plane(gs_nomeJanela,2)

gb_Status = True

ELSE

gn_ID = 0

gs_acao = ""

gb_Status = False

IF glo_debug = True THEN

StatusRecord is string = ""

SWITCH HState(tabela,gn_ID)

CASE 1
StatusRecord = "Registro Ativo"
CASE 2
StatusRecord = "Registro excluido logicamente"
CASE 3
StatusRecord = "Registro excluido fisicamente"
CASE 4
StatusRecord = "Status invalido"
OTHER CASE
StatusRecord = "Situação inesperada do HState"
END

Info( StatusRecord )

END

RETURN

END

ELSE
Info("O registro esta em uso por outra estação")
END

END



//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_alterar_imagem ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Janela_ImgLateral:
PROCEDURE PUBLIC GLOBAL evento_alterar_imagem()

Status is boolean

Indirection_Janela_ImagemLateral is string = gs_nomeJanela +"."+ gs_imagem_lateral

PathImagemLateral is string = fSelect("", "", "Selecione uma imagem com 200x640", "JPG (JPG.*)" + TAB + "*.JPG" + CR + "PNG" + TAB + "*.PNG", "*.PNG")

IF PathImagemLateral <> "" THEN

Status = True

INIWrite("CONFIG","Imagem_Lateral",PathImagemLateral,fCurrentDir()+fSep()+"CONFIG.INI")

{Indirection_Janela_ImagemLateral} = PathImagemLateral

ELSE

Status = False

END

RESULT Status

//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//evento_excluir ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
// nomeJanela: <specify the role of nomeJanela>
// acao: <specify the role of acao>
// tabela: <specify the role of tabela>
// campo: <specify the role of campo>
// tableGrid: <specify the role of tableGrid>
PROCEDURE PUBLIC GLOBAL evento_excluir()

//Info("excluir",tabela, nomeJanela, tableGrid, acao)

tabela is string = gs_TableFile
campo is string = gs_CampoChave
tableGrid is string = gs_TableGrid

// Verificamos se uma linha foi selecionada
IF TableSelect(tableGrid) = -1 THEN
gn_ID = 0
RETURN
ELSE
//1 : Sim
//2 : Não
SWITCH Dialog("Deseja excluir o registro?")
// Sim
CASE 1
// Posiciona o controle de tela no registro atual
HReset(tabela)
IF HReadSeek(tabela,campo,gn_ID,hIdentical) = True
IF HDelete(tabela) = True THEN

IF glo_debug = True THEN

StatusRecord is string = ""

SWITCH HState(tabela,gn_ID)

CASE 1
StatusRecord = "Registro Ativo"
CASE 2
StatusRecord = "Registro excluido logicamente"
CASE 3
StatusRecord = "Registro excluido fisicamente"
CASE 4
StatusRecord = "Status invalido"
OTHER CASE
StatusRecord = "Situação inesperada do HState"
END

Info( StatusRecord )

END

TableDisplay(tableGrid, taInit)
TableDisplay(tableGrid, taReExecuteQuery)
END
END
// Não
CASE 2
gn_ID = 0
END
END


//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//evento_excluir_HCross ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE PUBLIC GLOBAL evento_excluir_HCross()

//Info("excluir",tabela, nomeJanela, tableGrid, acao)

tabela is string = gs_TableFile
campo is string = gs_CampoChave
tableGrid is string = gs_TableGrid

// Verificamos se uma linha foi selecionada
IF TableSelect(tableGrid) = -1 THEN
gn_ID = 0
RETURN
ELSE
//1 : Sim
//2 : Não
SWITCH Dialog("Deseja excluir o registro?")
// Sim
CASE 1
// Posiciona o controle de tela no registro atual
HReset(tabela)
IF HReadSeek(tabela,campo,gn_ID,hIdentical) = True
IF HCross(tabela) = True THEN

IF glo_debug = True THEN

StatusRecord is string = ""

SWITCH HState(tabela,gn_ID)

CASE 1
StatusRecord = "Registro Ativo"
CASE 2
StatusRecord = "Registro excluido logicamente"
CASE 3
StatusRecord = "Registro excluido fisicamente"
CASE 4
StatusRecord = "Status invalido"
OTHER CASE
StatusRecord = "Situação inesperada do HState"
END

Info( StatusRecord )

END

TableDisplay(tableGrid, taInit)
TableDisplay(tableGrid, taReExecuteQuery)

END
END
// Não
CASE 2
gn_ID = 0
END
END


//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// evento_exibir_imagem_lateral ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE PUBLIC GLOBAL evento_exibir_imagem_lateral()

Status is boolean = False

IndirectionNomeJanelaImagemLateral is string = gs_nomeJanela +"."+ gs_imagem_lateral

PathImagemLateral is string = INIRead("CONFIG","Imagem_Lateral","",fCurrentDir()+fSep()+"CONFIG.INI")

IF PathImagemLateral <> "" THEN

//{IndirectionNomeJanelaImagemLateral} = PathImagemLateral

Status = True

ELSE

Status = False

END

RESULT Status


//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//Evento_Filtrar ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE PUBLIC GLOBAL Evento_Filtrar()

CampoFiltro is string = gs_nomeJanela + ".EDT_JANUSGRID"

gs_JanusGrid = {CampoFiltro}..Value

IF gs_TipoBusca = 0 THEN
RETURN
END

IF gs_JanusGrid = "" THEN
RETURN
END

gs_JanusGrid = Replace(gs_JanusGrid,CRLF," ")

gs_JanusGrid = Replace(gs_JanusGrid,CR," ")

IF gs_Debug = True
Info(gs_JanusGrid)
END

IF gs_TipoBusca = 1
//gs_JanusGrid Order by
Evento_Filtrar_OrderBy()
ELSE IF gs_TipoBusca = 2
//gs_JanusGrid SQL
Evento_Filtrar_SQL()
ELSE
Info("Selecione um Tipo de Busca")
END


//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//Evento_Filtrar_OrderBy ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE PUBLIC GLOBAL Evento_Filtrar_OrderBy()

IF gs_JanusGrid = "" THEN
RETURN
END

sqlcodigo is string = [
select
*
from
@tabela@
order by
@orderby@
]

sqlcodigo = Replace(sqlcodigo,"@tabela@",gs_TableFile,IgnoreCase)
sqlcodigo = Replace(sqlcodigo,"@orderby@",gs_JanusGrid,IgnoreCase)

dsQuery is Data Source

IF HExecuteSQLQuery(dsQuery,hQueryDefault,sqlcodigo) = True THEN

FOR EACH dsQuery
//....
END

END

//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// Evento_Filtrar_SQL ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE PUBLIC GLOBAL Evento_Filtrar_SQL()

IF gs_JanusGrid = "" THEN
RETURN
END

sqlcodigo is string = [
select
*
from
@tabela@
where
@filtros@
]

sqlcodigo = Replace(sqlcodigo,"@tabela@",gs_TableFile,IgnoreCase)
sqlcodigo = Replace(sqlcodigo,"@filtros@",gs_JanusGrid,IgnoreCase)

dsQuery is Data Source

IF HExecuteSQLQuery(dsQuery,hQueryDefault,sqlcodigo) = True THEN

FOR EACH dsQuery
//....
END

END


//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//evento_go_plane (<nomePagina>, <plane>)
//
// Parameters:
// nomePagina: <specify the role of nomePagina>
// plane: <specify the role of plane>
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE PUBLIC GLOBAL evento_go_plane(nomePagina, plane)

IF nomePagina = "" THEN
RETURN
END

IF plane = 0 THEN
RETURN
END

{nomePagina,indWindow}..Plane = plane // saiba que {} alter value in runtime

//-------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//evento_gravar (<tabela>, <nomeJanela>, <tableGrid>, <plano>)
//
// Parameters:
// tabela: <specify the role of tabela>
// nomeJanela: <specify the role of nomeJanela>
// tableGrid: <specify the role of tableGrid>
// plano: <specify the role of plano>
// Example:
// <Specify a usage example>
//
// Return value:
// acao: <specify the role of acao>
PROCEDURE PUBLIC GLOBAL evento_gravar(tabela, nomeJanela, tableGrid, plano)

IF tabela = ""
RETURN
END

IF nomeJanela = ""
RETURN
END

IF tableGrid = ""
RETURN
END

IF plano = 0
RETURN
END

gb_Status = False

// Lê o conteúdo dos controles de tela //pagina
ScreenToFile()

IF {tabela,indFile}..NewRecord = True THEN
IF gs_acao = "incluir"
IF HAdd(tabela) = True
gb_Status = True
Info("Gravou com sucesso")
ELSE
gb_Status = False
Info(HErrorInfo()+ErrorInfo())
END
END
// aqui voce faz os tratamentos
ELSE
// Modifica o registro seleciona
IF gs_acao = "alterar"
IF HModify(tabela) = True THEN
evento_lock_not_record(tabela,gn_ID)
gb_Status = True
Info("Gravou com sucesso")
ELSE
gb_Status = False
Info(HErrorInfo()+ErrorInfo())
END
END
END

TableDisplay({tableGrid},taInit)

TableDisplay({tableGrid},taReExecuteQuery)

// Retornar um valor da janela
MyWindow.ReturnedValue = True

evento_go_plane(nomeJanela,plano)



//-------------------------------------------------------------------------------------------------


// Summary: <specify the procedure action>
// Syntax:
//evento_gravar_UUID (<tabela>, <nomeJanela>, <tableGrid>, <plano>)
//
// Parameters:
// tabela:
// nomeJanela: <specify the role of nomeJanela>
// tableGrid: <specify the role of tableGrid>
// plano: <specify the role of plano>
// Example:
// <Specify a usage example>
//
PROCEDURE PUBLIC GLOBAL evento_gravar_UUID(tabela, campoUUID, nomeJanela, tableGrid, plano)

IF tabela = ""
RETURN
END

IF nomeJanela = ""
RETURN
END

IF tableGrid = ""
RETURN
END

IF plano = 0
RETURN
END

gb_Status = False

// Lê o conteúdo dos controles de tela //pagina
ScreenToFile()

IF {tabela,indFile}..NewRecord = True THEN
IF gs_acao = "incluir" THEN
Indirection is string = tabela +"."+ campoUUID
{Indirection,indItem} = GetUUID()
IF HAdd(tabela) = True
gb_Status = True
Info("Gravou com sucesso")
ELSE
gb_Status = False
Info(HErrorInfo()+ErrorInfo())
END
END
// aqui voce faz os tratamentos
ELSE
// Modifica o registro seleciona
IF gs_acao = "alterar"
IF HModify(tabela) = True THEN
gb_Status = True
evento_lock_not_record(tabela,gn_ID)
Info("Gravou com sucesso")
ELSE
gb_Status = False
Info(HErrorInfo()+ErrorInfo())
END
END
END

TableDisplay({tableGrid},taInit)

TableDisplay({tableGrid},taReExecuteQuery)

// Retornar um valor da janela
MyWindow.ReturnedValue = True

evento_go_plane(nomeJanela,plano)


//-------------------------------------------------------------------------------------------------


// Summary: <specify the procedure action>
// Syntax:
//evento_incluir (<tabela>, <GrupoCampos>)
//
// Parameters:
// tabela: <specify the role of tabela>
// GrupoCampos: <specify the role of GrupoCampos>
// Example:
// <Specify a usage example>
//
// Return value:
// ID: <specify the role of tableGrid>
// nomeJanela: <specify the role of nomeJanela>
PROCEDURE PUBLIC GLOBAL evento_incluir(tabela, GrupoCampos)

//Info("incluir",tabela, nomeJanela, tableGrid, acao, ID)

IF tabela = "" THEN
RETURN
END

IF GrupoCampos = "" THEN
RETURN
END

IF gs_nomeJanela = "" THEN
RETURN
END

// Ao criar um novo registro
gs_acao = "incluir"

//Limpar variaveis
gn_ID = 0

{GrupoCampos} = ""

// Limpa o buffer do arquivo e carregamos os valores default
HReset(tabela)
//plane
evento_go_plane(gs_nomeJanela,2)


//-------------------------------------------------------------------------------------------------


// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_lock_not_record (<tabela>, <idunico>)
//
// Parameters:
// tabela:
// idunico: <specify the role of idunico>
// Example:
// <Specify a usage example>
//
PROCEDURE PUBLIC GLOBAL evento_lock_not_record(tabela,idunico)

IF tabela = "" OR idunico = ""
RESULT False
ELSE

HReset(tabela)

IF HUnlockRecNum(tabela,idunico) = True THEN
glo_unlock_record_time = DateSys()+TimeSys()
RESULT True
ELSE
RESULT False
END

END


//-------------------------------------------------------------------------------------------------


// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_lock_record (<tabela>, <idunico>)
//
// Parameters:
// tabela:
// idunico: <specify the role of idunico>
// Example:
// <Specify a usage example>
//
PROCEDURE PUBLIC GLOBAL evento_lock_record(tabela,idunico)

IF tabela = "" OR idunico = ""
RESULT False
ELSE

HReset(tabela)

IF HLockRecNum(tabela,idunico,hLockReadWrite) = True THEN
glo_lock_record_time = DateSys()+TimeSys()
RESULT True
ELSE
RESULT False
END

END


//-------------------------------------------------------------------------------------------------


// Summary: <specify the procedure action>
// Syntax:
//evento_procedure (<tabela>, <nomeJanela>, <tableGrid>, <Parametros>)
//
// Parameters:
// tabela: <specify the role of tabela>
// nomeJanela: <specify the role of nomeJanela>
// tableGrid: <specify the role of tableGrid>
// Parametros: <specify the role of Parametros>
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE PUBLIC GLOBAL evento_procedure(tabela, nomeJanela, tableGrid, Parametros)

Info(tabela, nomeJanela, tableGrid, Parametros)




//-------------------------------------------------------------------------------------------------



// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_selecionar ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
// TableGrid: <specify the role of TableGrid>
// Col_ID: <specify the role of Col_ID>
PROCEDURE PUBLIC GLOBAL evento_selecionar()

IF gs_TableGrid = ""
RETURN
END

IF gs_TableGrid_ColunaID = 0 OR gs_TableGrid_ColunaID = ""
RETURN
END

gn_ID = 0

TableGrid is string = gs_TableGrid

Col_ID is string = gs_TableGrid_ColunaID

nx is 8-byte int = TableInfoXY({TableGrid},tiLineNumber,MouseXPos(),MouseYPos())

IF nx > 0 AND Col_ID <> ""

Indirection is string = TableGrid+"["+nx+"]."+Col_ID

IF nx > 0 AND TableGrid <> "" AND Col_ID <> ""
gn_ID = {Indirection}
ELSE
gn_ID = 0
END

ELSE

gn_ID = 0

END



//-------------------------------------------------------------------------------------------------



// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_selecionar_abrir ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
// TableGrid: <specify the role of TableGrid>
// Col_ID: <specify the role of Col_ID>
// BotaoAlterar: <specify the role of BotaoAlterar>
PROCEDURE PUBLIC GLOBAL evento_selecionar_abrir()

IF gs_TableGrid = ""
RETURN
END

IF gs_BotaoAlterar = "" THEN
RETURN
END

IF gs_TableGrid_ColunaID = 0 THEN
RETURN
END

gn_ID = 0

TableGrid is string = gs_TableGrid

Col_ID is string = gs_TableGrid_ColunaID

nx is 8-byte int = TableInfoXY({TableGrid},tiLineNumber,MouseXPos(),MouseYPos())

IF nx > 0 AND Col_ID <> ""

Indirection is string = TableGrid+"["+nx+"]."+Col_ID

IF nx > 0 AND TableGrid <> "" AND Col_ID <> ""

gn_ID = {Indirection}

IF gn_ID > 0 AND nx > 0

ExecuteProcess({gs_BotaoAlterar},trtClick)

ELSE

gn_ID = 0

END


ELSE
gn_ID = 0
END

ELSE

gn_ID = 0

END


//-------------------------------------------------------------------------------------------------



// Summary: <specify the procedure action>
// Syntax:
//evento_voltar ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE PUBLIC GLOBAL evento_voltar(nomePagina, tabela, plane)

evento_lock_not_record(tabela,gn_ID)

IF nomePagina = "" THEN
RETURN
END

IF plane = 0 THEN
RETURN
END

{nomePagina,indWindow}..Plane = plane


///--------------------------/// var globais ///---------------------------------------------------

GLOBAL
HModifyStructure("*")
HCreationIfNotFound("*")
HOpenConnection(myHfsql)
HChangeConnection("*",myHfsql)

gs_acao, gs_nomeJanela, gs_imagem_lateral, gs_BotaoAlterar, gs_CampoDestino, gs_TableFile, gs_CampoChave, gs_GrupoCampos, gs_TableGrid, gs_TableGrid_ColunaID, gs_TableGrid_Coluna_Name, gs_TipoBusca, gs_JanusGrid, gs_Debug is string
gn_ID, gn_NomeJanela_ControleDestino is 8-byte int
gb_Status, glo_debug is boolean
glo_lock_record_time, glo_unlock_record_time is DateTime

//--------------------------------------------------------------------
EXTERN "Except.wl"
EXTERN "Limites.wl"
EXTERN "WinConst.wl"
EXTERN "KeyConst.wl"
EXTERN "ListeDefinitionHF.wl"
//--------------------------------------------------------------------

Illustrations, screen shots
none
none
User reviews
(To evaluate this resource, click 'Write a review')
Boller
My mini example Crud OOP:

Classe_Crud is a Class
n_classe is array of st_classe
END

st_classe is Structure
nome_tabela is string
campo_chave is string
busca_id is 8-byte int
btn_alterar is string
nome_grid is string
gr_campos is string
END

//metodo exemplo

PROCEDURE PUBLIC GLOBAL evento_incluir()

// Ao criar um novo registro
gs_acao = "incluir"

gn_ID = 0

GrupoCampos is string = obj01.n_classe[1].gr_campos

{GrupoCampos} = ""

tabela is string = obj01.n_classe[1].nome_tabela

HReset(tabela)

Mywindow..plane = 2
//——————————————————

//then:
// como usar a classe

PROCEDURE MyWindow()

obj01 is Classe_Crud
ArrayAdd(obj01:n_classe)
obj01.n_classe[1].btn_alterar = "btn_alterar"
obj01.n_classe[1].busca_id = 0
obj01.n_classe[1].campo_chave = "AgostoID"
obj01.n_classe[1].nome_tabela = "Agosto"
obj01.n_classe[1].nome_grid = "table_agosto"
obj01.n_classe[1].gr_campos = MyWindow..name +”.gr_campos"

obj01.n_classe[1].evento_incluir()

I use with array in oop!!!!
Never!!! Not use global var!!!
Boller
LISTAR TODOS OS OBJETOS DE UMA JANELA OU PAGE

PROCEDURE evento_lista_objetos_gpw(ninstancia)

//variaiveis auxiliares
i is int = 1
objs_form is string = ""
sControlName is string = ""

ninstancia = ninstancia

<COMPILE IF Configuration<>"iOS application" AND Configuration<> "Android application">

arrayControles is array of string

IF ninstancia = 0 THEN

RESULT ""

ELSE

NomeForm is string = m_Tabela[ninstancia].gs_nomeJanela

WHEN EXCEPTION IN

sControlName = gpwEnumControl(NomeForm, i)
indirection is string = NoSpace(NomeForm) +"."+ NoSpace(sControlName)
Add(arrayControles,indirection)

LOOP(5000)

// Next control
i++

sControlName = gpwEnumControl(NomeForm, i)

IF sControlName <> ""
indirection = NoSpace(NomeForm) +"."+ NoSpace(sControlName)
Add(arrayControles,indirection)
Trace(indirection)
ELSE
BREAK
END

END

RESULT arrayControles


DO
IF ExceptionInfo(errCode) THEN
RESULT arrayControles
END
END


END

<END>