Sort Statement

Hi,
In my custom program, I have issued a SORT command on my internal table.
SORT it_itab by hkont prctr gsber waers.
After the SORT command, the relative sequence of entries in the internal table having the same set of values for the fields mentioned in the SORT command, is different in ECC 6.0 when compared with 4.6C results.
Has anybody faced a similar situation?
Is there a functionality difference in SORT in ECC 6.0?
Any inputs on this will be highly appreciated.
Thanks,
Binu

Hi,
For sort statement, there is no difference between 4.6C and ECC6.0.
You can debug your program, before and after sorting the internal table, you can check whether the internal table changes the sequence.
Or you can put your code here to make us more clear what happened.
Thanks and regards,
Chris Gu

Similar Messages

  • Problem in SORT statement

    Hi Gurus,
    I have this problem, I am trying to sort a internal table with the syntax after endselect statement and before read table statement
    SORT ITAB_SBOOK BY NAME
    name is a field in the table of type CHAR length 25 in actual table and here is how i am declaring name
    in internal table
    name LIKE stravelag-name
    but the sort statement is not executing properly, names are being printed on the screen but they are not
    being formated.
    can some one tell me whare am i wrong ?
    thanks.
    Moderator Message: Please use more descriptive subject line in future post.
    Edited by: Suhas Saha on Dec 25, 2011 7:55 PM

    Hi
    as per my knowledge there is slight diff between type and like keywords
    type key refer the data type of a field where as like key refer the reference of existing  internal table in this just refer the data types not content(data)
    example:
    types:BEGIN OF ty_itab,
          matnr type mara-matnr,
          matkl type mara-matkl,
          mbrsh type mara-mbrsh,
          ersda type mara-ersda,
      END OF ty_itab.
      data:itab type STANDARD TABLE OF ty_itab.
      data:wa_itab type ty_itab.
    we want to create one more internal table with the existing structure  at this time  we will go through the like keyword.
    jtab like itab occurs 10.
    and also check the following code.
    REPORT  sort.
    types:BEGIN OF ty_itab,
          matnr type mara-matnr,
          matkl type mara-matkl,
          mbrsh type mara-mbrsh,
          ersda type mara-ersda,
      END OF ty_itab.
    data:itab type STANDARD TABLE OF ty_itab.
      data:wa_itab type ty_itab.
      select matnr matkl mbrsh ersda from mara into wa_itab.
        APPEND wa_itab to itab.
    ENDSELECT.
    SORT itab by mbrsh.
    write:/ 'matno',' mat group','industry sector','created on'.
    loop at itab into wa_itab.
      write:/ wa_itab-matnr,wa_itab-matkl,wa_itab-mbrsh,wa_itab-ersda.
      endloop.
    best regards
    sreenivas p

  • SORT statement is not working!

    Hi frdz,
    Below SORT statement is not working. Can any one explain me why this is happening.
    SORT i_bseg ASCENDING BY belnr bukrs
                        DESCENDING kunnr.
    I have table content as below.
    BELNR      BUKRS KUNNR   
    0016000000|CROP |         
    0016000000|CROP |0008910168
    Before and after the sort content order is same.
    I want to sort the content like below.
    0016000000|CROP |0008910168
    0016000000|CROP |       
    Is there any thing wrong with the sort statement???
    i_bseg is defined as TYPE STANDARD TABLE OF
    Sort criteria must not change i. e ascending by belnr and bukrs and descending by kunnr.
    Thanks,
    Vinod.

    hi vinod,
    this is because on your statement, you are sorting BUKRS in descending order and KUNNR in ASCENDING order.
    please take note that the sort order should come after the sorted field. if no order is given, the default which is ASCENDING will be used.
    do your sorting like this
    SORT i_bseg BY belnr bukrs kunnr DESCENDING.
    regards,
    Peter

  • About sort statement

    hello friends
    please tell me if i apply sort condition in sorted table what will happen
    whether it show some kind of error or it run or anything else.
    thanks...

    nothing happens but the code gets executed...
    unnecessarily sort statement should not be used in programs if there is no read of data...

  • Does not retain sort state

    App Store does not retain sort state when returning from viewing an individual app to the full list of apps. If the full list spans more than one page, the page you were on is also not retained.
    I have no idea if this is a bug, a feature (or lack thereof), or an oddity on my computer. Since I can't find any other way to request a feature or post feedback to Apple, I'm putting this here.
    If by some chance this is an issue with my computer only or I'm missing some preference somewhere (ha!) I'd appreciate any help provided by the community.
    -s

    Yes, it is indeed VERY frustrating that the App Stores don't return you to where you left off browsing if you stop to click on an app to read more about it. Once you're done reading about an app that interests you, you're dumped right back at the beginning. So, just to get back where you were, you may have to plow through ten pages of apps. I get so fed up with being whisked back to page 1 all the time that I just give up and leave the App Store in disgust. I hate wasting my time paging backnthrough all the apps I've alread covered. ALSO, when looking over GENIUS recommendations on the App Store, why is it that even when I click on NOT INTERESTED for a given app, the app just stays there? It's like my clicking NOT INTERESTED has no effect whatsover. What's the problem with the App Store?

  • How to persist af:table column sort state within a session?

    Hi,
    I have an af:table in my page with the columns sortable="true".  So when click on the header of any column, we can sort the column.  Our users have a requirement that after they do the sort by clicking one of the column headers in the af:table, then they navigate to another page in our application and then come back to this page, they want to see the same sort order of data.  How can we persist the sorting state in af:table?
    Any comments are appreciated.
    Thanks
    -Mina

    Hi,
    I am not sure this is doable because the underling data collection may be changed on other views. You can use a sort listener and intercept the sort order selected by a user to persist it in the session or else where (keep in mind that using the panelCollection component you could also have a sort order that spans multiple columns). When you navigate back to the view you then have the information to order the data accordingly.
    Frank

  • Sorting techinque without using sort statement /Comparing table fields.

    Hi,
    How to achieve sorting techinque without using sort statement in tables.
    Also how to compare fields of 2 custom tables and check their compatability without using code ?

    Hi,
    Refer the below program, it will be helpful.
    types: begin of t_int,
             int type i,
            end of t_int.
    data: it_int type standard table of t_int,
           wa_int type t_int,
           wa_int1 type t_int.
    wa_int-int = 70.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 50.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 20.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 30.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 23.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 23.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 32.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 77.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 99.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 1.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 11.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 90.
    append wa_int to it_int.
    clear wa_int.
    wa_int-int = 40.
    append wa_int to it_int.
    clear wa_int.
    data: wk_line type i.
    data: cnt type i.
    data: cnt1 type i.
    describe table it_int lines wk_line.
    clear: cnt,cnt1.
    data wk_flag type c.
       clear wk_flag.
    while wk_line gt cnt1.
       cnt = cnt + 1.
       read table it_int into wa_int index cnt.
       cnt1 = cnt + 1.
       read table it_int into wa_int1 index cnt1.
       if wa_int-int lt wa_int1-int.
         modify it_int from wa_int index cnt1.
         modify it_int from wa_int1 index cnt.
         wk_flag = 'X'.
       endif.
       if cnt1 eq wk_line.
         clear: cnt, cnt1.
         if wk_flag eq 'X'.
         clear wk_flag.
         continue.
         else.
           exit.
         endif.
       endif.
    endwhile.
    loop at it_int into wa_int.
       write: / wa_int-int.
    endloop.

  • How to Remove Sort State in Table after display it in Table

    Hi
    I use the method below to sort the columns before displaying to the user and it works okay
    FieldKey testKey = new FieldKey("testField");           
                FieldKeySortCriteria testCriteria = new FieldKeySortCriteria(portCodeKey, true);
                this.getRowRecord1().addSort(testCriteria);the problem is in every rows i have edit button where user can edit and update particular row.
    the problem occurs whenever user change the value for particular field that is being sorted the row will jump randomly according to the sort rules.
    My Question is , how can we remove or disabled sorting as soon user see the result so it wont be jumping around if user changed the value of particular field that is being sorted.
    i dont find any removeSort() function in Rowgroup
    is there another way??
    Thanks

    i tried to put
    rowGroup.clearSort() in my Destroy() Method but is not disabling the current state of my rowgroup
    what it does is the moment i click edit button for particular row
    that row will jump to some other page ( because i did pagination on my table ) because the sort has been cleared .
    How do i clear and use the current state of my rowgroup after it has been displayed.

  • Facing Problem in SORT statement

    Hi All,
    I have Five fields in my internal table.
    Say FIELD1, FIELD2, FIELD3, FIELD4, FIELD5.
    I wan to display FIELD1 and FIELD3 in ascending order. Fields are Cobination of Text and Numerals.
    Both should be displayed in ascending order. Is it possible? How can I achieve it.
    Points Assured.
    Regards,
    Suresh

    hi,
    U CAN WRITE THE LIKE THIS.
    DATA: BEGIN OF ITAB occurs 0,
            MATNR TYPE MARA-MATNR,
            ERSDA TYPE MARA-ERSDA,
            ERNAM TYPE MARA-ERNAM,
            VPSTA TYPE MARA-VPSTA,
            PSTAT TYPE MARA-PSTAT,
          END OF ITAB.
    select * from mara into CORRESPONDING FIELDS OF TABLE itab.
    sort itab DESCENDING by VPSTA MATNR.
    loop at itab.
      write: / itab.
    endloop.
    RGDS,
    bharat.

  • Possible bug using count in sort statement

    I think there may be a bug in using count as the means to sort nodes. Below is an example of what I am describing. It appears that when the sort is performed the number of nodes is accurately calculated for each item. I printed the values out and hand counted the elements in the xml to ensure this to be the case. What appears to happen is the count value is treated as a string and not an integer, so the comparison is lexical string compare and not integer compare as would be expected. So 2 ends up being greater then 10. Has anyone else come across this?
    <xsl:template name="Sort" >
    <xsl:apply-templates select="//item">
              <xsl:sort order="descending" select="count(.//Skill[contains(@name,$SKILLS/@name)])"/>
    </xsl:apply-templates>
    </xsl:template>

    Never mind. I am a total tard and forgot to set the data-type to number

  • Is sort an expensive statement

    Hi Experts,
    Is it good practice to use sort statement  before ,
    Select for all entries statment.
    Before select for all entries statement we are checking about if not Itab[] is initial.
    Is sort an expensive statement.
    Thanks in Advance
    Irfan Hussain

    Hi Irfan
    you have sort the internal table on the same field in which your for all entries condition is then it will improve your performance.
    for ex.
    sort itab by vbeln.
    select * inot table itab1 from vbap for all entries in itab where vbeln eq itab-vbeln.
    regards
    kishore

  • JTable sorting - problem when adding elements (complete code inside)

    I�m writing this email with reference to a recent posting here but this time with the code example. (I apologize for the duplicated posting � this time it will be with the code)
    Problem: when adding more elements to the JTable (sorted) the exception: ArrayIndexOutOfBoundsException is thrown.
    Example: If the elements in the table are 10 and then the user requests for 8 � the table will produce the correct result. However, if the user will ask for 11 items (>10) the exception will be thrown.
    The program: The program below (compiles and running). A JTable is constructed with 3 items, when you click the button - the return result should be 4 items - this will generate the error, WHY?
    I would highly appreciate your thoughts why this is happening and most importantly � how to fix it.
    Thanks a lot
    3 files:
    (1) TableSorterDemo
    (2) Traveler
    (3)TableSorter
    //TableSorterDemo:
    package sorter;
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    * TableSorterDemo is like TableDemo, except that it
    * inserts a custom model -- a sorter -- between the table
    * and its data model.  It also has column tool tips.
    public class TableSorterDemo implements ActionListener
         private JPanel superPanel;
         private JButton clickMe = new JButton("click me to get diff data");
         private boolean DEBUG = false;
         private DefaultListModel defaultListModel;
         private JTable table;
        public TableSorterDemo()
             superPanel = new JPanel(new BorderLayout());
             defaultListModel = new DefaultListModel();
             init1();
            TableSorter sorter = new TableSorter(new MyTableModel(defaultListModel)); //ADDED THIS     
            table = new JTable(sorter);             //NEW
            sorter.setTableHeader(table.getTableHeader()); //ADDED THIS
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            //Set up tool tips for column headers.
            table.getTableHeader().setToolTipText(
                    "Click to specify sorting; Control-Click to specify secondary sorting");
            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
            //Add the scroll pane to this panel.
            superPanel.add("Center", scrollPane);
            superPanel.add("South",clickMe);
            clickMe.addActionListener(this);              
        public JPanel getPanel()
             return superPanel;
        public void init1()
             //in real life this will be done from the db
             Traveler a = new Traveler();
             Traveler b = new Traveler();
             Traveler c = new Traveler();
             a.setFirstName("Elvis");
             a.setLastName("Presley");
             a.setSprot("Ping Pong");
             a.setNumYears(3);
             a.setVegetarian(true);
             b.setFirstName("Elton");
             b.setLastName("John");
             b.setSprot("Soccer");
             b.setNumYears(2);
             b.setVegetarian(true);
             c.setFirstName("shaquille");
             c.setLastName("oneil");
             c.setSprot("Golf");
             c.setNumYears(22);
             c.setVegetarian(true);
             defaultListModel.addElement(a);
             defaultListModel.addElement(b);
             defaultListModel.addElement(c);
        public void init2()
             //in real life this will be done from the db
             Traveler d = new Traveler();
             Traveler e = new Traveler();
             Traveler f = new Traveler();
             Traveler g = new Traveler();
             d.setFirstName("John");
             d.setLastName("Smith");
             d.setSprot("Tennis");
             d.setNumYears(32);
             d.setVegetarian(true);
             e.setFirstName("Ron");
             e.setLastName("Cohen");
             e.setSprot("Baseball");
             e.setNumYears(12);
             e.setVegetarian(true);
             f.setFirstName("Donald");
             f.setLastName("Mac Novice");
             f.setSprot("Vallyball");
             f.setNumYears(1);
             f.setVegetarian(true);
             g.setFirstName("Eithan");
             g.setLastName("Superstar");
             g.setSprot("Vallyball");
             g.setNumYears(21);
             g.setVegetarian(true);
             defaultListModel.addElement(d);
             defaultListModel.addElement(e);
             defaultListModel.addElement(f);
             defaultListModel.addElement(g);            
        class MyTableModel extends AbstractTableModel
             private DefaultListModel myModel;
             public MyTableModel(DefaultListModel m)
                  myModel=m;
            private String[] columnNames = {"First Name",
                                            "Last Name",
                                            "Sport",
                                            "# of Years",
                                            "Vegetarian"};
            public int getColumnCount()
                return columnNames.length;
            public int getRowCount()
                return myModel.size();
            public String getColumnName(int column)
                 return getNames()[column];             
             public String[] getNames()
                  String[] names = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
                  return names;
            public Object getValueAt(int row, int col)
                 return distributeObjectsInTable(row, col, (Traveler) myModel.elementAt(row));
            public Object distributeObjectsInTable(int row, int col, Traveler tr)
               switch(col)
                         case 0:
                              return tr.getFirstName();
                         case 1:
                           return tr.getLastName();
                      case 2:
                           return tr.getSprot();
                      case 3:
                           return new Integer(tr.getNumYears());
                      case 4:
                           return new Boolean (tr.isVegetarian());
                     default:
                         return "Error";
            public Class getColumnClass(int c)
                return getValueAt(0, c).getClass();
        private static void createAndShowGUI()
            //Make sure we have nice window decorations.
            JFrame.setDefaultLookAndFeelDecorated(true);
            //Create and set up the window.
            JFrame frame = new JFrame("TableSorterDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Create and set up the content pane.
            TableSorterDemo newContentPane = new TableSorterDemo();
            newContentPane.getPanel().setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane.getPanel());
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        public static void main(String[] args)
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable()                   
                public void run()
                    createAndShowGUI();
         public void actionPerformed(ActionEvent ae)
              if (ae.getSource()==clickMe)
                   defaultListModel.removeAllElements();
                   init2(); //if the size of the model was less than 2 items - the result will be ok.
                              //in other words, if you commens the last 2 rows of this method (addElement(f) & g)
                             // the result will be fine.
                   table.updateUI();          
    }//(2) Traveler
    package sorter;
    public class Traveler
         private String firstName;
         private String lastName;
         private String sprot;
         private int numYears;
         private boolean vegetarian;
         public String getFirstName()
              return firstName;
         public String getLastName()
              return lastName;
         public int getNumYears()
              return numYears;
         public String getSprot()
              return sprot;
         public boolean isVegetarian()
              return vegetarian;
         public void setFirstName(String firstName)
              this.firstName = firstName;
         public void setLastName(String lastName)
              this.lastName = lastName;
         public void setNumYears(int numYears)
              this.numYears = numYears;
         public void setSprot(String sprot)
              this.sprot = sprot;
         public void setVegetarian(boolean vegetarian)
              this.vegetarian = vegetarian;
    }//(3)TableSorter
    package sorter;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.*;
    public class TableSorter extends AbstractTableModel {
        protected TableModel tableModel;
        public static final int DESCENDING = -1;
        public static final int NOT_SORTED = 0;
        public static final int ASCENDING = 1;
        private static Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED);
        public static final Comparator COMPARABLE_COMAPRATOR = new Comparator() {
            public int compare(Object o1, Object o2) {
                return ((Comparable) o1).compareTo(o2);
        public static final Comparator LEXICAL_COMPARATOR = new Comparator() {
            public int compare(Object o1, Object o2) {
                return o1.toString().compareTo(o2.toString());
        private Row[] viewToModel;
        private int[] modelToView;
        private JTableHeader tableHeader;
        private MouseListener mouseListener;
        private TableModelListener tableModelListener;
        private Map columnComparators = new HashMap();
        private List sortingColumns = new ArrayList();
        public TableSorter() {
            this.mouseListener = new MouseHandler();
            this.tableModelListener = new TableModelHandler();
        public TableSorter(TableModel tableModel) {
            this();
            setTableModel(tableModel);
        public TableSorter(TableModel tableModel, JTableHeader tableHeader) {
            this();
            setTableHeader(tableHeader);
            setTableModel(tableModel);
        private void clearSortingState() {
            viewToModel = null;
            modelToView = null;
        public TableModel getTableModel() {
            return tableModel;
        public void setTableModel(TableModel tableModel) {
            if (this.tableModel != null) {
                this.tableModel.removeTableModelListener(tableModelListener);
            this.tableModel = tableModel;
            if (this.tableModel != null) {
                this.tableModel.addTableModelListener(tableModelListener);
            clearSortingState();
            fireTableStructureChanged();
        public JTableHeader getTableHeader() {
            return tableHeader;
        public void setTableHeader(JTableHeader tableHeader) {
            if (this.tableHeader != null) {
                this.tableHeader.removeMouseListener(mouseListener);
                TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer();
                if (defaultRenderer instanceof SortableHeaderRenderer) {
                    this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer);
            this.tableHeader = tableHeader;
            if (this.tableHeader != null) {
                this.tableHeader.addMouseListener(mouseListener);
                this.tableHeader.setDefaultRenderer(
                        new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer()));
        public boolean isSorting() {
            return sortingColumns.size() != 0;
        private Directive getDirective(int column) {
            for (int i = 0; i < sortingColumns.size(); i++) {
                Directive directive = (Directive)sortingColumns.get(i);
                if (directive.column == column) {
                    return directive;
            return EMPTY_DIRECTIVE;
        public int getSortingStatus(int column) {
            return getDirective(column).direction;
        private void sortingStatusChanged() {
            clearSortingState();
            fireTableDataChanged();
            if (tableHeader != null) {
                tableHeader.repaint();
        public void setSortingStatus(int column, int status) {
            Directive directive = getDirective(column);
            if (directive != EMPTY_DIRECTIVE) {
                sortingColumns.remove(directive);
            if (status != NOT_SORTED) {
                sortingColumns.add(new Directive(column, status));
            sortingStatusChanged();
        protected Icon getHeaderRendererIcon(int column, int size) {
            Directive directive = getDirective(column);
            if (directive == EMPTY_DIRECTIVE) {
                return null;
            return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive));
        private void cancelSorting() {
            sortingColumns.clear();
            sortingStatusChanged();
        public void setColumnComparator(Class type, Comparator comparator) {
            if (comparator == null) {
                columnComparators.remove(type);
            } else {
                columnComparators.put(type, comparator);
        protected Comparator getComparator(int column) {
            Class columnType = tableModel.getColumnClass(column);
            Comparator comparator = (Comparator) columnComparators.get(columnType);
            if (comparator != null) {
                return comparator;
            if (Comparable.class.isAssignableFrom(columnType)) {
                return COMPARABLE_COMAPRATOR;
            return LEXICAL_COMPARATOR;
        private Row[] getViewToModel() {
            if (viewToModel == null) {
                int tableModelRowCount = tableModel.getRowCount();
                viewToModel = new Row[tableModelRowCount];
                for (int row = 0; row < tableModelRowCount; row++) {
                    viewToModel[row] = new Row(row);
                if (isSorting()) {
                    Arrays.sort(viewToModel);
            return viewToModel;
        public int modelIndex(int viewIndex)
            return getViewToModel()[viewIndex].modelIndex;
        private int[] getModelToView()
            if (modelToView == null) {
                int n = getViewToModel().length;
                modelToView = new int[n];
                for (int i = 0; i < n; i++) {
                    modelToView[modelIndex(i)] = i;
            return modelToView;
        // TableModel interface methods
        public int getRowCount() {
            return (tableModel == null) ? 0 : tableModel.getRowCount();
        public int getColumnCount() {
            return (tableModel == null) ? 0 : tableModel.getColumnCount();
        public String getColumnName(int column) {
            return tableModel.getColumnName(column);
        public Class getColumnClass(int column) {
            return tableModel.getColumnClass(column);
        public boolean isCellEditable(int row, int column) {
            return tableModel.isCellEditable(modelIndex(row), column);
        public Object getValueAt(int row, int column) {
            return tableModel.getValueAt(modelIndex(row), column);
        public void setValueAt(Object aValue, int row, int column) {
            tableModel.setValueAt(aValue, modelIndex(row), column);
        // Helper classes
        private class Row implements Comparable {
            private int modelIndex;
            public Row(int index) {
                this.modelIndex = index;
            public int compareTo(Object o) {
                int row1 = modelIndex;
                int row2 = ((Row) o).modelIndex;
                for (Iterator it = sortingColumns.iterator(); it.hasNext();) {
                    Directive directive = (Directive) it.next();
                    int column = directive.column;
                    Object o1 = tableModel.getValueAt(row1, column);
                    Object o2 = tableModel.getValueAt(row2, column);
                    int comparison = 0;
                    // Define null less than everything, except null.
                    if (o1 == null && o2 == null) {
                        comparison = 0;
                    } else if (o1 == null) {
                        comparison = -1;
                    } else if (o2 == null) {
                        comparison = 1;
                    } else {
                        comparison = getComparator(column).compare(o1, o2);
                    if (comparison != 0) {
                        return directive.direction == DESCENDING ? -comparison : comparison;
                return 0;
        private class TableModelHandler implements TableModelListener {
            public void tableChanged(TableModelEvent e) {
                // If we're not sorting by anything, just pass the event along.            
                if (!isSorting()) {
                    clearSortingState();
                    fireTableChanged(e);
                    return;
                // If the table structure has changed, cancel the sorting; the            
                // sorting columns may have been either moved or deleted from            
                // the model.
                if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
                    cancelSorting();
                    fireTableChanged(e);
                    return;
                // We can map a cell event through to the view without widening            
                // when the following conditions apply:
                // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and,
                // b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and,
                // c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and,
                // d) a reverse lookup will not trigger a sort (modelToView != null)
                // Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS.
                // The last check, for (modelToView != null) is to see if modelToView
                // is already allocated. If we don't do this check; sorting can become
                // a performance bottleneck for applications where cells 
                // change rapidly in different parts of the table. If cells
                // change alternately in the sorting column and then outside of            
                // it this class can end up re-sorting on alternate cell updates -
                // which can be a performance problem for large tables. The last
                // clause avoids this problem.
                int column = e.getColumn();
                if (e.getFirstRow() == e.getLastRow()
                        && column != TableModelEvent.ALL_COLUMNS
                        && getSortingStatus(column) == NOT_SORTED
                        && modelToView != null) {
                    int viewIndex = getModelToView()[e.getFirstRow()];
                    fireTableChanged(new TableModelEvent(TableSorter.this,
                                                         viewIndex, viewIndex,
                                                         column, e.getType()));
                    return;
                // Something has happened to the data that may have invalidated the row order.
                clearSortingState();
                fireTableDataChanged();
                return;
        private class MouseHandler extends MouseAdapter {
            public void mouseClicked(MouseEvent e) {
                JTableHeader h = (JTableHeader) e.getSource();
                TableColumnModel columnModel = h.getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX());
                int column = columnModel.getColumn(viewColumn).getModelIndex();
                if (column != -1) {
                    int status = getSortingStatus(column);
                    if (!e.isControlDown()) {
                        cancelSorting();
                    // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or
                    // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed.
                    status = status + (e.isShiftDown() ? -1 : 1);
                    status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1}
                    setSortingStatus(column, status);
        private static class Arrow implements Icon {
            private boolean descending;
            private int size;
            private int priority;
            public Arrow(boolean descending, int size, int priority) {
                this.descending = descending;
                this.size = size;
                this.priority = priority;
            public void paintIcon(Component c, Graphics g, int x, int y) {
                Color color = c == null ? Color.GRAY : c.getBackground();            
                // In a compound sort, make each succesive triangle 20%
                // smaller than the previous one.
                int dx = (int)(size/2*Math.pow(0.8, priority));
                int dy = descending ? dx : -dx;
                // Align icon (roughly) with font baseline.
                y = y + 5*size/6 + (descending ? -dy : 0);
                int shift = descending ? 1 : -1;
                g.translate(x, y);
                // Right diagonal.
                g.setColor(color.darker());
                g.drawLine(dx / 2, dy, 0, 0);
                g.drawLine(dx / 2, dy + shift, 0, shift);
                // Left diagonal.
                g.setColor(color.brighter());
                g.drawLine(dx / 2, dy, dx, 0);
                g.drawLine(dx / 2, dy + shift, dx, shift);
                // Horizontal line.
                if (descending) {
                    g.setColor(color.darker().darker());
                } else {
                    g.setColor(color.brighter().brighter());
                g.drawLine(dx, 0, 0, 0);
                g.setColor(color);
                g.translate(-x, -y);
            public int getIconWidth() {
                return size;
            public int getIconHeight() {
                return size;
        private class SortableHeaderRenderer implements TableCellRenderer {
            private TableCellRenderer tableCellRenderer;
            public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
                this.tableCellRenderer = tableCellRenderer;
            public Component getTableCellRendererComponent(JTable table,
                                                           Object value,
                                                           boolean isSelected,
                                                           boolean hasFocus,
                                                           int row,
                                                           int column) {
                Component c = tableCellRenderer.getTableCellRendererComponent(table,
                        value, isSelected, hasFocus, row, column);
                if (c instanceof JLabel) {
                    JLabel l = (JLabel) c;
                    l.setHorizontalTextPosition(JLabel.LEFT);
                    int modelColumn = table.convertColumnIndexToModel(column);
                    l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize()));
                return c;
        private static class Directive {
            private int column;
            private int direction;
            public Directive(int column, int direction) {
                this.column = column;
                this.direction = direction;
    }

    The table listens to the TableModel for changes. Changing the table by adding/removing
    rows or columns has no affect on its table model. If you make changes to the table model
    the table will be notified by its TableModelListener and change its view. So tell
    MyTableModel about the change of data:
    public class TableSorterDemo implements ActionListener
        MyTableModel tableModel;
        public TableSorterDemo()
            defaultListModel = new DefaultListModel();
            init1();
            tableModel = new MyTableModel(defaultListModel);
            TableSorter sorter = new TableSorter(tableModel);
        public void actionPerformed(ActionEvent ae)
            if (ae.getSource()==clickMe)
                defaultListModel.removeAllElements();
                init2();
                tableModel.fireTableStructureChanged();
    }

  • Upgrade -- Sort sequence difference in ECC 6.0 and 4.7

    Hello friends,
    We are in an upgrade project where the upgrade is from 4.7 version to ECC 6.0 version.
    We are facing few problems on sort when testing our Z developments.
    Suppose the internal table in the program has fields A, B and C.
    We are using the sort statement --> sort itab by A.
    In 4.7, the sort statement sorts the internal table first by A and there is no specific sequence followed for B or C.
    Whereas in ECC 6.0, the sort happens by A followed by B and C.
    So, the final result is, for the user, the output appears different, although the data is the same.
    Please let me know how can we make the output in ECC 6.0 appear as in 4.7.
    Thanks & Regards
    Swapnil

    Hello Swapnil,
    Check for the SORT keyword in transaction abapdocu. You may see the changes made to the functionality in the newer versions.
    Thank You,
    Sai

  • Order by preffered over sorting.

    Hi All,
    SELECT ITAB ORDER BY preferred over SORT ITAB
    which one is more preferable??
    For example I have the selection query:
          SELECT  matnr
                  werks
                  charg
                  clabs FROM mchb INTO TABLE i_mchb
           FOR ALL ENTRIES IN i_qals
           WHERE matnr = i_qals-matnr
            AND werks  = i_qals-werk
            AND charg = i_qals-charg.
          IF sy-subrc EQ 0.
            SORT i_mchb BY matnr
                           werks
                           charg.
    If I want to implement the same by using Orderby in the select query instead of seperate SORT,
    what should the query be like?
    and which is preferable and why?
    Thanks,
    Debrup.

    Hi,
    Instead of Order BY in select statement Sort is preffered. Order by consumes the Database time.
    Preferebly the Sort statement is better.

  • Sort Order option disabled when using OBIEE analysis?

    Hi everyone
    I've build a BIP report using the online layout editor.  My data model is based on an existing OBIEE analysis. When I go into the data model and go into the properties of a column, the Sort Order option is somehow defaulted to "No Ordering" and the dropdown menu is actually disabled, so I can't change anything.  Is this normal/expected functionality or am I missing something somewhere?
    Thanks

    I don't think it is possible. Here are the sort statements in this program.
    <u>Without Serialization</u>
    sort t_idoc_control_r
      by sndprn sndprt sndpfc mestyp
         mescod mesfct test serial.
    <u>With Serialization</u>
    sort t_idoc_control_s
      by sndprt sndprn obj_type chnum chcou.
    In neither of them, the document number is used. There is no guarantee that they will be processed in the document number order, even if serialization is used.
    Regards,
    Srinivas

Maybe you are looking for

  • INDD file on file server: terrible performance

    Wondering if anyone has a solution to this issue... Recently upgraded to CS6 (didn't notice this with CS4 or CS5). We have several files that are very simple in composition (simple paragraph of text) and they are extremely slow when trying to edit th

  • How to add a scale marker in PS CS4 standard? how to update PS extended?

    I just installed PS CS4 standard. I found that I needed to have its extended one to add a scale marker in the microscope images. Please let me know how to add a scale marker with PS CS4 starndard. Or, please let me know how to upgrade it to PS CS4 Ex

  • Multiple selection in the ALV is not possible after system upgrade

    Hi Colleague, I had been using an ALV, which was performing as desired before, but recently we had a system upgrade to NW7.0 and after that in this ALV multiple selection of records/rows is not allowed. The colleagues who upgraded the system suggeste

  • Photoshop on PC and Mac?

    Hello, I bought photoshop for my PC desktop. I'm considering buying a Mac laptop and I want to know if I'll be able to use my license to install photoshop on it. I read somewhere that I can install it on two computers, but I'm not sure if the PC/Mac

  • Content search over jsp pages

              Hi,           I am using IIS indexing server to do the content search, but the site is writetn           in jsp page, so i need to produce the same file in html to be searched. It is           pain to modify the content. Is there a way to s