![]() |
#5 |
Участник
|
В общем, все прозаично получилось со Стандартными Измерениями. Мы их заполнили только на уровне одиночных Счетов, поэтому политики групп счетов не проверяются и между значениями Стандартных Измерений разных уровней конфликтов быть не должно. В случае конфликта между стандартными измерениями, которые не удается разрешить на основе установленных приоритетов, применяются следующие правила : если два счета с конфликтующими значениями Ст. Измерений имеют одинаковые приоритеты или относятся к одному типу, конфликт разрешается в пользу счета, введенного последним. Так, на примере Акта Списания в Codeunit - е 12 формируется строка "Gen. Jnl. Line" Фин. Журнала, а только в каком порядке вводятся Счета одному NAVISION - у известно и например при списании со Счета 20.02.22.1 измерение CPL в таблице Счетов настроено в "Единый Код" = 02.22, но при Учете с пустым измерением CPL ошибка не формируется. В итоге в том же Codeunit - е 12 написал функцию по проверке Стандартных Измерений. Добавил вот такой кусочек в InitGLEntry (т.е. это уже этап формирования Фин. Книги Операций):
Код: {IF (GenJnlLine."Account Type" = GenJnlLine."Account Type"::"G/L Account") THEN BEGIN TableID[1] := DimMgt.TypeToTableID1(GenJnlLine."Account Type"::"G/L Account"); AccNo[1] := GLAccNo; IF NOT CheckJnlLineDimValuePosting(TempJnlLineDim,TableID[1],AccNo[1]) THEN BEGIN IF GenJnlLine."Line No." <> 0 THEN ERROR( Text013, GenJnlLine.TABLECAPTION,GenJnlLine."Journal Template Name", GenJnlLine."Journal Batch Name",GenJnlLine."Line No.", DimMgt.GetDimValuePostingErr); END; END; Код: CheckJnlLineDimValuePosting(VAR JnlLineDim : Record "Journal Line Dimension";TableID : Integer;No : Code[20]) IsChecked : Boolean TempDimBuf2.RESET; TempDimBuf2.DELETEALL; IF JnlLineDim.FINDSET THEN BEGIN i := 1; REPEAT TempDimBuf2.INIT; TempDimBuf2."Table ID" := DATABASE::"Journal Line Dimension"; TempDimBuf2."Dimension Code" := JnlLineDim."Dimension Code"; IF JnlLineDim."Dimension Value Code" <> '' THEN BEGIN TempDimBuf2."Entry No." := i; TempDimBuf2."Dimension Value Code" := JnlLineDim."Dimension Value Code"; TempDimBuf2.INSERT; i := i + 1; END; IF JnlLineDim."New Dimension Value Code" <> '' THEN BEGIN TempDimBuf2."Entry No." := i; TempDimBuf2."Dimension Value Code" := JnlLineDim."Dimension Value Code"; TempDimBuf2.INSERT; i := i + 1; END; UNTIL JnlLineDim.NEXT = 0; END; IF (NOT CheckDefaultDimensionAccount(TableID, No, TempDimBuf2)) THEN EXIT (FALSE) ELSE EXIT (TRUE); Код: CheckDefaultDimensionAccount(VAR TableID : Integer;VAR No : Code[20];VAR TempDimBuf2 : Record "Dimension Buffer") IsChecked : Boolean boolExitCode := TRUE; recDefaultDImension.SETFILTER ( "Value Posting", '<>%1', recDefaultDImension."Value Posting"::" "); IF ( (No <> '') AND (TableID > 0) ) THEN BEGIN IF TableID = 15 THEN BEGIN recDefaultDImension.SETFILTER ("Table ID", '%1', TableID); recDefaultDImension.SETFILTER ("No.", '%1', No); IF recDefaultDImension.FINDSET THEN BEGIN REPEAT TempDimBuf2.SETRANGE("Dimension Code",recDefaultDImension."Dimension Code"); CASE recDefaultDImension."Value Posting" OF recDefaultDImension."Value Posting"::"Code Mandatory": BEGIN IF (NOT TempDimBuf2.FINDFIRST) OR (TempDimBuf2."Dimension Value Code" = '') THEN BEGIN DimValuePostingErr := STRSUBSTNO( Text50008, recDefaultDImension."Dimension Code", recDefaultDImension."Dimension Code", recDefaultDImension."No." ); boolExitCode := FALSE; ERROR ( DimValuePostingErr ); END ELSE BEGIN IF recDefaultDImension.FilterValues <> '' THEN BEGIN recDimensionValue.RESET; recDimensionValue.FILTERGROUP (10); recDimensionValue.SETFILTER ( "Dimension Code", '%1', TempDimBuf2."Dimension Code"); recDimensionValue.SETFILTER ( Code, recDefaultDImension.FilterValues ); recDimensionValue.FILTERGROUP (11); recDimensionValue.SETFILTER ( Code, TempDimBuf2."Dimension Value Code" ); IF recDimensionValue.ISEMPTY THEN BEGIN DimValuePostingErr := STRSUBSTNO( Text50009, recDefaultDImension."Dimension Code", recDefaultDImension."Dimension Code", TempDimBuf2."Dimension Value Code", recDefaultDImension."No.", recDefaultDImension.FIELDCAPTION (FilterValues) + ' ' + recDefaultDImension.FilterValues ); ERROR (DimValuePostingErr); END; END; END; END; recDefaultDImension."Value Posting"::"Same Code": BEGIN IF (NOT TempDimBuf2.FINDFIRST) OR (TempDimBuf2."Dimension Value Code" = '') THEN BEGIN DimValuePostingErr := STRSUBSTNO( Text50030, recDefaultDImension."Dimension Code", recDefaultDImension."Dimension Code", recDefaultDImension."No.", recDefaultDImension."Dimension Value Code" ); ERROR ( DimValuePostingErr ); END ELSE BEGIN IF ((TempDimBuf2."Dimension Value Code" <> recDefaultDImension."Dimension Value Code") AND (TempDimBuf2."Dimension Value Code" <> recDefaultDImension.FilterValues)) THEN BEGIN DimValuePostingErr := STRSUBSTNO ( Text50031, recDefaultDImension."Dimension Code", recDefaultDImension."Dimension Code", TempDimBuf2."Dimension Value Code", recDefaultDImension."No.", recDefaultDImension."Dimension Value Code" ); boolExitCode := FALSE; ERROR ( DimValuePostingErr ); END; END; END; recDefaultDImension."Value Posting"::"No Code": BEGIN IF TempDimBuf2.FINDFIRST THEN BEGIN DimValuePostingErr := STRSUBSTNO ( Text50032, recDefaultDImension."Dimension Code", recDefaultDImension."Dimension Code", recDefaultDImension."No." ); ERROR ( DimValuePostingErr ); END; END; END; UNTIL recDefaultDImension.NEXT = 0; END; END; END; EXIT (boolExitCode); |
|