Показать сообщение отдельно
Старый 09.12.2011, 12:48   #5  
JayCooller is offline
JayCooller
Участник
Аватар для JayCooller
 
9 / 10 (1) +
Регистрация: 04.08.2010
В общем, все прозаично получилось со Стандартными Измерениями. Мы их заполнили только на уровне одиночных Счетов, поэтому политики групп счетов не проверяются и между значениями Стандартных Измерений разных уровней конфликтов быть не должно. В случае конфликта между стандартными измерениями, которые не удается разрешить на основе установленных приоритетов, применяются следующие правила : если два счета с конфликтующими значениями Ст. Измерений имеют одинаковые приоритеты или относятся к одному типу, конфликт разрешается в пользу счета, введенного последним. Так, на примере Акта Списания в 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 и CheckDefaultDimensionAccount - для контроля только Фин. Счетов.
Код:
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);
В результате перед формирование каждой записи в Фин. Книгу будет выполнена проверка Стандартных Измерений последовательно для каждой формируемой записи, правда без учета приоритетов, но нам это и не нужно пока.