Е П Р С Т

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ClaList

Е П Р С Т

Сообщение ClaList »

Hello clalist,

Создал новое приложение с нуля -
Вообще ничего не понимаю....


1. В базе SQL есть две _одинаковых_ таблицы Classes и tmpClasses

2. соответственно в словаре имеются такие же таблицы.
У них установлены (через диалог Edit Table Properties):

Database Driver: Microsoft SQL
Driver Options: /TRUSTEDCONNECTION=TRUE
Owner Name: SRV2003,Serteko,Real_2

(имя сервера - W2003EE, имя базы на MSSQL2k Developer Edition, имя пользователя в каталоге Active Directory)

Full PathName: dbo.Classes
dbo.tmpClasses

3. приложение С55(H)EE + ШВС(Clarion).
одно единственное главное окно (Window).
_пустое_

4. точка вставки: ProcedureInitialize

чтобы использовать имя таблицы tmpClasses, включаю его в раздел Tables -"OTHERS" в свойствах окна

REMOVE(tmpClasses)
CheckOpen(tmpClasses)

вариант 1:
tmpClasses{PROP:SQL} =
'SELECT IDClass,Name,Description FROM dbo.Classes'

- это не работает, результат контролирую с помощью Query Analyzer!!!!

вариант 2:
tmpClasses{PROP:SQL} = 'INSERT INTO dbo.tmpClasses SELECT IDClass,Name,Description FROM dbo.Classes'

- а это работает, результат имеется!

CLOSE(tmpClasses)

Я ничего не понимаю!

--
Best regards,
Иван mailto:shkmail@inbox.ru


(Добавление)

и я тоже ничего не понимаю :)
например - а КАК конкретно не работает (т.е. что ожидается и что есть в реале). Ну и какой, собственно, код используется для достижения ожидаемого результата.

--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757

Значит так! Начнем с начала.
При работе с SQL серевером из Clarion в DCT описываются НАБОРЫ ДАННЫХ (Record Set в терминах Delphi), которые могут совпадать с таблицами SQL, а могут и не совпадать. Вобщем случае, клиенту глубоко пофигу как там на сервере организованы данные. Он делает запрос и получает результат. Все! Вот для размещения результата запроса в приемном буфере клиента и нужно описание из DCT (а если использовать DynaLib + DirectODBC, то и описания не надо).
Есть еще одна важная рекомендация, не создавать таблицы на SQL средствами Clarion (через Create). Можно сгенерировать скрипт (хотябы через Data Modeller) и залить его на сервер. Но лучше создавать таблицы (да и вобще структуру данных) средствами SQL. Или чем еще по интереснее, вроде ERWin.

С уважением, Алексей Каминский
- это не работает, результат контролирую с помощью Query Analyzer!!!!
Правльно "не работает". Т.е. Select отработал, но результата ты всё равно не увидишь, поэтому оптимизатор сервака должен этот запрос опимизировать до нуля.

Оболочки, которые генерируют эти же запросы, на самом деле обрамляют их своими запросами, т.е. описывают как они хотят получить результат.
вариант 2:
tmpClasses{PROP:SQL} =
'INSERT INTO dbo.tmpClasses SELECT
IDClass,Name,Description FROM dbo.Classes'
Правильно, здесь ты описал, чего хочешь от результата (INSERT INTO).

Александр Агеев (aageev@satren.ru)

это что же оказывается?
это в каком же TFM об этом говорится?
ну, как говорится, кто-то на своих чем-то учится
итак...
============================================================
результат, возвращаемый через

AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...'

НЕ ЯВЛЯЕТСЯ таблицей (в смысле FILE)
(хотя NEXT использовать, естественно, можно)

например, ОКАЗЫВАЕТСЯ!!!, бесполезно пытаться узнать
количество полученных записей с помощью
RECORDS(AnySqlFile)
- результат всегда равен нулю!

таким образом и в таблице, размещенной на стороне SQL Server,
никаких изменений не происходит!

соответственно - использовать Browse для отображения
результата SELECT-а без дополнительной работы не получится.
потому что в виде FILE его (результата) не существует

============================================================
...поправьте, если я не прав...
============================================================

таким образом для того, чтобы пользователь имел возможность
просматривать результат запроса, необходимо:

1. либо сохранять результат в виде таблице на Server-е
(INSERT INTO ... SELECT ... FROM ...)
-> тогда имя таблицы должно быть в информационной системе
уникальным и создаваться динамически при формировании запроса
-> поля в Browse задаются через таблицу, объявленную в словаре,
а дальше в каждом потоке для задается уникальное имя
через BrowsableSqlFile{PROP:NAME}, таким образом каждый Browse
развертывается по таблице именно своего собственного потока

- (минусы) масса таблиц на сервере
- необходимость управления таблицами с уникальными именами
+ (плюсы) минимум работы по огранизации интерфейса,
возможность использовать стандартные шаблоны


2. либо сохранять результат в виде таблице на рабочей станции
(в любом формате, например TPS)
-> почти то же самое
-> тогда мы перегоняем все данные вручную (NEXT, ADD)
-> опять же в случае многопоточности или многозадачности
придется использовать уникальные таблицы

так что особых преимуществ у этого варианта практически нет


3. либо использовать QUEUE

-> перегоняем все данные в очередь вручную (NEXT, ADD)

+ работа только в оперативной памяти
- невозможно (а точнее мне неизвестно как) так же быстро, как и на
основе таблицы-FILE создать полноценный интерфейс

============================================================
вот...
планирую реализовавать вариант 1 - как наименее содержащий наименьшую долю работы по созданию интерфейса в Clarion-e, и, IMHO, более быстрый (из трех рассмотренных - может и еще есть варианты)

извиняйте за назойливость
СПАСИБО ВСЕМ

Отдельные благодарности (в алфавитном порядке):
============================================================
Александр Агеев <aageev@satren.ru> (Сатрен)
Бирюков Александр <baa@dionis.ru>
Vasiliy Goncharenko <Vasiliy.Goncharenko@jdidata.com> (JDI Data)
Alexey Kaminsky <ak@icntomsk.ru>
Andrew Myalin <andrew@arsis.ru>
Виктор Олейников <ovv@vniizht.ru>
Vadym Synyavskyy <vadim@softcreator.com> (SoftCreator)
Толмачев И.Л. <itolmachev@rosinter.ru>
Oleg Fomin <oleg@fomin.info>
Вячеслав Черников <support@finsoft.ryazan.ru>
============================================================

Иван Шкуропадский

(Добавление)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Сергей Половинкин <s.polovinkin@vaz.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 12:54:34
Тема: Е П Р С Т {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
> соответственно - использовать Browse для отображения
> результата SELECT-а без дополнительной работы не получится.
> потому что в виде FILE его (результата) не существует

Привет всем,
Вовсе нет можно и даже очень просто
SET(AnyFile)
AnyGFile{PROP:SQL} = 'SELECT * FROM AnyGFile WHERE ... '

LOOP
NEXT( AnyGFile)
IF ERRORCODE() =33 THEN BREAK.
...
END
...

Если для брауза удобнее пользоваться PROP:SQLFilter , оно короче.
Для ABC SELF.BrowseClass.View{PROP:SQLFilter}= ' фраза where '
SELF.BrowseClass.ApplyFilter()
SELF.BrowseClass.ResetQueue(Reset:Queue)
SELF.BrowseClass.TakeScroll(Event:ScrollTop)

Удачи..



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Иван Шкуропадский <shkmail@inbox.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 15:20:49
Тема: Е П Р С Т {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Сергей,

>> соответственно - использовать Browse для отображения
>> результата SELECT-а без дополнительной работы не получится.
>> потому что в виде FILE его (результата) не существует

СП> Привет всем,
СП> Вовсе нет можно и даже очень просто
СП> SET(AnyFile)
СП> AnyGFile{PROP:SQL} = 'SELECT * FROM AnyGFile WHERE ... '

СП> LOOP
СП> NEXT( AnyGFile)
СП> IF ERRORCODE() =33 THEN BREAK.
СП> ...
СП> END
СП> ...
и какая связь этого кода с браузом?

перебирать записи вручную я умею, как их вставлять в брауз?


СП> Если для брауза удобнее пользоваться PROP:SQLFilter , оно короче.





--
Best regards,
Иван mailto:shkmail@inbox.ru



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Andrew Myalin <andrew@arsis.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 13:33:47
Тема: Е П Р С Т {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello, Сергей!
You wrote to "clalist List Member" <clalist@clarion.ru> on Thu, 2 Sep 2004
13:54:34 +0500:


СП> Вовсе нет можно и даже очень просто
СП> SET(AnyFile)
СП> AnyGFile{PROP:SQL} = 'SELECT * FROM AnyGFile WHERE ... '

SELECT * ни в коем случае не используйте, перечисляйте колонки, завтра админ
расширит хотя бы на одно поле таблицу на которую этот SELECT ссылается и
программа будет выдавать уже ошибку.

Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Andrew Myalin <andrew@arsis.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 12:44:26
Тема: Е П Р С Т {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello, Иван!
You wrote to "clalist List Member" <clalist@clarion.ru> on Thu, 2 Sep 2004
10:44:21 +0400:

ИШ> AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...'

ИШ> НЕ ЯВЛЯЕТСЯ таблицей (в смысле FILE)
ИШ> (хотя NEXT использовать, естественно, можно)

не надо путать структуру FILE,DRIVER в программе как описание таблицы на
сервере, это может быть как таблица, так и логическое представление, так и
просто приёмный буфер

во всех случаях RECORD структура FILE,DRIVER структуры выступает в качестве
ТОЛЬКО приёмного буфера

в перввых двух случаях, не требуется самому формировать SELECT с
перечислением всех колонок, всё это будет раскручено внутри драйвера, все
SET/NEXT.... файловый функции в результате превратятся в нормальные SQL
запросы к бд, в последнем случае необходимо самому заботиться о формировании
SELECT конструкции (самому вести контроль на соответствие количества и
качества полей (имена полей в RECORD и в SELECT при этом не играют никакого
значения) в SELECT и в RECORD), ну и далее используя NEXT выгрести все
данные с сервера.

ИШ> например, ОКАЗЫВАЕТСЯ!!!, бесполезно пытаться узнать
ИШ> количество полученных записей с помощью
ИШ> RECORDS(AnySqlFile)
ИШ> - результат всегда равен нулю!

странное дело, в доке написано что
RECORDS(file) Y
RECORDS(key) Y

ну если всё таки имеет место быть данный баг то можно вот так:

заводим файл с одним полем (ULONG)

Файл{PROP:SQL} = 'SELECT COUNT(*) FROM ' & МойФайл{PROP:Name}
NEXT(Файл)
в RECORD попадёт результат данного запроса


ИШ> таким образом и в таблице, размещенной на стороне SQL Server,
ИШ> никаких изменений не происходит!

а какие могут происходить изменнеия в таблицах на серваке, когда мы только
читаем

ИШ> соответственно - использовать Browse для отображения
ИШ> результата SELECT-а без дополнительной работы не получится.
ИШ> потому что в виде FILE его (результата) не существует

FILE,DRIVER это грубо говоря SELECT запрос, Browse будет нормально работать

почему тебя зацыклило на создание какой то временной таблицы, какой бы
запрос не был,
у тебя по любому будут стоять объекты справа от FROM

если имеют место сложные SELECT запросы, то имеет смысл создать логическое
представление по данному SELECT запросу и описать в DCT эту структуру и
работать с ней - Browse, Form e.t.c

ИШ> ============================================================
ИШ> ...поправьте, если я не прав...
ИШ> ============================================================

ИШ> таким образом для того, чтобы пользователь имел возможность
ИШ> просматривать результат запроса, необходимо:

ИШ> 1. либо сохранять результат в виде таблице на Server-е
ИШ> (INSERT INTO ... SELECT ... FROM ...)
ИШ> -> тогда имя таблицы должно быть в информационной системе
ИШ> уникальным и создаваться динамически при формировании запроса
ИШ> -> поля в Browse задаются через таблицу, объявленную в словаре,
ИШ> а дальше в каждом потоке для задается уникальное имя
ИШ> через BrowsableSqlFile{PROP:NAME}, таким образом каждый Browse
ИШ> развертывается по таблице именно своего собственного потока

ИШ> - (минусы) масса таблиц на сервере
ИШ> - необходимость управления таблицами с уникальными именами
ИШ> + (плюсы) минимум работы по огранизации интерфейса,
ИШ> возможность использовать стандартные шаблоны

ИШ> 2. либо сохранять результат в виде таблице на рабочей станции
ИШ> (в любом формате, например TPS)
ИШ> -> почти то же самое
ИШ> -> тогда мы перегоняем все данные вручную (NEXT, ADD)
ИШ> -> опять же в случае многопоточности или многозадачности
ИШ> придется использовать уникальные таблицы

прелесть SQL и заключается в разгрузке сетевого траффика, а тут получается
наоборот, где спрашивается
в данном варианте многопользовательский режим работы ;)

ИШ> так что особых преимуществ у этого варианта практически нет

не имеет право на жизнь!

ИШ> 3. либо использовать QUEUE

уже отвечал, ну да ладно, если запрос сложный , обрами его
create view МояView as Твой SELECT
опиши струткуру в DCT
и работай в нормальной Browse

ИШ> -> перегоняем все данные в очередь вручную (NEXT, ADD)

ИШ> + работа только в оперативной памяти
ИШ> - невозможно (а точнее мне неизвестно как) так же быстро, как и на
ИШ> основе таблицы-FILE создать полноценный интерфейс

а что подразумевается под полноценным интерфейсом?
если Browse/Form, то я уже выше ответил


Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Иван Шкуропадский <shkmail@inbox.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 14:44:39
Тема: Е П Р С Т {01} {01} {01}
Файлы: test_sql.zip
--====----====----====----====----====----====----====----====----====----===--
Hello Andrew,

Thursday, September 2, 2004, 12:44:26 PM, you wrote:

ИШ>> соответственно - использовать Browse для отображения
ИШ>> результата SELECT-а без дополнительной работы не получится.
ИШ>> потому что в виде FILE его (результата) не существует

AM> FILE,DRIVER это грубо говоря SELECT запрос, Browse будет нормально работать

не работает... просмотреть сразу после запроса его результаты могу,
через NEXT, а вот Browse пустой...

я app и dct прикрепил - C55(H)EE ШВС... там совсем немного сделано.
ну что я не так сделал? точку вставки неправильно выбрал - допускаю,
или кроме того, что нужно сделать выборку, надо как-то на
Queue:Browse повлиять-обновить?


может этог SELECT в какую-нибудь хитрую точку вставки нужно вставлять?


AM> почему тебя зацыклило на создание какой то временной таблицы, какой бы
AM> запрос не был,
AM> у тебя по любому будут стоять объекты справа от FROM

AM> если имеют место сложные SELECT запросы, то имеет смысл создать логическое
AM> представление по данному SELECT запросу и описать в DCT эту структуру и
AM> работать с ней - Browse, Form e.t.c
Да хрен с ними - временными таблицами, я тут не могу понять: как к
Browse(ШВС) результат выборки подключить...



AM> Andrew Myalin

--
Best regards,
Иван mailto:shkmail@inbox.ru
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Nick Tsigouro <nick@arsis.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 15:31:19
Тема: Е П Р С Т {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hi.

> AM> FILE,DRIVER это грубо говоря SELECT запрос, Browse будет норма
> льно работать
>
> не работает... просмотреть сразу после запроса его результаты могу,
> через NEXT, а вот Browse пустой...

И НЕ ДОЛЖЕН. RTFM!

SET + первый NEXT формируют и исполняют SELECT ... FROM ... WHERE ... и
извлекают первую запись результирующей выборки. Последующие записи
извлекаются последующими NEXT-ами. И другого способа получить данные с
сиквела не дано. Prop:SQL всего лишь позволяет обойти автоматическое
формирование SELECT-а, а извлечение результата NEXT-ами никто не отменял.
Опять, _другого_способа_не_дано.
Кстати, из обычноно файла тоже не дано. Единовременно ты можешь получить
доступ только к той записи, которая лежит в буфере файла, и никак не более.

Когда ты пытаешься сделать Browse по своей фиктивной таблице, SET-NEXT
формируют запрос к НЕСУЩЕСТВУЮЩЕЙ на сервере таблице. Ес-но в результате
ничего нет.

>
> может этог SELECT в какую-нибудь хитрую точку вставки нужно вставлять?

Найди Set и попробуй сразу после него. Может получится малой кровью. Только
брауз д.б. не страничным, а то замучаешься SELECT-ы подменять.

WBR, Nick Tsigouro mailto:nick@arsis.ru
> --
> Best regards,
> Иван mailto:shkmail@inbox.ru



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Иван Шкуропадский <shkmail@inbox.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 16:19:58
Тема: Е П Р С Т {01} {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Nick,

>> AM> FILE,DRIVER это грубо говоря SELECT запрос, Browse будет норма
>> льно работать
>>
>> не работает... просмотреть сразу после запроса его результаты могу,
>> через NEXT, а вот Browse пустой...
NT> И НЕ ДОЛЖЕН. RTFM!

Да я и не спорю!
:)
Вот почему другие уверены, что все должно работать простой вставкой
file{PROP:SQL} = 'SELECT ... FROM ...'
неизвестно куда?


NT> SET + первый NEXT формируют и исполняют SELECT ... FROM ... WHERE ... и
NT> извлекают первую запись результирующей выборки. Последующие записи
NT> извлекаются последующими NEXT-ами. И другого способа получить данные с
NT> сиквела не дано. Prop:SQL всего лишь позволяет обойти автоматическое
NT> формирование SELECT-а, а извлечение результата NEXT-ами никто не отменял.
NT> Опять, _другого_способа_не_дано.
NT> Кстати, из обычноно файла тоже не дано. Единовременно ты можешь получить
NT> доступ только к той записи, которая лежит в буфере файла, и никак не более.

NT> Когда ты пытаешься сделать Browse по своей фиктивной таблице, SET-NEXT
NT> формируют запрос к НЕСУЩЕСТВУЮЩЕЙ на сервере таблице. Ес-но в результате
NT> ничего нет.
полностью согласен... опять же - может я с другими уважаемыми людьми
(в т.ч. именинниками) на другом языке разговаривал?

>>
>> может этог SELECT в какую-нибудь хитрую точку вставки нужно вставлять?
NT> Найди Set и попробуй сразу после него. Может получится малой кровью. Только
NT> брауз д.б. не страничным, а то замучаешься SELECT-ы подменять.
не буду мучать вас вопросами "как сделать Browse не страничным" :)
а в Source я куда только не вставлял.... ну да ладно...


NT> WBR, Nick Tsigouro mailto:nick@arsis.ru
--
Best regards,
Иван mailto:shkmail@inbox.ru



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Vadym Synyavskyy <vadim@softcreator.com>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 17:13:52
Тема: Е П Р С Т {01} {01} {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Иван,

Thursday, September 2, 2004, 8:19:58 AM, you wrote:

ИШ> Hello Nick,

>>> AM> FILE,DRIVER это грубо говоря SELECT запрос, Browse будет норма
>>> льно работать
>>>
>>> не работает... просмотреть сразу после запроса его результаты могу,
>>> через NEXT, а вот Browse пустой...
NT>> И НЕ ДОЛЖЕН. RTFM!

ИШ> Да я и не спорю!
ИШ> :)
ИШ> Вот почему другие уверены, что все должно работать простой вставкой
ИШ> file{PROP:SQL} = 'SELECT ... FROM ...'
ИШ> неизвестно куда?
А кто уверен? Если ты хочешь получать результат используя
сформированный руками полный запрос - о шаблоне браузинга можешь
забыть (можно конечно сказать об использовании abc-шного браузера в
режиме полной загрузки файла - но какой в нем смысл - убей ее вижу).
Ты получишь просто выборку, которую сможешь просмотреть в обычном ListBox-е.

>>> может этог SELECT в какую-нибудь хитрую точку вставки нужно вставлять?
NT>> Найди Set и попробуй сразу после него. Может получится малой кровью. Только
NT>> брауз д.б. не страничным, а то замучаешься SELECT-ы подменять.
ИШ> не буду мучать вас вопросами "как сделать Browse не страничным" :)
ИШ> а в Source я куда только не вставлял.... ну да ладно...
Давай вернемся к вопросу - а зачем тебе такие извращения с
использованим PROP:SQL? Ты не пробовал попытаться оформить свои
запросы в виде sql view? Без непонтяно зачем импользуемых временных
таблиц? Времянка имеет смысл в сложных случаях - когда набираешь
результирующую выборку в несколько проходов, используя курсоры и
обрабатывая каждую полученную через курсор запись неким хитрым
образом - короче говоря в случаях, когда невозможнополучить результат
при использовании просто select-а.


--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Иван Шкуропадский <shkmail@inbox.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 18:20:55
Тема: Е П Р С Т {01} {01} {01} {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Vadym,

ИШ>> Да я и не спорю!
ИШ>> :)
ИШ>> Вот почему другие уверены, что все должно работать простой вставкой
ИШ>> file{PROP:SQL} = 'SELECT ... FROM ...'
ИШ>> неизвестно куда?
VS> А кто уверен? Если ты хочешь получать результат используя
VS> сформированный руками полный запрос - о шаблоне браузинга можешь
VS> забыть
ну вот и нашли консенсус
:)

VS> Давай вернемся к вопросу - а зачем тебе такие извращения с
VS> использованим PROP:SQL? Ты не пробовал попытаться оформить свои
VS> запросы в виде sql view?
я реализовал ту структуру, которой мучал вас в августе
все работает - зашибись

только вот для того, чтобы просматривать данные приходится
использовать функции с некоторым количеством параметров

например:

найти в базе заданное значение "MyPass" свойства "Password" объекта
класса "CUser", действительное на "22-06-1941 04:00:00"

или

выбрать из базы все значения свойства "Text" объектов класса
"CRefMilitaryRank", действительные на ...

и т.д.

естественно, что я не хочу для каждого случая, коих множество, писать
создавать отдельный VIEW.
А количество имен классов, свойств,
значений свойств, других параметров, будет только расти.
вот я и хочу использовать параметры в функциях или процедурах.

VS> Без непонтяно зачем импользуемых временных
VS> таблиц? Времянка имеет смысл в сложных случаях
Таблицы - для того, чтобы быстро и гладко создать интерфейсную часть,
а временные (не _#временные_, а _временныеIDUnique_) - потому что
разные пользователи с разными потоками должны иметь разное место
хранения своих разных запросов
:)

спасибо вам за науку и за терпение!


Поздравляю с Днем Рождения!
Желаю Счастья в Личной Жизни!

--
Best regards,
Иван mailto:shkmail@inbox.ru



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Vadym Synyavskyy <vadim@softcreator.com>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 19:06:22
Тема: Е П Р С Т {01} {01} {01} {01} {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Иван,

Thursday, September 2, 2004, 10:20:55 AM, you wrote:

VS>> Давай вернемся к вопросу - а зачем тебе такие извращения с
VS>> использованим PROP:SQL? Ты не пробовал попытаться оформить свои
VS>> запросы в виде sql view?
ИШ> я реализовал ту структуру, которой мучал вас в августе
ИШ> все работает - зашибись

ИШ> только вот для того, чтобы просматривать данные приходится
ИШ> использовать функции с некоторым количеством параметров

ИШ> например:

ИШ> найти в базе заданное значение "MyPass" свойства "Password" объекта
ИШ> класса "CUser", действительное на "22-06-1941 04:00:00"

ИШ> или

ИШ> выбрать из базы все значения свойства "Text" объектов класса
ИШ> "CRefMilitaryRank", действительные на ...

ИШ> и т.д.

ИШ> естественно, что я не хочу для каждого случая, коих множество, писать
ИШ> создавать отдельный VIEW.
ИШ> А количество имен классов, свойств,
ИШ> значений свойств, других параметров, будет только расти.
ИШ> вот я и хочу использовать параметры в функциях или процедурах.

Ну опять же вопрос - можено ли сделать данную выборку при помощи
простого запроса?!
если можно (даже если этот запрос будет 4-х этажным) - то о какой
функции или процедуреидет речь?!
меняется только where выражение - и все - поля выборки остаются же
одинаковыми, принимающая структуру (таблица в терминах клаши) будет
единой (читать FM на тему PROP:SQLFilter и не задавать вопросов куда
этот PROP:SQLFilter впихивать ;-) ).


VS>> Без непонтяно зачем импользуемых временных
VS>> таблиц? Времянка имеет смысл в сложных случаях
ИШ> Таблицы - для того, чтобы быстро и гладко создать интерфейсную часть,
ИШ> а временные (не _#временные_, а _временныеIDUnique_) - потому что
ИШ> разные пользователи с разными потоками должны иметь разное место
ИШ> хранения своих разных запросов
ИШ> :)
Читай выше. Запросы для тебя как для юзера сиквела ВСЕГДА разные -
т.е. если ты запросил и получил выборку - она всегда твоя и ни с чьей
чужой не пересечется. Твоя задача правильно построить интересующий
тебя запрос и выгрести его результат в свои внутренние структуры -
например используя сиквельный клашин драйвер и декларации таблиц.
Задача решается с помощью шаблона BrowseBox с полпинка.
Использование своих времененных таблиц - дичь, использование
сиквельных временных таблиц - только в тех случаях, когда невозможно
получить интересующий результат используя один select (ибо работа
через курсоры гораздо тормознутее простого select-а)

ИШ> спасибо вам за науку и за терпение!


ИШ> Поздравляю с Днем Рождения!
ИШ> Желаю Счастья в Личной Жизни!

--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Nick Tsigouro <nick@arsis.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 16:42:39
Тема: Е П Р С Т {01} {01} {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hi.

> не буду мучать вас вопросами "как сделать Browse не страничным" :)
> а в Source я куда только не вставлял.... ну да ладно...

В ШВС - не знаю, а в АВС птичка в шаблоне есть. Да попробовать то и так
можно. Воткни после всех SET. Листаться не будет, а если заполнение пройдет,
значит подход в принципе работает.

WBR, Nick Tsigouro mailto:nick@arsis.ru
> --
> Best regards,
> Иван mailto:shkmail@inbox.ru
>
>



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Nick Tsigouro <nick@arsis.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 12:01:31
Тема: Е П Р С Т {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hi.

> это что же оказывается?
> это в каком же TFM об этом говорится?

Кларионовском.

> ну, как говорится, кто-то на своих чем-то учится
> итак...
> ============================================================
> результат, возвращаемый через
>
> AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...'
>
> НЕ ЯВЛЯЕТСЯ таблицей (в смысле FILE)
> (хотя NEXT использовать, естественно, можно)

Результат - нет конечно. Результат - это выборка на сервере. AnySqlFile
"ЯВЛЯЕТСЯ таблицей (в смысле FILE)" только за ней не стоит никакой реальной
таблицы на сервере, поэтому она и пустая, но ее (файловый буфер) можно и
нужно использовать для извлечения результата запроса.
[...]
> ============================================================
> вот...
> планирую реализовавать вариант 1 - как наименее содержащий наименьшую
> долю работы по созданию интерфейса в Clarion-e, и, IMHO,
> более быстрый (из трех рассмотренных - может и еще есть варианты)

Сходить на http://mavcla.arsis.ru (MAV Direct ODBC)

WBR, Nick Tsigouro mailto:nick@arsis.ru



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Alexey Kaminsky <ak@icntomsk.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 11:58:49
Тема: Е П Р С Т {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Иван!

> это в каком же TFM об этом говорится?
Clarion help -> SQL Accelerator Drivers. Читать между строк. ;-)
> ну, как говорится, кто-то на своих чем-то учится
> итак...
> ============================================================
> результат, возвращаемый через
>
> AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...'
>
> НЕ ЯВЛЯЕТСЯ таблицей (в смысле FILE)
> (хотя NEXT использовать, естественно, можно)
>
> например, ОКАЗЫВАЕТСЯ!!!, бесполезно пытаться узнать
> количество полученных записей с помощью
> RECORDS(AnySqlFile)
> - результат всегда равен нулю!
Не правда ваша. Если AnySqlFile соответствует таблице или view, то
RECORDS(AnySqlFile)
транслируется в select count(*) from AnySqlFile.
А если ты хочешь узнать сколько записей тебе вернул SELECT, то надо просто
спросить у сервера об этом: SELECT @@ROWCOUNT. Как получить этот результат в
программу сам догадаешься? Для особо знающих: работу в нескольких потоках не
рассматриваем.
> таким образом и в таблице, размещенной на стороне SQL Server,
> никаких изменений не происходит!
Так Browse и не должен менять записи, или я чего-то пропустил?
>
> соответственно - использовать Browse для отображения
> результата SELECT-а без дополнительной работы не получится.
> потому что в виде FILE его (результата) не существует
>
> ============================================================
> ...поправьте, если я не прав...
Если дополнительной работой считать добавление PROP:SQL (PROP:SQLFILTER)
тогда все так.
А если работать с простыми таблицами (или view), то вполне себе можно
обойтись стандартными шаблонами (я, лично, пользуюсь ШВС). Ты не поверишь!
Но даже редактирование через формы работает.

> ============================================================
>
> таким образом для того, чтобы пользователь имел возможность
> просматривать результат запроса, необходимо:
>
> 1. либо сохранять результат в виде таблице на Server-е
> (INSERT INTO ... SELECT ... FROM ...)
> -> тогда имя таблицы должно быть в информационной системе
> уникальным и создаваться динамически при формировании запроса
> -> поля в Browse задаются через таблицу, объявленную в словаре,
> а дальше в каждом потоке для задается уникальное имя
> через BrowsableSqlFile{PROP:NAME}, таким образом каждый Browse
> развертывается по таблице именно своего собственного потока
>
> - (минусы) масса таблиц на сервере
> - необходимость управления таблицами с уникальными именами
Если делать как TableFromDCT{PROP:SQL}=(SELECT ... INTO #tmpTableName FROM
...), а потом TableFromDCT{PROP:SQL}='SELECT ... FROM #tmpTableName', то
этих минусов не будет.

> + (плюсы) минимум работы по огранизации интерфейса,
> возможность использовать стандартные шаблоны

> планирую реализовавать вариант 1 - как наименее содержащий наименьшую
> долю работы по созданию интерфейса в Clarion-e, и, IMHO,
> более быстрый (из трех рассмотренных - может и еще есть варианты)
Варианты есть, спроси у Мялина. Он тебе много что может рассказать. Если
захочет.
> извиняйте за назойливость
> СПАСИБО ВСЕМ
Ты, однако, нас покинуть решил? Или, после всего сказанного, забил на
программирование?

С уважением, Алексей Каминский



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Иван Шкуропадский <shkmail@inbox.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 14:14:20
Тема: Е П Р С Т {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Alexey,

>> таким образом и в таблице, размещенной на стороне SQL Server,
>> никаких изменений не происходит!
AK> Так Browse и не должен менять записи, или я чего-то пропустил?
имеется в виду запрос
AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...'
не меняет содержание таблицы на стороне сервера

>> ============================================================
>> ...поправьте, если я не прав...
AK> Если дополнительной работой считать добавление PROP:SQL (PROP:SQLFILTER)
AK> тогда все так.
AK> А если работать с простыми таблицами (или view), то вполне себе можно
AK> обойтись стандартными шаблонами (я, лично, пользуюсь ШВС). Ты не поверишь!
AK> Но даже редактирование через формы работает.
в обычном случае (без AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...')
у мнея так и происходит,
но вот что смущает:

- ведь Browse работает с самой таблицей (а не с выборкой, которую мы
сделали с помощью имени этой таблицы)!

Если я вставяю
AnySqlTableFromDCT{PROP:SQL}='SELECT ... FROM ...',
а в окне в качестве просматриваемой таблицы указана
AnySqlTableFromDCT, то окно списка пустое!
хотя, если я просматриваю AnySqlTableFromDCT сразу после SELECT-а
через NEXT, то вижу, что c записями выборки все в порядке!

Или точка вставки должна быть какая-то особенная?


AK> Если делать как TableFromDCT{PROP:SQL}=(SELECT ... INTO #tmpTableName FROM
AK> ...), а потом TableFromDCT{PROP:SQL}='SELECT ... FROM #tmpTableName', то
AK> этих минусов не будет.


>> планирую реализовавать вариант 1 - как наименее содержащий наименьшую
>> долю работы по созданию интерфейса в Clarion-e, и, IMHO,
>> более быстрый (из трех рассмотренных - может и еще есть варианты)
AK> Варианты есть, спроси у Мялина. Он тебе много что может рассказать. Если
AK> захочет.
>> извиняйте за назойливость
>> СПАСИБО ВСЕМ
AK> Ты, однако, нас покинуть решил? Или, после всего сказанного, забил на
AK> программирование?

AK> С уважением, Алексей Каминский





--
Best regards,
Иван mailto:shkmail@inbox.ru

AnySqlFile{PROP:SQL} = 'SELECT ... FROM ...'




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Сергей Половинкин <s.polovinkin@vaz.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 15:36:49
Тема: Е П Р С Т {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
> Если я вставяю
> AnySqlTableFromDCT{PROP:SQL}='SELECT ... FROM ...',
> а в окне в качестве просматриваемой таблицы указана
> AnySqlTableFromDCT, то окно списка пустое!
> хотя, если я просматриваю AnySqlTableFromDCT сразу после SELECT-а
> через NEXT, то вижу, что c записями выборки все в порядке!
>
> Или точка вставки должна быть какая-то особенная?
>

Брауз не работает с файлом, он работает с View
таблицы перечисленные во View будут названы драйвером
A, B, C... по порядку следования сверху вниз и вставлены
во фразу FROM
фраза Where будет содержать строку связи A.ID = B.ID AND ...
т.е. для брауза имеет смысл менять только фразу WHERE или ORDER BY

и если уж менять поведение брауза то надо пистать
например Veiw{PROP:SQLFilter} = 'A.ID=100 ' до открытия View
или что тоже самое Veiw{PROP:Filter} = 'ID=100 ' ,
в ABC
SELF.BRWn.View{PROP:SQLFilter}= ' A.ID=100 '
SELF.BRWn.ApplyFilter()
и всё можно курить

Удачи


----- Original Message -----
From: "Иван Шкуропадский" <shkmail@inbox.ru>
To: "clalist List Member" <clalist@clarion.ru>
Sent: Thursday, September 02, 2004 3:14 PM
Subject: Re[2]: Е П Р С Т {01} {01} {01}




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От: Иван Шкуропадский <shkmail@inbox.ru>
Кому: "clalist List Member" <clalist@Clarion.ru>
Написано: 2 сентября 2004 г., 16:22:43
Тема: Е П Р С Т {01} {01} {01} {01} {01}
Файлы: <none>
--====----====----====----====----====----====----====----====----====----===--
Hello Сергей,

>> Если я вставяю
>> AnySqlTableFromDCT{PROP:SQL}='SELECT ... FROM ...',
>> а в окне в качестве просматриваемой таблицы указана
>> AnySqlTableFromDCT, то окно списка пустое!
>> Или точка вставки должна быть какая-то особенная?

СП> Брауз не работает с файлом, он работает с View
:) который определен по конкретной таблице


СП> таблицы перечисленные во View будут названы драйвером
СП> A, B, C... по порядку следования сверху вниз и вставлены
СП> во фразу FROM
СП> фраза Where будет содержать строку связи A.ID = B.ID AND ...
СП> т.е. для брауза имеет смысл менять только фразу WHERE или ORDER BY

СП> и если уж менять поведение брауза то надо пистать
СП> например Veiw{PROP:SQLFilter} = 'A.ID=100 ' до открытия View
СП> или что тоже самое Veiw{PROP:Filter} = 'ID=100 ' ,
СП> в ABC
СП> SELF.BRWn.View{PROP:SQLFilter}= ' A.ID=100 '
СП> SELF.BRWn.ApplyFilter()
СП> и всё можно курить
спасибо. не курю...
а потом у меня ШВС, ABC ваще не знаю

СП> Удачи
у меня ее слишком много было - наверно происходит уравнивание
:)

--
Best regards,
Иван mailto:shkmail@inbox.ru


(Добавление)

Иван,

на основании уже имеющейся переписки по твоему вопросу сформулируй, пожалуйста, еще раз свой вопрос.
В прениях сторон я потерял суть задачи, хотя возможно могу помочь.

Regards,
Vasiliy Goncharenko.

Написал: ClaList(2)
Ответить