OR в условии Where

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

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

Ответить
Nathaly
Сообщения: 10
Зарегистрирован: 04 апр 2006, 13:51
Контактная информация:

OR в условии Where

Сообщение Nathaly »

Подскажите пожалуйста, как правильно написать на галактическом SQL в условии отбора записей, чтобы поле OBOROT.CSOPRDOC равнялось либо полю PLPOR.NREC либо BASEFIN.NREC?
Следующий вариан не проходит:

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

select
...
where
(((OBOROT.CSOPRDOC==PLPOR.NREC AND
  OBOROT.KAUKS[1]==KATORG.NREC AND
  OBOROT.KAUKS[2]==BASEDOC.NREC) OR
  OBOROT.CSOPRDOC==BASEFIN.NREC
)) AND
(OBOROT.KRSCHETK='62' AND OBOROT.SUBSCHK='07')
oiko
Местный житель
Сообщения: 418
Зарегистрирован: 29 мар 2005, 17:49

Сообщение oiko »

Через синоним oborot - один свяжите с plpor другой c basefin
Nathaly
Сообщения: 10
Зарегистрирован: 04 апр 2006, 13:51
Контактная информация:

Сообщение Nathaly »

Конкретизирую вопрос

Есть следующий запрос

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

!Представление T1 содержит данные, относящиеся к оборотам по кредиту сч.62.07 за период  c T1.d1 по T1.d2
.create view T1
var
 d1: date
 d2: date
as select *
from OBOROT, PLPOR, KATORG, BASEDOC,
where
   ((OBOROT.CSOPRDOC/==PLPOR.NREC  AND
     OBOROT.KAUKS[1]=KATORG.NREC      AND
     OBOROT.KAUKS[2]=BASEDOC.NREC)) AND
   (OBOROT.KRSCHETK='62' AND OBOROT.SUBSCHK='07')
   AND OBOROT.DATOB>=T1.d1
   AND OBOROT.DATOB<=T1.d2
ORDER BY
  T1.OBOROT.DATOB,
  T1.PLPOR.NODOK,
  T1.KATORG.NAME,
  T1.BASEDOC.NODOC  ;
Здесь по таблице проводок (Oborot) вытаскиваются данные из платежных документов (Plpor) по условию OBOROT.CSOPRDOC/==PLPOR.NREC (по сслыке на документ).
Но дело в том, OBOROT.CSOPRDOC не всегда ссылается на PLPOR, иногда в нужных проводках ссылка идет на BASEFIN.
То есть, теперь надо, чтоб OBOROT.CSOPRDOC был связан не только c PLPOR.NREC, но и с Basefin.Nrec (типа если нет в плпоре, то смотреть в бейсфине).

Как правильно это написать?
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Смотрите поля tidk & tidkgal в oborot
И вообще, может я и ошибаюсь, но вроде csoprdoc -ссылка на первичный документ (счет, накладная, платежка, бухсправка и т.п.)
Таблица проводок вроде как не должна ссылаться на таблицу разноски basefin
Nathaly
Сообщения: 10
Зарегистрирован: 04 апр 2006, 13:51
Контактная информация:

Сообщение Nathaly »

в случае акта взаимозачета - на basefin и ссылается, т.к. таблицы документов "акты взаимозачета" не как таковой, они все в basefin и лежат, с tidk=71
Nathaly
Сообщения: 10
Зарегистрирован: 04 апр 2006, 13:51
Контактная информация:

Сообщение Nathaly »

то есть если tidk<>71, то в OBOROT.CSOPRDOC/==PLPOR.NREC, иначе OBOROT.CSOPRDOC/==BASEFIN.NREC
вот это я как раз и не могу сделать
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

блин. да не получится у вас подсоединить таблицу через OR

делайте
...
and oborot.csoprdoc == plpor.nrec
and oborot.csoprdoc == ещё что то .nrec
........

далее в цикле в зависимости от типа oborot.tidk берите ту или иную подчинённую таблицу и поле из неё.

Кстати, оборот на basefin не ссылается ни как.
Nathaly
Сообщения: 10
Зарегистрирован: 04 апр 2006, 13:51
Контактная информация:

Сообщение Nathaly »

Ссылается (во всяком случае для 7.12) - я проверила ... по акту взаимозачета (oborot.tidk=71) oborot.csoprdoc ссылается на basefin.nrec, и уже в этой записи basefin есть ссылка на plpor.nrec (cPlpor), а в plpor.tidk этогог самого акта уже 70
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

Я года 2 назад писала Книгу доходов/расходов по УСНО - тоже собирала по проводкам документы - во временную таблицу собирала по разным типам записей.
Это дело реализовала несколькими интерфейсами: в каждом интерфейсе отбирался свой тип данных.
Вот например мои выборки:
из KatSopr:

....SELECT *
FROM Oborot, KatSopr, KatOrg, KatPodr, SYNONYM KatPodr KatPodrTo, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==KatSopr.Nrec
and KatSopr.cOrg==KatOrg.Nrec
and KatSopr.cPodrFrom==KatPodr.Nrec
and KatSopr.cPodrTo==KatPodrTo.Nrec
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (101=Oborot.TidkGal
OR 102=Oborot.TidkGal
OR 103=Oborot.TidkGal
OR 106=Oborot.TidkGal
OR 201=Oborot.TidkGal
OR 202=Oborot.TidkGal
OR 203=Oborot.TidkGal
OR 204=Oborot.TidkGal
OR 206=Oborot.TidkGal
OR 111=Oborot.TidkGal
OR 211=Oborot.TidkGal
OR 151=Oborot.TidkGal
OR 251=Oborot.TidkGal
OR 501=Oborot.TidkGal
OR 502=Oborot.TidkGal
OR 503=Oborot.TidkGal
OR 504=Oborot.TidkGal
OR 505=Oborot.TidkGal
OR 506=Oborot.TidkGal
OR 508=Oborot.TidkGal
OR 511=Oborot.TidkGal
OR 512=Oborot.TidkGal
OR 513=Oborot.TidkGal
OR 521=Oborot.TidkGal
OR 522=Oborot.TidkGal
OR 523=Oborot.TidkGal
OR 532=Oborot.TidkGal
OR 533=Oborot.TidkGal
OR 535=Oborot.TidkGal
OR 600=Oborot.TidkGal
OR 601=Oborot.TidkGal
OR 602=Oborot.TidkGal
OR 603=Oborot.TidkGal
OR 604=Oborot.TidkGal
OR 605=Oborot.TidkGal
OR 611=Oborot.TidkGal
OR 612=Oborot.TidkGal
OR 620=Oborot.TidkGal
OR 621=Oborot.TidkGal
OR 622=Oborot.TidkGal
OR 623=Oborot.TidkGal
OR 624=Oborot.TidkGal
OR 625=Oborot.TidkGal
OR 700=Oborot.TidkGal)
;

из PLPor:

SELECT *
FROM Oborot, PlPor, KatOrg, SYNONYM KatOrg KatOrgPlat, SYNONYM KatOrg KatOrgPol, Persons, SpKau, HozOper, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==PlPor.Nrec
and PlPor.cPLatNew==KatOrg.Nrec // контрагент, за которого платили
and PlPor.cPLat==KatOrgPlat.Nrec // плательщик
and PlPor.cPol==KatOrgPol.Nrec // получатель
and PlPor.cPersons==Persons.Nrec // получатель
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (1=Oborot.TidkGal
OR 2=Oborot.TidkGal
OR 3=Oborot.TidkGal
OR 4=Oborot.TidkGal
OR 5=Oborot.TidkGal
OR 6=Oborot.TidkGal
OR 7=Oborot.TidkGal
OR 8=Oborot.TidkGal
OR 9=Oborot.TidkGal
OR 10=Oborot.TidkGal
OR 11=Oborot.TidkGal
OR 17=Oborot.TidkGal
OR 18=Oborot.TidkGal
OR 21=Oborot.TidkGal
OR 22=Oborot.TidkGal
OR 27=Oborot.TidkGal
OR 30=Oborot.TidkGal
OR 31=Oborot.TidkGal
OR 32=Oborot.TidkGal
OR 33=Oborot.TidkGal
OR 37=Oborot.TidkGal
OR 38=Oborot.TidkGal
OR 39=Oborot.TidkGal
OR 70=Oborot.TidkGal
OR 1004=Oborot.TidkGal
OR 1005=Oborot.TidkGal
OR 1011=Oborot.TidkGal
OR 1030=Oborot.TidkGal
OR 1032=Oborot.TidkGal)
;

по векселям:

SELECT *
FROM Oborot, AppVeks, KatOrg, SYNONYM KatOrg KatOrgZa, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==AppVeks.Nrec
and AppVeks.cOrg==KatOrg.Nrec // контрагент
and AppVeks.cNRez==KatOrgZa.Nrec // за кого платеж
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (81=Oborot.TidkGal
OR 82=Oborot.TidkGal
OR 83=Oborot.TidkGal
OR 84=Oborot.TidkGal
OR 85=Oborot.TidkGal
OR 86=Oborot.TidkGal
OR 87=Oborot.TidkGal
OR 88=Oborot.TidkGal
OR 89=Oborot.TidkGal)
;


по книге покупок:

SELECT *
FROM Oborot, BookPrZk, KatOrg, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==BookPrZk.Nrec
and BookPrZk.cOrg==KatOrg.Nrec
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (74=Oborot.TidkGal
OR 75=Oborot.TidkGal
OR 76=Oborot.TidkGal
OR 77=Oborot.TidkGal)
;


по счетам - фактурам:

SELECT *
FROM Oborot, SchFact, KatOrg, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==SchFact.Nrec
and SchFact.cOrg==KatOrg.Nrec
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (72=Oborot.TidkGal
OR 73=Oborot.TidkGal)
;


по основным средствам:

SELECT *
FROM Oborot, SpMove, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==SpMove.Nrec
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (15=Oborot.TidkGal
OR 16=Oborot.TidkGal)
;


по приходу МБП:

SELECT *
FROM Oborot, MbpIn, KatOrg, KatPodr, SYNONYM KatPodr KatPodrTo, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==MbpIn.Nrec
and MbpIn.cOrg==KatOrg.Nrec
and MbpIn.cPodrF==KatPodr.Nrec
and MbpIn.cPodr==KatPodrTo.Nrec
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (12=Oborot.TidkGal
OR 20=Oborot.TidkGal
OR 28=Oborot.TidkGal
OR 80=Oborot.TidkGal
OR 704=Oborot.TidkGal)
;

по расходу МБП:

SELECT *
FROM Oborot, MbpOut, KatOrg, KatPodr, SYNONYM KatPodr KatPodrTo, HozOper, SpKau, TMP_n
WHERE ((
ROOT==Oborot.Nrec
and '3300'==Oborot.SchetK
and d1<<=Oborot.DatOb
and d2>>=Oborot.DatOb
and Oborot.cSoprDoc==MbpOut.Nrec
and Oborot.cHozOper==HozOper.Nrec
and Oborot.KAUOS[1]==SpKau.Nrec
and ROOT==TMP_n.NN_Nrec
and MyTidkGal==TMP_n.NN_TidkGal
and MycSoprDoc==TMP_n.NN_cSoprDoc
and MyKau==TMP_n.NN_Kau
))
and (13=Oborot.TidkGal
OR 19=Oborot.TidkGal
OR 29=Oborot.TidkGal
OR 703=Oborot.TidkGal)
;

Может быть вам это чем-нибудь поможет!
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Ссылается (во всяком случае для 7.12) - я проверила ... по акту взаимозачета (oborot.tidk=71) oborot.csoprdoc ссылается на basefin.nrec, и уже в этой записи basefin есть ссылка на plpor.nrec (cPlpor), а в plpor.tidk этогог самого акта уже 70
Возможно я не учел акт взаимозачетов, но это не меняет сути моего поста. Делайте как я написал, к проводке подцепляте все возможные (нужные) вам таблицы и уже в цикле (по проводкам) в зависимости от типа проводки (т.е. смотря какой первичный документ) берите необходимые Вам данные.
Deinis
Местный житель
Сообщения: 783
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение Deinis »

Когда-то делал отчет по Дебиторской Задолженности и приходилось "вытягивать" примечания из самих первичных документов, а не из ХозОпераций к этим документам. Для этой цели нарисовал 2 функции.
1-я функция определяет тип документа (таблицу)
2-я - вытаскивает примечание к документу
При этом все необходимые таблицы, как правильно заметил местный житель Алексей, должны быть подцеплены в разделе описания реляционных отношений.

1-я функция

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

// Функция определения типа документа: 
// GetTipDoc ( CurTiDkGal:word ) : string
// Возвращает название таблицы, в которой находится первичный документ:
// 'UNKNOWN' , 'PLPOR' , 'APPVEKS' , 'VEKSL' , 'VALUTDOC' , 'KATSOPR' , 'BASEDOC'
// Источник информации: http://www.tyumbit.ru/galaktika/read.php?f=5&i=5998&t=5974
Function GetTipDoc ( CurTiDkGal : word ) : string ;
  {
    GetTipDoc := 'UNKNOWN' ;
    case CurTiDkGal of
     // платежный документ (шапка в таблице PlPor):
     1..11, 17,18 ,21,22,27,30..33,37..39,70,1004,1005,1011,1032 : GetTipDoc := 'PLPOR' ;
     // акты из модуля "Векселя и кредиты" (шапка в таблице AppVeks)
     81..89   : GetTipDoc := 'APPVEKS' ;
     // документы из модуля "Векселя и кредиты" (шапка в таблице Veksl)
     181..190 : GetTipDoc := 'VEKSL' ;
     // валютный документ (шапка в таблице ValutDoc)
     34..36   : GetTipDoc := 'VALUTDOC' ;
     // Операция с ОС и НМА (шапка в таблице SpMove)
     15,16 : GetTipDoc := 'SPMOVE' ;
     // спецификация акта взаимозачета (шапка в таблице BaseFin)
     71 : GetTipDoc := 'BASEFIN' ;
     // сопроводительный документ (шапка в таблице KatSopr):
     101,102,103,106,110,111..114,151,201..204,206,211,251,501..506,508,511..513,521..523,551..553,600..606,611,612,621,622,624,625,630,700 : GetTipDoc := 'KATSOPR' ;
     // шапка в таблице BaseDoc
     40..43,51..53,61,62,90..95,550,919 : GetTipDoc :=  'BASEDOC' ;
    end;
  }
2-я функция

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

                        case GetTipDoc( tDescrRep.TiDkGal ) of
                          'APPVEKS' : {
                                        CurCalPlan := BaseFin.cCalPlan ;
                                        CurSodrDoc := soprAppVeks.Prim1 + ' ' + soprAppVeks.Prim2 + ' ' + soprAppVeks.Prim3 ;
                                      }
                          'PLPOR'   : {
                                        CurCalPlan := BaseFin.cCalPlan ;
                                        CurSodrDoc := soprPlPor.NamePl1 + ' ' + soprPlPor.NamePl2 + ' ' + soprPlPor.NamePl3 + ' ' + soprPlPor.NamePl4 + ' ' + soprPlPor.PodOtchet ;
!                                        Message('tDescrRep.cSoprDoc = ' + string(tDescrRep.cSoprDoc,0,0)+Char(13)+
!                                                'PlPor.nRec        = ' + string(soprPlPor.nRec,0,0)+Char(13)+
!                                                'SodrDoc =' + soprPlPor.NamePl1 + ' ' + soprPlPor.NamePl2 + ' ' + soprPlPor.NamePl3 + ' ' + soprPlPor.NamePl4 + ' ' + soprPlPor.PodOtchet
!                                               ) ;
                                      }
                          'BASEFIN' : {
                                        CurCalPlan := BaseFin.cCalPlan ;
                                        CurSodrDoc := soprAktVz.NamePl1 + ' ' + soprAktVz.NamePl2 + ' ' + soprAktVz.NamePl3 ;
                                      }
                          'KATSOPR' : {
                                        CurCalPlan := soprKatSopr.cCalPlan ;
                                        CurSodrDoc := soprKatSopr.Name ;
                                      }
                          'BASEDOC' : {
                                        CurCalPlan := soprBaseDoc.cCalPlan ;
                                        CurSodrDoc := soprBaseDoc.Name ;
                                      }
                        end ; // case
Ответить