I have one question, I want to have one page view statistics and send them through REST.
here is my request:
select count (*)
from apex_activity_log l
where flow_id = 100
and time_stamp> = sysdate - (1/24/60/60 * 2419200)
and userid is not null
and step_id = 172
;
answer : 867
This query works great in "SQL Commands". But when I use this query in Packages I get 0. Although the answer should be completely different. How do I give Packages access to apex_activity_log. That the correct answer came back to me. Thanks)
My api in Packages :
PROCEDURE post_connect_service (
p_status OUT NUMBER,
p_blob IN BLOB
) IS
v_blob blob := p_blob;
v_clob CLOB;
tv apex_json.t_values;
v_id varchar2(1000);
v_number varchar2(1000);
v_date_last date;
v_count_v_pl int;
v_count_sum_v int;
BEGIN
v_clob := iot_general.blob_to_clob(v_blob);
apex_json.parse(tv,v_clob);
v_id := apex_json.get_varchar2(p_path => 'id', p_values => tv);
select count(*) into v_count_sum_v
from apex_activity_log;
p_status := 200;
apex_json.open_object;
apex_json.write('success', true);
apex_json.write('count_views', v_count_v_pl);
apex_json.write('count_sum_views', v_count_sum_v);
apex_json.close_object;
EXCEPTION
WHEN OTHERS THEN
p_status := 500;
apex_json.open_object;
apex_json.write('success', false);
apex_json.write('message', substr(sqlerrm,1,4000));
apex_json.close_object;
END post_connect_service;
The view apex_activity_log has data for the current apex context. If it is queried outside of an apex context, it will return no rows. Easiest way is to create an apex session before querying it.
koen>SELECT COUNT(*) FROM apex_activity_log;
COUNT(*)
___________
0
koen>DECLARE
2 BEGIN
3 apex_session.create_session (
4 p_app_id => 286,
5 p_page_id => 1,
6 p_username => 'JOHN.DOE');
7 END;
8* /
PL/SQL procedure successfully completed.
koen>SELECT COUNT(*) FROM apex_activity_log;
COUNT(*)
___________
9327
koen>
first, there is a pre-configured REST API for this within ORDS.
https://docs.oracle.com/en/database/oracle/oracle-database/21/dbrst/api-oracle-apex.html
To answer your actual question:
Does your procedure run within the same workspace as application 100 is? Or are you dependent on the APEX_ADMINISTRATOR_ROLE for this to return rows?
if the latter, make sure to create your package or procedure with AUTHID CURRENT_USER to make sure that it ...
a) runs with the privieges of the invoking user
b) have roles (such as the APEX_ADMINISTRATOR_ROLE) enabled during PL/SQL execution.
I have a interactive grid with column email_to email_from which is editable grid, now i need to fetch the values which we are entering into columns in grid..my items are :p1_email_to,:p1_email_from..
below is my query which is calling the email procedure, here i need to pass the item values which i am entering on screen but the item values are showing null, the grid values are not returning to items.
Here the query for on submit button:
DECLARE
p_division EMAIL_ERRORS.ORG_ID%TYPE;
p_to EMAIL_ERRORS.TO_NAME%TYPE;
p_from EMAIL_ERRORS.FROM_NAME%TYPE;
p_message EMAIL_ERRORS.MESSAGE_TXT%TYPE;
p_user EMAIL_ERRORS.USER_NAME%TYPE;
p_sys_param_from EMAIL_ERRORS.SYS_PARAM_FROM_TXT%TYPE;
p_attach EMAIL_ERRORS.ATTACH_TXT%TYPE;
P_POST_OP EMAIL_ERRORS.POST_OP_TXT%TYPE;
P_POST_OP_PARAM1 EMAIL_ERRORS.POST_OP_PARAM1_TXT%TYPE;
P_POST_OP_PARAM2 EMAIL_ERRORS.POST_OP_PARAM2_TXT%TYPE;
P_POST_OP_PARAM3 EMAIL_ERRORS.POST_OP_PARAM3_TXT%TYPE;
BEGIN
CAB$MAIL.send (p_to => :P1_TO_NAME
,p_from => :P1_FROM_NAME
,p_message => :P1_MESSAGE_TXT
,p_user => :P1_USER_NAME
,p_sys_param_from => :P1_SYS_PARAM_FROM_TXT
,p_division => :P1_ORG_ID
,p_attach => :P1_ATTACH_TXT
,P_POST_OP => :P1_POST_OP_TXT
,P_POST_OP_PARAM1 => :P1_POST_OP_PARAM1_TXT
,P_POST_OP_PARAM2 => :P1_POST_OP_PARAM2_TXT
,P_POST_OP_PARAM3 => :P1_POST_OP_PARAM3_TXT);
END;
Is it possible to format both a row and column?
For instance I am doing a loop that uses the index to style rows different colors based on if it is even or odd but I also want to style a column that has percentages to use the :num_fmt => 9
Also why when I am presenting the number as something like 1.2 does that end up changing it to 120%, all I want is for that data to look like 1.2%
#people.each_with_index | person, index |
if index.odd?
sheet.add_row [person['name'], person['rate']]
else
sheet.add_row [person['name'],person['rate']], :style => even_row
end
end
(my even row style is set at the top of my code)
I figured this out, you need to do set your style using something like
percent = s.add_style(:num_fmt => 9)
even_row_percent = s.add_style(:bg_color => 'blue', :fg_color => 'white', :b => false, :format_code => 0%)
even_row = s.add_style(:bg_color => 'blue', :fg_color =>'white', :b => false)
then in your loop just use an each with index and then use a if statement like
if index.odd
sheet.add_row[
item[:value],
item[:value_percent]], :style => [nil, percent]
else
sheet.add_row[
item[:value],
item[:value]], :style => [even_row, even_row_percent]
end
I am trying to use the APEX data loader to allow users to import data and one of the column values I would rather not force the users to provide since the value is readily available in the session when the users selects import.Is there a way to add that column value programmatically?
With the Oracle APEX 4.2 data wizard, adding the rows to the SPREADSHEET_CONTENT is not enough if the First Rows are the column names. You also have to run the following assuming you are adding a 9th column, 'C009' and the name is 'MY_COLUMN_NAME'.
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C009',
p_c002 => 'MY_COLUMN_NAME')
;
Otherwise, it just ignores the data as it's using the meta data of PARSE_COL_HEAD.
I had a similar issue and solved it along the lines that Greg suggested in his comment. Here is a sample of the code I used in the process that runs right after "Parse Uploaded Data" on page 1 of the wizard:
FOR UPLOAD_ROW IN (SELECT SEQ_ID
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '2',
p_attr_value => :P1_TABLE_FIELD_2);
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '3',
p_attr_value => :P1_TABLE_FIELD_3);
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '4',
p_attr_value => :P1_TABLE_FIELD_4);
END LOOP;
For a more detailed explanation see http://www.jrweth.com/oracle-apex-data-loader-part-1-adding-custom-columns/
You could edit the loader and add a data transformation rule.
I hate to just post a link but this blog post from Rowan provides ample explanation how this works since the documentation from Oracle does not.
Application Express Data Loader Transformation Rules in 4.2
Basically, the transformation rules feature allows you to select one or more columns in your target table. You then choose the type of transformation from the available options: PL/SQL expression, PL/SQL Function, SQL Query (2 types her).
The loader will run this function for each row loaded and you can reference session state, lookup values in other tables or package state, as well as column values in the row. For example if you have a column named COLUMN1 you would refer to it in the source of the transformation rule as :COLUMN1 (e.g IF :COLUMN1 > 10 THEN .... ).
If you use the PL/SQL Expression, the value after evaluation will be returned as the new column value. If you use PL/SQL Function you will need to add a RETURN expression to get this value back tot he column.
That is to say that you will not be able to set the values using the bind notation you use to get values. So if you want COLUMN1 to be set to 10, build a rule to set that value, don't try to do :COLUMN1 := 10; as this state will only last during the execution of your rule for the record being transformed.
This new code is working perfectly despite the USE_APPLICATION_DATE_FORMAT column added by APEX. Note that near the bottom of the code the p_seq is set to '35'.
Declare
v_date date;
BEGIN
SELECT SYSDATE INTO v_date FROM Dual;
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C036',
p_c002 => 'UPLOAD_DTE');
APEX_COLLECTION.MOVE_MEMBER_DOWN(
p_collection_name =>'PARSE_COL_HEAD',
p_seq => '36');
FOR UPLOAD_ROW IN (SELECT SEQ_ID FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '35',
p_attr_value => v_date);
END LOOP;
END;
For Oracle APEX data loader 4.2, in the developer view, look on the 1st page, in the 'Page Processing' block, right click on "Processing" and select "add new process" , then name it. Mine is called 'add_column', then add the below code.
You need to first add a new column to the APEX collection. You can do APEX_COLLECTION.ADD_MEMBER() function. In the code below, I add in an additional column at column 31 location and the name of the column is called 'FILE_DATE'. This is the same as the name as the column the database table.
After that you loop through each row by SEQ_ID and update column 31 with a value. In my case, I wanted to get the filename, which was :P25_FILE_NAME
When you run the pages, you can click on 'Session' on the developer toolbar at the bottom to have a look at the APEX collection array and see if your column is getting populated correctly.
BEGIN
APEX_COLLECTION.ADD_MEMBER
(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C031',
p_c002 => 'FILE_DATE');
FOR UPLOAD_ROW IN (SELECT SEQ_ID FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '31',
p_attr_value => :P25_FILE_NAME
);
END LOOP;
END;
I am able to get through it using the code below:
Declare
v_count number(10);
BEGIN
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'SESSION_ID');
v_count:=APEX_COLLECTION.COLLECTION_MEMBER_COUNT ('PARSE_COL_HEAD');
v_count:=v_count+1;
FOR UPLOAD_ROW IN (SELECT SEQ_ID
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => v_count,
p_attr_value => V('APP_SESSION')); –-I was trying to load session id
END LOOP;
END;
Declare
v_count number(10);
BEGIN
v_count:=APEX_COLLECTION.COLLECTION_MEMBER_COUNT ('PARSE_COL_HEAD');
v_count:=v_count;
APEX_COLLECTION.ADD_MEMBER( p_collection_name => 'PARSE_COL_HEAD',
p_c001 => concat('C00',v_count),
p_c002 => 'ID_OFFICE_LOCATION');
APEX_COLLECTION.MOVE_MEMBER_DOWN( p_collection_name =>'PARSE_COL_HEAD',
p_seq => v_count+1);
FOR UPLOAD_ROW IN (SELECT SEQ_ID
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE ( p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => v_count,
p_attr_value => :P0_ID_OFFICE_LOCATION);
END LOOP;
END;
I have searched for hours but could not find an answer to this, or a module to help.
We are building a store and our client needs the ability to navigate the store by manufacturer. Is there any way that the manufacturer page can list the categories and subcategories.
There seems two ways to do it.
Add brands while adding categories in admin section.
Get all categories inside the brands by join operation while viewing the manufacturer.
Are there any modules available to link up categories with manufacturers so that I can display categories inside the manufacturer page.
Or the only way is to query all the products inside the manufacturer and get the categories out of it... I guess it is not a good solution.
So any suggestions would be a great help.
Thanks.
I figured a way to find the categories that belongs to a manufacturer. The second options seems better.
Here is the function that I added to catalog/model/catalog/manufacturer.php
public function getManufacturerCategories($manufacturer_id) {
$query = $this->db->query("
SELECT
DISTINCT c.category_id,cd.name
FROM
". DB_PREFIX . "manufacturer m
LEFT JOIN ". DB_PREFIX. "product p ON (m.manufacturer_id = p.manufacturer_id)
LEFT JOIN ". DB_PREFIX. "product_to_category p2c ON (p2c.product_id = p.product_id)
LEFT JOIN ". DB_PREFIX. "category c ON (c.category_id = p2c.category_id)
LEFT JOIN ". DB_PREFIX. "category_description cd ON (cd.category_id = p2c.category_id)
WHERE
p.status = 1
AND m.manufacturer_id = '".(int)$manufacturer_id."'
AND c.status= 1
");
return $query->rows;
}
Here is the output array
stdClass Object (
[row] => Array
(
[category_id] => 20
[name] => Desktops
)
[rows] => Array
(
[0] => Array
(
[category_id] => 20
[name] => Desktops
)
[1] => Array
(
[category_id] => 24
[name] => Phones & PDAs
)
)
[num_rows] => 2 )