Форму программно сохранить в файл
Здравствуйте.
Есть задача рассылать данные по расчетным листкам для их печати непосредственно в подразделении. Мы придумали, что для нас (отдел ИТ) было бы хорошо, чтобы сохранять саму форму в файл в определенном каталоге. Подразделения брали бы эти файлы и распечатывали.
При сохранении вручную есть вероятность, что сотрудник сохранит не в тот каталог.
Можно ли это сделать как-то автоматически, помимо того что всё делать скриптом, т.е. формировать и сохранять?
Ответ
Добрый день
Про какой именно квиток вопрос? ( номер формы?)
Квитки печатаются в Excel или текстовая форма?
Квитки нужно сохранять "почеловечно" или один файл на все подразделение?
Форма 001. Текстовая форма. В идеале бы какой-нибудь сохранять в PDF, но это так, необязательно.
Один файл на всё точно не надо. Нужно "почеловечно", намного гибче. Нужно чтобы в имя файла входили как минимум номер подразделения (3 символа) и табельный номер (6 символов).
Добрый день!
У меня например: Расчетный листок за месяц РОУ, текстовая форма.
Проблема такая же. Буду признателен, если будет возможность реализовать этот вопрос.
С уважением Николай.
1)В печатную форму квитка после строки
SendKvitokToEmail();//отправляем по почте
2)Добавляем
UserSaveCheckToFile();
3)В постоянно загруженный модуль ( например в USFUNCRW.S) добавляем функцию
UserSaveCheckToFile() { var d =KDateFromInt(atoi(GetVarValue("МЕСЯЦ_КВИТКА"))); var checksFolder="d:\\temp\\";//каталог, в который будут сохраняться квитки char checkFile[256];//строка вида: год_месяц\\подразделение_ТН sprintf(checkFile,"%04d_%02d\\%04d_%06d",d.GetYear(),d.GetMonth(),kch_from_int("podr"),kch_from_int("tn")); var fullCheckPath=checksFolder+to_string(checkFile)+".txt"; mkdirAll(fullCheckPath); //удаляем файл,если он уже существует if (!access(fullCheckPath,0)) DeleteFile(fullCheckPath); //сохраняем квитки в файл var CFile=CreateObject("CurPrnFile"); CFile.CopyToDevice(fullCheckPath); }
Протестировал код. Работает замечательно, но это если печатаем одного человека. Если печатаем сразу несколько, то выводится как-то накопительно. В принципе, понятно почему. Но нужно это как-то избежать. Либо выводить все печатаемые расчетные листки в один файл (потом обработаем как надо), либо в каждый файл выводить только один расчетный листок.
Спасибо за вашу работу.
Вот такой вариант должен заработать: USFUNCRW.zip
int UserOffsetsKvitokCount=0;
int UserOffsetsKvitok[99999];
string UserCheckParams[99999];//строка вида: подразделение_ТН_абс.месяц
UserSaveCheckToFile()
{
int obr_kv=atoi(GetVarValue("ОБРАБОТАНО_КВИТКОВ"));
int vib_kv=atoi(GetVarValue("ВСЕГО_КВИТКОВ")); if (atoi(obr_kv)==0) //первый квиток, выполняем инициализацию
{
UserOffsetsKvitokCount=0;
for (int i=0;i<=vib_kv;i++)
{
UserOffsetsKvitok[i]=0;
UserCheckParams[i]="";
}
}
UserOffsetsKvitokCount++; //кол-во смещений(квитков)
var CFile=CreateObject("CurPrnFile");
UserOffsetsKvitok[UserOffsetsKvitokCount]=CFile.GetCountByte(); //запоминаем конечную позицию квитка
UserCheckParams[UserOffsetsKvitokCount]=to_string(kch_from_int("podr")) + "_" + to_string(kch_from_int("tn")) + "_" + to_string(atoi(GetVarValue("МЕСЯЦ_КВИТКА")));
//если обработали все квитки - сохраняем в файл
if (UserOffsetsKvitokCount==vib_kv)
{
string NameFile;//путь для временного файла
//сохраняем печатную форму в файл
{
//путь для временного файла
char Dir[128];
GetCurrentDirectory(128,Dir);
NameFile=Dir+"\\Check.tmp"; //удаляем файл,если он уже существует
if (!access(NameFile,0))
DeleteFile(NameFile); //сохраняем квитки в файл
CFile.CopyToDevice(NameFile);
}
//открываем файл с квитками
int handle = open(NameFile,O_RDONLY | O_TEXT,0);
if ( handle==-1 )
return;
var checksFolder="d:\\temp\\";//каталог, в который будут сохраняться квитки
char checkFile[256];//строка вида: год_месяц\\подразделение_ТН
//цикл по квиткам
for(int i=1;i<=UserOffsetsKvitokCount;i++)
{
long l=lseek(handle,UserOffsetsKvitok[i-1],SEEK_SET);
char kvitokContext[UserOffsetsKvitok[i]-UserOffsetsKvitok[i-1]+1];
int r=read(handle,kvitokContext,UserOffsetsKvitok[i]-UserOffsetsKvitok[i-1]);
kvitokContext=SubStr(kvitokContext,0,r); //данные одного квитка
int podr=atoi(GetElementFromString(0,UserCheckParams[i],"_"));
int tn =atoi(GetElementFromString(1,UserCheckParams[i],"_"));
var d=KDateFromInt(atoi(GetElementFromString(2,UserCheckParams[i],"_")));
sprintf(checkFile,"%04d_%02d\\%04d_%06d",d.GetYear(),d.GetMonth(),podr,tn);
var fullCheckPath=checksFolder+to_string(checkFile)+".txt";
mkdirAll(fullCheckPath);
//удаляем файл,если он уже существует
if (!access(fullCheckPath,0))
DeleteFile(fullCheckPath);
NetDialogs().AddStringToFile(fullCheckPath,OemToAnsi(kvitokContext));
}
//чистим за собой
close(handle);
DeleteFile(NameFile);
}
}
Спасибо за вашу работу!!!
Удобнее на мой взгляд выводить расчетный листки в один файл.
С уважением Николай.
Сервис поддержки клиентов работает на платформе UserEcho
1)В печатную форму квитка после строки
2)Добавляем
3)В постоянно загруженный модуль ( например в USFUNCRW.S) добавляем функцию
USFUNCRW.zip