로컬 중요 업데이트 PS59774 설치된 Microsoft Dynamics NAV 2009의 러시아 버전에서 사전 휴가에 대한 급여 기간을 닫을 때 휴가 잔액이 사전 휴가에 대해 잘못 계산됩니다PS60060

적용 대상
Dynamics NAV 2009

이 문서는 러시아어(ru) 언어 로캘에 대한 Microsoft Dynamics NAV에 적용됩니다.

증상

로컬 중요 업데이트 PS59774 사용하여 러시아 버전의 Microsoft Dynamics NAV 2009에서 사전 휴가에 대한 급여 기간을 닫으면 PS60060 사전 휴가에 대한 휴가 잔액이 잘못 계산됩니다.
로컬 위험 업데이트 PS59774 및 PS60060 대한 자세한 내용은 다음 정보를 참조하세요.

59774 Microsoft Dynamics NAV 2009 RU에 대한 로컬 중요 업데이트 "병가에 대한 보험 기여 계산의 변경 - NDFL-2 양식에 대한 새로운 템플릿

60060 Персонал и зарплата. Реистр налоа на доод изиески ли Microsoft Dynamics NAV 2009 R2 – Россия이 문제는 다음 제품에서 발생합니다.

  • 러시아어 버전의 Microsoft Dynamics NAV 2009 R2
  • 러시아어 버전의 Microsoft Dynamics NAV 2009 SP1(서비스 팩 1)

      

해결 방법

핫픽스 정보

이제 Microsoft에서 지원되는 핫픽스를 사용할 수 있습니다. 그러나 이 문서에 설명된 문제만 수정하기 위한 것입니다. 이 특정 문제가 발생하는 시스템에만 적용합니다. 이 핫픽스는 추가 테스트를 받을 수 있습니다. 따라서 이 문제의 심각한 영향을 받지 않는 경우 다음 Microsoft Dynamics NAV 2009 서비스 팩 또는 이 핫픽스가 포함된 다음 Microsoft Dynamics NAV 버전을 기다리는 것이 좋습니다.

참고 특별한 경우 Microsoft Dynamics 및 관련 제품에 대한 기술 지원 전문가가 특정 업데이트가 문제를 resolve 판단하는 경우 지원 호출에 대해 일반적으로 발생하는 요금이 취소될 수 있습니다. 특정 업데이트가 필요하지 않은 추가 지원 질문과 문제에는 일반 지원 비용이 적용됩니다.

설치 정보

Microsoft는 명시적이거나 묵시적인 보증 없이 설명용으로만 프로그래밍 예제를 제공합니다. 여기에는 상품성 또는 특정 목적에의 적합성에 대한 묵시적 보증이 포함되지만 이에 국한되지 않습니다. 이 문서에서는 설명 중인 프로그래밍 언어와 프로시저를 만들고 디버깅하는 데 사용되는 도구에 대해 잘 알고 있다고 가정합니다. Microsoft 지원 엔지니어는 특정 절차의 기능을 설명하는 데 도움을 줄 수 있습니다. 그러나 추가 기능을 제공하거나 특정 요구 사항을 충족하는 절차를 구성하기 위해 이러한 예제를 수정하지는 않습니다.

참고 이 핫픽스를 설치하기 전에 모든 Microsoft Dynamics NAV 클라이언트 사용자가 시스템에서 로그오프되었는지 확인합니다. 여기에는 Microsoft Dynamics NAS(NAV 애플리케이션 서버) 서비스가 포함됩니다. 이 핫픽스를 구현할 때 로그온한 유일한 클라이언트 사용자여야 합니다.

이 핫픽스를 구현하려면 개발자 라이선스가 있어야 합니다.

Windows 로그인 창 또는 데이터베이스 로그인 창의 사용자 계정에 "SUPER" 역할 ID가 할당되는 것이 좋습니다. 사용자 계정에 "SUPER" 역할 ID를 할당할 수 없는 경우 사용자 계정에 다음 권한이 있는지 확인해야 합니다.

  • 변경할 개체에 대한 수정 권한입니다.

  • 시스템 개체 ID 5210 개체 및 시스템 개체 ID 9015에 대한 Execute 권한

    개체.

참고 데이터 복구를 수행해야 하는 경우가 아니면 데이터 저장소에 대한 권한이 있을 필요가 없습니다.

코드 변경 내용

참고 프로덕션 컴퓨터에 수정 사항을 적용하기 전에 제어된 환경에서 항상 코드 수정을 테스트합니다.

이 문제를 해결하려면 다음과 같이 하십시오.

  1. 다음과 같이 Payroll Period-Close codeunit(17410)에 새 함수를 추가합니다.

    PROCEDURE AccrualEntryExists@1210003(EmployeeNo@1210000 : Code[20];StartDate@1210001 : Date;EndDate@1210002 : Date) : Boolean;
    
    VAR
    
    EmplAbsenceEntry@1210003 : Record 17389;
    
    BEGIN
    
    WITH EmplAbsenceEntry DO BEGIN
    
    SETRANGE("Employee No.",EmployeeNo);
    
    SETRANGE("Entry Type","Entry Type"::Accrual);
    
    SETRANGE("Start Date",StartDate);
    
    SETRANGE("End Date",EndDate);
    
    EXIT(NOT ISEMPTY);
    
    END;
    
    END;
    
  2. 다음과 같이 Payroll Period-Close codeunit(17410)의 UpdateEmployeeAbsenceEntries 함수에서 코드를 변경합니다.
    기존 코드

    ...
    NewEmplAbsenceEntry.INIT;
    NewEmplAbsenceEntry.TRANSFERFIELDS(EmplAbsenceEntry);
    NewEmplAbsenceEntry."Entry No." := NextEntryNo;
    NewEmplAbsenceEntry."Start Date" := NewStartDate;
    
    // Delete the following line.
    NewEmplAbsenceEntry."End Date" := CALCDATE('<1Y-1D>',NewStartDate);
    // End of the deleted line.
    
    NewEmplAbsenceEntry."Accrual Entry No." := EmplAbsenceEntry."Entry No.";
    NewEmplAbsenceEntry."Calendar Days" := EmplAbsenceEntry."Calendar Days";
    NewEmplAbsenceEntry."Working Days" := 0;
    NewEmplAbsenceEntry.INSERT;
    NextEntryNo := NextEntryNo + 1;
    UNTIL EmplAbsenceEntry.NEXT = 0;
    ...
    

    대체 코드

    ...
    // Add the following lines.
    NewEndDate := CALCDATE('<1Y-1D>',NewStartDate);
    IF NOT VacationPeriodExists(Employee."No.",NewStartDate,NewEndDate) THEN BEGIN
    // end of the added line
    
    NewEmplAbsenceEntry.INIT;
    NewEmplAbsenceEntry.TRANSFERFIELDS(EmplAbsenceEntry);
    NewEmplAbsenceEntry."Entry No." := NextEntryNo;
    NewEmplAbsenceEntry."Start Date" := NewStartDate;
    
    // Add the following line.
    NewEmplAbsenceEntry."End Date" := NewEndDate;
    // End of the added line.
    
    NewEmplAbsenceEntry."Accrual Entry No." := EmplAbsenceEntry."Entry No.";
    NewEmplAbsenceEntry."Calendar Days" := EmplAbsenceEntry."Calendar Days";
    NewEmplAbsenceEntry."Working Days" := 0;
    NewEmplAbsenceEntry.INSERT;
    NextEntryNo := NextEntryNo + 1;
    
    // Add the following line.
    END;
    // End of the added line.
    
    UNTIL EmplAbsenceEntry.NEXT = 0;
    ...
    
  3. 다음과 같이 부재 Order-Post codeunit(17387)에 새 함수를 추가합니다.

    PROCEDURE InsertVacationAccrual@1210008(AbsenceLine@1210000 : Record 17386) : Integer;
    
    VAR
    
    VacationAccrualEntry@1210001 : Record 17389;
    
    BEGIN
    
    EmplAbsenceEntry.RESET;
    
    EmplAbsenceEntry.SETRANGE("Employee No.",AbsenceLine."Employee No.");
    
    EmplAbsenceEntry.SETRANGE("Entry Type",EmplAbsenceEntry."Entry Type"::Accrual);
    
    EmplAbsenceEntry.SETRANGE("Accrual Entry No.",0);
    
    EmplAbsenceEntry.SETFILTER(
    
    "Time Activity Code",
    
    GetAnnualVacTimeActFilter(CALCDATE('<CY>',AbsenceLine."End Date")));
    
    IF EmplAbsenceEntry.FINDLAST THEN BEGIN
    
    NextEntryNo := NextEntryNo + 1;
    
    VacationAccrualEntry.INIT;
    
    VacationAccrualEntry.TRANSFERFIELDS(EmplAbsenceEntry);
    
    VacationAccrualEntry."Entry No." := NextEntryNo;
    
    VacationAccrualEntry."Start Date" := CALCDATE('<+1D>',EmplAbsenceEntry."End Date");
    
    VacationAccrualEntry."End Date" := CALCDATE('<1Y-1D>',VacationAccrualEntry."Start Date");
    
    VacationAccrualEntry."Accrual Entry No." := 0;
    
    VacationAccrualEntry."Calendar Days" := EmplAbsenceEntry."Calendar Days";
    
    VacationAccrualEntry."Working Days" := 0;
    
    VacationAccrualEntry.INSERT;
    
    EXIT(VacationAccrualEntry."Entry No.");
    
    END;
    
    
    
    EXIT(0);
    
    END;
    
  4. 다음과 같이 ApplyEmplAbsenceEntry 함수의 코드를 변경합니다.
    기존 코드

    ...
    IF TimeActivity."Use Accruals" THEN BEGIN
    ...
    IF EmplAbsenceEntry2.FINDSET THEN
    REPEAT
    EmplAbsenceEntry2.CALCFIELDS("Used Calendar Days");
    RemainingDays := EmplAbsenceEntry2."Calendar Days" - EmplAbsenceEntry2."Used Calendar Days";
    IF RemainingDays >= DaysToUse THEN BEGIN
    ...
    END;
    UNTIL (EmplAbsenceEntry2.NEXT = 0) OR (DaysToUse = 0);
    END ELSE
    InsertEmplAbsenceEntry(AbsenceLine,AbsenceLine."Calendar Days",AbsenceLine."Working Days",0);
    ...
    

    대체 코드

    ...
    IF TimeActivity."Use Accruals" THEN BEGIN
    ...
    IF EmplAbsenceEntry2.FINDSET THEN BEGIN // modify this line
    REPEAT
    EmplAbsenceEntry2.CALCFIELDS("Used Calendar Days");
    RemainingDays := EmplAbsenceEntry2."Calendar Days" - EmplAbsenceEntry2."Used Calendar Days";
    
    // Add the following line.
    IF RemainingDays <> 0 THEN
    // End of the added line.
    
    IF RemainingDays >= DaysToUse THEN BEGIN
    
    ...
    END;
    UNTIL (EmplAbsenceEntry2.NEXT = 0) OR (DaysToUse = 0);
    
    // Add the following lines.
    IF DaysToUse <> 0 THEN
    REPEAT
    IF EmplAbsenceEntry2.GET(InsertVacationAccrual(AbsenceLine)) THEN BEGIN
    EmplAbsenceEntry2.CALCFIELDS("Used Calendar Days");
    RemainingDays := EmplAbsenceEntry2."Calendar Days" - EmplAbsenceEntry2."Used Calendar Days";
    IF RemainingDays >= DaysToUse THEN BEGIN
    InsertEmplAbsenceEntry(AbsenceLine,DaysToUse,0,EmplAbsenceEntry2."Entry No.");
    DaysToUse := 0;
    END ELSE BEGIN
    InsertEmplAbsenceEntry(AbsenceLine,RemainingDays,0,EmplAbsenceEntry2."Entry No.");
    DaysToUse := DaysToUse - RemainingDays;
    END;
    END;
    UNTIL DaysToUse = 0;
    END;
    // End of the added lines.
    
    END ELSE
    InsertEmplAbsenceEntry(AbsenceLine,AbsenceLine."Calendar Days",AbsenceLine."Working Days",0);
    ...
    

          

필수 구성 요소

이 핫픽스를 적용하려면 다음 제품 중 하나가 설치되어 있어야 합니다.

  • 러시아어 버전의 Microsoft Dynamics NAV 2009 R2
  • 러시아어 버전의 Microsoft Dynamics NAV 2009 서비스 팩 1

제거 정보

이 핫픽스는 제거할 수 없습니다.

상태

Microsoft에서 이는 "적용 대상" 섹션에 나열된 Microsoft 제품에서의 문제임을 확인했습니다.

참고 이 문서는 Microsoft 지원 부서에서 직접 작성한 "빠른 게시" 문서입니다. 여기에 포함된 정보는 새로운 문제에 대한 응답으로 있는 그대로 제공됩니다. 문서를 제공하는 속도로 인해 문서에 오자가 있을 수 있으며 사전 통지 없이 언제든지 수정될 수 있습니다. 다른 고려 사항은 사용 약관을 참조하십시오.