Lettrer une facture

Applicable pour la version 2009

Première manière

Voici comment lettrer une facture (client ou fournisseur).

Nous avons besoin du record dans LedgerJournalTrans et CustTransOpen ou VendTransOpen ou encore, comme l’exemple ci-dessous, la Map CustVendTransOpen. Ce qui est une meilleur solution.

Ici j’ai également rajouté un boolean pour voir si l’on devait lettrer ou pas.

protected void settle()
{
    SpecTrans           specTrans;
    ;

    if (!settle)
    {
        return;
    }

    if (!this.custVendTransOpen())
    {
        return; 
    }

    settle                  = false;

    //init table id and recid
    specTrans.SpecTableId   =  ledgerJournalTrans.TableId;
    specTrans.SpecRecId     =  ledgerJournalTrans.RecId;
    specTrans.SpecCompany   =  ledgerJournalTrans.dataAreaId;

    //init table id and recid
    specTrans.RefTableId    =  this.custVendTransOpen().TableId;
    specTrans.RefRecId      =  this.custVendTransOpen().RecId;
    specTrans.RefCompany    =  this.custVendTransOpen().dataAreaId;

    //init currency and amount
    specTrans.Code          =  ledgerJournalTrans.CurrencyCode;
    specTrans.Balance01     =  ledgerJournalTrans.AmountCurCredit
                            ?  ledgerJournalTrans.AmountCurCredit
                            : (ledgerJournalTrans.AmountCurDebit) * -1;

    //add line
    specTrans.insert();
}

Seconde manière

Achat
static void settleVend(Args _args)
{
    VendTrans      vendTrans1, vendTrans2;
    VendTable      vendTable;
    ;

    while select vendTrans1
    where vendTrans1.PaymReference != ""
    {
            select firstOnly vendTrans2
            where vendTrans2.PaymReference == vendTrans1.PaymReference
            &&    vendTrans2.AmountCur == vendTrans1.AmountCur * -1;
            if(vendTrans2 && (vendTrans1.AmountCur + vendTrans2.AmountCur == 0))
            {
                vendTable = VendTable::find(vendTrans1.AccountNum);
                vendTrans1.transData().markForSettlement(vendTable);
                vendTrans2.transData().markForSettlement(vendTable);
                vendTrans::settleTransact(vendTable);
            }
 
    }
}
Vente
static void settleCust(Args _args)
{
    CustTrans      custTrans1, custTrans2;
    CustTable      custTable;
    ;

    while select custTrans1
    where custTrans1.PaymReference != ""
    {
       if(custTrans1.isPayment())
       {
            select firstOnly custTrans2
            where custTrans2.PaymReference == custTrans1.PaymReference
            &&    custTrans2.AmountCur == CustTrans1.AmountCur * -1;
            if(custTrans2 && (custTrans1.AmountCur + custTrans2.AmountCur == 0))
            {
                custTable = CustTable::find(CustTrans1.AccountNum);
                custTrans1.transData().markForSettlement(custTable);
                custTrans2.transData().markForSettlement(custTable);
                CustTrans::settleTransact(custTable);
            }
        }
    }
}

Applicable pour la version 3 et 4

Pour la version 3 et 4 d’Ax. C’est le même code SAUF qu’il n’y a pas de champ specTrans.RefCompany et specTrans.SpecCompany utilisé pour l’intersociété.

Couleur dans une forme

Ecrire la méthode displayOption() sur la datasource. L’exple ci-dessous met le texte de purchtable en bleu si le nombre de lignes de cde est == 0, sinon le texte est rouge.

public void displayOption(Common _record, FormRowDisplayOption _options)
{
    PurchTable 	purchTable;
    PurchLine	purchLine;
;
    if(_record.TableId == tableNum(PurchTable))
    {
         purchTable = _record;
    }
 
    select count (RecId) from purchLine where purchLine.PurchId == purchTable.PurchId;

    if (purchLine.RecId == 0)
    {
        _options.textColor(WINAPI::RGB2int(0,0,255));//texte en bleu
    }
    else
    {
        _options.textColor(WINAPI::RGB2int(255,0,0));//texte en rouge
    }
 
    super(_record, _options);
}

Si maintenant, on ajoute une ligne, il faut que la ligne soit directement coloriée et que l’on ne perde pas le record sur lequel on est. On peut ajouter ceci dans la méthode “Active” de la data source.

PurchTable_ds.clearDisplayOption(purchTable_ds.cursor());

Ou pour cela, on va écrire ceci dans la méthode write() de la Data Source.

public void write()
{
    PurchTable purchTable1;
    ;

    super();

    //sauvegarde de la position du record
    purchTable1.data(PurchTable);

    //executeQuery pour relancer mettre à jour la couleur
    PurchTable_ds.executeQuery();

    //on se repositionne sur le record sur lequel on était
    PurchTable_ds.findRecord(purchTable1);
}

Highlighting individual grid cells

To highlight one or more individual cells, use the ._options.affectedElementsByControl() method to limit the effect to only the cells in which you are interested.

Note that while this method can display the same colour in multiple cells, there is no way to display different colours in a single row.

public void displayOption(Common _record, FormRowDisplayOption _options)
{
    _options.backColor(WinApi::RGB2int(255,255,0)); // Yellow  
    _options.affectedElementsByControl(Control_Name.id());
    _options.affectedElementsByControl(Another_Control_Name.id());
}

Bouton “Selection” standard

Créer une classe standard extend RunBase.

Il vous faut, si vous avez une nouvelle table ou si la query n’existe pas, de créer une nouvelle query dans le menu adéquat.

Dans votre classe, dans la classDeclaration, créer une queryRun.

Dans la méthode initParmDefault, initialiser la queryRun à votre Query (créée ou pas)

Ensuite, modifier la méthode pack() et unpack() comme suit:

public container pack()
{
    return [#CurrentVersion,#CurrentList, historyQueryRun.pack()];
}
public boolean unpack(container packedClass)
{
    Version     version = RunBase::getVersion(packedClass);
    container   _packedQuery;
;
    switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList,_packedQuery] = packedClass;
            if (!_packedQuery)
                return false;
            historyQueryRun = new QueryRun(_packedQuery);
            break;
        default:
            return false;
    }

    return true;
}

Et créer/modifier la méthode suivante :

public boolean showQueryValues()
{
    return true;
}

Icone dans une forme

La liste des images disponible se trouve dans la macro suivante :

resAppl

Voici la méthode à suivre pour mettre une images dans une forme. Par image j’entends, une main verte suivant telle condition, une croix rouge suivant telle condition, …

On va donc devoir faire deux choses.

Créer la méthode sur la table :

display SmmDocIconNum remark()
{
    if (true)
        return 0;       // Renvoie vide

    if (false)
        return 1030;    // Le 'V' vert 

    return 929;         // Croix rouge;
}

Et ensuite sur la forme, crée un champ de type Window. Avec les paramètre suivants :

 Width               #15
 Height              #15
 BackStyle           #Transparent
 DataSource          #TABLE_SELECTIONNEE
 DataMethod          #remark

Créer un script

Pour pouvoir créer un nouveau script, c’est fort simple.

Dans la classe EditorScripts, il faut créer une nouvelle méthode.

Synthaxe : Dans le nom de la méthode, nous allons pouvoir déterminer le point de menu du nouveau script !
Comment ?
Comme vous le voyez sur le code ci-dessous, le nom de la méthode est commentDVP_insertCommentDVP.
Ce qui signifie que l’on aura un point de menu comme ceci :

Script 
    - commentDVP
         - insertCommentDvp

Le symbole “_” permet donc de spécifier que le texte le précédent est considéré comme un “sous-menu”

void commentDVP_insertCommentDVP(editor e)
{
   str commentLine;
   ;
   commentLine = strfmt("// %1 - %2", systemDateget(), curUserId());
   e.insertLines(commentLine);
}

Overlap between the record

Voici la méthode pour contrôle s’il y a un overlap de date entre deux enregistrements.

Dans la méthode validateWrite():

    if (this.mCheckOverlapDate())
    {
        ret = checkFailed("@SYS39599");
    }

Maintenant dans la méthode mCheckOverlapDate:

// Control the overlapping with the FromDate and ToDate with other record in this table.
public boolean mCheckOverlapDate(boolean _checkOtherRecordOverlap = true)
{
    Table       mTable;

    boolean     ret;
    boolean     fromDateOverlapped;
    boolean     toDateOverlapped;
    boolean     ourRangeOverlapped;
    ;

    //  We loop over the record for the same paym term condition
    while select mFromDate, mToDate from mTable
    where mTable.RecId != this.RecId
    {
        //  First we control if there are no overlapping for the MyFromDate field
        if (this.MyFromDate >= mPaymTerm.MyFromDate && this.MyFromDate <= mPaymTerm.MyToDate)
        {
            fromDateOverlapped = true;
            break;
        }

        //  Second time, we control if there are no overlapping for the MyToDate field
        if (this.MyToDate >= mPaymTerm.MyFromDate && this.MyToDate <= mPaymTerm.MyToDate)
        {
            toDateOverlapped = true;
            break;
        }
    }

    if (fromDateOverlapped || toDateOverlapped)
    {
        ret = true;
    }

    if (_checkOtherRecordOverlap)
    {
        //  Now we will control if each other record are not in our range !
        while select mTable
        where mTable.RecId != this.RecId
        {
            if (mPaymTerm.mCheckOverlapDate(false))
            {
                ourRangeOverlapped = true;
            }
        }

        if (ourRangeOverlapped)
        {
            ret = true;
        }
    }

    return ret;
}

Bargraphe

Voici le code, si certains d’entre-vous désirerait créer un bargraphe (une boite de dialogue avec une barre de progression)

static void Job1(Args _args)
{
    #AviFiles

    SysOperationProgress showProgress = new SysOperationProgress();
    int i;
    ;

    showProgress.setCaption("Opération longue");
    showProgress.setAnimation(#AviUpdate); 
    showProgress.setTotal(100000);

    for (i = 1; i <= 100000; i++)
    {
        showProgress.setText(strfmt("Etape %1", i));
        showProgress.incCount();
    }
}