"dynamic" get_block_property
Hi everybody,
I have a problem with a "dynamic" get_block_property.
The code is like that:
Declare
v_property varchar2(100) := 'INSERT_ALLOWED';
V_block varchar2(100) := 'BLOCK';
v_dummy varchar2(100);
Begin
v_dummy := get_block_property(v_block, v_property);
End;
This line returns an error "Numeric or value error" and I know this is because the property variable has to be a number value but I don't know if it does exist any conversion function or something like that.
Can anyone help me please?
PD: I work with Oracle Forms 6i.
Edited by: user12087557 on 08-jun-2010 15:54
Hi,
So you have to write IF condition like,
DECLARE
v_property VARCHAR2(100) := 'INSERT_ALLOWED';
V_block VARCHAR2(100) := 'BLOCK';
v_dummy VARCHAR2(100);
BEGIN
IF v_property = 'INSERT_ALLOWED' THEN
v_dummy := GET_BLOCK_PROPERTY(v_block, INSERT_ALLOWED);
ELSIF v_property = 'UPDATE_ALLOWED' THEN
v_dummy := GET_BLOCK_PROPERTY(v_block, UPDATE_ALLOWED);
ELSIF v_property = 'DELETE_ALLOWED' THEN
v_dummy := GET_BLOCK_PROPERTY(v_block, DELETE_ALLOWED);
END IF;
END;Regards,
Manu.
Similar Messages
-
Dynamically Changing Labels for Multi Row Block Buttons
Forms [32 Bit] Version 9.0.4.1.0 (Production)
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
On my local: Windows 7 OS
I am having a difficult time in doing the following in forms, and not sure if it can be done?
I have a multi row block,based on DB table, which displays filename and another column from the table.
It also has a push button on each row, which opens and displays the physical file from its source, when clicked. The filename thus can have 3 diff statuses depending on its sources and accordingly corresponding button should display appropriate label:
a) View Image (its is in content server and successfully imaged. In this case I display the file in the browser, from the content server, when the button is clicked)
b) View File (Display the file from file system)
c) View Error (Display imaging error message from the table, as file failed to make it to the imaging server)
I have this logic currently coded in the post query trigger, at the block level, and tried using set_item_property(button_id, label, <button_lable>), where I programmatically set the button lable, based on the file status (imaged, not imaged or has error) in that row. This wroks well, only if all the files in the multi row block have the same status. If each of them have diff statuses, then only last processed files's status gets reflected into the button label. For eg: The file in the first row of the block is imaged, and one in the second row has an imaging error. The button label for the first row should say 'View Image' and button for the second row should say 'View Error'. But now buttons for both the rows display 'View Error', as thats what got processed last!
I __can not use set_item_instance property for 'label'__ (which lets us dynamically change the label on the push buttons).
Is there any way to do this for ORacle forms? I am now playing with having 3 diff button items in that block, laying them on top of each other and showing only those that are appropriate and hiding the others... But I am not sure it is going to give me what I need? I think I am going to end up facing the same issues as in above case!!
Any expert advice is highly appreciated.
Thanks in advance for your time:
Libran_Girl
Edited by: libran on Aug 30, 2011 8:04 AM
Edited by: libran on Aug 30, 2011 8:05 AM<p>I have just updated this existing PJC, that was originally constructed to handle Text Fields. You can, now, also handle buttons with it.
Set the Button's Implementation Class property to : oracle.forms.fd.MultiButton.
</p>
This is the code you have to put one triggers of your based block:
When-New-Record-Instance trigger: (based on the EMP table)
declare
LN$Pos pls_integer ;
LN$Rec pls_integer := Get_Block_Property('EMP', CURRENT_RECORD) ;
LN$Max pls_integer := Get_Block_Property('EMP', RECORDS_DISPLAYED) ;
LC$C Varchar2(15) ;
Begin
LN$Pos := LN$Rec - (trunc(LN$Rec/LN$Max) * LN$Max) ;
If LN$Pos = 0 Then LN$Pos := LN$Max ; End if ;
If LN$Pos > 0 Then
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_LOG', 'true' );
-- Add the new item --
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_NEW_REC', to_char(LN$Rec) );
-- Set some properties --
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_LABEL', to_char(LN$Rec) || ',' || :EMP.ENAME );
If :EMP.JOB = 'MANAGER' Then
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_FONT', to_char(LN$Rec) || ',Arial,bold,14' );
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_FGCOLOR', to_char(LN$Rec) || ',0,0,255' );
End if ;
If :GLOBAL.I > 250 Then :GLOBAL.I := 5 ;
Else :GLOBAL.I := :GLOBAL.I + 5 ;
End if ;
LC$C := To_Char(LN$Rec) || ','
|| To_Char(255) || ','
|| To_Char(255-:GLOBAL.I) || ','
|| To_Char(255-:GLOBAL.I) ;
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_BGCOLOR', LC$C );
Synchronize;
End if ;
end;When-Create-Record trigger:
declare
LN$N pls_integer ;
LN$Rec pls_integer := :system.cursor_record ;
LC$C Varchar2(15) ;
Begin
if get_block_property('EMP',TOP_RECORD) > 1 Then
LN$n := :system.cursor_record - get_block_property('EMP',TOP_RECORD) + 1 ;
else
LN$N := :system.cursor_record ;
end if;
If LN$N > 0 Then
Set_Custom_Property('EMP.BT', LN$n, 'SET_LOG', 'true' );
-- Add the new item --
Set_Custom_Property('EMP.BT', LN$n, 'SET_NEW_REC', to_char(LN$Rec) );
End if ;
end;Post-Query trigger:
declare
LN$Pos pls_integer ;
LN$Rec pls_integer := Get_Block_Property('EMP', CURRENT_RECORD) ;
LN$Max pls_integer := Get_Block_Property('EMP', RECORDS_DISPLAYED) ;
LC$C Varchar2(15) ;
Begin
LN$Pos := LN$Rec - (trunc(LN$Rec/LN$Max) * LN$Max) ;
If LN$Pos = 0 Then LN$Pos := LN$Max ; End if ;
If LN$Pos > 0 Then
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_LOG', 'true' );
-- Add the new item --
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_NEW_REC', to_char(LN$Rec) );
-- Set some properties --
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_LABEL', to_char(LN$Rec) || ',' || :EMP.ENAME );
If :EMP.JOB = 'MANAGER' Then
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_FONT', to_char(LN$Rec) || ',Arial,bold,14' );
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_FGCOLOR', to_char(LN$Rec) || ',0,0,255' );
End if ;
If :GLOBAL.I > 250 Then :GLOBAL.I := 5 ;
Else :GLOBAL.I := :GLOBAL.I + 5 ;
End if ;
LC$C := To_Char(LN$Rec) || ','
|| To_Char(255) || ','
|| To_Char(255-:GLOBAL.I) || ','
|| To_Char(255-:GLOBAL.I) ;
Set_Custom_Property('EMP.BT', LN$Pos, 'SET_BGCOLOR', LC$C );
Synchronize;
End if ;
end;Don't forget to copy the multirecord.jar file in your /forms/java folder, then add it to the archive and archive_jini tags of your /forms/server/formsweb.cfg file.
Enjoy it,
Francois -
Problem in getting dynamic LOV
hi i am trying to acheive dynamic LOV.
i followed the steps
1.created a static record group
2.created a LOV and assigned with the above created static record group.
3.in w-n-b-i trying to create the DRG
DECLARE
rg_id RECORDGROUP;
grp_col GROUPCOLUMN;
rg_name VARCHAR2(25) := 'RG_NAME';
col_name VARCHAR2(25) := 'TYPE';
lov_id LOV;
BEGIN
/* Check if the RG already exists */
rg_id := Find_Group(rg_name);
IF ( NOT Id_Null(rg_id) ) THEN
Delete_Group(rg_id);
END IF;
/* Create instance of DRG */
rg_id := Create_Group(rg_name);
grp_col := Add_Group_Column(rg_id, col_name, CHAR_COLUMN, 8);
/* Assign the DRG to the LOV */
lov_id := Find_Lov('TYPE_LOV');
Set_Lov_Property(lov_id, GROUP_NAME, rg_name);
END;4.in w-v-i of type
DECLARE
rg_id RECORDGROUP;
grp_col GROUPCOLUMN;
tmp_gc GROUPCOLUMN;
rg_name VARCHAR2(25) := 'RG_TYPE';
col_name VARCHAR2(25) := rg_name||'.'||'TYPE';
n_dummy1 NUMBER;
n_dummy2 NUMBER;
curr_rec INTEGER;
err_code NUMBER;
BEGIN
curr_rec := Get_Block_Property(Name_In('SYSTEM.TRIGGER_BLOCK'), CURRENT_RECORD);
rg_id := Find_Group(rg_name);
grp_col := Find_Column(col_name);
/* Add the value to the DRG */
-- Add row first./*
Add_Group_Row(rg_id, END_OF_GROUP);
-- Now add the value.
Set_Group_Number_Cell(grp_col, curr_rec, To_Number(:BMM_DESC));
/* Verify the value was added */
n_dummy1 := Get_Group_Row_Count(rg_name);
tmp_gc := Find_Column(col_name);
FOR j IN 1..n_dummy1 LOOP
n_dummy2 := Get_Group_Number_Cell(tmp_gc, j);
IF ( nvl(n_dummy2, 9999999999) = 9999999999 ) THEN
Clear_Message;
Message('Add Failed');
Message('Add Failed');
ELSE
err_code := Populate_Group(rg_id);
Clear_Message;
Message('Add Successful');
END IF;
END LOOP;
MESSAGE('FIRING');MESSAGE('FIRING');
END;the problem is the lov is not appearing at all(previously the lov was appearing along with the static value assigned)
when i tried to add value to the item(type), i am getting the following error:
FRM-40735 WHEN-VALIDATE-ITEM trigger raised unhandled exception ora-06502
i am getting pop up message-error in adding group row
i have not done this before. in the help of some contents which is present in the fourm, i have tried it.
where i am missing?
Please helpthere seems to be problem with the item type, varchar2 or numeric whatever. check that.
-
Dynamic selection of records based on checkbox checked
Hello,
I want to select a list of records from a multirecord block by
using the checkbox checked values as the criterion and use the
records selected in the where clause for querying in another
forms. The data from the multirecord block is from a query
result and hence is dynamic.
I went about doing this:
I created a multirecord block. In the multirecord block, I
created a checkbox which was a non-database item.
In the when_button_pressed trigger I wrote the following code:
declare
temp varchar2(1000);
start_rec number;
stop_rec number;
item_id item;
block_id block;
item_value varchar2(1000);
pl_id paramlist;
item_name varchar2(10);
patient_list varchar2(1000);
begin
go_block('patient_list');
block_id:=find_block('patient_list');
start_rec:=1;
stop_rec:=get_block_property(block_id,query_hits);
for i in start_rec..stop_rec loop
if :selection='Y' then --selection is the checkbox
if item_value is null then
/*item_value holds the value of the data shown in the forms &
for which the checkbox is checked*/
item_value:=name_in(':patient_list.patient_id');
/*patient_id is the item name as well as field name in the
table*/
else
item_value:=item_value||','||name_in(':patient_list.patient_id');
end if;
end if;
end loop;
patient_list:='('||item_value||')';
pl_id:=create_parameter_list('list_of_patients');
add_parameter(pl_id,'querypatients',text_parameter,patient_list);
message(patientlist);
run_product
(forms,'patient_history',synchronous,runtime,filesystem,pl_id,nul
l);
end;
When I run this form, patient_list comes as
(111,111,111,111,111,111,111) where
111 is the value of the patient_id.
The only value that gets into the patient_list is the patient_id
for the last checkbox I have
checked in the forms and the same patient_id appears so many
times.
Can anyone tell me where I am doing the mistake? Why is the same
value appearing so many times and only the last record selected
appears in the patient_list.
Thank you for your suggestions.Thank You.
I added go_record(start_rec) and next_record and everything
worked fine.
Here I have the working code:
declare
temp varchar2(1000);
start_rec number;
stop_rec number;
item_id item;
block_id block;
item_value varchar2(1000);
pl_id paramlist;
item_name varchar2(10);
patient_list varchar2(1000);
begin
go_block('patient_list');
block_id:=find_block('patient_list');
start_rec:=1;
stop_rec:=get_block_property(block_id,query_hits);
go_record(start_rec);-- I added it
for i in start_rec..stop_rec loop
if :selection='Y' then --selection is the checkbox in
the patient_list block.
if item_value is null then
-- item_value holds the value of the data shown in the forms and
for which the checkbox is checked
item_value:=name_in(':patient_list.patient_id');
-- patient_id is the item name as well as field name in the table
else
item_value:=item_value||','||name_in
(':patient_list.patient_id');
end if;
end if;
next_record;-- I added it
end loop;
patient_list:='('||item_value||')';
pl_id:=create_parameter_list('list_of_patients');
add_parameter(pl_id,'querypatients',text_parameter,patient_list);
message(patientlist);
run_product
(forms,'patient_history',synchronous,runtime,filesystem,pl_id,nul
l);
end; -
Dynamic visual attributes/multi-row blocks
We're using Headstart, Des2k V6.0.3.8. If you set preference CURREC = multi record block, you get the current record visual attribute (cg$current_record) attached to all displayed items in multi-row blocks. From the Headstart object library, these items also inherit a visual attribute of qms$item_font.
At runtime, Headstart code is invoked from the block's post-query trigger - this code dynamically assigns a readonly visual attribute to all items that are insert only, or the qms$item_font va to items that are update only. (Incidentally, it seems a bit strange that no va is assigned to items that are neither insertable nor updateable).
Assigning the va in this way seems to override the current record va for these items, which looks a little strange at runtime. I would prefer to see the current record va overriding the readonly/item_font va. In a future Headstart release, it would be nice if this functionality was configurable, but in the meantime can you suggest the easiest way of making this change to the Headstart code? I think it will be necessary to specifically set the va to stnd/readonly/current record in the when-new-record-instance trigger, & reset it on the post-record trigger. Once va's are being set dynamically, the current record attribute is pretty useless in multi-row blocks.
Incidentally - we've also changed the behaviour of va's in query mode processing. We wanted the query mode va to override the current record va; qms$record.highlight_items wasn't setting the selected va unless items have a current record attribute of DEFAULT. We wanted query mode to look the same regardless how many rows are in the block; it also looked a little odd in a multi-row block with overflow items, where the overflow items were being highlighted but the rest of the block wasn't. It would be nice if this was also a configurable option.Cheryl,
Good point! It does look a bit odd. I'll take this into consideration for HSD6i.
To customize your app, try the following.
Copy qms$event_data_block from qmsevh50.pll to your application library.
Copy procedure set_nav_items_exg_record from the qms$record package in qmslib50.pll to your application library -AND GIVE IT A NEW NAME- like set_nav_items_custom.
Change your copy of qms$event_data_block to call this new procedure in the post-query event.
Modify set_nav_items_custom as follows.
============================================
procedure set_nav_items_custom
( p_block in varchar2
, p_recno in number default current_record
is
l_rg_id recordgroup;
l_rgc1_id groupcolumn;
l_rgc2_id groupcolumn;
rg_rows number;
l_item_flag varchar2(1);
l_item_name varchar2(100);
l_first_io_item varchar2(100);
begin
qms$block.init_block_rg
( p_block,false,l_rg_id,l_rgc1_id,
l_rgc2_id, rg_rows);
if id_null(l_rg_id)
then
-- no insert-only or update only items
-- in block
return;
end if;
for j in 1..rg_rows loop
l_item_name := get_group_char_cell
(l_rgc1_id, j );
l_item_flag := get_group_char_cell
(l_rgc2_id, j );
if l_item_flag = 'I'
then
if l_first_io_item is null
then
l_first_io_item := l_item_name;
end if;
-- Item is insert-only, update not
-- allowed
-- Change background color to
-- read-only.
set_item_instance_property
( l_item_name,p_recno,navigable
, property_false);
/* customization */
if get_item_property(l_item_name
, current_record_attribute) is null
or p_recno <> :system.cursor_record
then
/* end customization */
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,qms$user_prefs.get_va_readonly_item);
/* customization */
end if;
/* end customization */
else
-- Item is update-only, insert not
-- allowed */
set_item_instance_property
(l_item_name,p_recno
,navigable,property_true);
/* customization */
if get_item_property(l_item_name
,current_record_attribute) is null
or p_recno <> :system.cursor_record
then
/* end customization */
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,qms$config.get_stnd_font);
/* customization */
end if;
/* end customization */
end if;
end loop;
-- 18-1-1999: If block only contains no
-- updatebale items, there are navigable
-- items left.
-- If this is the case make first
-- insert-only item navigable again.
if get_block_property(p_block,enterable) =
'FALSE'
then
if l_first_io_item is not null
then
set_item_instance_property
(l_first_io_item,p_recno
,navigable,property_true);
end if;
end if;
exception
when form_trigger_failure then raise;
when others then
qms$errors.unhandled_exception
('qms$block.set_mav_items_custom');
end set_nav_items_custom;
============================================
Next, as you suggested, add WHEN-NEW-RECORD-INSTANCE and POST-RECORD triggers to handle movement from one record to the next.
WHEN-NEW-RECORD-INSTANCE
============================================
procedure set_nav_items_wnri
( p_block in varchar2
, p_recno in number default current_record
is
l_rg_id recordgroup;
l_rgc1_id groupcolumn;
l_rgc2_id groupcolumn;
rg_rows number;
l_item_flag varchar2(1);
l_item_name varchar2(100);
begin
qms$block.init_block_rg
( p_block,false,l_rg_id,l_rgc1_id,
l_rgc2_id, rg_rows);
if id_null(l_rg_id)
then
-- no insert-only or update only items
-- in block
return;
end if;
for j in 1..rg_rows loop
l_item_name := get_group_char_cell
(l_rgc1_id, j );
l_item_flag := get_group_char_cell
(l_rgc2_id, j );
if l_item_flag = 'I'
then
-- Item is insert-only, update not
-- allowed
-- Change background color to
-- read-only.
if get_item_property(l_item_name
, current_record_attribute) is null
or p_recno <> :system.cursor_record
then
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,qms$user_prefs.get_va_readonly_item);
else
set_item_instance_property
(l_item_name,p_recn o
,visual_attribute
,get_item_property(l_item_name
, current_record_attribute));
end if;
else
-- Item is update-only, insert not
-- allowed */
if get_item_property(l_item_name
,current_record_attribute) is null
or p_recno <> :system.cursor_record
then
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,qms$config.get_stnd_font);
else
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,get_item_property(l_item_name
, current_record_attribute));
end if;
end if;
end loop;
exception
when form_trigger_failure then raise;
when others then
qms$errors.unhandled_exception
('qms$block.set_mav_items_wnri');
end set_nav_items_wnri;
============================================
For the POST-RECORD trigger, you will have to modify your object library since this trigger is not included by default. Add the trigger to the object library CGSO$BLOCK_MR.
Then add the POST-RECORD event to your copy of qms$event_data_block.
Finally, add a procedure for the POST-RECORD trigger.
============================================
procedure set_nav_items_pr
(p_block in varchar2
,p_recno in number default current_record
is
l_rg_id recordgroup;
l_rgc1_id groupcolumn;
l_rgc2_id groupcolumn;
rg_rows number;
l_item_flag varchar2(1);
l_item_name varchar2(100);
l_first_io_item varchar2(100);
begin
qms$block.init_block_rg
( p_block,false,l_rg_id,l_rgc1_id,
l_rgc2_id, rg_rows);
if id_null(l_rg_id)
then
-- no insert-only or update only items
-- in block
return;
end if;
for j in 1..rg_rows loop
l_item_name := get_group_char_cell
(l_rgc1_id, j );
l_item_flag := get_group_char_cell
(l_rgc2_id, j );
if l_item_flag = 'I'
then
-- Item is insert-only, update not
-- allowed
-- Change background color to
-- read-only.
if l_item_flag = 'I'
then
-- Item is insert-only, update not
-- allowed
-- Change background color to
-- read-only.
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,qms$user_prefs.get_va_readonly_item);
else
-- Item is update-only, insert not
-- allowed
set_item_instance_property
(l_item_name,p_recno
,visual_attribute
,qms$config.get_stnd_font);
end if;
end loop;
exception
when form_trigger_failure then raise;
when others then
qms$errors.unhandled_exception
('qms$block.set_mav_items_pr');
end set_nav_items_pr;
============================================
Regards,
Lauri -
Unable to capture data in an editable dynamic ALV.
Hi ,
I have created a dynamic editable ALV whose displayed structure can be changed at runtime based on the selection in a drop down list value selector.
Im trying to capture the values entered in the ALV into an internal table before the user changes the structure of the ALV to a different structure.
In the ON_SELECT event handler of the drop down list box , im rasing a data_check event to capture the ALV data.
The problem is that the control is not entering the event handler for the data_check event.
If i raise the data_check event in my save event handler or any other event handler , it works fine.
Can someone please suggest a solution.
Regards,
Newton.Hi ,
I have figured out that the problem is local to my machine , because the code works fine on other machines.
I guess my internet explorer has some bug.
Regards,
Newton. -
Dynamic mandatory field error message is not getting displayed in webui
Hi,
In Appointment if the importance is HIGH i made Location as mandatory.For this i enhanced BT126H_APPT/ApptDetails. In the get_p_location() method of BTACTIVITYYH i have written the code.
Now the problem is Error message for this dynamic mandatory field is not getting displayed in webui.
I debugged in DO_FINISH_INPUT error message is getting generated but it is not getting displayed in ui.
Can anybody tell where the problem is?
Thanks,
Hari.Hi Hari,
Really sorry do not know how to convert this nug file to text
How ever quick solution for your problem would be just keep your validation in 'DO_VALIDATE_INPUT' method of the view controller.
Means even if the User clicks on SAVE , Since it fails here , it would not allow you to go further.
Thanks,
Rajesh P -
If table testrh2 has the following columns and data
col1 --> NULL
col2 --> 2
and table testrh has the following columsn and data
col1 --> NULL
How could I write a dynamic SQL statement to join on the nulls? I've written the following block as a starting point.
declare
cursor c1 is select col1 from isis.testrh;
lval varchar2(1000);
lval2 varchar2(1000);
begin
for r1 in c1 loop
lval := 'select col2 from isis.testrh2 where col1 = '||r1.col1;
execute immediate lval into lval2;
dbms_output.put_line(lval2);
end loop;
end;You can't compare null values with '=' in Oracle SQL.
Null can only be compared with <column> is null .
You can see it when you try these two queries:
select * from dual where null is null; -- you will see one row
select * from dual where null=null; -- you will see no rowsThat's why you have to write something like
(<column1>=<column1> or (<column1> is null and <column2> is null))This should also work with null:
decode(<column1>,<column2>,1,0)=1By the way, why do you use dynamic sql?
lval := 'select col2 from isis.testrh2 where col1 = '||r1.col1;
I think you could replace your two lines ( lval:= ... AND execute immediate) by this:
begin
select col2
into lval
from isis.testrh2
where decode(col1,r1.col1,1,0)=1;
dbms_output.put_line('lval='||lval);
exception
when no_data_found then
dbms_output.put_line('no data found'); -- or whatever you want
end;Edited by: hartmutm on 02.10.2010 23:54 -
Dynamic CRM 2013 Online how to execute Report, generate PDF and email
Dear All,
I am using Dynamic CRM 2013 online. For quote, I have workflow and Dialogue processes for review process. On approval, I want the system to generate a PDF of quote report, attach the PDF and email it to the Customer.
Better I would like, When approver, clicks on the approve button, the system should auto generate a PDF of quote report, attach the PDF and email it to the Customer, without any further input from the user. If its not possible, I may have to put button on
quote form.
I am using the attached code, but facing various issues.
1. Under prepare the SOAP Message coding part, I am not sure what should be the below URL for CRM 2013 Online?
xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
2. What should be the emailid here? Is it Recepient Contact id(Guid) ?
var emailid = resultXml.selectSingleNode("//CreateResult").nodeTypedValue;
alert("emailid" + emailid.toString());
3. Using this code, not able to create Entity for "ActivityMimeAttachment", I am getting newEntity as undefined.
Below is the code I am using. Please check and help me out, where I am going wrong. Let me know if any better way to implement it. At present, I have put one button on quote form, on click event, below code will get executed.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var Xrm;
if (window.opener) { Xrm = window.opener.Xrm; }
else if (window.parent) { Xrm = window.parent.Xrm; }
function getReportingSession() {
var reportName = "Quotation_Report"; //set this to the report you are trying to download
var reportId = "7C39D18F-1DC6-E311-8986-D89D6765B238"; //set this to the guid of the report you are trying to download
var recordid = Xrm.Page.data.entity.getId();
// recordid = recordid.substring(1, 37); //getting rid of curly brackets
alert(recordid);
var pth = Xrm.Page.context.getServerUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
var retrieveEntityReq = new XMLHttpRequest();
retrieveEntityReq.open("POST", pth, false);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
retrieveEntityReq.send("id=%7B" + reportId + "%7D&uniquename=" + Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false");
var x = retrieveEntityReq.responseText.indexOf("ReportSession=");
var ret = new Array();
ret[0] = retrieveEntityReq.responseText.substr(x + 14, retrieveEntityReq.responseText.indexOf("&", x) - x - 14); //the session id
x = retrieveEntityReq.responseText.indexOf("ControlID=");
ret[1] = retrieveEntityReq.responseText.substr(x + 10, retrieveEntityReq.responseText.indexOf("&", x) - x - 10); //the control id
return ret;
function createEntity(ent, entName, upd) {
var jsonEntity = JSON.stringify(ent);
var createEntityReq = new XMLHttpRequest();
var ODataPath = Xrm.Page.context.getServerUrl() + "XRMServices/2011/OrganizationData.svc";
createEntityReq.open("POST", ODataPath + "/" + entName + "Set" + upd, false);
createEntityReq.setRequestHeader("Accept", "application/json");
createEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
createEntityReq.send(jsonEntity);
var newEntity = JSON.parse(createEntityReq.responseText).d;
alert("new entity" + newEntity);
return newEntity;
function createAttachment() {
var params = getReportingSession();
var recordid = Xrm.Page.data.entity.getId();
alert("recordid " + recordid);
var orgName = Xrm.Page.context.getOrgUniqueName();
var userID = Xrm.Page.context.getUserId();
//create email record
// Prepare the SOAP message.
var xml = "<?xml version='1.0' encoding='utf-8'?>" +"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'" +
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
" xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
"<soap:Header>" +
"</soap:Header>" +
"<soap:Body>" +
"<Create xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
"<entity xsi:type='email'>" +
"<regardingobjectid type='quote'>" + recordid + "</regardingobjectid>" +
"<subject>" + "Email with Attachment4" + "</subject>" +
"</entity>" +
"</Create>" +
"</soap:Body>" +
"</soap:Envelope>";
// Prepare the xmlHttpObject and send the request.
var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Create");
xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xHReq.setRequestHeader("Content-Length", xml.length);
xHReq.send(xml);
// Capture the result
var resultXml = xHReq.responseXML;
// alert("resultXml " + resultXml);
// Check for errors.
var errorCount = resultXml.selectNodes('//error').length;
if (errorCount != 0) {
alert("ERROR");
var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
alert(msg);
var emailid = resultXml.selectSingleNode("//CreateResult").nodeTypedValue;
alert("emailid" + emailid.toString());
//var emailid = userID;
var post = Object();
post.Body = encodePdf(params);
var email = new Array();
email[0] =new Object();
email[0].id = emailid;
email[0].entityType ='email';
post.Subject ="File Attachment";
post.AttachmentNumber = 1;
post.FileName ="Report.pdf";
post.MimeType ="application/pdf";
post.ObjectId = Object();
post.ObjectId.LogicalName ="email";
post.ObjectId.Id = email[0].id;
post.ObjectTypeCode ="email";
alert(post.ObjectId.Id);
createEntity(post,"ActivityMimeAttachment", "");
alert("created successfully");
email.Subject = "Your Order";
//Set The current order as the Regarding object
email.RegardingObjectId = {
Id: Xrm.Page.data.entity.getId(), //Get the current entity Id , here OrderId
LogicalName: Xrm.Page.data.entity.getEntityName()//Get the current entity name, here it will be “salesOrder”
//Create Email Activity
SDK.JScriptRESTDataOperations.Create(email, "Email", EmailCallBack, function (error) { alert(error.message); });
// Email Call Back function
function EmailCallBack(result) {
email = result; // Set the email to result to use it later in email attachment for retrieving activity Id
var activityPartyFrom = new Object();
// Set the From party of the ActivityParty to relate an entity with Email From field
activityPartyFrom.PartyId = {
Id: customerId, // id of entity you want to associate this activity with.
LogicalName: "contact"
// Set the "activity" of the ActivityParty
activityPartyFrom.ActivityId = {
Id: result.ActivityId,
LogicalName: "email"
// Now set the participation type that describes the role of the party on the activity).
activityPartyFrom.ParticipationTypeMask = { Value: 2 }; // 2 means ToRecipients
// Create the from ActivityParty for the email
SDK.JScriptRESTDataOperations.Create(activityPartyFrom, "ActivityParty", ActivityPartyFromCallBack, function (error) { alert(error.message); });
var activityPartyTo = new Object();
// Set the From party of the ActivityParty to relate an entity with Email From field
activityPartyTo.PartyId = {
Id: ownerId, // id of entity you want to associate this activity with.
LogicalName: "systemuser"
// Set the "activity" of the ActivityParty
activityPartyTo.ActivityId = {
Id: result.ActivityId,
LogicalName: "email"
// Now set the participation type that describes the role of the party on the activity). activityPartyTo.ParticipationTypeMask = { Value: 1 }; // 1 means Sender
// Create the from ActivityParty
SDK.JScriptRESTDataOperations.Create(activityPartyTo, "ActivityParty", ActivityPartyToCallBack, function (error) { alert(error.message); });
//ActivityParty From Callback
function ActivityPartyFromCallBack(result) {
//ActivityParty To Callback
function ActivityPartyToCallBack(result) {
var StringMaker = function () {
this.parts = [];
this.length = 0;
this.append = function (s) {
this.parts.push(s);
this.length += s.length;
this.prepend = function (s) {
this.parts.unshift(s);
this.length += s.length;
this.toString = function () {
return this.parts.join('');
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encode64(input) {
var output = new StringMaker();
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
while (i < input.length) {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
else if (isNaN(chr3)) {
enc4 = 64;
output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
return output.toString();
var bdy = new Array();
var bdyLen = 0;
function concat2Bdy(x) {
bdy[bdyLen] = x;
bdyLen++;
function encodePdf(params) {
bdy = new Array();
bdyLen = 0;
var retrieveEntityReq = new XMLHttpRequest();
var pth = Xrm.Page.context.getServerUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + params[0] + "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + params[1] + "&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
retrieveEntityReq.open("GET", pth, false);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.send();
BinaryToArray(retrieveEntityReq.responseBody);
return encode64(bdy);
</SCRIPT>
<SCRIPT type=text/vbscript>
Function BinaryToArray(Binary)
Dim i
ReDim byteArray(LenB(Binary))
For i = 1 To LenB(Binary)
byteArray(i-1) = AscB(MidB(Binary, i, 1))
concat2Bdy(AscB(MidB(Binary, i, 1)))
Next
BinaryToArray = byteArray
End Function
</SCRIPT>
</head>
<body>
<input type="button" onclick="createAttachment();" value="Attach Report" />
</body>
</html>
Thanks. and waiting for your valuable comments.
- MittalHello,
Yes, I was able to make my code working as below. Tested on CRM online 2013.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
if (typeof (SDK) == "undefined")
{ SDK = { __namespace: true }; }
SDK.JScriptRESTDataOperations = {
_context: function () {
if (typeof GetGlobalContext != "undefined")
{ return GetGlobalContext(); }
else {
if (typeof Xrm != "undefined") {
return Xrm.Page.context;
else { return new Error("Context is not available."); }
_getServerUrl: function () {
var serverUrl = this._context().getServerUrl()
if (serverUrl.match(/\/$/)) {
serverUrl = serverUrl.substring(0, serverUrl.length - 1);
return serverUrl;
_ODataPath: function () {
return this._getServerUrl() + "/XRMServices/2011/OrganizationData.svc/";
_errorHandler: function (req) {
return new Error("Error : " +
req.status + ": " +
req.statusText + ": " +
JSON.parse(req.responseText).error.message.value);
_dateReviver: function (key, value) {
var a;
if (typeof value === 'string') {
a = /Date\(([-+]?\d+)\)/.exec(value);
if (a) {
return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));
return value;
Create: function (object, type, successCallback, errorCallback) {
var req = new XMLHttpRequest();
req.open("POST", this._ODataPath() + type + "Set", true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
if (this.status == 201) {
successCallback(JSON.parse(this.responseText, SDK.JScriptRESTDataOperations._dateReviver).d);
else {
errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
req.send(JSON.stringify(object));
Retrieve: function (id, type, successCallback, errorCallback) {
var req = new XMLHttpRequest();
req.open("GET", this._ODataPath() + type + "Set(guid'" + id + "')", true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
if (this.status == 200) {
successCallback(JSON.parse(this.responseText, SDK.JScriptRESTDataOperations._dateReviver).d);
else {
errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
req.send();
Update: function (id, object, type, successCallback, errorCallback) {
var req = new XMLHttpRequest();
req.open("POST", this._ODataPath() + type + "Set(guid'" + id + "')", true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("X-HTTP-Method", "MERGE");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
if (this.status == 204 || this.status == 1223) {
successCallback();
else {
errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
req.send(JSON.stringify(object));
Delete: function (id, type, successCallback, errorCallback) {
var req = new XMLHttpRequest();
req.open("POST", this._ODataPath() + type + "Set(guid'" + id + "')", true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("X-HTTP-Method", "DELETE");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
if (this.status == 204 || this.status == 1223) {
successCallback();
else {
errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
req.send();
RetrieveMultiple: function (type, filter, successCallback, errorCallback) {
if (filter != null) {
filter = "?" + filter;
else { filter = ""; }
var req = new XMLHttpRequest();
req.open("GET", this._ODataPath() + type + "Set" + filter, true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState == 4 /* complete */) {
if (this.status == 200) {
successCallback(JSON.parse(this.responseText, SDK.JScriptRESTDataOperations._dateReviver).d.results);
else {
errorCallback(SDK.JScriptRESTDataOperations._errorHandler(this));
req.send();
__namespace: true
</script>
<script type="text/javascript">
//Create Email and link it with Order as Regarding field
var Xrm;
var email = new Object();
var ownerID = "";
var CustomerId = "";
if (window.opener) { Xrm = window.opener.Xrm; }
else if (window.parent) { Xrm = window.parent.Xrm; }
//Get ownerid who send email of quotation to customer
function GetOwnerID() {
var owner = Xrm.Page.getAttribute("ownerid").getValue();
ownerID = owner[0].id;
var ownerName = owner[0].name;
var entityType = owner[0].entityType;
GetToEmailGUID();
//Get customerid who receive email of quotation from owner
function GetToEmailGUID() {
var Customer = Xrm.Page.getAttribute('customerid').getValue();
CustomerId = Customer[0].id;
var CustomerName = Customer[0].name;
var entityType = Customer[0].entityType;
//if CustomerId is type of "Account" then get Primary Contact id of that account
if (entityType == "account") {
var contact = Xrm.Page.getAttribute("customerid").getValue();
if (contact === null) return;
var serverUrl = Xrm.Page.context.getClientUrl();
var oDataSelect = serverUrl + "/XRMServices/2011/OrganizationData.svc/AccountSet(guid'" + contact[0].id + "')?$select=PrimaryContactId";
var req = new XMLHttpRequest();
req.open("GET", oDataSelect, false);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json;charset=utf-8");
req.onreadystatechange = function () {
if (req.readyState === 4) {
if (req.status === 200) {
var retrieved = JSON.parse(req.responseText).d;
CustomerId = retrieved.PrimaryContactId.Id;
else {
alert(this.statusText);
req.send();
function CreateEmail() {
GetOwnerID();
email.Subject = "Email with Report Attachment";
//Set The current order as the Regarding object
email.RegardingObjectId = {
Id: Xrm.Page.data.entity.getId(), //Get the current entity Id , here OrderId
LogicalName: Xrm.Page.data.entity.getEntityName()//Get the current entity name, here it will be “salesOrder”
//Create Email Activity
SDK.JScriptRESTDataOperations.Create(email, "Email", EmailCallBack, function (error) { alert(error.message); });
// Email Call Back function
function EmailCallBack(result) {
email = result; // Set the email to result to use it later in email attachment for retrieving activity Id
var activityPartyFrom = new Object();
// Set the From party of the ActivityParty to relate an entity with Email From field
activityPartyFrom.PartyId = {
Id: CustomerId, //"79EBDD26-FDBE-E311-8986-D89D6765B238", // id of entity you want to associate this activity with.
LogicalName: "contact"
// Set the "activity" of the ActivityParty
activityPartyFrom.ActivityId = {
Id: result.ActivityId,
LogicalName: "email"
// Now set the participation type that describes the role of the party on the activity).
activityPartyFrom.ParticipationTypeMask = { Value: 2 }; // 2 means ToRecipients
// Create the from ActivityParty for the email
SDK.JScriptRESTDataOperations.Create(activityPartyFrom, "ActivityParty", ActivityPartyFromCallBack, function (error) { alert(error.message); });
var activityPartyTo = new Object();
// Set the From party of the ActivityParty to relate an entity with Email From field
activityPartyTo.PartyId = {
Id: ownerID, //"79EBDD26-FDBE-E311-8986-D89D6765B238", // id of entity you want to associate this activity with.
LogicalName: "systemuser"
// Set the "activity" of the ActivityParty
activityPartyTo.ActivityId = {
Id: result.ActivityId,
LogicalName: "email"
// Now set the participation type that describes the role of the party on the activity).
activityPartyTo.ParticipationTypeMask = { Value: 1 }; // 1 means Sender
// Create the from ActivityParty
SDK.JScriptRESTDataOperations.Create(activityPartyTo, "ActivityParty", ActivityPartyToCallBack, function (error) { alert(error.message); });
//ActivityParty From Callback
function ActivityPartyFromCallBack(result) {
//ActivityParty To Callback
function ActivityPartyToCallBack(result) {
GetReportId('Quotation');
//Create attachment for the created email
function CreateEmailAttachment() {
//get reporting session and use the params to convert a report in PDF
var params = getReportingSession();
//Email attachment parameters
var activitymimeattachment = Object();
activitymimeattachment.ObjectId = Object();
activitymimeattachment.ObjectId.LogicalName = "email";
activitymimeattachment.ObjectId.Id = email.ActivityId;
activitymimeattachment.ObjectTypeCode = "email",
activitymimeattachment.Subject = "File Attachment";
activitymimeattachment.Body = encodePdf(params);
activitymimeattachment.FileName = "Report.pdf";
activitymimeattachment.MimeType = "application/pdf";
//Attachment call
SDK.JScriptRESTDataOperations.Create(activitymimeattachment, "ActivityMimeAttachment", ActivityMimeAttachmentCallBack, function (error) { alert(error.message); });
//ActivityMimeAttachment CallBack function
function ActivityMimeAttachmentCallBack(result) {
var features = "location=no,menubar=no,status=no,toolbar=no,resizable=yes";
var width = "800px";
var height = "600px";
window.open(Xrm.Page.context.getServerUrl() + "main.aspx?etc=" + 4202 + "&pagetype=entityrecord&id=" + email.ActivityId, "_blank", features);
// To open window which works in outlook and IE both
//openStdWin(Xrm.Page.context.getServerUrl() + "main.aspx?etc=" + 4202 + "&pagetype=entityrecord&id=" + email.ActivityId, "_blank", width, height, features);
//This method will get the reportId based on a report name that will be used in getReportingSession() function
function GetReportId(reportName) {
var oDataSetName = "ReportSet";
var columns = "ReportId";
var filter = "Name eq '" + reportName + "'";
retrieveMultiple(oDataSetName, columns, filter, onSuccess);
function retrieveMultiple(odataSetName, select, filter, successCallback) {
var serverUrl = Xrm.Page.context.getServerUrl();
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
var odataUri = serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?";
if (select) {
odataUri += "$select=" + select + "&";
if (filter) {
odataUri += "$filter=" + filter;
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
datatype: "json",
url: odataUri,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("Accept", "application/json");
success: function (data) {
if (successCallback) {
if (data && data.d && data.d.results) {
successCallback(data.d.results);
else if (data && data.d) {
successCallback(data.d);
else {
successCallback(data);
error: function (XmlHttpRequest, errorThrown) {
if (XmlHttpRequest && XmlHttpRequest.responseText) {
alert("Error while retrieval ; Error – " + XmlHttpRequest.responseText);
function onSuccess(data) {
reportId = data[0].ReportId.replace('{', ").replace('}', ");
CreateEmailAttachment(); // Create Email Attachment
//Gets the report contents
function getReportingSession() {
var pth = Xrm.Page.context.getServerUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
var retrieveEntityReq = new XMLHttpRequest();
var Id = Xrm.Page.data.entity.getId();
var quotationGUID = Id.replace('{', ""); //set this to selected quotation GUID
quotationGUID = quotationGUID.replace('}', "");
var reportName = "Quotation"; //set this to the report you are trying to download
var reportID = "7C39D18F-1DC6-E311-8986-D89D6765B238"; //set this to the guid of the report you are trying to download
var rptPathString = ""; //set this to the CRMF_Filtered parameter
var strParameterXML = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='quote'><all-attributes /><filter type='and'><condition attribute='quoteid' operator='eq' uitype='quote' value='" + quotationGUID + "' /> </filter></entity></fetch>";
retrieveEntityReq.open("POST", pth, false);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
rptPathString = "id=%7B" + reportID + "%7D&uniquename=" + Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" +
reportName + "&isScheduledReport=false&p:CRMAF_Filteredquote=" + strParameterXML;
//remove the part starting from &p:salesorderid if your report has no parameters
retrieveEntityReq.send(rptPathString);
var x = retrieveEntityReq.responseText.indexOf("ReportSession=");
var ret = new Array();
ret[0] = retrieveEntityReq.responseText.substr(x + 14, retrieveEntityReq.responseText.indexOf("&", x) - x - 14); //the session id
x = retrieveEntityReq.responseText.indexOf("ControlID=");
ret[1] = retrieveEntityReq.responseText.substr(x + 10, retrieveEntityReq.responseText.indexOf("&", x) - x - 10); //the control id
return ret;
var bdy = new Array();
var bdyLen = 0;
function concat2Bdy(x) {
bdy[bdyLen] = x;
bdyLen++;
function encodePdf(params) {
bdy = new Array();
bdyLen = 0;
var retrieveEntityReq = new XMLHttpRequest();
var pth = Xrm.Page.context.getServerUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + params[0] +
"&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + params[1] +
"&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF";
retrieveEntityReq.open("GET", pth, false);
retrieveEntityReq.setRequestHeader("Accept", "*/*");
retrieveEntityReq.send();
BinaryToArray(retrieveEntityReq.responseBody);
return encode64(bdy);
var StringMaker = function () {
this.parts = [];
this.length = 0;
this.append = function (s) {
this.parts.push(s);
this.length += s.length;
this.prepend = function (s) {
this.parts.unshift(s);
this.length += s.length;
this.toString = function () {
return this.parts.join('');
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encode64(input) {
var output = new StringMaker();
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
while (i < input.length) {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
return output.toString();
</script>
<script type="text/vbscript">
Function BinaryToArray(Binary)
Dim i
ReDim byteArray(LenB(Binary))
For i = 1 To LenB(Binary)
byteArray(i-1) = AscB(MidB(Binary, i, 1))
concat2Bdy(AscB(MidB(Binary, i, 1)))
Next
BinaryToArray = byteArray
End Function
</script>
</head>
<body>
<input type="button" onclick="CreateEmail();" value="Attach Report" />
</body>
</html>
Thank you,
Mittal. -
Dynamically set template for Print Quote report
We need to customize "Print Quote" in Quoting
As part of this we will be having 2 custom templates (will be related to data definition "Quote Printing", ASOPRT).
These two templates have to be defaulted based on the quote status - one for status "Approved", and the other template for other non "Approved" statuses.
How can this be achieved dynamically? (OAF CO customization / personilization)
There doesn't seem to be any setup for assigning different templates based on status.
Profile option "ASO: Default Layout Template" can be utilized to change the default template, but we need this template to be defaulted dynamically based on the Quote status.
Thanks,
Sumanth
Edited by: user1131947 on Oct 25, 2011 3:51 AMIf you want to create a custom report using concurrent program then refer:
http://apps2fusion.com/apps/apps/63-xml-publisher-concurrent-program-xmlp
If you want to create a custom report using OAF page then refer:
http://apps2fusion.com/at/51-ps/260-integrating-xml-publisher-and-oa-framework
-Anand -
How to rename C00n generic column names in a Dynamic SQL report
I have a an interface whereby the user can select 1 to 60 (upper limit) columns out of 90 possible columns (using a shuttle) from one table before running a report.
To construct the SQL that will eventually execute, I'm using a "PLSQL function body returning SQL query" with dynamic SQL. The only problem is that I have to use "Generic Column Names" option to be able to compile the code and end up with c001 to c060 as the column names.
How can I use the names of the selected columns as the report headings rather than c001, C002... etc?
I do not know beforehand which columns, or how many columns or the order of the selected columns.
I know Denes K has a demo called Pick Columns but I can't access his code. I have a hunch though that he may be just using conditions to hide/show the apropriate columns.
thanks in advance
PaulPHi Paul
I would change the Heading Type in the Report Details screen to PLSQL and use the shuttle item to return the column values. e.g.
RETURN :p1_shuttle;
I'm assuming the shuttle already has a colon separated list of the column headings in the correct order?
I hope that helps
Shunt -
Inserting Dynamic Images in to a Crystal Report 10
Hi all,
I am trying to insert dynamic pictures into my report from repository, by getting the path for the picture from database fields. The version that I am using is Crystal Reports 10.
Here is what I have done.
I inserted an OLE object into the report, went to "Format Graphics" by right clicking on the OLE object, then to "Hyperlink" Tab (as I didn't see anything other than "Reset" button and picture dimension options under the "Picture" tab), and selected "File" Radio button (as I didn't want to display the picture as Hyperlink) and gave the @Filepath as the formula there. @Filepath is the formula that gives me the complete path for the JPEG that I need to insert in the report.
filepath = field A + field B
where field A is the location for the image and field B is the actual image name.
the actual image is located in repository folder.
I am not able to see the image in the report "Preview" section as it is showing it has an empty box and when I click on that empty OLE object, I am able to view the image in a separate window where as my requirement is to view the image within the report (not in a separate window).
I didn't find anything useful under Format Graphics -> Picture tab.
I appreciate any kind of help from you all.
Thanks!That feature wasn't available nor was it supported in CR 10. You'll have to upgrade to CR Xi R2 or 2008 to allow using a database field as the location of the file.
CR 10 would only load the picture when the report is opened, it will never update when clicking on the refresh button. -
How can I insert data in different table dynamically?
I have one requirement ,In these I have transaction table in which payLoad contain data like employee record,PO record,SO record in XML format.Now I have transfer the data from transaction table to particular table(Emp,SO,PO) dynamical ? how can I do it.. Give me your suggestion guys?? Thanks in Advance
Hello,
Still no luck.I am surely doing silly mistakes.Anyway,Here are my workings-
1> student_mst (id(pk),studentname) and student_guard_mst(id(fk),guardianname)
2> created EO from both of the tables,made id in both EO as DBSequence and an association was also generated.
3> i made that association composite by clicking the checkbox
4> i created 2 VO from 2 EO.
5> put those VO in Application Module.
6> dragged and dropped 2 VO on my jspx page and dropped them as ADF Form.
Now what to do please? -
How to use one dynamic connection managers for multiple parallel data flow tasks
hi there:
I have 6 databases residing on the same server. What I want to do is call a store procedure with identical name on each database dbo schema and transport results to a centralized place. The key is to have those SPs run in parallel instead
of in sequence as each SP may take around 10 mins to finish.
The simplest way is to create 6 OLE DB connection managers and create 6 DFT tasks. However, I do not want to maintain 6 OLE DB connection managers as there is a chance to have more connection managers.
What I did so far is to create a OLD DB connection manager and use expression to set up connectionString properties so that it will get populated by variables at run time. It is fine when running all SPs in a Foreach Loop Container. However, it takes
around 60 mins to finish.
When I try to run it in parallel ( basically created 6 DFTs but use only one Dynamic Connection Manager), the connection string gets confused therefore all DFT tasks failed.
Does anyone here have some experience on this topic?
Thanks
hui
--Currently using Reporting Service 2000; Visual Studio .NET 2003; Visual Source Safe SSIS 2008 SSAS 2008, SVN --Yes, basically, on the connectionString property of ONE OLEDB, you are using an expression to supply value and this expression is pointing to a variable.
In this case , you can update this variable from a table which contains many connection strings. It's good if you want to execute Store procedures in a sequential order. When in parallel mode, this will cause issues as connectionString gets overwritten.
I am thinking about using script task to exec sp.
The whole idea is that I do not want to maintain a large number of Connection Managers.
Hope it helps
--Currently using Reporting Service 2000; Visual Studio .NET 2003; Visual Source Safe SSIS 2008 SSAS 2008, SVN --
So you are not able to run parallel executions using same conn mgmr, even with dynamic connectionstring, is that correct? Yes, script task will be a way to go if you wish to execute it in parallel, you may connect to SS and query the proper conn string with
SELECT/WHERE clause in each script > pass it to a script variable > use that script variable and execute the proc. This will require only two things to change in each script, the WHERE condition to get the conn string and the proc name (you may even
get the proc names the same way you get conn string) and everything else will be same. Let us know how that goes.
Hope no two or more procs doing insert/update/delete on the same tables. -
Creating dynamic value range, one week at a time
Every Monday, I query a table to get data for the past week, every Monday (last Monday) to Sunday. I do some calculations with the data and insert the data and dates into a table.
I then use cfchart to create a graph using this data. The drilldown uses the same weekly date range to produce a report. So the record count for the chart and the report should be the same.
What I just discovered is that more data can be added to the query table after I have already obtained the data. Since the data for the chart is already in the table, it is static. But the report is dynamice since it uses the weekly date range everytime the drilldown is selected. This causes the count of the report to be different than the count of the chart.
Instead of gathering data every Monday and inserting into a table, for the chart, how can I make the chart data dynamic ?
I need to plot a rolling 12 weeks worth of data, always from Monday to Sunday, inclusive. So if I decide to run the chart on a Wednesday, how would I gather the twelve weeks worth of data, always from Monday to Sunday ? I need to make this dynamc.
The reports always work because the drilldown is pasing it the dates, thats why the count is always correct. But I do not know how to do this with the chart, which needs to be dynamic also, since static will not work.
Any help appreciated. ThanksTrojfn,
For gathering the data and inserting the same in to a table, why can't you use the scheduled tasks?.
Maybe you are looking for
-
Can't install / find printers.
Can't install / find printers. Mac newbie here. At home, my printer is on a network and my iMac finds it. Now i have a new iMac at work and I can't find / install any printers from the network. in the printer utility no default printers are listed. I
-
How to get your own content on Apple TV
I'm considering buying an Apple TV to replace my Mac Mini (as I don't really use much other than Front Row anyway, so a couple of questions: 1. Is the only way to get my own content on the Apple TV to sync it with iTunes running on another computer?
-
Hey All! Finally decided to give Arch a drive and love it so far. I've set myself up in a VirtualBox VM with the Host OS being Ubuntu 7.10. Did a basic install and then installed xorg, openssh and xfce4. Nothing fancy. My problem is that when I go t
-
App-v package which needs Excel + Internet Explorer
Hi, I need to package an application (App-V 4.6) on Windows 2008 which need Internet Explorer and Excel. Please advise howto do this. I packaged the application but when starting the Excel plugin it says it can't find the application itself. Please a
-
I am using the payment block indicator in the import HEADERDATA for BAPI_INCOMINGINVOICE_CREATE and the table ACCOUNTPAYABLE for BAPI_ACC_INVOICE_RECEIPT_POST. It can be set to *, A, B, N, P, R or V. Can other indicators be defined or are these the