Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Append General

1 view
Skip to first unread message

Alex Ilyin

unread,
Mar 13, 2004, 8:29:00 AM3/13/04
to
Hello All!

Помогите, pls, разобраться:

После переустановки Винды Фокс разучился внедрять в поля типа General
картинки JPG. Файлы отображаются в виде иконки при попытке их распечатать
на страницах отчета.

P.S. Hа компе установлены Corel 11, PShop 7, ACDSee
со всеми своими фильтрами и декомпрессорами.
P.P.S. BMP внедряются.

Можно ли поместить на отчет связанные, а не внедренные в таблицу JPG ?

Alex Ilyin

unread,
Mar 16, 2004, 10:38:00 AM3/16/04
to

Michael Drozdov

unread,
Mar 17, 2004, 5:34:21 AM3/17/04
to
Hi, Alex.

Tue Mar 16 2004 18:38, Alex Ilyin wrote to All:

AI> После переустановки Винды Фокс разучился внедрять в поля типа General
AI> картинки JPG. Файлы отображаются в виде иконки при попытке их
AI> распечатать на страницах отчета.

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

Попробуй посмотреть среди "бинарного мусора" ProgID того, кто у тебя был
прописан (или по умолчанию) при APPEND GENERAL .... в качестве [CLASS
OLEClassName] открыв соотвествующие fpt-файлы как бинарные...

Хм... это должно придать твоим мыслям "системный характер"... :-)

Попробуй также из редактора, который поддерживает твои желания... через
системный буфер сохранить картнку в поле-general твоего файла... Чего будет?
:-)

Best regards.
Михаил Дроздов, ИВС Софт, Пермь, Россия
[Michael Drozdov, ICS Soft, Perm, Russia]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
My Page: http://vfpdev.narod.ru/
ICS Page: http://www.ics.perm.ru/ [on Russian]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Наилучшие пожелания.

Alex Ilyin

unread,
Mar 17, 2004, 11:18:00 AM3/17/04
to
Hello Michael!

AI>> После переустановки Винды Фокс разучился внедрять в поля типа General
AI>> картинки JPG.

MD> Хм... это должно придать твоим мыслям "системный характер"... :-)
Ошибка происходит на этапе внедрения JPEGа в поле General.
Ранее внедренные картинки печатаются нормально. Попытка внедрить _эти же_
картинки приводит к созданию только ссылки на картинку и в Report'e
печатается иконка JPG и имя файла.

Для печати картинки используется Picture/ActiveX Bound Control из стандартной
панели Report Controls.
Если поместить эту же картинку на отчет, выбрав From File, она нормально
отображается.

Мысли никак в систему не выстраиваются :(


Michael Drozdov

unread,
Mar 17, 2004, 6:08:11 PM3/17/04
to
Hi, Alex

Wed Mar 17 2004 19:18, Alex Ilyin wrote to Michael Drozdov:

AI> Если поместить эту же картинку на отчет, выбрав From File, она нормально
AI> отображается.

AI> Мысли никак в систему не выстраиваются :(

> Попробуй посмотреть среди "бинарного мусора" ProgID того, кто у тебя был
> прописан (или по умолчанию) при APPEND GENERAL .... в качестве [CLASS
> OLEClassName] открыв соотвествующие fpt-файлы как бинарные...

Например в ...\Samples\Data\employee.fpt мной наблюдается: 'PBrush'

... а также, если к примеру, туда вставить через Microsoft Photo Editor
3.0.2.3
(C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE)
(PHOTOED:{Ctrl+A}+{Ctrl+C} + VFP:{Ctrl+V}) файл типа: ...\Мои документы\Мои
рисунки\Образец.jpg, то после просмотра fpt-файла (как бинарного) видим
"чёрным по белому" написано: 'MSPhotoEd.3'

Другими словами, команды типа:

SELECT employee
APPEND BLANK
APPEND GENERAL photo FROM ("C:\Documents and Settings\<User>\Мои документы\Мои
рисунки\Образец.jpg") CLASS MSPhotoEd

Всяко (если установлен Microsoft Photo Editor, конечно :-) должны работать...

Надеюсь, что пояснение выше...

MD>> Хм... должны придать твоим мыслям "системный характер"... :-)

Best regards.
Михаил Дроздов, ИВС Софт, Пермь, Россия
[Michael Drozdov, ICS Soft, Perm, Russia]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
My Page: http://vfpdev.narod.ru/
ICS Page: http://www.ics.perm.ru/ [on Russian]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Hаилучшие пожелания.

Alex Ilyin

unread,
Mar 18, 2004, 1:12:00 PM3/18/04
to
Hello Michael!

СПАСИБО!!! ЗАРАБОТАЛО!!!

MD> Всяко (если установлен Microsoft Photo Editor, конечно :-)
не зря смайлик поставлен ^^^^^^^^^^^^^^^^^^^^^^^
MD> должны работать...

В комплект MS Office 2003 упомянутая богоугодная программа уже не входит.
А так как за последние лет 5 пользоваться ею не приходилось,
то и тревоги ее отсутствие не вызвало :)))))

MD>>> Хм... должны придать твоим мыслям "системный характер"... :-)

Как легко выстроилась система :)))

Mike Korneev

unread,
Mar 18, 2004, 8:44:57 PM3/18/04
to
Всем привет и особенно Алексею Ильину и Михаилу Дроздову

AI> Hello Michael!
AI> СПАСИБО!!! ЗАРАБОТАЛО!!!

Забавно - один человек все никак не мог исхитриться и прицепить себе
на шею камешек побольше, а другой ему корректно так помог... ;-))

Про General надо давно забыть. ;-)

"Эти яйца завезли на Клондайк три года назад. Они уже тогда
были тухлые. Они всегда были тухлые!" (c) Лондон или О'Генри ?

---
Mike Korneev

Igor Korolyov

unread,
Mar 19, 2004, 10:59:48 AM3/19/04
to
Hi, Mike!
You wrote to Alex Ilyin on Fri, 19 Mar 2004 04:44:57 +0300:

MK> Забавно - один человек все никак не мог исхитриться и прицепить себе
MK> на шею камешек побольше, а другой ему корректно так помог... ;-))

Наверное тут есть своя логика - уж если человек поленился сначала сделать
поиск по теме General (а по жэтой теме ну очень много всяких сообщений было,
и очень часто правильно рекомендовали что с ним делать с этим General :)),
то пускай и дальше мучается. Очевидно что следующим вопросом станет "как
извлечь обратно в файлик", и добрые люди таки расскажут как :))) Потом
пойдут вопросы про "разбухание" fpt, про неоднозначность отображения на
разных компах и т.д.

MK> Про General надо давно забыть. ;-)

Поддерживаю :)

MK> "Эти яйца завезли на Клондайк три года назад. Они уже тогда
MK> были тухлые. Они всегда были тухлые!" (c) Лондон или О'Генри ?

:)))

--
WBR, Igor


Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Alex Ilyin

unread,
Mar 19, 2004, 12:22:00 PM3/19/04
to
Hello Игорь и Михаил!

Hаехали, ну просто камня на камне не оставили!

IK> своя логика - уж если человек поленился сначала сделать поиск по теме
Человек не поленился, но не нашел случая, когда год исправно отработавшая
программа заартачилась.

IK> :))) Потом пойдут вопросы про "разбухание" fpt, про неоднозначность
IK> отображения на разных компах и т.д.
Hе пойдут. JPEGи хранятся в виде отдельных файлов и загружаются в FPT
непосредственно перед печатью нужного ассортимента картинок.

MK>> Про General надо давно забыть. ;-)

IK> Поддерживаю :)
А о чем нужно помнить?
Почему до сих пор объекты отчета не имеют методов и изменяемых свойств на этапе
RunTime, как это сделано, например, в Access?

P.S. Access - полный мастдай! Лопнул после 7-ми картинок по 1Мб :)))
P.P.S. Fox продержался до 70-ти! :(((

MK>> "Эти яйца завезли на Клондайк три года назад. Они уже тогда
MK>> были тухлые. Они всегда были тухлые!" (c) Лондон или О'Генри ?

IK> :)))

IK> --
IK> WBR, Igor


IK> Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
IK> -+- ifmail v.2.15dev5.3
IK> + Origin: Modem (2:5020/400)

Mike Korneev

unread,
Mar 19, 2004, 6:17:46 PM3/19/04
to
Всем привет и особенно Алексею Ильину

AI> Hе пойдут. JPEGи хранятся в виде отдельных файлов и загружаются в FPT
AI> непосредственно перед печатью нужного ассортимента картинок.

Что до способа хранения, то это разумно.
Вот только "загружать в fpt" ничего не надо - тут уже много раз все
друг другу объясняли, как печатать в отчетах файлы с картинками... ;-))

AI> А о чем нужно помнить? Почему до сих пор объекты отчета не имеют методов
AI> и изменяемых свойств на этапе RunTime, как это сделано, например, в
AI> Access?

В VFP9.

---
Mike Korneev

Sergey Ermakov

unread,
Mar 20, 2004, 1:26:09 AM3/20/04
to

Hi, All!

MK> В VFP9.

А где его взять можно?

С уважением,
Sergey - тёплый (даже ещё не горячий) чайник в VFP

--

Igor Korolyov

unread,
Mar 20, 2004, 10:53:43 AM3/20/04
to
Hi, Alex!

You wrote to Igor Korolyov on Fri, 19 Mar 2004 20:22:00 +0300:

IK>> :))) Потом пойдут вопросы про "разбухание" fpt, про неоднозначность
IK>> отображения на разных компах и т.д.

AI> Hе пойдут. JPEGи хранятся в виде отдельных файлов и загружаются в FPT
AI> непосредственно перед печатью нужного ассортимента картинок.

И зачем? Может быть с этого и надо было начинать? Фоксовый отчёт, несмотря
на свою убогость и простоту, запросто может печатать картинки лежащие на
диске - поставь в объекте Picture переключатель на File и введи имя поля,
хранящего путь к картинке (может понадобится ALLTRIM() а может и нет...).
Всё. Никаких извращений с "помещением в General" и прочего не нужно.

MK>>> Про General надо давно забыть. ;-)
IK>> Поддерживаю :)

AI> А о чем нужно помнить?
AI> Почему до сих пор объекты отчета не имеют методов и изменяемых свойств
AI> на этапе RunTime, как это сделано, например, в Access?

Обещаются сделать в VFP9... А не имеют - ну наверное не столь большой спрос
был на такую фичу - ведь запросто можно обходится и без фоксовых репортов -
вокруг столько куда как более мощных/приспособленных под определённые задачи
альтернатив :)

AI> P.S. Access - полный мастдай! Лопнул после 7-ми картинок по 1Мб :)))
AI> P.P.S. Fox продержался до 70-ти! :(((

Да уж удивил :) Вот я слепил отчётец как описано выше (без всяких там
General-ов ненужных), слепил програмку которая просканировала парочку папок
с картинками (большие jpg-и типа Wallpaper-ов и т.п.) что-то около 240
штучек - общим размером мегабайт так на 40-50 (ну потом просто надоего
добавлять), запустил - в отчётике я сделал 4 колонки, и на страницу влазило
по 8 рядов - итого 32 картинки на страницу - в режиме "непропорционального
растягивания" - тормозит оно конечно прилично при загрузке, но никуда не
падает, все 8 листов показывает - т.е. не стоит говорить с такой гордостью о
"всего" 70-ти картинках :)
P.S. VFP8SP1 WinXP SP1+hotfixes

--
WBR, Igor

Alex Ilyin

unread,
Mar 21, 2004, 1:12:00 PM3/21/04
to
Hello Igor!

IK> на свою убогость и простоту, запросто может печатать картинки лежащие
IK> на диске - поставь в объекте Picture переключатель на File и введи
IK> имя поля,хранящего путь к картинке (может понадобится ALLTRIM() а
IK> может и нет...).
Спасибо, обязательно попробую.

IK> Обещаются сделать в VFP9... А не имеют - ну наверное не столь большой
IK> спрос был на такую фичу - ведь запросто можно обходится и без фоксовых
IK> репортов - вокруг столько куда как более мощных/приспособленных под
IK> определённые задачи альтернатив :)
Альтернатива - это одно из двух, много может быть вариантов или способов.

Для Фокса, в целом, тоже есть альтернатива, но нравится он мне :)

AI>> P.S. Access - полный мастдай! Лопнул после 7-ми картинок по 1Мб :)))
AI>> P.P.S. Fox продержался до 70-ти! :(((

IK> загрузке, но никуда не падает, все 8 листов показывает - т.е. не стоит
IK> говорить с такой гордостью о "всего" 70-ти картинках :)
Говорилось не с гордостью, а сарказмом, жаль смайлика соответствующего
не знаю. Предложенный Тобой вариант без APPEND GENERAL мне больше нравится,
поэтому предлагаю эксперименты с загружаемыми файлами не производить :)

Igor Korolyov

unread,
Mar 21, 2004, 5:13:49 PM3/21/04
to
Hi, Sergey!
You wrote to Mike Korneev on Sat, 20 Mar 2004 06:26:09 +0000 (UTC):

MK>> В VFP9.
SE> А где его взять можно?

У MS украсть :)
Если серьёзно, то к лету обещают что-то выпустить - то-ли Public Beta как
было с VFP8, то-ли уже релиз...


--
WBR, Igor

Mikhail Silkin

unread,
Mar 25, 2004, 2:55:05 AM3/25/04
to
"Igor Korolyov" <k1i...@km.ru> сообщил/сообщила в новостях следующее:
news:c3f56k$chh$2...@host.talk.ru...

> Наверное тут есть своя логика - уж если человек поленился сначала сделать
> поиск по теме General (а по жэтой теме ну очень много всяких сообщений
было,
> и очень часто правильно рекомендовали что с ним делать с этим General :)),
> то пускай и дальше мучается. Очевидно что следующим вопросом станет "как
> извлечь обратно в файлик", и добрые люди таки расскажут как :)))

Вы будете смеяться, но у меня сегодня появилась именно такая проблема -
фотки хранятся на MSSQL2000. В Фокс они приходят через SPT-запрос в виде
поля General. Сделал на форме OLEBound - не работает, выдает ошибку - что-то
там корруптед. Но при просмотре General поля в Фаре видна структура
JPEG-файла, т.е. с сервера все приходит нормально.
Тогда остается только скопировать из General в файл и подсунуть этот файл
для Image. Но как копировать ? Все известные команды с типом General не
работают, нужно его как-то преобразовать. Но как и во что ?
Помогите, плиз, люди добрые ?
Хелпы читал, ничего там нет. Архивы ньюсов читать нет возможности.

Всех благ.
Михаил.

Igor Korolyov

unread,
Mar 25, 2004, 4:51:32 AM3/25/04
to
Hi, Mikhail!
You wrote to Igor Korolyov on Thu, 25 Mar 2004 07:55:05 +0000 (UTC):

[Sorry, skipped]

MS> Вы будете смеяться, но у меня сегодня появилась именно такая проблема -
MS> фотки хранятся на MSSQL2000. В Фокс они приходят через SPT-запрос в виде
MS> поля General.

А ты уверен, что они в формате General пришли? Может они в нормальном
формате memo-binary (а там файлик в неизменном виде и лежит) пришли?

MS> Сделал на форме OLEBound - не работает, выдает ошибку - что-то там
MS> корруптед.

Вот это то и заставляет подумать что там реально не General а собственно
файлик.

MS> Но при просмотре General поля в Фаре видна структура JPEG-файла, т.е. с
MS> сервера все приходит нормально.

Но не в General, а сумасшедший ODBC конвертит это не в тот тип. Я вот
намедни с Oracle ODBC драйверами (от самого Oracle и от MS) мучался - такого
кривого поведения я ещё нигде не встречал - типы числовых полей кочевряжит
(для простейшего запроса SELECT 99/100 ... возвращает тип поля N(20,0) - с
какого перепугу, я не знаю... Хотя реально там число с точкой лежит - т.е.
поправиви тип поля - через ALTER TABLE или ручками по FOPEN и т.п. всё
получается)... В общем конверти это поле в Memo и попробуй потом скинуть
содержимое в файл и проверь не будет ли это правильным jpeg-ом. Если бы ты
юзал Remote View - то там маппинг полей настраивается прямо при определении
представления, с SPT к сожалению так не получится... Поменять то тип для
поля надеюсь сам сможешь :)

[Sorry, skipped]

Mikhail Silkin

unread,
Mar 25, 2004, 8:51:59 AM3/25/04
to
"Igor Korolyov" <k1i...@km.ru> сообщил/сообщила в новостях следующее:
news:c3ua2g$96c$1...@host.talk.ru...

>
> А ты уверен, что они в формате General пришли? Может они в нормальном
> формате memo-binary (а там файлик в неизменном виде и лежит) пришли?

Именно General, т.к. получаемый курсор содержит только одно поле с надписью
Gen, при попытке открыть которого в броузе (а также в самой форме) выдается
ошибка - Оле объект корруптед.

> MS> Сделал на форме OLEBound - не работает, выдает ошибку - что-то там
> MS> корруптед.
>
> Вот это то и заставляет подумать что там реально не General а собственно
> файлик.

Увы, именно General, т.к. на сервере фотки лежат в полях с типом Image. А он
преобразуется только в General, т.к. для Memo есть какие-то ограничения по
размеру. А размер одной фотки - 30-40 КБ.
Похоже, что поменять General на Memo не получится именно из-за этих
ограничений в размере Memo поля.

> MS> Но при просмотре General поля в Фаре видна структура JPEG-файла, т.е.
с
> MS> сервера все приходит нормально.
>

> В общем конверти это поле в Memo и попробуй потом скинуть
> содержимое в файл и проверь не будет ли это правильным jpeg-ом. Если бы ты
> юзал Remote View - то там маппинг полей настраивается прямо при
определении
> представления, с SPT к сожалению так не получится... Поменять то тип для
> поля надеюсь сам сможешь :)

То, что там идет правильный JPEG - точно.
С помощью Alter Table менять тип не пробовал, завтра попытаюсь (хотя
почему-то думается, что и здесь будет облом), а все остальное не работает.
Remote View не использую - так сложилось исторически, все идет через
SPT-запросы.
Но должен же быть какой-то выход ?

Всех благ.
Михаил.


Igor Korolyov

unread,
Mar 25, 2004, 9:40:40 AM3/25/04
to
Hi, Mikhail!
You wrote to Igor Korolyov on Thu, 25 Mar 2004 13:51:59 +0000 (UTC):

??>> А ты уверен, что они в формате General пришли? Может они в нормальном
??>> формате memo-binary (а там файлик в неизменном виде и лежит) пришли?

MS> Именно General, т.к. получаемый курсор содержит только одно поле с
MS> надписью Gen, при попытке открыть которого в броузе (а также в самой
MS> форме) выдается ошибка - Оле объект корруптед.

Ещё раз - то что в заголовке DBF-а указано что это "G" вовсе не означает,
что там (в .fpt соответствующем) _реально_ находится то что фокс понимает
под General (это особая бинарная структура, там помимо данных - если это не
Link конечно - указано и то чем эти данные отображать - OleServer т.е., и
параметры всякие). И memo и General хранятся в .fpt на низком уровне
одинаково - это бинарные данные. Тип поля лишь задаёт то действие, которое
фокс будет делать при попытке просмотра этого поля - откроет в текстовом
редакторе (memo-поле), или откроет в OleBound контроле - передав ему в
качестве данных соответствующую бинарную информацию.

MS>>> Сделал на форме OLEBound - не работает, выдает ошибку - что-то там
MS>>> корруптед.

??>>
??>> Вот это то и заставляет подумать что там реально не General а
??>> собственно файлик.

MS> Увы, именно General, т.к. на сервере фотки лежат в полях с типом Image.

У меня нету установленного MS SQL под рукой, да и с картинками на больших
серверах я не забавлялся никогда, потому я не знаю что тим и как, но по
твоему описанию (Gen не открывается, а при просмотре поля в Hex виде
обнаруживается нечто похожее на Jpeg файл.)

MS> А он преобразуется только в General, т.к. для Memo есть какие-то
MS> ограничения по размеру.

Точно такие же как и для General - 2Гб на _все_.

MS> А размер одной фотки - 30-40 КБ. Похоже, что поменять General на Memo
MS> не получится именно из-за этих ограничений в размере Memo поля.

Получится, другой вопрос - будет ли там действительно корректный jpeg-файл,
или это действительно Ole-данные, но покоцанные по неизвестным причинам.

[Sorry, skipped]

MS> То, что там идет правильный JPEG - точно.

Тогда указав фоксу что это не General а memo (binary метку не забудь, а то
покоцает, ибо не поймёт что это не текст :)), можно будет элементарно
извлечь данные и сохранить в файлик - а уж с картинкой в файлике проблем
быть не должно :)

MS> С помощью Alter Table менять тип не пробовал,

Не факт что ALTER TABLE тебе поможет, вполне возможно что придётся на уровне
правки заголовка работать - FOPEN () FSEEK(), FWRITE()... Структура
заголовка DBF-а хорошо описана в хелпе. Ессно что SPT курсор надо
предварительно скопировать в обычный DBF.

MS> завтра попытаюсь (хотя почему-то думается, что и здесь будет облом), а
MS> все остальное не работает.

Попробуй - если и так не выйдет, то наверное придётся что-то на стороне
сервера делать - типа уже там формировать именно "файл", и передавать его не
в Image поле а в каком-нить LONG или что там есть в MS SQL для
неограниченных по размеру данных...

MS> Remote View не использую - так сложилось исторически, все идет через
MS> SPT-запросы.

Я тоже очень мало их юзаю - в основном как базу для хранения текста SQL и
настроек позволяющих сделать SPT курсор обновляемым (ведб всё равно эту инфу
надо где-то хранить :)). К сожалению для SPT курсора нельзя указать тот тип
данных поля, в который надо конвертить приходящие с сервера "чистые" данные.
А для RV нельзя сделать произвольное условие Where. Вот сейчас мучаюсь с
CursorAdapter-ом, который должен по идее совместить все плюсы одного и
второго подходов, но пока не выходит что-то самое главное - динамически
менять WHERE часть при перезапросах :(

MS> Но должен же быть какой-то выход ?

Выходов много - другой вопрос скока надо затратить времени и сил на
реализацию того или иного варианта :(

Michael Drozdov

unread,
Mar 25, 2004, 11:07:41 AM3/25/04
to
Привет, Михаил.

Thu Mar 25 2004 10:55, Mikhail Silkin wrote to Igor Korolyov:

MS> Вы будете смеяться, но у меня сегодня появилась именно такая проблема -
MS> фотки хранятся на MSSQL2000. В Фокс они приходят через SPT-запрос в виде
MS> поля General. Сделал на форме OLEBound - не работает, выдает ошибку -
MS> что-то там корруптед. Hо при просмотре General поля в Фаре видна
MS> структура JPEG-файла, т.е. с сервера все приходит нормально.

Возможно намёк на подтверждение проблемы есть в

(Q173308) HOWTO: Display Images Stored in a BLOB Field, PSS ID Number: 173308

и там советуют показывать через ASP :-) а относительно собственно намёка на
проблему именно у Access & Visual FoxPro, написано:

NOTE: The ASP script assumes that the image field (BLOB Data) in the SQL
Server table contains a raw GIF image. Internet browsers assume that raw GIF
or JPEG data follow the HTTP header. If any extraneous information is
contained in the BLOB data, this will be passed by this script, and the image
will not display properly. This becomes important when you realize that most
methods of placing images into BLOB fields place extra information in the form
of headers with the image. Examples of this are Microsoft Access and Microsoft
Visual FoxPro. Both of these applications save OLE headers in the BLOB field
along with the actual binary data.

Best regards.
Михаил Дроздов, ИВС Софт, Пермь, Россия
[Michael Drozdov, ICS Soft, Perm, Russia]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
My Page: http://vfpdev.narod.ru/
ICS Page: http://www.ics.perm.ru/ [on Russian]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Наилучшие пожелания.

Sjfx

unread,
Mar 25, 2004, 4:34:43 PM3/25/04
to
Hello, Igor!
You wrote to Mikhail Silkin on Thu, 25 Mar 2004 14:40:40 +0000 (UTC):

[Вырезано...]

IK> сейчас мучаюсь с CursorAdapter-ом, который должен по идее совместить все
IK> плюсы одного и второго подходов, но пока не выходит что-то самое главное -
IK> динамически менять WHERE часть при перезапросах :(

По-разному для SQL-Server и нативных таблиц.
Ниже пример для sqlserver, полагаю, в Оракле есть что-нить
подобное EXEC('some command').
Для нативных прокатывает простая макроподстановка в селекте,
меняешь подставляемую переменную и - cursorRefresh.
Что ещё раскопаешь - с удовольствием поглядим.

*********** начало
cuAd = CREATEOBJECT("rvCurAd")
pcPar = "SELECT OrderID as oid, CustomerID as cid FROM Orders WHERE
OrderID<=10256 ORDER BY OrderID"
IF !cuAd.CursorFill()
SUSPEND
ENDIF

ON KEY LABEL ctrl+s suspend
ON KEY LABEL f5 do tryNewSelect
myf = CREATEOBJECT("rvForm")
myf.show(1)
ON KEY LABEL ctrl+s
ON KEY LABEL f5
**********************************************************
DEFINE CLASS rvCurAd AS CursorAdapter
selectCmd = "EXEC(?pcPar)"
dataSourceType = "ODBC"
alias = "vOrd"
PROCEDURE init
this.datasource = SQLSTRINGCONNECT(;
"Driver=SQL Server;Server=(local);Database=Northwind;Trusted_Connection=Yes")
WAIT WINDOW NOWAIT "CA INIT"
PROCEDURE beforeCursorRefresh
LPARAMETERS tcss
WAIT WINDOW (this.SelectCmd ) NOWAIT
pcPar = "SELECT OrderID as oid, CustomerID as cid FROM Orders WHERE
OrderID<=10256 ORDER BY CustomerID"

ENDDEFINE
****************************************************************
PROCEDURE trynewselect
??CHR(7)
cuad.selectcmd = "SELECT OrderID as oid, CustomerID as cid FROM Orders WHERE
OrderID<=10250 ORDER BY OrderID"
cuad.cursorrefresh
****************************************************************
DEFINE CLASS rvGrid AS Grid
recordSource = "vOrd"
ENDDEFINE
*************************************************************
DEFINE CLASS rvForm AS FORM
ADD OBJECT grd AS rvGrid
keyPreview = .T.
left = 300

PROCEDURE init
LOCAL grd
grd = this.grd
grd.width = this.Width
grd.height = this.Height
grd.rowHeight = grd.rowHeight + 4

PROCEDURE resize
DODEFAULT()
this.grd.width = this.Width
this.grd.height = this.Height

ENDDEFINE
************ конец

With best regards, Sjfx.


Igor Korolyov

unread,
Mar 25, 2004, 4:49:57 PM3/25/04
to
Hi, Michael!
You wrote to Mikhail Silkin on Thu, 25 Mar 2004 16:07:41 +0000 (UTC):

[Sorry, skipped]

MD> Возможно намёк на подтверждение проблемы есть в

[Sorry, skipped]

Ну если там действительно raw-данные (как в собственно gif/jpeg файле), то
смена типа поля с G на M(binary) должно помочь в извлечении картинки :)

Igor Korolyov

unread,
Mar 25, 2004, 6:18:48 PM3/25/04
to
Hi, Sjfx!
You wrote to Igor Korolyov on Thu, 25 Mar 2004 21:34:43 +0000 (UTC):

Ну блин это прям телепатия какая-то :) Не успел я ещё сформулировать вопрос/проблему, как ты уже даёшь ответ :)))

IK>> сейчас мучаюсь с CursorAdapter-ом, который должен по идее совместить

IK>> все плюсы одного и второго подходов, но пока не выходит что-то самое
IK>> главное - динамически менять WHERE часть при перезапросах :(

S> По-разному для SQL-Server и нативных таблиц.
S> Ниже пример для sqlserver,

В точку! Именно это меня и мучает сейчас...

S> полагаю, в Оракле есть что-нить подобное EXEC('some command').

Может и есть, да я об этом не знаю :( В общем то логика понятна, и даже как передать запрос на сервер и там исполнить - тоже понятно... Вот как получить обратно результат... Что-то пока не могу найти я такого средства :( Бум спрашвать в соответствующих эхах...

S> Для нативных прокатывает простая макроподстановка в селекте,
S> меняешь подставляемую переменную и - cursorRefresh.

Угу - это я так и в LV делал постоянно... WHERE &?lcWhere...

S> Что ещё раскопаешь - с удовольствием поглядим.

Да пока очень мало :( В общем не вышло ничего пока. Ладно, завтра даст бог ещё один денёк смогу выделить на копание этой темы...

В общем пока такие печальные выводы - SQL команды можно поменять в BeforeCursorFill но нельзя в BeforeCursorRefresh - и зачем они только туда её текст передают, тока дразнят :(
Более того - как-то прервать Refresh и заменить его на Fill (который может менять такст SQL-я) не представляется возможным... Ладно - тогда есть вариант переписать мой REQUERY_RV (прослойка - юзаю вместо REQUERY - которого для SPT курсоров никогда не было, он как раз SPT курсоры переоткрывал), чтоб он для курсора являющегося CA-курсором делал не REQUERY а CursorFill() - но тут очередная засада - из курсора никак не получить объектную ссылку на его CA - неужто так сложно было такую мелочь вывести? Ссылку на ADO вывели, а на CA - нет...
В общем пока одни разочарования, ну да может получится как-то этого гада урезонить через серверную процедуру... Или снова же макро как-нить поможет... Но пока совсем нету разумных идей, ладно пора идти спать :(

Mikhail Silkin

unread,
Mar 26, 2004, 2:37:53 AM3/26/04
to
"Igor Korolyov" <k1i...@km.ru> сообщил/сообщила в новостях следующее:
news:c3vjl2$4vu$2...@host.talk.ru...

> Ну если там действительно raw-данные (как в собственно gif/jpeg файле), то
> смена типа поля с G на M(binary) должно помочь в извлечении картинки :)

Да, помогло именно это. Записал полученный курсор в виде таблицы, в
DBF-файле поменял с помощью FWRITE тип поля с G на M, дальше - strtofile() и
полученным файликом скормил Image. Все работает и даже без тормозов. Но это
же чистой воды извращение - типа гланды через задницу. Неужели нет других
способов, более изящных ?

Всех благ.
Михаил.


Sjfx

unread,
Mar 26, 2004, 4:50:20 AM3/26/04
to
Hello, Igor!
You wrote to Sjfx on Thu, 25 Mar 2004 23:18:48 +0000 (UTC):

[Вырезано...]


S>> полагаю, в Оракле есть что-нить подобное EXEC('some command').

IK> Может и есть, да я об этом не знаю :( В общем то логика понятна, и даже как
IK> передать запрос на сервер и там исполнить - тоже понятно... Вот как
IK> получить обратно результат... Что-то пока не могу найти я такого средства
IK> :( Бум спрашвать в соответствующих эхах...

Что-то я не улавливаю, ты о чём - о картинках, про которые тема началась, или о
КА?
Если о КА - всё имеешь в курсоре, неважно, какой у тебя selectCmd:
selectCmd = "select ... " или
selectCmd = EXEC('some command').

[Вырезано...]
IK> В общем пока такие печальные выводы - SQL команды можно поменять в
IK> BeforeCursorFill но нельзя в BeforeCursorRefresh - и зачем они только туда
IK> её текст передают, тока дразнят :( Более того - как-то прервать Refresh и
IK> заменить его на Fill (который может менять такст SQL-я) не представляется
IK> возможным...

Меняем унылик на смайлик :).
Ниже приводится "тяжёлый" случай, когда используется макроподстановка,
работает и "лёгкий" случай, когда в selectCmd используется параметр в стиле:
selectCmd = "select * from Orders where OrderID <= ?mOrd"

***************
USE orders order tag orderid

cuAd = CREATEOBJECT("rvCurAd")

* будет работать "SELECT &selCmd"
selCmd = 'OrderID, CustomerID FROM Orders WHERE OrderID<=10001 ORDER BY 1'

IF !cuAd.CursorFill()
SUSPEND
ENDIF

ON KEY LABEL ctrl+s suspend
ON KEY LABEL f5 do tryNewSelect
myf = CREATEOBJECT("rvForm")
myf.show(1)
ON KEY LABEL ctrl+s
ON KEY LABEL f5
**********************************************************
DEFINE CLASS rvCurAd AS CursorAdapter

alias = "vOrders"
datasourcetype = "Native"
KeyFieldList='orderId'
UpdatableFieldList='customerId'
allowUpdate = .t.
tables = 'Orders'
updateCmd = ''
updateCmdDataSourceType = ''
sendUpdates = .t.

PROCEDURE init
this.selectCmd = 'SELECT &selCmd'

PROCEDURE beforeCursorRefresh
LPARAMETERS tcss
LOCAL ss, ss1, ss2
* наращиваю максимальный OrderID,
* в принципе можно менять всё WHERE
ss = SUBSTR(selcmd, AT('<=',selcmd)+2)
ss1 = ALLTRIM(STR(VAL(ss)))
ss2 = ALLTRIM(STR(VAL(ss)+1))
selcmd = strt(selcmd,ss1,ss2)

ENDDEFINE
****************************************************************
PROCEDURE trynewselect
WAIT WINDOW NOWAIT "refresh"


cuad.cursorrefresh
****************************************************************
DEFINE CLASS rvGrid AS Grid

recordSource = "vOrders"


ENDDEFINE
*************************************************************
DEFINE CLASS rvForm AS FORM
ADD OBJECT grd AS rvGrid
keyPreview = .T.
left = 300

PROCEDURE init
LOCAL grd
grd = this.grd
grd.width = this.Width
grd.height = this.Height
grd.rowHeight = grd.rowHeight + 4

PROCEDURE resize
DODEFAULT()
this.grd.width = this.Width
this.grd.height = this.Height

ENDDEFINE
************************************************************

IK> Ладно - тогда есть вариант переписать мой REQUERY_RV
IK> (прослойка - юзаю вместо REQUERY - которого для SPT курсоров никогда не
IK> было, он как раз SPT курсоры переоткрывал), чтоб он для курсора являющегося
IK> CA-курсором делал не REQUERY а CursorFill() - но тут очередная засада - из
IK> курсора никак не получить объектную ссылку на его CA - неужто так сложно
IK> было такую мелочь вывести? Ссылку на ADO вывели, а на CA - нет... В общем
IK> пока одни разочарования, ну да может получится как-то этого гада урезонить
IK> через серверную процедуру... Или снова же макро как-нить поможет... Но пока
IK> совсем нету разумных идей, ладно пора идти спать :(

А вот тут непонятно: требует ли твоё переоткрытие SPT курсоров лишних движений
в коде грида, т.е., не теряется ли для грида переоткрытый курсор? Полагаю, что
теряется.

With best regards, Sjfx.

PS.
Давно хотел сказать: документация на КА - это такая параша!!!
Просто двоечник какой-то писал, мля.


Igor Korolyov

unread,
Mar 26, 2004, 7:15:21 AM3/26/04
to
Hi, Mikhail!

You wrote to Igor Korolyov on Fri, 26 Mar 2004 07:37:53 +0000 (UTC):

[Sorry, skipped]

MS> Да, помогло именно это. Записал полученный курсор в виде таблицы, в
MS> DBF-файле поменял с помощью FWRITE тип поля с G на M, дальше -
MS> strtofile() и полученным файликом скормил Image. Все работает и даже без
MS> тормозов. Но это же чистой воды извращение - типа гланды через задницу.
MS> Неужели нет других способов, более изящных ?

Ну RV и CA умеют задавать тип поля для резульаттного курсора, а вот SPT не
умеет... Наверное то что Image конвертится в G а не М (именно в заголовке!)
это очередной глюк ODBC драйвера... Я за последнее время таких глюков с ODBC
(Оракловским правда, не MS SQL-ным) насмотрелся, что просто жуть. Если ты
сидишь на VFP7 и пока не собираешься переходить на более свежие (ну и на
юзание RV конечно :)) - то только через подобную шаманскую процедуру и
решается... В VFP8 можно попытаться использовать CA - см. пост от Sjfx - он
даже расписал как там реализовать Dynamic-SQL для ODBC (как раз для MS
SQL). - т.е. ты практически ничего не теряешь по гибкости SPT, но
приобретаешь массу преимуществ - явно заданная VFP схема (типы полей не ODBC
диктует, а ты сам задаёшь), куча событий Пре/Пост
(Insert/Delete/Update/Fetch/Refresh) - возможность настойки как
автоматического обновления (по типу как в RV сделано, или как в SPT-курсоре
можно сделать через кучу CURSORSETPROP()), так и полностью "ручного" - явно
задавая какие команды слать при каких операциях...

Igor Korolyov

unread,
Mar 26, 2004, 7:53:16 AM3/26/04
to
Hi, Sjfx!

You wrote to Igor Korolyov on Fri, 26 Mar 2004 09:50:20 +0000 (UTC):

IK>> Может и есть, да я об этом не знаю :( В общем то логика понятна, и даже

IK>> как передать запрос на сервер и там исполнить - тоже понятно... Вот как


IK>> получить обратно результат... Что-то пока не могу найти я такого

IK>> средства :( Бум спрашвать в соответствующих эхах...

S> Что-то я не улавливаю, ты о чём - о картинках, про которые тема началась,
S> или о КА?

О CA конечно же :(

S> Если о КА - всё имеешь в курсоре, неважно, какой у тебя selectCmd:
S> selectCmd = "select ... "

Если такой, то о динамическом SQL при Requery() можно забыть - по крайней
мере в VFP8 SP1 это невозможно...

S> или selectCmd = EXEC('some command').

А вот чтоб такое сделать - надо знать как в Oracle передать запрос _с_
_параметром_ в котором текст SQL SELECT-а, и получить обратно курсор. Я пока
так и не нарыл аналога EXEC('SELECT ...') для Оракла...

IK>> В общем пока такие печальные выводы - SQL команды можно поменять в
IK>> BeforeCursorFill но нельзя в BeforeCursorRefresh - и зачем они только

IK>> туда её текст передают, тока дразнят :( Более того - как-то прервать
IK>> Refresh и заменить его на Fill (который может менять такст SQL-я) не
IK>> представляется возможным...
S> Меняем унылик на смайлик :).
S> Ниже приводится "тяжёлый" случай, когда используется макроподстановка,

Хм. Так то для Native - это без проблем и в View работало... А вот для
ODBC - фиг. Не проводит фокс разворачивания макро хоть ты что с ним делай...

S> работает и "лёгкий" случай, когда в selectCmd используется параметр в
S> стиле: selectCmd = "select * from Orders where OrderID <= ?mOrd"

Ну это тоже совершенно понятно - это как раз рекомендуемый MS способ - для
того и предполагают они юзать BeforeCursorRefresh - чтоб все bind параметры
там задать... Но это ессно не позволяет делать динамический запрос (хотя-бы
кусок WHERE), а на все возможные сочетания параметров статический запрос не
составишь...

[Sorry, skipped]

IK>> Ладно - тогда есть вариант переписать мой REQUERY_RV
IK>> (прослойка - юзаю вместо REQUERY - которого для SPT курсоров никогда не
IK>> было, он как раз SPT курсоры переоткрывал), чтоб он для курсора

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
IK>> являющегося CA-курсором делал не REQUERY а CursorFill() - но тут
IK>> очередная засада - из курсора никак не получить объектную ссылку на его
IK>> CA - неужто так сложно было такую мелочь вывести?

S> А вот тут непонятно: требует ли твоё переоткрытие SPT курсоров лишних
S> движений в коде грида, т.е., не теряется ли для грида переоткрытый
S> курсор? Полагаю, что теряется.

Да конечно - но это то как раз не проблема - с этим я могу жить :) А вот
найти для заданного алиасе ссылку на его CA - это уже совсем нетривиальная
задача - ведь он может жить в одной из DE одной из форм (если они разделяют
датасессию) - т.е. цикл по всем _SCREEN.Forms и для каждой по её DE как
минимум! Может жить как свойство какого-то объекта, того-же контейнера на
форме, или Page, или самой формы, или... А пробежаться по всей иерархии и
опознать наш ли это CA или нет... Я думаю крайне сложно - практически на
грани невозможного - AINSTANCE() только для "свободноживущих" объектов
работает, для Member-ов облом... Ну или явно указывать для DataManager
объекта помимо алиаса управляемой таблицы ещё и ссылку на её CA если он
есть - тоже не очень красиво однако :(

S> PS.
S> Давно хотел сказать: документация на КА - это такая параша!!!
S> Просто двоечник какой-то писал, мля.

Ну не всё так уж и плохо на самом деле :) Есть пара гниловатых моментов, но
в принципе разобраться при желании можно... Вот и насчёт упомянутой
проблемы - всё дело в буквальном прочтении оказалось, жаль что пришлось
читать 5 раз, пока дошло что в BeforeCursorRefresh упоминается тот
cSelectCmd, который был задан/изменён в BeforeCursorFill... И что менять его
тут нельзя (точнее бессмысленно - ни на что не влияет). Ну и что нельзя
"перевести стрелки" с CA.CursorRefresh() (или его близнеца -
Requery(cAlias)) на CA.CursorFill(). А так - как обычно - вполне средненькая
документация :)

0 new messages