Auto-increment column increase performance in this case ?
hi.
i have the following facts to construct a set of tables.
1. A Lecturer has an ID, Name and Date Joined
2. A Classroom has an ID, Number Of Students
3. A Lecturer can Teach in Many Classes
4. A Class Can be lectured by Many Lecturers
5. Each Lecture Date should be Stored in the DB.
considering those facts, the following schema can be derived
Lecturer
(Lecturer_ID (PK), Lecturer_name, Date_Joined)
Classroom
(Classroom_ID (PK), NumOfStudents)
Class_Lectures
(Classroom_ID, Lecturer_ID (Composte PK), LectureDate)
this is the normal practice we do.
but what if the 3rd Table is constructed as follows ?
Class_Lectures
(LectureSeriesID (Auto-Increment, PK), Classroom_ID, Lecturer_ID (Composte Unique Key), LectureDate)
if the 3rd Table is created as above, will there be any performance differences ? will the performance improve or get reduced ? any advantages / disadvantages of having that structure ?
please do advise my any further best practices as well.
Thanks and Regards
http://technet.oracle.com:89/ubb/Forum88/HTML/000944.html
null
Similar Messages
-
Primary key violation exception in auto increment column
Hi All,
I am facing one issue in Multi threaded environment.
I am getting Primary key violation exception in auto increment column. I have a table and the primary key is the auto increment column, and I have a trigger which is populating this column.
5 threads are running and inserting the data in the table and throwing Primary key violation exception randomly.
create table example (
id number not null,
name varchar2(30)
alter table example
add constraint PK1example primary key (id);
create sequence example_id_seq start with 1 increment by 1;
create or replace trigger example_insert
before insert on example
for each row
begin
select example_id_seq.nextval into :new.id from dual;
end;
Any idea how to handle auto increment column(trigger) in Multi threaded environment??
Thanks,user13566109 wrote:
Thanks All,
Problem was in approach; removed the trigger and placed a seq.nextval in insert query. It has resolved the issue.I very much suspect that that was not the issue.
The trigger would execute for each insertion and the nextval would have been unique for each insertion (that's how sequences work in oracle), so that wouldn't have been causing duplicates.
I suspect, more likely, that you had some other code somewhere that was using another sequence or some other method of generating the keys that was also inserting into the same table, so there was a conflict in the sources of the sequences being generated.
The way you showed you had coded above, was a perfectly normal way to assign primary keys from a sequence, and is not a problem in a multi user/threaded environment. -
Insert data into Access with Auto-Increment column
Is there anyone out there that has come across this problem I am experiencing?
I have a form I'm trying to submit to an Access DB that has an Auto-Incremented Table Column. I have followed Stefan Cameron's instructions to a "T" on his blog page here:
http://forms.stefcameron.com/2006/09/18/connecting-a-form-to-a-database/
but I keep getting the following error"
GeneralError: Operation failed.
XFAObject.open:10:XFA:form1[0]:mysubform[0]:myEIFform[0]:overflowLeader[0]:Submit[0]:click
open operation failed. [Microsoft][ODBC Microsoft Access Driver] Number of query values and destination fields are not the same.
My OLEDB Connection Record Source is the SQL Query which reads: SELECT FedTaxID, LegalID FROM dbtest; My simple test DB is Access and its only 3 columns; dbID, FedTaxID, LegalID. dbID is the Auto-Incremented Column.
If I remove the Auto column from my DB table it inserts just fine but I get this error:
GeneralError: Operation failed.
XFAObject.open:10:XFA:form1[0]:mysubform[0]:myEIFform[0]:overflowLeader[0]:Submit[0]:click
ado2xfa operation failed. Item cannot be found in the collection corresponding to the requested name or ordinal.
I've looked over alot of the blogs and other help forums and there's info on Selects, I don't find much on Inserts.
Can anyone direct me in the right direction? Thank you.First, please pay attention to the forum in which you are posting. This particular post would be more appropriate to tsql rather than datamining. Second, what specific problem are you trying to solve. The code you posted appears to be
correct. I will say that your DataTable will likely be a source of future problems if it contains only the 2 columns. -
Auto Increment Columns Are Not Recognized
Hi
I am using postgre 8 and there are some auto incremented columns
in some tables. The problem is when I create the DataProvider from a table or a view those columns are not recognized by the IDE. I realized this while running the generated SQL. Is this a known issue ? Finally is there a work around this.
Thanks
Mehmet AtlihanHi Mehmet,
Creator requires a JDBC 3 compliant driver and PostgreSQL database driver is not fully compliant. Please take a look at the below thread which discusses about the issue:
http://swforum.sun.com/jive/thread.jspa?forumID=123&threadID=53064
Cheers
Giri -
I have a very simple table used for debugging:
CREATE TABLE APPS.XX_DEBUG_TMP
TEMP_VALUE VARCHAR2(255 BYTE),
TEMP_DATE DATE
)Then I can use it to store values as my pl/sql is processed - e.g.:
INSERT INTO XX_DEBUG_TMP (TEMP_VALUE,TEMP_DATE) VALUES ('line 740 l_username value check:' || l_username,SYSDATE); COMMIT;Trouble is that if a load of debug statements get processed with the same timestamp, I can't see which came first.
Can I modify my table creation SQL to include an ID column which just increments for each row that is added to the table?
I'm familiar with how to do it in MySQL (sorry - I know this is an Oracle forum - but am just putting this here to show what I mean):
CREATE TABLE `XX_DEBUG_TMP` (
`TEMP_ID` MEDIUMINT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`TEMP_VALUE` VARCHAR( 255 ) NOT NULL ,
`TEMP_DATE` DATETIME NOT NULL
) ENGINE = MYISAM ;Is it that simple with Oracle? Probably not!
Any advice much appreciated.
ThanksThere is no auto increment column in Oracle. However, you can create a sequence.
CREATE TABLE APPS.XX_DEBUG_TMP
TEMP_ID NUMBER NOT NULL PRIMARY KEY,
TEMP_VALUE VARCHAR2(255 BYTE),
TEMP_DATE DATE
CREATE SEQUENCE APPS.XX_DEBUG_TMP_SEQ;Then in your insert statement do this:
INSERT INTO XX_DEBUG_TMP (TEMP_ID,TEMP_VALUE,TEMP_DATE) VALUES (APPS.XX_DEBUG_TMP_SEQ.NEXTVAL,'line 740 l_username value check:' || l_username,SYSDATE); Another possible solution to your problem would be to use a TIMESTAMP data type instead of a DATE data type. It has fractional second resolution (up to 9 places I believe). -
What does the setting "auto increment column templates"
I have noticed that there is now a setting "auto increment column templates" but I cannot find out what this setting does.
There are no sequences generated nor triggers.
Version 3.0.
Thanks, JoepThere are no sequences generated nor triggersYou need to set column as "auto increment". Then sequence and trigger will be generated for Oracle.
You can set template for generated sequences and triggers and can override these settings at column level setting explicitly the name of sequence and trigger.
The sequence and related trigger are not created as objects in physical model, however if there are such objects defined then definition from physical model is used for generated DDL.
Philip -
Add auto increment column to trigger
I want to add auto increment column to after insert trigger. so how can I do that?
this is my query.
Create Sequence Up_Seq
Start With 1
Increment By 1
nomaxvalue;
Create Or Replace Trigger Upf_Trig
After Insert On members
Referencing New As New
For Each Row
Begin
Insert Into Upf_Kgl(Member_Id,Mem_Name,Nic,Division)
Values (Up_Seq.Nextval
*,:New.Mem_Name*
*,:New.Nic*
*,:New.Division);*
end upf_trig;
It's worked. but when inserting values to members table, there is an error.
this is the error
Error starting at line 21 in command:
Insert Into Members(Mem_Name,Nic,Full_Name,Age,Sex,Mar_State,Birth_Date,Division,Religon)
Values(
*'IA Nawagamuwa'*
*,'883324356V'*
*,'Isuru Aravinda Nawagamuwa'*
*,'22'*
*,'Male'*
*,'Single'*
*,'21-Dec-88'*
*,'kgl'*
*,'Buddhist')*
Error report:
SQL Error: ORA-00001: unique constraint (SYSTEM.SYS_C004077) violated
ORA-06512: at "SYSTEM.UPF_TRIG", line 2
ORA-04088: error during execution of trigger 'SYSTEM.UPF_TRIG'
*00001. 00000 - "unique constraint (%s.%s) violated"*
**Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.*
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
**Action: Either remove the unique restriction or do not insert the key.* -
Can we specify prefix for an auto increment column
Hi all,
I want to create an auto increment column in oracle using oracle sequences.
But i want to specify a prefix for the value appearing after increment.
Prefix will remain constant.
If we can how can i do that.
And one more thing is i will call the sequence using a trigger only for a specified condition.My doubt here is can i allow nulls for auto incrementing column
With Regards<s></s>
-- Samples.
create table tab1
(id varchar2(6) constraint p_tab1 primary key
,data varchar2(255)
create sequence seq_tab1;
create or replace
trigger trg_tab1
before insert on tab1
for each row
declare
p_prefix varchar2(2) := 'AA';
begin
if (:new.id is null) then
select p_prefix||to_char(seq_tab1.nextval,'fm0009') into :new.id from dual;
end if;
end
-- Test
SQL> insert into tab1(data) values('abc');
1 row created.
SQL> insert into tab1(id,data) values('BB9999','xyz');
1 row created.
SQL> select * from tab1;
ID
DATA
AA0001
abc
BB9999
xyz -
How can i create an auto increment column
Hello Everyone
We are working on an EAM package which has an auto number facility but that is not meeting our requirement because some 10s and 100s of numbers keep on jumping based on the number of records the child table has.Means every record in my parent table will have some child records in another table which we call it a child table.The number of numbers that will be jumped each time will depend on the number of child records it has. Now we want to create a new column and generate a sequential unique number in my parent table with out linking it to its child table and use this number as a reference number. And we cant do that through our package customization. Can any one guide us if we can meet our requirement through oracle triggers or so.
Thanks and RegardsHi,
For "Auto-Increment" functionality - you can use a combination of a sequence and a trigger like so:
create table roles ( role_id INT
, role_name VARCHAR2(30) NOT NULL
, creation_date DATE DEFAULT SYSDATE NOT NULL
, role_description VARCHAR2(255)
, CONSTRAINT roles_pk PRIMARY KEY (role_id)
, CONSTRAINT roles_uk1 UNIQUE (role_name)
create sequence role_id_seq
start with 1
increment by 1
nocache;
CREATE OR REPLACE TRIGGER roles_pk_trig
BEFORE
insert on roles
for each row
begin
IF :new.role_id IS NULL THEN
SELECT role_id_seq.NEXTVAL
INTO :new.role_id
FROM dual;
END IF;
end;
/Now any insert which leaves the "ROLE_ID" column NULL will have an auto-incremented value put in for that column. This is similar to an "Autonumber" column in Access.
Hope this helps...
Take care. -
How can I automatically increment an auto incremented column?
Hello!
I have a table with an auto incremented "id" field.
It looks like this:
id (PK, auto_increment) name address phone
I would like to make an insertion like:
INSERT INTO Person (name, address, phone) VALUES (?,?,?)
...but it says that all fields have to be used.
I get
java.sql.SQLException: Field 'id' doesn't have a default value
How can I bypass this?
I have looked at [this example|http://blog.taragana.com/index.php/archive/java-how-to-get-auto-increment-values-after-sql-insert/] , but it didn´t work for me, it still says the "id" column has not a default value:Sorry, it is a MySQL database.
The table consists of 4 columns:
id (PK, auto_increment)
name (Varchar)
address (Varchar)
phone (Varchar)
If I use PHPMyAdmin to insert a new row, then this query works:
INSERT INTO `mydb`.`person` (
`id` ,
`name` ,
`address` ,
`phone`
VALUES (
NULL , 'Test', 'Roxxor', 'Europe', '12345'
);{code}I tested to use the method setNull() on the first column in the preparedStatement but it didn´t work.
Do you need more info from me to be able to help me?
I have tried this (but got the error that the "Field 'id' doesn't have a default value"):
[code]con.setAutoCommit(true);
String query = "INSERT INTO person(id, name, address, phone) VALUES (?, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setNull(1, java.sql.Types.NULL);
stmt.setString(2, name);
stmt.setString(3, address);
stmt.setString(4, phone);
stmt.executeUpdate();
stmt.close();[/code] -
Auto Increment column in database table
Hello experts, I am using oracle 11g database at windows 7.I have to create a sequence object and a table with an auto increment ID column.For this I have created a trigger before insert to select next sequence from a sequence object. It works well but Now I have the current sequence is 7 and there are 6 records inserted in table. Now I delete two records.Thus I have only 5 records in table but my current sequence is still 7.So if I put it in id column then a new record will be inserted in table with 7 ID number after 5th ID number.I want this record should be inserted with 6 Id number. For this I tried to not use sequence object.I tried a pl/sql trigger before insert, which will count the all records in table and after increment i put it in ID column to insertion....Is this a professional way..? thank You regards aaditya
979801 wrote:
Hello experts, I am using oracle 11g database at windows 7.I have to create a sequence object and a table with an auto increment ID column.For this I have created a trigger before insert to select next sequence from a sequence object. It works well but Now I have the current sequence is 7 and there are 6 records inserted in table. Now I delete two records.Thus I have only 5 records in table but my current sequence is still 7.So if I put it in id column then a new record will be inserted in table with 7 ID number after 5th ID number.I want this record should be inserted with 6 Id number. For this I tried to not use sequence object.I tried a pl/sql trigger before insert, which will count the all records in table and after increment i put it in ID column to insertion....Is this a professional way..? thank You regards aaditya
Sequences only guarantee unique numbers. You cannot (and should not) attempt to create gapless sesquences. That's not how oracle works and will not scale to a multi user application.
Imagine two people try to insert records at the same time (and have yet to commit), the trigger you create will count the number of records and determine there are 5 records, so assign the next number of 6, for both people who are inserting records. The first person to commit will get their data saved, and assuming you have a unique constriaint on that id, the second person will raise a duplicate key on insert or suchlike error.
Gapless sequential numbers are not appropriate to multi-user environments. Such requirements are often given by managers or business people who do not understand the technology.
Think of it in terms of a real world office, but with people using a paper system instead of a computer. The only way you can try to guarantee people get the next number and also re-use numbers that have been deleted is to have a single place where each person in the office goes to, to fetch the next number, and they have to queue up behind each other to get the next one off the list. But if someone has removed an old record, they've got to wait in the same queue to go and put that number back in the pot for someone else to use. It just doesn't work, even in a manual system. Yes, people can guarantee that they're only getting unique numbers that nobody else is using, but they cannot guarantee that they are reusing and filling gaps etc. It's an unrealistic expectation. -
Identifying auto-increment columns
Hi,
I am developing a database management package for mysql. I want to be able to provide a sql dump facility, which will produce the sql code for creating a table and populating it.
I do not seem to be able to find a function for identifying if a field is auto-incrementing?
The only thing that I could find it the DatabaseMetaData.getTypeInfo() will let you know if a field can used for an auto-increment value, not if it is actually auto-incrementing.
Please help!If you do a query of this table and then have a look at
the ResultSetMetaData you can use the methode:
boolean isAutoIncrement(int column)
Indicates whether the designated column is
automatically numbered, thus read-only.
Or you can use the MYSQL-command :
show columns from table to get all the info of each
column.
mysql> show columns from table;
-----------------------------------------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
-----------------------------------------------------------------------------+
where the Extra column contains 'auto_increment ' if it is...
...what in fact is not that DB-independent.....
Regards
Fredy -
Plz increase performance of this report
hi all
i want to know how can i improve the performance of my report.
the code is given below and it takes so much time on production even for single record
plz help
HERE COMES THE CODE
*& Report ZGRSTATUS
REPORT ZGRSTATUS.
TYPE-POOLS slis.
TABLES: mseg, qamb, mkpf, rseg.
DATA : BEGIN OF itab OCCURS 0,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
uom LIKE mseg-erfme,
matnr LIKE mseg-matnr,
recqty LIKE mseg-erfmg,
qcins LIKE mseg-insmk, "INSPECTION SIGN
ebeln LIKE mseg-ebeln,
ebelp LIKE mseg-ebelp,
lifnr LIKE mseg-lifnr,
budat LIKE mkpf-budat,
txz01 LIKE ekpo-txz01,
name1 LIKE lfa1-name1,
accqty LIKE mseg-erfmg,
rejqty LIKE mseg-erfmg,
belnr LIKE rseg-belnr,
dqty LIKE mseg-menge,
cqty LIKE mseg-menge,
qcdat like mkpf-budat,
miro_budat like rbkp-budat,
accuom like mseg-erfme,
rejuom like mseg-erfme,
qcstat like mseg-insmk,
acstat(1) type c,
crnote(1) type c,
END OF itab.
DATA : BEGIN OF itab1 OCCURS 0,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
mjahr LIKE mseg-mjahr,
prueflos like qamb-prueflos,
END OF itab1.
DATA: BEGIN OF imiro OCCURS 0,
belnr LIKE rseg-belnr,
lfbnr LIKE rseg-lfbnr, "DOCMENT NO SAME AS MBLRN
shkzg LIKE rseg-shkzg, "DEBIT CREDIT SIGN
menge LIKE rseg-menge,
ebeln LIKE rseg-ebeln,
ebelp LIKE rseg-ebelp,
budat LIKE rbkp-budat,
END OF imiro.
data: begin of iins occurs 0, "NEW INTERNAL TABLE DECLARED for inspection lot numbers
mblnr like mseg-mblnr,
zeile like mseg-zeile,
prueflos like qamb-prueflos,
mjahr like qamb-mjahr,
end of iins.
****************************CODE FOR SELECTION SCREEN****************************
selection-screen begin of block par1 WITH FRAME TITLE TEXT-001.
PARAMETERS : plant LIKE mseg-werks OBLIGATORY DEFAULT 'MFPL'.
PARAMETERS: year LIKE mseg-mjahr OBLIGATORY DEFAULT '2007'.
SELECT-OPTIONS : grno FOR mseg-mblnr,
grdate FOR mkpf-budat,
vendor FOR mseg-lifnr,
item for mseg-matnr.
SELECTION-SCREEN END OF BLOCK par1.
***************************END OF CODE FOR SELECTION SCREEN**********************
*************************FETCHING OF GR INFORMATION FROM MSEG AND MKPF*************************
SELECT amblnr zeile aerfme amatnr aerfmg ainsmk aebeln aebelp alifnr bbudat ctxz01 d~name1
FROM mseg AS a
INNER JOIN mkpf AS b ON amblnr = bmblnr AND amjahr = bmjahr
INNER JOIN ekpo AS c ON aebeln = cebeln AND aebelp = cebelp
INNER JOIN lfa1 as d ON dlifnr = alifnr
INTO TABLE itab
WHERE awerks = plant AND amblnr IN grno AND bwart = '101' AND a~mjahr = year
AND btcode2 = 'MIGO_GR' AND bbudat IN grdate AND alifnr IN vendor and amatnr IN item.
*************************END OF RETERIEVEL***************************************
if sy-subrc <> 0.
Message 'NO RECORD FOUND' type 'E'.
endif.
*******************************SELECTING THE INSPECTED DOC NUMBERS AND CORROSPONDING INSPECTION LOT********************************
select mblnr zeile mjahr prueflos
from qamb into table itab1 for all entries in itab where mblnr = itab-mblnr and zeile = itab-zeile.
**********************************END OF SELECTING THE INSPECTED DOC. NUMBERS & INSPECTION LOTS************************************
**************************SELECTING THE DOC NO FOR ACCEPTED AND REJECTED QTY ACCORDING TO INSPECTION LOT***************************
select mblnr zeile prueflos mjahr into table iins from qamb
for all entries in itab1 where prueflos = itab1-prueflos and mblnr <> itab1-mblnr.
**************************END OF SELECTING ACCEPTED AND REJECTED QTY DOCUMENTS****************************************************
**********************************SELECTING THE DEBIT AND CREDIT QTY FOR THE MIRO TCODE*******************************************
SELECT abelnr lfbnr shkzg menge ebeln ebelp bbudat INTO table imiro
FROM rseg as a
inner join rbkp as b on abelnr = bbelnr
for all entries in itab where a~lfbnr = itab-mblnr.
DATA : v_qcidoc LIKE qamb-prueflos,
v_qcdoc LIKE mseg-mblnr,
v_qcdoc1 LIKE mseg-zeile,
v_qty LIKE mseg-menge,
v_bwart LIKE mseg-bwart,
v_name1 LIKE lfa1-name1,
v_budat like mkpf-budat,
v_newrejqty like mseg-menge,
v_newaccqty like mseg-menge,
CMPACCQTY LIKE MSEG-MENGE,
CMPREJQTY LIKE MSEG-MENGE,
aa TYPE c.
data: begin of iartab occurs 0,
mblnr like mseg-mblnr,
bwart like mseg-bwart,
qty like mseg-menge,
erfme like mseg-erfme,
zeile like mseg-zeile,
budat like mkpf-budat,
end of iartab.
clear iartab.
refresh iartab.
****************************************table for accept and reject qty************************************
SELECT a~mblnr bwart erfmg erfme zeile budat into table iartab
FROM mseg as a
inner join mkpf as b on amblnr = bmblnr
for all entries in iins
WHERE amblnr = iins-mblnr AND azeile = iins-zeile AND xauto <> 'X' AND a~mjahr = iins-mjahr.
******************************************END OF ACCEPT AND REJECTED QTY.***********************************
LOOP AT itab.
clear: itab-accuom, itab-rejuom.
SELECT SINGLE name1 FROM lfa1 INTO itab-name1 WHERE lifnr = itab-lifnr.
**********************GETTING THE ACCEPTED AND REJECTED QTY FROM MSEG FOR ALL RECORDS OF ITAB*********************
IF itab-qcins = 'X'.
clear v_qcidoc.
clear: v_bwart, v_qty, v_budat.
read table itab1 with key mblnr = itab-mblnr zeile = itab-zeile.
if sy-subrc = 0.
v_qcidoc = itab1-prueflos.
endif.
LOOP AT itab1 where prueflos = v_qcidoc and mblnr <> itab-mblnr .
LOOP AT iins where prueflos = v_qcidoc. " and mblnr <> itab-mblnr .
v_qty = 0.
SELECT single bwart erfmg budat
INTO (v_bwart, v_qty, v_budat)
FROM mseg as a
inner join mkpf as b on amblnr = bmblnr
WHERE amblnr = itab1-mblnr AND azeile = itab1-zeile AND xauto <> 'X' AND a~mjahr = itab1-mjahr.
WHERE amblnr = iins-mblnr AND azeile = iins-zeile AND xauto <> 'X' AND a~mjahr = iins-mjahr.
read table iartab with key mblnr = iins-mblnr zeile = iins-zeile.
if sy-subrc = 0.
v_bwart = iartab-bwart.
v_qty = iartab-qty.
v_budat = iartab-budat.
endif.
IF v_bwart = '321'.
v_newaccqty = v_newaccqty + v_qty.
itab-accqty = v_newaccqty.
itab-qcdat = v_budat.
itab-accuom = iartab-erfme.
ELSEIF v_bwart = '122'.
itab-qcdat = v_budat.
v_newrejqty = v_newrejqty + v_qty.
itab-rejqty = v_newrejqty.
itab-rejuom = iartab-erfme.
ENDIF.
ENDLOOP. "*********END OF LOOP FOR ITAB1**************
clear: v_newaccqty, v_newrejqty.
ENDIF. "**********END OF MAIN ENDIF***********************
*****************END OF CODE FOR ACCEPTED AND REJECTED QTY************************************
****************************GETTING DEBIT AND CREDIT QTY******************************************
LOOP AT imiro WHERE lfbnr = itab-mblnr AND ebeln = itab-ebeln AND ebelp = itab-ebelp.
ITAB-MIRO_BUDAT = IMIRO-BUDAT.
itab-belnr = imiro-belnr.
IF imiro-shkzg = 'S'.
itab-dqty = imiro-menge.
ELSEIF imiro-shkzg = 'H'.
itab-cqty = imiro-menge.
ENDIF.
ENDLOOP.
*****************************END OF CODE FOR DEBIT AND CREDIT QTY*******************************
data v_sumqty like mseg-menge.
CLEAR V_SUMQTY.
if itab-qcins = 'X'.
clear: cmpaccqty, cmprejqty.
cmpaccqty = itab-accqty.
cmprejqty = itab-rejqty.
IF ITAB-UOM <> ITAB-ACCUOM AND ITAB-ACCUOM <> SPACE.
CALL FUNCTION 'ZCONVERT_UOM_QTY'
EXPORTING
P_FR_UOM = ITAB-UOM
P_TO_UOM = ITAB-ACCUOM
P_QTY = ITAB-ACCQTY
IMPORTING
P_RETVAL = CMPACCQTY.
ELSEIF ITAB-UOM <> ITAB-REJUOM AND ITAB-REJUOM <> SPACE.
CALL FUNCTION 'ZCONVERT_UOM_QTY'
EXPORTING
P_FR_UOM = ITAB-UOM
P_TO_UOM = ITAB-REJUOM
P_QTY = ITAB-REJQTY
IMPORTING
P_RETVAL = CMPREJQTY.
ENDIF.
v_sumqty = CMPACCQTY + CMPREJQTY.
if ( v_sumqty = itab-recqty ).
itab-qcstat = 'C'.
modify itab.
ELSE.
ITAB-QCSTAT = 'P'.
endif.
ELSE.
ITAB-QCSTAT = 'C'.
endif.
IF ITAB-QCSTAT = 'C'.
IF ITAB-DQTY = ITAB-RECQTY.
ITAB-ACSTAT = 'C'.
ELSE.
ITAB-ACSTAT = 'P'.
ENDIF.
ELSEIF ITAB-QCSTAT = 'P'.
IF ITAB-RECQTY = ITAB-DQTY.
ITAB-ACSTAT = 'O'.
ENDIF.
ENDIF.
IF ITAB-REJQTY > 0.
IF ITAB-ACSTAT = 'C' AND ITAB-REJQTY > ITAB-CQTY.
ITAB-CRNOTE = 'P'.
ELSEIF ITAB-ACSTAT = 'C' AND ITAB-REJQTY < ITAB-CQTY.
ITAB-CRNOTE = 'W'.
ELSEIF ITAB-ACSTAT = 'C' AND ITAB-REJQTY = ITAB-CQTY.
ITAB-CRNOTE = 'C'.
ENDIF.
ELSE.
ITAB-CRNOTE = 'N'.
ENDIF.
MODIFY itab.
ENDLOOP. "*********************************************"END OF MAINT LOOP FOR ITAB.***********************
DATA: it_fieldcat TYPE slis_t_fieldcat_alv,
wa_fieldcat TYPE slis_fieldcat_alv,
wa_layout TYPE slis_layout_alv.
PERFORM f_layout.
PERFORM f_fieldcat.
PERFORM display.
*& Form F_LAYOUT
text
FORM f_layout.
wa_layout-colwidth_optimize = 'X'.
wa_layout-no_subchoice = 'X'.
wa_layout-zebra = 'X'.
ENDFORM. "F_LAYOUT
*& Form F_FIELDCAT
text
FORM f_fieldcat.
DATA wa_col TYPE i VALUE 1.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'GR. NO'.
wa_fieldcat-fieldname = 'MBLNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'GR DATE'.
wa_fieldcat-fieldname = 'BUDAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'PO NO'.
wa_fieldcat-fieldname = 'EBELN'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'PARTY ID'.
wa_fieldcat-fieldname = 'LIFNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'PARTY NAME'.
wa_fieldcat-fieldname = 'NAME1'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-outputlen = '18'.
wa_fieldcat-seltext_l = 'ITEM ID'.
wa_fieldcat-fieldname = 'MATNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'DESCRIPTION'.
wa_fieldcat-fieldname = 'TXZ01'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'UOM'.
wa_fieldcat-fieldname = 'UOM'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'INS REQ'.
wa_fieldcat-fieldname = 'QCINS'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'GR QTY'.
wa_fieldcat-fieldname = 'RECQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'QC DATE'.
wa_fieldcat-fieldname = 'QCDAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'ACC QTY'.
wa_fieldcat-fieldname = 'ACCQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'ACC UOM'.
wa_fieldcat-fieldname = 'ACCUOM'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'REJ QTY'.
wa_fieldcat-fieldname = 'REJQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'REJ UOM'.
wa_fieldcat-fieldname = 'REJUOM'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'MIRO NO'.
wa_fieldcat-fieldname = 'BELNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'MIRO DATE'.
wa_fieldcat-fieldname = 'MIRO_BUDAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'DB.QTY'.
wa_fieldcat-fieldname = 'DQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'CR.QTY'.
wa_fieldcat-fieldname = 'CQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'QC STATUS'.
wa_fieldcat-fieldname = 'QCSTAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat to it_fieldcat.
clear wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'A/C STATUS'.
wa_fieldcat-fieldname = 'ACSTAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat to it_fieldcat.
clear wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'CR NOTE STATUS'.
wa_fieldcat-fieldname = 'CRNOTE'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat to it_fieldcat.
clear wa_fieldcat.
ENDFORM. "F_FIELDCAT
*& Form DISPLAY
text
FORM display.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
is_layout = wa_layout
I_CALLBACK_USER_COMMAND = 'HANDLE_USER_COMMAND'
it_fieldcat = it_fieldcat
TABLES
t_outtab = itab.
ENDFORM. "DISPLAY
FORM HANDLE_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&IC1'.
clear itab-ebeln.
IF RS_SELFIELD-FIELDNAME = 'EBELN'.
READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
SET PARAMETER ID 'BES' FIELD ITAB-EBELN.
call transaction 'ME23N' AND SKIP FIRST SCREEN.
CLEAR RS_SELFIELD.
ELSEIF RS_SELFIELD-FIELDNAME = 'MBLNR'.
READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
SET PARAMETER ID 'MBN' FIELD ITAB-MBLNR.
SET PARAMETER ID 'MJA' FIELD year.
call transaction 'MIGO' AND SKIP FIRST SCREEN.
CLEAR RS_SELFIELD.
ENDIF.
ENDCASE.
ENDFORM. "HANDLE_USER_COMMANDWays of Performance Tuning
1. Selection Criteria
2. Select Statements
Select Queries
SQL Interface
Aggregate Functions
For all Entries
Select Over more than one internal table
Selection Criteria
1. Restrict the data to the selection criteria itself, rather than filtering it out using the ABAP code using CHECK statement.
2. Select with selection list.
SELECT * FROM SBOOK INTO SBOOK_WA.
CHECK: SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
ENDSELECT.
The above code can be much more optimized by the code written below which avoids CHECK, selects with selection list
SELECT CARRID CONNID FLDATE BOOKID FROM SBOOK INTO TABLE T_SBOOK
WHERE SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
Select Statements Select Queries
1. Avoid nested selects
SELECT * FROM EKKO INTO EKKO_WA.
SELECT * FROM EKAN INTO EKAN_WA
WHERE EBELN = EKKO_WA-EBELN.
ENDSELECT.
ENDSELECT.
The above code can be much more optimized by the code written below.
SELECT PF1 PF2 FF3 FF4 INTO TABLE ITAB
FROM EKKO AS P INNER JOIN EKAN AS F
ON PEBELN = FEBELN.
Note: A simple SELECT loop is a single database access whose result is passed to the ABAP program line by line. Nested SELECT loops mean that the number of accesses in the inner loop is multiplied by the number of accesses in the outer loop. One should therefore use nested SELECT loops only if the selection in the outer loop contains very few lines or the outer loop is a SELECT SINGLE statement.
2. Select all the records in a single shot using into table clause of select statement rather than to use Append statements.
SELECT * FROM SBOOK INTO SBOOK_WA.
CHECK: SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
ENDSELECT.
The above code can be much more optimized by the code written below which avoids CHECK, selects with selection list and puts the data in one shot using into table
SELECT CARRID CONNID FLDATE BOOKID FROM SBOOK INTO TABLE T_SBOOK
WHERE SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
3. When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index.
To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. In certain scenarios, it is advisable to check whether a new index can speed up the performance of a program. This will come handy in programs that access data from the finance tables.
4. For testing existence, use Select.. Up to 1 rows statement instead of a Select-Endselect-loop with an Exit.
SELECT * FROM SBOOK INTO SBOOK_WA
UP TO 1 ROWS
WHERE CARRID = 'LH'.
ENDSELECT.
The above code is more optimized as compared to the code mentioned below for testing existence of a record.
SELECT * FROM SBOOK INTO SBOOK_WA
WHERE CARRID = 'LH'.
EXIT.
ENDSELECT.
5. Use Select Single if all primary key fields are supplied in the Where condition .
If all primary key fields are supplied in the Where conditions you can even use Select Single.
Select Single requires one communication with the database system, whereas Select-Endselect needs two.
Select Statements SQL Interface
1. Use column updates instead of single-row updates
to update your database tables.
SELECT * FROM SFLIGHT INTO SFLIGHT_WA.
SFLIGHT_WA-SEATSOCC =
SFLIGHT_WA-SEATSOCC - 1.
UPDATE SFLIGHT FROM SFLIGHT_WA.
ENDSELECT.
The above mentioned code can be more optimized by using the following code
UPDATE SFLIGHT
SET SEATSOCC = SEATSOCC - 1.
2. For all frequently used Select statements, try to use an index.
SELECT * FROM SBOOK CLIENT SPECIFIED INTO SBOOK_WA
WHERE CARRID = 'LH'
AND CONNID = '0400'.
ENDSELECT.
The above mentioned code can be more optimized by using the following code
SELECT * FROM SBOOK CLIENT SPECIFIED INTO SBOOK_WA
WHERE MANDT IN ( SELECT MANDT FROM T000 )
AND CARRID = 'LH'
AND CONNID = '0400'.
ENDSELECT.
3. Using buffered tables improves the performance considerably.
Bypassing the buffer increases the network considerably
SELECT SINGLE * FROM T100 INTO T100_WA
BYPASSING BUFFER
WHERE SPRSL = 'D'
AND ARBGB = '00'
AND MSGNR = '999'.
The above mentioned code can be more optimized by using the following code
SELECT SINGLE * FROM T100 INTO T100_WA
WHERE SPRSL = 'D'
AND ARBGB = '00'
AND MSGNR = '999'.
Select Statements Aggregate Functions
If you want to find the maximum, minimum, sum and average value or the count of a database column, use a select list with aggregate functions instead of computing the aggregates yourself.
Some of the Aggregate functions allowed in SAP are MAX, MIN, AVG, SUM, COUNT, COUNT( * )
Consider the following extract.
Maxno = 0.
Select * from zflight where airln = LF and cntry = IN.
Check zflight-fligh > maxno.
Maxno = zflight-fligh.
Endselect.
The above mentioned code can be much more optimized by using the following code.
Select max( fligh ) from zflight into maxno where airln = LF and cntry = IN.
Select Statements For All Entries
The for all entries creates a where clause, where all the entries in the driver table are combined with OR. If the number of entries in the driver table is larger than rsdb/max_blocking_factor, several similar SQL statements are executed to limit the length of the WHERE clause.
The plus
Large amount of data
Mixing processing and reading of data
Fast internal reprocessing of data
Fast
The Minus
Difficult to program/understand
Memory could be critical (use FREE or PACKAGE size)
Points to be must considered FOR ALL ENTRIES
Check that data is present in the driver table
Sorting the driver table
Removing duplicates from the driver table
Consider the following piece of extract
Loop at int_cntry.
Select single * from zfligh into int_fligh
where cntry = int_cntry-cntry.
Append int_fligh.
Endloop.
The above mentioned can be more optimized by using the following code.
Sort int_cntry by cntry.
Delete adjacent duplicates from int_cntry.
If NOT int_cntry[] is INITIAL.
Select * from zfligh appending table int_fligh
For all entries in int_cntry
Where cntry = int_cntry-cntry.
Endif.
Select Statements Select Over more than one Internal table
1. Its better to use a views instead of nested Select statements.
SELECT * FROM DD01L INTO DD01L_WA
WHERE DOMNAME LIKE 'CHAR%'
AND AS4LOCAL = 'A'.
SELECT SINGLE * FROM DD01T INTO DD01T_WA
WHERE DOMNAME = DD01L_WA-DOMNAME
AND AS4LOCAL = 'A'
AND AS4VERS = DD01L_WA-AS4VERS
AND DDLANGUAGE = SY-LANGU.
ENDSELECT.
The above code can be more optimized by extracting all the data from view DD01V_WA
SELECT * FROM DD01V INTO DD01V_WA
WHERE DOMNAME LIKE 'CHAR%'
AND DDLANGUAGE = SY-LANGU.
ENDSELECT
2. To read data from several logically connected tables use a join instead of nested Select statements. Joins are preferred only if all the primary key are available in WHERE clause for the tables that are joined. If the primary keys are not provided in join the Joining of tables itself takes time.
SELECT * FROM EKKO INTO EKKO_WA.
SELECT * FROM EKAN INTO EKAN_WA
WHERE EBELN = EKKO_WA-EBELN.
ENDSELECT.
ENDSELECT.
The above code can be much more optimized by the code written below.
SELECT PF1 PF2 FF3 FF4 INTO TABLE ITAB
FROM EKKO AS P INNER JOIN EKAN AS F
ON PEBELN = FEBELN.
3. Instead of using nested Select loops it is often better to use subqueries.
SELECT * FROM SPFLI
INTO TABLE T_SPFLI
WHERE CITYFROM = 'FRANKFURT'
AND CITYTO = 'NEW YORK'.
SELECT * FROM SFLIGHT AS F
INTO SFLIGHT_WA
FOR ALL ENTRIES IN T_SPFLI
WHERE SEATSOCC < F~SEATSMAX
AND CARRID = T_SPFLI-CARRID
AND CONNID = T_SPFLI-CONNID
AND FLDATE BETWEEN '19990101' AND '19990331'.
ENDSELECT.
The above mentioned code can be even more optimized by using subqueries instead of for all entries.
SELECT * FROM SFLIGHT AS F INTO SFLIGHT_WA
WHERE SEATSOCC < F~SEATSMAX
AND EXISTS ( SELECT * FROM SPFLI
WHERE CARRID = F~CARRID
AND CONNID = F~CONNID
AND CITYFROM = 'FRANKFURT'
AND CITYTO = 'NEW YORK' )
AND FLDATE BETWEEN '19990101' AND '19990331'.
ENDSELECT.
1. Table operations should be done using explicit work areas rather than via header lines.
READ TABLE ITAB INTO WA WITH KEY K = 'X BINARY SEARCH.
IS MUCH FASTER THAN USING
READ TABLE ITAB INTO WA WITH KEY K = 'X'.
If TAB has n entries, linear search runs in O( n ) time, whereas binary search takes only O( log2( n ) ).
2. Always try to use binary search instead of linear search. But dont forget to sort your internal table before that.
READ TABLE ITAB INTO WA WITH KEY K = 'X'. IS FASTER THAN USING
READ TABLE ITAB INTO WA WITH KEY (NAME) = 'X'.
3. A dynamic key access is slower than a static one, since the key specification must be evaluated at runtime.
4. A binary search using secondary index takes considerably less time.
5. LOOP ... WHERE is faster than LOOP/CHECK because LOOP ... WHERE evaluates the specified condition internally.
LOOP AT ITAB INTO WA WHERE K = 'X'.
ENDLOOP.
The above code is much faster than using
LOOP AT ITAB INTO WA.
CHECK WA-K = 'X'.
ENDLOOP.
6. Modifying selected components using MODIFY itab TRANSPORTING f1 f2.. accelerates the task of updating a line of an internal table.
WA-DATE = SY-DATUM.
MODIFY ITAB FROM WA INDEX 1 TRANSPORTING DATE.
The above code is more optimized as compared to
WA-DATE = SY-DATUM.
MODIFY ITAB FROM WA INDEX 1.
7. Accessing the table entries directly in a "LOOP ... ASSIGNING ..." accelerates the task of updating a set of lines of an internal table considerably
Modifying selected components only makes the program faster as compared to Modifying all lines completely.
e.g,
LOOP AT ITAB ASSIGNING <WA>.
I = SY-TABIX MOD 2.
IF I = 0.
<WA>-FLAG = 'X'.
ENDIF.
ENDLOOP.
The above code works faster as compared to
LOOP AT ITAB INTO WA.
I = SY-TABIX MOD 2.
IF I = 0.
WA-FLAG = 'X'.
MODIFY ITAB FROM WA.
ENDIF.
ENDLOOP.
8. If collect semantics is required, it is always better to use to COLLECT rather than READ BINARY and then ADD.
LOOP AT ITAB1 INTO WA1.
READ TABLE ITAB2 INTO WA2 WITH KEY K = WA1-K BINARY SEARCH.
IF SY-SUBRC = 0.
ADD: WA1-VAL1 TO WA2-VAL1,
WA1-VAL2 TO WA2-VAL2.
MODIFY ITAB2 FROM WA2 INDEX SY-TABIX TRANSPORTING VAL1 VAL2.
ELSE.
INSERT WA1 INTO ITAB2 INDEX SY-TABIX.
ENDIF.
ENDLOOP.
The above code uses BINARY SEARCH for collect semantics. READ BINARY runs in O( log2(n) ) time. The above piece of code can be more optimized by
LOOP AT ITAB1 INTO WA.
COLLECT WA INTO ITAB2.
ENDLOOP.
SORT ITAB2 BY K.
COLLECT, however, uses a hash algorithm and is therefore independent
of the number of entries (i.e. O(1)) .
9. "APPEND LINES OF itab1 TO itab2" accelerates the task of appending a table to another table considerably as compared to LOOP-APPEND-ENDLOOP.
APPEND LINES OF ITAB1 TO ITAB2.
This is more optimized as compared to
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
10. DELETE ADJACENT DUPLICATES accelerates the task of deleting duplicate entries considerably as compared to READ-LOOP-DELETE-ENDLOOP.
DELETE ADJACENT DUPLICATES FROM ITAB COMPARING K.
This is much more optimized as compared to
READ TABLE ITAB INDEX 1 INTO PREV_LINE.
LOOP AT ITAB FROM 2 INTO WA.
IF WA = PREV_LINE.
DELETE ITAB.
ELSE.
PREV_LINE = WA.
ENDIF.
ENDLOOP.
11. "DELETE itab FROM ... TO ..." accelerates the task of deleting a sequence of lines considerably as compared to DO -DELETE-ENDDO.
DELETE ITAB FROM 450 TO 550.
This is much more optimized as compared to
DO 101 TIMES.
DELETE ITAB INDEX 450.
ENDDO.
12. Copying internal tables by using ITAB2[ ] = ITAB1[ ] as compared to LOOP-APPEND-ENDLOOP.
ITAB2[] = ITAB1[].
This is much more optimized as compared to
REFRESH ITAB2.
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
13. Specify the sort key as restrictively as possible to run the program faster.
SORT ITAB BY K. makes the program runs faster as compared to SORT ITAB.
Internal Tables contd
Hashed and Sorted tables
1. For single read access hashed tables are more optimized as compared to sorted tables.
2. For partial sequential access sorted tables are more optimized as compared to hashed tables
Hashed And Sorted Tables
Point # 1
Consider the following example where HTAB is a hashed table and STAB is a sorted table
DO 250 TIMES.
N = 4 * SY-INDEX.
READ TABLE HTAB INTO WA WITH TABLE KEY K = N.
IF SY-SUBRC = 0.
ENDIF.
ENDDO.
This runs faster for single read access as compared to the following same code for sorted table
DO 250 TIMES.
N = 4 * SY-INDEX.
READ TABLE STAB INTO WA WITH TABLE KEY K = N.
IF SY-SUBRC = 0.
ENDIF.
ENDDO.
Point # 2
Similarly for Partial Sequential access the STAB runs faster as compared to HTAB
LOOP AT STAB INTO WA WHERE K = SUBKEY.
ENDLOOP.
This runs faster as compared to
LOOP AT HTAB INTO WA WHERE K = SUBKEY.
ENDLOOP. -
Auto numbering Column id and filter this lookup id in another list based on status="active"
Hi,
I am trying to autonumbeirng the column id with default column ID. But it is not reset if i delete the list item. Also i want this id in another column which have status="Active". How i will do this?
Thanks in Advance.
RoopeshHi,
According to your description, my understanding is that you want to reset the column ID when you delete the list item and then you want to filter the id in another list based on status.
For resetting column id, there is no direct way to achieve it. I suggest you can save the list as a template and recreate the list. ID columns will always keep incrementing and will never be reused.
Here is a similar thread about reset column ID for your reference:
https://social.technet.microsoft.com/Forums/sharepoint/en-US/848a3d73-6273-45fa-806f-96312a4d71d1/is-there-anyway-to-reset-the-default-id-number-that-sharepoint-gives-to-an-item-back-to-1?forum=sharepointgeneralprevious
For filtering look up field, here are some detailed demos for your reference:
http://filteredlookup.codeplex.com/
https://social.technet.microsoft.com/Forums/en-US/d23d6e9b-dc7b-4741-8746-dd4bf00b8110/how-to-filter-lookup-column-in-sharepoint-2010
v
Thanks
Best Regards
Forum Support
Please remember to mark the replies as answers if they help and unmark them if they provide no help. If you have feedback for TechNet Subscriber Support, contact
[email protected]
Jerry Guo
TechNet Community Support -
Auto-increment identity column through procedure in oracle 10g on windows
Hi,
I need identity primary key which should be auto increment before while inserting data into table.
for this i had use sequence and then trigger to increment it.
but now i need to increment it in Procedure, while my procedure is having code to insert data in same table which has primary keyHi,
SNEHA RK wrote:
Hi,
I need identity primary key which should be auto increment before while inserting data into table.
for this i had use sequence and then trigger to increment it.Right. Some database products have auto-increment columns, and they are really handy. Unfortunately, Oracle does not have auto-increment columns. A sequence is an auto-increment object, and it's the right way to automatically generate unique identifiers, but you need to explicity reference the sequence, either in you DML statements, or in a trigger that will automatically fire before a DML statement.
but now i need to increment it in Procedure, while my procedure is having code to insert data in same table which has primary keyAre you saying that you need to increment the sequence, completely aside from INSERTing into the table?
If so, just reference sequence_name.NEXTVAL wherever you want to. In PL/SQL, you can say
SELECT sequence_name.NEXTVAL
INTO number_variable
FROM dual;This works in any version of Oracle, but starting in Oracle 11, you also have the option of referencing te sequence without using dual, or any other table.
I hope this answers your question.
If not, post a complete script that people can run to re-create the problem and test their ideas.
For example:
-- Here are the table and the seqauence that I created:
CREATE TABLE table_x ...
CREATE SEQUENCE ...
-- Here is the BEFORE INSERT trigger I wrote:
CREATE OR REPLACE TRIGGER ...
-- The trigger works exactly how I want it to in statements like this:
INSERT INTO table_x ...
-- So there are no problems (that I know of) with anything up to this point.
-- Now I want to use the same sequence to ...
-- so that when I execute a statement like this
-- then the next time I add a new row to the orginal table, like this
INSERT INTO table_x ...
-- then the contents of table_x should be ... because ...
Maybe you are looking for
-
I want to show labels having images one by one in Panel
i want to show labels having images one by one in Panel through a while loop... I made an ImagIcon array. It doesn't work properly. It shows only first image while the variable is incrementing. :( This is my code...(Plz check it....) import java.awt.
-
Screen Sharing: iMac -- 2010 MBP 17"?
I am thinking of buying a 27" iMac to run FCP andI wish to use my old 2010 MBP 17" laptop as a second monitor. Can I use Screen Sharing to do this?
-
Web Client - recurring activities creation
Hi, I'm enquiring is it possible to create recurring activities in the CRM 2007 Web Client i.e the setting up of a recurring customer visit that is on a repeat schedule. If this possible, how can this be done. Thanks in advance, Dan
-
Hi everybody, I have a weird problem. I had recently completed SRDemo ADF tutorial, everything run fined, no problem. Out of curiosity to see how the things are running JBoss, I try to deploy JBoss. After long series of problem, I come this final one
-
Hi, i've made a website in iWeb and when I open the site in a webbrowser, every page has a different name. Like (photo1, photo2, photo3 etc.) I want for all my pages the same name. Is this possible in iWeb, or do I have to put a file in my public fol