Табель учета рабочего времени

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Табель учета рабочего времени

Сообщение Buddy »

Добрый день!
Разбираюсь с небольшой доработкой. Необходимо из фастрепортовского отчета дотянуться до этих данных:
Изображение
Изображение
Т.е. есть переход в межпериод, и для двух интервалов разные счета/субсчета/аналитики.

Насколько мне удалось понять, работа с табелем ведется с помощью хитроумных функций/процедур. А нельзя ли до этих данных дотянуться по-простому, через таблицы?
Не могу найти, где хранятся эти данные...
RAJAH
Местный житель
Сообщения: 931
Зарегистрирован: 18 фев 2008, 12:49

Re: Табель учета рабочего времени

Сообщение RAJAH »

Как раз функции при активном использовании переходов в межпериод применять проще, чем отлавливать параметры в LSTAB или PEREXOD (счёт, я так понимаю, это LSCHET.CSCHETD, либо PEREXOD.CSCHETD).
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Табель учета рабочего времени

Сообщение Buddy »

А где бы почитать про использование этих функций? Я-то не против того, что их использовать, просто не очень понятно.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Табель учета рабочего времени

Сообщение Den »

Там, кнч , не все так просто , когда с этим не сталкивался. Разбираться непросто.
Почитать о это функционале можно в C_ExtFun.chm (.\exe\galdoc)
в Содержании см. узел Статьи - там см. "Табель учёта рабочего времени".

С помощью этих функцией можно только в VIP программе порулить когда будешь расширять поток для FR (т.е. нужно будет делать Alter Interface). И то не факт , что есть то, что нужно Вам в этом, заявленном в документации, функционале (счет/субсчет/аналитика)

а из самого FR они недоступные будут , кнч. Ну или запрос внешний клепать к БД , действительно, через соответствующие, предоставленные возможности в FR (ADO и что то вроде там еще появилось на эту тему в последний версиях)

Можно журнализацию галактическую поюзать , сделать нужные переходы в Гал вручную - и посмотреть что в этом случае куда пишет Гал (это если все же решите на уровне таблиц БД решить свою задачу.. )
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Табель учета рабочего времени

Сообщение zna »

Пытался как-то c помощью ADO сделать подключение из FR- не прокатило. Гал.8.1 Может, в 9-ке есть?
rmozgov
Сообщения: 7
Зарегистрирован: 09 июн 2016, 14:34
Откуда: Минск

Re: Табель учета рабочего времени

Сообщение rmozgov »

zna писал(а):Пытался как-то c помощью ADO сделать подключение из FR- не прокатило. Гал.8.1 Может, в 9-ке есть?
Начиная с версии FReport3.dll 9.1.20 на вкладке данные добавлены компоненты FireDuck с помощью которых можно подключится к БД Oracle, MSSSQL и т.д.
Справка
Изображение
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Табель учета рабочего времени

Сообщение edward_K »

в 8 вам остается только Alter Interface - в vidprogr.chm был вроде пример на докомпиляцию DataSet.
В 9 есть еще CompileVipExpretion -это наверное немного медленей, чем стучаться до таблиц, зато можно использовать все, что вычисляется по Ctrl+F4, табельные функции также, внешние атрибуты и так далее. Если хотите что то еще, то ищите в доке Static.
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Табель учета рабочего времени

Сообщение Buddy »

Все выходные ломал голову над этой задачей - точнее, ее частью.
Уточню: речь идет о доработке стандартного FR3-отчета "Форма Т12 - Страница 2". Если у сотрудника был переход в межпериод, нужно вытащить данные о счете, субсчете и аналитике из закладки "Отнесение затрат".
Прежде всего, я сделал Alter интерфейса Vedt12_1, в котором формируется поток.
Все данные в FR3-форму попадают из таблицы tmp_tabel_s2. Вот ее структура:

Код: Выделить всё

table struct tmp_tabel_s2
(
  tabn       : string,
  fio        : string,
  dolgn      : string,
  day        : array [1..31] of string,
  chas       : array [1..31] of double,
  kolDay1    : integer,
  kolDay2    : integer,
  kolChas1   : double,
  kolChas2   : double,
  Code       : array [1..4] of string,
  Days       : array [1..4] of integer,
  pererab    : double,
  Night      : double,
  Evening    : double,
  VihPrazd   : double,
  neyavki    : integer,
  vihday     : integer,
  UseLayer2  : boolean, 
  Day_L2     : array [1..31] of string, 
  Chas_L2    : array [1..31] of double, 
  KolDay1_L2 : integer, 
  KolDay2_L2 : integer,
  KolChas1_L2: double,  
  KolChas2_L2: double  
);
Запись этой таблицы формируется внутри процедуры

Код: Выделить всё

procedure ProcessTable(Change: comp)
, которая вызывается в цикле по таблице Perexod. В качестве параметра она получает Nrec из Perexod (для первой части месяца, до перехода, она получает 0).
Казалось бы, вот оно, счастье. Бери параметр Change и вытаскивай по нему данные. Если он 0 - то из LSTAB.CSCHETD, LSTAB.CSUBSCHETD и LSTAB.CKAUD[n], если не 0 - из PEREXOD.CSCHETD, PEREXOD.CSUBSCHETD и PEREXOD.CKAUD[n].
Но возникла проблема - куда передать, где сохранить эти данные, что бы до них мог добраться FastReport? Добавлять поля в таблицу tmp_tabel_s2 я не могу (насколько я знаю). Создал свою таблицу tmpdata, записал данные в нее(PEREXODNREC, CSCHETD, CSUBSCHETD, CKAUD[n]), но как связать эту таблицу с tmp_tabel_s2, ведь у tmp_tabel_s2 нет ни одного Nrec?
Я эту процедуру ProcessTable в своем Alter'е перегрузил и добавил в нее код для создания записей в таблице tmpdata, но при запуске отчет по обоим диапазонам (как до перехода, так и после) выдает данные "после перехода".
В общем, в контексте моей задачи - как мне связать таблицы tmp_tabel_s2 и tmpdata между собой, чтобы FastReport понимал, из какой строки брать данные?
RAJAH
Местный житель
Сообщения: 931
Зарегистрирован: 18 фев 2008, 12:49

Re: Табель учета рабочего времени

Сообщение RAJAH »

Не проще ли создать присоединённую форму, там выковырять нужные данные, передать их в поток и вызвать FastReport?
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Табель учета рабочего времени

Сообщение Buddy »

Может быть, и проще, просто я так раньше не делал... Можете маленький пример показать?
RAJAH
Местный житель
Сообщения: 931
Зарегистрирован: 18 фев 2008, 12:49

Re: Табель учета рабочего времени

Сообщение RAJAH »

Код: Выделить всё

.LinkForm 'M15_FR' Prototype is 'TOVN'
.Group 'Накладные на продажу'
.group 'Приходные накладные'
.NameInList 'Накладная на отпуск материалов на сторону М-15 '
.f 'NUL'
   ...
.{
.begin
   RunInterface('iNakl_M15', накладная_нрек);
end.
.if TOVN01
.else
.end
.if TOVN02
.else
.end
.{
.}
.{CheckEnter TOVNUSL
.}
.{
.}
.}
.endform

Код: Выделить всё

interface iNakl_M15 '' cyan, AlwaysReturn

var
   ...
parameters
  nrecnakl;
...
datastream nakl_m15
(
  [glbuh] glbuh;
  dataset nakl1
  (
    [matcen] matcen;
    [kolmc] kolmc;
    [koldo] koldo;
    [nondsmc] nonds;
    [ndsmc] nds;
    [nn] nn;
    [ediz] ediz;
    [kodediz] kodediz;
    [numpar] numpar;
    [prod] prod;
    [pok] pok;
    [nnakl] nnakl;
    [okpo] kokpo;
    [dnakl] dnakl;
    [sklad] sklad;
    [naznach] naznach;
    [dovfio] dovfio;
    [dovdol] dovdol;
    [razr] razr;
    [razrdol] razrdol;
    [sdal] sdal;
    [sdaldol] sdaldol;
    [dover] dover;
  );
)
...
handleevent
  cmInit:
    RunFReport(Nakl_M15, '', false);
    CloseInterface(0);
    abort;
    exit;
end;
End.
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Табель учета рабочего времени

Сообщение Buddy »

RAJAH, спасибо, сейчас изучу!
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Табель учета рабочего времени

Сообщение m0p3e »

Я бы сделал следующим образом.
В tmpdata добавил поле DayBeg - byte - дата начала интервала.
Привязываем таблицу через ФИО + Табельный номер + функция, определяющая начало интервала по tmp_tabel_s2.day. В цикле с 1..31 первое поле с осмысленным отклонением (не X, не '-', или что-там).
Далее просто расширяем поток.

Код: Выделить всё

overload 
 datastream <streamname>
end;
Будет компактнее.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Табель учета рабочего времени

Сообщение Den »

Если я правильно понял что треба то как то так . В такой реализации появляются доп поля счетов и субсчетов в FR в датасете (если смотришь и открываешь форму на редактирование и довыводить куда их - то при формировании тоже кажет значения. Аналитику добить тоже можно ...). Разумеется, бизнес-логика, в тестовом примере простенько сделана - ничего проще не придумал вечером понедельника, чем сделать ключ по табн+фио+ 31дням -поле массиву (по идее, они должны отличатся. Но могу быть не прав)

Код: Выделить всё


#component "z_wt"

Alter interface Vedt12_1;

   Overload 
     dataStream Stream_tabel_s2;
     Procedure ProcessTable(Change: comp);
   end;

table struct tmp_table_my
(
 tabn       : string,
 fio        : string,
 schet      : string[20],
 subschet   : string[20],
 days       : string
 )
 with index
 (
  in1=tabn+fio+days
 );
  
  Create view TVedt12_1
    as select
      if(isvalid(tntmp_table_my),tmp_table_my.schet,'not define') 
      (fieldname=MySch)
     ,if(isvalid(tntmp_table_my),tmp_table_my.subschet,'not define') 
      (fieldname=MySubs)
   from
     tmp_table_my
    where ((
                 tmp_tabel_s2.tabn ==  tmp_table_my.tabn
            and  tmp_tabel_s2.fio  ==  tmp_table_my.fio
            and  tmp_tabel_s2.day[1]+tmp_tabel_s2.day[2]+tmp_tabel_s2.day[3]+tmp_tabel_s2.day[4]+tmp_tabel_s2.day[5]+tmp_tabel_s2.day[6]+tmp_tabel_s2.day[7]+
                 tmp_tabel_s2.day[8]+tmp_tabel_s2.day[9]+tmp_tabel_s2.day[10]+tmp_tabel_s2.day[11]+tmp_tabel_s2.day[12]+tmp_tabel_s2.day[13]+tmp_tabel_s2.day[14]+
                 tmp_tabel_s2.day[15]+tmp_tabel_s2.day[16]+tmp_tabel_s2.day[17]+tmp_tabel_s2.day[18]+tmp_tabel_s2.day[19]+tmp_tabel_s2.day[20]+tmp_tabel_s2.day[21]+
                 tmp_tabel_s2.day[22]+tmp_tabel_s2.day[23]+tmp_tabel_s2.day[24]+tmp_tabel_s2.day[25]+tmp_tabel_s2.day[26]+tmp_tabel_s2.day[27]+tmp_tabel_s2.day[28]+
                 tmp_tabel_s2.day[29]+tmp_tabel_s2.day[30]+tmp_tabel_s2.day[31] == tmp_table_my.days
           ))
   ;


datastream Stream_tabel_s2
(
  table inherited :: tmp_tabel_s2
  (
    [ss]   MySch  ;
    [sb]   MySubs ;
  );
)
end;

 Procedure ProcessTable(Change: comp); // либо вывод, либо формирование таблицы для бюджетников
 {
   inherited::ProcessTable(Change);

    if Change<>comp(0) and  q <> 1
    {
      insert tmp_table_my set 
      tabn       := tmp_tabel_s2.tabn ,
      fio        := tmp_tabel_s2.fio  ,
      schet      := PEREXOD.CSCHETD   ,
      subschet   := PEREXOD.CSUBSCHD,
      days       :=tmp_tabel_s2.day[1]+tmp_tabel_s2.day[2]+tmp_tabel_s2.day[3]+tmp_tabel_s2.day[4]+tmp_tabel_s2.day[5]+tmp_tabel_s2.day[6]+tmp_tabel_s2.day[7]+
                   tmp_tabel_s2.day[8]+tmp_tabel_s2.day[9]+tmp_tabel_s2.day[10]+tmp_tabel_s2.day[11]+tmp_tabel_s2.day[12]+tmp_tabel_s2.day[13]+tmp_tabel_s2.day[14]+
                   tmp_tabel_s2.day[15]+tmp_tabel_s2.day[16]+tmp_tabel_s2.day[17]+tmp_tabel_s2.day[18]+tmp_tabel_s2.day[19]+tmp_tabel_s2.day[20]+tmp_tabel_s2.day[21]+
                   tmp_tabel_s2.day[22]+tmp_tabel_s2.day[23]+tmp_tabel_s2.day[24]+tmp_tabel_s2.day[25]+tmp_tabel_s2.day[26]+tmp_tabel_s2.day[27]+tmp_tabel_s2.day[28]+
                   tmp_tabel_s2.day[29]+tmp_tabel_s2.day[30]+tmp_tabel_s2.day[31];
    }
 }

end.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Табель учета рабочего времени

Сообщение Den »

Бери параметр Change и вытаскивай по нему данные. Если он 0 - то из LSTAB.CSCHETD, LSTAB.CSUBSCHETD и LSTAB.CKAUD[n],
Ну тут да, придется подрулить чуть чтобы так было - я просто сделал чтобы формировались допданные в свою времянку только для записей переходов (if Change<>comp(0) and q <> 1)
Ответить