Skip to content
Snippets Groups Projects
Commit 92c8c0ae authored by Sebastian Pongratz's avatar Sebastian Pongratz :ping_pong:
Browse files

Merge branch 'sals_2001215_ImprovePerformance' into '2021.2'

[Projekt: xRM-Sales][TicketNr.: 2001215][Performance optimieren]

See merge request xrm/basic!1591
parents 3df4189d 65af70fc
No related branches found
No related tags found
No related merge requests found
Showing
with 151 additions and 87 deletions
...@@ -3,4 +3,7 @@ import("system.result"); ...@@ -3,4 +3,7 @@ import("system.result");
import("Sql_lib"); import("Sql_lib");
var sqlHelper = new SqlMaskingUtils(); var sqlHelper = new SqlMaskingUtils();
result.string(sqlHelper.concatenate([sqlHelper.cast(sqlHelper.cast("ADVERTISINGITEM.PRICE*ADVERTISINGITEM.QUANTITY", SQLTYPES.DECIMAL, [30, 2]), SQLTYPES.VARCHAR, 20), "' '", sqlHelper.cast("ADVERTISING.CURRENCY", SQLTYPES.VARCHAR, 20)]))
\ No newline at end of file var actualAmount = sqlHelper.trim(sqlHelper.cast(sqlHelper.cast(sqlHelper.cast("ADVERTISINGITEM.PRICE*ADVERTISINGITEM.QUANTITY", SQLTYPES.DECIMAL, [30, 2]), SQLTYPES.CHAR, 36), SQLTYPES.VARCHAR, 36));
var currency = sqlHelper.cast("ADVERTISING.CURRENCY", SQLTYPES.VARCHAR, 20);
result.string(sqlHelper.concatenate([actualAmount, "' '", currency]))
\ No newline at end of file
...@@ -1431,6 +1431,10 @@ ...@@ -1431,6 +1431,10 @@
<name>GROSS.value</name> <name>GROSS.value</name>
<expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/gross.value/expression.js</expression> <expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/gross.value/expression.js</expression>
</dbRecordFieldMapping> </dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>FullOfferCode.value</name>
<expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/fulloffercode.value/expression.js</expression>
</dbRecordFieldMapping>
</recordFieldMappings> </recordFieldMappings>
<linkInformation> <linkInformation>
<linkInformation> <linkInformation>
......
import("system.SQLTYPES");
import("Sql_lib");
import("system.translate");
import("system.result");
import("system.vars");
var masking = new SqlMaskingUtils();
var offercode = masking.trim(masking.cast(masking.cast("OFFER.OFFERCODE", SQLTYPES.CHAR, 36), SQLTYPES.VARCHAR, 36));
var versNr = masking.trim(masking.cast(masking.cast("OFFER.VERSNR", SQLTYPES.CHAR, 36), SQLTYPES.VARCHAR, 36));
var caseWhen = SqlBuilder.caseWhen(newWhere("OFFER.OFFERCODE is null"))
.thenString(translate.text("Offer"))
.elseValue(masking.concatWithSeparator([offercode, versNr], "-"));
result.string(caseWhen.toString());
\ No newline at end of file
...@@ -267,6 +267,10 @@ ...@@ -267,6 +267,10 @@
<name>PICTURE.value</name> <name>PICTURE.value</name>
<expression>%aditoprj%/entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression> <expression>%aditoprj%/entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
</dbRecordFieldMapping> </dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>RESPONSIBLE_CONTACT_ID.displayValue</name>
<expression>%aditoprj%/entity/Planning_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js</expression>
</dbRecordFieldMapping>
</recordFieldMappings> </recordFieldMappings>
<linkInformation> <linkInformation>
<linkInformation> <linkInformation>
......
import("Contact_lib");
import("system.result");
result.string(ContactUtils.getResolvingDisplaySubSql("FORECAST.RESPONSIBLE_CONTACT_ID", true));
\ No newline at end of file
...@@ -116,7 +116,6 @@ ...@@ -116,7 +116,6 @@
<stateProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/stateProcess.js</stateProcess> <stateProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/stateProcess.js</stateProcess>
<titleProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/titleProcess.js</titleProcess> <titleProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/titleProcess.js</titleProcess>
<valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/valueProcess.js</valueProcess> <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/valueProcess.js</valueProcess>
<displayValueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/displayValueProcess.js</displayValueProcess>
<onValueChange>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/onValueChange.js</onValueChange> <onValueChange>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/onValueChange.js</onValueChange>
</entityField> </entityField>
<entityParameter> <entityParameter>
...@@ -321,19 +320,33 @@ ...@@ -321,19 +320,33 @@
</recordFieldMappings> </recordFieldMappings>
<linkInformation> <linkInformation>
<linkInformation> <linkInformation>
<name>12b86a0c-4151-491a-83be-8729ed65e24e</name> <name>363ada56-fb47-4a39-b561-a7e8a4d569a0</name>
<tableName>PRODUCTPRICE</tableName> <tableName>PRODUCTPRICE</tableName>
<primaryKey>PRODUCTPRICEID</primaryKey> <primaryKey>PRODUCTPRICEID</primaryKey>
<isUIDTable v="true" /> <isUIDTable v="true" />
<readonly v="false" /> <readonly v="false" />
</linkInformation> </linkInformation>
<linkInformation> <linkInformation>
<name>19c76b4d-ec0f-40d8-abab-fe91c882f0b9</name> <name>933e89d2-dadc-4656-9ad1-8a45eeb558eb</name>
<tableName>PRODUCT</tableName> <tableName>PRODUCT</tableName>
<primaryKey>PRODUCTID</primaryKey> <primaryKey>PRODUCTID</primaryKey>
<isUIDTable v="false" /> <isUIDTable v="false" />
<readonly v="true" /> <readonly v="true" />
</linkInformation> </linkInformation>
<linkInformation>
<name>4b5e3d1d-2b3a-4297-8c0b-34772c4eda76</name>
<tableName>CONTACT</tableName>
<primaryKey>CONTACTID</primaryKey>
<isUIDTable v="false" />
<readonly v="true" />
</linkInformation>
<linkInformation>
<name>e149aa57-4418-43b4-83ad-0e9c29d851d7</name>
<tableName>ORGANISATION</tableName>
<primaryKey>ORGANISATIONID</primaryKey>
<isUIDTable v="false" />
<readonly v="true" />
</linkInformation>
</linkInformation> </linkInformation>
<filterExtensions> <filterExtensions>
<filterExtension> <filterExtension>
......
import("system.result");
import("system.neon");
import("system.vars");
import("Keyword_lib");
import("KeywordRegistry_basic");
if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
{
result.string(KeywordUtils.getViewValue($KeywordRegistry.productPricelist(), vars.get("$field.PRICELIST")));
}
...@@ -2,5 +2,7 @@ import("system.result"); ...@@ -2,5 +2,7 @@ import("system.result");
import("Sql_lib"); import("Sql_lib");
const from = new SqlBuilder().from("PRODUCTPRICE") const from = new SqlBuilder().from("PRODUCTPRICE")
.join("PRODUCT", "PRODUCTPRICE.PRODUCT_ID = PRODUCT.PRODUCTID"); .join("PRODUCT", "PRODUCTPRICE.PRODUCT_ID = PRODUCT.PRODUCTID")
.leftJoin("CONTACT", "CONTACT.CONTACTID = PRODUCTPRICE.CONTACT_ID")
.leftJoin("ORGANISATION", "CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID")
result.string(from.toString()); result.string(from.toString());
import("KeywordRegistry_basic");
import("Keyword_lib");
import("system.result"); import("system.result");
import("Sql_lib"); import("Sql_lib");
import("Keyword_lib");
import("KeywordRegistry_basic");
var sql = SqlBuilder.caseWhen("PRODUCTPRICE.CONTACT_ID is null") var caseWhen = SqlBuilder.caseWhen(newWhere("PRODUCTPRICE.PRICELIST is null").or("PRODUCTPRICE.PRICELIST = ''"))
.then(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productPricelist(), "PRODUCTPRICE.PRICELIST")) .then("ORGANISATION.NAME").elseValue(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productPricelist(), "PRODUCTPRICE.PRICELIST"));
.elseValue(
newSelect("ORGANISATION.NAME").from("ORGANISATION") result.string(caseWhen.toString());
.join("CONTACT", "CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID") \ No newline at end of file
.where("CONTACT.CONTACTID = PRODUCTPRICE.CONTACT_ID")
);
result.string(sql.toString());
...@@ -167,6 +167,10 @@ ...@@ -167,6 +167,10 @@
<isFilterable v="true" /> <isFilterable v="true" />
<isLookupFilter v="true" /> <isLookupFilter v="true" />
</dbRecordFieldMapping> </dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>MILESTONEVALUE.displayValue</name>
<expression>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/milestonevalue.displayvalue/expression.js</expression>
</dbRecordFieldMapping>
</recordFieldMappings> </recordFieldMappings>
<linkInformation> <linkInformation>
<linkInformation> <linkInformation>
......
import("system.result");
import("Keyword_lib");
import("KeywordRegistry_basic");
var sql = KeywordUtils.getResolvedTitleSqlPart("SALESPROJECT_MILESTONE.KIND", "SALESPROJECT_MILESTONE.MILESTONEVALUE");
result.string(sql);
\ No newline at end of file
...@@ -617,12 +617,6 @@ ...@@ -617,12 +617,6 @@
</entityParameter> </entityParameter>
</children> </children>
</entityConsumer> </entityConsumer>
<entityField>
<name>PHASEINFO</name>
<title>phase information</title>
<contentType>HTML</contentType>
<valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/phaseinfo/valueProcess.js</valueProcess>
</entityField>
<entityField> <entityField>
<name>PROJECTTYPE</name> <name>PROJECTTYPE</name>
<title>Project type</title> <title>Project type</title>
......
import("system.result");
result.string("Hier können zu jeder Phase Informationen.")
\ No newline at end of file
import("system.result");
import("system.neon"); import("system.neon");
import("system.result");
import("system.vars"); import("system.vars");
import("KeywordRegistry_basic"); import("KeywordRegistry_basic");
// IDs: SalesprojectState Order and Lost var state = neon.COMPONENTSTATE_INVISIBLE;
var componentState = neon.COMPONENTSTATE_INVISIBLE; if ((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
if(vars.get("$field.STATUS") == $KeywordRegistry.salesprojectState$order() || vars.get("$field.STATUS") == $KeywordRegistry.salesprojectState$lost()) && (vars.get("$field.STATUS") == $KeywordRegistry.salesprojectState$order() || vars.get("$field.STATUS") == $KeywordRegistry.salesprojectState$lost()))
{ {
componentState = neon.COMPONENTSTATE_EDITABLE; state = neon.COMPONENTSTATE_EDITABLE;
} }
result.string(componentState); result.string(state);
\ No newline at end of file
...@@ -23,9 +23,8 @@ if( vars.exists("$local.grouped")) ...@@ -23,9 +23,8 @@ if( vars.exists("$local.grouped"))
var sqlHelper = new SqlMaskingUtils(); var sqlHelper = new SqlMaskingUtils();
var select = newSelect("count(*), results.uid, results.groupField, sum(results.sum_planning), " var select = newSelect("count(*)")
+ "sum(results.sum_forecast), sum(results.sum_turnover), sum(results.sum_forecast_weighted) ") .from(fromSql, "results")
.from("(" + fromSql.toString() + ") results")
.groupBy("results.uid, results.groupField"); .groupBy("results.uid, results.groupField");
var dataResult = select.table(); var dataResult = select.table();
...@@ -34,6 +33,6 @@ if( vars.exists("$local.grouped")) ...@@ -34,6 +33,6 @@ if( vars.exists("$local.grouped"))
} }
else else
{ {
fromSql = dynamicChart.getFromSql(); fromSql = dynamicChart.getFromSql(true);
result.string(fromSql.table().length); result.string(fromSql.table().length);
} }
\ No newline at end of file
...@@ -180,16 +180,26 @@ function TurnoverDynamicChart(pFilter) { ...@@ -180,16 +180,26 @@ function TurnoverDynamicChart(pFilter) {
* Returns the planning query. * Returns the planning query.
* *
*/ */
TurnoverDynamicChart.prototype.getPlanningFromSql = function () TurnoverDynamicChart.prototype.getPlanningFromSql = function (pIsRowCount)
{ {
var sqlHelper = new SqlMaskingUtils(); var sqlHelper = new SqlMaskingUtils();
var select = sqlHelper.concatenate(["FORECAST.FORECASTID", "PLANNING_MONTHID"]) + ", '', '', '', "; var select;
if(pIsRowCount)
if(this.groupedField) {
select = "FORECAST.FORECASTID";
}
else
{ {
select = this.groupMapping[this.groupedField]["forGrouping"][this.idxPlanning] + " as uid," if(this.groupedField)
+ " (" + this.getGroupFieldDisplayValue(this.idxPlanning) + ") as groupField, "; {
select = this.groupMapping[this.groupedField]["forGrouping"][this.idxPlanning] + " as uid,"
+ " (" + this.getGroupFieldDisplayValue(this.idxPlanning) + ") as groupField, ";
}
else
{
select = sqlHelper.concatenate(["FORECAST.FORECASTID", "PLANNING_MONTHID"]) + ", '', '', '', ";
}
} }
select += "FORECAST.VOLUME*PLANNING_MONTH.MONTH_FACTOR/100 as sum_planning, " select += "FORECAST.VOLUME*PLANNING_MONTH.MONTH_FACTOR/100 as sum_planning, "
...@@ -214,34 +224,48 @@ TurnoverDynamicChart.prototype.getPlanningFromSql = function () ...@@ -214,34 +224,48 @@ TurnoverDynamicChart.prototype.getPlanningFromSql = function ()
* *
* @param {Boolean} pIsWeighted <p> * @param {Boolean} pIsWeighted <p>
* If the forecast should be weighted the value of the parameter is true.<br> * If the forecast should be weighted the value of the parameter is true.<br>
*
* @param {Boolean} pIsRowCount <p>
* Whether or not we want the rowCount instead of retuning the data.<br>
*/ */
TurnoverDynamicChart.prototype.getForecastFromSql = function (pIsWeighted) TurnoverDynamicChart.prototype.getForecastFromSql = function (pIsWeighted, pIsRowCount)
{ {
var sqlHelper = new SqlMaskingUtils(); var sqlHelper = new SqlMaskingUtils();
var select;
var select = "FORECAST.FORECASTID, '', '', '', ";
if(pIsRowCount)
if(this.groupedField)
{ {
select = this.groupMapping[this.groupedField]["forGrouping"][this.idxForecast] + " as uid, " select = "FORECAST.FORECASTID";
+ "(" + this.getGroupFieldDisplayValue(this.idxForecast) + ") as groupField,";
} }
var volumeColumns = " 0 as sum_planning, FORECAST.VOLUME" else
+ " as sum_forecast, 0 as sum_turnover, 0 as sum_forecast_weighted"; {
select = "FORECAST.FORECASTID, '', '', '', ";
if(pIsWeighted)
{ if(this.groupedField)
if(!this.groupedField)
{ {
select = sqlHelper.concatenate(["FORECAST.FORECASTID", sqlHelper.cast("SALESPROJECT.PROBABILITY", SQLTYPES.VARCHAR, 3)]) +", '', '', '', " ; select = this.groupMapping[this.groupedField]["forGrouping"][this.idxForecast] + " as uid, "
+ "(" + this.getGroupFieldDisplayValue(this.idxForecast) + ") as groupField,";
} }
var volumeColumns;
volumeColumns = " 0 as sum_planning, 0 as sum_forecast, 0 as sum_turnover, "
+ "(FORECAST.VOLUME/100*SALESPROJECT.PROBABILITY)" if(pIsWeighted)
+ " as sum_forecast_weighted"; {
if(!this.groupedField)
{
select = sqlHelper.concatenate(["FORECAST.FORECASTID", sqlHelper.cast("SALESPROJECT.PROBABILITY", SQLTYPES.VARCHAR, 3)]) +", '', '', '', " ;
}
volumeColumns = " 0 as sum_planning, 0 as sum_forecast, 0 as sum_turnover, "
+ "(FORECAST.VOLUME/100*SALESPROJECT.PROBABILITY)"
+ " as sum_forecast_weighted";
}
else
{
volumeColumns = " 0 as sum_planning, FORECAST.VOLUME"
+ " as sum_forecast, 0 as sum_turnover, 0 as sum_forecast_weighted";
}
select += volumeColumns;
} }
select += volumeColumns;
return newSelect(select) return newSelect(select)
.from("FORECAST") .from("FORECAST")
...@@ -260,23 +284,30 @@ TurnoverDynamicChart.prototype.getForecastFromSql = function (pIsWeighted) ...@@ -260,23 +284,30 @@ TurnoverDynamicChart.prototype.getForecastFromSql = function (pIsWeighted)
* Returns the turnover query. * Returns the turnover query.
* *
*/ */
TurnoverDynamicChart.prototype.getTurnoverFromSql = function () TurnoverDynamicChart.prototype.getTurnoverFromSql = function (pIsRowCount)
{ {
var sqlHelper = new SqlMaskingUtils(); var sqlHelper = new SqlMaskingUtils();
var select;
var select = "SALESORDERITEM.SALESORDERITEMID, '', '', '', "; if(pIsRowCount)
if(this.groupedField)
{ {
select = this.groupMapping[this.groupedField]["forGrouping"][this.idxTurnover] + " as uid, " select = "SALESORDERITEM.SALESORDERITEMID";
+ "(" + this.getGroupFieldDisplayValue(this.idxTurnover) + ") as groupField, "; }
else
{
select = "SALESORDERITEM.SALESORDERITEMID, '', '', '', ";
if(this.groupedField)
{
select = this.groupMapping[this.groupedField]["forGrouping"][this.idxTurnover] + " as uid, "
+ "(" + this.getGroupFieldDisplayValue(this.idxTurnover) + ") as groupField, ";
}
var discount = sqlHelper.isNull("SALESORDERITEM.DISCOUNT", 0);
var discountedPrice = "(SALESORDERITEM.PRICE * SALESORDERITEM.QUANTITY * (100 - " + discount + ") / 100";
select += " 0 as sum_planning, 0 as sum_forecast, "
+ ""+ discountedPrice + " + " + discountedPrice + " * " + sqlHelper.isNull("SALESORDERITEM.VAT", 0) + " / 100)) as sum_turnover"
+ ", 0 as sum_forecast_weighted";
} }
select += " 0 as sum_planning, 0 as sum_forecast, "
+ "((SALESORDERITEM.PRICE * SALESORDERITEM.QUANTITY * (100 - " + sqlHelper.isNull("SALESORDERITEM.DISCOUNT", 0)
+ ") / 100) + (SALESORDERITEM.PRICE * SALESORDERITEM.QUANTITY * (100 - " + sqlHelper.isNull("SALESORDERITEM.DISCOUNT", 0)
+ ") / 100 * " + sqlHelper.isNull("SALESORDERITEM.VAT", 0) + " / 100)) as sum_turnover"
+ ", 0 as sum_forecast_weighted";
return newSelect(select) return newSelect(select)
.from("SALESORDERITEM") .from("SALESORDERITEM")
...@@ -365,12 +396,12 @@ TurnoverDynamicChart.prototype.getFilterCond = function (pKind) ...@@ -365,12 +396,12 @@ TurnoverDynamicChart.prototype.getFilterCond = function (pKind)
* The sqls of Planning, Forecast and Turnover are put together with a union and the filters are added. * The sqls of Planning, Forecast and Turnover are put together with a union and the filters are added.
* *
*/ */
TurnoverDynamicChart.prototype.getFromSql = function () TurnoverDynamicChart.prototype.getFromSql = function (pIsRowCount)
{ {
var planningSql= this.getPlanningFromSql(); var planningSql= this.getPlanningFromSql(pIsRowCount);
var forecastSql = this.getForecastFromSql(); var forecastSql = this.getForecastFromSql(false, pIsRowCount);
var forecastWeightedSql = this.getForecastFromSql(true); var forecastWeightedSql = this.getForecastFromSql(true, pIsRowCount);
var turnoverSql = this.getTurnoverFromSql(); var turnoverSql = this.getTurnoverFromSql(pIsRowCount);
if(this.filter != null && this.filter.childs.length > 0) if(this.filter != null && this.filter.childs.length > 0)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment