:: Visual Foxpro, Foxpro for DOS
Работа с запросом
legion54
Автор

Сообщений: 19
Дата регистрации: 06.10.2016
Добрый день. В фоксе не особо разбираюсь, отсюда и есть вопросы.
Делаю запрос
m.lccommand=[ set arithabort ON SELECT cnd FROM nd where mark like '%ТР ТС%']
IF SQL(m.lccommand, 'cmd') <> 0
RETURN .F.
ENDIF
дальше делаю еще один запрос
SCAN
m.lccommand=[ set arithabort ];
+[ SELECT id, pokaztype_id, nd_id, accred, pokazat_id, pokazat.ctitl, nd.mark, pokazattype.ctitl as ctitle ];
+[ FROM pokazatTRTS ];
+[ left join pokazat on pokazat.cpokaz = pokazatTRTS.pokazat_id ];
+[ left join nd on nd.cnd = pokazatTRTS.nd_id ];
+[ left join pokazattype on pokazattype.idpokaztype = pokazatTRTS.pokaztype_id ];
+[ where pokazatTRTS.nd_id = ] + cmd.cnd.value
IF SQL(m.lccommand, 'cmdnn') <> 0
RETURN .F.
ENDIF
lnRow = lnRow + 1;
.cells(lnRow ,1).Value = cmd.ctitl
.cells(lnRow ,2).Value = cmd.mark
.cells(lnRow ,3).Value = cmd.ctitle
ENDSCAN
и мне нужно во второй запрос подставить id из первого запроса и в дальнейшем вывести все это в excel.
как мне сделать выборку из первого запроса? на шарпе вроде всё понятно, а тут не получается сделать
Ratings: 0 negative/0 positive
Re: Работа с запросом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
legion54
cmd.cnd.value
Это что такое? CMD вроде как название полученного первым запросом курсора с данными. И адрес для обращение к данным курсора может состоять максимум их двух частей - имени курсора/таблицы и отделенного от него точкой имени поля. И откуда у поля вдруг взялось какое-то еще свойство value? Вы где нашли у полей таблиц свойства?
Короче, строка
legion54
+[ where pokazatTRTS.nd_id = ] + cmd.cnd.value
должна выглядеть или так
+[ where pokazatTRTS.nd_id = '] + cmd.cnd + [']
или так
+[ where pokazatTRTS.nd_id = ] + ?cmd.cnd


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Работа с запросом
legion54
Автор

Сообщений: 19
Дата регистрации: 06.10.2016
да это я затупил. Вопрос в другом, как перебрать каждую строку курсора cmd чтоб получить каждый cnd и подставить его во второй запрос
Ratings: 0 negative/0 positive
Re: Работа с запросом
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
первое что приходит в голову - переписать все одним запросом
Ratings: 0 negative/0 positive
Re: Работа с запросом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Для "перебора" записей есть цикл scan...endscan. Но, как уже было написано, лучше переписать запрос и сразу получать все данные, а не позаписно.


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 24.01.18 08:39
Ratings: 0 negative/0 positive
Re: Работа с запросом
legion54
Автор

Сообщений: 19
Дата регистрации: 06.10.2016
если перепишу запрос допустим так
SELECT pokazat.ctitl as Показатель, nd.mark as Обозначение, pokazattype.ctitl as Тип
FROM pokazatTRTS
left join pokazat on pokazat.cpokaz = pokazatTRTS.pokazat_id
left join nd on nd.cnd = pokazatTRTS.nd_id
left join pokazattype on pokazattype.idpokaztype = pokazatTRTS.pokaztype_id
where pokazatTRTS.nd_id in (SELECT cnd FROM nd where mark like '%ТР ТС%')
то в конечном итоге получу список готовый. Да так логичнее. но суть в том, что я получаю следующее:
Показатель | Обозначение | Тип
----------------------------------
1
2
3
4
5
и т.д.

а мне нужно сформировать excel в таком формате

№ | Показатель | Обозначение
----------------------------------------
Тип А
1
2
3
Тип Б
4
5
6
Тип С
7
8



Исправлено 1 раз(а). Последнее : legion54, 24.01.18 08:51
Ratings: 0 negative/0 positive
Re: Работа с запросом
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
так ORDER BY pokazattype.ctitl ... и другие поля если нужно

еще ежели мне склероз не изменяет, конструкция

select ... where pokazatTRTS.nd_id in (select ...)

имеет ограничение на макс. возвращаемое кол-во записей в подзапросе в IN ...
если там ожидается 100500 мульенов записей - то можно через exists(select ...) переписать



Исправлено 1 раз(а). Последнее : AndyNigmatec, 24.01.18 08:57
Ratings: 0 negative/0 positive
Re: Работа с запросом
legion54
Автор

Сообщений: 19
Дата регистрации: 06.10.2016
количество записей 20 в подзапросе in и наврятли вырастет.
так а как мне засунуть наименование типа перед перечислением списка.
вот так надо как на картинке
Ratings: 0 negative/0 positive
Re: Работа с запросом
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
вот вам одна из идей в виде тестового кода:

SELECT 0
CREATE CURSOR c1 (id i, f2 c(40))
INSERT INTO c1 (id, f2) VALUES (1, 'Вася')
INSERT INTO c1 (id, f2) VALUES (2, 'Петя')
INSERT INTO c1 (id, f2) VALUES (3, 'Маша')
SELECT 0
CREATE CURSOR c2 (id i, f1 n(10,2), f2 c(80))
INSERT INTO c2 (id, f1, f2) VALUES (1, 254.58, 'awefxcqewfcq')
INSERT INTO c2 (id, f1, f2) VALUES (1, 4587.08, 'aw5645fcq')
INSERT INTO c2 (id, f1, f2) VALUES (1, 47.12, 'a44')
INSERT INTO c2 (id, f1, f2) VALUES (1, 140.56, '45615410577')
INSERT INTO c2 (id, f1, f2) VALUES (2, 47.00, '4f88d')
INSERT INTO c2 (id, f1, f2) VALUES (2, 6887.07, '15588')
INSERT INTO c2 (id, f1, f2) VALUES (3, 1548.57, '44аqwd')
INSERT INTO c2 (id, f1, f2) VALUES (3, 0.38, '4awerwd')
SELECT 1 as nn, b.f2 as ltype, a.id, a.f1, a.f2;
FROM c2 a JOIN c1 b ON a.id=b.id;
UNION;
SELECT 0 as nn, b1.f2 as ltype, CAST(0 as i) as id, CAST(0 as n(10,2)) as f1, CAST('' as c(80)) as f2;
FROM c1 b1 WHERE b1.id in (SELECT id FROM c2 GROUP BY id);
ORDER BY ltype, nn;
INTO CURSOR cS READWRITE



Исправлено 1 раз(а). Последнее : AndyNigmatec, 24.01.18 09:35
Ratings: 0 negative/0 positive
Re: Работа с запросом
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
А вообще, для 20 циклов то вам и банальный SCAN ... ENDSCAN вполне подойдет, да и проще будет
Ratings: 0 negative/0 positive
Re: Работа с запросом
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ssa
должна выглядеть или так
+[ where pokazatTRTS.nd_id = '] + cmd.cnd + [']
1) это очень плохо.
2) это "дословно" будет работать только для строковых типов, и только если в целевой СУБД (о чём автор темы как то не удосужился даже поведать нам) ограничителем символьных литералов является одинарная кавычка. Для других типов нужно правильно преобразовывать "значение" из cmd.cnd в литерал (строковое предсатвление) понимаемый целевой СУБД.
ssa
или так
+[ where pokazatTRTS.nd_id = ] + ?cmd.cnd
на самом деле вот так:
+[ where pokazatTRTS.nd_id = ?cmd.cnd ]
параметр (имя поля/переменной/свойства) прямо внутри текста запроса прописывается.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Работа с запросом
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
legion54
а мне нужно сформировать excel в таком формате
Это НЕ НАДО делать в самом запросе. Это следует сделать в коде выводящем результат этого запроса в эксель.
В самом тупом случае - применить инструмент экселя "промежуточный итог" - он ещё и структуру создаст при помощи которой можно скрывать/показывать внутренности каждой группы.
А так - если программно заполнять ячейки, то в соответствующем цикле по курсору с чистыми данными отслеживать изменение поля группы (поля Тип в данном случае), и если оно изменилось по отношению к предыдущему запомненному в переменной значению, то вывести "строку заголовка группы". Код тривиальный, и сакральных знаний по фоксу не требует.
CREATE CURSOR tmp (num I, type c(10))
INSERT INTO tmp (num, type) VALUES (1,"A")
INSERT INTO tmp (num, type) VALUES (2,"A")
INSERT INTO tmp (num, type) VALUES (3,"A")
INSERT INTO tmp (num, type) VALUES (4,"B")
INSERT INTO tmp (num, type) VALUES (5,"B")
INSERT INTO tmp (num, type) VALUES (6,"C")
INSERT INTO tmp (num, type) VALUES (7,"C")
CLEAR
lcCurrentType=""
SCAN
IF !(tmp.type == m.lcCurrentType)
? "Header row for " + tmp.type
lcCurrentType = tmp.type
ENDIF
? tmp.num
ENDSCAN


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Работа с запросом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
[quote Igor Korolyov]
+[ where pokazatTRTS.nd_id = ] + ?cmd.cnd
[/quote]
на самом деле вот так:
+[ where pokazatTRTS.nd_id = ?cmd.cnd ]
параметр (имя поля/переменной/свойства) прямо внутри текста запроса прописывается.[/quote]Угу, это меня тут отвлекли во время писанины...


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive


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

On-line: 29 MikhsR Guest (Гостей: 27)

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