Массовый импорт платежных документов из файлов

Автор:pahomenko_d
Дата:22.11.2002
Просмотров:2583
Скачиваний:665
Оценка: - , Оценок - 0
Скачать (rar-файл; Размер - 3639)

Обсудить в форуме

Описание

Импорт платежных документов из двух и более файлов в формате поле=значение. Удачно импортированные документы перемещаются в другую папку. Возможна настройка путей и кодировки импортируемых сообщений (ansi/oem).

Текст примера

 /**************************************************************/
/* Макрос импорта  документа из текстового файла              */  
/*							      */  
/* Доработано для загрузки документов cписком                 */  
/*                                       		      */  
/* (c) Pahomenko Dmitry                                       */
/* Russia, Omsk, Gazprombank, 22.11.2002		      */
/* pahomenko_d@gpb.omsk.ru				      */
/* phone (3812) 65-67-20				      */
/**************************************************************/

import RSLX, "dir.d32", "osfile.d32";

/**************************************************************************************/
InDir = "C:\\ClBnk\\In\\"; 		/* Папка с импортируемыми платежками 	      */
DoneDir = "C:\\ClBnk\\In\\Done\\"; 	/* Папка с удачно импортированными платежками */
ExtFile = "*.txt";			/* Маска для файлов-платежек  		      */
Ansi = False;				/* True - преобразовываем в ansi символьные   */
					/* строки, False - не преобразовываем         */
/**************************************************************************************/

class TMap
  var mKey = TArray(), mValue =TArray();
  var i = 0, iPointer = 0;
  macro Insert( k, v )
    mKey(i) = k;
    mValue(i) = v;
    i = i + 1;
  end;
  macro Find( k )
    var j = 0;
    while ( j <= i )
      if ( mKey(j) == k )  
        iPointer = j;
        return true;  
      end;
      j = j + 1;
    end;
    return false;
  end;
  macro GetValue
    return mValue(iPointer);
  end;
  macro EraseAll
    i = 0;
  end;
end;

Lang = GetInit( "LANGUAGE" );

M_REG_IMPORT      = "Режим: < Импорт документа >";
M_REG_STOP        = "Завершение режима: < Импорт документа >";
M_PREPARE         = "Подготовка";
M_PTK_FORM_ERR    = "Ошибка иниализации документа. Возможно, неверен тип или номер формы.";
M_PTK_SAVE_ERR    = "Ошибка сохранения документа. Данные не были импортированы.";
M_PTK_SUCCESS     = "Импорт документа успешно завершен.";
M_PTK_SYSERR      = "Системная ошибка. Импорт не выполнен.";

if ( Lang != 0 )
  M_REG_IMPORT      = "Run macro: < Import >";
  M_REG_STOP        = "End macro: < Import >";
  M_PREPARE         = "Preparing...";
  M_PTK_FORM_ERR    = "Error creating document. Check file format.";
  M_PTK_SAVE_ERR    = "Error saving document. Import cancelled.";
  M_PTK_SUCCESS     = "Imoport was successful.";
  M_PTK_SYSERR      = "System error. Import cancelled.";
end;  

 L_ERR_FORM_IMP = "Не задана форма импортируемого документа. Возможно, файл имеет неверный формат";
 L_ERR_TYPE_IMP = "Не задан тип импортируемого документа. Возможно, файл имеет неверный формат";
 L_ERR_OPEN_IMP = "Ошибка открытия файла";
 L_ERR_FNFND_IMP= "Не найдена печатная форма документа";
 L_ERR_MOVE_IMP = "Ошибка при перемещении файла ";
 L_INFDOC_IMP   = "Информационный";
 L_PAYDOC_IMP   = "Платежный";

/****************************************************************************/
/* Извлечение файла из имени файла с полным путем              		    */
/****************************************************************************/
macro ExtractFileName(sFullFileName):string;
var i, RetStr;
  i = StrLen(sFullFileName);
  RetStr = "";
  while (i >= 0)
    if ((SubStr(sFullFileName, i, 1)) == "\\")
      return RetStr;
    end;
    RetStr = SubStr(sFullFileName, i, 1) + RetStr;
    i = i - 1;
  end;
  return RetStr;
end;

/****************************************************************************/
/* Извлечение папки из имени файла с полным путем              		    */
/****************************************************************************/
macro ExtractFilePath(sFullFileName):string;
var i, RetStr;
  i = StrLen(sFullFileName);
  RetStr = "";
  while (i >= 0)
    if ((SubStr(sFullFileName, i, 1)) == "\\")
      RetStr = SubStr(sFullFileName, 1, StrLen(sFullFileName) - StrLen(RetStr));
      return RetStr;
    end;
    RetStr = SubStr(sFullFileName, i, 1) + RetStr;
    i = i - 1;
  end;
  RetStr = SubStr(sFullFileName, 1, StrLen(sFullFileName) - StrLen(RetStr));
  return RetStr;
end;

/****************************************************************************/
/* преобразование многострочных значений типа текст для печати 		    */
/****************************************************************************/
  const stringDelimiter="\r\n";          /* Разделитель строк в формате передачи (символ конца строки) */
  const stringDelimiterLength=strlen(stringDelimiter);
  const multiStringStringDelimiter="\r"; /* Символ заменяющий конец строки внутри значения поля в формате
                                            передачи (нужен для передачи многострочных полей) */
  const multiStringStringDelimiterLength=strlen(multiStringStringDelimiter);

  macro RestoreCRLF(str:string):string
    var s1=str;
    var s2="";
    var i=1;
    while(true)
      i=index(s1,multiStringStringDelimiter);
      if(i == 0)
        return s2 + s1; end;
      s2=s2 + substr(s1,1,i-1) + stringDelimiter;
      s1=substr(s1,i+multiStringStringDelimiterLength);
    end;
  end;

/****************************************************************************/
/* макрос заполнения поля документа */
/* Параметры: sFldName - имя поля   */
/*            iFldType - тип поля   */
/*            pMap - список импорта */
/****************************************************************************/
macro bPutField (sFldName, iFldType, pMap)
var sValue;
var str;
      if (NOT pMap.Find(sFldName))  /* если в списке импорта нет такого поля */
         return;                    /* то ничего не делаем */
      end;
      sValue = pMap.GetValue();     /* получаем значение по имени поля из списка импорта */
      if ( iFldType == V_STRING)    /* особенности работы с полями разных типов */
   	 If (Ansi)
            sValue = ToAnsi (sValue);  /* так как список импорта содержит только значения типа V_String */
         end;
         sValue = RestoreCRLF (sValue); /* для многострочных текстовых полей */
         DocSetByName (sFldName, sValue);  /* присвоение значения полю */
      else 
           if (iFldType == V_DOUBLE) 
              sValue = Double (sValue);
              DocSetByName (sFldName, sValue);  /* присвоение значения полю */
           else 
              if (iFldType == V_INTEGER)
                 sValue = Int (sValue);
                 DocSetByName (sFldName, sValue);  /* присвоение значения полю */
              else
              if (iFldType == V_TIME)
                 str= string(sValue);
                 sValue = Time(int(SubStr(str,1,2)),int(SubStr(str,4,2)),int(SubStr(str,7,2)));
                 DocSetByName (sFldName, sValue);  /* присвоение значения полю */
                 else
                 if (NOT ((iFldType == V_DATE) AND ( sValue == "")))
                         DocSetByName (sFldName, sValue);  /* присвоение значения полю */
                         end;
                 end;

              end;

           end;
      end;
end;

/****************************************************************************/
/* Импорт одного документа 						    */
/****************************************************************************/
macro ImportOneDoc(sFileName: string)

   FILE outfile (sFileName) txt 4096; /* read mode */
   var str, MapKey, MapValue, IsPay, FormId, i, count, pMap: TMap, 
       pSysMap: TMap, sIsPay, sFormId;
   sIsPay ="";
   sFormId = "";

   if (sFileName == "")
      return 0;
   end; 
   if (open (outfile, sFileName))
      setdelim ("=");
      rewind (outfile);
      while (next (outfile))
            MapKey = Trim (outfile (0));
            MapValue = Trim (outfile (1));
            if ( MapKey == "FormId") 
               sFormId = MapValue;
               pSysMap.Insert ("FormId", MapValue);
            else if( MapKey == "iIsPay") 
                    sIsPay = MapValue;
                    pSysMap.Insert ("iIsPay", MapValue);
                 else    
                    pMap.Insert (MapKey, MapValue);
                 end;
            end;
      end;
      /* обязательные поля, которые должны быть заданы */
      close (outfile);
      if (sFormId == "") 
         VclMsgBox (L_ERR_FORM_IMP);
         return 0;
      end;
      if (sIsPay == "") 
         VclMsgBox (L_ERR_TYPE_IMP);
         return 0;
      end;

      /* дополнительные параметры */
      pSysMap.Insert ("DataDir", GetInit( "DataDir" )); /* обязательно!!!! */
      /* место БД - в список системных параметров формы */

      /* ищем в списке импорта тип документа и номер формы */
      if (pSysMap.Find ("iIsPay"))   
         sIsPay = pSysMap.GetValue();
         if (sIsPay =="1")     /* платежный */
            IsPay = true;
         else
            if (sIsPay =="2")  /* информационный */ 
               IsPay = false;
            else 
               return 0;       /* никакой */
            end;
         end;
      else     
         return 0;
      end;

      /* номер формы */
      if (pSysMap.Find ("FormId"))
         FormId  = Int(pSysMap.GetValue());
      else     
         return 0;
      end;

      /* для платежных документов не импортируем дату проводки - нет смысла */
      /*if (IsPay)
         pMap.Erase ("DatP");
      end; */

      /* иниц. пустого документа указанного типа и формы */ 
      if (Not DocInitNew (IsPay, FormId))
         VclMsgBox (M_PTK_FORM_ERR);
         AddPtk( String( M_PTK_FORM_ERR ), 3 );
       return 0;
      end;

      /* заполнение полей документа */
      i = 0;
      count = DocFieldCount ();
      while (i < count)  /* цикл по всем полям документа */
         bPutField (DocNameByNum (i), ValType (DocGetByNum (i)), pMap) ;
         i= i + 1;
      end;

      /* сохраняем документ в стадии ВВЕДЕН */
      if (Not DocSave ())
         VclMsgBox (M_PTK_SAVE_ERR);
         AddPtk( String( M_PTK_SAVE_ERR ), 3 );
         return 0;
      else
/*         VclMsgBox (M_PTK_SUCCESS);*/
         AddPtk( String( M_PTK_SUCCESS ), 3 );
         return 1;
      end;
      AddPtk( String( M_REG_STOP ), 3 );
      return 0;
   else 
      VclMsgBox (L_ERR_OPEN_IMP + " " + sFileName);
      return 0;
   end;
   return 0;
end;

/****************************************************************************/
/* начало обработки - точка входа */
/****************************************************************************/
Var pIReturnCode, name,size,dt,tm, sValue, SuccessCount, TotalCount, MaxCount;

SuccessCount = 0;
TotalCount = 0;
MaxCount = 0;
/* Инициализируем индикатор прогресса */
Var stat = FileFindFirst (InDir + ExtFile, name, size, dt, tm);
While (stat)
   MaxCount = MaxCount + 1;
   stat = FileFindNext (name, size, dt, tm);
end;
VclInitProgress(MaxCount,"Импорт платежных поручений");

stat = FileFindFirst (InDir + ExtFile, name, size, dt, tm);
While (stat)
   TotalCount = TotalCount + 1;
   VclUseProgress( TotalCount );
   AddPtk( String( M_REG_IMPORT ), 3 );
   pIReturnCode = ImportOneDoc(InDir + name);

   if (pIReturnCode == 0)   /* если есть ошибки импорта, то дальше не работаем */
      VclMsgBox ("Ошибка при импорте документа ");
   else
      /* Перемещаем обработанный файл*/
      if (ExistFile(DoneDir + name)) /* если файл уже есть, удаляем его нафиг */
         DeleteFile(DoneDir + name)
      end;
      if (not FileRename (InDir + name, DoneDir + name))
          VclMsgBox ("Ошибка при переносе файла " + name);
      else
         SuccessCount = SuccessCount + 1;
      end;
   end;
   stat = FileFindNext (name, size, dt, tm);
end;

VclRemProgress;
VclMsgBox("Импорт документов завершен \r\n \r\n Всего документов: " + TotalCount + 
  "\r\n Успешно импортировано: " + SuccessCount + 
  "\r\n Не импортировано: " + (TotalCount - SuccessCount));

OnError  /* Обработчик ошибок */
   VclMsgBox (M_PTK_SYSERR);
   AddPtk( String( M_PTK_SYSERR ), 3 );
end;