// Пример 18. Работа с датами в скрипте.

var Tabl; // объект класса для работы таблицей

int idxTN    =  0, // табельный номер
    idxPODR  =  1, // подразделение
    idxFIO   =  2, // ФИО
    idxINCOM =  3, // облагаемый доход
    idxCBEG  =  4, // календарный месяц начала периода
    idxCEND  =  5, // календарный месяц конца периода
    idxDBEG  =  6, // дата начала пеиода
    idxDEND  =  7, // дата конца периода
    idxBEG   =  8, // относительный месяц начала периода
    idxEND   =  9, // относительный месяц начала периода
    idxABEG  = 10, // абсолютный месяц начала периода
    idxAEND  = 11, // абсолютный месяц конца периода

    CntIdx   = 12;

int fld[CntIdx];

int len=256;

char str[len],
     arg[len],
     rez[len];

Primer18(DataVed)
{

  sprintf(str,"Дата формирования: %s",DataVed); print(str);
  sprintf(str,"Текущая дата: %s",datatek); print(str);
  sprintf(str,"Текущая дата прописью: %s", R_DATA_PROPIS(datatek,rez,50,50)); print(str);
  sprintf(str,"Расчетный месяц mrasch в формате ГГГГММ: %.0f", data); print(str);
  sprintf(str,"Число календарных дней в месяце mrasch: %d", countday); print(str);
  sprintf(str,"Текущий месяц в абсолютном представлении: %d", mtek); print(str);
  sprintf(str,"Расчетный месяц в абсолютном представлении: %d", mrasch); print(str);
  sprintf(str,"Расчетный месяц mrasch по номеру месяца в году: %d", mcal); print(str);
  sprintf(str,"Год для месяца mrasch в виде ГГГГ: %d", year); print(str);
  sprintf(str,"Полезная функция GetDateFromFuncRWScript(): %.2f", GetDateFromFuncRWScript(mtek)); print(str);

  print("");

  Tabl = CreateObject("CurPrnTbl");
  int cnt=Tabl.Count_Rcr(); // полное число записей   

  FillFld(); // находим поля в таблице

  sprintf(str,"календарный месяц начала периода    %s", Tabl.Text(fld[idxCBEG],0)); print(str);
  sprintf(str,"календарный месяц конца периода     %s", Tabl.Text(fld[idxCEND],0)); print(str);
  sprintf(str,"дата начала пеиода                  %s", Tabl.Text(fld[idxDBEG],0)); print(str);
  sprintf(str,"дата конца периода                  %s", Tabl.Text(fld[idxDEND],0)); print(str);
  sprintf(str,"относительный месяц начала периода  %s", Tabl.Text(fld[idxBEG],0));  print(str);
  sprintf(str,"относительный месяц начала периода  %s", Tabl.Text(fld[idxEND],0));  print(str);
  sprintf(str,"абсолютный месяц начала периода     %s", Tabl.Text(fld[idxABEG],0)); print(str);
  sprintf(str,"абсолютный месяц конца периода      %s", Tabl.Text(fld[idxAEND],0)); print(str);

  sprintf(str,"дата начала периода из панели запроса      %s", Str_Date_0); print(str);
  sprintf(str,"дата конца периода из панели запроса       %s", Str_Date_1); print(str);

  print("");
  print("Классы KDate и KMonth");
  print("");

  // объявление
  var M1 = CreateObject("KMonth");
  var D1 = CreateObject("KDate");

  var M2 = CreateObject("KMonth");
  var D2 = CreateObject("KDate");

  var M3 = CreateObject("KMonth");

  var M4 = CreateObject("KMonth");
  var D4 = CreateObject("KDate");

  var M5 = CreateObject("KMonth");
  var D5 = CreateObject("KDate");

  var M6 = CreateObject("KMonth");
  var D6 = CreateObject("KDate");

  var DBEG = CreateObject("KDate");
  var DEND = CreateObject("KDate");

  var MBEG = CreateObject("KMonth");
  var MEND = CreateObject("KMonth");

  // инициализация 
  M1.SetMonth(mtek); // инициализация абсолютным значением месяца
  D1.SetMonth(mtek);

  M2.SetMonthYear(mcal,year); // инициализация календарными значениями месяца и года
  D2.SetMonthYear(mcal,year);

  M3.SetDate(static_cast_to_string(Str_Date_0)); // инициализация строкой

  // инициализация днем месяца и классом KMonth
  M4.SetDateIM(1,M3);
  D4.SetDateIM(25,M3);

  // инициализация днем месяца и абсолютным значением месяца
  M5.SetDateII(1,mrasch);
  D5.SetDateII(25,mrasch);

  // инициализация датой вида ГГГГММ.ДД
  double Date = GetDateFromFuncRWScript(mtek); // получаем дату формата ГГГГММ.ДД

  M6.SetDateD(Date);
  D6.SetDateD(Date);

  // вспомогательные переменные, вернее объекты
  DBEG.SetDateII(5,mrasch);
  DEND.SetDateII(27,mrasch);

  MBEG.SetMonth(mtek-5);
  MEND.SetMonth(mtek);

  
  sprintf(str,"GetAbs()     Возвращает абсолютное значение месяца           : %d", D1.GetAbs()); print(str);
  sprintf(str,"GetRel()     Возвращает значение месяца относительно текущего: %d", D1.GetRel()); print(str);
  sprintf(str,"GetSysForm() Возвращает месяц в виде ГГГГММ                  : %d", D1.GetSysForm()); print(str);
  sprintf(str,"GetYear()    Возвращает календарное значение года            : %d", D1.GetYear()); print(str);
  sprintf(str,"GetMonth()   Возвращает календарное значение месяца          : %d", D1.GetMonth()); print(str);
  sprintf(str,"CountDay()   Возвращает количество дней в месяце             : %d", D1.CountDay()); print(str);

  sprintf(str,"GetDay()     Возвращает день месяца                             : %d", D5.GetDay()); print(str);
  sprintf(str,"GetDouble()  Возвращает дату в виде ГГГГММ.ДД                   : %.2f", D5.GetDouble()); print(str);
  sprintf(str,"GetWeekDay() Возвращает день недели (от 0 до 6, 0 - понедельник): %d", D5.GetWeekDay()); print(str);

  sprintf(str,"Diff(KDate d)  Возвращает разность между двумя датами: %d", DEND.Diff(DBEG)); print(str);
  sprintf(str,"Diff(KMonth m) Возвращает разность между месяцами:     %d", MEND.Diff(MBEG)); print(str);

  D5.Inc(); // увеличили дату D5 на 1
  M4.Dec(); // уменьшили месяц M4 на 1

  sprintf(str,"D5.Inc()  увеличили дату D5 на 1  : %.2f", D5.GetDouble()); print(str);
  sprintf(str,"M4.Dec()  уменьшили месяц M4 на 1 : %d", M4.GetRel()); print(str);

  sprintf(str,"GetOffs(int Offs) смещение даты на Offs дней: %.2f", DEND.GetOffs(55)); print(str);

  // в процессе работы по разным причинам дата или месяц могут быть криво инициальзированы
  // для того чтобы обнаружить это слулит метод IsEql( int m)

  var M7 = CreateObject("KMonth");
  M7.SetDate("что-то неправильное"); // неправильный месяц

  if ( M7.IsEqI(INVALID_MONTH_VALUE) ) // в случае если значение месяца неправильное IsEqI() возвращает 1
  {                                    // и 0 если значение корректно
     print("M7 - неправильный месяц");
  }

  M7.SetDate("01.2003"); // теперь инициализируем M7 правильным значением

  if ( !M7.IsEqI(INVALID_MONTH_VALUE) )
  {
     print("M7 - теперь корректное значение");
  }

  var D7 = CreateObject("KDate");
  D7.SetDateD(-234.34); // неправильная дата, нужно что было что-то вроде 200205.23 а не -234.34

  if ( D7.IsEqI(INVALID_DATE_VALUE) ) // в случае если значение месяца неправильное IsEqI() возвращает 1
  {                                   // и 0 если значение корректно
     print("D7 - неправильная дата");
  }

  D7.SetDateD(200310.01); // теперь инициализируем D7 правильным значением

  if ( !M7.IsEqI(INVALID_DATE_VALUE) )
  {
     print("D7 - теперь корректное значение");
  }

  // сравнением месяцев у дат
  if ( DBEG.IsEqM(DEND) )
  {
    print("даты DBEG и DEND приходятся на один месяц");
  }

  // сравнение дат
  if ( DEND.GT(DBEG) )
  {
    print("DEND больше чем DBEG");
  }


/*
  for ( long rcr=0; rcr < cnt; ++rcr ) // идем по всей таблице
  {
    long   tn   = atol(Tabl.Text(fld[idxTN],rcr)),
           podr = atol(Tabl.Text(fld[idxPODR],rcr));
    string fio  = Tabl.Text(fld[idxFIO],rcr); FreeSpaceString(fio,3,""); // убираем лишние пробелы

    char inc[len]; sprintf(inc,"%s",Tabl.Text(fld[idxINCOM],rcr)); FreeSpaceString(inc,3,""); // доход
    char tax[len]; sprintf(tax,"%s",Tabl.Text(fld[idxTAX],rcr));   FreeSpaceString(tax,3,""); // налог

    print(fio);
  }
*/

}


FillFld()
// находим поля в таблице и определяем их номера
{
  fld[idxTN]    = Tabl.Find_Name_Fld("TN");
  fld[idxPODR]  = Tabl.Find_Name_Fld("PODR");
  fld[idxFIO]   = Tabl.Find_Name_Fld("FIO");
  fld[idxINCOM] = Tabl.Find_Name_Fld("INCOM");
  fld[idxCBEG]  = Tabl.Find_Name_Fld("CBEG");
  fld[idxCEND]  = Tabl.Find_Name_Fld("CEND");
  fld[idxDBEG]  = Tabl.Find_Name_Fld("DBEG");
  fld[idxDEND]  = Tabl.Find_Name_Fld("DEND");
  fld[idxBEG]   = Tabl.Find_Name_Fld("BEG");
  fld[idxEND]   = Tabl.Find_Name_Fld("END");
  fld[idxABEG]  = Tabl.Find_Name_Fld("ABEG");
  fld[idxAEND]  = Tabl.Find_Name_Fld("AEND");
}

      
Ansi( Str )
// функция перекодирует значение Str в windows-кодировку и возвращает перекодированное значение
// Str - строка, которую нужно перекодировать
{
   string Ans=Str;
   OemToChar(Str,Ans);
   return Ans;
}

