:: Visual Foxpro, Foxpro for DOS
Перекрестная таблица SQL-но
LUCIAN
Автор

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
Для построения перекрестной таблицы можно использовать DO (_GENXTAB)
_GENXTAB удобно использовать ,когда исходная таблица состоит из 3-х полей.
Ниже привожу примеры как формировать перекрестные таблицы без _GENXTAB
В отличие от _GENXTAB ниже приводимые коды используют только SQL-запросы
без create cursor,dimension и replace как в _GENXTAB
* СЛЕДУЮЩИЙ КОД ПОКАЗЫВАЕТ КАК ИЗ ТАБЛИЦЫ ПРОВОДОК БУХ,СЧЕТОВ ПОЛУЧИТЬ ШАХМАТКУ БУХ,СЧЕТОВ
SELE 0
CREATE CURSOR PRW (DEB C(8),KRD C(8),SUMA N(18,2))
INSERT INTO PRW VALUES ('08/1 ','60 ',-8337.55)
INSERT INTO PRW VALUES ('10/1 ','10/1 ',97163.83)
INSERT INTO PRW VALUES ('10/1 ','60 ',89227.96)
INSERT INTO PRW VALUES ('10/1 ','71 ',159.62)
INSERT INTO PRW VALUES ('10/10 ','10/10 ',275.24)
INSERT INTO PRW VALUES ('10/10 ','60 ',405.60)
INSERT INTO PRW VALUES ('10/10 ','71 ',35.32)
INSERT INTO PRW VALUES ('10/11/1 ','23/2/2 ',274.57)
INSERT INTO PRW VALUES ('10/11/1 ','23/2/4 ',2950.73)
INSERT INTO PRW VALUES ('10/11/2 ','10/10 ',126.92)
INSERT INTO PRW VALUES ('10/13 ','10/11/1 ',1409.91)
INSERT INTO PRW VALUES ('10/13 ','10/9/1 ',890.61)
INSERT INTO PRW VALUES ('10/13/1 ','10/11/2 ',69.37)
INSERT INTO PRW VALUES ('10/14 ','10/14 ',265.27)
INSERT INTO PRW VALUES ('10/14 ','43 ',12461.72)
INSERT INTO PRW VALUES ('10/2 ','10/2 ',41753.82)
INSERT INTO PRW VALUES ('10/2 ','23/3/1 ',846.32)
INSERT INTO PRW VALUES ('10/2 ','60 ',37184.85)
INSERT INTO PRW VALUES ('10/3 ','10/3 ',3881.71)
INSERT INTO PRW VALUES ('10/3 ','60 ',3636.98)
INSERT INTO PRW VALUES ('10/3 ','71 ',209.91)
INSERT INTO PRW VALUES ('10/5 ','10/2 ',646.17)
INSERT INTO PRW VALUES ('10/5 ','10/5 ',3470.85)
INSERT INTO PRW VALUES ('10/5 ','60 ',1232.01)
INSERT INTO PRW VALUES ('10/5 ','71 ',186.11)
INSERT INTO PRW VALUES ('10/6 ','10/1 ',67.79)
INSERT INTO PRW VALUES ('10/6 ','10/11/1 ',30.47)
INSERT INTO PRW VALUES ('10/6 ','10/14 ',179.16)
INSERT INTO PRW VALUES ('10/6 ','10/2 ',46.59)
INSERT INTO PRW VALUES ('10/6 ','10/5 ',2.97)
INSERT INTO PRW VALUES ('10/6 ','10/9/1 ',45.25)
INSERT INTO PRW VALUES ('10/6 ','20 ',97.92)
INSERT INTO PRW VALUES ('10/6 ','23/2/2 ',0.33)
INSERT INTO PRW VALUES ('10/6 ','23/2/4 ',1.82)
INSERT INTO PRW VALUES ('10/6 ','23/3/1 ',9.08)
INSERT INTO PRW VALUES ('10/7 ','10/4 ',969.77)
INSERT INTO PRW VALUES ('10/9 ','10/9 ',171.57)
INSERT INTO PRW VALUES ('10/9 ','60 ',4997.87)
INSERT INTO PRW VALUES ('10/9 ','71 ',136.46)
INSERT INTO PRW VALUES ('10/9/1 ','10/9 ',5475.25)
INSERT INTO PRW VALUES ('10/9/1 ','10/9/1 ',7.74)
INSERT INTO PRW VALUES ('16 ','60 ',272.61)
* ФОРМИРУЕМ ИТОГОВУЮ СТРОКУ И ИТОГОВЫЙ СТОЛБЕЦ
INSERT INTO PRW SELECT 'Итого ',KRD, SUM(SUMA) FROM PRW GROUP BY 1,2
INSERT INTO PRW SELECT DEB,'Итого ', SUM(SUMA) FROM PRW GROUP BY 1,2
*СТОЛБЦЫ БУДУЩЕЙ ШАХМАТКИ ПОЛУЧИМ ОТСЮДА
SELECT DISTINCT krd FROM prw ORDER BY KRD INTO CURSOR CKRD
* НАЧИНАЕМ ФОРМИРОВАТЬ ТЕКСТ ЗАПРОСА ДЛЯ ШАХМАТКИ
TEXT TO lcSQLSelectString TEXTMERGE NOSHOW
SELECT deb
ENDTEXT
*ФОРМИРУЕМ ТЕКСТ ЗАПРОСА ДЛЯ ПОСТРОЕНИЯ СТОЛБЦОВ ШАХМАТКИ
SELECT CKRD
SCAN
TEXT TO lcSQLSelectString ADDITIVE TEXTMERGE NOSHOW
,SUM(IIF(KRD = [<<CKRD.KRD>>],SUMA*1,SUMA*0)) K_<<CHRTRAN(CKRD.KRD,"/","_")>>
ENDTEXT
ENDSCAN
TEXT TO lcSQLSelectString ADDITIVE TEXTMERGE NOSHOW
FROM PRW GROUP BY 1 INTO CURSOR SAXM
ENDTEXT
=EXECSCRIPT(lcSQLSelectString )
BROW
* СЛЕДУЮЩИЙ КОД ПОКАЗЫВАЕТ КАК ИЗ ТАБЛИЦЫ РАСХОДА МАТЕРИАЛОВ НА ИЗДЕЛИЯ ПОЛУЧИТЬ СООТВ. ШАХМАТКУ
SELE 0
CREATE CURSOR CRAS (ID_TOV I(4),NMAT C(30),ED_IZM C(4),CENA N(18,2),ID_RAS I(4),NAMR C(30),KOL N(18,2),SUMA N(18,2))
INSERT INTO CRAS VALUES (1343,'Болт м10*30.58.019/7798 ','КГ ',2.41,14953,'Сеялка спу-6д-01 ',0.19,0.45)
INSERT INTO CRAS VALUES (1343,'Болт м10*30.58.019/7798 ','КГ ',2.41,14954,'Сеялка спу-6л-01 ',0.06,0.15)
INSERT INTO CRAS VALUES (1352,'Болт м6*16.58.019/7798 ','КГ ',2.37,14936,'Сеялка ств-12 ',0.90,2.13)
INSERT INTO CRAS VALUES (494,'Велопропилен ','КГ ',6.42,14937,'Сеялка спу-4д ',0.18,1.12)
INSERT INTO CRAS VALUES (494,'Велопропилен ','КГ ',6.42,14953,'Сеялка спу-6д-01 ',0.15,0.96)
INSERT INTO CRAS VALUES (494,'Велопропилен ','КГ ',6.42,14954,'Сеялка спу-6л-01 ',0.05,0.32)
INSERT INTO CRAS VALUES (1153,'Гайка м12.8.016 гост 5915 ','КГ ',2.90,14937,'Сеялка спу-4д ',0.67,1.95)
INSERT INTO CRAS VALUES (1417,'Гайка м12.8.016 гост 5915 ','КГ ',3.51,14953,'Сеялка спу-6д-01 ',0.48,1.68)
INSERT INTO CRAS VALUES (1417,'Гайка м12.8.016 гост 5915 ','КГ ',3.51,14954,'Сеялка спу-6л-01 ',0.18,0.62)
INSERT INTO CRAS VALUES (1153,'Гайка м12.8.016 гост 5915 ','КГ ',2.90,14936,'Сеялка ств-12 ',0.70,2.04)
INSERT INTO CRAS VALUES (1417,'Гайка м12.8.016 гост 5915 ','КГ ',3.51,14936,'Сеялка ств-12 ',0.90,3.15)
INSERT INTO CRAS VALUES (993,'Гайка м4.5.016 гост 5915 ','КГ ',0.53,14937,'Сеялка спу-4д ',0.01,0.00)
INSERT INTO CRAS VALUES (993,'Гайка м4.5.016 гост 5915 ','КГ ',0.53,14953,'Сеялка спу-6д-01 ',0.01,0.00)
INSERT INTO CRAS VALUES (993,'Гайка м4.5.016 гост 5915 ','КГ ',0.53,14954,'Сеялка спу-6л-01 ',0.00,0.00)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14937,'Сеялка спу-4д ',0.14,0.31)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14953,'Сеялка спу-6д-01 ',0.09,0.20)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14954,'Сеялка спу-6л-01 ',0.03,0.07)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14936,'Сеялка ств-12 ',0.15,0.33)
INSERT INTO CRAS VALUES (1134,'Гайка м6.8.016 гост 5915 ','КГ ',2.20,14936,'Сеялка ств-12 ',0.14,0.32)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14937,'Сеялка спу-4д ',0.04,0.12)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14953,'Сеялка спу-6д-01 ',0.04,0.10)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14954,'Сеялка спу-6л-01 ',0.01,0.03)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14936,'Сеялка ств-12 ',0.03,0.09)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14937,'Сеялка спу-4д ',5.29,17.33)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14953,'Сеялка спу-6д-01 ',2.88,9.45)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14954,'Сеялка спу-6л-01 ',0.96,3.15)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14936,'Сеялка ств-12 ',47.75,156.62)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-лта-св5 ','КГ ',3.28,14937,'Сеялка спу-4д ',2.69,8.82)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-лта-св5 ','КГ ',3.28,14954,'Сеялка спу-6л-01 ',0.21,0.69)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-лта-св5 ','КГ ',3.28,14936,'Сеялка ств-12 ',0.06,0.20)
INSERT INTO CRAS VALUES (36750,'Леска 0.4мм ','М ',19.50,14937,'Сеялка спу-4д ',0.02,0.44)
INSERT INTO CRAS VALUES (36750,'Леска 0.4мм ','М ',19.50,14953,'Сеялка спу-6д-01 ',0.02,0.37)
INSERT INTO CRAS VALUES (36750,'Леска 0.4мм ','М ',19.50,14954,'Сеялка спу-6л-01 ',0.01,0.12)
INSERT INTO CRAS VALUES (31851,'Пластикат "BAYBLEND" ','КГ ',7.09,14936,'Сеялка ств-12 ',5.04,35.73)
INSERT INTO CRAS VALUES (31851,'Пластикат авс-2020-30 (черный)','КГ ',7.09,14937,'Сеялка спу-4д ',0.84,5.96)
INSERT INTO CRAS VALUES (31851,'Пластикат авс-2020-30 (черный)','КГ ',7.09,14953,'Сеялка спу-6д-01 ',0.36,2.55)
INSERT INTO CRAS VALUES (31851,'Пластикат авс-2020-30 (черный)','КГ ',7.09,14954,'Сеялка спу-6л-01 ',0.12,0.85)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14937,'Сеялка спу-4д ',105.67,286.78)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14953,'Сеялка спу-6д-01 ',70.20,190.52)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14954,'Сеялка спу-6л-01 ',23.40,63.51)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14936,'Сеялка ств-12 ',29.20,79.24)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14937,'Сеялка спу-4д ',68.46,185.79)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14953,'Сеялка спу-6д-01 ',46.13,125.18)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14954,'Сеялка спу-6л-01 ',15.38,41.73)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14936,'Сеялка ств-12 ',22.55,61.20)
INSERT INTO CRAS VALUES (31851,'Пластикат700-314абс/серый ','КГ ',7.09,14937,'Сеялка спу-4д ',50.15,355.56)
INSERT INTO CRAS VALUES (31851,'Пластикат700-314абс/серый ','КГ ',7.09,14953,'Сеялка спу-6д-01 ',33.48,237.35)
INSERT INTO CRAS VALUES (31851,'Пластикат700-314абс/серый ','КГ ',7.09,14954,'Сеялка спу-6л-01 ',11.16,79.12)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14937,'Сеялка спу-4д ',24.96,81.87)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14953,'Сеялка спу-6д-01 ',19.13,62.74)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14954,'Сеялка спу-6л-01 ',6.43,21.08)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14936,'Сеялка ств-12 ',23.96,78.59)
INSERT INTO CRAS VALUES (295,'Полистирол псм-115 ','КГ ',0.40,14936,'Сеялка ств-12 ',2.70,1.08)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14937,'Сеялка спу-4д ',0.50,1.04)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14953,'Сеялка спу-6д-01 ',0.33,0.69)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14954,'Сеялка спу-6л-01 ',0.11,0.23)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14936,'Сеялка ств-12 ',0.74,1.55)
INSERT INTO CRAS VALUES (931,'Полиэт.желт.пэвд 15803-20 ','КГ ',4.33,14936,'Сеялка ств-12 ',0.01,0.04)
INSERT INTO CRAS VALUES (36708,'Полиэт.желт.пэвд 15803-20 ','КГ ',2.08,14936,'Сеялка ств-12 ',0.84,1.75)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14937,'Сеялка спу-4д ',0.71,1.99)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14953,'Сеялка спу-6д-01 ',0.32,0.90)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14954,'Сеялка спу-6л-01 ',0.11,0.30)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14936,'Сеялка ств-12 ',0.57,1.59)
INSERT INTO CRAS VALUES (30477,'Резина 7-ирп-1347 ','КГ ',5.59,14937,'Сеялка спу-4д ',3.36,18.78)
INSERT INTO CRAS VALUES (30477,'Резина 7-ирп-1347 ','КГ ',5.59,14953,'Сеялка спу-6д-01 ',0.30,1.68)
INSERT INTO CRAS VALUES (30477,'Резина 7-ирп-1347 ','КГ ',5.59,14954,'Сеялка спу-6л-01 ',0.10,0.56)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14937,'Сеялка спу-4д ',0.09,0.45)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14953,'Сеялка спу-6д-01 ',0.04,0.19)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14954,'Сеялка спу-6л-01 ',0.01,0.06)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14936,'Сеялка ств-12 ',2.24,11.11)
INSERT INTO CRAS VALUES (30477,'Смесь резин. Vб-22-14-781 ','КГ ',5.59,14937,'Сеялка спу-4д ',8.15,45.58)
INSERT INTO CRAS VALUES (30477,'Смесь резин. Vб-22-14-781 ','КГ ',5.59,14953,'Сеялка спу-6д-01 ',5.24,29.30)
INSERT INTO CRAS VALUES (30477,'Смесь резин. Vб-22-14-781 ','КГ ',5.59,14954,'Сеялка спу-6л-01 ',1.75,9.77)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14937,'Сеялка спу-4д ',2.78,15.15)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14953,'Сеялка спу-6д-01 ',6.18,33.69)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14954,'Сеялка спу-6л-01 ',2.06,11.23)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14936,'Сеялка ств-12 ',15.83,86.27)
INSERT INTO CRAS VALUES (931,'Супер концент.2600 желтый ','КГ ',4.33,14936,'Сеялка ств-12 ',0.01,0.04)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14937,'Сеялка спу-4д ',0.79,9.40)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14953,'Сеялка спу-6д-01 ',0.77,9.11)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14954,'Сеялка спу-6л-01 ',0.26,3.04)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14936,'Сеялка ств-12 ',0.26,3.09)
INSERT INTO CRAS VALUES (930,'Суперконц.черный MAXITEN ','КГ ',1.92,14936,'Сеялка ств-12 ',0.30,0.58)
* ФОРМИРУЕМ ЗАПИСИ ДЛЯ ИТОГОВОЙ СТРОКИ И ИТОГОВОГО СТОЛБЦА
INSERT INTO CRAS SELECT 999999,PADR('Итого по изделию',30)," ",CAST(0 as N(18,2)),ID_RAS,NAMR,SUM(KOL),SUM(SUMA) FROM CRAS GROUP BY 1,2,3,4,5,6
INSERT INTO CRAS SELECT ID_TOV,NMAT,ED_IZM,CENA,999999,PADR('Итого материала',30),SUM(KOL),SUM(SUMA) FROM CRAS GROUP BY 1,2,3,4,5,6
*СТОЛБЦЫ БУДУЩЕЙ ШАХМАТКИ ПОЛУЧИМ ОТСЮДА
SELECT DISTINCT ID_RAS,NAMR FROM cras INTO CURSOR CID
* НАЧИНАЕМ ФОРМИРОВАТЬ ТЕКСТ ЗАПРОСА ДЛЯ ШАХМАТКИ
TEXT TO lcSQLSelectString TEXTMERGE NOSHOW
SELECT ID_TOV,NMAT,ED_IZM,CENA
ENDTEXT
*ФОРМИРУЕМ ТЕКСТ ЗАПРОСА ДЛЯ ПОСТРОЕНИЯ СТОЛБЦОВ ШАХМАТКИ
SELECT CID
SCAN
TEXT TO lcSQLSelectString ADDITIVE TEXTMERGE NOSHOW
,SUM(IIF(ID_RAS = <<CID.ID_RAS>>,KOL*1,KOL*0)) K<<CID.ID_RAS>>,SUM(IIF(ID_RAS = <<CID.ID_RAS>>,SUMA*1,SUMA*0)) <<CHRTRAN(RTRIM(CID.NAMR)," -","__")>>
ENDTEXT
ENDSCAN
TEXT TO lcSQLSelectString ADDITIVE TEXTMERGE NOSHOW
FROM CRAS GROUP BY 1,2,3,4 INTO CURSOR SAXM
ENDTEXT
=EXECSCRIPT(lcSQLSelectString )
BROW
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Ммм... Ну хорошо, добротненько исполнили идею. Сделайте функцию универсальной, тогда потомки скажут вам спасибо.
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
В целом с Павлом согласен.
Чуток не нравится
* НАЧИНАЕМ ФОРМИРОВАТЬ ТЕКСТ ЗАПРОСА ДЛЯ ШАХМАТКИ
TEXT TO lcSQLSelectString TEXTMERGE NOSHOW
SELECT ID_TOV,NMAT,ED_IZM,CENA
ENDTEXT
*ФОРМИРУЕМ ТЕКСТ ЗАПРОСА ДЛЯ ПОСТРОЕНИЯ СТОЛБЦОВ ШАХМАТКИ
SELECT CID
SCAN
TEXT TO lcSQLSelectString ADDITIVE TEXTMERGE NOSHOW
,SUM(IIF(ID_RAS = <<CID.ID_RAS>>,KOL*1,KOL*0)) K<<CID.ID_RAS>>,SUM(IIF(ID_RAS = <<CID.ID_RAS>>,SUMA*1,SUMA*0)) <<CHRTRAN(RTRIM(CID.NAMR)," -","__")>>
ENDTEXT
ENDSCAN
TEXT TO lcSQLSelectString ADDITIVE TEXTMERGE NOSHOW
FROM CRAS GROUP BY 1,2,3,4 INTO CURSOR SAXM
ENDTEXT

Я бы рисовал так.
* НАЧИНАЕМ ФОРМИРОВАТЬ ТЕКСТ ЗАПРОСА ДЛЯ ШАХМАТКИ
lcFlds = ''
SELECT CID
SCAN
lcFlds = lcFlds;
+textmerge([,SUM(IIF(ID_RAS = <<CID.ID_RAS>>,KOL*1,KOL*0)) K<<CID.ID_RAS>>,SUM(IIF(ID_RAS = <<CID.ID_RAS>>,SUMA*1,SUMA*0)) <<CHRTRAN(RTRIM(CID.NAMR)," -","__")>> ])
ENDSCAN
TEXT TO lcSQLSelectString TEXTMERGE NOSHOW
SELECT ID_TOV,NMAT,ED_IZM,CENA
<<lcFlds>>
FROM CRAS GROUP BY 1,2,3,4 INTO CURSOR SAXM
ENDTEXT
Т.е. сборка всего запроса в одном TEXT...ENDTEXT.
Более читабельно и сразу видно что куда в GROUP BY 1,2,3,4.

Ну и, насколько понял это ветка от соседней темы.
Я там говорил про шахматку.
Имелось ввиду выводить в гриде результат функции типа
ControlSource = getval(rowID, colID)
т.е. вообще не формировать широкий курсор.

Ну да не суть важно.



Исправлено 2 раз(а). Последнее : Taran, 20.02.17 14:43
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Taran
Ну и, насколько понял это ветка от соседней темы.
Я там говорил про шахматку.
Нее, он в другой теме спрашивал. И вишь-ты, сам придумал подход и реализовал.

Taran
Имелось ввиду выводить в гриде результат функции типа
ControlSource = getval(rowID, colID)
т.е. вообще не формировать широкий курсор.
А вот здесь я немного не соглашусь. Очень нетривиально надо контролы написать, что б они не стали ReadOnly, когда ControlSource - функция. Вот тут как раз понадобится и контейнер и собственный велосипед с педалями.
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
LUCIAN
Автор

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
pasha_usue
Taran
Ну и, насколько понял это ветка от соседней темы.
Я там говорил про шахматку.
Нее, он в другой теме спрашивал. И вишь-ты, сам придумал подход и реализовал.
.
На предприятии решил избавится от EXcell отчётов в цехах.Excell отчёт цеха имеет вид шахматки,поэтому решил,
чтобы пользователь при надобности из моего отчёта мог получить excell-шахматку отчёт,а соседней темы не читал и никого
не спрашивал.



Исправлено 1 раз(а). Последнее : LUCIAN, 20.02.17 15:27
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
LUCIAN
Автор

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
pasha_usue
Ммм... Ну хорошо, добротненько исполнили идею. Сделайте функцию универсальной, тогда потомки скажут вам спасибо.
Сделал это функцию более универсальной и назвал её SAXMGEN.Передаваемым параметром для этой функции явл. массив порождённый
функцией AFIELDS от исходной таблицы.
SELE 0
CREATE CURSOR CRAS (ID_TOV I(4),NMAT C(30),ED_IZM C(4),CENA N(18,2),ID_RAS I(4),NAMR C(30),KOL N(18,2),SUMA N(18,2))
INSERT INTO CRAS VALUES (1343,'Болт м10*30.58.019/7798 ','КГ ',2.41,14953,'Сеялка спу-6д-01 ',0.19,0.45)
INSERT INTO CRAS VALUES (1343,'Болт м10*30.58.019/7798 ','КГ ',2.41,14954,'Сеялка спу-6л-01 ',0.06,0.15)
INSERT INTO CRAS VALUES (1352,'Болт м6*16.58.019/7798 ','КГ ',2.37,14936,'Сеялка ств-12 ',0.90,2.13)
INSERT INTO CRAS VALUES (494,'Велопропилен ','КГ ',6.42,14937,'Сеялка спу-4д ',0.18,1.12)
INSERT INTO CRAS VALUES (494,'Велопропилен ','КГ ',6.42,14953,'Сеялка спу-6д-01 ',0.15,0.96)
INSERT INTO CRAS VALUES (494,'Велопропилен ','КГ ',6.42,14954,'Сеялка спу-6л-01 ',0.05,0.32)
INSERT INTO CRAS VALUES (1153,'Гайка м12.8.016 гост 5915 ','КГ ',2.90,14937,'Сеялка спу-4д ',0.67,1.95)
INSERT INTO CRAS VALUES (1417,'Гайка м12.8.016 гост 5915 ','КГ ',3.51,14953,'Сеялка спу-6д-01 ',0.48,1.68)
INSERT INTO CRAS VALUES (1417,'Гайка м12.8.016 гост 5915 ','КГ ',3.51,14954,'Сеялка спу-6л-01 ',0.18,0.62)
INSERT INTO CRAS VALUES (1153,'Гайка м12.8.016 гост 5915 ','КГ ',2.90,14936,'Сеялка ств-12 ',0.70,2.04)
INSERT INTO CRAS VALUES (1417,'Гайка м12.8.016 гост 5915 ','КГ ',3.51,14936,'Сеялка ств-12 ',0.90,3.15)
INSERT INTO CRAS VALUES (993,'Гайка м4.5.016 гост 5915 ','КГ ',0.53,14937,'Сеялка спу-4д ',0.01,0.00)
INSERT INTO CRAS VALUES (993,'Гайка м4.5.016 гост 5915 ','КГ ',0.53,14953,'Сеялка спу-6д-01 ',0.01,0.00)
INSERT INTO CRAS VALUES (993,'Гайка м4.5.016 гост 5915 ','КГ ',0.53,14954,'Сеялка спу-6л-01 ',0.00,0.00)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14937,'Сеялка спу-4д ',0.14,0.31)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14953,'Сеялка спу-6д-01 ',0.09,0.20)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14954,'Сеялка спу-6л-01 ',0.03,0.07)
INSERT INTO CRAS VALUES (1134,'Гайка м6.5.016 гост 5915 ','КГ ',2.20,14936,'Сеялка ств-12 ',0.15,0.33)
INSERT INTO CRAS VALUES (1134,'Гайка м6.8.016 гост 5915 ','КГ ',2.20,14936,'Сеялка ств-12 ',0.14,0.32)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14937,'Сеялка спу-4д ',0.04,0.12)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14953,'Сеялка спу-6д-01 ',0.04,0.10)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14954,'Сеялка спу-6л-01 ',0.01,0.03)
INSERT INTO CRAS VALUES (1364,'Гайка м8.5.016 гост 5915 ','КГ ',2.90,14936,'Сеялка ств-12 ',0.03,0.09)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14937,'Сеялка спу-4д ',5.29,17.33)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14953,'Сеялка спу-6д-01 ',2.88,9.45)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14954,'Сеялка спу-6л-01 ',0.96,3.15)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-л-св30 ','КГ ',3.28,14936,'Сеялка ств-12 ',47.75,156.62)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-лта-св5 ','КГ ',3.28,14937,'Сеялка спу-4д ',2.69,8.82)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-лта-св5 ','КГ ',3.28,14954,'Сеялка спу-6л-01 ',0.21,0.69)
INSERT INTO CRAS VALUES (36630,'Гродномид па6-лта-св5 ','КГ ',3.28,14936,'Сеялка ств-12 ',0.06,0.20)
INSERT INTO CRAS VALUES (36750,'Леска 0.4мм ','М ',19.50,14937,'Сеялка спу-4д ',0.02,0.44)
INSERT INTO CRAS VALUES (36750,'Леска 0.4мм ','М ',19.50,14953,'Сеялка спу-6д-01 ',0.02,0.37)
INSERT INTO CRAS VALUES (36750,'Леска 0.4мм ','М ',19.50,14954,'Сеялка спу-6л-01 ',0.01,0.12)
INSERT INTO CRAS VALUES (31851,'Пластикат "BAYBLEND" ','КГ ',7.09,14936,'Сеялка ств-12 ',5.04,35.73)
INSERT INTO CRAS VALUES (31851,'Пластикат авс-2020-30 (черный)','КГ ',7.09,14937,'Сеялка спу-4д ',0.84,5.96)
INSERT INTO CRAS VALUES (31851,'Пластикат авс-2020-30 (черный)','КГ ',7.09,14953,'Сеялка спу-6д-01 ',0.36,2.55)
INSERT INTO CRAS VALUES (31851,'Пластикат авс-2020-30 (черный)','КГ ',7.09,14954,'Сеялка спу-6л-01 ',0.12,0.85)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14937,'Сеялка спу-4д ',105.67,286.78)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14953,'Сеялка спу-6д-01 ',70.20,190.52)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14954,'Сеялка спу-6л-01 ',23.40,63.51)
INSERT INTO CRAS VALUES (951,'Пластикат пвх ш-62 ','КГ ',2.71,14936,'Сеялка ств-12 ',29.20,79.24)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14937,'Сеялка спу-4д ',68.46,185.79)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14953,'Сеялка спу-6д-01 ',46.13,125.18)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14954,'Сеялка спу-6л-01 ',15.38,41.73)
INSERT INTO CRAS VALUES (952,'Пластикат пвх ув-11/3 ','КГ ',2.71,14936,'Сеялка ств-12 ',22.55,61.20)
INSERT INTO CRAS VALUES (31851,'Пластикат700-314абс/серый ','КГ ',7.09,14937,'Сеялка спу-4д ',50.15,355.56)
INSERT INTO CRAS VALUES (31851,'Пластикат700-314абс/серый ','КГ ',7.09,14953,'Сеялка спу-6д-01 ',33.48,237.35)
INSERT INTO CRAS VALUES (31851,'Пластикат700-314абс/серый ','КГ ',7.09,14954,'Сеялка спу-6л-01 ',11.16,79.12)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14937,'Сеялка спу-4д ',24.96,81.87)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14953,'Сеялка спу-6д-01 ',19.13,62.74)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14954,'Сеялка спу-6л-01 ',6.43,21.08)
INSERT INTO CRAS VALUES (36630,'Полиамид па6-210/310 ','КГ ',3.28,14936,'Сеялка ств-12 ',23.96,78.59)
INSERT INTO CRAS VALUES (295,'Полистирол псм-115 ','КГ ',0.40,14936,'Сеялка ств-12 ',2.70,1.08)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14937,'Сеялка спу-4д ',0.50,1.04)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14953,'Сеялка спу-6д-01 ',0.33,0.69)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14954,'Сеялка спу-6л-01 ',0.11,0.23)
INSERT INTO CRAS VALUES (36708,'Полиэт. пэвд 15803-20 ','КГ ',2.08,14936,'Сеялка ств-12 ',0.74,1.55)
INSERT INTO CRAS VALUES (931,'Полиэт.желт.пэвд 15803-20 ','КГ ',4.33,14936,'Сеялка ств-12 ',0.01,0.04)
INSERT INTO CRAS VALUES (36708,'Полиэт.желт.пэвд 15803-20 ','КГ ',2.08,14936,'Сеялка ств-12 ',0.84,1.75)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14937,'Сеялка спу-4д ',0.71,1.99)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14953,'Сеялка спу-6д-01 ',0.32,0.90)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14954,'Сеялка спу-6л-01 ',0.11,0.30)
INSERT INTO CRAS VALUES (36707,'Полиэтилен 277-73 ','КГ ',2.79,14936,'Сеялка ств-12 ',0.57,1.59)
INSERT INTO CRAS VALUES (30477,'Резина 7-ирп-1347 ','КГ ',5.59,14937,'Сеялка спу-4д ',3.36,18.78)
INSERT INTO CRAS VALUES (30477,'Резина 7-ирп-1347 ','КГ ',5.59,14953,'Сеялка спу-6д-01 ',0.30,1.68)
INSERT INTO CRAS VALUES (30477,'Резина 7-ирп-1347 ','КГ ',5.59,14954,'Сеялка спу-6л-01 ',0.10,0.56)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14937,'Сеялка спу-4д ',0.09,0.45)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14953,'Сеялка спу-6д-01 ',0.04,0.19)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14954,'Сеялка спу-6л-01 ',0.01,0.06)
INSERT INTO CRAS VALUES (36742,'Резиновая смесь 7-B-14 ','КГ ',4.96,14936,'Сеялка ств-12 ',2.24,11.11)
INSERT INTO CRAS VALUES (30477,'Смесь резин. Vб-22-14-781 ','КГ ',5.59,14937,'Сеялка спу-4д ',8.15,45.58)
INSERT INTO CRAS VALUES (30477,'Смесь резин. Vб-22-14-781 ','КГ ',5.59,14953,'Сеялка спу-6д-01 ',5.24,29.30)
INSERT INTO CRAS VALUES (30477,'Смесь резин. Vб-22-14-781 ','КГ ',5.59,14954,'Сеялка спу-6л-01 ',1.75,9.77)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14937,'Сеялка спу-4д ',2.78,15.15)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14953,'Сеялка спу-6д-01 ',6.18,33.69)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14954,'Сеялка спу-6л-01 ',2.06,11.23)
INSERT INTO CRAS VALUES (30225,'Смесь резиновая я-7317(ф)-VII-','КГ ',5.45,14936,'Сеялка ств-12 ',15.83,86.27)
INSERT INTO CRAS VALUES (931,'Супер концент.2600 желтый ','КГ ',4.33,14936,'Сеялка ств-12 ',0.01,0.04)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14937,'Сеялка спу-4д ',0.79,9.40)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14953,'Сеялка спу-6д-01 ',0.77,9.11)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14954,'Сеялка спу-6л-01 ',0.26,3.04)
INSERT INTO CRAS VALUES (655,'Суперконцентрат скгп-501 синий','КГ ',11.88,14936,'Сеялка ств-12 ',0.26,3.09)
INSERT INTO CRAS VALUES (930,'Суперконц.черный MAXITEN ','КГ ',1.92,14936,'Сеялка ств-12 ',0.30,0.58)
nCount=AFIELDS(ASTR)
* (ID_TOV I(4),NMAT C(30),ED_IZM C(4),CENA N(18,2),ID_RAS I(4),NAMR C(30),KOL N(18,2),SUMA N(18,2))
FOR I=1 TO nCount
ASTR(I,5)=0
ENDFOR
* ПОМЕТИМ ПОЛЯ КОТОРЫЕ БУДУТ ГРУППИРОВАТЬ ПО СТРОКАМ
ASTR(1,5)=1
ASTR(2,5)=1
ASTR(3,5)=1
ASTR(4,5)=1
* ПОМЕТИМ ПОЛЯ КОТОРЫЕ БУДУТ ГРУППИРОВАТЬ ПО СТОЛБЦАМ
ASTR(5,5)=2
ASTR(6,5)=2
* ПОМЕТИМ СУМИРЕМЫЕ ПОЛЯ
ASTR(7,5)=3
ASTR(8,5)=3
DO SAXMGEN WITH ASTR
BROW
PROCEDURE SAXMGEN
PARAMETERS ASTRU
nCount=ALEN(ASTRU,1)
cTableAlias=ALIAS()
cGroup1 = ' GROUP BY '
FOR I = 1 TO nCount
IF ASTRU(I,5)=1
cGroup1 = cGroup1 + IIF(RIGHT(cGroup1,3)='BY ','',',')+LTRIM(STR(I))
ENDIF
ENDFOR
cGroup2 = cGroup1
FOR I = 1 TO nCount
IF ASTRU(I,5)=2
cGroup2 = cGroup2 + ',' + LTRIM(STR(I))
ENDIF
ENDFOR
* ФОРМИРУЕМ ЗАПИСЬ ДЛЯ ИТОГОВОЙ СТРОКИ
lcSQL = 'INSERT INTO '+cTableAlias+' SELECT '
FOR I=1 TO nCount
TYP= ASTRU(I,2)
DL = ASTRU(I,3)
KD = ASTRU(I,4)
IF ASTRU(I,5)=1
lcSQL = lcSQL + ;
IIF(RIGHT(lcSQL,3)='CT ','',',')+ICASE(TYP = 'C','['+REPLICATE(CHR(255),DL)+']',TYP = 'D','{^9999-12-31}',TYP = 'I','999999999',;
TYP = 'N',REPLICATE('9',DL-3)+'.'+REPLICATE('9',KD))
ENDIF
ENDFOR
FOR I=1 TO nCount
IF ASTRU(I,5)=2
lcSQL = lcSQL + ","+ASTRU(I,1)
ENDIF
ENDFOR
FOR I=1 TO nCount
IF ASTRU(I,5)=3
lcSQL = lcSQL + ","+"SUM("+ASTRU(I,1)+")"
ENDIF
ENDFOR
lcSQL = lcSQL + " FROM " +cTableAlias + cGroup2
=EXECSCRIPT(lcSQL)
* ФОРМИРУЕМ ЗАПИСЬ ДЛЯ ИТОГОВОГО СТОЛБЦА
lcSQL = 'INSERT INTO '+cTableAlias+' SELECT '
FOR I=1 TO nCount
IF ASTRU(I,5)=1
lcSQL = lcSQL + ;
IIF(RIGHT(lcSQL,3)='CT ','',',')+ASTRU(I,1)
ENDIF
ENDFOR
FOR I=1 TO nCount
TYP= ASTRU(I,2)
DL = ASTRU(I,3)
KD = ASTRU(I,4)
IF ASTRU(I,5)=2
lcSQL = lcSQL + ;
','+ICASE(TYP = 'C','['+REPLICATE(CHR(255),DL)+']',TYP = 'D','{^9999-12-31}',TYP = 'I','999999999',;
TYP = 'N',REPLICATE('9',DL-3)+'.'+REPLICATE('9',KD))
ENDIF
ENDFOR
FOR I=1 TO nCount
IF ASTRU(I,5)=3
lcSQL = lcSQL + ","+"SUM("+ASTRU(I,1)+")"
ENDIF
ENDFOR
lcSQL = lcSQL + " FROM " +cTableAlias + cGroup2
=EXECSCRIPT(lcSQL)
*СТОЛБЦЫ БУДУЩЕЙ ШАХМАТКИ ПОЛУЧИМ ОТСЮДА
lcSQL = 'SELECT DISTINCT '
cOrder = ' ORDER BY '
nOrd=0
FOR I=1 TO nCount
IF ASTRU(I,5)=2
lcSQL = lcSQL + IIF(RIGHT(lcSQL,3)='CT ','',',')+ASTRU(I,1)
nOrd=nOrd+1
cOrder = cOrder + IIF(nOrd=1,'',',')+LTRIM(STR(nOrd))
ENDIF
ENDFOR
lcSQL = lcSQL + " FROM " +cTableAlias + cOrder + " INTO CURSOR CID"
=EXECSCRIPT(lcSQL)
* НАЧИНАЕМ ФОРМИРОВАТЬ ТЕКСТ ЗАПРОСА ДЛЯ ШАХМАТКИ
lcSQL="SELECT "
FOR I=1 TO nCount
IF ASTRU(I,5)=1
lcSQL = lcSQL + ;
IIF(RIGHT(lcSQL,3)='CT ','',',')+ASTRU(I,1)
ENDIF
ENDFOR
*ФОРМИРУЕМ ТЕКСТ ЗАПРОСА ДЛЯ ПОСТРОЕНИЯ СТОЛБЦОВ ШАХМАТКИ
SELECT CID
SCAN
FOR I=1 TO nCount
TYP= ASTRU(I,2)
DL = ASTRU(I,3)
KD = ASTRU(I,4)
IF ASTRU(I,5)=3
NAMP=ASTRU(I,1)
lcSQL = lcSQL +',SUM('+ASTRU(I,1)+'*IIF('
FOR J=1 TO nCount
TYP= ASTRU(J,2)
DL = ASTRU(J,3)
KD = ASTRU(J,4)
IF ASTRU(J,5)=2
TEXT TO lcSQL ADDITIVE TEXTMERGE NOSHOW
<<IIF(RIGHT(lcSQL,3)='IF(','','AND ')>><<ASTRU(J,1)>>=<<IIF(TYP='C','[','')>><<EVALUATE('CID.'+ASTRU(J,1))>><<IIF(TYP='C',']','')>>
ENDTEXT
TEXT TO NAMP ADDITIVE TEXTMERGE NOSHOW
<<EVALUATE('CID.'+ASTRU(J,1))>>
ENDTEXT
ENDIF
ENDFOR
lcSQL = lcSQL + ',1,0)) '+CHRTRAN(RTRIM(NAMP)," -","__")
ENDIF
ENDFOR
ENDSCAN
TEXT TO lcSQL ADDITIVE TEXTMERGE NOSHOW
FROM <<cTableAlias>> <<cGroup1>> INTO CURSOR SAXM
ENDTEXT
=EXECSCRIPT(lcSQL)
ENDPROC
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
LUCIAN
Идея у вас верная, но исполнение тяжеловесное.
Зачем у вас для каждой строки свой цикл - делайте все в одном цикле, а потом собирайте итоговую строку.
Массив можно замеить строкой с перечислением полей через запятую, они так и войдут в формируемую строку.
От вкраплений TEXT...ENDTEXT тоже желательно избавиться.
Посмотрите в соседней теме - там я на примере трансформации табеля выложил два механизма формирования SELECT в цикле - у вас просто добавится строка с GROUP.
К тому же я нашел еще более простой и универсальный способ, но ваш код без переделки не подойдет.
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
(Вместо TEXT..ENDTEXT м одной строкой кода есть функция TEXTMERGE, удобная)
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
of63
(Вместо TEXT..ENDTEXT м одной строкой кода есть функция TEXTMERGE, удобная)
Читаемость кода страдает при этом безбожно.
Ratings: 0 negative/0 positive
Re: Перекрестная таблица SQL-но
LUCIAN
Автор

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
После некоторых изменений предлагаю такой код
PROCEDURE SAXMGEN
PARAMETERS ASTRU
LOCAL nCount,cTableAlias,cGroup1,cGroup2,lcSQL,TYP,DL,KD,ALCID,badchars
*ВЗЯТО ИЗ _GENXTAB
badchars = '/,-=:;!@#$%&*.<>()?[]\'+'+'+CHR(34)+CHR(39)+" "
nCount=ALEN(ASTRU,1)
cTableAlias=ALIAS()
cGroup1 = ' GROUP BY '
FOR I = 1 TO nCount
IF ASTRU(I,5)=1
cGroup1 = cGroup1 + IIF(RIGHT(cGroup1,3)='BY ','',',')+LTRIM(STR(I))
ENDIF
ENDFOR
cGroup2 = cGroup1
FOR I = 1 TO nCount
IF ASTRU(I,5)=2
cGroup2 = cGroup2 + ',' + LTRIM(STR(I))
ENDIF
ENDFOR
* ФОРМИРУЕМ ЗАПИСИ ДЛЯ ИТОГОВОЙ СТРОКИ
lcSQL = 'INSERT INTO '+cTableAlias+' SELECT '
FOR I=1 TO nCount
TYP= ASTRU(I,2)
DL = ASTRU(I,3)
KD = ASTRU(I,4)
IF ASTRU(I,5)=1
lcSQL = lcSQL + ;
IIF(RIGHT(lcSQL,3)='CT ','',',')+ICASE(TYP = 'C','['+REPLICATE(CHR(255),DL)+']',TYP = 'D','{^9999-12-31}', ;
TYP $ 'NFIYB',REPLICATE('9',18))
ENDIF
ENDFOR
FOR I=1 TO nCount
IF ASTRU(I,5)=2
lcSQL = lcSQL + ","+ASTRU(I,1)
ENDIF
ENDFOR
FOR I=1 TO nCount
IF ASTRU(I,5)=3
lcSQL = lcSQL + ","+"SUM("+ASTRU(I,1)+")"
ENDIF
ENDFOR
lcSQL = lcSQL + " FROM " +cTableAlias + cGroup2
=EXECSCRIPT(lcSQL)
* ФОРМИРУЕМ ЗАПИСИ ДЛЯ ИТОГОВОГО СТОЛБЦА
lcSQL = 'INSERT INTO '+cTableAlias+' SELECT '
FOR I=1 TO nCount
IF ASTRU(I,5)=1
lcSQL = lcSQL + ;
IIF(RIGHT(lcSQL,3)='CT ','',',')+ASTRU(I,1)
ENDIF
ENDFOR
FOR I=1 TO nCount
TYP= ASTRU(I,2)
DL = ASTRU(I,3)
KD = ASTRU(I,4)
IF ASTRU(I,5)=2
lcSQL = lcSQL + ;
','+ICASE(TYP = 'C','['+REPLICATE(CHR(255),DL)+']',TYP = 'D','{^9999-12-31}',TYP $ 'NFIYB',REPLICATE('9',18))
ENDIF
ENDFOR
FOR I=1 TO nCount
IF ASTRU(I,5)=3
lcSQL = lcSQL + ","+"SUM("+ASTRU(I,1)+")"
ENDIF
ENDFOR
lcSQL = lcSQL + " FROM " +cTableAlias + cGroup2
=EXECSCRIPT(lcSQL)
*СТОЛБЦЫ БУДУЩЕЙ ШАХМАТКИ ПОЛУЧИМ ОТСЮДА
lcSQL = 'SELECT DISTINCT '
cOrder = ' ORDER BY '
nOrd=0
FOR I=1 TO nCount
IF ASTRU(I,5)=2
lcSQL = lcSQL + IIF(RIGHT(lcSQL,3)='CT ','',',')+ASTRU(I,1)
nOrd=nOrd+1
cOrder = cOrder + IIF(nOrd=1,'',',')+LTRIM(STR(nOrd))
ENDIF
ENDFOR
ALCID=SYS(2015)
lcSQL = lcSQL + " FROM " +cTableAlias + cOrder + " INTO CURSOR " + ALCID
=EXECSCRIPT(lcSQL)
* НАЧИНАЕМ ФОРМИРОВАТЬ ТЕКСТ ЗАПРОСА ДЛЯ ШАХМАТКИ
lcSQL="SELECT "
FOR I=1 TO nCount
IF ASTRU(I,5)=1
lcSQL = lcSQL + ;
IIF(RIGHT(lcSQL,3)='CT ','',',')+ASTRU(I,1)
ENDIF
ENDFOR
*ФОРМИРУЕМ ТЕКСТ ЗАПРОСА ДЛЯ ПОСТРОЕНИЯ СТОЛБЦОВ ШАХМАТКИ
SELECT (ALCID)
SCAN
FOR I=1 TO nCount
IF ASTRU(I,5)=3
NAMP=ASTRU(I,1)
lcSQL = lcSQL +',SUM('+ASTRU(I,1)+'*IIF('
FOR J=1 TO nCount
TYP= ASTRU(J,2)
DL = ASTRU(J,3)
KD = ASTRU(J,4)
IF ASTRU(J,5)=2
TEXT TO lcSQL ADDITIVE TEXTMERGE NOSHOW
<<IIF(RIGHT(lcSQL,3)='IF(','','AND ')>><<ASTRU(J,1)>>=<<IIF(TYP='C','[','')>><<EVALUATE(ALCID+'.'+ASTRU(J,1))>><<IIF(TYP='C',']','')>>
ENDTEXT
TEXT TO NAMP ADDITIVE TEXTMERGE NOSHOW
<<EVALUATE(ALCID+'.'+ASTRU(J,1))>>
ENDTEXT
ENDIF
ENDFOR
lcSQL = lcSQL + ',1,0)) '+ CHRTRANC(RTRIM(NAMP),M.badchars,REPLICATE("_",LEN(M.badchars)-1))
ENDIF
ENDFOR
ENDSCAN
USE IN (ALCID)
TEXT TO lcSQL ADDITIVE TEXTMERGE NOSHOW
FROM <<cTableAlias>> <<cGroup1>> INTO CURSOR SAXM READWRITE
ENDTEXT
=EXECSCRIPT(lcSQL)
ENDPROC



Исправлено 3 раз(а). Последнее : LUCIAN, 10.03.17 09:55
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 dimag alex; Victoriacom Владимир Максимов  (Гостей: 19)

© 2000-2024 Fox Club 
Яндекс.Метрика