Jobba med programmering

Det är många som vill jobba med programmering. Men det är ungefär som att säga att man vill jobba med trä. Vill man sköta skog? Vill man såga ned skog? Vill man kapa brädor, snickra hus eller kanske flisa trä?

Många unga tänker sig nog coola häftiga jobb där dom bygger nästa generations spel och coola program som ska bli vardag i allas telefoner. Många missar ERP-världen, vet nog för det mesta inte ens vad det är.
Vilket kanske inte är så konstigt, på pappret är den extremt osexig.

”Ok, jag ska lägga till ett fält i en rapport?”

Men faktum är att arbeta med ERP-system är väldigt omväxlande. Man vet verkligen aldrig vad nästa dag för med sig. Småjusteringar i ett formulär en dag, till BI nästa dag och dagen efter det ska man kontrollera extern hårdvara efter värden i tabeller.

Men det finns fler viktiga faktorer som gör detta till en bra bransch. I alla fall för oss som pysslar med Dynamics AX. Det är en tillväxt-bransch. Affärskedjor slår ihop sina pos-system med affärssystemet, företagen blir större och globala mer nu än någonsin tidigare. Man tittar på lösningar med flera tusen användare spridda på alla kontinenter. Det är komplext och intressant.

Det var först efter jag sade upp mig som jag insåg vilken bristvara AX-konsulter verkligen är. Jag har nog bara sökt något enstaka jobb, och då alltid blivit uppringd för intervju, men däremellan så har telefonen ringt vid flertalet gånger i veckan med erbjudanden. Det är knappt så att en intervju är nödvändig. Det var någon som var glad, för att dom hade letat efter en AX-utvecklare i ett halvår, och jag var en av de få tillgängliga på arbetsförmedlingen. Och jag är varken speciell eller omtalad. Detta ger lite hybris, men också en insikt om hur mycket det finns att hämta för många. Är man lite driftig så är det verkligen ett öppet mål.

Microsoft har ett program där dom samarbetar med vissa högskolor och universitet, där dom hjälper till att se till att man har certifikat och träning, och sedan kontakt-förmedlar med olika företag. (länk?)

Som jag skrev tidigare, det kanske inte är det sexigaste på pappret, men varje dag jobbar man med verkliga problem med mjukvara som är ute i verkligheten och tillför något produktivt. Så kolla upp det är mitt tips.

Hjälp, mitt AX går långsamt!

När jag skriver mina inlägg som är riktade mot affärssystem så vänder jag mig mot en bred publik. Tanken är att både utvecklare och kunder ska få något att ta med sig. Utvecklare kanske hittar något roligt, och kunder får något köttigt att fråga sin partner om. Så blir även dagens inlägg. Diskutera med er partner. Dom får gärna tycka att jag har fel, men vad tycker ni? Huvudsak är att ni och er partner kommer överens och bägge är nöjda.

Det händer ibland att det kommer en kund och säger, mitt ax går så långsamt, vad är fel?

Det är ungefär som att säga, jag tappade min nål i den här höstacken, hitta den, men med skillnaden att som partner är man skyldig att hitta den där nålen.
Vad är då de vanligaste orsakerna?
Min lista skulle se ut såhär

  • Användar-uppfostran: Trycka igång flera tunga jobb, inte orka vänta och trycka igång ännu fler av samma, vilket orsakar låsningar i databasen och långa köer på alla håll och kanter.
  • Hårdvara: Har hårdvaran ni köpte i början växt med era behov? Har ni plötsligt 8-9 ny integrationer, 50 extra lagerplockare och mer produktion?
  • Inte optimerad installation: Det finns många parametrar att skruva på på alla komponenter, allt från att gå igenom vilka flaggor sql:en startas med, att uppdatera de index som behövs, till att kolla igenom hur tunga anpassningar är byggda (och för den delen, original-kod)

Jag tänkte gå igenom lite mer genomgående här nedan hur mina tankar ser ut.

1. Användaruppfostran : Det här skriver jag inte så mycket om, det är egentligen ganska enkelt, tålamod och planering. Kan man batch-lägga huvudplaneringen att rulla på natten istället för att 2-3 olika personer trycker igång varsin kl 11.13 på förmiddagen? Inte en perfekt lösning, men ett sätt att hantera det. Gås såklart igenom med er partner som ska hjälpa er arbeta ut hur ni ska jobba, eller om ni själva känner att ni vill kolla över detta. Här gäller även batch-jobb. Många användare skapar batch-jobb till höger och vänster, och helt plötsligt ser inte den ursprungliga batch-planeringen ut någonting som den som vi började med.

2. Hårdvara : Också enkelt, behövs det mer körningar, mer användare, mår hårdvaran bra, behöver vi en batch-server till? Klarar SQL:en av mängden jobb? Det kan vara bra att gå över ibland. Många maskiner kan man uppdatera utan allt för dyr peng. Dyrast brukar vara SQL-servern då snabb lagring och större mängd minne kostar. Fungerar nätverket som det ska?

3. Ej optimerad kod. Här kommer lite mer text, här kan utvecklare göra mer och kunder kräva mer, huvudsaken gäller att man vill komma undan att gå många rundor till sql:en i onödan, hämta rätt data tidigt. Där hittar vi prestanda. SQL:en i sig är snabb, AX aos:erna är snabba i sig, men varje frågeställning tar extra tid. Säg t.ex. att en kund har 100.000 artiklar. Ska man lista dessa i ett formulär så ställs en fråga, och man får tillbaka 100.000 rader som resultat. Smidigt. Kort tid på bägge sidor. Säg nu att man vill ha 1 fält från en annan tabell. Då finns det två vägar att gå. Antingen så hämtar vi hela den tabellen tillsammans med artiklarna, 1 fråga, 100.000 rader, men mer kolumner, alltså större datamängd. Eller så bygger man en display-metod. Då påverkar man inte urpsrungliga frågan, och får bara lite extra-kod på ett ställe. Dock hämtas plötsligt en rad från den andra tabellen för varje rad. Och istället för 1 fråga, så har vi plötsligt 100.001 frågor, men oftast samma datamängd eftersom de flesta utvecklare alltid hämtar hela tabellen, för det är så det är gjort i gamla Axapta. Och det är inte ovanligt att se 4-5 display-metoder i formulär ute hos kunder.
Så vad hade man helst sett? I den urpsrungliga frågan, så väljer vi verkligen bara de fält vi vill ha. Det är inte ovanligt att en tabell i ax innehåller 40-50 kolumner, och oftast visar man 10 av dessa, resten är bara dö-data som skickas fram och tillbaka sql och aos.
Så optimalt hade man gjort en fråga som frågar 1 gång och hämtar 100.000 rader, men bara de 10 kolumnerna som är de vi vill ha i formuläret. Notera att hämtar man hela tabellen så kan slutanvändaren välja att plocka fram andra fält på sin personliga variant av formuläret. Den möjligheten försvinner på detta sättet. Men man kan ju alltid ta med lite jokrar. Detta gäller även i klasser. Många ställen görs det vida while select, och sedan 5-6 find-metoder på olika tabeller. Varför?

Nästa steg är index. AX kommer med en viss uppsättning index, men ser vi till t.ex. AX 2012 så ingår varken bolags-id eller partitions-id i de flesta index, men ändå innehåller i princip alla frågor detta. Detta innebär att så fort som det finns mer än ett bolag eller partition, så börjar du tappa prestanda. Microsoft har uppsättning av index och optimering som ett steg av den rekommenderade installations-processen numera, detta är dock något som man aldrig riktigt behövt göra i äldre versioner, och många partners hoppar därför över detta. Men även äldre installationer kan vinna mycket på detta när databaserna börjar växa. Det handlar inte om att gå igenom varje millimeter, men index ska ingå i utvecklingen av anpassningar. Och det finns enkla frågor i sql:en som ger förslag på saknade index, eller index som behöver ändras för att man ska vinna tid.

Det här är ju ett område som man kan nörda sig ner i hur mycket som helst, med siffror, grafer och ännu mera tekniska termer. Men då är det specifikt, och bättre att ni tar mer er partner, eller fristående opartiske externa konsult 😉 (mer om det kommer senare)

Integration – Business Connectorn…

I Ax så finns sedan version 4.0 en komponent som heter BusinessConnector.net. Det är en vidareutveckling av den lite äldre com-connectorn och är helt enkelt ett program-bibliotek med instruktioner för att komma åt AX-objekt utifrån. Kortfattat, en dll-fil som du kan plocka in i ditt .net-projekt, och på så sätt komma åt Ax.

Business Connectorn har stått på AX Deprecated Feature-listan sedan AX 2009 med råden att ”använd inte denna för den kommer att försvinna inom kort”. I början av AX 2012 fanns den inte ens att installera i menyn, utan man fick smyga in den bakvägen. Ändå så var replikering i retail-delarna ändra fram till R2 baserade på business-connectorn, för dom fick inte upp tillräcklig prestanda i service-tjänsterna som är tänkt att ersätta denna som integrations-motor.

Hur ska man då använda en sådan här funktion? Ska man bygga hela WPF-program som har massa anrop, snurrar runt på inventtable och skapar försäljningsordrar direkt i programmet?

Jag säger, hantera med varsamhet. Även om man kan så kanske man inte ska göra det. Jag föredrar att kod som gör saker i AX ska vara i AX. Risken är att man har 3-4 småprogram som ligger och gör saker som utför ax-logik, så implementerar man en förändring i AX. Kanske en metod som kräver en ny parameter, så stannar programmen där ute, eller värre dom skapar fel.

Jag brukar förespråka att man gör en klass som man kommunicerar med i AX som sedan skickar informationen i rätt riktning. Säg att man har en klass som t.ex. tar ett xml-meddelande. Då kan man slaska in WPF-applikationer mot den, man kan bygga en web-service som går mot den osv. Och ändrar man i AX så vet man med största sannolikhet att det kommer att funka då Ax går att kompilera.
Business-connectorn ger valmöjligheter vad det gäller säkerhet. Man kan t.ex. om man kör den i en soap-tjänst, välja att alltid gå på poolens identitet, eller så kan låta webservicen fiska upp en identitet som den loggar in med, och då med den användarens säkerhet.
Vi gör inget mer komplicerat än att göra en vanlig console-applikation som listar 10 artiklar, precis som alla andra guider som går igenom hur business-connectorn funkar. 

Console.WriteLine("Starting application...");

Random waitTime = new Random();
int seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);
Console.WriteLine("3");

waitTime = new Random();
seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);
Console.WriteLine("2");

waitTime = new Random();
seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);
Console.WriteLine("1");

Axapta ax = new Axapta();

Console.WriteLine("Connecting to AX...");
ax.Logon(null,null,null,null);

waitTime = new Random();
seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);
Console.WriteLine("Connection established.");

waitTime = new Random();
seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);
Console.WriteLine("Ax session id is :" + ax.Session().ToString());

Console.WriteLine("Accessing table InventTable...");
AxaptaRecord axRecord;
string axTable = "InventTable";
int i = 0;
axRecord = ax.CreateAxaptaRecord(axTable);
axRecord.ExecuteStmt("select * from %1");

object itemId;

while (axRecord.Found && i < 10)
{
i++;
itemId = axRecord.get_Field("ItemId");
Console.WriteLine("Item : "+itemId);
axRecord.Next();
}

Console.WriteLine("Sending logoff to Ax");
ax.Logoff();

waitTime = new Random();
seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);

Console.WriteLine("Logged off");
waitTime = new Random();
seconds = waitTime.Next(1 * 300, 4 * 400);
System.Threading.Thread.Sleep(seconds);

Console.WriteLine("Disposing of unwanted stuff");
ax.Dispose();

Console.WriteLine("Press the anykey to exit");
Console.ReadKey();

Business-connectorn står som sagt på avvecklings-listan och kommer att försvinna. Men tittar man på integrationer med en tidigare version kan det ändå vara bra att ha i åtanke. Prestandan är över lag tämligen bra. Möjligheterna blir oändliga 

Business-connectorns cache…

Vet inte om jag skrivit om detta innan, men får ofta frågan.

Business-connectorn cachar saker lite annorlunda. Så kör man något i Ax via business-connectorn, ändrar koden i Ax, så är det ganska ofta det inte slår igenom. Det slår inte igenom utan att man måste in och rensa lite filer minst.

Därav, ta för vana att i era bc-projekt ha med en knapp, metod eller något som i princip bara kör som samma användare som gör det andra, men som har en Axapta.Logoff(), och Axapta.Dispose(). Då hamnar du för det mesta på ruta 0 igen. Lägg inte in den i dom vanliga rutinerna då det gör att bc:n går lite segare. Men gör du t.ex. en soap-tjänst som anropar Ax, lägg till en funktion som kör logon, logoff och dispose, då körs det som applikations-poolens användare osv. Spara mycket tid. Egentligen ska man bara kunna köra dispose, men tycker att det inte varit så tillförlitligt som när man gör en logon och logoff innan.

(sitter och plitar på en integrations-guide med bc:n, då slog frustrationen till 😉 )

Dynamics AX Mobile Device Portal

Nu har jag kikat lite på Mobile Device Portal för AX 2012 R3. Eller för och för, den ingår i AX 2012 R3. Vad ska man säga. Den kräver att man använder Lagerstyrningen, både med ett warehouse som är styrt av lagerstyrning och att produkten i sig är styrd av lagerstyrning.

Installationen är en next-next-finish. Jag råkade på en liten upphakning på att installations-programmet inte installerade .net 4.5 delarna för web-servern, men installerade web-servern i sig. Så sidan fungerade inte. Standard så ingår det en hårdkodad config i web.config som går mot 8201 (Ja, du läste rätt, ingen bc-connector, den använder wcf:en).

Under området lagerstyrning så är det 2 saker under inställningar vi är intresserade av. Arbetare och mobil enhet.

Vi kikar lite på dessa.

Under Meny på mobil enhet så kan man skapa olika menyer som har olika syften. Det kan vara en produktions-meny, en lager-meny osv.

Till sina menyer kan man koppla andra under-menyer eller annat.

Som här ovan så har jag satt ihop en meny som har 4 funktioner. Count, Prod, Sales och std. Varje punkt av dom här är sin egen meny där jag i sin tur har lagt till menyalternativ i den nedre delen. T.ex. Markera Lagerstatus och klicka på < hade i detta fall flyttat in möjligheten att titta på lagerstatus i Count.

Varifrån kommer meny-alternativen då? Är dom standard? Kan man göra egna? Kan man bygga om dom? Klasserna som sköter dom olika funktionerna börjar på WHS i aot:n, likväl tabeller och övrigt.

För att kolla in hur menyalternativen fungerar så får vi flytta oss till nästa formulär i listan

”Menyalternativ på mobil enhet”.

Det finns 2 typer av menyalternativ, arbete och indirekt. Indirekt kan vara saker som att logga ut, lagerstatus, byta aktivt lagerställe. Dvs saker som inte påverkar lagersaldo eller har en process bakom sig. Formuläret ser också mycket olika ut beroende vad man väljer.

Här är ett indirekt alternativ. Lagerstatus. (såhär ser alla indirekta jag kollat på ut)

Och såhär kan ett arbete se ut.

Dessa varieras mer utefter innehåll. Arbetet ”läs in registreringsskylt”  behöver ju t.ex. ingen etikett-utskrift.

Jag gör några sådana här, så tittar vi på Menyer på mobil enhet-formuläret igen.

Nu är det lite mer struktur. Hur skulle detta se ut nu i handdatorn?

Vi kollar några snabba skärmar 🙂

Stiligt va, rakt ut ur boxen!

Nu har vi dock hoppat några steg i förväg. Men ändå inte direkt så mycket. Bara några småformulär.

”Textfärger på mobil enhet”. Man kan ändra färgen på varningar….

”Dispositionskoder”. Ingen aning, kommentera gärna när ni kört det. Man kan koppla det till olika lagerstatus och arbetsmallar.

Klusterprofiler… Bra fråga. Tror det är en hantering för att många ska jobba med samma sak samtidigt.

Dessa behöver man inte fylla i för att få det att fungera. Men det sista formuläret under mobil enhet-gruppen behöver man fylla i. Och den är inte helt självklar. Det är ”Visningsinställningar för mobil enhet för arbetsanvändaren”.

Namnet är en standard-variant. Standard sätter om det är standard, Css-filen pekar på vilken css-fil som ska användas. css-filerna ligger i ”C:\Program Files (x86)\Microsoft Dynamics AX\60\Warehouse Mobile Devices Portal0\Content\CSS\RFCSS”, jag använde den som heter ”defaultrf”, dessa kan man ju kopiera och skapa egna, varför inte lite rundade hörn osv. Glöm inte .css efter filnamnet.

Här t.ex. är samma inloggningsbild som innan, men rundade hörn och rosa text.

Ändring direkt i filsystemet och direkt genomslag.

Vi tar ett exempel till.

Ni vet var ni har sett det när ni vill beställa 😉

Nästa kolumn, ”Vy med visningsinställningar för mobil enhet”, där ska man ange en av vyerna som man hittar i views-mappen. där finns standard en display.aspx och en displayIEOS.aspx. Jag kör en ie-browser, så jag valde displayIEOS.aspx. Ange inte filändelsen här.

Tangentbordsgenväg är som det låter, man kan koppla lite genvägar. scanning är detta osv.

Kriterier är lite roligt, detta är browser-kriterier, detta innebär att man kan styra vilken visningsinställning som kommer att visas beroende på kriterier, t.ex. vilket webbläsare, vilken upplösning osv.

Nu är det bara ett formulär kvar. Arbetare

Nu blir det mycket att koppla in. Oscar är kopplat till en medarbetare. För varje medarbetare kan man göra ett gäng inställningar. Packprofil, Profil-id för stäng behållare.

Användare. Man kan alltså koppla flera användare till en medarbetare. Så man kan ha en device-user som heter LagerDator3, som har en medarbetare som heter lagerDator som sedan kan ha användare handheld1, handheld2 osv. Dessa kan ha olika menyer och standardlagerställe (som är styrt av lagerstyrning). När man skapar användaren får man också ange lösenord, och det är användaren och lösenordet som man loggar in med i sin enhet senare.

Under arbete kan man ställa in lite privilegier för olika användare. Får dom hoppa över plockplatser. Får dom räkna in alla värden osv.

Nu har jag gått igenom det mesta här, vissa saker får jag kika vidare på, men det är en liten crash-course i Mobile Devices för Dynamics Ax 2012 R3.

Nästa steg blir att plugga lagerstyrning utan och innan 😉

Edit:
Lägger till en länk med förklaringen att lagerstyrning och lager 2 inte kan vara aktiva i systemet samtidigt.
https://community.dynamics.com/ax/b/kurthatlevik/archive/2014/05/15/ax-2012-r3-do-not-enable-wms-ii-and-the-new-warehouse-and-transportation-management-in-the-same-installation.aspx

Tackar Fritte för länken!

Lite AX FTP

Då och då kommer behovet av att köra lite FTP från Ax, satt och tänkte, varför inte bygga en klass som man har och kan återanvända.
Sagt och gjort.

Tanken är att hålla koden inne i AX även om man snuddar på att plocka in lite .net objekt.

Det här är ju bara det grövsta, men fungerar och går att bygga vidare på så att man plockar kataloger, flyttar runt efter sig osv.

Här kommer det, FTP i X++

private void sendToFTP()
{
System.Net.FtpWebRequest ftpRequest;
System.Net.FtpWebResponse ftpResponse;
System.Net.NetworkCredential nCred;

System.Net.WebException webEx;

System.IO.Stream toStream;
System.IO.StreamReader fromStream,streamReader;

System.Byte[] bytes;

CLRObject clroReq;

System.Text.Encoding encodingUTF;
str errorMsg;
;
try
{
// Ger oss tillstånd att köra saker utanför AX
new InteropPermission(InteropKind::ClrInterop).assert();

clroReq = System.Net.WebRequest::Create(toFile);

ftpRequest = clroReq;
ftpRequest.set_Method(‘STOR’);

nCred = new System.Net.NetworkCredential(ftpUser,ftpPass);
ftpRequest.set_Credentials(nCred);

// Vi börjar förvandla vår fil till ett flytande flöde 🙂
encodingUTF = System.Text.Encoding::get_UTF8();
fromStream = new System.IO.StreamReader(fromFile);
bytes = encodingUTF.GetBytes(fromStream.ReadToEnd());

fromStream.Close();

ftpRequest.set_ContentLength(bytes.get_Length());

toStream = ftpRequest.GetRequestStream();

// Här utförs själva skicket
toStream.Write(bytes, 0, bytes.get_Length());

toStream.Close();

ftpResponse = ftpRequest.GetResponse();

info(ftpResponse.get_StatusDescription());

}
catch(Exception::CLRError)
{
webEx = CLRInterop::getLastException();
errorMsg = webEx.ToString();
info(errorMsg);
}
}

Detta körde jag sedan med ett enkelt jobb enligt följande
static void AXFTP_Job(Args _args)
{
AXFTP AXFTP;

AXFTP = new AXFTP();

 

AXFTP.parmToFile('ftp://example.com/yourfile.txt');
AXFTP.parmFromFile(@'c:\test.txt');
AXFTP.parmFtpUser('secret');
AXFTP.parmftpPass('top');
AXFTP.run();
}

Här är en länk till OneDrive med xpo

Jaha, du ska integrera mot Dynamics Ax…

Många gånger har jag fått frågan, vi ska integrera Ax med ***** går det?

Javisst, hur ser scenariot ut?

Vi vill bara veta om det går.

Då är svaret ja, men om det löser era integrations-tankar kan jag ju inte svara på.

Ax är en ganska rörig produkt som gått igenom många ägare, många tankar om vad den vill vara för produkt, och vilka tekniker som ska användas för själva integrationerna.

Därför behöver man veta lite saker som t.ex. är det en tvåvägs-integration? Är det en tvåvägs-integration av data där en part kan sköta data-skickningarna. Är det en envägs-integration som bara ska visa viss data på förfrågan… Listan kan göras hur lång som helst. För det finns inte bara ett svar på hur vi gör det.

MS själva säger AIF vid Ax 2012, business-connectorn (som är ett bibliotek som gör så att .net applikationer kan komma åt klasser och tabeller i ax med användarens AD-behörigheter) är legacy, dvs att den är på väg att slopas. Dock så väljer MS själva i sin retail-koppling att använda Business-Connectorn framför sin nya stjärn-spelare WCF-services på grund av prestanda (och då är inte bc:n snabb).

Så vad har vi lärt oss såhär långt?

Ska man in i Ax så finns det AIF, som mestadels skyfflar XML-data, Business Connectorn som kan trigga klasser i Ax med data som man matar in utifrån, plocka in Ax-funktionalitet i externa applikationer, eller WCF-services. Via Meta-data services (som en del av WCF-delen) i Ax 2012 så kan man utifrån nästan komma åt vad som helst, och man kan dessutom publicera en nybyggd klass i Ax som en WCF-tjänst som kan konsumeras utifrån. Så i princip kan jag publicera en tjänst som vill ha en sträng, och som sedan gör en försäljningsorder. (jättekonstigt, men häng med).
Aif:en är mer statisk, och WCF:en är en modernare ersättare till BC, men BC:n har bättre prestanda i dagsläget.

Om man ska ut ur AX då?

Iom Ax 2012 så kan man använda managed code (tror jag är rätt begrepp), dvs att man initierar ett C#-bibliotek inifrån visual studio, men som samtidigt har tillgång till alla klasser i Ax, därifrån kan man lägga till referenser till webservices eller vad det nu kan råka vara, och man skriver en kod, oavsett om man jobbar med C#-objekt eller x++-objekt, och man kan nyttja t.ex. en objekt-byggd webservice hela vägen ut med typer osv. Riktigt coolt och går att bygga riktigt bra grejer. Inga nackdelar? Ax är ganska dålig på deploy av dessa om man har multipla aos:er, vilket kräver extra fulkod för att få det att fungera som det ska. Vad kan man då göra. Vi tar webservice som exempel då det är väldigt vanligt. Man kan i Ax bygga webservice integration med hjälp av httprequest och kompisarna till dessa .net objekt. Men då hamnar man dessvärre på nivån med att bygga XML-dokument som man skickar fram och tillbaka utan att på samma sätt få den validering som man får när man i en .net klass och konsumerat ett webservice utifrån och kan hantera objekt. Men i det långa loppet så är det en säkrare metod ur synpunkt Ax-miljö. Problem med vilka dll:er som ligger var efter en prod-installation är ett minne blott då man har all kod i Ax.

Generellt så brukar Ax vara master hos kunden, så ofta har jag/vi kommit fram till att det är bra om Ax bestämmer över data-flödet också, för på det sättet så kan man schemalägga det enklare så att det passar in när Ax har tid. Detta beror självklart på om det är något som är i realtid eller om det är något som kan höftas lite om hur var och när data ska hämtas och lämnas. Det kan ju också vara en mittemellan-integration där Ax normalt sköter flödet, men att utomstående programvara har möjlighet att meddela ax via t.ex. en ax publicerad klass via WCF.

Men det kan ju också vara så att Ax kanske bara är en order-backend mot en website som är den huvudsakliga affärs-delen. Då kanske man vill göra tvärs om.

Och som alltid, ju mer du vill ha som kund, desto mer delar och mer avancerat blir det. Därför råder jag som vanligt. Tänk till, tänk över, tänk om, bolla med din partner och håll det enkelt. Någon gång kanske någon slutar, det ska uppgraderas till nästa version, en programvara byts ut, går det enkelt att porta/bygga om? Så tyvärr, det finns ingen 1-2-3-guide till bygg din egen Ax-integration. Man kan förvisso lägga upp några tutorials som visar enstaka tekniska delar, men det är mer så att man som kund kan ha lite på fötterna om vad man ska förvänta sig att en partner pratar om.

Planen är att detta är lite grund för att framöver lägga upp lite guider om hur man kan göra dom olika varianterna.

Man lär sig något, varje dag. Nu med SQL Administration

Inne i Ax har sedan urminnes tider funnits ett formulär som heter SQL Administration. Därifrån har man kunnat indexera om index, släppa och återskapa tabeller och lite andra småsaker som man egentligen aldrig har haft lust att göra inifrån Ax. Idag på ett möte så sade en part, ”men jag läste att dom hade uppdaterat det där”. Oförskämd som jag är så öppnade jag genast Ax och kollade. Och döm om min förvåning, helt plötsligt har man möjlighet till avancerade index-parametrar via knappen ”Table and index options”. Fyllnadsgrad per index inifrån ax t.ex.

Och även på tabell så har man möjligheter. Se här

Detta medför ju en stor fördel mot att göra det andra hållet, dvs. att trycka in det i SQL:en och sedan tappa allt när man gör en rebuild på indexet från Ax.

Allt du behöver nu är någon som säger vilka parametrar på vilket index och vilken fill factor som du behöver för att prestandan ska bli bäst för just dina tabeller.