Dynamics AX Blog - Dynamics AX 4.0 - Seite 2

Momentan angezeigt werden nur Beiträge, welche für die Dynamics AX-Version »Dynamics AX 4.0« relevant sind. Filter entfernen

RSS-Feed dieser Version

Welche Felder werden in einem automatisch generierten Lookup angezeigt?

Mir wurde diese Frage vor kurzem selbst gestellt und konnte diese allerdings nur zum Teil beantworten.

Ich wusste aber noch, daß ich schon einmal eine Seite gesehen hatte, wo dies genau erklärt wird. Aber ich wusste weder noch wo, noch konnte ich sie über diverse Suchmaschinen finden.

Aber in alten Unterlagen fand ich die Quelle dann doch, der Trick um die Quelle auch mit Google und Konsorten zu finden ist, mit dem altem Namen von Microsoft Dynamics AX - Axapta danach zu suchen!

Tut man dies, so findet man rasch folgende Seite:

http://www.axaptapedia.com/index.php?title=Lookups


 
 

Erstellen einer AX<Table>-Klasse

Benötigt man für eine Tabelle eine sog. AX<Table>-Klasse kann man sich diese mit Hilfe der Klasse AxGenerateAxBCClass generieren lassen.

Dazu einfach diese Klasse im AOT per rechter Maustaste aufrufen und dem Assistenten folgen.

Die auf diese Art & Weise generierte Klasse muss unter manchen Umständen noch etwas bearbeitet werden, dennoch geht der Vorgang rascher von der Hand, als die Klasse komplett selbst erstellen zu müssen.

Und wenn sich die Tabelle ändert, beispielweise wenn neue Felder hinzukommen, kann man die AxGenerateAxBCClass einfach nochmals aufrufen und die AX<Table>-Klasse wird entsprechend erweitert.

Wie man solche AX<Table>-Klassen verwendet, habe ich u.a. hier beschrieben.


 
 

Beispiel für einen Datumsfilter einer FormDataSource

Im folgenden ein Beispiel, wie man bei einer FormDataSource einen QueryBuildRange aufbaut, welcher nur tagesaktuelle Datensätze anzeigt.

Im Beispiel enthält unsere FormDataSource namens DataSourceName zwei Datumsfelder namens FromDate und ToDate und es sollen abhängig von einer Checkbox nur Datensätze angezeigt werden, die "heute" gültig sind.

public void applyFilter()
{
    queryBuildRange qbr;

    qbr = sysQuery::findOrCreateRange(DataSourceName_ds.queryBuildDataSource(), fieldNum(DataSourceName, recId));

    if( !ShowExpiredCheckBox.checked())
    {
        qbr.value(strfmt('('+
                         '((%5.%2 <= %1) && (%5.%3 >= %1)) || ' +
                         '((%5.%2 == %4) && (%5.%3 == %4)) || ' +
                         '((%5.%2 <= %1) && (%5.%3 == %4)) || ' +
                         '((%5.%3 >= %1) && (%5.%2 == %4)) ' +
                         ')',
                                Date2StrXpp(systemDateGet()),
                                fieldstr(DataSourceName, FromDate),
                                fieldstr(DataSourceName, ToDate),
                                Date2StrXpp(dateNull()),
                                tableId2name(tableNum(DataSourceName))));
    }
    else
    {
        qbr.value(SysQuery::valueUnlimited());
    }
}

Der Aufruf obiger Methode kann beispielsweise in der executeQuery() der Datasource erfolgen.


 
 

Text-Datei per X++ drucken

Ein kurzes Beispiel, wie man aus AX heraus via Notepad eine Text-Datei ausdrucken kann.

static void printTextFileFromAX(Args _args)
{
    WinAPI::shellExecute("c:\\windows\\system32\\NOTEPAD.EXE",  @'/pt "c:\temp\test.txt" "An OneNote 2010 senden"');
}

Hinweise: "An OneNote 2010 senden" ist dabei der Name des Druckers. Das Beispiel wurde in Dynamics AX 2012 verwendet, sollte allerdings auch in früheren Versionen verwendbar sein.


 
 

Berichte lassen sich nicht über die Stapelverarbeitung ausführen

Wenn bei einem Benutzer der Register Stapel beim Aufruf eines Berichtes nicht angezeigt wird, kann dies u.U. daran liegen, daß der Benutzer keine oder unzureichende Berechtigung für den Sicherheitsschlüssel Stapelverarbeitungsbericht (SecurityKey BatchReport) hat.


 


 
 

Berechtigung eines Benutzers für einen Sicherheitsschlüssel abfragen

Mit diesem Stückchen Code kann man in Dynamics AX prüfen, welche Berechtigung ein Benutzer für einen bestimmten Sicherheitsschlüssel (Securitykey) hat.

static void GetSecurityKeyAccess4User(Args _args)
{
    Dictionary          Dictionary = new Dictionary();
    securityKeyId       securityKeyId;
    SecurityKeySet      securityKeySet = new SecurityKeySet();
    UserId              userId = 'user1';
    SelectableDataArea  dataArea = 'ceu';
    AccessType          accessType;
    ;

    securityKeyId = Dictionary.securityKeyName2Id("BatchReport");

    securityKeySet.loadUserRights(userId, dataArea);

    AccessType = securityKeySet.access(securityKeyId);

    info(enum2str(AccessType));
}

 
 

Tabellen mit doppelten RecIDs ermitteln

Wenn man in Dynamics AX (4.0 bzw. 2009) einmal in die Verlegenheit kommen sollte, prüfen zu müssen, ob es Tabellen mit doppelten RecIDs gibt, kann folgendes SQL-Script dabei behilflich sein:

use ax2009_standard_sp1

set nocount on

declare @tableName char(100)
declare db_cursor CURSOR FOR 
 select name from dbo.sysobjects
 where xtype = 'U'
 and name <> 'ROWSTAT'
 and name <> 'ROWSTATUS'
 and name <> 'SQLSYSTEMVARIABLES'
 and name <> 'SYSTEMSEQUENCES' -- SYSTEMSEQUENCES enthält immer doppelte RecIDs
 order by name asc

-- Temporäre Tabelle aufbauen
IF OBJECT_ID(N'tempdb..#tmp_duplrecid', N'U') IS NOT NULL
 begin
 drop table #tmp_duplrecid
 end

create table #tmp_duplrecid (tablename char(100), recordcounter bigint)   

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @tableName  

WHILE @@FETCH_STATUS = 0  
 BEGIN  
  -- Tabellen mit doppelten RecIds ermitteln
  exec('insert into #tmp_duplrecid select ''' + @tableName + ''', COUNT(*)' +
    ' from ' + @tableName +
    ' group by RECID ' +
    ' having COUNT(*) > 1')
       
  FETCH NEXT FROM db_cursor INTO @tableName  
 END  

CLOSE db_cursor  
DEALLOCATE db_cursor

set nocount off

-- Tabellen mit doppelten RecIDs
select 'Tabelle enthält doppelte RecIDs: ' + tablename
from #tmp_duplrecid


 


 
 
Seiten « 1 2 3 4 5 ... 8 » 

 

 
 
 
Beiträge des aktuellen Monats
März 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu