Скрипты в Fastreport
Некорректные значения в табеле учета рабочего времени
Задача: в отчете Табель учета рабочего времени нет возможности задать корректный формат вывода времени. Необходимо, чтобы минуты ограничивались значением 60.
Решение:
Для этого в поле memFldRIGHTDURATION замените
\[INT(\[ЧИСТАЯ ДЛИТЕЛЬНОСТЬ\]) +0.6*FRAC(\[ЧИСТАЯ ДЛИТЕЛЬНОСТЬ\])\]
на
\[\[ЧИСТАЯ ДЛИТЕЛЬНОСТЬ\]*60*60/(60*60*24)\]
А в свойстве DisplayFormat выберите подходящий формат времени
Объединение пустых строк в макетах прямых отчетов
Задача: Необходимо отредактировать макеты для прямых отчетов: убрать/объединить ненужные пустые строки.
Решение:
Расход блюд по категориям
Для отчета Расход блюд по категориям на странице кода запишите скрипт:
var S: string;
D: Tdatetime;
DS: TfrxDataSet;
procedure MasterData1OnAfterCalcHeight(Sender: TfrxComponent);
begin
if ((Engine.FreeSpace < 2*memDataCLASSIFICATION.Height) and (Engine.FreeSpace > memDataCLASSIFICATION.Height))
then memDataCLASSIFICATION.Frame.Typ := memDataCLASSIFICATION.Frame.Typ + ftBottom;
end;
procedure memDataCLASSIFICATIONOnBeforePrint(Sender: TfrxComponent);
begin
if S = <ReportSource."CLASSIFICATION">
then memDataCLASSIFICATION.Frame.Typ := ftLeft + ftRight
else memDataCLASSIFICATION.Frame.Typ := ftLeft + ftRight + ftTop;
DS.Next;
if DS.Eof
then memDataCLASSIFICATION.Frame.Typ := memDataCLASSIFICATION.Frame.Typ + ftBottom
else DS.Prior;
S := <ReportSource."CLASSIFICATION">;
end;
procedure Memo8OnBeforePrint(Sender: TfrxComponent);
begin
if D = <ReportSource."SHIFTDATE">
then Memo8.Frame.Typ := ftLeft + ftRight
else Memo8.Frame.Typ := ftLeft + ftRight + ftTop;
DS.Next;
if DS.Eof
then Memo8.Frame.Typ := Memo8.Frame.Typ + ftBottom
else DS.Prior;
D := <ReportSource."SHIFTDATE">;
end;
begin
DS := Report.GetDataSet('ReportSource');
S := '';
end.
Расход блюд
Для отчета Расход блюд на странице кода запишите скрипт:
var D: Tdatetime;
DS: TfrxDataSet;
procedure memDataDISHCODEOnBeforePrint(Sender: TfrxComponent);
begin
if D = <ReportSource."SHIFTDATE">
then memDataDISHCODE.Frame.Typ := ftLeft + ftRight
else memDataDISHCODE.Frame.Typ := ftLeft + ftRight + ftTop;
DS.Next;
if DS.Eof
then memDataDISHCODE.Frame.Typ := memDataDISHCODE.Frame.Typ + ftBottom
else DS.Prior;
D := <ReportSource."SHIFTDATE">;
end;
procedure Table_BodyOnAfterCalcHeight(Sender: TfrxComponent);
begin
if ((Engine.FreeSpace < 2*memHeadDISHCODE.Height) and (Engine.FreeSpace > memHeadDISHCODE.Height))
then memHeadDISHCODE.Frame.Typ := memHeadDISHCODE.Frame.Typ + ftBottom;
end;
begin
DS := Report.GetDataSet('ReportSource');
D := 0;
end.
Общая выручка
Для отчета Общая выручка на странице кода запишите скрипт:
var S: string;
DS: TfrxDataSet;
procedure MasterData1OnAfterCalcHeight(Sender: TfrxComponent);
begin
if ((Engine.FreeSpace < 2*Memo19.Height) and (Engine.FreeSpace > Memo19.Height))
then Memo19.Frame.Typ := Memo19.Frame.Typ + ftBottom;
end;
procedure Memo19OnBeforePrint(Sender: TfrxComponent);
begin
if S = <ReportSource."CURRENCYTYPE">
then Memo19.Frame.Typ := ftLeft + ftRight
else Memo19.Frame.Typ := ftLeft + ftRight + ftTop;
DS.Next;
if DS.Eof
then Memo19.Frame.Typ := Memo19.Frame.Typ + ftBottom
else DS.Prior;
S := <ReportSource."CURRENCYTYPE">;
end;
begin
DS := Report.GetDataSet('ReportSource');
S := '';
end.
Примеры вывода в FR 3
Пример вывода модификаторов к соответствующим блюдам:
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
dsDishes : TfrxDataSet;
i : integer;
modstr, newmodstr : string;
begin
dsDishes:=MasterData1.DataSet;
dsDishes.First;
while not dsDishes.eof do begin
if length(dsDishes.Value('ModifiersText')) >0 then
begin
modstr:=dsDishes.Value('ModifiersText');
while pos(',',modstr)<>0 do
begin
newmodstr:='- 'copy(modstr,0,pos(',',modstr)-1)#13;
modstr:=copy(modstr,pos(',',modstr)+1,length(modstr));
end;
newmodstr:=newmodstr+'- '+modstr;
end;
for i:=1 to dsDishes.Value('Quantity') do begin
//DishCounter.Text := 'Dish No # 'intToStr(dsDishes.RecNo+1)'/'+intToStr(dsDishes.RecordCount);
//WaitingNumber.Text := intToStr+' / '+intToStr(dsDishes.Value('Quantity'));
Memo10.Text:=newmodstr;
Engine.ShowBand(MasterData1);
end;
newmodstr:='';
dsDishes.Next;
end;
end;
Пример вывода комбо-блюд:
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
dsDishes : TfrxDataSet;
i : integer;
modstr, newmodstr : string;
begin
dsDishes:=MasterData1.DataSet;
dsDishes.First;
while not dsDishes.eof do begin
if dsDishes.Value('ComboDish') <> '' then
begin
dsDishes.next;
continue;
end;
if length(dsDishes.Value('ModifiersText')) >0 then
begin
modstr:=dsDishes.Value('ModifiersText');
while pos(',',modstr)<>0 do
begin
newmodstr:='- 'copy(modstr,0,pos(',',modstr)-1)#13;
modstr:=copy(modstr,pos(',',modstr)+1,length(modstr));
end;
newmodstr:=newmodstr+'- '+modstr;
end;
for i:=1 to dsDishes.Value('Quantity') do begin
Memo10.Text:=newmodstr;
Engine.ShowBand(MasterData1);
end;
newmodstr:='';
dsDishes.Next;
end;
end;
begin
end.
Настройка печати этикеток в r_k Delivery
Задача: Необходим скрипт, который будет вручную выстраивать отчет, выводить этикетку на каждое блюдо и разбивать модификаторы блюда на строки.
Комбо-блюда должны выводиться на наклейках отдельно, то есть отдельно название комбо-блюда и отдельно его составляющие.
Например: комбо-блюдо на одной наклейке
Пицца составная:
- Пицца 1 — ½
- Пицца 2 — ½
Решение:
Используйте этот скрипт, чтобы настроить вывод этикеток, на которых будет напечатано комбо-блюдо и его состав. Количество напечатанных этикеток равно количеству комбо-блюд в чеке.
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
dsDishes : TfrxDataSet;
i : integer;
modstr, newmodstr : string;
begin
dsDishes:=MasterData1.DataSet;
dsDishes.First;
while not dsDishes.eof do begin
if dsDishes.Value('ComboDish') <> '' then
begin
dsDishes.next;
continue;
end;
if length(dsDishes.Value('ModifiersText')) >0 then
begin
modstr:=dsDishes.Value('ModifiersText');
while pos(',',modstr)<>0 do
begin
newmodstr:='- 'copy(modstr,0,pos(',',modstr)-1)#13;
modstr:=copy(modstr,pos(',',modstr)+1,length(modstr));
end;
newmodstr:=newmodstr+'- '+modstr;
end;
for i:=1 to dsDishes.Value('Quantity') do begin
Memo10.Text:=newmodstr;
Engine.ShowBand(MasterData1);
end;
newmodstr:='';
dsDishes.Next;
end;
end;
begin
end.
Скрипт в Fastreport по объединению вертикальных ячеек
Задача: Необходимо добавить в куб Операции поле Содержимое заказа. При создании нового куба столбцы стали некорректно отображают информацию: если в одном чеке несколько удаленных блюд, колонка содержимое чека повторяет информацию.
Решение: cкрипт в Fastreport по объединению вертикальных ячеек:
var prevOrder, prevOrder3, prevShiftDate, prevDishName: string;
DS, DS3: TfrxDataSet;
procedure RKeeperDataOnBeforePrint(Sender: TfrxComponent);
begin
prevOrder := '';
prevOrder3 := '';
prevShiftDate := '';
prevDishName := '';
end;
procedure Table_BodyOnAfterCalcHeight(Sender: TfrxComponent);
begin
{ if ((Engine.FreeSpace < 2*memDataORDERNAME.Height) and (Engine.FreeSpace > memDataORDERNAME.Height))
then memDataORDERNAME.Frame.Typ := memDataORDERNAME.Frame.Typ + ftBottom; }
end;
procedure memDataSHIFTDATEOnBeforePrint(Sender: TfrxComponent);
begin
if prevShiftDate = DateToStr(DS.value('SHIFTDATE'))
then memDataSHIFTDATE.Frame.Typ := ftLeft + ftRight
else memDataSHIFTDATE.Frame.Typ := ftLeft + ftRight + ftTop;
DS.Next;
if DS.Eof
then memDataSHIFTDATE.Frame.Typ := memDataSHIFTDATE.Frame.Typ + ftBottom
else DS.Prior;
if null<>DS.value('SHIFTDATE') then
prevShiftDate := DateToStr(DS.value('SHIFTDATE'))
else
prevShiftDate := '';
end;
procedure memDataORDERNAMEOnBeforePrint(Sender: TfrxComponent);
begin
if prevOrder = (DS.value('ORDERNAME'))
then memDataORDERNAME.Frame.Typ := ftLeft + ftRight
else memDataORDERNAME.Frame.Typ := ftLeft + ftRight + ftTop;
DS.Next;
if DS.Eof
then memDataORDERNAME.Frame.Typ := memDataORDERNAME.Frame.Typ + ftBottom
else DS.Prior;
if null<>DS.value('ORDERNAME') then
prevOrder := (DS.value('ORDERNAME'))
else
prevOrder := '';
end;
procedure memDataDISH1OnBeforePrint(Sender: TfrxComponent);
begin
if (prevDishName = (DS3.value('DISH1')))and(prevOrder3 = (DS3.value('ORDERNAME')))
then memDataDISH1.Frame.Typ := ftLeft + ftRight
else memDataDISH1.Frame.Typ := ftLeft + ftRight + ftTop;
DS3.Next;
if DS3.Eof
then memDataDISH1.Frame.Typ := memDataDISH1.Frame.Typ + ftBottom
else DS3.Prior;
if null<>DS3.value('DISH1') then
prevDishName := (DS3.value('DISH1'))
else
prevDishName := '';
if null<>DS3.value('ORDERNAME') then
prevOrder3 := (DS3.value('ORDERNAME'))
else
prevOrder3 := '';
end;
begin
DS := Table_Body.Dataset; // Report.GetDataSet('ReportSource');
DS3 := Table_Body.Dataset; // Report.GetDataSet('ReportSource');
prevOrder := '';
prevOrder3 := '';
prevShiftDate := '';
prevDishName := '';
end.