#------------------------------------------------------------------------------------------------------------#
# PROGRAMA: crud2 #
# OBJETIVO: Modelo 02 de formulário CRUD (MASTER X DETAIL) #
#------------------------------------------------------------------------------------------------------------#
# OBS: Este formulário possui um componente de imagem instanciado em componente #
# FREEFORM para demonstrar uso em paralelo com os eventos do formulário CRUD. #
#------------------------------------------------------------------------------------------------------------#
#SCRIPT SQL PARA CRIAÇÃO DA TABELA USADA NESTE PROGRAMA MODELO DE FORMULÁRIO CRUD METADADO NO BANCO DE DADOS:#
#------------------------------------------------------------------------------------------------------------#
# CREATE TABLE frm_modelo_crud2_master #
# (crud_id CHAR(10) NOT NULL, #
# crud_description CHAR(30) NOT NULL, #
# crud_status CHAR(1) NOT NULL); #
# #
# ALTER TABLE frm_modelo_crud2_master ADD CONSTRAINT pk_frm_modelo_crud2_master #
# PRIMARY KEY (crud_id); #
# INFORMIX: #
# ALTER TABLE frm_modelo_crud2_master ADD CONSTRAINT PRIMARY KEY (crud_id) #
# CONSTRAINT pk_frm_modelo_crud2_master; #
# #
# #
# CREATE TABLE frm_modelo_crud2_detail #
# (crud_id CHAR(10) NOT NULL, #
# crud_sequence SMALLINT NOT NULL, #
# crud_datetime DATETIME YEAR TO SECOND NOT NULL, (oracle e sqlserver - tipo DATE) #
# crud_type CHAR(1) NOT NULL, #
# crud_text CHAR(100) NOT NULL) #
# #
# ALTER TABLE frm_modelo_crud2_detail ADD CONSTRAINT pk_frm_modelo_crud2_detail #
# PRIMARY KEY (crud_id,crud_sequence); #
# INFORMIX: #
# ALTER TABLE frm_modelo_crud2_detail ADD CONSTRAINT PRIMARY KEY (crud_id,crud_sequence) #
# CONSTRAINT pk_frm_modelo_crud2_detail; #
#------------------------------------------------------------------------------------------------------------#
DATABASE logix
GLOBALS
DEFINE p_user LIKE usuarios.cod_usuario
END GLOBALS
DEFINE mr_frm_modelo_crud2_master RECORD
crud_id CHAR(10),
crud_description CHAR(30),
crud_status CHAR(1)
END RECORD
DEFINE ma_frm_modelo_crud2_detail ARRAY[50] OF
RECORD
crud_id CHAR(10),
crud_sequence SMALLINT,
crud_text CHAR(100),
crud_datetime DATETIME YEAR TO SECOND,
crud_type CHAR(1)
END RECORD
DEFINE m_count_crud2_detail INTEGER
DEFINE m_form_reference, m_container_reference VARCHAR(10)
DEFINE m_crud2_detail_table_reference VARCHAR(10)
DEFINE m_vt_crud_status_image_reference VARCHAR(10)
DEFINE m_vt_crud_status_text_reference VARCHAR(10)
DEFINE m_status_process SMALLINT
DEFINE m_progressbar_reference VARCHAR(10)
#------------------------------------------------------------------------------#
FUNCTION crud2()
#------------------------------------------------------------------------------#
RETURN crud2_executeOperation(NULL,NULL,NULL)
END FUNCTION
#------------------------------------------------------------------#
FUNCTION crud2_runInContainer(l_container_reference)
#------------------------------------------------------------------#
#OBJETIVO: função para acionamento de programa a partir de uma tela COCKPIT,
# onde deverá passar a referencia do painel lateral do cockpit, onde
# o formulário deverá ser renderizado, como parâmetro.
DEFINE l_container_reference VARCHAR(10)
RETURN crud2_executeOperation(NULL,NULL,l_container_reference)
END FUNCTION
#-----------------------------------------------------------------------------------#
FUNCTION crud2_executeOperation(l_operation,l_where_clause,l_container_reference)
#-----------------------------------------------------------------------------------#
DEFINE l_operation CHAR(050)
DEFINE l_where_clause CHAR(500)
DEFINE l_container_reference VARCHAR(10)
DEFINE l_status SMALLINT
LET l_status = FALSE
LET m_container_reference = l_container_reference
IF crud2_load_form() THEN
IF l_operation <> " " THEN
LET l_status = _ADVPL_get_property(m_form_reference,"EXECUTE_OPERATION",UPSHIFT(l_operation),l_where_clause CLIPPED)
ELSE
LET l_status = _ADVPL_set_property(m_form_reference,"ACTIVATE",TRUE)
LET m_form_reference = NULL
END IF
END IF
RETURN l_status
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_load_form()
#------------------------------------------------------------------------------#
DEFINE l_ind SMALLINT
IF m_form_reference IS NULL THEN
#Aqui no parâmetro da função LOG_initApp deve-se utilizar a chave de sistema do módulo Logix correspondente
#Vide chaves de sitemas disponíveis em https://tdn.totvs.com/display/LLOG/LOG_InitApp
IF LOG_initApp("PADRAO") <> 0 THEN
RETURN FALSE
END IF
INITIALIZE mr_frm_modelo_crud2_master,ma_frm_modelo_crud2_detail TO NULL
FOR l_ind = 1 TO arrayLength(ma_frm_modelo_crud2_detail)
INITIALIZE ma_frm_modelo_crud2_detail[l_ind].* TO NULL
END FOR
IF m_container_reference <> " " THEN
LET m_container_reference = _ADVPL_create_component(NULL,"LSCROLLPANEL",m_container_reference)
CALL _ADVPL_set_property(m_container_reference,"ALIGN","CENTER")
END IF
LET m_form_reference = _ADVPL_create_component(NULL,"LFORMMETADATA",m_container_reference)
CALL _ADVPL_set_property(m_form_reference,"FORM","crud2",mr_frm_modelo_crud2_master,ma_frm_modelo_crud2_detail)
END IF
RETURN (m_form_reference IS NOT NULL) #TRUE - Formulario executado com sucesso / FALSE - Falha na carga/execução do formulário
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_after_load()
#------------------------------------------------------------------------------#
LET m_crud2_detail_table_reference = _ADVPL_get_property(m_form_reference,"TABLE_REFERENCE","frm_modelo_crud2_detail")
CALL _ADVPL_set_property(m_crud2_detail_table_reference,"CAN_COPY_ROW",FALSE)
LET m_vt_crud_status_image_reference = _ADVPL_get_property(m_form_reference,"COMPONENT_REFERENCE","frm_modelo_crud2_master","vt_crud_status_image")
LET m_vt_crud_status_text_reference = _ADVPL_get_property(m_form_reference,"COMPONENT_REFERENCE","frm_modelo_crud2_master","vt_crud_status_text")
CALL _ADVPL_set_property(m_crud2_detail_table_reference,"BEFORE_EDIT_ROW","crud2_detail_before_edit_row")
CALL _ADVPL_set_property(m_form_reference,"ORDER_BY","frm_modelo_crud2_master","crud_id","DESC")
IF NOT LOGIN_logix_userIsAdministrator(p_user) THEN
#Apenas usuarios adminiistradores tem acesso a funncionalidade de DELETE
CALL LOG_visible_toolbar_button(m_form_reference,"delete",FALSE)
END IF
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_create_before_input()
#------------------------------------------------------------------------------#
#Inicializar contador de linhas de grid numa ação de inclusao/copia q pode ser usado para consistencias no final da operação
LET m_count_crud2_detail = 0
LET mr_frm_modelo_crud2_master.crud_status = 'A'
CALL crud2_display_crud_status(mr_frm_modelo_crud2_master.crud_status)
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_create_before_confirm()
#------------------------------------------------------------------------------#
#Consistencias antes de iniciar a inclusão de registro. Em caso de falha ou falta de permissão, retornar FALSE.
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_create_confirm()
#------------------------------------------------------------------------------#
#Consistencias de inclusão de registro
IF NOT crud2_update_before_confirm() THEN
RETURN FALSE
END IF
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_update_before_input()
#------------------------------------------------------------------------------#
#Recuperar total de linhas do GRID existentes no inicio de uma ação de modificação, caso precise validar a mudança de total de linhas ao final da operação
LET m_count_crud2_detail = _ADVPL_get_property(m_crud2_detail_table_reference,"ITEM_COUNT")
CALL crud2_display_crud_status(mr_frm_modelo_crud2_master.crud_status)
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_update_before_confirm()
#------------------------------------------------------------------------------#
DEFINE l_ind SMALLINT
DEFINE l_count SMALLINT
DEFINE l_changed SMALLINT
#Consistencias antes de iniciar o processo de exclusão de registro. Em caso de falha ou falta de permissão, retornar FALSE.
CALL LOG_clear_status_bar_text(m_form_reference)
LET l_count = _ADVPL_get_property(m_crud2_detail_table_reference,"ITEM_COUNT")
FOR l_ind = 1 TO l_count
IF ma_frm_modelo_crud2_detail[l_ind].crud_sequence <= 0 THEN
CALL LOG_show_status_bar_text(m_form_reference,"Sequencia precisa ser maior que zero.","ERROR_TEXT")
CALL LOG_atribui_foco_componente_tabela(m_form_reference,'frm_modelo_crud2_detail',"crud_sequence",l_ind)
RETURN FALSE
END IF
IF ma_frm_modelo_crud2_detail[l_ind].crud_sequence > 999 THEN
CALL LOG_show_status_bar_text(m_form_reference,"Sequencia precisa ser entre 1 e 999.","ERROR_TEXT")
CALL LOG_atribui_foco_componente_tabela(m_form_reference,'frm_modelo_crud2_detail',"crud_sequence",l_ind)
RETURN FALSE
END IF
IF LENGTH(ma_frm_modelo_crud2_detail[l_ind].crud_text) <= 3 THEN
CALL LOG_show_status_bar_text(m_form_reference,"Texto precisa ter mais de 3 caracteres.","ERROR_TEXT")
CALL LOG_atribui_foco_componente_tabela(m_form_reference,'frm_modelo_crud2_detail',"crud_text",l_ind)
RETURN FALSE
END IF
END FOR
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_update_confirm()
#------------------------------------------------------------------------------#
#Consistencias de modificação de registro
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_delete_before_confirm()
#------------------------------------------------------------------------------#
DEFINE l_menu_button_reference VARCHAR(10)
DEFINE l_question VARCHAR(500)
#Consistencias antes de iniciar o processo de exclusão de registro. Em caso de falha ou falta de permissão, retornar FALSE.
#Modificando o texto padrão da pergunta de exclusão.
LET l_question = l_question CLIPPED, "\nEsta ação irá excluir todas as sequências apresentadas para este registro. \n\nConfirma exclusão?"
LET l_menu_button_reference = _ADVPL_get_property(m_form_reference,"MENU_BUTTON_REFERENCE","delete")
CALL _ADVPL_set_property(l_menu_button_reference,"EVENT_MESSAGE",l_question)
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_delete_confirm()
#------------------------------------------------------------------------------#
#Consistencias e ajustes durante transação de exclusão de registro. Em caso de falha, retornar FALSE.
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_update_status_confirm()
#------------------------------------------------------------------------------#
DEFINE l_status CHAR(1)
IF STRING_isEmpty(mr_frm_modelo_crud2_master.crud_id) THEN
CALL LOG_show_status_bar_text(m_form_reference,"Efetue primeiramente a pesquisa.","WARNING_TEXT")
RETURN FALSE
END IF
LET l_status = mr_frm_modelo_crud2_master.crud_status
IF l_status = "A" THEN
IF NOT LOG_question("Confirma inativação do registro?") THEN
CALL LOG_show_status_bar_text(m_form_reference,"Operação de inativação cancelada.","WARNING_TEXT")
RETURN FALSE
END IF
LET l_status = "I"
ELSE
IF NOT LOG_question("Confirma reativação do registro?") THEN
CALL LOG_show_status_bar_text(m_form_reference,"Operação de reativação cancelada.","WARNING_TEXT")
RETURN FALSE
END IF
LET l_status = "A"
END IF
WHENEVER ERROR CONTINUE
UPDATE frm_modelo_crud2_master
SET crud_status = l_status
WHERE frm_modelo_crud2_master.crud_id = mr_frm_modelo_crud2_master.crud_id
WHENEVER ERROR STOP
IF sqlca.sqlcode <> 0 THEN
CALL LOG_show_status_bar_text(m_form_reference,"Falha ao ajustar a situação do registro. ("||log0030_mensagem_get_texto()||")","ERROR_TEXT")
RETURN FALSE
END IF
CALL LOG_show_status_bar_text(m_form_reference,"Situação do registro alterada com sucesso.","INFO_TEXT")
LET mr_frm_modelo_crud2_master.crud_status = l_status
CALL crud2_display_crud_status()
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_cancel_input()
#------------------------------------------------------------------------------#
LET mr_frm_modelo_crud2_master.crud_status = NULL
CALL crud2_display_crud_status()
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_find_before_input()
#------------------------------------------------------------------------------#
DEFINE l_construct_reference VARCHAR(10)
LET mr_frm_modelo_crud2_master.crud_status = NULL
CALL crud2_display_crud_status()
#Desabilitar a opção ORDER BY do filtro de pesquisa
LET l_construct_reference = _ADVPL_get_property(m_form_reference,"CONSTRUCT_REFERENCE")
CALL _ADVPL_set_property(l_construct_reference,"VISIBLE_ORDER_BY",FALSE)
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_find_confirm()
#------------------------------------------------------------------------------#
#Carregar informações adicionais após leitura/paginação de registro.
CALL crud2_display_crud_status()
RETURN TRUE
END FUNCTION
#--------------------------------------------------#
FUNCTION crud2_display_crud_status()
#--------------------------------------------------#
DEFINE l_crud_status CHAR(1)
#Atualizar a imagem de status apresentada na tela
CALL _ADVPL_set_property(m_vt_crud_status_image_reference,"ENABLE",TRUE)
CASE mr_frm_modelo_crud2_master.crud_status
WHEN "A"
CALL _ADVPL_set_property(m_vt_crud_status_image_reference,"IMAGE","VERDE")
CALL _ADVPL_set_property(m_vt_crud_status_text_reference,"TEXT","Ativo")
WHEN "I"
CALL _ADVPL_set_property(m_vt_crud_status_image_reference,"IMAGE","VERMELHO")
CALL _ADVPL_set_property(m_vt_crud_status_text_reference,"TEXT","Inativo")
OTHERWISE
CALL _ADVPL_set_property(m_vt_crud_status_image_reference,"IMAGE","CINZA")
CALL _ADVPL_set_property(m_vt_crud_status_text_reference,"TEXT","Nenhuma pesquisa ativa")
END CASE
CALL _ADVPL_set_property(m_vt_crud_status_text_reference,"POSITION",0,2)
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_browse_before_input()
#------------------------------------------------------------------------------#
DEFINE l_column_value CHAR(50),
l_idx INTEGER,
l_browse_item_count INTEGER
{
LET l_browse_item_count = _ADVPL_get_property(m_form_reference,"BROWSE_ITEM_COUNT")
FOR l_idx = 1 TO l_browse_item_count
#Caso precise complementar o valor de alguma coluna na opção LISTAR deve-se preeencher aqui
#Recuperar valor de um dado da grid da opção LISTAR
LET l_column_value = _ADVPL_get_property(m_form_reference,"BROWSE_VALUE","<table_name>","<column_name>",l_idx)
#Ajustar valor de um dado da grid da opção LISTAR
CALL _ADVPL_set_property(m_form_reference,"BROWSE_VALUE","<table_name>","<column_name>",l_idx,"<column_value>")
END FOR
}
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_detail_after_insert_row()
#------------------------------------------------------------------------------#
DEFINE l_row_selected SMALLINT
#Ações para executar após inclusão de nova linha em GRID
LET l_row_selected = _ADVPL_get_property(m_crud2_detail_table_reference,"ROW_SELECTED")
LET ma_frm_modelo_crud2_detail[l_row_selected].crud_sequence = l_row_selected
LET ma_frm_modelo_crud2_detail[l_row_selected].crud_datetime = CURRENT YEAR TO SECOND
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_detail_before_delete_row()
#------------------------------------------------------------------------------#
DEFINE l_row_selected SMALLINT
#Ações para consistencia de eliminação de linha do GRID. Em caso de falha ou falta de permissão retornar FALSE.
{
LET l_row_selected = _ADVPL_get_property(m_crud2_detail_table_reference,"ROW_SELECTED")
IF <CONDICAO> THEN
RETURN FALSE
END IF
}
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_detail_before_edit_row()
#------------------------------------------------------------------------------#
DEFINE l_row_selected SMALLINT
DEFINE l_column_name CHAR(50)
#Consistencia para avalias se os dados da linha corrente do GRID podem ser editadas pelo usuário. Em caso de bloqueio retornar FALSE.
#Recuperar o nome da coluna que está tentando editar no GRID
LET l_column_name = _ADVPL_get_property(m_crud2_detail_table_reference,"COLUMN_NAME")
# Recupera o nome da coluna e a linha em edição.
LET l_row_selected = _ADVPL_get_property(m_crud2_detail_table_reference,"ROW_SELECTED")
IF ma_frm_modelo_crud2_detail[l_row_selected].crud_datetime IS NULL THEN
LET ma_frm_modelo_crud2_detail[l_row_selected].crud_datetime = CURRENT YEAR TO SECOND
END IF
IF mr_frm_modelo_crud2_master.crud_status = "I" THEN
# Não permite modificar dados das linhas do GRID da tabela DETALHE
CALL LOG_show_status_bar_text(m_form_reference,"Somente é permitida edição de informações da lista para registro ativo.","WARNING_TEXT")
RETURN FALSE
END IF
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_detail_crud_text_valid()
#------------------------------------------------------------------------------#
#Consistencias da edição de valor de um campo do formulário. Em caso de falha do valor informado retornar FALSE e
#isso irá bloquear a saida do campo até que usuário corrija o valor informado.
#Esta função pode ser usada para inicializar valor de campo também quando necessário.
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_master_crud_status_change_event()
#------------------------------------------------------------------------------#
CALL LOG_clear_status_bar_text(m_form_reference)
IF mr_frm_modelo_crud2_master.crud_status = "I" THEN
IF NOT LOGIN_logix_userIsAdministrator(p_user) THEN
CALL LOG_show_status_bar_text(m_form_reference,"Opção disponível apenas para usuários administradores ajustar status para INATIVO.","WARNING_TEXT")
RETURN FALSE
END IF
END IF
RETURN TRUE
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_process_confirm()
#------------------------------------------------------------------------------#
CALL LOG_clear_status_bar_text(m_form_reference)
IF NOT LOGIN_logix_userIsAdministrator(p_user) THEN
CALL LOG_show_status_bar_text(m_form_reference,"Opção disponível apenas para usuários administradores.","WARNING_TEXT")
RETURN FALSE
END IF
IF NOT log_question('Esta operação irá realizar um processamento com acompanhamento de barra de progresso.\n\nDeseja iniciar o processamento?') THEN
RETURN FALSE
END IF
LET m_progressbar_reference = _ADVPL_create_component(NULL, "LPROGRESSPOPUP")
CALL _ADVPL_set_property(m_progressbar_reference, "TITLE", "Processamento Geral")
CALL _ADVPL_set_property(m_progressbar_reference, "PROGRESS_TYPE", "PROCESS" )
CALL _ADVPL_set_property(m_progressbar_reference, "MAX_VALUE", 3 ) # Total de registros para completar barra de progresso em 100%
CALL _ADVPL_set_property(m_progressbar_reference, "PROGRESS_EVENT", "crud2_process")
CALL _ADVPL_set_property(m_progressbar_reference, "TIME_REFRESH", 0)
CALL _ADVPL_get_property(m_progressbar_reference, "INIT_PROGRESS")
CALL LOG_progresspopup_set_reference(m_progressbar_reference)
RETURN m_status_process
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_process()
#------------------------------------------------------------------------------#
#Função de processamento acionado pela barra de progresso.
SLEEP 1
CALL _ADVPL_set_property(m_progressbar_reference,"VALUE",1) #mostrar andamento da barra de progresso
SLEEP 1
CALL _ADVPL_set_property(m_progressbar_reference,"VALUE",2) #mostrar andamento da barra de progresso
SLEEP 1
CALL _ADVPL_set_property(m_progressbar_reference,"VALUE",3) #mostrar andamento da barra de progresso
CALL LOG_show_status_bar_text(m_form_reference,"Processamento concluído com sucesso.","info")
LET m_status_process = TRUE #Processamento concluido com sucesso
{
CALL LOG_show_status_bar_text(m_form_reference,"Processamento concluído com erros","WARNING_TEXT")
LET m_status_process = FALSE #Processamento concluido com erro
}
#Encerrar barra de progresso
CALL _ADVPL_set_property(m_progressbar_reference, "FINISH")
RETURN m_status_process
END FUNCTION
#------------------------------------------------------------------------------#
FUNCTION crud2_version_info()
#------------------------------------------------------------------------------#
RETURN "$Archive: /Logix/Fontes_Doc/Sustentacao/V12/V12/framework/sgdp/programas/crud2.4gl $|$Revision: 20 $|$Date: 26/08/22 21:43 $|$Modtime: 26/08/22 21:43 $" # Informações do controle de versão do SourceSafe - Não remover esta linha (FRAMEWORK)
END FUNCTION
|