Помогите пожалуйста разобраться с запросом.

Автор serkondr, 24 ноября 2011, 14:15

0 Пользователи и 1 гость просматривают эту тему.

serkondr

Здравствуйте!

Использую Ubuntu 11.04 и Libre Office 3.3.4  OOO330m19 (Build:401) tag libreoffice-3.3.3.1, Ubuntu package 1:3.3.4-0ubuntu1

Пытаюсь работать исключительно средствами Оооbase не используя SQL, т.к. пока ещё не владею последним.
Создал таблицу, содержащую поле name с наименованием изделий и поле ntreb с номером требования-накладной на отпуск со склада (ещё есть поля с количеством и датой).
Из формы ввожу данные в таблицу. Т.е. пополняю базу данных. После ввода данных мне надо распечатать отчёт: требование-накладную на отпуск со склада. Распечатать надо одну  последнюю накладную, т.е. накладную с последним, максимальным по значению номером. Пытаюсь сделать запрос для формирования данных отчёта. И никак пока не получается добиться нужного результата.
Первое поле - ntreb обрабатываю функцией "максимум". Второе поле - это же ntreb, но с функцией group. И поле name тоже с функцией group.
В таком виде получается полный список всех изделий из таблицы, и функция MAX("ntreb") на результат запроса не влияет.
Если вручную проставляю критерий '35' во втором столбце, т.е. максимальное значение ntreb, то результат получается как раз нужный, но такой ручной ввод мне не подходит.
Если удалить все поля кроме первого, то в результате запроса получаю только одну запись с максимальным значением ntreb - 35.
Пробовал присвоить первому столбцу псевдоним и вставлять псевдоним в критерий второго столбца. Не работает, выскакивает ошибка. Пробовал использовать во втором столбце другие агрегатные функции. Функция "Количество" даёт количество всех записей, а не только с максимальным номером. Функция "Сумма" работает, но не имеет смысла. Остальные функции не работают - выскакивает ошибка.

Вопрос: как мне в графу "критерий" второго столбца вставить вместо '35' максимальное значение ntreb? Чтоб запрос содержал все записи с последним номером накладной (максимальным ntreb) ?
Снимки форм и саму базу прилагаю.
Спасибо.


[вложение удалено Администратором]

RFJ

Знаю только как с SQL:
SELECT "name", "ntreb" FROM "Представление_Крепёж" WHERE "ntreb"=(SELECT MAX("ntreb") FROM "Представление_Крепёж")

serkondr

Спасибо за ответ!

Только дело было не в бобине...

Всё оказалось намного проще. Не надо мне было делать столько ступеней во вложенности запросов.
При проверке вставки запроса "ЗапросМ" в другой запрос, информация не загружалась даже без каких-либо преобразований. В то же время таблицы с подобным содержимым прекрасно отображались в запросах и формировали нужную информацию.
Вот я и предположил, что сделал слишком много ступеней в итоговом запросе. Представление "Крепёж" с преобразованием типа данных было ликвидировано. Взял за основу сразу исходную таблицу "крепёж" и непосредственно в запросе на максимум ввёл преобразование типа данных n_nakl из VARCHAR в NUMERIC, одновременно установив функцию Максимум. Запрос "Треб.-накладная" сделал, также взяв за основу таблицу "Крепёж", а не промежуточное "Представление_крепёж". И ошибки типа "Невозможно загрузить данные" прекратились. Просто сделал связь между полем max(cast("ntreb" as NUMERIC (10))) из нового "Запрос1Мах" и полем "n_treb" из таблицы "Крепёж", сделал группировку и получил искомую таблицу с результатами последнего требования-накладной. По ней сформировал отчёт - всё заработало! Ура-а-а!

Если кому будет  интересно, я ещё сделал выпадающий список в форме требования-накладной с информацией из трёх полей. При этом позиции с остатком 0 не отображаются в выпадающем списке. Таким образом, при выборе позиции на выдачу мне видно, что у меня есть на складе и сколько. А в родительскую таблицу вписывается информация из другого поля запроса "Список значений __шт.__, служащего списком значений. То поле содержит только наименование товара, как мне и надо. Ведь остаток товара - только справочная информация, которая меняется. Забивать её в родительскую базу  не нужно. Но посмотреть при выписке надо.

В общем, обычные средства ОоBase позволяют сделать достаточно много таким чайникам, как я. Язык SQL надо изучать, ведь "есть у программирования начало, нет у программирования конца". Улучшать программу надо постоянно, а без знаний SQL в границах обычных средств OoBase многое сделать трудно или невозможно.

Осталась вот ещё одна досадная мелочь. Почему-то поле с датой в отчёте выглядит целым пятизначным числом. Преобразовал в исходном для отчёта запросе дату в тип данных VARCHAR - стало видно дату, но не в нашем формате, а в западном - год впереди. Терпимо, но хотелось бы поправить.

Файл с базой прилагаю.



[вложение удалено Администратором]

neft

#3
1. Ваш запрос всё-таки сложноват в данном случая, можно и попроще.
см. sql01.png

2. Сменить формат даты можно при изменении таблицы.
см. date_format_primer.png, date_format


[вложение удалено Администратором]

serkondr

Спасибо за помощь!

Конечно, мой запрос выглядит неказисто, потому, что я его не писал, а создавал в мастере. Таким его сгенерировал мастер запросов ОоBase.  Воспользовался теперь Вашим Вариантом.

А вот с датой так и не получилось. В запросе - то всё хорошо. А вот в отчёте - всё так и осталось неверно. Не перевожу в Varchar - вместо даты в отчёте пятизначное целое число. Перевожу - дата на западный манер, год спереди.

Спасибо.




neft

С датой в отчете тоже должно быть всё в порядке.


[вложение удалено Администратором]

serkondr

Что-то у меня какие-то глюки с Либр-офисом. Дата в отчёте так и не работает, да ещё запрос после создания сам меняется по непонятной причине. Исправляю, сохраняю, запускаю- работает. Открываю окно "изменить" - а там опять враньё. Приходится снова восстанавливать вручную.

neft

Как вы создаете отчет? Подробно, по шагам.

serkondr

Обычно, в мастере отчётов, т.к. другое в Libre Office и не предлагается. Выбираю запрос, указываю поля, которые надо показать, потом делаю группировку для четырёх из них (в том числе дата), чтобы они не печатались повторно в каждой строке таблицы. Выбираю книжную ориентацию листа и модифицировать отчёт. Сдвигаю границы полей, выключаю коллонтитулы и сохраняю. Но даже без модификации отчёта дата отображается некорректно.

Нашёл тему на форуме InfraOffice,  где люди столкнулись с тем же. Проблему решили установкой Oracle Report Builder. Но я в своих репозитариях такого не нашёл. Может в Libre Office под Ubuntu этот генератор нельзя использовать?

neft

#9
LibreOffice 3.4.4,  Windows XP SP2 - в отчете дата нормально.

Попробуйте создать новый отчет на основе моего запроса с 3-й картинки в предыдущем посте (Треб.накладная_02 - этот запрос правильно дату показывает?, в самой таблице даты правильно отображаются?).

(Старый отчет и старые запросы удалите, для чистоты эксперимента.)

Oracle Report Builder (взять отсюда):
http://extensions.services.openoffice.org/project/reportdesign

В дистрибутиве LibreOffice уже есть Report Builder.

[вложение удалено Администратором]

serkondr

Спасибо!
Я именно Ваш запрос и использую. В нём дата видна корректно. А в отчёте - нет. Попробую установить Oracle Report Builder.

serkondr

Установил этот Oracle Report Builder, он не работает :(   В меню отчётов появился пункт - создание отчёта в режиме дизайна, однако при клике на любой пункт ничего не происходит. Отключаю Oracle Report Builder - работает по старому. Попробую обновить Libre Office.

neft

Ubuntu 11.04 не пользуюсь.
Тут у кого-то есть Ubuntu 11.04 (Клио, кажется), надо бы у него спросить.

neft


serkondr

Java: 1.6.0_22
Версия: LibreOffice 3.3.3
Билд: OOO330m19 (Build:301)
Ubuntu 11.04

В репозитарии нашёл Libreoffice-Report-Builder, установил. Появился пункт меню отчётов "Создание отчёта в режиме дизайна" с огромным количеством инструментов, пока разбираюсь.