Страница 1 из 2
Табель учета рабочего времени
Добавлено: 12 окт 2017, 20:47
Buddy
Добрый день!
Разбираюсь с небольшой доработкой. Необходимо из фастрепортовского отчета дотянуться до этих данных:
Т.е. есть переход в межпериод, и для двух интервалов разные счета/субсчета/аналитики.
Насколько мне удалось понять, работа с табелем ведется с помощью хитроумных функций/процедур. А нельзя ли до этих данных дотянуться по-простому, через таблицы?
Не могу найти, где хранятся эти данные...
Re: Табель учета рабочего времени
Добавлено: 12 окт 2017, 23:31
RAJAH
Как раз функции при активном использовании переходов в межпериод применять проще, чем отлавливать параметры в LSTAB или PEREXOD (счёт, я так понимаю, это LSCHET.CSCHETD, либо PEREXOD.CSCHETD).
Re: Табель учета рабочего времени
Добавлено: 12 окт 2017, 23:35
Buddy
А где бы почитать про использование этих функций? Я-то не против того, что их использовать, просто не очень понятно.
Re: Табель учета рабочего времени
Добавлено: 13 окт 2017, 01:33
Den
Там, кнч , не все так просто , когда с этим не сталкивался. Разбираться непросто.
Почитать о это функционале можно в C_ExtFun.chm (.\exe\galdoc)
в Содержании см. узел Статьи - там см. "Табель учёта рабочего времени".
С помощью этих функцией можно только в VIP программе порулить когда будешь расширять поток для FR (т.е. нужно будет делать Alter Interface). И то не факт , что есть то, что нужно Вам в этом, заявленном в документации, функционале (счет/субсчет/аналитика)
а из самого FR они недоступные будут , кнч. Ну или запрос внешний клепать к БД , действительно, через соответствующие, предоставленные возможности в FR (ADO и что то вроде там еще появилось на эту тему в последний версиях)
Можно журнализацию галактическую поюзать , сделать нужные переходы в Гал вручную - и посмотреть что в этом случае куда пишет Гал (это если все же решите на уровне таблиц БД решить свою задачу.. )
Re: Табель учета рабочего времени
Добавлено: 13 окт 2017, 14:44
zna
Пытался как-то c помощью ADO сделать подключение из FR- не прокатило. Гал.8.1 Может, в 9-ке есть?
Re: Табель учета рабочего времени
Добавлено: 13 окт 2017, 15:38
rmozgov
zna писал(а):Пытался как-то c помощью ADO сделать подключение из FR- не прокатило. Гал.8.1 Может, в 9-ке есть?
Начиная с версии FReport3.dll 9.1.20 на вкладке данные добавлены компоненты FireDuck с помощью которых можно подключится к БД Oracle, MSSSQL и т.д.
Справка
Re: Табель учета рабочего времени
Добавлено: 14 окт 2017, 00:05
edward_K
в 8 вам остается только Alter Interface - в vidprogr.chm был вроде пример на докомпиляцию DataSet.
В 9 есть еще CompileVipExpretion -это наверное немного медленей, чем стучаться до таблиц, зато можно использовать все, что вычисляется по Ctrl+F4, табельные функции также, внешние атрибуты и так далее. Если хотите что то еще, то ищите в доке Static.
Re: Табель учета рабочего времени
Добавлено: 16 окт 2017, 09:58
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
);
Запись этой таблицы формируется внутри процедуры
, которая вызывается в цикле по таблице 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 понимал, из какой строки брать данные?
Re: Табель учета рабочего времени
Добавлено: 16 окт 2017, 12:03
RAJAH
Не проще ли создать присоединённую форму, там выковырять нужные данные, передать их в поток и вызвать FastReport?
Re: Табель учета рабочего времени
Добавлено: 16 окт 2017, 12:07
Buddy
Может быть, и проще, просто я так раньше не делал... Можете маленький пример показать?
Re: Табель учета рабочего времени
Добавлено: 16 окт 2017, 12:36
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.
Re: Табель учета рабочего времени
Добавлено: 16 окт 2017, 12:51
Buddy
RAJAH, спасибо, сейчас изучу!
Re: Табель учета рабочего времени
Добавлено: 16 окт 2017, 13:20
m0p3e
Я бы сделал следующим образом.
В tmpdata добавил поле DayBeg - byte - дата начала интервала.
Привязываем таблицу через ФИО + Табельный номер + функция, определяющая начало интервала по tmp_tabel_s2.day
. В цикле с 1..31 первое поле с осмысленным отклонением (не X, не '-', или что-там).
Далее просто расширяем поток.
Будет компактнее.
Re: Табель учета рабочего времени
Добавлено: 17 окт 2017, 00:46
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.
Re: Табель учета рабочего времени
Добавлено: 17 окт 2017, 00:50
Den
Бери параметр Change и вытаскивай по нему данные. Если он 0 - то из LSTAB.CSCHETD, LSTAB.CSUBSCHETD и LSTAB.CKAUD[n],
Ну тут да, придется подрулить чуть чтобы так было - я просто сделал чтобы формировались допданные в свою времянку только для записей переходов (if Change<>comp(0) and q <> 1)