Отчет по накладным

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

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

Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Отчет по накладным

Сообщение Espada »

Здравствуйте, необходмо создать Отчет по накладной, в котором количество продукции с одинаковым наименованием будет складываться и вы водиться будет общее значение. Например
-Накладная-
1. Краска 123 | 20 банок
2. краска 117 | 10 Банок
3. краска 123 | 11 банок
4. краска 117 | 13 банок
Отчет должен получиться вида
1. Краска 123 | 31 Бан.
2. Краска 117 | 23 Бан.

Подскажите, как это можно реализовать? Спасибо
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Отчет по накладным

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

Re: Отчет по накладным

Сообщение 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;
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Отчет по накладным

Сообщение Zver »

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

Re: Отчет по накладным

Сообщение 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.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Отчет по накладным

Сообщение Алексей »

рекомендую делать подробную логическую таблицу, передавать её в fastreport с нужным индексом, а там уже крутите данные как хотите. FR достаточно гибок, как оказалось, главное знать нужные галочки :)
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Отчет по накладным

Сообщение 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.
.}


Подскажите пожалуйста, как составить цикл.
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Отчет по накладным

Сообщение edward_K »

эх - это даже не вчерашний день, а позавчерашний. Кто мешает вам юзать временную таблу или на крайняк какую либо из пользовательской схемы - типа tempdesgr?
Так то цикл по массивам будет .{while
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Отчет по накладным

Сообщение Espada »

edward_K писал(а):Так то цикл по массивам будет .{while
Начал цикл, как написать, что если i-ы элемент массива будет равен tnved, то он в Mtnved имя не записывается а количество прибавляется( в массиве MKol)?
...
.{while Mtnved <> 0
.begin
i := i+1;
if(Mtnved == tnved)
{

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

Re: Отчет по накладным

Сообщение Den »

MKol:=MKol+spsopr.kol ?
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Отчет по накладным

Сообщение Espada »

Den писал(а):MKol:=MKol+spsopr.kol ?

Это безусловно так. Спасибо)
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
oiko
Местный житель
Сообщения: 418
Зарегистрирован: 29 мар 2005, 17:49

Re: Отчет по накладным

Сообщение oiko »

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

Re: Отчет по накладным

Сообщение m0p3e »

Den писал(а):MKol:=MKol+spsopr.kol ?

Сейчас модно так:
MKol+=spsopr.kol;

:)
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Отчет по накладным

Сообщение Espada »

Да ребят фигня какае-то получается... я и так не гений, а ещё и пятница...
...
.{while Mtnved <> 0
.begin
i := i+1;
if(Mtnved = tnved)
{
tnved:= Mtnved;
MKol +=spsopr.kol;
}
else tnved := Mtnved[i+1];
End.
...
если в массиве Mtnved существует название, то его не записывать, а добавить количество в массив Mkol, а если названия нет, то дописать в первую свободную строку ну и количество тоже. как должно выглядеть вот эта штука подскажите плиз.
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Отчет по накладным

Сообщение 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.
Ответить