Получить значения из ReleaseData.Values - PullRequest
0 голосов
/ 16 января 2019

При выполнении метода OpenScript моего сценария выпуска я хочу сохранить индексные поля, поля команд и переменные в списках.Я создал фрагмент для этого

Dictionary<string, string> indexFields = new Dictionary<string, string>();
Dictionary<string, string> batchFields = new Dictionary<string, string>();
Dictionary<string, string> kofaxValues = new Dictionary<string, string>();

foreach (Value val in documentData.Values)
{
    if (val.TableName.IsEmpty())
    {
        string sourceName = val.SourceName;
        string sourceValue = val.Value;

        switch (val.SourceType)
        {
            case KfxLinkSourceType.KFX_REL_INDEXFIELD:
                indexFields.Add(sourceName, sourceValue);
                break;

            case KfxLinkSourceType.KFX_REL_VARIABLE:
                kofaxValues.Add(sourceName, sourceValue);
                break;

            case KfxLinkSourceType.KFX_REL_BATCHFIELD:
                batchFields.Add(sourceName, sourceValue);
                break;
        }
    }
}

Я хочу сделать это, потому что мне нужно значение поля.Каждое имя поля уникально, поэтому я могу использовать его в качестве ключа.

При сохранении своих пользовательских свойств в ReleaseSetupData я могу прочитать их из ReleaseData.Допустим, два пользовательских свойства вернули бы мне имя поля и тип поля, поэтому я знаю, что это поле IndexField, а его имя - "MyIndexField".

Я могу использовать эту информацию для доступа к Dictionary<string, string> indexFields и получить значение из этого Indexfield.

В настоящее время я настраиваю ReleaseSetupData с этим кодом

releaseSetupData.CustomProperties.RemoveAll();

// Save all custom properties here

releaseSetupData.CustomProperties.Add("myCustomProperty", "fooBar");

releaseSetupData.Links.RemoveAll();

foreach (IndexField indexField in releaseSetupData.IndexFields) // Save all IndexFields
{
    releaseSetupData.Links.Add(indexField.Name, KfxLinkSourceType.KFX_REL_INDEXFIELD, indexField.Name);
}

foreach (BatchField batchField in releaseSetupData.BatchFields) // Save all BatchFields
{
    releaseSetupData.Links.Add(batchField.Name, KfxLinkSourceType.KFX_REL_BATCHFIELD, batchField.Name);
}

foreach (dynamic batchVariable in releaseSetupData.BatchVariableNames) // Save all Variables
{
    releaseSetupData.Links.Add(batchVariable, KfxLinkSourceType.KFX_REL_VARIABLE, batchVariable);
}

Когда выполняется метод OpenScript моего сценария выпуска,словари (показанные в первом фрагменте) остаются пустыми.Это потому что documentData.Values пусто.

Как мне заполнить documentData.Values?

1 Ответ

0 голосов
/ 16 января 2019

Вы не можете. Порядок событий следующий:

  1. OpenScript() вызывается - один раз за партию.
  2. ReleaseDoc() вызывается - один раз за документ
  3. CloseScript() вызывается - один раз за партию.

Коллекция значений содержит информацию, относящуюся к отдельному документу, и поэтому будет пустой во время OpenScript(). Иногда это не то, что вам нужно - вы можете получить доступ к значениям другого документа или экспортировать их все сразу, например. в одном вызове веб-службы.

Вот что я бы порекомендовал:

Создать класс-оболочку для объекта Kofax 'Document. Вот мой подход (показаны только свойства). Этот класс имеет конструктор, который принимает объект ReleaseData в качестве единственного параметра, и все соответствующие свойства заполняются в указанном конструкторе.

public class Document
  {
      public Dictionary<string, string> BatchFields { get; private set; }
      public Dictionary<string, string> IndexFields { get; private set; }
      public Dictionary<string,string> KofaxValues { get; set; }
      public Dictionary<string, string> TextConstants { get; set; }
      public Dictionary<string, string> CustomProperties { get; private set; }
      public Dictionary<string,string> ConfigurationSettings { get; set; }
      public List<Table> Tables { get; private set; }
      private List<Column> Columns;
      public List<string> ImageFileNames { get; private set; }
      public string KofaxPDFFileName { get; private set; }
      public string XdcFilePath { get; private set; }
      public XDocument XDocument { get; private set; }
      public string ImageFilePath { get; private set; }
      public string KofaxPDFPath { get; private set; }
      public string TextFilePath { get; private set; }
      public byte[] BinaryImage { get; private set; }
      public char CellSeparator { get; set; }
}

Затем, во время ReleaseDoc(), я бы просто добавил все свои Documents в коллекцию. Обратите внимание, что соединение documents определено как частное в вашем ReleaseScript:

public KfxReturnValue ReleaseDoc()
{
  documents.Add(new Document(DocumentData));
}

Затем вы можете решить, когда и куда экспортировать ваши данные. Это также может происходить во время события CloseScript (), но имейте в виду, что проверки работоспособности и потенциальные исключения, связанные с данными документа (недопустимые значения полей индекса и т. Д.), Должны выполняться в течение ReleaseDoc(). Использование пользовательского класса-обертки и коллекции добавляет большую гибкость и функции, встроенные в .NET, в ваш Export Connector, например LINQ - вот пример (это невозможно с COM-объектами Kofax):

var noPdfs = documents.Where(x => x.KofaxPDFPath.Length == 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...