MercatorWebService40.MercatorWebServiceSoapClient client = new MercatorWebService40.MercatorWebServiceSoapClient();
MercatorWebService40.SecurityInfo si = new MercatorWebService40.SecurityInfo();
si.SecureKey = ... ;

MercatorWebService40.StringMws s = client.BillingEngineInitExisting(si, MercatorWebService40.TypeVAEnum.V, 1, "00F384F9FE", "Factu", 201300003);
if (!string.IsNullOrEmpty(s.LastError))
{
    MessageBox.Show("BillingEngineInitExisting : " + s.LastError);
    return;
}
// à partir d'ici, il est obligatoire d'appeler la méthode BillingEngineClose
string uniqueId = s.Value;

MercatorWebService40.DataSetMws ds = client.BillingEngineDataSet(uniqueId);
if (!string.IsNullOrEmpty(ds.LastError))
{
    MessageBox.Show("BillingEngineDataSet : " + s.LastError);
}
else
{
    MercatorWebService40.BooleanMws b = client.BillingEngineUpdateLigne(uniqueId, 0, "pu", 100); // changer le prix unitaire sur la ligne 0
    if (!string.IsNullOrEmpty(b.LastError))
    {
        MessageBox.Show("BillingEngineUpdateLigne : " + b.LastError);
    }
    else
    {
        b = client.BillingEngineUpdateAmounts(uniqueId);
        if (!string.IsNullOrEmpty(b.LastError))
        {
            MessageBox.Show("BillingEngineUpdateAmounts : " + b.LastError);
        }
        else
        {
            MercatorWebService40.DataTableMws dt = client.BillingEnginePIEDS(uniqueId);
            if (!string.IsNullOrEmpty(dt.LastError))
            {
                MessageBox.Show("BillingEnginePIEDS : " + dt.LastError);
            }
            else
            {
                double tot_ttc_dv = Convert.ToDouble(dt.Value.Rows[0]["TOT_TTC_DV"]);

                b = client.BillingEngineSave(uniqueId);
                if (!string.IsNullOrEmpty(b.LastError))
                    MessageBox.Show("BillingEngineSave : " + b.LastError);
                else
                    MessageBox.Show(string.Format("Le nouveau total est {0:### ##0.00} !", tot_ttc_dv));
            }
        }
    }
}
MercatorWebService40.VoidMws v = client.BillingEngineClose(uniqueId);  // toujours terminer par BillingEngineClose() après un InitExisting fructueux, sinon ce document sera non modifiable dans Mercator car en cours de modification
if (!string.IsNullOrEmpty(v.LastError))
    MessageBox.Show("BillingEngineClose : " + v.LastError);