Kā atlasīt unikālu ierakstu skaitu ar X++?

Situācija tāda, ka nav standarta veida kā atlasīt unikālu ierakstu skaitu Axaptā. Tad viens variants, kā atrisināt šo problēmu ir izmantot klasi SqlStatementExecutePermission(AX4.0), lai izpildītu SQL. SQLā savukārt ir atslēgas vārds DISTINCT, kas nodrošina unikālu ierakstu atlasīšanu.

1) Vispirms izveido jaunu klasi, piemēram, Class1, kas izpildās servera pusē (Run on: Server) ar statisku metodi ‘recordCount’:

static int recordCount(Str _query)
{
    Connection                      connection = new Connection();
    Statement                       statement  = connection.createStatement();
    ResultSet                       resultSet;
    SqlStatementExecutePermission   permission;
    int                             result;
    ;
    permission = new SqlStatementExecutePermission(_query);
    permission.assert();
    resultSet = statement.executeQuery(_query);
    if (resultSet.next())
    {
        result = resultSet.getInt(1);
    }
   return result;
}

2) Un šinī piemērā izveidosim jaunu job:

static void stma1_CountDistinct(Args _args)
{
    str query = @"SELECT COUNT(DISTINCT RECID) FROM EMPLTABLE WHERE DATAAREAID='%1' AND CITY='%2'";
    int ret;
    ;
    query = strfmt(query, CurExt(), 'Liepāja');
    print Class1::recordCount(query);
    pause;
}

Tie kas saprot SQL uzreiz redz, kas te notiek. Respektīvi, no tabulas EmplTable tika atlasīti tikai tie ieraksti, kuriem City ir Liepāja. Savukārt mūsu metode RecordCount atgrieza šo ierakstu skaitu. Protams šo triviālo situāciju varēja atrisināt citādāk, bet ja skaitāmais lauks nebūtu RecId, tad būtu jāveido cikls, lai saskaitītu cik unikālu ierakstu ir bijis.

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

3 Comments »

 
  • noobi saka:

    vai tad šitā nav vienkāršāk? :)

    EmplTable et;
    ;
    select count(recid)
    from et
    group by recid
    where et.City == “Liepāja”;

  • Ir vienkāršāk, bet doma bija izveidot funkciju, kas atlasītu unikālo ierakstu skaitu. Piemēram, ja notiek pārbaude ja kreditoram ir ievadīti divi konti vienā bankā, tad parādās brīdinājums, bet ļauj ievadīt. Tad būtu jāraksta viens while select un cnt++; un pēc tam if(cnt)>1 then do smthn; Šāda problēma rodas, jo x++ nav vārdiņa distinct;

  • noobi saka:

    sagrupē pēc bankas un viss. 1 sql izteiksme bez nekādiem cikliem.

 

Pievienot komentāru

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*