Monday 22 December 2014

Delete Actions in Ax2012

there are 4 types of delete Action:

Say we have 2 tables A and B and both tables are having a relation 1:1 or 1:n;

a)None:

if we delete table A  then table B will not get deleted.
cascade:

b) if we delete table A then table B will be deleted.

restricted:

If we try to  delete table A it won't get deleted until there is a data in the table B which is related to Table A

cascade+rescrited:

say there is one more table C which is cascade to table A

so it is now:

table C--->cascade>>>tableA------rescrited----->tableB

then if we delete the data from c the respective data in table a and table b will deleted.


Sunday 21 December 2014

method for finding duplicates in table

public static boolean existDuplicateName(MyTable _MyTable )
{
    MyTable MyTable ;

    select firstonly RecId from MyTable
        where MyTable .Name     == MyTable .Name &&
              MyTable .RecId    != MyTable .RecId;

    return (MyTable .RecId != 0);
}


the duplicates in the table may have same name but will have a different rec ID we can use thid functionality  to find the duplicates in the table.

Tuesday 25 November 2014

AX interview Questions and answer

How to separate objects which are present in a particular layer and take XPO.
This is my take on a step by step procedure to achieve this.
Step 1. Create a model and move all the objects that you want to move out of the layer.
Step 2. Create a project of this model and export the project as an xpo.
Step 3. Backup the database and delete the old model created in step 1
Step 4. Synchronize the database from the AOT. This will delete the data but we will retrieve it later.
Step 5. Import the xpo from step 2
Step 6. Synchronize the database.
Step 7. Export this new model.
Step 8. Restore the database that was backed up from step 3
Step 9. Import the new model (step 7), Synchronize and compile
This restores the I’d values of the objects and tables / fields. So no data will be lost
Step 10. Delete old model, compile / synchronize.
This should successfully move the code into the new layer and you won’t loose any data.

2)Does hot fix and certified solution layers in AX 2009 have patch layers?
A patch is installed for Dynamics AX 2009 by clicking on axpatch.exe and following the prompts from the installer.  The *.cab file contains the Microsoft signed .xpo as well as an .xml file which directs the installer to the appropriate layer to patch.
The folder named licenseterms contains the license terms used in the installer for each of the supported languages.  In the support folder the 24 languages for the patch installer are included as well as necessary files for managing the import of a patch.
The kbXXXXXX.txt file contains the affected objects including methods.  This is helpful in initial analysis to determine if the affected object has been modified on your system in any other layer.  After the initial analysis the patch can be applied to a test system and the compare tool inside of Dynamics AX can be used to analyze any changes that need to be made to merge the patch into the environment before being deployed on the live system.
Additionally, once an application patch has been applied a new class can be found in the Application Object Tree (AOT) called SysHotFixManifest.  This class will contain a method with the KB Article number representing each patch applied to the system.  This is done to allow the tracking of patches deployed in AX 2009 as the application version cannot be incremented when using individual patches.
In summary, Dynamics AX 2009 can be patched via a Microsoft signed .xpo file in a specific layer.  This enables better tracing of installed patches as well as isolating Microsoft code from customizations and third party applications.  The patches installed on an environment can be seen in the SysHotFixManifest class and will appear as methods indicating each KB Article applied.
For additional information on patching Dynamics AX 2009 please see the Dynamics AX 2009Patching Whitepaper which has been published on PartnerSource\CustomerSource.

What is the size of model element ID? Each object in a particular layer has an ID. What is the size/length of it?
16  bit – ax 2009 object id
32 bit in ax 2012 object id
Not sure of model  element ID
Which class/framework to use to show the remaining time of a task.
SysOperationProgress progress = new SysOperationProgress(3);

What is the use of Reverse engineering tool?
The Reverse Engineering tool enables you to visualize data and classes in Microsoft Dynamics AX by creating UML data models, UML object models, and ERX ER data models. This section provides an overview of the reverse engineering features and explains how to create models using this tool.
What is LITERALSTR function?
Validates that the specified string can be a literal string; if not, a compiler error occurs.

str literalStr(int str)

{
str s;
;

s = literalStr("This is a literal str");
print s;
pause;
}


Difference between FIRSTONLY and FIRSTFAST
First fast will fetch the first record fast and then rest of record time taken by  to fetch the first fast and first only is same for the first record
Give an example using conditional operator.
Arithmetic operator MOD. What is the return value? Say 10 MOD 8.
Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 ... mod. i = 100 mod21;. Returns the remainder of the integer division of 100 by 21. i=16
Syntax of WINDOW statement.
X++ provides a print statement that allows you to display text or selected results in a temporary window. The messages are displayed in a Print window that appears when the first print statement is executed.
The print statement can be a convenient alternative to the Global::info method during testing. The info method displays text in the Infolog window. The following table compares the print statement against the Global::info method.

How to get number of affected records in set based operations like UPDATE_RECORDSET, INSERT_RECORDSET & DELETE_FROM

update_recordset resembles delete_from in X++ and to UPDATE SET in SQL. It works on the database server-side on an SQL-style record set, instead of retrieving each record separately by fetching, changing, and updating.
MyTable myTableBuffer;
;
update_recordset myTableBuffer
setting field1 = field1 * 1.10;

Is X++ case sensitive language. If No, when it becomes case sensitive?
CLR types are case sensitive  that is exception in ax 2012

What is the function to create DATETIME? Syntax?
utcdatetime myUtc2 = 1988-07-20T13:34:45;
int iDay = DateTimeUtil ::day(1988-07-20T13:34:45)

Does X++ support multiple inheritances?

Yes. Interfaces are allowed as well, to get around multiple Inheritance.

n X++ an interface is a specification for a set of public instance methods. To create an interface, you begin by using the AOT to create a class. You edit the code of its classDeclaration node to replace the keyword class with the keyword interface. Then you add methods to the interface just as you would for a class, except no code is allowed inside the method bodies.
The purpose of interfaces is to define and enforce similarities between unrelated classes without having to artificially derive one class from the other.
Implements and extends
You can add the 
implements keyword on a class declaration, and this requires the class to declare the methods that are specified by the interface. A class declaration can implement multiple interfaces by listing them after the single occurrence of the implements keyword, with commas separating the interface names.
An interface can extend another interface by using the extends keyword. An interface cannot extend more than one interface.
Public
All interfaces are public regardless of whether you explicitly write the keyword 
public in front of the keyword interface in the classDeclaration. The methods on an interface are also public, and again the explicit inclusion of the keyword public is optional.
All interface methods that a class implements must be declared with the explicit keyword public in the class. Also, a class that implements an interface must also be declared with public.

How to make a class not to be extended by other classes?
Final keyword
How to make a form modal?
In most cases CONSTRUCT method in a class is PUBLIC. But in which case it should be PRIVATE?
Static Construct():
This method returns an instance of the class. It is a best practice to have a construct method in your class. This method should always be static but can be public or private depending upon the use. When calling a class from another class or job construct method can be used for this

Example class for Observer/Listener pattern?
For example, you can look at listeners in unit testing framework, especially SysTestResult class (and its methods addListener(), addFailure() and so on).
Difference between FIND and EXISTS method in table.
Exist- faster, returns Boolean
Find-slower and returns table
What are the ways to implement GO TO THE MAIN TABLE form functionality?
a)If u want to get go to main Table .Pls follow simple steps
Create a Menu Item  for the form and Attach Particular MenuItem as FormRef Property of Particular Table.
Eg:
Suppose if i want to display  FormA(Using TableA) as Go to Main Table in any other Form then i ll Create a Menu Item for FormA and i wll Attach this MenuItem as FormRef in TableA Property.
b) normal relation to another table the  option will come automatically.

Difference between ACTIVE, DELAYED, PASSIVE Link/Join Types in form DATASOURCE.
Active link type update the child data sources without any delay when you select the parent table record. When you deal with more records it will be affect application performance.
Delay form data source link type is also same as active method the different is delay method won't update immediately when you select the parent record. It will update the child data source when you select the parent table, Ax use pause statement before update the child data source. For example, if we are dealing with lot of records so, when the user click or scroll the order, order details will update without any delay if we use active method.
Passive form data source link type won't update the child data source automatically. For example if we select the parent table order then order details child data source won't update. If we need to update the child data source we need to call the child data source execute query method by program (code).
Outer join form data source link type will return all parent records and matched child records. It will return all rows in the parent table. Here, Order 4 doesn't has the child records (order details) but it is populating in the order grid. It is the difference between inner join and outer join
Inner join form data source link type displays the rows that match with parent table and child table. For example if the order doesn't has any order details then the order will not be display.

Here, Order 4 does not has the order details records, so it is not coming in the order grid.
Exist join
Exist join form data source link type return matched rows of the parent table. It behaves like inner join but the different is once parent row matched with child records then stop the process and update in the grid, Ax won't consider how many records in child table for the parent row.

Notepad: example1. Your comments?
To show the query in a dialog box, what method should be overridden?
What are OLAP and OLTP? Explain with examples W.R.T AX
 In a banking System, you withdraw amount through an ATM. Then account Number, ATM PIN Number, Amount you are withdrawing and Balance amount in account are operational data elements.

An OLAP (On-line Analytical Processing) deal with Historical Data or Archival Data, and it is characterized by relatively low volume of transactions.  In addition, the Queries needed for these systems are often very complex and involve aggregations as for OLAP systems the response time is an effectiveness measure.

Example: If we collect last 10 years data about flight reservation, the data can give us much meaningful information such as the trends in reservation. This may give useful information like peak time of travel, and what kinds of people are traveling in the various classes available (Economy/Business).


ource of data
Operational data; OLTPs are the original source of the data.
Consolidation data; OLAP data comes from the various OLTP Databases
Purpose of data
To control and run fundamental business tasks
To help with planning, problem solving, and decision support
What the data
Reveals a snapshot of ongoing business processes
Multi-dimensional views of various kinds of business activities
Inserts and Updates
Short and fast inserts and updates initiated by end users
Periodic long-running batch jobs refresh the data
Queries
Relatively standardized and simple queries Returning relatively few records
Often complex queries involving aggregations
Processing Speed
Typically very fast
Depends on the amount of data involved; batch data refreshes and complex queries may take many hours; query speed can be improved by creating indexes
Space Requirements
Can be relatively small if historical data is archived
Larger due to the existence of aggregation structures and history data; requires more indexes than OLTP
Database Design
Highly normalized with many tables
Typically de-normalized with fewer tables; use of star and/or snowflake schemas
Backup and Recovery
Backup religiously; operational data is critical to run the business, data loss is likely to entail significant monetary loss and legal liability
Instead of regular backups, some environments may consider simply reloading the OLTP data as a recovery method

Use of CACHEADDMETHOD.
public void init()
{
    super();
    this.cacheAddMethod(tablemethodstr(VendTransOpen,
        nextCashDiscDate));
    this.cacheAddMethod(tablemethodstr(VendTransOpen,
        nextCashDiscAmount));
}


To cache display methods perormance
When a class extends RUNBASE, what should be the RUNON property and why?
TEMP TABLES – In which tier they will be created.
TempDB - a new option in Ax 2012. They are "physical" temporary tables held in the SQL Server database.
The new TempDB tables operate in a similar manner to InMemory tables but support more features from standard physical tables:
More powerful joins with physical tables are possible, and are properly supported by the database
Can be per-company or global
Support for normal tts transactions

Notepad: example2. How many database calls? How can the code be written for better performance?
What are set-based operations?
Allows you to insert multiple records in one database trip. Use the RecordSortedList 
construct when you want a subset of data from a particular table, and when you want
it sorted in an order that does not currently exist as an index.
Allows you to insert multiple records in one database trip. Use the RecordInsertList 
construct when you do not need to sort the data.
Allows you to copy multiple records from one or more tables directly into another
 table on a single database trip.
Allows you to update multiple rows in a table on a single database trip.
Allows you to delete multiple records from the database on a single database trip.

What happens when we use set-based operations on temporary tables?
The X++ SQL statement update_recordset enables you to update multiple rows in a single trip to the server. This means that certain tasks may have improved performance by using the power of the SQL server.
update_recordset resembles delete_from in X++ and to UPDATE SET in SQL. It works on the database server-side on an SQL-style record set, instead of retrieving each record separately by fetching, changing, and updating.
If the update method is overridden, the implementation falls back to a classic looping construction, updating records one by one just as delete_from does for deletions. This also means that the construction works on temporary tables, and whole-table-cached tables by using the looping construction.
When the table is cached  by using Entire table settings
When you set a table's CacheLookup property to EntireTable, all the records in the table are placed in the cache after the first select. This type of caching follows the rules of single record caching. This means that the SELECT statement WHERE clause must include equality tests on all fields of the unique index that is defined in the table's PrimaryIndex property.
When is a set-based operation downgraded to record-based operation?

Insert or the AOSvalidateInsert methods are overridden on the target table
alert are set to be triggered  by insert  into target table
The database log is  configured to  log insert  into the target table
Record level security is enabled on the target table , if the RLS is  enabled on source table then insert record set is not down graded by a row by row operation
Validtimestatefield type property is set as none as property for a table
Notepad: example3. Will RECORDINSERTLIST.ADD (CUSTTABLE) insert record in DB?
{
    RecordSortedList recordSortedList;
    CustTable        custTable;
    ;
 
    recordSortedList = new RecordSortedList(tablenum(CustTable));
    recordSortedList.sortOrder(fieldnum(custTable,AccountNum));
    ttsbegin;
 
    // Prepare record #1 for insertion.
    custTable.AccountNum = '1000';
    custTable.CreditMax = 10000.0;
    recordSortedList.ins(custTable);
 
    // Prepare record #2 for insertion.
    custTable.AccountNum = '2000';
    custTable.CreditMax = 500.0;
    recordSortedList.ins(custTable);
 
    // Prepare record #3 for insertion.
    custTable.AccountNum = '3000';
    custTable.CreditMax = 9999999.9;
    recordSortedList.ins(custTable);
 
    // All three records inserted in one database operation.
    recordSortedList.insertDatabase();  
    ttscommit;

Notepad: example4. Which is the best type and why?
Default cache mechanism/type for AX system tables.
Not sure didn;t found the answer in net
What is the maximum record limit for client and server cache? What happens when the maximum is reached?
client cache is 100 records per table for a given company.
. The maximum number of records maintained in a server cache is 2,000 records per table for a given company.
To know whether a record is fetched from client cache, server cache or database, use wasCached() of the TableBuffer used in Select.

 
select * from salesTable where salesTable.salesId == 'AR_2009';
info(strfmt("%1",salesTable.wasCached()));


Notepad: example5. Walkthrough the code and explain.
Notepad: example6. We can update a record with out transaction integrity check. How?


how to put a degbugger in sales form letter or in batch job????

what are the types of exception thrown in ax 2012???

what are the types of validation in ax 2012????

which method is called first validatewrite or modified field

ans: the validate write is always called first and then the modified field try putting a debugger in both the method and see changing the vaulue of the field you will come to know that first always validate write will get tr9iggered.

Question -why we can't filter display methods in ax ???

ans - When you filter data, AX adds an appropriate WHERE clause to the query to database. Because display methods don't exist in database, it's impossible to create such a WHERE clause. Therefore you can't filter by display methods.

Question: how many ways can you insert the data in container
Question:diffrence between List and set as collection class
Question: what are uses of titlefield1 and title field2 apart from displaying in the form header.




Monday 24 November 2014

code to create a new postal address for a existing customer in Ax 2012

static void Job1(Args _args)
{
  LogisticsElectronicAddress    LogisticsElectronicAddress;
  CustTable                     CustTable;
  DirPartyContactInfoView       contactInfo;
  DirPartyPostalAddressView     postalAddress;
  DirParty                        dirParty;
  DirPartyPostalAddressView       dirPartyPostalAddressView;
  DirPartyContactInfoView         dirPartyContactInfo;

  CustTable = CustTable::find("LOL-000002");
  info(strfmt("%1",CustTable.email()));
  info(strfmt("%1",CustTable.address()));
  ttsBegin;

  try
  {


   dirParty = DirParty::constructFromCommon(CustTable);
   dirPartyPostalAddressView.LocationName      ='HeadQuarters ';
   dirPartyPostalAddressView.City              ='chennai';
   dirPartyPostalAddressView.Street            ='4th Avenue';
   dirPartyPostalAddressView.StreetNumber      ='18';
   dirPartyPostalAddressView.CountryRegionId   ='IND';
  // dirPartyPostalAddressView.State             ='SP';
   dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);

    dirPartyContactInfo.LocationName    ='SouthStreet Contact Phone';
    dirPartyContactInfo.Locator         ='9600147034';
    dirPartyContactInfo.Type            = LogisticsElectronicAddressMethodType::Phone;
    dirPartyContactInfo.IsPrimary       = NoYes::Yes;

        // Fill Contacts
     dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
     info("address created ");

        // Marks the end of transaction.

      ttsCommit;
    }

    catch(Exception::Error)
    {
       ttsAbort;
       throw Exception::Error;
    }


}

Saturday 22 November 2014

OCC vs PCC

OCC: - Optimistic Concurrency Control
           Optimistic Concurrency Control (OCC) helps increase database performance, Optimistic Concurrency only locks records from the time when the actual update is performed
OCC Enabled: Yes
PCC: - 
           Pessimistic Concurrency Control locks records as soon as they are fetched from the database for an update. Pessimistic concurrency was the only option available in Microsoft Axapta 3.0 (now a part of Microsoft Dynamics). 


http://axaptainfo.blogspot.in/2012/03/optimistic-concurrency-control-occ.html

Primary key, Primary Index and Clustured Index,,,,




There are two main types of indexes that we can have on a Microsoft SQL Server backend Database. These are normal and clustered indexes. Normal index can be viewed as the index in the back of a book. We first look in the index for a topic. After finding the topic in alphabetical order we also find the page number or address of the topic in the book. We then use the address to easily find the topic. If we did not have this index we would have to search sequentially through the book and the larger the book the greater the effort and time to either find a topic or realize that it does not exist.

This is similar to a normal index in the database where we have the data stored in one file and the index stored in another file in the order specified. The database engine using the index will first look in the index file then retrieve the address of the record that is used to locate the record in the data file.

For clustered index the records in the data file are sorted in the order of the index. We therefore do not have a separate index file from the data file as we have for normal index. You should also note that it is only possible to have one clustered index per table, since the records may only be sorted in one order at any time. You can have several normal indexes and one clustered index for each table. Clustered indexes are more efficient since the index is the actual data records and hence you do not need to seek in another file after finding the key.

The Primary Index of a table is the main index that is used to uniquely identify records in it. No duplicated values are allowed in this index and all fields in the index are required. You can designate a clustered or normal index as the primary index. Since the primary index is the main index you should gain optimum performance by designating a clustered index for this purpose.

Please note that indexes in general improve performance for search but not for inserts or update, since the overhead of organizing and or writing the index is involved.

The fields in the Primary key uniquely identify records in any given table. Each unique combination ofPrimary key fields uniquely identifies one (and only one) record in the table. Primary keys MUST be unique. There can only be ONE primary key per table. Not all unique indexes are primary keys.

The Clustered index is the physical order in which records are stored in the table. Say you have a clustered index on a text field called "Name", and you insert a record with a name that starts with a letter D, the record will physically be inserted between the C and the E record. Clustered indexes do not have to be unique.

Friday 7 November 2014

inventory dimensions in ax 2012

The inventory dimensions can be assigned to inventory dimension groups:
  • Product dimension group:
    • Configuration
    • Color
    • Size
  • Storage dimension group:
    • Site
    • Warehouse
    • Location
    • Pallet ID
  • Tracking dimension group:
    • Batch number
    • Serial number

Monday 3 November 2014

create a base enum by x++ job

static void Job57(Args _args)
{

  TreeNode node;
TreeNode dynamicEnum = TreeNode::findNode("\\Data Dictionary\\Base Enums\\DynamicEnum");
Dialog dialog = new Dialog();
int id;
;

if(dynamicEnum)
{
  if(box::yesNo("allready exist wanna delete",dialogbutton::No)==dialogbutton::yes)
{
    dynamicEnum.AOTdelete();
    node = TreeNode::findNode("\\Data Dictionary\\Base Enums");
    dynamicEnum = node.AOTadd("DynamicEnum");
    dynamicEnum.AOTadd("jitendra");
    dynamicEnum.AOTadd("sagar");
    dynamicEnum.AOTadd("iswar");
    dynamicEnum.AOTadd("Arun");
    dynamicEnum.AOTsave();
    dynamicEnum.AOTcompile();
    info("DynamicEnum created");
}
}
else
{
    node = TreeNode::findNode("\\Data Dictionary\\Base Enums");
    dynamicEnum = node.AOTadd("DynamicEnum");
    dynamicEnum.AOTadd("jitendra");
    dynamicEnum.AOTadd("sagar");
    dynamicEnum.AOTadd("iswar");
    dynamicEnum.AOTsave();
    dynamicEnum.AOTcompile();
    info("DynamicEnum created");
}

}

Monday 27 October 2014

how to locate AUC file in AX 2012

The location of the file depends on your operating system. Under Windows XP the file will be located under your Local Settings\Application Data folder. Usually, this is as follows:
C:\Documents and Settings\%USERNAME%\Local Settings\Application Data
Under Windows 7 and Windows Vista the file will be located under:
%USERPROFILE%\AppData\Local

 cache file is stored together with the user profile information. And as so it's location varies according to the operating system version used.

You can find it in following folder:
Windows XP and Windows 2003
C:\Documents and Settings\%username%\Local Settings\Application Data

Windows Vista, Windows 7 and Windows 2008
C:\Users\%username%\AppData\Local

Thursday 23 October 2014

basic C# programming structure

A C# program basically consists of the following parts:

Namespace declaration
 A class
 Class methods
 Class attributes
 A Main method
 Statements & Expressions
 Comments

**********************************

using System;
namespace HelloWorldApplication
{
 class HelloWorld
 {
 static void Main(string[] args)
 {
 /* my first program in C# */
 Console.WriteLine("Hello World");
 Console.ReadKey();
 }
 }
}

******************************************


Let us look at various parts of the above program:
 The first line of the program using System; - the using keyword is used to include the System namespace in 
the program. A program generally has multiple using statements.
 The next line has the namespace declaration. A namespace is a collection of classes. The
HelloWorldApplication namespace contains the class HelloWorld.
 The next line has a class declaration, the class HelloWorld contains the data and method definitions that your 
program uses. Classes generally would contain more than one method. Methods define the behavior of the class. 
However, the HelloWorld class has only one method Main.
 The next line defines the Main method, which is the entry point for all C# programs. The Main method states 
what the class will do when executed
 The next line /*...*/ will be ignored by the compiler and it has been put to add additional comments in the program.
 The Main method specifies its behavior with the statement Console.WriteLine("Hello World");
WriteLine is a method of the Console class defined in the System namespace. This statement causes the 
message "Hello, World!" to be displayed on the screen.
 The last line Console.ReadKey(); is for the VS.NET Users. This makes the program wait for a key press and it 
prevents the screen from running and closing quickly when the program is launched from Visual Studio .NET.
It's worth to note the following points:
 C# is case sensitive.
 All statements and expression must end with a semicolon (;).
 The program execution starts at the Main method.
 Unlike Java, file name could be different from the class name

Monday 20 October 2014

get AX username in a X++ job

create a new job and paste the code there:

                     UserInfo                    userinfo;

                   Select name from userinfo where userinfo.id == curUserId();

                    Box::info("Welcome"+userinfo.name);

Friday 17 October 2014

Filter Records in Form by using Combo Box in AX 2012

SQL throws an error message like cannot select a record in form/table,The sql databse has issued an error.

please do the following steps:

)According to the error message either the location C:\Program Files\Microsoft Dynamics AX\40\Server\UAT\Log\ is not accessible or the account is not having sufficient permission.

have you tried changing the default location of the SQL log file and check if you are experiencing the error messages or not.

2)You have to restart the sql server reporting services on the server. For this type services.msc on run on your server and enter then restart the sql server reporting services. This may serve your purpose.

3)Run a full database synch on all of your tables.
Admin > Periodic > SQL administration > Table Actions > Synchronize database

*******************************************************************************************
 when the data in a test instance is refreshed from the production environment and the definition of a table in the test environment has been altered. In this case you should be able to fix the problem by resynchronizing. This process will modify the SQL table to match the definition in AX.

To resynchronize, go to System Administration>Periodic>SQL administration. I always select “All Tables” and under table actions click on “Check Synchronize.” This will take a few minutes to run. During the process you may get warnings. Read the warnings carefully and consider the implications before you tell it to continue. 

Thursday 16 October 2014

advantages and disadvantages of indexes in ax 2012



The advantages of indexes are as follows:
  • Their use in queries usually results in much better performance.
  • They make it possible to quickly retrieve (fetch) data.
  • They can be used for sorting. A post-fetch-sort operation can be eliminated.
  • Unique indexes guarantee uniquely identifiable records in the database.
The disadvantages of indexes are as follows:
  • They decrease performance on inserts, updates, and deletes.
  • They take up space (this increases with the number of fields used and the length of the fields).
  • Some databases will monocase values in fields that are indexed.
You should only create indexes when they are actually needed.
Take care not to add an index on something that has already been indexed. If you need a more detailed index, you can add fields to an existing index as long as it is not a unique index.
please go through for more info :

intercompany PO multiple product receipt by x++

public void processStampICPO(PackingSlipId _deliveryNote,                             Transdate _deliverydate,                             ...