Как правильно в SQL-запросе
Select messages from
# through # FAQ
[/[Print]\]

-> Программирование отчетов в БЭСТ-5

#1: Как правильно в SQL-запросе Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 24 Oct 2007 12:31
    —
Я формирую в плагине временный файл в каталоге для временных файлов, например GlobalTmpPath+"tmpopl.dbf"
Как правильно написать select по этому файлу в SQL-запросе, заданном в форме?
select * from ? as fi

#2:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 10:09
    —
Добрый день!
Объект Запрос применяется только к таблицам находящимся в папке предприятия. Если необходимо обратится к другим таблицам, то необходимо использовать источники Foxpro (для БЭСТ-5) или WinReport (для БЭСТ-4+).

#3:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 11:01
    —
Видно, что-то я не так сказала и меня не поняли
Я из накладной БЭСТ-4 применяю Winreport, чтобы вызвать форму, в форме строю свой источник (TrfADSQuery), но хочу обратиться в свойстве SQL не к файлу из каталога sclad, а к временному файлу. Это что, невозможно? Я знаю путь и имя этого файла (различны для разных пользователей) и могла бы передать их в форму, но не знаю как. Передавать временый файл как параметр Winreport не хотелось бы (так как портятся blob-поля с картинками, см http://www.bestnet.ru/club/phpBB/viewtopic.php?t=8659&start=15&sid=aa6becfdd91d387809458f7dbc7b05ec)

Когда я этот временный файл перекладываю в папку sclad, все работает по select * from [sclad\tmpopl] as fi. Но разве нельзя вместо этого [sclad\tmpopl] задать другой реальный путь типа c:\temp\tmpopl, может быть передать его ИМЯ в источнике - втором параметре WinReport или еще как-то? Проблема не в том, чтобы сформировать временный файл не в той папке, а в том, что у каждого пользователя свой временный файл с другим именем

Вообще, можно ли использовать переменные Дизайнера в свойстве SQL своего источника TrfADSQuery?

Временный файл в моем случае - список картинок к товарам накладной (вариант а) или просто список товаров накладной для вытаскивания картинок из большого файла по join. Использовать прямо [sclad\mdocm] у меня не получается, т к вылезают все накладные, а не только моя. Я обычно работала через временный файл

#4:  Author: Дениска PostPosted: 25 Oct 2007 14:02
    —
Попробуйте использовать where для доступа к sclad\mdocm

#5:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 14:19
    —
Марина wrote:
Передавать временый файл как параметр Winreport не хотелось бы (так как портятся blob-поля с картинками
Именно, это я Вам и предлогал. Но раз это не подходит, то необходимо делать так как Вы описали ниже:
Марина wrote:
Когда я этот временный файл перекладываю в папку sclad, все работает по select * from [sclad\tmpopl] as fi. Но разве нельзя вместо этого [sclad\tmpopl] задать другой реальный путь типа c:\temp\tmpopl
Нет нельзя так как SQL обращаются только к базе данных БЭСТ-4+.
Марина wrote:
Вообще, можно ли использовать переменные Дизайнера в свойстве SQL своего источника TrfADSQuery?
Нет использовать переменные нельзя. Но этот вопрос можно решить по другому: сформировать текст запроса в переменной (с использованием переменных) и задать его в свойство SQL.
Code:
cSql := 'SELECT .....';
<имя_запроса>.SQL := cSql;
<имя_запроса>.Open;

Марина wrote:
Временный файл в моем случае - список картинок к товарам накладной (вариант а) или просто список товаров накладной для вытаскивания картинок из большого файла по join. Использовать прямо [sclad\mdocm] у меня не получается, т к вылезают все накладные, а не только моя. Я обычно работала через временный файл
Для решения этого вопросы Вам необходимо в источнике передать реквизиты печатаемого документа и сделать фильтр в источнике.

#6:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 14:21
    —
Дениска wrote:
Попробуйте использовать where для доступа к sclad\mdocm

Но опять же в этом where надо задать хотя бы numdoc=, а к DataSet1 обращаться нельзя. Как же бы

#7:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 14:41
    —
dshlykov wrote:
Но этот вопрос можно решить по другому: сформировать текст запроса в переменной (с использованием переменных) и задать его в свойство SQL.
Code:
cSql := 'SELECT .....';
<имя_запроса>.SQL := cSql;
<имя_запроса>.Open;


В какую секцию или форму я должна затолкать этот текст? Пробовала ставить в Report Title в OnBeforPrint, но это присваивание не работает, а работает то свойство SQL, которое было первоначально задано в инспекторе объектов при описании запроса.

#8:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 14:43
    —
Марина wrote:
Но опять же в этом where надо задать хотя бы numdoc=, а к DataSet1 обращаться нельзя. Как же быть?
Это решается через параметры запроса
Code:
numdoc=:p1
. Далее заходите в свойство Params устанавливаете тип параметра и его значение. Значение параметра можно установить и в коде:
Code:
<имя_запрсоса>.Params['<имя_параметра>'] := <значение>;

Марина wrote:
В какую секцию или форму я должна затолкать этот текст? Пробовала ставить в Report Title в OnBeforPrint, но это присваивание не работает, а работает то свойство SQL, которое было первоначально задано в инспекторе объектов при описании запроса.
Обычно все операции с источниками делаются на карточке запроса. Или в событии Onclick кнопки Выполнить или в событии OnActivate в карточке запроса (если пользователь не задает параметры отчета). Проверьте свойство Active запроса, оно должно иметь значение False так как Вы будете изменять его параметры. Если значение стоит True запрос перерасчитыватся не будет!

Last edited by dshlykov on 25 Oct 2007 14:49; edited 1 time in total

#9:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 14:47
    —
dshlykov wrote:
Для решения этого вопросы Вам необходимо в источнике передать реквизиты печатаемого документа и сделать фильтр в источнике.

Передать реквизиты в источнике - это передача через первый параметр WinReport в Dataset1 ? или как? (БЭСТ-4) Как правильно поставить выражение в фильтре?
select * from [sclad\mdocm] as nak
Выражение в фильтре nak.numdoc=[DialogForm.DataSet1."Номер_док"] не работает. Пробовала кругом добавлять квадратные скобки, ничего не получилось, ругается на филь

#10:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 14:51
    —
Марина wrote:
Передать реквизиты в источнике - это передача через первый параметр WinReport в Dataset1 ?
Да так.

Марина wrote:
(БЭСТ-4) Как правильно поставить выражение в фильтре?
Смотрите предыдущее сообщение где я описал работу с параметрам

#11:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 14:56
    —
а где я должна написать numdoc=:p1?

#12:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 15:02
    —
Марина wrote:
а где я должна написать numdoc=:p1?

В тексте запроса:
Code:
select * from [sclad\mdocm] as nak Where nak.numdoc=:p1

#13:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 15:04
    —
dshlykov wrote:
Марина wrote:
В какую секцию или форму я должна затолкать этот текст? Пробовала ставить в Report Title в OnBeforPrint, но это присваивание не работает, а работает то свойство SQL, которое было первоначально задано в инспекторе объектов при описании запроса.
Обычно все операции с источниками делаются на карточке запроса. Или в событии Onclick кнопки Выполнить или в событии OnActivate в карточке запроса (если пользователь не задает параметры отчета). Проверьте свойство Active запроса, оно должно иметь значение False так как Вы будете изменять его параметры. Если значение стоит True запрос перерасчитыватся не будет!

Пробовала и в событии Onclick кнопки Выполнить, и в событии OnActivate в карточке запроса, запрос не изменяется! Свойство Active запроса стоит False.

#14:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 15:13
    —
Проверьте значение свойства Active перед заполнением свойства SQL:
Code:
MESSAGEBOX(<имя запроса>.Active);
Если значение будет равно true, то значит запрос открывается программно - это необходимо исправи

#15:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 15:56
    —
Code:

 cSql:='select img.nnum, img.image, img.partia'+;
        ' from [sclad\spartimg] as img'+;
        ' inner join '+[DialogForm.DataSet1."finame"]+' as tmp'+;
        ' on tmp.nnum=img.nnum and tmp.partia=img.partia';
  MESSAGEBOX(Query1.Active);
  DialogForm.Query1.Sql:=cSql;
  DialogForm.Query1.Open;

Код в свойстве OnActivate кнопки. MESSAGEBOX ничего не сказал, как будто не сработал!

#16:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 16:02
    —
Марина wrote:
Код в свойстве OnActivate кнопки. MESSAGEBOX ничего не сказал, как будто не сработал!
А он и не дошел до него. Так как код написан с ошибкой. Правильный код такой:
Code:
  cSql:='select img.nnum, img.image, img.partia'+
        ' from [sclad\spartimg] as img'+
        ' inner join '+[DialogForm.DataSet1."finame"]+' as tmp'+
        ' on tmp.nnum=img.nnum and tmp.partia=img.partia';
  Query1.Sql:=cSql;
  Query1.Open;

#17:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 25 Oct 2007 16:42
    —
Теперь страшно ругается, что можно использовать только CREATE,DROP,SELECT и т п. проверила, ноименование файла попадает в датасет1 правильн

#18:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 25 Oct 2007 17:00
    —
Марина wrote:
Теперь страшно ругается, что можно использовать только CREATE,DROP,SELECT и т п. проверила, ноименование файла попадает в датасет1 правильно
Файл лежит вне каталога базы данных БЭСТ-4+? Если да то ошибка понятна почему - мы об этом говорили выше. Если в каталоге с базой данных то как передается его имя конкретно (если можно напишите пример)?

#19:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 26 Oct 2007 08:14
    —
Теперь этот пример получился. Просто удалила cSql из словаря данных, хотя и не поняла, что там с ним могло плохого происходи

#20:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 26 Oct 2007 08:43
    —
Давайте пожалуйста еще доконаем пример с параметрами. Пока я пишу
Code:

select nnum, image, partia
from [sclad\mdocm] as nak
where nak.numdoc=:p1 and nak.date=:p2

то все работает,
но стоит только добавить join, как все ломается
Code:

select img.nnum, img.image, img.partia
from [sclad\mdocm] as nak
where nak.numdoc=:p1 and nak.date=:p2
outer join [sclad\spartimg] as img
on nak.nnum=img.nnum and nak.partia=img.partia

Что, в случае использования параметров нельзя использовать join, или надо искать неверный синтаксис?
ругается "Unenspected token: outer: found extra tokens after enspected end of statement -- location of error in the sql statement is 108 (line1, column1)"

#21:  Author: dshlykovLocation: Дмитрий Шлыков PostPosted: 26 Oct 2007 09:45
    —
Добрый день!
Марина wrote:

но стоит только добавить join, как все ломается
Code:

select img.nnum, img.image, img.partia
from [sclad\mdocm] as nak
where nak.numdoc=:p1 and nak.date=:p2
outer join [sclad\spartimg] as img
on nak.nnum=img.nnum and nak.partia=img.partia
Я так понимаю, что ошибка в тексте запроса:
1. Описание таблиц делается в опции FROM, а не WHERE.
2. Опиця OUTER может использоватся только вместе с опциями LEFT или RIGHT.
По этому ваш запрос должен иметь вид:
Code:
select img.nnum, img.image, img.partia
from [sclad\mdocm] as nak LEFT outer join [sclad\spartimg] as img
on nak.nnum=img.nnum and nak.partia=img.partia
where nak.numdoc=:p1 and nak.date=:p2

#22:  Author: Дениска PostPosted: 26 Oct 2007 10:01
    —
Марина wrote:

Code:

select img.nnum, img.image, img.partia
from [sclad\mdocm] as nak
where nak.numdoc=:p1 and nak.date=:p2
outer join [sclad\spartimg] as img
on nak.nnum=img.nnum and nak.partia=img.partia



А что должен делать этот код?

#23:  Author: МаринаLocation: Кондрина Марина Александровна PostPosted: 26 Oct 2007 10:38
    —
Большое Вам спасибо, теперь все стало поня



-> Программирование отчетов в БЭСТ-5


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group