vendredi 15 mars 2013

Récupérer une distance en km grâce API Google Maps/DotNet/XML

Un petit bricolage avec l'API Google Maps/DotNet/XML qui permet de récupérer la distance entre 2 villes saisies en paramètres: à tester/adapter/détourner/améliorer

static void OBRFindKm(Args _args)
{
    dialog                           d;
    dialogField                    Depart,Arrivee;
    Name                           VilleDepart,VilleArrivee;
    Str                                url,xml;
    System.Net.WebClient  webClient = new System.Net.WebClient();
    XMlDocument              doc;
    XMLNodeList              Distance;
    XMLNode                    node;
    real                                totaldistance;
    AddressZipCode           AddressDepart,AddressArrivee;
    AddressMap                 AddressMap;
    ;
    d = new dialog();

    Depart = d.addField(typeId(Name));
    Depart.label("Départ");

    Arrivee = d.addField(typeId(Name));
    Arrivee.label("@SYS14181");

    d.run();

    VilleDepart = Depart.value();
    VilleArrivee = Arrivee.value();

    if(VilleDepart != "" && VilleArrivee != "")
        {
             url = "http://maps.google.com/maps/api/directions/xml?language=fr&origin="+VilleDepart+"&destination="+VilleArrivee+"&sensor=false";
             xml = webClient.DownloadString(url);
             doc = XMLDocument::newXml(xml);
             Distance = doc.selectNodes('//distance');
             node = Distance.nextNode();

            if(d.closedOk())
                {
                     while(node)
                        {
                            totalDistance = any2real(node.selectSingleNode('value').text());
                            node = Distance.nextNode();
                        }
                    box::info((strfmt("%1 %2 %3","Distance totale:",totalDistance/1000,"km")));
                }
            else
                {
                    box::info("@SYS93289");
                }
        }
    else
        {
            box::info("le point de départ et/ou le point d'arrivé sont mal renseignés");
        }
}



Bloquer le critère de filtre d'un formulaire

Scénario:

On a ajouté le code suivant sur la méthode executeQuery() du datasource du formulaire pour n'afficher que les articles dont le nom contient "Porte*"

this.query().dataSourceNo(1).addRange(fieldnum(InventTable, ItemId)).value('Porte*');

A l'ouverture, tout est OK sauf que si ensuite on resaisit un filtre dans les colonnes, le filtre initial disparaît. Dans ce cas de figure, pour maintenir le filtre initial, il faut ajouter le code suivant :

this.query().dataSourceNo(1).addRange(fieldnum(InventTable,ItemId)).status(rangeStatus::Locked);


Aller à la table principale à partir du contenu d'un champ et pas du type

Pour avoir "Aller à la table principale" sur un champ sans extended Data type ou alimenté par une méthode,
il suffit d'ajouter une méthode jumpref() sur le champ en question:

public void jumpRef()
{
    Args                   args;
    MenuFunction    menuFunction;
    SalesTable          SalesTable;
    ;
    args = new Args();
    menuFunction = new MenuFunction(menuitemDisplayStr(SalesTable), MenuItemType::Display);
    args = new Args(menuFunction.object());
    args.caller(element);

    select SalesTable where SalesTable.SalesId == NumCommandeEnCours.text();

    args.record(SalesTable);
    menuFunction.run(args);
}

Explication:
on va se servir des classes Args, menuFunction et d'un buffer de la table Salestable. On récupère l'argument du No de commande affiché dans le champ NumCommandeEnCours avec la méthode text(), on la passe dans un select pour récupérer le buffer de salesTable pour la commande en cours et on lance une instance de la classe menuFunction qui va ouvrir le formulaire SalesTable filtré sur le No de commande qui nous intéresse