Массовый импорт платежных документов из файлов
Скачать (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;