Как реализовать в ADO запросе??? (в Delphi 7)
Модераторы: m0p3e, edward_K, Модераторы
Как реализовать в ADO запросе??? (в Delphi 7)
Как реализовать в 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???
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???
для MS SQL (как для других платформ, не знаю)
== идут как inner join
/== идет как left outer join
=(равно) остается как и есть
Имена таблиц начинаются с T$(например T$Transp - это Transp)
имена полей начинаются с F$(например F$Nrec - это Nrec)
только в DBF придется экспортировать через другой TADOQuery
но эт думаю не проблема
== идут как inner join
/== идет как left outer join
=(равно) остается как и есть
Имена таблиц начинаются с T$(например T$Transp - это Transp)
имена полей начинаются с F$(например F$Nrec - это Nrec)
только в DBF придется экспортировать через другой TADOQuery
но эт думаю не проблема
Я писал запрос: (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 (не атлантиковский) приведенный в начале запрос?
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 (не атлантиковский) приведенный в начале запрос?
первасива, повторюсь, в глаза не видел.
аналог твоего запроса - переделанный но для 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
аналог твоего запроса - переделанный но для 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
Да. есть проблемы, по крайней мере в 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
удачи
в 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
удачи