Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Microsoft Dynamics GP向taCreateEmployee添加新员工 如何从taCreateEmployee获取下一个可用的员工id?_C#_Xml_Microsoft Dynamics - Fatal编程技术网

C# C Microsoft Dynamics GP向taCreateEmployee添加新员工 如何从taCreateEmployee获取下一个可用的员工id?

C# C Microsoft Dynamics GP向taCreateEmployee添加新员工 如何从taCreateEmployee获取下一个可用的员工id?,c#,xml,microsoft-dynamics,C#,Xml,Microsoft Dynamics,我正在构建一个小的windows窗体程序,使用eConnect工具将新员工添加到Microsoft Dynamics Great Plains数据库。我成功地构建了xml文档并将其发送到服务器,但收到一条错误消息: “taCreateEmployee”需要未提供的参数“@I_vEMPLOYID”。 因此,我想我需要在尝试插入记录之前获取员工id,但如何获取员工id?下面是xml 下面是我使用econnect工具拨打电话的地方: public void eConnectSend(AllAS

我正在构建一个小的windows窗体程序,使用eConnect工具将新员工添加到Microsoft Dynamics Great Plains数据库。我成功地构建了xml文档并将其发送到服务器,但收到一条错误消息:

“taCreateEmployee”需要未提供的参数“@I_vEMPLOYID”。 因此,我想我需要在尝试插入记录之前获取员工id,但如何获取员工id?下面是xml

下面是我使用econnect工具拨打电话的地方:

    public void eConnectSend(AllASEmlpoyees employeeList)
    {
        //Serialized XML File         
        string xmldocument = null;
        //Connection String         
        string connectString = null;
        //Result         
        string xmlobject = null;

        using (eConnectMethods eConCall = new eConnectMethods())
        {

            try
            {
                SerializeObject(employeeList);
                System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
                xmldoc.Load(directory + @"\" + file);
                xmldocument = xmldoc.OuterXml;
                connectString = "thisismyconnectionstringwhichisworking";
                //send data to Great Plains
                xmlobject = eConCall.CreateTransactionEntity(connectString, xmldocument);
                Console.WriteLine("Object returned: " + xmlobject.ToString());

            }
            catch (eConnectException exp)
            {
                Console.WriteLine("Exception: " + exp.ToString());
                //Interaction.MsgBox(exp.ToString);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("Exception: " + ex.ToString());
                //Interaction.MsgBox(ex.ToString());
            }
            finally
            {
                //eConCall.Dispose();
                Console.WriteLine("Done");
                Console.ReadLine();
                this.cleanUpObjectsOnComplete();
            }
        }
    }

任何帮助我都会很好

我不知道这是否是一个解决方法,但这就是我解决问题的方法。我向数据库中添加了三个存储过程

存储过程添加:

使用select查询检查员工是否存在,如果存在则返回id 查询UPR40201表以获取下一个可用id 成功添加记录后更新UPR40201表 第一个,接受ss作为输入参数。使用传递的参数,我在表上运行查询,查找已经存在的员工。如果确实如此,那么我将返回id并在taCreateEmployee上调用UpdateIfExits

ALTER PROCEDURE [dbo].[MY_Emloyee_GetEmployeeIdBySocialSecurityNumber]
-- Add the parameters for the stored procedure here
@ssnum AS varchar(255),
@EmployeeID As varchar(10) OUTPUT

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


    BEGIN TRY
        -- Insert statements for procedure here
        SELECT @EmployeeID=taCreateEmployee.EMPLOYID FROM taCreateEmployee WHERE     taCreateEmployee.SOCSNUM = @ssnum
        return 1
    END TRY
    BEGIN CATCH
        DECLARE
        @ErrorSeverity INT,
        @ErrorNumber   INT,
        @ErrorMessage  NVARCHAR(4000),
        @ErrorState    INT
        SET @ErrorSeverity = ERROR_SEVERITY()
        SET @ErrorNumber = ERROR_NUMBER()
        SET @ErrorMessage = ERROR_MESSAGE()
        SET @ErrorState = ERROR_STATE()
        IF @ErrorState = 0
        SET @ErrorState = 1
        RAISERROR ('ERROR OCCURED:%d',
                    @ErrorSeverity,
                    @ErrorState,
                    @ErrorNumber)
        IF XACT_STATE() < 0
        RETURN @ErrorState
    END CATCH
END
END
如果不存在,则调用第二个存储过程,从UPR40201表列NEXTEMPID中获取下一个可用的员工id。此表仅包含一个值,即下一个可用id

ALTER PROCEDURE [dbo].[MY_Employee_GetNewEmployeID]
-- Add the parameters for the stored procedure here
@EmployeeID AS varchar(10) OUTPUT

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;


BEGIN TRY
    -- Insert statements for procedure here
    SELECT @EmployeeID=NEXTEMPID FROM UPR40201
    RETURN 1
END TRY
BEGIN CATCH
    DECLARE
    @ErrorSeverity INT,
    @ErrorNumber   INT,
    @ErrorMessage  NVARCHAR(4000),
    @ErrorState    INT
    SET @ErrorSeverity = ERROR_SEVERITY()
    SET @ErrorNumber = ERROR_NUMBER()
    SET @ErrorMessage = ERROR_MESSAGE()
    SET @ErrorState = ERROR_STATE()
    IF @ErrorState = 0
    SET @ErrorState = 1
    RAISERROR ('ERROR OCCURED:%d',
                @ErrorSeverity,
                @ErrorState,
                @ErrorNumber)
    IF XACT_STATE() < 0
    RETURN @ErrorState
END CATCH
END
一旦我有了一个有效的员工Id,我就会使用eConnect工具更新记录。成功后,我通过调用最终的存储过程更新表UPR40201列NEXTEMPID中的值,并递增id

ALTER PROCEDURE [dbo].[MY_Employee_UpdateNextEmployeeId]
-- Add the parameters for the stored procedure here
@NEXTEMPID AS varchar(40)

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--BEGIN COMMANDS
BEGIN TRY
BEGIN TRANSACTION
    -- Insert statements for procedure here
    DELETE FROM UPR40201 WHERE NEXTEMPID != '0';
    INSERT INTO UPR40201 (NEXTEMPID) VALUES (@NEXTEMPID);
    COMMIT TRANSACTION
RETURN 1
END TRY
BEGIN CATCH
  DECLARE
    @ErrorSeverity INT,
    @ErrorNumber   INT,
    @ErrorMessage  NVARCHAR(4000),
    @ErrorState    INT
  SET @ErrorSeverity = ERROR_SEVERITY()
  SET @ErrorNumber = ERROR_NUMBER()
  SET @ErrorMessage = ERROR_MESSAGE()
  SET @ErrorState = ERROR_STATE()
  IF @ErrorState = 0
    SET @ErrorState = 1
  RAISERROR ('ERROR OCCURED:%d',
             @ErrorSeverity,
             @ErrorState,
             @ErrorNumber)
  IF XACT_STATE() < 0
    ROLLBACK TRANSACTION
    RETURN @ErrorState
END CATCH
END

我不太熟悉您正在使用的这个框架,但是是的,看起来您需要提供一个非空的employid字段。它似乎期望你提供一个,它不会为你产生一个;也许知道如何生成employid不在这个框架的范围之内,因为不同的组织可能有非常不同的方案。如果这是演示代码,请编写它。否则,您可能需要咨询SA以了解员工ID是如何生成的。谢谢您的评论。我已经联系了支持部门。一旦我发现这是如何工作的,我会发布答案。
ALTER PROCEDURE [dbo].[MY_Employee_GetNewEmployeID]
-- Add the parameters for the stored procedure here
@EmployeeID AS varchar(10) OUTPUT

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;


BEGIN TRY
    -- Insert statements for procedure here
    SELECT @EmployeeID=NEXTEMPID FROM UPR40201
    RETURN 1
END TRY
BEGIN CATCH
    DECLARE
    @ErrorSeverity INT,
    @ErrorNumber   INT,
    @ErrorMessage  NVARCHAR(4000),
    @ErrorState    INT
    SET @ErrorSeverity = ERROR_SEVERITY()
    SET @ErrorNumber = ERROR_NUMBER()
    SET @ErrorMessage = ERROR_MESSAGE()
    SET @ErrorState = ERROR_STATE()
    IF @ErrorState = 0
    SET @ErrorState = 1
    RAISERROR ('ERROR OCCURED:%d',
                @ErrorSeverity,
                @ErrorState,
                @ErrorNumber)
    IF XACT_STATE() < 0
    RETURN @ErrorState
END CATCH
END
ALTER PROCEDURE [dbo].[MY_Employee_UpdateNextEmployeeId]
-- Add the parameters for the stored procedure here
@NEXTEMPID AS varchar(40)

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--BEGIN COMMANDS
BEGIN TRY
BEGIN TRANSACTION
    -- Insert statements for procedure here
    DELETE FROM UPR40201 WHERE NEXTEMPID != '0';
    INSERT INTO UPR40201 (NEXTEMPID) VALUES (@NEXTEMPID);
    COMMIT TRANSACTION
RETURN 1
END TRY
BEGIN CATCH
  DECLARE
    @ErrorSeverity INT,
    @ErrorNumber   INT,
    @ErrorMessage  NVARCHAR(4000),
    @ErrorState    INT
  SET @ErrorSeverity = ERROR_SEVERITY()
  SET @ErrorNumber = ERROR_NUMBER()
  SET @ErrorMessage = ERROR_MESSAGE()
  SET @ErrorState = ERROR_STATE()
  IF @ErrorState = 0
    SET @ErrorState = 1
  RAISERROR ('ERROR OCCURED:%d',
             @ErrorSeverity,
             @ErrorState,
             @ErrorNumber)
  IF XACT_STATE() < 0
    ROLLBACK TRANSACTION
    RETURN @ErrorState
END CATCH
END