Here is an example using 'BAPI_PROJECTDEF_CREATE'. The validation of the fields of course depends on the PS settings of your system.
REPORT ypr_def_create.
DATA :
gs_def TYPE bapi_project_definition,
gs_return TYPE bapireturn1,
gt_messages TYPE STANDARD TABLE OF bapi_meth_message,
gs_messages LIKE LINE OF gt_messages.
START-OF-SELECTION.
gs_def-project_definition = 'TEST_PROJ'.
gs_def-description = 'TEST Description'.
gs_def-project_profile = 'Z000001'.
gs_def-comp_code = 'DUMMY'.
gs_def-responsible_no = '000000001'.
gs_def-applicant_no = '000000001'.
gs_def-start = '20160301'.
gs_def-finish = '20170301'.
gs_def-profit_ctr = 'DUMMYPRCTR'.
CALL FUNCTION 'BAPI_PROJECTDEF_CREATE'
EXPORTING
project_definition_stru = gs_def
IMPORTING
return = gs_return
TABLES
e_message_table = gt_messages.
IF gs_return-type CN 'EAX'.
CALL FUNCTION 'BAPI_PS_PRECOMMIT'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ELSE.
LOOP AT gt_messages INTO gs_messages WHERE message_type CA 'EAX'.
EXIT.
ENDLOOP.
MESSAGE gs_messages-message_text TYPE gs_messages-message_type.
ENDIF.