powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Select >> CAdapter
18 сообщений из 18, страница 1 из 1
Select >> CAdapter
    #38157659
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите пожалуйста с SELECTами с последующим использованием результатов в СА (у самой даже близко ничего не получается)
структура таблицы-источника:
код_врача дата_дежурства4 02/01/134 02/05/134 02/15/134 02/22/137 02/03/137 02/05/137 02/11/139 02/20/1311 02/05/1311 02/28/13
нужно 1.
код_врача02/01/1302/03/1302/05/1302/11/1302/15/1302/20/1302/22/1302/28/134 .T..T..T..T.7.T..T..T.9.T.11.T..T.
нужно 2.
дата_деж4791102/01/13.T.02/03/13.T.02/05/13.T..T..T.02/11/13.T.02/15/13.T.02/20/13.T.02/22/13.T.02/28/13.T.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38157824
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кросс-таблицы (CrossTable) через CursorAdapter не делаются. Точнее, в отдельном конкретном случае - можно, но общего решения именно для Select-SQL не существует.

В принципе, подобные запросы можно сконструировать через макроподстановку. Должен сформироваться запрос вида

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select
    код_врача,
    sum(iif(дата_дежурства = ..., 1, 0)) as date1,
    sum(iif(дата_дежурства = ..., 1, 0)) as date2,
    sum(iif(дата_дежурства = ..., 1, 0)) as date3,
    ...
from MyTable
group by код_врача



Ну, или обратный запрос вида

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select
    дата_дежурства,
    sum(iif(код_врача = ..., 1, 0)) as врач1,
    sum(iif(код_врача = ..., 1, 0)) as врач2,
    sum(iif(код_врача = ..., 1, 0)) as врач3,
    ...
from MyTable
group by дата_дежурства



Понятно, что ограничивающим фактором выступает количество полей.

Если в качестве дат взять, например, один календарный месяц или ровно 30 дней от некой фиксированной даты, то можно сконструировать запрос и в общем случае. Однако лично я в подобных случаях формирую итоговую таблицу "вручную". Без запросов. Простым сканированием исходной таблицы и копированием данных в итоговый курсор. Перенос обратно (из итогового курсора в исходные таблицы) - несколько более трудоемок, но, в принципе, ничего сложного.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38157832
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, извиняюсь, "по современному" то, что Вам нужно теперь называют не CrossTable, а PivotTable. В остальном, все правильно.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38157979
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PIVOT (сводная) вам, по идее, излишней будет. Как я и говорил, можно, например, воспользоваться имеющимся Cross-Table ( vfpxtab.prg )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
ccName='curData'
CREATE CURSOR (ccName) (idDoc int, idPer int)
INSERT INTO (ccName) VALUES (4,1)
INSERT INTO (ccName) VALUES (4,5)
INSERT INTO (ccName) VALUES (4,15)
INSERT INTO (ccName) VALUES (4,22)
INSERT INTO (ccName) VALUES (7,3)
INSERT INTO (ccName) VALUES (7,5)
INSERT INTO (ccName) VALUES (7,11)
INSERT INTO (ccName) VALUES (9,20)
INSERT INTO (ccName) VALUES (11,5)
INSERT INTO (ccName) VALUES (11,28)

SELECT *, .t. as mark FROM curData INTO CURSOR curTemp
DO (_GENXTAB) WITH 'Query1',,.f.,,1,2,3,,,.f.

SELECT curTemp
SET PROCEDURE TO (_GENXTAB)
oNewXtab=CREATE('genxtab','query2',,.T.,,2,1,3,,,.F.)
oNewXtab.MakeXtab()

Именование столбцов можно затем заменить, а можно и просто использовать собственную модифицированную копию vfpxtab ...
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158008
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может на основании исходной таблицы создать представления (CreateView) и уже с них СА?
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158021
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вы хотите использовать КА для того, чтобы править данные в таком "кроссовом" виде? А смысл в КА?
Может, проще иметь представление такое, как вам надо (оба этих вышеприведенных кросса), а на изменение ячейки "кросса" повесить только "декодирование" исходных ключей (и накопление изменений). И затем уже разом, по подтверждению окончания изменений - обновить источник.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158053
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM, гдето именно так и хочу, а может и нет. немного отойду-отдышусь (не подумайте плхого)
Пока нахожусь в лёгком! недоумении - после использования вашего кода каким-то Волшебным образом вижу нужные результаты!
Как это сработало!? Что и откуда!? Волшебники!

А задумка такая: в гриде с конечным результатом встаем на поле с непустой датой_дежурства врача, а рядом на форме отобразятся все запланированные мероприятия на этот день по данному врачу (операции,осмотры и пр.)
так вот полученные Волшебным образом таблицы меняться не будут (их на месяц вперед составляют), они лиш служат связкой между таблицей с мероприятиями, которые меняются часто.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158093
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну тогда да:
- в качестве источника грида используете сформированный курсор
- при выборе ячейки грида вычисляете "код_врача" и "дата_дежурства", и передаете их для формирования выборки мероприятий

Кстати, и планировать дежурства (тот график, что составляете заранее) ведь можно тоже в такой же форме кросс-таблицы - только щёлкай по ячейкам... По идее, у вас и должна быть только одна форма, работающая в нескольких режимах: "планирование дежурств", "планирование мероприятий", "только просмотр"...
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158164
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно так.
Но чтобы для себя и потомков было понятней всё размещу на отдельных владках.
Вроде в голове всё выстраивается в Ёлочку!
Распечатала vfpxtab - изучаю для дальнейшей модернизации и переселения в свой проект.
Огромаднейшее СПАСИБО!
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158235
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFPXTAB изучать и переделывать - не обязательно. Тут просто надо знать кое-что (если меняем дефолтные значения):
- в качестве источника используются данные из текущей рабочей области
- на выходе формируется курсор с указанным именем (param1), этот курсор становится текущим
- param3 позволяет не закрывать таблицу-источник после формирования результата
- param5,6,7 указывают соответственно на порядковые номера полей источника с данными для строк, столбцов и данных внутри таблицы
- param10 позволяет убрать из вывода значения .NULL.
- при формировании имен полей в результирующем курсоре перед "именем" добавляется символ, означающий тип (C,D,T,N...) и знак подчеркивания


Таким образом, кросс-таблицу можно сформировать и без предварительной выборки нужных полей в отдельный курсор, НО лучше всё-таки это проделать. Кроме того, имеет смысл (если вы будете использовать один курсор-источник для нескольких отображений) привести значения полей-ключей к одному формату, например, к символьному. Возьмём ваш вариант:
Код: sql
1.
2.
3.
SELECT CHRTRAN(STR(код_врача,3),' ','0') as cDoc,;
  DTOS(дата_дежурства) as cDate,;
  .t. as mark FROM ... INTO CURSOR curTemp

Код: sql
1.
DO (_GENXTAB) WITH 'curTempCross',,.f.,,1,2,3,,,.f.

Мы не только получим верную сортировку полей, но и сможем однозначно получать дату по имени поля (впрочем, XTAB и сам такое преобразование выполняет, поскольку точек и слэшей в имени не поставишь).
Код: sql
1.
2.
SELECT curTemp
DO (_GENXTAB) WITH 'curTempCross',,.f.,,2,1,3,,,.f.

То же самое, но только для кода врача.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158245
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM- при формировании имен полей в результирующем курсоре перед "именем" добавляется символ, означающий тип (C,D,T,N...) и знак подчеркиванияТут я немного загнул, MAPNAME() немного по другому все формирует... Но общий принцип примерно таков и есть. Для наших целей удобно приводить значения ключей к такому виду, чтобы XTAB их однозначно итерпретировал (да и мы тоже). Например, к символьному виду из одних цифр.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38158432
Фотография descent52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AndreTM +1000000500! Красава! Респект за подсказку!!! Пойду у себя теперь кое чего переделаю... Класс!
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38160818
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не мудрствуя лукаво изобразила форму с PageFrame из 3-х страниц.
При открытии формы попадаем в грид на Рage1 с расписанием дежурств текущего месяца по всем врачам. Ячейки назначенных дежурств отличаются насыщенностью цвета от кол-ва уже назначенных мероприятий (навороты)
При переходе на Р2 попадаем в грид по-врачу (который остался активным на Р1) с его днями дежурств. попадая на эти ячейки видим в сторонке назначенные мероприятия на этот день (с возможностью их редактирования, добавления, удаления). Тут же на Р2 можно выбрать др. врача и поменять диапазон.
Р3 - грид для составления плана дежурств
ВСЁ -15 часов работы, до косоглазия и движок от "Andre" работает!
Малость отдохну, соберусь с мыслями займусь дизайном и может еще что надумаю с апгрейдом или вообще.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38161110
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не ясно только одно.
Если я возьму в проект vfpxtab.prg (ведь на клиентских машинах Фох может отсутствовать) приложению как обращаться к нему, также - DO (_GENXTAB) WITH ......???
извините, пока Нет возможности проверить данный момент по причине присутствия Лиса. Везде!
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38161115
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vfpxtab.prg (как и любой другой PRG) это просто исходник, который надо включить в свой проект. Никаких фоксов ставить клиентам не надо.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38161120
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно он какие-то библиотеки (VCX/VCT) использует. Их тоже надо включить в проект.
Скорее всего это все произойдет автоматом, т.к. при сборке EXE в проект добавляются все программные модули используемые в коде.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38161268
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Людмila,

DO (_GENXTAB) был использован as is просто потому, что при установленном Фоксе системная переменная _GENXTAB инициализируется им самим. Вам никто не запрещает в любой момент записать своё значение в эту переменную. Либо, как и было сказано, включить исходник в проект и вызывать как обычную процедуру.
...
Рейтинг: 0 / 0
Select >> CAdapter
    #38161313
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Включив xtab в проект и скомпелировав в .ехе с последующим его запуском, дествительно при обращении _GENXTAB ругается, пишет, что файл не найден!
но при обращении к нему по имени (vfpxtab.prg) всё ОК!
по RDP пробралась не сервер, с него по radminy на машину клиента (Фокса.нэт), установила прогу всё Гут!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Select >> CAdapter
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]