:: Visual Foxpro, Foxpro for DOS
Запрос с дублированием реквизитов
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Есть проблемка.
Есть собранный в ручную запрос, запрос содержит несколько связанных таблиц по ID.
В одной из связанных таблиц ОБРАЗОВАНИЕ есть сотрудники у которых два образования.
Реквизиты таблицы ОБРАЗОВАНИЕ рассчитаны на запись информации одного образования, второе записывается в следующей строке под первым с тем же ID (такая форма таблицы обязательна).
Задача в чем собственно:
Запрос должен строиться двумя вариантами:
1. Если у человека одно образование то количество реквизитов в выпадающем курсоре должно быть N.
2. Если у человека два образования то количество выпадающих реквизитов N+M, где M - реквизиты с информацией по второму образованию.
Делать через IF стороить два разных запроса или есть другие пути? Но тут вопрос как в реквизиты первого образования поместить инфу по первому, а во вторые по второму?

Если обычный Select делаю то он дублирует строку запроса друг под другом. Отличия в строках только инфа по образованию.
Нет возможности прикрепить скрины ... надеюсь кто то поймёт меня)
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Такая же ситуация с телефонами (у человека м.б. 2 телефона). В отчетах выводим или 2 колонки для телефонов, 2я у большинства пустая. Или, в ячейке Экселя, многострочная запись с номерами.
Вопрос на засыпку: а если 3 образования, или больше, то какой должна быть выходная таблица?
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
ptaxa888
Запрос должен строиться двумя вариантами:
1. Если у человека одно образование то количество реквизитов в выпадающем курсоре должно быть N.
2. Если у человека два образования то количество выпадающих реквизитов N+M, где M - реквизиты с информацией по второму образованию.
Вряд ли это имеет отношение к запросу.
Это вопрос к вашему UI. Как вы собираетесь это показывать.
И уж зачем тут IF, даже придумать не могу.
В обычном случае, (предположим у Иванов 2 образования) строя запрос вы получите
Иванов образование1 реквизиты_образование1
Иванов образование2 реквизиты_образование2

Что и как вам надо, из вопроса не понятно


------------------
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Аспид
ptaxa888
Запрос должен строиться двумя вариантами:
1. Если у человека одно образование то количество реквизитов в выпадающем курсоре должно быть N.
2. Если у человека два образования то количество выпадающих реквизитов N+M, где M - реквизиты с информацией по второму образованию.
Вряд ли это имеет отношение к запросу.
Это вопрос к вашему UI. Как вы собираетесь это показывать.
И уж зачем тут IF, даже придумать не могу.
В обычном случае, (предположим у Иванов 2 образования) строя запрос вы получите
Иванов образование1 реквизиты_образование1
Иванов образование2 реквизиты_образование2

Что и как вам надо, из вопроса не понятно
Если у Иванова два образования должно быть в одну строку 3 реквизита.

ФИО. Образование1. Образование2.
Иванов Высшее-юридическое. Высшее-техническое.

Если одно образование реквизита будет 2.
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Пытаюсь сделать по следующей логики:
SELECT fio
LOCATE FOR fio.f04=‘ИВАНОВ’
IF FOUND()
n=fio.id
USE obraz
COUNT FOR obraz.id=n TO lnCount
?lnCount
* тут я уже вижу сколько образований имеет человек сколько встретился одинаковый id в таблице obraz
IF lnCount>1
Select реквизиты для двух образований FROM ....
Else
Select реквизиты для одного образования FROM ...
ENDIF
ENDIF

Только с таким select в случае выполнения условия lnCount>1 образования будут дублироваться скорее всего. Как распределить их по соответствующим реквизитам первого и второго образования?



Исправлено 1 раз(а). Последнее : ptaxa888, 06.04.18 12:00
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
of63
Такая же ситуация с телефонами (у человека м.б. 2 телефона). В отчетах выводим или 2 колонки для телефонов, 2я у большинства пустая. Или, в ячейке Экселя, многострочная запись с номерами.
Вопрос на засыпку: а если 3 образования, или больше, то какой должна быть выходная таблица?
Да с телефонами, с детьми все тоже самое.
Данный запрос будет просматривать только одного человека, поэтому пустых полей не будет. Есть вторе образование - значит есть доп. реквизит.
3 и более не предусмотрено пока.
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
...
LOCAL o1, o2 && образование 1 и 2
SELECT obraz
SCATTER MEMO NAME o1
IF lnCount>1
SKIP
SCATTER MEMO NAME o2
Select реквизиты для двух образований FROM .... && реквизиты образования 1 и 2 берем из o1, o2
ELSE
Select реквизиты для одного образования FROM ... && реквизиты образования 1 берем из o1
ENDIF
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Зачем это всё разворачивать в курсоре?
Курсор с динамическим набором полей - это уже само по себе плохо.

Это практически всегда вопрос отображения - а для отображения подобной информации не требуется не то что два поля, даже самого мега-запроса объединяющего 100500 таблиц не нужно. Будет группа простых запросов, и обработка их результатов с раскладыванием в элементы управления. Обычно для этого списки/гриды применяют, но можно и просто текстбоксы (их придётся динамически добавлять на форму в зависимости от того 2 образования, 5 или ни одного).

Курсор - это ДАННЫЕ. Это не то что видит пользователь. Пользователь должен видеть формы с элементами управления, которые в свою очередь берут данные из курсора (или курсоров). И чтобы этого добиться абсолютно не требуется запихивать все данные в один курсор - тем более что там реально будут связи один-ко-многим, а не строго один-к-одному между разными исходными таблицами...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Игорь абсолютно верно все написал.
ptaxa888
IF lnCount>1
Select реквизиты для двух образований FROM ....
Else
Select реквизиты для одного образования FROM ...
ENDIF

А теперь покажите форму, которая будет показывать для 2х (3х) образований.
Если вы запихнете это в грид, то это всегда 1 запрос.
А кол-во записей - кол-во образований.
Иначе. Делаете класс контейнер, с набором реквизитов, и в зависимости от кол-ва записей, кол-во контейнеров.

Все зависит от того, как вы это показываете.


------------------
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
vnkor

Сообщений: 324
Дата регистрации: 04.10.2007
ptaxa888
Если у Иванова два образования должно быть в одну строку 3 реквизита.

ФИО. Образование1. Образование2.
Иванов Высшее-юридическое. Высшее-техническое.

Если одно образование реквизита будет 2.

Может, проще сделать всего 2 реквизита для всех:

ФИО. Образование.
Иванов Высшее-юридическое. Высшее-техническое.
Петров Высшее-экономическое.

Можно еще добавить поле "Количество дипломов".
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
Божья_коровка

Сообщений: 25731
Дата регистрации: 23.08.2001
А в чём смысл реквизита - "Количество дипломов"? Ведь есть ситуации когда человек работает и учится, к примеру у него второе незаконченное образование и еще диплома нет. Юзер заполнит оба реквизита, а кол-во дипломов будет по факту - 1. И что? В чем фишка?

Вообще реализация задачи какая то не универсальная получается с выводом в разных реквизитах. У человека как правильно было замечено может быть более 2-х образований, плюс всевозможные курсы по которым тоже выдают дипломы или сертификаты, в том числе и международного образца.

У меня был справочник примерно с такой структурой -
Цитата:
ID (идентификатор), PerCod (персональный код сотрудника), Fld1 (вид образования), Fld2 (учебное заведение)
1 1111 высшее-техническое Рога и Копыта
2 1111 средне-техническое Мотылек и Птички
3 1111 курсы Финаудит

И данные выводились в грид. Т.е. ФИО сотрудника в простые контролы текстовые на форме, а образование было организовано в гриде, поскольку неизвестно с каким багажом придет сотрудник. Да и в течение его работы, он может повышать квалификацию, учиться и его данные пополняться. Вообще не понимаю зачем на такие вещи в лоб закладывать определённое число реквизитов. Образование, дети, история работы в других организациях и пр. инфа по персоне это переменные величины. Такие справочники изначально нужно проектировать универсальными. ИМХО Может я чего то недопонимаю :al:


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 5 раз(а). Последнее : Божья_коровка, 06.04.18 19:35
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Божья_коровка
Такие справочники изначально нужно проектировать универсальными. ИМХО
+100500

Вот похожий случай.
Заказы продукции
Как правило, заказывают одну продукцию.
И я сразу в заказе показываю эту продукцию.
В случае больше одной продукции, я к имени продукции добавляю >>, что бы видно было что внутри есть еще что-то.
Открыв заказ на редактирование, видно все.

В общем, вариантов UI, очень много. И думать надо о пользователе, и том как он будет работать.
В то же время, не очень идя на поводу (Он часто раб привычек)

Решив как показывать, нарисовать получение, удобное для показа - 5 мин.


------------------
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
ptaxa888
Есть проблемка.
Есть собранный в ручную запрос, запрос содержит несколько связанных таблиц по ID.
В одной из связанных таблиц ОБРАЗОВАНИЕ есть сотрудники у которых два образования.
Реквизиты таблицы ОБРАЗОВАНИЕ рассчитаны на запись информации одного образования, второе записывается в следующей строке под первым с тем же ID (такая форма таблицы обязательна).

Конечно, чудо-птички ">>" у новичков решают все вопросы.
Но вы ведь и так все правильно описали.

Есть такое понятие - "нормализация".
Сведения об образовании и т.п. это не справочники, а самостоятельные таблицы с данными, связанные по ключевым полям с основной таблицей.
Для работы с ними создаются свои страницы в PageFrame или отдельные формы со всеми необходимыми атрибутами.

Добавьте в эту свою таблицу поле с птичкой - "Основное образование", в общих запросах фигурирует только оно.
Для более подробных сведений об образовании создаются отдельные запросы.
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Всем спасибо за участие и помощь. Результат получен, пусть не тем путем на который пытались направить но всё же. Признаю что пока мне сложно понимать и ориентироваться во многих вещах... надеюсь этот момент поправим, будем развиваться и брать на вооружение ваши советы.
Сделал путем копирования строки второго образования в новый курсор, затем поля этого курсора используются в запросе. Вроде работает)
LOCAL qw
thisform.grid1.column4.text1.refresh
qw=thisform.grid1.column4.text1.Value
SELECT fio
LOCATE FOR fio.f04=qw
IF FOUND()
n=fio.id
select obraz1
COUNT FOR obraz1.id=n TO lnCount
*?lnCount && тут видим кол-во образований (кол-во id в таблице obraz1)
IF lnCount>1
LOCATE FOR obraz1.id=n
IF FOUND()
b=obraz1.ob
b=b+1
LOCATE FOR obraz1.ob=b
IF FOUND()
SCATTER MEMVAR
SELECT obraz2
APPEND BLANK
GATHER MEMVAR
SELECT...FROM...WHERE...
*******
*******
******



Исправлено 1 раз(а). Последнее : ptaxa888, 09.04.18 01:53
Ratings: 0 negative/0 positive
Re: Запрос с дублированием реквизитов
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Это ужасно... Нет, даже ещё хуже...

В запросе можно несколько раз указывать одну и ту же таблицу-источник, связывая её по разным условиям с остальной частью запроса. Вопрос лишь в том как определить такое условие. Т.е. применимо к твоему случаю, как указать какая запись есть "первое образование", а какая - второе.
Но я ещё раз повторюсь - так делать не надо. Не надо запихивать в один курсор всё на свете, тем более "списки" значений.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

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

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