Professional Documents
Culture Documents
Step-by-Step Tutorials
Getting started with Adobe Forms with a simple exercise (More details)
Create table (More details)
Create table using subform (More details)
Using Alternative in Adobe Forms (More details)
Using Text Modules in Adobe Forms (More details)
Value help in Adobe interactive forms (More details)
Making subform behave as table and data part as body row (More details)
Using Where conditions to relate header and item tables in Adobe forms (More details)
Demo on Nested tables (More details)
Achieving Control levels functionality in Adobe Forms (More details)
Calculating Page-wise Sub-Totals and Grand Total in Adobe forms (More details)
Including the Standard Texts (SO10) and any other Long Texts in the Adobe Forms (More details)
Scenario on displaying logo, background image and fetching data from multiple tables (More details)
Printing Address using Business Address Services (BAS) (More details)
Printing Address without using Business Address Services (BAS) (More details)
Configuring the Adobe Forms / Smart forms / SAP Script to the output type in NACE (More details)
Demo on Adobe interactive forms using WebDynpro for ABAP Part 1 (More details)
Demo on Adobe forms using WebDynpro for ABAP Part 2 (More details)
Printing labels using Adobe Forms (More details)
Migration of an SAP Smart form to Adobe Form (More details)
Using Multiple Master and Body pages (More details)
Sending an Adobe form as an attachment in an email (More details)
Uploading a PDF file in an Adobe Form offline scenario (More details)
Offline scenario to download an adobe form using Web Dynpro for ABAP (More details)
Offline scenario to upload a filled-in adobe form using Web Dynpro for ABAP (More details)
Using Web Services in Adobe Forms (More details)
Achieving Conditional-breaks in Adobe Forms (More details)
Online Scenario - Travel Request Form (More details)
Steps for creating a Web Dynpro Component for Adobe interactive Forms using the Enumerated Drop
Down Box (More details)
Upload Photos/images into custom table & Print in Adobe form (More details)
Adding rows dynamically in a table using interactive Adobe Forms (More details)
Hiding a Field Using Javascript in Adobe Form based on the condition (More details)
Sending Adobe forms as “PDF” attachment using Email Submit Button (More details)
Custom Dialog Box Message while Saving the Adobe Form without filling the Mandatory Fields (More
details)
Digital signature in Adobe forms (More details)
Validation of date and calculation of the number of days between two dates using Java Script (More
details) NEW
Quick testing for Adobe Forms (More details) NEW
Date validation in interactive adobe forms (More details) NEW
Getting started with Adobe Forms
Before starting this tutorial, please ensure that Adobe life cycle designer is installed on your system and
Adobe designer is configured on your server.
In this tutorial, we would pass a parameter (CARRID) to the form and print the same with a page
heading.
Go to transaction SFP.
For every form, an interface is mandatory. Enter the name of the interface and click on Create.
Click on Save. Enter the package and the workbench request no as per the requirements.
Click on Create.
As shown above, select the radio-button Form and enter the name of the form. Click on „Create‟.
Enter the description for the Form and also enter the name of the interface created earlier.
Click on Save.
Now double-click on the object and enter the text required (Page heading here).
Now click on tab ”Value”. In the list box for “Type”, select the value “Read-only” (as shown below)
Now go to tab “Binding”. Select the parameter “CARRID” as shown below:
Step4: Go to TYPES in the Global definitions to define the user define types as shown below.
Step5: In Global data,
Create an internal table with the same structure defined earlier in TYPES definition as shown below.
Step7: Now go back to the initial screen. Provide the form name and click on create button as shown
below.
Provide the description for the form and interface name created as shown below.
Step9: Here, we have to drag and drop the contents, to be displayed in the layout, from interface to
context as shown below.
Step10: Here in the internal table PT_VBAP, we can de-activate the fields, which we don‟t want to display
in the layout. We can do this as shown below.
Place the cursor on the field and give a right click. Now select Deactivate.
Step13: Select the object VBELN. Go to palettes-object. You will get the following screen.
Step14: Now, drag and drop the internal table PT_VBAP from Data View to body page.
Go to palettesObject
The following screen appears.
Step1: Go to transaction SFP to create adobe form. Provide the interface name and click on create
button.
Step2: Provide the short description and click on Save button.
Step4: Go to TYPES in the Global definitions to define the user define types as shown below.
Step5: In Global data,
Create an internal table with the same structure defined earlier in TYPES definition types_vbap as shown
below.
Step7: Now go back to the initial screen. Provide the form name and click on create button as shown
below.
Provide the description for the form and interface name created as shown below.
Step9: Here, we have to drag and drop the fields to be displayed in the layout, from interface to context
as shown below.
Step10: Here in the internal table PT_VBAP, we can de-activate the fields, which we don‟t require to
display in the layout. We can do this as shown below.
Place the cursor on the field, right click and select Deactivate.
Step13: Now, create sub form in HIERARCHY as shown below in the body page.
Place the cursor on bodypage1 and right click on it. Now select Insert Subform to create the sub form in
the body page.
Step14: Now, from the Data View, drag and drop the fields in the internal table into the sub form as
shown.
Go to palettesObject
Step16: Execute the form, the output would be similar to the following:
In this demo we will create adobe form, which displays two different table data in different
scenarios based on the given input. This functionality is achieved by using Alternative in adobe
forms.
Step1: Go to SFP transaction and create interface for the Adobe form.
Note: Maintain Interface type ABAP-Dictionary Base interface. (IN ECC6.0 Version)
The import parameter IT_SPFLI is used to input data and FLAG is used to select the table that should be
displayed in the Output. Here the details of either SPFLI or SFLIGHT are displayed depending on the
FLAG.
Step4: Create two global tables SPFLI and SFLIGHT to hold the data that needs to be displayed in the
output.
Step5: Code for fetching the data is written in the code initialization part of interface.
In code initialization the variables whose values are being passed to the code to fetch the details of the
output should be declared in the Input parameters and the variables to which the results are assigned
needs to be declared in the Output parameters.
Step6: Write the below code in code initialization part. Check for errors and activate the interface.
select *
from spfli
into table gt_spfli
for all entries in it_spfli
where carrid eq it_spfli-carrid
and connid eq it_spfli-connid.
select *
from sflight
into table gt_sflight
for all entries in it_spfli
where carrid eq it_spfli-carrid
and connid eq it_spfli-connid.
Step7: After the interface part is done, create Form by going to SFP transaction.
Step8: In the creation of the Form, we need to give the name of the interface for which we are creating
the Form. This is the additional functionality in Adobe forms. One interface can be used for many Forms if
it is suitable.
Step9: In the Context tab of the Form we will find two sections Interface and Context.
In Interface we will find the data that was created in the interface. Content area will be blank initially. We
need to drag the elements that need to be displayed in output into the content area.
Step13: Drag and drop table GT_SPFLI from Global data to TRUE node and de-activate fields which we
don't need.
Step14: Drag and drop table GT_SFLIGHT from Global data to FALSE node and de-activate fields which
we don't need.
Step15: Select the Alternative conditions tab and create condition for alternative.
Means subform TRUE will be triggered when the flag is initial and subform FALSE will be triggered when
there is some value in flag variable (NOT INITIAL).
Step18: Drag and drop complete ALTERNATIVE subform into body page from data view.
Step19: Select body page and go to the object view from the pallets.
Step20: Go to SUBFORM tab; make the body page content FLOWED, Flow direction TOP TO BOTTOM.
Step21: Go to Pagination, set over flow to „Go To Page "Page1"‟.
This should be done in order to flow the content to the next page when first page is filled completely.
Step25:
SCENARIO 1: When the FLAG is INITIAL, SPFLI data will be displayed in output.
SCENARIO 2: When the FLAG is NOT INITIAL, SFLIGHT data will be displayed in output.
Step26: Select the table IT_SPFLI to give the input data. Give inputs to the table.
Step27: Now there are three entries in the table IT_SPFLI and the FLAG is BLANK.
Step28: Subform TRUE will be triggered when FLAG is INITIAL. And SPFLI table data will be displayed
in output.
Step29: Maintain same data in IT_SPFLI and give 'X' in FLAG. Scenario 2 will be triggered.
In this demo we will create an adobe form which displays text in two different languages (English
or French) based on the given condition. This functionality is achieved by using TEXT MODULES
in adobe forms.
Step1: Go to transaction SFP and create an interface for the Adobe form.
Note: Maintain Interface type ABAP-Dictionary Base interface. (IN ECC6.0 Version)
Step2: Create an import parameter as shown below:
Step4: Now go to transaction Smartforms to create Text Module for the Language Conversion, Select
Text Module and Enter Text Module Name & Click on create.
Here, we are converting English text to French text, so we have to enter the French conversion of the
English text.
After clicking on create, the system would prompt you for the Interface name and description.
STEP 8:
Right Click on Form name in the context area and create New Folder.
STEP 9:
Drag & Drop Flag1 field from the import part in to the Context area.
STEP 10:
Right Click on New FOLDER, create three texts for the text modules.
STEP 11:
Double click on the new folder. The following screen appears. Click on Condition
STEP 12:
STEP 13:
Click on Layout.
On the left side platter, in data view, we can view all the fields that we defined in the context part. (In this
example, flag1 and three texts)
STEP 14:
In our layout, let us also include a logo and some text as well.
Go to Master Page. From Library Palette, insert image field and text into the master page.
Enter text in text field and Enter image in image field and check the checkbox “Embedded image data”.
STEP 15:
Go to Body Page.
Text in English
Text in French
Text in Italian.
Now right click on the text field and select the option “floating fields”.
Now we need to do the binding for the text field. Select the text field “Text in English”, Click on palette
click on object go to binding tab. Please see the following screenshot for the binding.
Now repeat the above step for binding the other two text fields.
STEP 15 - 2:
STEP 16:
STEP 17:
Click on Execute. Assign Value ‘X’ to Flag1. Otherwise it only display in English. If FLAG1 has
value ‘X’ than test will display in English & French Both.
Output:
Value help in application is useful to avoid typos and to check list of possible values when user don’t
know exact value for the input field. We can incorporate these value helps in Adobe interactive forms
both for online and offline scenarios. This document explains step by step procedure for adding two
types of value helps in Adobe interactive forms. This document considering integrating adobe forms in
WebDynpro ABAP with integrated using Zero Client Installation (ZCI).
Here Standard value help means F4 help available in SAP; we can add this feature in adobe interactive
forms. Once user clicks on drop down button it fetches value help form SAP and displays in the screen.
Once user chooses one of the suitable entries that input field will get updated with the selected entry.
Procedure:
Step1: In layout Choose UI element Value Help Drop-down List from WebDynpro Native Controls of
Library Palette.
Step2: Go to Object Palette and in Binding TAB update Default Binding with corresponding field by
pressing Arrow and choose form the Interactive From Context.
Step3: Pop-up screen will come to confirm the update of field properties. Click OK. If you do so all
properties will be updated at the same time the UI element will change to normal input Field. You need
to change this to Drop-down list in Object Palette->Field Tab as shown below.
Step4: Now you are done with implementing Standard value help for you adobe interactive form. Save
and activate your form and test application. Now you can see Standard value help once you click drop-
down link on adobe form.
Instead of standard value help we can add custom value help; this can be form context of Adobe form.
In this case there is need of coding. For this value help you need to have a context node with two fields
one for value and another for corresponding text. As we are proceeding with WebDynpro ABAP, we
need to fill this node WDINIT method of WebDynpro view or controller.
Step1: Create a context node with Value and Text. Text is optional here.
Step2: Select corresponding Values and texts into one internal table or populate internal table with
possible values and bind that internal table to context node.
Sample Coding:
Step3:
In Layout editor Choose field Enumerated Drop-down List form Library Palette and place on the layout
Step4: Go to Object Palette and in Field tab click List Item link as fallows.
Step5: One pop-up screen will come and there you need to set Binding properties Items, Item Text and
Item Value as shown below and Press OK.
Now you are done with implementing Static/Context based value help for you adobe interactive form.
Save and activate your form and test application. Now you can see Static/Context based value help once
you click drop-down link on adobe form.
Comparison
Standard Static
Coding Required No Yes
Online Yes Yes
Offline Not available Yes
Whenever we use a table in an adobe form using drag & drop, following are the common problems faced:
Whenever the column fields are rearranged randomly into many rows, the data is displayed in a
improper fashion.
In debugging, if we delete any row, and the data that is displayed becomes improper.
Solution: This demo will help us rectify the problem by making the subform behave as table and the data
part as body row.
Step1: Go to SFP transaction and create interface for the Adobe form.
Step2: Passing the table as import parameters, which will be passed through driver program.
Step6: Deactivate the fields of the table, which will not be used in the layout, it adds to the performance.
Step7: Go to layout tab, under the layout change the content area adding a static text to the top of master
page. Name the content area. Click on the tab body pages.
Move the fields, which you want to view from data view on to the body page individually.
Note: When we try to move the individual fields of the table the binding with the table is affected and the
data that is displayed becomes inconsistent, this demo will help you retain the binding with the table by
making the subform act as a table.
Step8: The field 'FLDATE' can be displayed in different formats as per the requirements, which will be
explained by below snapshots.
Step9: Select all the fields being displayed on the layout and wrap them in subform.
The Accessibility of the form should be bodyrow. Create another subform for ex: Sflight details and wrap
the fields in this subform and give the subform content as positioned and for the bodyrow subform give
the subform contents as flowed. The check box "Allow page breaks within content" has to be marked for
the data which is being flowed.
Step10: If the data is flowing to multiple pages then we direct the over flown data.
Move to pagination tab under object tab, under that if dataset is paginated under overflow give the name
of content area and overflow leader as header row. By adding this whenever an overflow occurs the
header will be displayed in all the pages.
We need to create two subforms, the reason is that the body of the table can be flowed to multiple pages
and if we make the subform as flowed all the elements will be aligned either top to bottom or western text
(left to right). So as we need to display the table contents in two rows we created two subforms, first one
will be flowed and the second one under first one which will be positioned.
Drag a static text element from the library and drop it above the body row. Wrap the text in a subform
giving the accessibility as header row.
Step12: Creating a table subform. The content of the subform should be flowed and the accessibility
should be table.
Name the untitled subform (Page 1) as "Bodypage1". After doing this change the content of the body
page as flowed then click on pagination tab, under that if dataset is paginated under overflow give the
name of content area same as what we performed for body row. (In body page we gave overflow leader
as header row but in body page pagination do not use that)
Step13: Giving borders to the table and header.
Step14: Giving bindings to each of the subforms.
Step16: Creating a Driver Program which will call the form and on execution will display the adobe form.
*&---------------------------------------------------------------------*
*& Report yh_demo *
*&---------------------------------------------------------------------*
*&Purpose: Demonstrating driver program to display adobe form *
*&---------------------------------------------------------------------*
REPORT yh_demo.
*Data Declarations
DATA : it_sflight TYPE sflight_tab1.
DATA :
w_doc_param TYPE sfpdocparams,"Doc Parameters
w_output_param TYPE sfpoutputparams,
"Output Parameters
result TYPE sfpjoboutput. "Joboutput
DATA :
fm_name TYPE rs38l_fnam. "Function Module name
* Determine print data, Data which will be displayed on the form
SELECT * FROM sflight
INTO TABLE it_sflight
UP TO 20 ROWS.
IF sy-subrc NE 0 .
ENDIF.
* Determine the function module which is generated at the runtime for
* the pdf form used
CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
i_name = 'YDEMO_SUBFORMS'
IMPORTING
e_funcname = fm_name.
* This function module is used to specify settings for the form output.
* To specify whether you want the form to be printed, archived, or sent
* back to the application program as a PDF.
* The form output is controlled using the parameters (w_ouput_param)
* with the type SFPOUTPUTPARAMS.
CALL FUNCTION 'FP_JOB_OPEN'
CHANGING
ie_outputparams = w_output_param
EXCEPTIONS
cancel = 1
usage_error = 2
system_error = 3
internal_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Set the language field the component of structure /1bcdwb/docparams
w_doc_param-langu = 'EN'.
* Call the function module and passing the form interface values
CALL FUNCTION fm_name
EXPORTING
/1bcdwb/docparams = w_doc_param
it_sflight = it_sflight
* IMPORTING
* /1BCDWB/FORMOUTPUT =
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* To complete the processing of the form
CALL FUNCTION 'FP_JOB_CLOSE'
* IMPORTING
* E_RESULT = result
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Give the device name which is configured for ADS. Click on Print Preview to see the preview of the form.
Page 1:
Page2:
Using Where conditions to relate header and item tables in Adobe
forms
By Jayachandra Nagaram, YASH Technologies
In this demo we will create an Adobe form, which displays relating data from two tables (Header and Item)
by using „Where conditions‟ in Form context.
In this demo we can use the interface YDEMO_ALTERNATIVE which is used in previous tutorial
using alternatives.
Step3: Drag and drop Global table GT_SPFLI from interface to context area.
Step4: Select all fields which are not required to display and deactivate the fields. (right click)
Go to create--> Loop
This will create a table i.e., a sub loop under the main loop.
Note: when you drag a table in to context it will internally create a loop processing in the form.
Step6: A dialog box will open asking for table which you want to loop inside main loop.
Step7: Click the F4 help button, it shows the tables that exists in the interface.
Step8: Select the table GT_SFLIGHT (item details)
It will internally create a sub loop i.e, a table GT_SFLIGHT under the table SPFLI data.
Step9: Select the fields which are not required to display and deactivate.
Step10: Double click table GT_SFLIGHT and go to the where conditions tab available in lower part of the
window.
Note: Do not drag the entire table into body page. We need to follow creating table using sub forms
concept.
Go to hierarchy view; Select all fields of spfli, Wrap the fields into sub form by right clicking.
Again wrap the sub form in to another sub form. Sub form properties are maintained latter.
Step13: Drag and drop the fields from sflight into body page and create sub forms as showed in below
snap. Keep note that the subforms created for sflight fields should be place inside the spflidata subform.
Maintain names as spflitable
'-->spflidata
'-->sflighttable
---> Sflightdata
Subform: spflitable
Subform: spflidata
Subform: sflighttable
Subform: sflightdata
Step16: Now your FORM is ready, check for syntax and activate it.
Execute the form and follow the below to get the data in hierarchy level. Header and its corresponding
item details.
Output: Page1
Page2
Nested tables in Adobe Forms
This Tutorial demonstrates on using Nested Tables in Adobe Forms.
Step1: Go to SFP transaction and create interface for the Adobe form.
Note: Maintain Interface type ABAP-Dictionary Based interface. (IN ECC6.0 Version)
Step 2: Create Global Types as shown below by clicking on Types, here we are creating a Nested Table
type which consists of 2 Individual fields (carrid, carrname) and an Internal Table(spfli).
Step 3: Create Global Work Areas and Internal Tables as shown below.
In code initialization the variables whose values are being passed to the code to fetch the details of the
output should be declared in the Input parameters and the variables to which the results are assigned
needs to be declared in the Output parameters.
Input Parameters:
WA_SCARR
IT_SCARR
WA_SPFLI
IT_SPFLI
WA_FLIGHT
Output Parameters:
IT_FLIGHT
Step 5: Write the below code in code initialization part. Check for errors and activate the interface.
Step 6: After the interface part is done, create Form by going to SFP transaction.
Step 7: In the creation of the Form, we need to give the name of the interface for which we are creating
the Form. This is the additional functionality in Adobe forms. One interface can be used for many Forms
if it is suitable.
Give the Description to the Form as shown below.
Step 8: In the Context tab of the Form we will find two sections Interface and Context.
In Interface we will find the data that was created in the interface. We need to drag the elements that
need to be displayed in output into the content area.
Deactivate the Unwanted Fields as shown below.
Then Right-Click on the Content Area and click on Insert SubForm and Resize it accordingly.
After that Click on Master Pages and then Drag and Drop a Text and Enter any suitable Text.
Then Right-Click on data and create one more Sub Form and align it as shown below.
Reduce the size of Content Area as shown in figure below.
Step 9: Click on Subform and then in Right-click on the Subform and then in Palettes click on Object and
then under Objects Tab click on Subform and make the Content as Flowed as shown below.
Then Create one more Subform and Rename it as Table and then Right-click on this Form and in
Palettes click on Accessibility make the Subform role as Table and make its Subform content as Flowed
as in above case.
Step 10: Then Insert two Sub Forms in the Table Sub
Form, rename it as Header and Body, make sure to
make them as Flowed too, and make the Accessibility of the two Subforms as Header Row and Body
Row respectively.
Then Insert a Static Text in Header and insert the Field names as shown below.
Step 11: Then under Data View, individually Drag and Drop the Fields from the table it_flight in Body Sub
Form.
CARRNAME,
SPFLI.
Step 12: Then under Hierarchy tab Select the 3 Fields (i.e. Carrid, Carrname, and SPFLI) and then drag
drop them in Body Sub Form as shown below.
Then make the Body Sub Form as Flowed as well as make its Flow Direction as Western Text as shown
below.
Step 13: Delete the Table Header of SPFLI as shown.
Step 14: Under the Pagination Tab of Body Subform in Overflow choose the Go To Content Area value
as ContentArea1.
Step 15: Change the Binding of the Body Subform as shown below.
Step 17:
Step 18:
In this document we discuss the how to achieve the control levels in the Adobe Form (both using Table
and Subform).
A pop up window appears where we need to provide the description of the interface and save it.
Step2: Define the user defined data types Types definition under Global Definitions as shown below.
Save and activate the interface. Come back to the initial screen of adobe form.
In the above screen, we have internal table IT_VBAP under Global Data, which is under Interface.
Context area is a bridge between Interface and form. Whatever the information (data) we need to place in
the form is to be placed in the context area.
Step6: Now drag and drop this internal table IT_VBAP into context area. Then only we can use the
internal table in the form.
Provide the description of the internal table under properties tab below the context area.
Step7: Now go to Control Levels tab as shown in above screenshot and provide the field name on which
sort to be done. Control levels were introduced in SAP Net weaver 2004s.
Now the internal table splits into two parts where sorted fields are in one part and remaining all fields are
grouped under GROUP internal table.
Step8: Drag the static text from the library into the form and provide the descriptions of the fields (Acts as
a header).
And also drag the internal table into the form (Here I deleted the default heading).
Save and activate the form.
In the above scenario, we directly drag and dropped the internal table into the form. But in this scenario,
we use subforms to achieve the same.
Renamed it as „Body‟.
Step11: From the Data View, drag and drop the fields individually into the form as shown below.
Step12: Wrap the field „VBELN‟ into the form as shown below.
And similarly wrap the remaining two fields into another subform „DATA‟ which intern wrap into the
subform „Group‟. The final view of the Hierarchy is as shown below.
Now let us extend the scenario to have the page header whenever there is a page overflow.
Go to Palettes-Object.
Here, in the Pagination tab under Object, select Overflow leader as „Header‟ subform.
Step17: Execute the form and the output of the second page is as shown below.
In this demo, we will work with table 'SFLIGHT' and calculate Sub-totals and Grand total for the field
'PRICE'.
Step 3: In the Code Initialization part, fetch records from sflight into internal table it_sflight.
SELECT *
FROM SFLIGHT INTO TABLE IT_SFLIGHT
UP TO 50 ROWS.
Step 4: Save and activate the interface.
Step 6: In the context part of the form drag and drop the table sflight from global data of interface area to
the context area and deactivate the field which we don't require in the layout.
Step 7: Create a table by drag n drop from library on to the layout. Include one header row and footer row
in the table.
Enter the name of the field you want to display in the header row of the table.
Move the table fields from the table by drag n drop from Data View Palette on to the body row of the
table, which we have created. In the footer row insert a text field in the last column from the library as
shown below.
Step 8: Calculating Sub-Total for field price.
Firstly enable JavaScript for the text field, which we created in footer row.
Write this code in the area provided under these selection boxes.
Group the elements of the body row, and then insert subform by right clicking on data.
Move the table under the subform and Insert a new subform with a text field under it.
After following these steps,
Write the code under the area provided for the text field
sum(Data.Table1.Group1.Row1[*].PRICE[*])
Click Enter Script Source Changes + to add the script to your form.
Step 11: Save and activate the form. Execute the form.
Page1:
Page2:
Including the Standard Texts (SO10) and any other Long Texts in
the Adobe Forms
By Chandra Mohan Reddy Piminty, YASH Technologies
Creating an Import parameter VALUE of type ZTEST_S. Structure of ZTEST_S is in the next slide. Activate
the Interface.
Second Step: Form Design
Create a form (Ex: ZCHANDU) and provide the interface name created above
Creating a Text node by right clicking on the top node ZCHANDU and then
In the properties of the TEXT node select Text type Include Text and then provide the Text Name, Text
Object, Text ID and Text Language values as shown below.
Drag the VALUE structure from the interface into the Context.
We can pass the Text node properties values dynamically as well. An example is shown below:
Next go to the Layout Tab:
Drag the TEXT node into the BODY subform at the desired location.
The Hierarchy Palette and the Body pages screen shot is shown below.
The screen shot of the Standard text created in Transaction SO10 is as below:
Limitations of Include Texts in Adobe Forms:
If the values of the Text Symbols are coming into the Form in an internal table then we would not
be able to use the Include text, as in Adobe Forms between the internal table name and the field
names a DATA node is inserted due to the XML naming conventions and this DATA node is the
one that creates the problem. Even though we have the table name and the field names same as
in the Standard text, the error would be that the field is not found.
The Text Symbols values must be coming from the Interface. If we are using Script (Formcalc or
JavaScript) and filling the Field values, then those values would not be passed to the standard
text, even though we have the calculated value in the Field and be able to print it.
Let us first create an interface for the form. Say the name of the interface is ZTABLES.
Chose Create (f5) and provide the necessary description for the same.
Enter the description and provide the interface name as ZTABLES, which is created earlier.
Drag the import parameter PERNR and output tables and system fields( if needed) onto the context area
First deactivate all the fields in the table itab and then select the fields to be visible in the output (right
click on the field and choose activate) as shown below. Repeat the same for the internal tables itab1 and
it_final as well .
Click on layout tab.
Now drag the fields from the data view to the design view...and arrange them in a specific order in which
you want and create a text element for the header. Here you can change the font and size for the text
element in the right side pane.
Go to pallets -> object then a new window will opens as shown below. (Compare the above and below
diagrams)
Double-click on the image dragged from the library (here it is shown below) then it will show a F4 help for
selection of the image like this..
Click on the image and choose open then it will be on the body page and you can select the image and
increase the size of the image also
For the image to be displayed on the form, it is important to do this. Right Click on the image and click
on object and check the EMBED IMAGE DATA checkbox.
How to put the background image on the form
To put the image as a background, select the image into the body page and right click on the
image and choose send backward then it will become the back ground like this..
(You need to check the checkbox EMBED IMAGE FIELD for the background image here as well)
REPORT Zadobeforms .
data:/1BCDWB/FORMOUTPUT type FPFORMOUTPUT ,
/1BCDWB/DOCPARAMS type SFPDOCPARAMS ,
ie_outputparams type SFPOUTPUTPARAMS .
CALL FUNCTION 'FP_JOB_OPEN'
CHANGING
ie_outputparams = ie_outputparams .
.
*---here get the function module name from the form
CALL FUNCTION '/1BCDWB/SM00000220'
EXPORTING
/1BCDWB/DOCPARAMS = /1BCDWB/DOCPARAMS
pernr = '00001000'
IMPORTING
/1BCDWB/FORMOUTPUT = /1BCDWB/FORMOUTPUT .
CALL FUNCTION 'FP_JOB_CLOSE' .
Step 6: In the context part of the form Create Address Node as shown below.
Step 7: Click on the Address node and set the properties as shown below.
Step 8: In the Layout part of the form, Drag and drop the Address Field.
Step 9: Set the Object properties of Address text field as shown below.
Step 10: Set the Border properties of Address text field as shown below.
Step 11: Drag the static text from the library into the form and provide the descriptions of the fields.
Step 12: Save and activate the form.
Step13: Test form, by entering Address type, Address Number and Sending Country.
If our application makes no use of the Business Address Services but you still want to have country-specific
addresses, we must use ABAP coding to achieve this. It is possible to do this in the application program or in the
initialization coding of the interface.
TYPES:
BEGIN OF ty_adr_printform_table_line,
line_type TYPE ad_line_tp,
address_line LIKE adrs-line0,
END OF ty_adr_printform_table_line.
TYPES:
ty_adr_printform_table TYPE TABLE OF ty_adr_printform_table_line.
Step 4: Define Global Work Areas and Internal Tables under Global definition as shown below.
Step 5: Write the below code in code initialization part. Check for errors and activate the interface.
SELECT SINGLE *
FROM scustom
INTO is_scustom
WHERE id EQ is_customer_id.
is_address-title_text = is_scustom-form.
is_address-name1 = is_scustom-name.
is_address-street = is_scustom-street.
is_address-po_box = is_scustom-postbox.
is_address-post_code1 = is_scustom-postcode.
is_address-city1 = is_scustom-city.
is_address-region = is_scustom-region.
is_address-country = is_scustom-country.
* Address Format According to Post Office Guidelines
* Note : Refer Function module documentation for more information.
CALL FUNCTION 'ADDRESS_INTO_PRINTFORM'
EXPORTING
address_1 = is_address
address_type = '1' "normal/company
sender_country = is_country
number_of_lines = 8
IMPORTING
address_printform_table = it_address_lines.
Step 9: In Interface we will find the data that was created in the interface. We need to drag the elements
that need to be displayed in output into the content area.
Step 10: In the Layout part of the form, Drag and drop the Address Field.
Step 11: Drag the static text from the library into the form and provide the descriptions of the fields.
Step 12: Set the Border properties of Address text field as shown below.
Step 13: Set the Object properties of Address text field as shown below.
Step 14: Wrap the address field into Subform as shown below.
Go to transaction NACE.
Choose the required application from the list and click on output types.
Chose one of the Output types from the right pane and click on processing routines.
Following screen appears:
If an SAP Script to be attached, fill-in the driver program name, Form routine and SAP Script name in the
field “Form” (shown below)”
If an Smart Form / Adobe Form are to be attached, enter the form name in the field “PDF/SmartForm
Form” and select one of the types “PDF” or “SmartForm”. (See the screenshot below)
I have created a table „ZDEPT‟ with just three fields; I will be creating an Adobe form for these three fields
and will be updating this table using ABAP Web Dynpro framework.
Go to transaction SE80 and create a web dynpro component ZADOBE‟.
You can see Component controller, Interface controller and window being created
Create a View as shown below
Give the view name as „MAIN_VIEW‟ as show below
You can see the main view being created.
Go to the context tab of the “MAIN_VIEW‟ and create a empty node.
Give the name of the Node as „Adobe‟ and press enter as shown below.
You can see the node „Adobe‟ being created below.
Create another node under the node adobe as shown below.
Give the name of the node as „ZDEPT‟ and Dictionary structure as „ZDEPT‟ and press the button „Add
Attribute from Structure‟.
Select the Fields as shown below and press enter.
You can see the node „ZDEPT‟ with three fields being created under the node „ADOBE‟.
Now create an attribute „PDF_SOURCE‟ under the root node „CONTEXT‟ as shown below
Give the Attribute Name as „PDF_SOURCE‟ and the type „XSTRING‟ as shown below
You can see all the nodes that we have created; your screen should appear like the one shown below.
Go to the Layout tab of the „MAIN VIEW‟ and create a place holder for the adobe form, Right click on the
„ROOTUIELEMENTCONTAINER‟ select „insert Element‟ from the context window as shown below.
Enter the details in the POPUP window, give the name of the place holder as „ADOBE‟ and type
„InteractiveForm‟ as shown below.
You can see the placeholder „ADOBE‟ being created, check the CHEKBOX enabled in the property list,
this is a required entry for an interactive form, (an activex control „Active Control Framework‟ will be
automatically downloaded on to the client from the server when the web page is first called). Increase the
height to 500px and width to 500px as shown below.
Click on the button in the property list for the property „pdfSource‟ and select the node „PDF_SOURCE‟
from the context window.
In the property List for „template Source‟ property give the name of the adobe form ‟ZADOBE‟ that we will
be creating during this session and double click on it.
In the POPUP window, give the adobe form interface name „ZADOBE‟ as shown below and press on the
„Context button‟ as shown below.
Select the Node „Adobe‟ from the context window as shown below.
Save the application as local object.
Press
the button „Save‟ to save the main view.
You can see the Adobe form application with our web dynpro context node „ZDEPT‟ being mapped to the
context of the Adobe form in the Data view tab.
Just Drag and Drop the „ZDEPT‟ Node on to the form, in the subform tab of the object make the content
as „Flowed‟ as shown below
Drag and Drop „Text‟ from the Library pallet and enter the text as you wish
Drag and Drop the Submit button on the form as shown below
Just select the event click* and language JavaScript and run at client (No coding is required)
Now save and just activate the Form and the interface as shown below.
Go to the properties page of the form and double click on the interface „ZADOBE‟ you can see the „XML
Schema‟
You can see the „XML Schema‟ interface (You can have three types of interfaces „Abap dictionary
interface, Smart form compatible interface and XML interface) for interactive forms using WebDynpro you
have to use the XML Schema interface.
method ONACTIONCLICK .
data:
Node_Adobe type ref to If_Wd_Context_Node,
Node_Zdept type ref to If_Wd_Context_Node,
Elem_Zdept type ref to If_Wd_Context_Element,
Stru_Zdept type If_Main_View=>Element_Zdept .
wa_zdept-DEPTNO = Stru_Zdept-deptno.
wa_zdept-DNAME = Stru_Zdept-dname.
wa_zdept-LOC = Stru_Zdept-loc.
endmethod.
You can see an activex control named „SAP ACF‟, if you don‟t have this control you will not see this page:
Note you need to have adobe acrobat reader 7.1 installed, I have used version 9, the activex control was
not working properly so down graded my adobe reader to 7.1)
Press F8 to continue.
You can see the entry in the table ZDEPT being updated.
Demo scenario on Adobe Forms using ABAP WebDynpro - Part 2
By G.K.Akbar, The Washington Post
In the earlier example, we have created a WebDynpro application to populate the data into the custom
table ZDEPT. In this, we would display the data from the ZDEPT using ABAP WebDynpro.
Enter the Import parameter „ZDEPT‟ and type „ZDEPTTBL‟. Save and activate the interface
Create the form „ZDEPFRM‟
Go to the Layout tab and Drag & Drop the „ZDEPT‟ node on to the form layout, Save and Activate the
form
You can also create a Report program (Print Program) and call the above mentioned form, but we are
going to write the print program logic in the Web Dynpro.
You can see the Component Controller, Interface controller and window being created
Create a view as shown below:
Give the Name of the View as „MAIN_VIEW‟
Go to the layout tab of the „MAIN_VIEW‟ and create a place holder for the adobe form as shown below
Give the name of the node as adobe and type Interactive form
In the properties list set the Height and width and the template source as „ZDEPFRM‟ this is the actual
name of the adobe form which we have created earlier, you can see the interface context is automatically
mapped to the data source.
You can see the mapped data source in the context tab of the „MAIN_VIEW‟
Go to the Methods table of the „MAIN_VIEW‟ and double click on the „WDDOINIT‟ method,
We are going to write the print program‟s logic in this method, we are not going to use the standard
function modules that we use normally in the Report print program such as
( Name = IF_MAIN_VIEW=>wdctx_Zdepfrm ).
Node_Zdepfrm->bind_element( Elem_Zdepfrm ).
endmethod.
Go to the window „Z_NON_INT_FRM‟ and select the window tab as shown below
Drag and Drop the „MAIN_VIEW‟ on to the window
Save and activate the Web Dynpro
...Previous
Create a Web Dynpro application as show below
Enter the name of the application „Z_NON_INT_FRM‟ and save the application
Test the Web Dynpro application
Logon with you credentials enter the username and password.
You can see the output in the form below.
Printing labels using Adobe Forms
By Sri lakshmi Lavanya Koduganti, CSC India
Drag and drop Content area from Library into the layout. Name it as Cont1
Go to Master Page tab and reduce the size of the Content Area.
Drag and Drop all the fields from GT_VBAK into the Design vew..
Create 3 more Content areas as below and name them as Cont2,Cont3 and Cont4.
Select all the fields from GT_VBAK and wrap them in a subform.
Name them as Subform1 and Subform2.
Select Subform1 and goto Palettes->Object. Make the content as Flowed.
Save and Activate the form.Execute the form for the following Sales orders.
4969
4970
4971
4972
4973
Page1
Page 2
Migrating SAP Smart forms to Adobe Forms
By Phani Diwakar, YASH Technologies
This document gives an idea about migration of a smart form to an interactive form.
Step1: Go to transaction code SMARTFORMS and select the smart form to be converted into print adobe
form.
A text element and table are defined in this existing smart form.
Step5: Provide form name and interface name and click enter.
Step6: You will get settings window as shown below.
Step7: Now go adobe form initial screen. Provide the interface name as mentioned above.
Step8: Go to properties tab. You get the default interface type is „Smart forms-Compatible Interface‟ as
shown.
Activate the interface and come out to initial screen.
Step9: Now provide the form name mentioned above in the initial screen.
Now,
In general, the boiler plate objects placed on the master page will reflect in all remaining pages. Now
consider the scenario where the boiler plate objects placed on the master page reflects only on first page
but not on the subsequent pages.
We can achieve the above scenario by creating another master page and body page. This document
shows the steps to achieve the same.
Step1: Go to SFP transaction to create adobe form. Provide the interface name and click on create
button.
Provide the description.
Step3: Now go to TYPES options in the GLABAL DEFINITION to define user define declarations.
Step6: Provide the form name and give the interface face name and description in the appearing
subsequent dialog box.
Step7: Drag and drop the IMPORT parameter „carrid‟ and GLOBAL DATA parameter „t_sflight‟ to
context.
Step8: Now go to Layout tab,
In master page, drag the content area little bit down from the top to place logo and import parameter
„carrid‟. Also resize the content area as shown below.
Step9: Drag and drop the internal table into body page as shown below.
Step10: Now rename the „Untitled Sub Form‟ to „Bodypage1‟ and make the sub form type asflowed as
shown.
Active the form and when execute at this point of time, you would observe logo and carrid on every page
of output as shown.
And also in all remaining 3 pages logo and carrid is printed.
But our objective of this document is of restricting these TWO, carrid and logo. For that, proceed as
follows
Step11: To create new master page, right click on page1 and select New Master Page as shown.
Step12: New master page is created.
Step13: Now create new body page. Right click on „Bodypage1‟ and select New Body Page.
Rename it to Bodypage2.
Step14: Drag and drop the internal table into Bodypage2.
Go to pagination tab.
Step16: Now, select Bodypage2. Go to pagination tab in the object palette. Select „Page2‟ in place of
„Following Pervious‟ as shown below
In this document we discuss how to send PDF file as an E-mail attachment to respective candidate.
Step1: Go to transaction SFP to create form interface. Provide the interface name „ZPERSONNEL_INT‟.
Click on Save. Provide the package name in the following screen and press enter.
Click on create button and provide the description and interface name.
Step4: Drag the IMPORT parameter „EMP_INFO‟ from interface to context tab.
Drag the drop the each field from data view to layout editor as shown.
Save and activate it.
We can provide the tool tip text using Accessibility tab as shown.
Step6: Now create an ABAP program which will create a form and email to selected candidate so that it
can be filled offline. (Click here for the program used for this demo purpose)
A. Obtain the name of the generated function module of the form using
„FP_FUNCTION_MODULE_NAME‟ by pass the form name to it.
B. Set the output parameter and open the spool job. Fill the value „X‟
to NODIALOG andGETPDF parameter of the structure SFPOUTPUTPARAMS. Pass this
structure to function module „FP_JOB_OPEN‟
C. Call the generated function module. Pass the value „X‟ to parameter FILLABLE of the
structure SFPDOCPARAMS (Form parameters for Form Processing) which is standard
parameter. By default this FILLABLE parameter is assigned with space. When „X‟ is passing to
this parameter then form acts as interactive form, otherwise it is print form.
E. Send this form to mail as a PDF attachment using Business Communication Service (BCS).
Pre–requisite:
It is assumed that the reader of this article has basic knowledge in WebDynpro and adobe forms.
Requirement:
The Requirement is to send the adobe forms as a “PDF” attachment using the standard button “Email
Submit Button”. The standard property of the button is to send the attachment as “XML“.
Procedure:
We have to alert the xml coding of the ADS to achieve this requirement.
11. Drag and Drop the Button “Email Submit Button” from Object Library
12. Give the Email Address & Subject as required
13. Right Click on the Toll bar of the Form Designer as shown below and select XML Source
14. CLT + F on the XML Source Code and search for Format
Change XML to PDF in double quotes as shown below.
21. The Mail would be configured and the attachment would be in PDF not XML
Uploading a PDF file in an Adobe Form offline scenario
By Phani Diwakar, YASH Technologies
This document provides the idea of how to upload the PDF file data into SAP. This document is extension
to document „how to send the PDF file as an attachment in interactive offline scenario‟. Once the selected
candidate fills the personnel information form and sends it back to HR, they update the data in SAP.
To extract the data from the PDF file we should do the following steps.
2. Instantiate the PDF object and assign the PDF file to this PDF object
Get the reference to form processing (FP) class using the interface IF_FP.
Get the reference of PDF object class using interface IF_FP_PDF_OBJECT.
Create the PDF object using the method ‘CREATE_PDF_OBJECT’ defined in the interface
IF_FP
Set our PDF in the created PDF object using method SET_DOCUMENT of the interface
‘IF_FP_PDF_OBJECT’.
Extract the data from PDF object using the method „SET_EXTRACTDATA‟ of the interface
IF_FP_PDF_OBJECT.
Call the Adobe Document Service (ADS) using the method EXECUTE defined in the interface
„IF_FP_PDF_OBJECT‟.
3. Extract the data from PDF Object by method called GET_DATA defined in the interface‟
IF_FP_PDF_OBJECT‟.
4. The extracted data is in XML format. We have to convert XML data to ABAP internal table using the
Function Module „SMUM_XML_PARSE‟.
REPORT zpersonnel_02.
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS:
p_file LIKE rlgrap-filename " File path
OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
DATA:
w_filename TYPE string, " File name
w_length TYPE i,
lt_file_table TYPE filetable,
lv_filelength TYPE i,
lv_rc TYPE i,
lv_filename TYPE string,
w_pdf_data TYPE xstring,
lt_rawtab TYPE TABLE OF char255,
w_pdf_file TYPE string,
* Create PDF Object using destination 'ADS' (<-- this is how it is
* defined in SM59)
lo_pdfobj TYPE REF TO if_fp_pdf_object VALUE IS INITIAL,
xslt_message TYPE string,
exc TYPE REF TO cx_root,
fs_per_info TYPE ZWD_PER_INFO.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM f4_help_for_file.
START-OF-SELECTION.
PERFORM get_pdf_data.
PERFORM get_pdf_instantiate.
PERFORM extract_data.
*&----------------------------------------------------------------*
*& Form F4_HELP_FOR_FILE
*&----------------------------------------------------------------*
FORM f4_help_for_file .
CALL METHOD cl_gui_frontend_services=>file_open_dialog
CHANGING
file_table = lt_file_table
rc = lv_rc
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* READ TABLE lt_file_table
* INTO lv_filename
* INDEX 1.
READ TABLE lt_file_table
INTO p_file
INDEX 1.
IF sy-subrc EQ 0.
lv_filename = p_file.
ENDIF.
cl_gui_frontend_services=>gui_upload(
EXPORTING
filename = lv_filename
filetype = 'BIN' "Binary
IMPORTING
filelength = lv_filelength
CHANGING
data_tab = lt_rawtab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19 ).
ENDFORM. " F4_HELP_FOR_FILE
*&----------------------------------------------------------------*
*& Form GET_PDF_INSTANTIATE
*&----------------------------------------------------------------*
form GET_PDF_INSTANTIATE .
* Get FP reference
DATA: lo_fp TYPE REF TO if_fp VALUE IS INITIAL.
lo_fp = cl_fp=>get_reference( ).
* For handling exceptions
DATA: lo_fpex TYPE REF TO cx_fp_runtime VALUE IS INITIAL.
TRY.
lo_pdfobj = lo_fp->create_pdf_object( connection = 'ADS' ).
* Set document
lo_pdfobj->set_document(
EXPORTING
pdfdata = w_pdf_data ).
* Tell PDF object to extract data
lo_pdfobj->set_extractdata( ).
* Execute the call to ADS
lo_pdfobj->execute( ).
CATCH cx_fp_runtime_system INTO exc.
xslt_message = exc->get_text( ).
ENDTRY.
endform. " GET_PDF_INSTANTIATE
*&----------------------------------------------------------------*
*& Form EXTRACT_DATA
*&----------------------------------------------------------------*
form EXTRACT_DATA .
DATA: xml_data TYPE xstring,
t_return type standard table of bapiret2,
t_per_info type standard table of smum_xmltb,
lfs_per_info type smum_xmltb.
lo_pdfobj->get_data(
IMPORTING
formdata = xml_data ).
CALL FUNCTION 'SMUM_XML_PARSE'
EXPORTING
xml_input = xml_data
tables
xml_table = t_per_info
return = t_return
.
LOOP AT t_per_info INTO lfs_per_info.
CASE lfs_per_info-cname.
WHEN 'FNAME'.
fs_per_info-FNAME = lfs_per_info-cvalue.
WHEN 'LNAME'.
fs_per_info-lname = lfs_per_info-cvalue.
WHEN 'DOB'.
REPLACE ALL OCCURRENCES OF '-' IN lfs_per_info-cvalue WITH space.
CONDENSE lfs_per_info-cvalue.
fs_per_info-DOB = lfs_per_info-cvalue.
WHEN 'TEXP'.
fs_per_info-TEXP = lfs_per_info-cvalue.
WHEN 'CEMPLOYER'.
fs_per_info-CEMPLOYER = lfs_per_info-cvalue.
WHEN 'CSALARY'.
fs_per_info-CSALARY = lfs_per_info-cvalue.
WHEN 'ESALARY'.
fs_per_info-ESALARY = lfs_per_info-cvalue.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
fs_per_info-WAERS = 'INR'.
INSERT INTO ZWD_PER_INFO VALUES fs_per_info.
endform. " EXTRACT_DATA
*&----------------------------------------------------------------*
*& Form GET_PDF_DATA
*&----------------------------------------------------------------*
form GET_PDF_DATA .
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_filelength
* FIRST_LINE = 0
* LAST_LINE = 0
IMPORTING
BUFFER = w_pdf_data
tables
binary_tab = lt_rawtab
* EXCEPTIONS
* FAILED = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
endform. " GET_PDF_DATA
This is the offline interactive scenario where in user downloads the file from the browser and save it on
desk top. After the filling the form by user then that form will be uploaded into SAP. Now here we will see
how to download the file from the browser. To upload the filled-in PDF file, click here.
Click on Enter.
Step5: Provide the filename which is either already exists in the MIME repository or place the file in the
MIME repository which you want to be down loaded.
In SAP folder, select the folder WDR_TEST_ADOBE and place the file as shown below.
The following screen will appears. Select the file from desk top that you want to be down loaded from
browser.
The requirement is to upload the filled PDF data file into SAP from browser. FILE UPLOAD element is
used in Web Dynro to upload the file. This document is extension to „how to down the file from the
browser‟.
Click on Enter.
And also create button. The properties of the buttons are as shown below.
Step4: Now select the binding tab against DATA property of the FileUpload element. Bind this DATA
property with PDF_SOURCE attribute defined in context.
Click on the method „ONACTIONUPLOAD‟ from the METHOD tab or double click on Action property
„UPLOAD‟ defined in the button property which takes you to the method „ONACTIONUPLOAD‟. Enter the
code provided here.
If you check the data base, the PDF data is uploaded into database table.
The screen shot of the Web Dynpro component is
Scenario: Fetching the Material Description for a Material in Adobe Form using Web Service.
Consider a Scenario User enters a Material Number in a Adobe Form and the Material Description has to
be fetched from the Material master table , for this we use web service to fetch the description.
Step 3: Write the code for to fetch the material description in source code.
Then activate and check the function module
Step 4: Goto the Utilities->More utilities->Create web service->From the function module
Press continue
Press continue
Press continue
..Previous
Check local object or package name
Press continue
Press complete
To find your web service, type your Service name in the Search Pattern and then select your service then
click
Step 1 : Then go to the transaction SFP and create a empty interface then create a form
Step 3: In layout to create a new button and change its control type to Execute
Output:
Step 6: Run the print program and then save the pdf form in your drive or desktop, then open the form
using the Adobe Reader (7.0 or above).
Give the material number and press description Button; it fetches the description of the Material entered.
This is one of the scenarios where we need to trigger page breaks based on some condition. For
example, we need to trigger page break for each change of CONNID. For that we use CONDITIONAL
BREAKS in PAGINATION of OBJECT palette.
Step3: Come back to initial screen of Form builder and create form „ZTEST_CONDITION_FORM‟.
Select CONNID field then the following code would be appearing on the space provided on the text editor
automatically.
Now select the radio button before and for To field select TOP OF NEXT PAGE.
This document discusses how to create online interactive travel request form. The lay out of the travel
request would be in the given format.
SAP
Java
Oracle Apps
2. The values in the drop down list for destination country are
US
UK
India
Step1: Go to the t-code SE80 to create Web Dynpro application. Provide the web dynpro component
name as „ZTEST_TRAVEL_REQUEST‟.
Click on Yes to create component and provide the description for the component.
Note: Create the table „ZWD_TRAVEL‟ with the following structure before creating webdynpro
component.
Now travel node contains the following fields,
Step3: Create „pdf_source‟ attribute of type XSTRING that holds the PDF document.
Step4: Now go to Layout tab.
Step5: Click on pdfSource property as shown in the Interactive form properties tab as shown below.
Provide the interface name and click on CONTEXT button to bind the node ADOBE to form.
The following popup will appears. Select ADOBE node and click on „OK‟ button.
Then press „Yes‟.
The fields defined in the node „TRAVEL‟ is mapped to Data View of the layout.
Drag and drop the every field onto the BODY PAGE.
Now we need to make the field DEPARTMENT as drop down list box.
For that we need to change the field type from TEXT FIELD to DROP DOWN LIST BOX as shown
below.
Now click the „+‟ button as shown above and add texts.
Step7: Drag the static text and write „Travel by‟ text in it.
Now drag and drop the radio button from LIBRARY as shown below.
Rename the Radio Button to Private Car and press enter. Then
Again rename the Radio Button to Company Car and press enter. Then
Repeat the same process for remaining 3 radio buttons.
Change the layout type „UNKNOW LAYOUT TYPE‟ to „ZCI LAYOUT‟ as shown below.
Step8: Now activate both the form and interface.
Now click on create button. Provide the action name and description.
Now double click on SAVE.
Step10: Now go to „Web dynpro code wizard ( )‟. Select the node ADOBE.
And press enter.
You get the successful message after the record is inserted in the data base.
Check the data in the table.
2. Enter the View Name , „Main_View‟ in the pop up window and press „Enter‟ .
13. Enter the details in the pop up window. Give the name of the element , „zuser_element' and select
the Type as „Interactive Form‟.
15. Click the button in the property list for the property „dataSource‟ and select the node
„ZROOTNODE‟ from the context window .
16. Click the button in the property list for the property „pdfSource‟ and select the node PDF_SOURCE
from the context window.
Click the button in the property list for the property „pdfSource‟ and select the node PDF_SOURCE
from the context window.
17. For the property „templateSource‟ give the name of the adobe form „ZDDLB_DEMO_FORM in the
value tab . Double click on the adobe form name.
Enter the Interface name „ZDDLB_DEMO_INF ‟ and click on context button to create interface from
context node .
18. Select the node „ROOT_NODE‟ from the context window and press „Enter‟ .
21. The elements in form context can be seen in the Data view of the form Layout .
22. Drag and drop the „Enumerated Drop Down List‟ button from WebDynpro Native category under
Library palette.Drag and drop the „ZUSER‟ node on the list box. Don‟t Update any related Properties.
23. Drag and drop the „Submit‟ button from WebDynpro Native category under Library palette.
24. Select the event „click*‟ and language „JavaScript‟ .
25. Change the form layout type to „ZCI layout‟ in the properties tab of the form builder.
26. Insert the Webdynpro Script.
27. Drag and drop the „Text Box‟ from WebDynpro Native category under Library palette.
28. Bind the Text Box with the element „ZuserSelected‟.
DATA:
NODE_INFO TYPE REF TO IF_WD_CONTEXT_NODE_INFO,
it_dropdown TYPE WDR_CONTEXT_ATTR_VALUE_LIST,
WA type WDR_CONTEXT_ATTR_VALUE,
* wa_zpsfins02 type zpsfins02,
IT_ZPSCAT type STANDARD TABLE OF USER_ADDR ,
WA_ZPSCAT type USER_ADDR .
ENDLOOP.
NODE_INFO = lo_nd_root_node->GET_NODE_INFO( ).
endmethod.
35. Web Dynpro Application.Right click on the Web Dynpro component and select Create
38. Right click on the Web Dynpro application that we created and select „Test‟ .
39. Browser opens with the form. The Form Displays the Data fetched from the database.
This document explains how to upload images into custom tables and display the images in adobe form.
Select the radio button Interface enter the name of the interface starting with “Z” (here as creating as
Z_IF_TEST_CV)
Enter description and let the interface type be as it is. (Default interface type)
Save the interface and assign it a transport request.
Create table Import parameters as for employee photograph and data as it_photo
Save and activate the interface and come back on the main screen
Enter save assign to the transport request (here we have assigned it to local package)
The new screen will appear with 3 tab pages and 2 panes can be seen in context tab page.
The left hand pane is the interface and the right hand pane is the context of the adobe form. The interface
needs to be mapped with the context of the form. This can be done by drag and drop of the fields from
interface to context of the ADOBE form
Once the mapping is done click on the layout tab. In this tab you may design your ADOBE form layout.
Drag and drop the UI Element Image Field on the form master page table line.
Binding the Image Filed. The UI Element needs to be bind so that if can receive the image at run time.
For binding the fields select the UI Element
*&---------------------------------------------------------------------*
*& Report ZPHOTO_PRINT
*&---------------------------------------------------------------------*
REPORT ZPHOTO_PRINT.
ENDIF.
ELSE.
DATA: LR_MIME_REP TYPE REF TO IF_MR_API.
CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(
CHANGING
FILE_TABLE = LT_FILE " Table Holding Selected Files
RC = LV_RC ). " Return Code, Number of Files or -1 If Error Occurred
READ TABLE LT_FILE INTO LS_FILE INDEX 1.
IF SY-SUBRC = 0.
LV_FILENAME = LS_FILE-FILENAME.
ENDIF.
CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD(
EXPORTING
FILENAME = LV_FILENAME " Name of file
FILETYPE = 'BIN'
IMPORTING
FILELENGTH = LV_LENGTH " File length
CHANGING
DATA_TAB = LT_DATA " Transfer table for file contents
EXCEPTIONS
OTHERS = 19 ).
WA_ZTEST_PHOTO-PERNR = S_PERNR-low.
WA_ZTEST_PHOTO-PHOTO = LV_CONTENT.
if sy-subrc = 0.
MESSAGE 'Successfully Uploaded' TYPE 'I' DISPLAY LIKE 'S'.
ENDIF.
ENDIF.
Enter the Photo ID No.. and select radio button Photo upload and run..
A pop will ask to select a photo..
After saving the photo.. the image will store in Xstring format as below in the table.
To display the Photo select ID no.. and run..
The requirement is to add the table rows dynamically in the table. This document is dealt with how
to create dynamic table in interactive form using offline scenario.
Step3: Now again go to transaction SFP to create form. Provide the form name.
Click on Create button. A popup will appear where provide the interface name and meaningful description
of the form.
Drag the button from library on to body page below the table as shown.
Go to OBJECT palette of DATA and provide the min count is 3 (when we execute the form initially it
shows 3 default rows) as shown below.
Step7: Now click on „Insert‟ Button.
In the script editor, write the following code which generates the rows dynamically at run time.
In script editor:
data:
fs_venbank type zwd_mat,
it_mat type zwd_t_mat,
l_fm_name TYPE rs38l_fnam,
l_formname TYPE fpname VALUE 'ZOFFLINE_MAT_FORM',
fp_docparams TYPE sfpdocparams,
FP_FORMOUTPUT TYPE FPFORMOUTPUT,
fp_outputparams TYPE sfpoutputparams.
START-OF-SELECTION.
PERFORM get_function_module.
*&---------------------------------------------------------------------*
*& Form GET_FUNCTION_MODULE
*&---------------------------------------------------------------------*
form GET_FUNCTION_MODULE .
CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
i_name = l_formname
IMPORTING
e_funcname = l_fm_name.
* E_INTERFACE_TYPE =
* fp_outputparams-nodialog = 'X'.
* fp_outputparams-getpdf = 'X'.
fp_docparams-langu = 'X'.
fp_docparams-country = 'US'.
fp_docparams-fillable = 'X'.
fp_docparams-dynamic = 'X'.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN OTHERS.
ENDCASE. " CASE sy-subrc
ENDIF. " IF sy-subrc <> 0
Note: To add the rows dynamically in the form, we have to pass the value „X‟ to parameterDYNAMIC of
the structure /1BCDWB/DOCPARAMS.
Go to Transaction SFP->
Select Interface Radio Button & Enter the name to create New Interface.
(Eg:- zhide_field).
Go to Form Interface->import ->Parameters name -> Enter the import parameter (ie:- pernr)
Creating the Global Delivery which will passed filled in the form interface and passed to the Layout of
adobe form.
Go to Initialization->code Initialization.
Check
Select Form Radio Button & Enter the name to create New Form.
(Eg:- zhide_field).
Enter the Description & Interface name which we have created and press save button.
Press save.
Form Context is displayed as below.
Drag & drop the Global data form Interface to Context Level & Save the form.
Click on the Layout to design the layout.
Enter the below JavaScript in the editor & Select the language as JavaScript.
if(this.rawValue == null)
this.presence = "hidden";
Pre–requisite:
It is assumed that the reader of this article has basic knowledge in WebDynpro and adobe forms.
Requirement:
The Requirement is to generate a pop-up message dialog box, to the user while saving the adobe forms
without filling in the Mandatory fields.
Procedure:
The requirement cannot be achieved as adobe doesn‟t have such functionality, not to allow saving the
document without filling in the mandatory fields. We would be using Java Script to generate a Dialog box
custom message, and if the user clicks OK then the document would not be closed and if Cancel a Blank
copy of the document would be save.
10. Create a Input Filed on the Layout and Bind as shown below
11. Make the Field property as Required to make it Mandatory
12. In the same way create another field City and make it Optional.
13. Select any ONE of the Input Field (in our case its Vendor Name). Just above the Tool Bar of the
Adobe there is a space to write the Java Script or go to Palettes and Click Java Script. Show Box
Select preSave event which triggers when the Document is saved.
Write the Below Mentioned Java Script in the Editor.
function IsSpecified(oField)
{
return (oField.rawValue != null) && (oField.rawValue.length > 0);
}
var bCanSubmit = true;
var message = "Message: Entry for the below Mandatory Fields are Missing!
\n";
if (!IsSpecified(LFA1.P1.NAME1)) // The Field Node Name
{
message += "\n Vendor Name"; // \n = New Line
bCanSubmit = false;
}
if (!bCanSubmit)
{
var oDlg =
{
description:
{
name: "Test Dialog",
elements:
[
{
type: "cluster",
name: "---- ERROR MESSAGE ----",
elements:
[
{
name: "Some Mandatory Fields are Missing!",
type: "static_text",
},
{
name: "Please Click 'OK' and Save Again! By Filling the Mandatory
Fields",
type: "static_text",
},
{
name: "If 'CANCLE' is Clicked, a Blank Copy of the Form would be
Saved.",
type: "static_text",
},
{
type: "ok_cancel",
},
]
}
]
}
};
// Dialog Activation
if ("cancel" == app.execDialog(oDlg))
{
xfa.host.resetData(); // Reset The Form
}
}
18. If the mandatory field is missing a POP up would be generated with the below message as mentioned
in the Java Script.
19. If OK is selected then the form would be Open and user can fill in the mandatory fields. If Cancel is
selected then the Form would be refreshed and the enter data would be cleared in the saved form.
20. The same is also applicable for the Close Button as well.
A digital signature is a security mechanism for protecting digital data. The digital signature does
the same function for processing digital data as hand written signature does for the paper based
documents.
Step1: SFP is the transaction to create adobe form. Provide the interface name and click on create
button.
Provide the description and save it.
Activate the interface and come back to initial screen of form builder.
Step3: Drag and drop the system field date to context tab.
Sign icon (Marked as Yellow color) as shown in tool bar is in disable mode. After the signature has been
filled this icon becomes enable mode.
The following Add Digital ID screen will appear when click on Next button and fill the related
information.
Now click on finish button.
Click on signature field, you will get the pop up box as shown below.
If you want to check the signature properties then click on signature properties button.
If the signature is valid then you will get 'Signed and all signatures are valid' message appear at the top
of the window.
Here we can also change the field entries even after the signature field has been filled. When saving the
form after we modified the any of the field entries in the form, you will get the following message at the top
„Signed and all signatures are valid, but with unsigned changes after the last signature‟.
Click on signature panel at the top right side corner (Shown on above picture), there you can find the log
as shown below.
When you click on highlighted statement under Form Fields Filled In, it would show the modified value of
the field. And also you can check the value before modification in the Click to view this
version under signature details.
Provide the required information and press Next button as shown below.
We get the following screen. It asks for password. Provide the password and press finish button.
We get the following screen.
After providing the password only you can able to sign in. Suppose if you press the sign button without
giving password, it asks for password saying that „A password is required to use this digital ID‟.
Now press the sign button. The signature would be appeared in signature field.
In the above two cases, we can able to change the field entries after the signature field is filled in the
form. But, we can also have an option to avoid / restrict making changes to the content of the fields
(„Date‟ in this case) once the signature field is filled.
Now go to library tab-Web Dynpro native. Drag and drop the signature-sign and lock to layout editor.
Select ID Phani
Click on sign button.
Now the date field becomes locked. We can not modify the value. In this way we can lock the fields after
the signature has been done.
This document gives an idea about to validation of date and calculation of the number of days between
two dates using Java Script.
Step1: Go to transaction SFP, and create interface.
Drag and drop the parameters from interface to context tab as shown.
Step3: Go to layout, drag and drop the elements into layout editor.
Rename the variable name as 'checkDate' and write the following code in the script editor.
// Validation for the date(dd/MM/yyyy)
function isValidDate(DateVal)
{
//xfa.host.messageBox("Date Val : "+DateVal);
if(DateVal!=null)
{
var r = new RegExp();
r.compile("^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-
9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$","i");
isValidDate = r.test(DateVal);
}
if(!isValidDate)
{
//xfa.host.messageBox("Invalid Date! Please select the Date","Error in Date",0,0);
}
return isValidDate;
}
Step5: Select the days element in the Body Page and select the event VALIDATE to validate the From
Date and To Date fields and also logic for calculation of days.
var sdate = data.Body.SDATE.rawValue;
var edate = data.Body.EDATE.rawValue;
// If the both the dates are initial or space, assigning days field to ZERO
if((sdate==null)||(sdate=="")||(edate==null)||(edate==""))
{
data.Body.days.rawValue = "0";
}
// Validation of the From Date field
if((sdate!=null)||(sdate!=""))
{
var isFromDateValid = data.Body.variables.checkDate.isValidDate(sdate);
if(isFromDateValid == false)
{
data.Body.days.fontColor = "255,0,0";
xfa.host.setFocus("data.Body.days");
data.Body.days.rawValue = null;
xfa.host.messageBox("Invalid From Date! Please select valid From Date","Error in From Date",0,0);
}
else
{
data.Body.days.fontColor = "51,51,51";
}
}
if((sdate==null)||(sdate=="")||(edate==null)||(edate==""))
{
data.Body.days.rawValue = "0";
}
// Validation of the To Date field
if((edate!=null)||(edate!=""))
{
var isToDateValid = data.Body.variables.checkDate.isValidDate(edate);
if(isToDateValid == false)
{
data.Body.days.fontColor = "255,0,0";
xfa.host.setFocus("data.Body.days");
data.Body.days.rawValue = null;
xfa.host.messageBox("Invalid From Date! Please select valid To Date","Error in To Date",0,0);
}
else
{
data.Body.days.fontColor = "51,51,51";
}
}
// Validation if From date field more than To Date field
if(isFromDateValid == true && isToDateValid == true)
{
if(sdate>edate)
{
xfa.host.messageBox("'From Date'"+sdate+" is more than 'To Date'"+edate,"Dates Incompatibility",0,0);
data.Body.SDATE.fontColor = "255,0,0";
data.Body.EDATE.fontColor = "255,0,0";
data.Body.days.rawValue = null;
}
else
{
// Logic to calculation of days between given dates
var sdate1 = util.scand("yyyy-mm-dd", sdate);
var edate1 = util.scand("yyyy-mm-dd", edate);
for(var i=0;;)
{
var sDateT = sdate1.getTime();
var sDateD = sdate1.getDay();
var sDateN = sDateT+(24*60*60*1000);
if(sdate1>edate1)
{
break;
}
i = i+1;
sdate1 = new Date(sDateN);
}
data.Body.days.rawValue = i;
}
}
Step6: Execute the form. Pass the value 'X' to the IMPORT parameters DYNIMIC and FILLABLE.
The output would be
1) Go to transaction SFP and open any form in the testing client where you have the data.
3) We get a pop as shown below. Select Option 4 Very Detailed Trace from the drop down list and hit Enter.
4) Execute the transaction that you use to generate the print preview as usual and click on the Attachments
button as shown below:
5) Save the file XFD.xml in the attachments to a desired location on your desktop as shown below:
6) Now in the development client open the form and go to Layout tab of the Adobe form. From the Menu
click on Edit -> Form Properties.
7) Click on Default tab and browse for the XML file as shown:
8) Hit Enter and click on the Preview tab as shown and you‟ll have the layout preview with the data there
itself.
9) Now changes to the form layout can be checked immediately in the preview tab itself without activation.
In adobe form, for date field by default we get F4 help for selecting the date and also we can enter the
date manually too. When we are doing interactive adobe forms, usually we get problem with date fields
such as we can enter any garbage value manually in date field or we can enter any date format. We
cannot restrict not to enter the date manually. So we need to validate the date field with particularly in one
specific format. This document gives an idea about this.
When you execute the form, initially date will be appeared as shown below.
We can define our own format other than standard SAP provides. Suppose If you want to display the date
in YYYY.MM.DD format, then you have to follow the below procedure.
A. Check whether the date format YYYY.MM.DD is already exists. For that, check the Display Pattern in
Field tab of Object palettes as shown. This displays what are the available formats.
We want to display the date format as YYYY.MM.DD which is not already exists as shown above. In
this case we need to define this date format.
B. Now go to Edit Pattern in Field table of Object palette and write the date format YYYY.MM.DD as
shown below.
Still you can enter the date in different formats or else we can give some garbage in date field as shown.
For that we need to validate the date field. Follow the below process to validate the date.
Now go to Value tab of Object palette as shown. In the value tab, we have Validation Pattern, there select
the date format.
If we want to give specific message other than standard message, go to value tab of Object and select
the check box validation pattern message. There provide the custom text to be displayed.