ADempiere Best Practices

From ADempiere
Revision as of 13:34, 17 December 2008 by Vpj-cd (Talk)

Jump to: navigation, search
This Wiki is read-only for reference purposes to avoid broken links.

Overview

 DISCLAIMER: Target of this document is developers who want to help us fixing and completing
 ADempiere's manufacturing functionality (libero).

Goal

Team

Teo Sarca Arhipac

Trifon D3Soft

Victor Perez e-Evolution

Dominik Zajac BayCIX GmbH

SVN Commit Policy

  • In SVN note always put full url to the bug report or contribution request!
    • Example
[ 2354040 ] Implementation Replication Mode, Type, Event
http://sourceforge.net/tracker/index.php?func=detail&aid=2354040&group_id=176962&atid=879335
  • Commit when you have time to fix if somethings go bad.
    • Do not commit before going to Bed!!!


Reference

SVN Best Practices

Sugesstion & Questions Commit Policy

Coding Standards

  • ...

Sugesstion & Questions Coding Standards

Coding Style

See Eclipse Code Formatter Profile .

Known issues:

  1. At present eclipse formatter is not supporting fluent interfaces (see eclipse bug #196001)


How to use Adempiere Query class?

How to return only ONE persistent object?

StringBuilder whereClause = new StringBuilder(); whereClause.append("AD_Client_ID=?"); // #1 whereClause.append(" AND AD_Org_ID=?"); // #2 whereClause.append(" AND C_AcctSchema_ID=?"); // #3 whereClause.append(" AND Account_ID=?"); // #4

MAccount existingAccount = new Query(ctx, I_C_ValidCombination.Table_Name, whereClause, null)
		.setParameters(new Object[]{AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, Account_ID})
		.first();

If you know that your query should return ONLY one result, then you can assert this, and use firstOnly method instead of first method:

MAccount existingAccount = new Query(ctx, I_C_ValidCombination.Table_Name, whereClause, null)
		.setParameters(new Object[]{AD_Client_ID, AD_Org_ID, C_AcctSchema_ID, Account_ID})
		.firstOnly();

How to return ARRAY of objects?

public static MAchievement[] getOfMeasure (Properties ctx, int PA_Measure_ID)
{
	final String whereClause = COLUMNNAME_PA_Measure_ID+"=?"; 
	List<MAchievement> list = new Query(ctx, I_PA_Achievement.Table_Name, whereClause, null)
		.setParameters(new Object[]{PA_Measure_ID})
		.setOrderBy(COLUMNNAME_SeqNo+", "+COLUMNNAME_DateDoc)
		.list();
	return list.toArray(new MAchievement[list.size()]);
}

How to return ARRAY of objects and process elements?

public static MAchievement[] getOfMeasure (Properties ctx, int PA_Measure_ID)
{
	String whereClause = COLUMNNAME_PA_Measure_ID+"=? AND "+COLUMNNAME_IsAchieved+"=?"; 
	List<MAchievement> list = new Query(ctx, MAchievement.Table_Name, whereClause, null)
		.setParameters(new Object[]{PA_Measure_ID, true})
		.setOrderBy(COLUMNNAME_SeqNo+", "+COLUMNNAME_DateDoc)
		.list();
	for(MAchievement achievement : list)
	{
	  s_log.fine(" - " + achievement);
	  // do some processing here
	}
	return list.toArray(new MAchievement[list.size()]);
}

How to pass Timestamp parameter?

Timestamp dateAcct = ...;
String trxName = ...;

String whereClause = "C_CashBook_ID=?"		//	#1
		+ " AND TRUNC(StatementDate)=?"	//	#2
		+ " AND Processed=?";
		
MCash retValue = new Query(ctx, MCash.Table_Name, whereClause, trxName)
	.setParameters(new Object[]{C_CashBook_ID, TimeUtil.getDay(dateAcct), true})
	.first()
;

How to use Query class with complex where clause: EXISTS?

String whereClause = "C_Cash.AD_Org_ID=?"		//	#1
	+ " AND TRUNC(C_Cash.StatementDate)=?"		//	#2
	+ " AND C_Cash.Processed='N'"
	+ " AND EXISTS (SELECT * FROM C_CashBook cb "
	+ "WHERE C_Cash.C_CashBook_ID=cb.C_CashBook_ID AND cb.AD_Org_ID=C_Cash.AD_Org_ID"
	+ " AND cb.C_Currency_ID=?)"			//	#3
;
MCash retValue = new Query(ctx, MCash.Table_Name, whereClause, trxName)
	.setParameters(new Object[]{AD_Org_ID,TimeUtil.getDay(dateAcct),C_Currency_ID})
	.first()
;

References

EE Best Practices

Precise Java

Sugesstion & Questions Coding Style

Test Units

  • ...

Sugesstion & Questions Test Units

Document Policy

Sugesstion & Questions Document Policy