Страница 1 из 1

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

Добавлено: 29 ноя 2005, 13:49
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???

Добавлено: 29 ноя 2005, 16:47
mik
для MS SQL (как для других платформ, не знаю)

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

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

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

только в DBF придется экспортировать через другой TADOQuery
но эт думаю не проблема

Добавлено: 29 ноя 2005, 17:23
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 (не атлантиковский) приведенный в начале запрос?

Добавлено: 29 ноя 2005, 18:09
coolibin
mik писал(а):для MS SQL (как для других платформ, не знаю)

== идут как inner join
/== идет как left outer join
вроде бы - как-раз наоборот

Добавлено: 29 ноя 2005, 18:18
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

Добавлено: 29 ноя 2005, 18:22
mik
как-раз наоборот
пардоньте.
ошибся :-?

Добавлено: 16 дек 2005, 14:12
Vlad
Вопрос по компоненту ADOQuery?
У меня не получается использовать свойство Filter для поля F$Nrec.
Поделитесь опытом, плиз.

Добавлено: 16 дек 2005, 15:50
AlexPK
заляни в тему Delphi+Titan+Pervasive nrec

Добавлено: 16 дек 2005, 15:59
Vlad
AlexPK писал(а):заляни в тему Delphi+Titan+Pervasive nrec
пишу под SqlServer

Добавлено: 16 дек 2005, 16:36
AlexPK
Ну не знаю. Если поле Nrec в SQL Server 64 битное то проблема таже - в ADODB.pas

Добавлено: 19 дек 2005, 06:56
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

удачи

Добавлено: 20 дек 2005, 09:43
Vlad
Ок, спасибо... Буду разбираться позже, сейчас решил отказаться от идеи использовать AdoQuery.Filter. Фильтрую обычным запросом, т.е.
adoQuery.sql.text:='select ...where f$nrec=0x8000000000000000'

Добавлено: 20 дек 2005, 10:48
mik
Не обязательно делать так.
Можно запузырить результат запроса во временную таблицу(MT) и с ней уже работать как со всеми таблицами галактики.