0
Отвечен

Форму программно сохранить в файл

Роман Шивалов 7 лет назад в Справки, квитки и прочие формы печати обновлен Гашков Николай (Эксперт) 7 лет назад 8

Здравствуйте.

Есть задача рассылать данные по расчетным листкам для их печати непосредственно в подразделении. Мы придумали, что для нас (отдел ИТ) было бы хорошо, чтобы сохранять саму форму в файл в определенном каталоге. Подразделения брали бы эти файлы и распечатывали.

При сохранении вручную есть вероятность, что сотрудник сохранит не в тот каталог.

Можно ли это сделать как-то автоматически, помимо того что всё делать скриптом, т.е. формировать и сохранять?

Script Квиток

Ответ

+1
Ответ

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

ХОРОШО, МНЕ ПОНРАВИЛОСЬ
Оценка удовлетворенности от Роман Шивалов 7 лет назад
На рассмотрении

Добрый день

Про какой именно квиток вопрос? ( номер формы?)

Квитки печатаются в Excel или текстовая форма?

Квитки нужно сохранять "почеловечно"  или один файл на все подразделение?

Форма 001. Текстовая форма. В идеале бы какой-нибудь сохранять в PDF, но это так, необязательно.

Один файл на всё точно не надо. Нужно "почеловечно", намного гибче. Нужно чтобы в имя файла входили как минимум номер подразделения (3 символа) и табельный номер (6 символов).

Добрый день!

У меня например: Расчетный листок за месяц РОУ, текстовая форма.

Проблема такая же. Буду признателен, если будет возможность реализовать этот вопрос.

С уважением Николай.

+1
Ответ

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

Протестировал код. Работает замечательно, но это если печатаем одного человека. Если печатаем сразу несколько, то выводится как-то накопительно. В принципе, понятно почему. Но нужно это как-то избежать. Либо выводить все печатаемые расчетные листки в один файл (потом обработаем как надо), либо в каждый файл выводить только один расчетный листок.

Спасибо за вашу работу.

Вот такой вариант должен заработать: 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