Skip to main content
Skip table of contents

Tutorial: Module Customizing (Level 3)

Information

Task 1

Objective

  • In Test Module module a field is defined as link.
    • If this link is clicked, a message is displayed.
      • If it is confirmed with Yes, another module is opened in which all the marked projects are displayed.
      • If it is confirmed with No, the project on which the link was clicked is marked.

Step 1: Preparation

Information

  • For this task, another module must be customized (procedure as described in Module Workflow: Level 1):
    • Module title: Project Data Sheet
    • create a data area with the following data fields and settings (as described in Module Workflow: Level 1) and assign it to the module:
      • DDI: 001001 Project ID
      • DI001001 Project ID and DI000690 Project title
      • Store @L30 in Filter from on the Project ID data field.
    • Insert a macro that filters within the on_initial_focus() Python function (for procedure see here).
  • Additionally, in the Project data area of the Test Module module, remove filter criterion 4811 from the Filter from field.

Step 2: Creating a macro module for module creation

Objectives

  • To create a macro module that opens the Project Data Sheet
  • To provide this macro module on a data field on the Test Module module.

Store the Project Data Sheet Module in the Global Settings

Procedure

  • Open the Global Settings module.
    • Open Customizer → Master Data → Global Settings or
    • activate the Global Settings tab (the submodule) in the Modules panel.
  • For the Project Data Sheet module, create a new global setting and store a Python ID.
    • Select Insert Global Settings from the context menu.
    • Select the requested class, here Module ID, in the Class listbox.
    • In the Alpha (120) field, enter the module ID of the project data sheet.
    • In the Python ID field, define a Python ID, e.g. pr_datasheet.
    • Save.

 Create the Macro Module

Procedure

  • Create a macro module (module with class = 6).
  • Open the Python editor by clicking on the Edit python macro button. A template is copied automatically.
    • This template is planned for modules with class = 4, and thus cannot be deleted.
  • Store the following macro:
    • Please note: Entry Python_ID_ProjectDataSheet needs to be replaced by the value from the Python ID field of the newly created global setting of the project data sheet.
PY
# In order to be able to read the module ID from the global settings 
# the global_setting Python module needs to be imported.
from ppms.global_setting import get_global_setting_value 

# Definition of the module object
mod_obj = ppms.get_target_module()

# Definition of the module ID. By means of the self-defined Python ID 
# it is read from the global settings.
target_mod_id = get_global_setting_value("Python_ID_Projektdatenblatt", 'alpha120')

#Read project ID of the record which is opened on the link.
pr_id = ppms.get_context_df().get_record().get_df ("pr_id").get_raw_value()

# Set variable _L30_ for the module which is opened
mod_obj.set_new_L_var(30, [pr_id])

#Open the module
mod_obj.open_module(target_mod_id)
  • Save.

Tips

  • Instead of
PY
pr_id = ppms.get_context_df().get_record().get_df("pr_id").get_raw_value()
  • the following (shorter) line can be used:
PY
pr_id = ppms.get_context_df().get_record().pr_id.get_raw_value()
  • When the link on the data field that is to be read (in this case: when customizing the link on the Project ID field), the following line can be used for reading:
PY
pr_id = ppms.get_context_df().get_raw_value()

Procedure

  • Define the Project title DI as a link (DF behavior = e4) and store the ID of the newly created macro module in the Action ID field in the Test Module module (Project data area).
  • Save.

Test the Module

Procedure

  • Start the Test Module module.
  • Click on the project title of a project: The Project Data Sheet module is opened and the project on which the link was clicked is displayed.

Step 3: Add a Dialog Message

Objective

  • The following dialog message should appear before the Project Data Sheet is opened: Do you really want to edit this project?
    • If the user confirms the message with Yes, the Project Data Sheet module is opened.
    • If the user confirms the message with No, the project record of the selected project is marked.

Create Dialog Message

Procedure

  • Open Customizer → Master Data → Dialog Messages.
  • Insert a new dialog message line by right-clicking and selecting Insert → Dialog message.
  • Enter Do you really want to edit this project? in the Dialog message field.
  • Select 1 as a value in the Output type field.
  • Select Default Button = 1 and Button type = 3.
  • Save.

Store the Dialog Message ID in the Global Settings

Procedure

  • Open the Global Settings module.
    • Open Customizer → Master Data → Global Settings or
    • activate the Global Settings tab (the submodule) in the Modules panel.
  • For the dialog message, create a new global setting and store a Python ID:
    • Select Insert Global Settings from the context menu.
    • In the Class listbox, select the requested class, here Dialog message ID.
    • In the Alpha (120) field, enter the dialog message ID.
    • In the Python ID field, define a Python ID, e.g. pr_msg_box.
    • Save.

Adapt the Macro of the Macro Module

Procedure

  • Open the macro module in the Python editor and adjust it in the following way:
    •  Please note:
      • The Python_ID_Projektdatenblatt entry must be replaced by the value from the Python ID field of the global setting of the project data sheet.
      • The Python_ID_Dialogmeldung entry must be replaced by the value from the Python ID field of the newly created global setting of the dialog message.
PY
from ppms.global_setting import get_global_setting_value
mod_obj = ppms.get_target_module()

# Definition of the module ID and the dialog message ID
target_mod_id = get_global_setting_value("Python_ID_Projektdatenblatt", 'alpha120')
dialog_id = get_global_setting_value("Python_ID_Dialogmeldung", 'alpha120')
 
pr_id = ppms.get_context_df().get_record().get_df("pr_id").get_raw_value()

mod_obj.set_new_L_var(30, [pr_id]) 
# Output of the dialog message
ppms.ui_message_id(dialog_id)

# If the user clicks on "Yes" ("if"), the module is opened, 
# otherwise ("else") the record is marked.
if ppms.msg_pop().get_reply() == 1:
  mod_obj.open_module(target_mod_id)
else:
  ppms.get_context_df().get_record().mark()

Test the Module

Procedure

  • Start the Test Module module.
  • Click on the project title of a project
  • The Do you really want to edit the project? dialog message is displayed.
    • If you click on Yes, the project data sheet is opened and the project on which the link was clicked is displayed.
    • If you click on No, the project on which the link was clicked is marked.

Step 4: Display All Marked Projects

Objective

  • All of the marked projects are to be displayed in the Project Data Sheet module.
  • If no project has been marked, the project on which the link was clicked is to be displayed.

Adapt the Macro of the Macro Module

  Procedure

  • Open the macro module in the Python editor and adjust it in the following way:
    •  Please note:
      • The Python_ID_Projektdatenblatt entry must be replaced by the value from the Python ID field of the global setting of the project data sheet.
      • The Python_ID_Dialogmeldung entry must be replaced by the value from the Python ID field of the newly created global setting of the dialog message.
PY
from ppms.global_setting import get_global_setting_value
mod_obj = ppms.get_target_module()

target_mod_id=ppms_cu.Helper.get_global_setting("Python_ID_Projektdatenblatt").alpha120.get_value()
dialog_id=ppms_cu.Helper.get_global_setting("Python_ID_Dialogmeldung").alpha120.get_value()

#Definition of a list containing all the marked records in the project data area.
#When no record is marked, this list is blank.
marked_records = ppms.get_context_df().get_record().get_da().get_marked_records()

#Definition of new blank list
project_list=[]

# Is at least one record available in the "marked_records" list 
# for every record in this list the project ID is read and written into the "project_list" list. 
# Additionally, the project ID of the record on which the link was activated is written 
# into the list.
if len(marked_records) > 0:
  for record in marked_records:
   	cur_pr_id = record.pr_id.get_raw_value()
   	project_list.append(cur_pr_id)
  project_list.append(ppms.get_context_df().get_record().pr_id.get_raw_value())

# If the "marked_records" list is blank, the project ID of the record on which the link was activated 
# is written into the list.
else:
  project_list.append(ppms.get_context_df().get_record().pr_id.get_raw_value())

mod_obj.set_new_L_var(30, project_list)

ppms.ui_message_id(dialog_id)

if ppms.msg_pop().get_reply() == 1:
  mod_obj.open_module(target_mod_id)
else:
  ppms.get_context_df().get_record().mark()

Test the Module

Procedure

  • Start the Test Module module.
  • Mark several projects and click on the project title of a project
  • The Do you really want to edit the project? dialog message is displayed.
    • If you click on Yes, the project data sheet is opened and all marked projects and the project on which the link was clicked are displayed.
    • If you click on No, the project on which the link was clicked is marked.

Task 2

Objectives

  • Furthermore, the Task Data Sheet in which all milestones of the project on which the link was clicked are displayed are to be opened from the Test Module.
  • The module is to be opened behind the Project Data Sheet.

Note

  • This task builds on task 1.

Step 1: Preparation

Information

Step 2: Open the Task Data Sheet

Store the Task Data Sheet in the Global Settings

Procedure

  • Open the Global Settings module.
    • Open Customizer → Master Data → Global Settings or activate the Global Settings tab (submodule) in the Modules panel.
  • For the Task Data Sheet module, create a new global setting and store a Python ID:
    • Select Insert Global Settings from the context menu.
    • Select the requested class, here Module ID, in the Class listbox.
    • Enter the module ID of the task data sheet in the Alpha (120) field.
    • In the Python ID field, define a Python ID, e.g. task_datasheet.
    • Save.

Adapt the Macro Module

Procedure

  • Open the macro module in the Python editor and adjust it the following way:
    •  Please note:
      • The Python_ID_Projektdatenblatt entry must be replaced by the value from the Python ID field of the global setting of the project data sheet.
      • The Python_ID_Dialogmeldung entry must be replaced by the value from the Python ID field of the newly created global setting of the dialog message.
      • The Python_ID_Vorgangsdatenblatt entry must be replaced by the value from the Python ID field of the global setting of the task data sheet.
PY
from ppms.global_setting import get_global_setting_value

mod_obj = ppms.get_target_module()

# Definition of the module and dialog message ID
target_mod_id = get_global_setting_value("Python_ID_Projektdatenblatt", 'alpha120')
dialog_id = get_global_setting_value("Python_ID_Dialogmeldung", 'alpha120')
target_task_mod_id = get_global_setting_value("Python_ID_Vorgangsdatenblatt", 'alpha120') 

marked_records = ppms.get_context_df().get_record().get_da().get_marked_records()

pr_id = ppms.get_context_df().get_record().pr_id.get_raw_value()

pr_list = [pr_id]

if len(marked_records) > 0:
    for record in marked_records:
        cur_pr_id = record.pr_id.get_raw_value()
        pr_list.append(cur_pr_id)

mod_obj.set_new_L_var(30, pr_list)

ppms.ui_message_id(dialog_id)

if ppms.msg_pop().get_reply() == 1:
  pr_mod_obj = mod_obj.open_module(target_mod_id, forced_status=1)
  # Open the task data sheet
  task_mod_obj = pr_mod_obj.open_module(target_task_mod_id, forced_status=2, dock_to_module =
pr_mod_obj.get_uid(), foreground=0, focus=0) 
	# Execute the "get_tasks" method with the "pr_id" transfer parameter  
	# This method is defined in the next module in the task data sheet.
	task_mod_obj.get_tasks(pr_id)
else:
  ppms.get_context_df().get_record().mark()

Change the Macro in the Task Data Sheet

Objective

  • The milestones of the project that was opened by clicking the link is to be displayed.

Details

  • A get_tasks method is defined, which writes the tasks of the project specified with Milestone = 2 to a list (task_list).
  • This list is written in the @L11 list variable.

Procedure

  • Create a new record in the SQL Statements module and rename the statement. Subsequently, create an SQL procedure code with the following SQL Statement: Select DI001098 FROM DT463 WHERE DI001097='{0}' AND DI006786='{1}'
  • Change the macro in the Task Data Sheet in the following way:
    •  Please note: The SQL-Statement-ID entry must be replaced by the value from the Statement field of the newly created statement.
PY
# Definition of the get_tasks method
def get_tasks(pr_id):
  value=2
  sql_query=ppms.get_query("SQL-Statement-ID").format(pr_id,value)
  sql_query_result = ppms.db_select(sql_query)
  task_list=[]
  for record in sql_query_result:
   task_list.append(record[0])

  mod_obj.set_current_L_var(11, task_list)


mod_obj = ppms.get_target_module()

def on_load():
  # Provides the "get_tasks" method for the module object.
  od_obj.get_tasks = get_tasks

def on_initial_focus():
  mod_obj.menu(12)

def on_focus():
  pass

def on_reset():
  on_initial_focus()

def on_before_mv_switch(old_mv, new_mv):
  pass

def on_after_mv_switch(old_mv, new_mv):
  pass

Test the Module

Procedure

  • Start the Test Module module.
  • Mark several projects and click on the project title of a project.
  • The Do you really want to edit the project? dialog message is displayed.
    • If you click on Yes, the project data sheet is opened and all marked projects and the project on which the link was clicked are displayed.
      • Additionally, the Task Data Sheet is displayed behind the Project Data Sheet. In this module the milestones of the project on which the link was clicked are displayed.
    • If you click on No, the project on which the link was clicked is marked.
JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.