Страница 1 из 1
Запрос на DSQL
Добавлено: 29 фев 2024, 17:35
Irina_
Здравствуйте.
Написала запрос на SQL, который работает:
Код: Выделить всё
Select Persons.Fio, Persons.Tabnmb, Persons.Appdate, Persons.Disdate
, Persons.Wprizn2 //1 - Договор, 2 - Гарантийное письмо, 3 - Самостоятельно
, Ps1.Begdate
, Ps1.Enddate
, Ps2.Begdate
, Ps2.Enddate
from
persons
, HISTPSNDATA Ps1 //для периода статуса молодого специалиста
, HISTPSNDATA Ps2 //для периода предоставления вычета на молодого специалиста
where
((
Persons.Nrec == Ps1.Cbasetable
and 25001 == Ps1.Wbasetable
and 4 == Ps1.Wchoise
and Persons.Nrec == Ps2.Cbasetable
and 25001 == Ps2.Wbasetable
and 5 == Ps2.Wchoise
))
and ( Persons.Disdate = Date(0,0,0) or Persons.Disdate >= Date(01,01,2024) ) and Persons.Wprizn2 <>0
order external by Persons.Fio
to xlsx D:\1\123.xlsx;
При написании на DSQL возникла проблема. Когда одна таблица, то так работает:
Код: Выделить всё
SQL
Select
Persons.Fio, Persons.Tabnmb, Persons.Appdate, Persons.Disdate, Persons.Wprizn2
, case when Persons.Wprizn2 = 1 then 'Договор' else
case when Persons.Wprizn2 = 2 then 'Гарантийное письмо' else
case when Persons.Wprizn2 = 3 then 'Самостоятельно' else
' ' end end end as "StatusMS"
From
Persons
Where
( Persons.Disdate = #Date(0,0,0) or Persons.Disdate >= #Date(01,01,2024) )
and ( Persons.Wprizn2 <> 0 )
order by Persons.Fio
to xlsx D:\1\123.xlsx;
Каким образом в этот запрос добавить 2 синонима HISTPSNDATA с указанием условий выборки данных из них?
Чем не устраивает 1-ый запрос: в нем выводится признак Persons.Wprizn2 , а хотелось бы текстовую расшифровку его значения.
Re: Запрос на DSQL
Добавлено: 01 мар 2024, 10:23
Den
Вы во втором запросе делаете расшифровку по Case, а в чем затруднение сделать тоже самое в первом запросе (который всем, кроме это устраивает ...)
Re: Запрос на DSQL
Добавлено: 01 мар 2024, 12:19
Irina_
Я считала, что в Support так нельзя.
Добавила case в 1-ый запрос и получила ошибку:
«
Ошибка: Ожидалась '')'' (стр.4, поз.10 в D:\Sup5514\Lot\123.LOT)
, case when Persons.Wprizn2 = 1 then 'Договор' else
^
»
Возможно синтаксис другой или все-таки так нельзя?
Если можно, то как правильно добавить case в 1-ый запрос?
И все-таки хотелось бы и 2-ой запрос тоже с выводом инфо из синонимов. В т.ч. и в качестве образца )
Re: Запрос на DSQL
Добавлено: 01 мар 2024, 12:36
Den
Irina_ писал(а): ↑01 мар 2024, 12:19
Я считала, что в Support так нельзя.
Код: Выделить всё
select
Case(Persons.ISEMPLOYEE;
'С' : 'ссссс',
'П' : 'пппп';
'else'
)
,fio
from persons;
Re: Запрос на DSQL
Добавлено: 01 мар 2024, 13:24
Irina_
Денис, большое спасибо! Так получилось. Не приходилось пользоваться ф-цией case, использовала только одноименный оператор.
И, если можно, запрос на DSQL. Заранее благодарна )
Re: Запрос на DSQL
Добавлено: 01 мар 2024, 17:30
edward_K
ищите TSQL
например на microsoft - там все расписано подробно и с примерами
не все, но процентов 70 на DSQL пашет.
В вашем случае можно юзать
left join
inner join
outer apply(только на MSSQL)
также можно через запятую перечислять во from и where почти как в галактике писать(меняя условия местами и == на = ), но я этим не пользуюсь.
Подзапросы в полях или в where мне не нравятся.
И если писать case как там написано (2 варианта есть), то тоже все работает.
Re: Запрос на DSQL
Добавлено: 05 мар 2024, 15:04
Irina_
Здравствуйте.
Я и пробовала использовать Left join. Но ничего не получилось.
Возможно, кто-либо подскажет, в чем может быть причина проблемы. Опишу на простейшем примере. Аналогичную проблему получаю, если в запросе использую таблицы Persons и HISTPSNDATA.
Платформа Pervasive.
Следующий запрос в Support выполняется, файл формируется:
SQL
Select Nrec
from Persons
to xlsx D:\1\123.xlsx;
А следующий запрос не выполняется, файл не формируется:
SQL
Select Nrec
from HISTPSNDATA
to xlsx D:\1\123.xlsx;
В psql9drv.log получаю:
05.03.2024 12:36:13 []:
select NREC from HISTPSNDATA
05.03.2024 12:36:13 []:
S1000: [Pervasive][ODBC Client Interface][LNA][Pervasive][ODBC Engine Interface]Unable to open table: HISTPSNDATA.
S0002: [Pervasive][ODBC Client Interface][LNA][Pervasive][ODBC Engine Interface][Data Record Manager]No such table or object.
Файл HISTPSNDATA.DAT существует в D_STAFF. Почему в логе пишется, что невозможно открыть таблицу?
Re: Запрос на DSQL
Добавлено: 11 мар 2024, 11:50
oiko
Не претендую на последние обновления но таблицы HISTPSNDATA у меня в словаре нет.
Попробуйте еще раз конвертировать adf-to-ddf и гляньте средствами Первазива структуру таблиц.
Re: Запрос на DSQL
Добавлено: 11 мар 2024, 17:33
Irina_
Указанной таблицы (ее код 32663) у Вас нет видно потому, что мы на сопровождении в РБ. И думаю, что эта таблица была не всегда, а появилась после какой-то установки патчей с докомпиляцией словаря БД. В Support таблица открывается, в ней есть данные. И они выводятся, если запрос на SQL (см. 1-ый запрос в исходном обращении).
Подскажите пожалуйста, «конвертировать adf-to-ddf» - как это сделать?
Re: Запрос на DSQL
Добавлено: 12 мар 2024, 11:18
oiko
Support - конвертер словаря БД для Pervasive SQL
Re: Запрос на DSQL
Добавлено: 12 мар 2024, 12:08
Irina_
Правильно ли я понимаю, что это модуль или пункт меню в Support? Если да, то у себя такого не нашла.
Re: Запрос на DSQL
Добавлено: 13 мар 2024, 12:09
oiko
Да в лицензии на суппорт должна быть строка ADF2DDFMAIN
Re: Запрос на DSQL
Добавлено: 14 мар 2024, 11:19
Irina_
Здравствуйте.
Лицензии на модуль «Конвертер словаря БД для Pervasive PSQL» у нас действительно нет. Просмотрела документацию по модулю. В ней не встретила ничего о том, что надо запускать конвертацию после установки патчей с докомпиляцией словаря БД. Это сейчас понятно, что при докомпиляции меняется словарь и логично нужны новые файлы ddf.
От ОТП получены таблицы ddf, ими заменила имеющиеся в папке …\DATA\DDF\.
После этого запрос на DSQL к HISTPSNDATA отработал. Отработал и исходный запрос по двум таблицам.
Большое спасибо всем откликнувшимся!
И на всякий случай работающий запрос, с которого все началось:
Код: Выделить всё
SQL
Select
Persons.Fio, Persons.Tabnmb, Persons.Appdate, Persons.Disdate, Persons.Wprizn2
, case when Persons.Wprizn2 = 1 then 'Договор' else
case when Persons.Wprizn2 = 2 then 'Гарантийное письмо' else
case when Persons.Wprizn2 = 3 then 'Самостоятельно' else
' ' end end end as "StatusMS"
, Ps1.Begdate as "Status_From"
, Ps1.Enddate as "Status_To"
, Ps2.Begdate as "Vichet_From"
, Ps2.Enddate as "Vichet_To"
From
Persons
Left join HISTPSNDATA Ps1 on ( Persons.Nrec = Ps1.Cbasetable and Ps1.Wbasetable = 25001 and Ps1.Wchoise = 4 )
Left join HISTPSNDATA Ps2 on ( Persons.Nrec = Ps2.Cbasetable and Ps2.Wbasetable = 25001 and Ps2.Wchoise = 5 )
Where
( Persons.Disdate = #Date(0,0,0) or Persons.Disdate >= #Date(01,01,2024) )
and ( Persons.Wprizn2 <> 0 )
order by Persons.Fio
to xlsx D:\1\123.xlsx;