Как реализовать в ADO запросе??? (в Delphi 7)

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

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

Ответить
salex
Сообщения: 4
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Уральский
Контактная информация:

Как реализовать в ADO запросе??? (в Delphi 7)

Сообщение salex »

Как реализовать в ADOQuery запрос, который по работе был аналогичен следующему запросу САППОРТА-SQL:

select transp.nrec,transp.atl_lastdate (fieldname=atl_date),transp.atl_lasttime (fieldname=atl_time),transp.corg
,tiptex.name (fieldname=tipts),tiptex.nrec (fieldname=ctipts),marka.nm (fieldname=marka)
,marka.nrec (fieldname=cmarka),transp.nomer,toplivo.name(fieldname=toplivo),toplivo.nrec (fieldname=ctopl)
,morale.name(fieldname=podr),morale.nrec (fieldname=cpodr)
from transp,marka,tiptex,morale,toplivo

where ((transp.cmarka/==marka.nrec and marka.ctiptex/==tiptex.nrec and transp.klassif7/==morale.nrec
and marka.ctoplivo/==toplivo.nrec)) and 0=transp.tiptc
to dbf dbf\transp.dbf;

А Точнее как правильно реализовать связки в запросе ADOQuery???
mik
Новичок
Сообщения: 25
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение mik »

для MS SQL (как для других платформ, не знаю)

== идут как inner join
/== идет как left outer join

=(равно) остается как и есть

Имена таблиц начинаются с T$(например T$Transp - это Transp)
имена полей начинаются с F$(например F$Nrec - это Nrec)

только в DBF придется экспортировать через другой TADOQuery
но эт думаю не проблема
salex
Сообщения: 4
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Уральский
Контактная информация:

Сообщение salex »

Я писал запрос: (Pervasive v8.)
select Convert(t.nrec,SQL_CHAR)+'' as nrec, t.atl_lastdate as atl_date
,t.atl_lasttime as atl_time, Сonvert(t.corg,SQL_CHAR)+'' as corg, tiptex.name as tipts, Convert(tiptex.nrec,SQL_CHAR)+'' as ctipts, marka.nm as marka, Convert(marka.nrec,SQL_CHAR)+'' as cmarka, t.nomer, toplivo.name as toplivo, Convert(toplivo.nrec,SQL_CHAR)+'' as ctopl, morale.name as podr, Convert(morale.nrec,SQL_CHAR)+'' as cpodr
from tiptex,transp t
left outer join morale on t.klassif7=morale.nrec
left outer join marka on t.cmarka=marka.nrec
left outer join toplivo on marka.ctoplivo=toplivo.nrec
where
marka.ctiptex=tiptex.nrec and 0=t.tiptc and t.corg=281474976710665
order by t.nomer

в 7.11 он работал нормально, а вот в 7.12 вылетает по ошибке.
Ошибка связана с мягкой сцепкой галактики (==),
она не отрабатывает, ругается и все тут.

Подскажите что я не правильно понимаю? Или как лучше перевести на язык SQl (не атлантиковский) приведенный в начале запрос?
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

mik писал(а):для MS SQL (как для других платформ, не знаю)

== идут как inner join
/== идет как left outer join
вроде бы - как-раз наоборот
mik
Новичок
Сообщения: 25
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение mik »

первасива, повторюсь, в глаза не видел.
аналог твоего запроса - переделанный но для MS SQL и почти без условий. у меня отрабатывает.
может и поможет.
select
t.F$atl_lastdate,
t.F$atl_lasttime,
t.F$nrec,
T$morale.F$name,
t.F$corg,
T$tiptex.F$name as tipts,
T$tiptex.F$nrec as ctipts,
T$marka.F$nm as marka,
T$marka.F$nrec,
t.F$nomer,
T$toplivo.F$name as toplivo,
T$toplivo.F$nrec as ctopl,
T$morale.F$name as podr,
T$morale.F$nrec as cpodr
from T$transp t
left outer join T$morale on t.F$klassif7=T$morale.F$nrec and t.F$tiptc=0
left outer join T$marka on t.F$cmarka=T$marka.F$nrec
left outer join T$toplivo on T$marka.F$ctoplivo=T$toplivo.F$nrec
inner join T$tiptex on T$marka.F$ctiptex=T$tiptex.F$nrec
order by t.F$nomer
mik
Новичок
Сообщения: 25
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение mik »

как-раз наоборот
пардоньте.
ошибся :-?
Vlad
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Красноярск

Сообщение Vlad »

Вопрос по компоненту ADOQuery?
У меня не получается использовать свойство Filter для поля F$Nrec.
Поделитесь опытом, плиз.
AlexPK
Сообщения: 7
Зарегистрирован: 13 дек 2005, 11:33

Сообщение AlexPK »

заляни в тему Delphi+Titan+Pervasive nrec
Vlad
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Красноярск

Сообщение Vlad »

AlexPK писал(а):заляни в тему Delphi+Titan+Pervasive nrec
пишу под SqlServer
AlexPK
Сообщения: 7
Зарегистрирован: 13 дек 2005, 11:33

Сообщение AlexPK »

Ну не знаю. Если поле Nrec в SQL Server 64 битное то проблема таже - в ADODB.pas
mik
Новичок
Сообщения: 25
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение mik »

Да. есть проблемы, по крайней мере в 6м делфи.
в MS SQL поле F$nrec 8 байт => можно использовать функции преобразования. Например Cast(F$nrec as bigint) и с результатом уже работать. но тут тоже не все так гладко. на некоторых значениях нрека(сконверченного в BigInt) в делфи вываливаются ошибки преобразования Variant to не помню что..
(такое видел при использовании Locate('F$nrec',qry.FieldByName('f$nrec').value,[]) а так же в локупкомбобоксе в котором нрек идет как KeyField.).
В фильтре не знаю какое будет поведение.. посмотри.
Если ошибка будет возникать, можно до кучи конвертить БигИнт в стринг или варчар... и по нему накладывать фильтр.

и еще.
Научный тык показал что чтобы получить значение типа Comp (Галактиканский Comp)
можно использовать след-ю не большую функцию(тут прямая и обратная функция):

CREATE FUNCTION NrecAsGalComp (@NREC Binary(8))
RETURNS BIGINT AS
BEGIN
RETURN cast(@NREC as BIGINT) - cast(0x8000000000000000 as BIGINT)
END

CREATE FUNCTION GalCompAsBinary (@NREC bigInt)
RETURNS binary(8) AS
BEGIN
RETURN cast( (@NREC + cast(0x8000000000000000 as BIGINT)) as binary(8))
END

удачи
Vlad
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Красноярск

Сообщение Vlad »

Ок, спасибо... Буду разбираться позже, сейчас решил отказаться от идеи использовать AdoQuery.Filter. Фильтрую обычным запросом, т.е.
adoQuery.sql.text:='select ...where f$nrec=0x8000000000000000'
mik
Новичок
Сообщения: 25
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение mik »

Не обязательно делать так.
Можно запузырить результат запроса во временную таблицу(MT) и с ней уже работать как со всеми таблицами галактики.
Ответить