bonjour à tous,
je dois faire un web service en C# qui appelle une fonction RFC dans SAP.
j'arrive à la connexion et j'ai une exception COMException (paramètre non facultatif) au moment de la définition de la fonction.

quelqu'un pourrait-il m'aider?

voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
 
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using SAPFunctionsOCX;
using System.Threading;
 
namespace testSAP
{
    /// <summary>
    /// Description résumée de Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX, supprimez les marques de commentaire de la ligne suivante. 
    // [System.Web.Script.Services.ScriptService]
 
    public class Service1 : System.Web.Services.WebService
    {
 
        [WebMethod]
        public void HelloWorld()
        {
            ParameterizedThreadStart parmStart =
                new ParameterizedThreadStart(ExecuteSAP);
            Thread tr = new Thread(parmStart);
            tr.TrySetApartmentState(ApartmentState.STA);
            tr.Start();
        }
 
        private void ExecuteSAP(object test)
        {
            SAPFunctionsOCX.SAPFunctions functions = new SAPFunctionsOCX.SAPFunctions();
            SAPLogonCtrl.SAPLogonControl saplogon = new SAPLogonCtrl.SAPLogonControl();
            SAPLogonCtrl.Connection connection;
            SAPFunctionsOCX.Function function;
 
            saplogon.System = "NESSIE PEOPLE - PRODUCTION - P02";
            saplogon.Client = "700";
            saplogon.User = "FR20400";
            saplogon.Password = "xxxxxx";
            saplogon.Language = "EN";
            connection = (SAPLogonCtrl.Connection)saplogon.NewConnection();
            connection.Logon(0, true);
 
            try
            {
                functions.Connection = connection;
                function = (SAPFunctionsOCX.Function)functions.Add("Z_RFC_CALL_TRANSACTION");
                SAPFunctionsOCX.Parameter exp_tcode = (SAPFunctionsOCX.Parameter)function.get_Exports("TRANCODE");
                exp_tcode.Value = "Z_SAP_QUERY_CALL";
                SAPFunctionsOCX.Structure exp_opt=(SAPFunctionsOCX.Structure)function.get_Exports("I_OPTIONS");
                exp_opt["DISMODE"] = "N";  //"A" '"E","N"
                exp_opt["UPDMODE"] = "S";
                exp_opt["DEFSIZE"] = "X";
                exp_opt["RACOMMIT"] = "X";
 
                SAPTableFactoryCtrl.Tables tbls = (SAPTableFactoryCtrl.Tables)function.Tables;
                SAPTableFactoryCtrl.Table tbl_bdcresult = (SAPTableFactoryCtrl.Table)tbls["O_MSGTABLE"];
                SAPTableFactoryCtrl.Table tbl_bdcdata = (SAPTableFactoryCtrl.Table)tbls["BDCTABLE"];
                SAPTableFactoryCtrl.Row row_bdcdata;
 
                 //Jusque là ça marche
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["PROGRAM"] = "ZSAP_QUERY_CALL"; //ça plante sur cette ligne
                row_bdcdata["DYNPRO"] = "1000";
                row_bdcdata["DYNBEGIN"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "P_WSID";
                row_bdcdata["FVAL"] = "";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "P_UGROUP";
                row_bdcdata["FVAL"] = "HR_FR";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "P_QUERY";
                row_bdcdata["FVAL"] = "STAFF";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "P_VARI";
                row_bdcdata["FVAL"] = "AWL";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "BDC_OKCODE";
                row_bdcdata["FVAL"] = "=ONLI";
 
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["PROGRAM"] = "AQQO" + "HR_FR" + new String('=',7) + "STAFF" + new String('=',9);
                row_bdcdata["DYNPRO"] = "1000";
                row_bdcdata["DYNBEGIN"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "%DOWN";
                row_bdcdata["FVAL"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "BDC_OKCODE";
                row_bdcdata["FVAL"] = "=ONLI";
 
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["PROGRAM"] = "SAPLAQDW";
                row_bdcdata["DYNPRO"] = "200";
                row_bdcdata["DYNBEGIN"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "RLGRAP-FILETYPE";
                row_bdcdata["FVAL"] = "DAT";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "RLGRAP-FILENAME";
                row_bdcdata["FVAL"] = @"D:\Staff.txt";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "RSAQDOWN-COLUMN";
                row_bdcdata["FVAL"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "BDC_OKCODE";
                row_bdcdata["FVAL"] = "=SEND";
 
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["PROGRAM"] = "AQQO" + "HR_FR" + new String('=', 7) + "STAFF" + new String('=', 9); ;
                row_bdcdata["DYNPRO"] = "1000";
                row_bdcdata["DYNBEGIN"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "BDC_OKCODE";
                row_bdcdata["FVAL"] = "/EE";
 
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["PROGRAM"] = "ZSAP_QUERY_CALL";
                row_bdcdata["DYNPRO"] = "1000";
                row_bdcdata["DYNBEGIN"] = "X";
                row_bdcdata = (SAPTableFactoryCtrl.Row)tbl_bdcdata.AppendRow();
                row_bdcdata["FNAM"] = "BDC_OKCODE";
                row_bdcdata["FVAL"] = "/EE";
 
               function.Call();
 
            }
            finally
            {
                connection.Logoff();
            }
        }
    }
 
}
l'exception est la suivante :
l'exception COMException n'a pas été gérée :
Paramètre non facultatif. (Exception de HRESULT : 0x8002000F (DISP_E_PARAMNOTOPTIONAL))
si quelqu'un a déjà fait de la programmation COM en C# et sait gérer ce genre d'erreur, pourrait-il m'aiguiller. je suis novice en C#.

merci d'avance