...feel the spirit of Microsoft Dynamics AX RSS 2.0
 Thursday, April 19, 2007

Eigendlich wollte ich hier noch die erweiterten Möglichkeiten bei den Einschränkungen zum Besten geben, das kann man aber schon alles fix und fertig bei Axaptapedia nachlesen.

Daher vorerst nur noch die eine Sache die ich noch beschreiben möchte:

Möchte man eine Einschränkung auf einen Array Feld (die Dimension: Abteilung, Kostenstelle, Kostenträger sind hierfür ein gutes Beispiel) definieren kann diese wie folgt erstellt werden.

queryRange = queryDS.addRange(fieldid2ext(fieldnum(InventTable, Dimension), 1));

Das erstellen der Range bleibt im Grunde gleich, nur das jetzt mittels fieldid2ext noch der Array Index angegeben wird. Der Index beginnt in Microsoft Dynamics Ax immer mit 1.

Da nun diese Sache hier nicht mehr behandelt wird, möchte ich noch eine komplett andere Möglichkeit zeigen Datensätze aus der Datenbank zu holen um diese beispielsweise in Masken anzuzeigen. Anstelle einer Query kann man auch SQL Anweisungen verwenden.


Das wird ein bisschen Tricky...
Ich fange aber heute nur "einfach" an.

Zuerst bauen wir uns einen neue Form und nennen diese ArtikelSQL (Der Name ist hier eigendlich egal, ich habe mich aber für eine Artikelmaske entschieden).
Dann legen wir die InventTable mittels Drag&Drop als Datasource fest. Zum Abschluss zeigen wir noch ein paar Feld (Artikelnummer und Artikelname reicht erstmal aus) über ein neu hinzugefügtes Grid in dieser Maske an. Fertig - beim Aufruf der Maske erhalten wir alle Datensätze die sich in der Tabelle InventTable befinden.

Als nächsten Schritt definieren wir eine Variable in der Classdeclaration

Source SQLAnweisung;

In dieser Variable schreiben wir später unsere SQL Anweisung. Bevor das jedoch gemacht wird, muss als nächstes noch die Methode executeQuery auf der DataSource überschrieben werden.

void executeQuery()
{
    if (SQLAnweisung)
    {
        runbuf(SQLAnweisung, this.cursor());
    }
    else
    {
        super();
    }
}


Neu  hinzugekommen ist hier die IF Abfrage, die prüft ob eine SQLAnweisung erstellt wurde, bzw. ob die Variable SQLAnweisung nicht leer ist. Wurde  keine SQLAnweisung getroffen, wird die Standardquery auf der DataSource ausgeführt. Wurde aber eine SQLAnweisung getroffen wird diese nun Anstelle der Query ausgeführt.

Zu guter letzt fehlt nur noch die SQLAnweisung, die erstellt werden muss.

void initSQLAnweisung()
{
XppCompiler compiler = new XppCompiler();
DictTable dictTable= new DictTable(Tablenum(InventTAble));
str SELECTAnweisung = 'SELECT * FROM '+dictTable.name();

SQLAnweisung = 'void SQLSTMT('+dictTable.name()+' '+dictTable.name()+')\n{\n'+SELECTAnweisung+';\n}\n';
if (!compiler.compile(SQLAnweisung))
{
setprefix("@SYS57538");
info (SQLAnweisung);
error (compiler.errorText());
SQLAnweisung = '';
<>}
}
Diese Methode erstellt die SQL Anweisung. Es reicht nicht aus einfach ein SELECT Statement zu schreiben, da der Compiler das nicht versteht. Anstelle eines einzelenen SELECT Statement schreibt man einfach eine Methode drumherum, die dann über runbuf ausgeführt wird.
Das eigendliche SELECT Statement sieht wie folgt aus und wird gleich der Variable SELECTANweisung zugewiesen.

SELECT * FROM InventTable

Über diese einfache Select Anweisung erhalten wir alle Datensätze aus der Tabelle InventTable. Auf den ersten Blick ist es nicht einfach zu erkenne aber aus

'void SQLSTMT('+dictTable.name()+' '+dictTable.name()+')\n{\n'+SELECTAnweisung+';\n}\n';

wird in der lesbaren Ansicht

void SQLSTMT(InventTable InventTable)
{
    SELECT * FROM InventTable;
}

und der globalen Variablen SQLAnweisung zugewiesen.
Nur um sicher zugehen ob alles richtig geschrieben wurden und keine Kompilierungsfehler enthalten sind, wird diese Anweisung noch dem Compiler übergeben und kompiliert.

compiler.compile(SQLAnweisung)


Wurden keine Fehler gefunden ist alles Prima, ansonsten wird die Variable noch gelöscht um beim Ausführen der Methode executeQuery keine Fehler zu erhalten. Die Ausgabe der Fehlermeldung vom Compiler ist optional.

Der Aufruf der Methode "initSQLAnweisung" Methode erfolgt noch dem super() in der Methode init der Maske.

Durch die SQL Anweisung hat man den Vorteil auf eine sehr einfache Art&Weise sehr komplexe Abfragen gestalten zu können. Einige Nachteile gibt es leider auch, die Standardfunktionen wie Filtern oder Sortieren funktionieren im genannten Beispiel nicht mehr.

Das komplette Beispiel noch als xpo zum Download. Wie immer wurde auch dieses Beispiel in Microsoft Dynamics Ax 4.0 erstellt.
Form_ArtikelSQL.zip (1.08 KB)

Thursday, April 19, 2007 10:51:15 PM (Mitteleuropäische Zeit, UTC+01:00)  Mathias Füßler  #    Comments [3] - Trackback
 | 

Friday, October 26, 2007 2:17:15 PM (Mitteleuropäische Zeit, UTC+01:00)
As far as I understand you'd followed SysTableBrowser form example.
I propose small modification in SysTableBrowser form.

1. In the clicked() method ExecuteSQL button modify lines like this:
//sqlcmd = 'void SQLSTMT('+dicttable.name()+' '+dictTable.name()+')\n{\n'+sql.text()+';\n}\n';// orig
sqlcmd = sql.text();

2. In the run() method:
//this.parmSQLStmt('SELECT * FROM '+tableId2name(tableId));//original
this.parmSQLStmt(strFmt('void SQLSTMT(%1 %1)\r\n{\r\nSELECT * FROM %1;\r\n}', tableId2name(tableId)));

So now you may explore SQL statements not bounded only one table. For example just type in SQL statement window following lines:

void SQLSTMT(PriceDiscTable PriceDiscTable)
{
InventDim InventDim;
SELECT * FROM PriceDiscTable JOIN * FROM InventDim WHERE PriceDiscTable.InventDimId == InventDim.inventDimId && ((InventDim.inventDimId == '7156'));
}

I think http://www.axaptapedia.com/DEV_QueryBrowser will be interesting for you
Friday, October 26, 2007 4:40:04 PM (Mitteleuropäische Zeit, UTC+01:00)
Hi Ruslan,

this is a great tool that you share with us on axaptapedia! Thanks a lot.
Tuesday, December 16, 2008 11:52:47 PM (Mitteleuropäische Zeit, UTC+01:00)
Hi Axel Kühn,

Great works to share with us throughout the years. Wish you have a 2008 frohe Weihnachten…

Schuesst.
Minh from Sydney - Australia.
Comments are closed.


Translate
Über/Kontakt

     







© Copyright 2012 Axel Kühn
Sign In
Subscribe this blog
Blogroll
 Arijit Basu
 Axapta Blog
Blog around Microsoft Business Solutions Axapta by Helmut Wimmer
 BlaBlubBlog
Der Blog von Kai Gloth
 Dave Bowles
 Dick Wenning
Ax(apta) start pages
 Fred Shen
 Harish Mohanbabu
 jinx´s AX Blog
Everything about Microsoft Dynamcis AX
 Lars Keller
All about .NET, VSTS, VSTO and more
 Max Belugin
 TaReMoTi Blog
Der Blog von Karsten Döring
Archiv
<February 2012>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910
Statistik
Gesamte Posts: 137
Dieses Jahr: 0
Dieser Monat: 0
Diese Woche: 0
Kommentare: 49





All Content © 2012, Axel Kühn
DasBlog theme 'Business' created by Christoph De Baene (delarou)