Vous êtes sur la page 1sur 23

WHAT ESSBASE DOESN’T DO

(TODAY)
The Cubegeek’s Toolkit
Agenda
• Intro
• Data Management
• Cubegeek’s Toolkit
• The Welds
– Object Versioning
– Currency
Externalization
– Notifications
– Fake Data Generation
Michael Bowen
• Sr. Mgmt.Consultant
@ Rolta-TUSC
– 13th Year with
Hyperion Products
– 3 Presentations at
Solutions
– Microsoft Detour
• aka Cubegeek
• Hair
Goals of Data Management
• Direct and manage the flow of data into the Hyperion
applications
• Provide a mechanism for understanding the state of the
Hyperion application at any time.
• Provide the ability to recreate a particular data event.
• Integrate, synchronize and automate all Hyperion back-
end processes with IT.
• Leverage best aspects of relational & multidimensional
databases + scripting.
• Provide a logical framework for extending and enhancing
Hyperion applications.
Backend Functions: Two Cycles

• Data Management • Essbase Production


Cycle Cycle
– Data Registration – Export
– Data Cleansing – Clear
– Data Movement – Build
– Data Processing – Load
(Essbase Cycle) – Calc
– Data Archiving – Report
– Data Recovery
The Cubegeek’s Toolkit
• SQL • Perl
– V5.8.8 Build 822
• UltraEdit32
• 7Zip
• Blat / mailx – V4.32
• Hashcalc – 7za CLI

• Blogger • PasswordSafe
• Audacity • WS_FTP
• Outlex / AppMgr • Procexp
The Cubegeek’s Backend
• ~/essbase/batch
• logs
• data
– Current
– inbucket
– archive
• mdata
• scripts
• export
The Welds
• Versioning of Objects
• Externalization of
Currency Conversion
• Backend Notifications
• Fake Data Generation
Versioning
• Why?
– Development Rollback
– Recovery Pairing
– Data Run Enumeration
Versioning
• What • Tools
– .ver file – Perl
– Ver.pl
– Version.pl back:Build 029
20090522-125028
Versioning Code Fragment
# cd ${scrdir}
system ("ver.pl back.ver");

# get new build number


# bnum=`head -1 ${appid}.ver`
$verfile = "back.ver";
open (VF, "< $verfile");
$ver = <VF>;
chop $ver;
$x = substr($ver,-3);
print "saw version $x\n";
close VF;

print OUTLOG "$t : $appid version $x \n";


$fspec="back_build".$x."_objects_"."$env".".zip";

$cmd = "7za a -tzip $fspec *.dat *.sql *.txt *.pl *.bat *.lst *.msh *.csv back.ver";
print "executing $cmd\n";
system ($cmd);

$cmd = "move $fspec $expdir";


system ($cmd);
Notifications
• Why
– Nobody Subscribes,
Everybody Asks
– Diagnostics
• What
– Logs
– Email
– Twitter
– Blog
• Tools
– Perl
– Blat
Notifications Code Fragment
if (not -z $rejects)
{
print "rejects found.\n";
print OUT "GL RUN $tline:REJECTS\n";

#email notification
$subject = '"GL RUN: Load Rejects"';
$sendfile = $rejects;

&notify ($sendfile, $subject);


}
Blat Call
sub notify {
local $outfile = $_[0];
local $subject = $_[1];

$rfile = "d:\\hyperion\\essbase\\batch\\scripts\\recip.lst";
$sender = "michael.bowen";
$senderpw = "amazon.com123";

$cmd = "c:\\usr\\bin\\blat $outfile -tf $rfile -subject $subject -u


$sender -pw $senderpw";
system ($cmd);

}
Currency Externalization

• Why
– Speed
– Simplicity

• What
– Stored Procedure
– On Demand
– Flat File
– Go Button
Currency Externalization

• How
– SQL Server
– Perl Code Generation
– Fetch & Store
– Version
– Translate
Currency Code Fragment

• Generated SQL

INSERT INTO [HRSource].[dbo].[FX]


([currency],[stamp], [year],[to_usd])
VALUES ('AUD','FX:023:20090318-
071501','2009',0.63836);
INSERT INTO [HRSource].[dbo].[FX]
([currency],[stamp], [year],[to_usd])
VALUES ('AUD','Now','2009',0.63836);
Fake Data Generation

• Why
– Optimization
– Validation
Fake Data
• Tools • Pieces & Parts
– Perl – Datgen
– UltraEdit32 – Dim Files
– Datgen.pl – INX file
Configuring INX

• Six Fields dim0:"Costs":50:1:1:costs.txt


dim1:"Teams":50:3:1:teams.txt
– Dim dim2:"Parts":500:2:1:parts.txt
– Dim name dim3:"Options":3:3:1:options.txt
– Dim Count dim4:"Scenario":3:3:1:scen.txt
– Curve Type
– Perm Flag
– File name
• One Measure
Sample Dim Files
• Options • Parts

Base Option 69-73484-1


Option A 251A2160-2
Option B 69-54631-1
250055-9
1544400-3
3910031-105
3910036-101
UA538551-3
65-44631-1
OH6740281E32--O
63474
66087
Code Fragment
if ($ndims==5) {
for ($i=0; $i<$top[0]; $i++) {
for ($j=0; $j<$top[1]; $j++) {
for ($k=0; $k<$top[2]; $k++) {
for ($l=0;$l<$top[3];$l++) {
for ($ii=0;$ii<$top[4];$ii++) {

$num =
int($df[0][$i]*$df[1][$j]*$df[2][$k]*$df[3][$l]*$df[4][$ii]*$adj)+1;
$dat = $dates[int(rand 36)+1];
$record =
"$topdim[0][$i]\t$topdim[1][$j]\t$topdim[2][$k]\t";
$record .=
"$topdim[3][$l]\t$topdim[4][$ii]\t$dat\t$num\n";
print OUT $record;
}
}
}
}
}
close OUT;
print "done.\n";
Q&A

Vous aimerez peut-être aussi