SELECT TABLE BASED ON CONDITION
hi every one , i need your help in resolving this issue . if you look at the last column service_id in the select the value of the service_id is derived from by the source_system.
each source system can have 1 to multiple service_ids . the below query returns same data set with different service_ids. my question is
for example when source_system is 'COMS' the i have included table ref_coms_circuit to get multiple service ids. so if i have to include another source_system 'ESP' then how will i do that.
WITH t AS
(SELECT so.tin, so.o_seq, so.order_type,
so.customer_req_due_date customer_due_date,
MAX (soplm1.milestone_date) order_date,
MAX (soplm2.milestone_date) hold_begin_date,
MAX (soplm3.milestone_date) hold_end_date
FROM s_order so,
s_order_product_leg_milestone soplm,
s_order_product_leg_milestone soplm1,
s_order_product_leg_milestone soplm2,
s_order_product_leg_milestone soplm3
WHERE -- so.order_status = 'A' AND
so.contract_id IN ('157798', '157800')
-- AND soplm.milestone_id = 4350
AND soplm.source_system_name = 'OPRO'
AND soplm.o_seq = so.o_seq
AND soplm.last_modified_date >=
TO_DATE ('07/01/2007 00 :00:00', ' MM/DD/YYYY HH24: MI: SS')
AND soplm.last_modified_date < SYSDATE
AND soplm.tin = 'OPRO.670148'
AND soplm1.tin(+) = so.tin
AND soplm1.o_seq(+) = so.o_seq
AND so.tin = soplm2.tin(+)
AND so.tin = soplm3.tin(+)
AND so.o_seq = soplm2.o_seq(+)
AND so.o_seq = soplm3.o_seq(+)
AND soplm1.milestone_id(+) = 100
AND soplm1.source_system_name(+) = 'OPRO'
AND soplm2.milestone_id(+) = 1650
AND soplm2.source_system_name(+) = 'NPRO'
AND soplm3.milestone_id(+) = 1690
AND soplm3.source_system_name(+) = 'NPRO'
GROUP BY so.tin, so.o_seq, so.order_type, so.customer_req_due_date)
SELECT DISTINCT soplm4.tin, soplm4.VERSION, soplm4.product_serial_number,
soplm4.node_id, t.order_type, sopl.product_id,
rp.product_id_desc product_desc, NULL AS product_catalog_id,
soplm4.source_system_name, t.order_date, t.customer_due_date,
NULL AS asrn, NULL AS service_typ_seq, t.hold_begin_date,
t.hold_end_date,
DECODE (soplm4.source_system_name,
'COMS', 'COMS CIRCUIT ID',
'FE', 'FE CIRCUIT ID',
'VDDS', 'PVC ID',
'ESP', 'ESP Product Billing Key',
'OTS', 'OTS SITE ID',
'UCLP', 'K - Number',
'NCAP', 'NETCAP 800# ',
'IASA', 'IASA ANI ',
'COMP', 'COMMONPLACE AUTH CODE',
soplm4.source_system_name
) neid_type,
CASE soplm4.source_system_name
WHEN 'COMS'
THEN rcc.circuit_number
WHEN 'VDDS'
THEN sopl.pvc_id
WHEN 'OTS'
THEN sopl.site
WHEN 'IASA'
THEN sopl.iasa_account_id
WHEN 'COMP'
THEN sopl.pin
WHEN 'UCLP'
THEN sopl.billing_identifier
WHEN 'NCAP'
THEN sopl.toll_free_num
-- WHEN 'ESP' THEN soed.product_billing_key
-- WHEN 'FE' THEN
ELSE NULL
END service_id
FROM t,
s_order_product sop,
s_order_product_leg sopl,
s_order_product_leg_milestone soplm4,
ref_product rp,
ref_coms_circuit rcc
WHERE soplm4.tin = t.tin
AND soplm4.o_seq = t.o_seq
AND soplm4.source_system_name IN (SELECT source_system_name
FROM com_calnet_systems)
AND sop.tin = t.tin
AND sop.o_seq = t.o_seq
AND sopl.tin = t.tin
AND sop.op_seq = soplm4.op_seq
AND sopl.o_seq = t.o_seq
AND sopl.opl_seq = soplm4.opl_seq
AND rp.product_id = sopl.product_id
AND rcc.coms_service_number = sop.coms_service_number;
Either union all of them before or after the join, i.e.,
Solution 1:
SELECT DISTINCT soplm4.tin, soplm4.VERSION, soplm4.product_serial_number,
FROM t,
ref_coms_circuit rcc
WHERE soplm4.tin = t.tin
AND rcc.coms_service_number = sop.coms_service_number
union all
SELECT DISTINCT soplm4.tin, soplm4.VERSION, soplm4.product_serial_number,
FROM t,
ref_vdds_circuit rvc
WHERE soplm4.tin = t.tin
AND rvc.coms_service_number = sop.coms_service_number
union all
SELECT DISTINCT soplm4.tin, soplm4.VERSION, soplm4.product_serial_number,
...Solution 2:
SELECT DISTINCT soplm4.tin, soplm4.VERSION, soplm4.product_serial_number,
FROM t,
(select 'COMS' source, circuit_number data, coms_service_number
-- any column you need in your output
from ref_coms_circuit
union all
select 'VDDS', pvc_id, coms_service_number
-- any column you need in your output
from ref_vdds_circuit
union all...) bigunion
WHERE soplm4.tin = t.tin
AND soplm4.source_system_name = bigunion.source
AND rcc.coms_service_number = sop.coms_service_number;Edited by: thtsang on Oct 20, 2009 10:28 PM
Edited by: thtsang on Oct 20, 2009 10:44 PM
Similar Messages
-
Extracting from table based on conditions from two internal tables
Hi,
i to have select few records from a table based on conditions from two different internal tables. How can I achieve this.?
ex:
select objid from HRVPAD25 into table t_pad25
where PLVAR = 01
OTYPE = E
OBJID = itab1-sobid
sobid = itab2-pernr.
How can this be written? can i use "for all entries..." addition with 2 tables?Hi Maansi_SAP,
you can use exactly one internal table in the FOR ALL ENTRIES clause. Consider this alternative:
data:
itab_sobid_hash like itab1 with unique key sobid,
ls_pad25 like line of t_pad25.
sort itab1.
delete adjacend duplicates from itab1 comparing sobid.
itab_sobid_hash = itab1.
select objid
into ls_pad25
from HRVPAD25
for all entries in itab2
where PLVAR = '01'
and OTYPE = E
and sobid = itab2-pernr..
read table itab_sobid_hash with table key sobid = ls_pad25-objid.
check sy-subrc = 0.
append ls_pad25 to t_pad25.
endselect.
You may decide if itab1 or itab2 is better used as hashed table. Make a performance test.
The critics will tell you that SELECT ... ENDSELECT is not performant. That was very true, back in last milleniums's 90ies
Regards,
Clemens -
How to call or not call a Trigger in same table based on condition?
Hi
How to call or not call a Trigger in below situations..
If a table contains a record of same value i.e,
[i[u]]ID
1
1
3
In above ID 1 is repeated for two times.
In this situations i don't want to call a trigger..
But, the value ID is for 3, now i want to fire a trigger.
Based on this i want to delete in another table.
How can I check it?
ThanksThanks for ur reply..
The below is my scnario..
I am having two table
employee
Id empcol
101 111
101 222
102 444
Department
id deptcol
101 457
101 678
102 543
The above is my table structure no one column is PK, so i m not able create FK.
When I am deleting from employee where id =101 and empcol=111,
the above record is deleted.
At present I am using After Update Trigger..
So trigger is called and delete the id 101 in Department table.
In my scenario i can't delete a record in Department table
bcoz i am having id morethan 101 in employee table.
If employee table contains one ID like 102 the Trigger should works.
How can I check the condition After delete on employee table it contains morethan same employee id?
The below is my Trigger..
CREATE OR REPLACE TRIGGER CALL_TRIGGER
AFTER DELETE ON Employee
FOR EACH ROW
DECLARE
count_id pls_integer;
BEGIN
SELECT COUNT(*) INTO count_id from Employee WHERE ID <>:new.ID;
IF( count_id >1) THEN
DELETE FROM Depratment where ID=:old.ID;
END IF;
END;
I am geting an error ORA-04091 table is mutuating, trigger cannot seen it.
I had tried with package and package body also.. But no luck.
Thanks -
Dataset from two set of tables based on condition
I have two queries that will return same columns from two different set of tables ( column mapping has been taken care of). The return type is out ref cursor. (P_SUPPLY_REORDER )
Query 1-SO
select
so.SMO_NO,
so.SPLY_ORD_DT,
so.fk_CUST_ID as CUST_ID,
so.CUST_PO_NO,
so.ATTENTION_NAME,
sum(sol.SPLY_ORD_QTY) as SPLY_ORD_QTY,
--sum(sol.sply_shp_qty),
so.ST_NAME,
so.ADDR_LN_2,
so.ADDR_LN_3,--sta.SHIP_TO_ADDRESS_LINE_3,
so.CITY_NAME,
so.ST_TERR_CD,
so.ZIP_CD,
so.SPCL_SHP_INSTR_TXT,
so.SHP_CNFRM_DT
,XCOM_ORDER_NO
from
supply_order so,
supply_order_line sol,
XCOM_ORDER_HEADER
where
so.FK_CUST_ID =in_cust_id
and so.pc_ord_no = sol.fk_pc_ord_no and
XCOM_ORDER_HEADER.FK_PC_ORD_NO = so.PC_ORD_NO
group by so.SMO_NO, so.SPLY_ORD_DT, so.fk_CUST_ID,
so.CUST_PO_NO, so.ATTENTION_NAME,
so.ST_NAME, so.ADDR_LN_2, so.ADDR_LN_3, so.CITY_NAME, so.ST_TERR_CD,
so.ZIP_CD, so.SPCL_SHP_INSTR_TXT, so.SHP_CNFRM_DT, XCOM_ORDER_NO;
Query-2 Xcom
select
null as sMO_NO,
xso.created_date as SPLY_ORD_DT,
xso.fk_cust_id as cust_id,
cust.cust_po_no as cust_PO_NO
,(sta.SHIP_TO_ATTN_FIRST_NAME||''||sta.SHIP_TO_ATTN_LAST_NAME) as attention_name,
xsol.CARTONS_ORDERED as SPLY_ORD_QTY,
--sum(sol.sply_shp_qty),
sta.SHIP_TO_ADDRESS_LINE_1 as ST_NAME,
sta.SHIP_TO_ADDRESS_LINE_2 as ADDR_LN_2,
--sta.SHIP_TO_ADDRESS_LINE_3,
NULL as ADDR_LN_3,
sta.ship_to_city as CITY_NAME,
sta.SHIP_TO_STATE as ST_TERR_CD,
sta.SHIP_TO_POSTAL_CODE as ZIP_CD,
sta.SHIPPING_INSTRUCTIONS as SPCL_SHP_INSTR_TXT,
null as SHP_CNFRM_DT,
xso.XCOM_ORDER_NO as XCOM_ORDER_NO
from
XCOM_ORDER_HEADER xso,
XCOM_ORDER_LINES xsol,
customer cust,
ship_to_address sta
where
cust.cust_id = xso.fk_cust_id and
sta.fk_cust_id = xso.fk_cust_id
and xso.FK_CUST_ID =in_cust_id
and xso.FK_PC_ORD_NO is null
and xso.xcom_order_no = xsol.fk_xcom_order_no;Now the requirement is
One of four conditions are possible for each Supply Reorder Number:
• Both table queries return no records
- Populate all the P_SUPPLY_REORDER output fields with nulls
• SUPPLY_ORDER returns a record, but XCOM_ORDER_HEADER returns no records
- Populate output fields with values from the join of SUPPLY_ORDER and SUPPLY_ORDER_LINE.
• SUPPLY_ORDER returns no records, but XCOM_ORDER_HEADER returns one record
- Populate output fields with values from the join of XCOM_ORDER_HEADER and XCOM_ORDER_LINES.
• SUPPLY_ORDER returns a record, and XCOM_ORDER_HEADER returns a record; find out the latest order by comapring max(SPLY_ORD_DT)
from SUPPLY_ORDER with max(CREATED_DATE) from XCOM_ORDER_HEADER.
- If the latest order is in SUPPLY_ORDER, then populate output fields with values from the join of SUPPLY_ORDER and SUPPLY_ORDER_LINE.
- If order dates are equal from both join results, then populate output fields with values from the join of SUPPLY_ORDER and SUPPLY_ORDER_LINE.
- If the latest order is in XCOM_ORDER_HEADER, then populate output fields with values from the join of XCOM_ORDER_HEADER and XCOM_ORDER_LINES.
Question is how can we switch over the queries to pull respective dataset based on these conditions ( checking that which table join is going to return a row and then based upon latest order if both tables return a row) and all this logic as part of single SQL statement that is returned as OUT Ref Cursor.
Your help will be really appreciated. Thanks much in advance.It would be easier if you would supply a dataset we can work with. And I assume the queries are called within a other cursor which returns in_cust_id right?
The best/fasters way would be to say goodbye to nested cursors.
You need:
the in_cust_id_query
extend SUPPLY_ORDER with a new field
max(CREATED_DATE) over (partiontion by cust_id) max_created_dateextend XCOM_ORDER_HEADER with a new field
max(SPLY_ORD_DT)over (partiontion by cust_id) max_sply_ord_dateThen you make a 3 level SELECT
the innerst () join all 3 sources
the second level names the rule
the outermost level applies the rule to each field:
SELECT
-- case statement to each field:
CASE rule
WHEN 1 THEN null
WHEN 2 THEN s_smo_no
WHEN 3 .... END SMO_NO,
SELECT
-- check all rules:
case
--• Both table queries return no records
when s_in_cust_id IS NULL and h_in_cust_id IS NULL then 1
--• SUPPLY_ORDER returns a record, but XCOM_ORDER_HEADER returns no records
when s_in_cust_id IS NOT NULL and h_in_cust_id IS NULL then 2
--• SUPPLY_ORDER returns no records, but XCOM_ORDER_HEADER returns one record
when s_in_cust_id IS NULL and h_in_cust_id IS NOT NULL then 3
ELSE 4 end rule_id,
i.*
(SELECT c.in_cust_id,
s.*, (with alias of course eg. s_...)
h.*, (with alias of course e.g. h_...)
from in_cust_id_query c
LEFT JOIN SUPPLY_ORDER s
on (c.in_cust_id = s.in_cust_id)
LEFT XCOM_ORDER_HEADER h
on (c.in_cust_id = h.in_cust_id) i;I hope you get it.
Of course you can do what you probable currently do. Open both cursors one by one and compare the results. But when you have 10000 in_cust_ids you start 20000 queries and you have a lot of code.
This method I'm showing need these roles coded as well, but you'll have ONE single query and that will be as fast as ORACLE can be. And I believe it's easier to read too. (But not simple!)
If you need more help, try to supply an example we can work on.
-- andy -
Calcullating no. of records in an internal table based on condition
Hi,
i have several records in an internal table. i need to calculate the number of records which meets a condition. is there any simple logic to find the records which meet the required criteria apart from looping into the internal table.
your help would be appreciated.
Thanks,
kranthi.Hi,
U can use sy-dbcnt after the select querry.
DBCNT Number of elements in edited dataset with DB operations
WRITE: /12 'Number of selected records:', SY-DBCNT CENTERED.
REPORT ZZZ_TEST1 .
Tables: mara.
Types: begin of ty_mara,
matnr like mara-matnr,
end of ty_mara.
DATA: i_mara TYPE STANDARD TABLE OF ty_mara.
DATA: v_cnt like sy-dbcnt.
SELECT-OPTIONS: s_matnr FOR MARA-matnr.
SELECT matnr from mara into table i_mara.
if sy-subrc = 0.
v_cnt = sy-dbcnt.
WRITE: /12 'Number of selected records:', v_cnt CENTERED.
endif.
Hope this helps u.
Thanks & Regards,
Judith. -
Joining Two Tables based on Conditions.
Hi All,
i would like to join two tables emp and dept with conditional join like
for example: select emp.column1...............
left outer join DEPT ON if Dept.column1='A" then emp.column1=dept.column1
else emp.column2=dept.column3
i know that bu using the UNION we can dothis, but i donot want to USE UNION.
please let me know if any workaround for this.
Thanks,
KalyanSQL> select * from etl
2 /
EMPNO ENAME JOB MGR SAL COMM DEPTNO AAA DEPT_NO
7566 JONES MANAGER 7839 2975 20 2 20
7654 MARTIN SALESMAN 7698 1250 1400 30 3 10
7698 BLAKE MANAGER 7839 2850 30 3 10
7782 CLARK MANAGER 7839 2450 10 1 20
7788 SCOTT ANALYST 7566 3000 20 2 20
7839 KING PRESIDENT 5000 10 1 20
7844 TURNER SALESMAN 7698 1500 30 3 10
7876 ADAMS CLERK 7788 1100 20 2 20
7900 JAMES CLERK 7698 950 30 3 10
7902 FORD ANALYST 7566 3000 20 2 20
7934 MILLER5 CLERK 7782 1300 10 1 20
7936 MILLER7 CLERK 7782 1300 10 1 20
12 rows selected.
SQL> select * from dept;
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> ed
Wrote file afiedt.buf
1 select
2 e.empno,
3 e.ename,
4 e.deptno,
5 aaa,
6 e.dept_no,
7 d.deptno,
8 d.dname
9 from
10 etl e ,
11 dept d
12 where
13 (e.aaa =1 and e.deptno = d.deptno) or
14* (e.aaa =2 and e.dept_no =d.deptno)
SQL> /
EMPNO ENAME DEPTNO AAA DEPT_NO DEPTNO DNAME
7566 JONES 20 2 20 20 RESEARCH
7788 SCOTT 20 2 20 20 RESEARCH
7876 ADAMS 20 2 20 20 RESEARCH
7902 FORD 20 2 20 20 RESEARCH
7782 CLARK 10 1 20 10 ACCOUNTING
7839 KING 10 1 20 10 ACCOUNTING
7934 MILLER5 10 1 20 10 ACCOUNTING
7936 MILLER7 10 1 20 10 ACCOUNTING
8 rows selected.Regards
Singh -
Update one table based on condition from another table using date ranges
Hello!
I have two tables:
DateRange (consists of ranges of dates):
StartDate FinishDate
Condition
2014-01-02
2014-01-03 true
2014-01-03
2014-01-13
false
2014-01-13
2014-01-14 true
Calendar (consists of three-year dates):
CalendarDate IsParental
2014-01-01
2014-01-02
2014-01-03
2014-01-04
2014-01-05
2014-01-06
2014-01-07
2014-01-08
2014-01-09
2014-01-10
I want to update table Calendar by setting IsParental=1
for those dates that are contained in table DateRange between
StartDate and FinishDate AND Condition IS TRUE.
The query without loop should look similar to this but it works wrong:
UPDATE
Calendar
SET IsParental = 1
WHERE
CalendarDate BETWEEN
(SELECT
StartDate
FROM DateRange
WHERE Calendar. CalendarDate = DateRange. StartDate
AND
(SELECT StartDate
FROM DateRange
WHERE Calendar. CalendarDate = DateRange. FinishDate
AND Condition
IS TRUE
Is it possible to do without loop? Thank you for help!
AnastasiaHi
Please post DDL+DML next time :-)
-- This is the DDL! create the database structure
create table DateRange(
StartDate DATE,
FinishDate DATE,
Condition BIT
GO
create table Calendar(
CalendarDate DATE,
IsParental BIT
GO
-- This is the DML (insert some sample data)
insert DateRange
values
('2014-01-02', '2014-01-03', 1),
('2014-01-03', '2014-01-13', 0),
('2014-01-13', '2014-01-14', 1)
GO
insert Calendar(CalendarDate)
values
('2014-01-01'),
('2014-01-02'),
('2014-01-03'),
('2014-01-04'),
('2014-01-05'),
('2014-01-06'),
('2014-01-07'),
('2014-01-08'),
('2014-01-09'),
('2014-01-10')
select * from DateRange
select * from Calendar
GO
-- This is the solution
select CalendarDate
from Calendar C
where EXISTS (
select C.CalendarDate
FROM DateRange D
where C.CalendarDate between D.StartDate and D.FinishDate and D.Condition = 1
UPDATE Calendar
SET IsParental = 1
from Calendar C
where EXISTS (
select C.CalendarDate
FROM DateRange D
where C.CalendarDate between D.StartDate and D.FinishDate and D.Condition = 1
[Personal Site] [Blog] [Facebook] -
Inserting millions of records into new table based on condition
Hi All,
We have a range partitioned table that contains 950,000,000 records (since from 2004) which is again list sub-partitioned on status. Possible values of stauts are 0,1,2,3 and 4.
The requirement is to get all the rows with status 1 and date less than 24-Aug 2011. (Oracle 11g R2).
I trying below code
CREATE TABLE RECONCILIATION_TAB PARALLEL 3 NOLOGGING
AS SELECT /*+ INDEX(CARDS_TAB STATUS_IDX) */ ID,STATUS,DATE_D
FROM CARDS_TAB
WHERE DATE_D < TO_DATE('24-AUG-2011','DD-MON-YYYY')
AND STATUS=1; CARDS_TAB has tow global indexes one on status and another on date_d.
Above query is running for last 28Hrs! Is this the right approach?
With Regards,
Farooq AbdullaYou said the table was range partitioned but you didn't say by what. I'm guessing the table is range partitioned by DATE_D. Is that a valid assumption?
You said that the table was subpartitioned by status. If the table is subpartitioned by status, what do you mean that the data is randomly distributed? Surely it's confined to particular subpartitions, right?
What is the query plan without the hint?
What is the query plan with the hint?
Why do you believe that adding the hint will be beneficial?
Justin -
Select rows based on condition of same row
Hello,
I have the following table structure and rows defind here
http://sqlfiddle.com/#!4/3f474/3
I would like to select rows if PRODUCT_NO is null then I need to select rows which are having IS_PAYABLE='Y'. If PRODUCT_NO is not null
then IS_PAYABLE will be 'N' or IS_PAYABLE will be null.
E.g.
For PRODUCT_REG HPO_FABRIC, one PRODUCT_NO null so I need select that row only, not the other two rows.
I can do
select * from SUPPLIER_DETAILS where IS_PAYABLE='Y', but what if there are many records with PRODUCT_NO having null or not null
How can I do this using sql?This simple query!!!
select *
from supplier_details
where (product_no is null
and is_payable = 'Y')
or (product_no is not null and is_payable is null);
PRODUCT_REG PRODUCT_SUPPLIER_CODE PRODUCT_NO START_DATE END_DATE IS_PAYABLE
HPO_FABRIC JP_008 01-AUG-01 31-AUG-01 Y
HPO_FABRIC JP_008 STGA-FABR1 16-AUG-01 31-AUG-01 --Edited:- Modified Query and Results for 2nd Requirement
Edited by: Purvesh K on Sep 17, 2012 4:55 PM
--Removed NVL
Edited by: Purvesh K on Sep 17, 2012 5:04 PM -
Display input field on selection screen based on condition
Hi,
I have a report with selection with no of input fields and a checkbox .I want to hide few i/p fileds based on checkbox i/p.
If the checkbox = 'X',then only those fields should apper on screen for input.
how do we get this on sel screen.
thanks in advance.Hi,
you can use this code as reference.
Here, depens on check box, in the next screen resepective select options will be displayed.
You can use this logic for your requirement.
REPORT Z50871_SELECTOPS_DYNAMIC.
PARAMETERS : CH_EBELN AS CHECKBOX,
CH_VBELN AS CHECKBOX.
DATA: V_EBELN TYPE EKKO-EBELN,
V_VBELN TYPE VBAK-VBELN.
SELECTION-SCREEN BEGIN OF SCREEN 100.
SELECT-OPTIONS : EBELN FOR V_EBELN MODIF ID G1,
VBELN FOR V_VBELN MODIF ID G2.
SELECTION-SCREEN END OF SCREEN 100 .
AT SELECTION-SCREEN OUTPUT.
IF SY-DYNNR = 100.
IF CH_EBELN = 'X' AND
CH_VBELN = ''.
LOOP AT SCREEN.
IF SCREEN-GROUP1 EQ 'G1'.
SCREEN-ACTIVE = '1'.
ELSE.
SCREEN-ACTIVE = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ELSEIF CH_VBELN = 'X' AND
CH_EBELN = '' .
LOOP AT SCREEN.
IF SCREEN-GROUP1 EQ 'G2'.
SCREEN-ACTIVE = '1'.
ELSE.
SCREEN-ACTIVE = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ELSEIF CH_EBELN = 'X' AND CH_VBELN = 'X'.
LOOP AT SCREEN.
IF SCREEN-GROUP1 EQ 'G1'
OR SCREEN-GROUP1 EQ 'G2' .
SCREEN-ACTIVE = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDIF.
AT SELECTION-SCREEN.
IF SY-DYNNR = 1000.
IF CH_EBELN = 'X' OR CH_VBELN = 'X'.
CALL SELECTION-SCREEN 100.
ELSE.
MESSAGE I000(Z50871MSG) WITH 'Please select atleast one checkbox'.
ENDIF.
ENDIF.
Regards
Sandeep Reddy -
How to disable a field in selection screen based on condition.
Hi,
I have 2 radio buttons- p_normd, p_recov and 2 other controls - like text boxes, say tb1 and tb2. and some mandatory fields below.
If i choose p_normd, i want one control(tb2) to be disabled and if i choose p_recov, i want the other control(tb1) to be disabled(tb2 should be enabled then.)
Currently i am using the following code. The 1'st radiobutton is intially checked. But the problem is when i click on the 2'nd radio button, the other control(tb1) is not getting disabled. When i double click, i get an error telling mandatory field to be filled. Only after the other mandatory fields below are filled, and after i double click on the unchecked radiobutton, the other control gets disabled.
Please suggest what to do..
The current code below:
AT SELECTION-SCREEN OUTPUT. "ON RADIOBUTTON GROUP rg01.
LOOP AT SCREEN.
IF p_normd EQ c_x AND screen-group1 = 'SC2'.
MOVE 0 TO screen-input.
MODIFY SCREEN.
ENDIF.
IF p_recov EQ c_x AND screen-group1 = 'SC1'. "IF screen-name = 'ERDAT-LOW' OR screen-name = 'ERDAT-HIGH'.
MOVE 0 TO screen-input.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
Thanks,
AmmuHi
declare your parameter as below:
parameters: p_x type c radio button group g1 user-command r.
in at selection screen output event .
check for the radio button.
loop at screen.
if screen group is <desired value>
then screen-active = 0 or 1. <do whatever you want to do.>
modify screen.
endloop.
see below the sample code.
<<<<<AT SELECTION SCREEN EVENT>>>>>
AT SELECTION-SCREEN ON BLOCK B1.
IF P_LCOST = C_X.
PERFORM CLEAR_FIELDS. " Clearing fields before loading the screen
CALL SELECTION-SCREEN 100 STARTING AT 20 5.
ELSEIF P_MCOST = C_X.
PERFORM CLEAR_FIELDS1. " Clearing fields before loading the screen
CALL SELECTION-SCREEN 101 STARTING AT 20 5.
ENDIF.
IF SY-SUBRC = 0.
PERFORM VALIDATION. " Validating selection screen input
ELSE.
LEAVE TO TRANSACTION C_TRAN.
ENDIF.
<<<<<<DECLARATION PART>>>>>>
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_LCOST RADIOBUTTON GROUP GI DEFAULT 'X',
P_MCOST RADIOBUTTON GROUP GI.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF SCREEN 100 AS WINDOW TITLE TEXT-002.
SELECTION-SCREEN BEGIN OF BLOCK B2.
PARAMETERS: P_COAREA TYPE CSKS-KOKRS OBLIGATORY, " controlling area
P_FYR TYPE COEP-GJAHR OBLIGATORY, " fiscal year
P_PERIOD TYPE COEP-PERIO OBLIGATORY. " fiscal period
SELECT-OPTIONS: S_CCNTR FOR V_KOSTL OBLIGATORY, " Cost Center
S_COELM FOR V_KSTAR MODIF ID M1, " Cost element
S_PDATE FOR V_BUDAT OBLIGATORY. " posting date.
SELECTION-SCREEN END OF BLOCK B2.
SELECTION-SCREEN END OF SCREEN 100.
SELECTION-SCREEN BEGIN OF SCREEN 101 AS WINDOW TITLE TEXT-003.
SELECTION-SCREEN BEGIN OF BLOCK B3.
PARAMETERS: P_CCODE TYPE T001-BUKRS OBLIGATORY, " Company Code
P_FYEAR TYPE COEP-GJAHR OBLIGATORY. " fiscal year
SELECT-OPTIONS: S_GLACC FOR V_HKONT OBLIGATORY, " G/L Account
S_PCNTR FOR V_PRCTR MODIF ID M2, " Profit Center
S_PODATE FOR V_BUDAT OBLIGATORY. " posting date.
SELECTION-SCREEN END OF BLOCK B3.
SELECTION-SCREEN END OF SCREEN 101.
thanks
LG
Edited by: LalitG on Apr 13, 2011 1:38 PM -
Filtering table entries based on conditions
Hi there,
I would like to filter out some of the entries of the tables based on condition, how can I do that? I"m currently working on ICWC.
Thanks,
JaredHI Jared81,
Use <b>SELECT</b> Statement..
SELECT SINGLE zzemp_type
FROM pa9000
INTO l_employee_type
WHERE pernr = l_pernr
AND begda LE sy-datum
AND endda GE sy-datum.
IF sy-subrc = 0 .
endif.
or use
<b>READ</b> table statement
READ TABLE i_ltype INTO w_ltype WITH KEY leave_code = g_leavetype_selected.
IF sy-subrc = 0.
g_leave_cat = w_ltype-leave_cat.
g_leave_type = w_ltype-leave_code.
Append w_ltype to i_ltype.
ENDIF.
Rgds,
Jothi.
*<u>reward all helpful answers.</u> -
Show or Hide empty table based on If condition
I want to show or hide empty table based on condition. The table will be empty with 5 rows,2 cols and should display if <?Rout_Information1_id1?> is blank or null or when XML field is not present. Actually the JDEdwards report will generate XML file. In the XML file if <?Rout_Information1_id1?> is present it will have definitely value like 'PULL' or 'Cut' otherwise sometimes XML field itself will not be present. Need to display the empty table when the <?Rout_Information1_id1?> is not present. I am trying to do as below but the table is not displayed. Can someone tell me how to resolve this.
<?if:Rout_Information1_id1=' '?>
5 rows,2 cols table
<?end if?>
Thanks,
Vijay VattiproluOk. I used the below syntax from other post and it resolved displaying empty table issue.
<?if:not(XML_TAG_NAME)?>
<?end if?>
Thanks,
Vijay -
Database table for Pricing Condition
Hi,
Can some one pls help me in finding the database table where I can fetch all the Access Sequences ('A' tables) associated for a particular Pricing Condition.
Regards,
Pankaj.Hi,
Goto T685 and fetch KOZGF for your condition type(KSCHL) and KVEWE = 'A'.
Goto T682I and fetch KOTABNR vaues for all entries in above selected table based on KVEWE = 'A', KAPPL and KOZGF.
Prefix 'A' to above selected KOTABNR values to get the 'A' tables.
Hope this helps you!!!
Regards,
Ganga -
How can i update rows in a table based on a match from a select query
Hello
How can i update rows in a table based on a match from a select query fron two other tables with a update using sqlplus ?
Thanks Glenn
table1
attribute1 varchar2 (10)
attribute2 varchar2 (10)
processed varchar2 (10)
table2
attribute1 varchar2 (10)
table3
attribute2 varchar2 (10)
An example:
set table1.processed = "Y"
where (table1.attribute1 = table2.attribute1)
and (table1.attribute2 = table3.attribute2)Hi,
Etbin wrote:
Hi, Frank
taking nulls into account, what if some attributes are null ;) then the query should look like
NOT TESTED !
update table1 t1
set processed = 'Y'
where exists(select null
from table2
where lnnvl(attribute1 != t1.attribute1)
and exists(select null
from table3
where lnnvl(attribute2 != t1.attribute2)
and processed != 'Y'Regards
EtbinYes, you could do that. OP specifically requested something else:
wgdoig wrote:
set table1.processed = "Y"
where (table1.attribute1 = table2.attribute1)
and (table1.attribute2 = table3.attribute2)This WHERE clause won't be TRUE if any of the 4 attribute columns are NULL. It's debatable about what should be done when those columns are NULL.
But there is no argument about what needs to be done when processed is NULL.
OP didn't specifically say that the UPDATEshould or shouldn't be done on rows where processed was already 'Y'. You (quite rightly) introduced a condition that would prevent redo from being generated and triggers from firing unnecessarily; I'm just saying that we have to be careful that the same condition doesn't keep the row from being UPDATEd when it is necessary.
Maybe you are looking for
-
Skydrive.exe crashes on Windows 8.1 Pro RTM
I'm trying to get Skydrive working on a fresh install of Windows 8.1 Pro RTM. When I go to Skydrive (show my files in skydrive) via the "metro" app, the view is empty. When I look at the skydrive folder in explorer.exe, it's also empty. I went to
-
Calling one Web-Dynpro program into Another
Hi All, I'm currently working on a Web-Dynpro program in which I am display 3 tabs(Using TabStrip) and in each tab I have a ViewContainer. I want to be able to execute other Web-Dynpro programs within the Viewcontainers of the Tabs. If the End-Use
-
Hi all, Can anyone tell me the link of book published by Oracle i.e. Oracle 8i slides. I have copied that slides from net sometimes ago but i forget the link now. plz help me in this regard.or if someone has good link of pl/sql , plz do tell me . i w
-
Use destination table values in source to get data
I have a requirement to get data from source table to destination table. Source is oracle say tablename - 'orasource' fielnames=empid, empname and destination table name is 'sqldest' and field name are empid, empname. My requirement - I want to fetch
-
Apache serving bin files instead of default index
I was trying to set up Postfix and Mailman today, and I seem to have broken Apache in the process. I installed Postfix and Mailman as in the wiki, but after configuration of Mailman I tried accessing the web server, and the server gave me a bin file