Страница 1 из 2
Отчет по накладным
Добавлено: 04 фев 2014, 17:52
Espada
Здравствуйте, необходмо создать Отчет по накладной, в котором количество продукции с одинаковым наименованием будет складываться и вы водиться будет общее значение. Например
-Накладная-
1. Краска 123 | 20 банок
2. краска 117 | 10 Банок
3. краска 123 | 11 банок
4. краска 117 | 13 банок
Отчет должен получиться вида
1. Краска 123 | 31 Бан.
2. Краска 117 | 23 Бан.
Подскажите, как это можно реализовать? Спасибо
Re: Отчет по накладным
Добавлено: 04 фев 2014, 18:26
Zver
Могу предложить следующий вариант:
1) Создаём временную таблицу вида
table struct mtNakl_Sum
(
cmc : comp //здесь храним МЦ
,SumKol : double //здесь храним общее количество
)
2) Затем делаем цикл на накладным. Для каждой позиции проверяем, есть ли уже такая МЦ в таблице mtNakl_Sum.
- если есть, то update current mtNakl_Sum, вот так: set mtNakl_Sum.SumKol = mtNakl_Sum.SumKOl + количество из накладной
- если ещё нет, то создаём запись в таблице mtNakl_Sum, вот так:
insert into mtNakl_Sum set
mtNakl_Sum.cMc := //ссылка а МЦ из накладной
mtNakl_Sum.SolSum := //количество из накладной
А затем содержимое этой таблицы можно вывести куда необходимо, в Excel, на экран в browse или FR-отчет.
Re: Отчет по накладным
Добавлено: 04 фев 2014, 18:51
Den
..2 ) можно лаконичнее..аля :
sql select
katmc.name as cmc
,sum(spsopr.kol) as sumkol
from spsopr inner join katmc on spsopr.cmcusl=katmc.nrec
and spsopr.vidsopr=201 // если нужна реализация
and spsopr.dsopr>=@d1
and spsopr.dsopr<=@d2
group by katmc.name
into mtNakl_Sum byname;
Re: Отчет по накладным
Добавлено: 04 фев 2014, 18:55
Zver
Den, а можно где-то почитать подробнее о таком методе извлечения данных из Галактики?
Re: Отчет по накладным
Добавлено: 04 фев 2014, 19:01
Den
Zver писал(а):Den, а можно где-то почитать подробнее о таком методе извлечения данных из Галактики?
Все в рамках документации по разработке. Вот пример нашел у себя простой :
Код: Выделить всё
table struct t51
(
plnrec : comp
,plnodok : string[20]
,dat : date
,sumplat : double
,sumobor : double
)
with index
(
in1=dat
);
Interface Sel51_Trouble;
create view
var
pl : comp;
aFileName : string;
cnt : integer;
XlRes : boolean;
as select * from t51
;
handleevent
CmInit:{
if RunInterface('F_PLANSSCH::GetPlansSch',pl)=CmCancel
exit;
sql select
plpor.nrec plnrec
,plpor.nodok plnodok
,plpor.datvip dat
,plpor.sumplat sumplat
,sum(oborot.sumob) sumobor
from plpor inner join oborot on plpor.nrec=oborot.csoprdoc and plpor.tidkgal=2
where oborot.DBSCHETO='51'
and oborot.cplanssch=:(pl)
group by plpor.nrec
,plpor.nodok
,plpor.sumplat
,plpor.datvip
having round(plpor.sumplat,2)<>sum(round(oborot.sumob,2))
into t51 byname;
XlRes := xlCreateExcel((aFileName), true);
if (XlRes)
XlRes := xlIsExcelValid;
if (not XlRes)
Message('не иннициализирован excel');
xlSetCellStringValue('Дата плат.',1,1,1,1);
xlSetCellStringValue('Номер плат.',1,2,1,2);
xlSetCellStringValue('Сумма платежа',1,3,1,3);
xlSetCellStringValue('Сумма поводок(на 51)',1,4,1,4);
xlSetCellStringValue('Разъехалось на',1,5,1,5);
cnt:=3;
_loop t51
{
inc(cnt);
xlSetCellStringValue(datetostr(t51.dat,'DD.MM.YYYY'),cnt,1,cnt,1);
xlSetCellStringValue(t51.plnodok,cnt,2,cnt,2);
xlSetCellNumberValue(t51.sumplat,cnt,3,cnt,3);
xlSetCellNumberValue(t51.sumobor,cnt,4,cnt,4);
xlSetCellNumberValue(t51.sumplat-t51.sumobor,cnt,5,cnt,5);
}
xlKillExcel;
}
end;
end.
Re: Отчет по накладным
Добавлено: 05 фев 2014, 07:24
Алексей
рекомендую делать подробную логическую таблицу, передавать её в fastreport с нужным индексом, а там уже крутите данные как хотите. FR достаточно гибок, как оказалось, главное знать нужные галочки
Re: Отчет по накладным
Добавлено: 07 фев 2014, 11:37
Espada
дошел до того, что необходимо создать 2 массива, в один записывать названия, в другой количества. затем сделать цикл по 1-му массиву, на наличие совпадений, если совподение найдено, то во втором массиве, по индексам, необходимо сложить количества, а если нет,то просто записывается имя в первый массив а кол-во во второй.
пока, что есть только
Mtnved: ARRAY[1..1000] of String //массив наименований
Mkol: ARRAY[1..1000] of Double //массив количества
tnved:String // переменная имени
...
.create view attr_group
From spsopr, katmc, groupmc, attrnam,attrval
Where
((
спецификацияМЦ_нрек == spsopr.nrec and
Spsopr.cmcusl == katmc.nrec and
Katmc.cgroupmc == groupmc.nrec and
Word(1432) == attrnam.wtable and
‘Код ТНВЭД’ == attrnam.name and
Word(1432) == attrval.wtable and
Groupmc.nrec == attrval.crec and
Attrnam.nrec == attrval.cattrnam
));
...
.{table 'attr_group'
.begin
tnved := attr_group.attrval.vstring;
end.
.}
Подскажите пожалуйста, как составить цикл.
Re: Отчет по накладным
Добавлено: 07 фев 2014, 11:57
edward_K
эх - это даже не вчерашний день, а позавчерашний. Кто мешает вам юзать временную таблу или на крайняк какую либо из пользовательской схемы - типа tempdesgr?
Так то цикл по массивам будет .{while
Re: Отчет по накладным
Добавлено: 07 фев 2014, 13:43
Espada
edward_K писал(а):Так то цикл по массивам будет .{while
Начал цикл, как написать, что если i-ы элемент массива будет равен tnved, то он в Mtnved имя не записывается а количество прибавляется( в массиве MKol)?
...
.{while Mtnved
<> 0
.begin
i := i+1;
if(Mtnved == tnved)
{
}
End.
.}
...
Re: Отчет по накладным
Добавлено: 07 фев 2014, 13:47
Den
MKol:=MKol+spsopr.kol ?
Re: Отчет по накладным
Добавлено: 07 фев 2014, 14:23
Espada
Den писал(а):MKol:=MKol+spsopr.kol ?
Это безусловно так. Спасибо)
Re: Отчет по накладным
Добавлено: 07 фев 2014, 14:25
oiko
Ни в коем случае не используйте spsopr.kol только spsopr.kolfact
просто типа 201 мало есть еще возврат
Re: Отчет по накладным
Добавлено: 07 фев 2014, 15:27
m0p3e
Den писал(а):MKol:=MKol+spsopr.kol ?
Сейчас модно так:
MKol+=spsopr.kol;
Re: Отчет по накладным
Добавлено: 07 фев 2014, 17:05
Espada
Да ребят фигня какае-то получается... я и так не гений, а ещё и пятница...
...
.{while Mtnved <> 0
.begin
i := i+1;
if(Mtnved = tnved)
{
tnved:= Mtnved;
MKol +=spsopr.kol;
}
else tnved := Mtnved[i+1];
End.
...
если в массиве Mtnved существует название, то его не записывать, а добавить количество в массив Mkol, а если названия нет, то дописать в первую свободную строку ну и количество тоже. как должно выглядеть вот эта штука подскажите плиз.
Re: Отчет по накладным
Добавлено: 07 фев 2014, 17:36
m0p3e
Espada писал(а):Да ребят фигня какае-то получается... я и так не гений, а ещё и пятница...
...
.{while Mtnved <> 0
.begin
i := i+1;
if(Mtnved = tnved)
{
tnved:= Mtnved;
MKol +=spsopr.kol;
}
else tnved := Mtnved[i+1];
End.
...
если в массиве Mtnved существует название, то его не записывать, а добавить количество в массив Mkol, а если названия нет, то дописать в первую свободную строку ну и количество тоже. как должно выглядеть вот эта штука подскажите плиз.
edvard правильно к времянкам отсылает. Как-то так делай:
Код: Выделить всё
table struct temptable
(
name : string
,kol : double
)
with index
(
a0 = name
);
.................
.create view b as select * from temptable;
.................
.procedure AddValue(n:string;k:double)
begin
if b.getfirst temptable where (( n == temptable.name )) = tsOk
{
b.temptable.kol += k;
b.update current temptable;
}
else
{
b.temptable.name := n;
b.temptable.kol := k;
b.insert current temptable;
};
end.
..................
.begin
AddValue(tnved,spsopr.kolfact)
end.