Запрос на DSQL

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Запрос на DSQL

Сообщение 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 , а хотелось бы текстовую расшифровку его значения.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Запрос на DSQL

Сообщение Den »

Вы во втором запросе делаете расшифровку по Case, а в чем затруднение сделать тоже самое в первом запросе (который всем, кроме это устраивает ...)
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Запрос на DSQL

Сообщение Irina_ »

Я считала, что в Support так нельзя.
Добавила case в 1-ый запрос и получила ошибку:
«
Ошибка: Ожидалась '')'' (стр.4, поз.10 в D:\Sup5514\Lot\123.LOT)
, case when Persons.Wprizn2 = 1 then 'Договор' else
^
»
Возможно синтаксис другой или все-таки так нельзя?
Если можно, то как правильно добавить case в 1-ый запрос?
И все-таки хотелось бы и 2-ой запрос тоже с выводом инфо из синонимов. В т.ч. и в качестве образца )
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Запрос на DSQL

Сообщение Den »

Irina_ писал(а): 01 мар 2024, 12:19 Я считала, что в Support так нельзя.

Код: Выделить всё

select
   Case(Persons.ISEMPLOYEE;
         'С' : 'ссссс',
         'П' : 'пппп';
         'else'
   )
   ,fio
  from persons;
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Запрос на DSQL

Сообщение Irina_ »

Денис, большое спасибо! Так получилось. Не приходилось пользоваться ф-цией case, использовала только одноименный оператор.
И, если можно, запрос на DSQL. Заранее благодарна )
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Запрос на DSQL

Сообщение edward_K »

ищите TSQL
например на microsoft - там все расписано подробно и с примерами
не все, но процентов 70 на DSQL пашет.
В вашем случае можно юзать
left join
inner join
outer apply(только на MSSQL)
также можно через запятую перечислять во from и where почти как в галактике писать(меняя условия местами и == на = ), но я этим не пользуюсь.
Подзапросы в полях или в where мне не нравятся.
И если писать case как там написано (2 варианта есть), то тоже все работает.
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Запрос на DSQL

Сообщение 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. Почему в логе пишется, что невозможно открыть таблицу?
oiko
Местный житель
Сообщения: 419
Зарегистрирован: 29 мар 2005, 17:49

Re: Запрос на DSQL

Сообщение oiko »

Не претендую на последние обновления но таблицы HISTPSNDATA у меня в словаре нет.
Попробуйте еще раз конвертировать adf-to-ddf и гляньте средствами Первазива структуру таблиц.
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Запрос на DSQL

Сообщение Irina_ »

Указанной таблицы (ее код 32663) у Вас нет видно потому, что мы на сопровождении в РБ. И думаю, что эта таблица была не всегда, а появилась после какой-то установки патчей с докомпиляцией словаря БД. В Support таблица открывается, в ней есть данные. И они выводятся, если запрос на SQL (см. 1-ый запрос в исходном обращении).
Подскажите пожалуйста, «конвертировать adf-to-ddf» - как это сделать?
oiko
Местный житель
Сообщения: 419
Зарегистрирован: 29 мар 2005, 17:49

Re: Запрос на DSQL

Сообщение oiko »

Support - конвертер словаря БД для Pervasive SQL
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Запрос на DSQL

Сообщение Irina_ »

Правильно ли я понимаю, что это модуль или пункт меню в Support? Если да, то у себя такого не нашла.
oiko
Местный житель
Сообщения: 419
Зарегистрирован: 29 мар 2005, 17:49

Re: Запрос на DSQL

Сообщение oiko »

Да в лицензии на суппорт должна быть строка ADF2DDFMAIN
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Запрос на DSQL

Сообщение 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;
Ответить