Authorization
The user needs at least the right to view the statistics
. In addition, the main group rights are observed for customers with a stored main group.
Technical information
The "Sales per customer and code" report prepares data with the following SQL query:
Sales per customer and code
declare @INNO_USER varchar(12) = :INNO_USER;declare @INNO_USER_LANG int = :INNO_USER_LANG;declare @date_from date = :date_from;declare @date_to date = :date_to;/*declare @INNO_USER varchar(12) = 'inno';declare @INNO_USER_LANG int = 0;declare @date_from date = '01.01.2000';declare @date_to date = '01.01.2010';*/with umsatz as( SELECT VKUNADR.ADRNR, VKUNADR.ADRNAME, BFKOPF.PROJNR, SUM(NETTO) AS UMSATZ, OPTION_K.KENNUNG AS KENNUNG, OPTION_K.KNR AS KNR, VKUNADR.OGRNR, (SELECT COALESCE(SUM(BF1.NETTO), 0) FROM BFKOPF BF1 WHERE BF1.ProjNr = BFKOPF.ProjNr AND BF1.ERSTDATUM >= @DATE_FROM AND BF1.ERSTDATUM <= DATEADD(day, 1, @DATE_TO) AND BF1.ART = 'GM' AND NOT coalesce(BF1.RECHNUNGSART, 0) IN (4,5) ) AS SUMME_GUTSCHRIFTEN, COALESCE(SUM(NETTO),0) - (SELECT COALESCE(SUM(BF1.NETTO),0) FROM BFKOPF BF1 WHERE BF1.ProjNr = BFKOPF.ProjNr AND BF1.ERSTDATUM >= @DATE_FROM AND BF1.ERSTDATUM <= DATEADD(day, 1, @DATE_TO) AND BF1.ART = 'GM' AND NOT coalesce(BF1.RECHNUNGSART, 0) IN (4,5) ) AS SUMME_GESAMT FROM BFKOPF JOiN VKUNADR ON VKUNADR.ADRNR = BFKOPF.DEBITNR LEFT JOIN KUNDE ON KUNDE.PROJNR = BFKOPF.PROJNR LEFT JOIN OPTION_K ON (OPTION_K.KNR = KUNDE.KNR AND OPTION_K.LANGUAGE = @INNO_USER_LANG) WHERE BFKOPF.ERSTDATUM >= @DATE_FROM AND BFKOPF.ERSTDATUM <= DATEADD(day, 1,@DATE_TO) AND BFKOPF.ART = 'AM' AND NOT coalesce(BFKOPF.RECHNUNGSART, 0) IN (4,5) and (VKUNADR.OGRNR IN (SELECT OGRNR FROM PWOGRUPP WHERE NAME = @INNO_USER AND RECHT >= 1)) AND ((:user_ogrnr_isNull = 1) OR (VKUNADR.OGRNR IN (:user_ogrnr))) GROUP BY VKUNADR.ADRNR, VKUNADR.ADRNAME, BFKOPF.PROJNR, OPTION_K.KENNUNG, OPTION_K.KNR, VKUNADR.OGRNR) select u.adrnr, u.AdrName, Round(sum(u.Umsatz), 2) SUMME_RNG, u.kennung, u.knr, u.AdrName + '_' + cast(u.knr as varchar) ordernr, Round(sum(u.SUMME_GUTSCHRIFTEN), 2) SUMME_GUTSCHRIFTEN, Round(sum(u.SUMME_GESAMT), 2) SUMME_GESAMT from umsatz u group by u.adrnr, u.AdrName, u.kennung, u.knrunion all select u.adrnr, u.AdrName, Round(sum(u.Umsatz), 2) SUMME_RNG, '' kennung, 0 knr, u.AdrName + '_999' ordernr, Round(sum(u.SUMME_GUTSCHRIFTEN), 2) SUMME_GUTSCHRIFTEN, Round(sum(u.SUMME_GESAMT), 2) SUMME_GESAMT from umsatz u group by u.adrnr, u.AdrNameORDER BY ordernr
The interface of the evaluation is stored in the following data set in the table "Statistic_UI":
INSERT Sales per customer and code
INSERT INTO STATISTIC_UI (ID, NAME, STATISTIC_CONFIGURATION, STATISTIC_CONTROLLER, CATEGORY_ID, DELETED, DESCRIPTION, IS_INTERNAL, OVERRIDDEN_BY)VALUES ('{13540FB3-149E-4ED1-86F9-0A7BD09B06A8}13', 'Umsatz pro Kunde und Kennung', '{ "type": "STATISTIK", "rows": [ { "type": "ROW", "rowItems": [ { "type": "TABLE", "width": "12", "name": "", "dataUrl": "api/dynamicapi/{205C8FC4-03D9-4C75-9634-CE9A6C9B7E72}17/GetData", "columns": [ { "header": "{{{Statistik.Kundennummer}}}", "columnName": "ADRNR", "template": "# //style=''font-weight:bold; background-color:red''\n\ts = \"<div>\" +\n\t \"<a href=\"+context.INNO_BASE_PATH +\"Statistic/StatisticWebPage\\\\#/statistic/{13540FB3-149E-4ED1-86F9-0A7BD09B06A8}21?ADRNR=\"+row.ADRNR +\"&_drilldown=true\\>\"+row.ADRNR+\"</a>\" +\n\t \"</div>\";\n\treturn s;\n\t\t\n#\n", "width": "115px" }, { "header": "{{{Standard.Name}}}", "columnName": "ORDERNR", "template": "# \nreturn row.ADRNAME; \n#\n", "width": "" }, { "header": "{{{Field.Einsatz.kennung}}}", "columnName": "ORDERNR", "template": "# return row.KENNUNG; #\n", "width": "150px" }, { "header": "{{{Statistik.SummeRechnungen}}}", "columnName": "ORDERNR", "template": "#\n\nvar value = row.SUMME_RNG;\nvar div;\nvar knr = row.KNR;\nvar f_color = ''black;'';\n\nif (value < 0)\n f_color = ''red;'';\n\nif (knr == ''0'')\n div = ''<div style=\"color:'' + f_color + ''font-weight:bold;font-size:100%;\">'';\nelse\n div = ''<div style=\"color:'' + f_color + ''\">'';\n \nreturn div + value.toFixed(2).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\") + ''</div>''; \n\n#", "align": "right", "width": "122px", "format": "#.00" }, { "header": "{{{Statistik.SummeGutschriften}}}", "columnName": "ORDERNR", "template": "\n# \n\nvar value = row.SUMME_GUTSCHRIFTEN;\nvar div;\nvar knr = row.KNR;\nvar f_color = ''black;'';\n\nif (value > 0)\n f_color = ''red;'';\n\nif (knr == ''0'')\n div = ''<div style=\"color:'' + f_color + ''font-weight:bold;font-size:100%;\">'';\nelse\n div = ''<div style=\"color:'' + f_color + ''\">'';\n \nreturn div + value.toFixed(2).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\") + ''</div>''; \n\n#", "align": "right", "width": "122px", "format": "#.00" }, { "header": "{{{Statistik.Umsatz}}}", "columnName": "ORDERNR", "template": "# \n\nvar value = row.SUMME_GESAMT;\nvar div;\nvar knr = row.KNR;\nvar f_color = ''black;'';\n\nif (value < 0)\n f_color = ''red;'';\n\nif (knr == ''0'')\n div = ''<div style=\"color:'' + f_color + ''font-weight:bold;font-size:115%;\">'';\nelse\n div = ''<div style=\"color:'' + f_color + ''\">'';\n \nreturn div + value.toFixed(2).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\") + ''</div>''; \n\n#", "align": "right", "width": "115px", "format": "#0.00" } ], "uid": "068a03e4-e109-4bd3-86ec-f62aaa8c5441", "titel": "Umsatz pro Kunde und Kennung", "exportTemplate": "", "dataSource": { "dataUrl": "api/dynamicapi/{205C8FC4-03D9-4C75-9634-CE9A6C9B7E72}17/GetData", "_Object_Type": "sql" } } ], "uid": "4b873895-75f3-427a-9ff2-8a6e1321c0f8" } ], "parameters": [ { "type": "DATE", "width": "7", "name": "date_from", "label": "{{{Standard.Von}}}", "uid": "9013e5fa-7df2-418e-a4dc-3a4a41f4d7f8" }, { "type": "DATE", "width": "7", "name": "date_to", "label": "{{{Standard.Bis}}}", "uid": "a9036f04-a4c6-4e08-a3f8-bc0e691f8dde" }, { "type": "MULTISELECT", "width": "12", "uid": "6efd5fd6-1b79-459f-b7b6-913d99238bf1", "name": "user_ogrnr", "label": "{{{Statistik.Obergruppe}}}", "dataUrl": "api/dynamicapi/{205C8FC4-03D9-4C75-9634-CE9A6C9B7E72}1/GetData", "keyField": "OGRNR", "valueField": "OBERGRUPPE" } ], "settings": { "type": "SETTINGS" }}', 'var controller={};controller.getInitialValues = function(paramsFromStorage){ if (paramsFromStorage) { return paramsFromStorage; } var Jahr = new Date().getFullYear(); return { date_from: ''01.01.'' + Jahr, date_to: ''31.12.'' + Jahr }; }controller;', 8, 0, '<h4>Umsatz pro Kunde unterteilt nach Kennung und Gesamtumsatz pro Kunde.</h4>Per Klick auf die Kundennummer wird auf die kundenspezifische quartalsweise Umsatzübersicht im Zeitraum verwiesen. <br><br><h4>Filter:</h4><ul> <li>Von - Bis <li>Obergruppe (unter Berücksichtigung der Benutzerberechtigung) des Auftraggebers</ul>', 1, NULL);The SQL query for the drilldown evaluation "Sales per customer per quarter" looks like this:
Sales per customer per quarter
WITH RECHNUNGEN As ( SELECT DEBITNR,NETTO,DATEPART(year,ERSTDATUM) AS JAHR, DATEPART(quarter,ERSTDATUM) AS QUARTAL FROM BFKOPF WHERE ART IN ('AM','GM') AND DEBITNR = :ADRNR AND ERSTDATUM BETWEEN :date_from AND :date_to ), QUARTALRESULT As -- Man kann über selbst vergebene Aliase (RECHNUNGEn.QUARTAL) nicht groupen daher noch eine View ( SELECT DEBITNR,SUM(NETTO) AS UMSATZ,QUARTAL,JAHR FROM RECHNUNGEN GROUP BY JAHR,QUARTAL,DEBITNR,NETTO ), COMBINEDRESULT AS -- Um jetzt alle zusammenzufassen, wo QUARTAL,JAHR,DEBITNR in einer Zeile gleich sind ( SELECT DEBITNR,ROUND(SUM(UMSATZ),2) AS TOTALUMSATZ,QUARTAL,JAHR FROM QUARTALRESULT GROUP BY DEBITNR,JAHR,QUARTAL ), ZeitEinheitQuartal As ( SELECT TOTALUMSATZ, (Cast(QUARTAL as varchar) + '.' + Cast(JAHR as varchar)) AS ZEITEINHEIT FROM COMBINEDRESULT ), JAHRTABLE As ( SELECT JAHR,QUARTAL,(Cast(QUARTAL as varchar) + '.' + Cast(JAHR as varchar)) AS ZEITEINHEIT FROM DIM_DATUM WHERE DATUMDT BETWEEN :date_from AND :date_to GROUP BY JAHR,QUARTAL )SELECT JAHR,QUARTAL,JAHRTABLE.ZEITEINHEIT,TOTALUMSATZFROM JAHRTABLELEFT JOIN ZEITEINHEITQUARTAL ZQ ON ZQ.ZEITEINHEIT = JAHRTABLE.ZEITEINHEITORDER BY JAHR,QUARTAL
The interface of the evaluation is stored in the following data set in the "Statistic_UI" table:
INSERT Sales per customer per quarter
INSERT INTO STATISTIC_UI (ID, NAME, STATISTIC_CONFIGURATION, STATISTIC_CONTROLLER, CATEGORY_ID, DELETED, DESCRIPTION, IS_INTERNAL, OVERRIDDEN_BY)VALUES ('{13540FB3-149E-4ED1-86F9-0A7BD09B06A8}21', 'Umsatz Je Kunde Pro Quartal', '{ "type": "STATISTIK", "rows": [ { "type": "ROW", "rowItems": [ { "type": "CHART", "width": "12", "uid": "40a5d362-596c-45cf-bbf8-e62d05459b1e", "titel": "{{{Statistik.UmsatzProQuartal}}}", "dataUrl": "api/dynamicapi/{205C8FC4-03D9-4C75-9634-CE9A6C9B7E72}37/GetData", "chartSettings": { "series": [ { "field": "TOTALUMSATZ", "type": "column", "colorField": "" } ], "categoryAxis": { "field": "ZEITEINHEIT" }, "theme": "bootstrap", "valueAxis": null }, "label": "", "pageSize": "20", "height": "" } ], "uid": "33259864-27cc-4d26-9cd6-8465fc7e9444" } ], "parameters": [ { "type": "DATE", "width": "7", "uid": "09ed7b73-b428-4c12-8a95-0d4ef97035e4", "name": "date_from", "label": "{{{Standard.Von}}}" }, { "type": "DATE", "width": "7", "uid": "ebedfb88-c061-4ade-b291-268f9a173cc6", "name": "date_to", "label": "{{{Standard.Bis}}}" }, { "type": "REACTTEXT", "width": "7", "uid": "f5565303-b828-4304-a929-5a24cc6ee5d2", "name": "ADRNR", "label": "{{{Statistik.Kundennummer}}}" } ], "settings": { "type": "SETTINGS" }}', 'var controller={};controller.getInitialValues = function(paramsFromStorage,params){ debugger;var initVal = {}; if (paramsFromStorage) { initVal = paramsFromStorage; } if(params && params.ADRNR){ initVal.ADRNR = params.ADRNR; } return initVal; var Jahr = new Date().getFullYear(); return { date_from: ''01.01.'' + Jahr, date_to: ''31.12.'' + Jahr }; }controller;', NULL, 0, '', 1, NULL);