Rapport

Sublib Rapport är en sub som jag använder för att på ett snabbt sätt kunna skapa en rapporttabell som kopplar rubrik till ett urval numeriska värden. Typiska användsingområden är att skapa resultaträkning, balansräkning eller annan kpi-rapport där rubrik kopplas till kontonummer.

I sin enklaste form kan sub rapport användas för att koppla ett konto till en rubrik, men det finns även stöd för överlappande rubriker. T.ex. konton kopplas till materialkostnader eller personalkostnader, men även den överggripande rubriken kostnader samt bidra i beräkningen av “täckningsbidraget”.

Det finns också stöd i sub rapport för att kunna beräkna kvoter av grupperingar, t.ex. beräkna kvoten av teckningsbidrag och omsättning för att få täckingsgrad.

SUB rapport används såhär

  1. Ladda datamodell med kontonummer
  2. Skapa en rapport-tabell
  3. Anrop SUB med parametrar
    1. Namnet på rapporttabell
    2. Fältnamnet som rapporten kopplar på (numerisk)
    3. Vilket grupp som avses
///$tab sublib.rapport.test
Transaktioner: 
crosstable (Datum, Belopp,2)
LOAD* inline [
Bolag, 	Konto,  2023 Q2,2023 Q1,2022 Q4,2022 Q3,2022 Q2,2022 Q1,2022 Q4,2021 Q3,2021 Q2,2021 Q1
ACME,	3010,   8784,   8284,	8758,   8772,   8211,   7990,   7602,   7330,   6808,   6519
ACME, 	4415,   -5179,  -4929,  -5268,  -5278,  -4927,  -4699,  -4376,  -4182,  -3905,  -3810
ACME, 	6000,   -2704,  -2548,  -2720,  -2939,  -2580,  -2485,  -2409,  -2362,  -2188,  -2103
ACME, 	7200,   -200,   -195,   -221,   -253,   -237,   -193,   -191,   -189,   -179,   -174
ACME, 	8311,   2,   	0,   	0, 		1,   	1,   	1,   	2,   	2, 		2,   	2
ACME, 	8413,   -65,  	-64,   	-68,   	-3,   	-2,   	-2,  	-1,   	-1,   	-2,   	-13
ACME, 	8910,   -134,   -124,   -106,	-20,   	-109,   -130,   -129,   -138,   -125,   -88
];

LEFT JOIN  LOAD Datum, Bolag, Konto, Bolag&'|'&Konto as %rapport_Konto Resident Transaktioner;


RR:
LOAD 'ACME' as Bolag, * inline [
Rubrik,           Rapportradsdefinition,Format,		Fet, Bakgrund,Teckenstil,Textfärg,Justera,Teckenstorlek,Kommentar
Försäljning,      3000..3999,           "# ##0 kr", "",  "green(13)",,,,,
Kostnad såld vara,4000..5999,           "# ##0 kr", "",  "green(13)",,,,,
Bruttoresultat,   Försäljning+Kostnad såld vara,"# ##0 kr",<bold>,yellow(125)
Försäljningskostnader,6000..6999,       "# ##0 kr", "",	  "blue(13)"	
Varukostnader,    4000..4499+4500..4999,"# ##0 kr", "",   "blue(13)",,QlikTechblue(),,,
Administrationskostnader,7200,          "# ##0 kr", "",	  "blue(13)"	
Rörelseresultat,  Bruttoresultat+ 6000..7200,"# ##0 kr",<bold>,yellow(125)
Rörelsemarginal,  Rörelseresultat/Försäljning,"# ##0%",<bold>,yellow(200),		 <italic>
Finansiella intäkter,8300..8399,        "# ##0 kr", "",    "Magenta(13)"
Finansiella kostnader,8400..8499,       "# ##0 kr", "", "Magenta(13)"
Resultat efter finansiella poster,Rörelseresultat+ 8300..8499,"# ##0 kr",<bold>,yellow(200),	
Inkomstskatt,     8900..8999,           "# ##0 kr", "",  cyan(13)
Resultat,         Resultat efter finansiella poster+Inkomstskatt,"# ##0 kr",<bold>,yellow(125)


];
CALL sublib.rapport ('RR','Konto', 'Bolag')
///$tab sublib.rapport
SUB sublib.rapport (_tabell,_konto,_enhet)
	/**
	Genererar en rapporttabell med rubrik-konto-relation.
	För att köra denna funktion behövs en tabell med två eller tre kolumner som innehåller rubrik, definition och evt. nummerformatering.

  Stödjer Qlik Sense VizBundle formtatet: https://help.qlik.com/sv-SE/sense/February2021/Subsystems/Hub/Content/Sense_Hub/Visualizations/VisualizationBundle/pl-pivot-chart.htm
	@param1 Tabellnamn på den tabell som innehåller rapportdefinitionen. Detta blir namnet fältnamn i rapporten. 
	@param2 Fältnamn som rapporten ska intervalmatchas och kopplas mot.
	@param3 Fältnamn som kan skilja olika orginastoriska enheter med olika krav. Om endast ett bolag ange ett fält med statisk värde.

	CALL MapReport.qvs('Demo','Kontonummer', 'BolagsID')

	Expression: num(	sum( {< [Kvotdel]={"Täljare"}>} Belopp) 
						/
						alt(aggr(nodistinct sum( {<[Kvotdel]={"Nämnare"}>} Belopp), [Rapportrad] ),1)
    				, [Format] )
	*/
 	/* Namnen på fälten i tabellen i parametern _tabell */
  
  	LET _Rapportfält_Rapportrubrik 	= 'Rubrik';  			//'['& FieldName(1, '$(_tabell)') & ']';
	LET _Rapportfält_Kontodefinition = 'Rapportradsdefinition';  //'['& FieldName(2, '$(_tabell)') & ']';
  		
	LET _StylingField_Format		=IF(FieldNumber('Format',		'$(_tabell)'),'[Format]', 		chr(39)&chr(39));
	LET _StylingField_Fet 			=IF(FieldNumber('Fet',	 		'$(_tabell)'),'[Fet]', 			chr(39)&chr(39));
	LET _StylingField_Bakgrund 		=IF(FieldNumber('Bakgrund',		'$(_tabell)'),'[Bakgrund]' , 	chr(39)&chr(39));
	LET _StylingField_Teckenstil    =IF(FieldNumber('Teckenstil',	'$(_tabell)'),'[Teckenstil]', 	chr(39)&chr(39));   	
	LET _StylingField_Textfärg      =IF(FieldNumber('Textfärg',	  	'$(_tabell)'),'[Textfärg]',		chr(39)&chr(39));       	
	LET _StylingField_Justera       =IF(FieldNumber('Justera',	  	'$(_tabell)'),'[Justera]',		chr(39)&chr(39));              
	LET _StylingField_Teckenstorlek	=IF(FieldNumber('Teckenstorlek','$(_tabell)'),'[Teckenstorlek]',chr(39)&chr(39));                        
	LET _StylingField_Kommentar	    =IF(FieldNumber('Kommentar',	'$(_tabell)'),'[Kommentar]',	chr(39)&chr(39));         
 
	[Rapportstyling ($(_tabell))]:
  	LOAD 
  		Autonumber([$(_Rapportfält_Rapportrubrik)], 'Styling') as [%rapportstyling ($(_tabell))],
  		$(_StylingField_Format)        as [Format ($(_tabell))] , 
		$(_StylingField_Fet)           as [Fet ($(_tabell))] ,                
		evaluate($(_StylingField_Bakgrund))      as [Bakgrund ($(_tabell))]     ,                  
		$(_StylingField_Teckenstil)    as [Teckenstil ($(_tabell))]   ,                      
		alt(evaluate($(_StylingField_Textfärg)),$(_StylingField_Textfärg)   )   as [Textfärg ($(_tabell))]  ,                     
		$(_StylingField_Justera)       as [Justera ($(_tabell))]     ,                
		$(_StylingField_Teckenstorlek) as [Teckenstorlek ($(_tabell))],                            
		$(_StylingField_Kommentar)     as [Kommentar ($(_tabell))] ,
		[$(_Rapportfält_Rapportrubrik)] &';'& $(_StylingField_Fet)  &';'& $(_StylingField_Bakgrund)   &';'& $(_StylingField_Teckenstil)  &';'& $(_StylingField_Textfärg)  &';'&  $(_StylingField_Justera)   &';'& $(_StylingField_Teckenstorlek)  &';'& $(_StylingField_Kommentar)  as [Rapportstyling ($(_tabell))]
	Resident 
		[$(_tabell)]
   	;
	
    TMP_Rubriksordning:
    LOAD 
	 AutoNumber('$(_konto)|'&[$(_enhet)]&'|'&[$(_Rapportfält_Rapportrubrik)],'$(_tabell)' ) as [Rubriksordning]
    Resident [$(_tabell)];
    
	Rapport_kvotindelad:
  	/* Läser in nämnare på rader med kvot. Kontorapport stödjer endast en kvot per rad*/	  
  	LOAD 
		[$(_enhet)] as Rapportorganisationsenhet,
        AutoNumber('$(_konto)|'&[$(_enhet)]&'|'&[$(_Rapportfält_Rapportrubrik)],'$(_tabell)' ) as [Rubriksordning],
        
        //RecNo() as [Rubriksordning],
    	[$(_Rapportfält_Rapportrubrik)] ,
       	subfield(Subfield($(_Rapportfält_Kontodefinition), '/', -1), '+') as [$(_Rapportfält_Kontodefinition)],
    	'Nämnare' as Kvotdel
  	Resident [$(_tabell)]
  	WHERE 
  		WildMatch($(_Rapportfält_Kontodefinition), '*/*')
        
		;

  /* Läser in täljare på rader med kvot. Kontorapport stödjer endast en kvot per rad*/ 
 	LOAD
  		[$(_enhet)] as Rapportorganisationsenhet,
      	AutoNumber('$(_konto)|'&[$(_enhet)]&'|'&[$(_Rapportfält_Rapportrubrik)],'$(_tabell)' ) as [Rubriksordning],
        [$(_Rapportfält_Rapportrubrik)] ,
     	subfield(Subfield($(_Rapportfält_Kontodefinition), '/', -2), '+') as [$(_Rapportfält_Kontodefinition)],
      	'Täljare' as Kvotdel
  	Resident 
		[$(_tabell)]
 	WHERE 
 		WildMatch($(_Rapportfält_Kontodefinition), '*/*')
      ;

  	/* Läser in rader utan kvot */
    LOAD 
      	[$(_enhet)] as Rapportorganisationsenhet,
        AutoNumber('$(_konto)|'&[$(_enhet)]&'|'&[$(_Rapportfält_Rapportrubrik)],'$(_tabell)' ) as [Rubriksordning],
       	[$(_Rapportfält_Rapportrubrik)] ,
     	Subfield($(_Rapportfält_Kontodefinition), '+') as [$(_Rapportfält_Kontodefinition)],
        'Täljare' as Kvotdel
    Resident [$(_tabell)]
    WHERE NOT WildMatch($(_Rapportfält_Kontodefinition), '*/*')
  
;
	DROP TABLE TMP_Rubriksordning;
   	DROP Table [$(_tabell)]
    ;


    FOR EACH _Rapportorganisationsenhet in FieldValueList('Rapportorganisationsenhet')
      /* 
      Löser ut alla referenser mellan raderna.
      */
      Trace ### $(_Rapportorganisationsenhet)  $(_tabell);
      
      Rapport_hiearchy:
      Hierarchy ([$(_Rapportfält_Rapportrubrik)], [$(_Rapportfält_Kontodefinition)], NodeName)
      LOAD 
          [$(_Rapportfält_Rapportrubrik)], 
          [$(_Rapportfält_Kontodefinition)], 
          [$(_Rapportfält_Kontodefinition)] as NodeName, 
          Kvotdel,
          [Rubriksordning]
      Resident Rapport_kvotindelad
      WHERE  Rapportorganisationsenhet = '$(_Rapportorganisationsenhet)' ;

     // drop table Rapport_kvotindelad;


    /* Löser ut alla rader till ett intervall. En-kontorader blir interval på ett kontonummer. 
      Detta intervalmatchas mot kontonummer som måste finnas inläst i datamodellen
    */
  
     [Rapport ($(_tabell))]:
     LOAD  
          '$(_Rapportorganisationsenhet)' as Rapportorganisationsenhet,
          [$(_Rapportfält_Rapportrubrik)] 							as [Rubrik ($(_konto)_$(_tabell))],  
          Autonumber([$(_Rapportfält_Rapportrubrik)], 'Styling') 	as [%rapportstyling ($(_tabell))],
          subfield(NodeName1, '..', 1) 								as [_KontoFrom],
          subfield(NodeName1, '..', -1) 							as [_KontoTom],
          Kvotdel 													as [Kvotdel ($(_tabell))],
          [Rubriksordning] 											as [Rapportrad ($(_tabell))]
      Resident Rapport_hiearchy
   //   WHERE isnum(subfield(NodeName1, '..', 1))   
      ;
      DROP TABLE Rapport_hiearchy;
  
    next   _Rapportorganisationsenhet
    LET _Rapportorganisationsenhet=;
         
    drop table Rapport_kvotindelad;

    LEFT JOIN
  	IntervalMatch([$(_konto)])
  	LOAD  [_KontoFrom], [_KontoTom] 
  	Resident 
    	[Rapport ($(_tabell))]
    WHERE isnum([_KontoFrom])
   ;
   
//    /** Hanterar de fall där värdet inte är numerisk utan en sträng*/
//      LOAD  
//           '$(_Rapportorganisationsenhet)' as Rapportorganisationsenhet,
//           [$(_Rapportfält_Rapportrubrik)] 							as [Rubrik ($(_konto)_$(_tabell))],  
//           Autonumber([$(_Rapportfält_Rapportrubrik)], 'Styling') 	as [%rapportstyling ($(_tabell))],
//           subfield(NodeName1, '..', 1) 								as [_KontoFrom],
//           subfield(NodeName1, '..', -1) 							as [_KontoTom],
//           Kvotdel 													as [Kvotdel ($(_tabell))],
//           [Rubriksordning] 											as [Rapportrad ($(_tabell))],
//           '$(_Rapportorganisationsenhet)' & '|'& subfield(NodeName1, '..', 1) as [$(_konto)]
//       Resident Rapport_hiearchy
//       WHERE NOT isnum(subfield(NodeName1, '..', 1))   
//       ;
//       DROP TABLE Rapport_hiearchy;
  
   
  //  DROP FIELD [_KontoFrom], [_KontoTom];


	sub ConcatReport
		
		/** Autoconcatinerar Styling */
	 	[Rapportstyling $(_konto)]:
	  	LOAD 
      		[%rapportstyling ($(_tabell))] as [%rapportstyling_$(_konto)],
	  		MaxString([Format ($(_tabell))]) as [Format_$(_konto)] , 
			MaxString([Fet ($(_tabell))]) as [Fet_$(_konto)] ,                
			MaxString([Bakgrund ($(_tabell))]) as [Bakgrund_$(_konto)]     ,                  
			MaxString([Teckenstil ($(_tabell))]) as [Teckenstil_$(_konto)]   ,                      
			MaxString([Textfärg ($(_tabell))]) as [Textfärg_$(_konto)]  ,                     
	    	MaxString([Justera ($(_tabell))]) as [Justera_$(_konto)]     ,                
			MaxString([Teckenstorlek ($(_tabell))]) as [Teckenstorlek_$(_konto)],                            
			MaxString([Kommentar ($(_tabell))]) as [Kommentar_$(_konto)] ,
		  	MaxString([Rapportstyling ($(_tabell))]) as [Rapportstyling_$(_konto)]
		Resident 
			[Rapportstyling ($(_tabell))]
        group by  [%rapportstyling ($(_tabell))]
		;
		Drop table  	[Rapportstyling ($(_tabell))];


		/** Concatinerar rapporttabell*/
		IF isnull( NoOfFields ('Rapport_$(_konto)')) then
			/*Skapar tom tabell som det går att concatenera på.*/
			[Rapport_$(_konto)]:
			LOAD * 
			Inline [Kvotdel_$(_konto), Rapportrad_$(_konto)];
		endif 

		Concatenate ([Rapport_$(_konto)])
		LOAD 
     	 	Rapportorganisationsenhet &'|'& alt([$(_konto)], [_KontoFrom]) as [%rapport_$(_konto)],
			[%rapportstyling ($(_tabell))] as [%rapportstyling_$(_konto)],
			[Kvotdel ($(_tabell))] as [Kvotdel_$(_konto)], 
			[Rapportrad ($(_tabell))] AS [Rapportrad_$(_konto)],
			[Rubrik ($(_konto)_$(_tabell))]  
		Resident
			[Rapport ($(_tabell))]
		;

		DROP TABLE [Rapport ($(_tabell))];
	 endsub //	ConcatReport
	call ConcatReport

ENDSUB //SkapaRapport

Du kan hämta hem en Qlik Sense applikation som demonstrerar denna sub från Github veglar/qliksense-sublib/releases Hittar du fel eller ser förbättringsmöjligheter i koden så lägg gärna ett ärende här: https://github.com/veglar/qliksense-sublib/issues