On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Пост N: 1
Зарегистрирован: 26.11.14
ссылка на сообщение  Отправлено: 26.11.14 15:34. Заголовок: Редактирование связанных таблиц


Здравствуйте, уважаемые форумчане.
Категорически приветствую вас!

Пытаюсь организовать редактирование связанных таблиц средствами Clipper.
Идея такова: На экране представлены три таблицы, связанные по общему ключевому полю.
То есть область экрана разделена на три части, в каждой по одной таблице.
Перемещение по таблицам должно быть синхронным.
Также должна быть возможность редактирования любой из этих таблиц.

Попробовал использовать dbedit()
Однако вывести содержимое всех трех таблиц одновременно не удалось, только по очереди, в итоге курсор находится внутри третьего dbedit() - третьей таблицы. Как перемещаться между таблицами - непонятно.
В документации сказано, что dbedit() позволяет вложенные вызовы. Это как?
Я понял так, что к первому dbedit() привязана пользовательская функция, внутри которой вызывается второй dbedit() и т.д.
Попробовал сделать, из функции первого dbedit() вызывал второй dbedit(), из его функции, в свою очередь вызывал третий, а оттуда снова первый. Но это приводит к ошибке переполнения.
Связал вызов дочерних dbedit() с клавишей TAB - в этом случае все три таблицы не отображаются, только первая, остальные по нажатию TAB, зато получилось циклическое перемещение между таблицами, но опять-таки после нескольких переходов возникает переполнение.
На данный момент задача-минимум - вывод на экран трёх связанных таблиц с возможностью перехода между ними по клавише TAB.

Допускаю, что TBrowse() подходит лучше, но с ним пока вообще не разобрался. Посмотрел пример из поставки Clipper (tbdemo.prg) - как-то слишком уж развесистый код для отображения всего одной таблицы.


Итак, вопрос: Возможно ли с помощью нескольких dbedit() отображать на одном экране и редактировать несколько связанных таблиц одновременно?
Прошу объяснить в общих чертах, как это делается.
Либо ткните меня носом в статью/документацию/рабочий пример, ибо сам я ничего толком найти не смог.









Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 7 [только новые]


постоянный участник




Пост N: 3762
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.11.14 16:45. Заголовок: Hephaestus пишет: О..


Hephaestus пишет:

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


Это все равно что ездить сразу на 3-х машинах !
Hephaestus пишет:

 цитата:
На данный момент задача-минимум - вывод на экран трёх связанных таблиц с возможностью перехода между ними по клавише TAB.


Вот сделай вывод на экран по этой задаче, а переход между ними по клавише таб делаем в обработке каждого dbedit().
Как пример сваяешь, так и показывай код. А там дальше поможем.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 4288
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.11.14 18:34. Заголовок: что то типа этого CL..


что то типа этого
CLIPPER\SOURCE\TBROW\SKIPDBF\TBR21.prg

Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 2
Зарегистрирован: 26.11.14
ссылка на сообщение  Отправлено: 27.11.14 12:35. Заголовок: Andrey пишет: Это в..


Andrey пишет:

 цитата:
Это все равно что ездить сразу на 3-х машинах !


Я имел в виду, что заполнен только первый dbedit, остальные пустые.
Второй заполняется, только когда прерывается первый, третий заполняется, когда прерывается второй.
Оно может и правильно, но если первый dbedit прервать, как потом в него вернуться?

Вот мой тестовый модуль. Выводит на экран одну таблицу с помощью dbedit. Прерывается по нажатию Esc.
 

#include "Dbedit.ch"
#include "Inkey.ch"

declare titles[8], fields[8], formats[8]

titles[1]='ФИО'
titles[2]='Дата;рождения'
titles[3]='Таб;ном'
titles[4]='Дети'
titles[5]='Пол'
titles[6]='Сем.;полож'
titles[7]='Ср. зарп.'
titles[8]='Подр.'

fields[1]='FAM'
fields[2]='DTR'
fields[3]='TAB'
fields[4]='DET'
fields[5]='POL'
fields[6]='SEM'
fields[7]='SZAR'
fields[8]='PODR'

formats[1]='XXXXXXXXXXXXXXXXXXXX'
formats[2]='E'
formats[3]='999'
formats[4]='9'
formats[5]='X'
formats[6]='X'
formats[7]='999999.99'
formats[8]='XXXXX'


use kadr new
select kadr

col='0/7,7+/3'
setcolor(col)
clear

@1,0 to 10,79 doub

dbedit(2,1,9,78,fields,"table1",formats,titles,'-',,'','')

set curs off
quit

function table1
param mod, nom
do case
case mod<4
return 1
case lastkey()=27
return 0
otherwise
return 1
endcase
return 1


Вот как вывести вторую таблицу - это вопрос.
Второй dbedit откуда вызывать? Следом за первым или всё-таки из функции table1? Пока не понял.

Dima пишет:

 цитата:
что то типа этого
CLIPPER\SOURCE\TBROW\SKIPDBF\TBR21.prg

Да, именно так. Этот пример делает то, что нужно.
Но это всё-таки TBrowse, а я пока мучаю dbedit.
Тем не менее, за пример спасибо, не исключено, что возьму на вооружение.

Кстати, поясню, почему именно dbedit.
У нас есть много приложений, созданных с помощью clipper.
Они все имеют единый стиль интерфейса. И одни созданы на основе других. Там часто используется dbedit.
Но там нигде не было параллельного просмотра таблиц в dbedit.
Вот свою задачу я начал решать, также с помощью dbedit.
Ради единообразия, ну и часть кода уже написана.

Вот если с dbedit можно сделать также как в tbr21.prg, то я хочу понять, как.
Если же однозначно нет, тогда мне следует выкинуть нафиг dbedit и не тратить на него время, а разбираться с TBrowse.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3769
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.11.14 15:12. Заголовок: Hephaestus пишет: В..


Hephaestus пишет:

 цитата:
Вот если с dbedit можно сделать также как в tbr21.prg, то я хочу понять, как.


Нельзя ! Это старая технология, в вашем случае использовать не нужно. Зря потратите время.
Хотя поизвращаться можете. Примерно так:

lQuit := .T.
M->nDBedit := 1
Do While lQuit
// здесь сделать прорисовку каждого dbedit
// т.е. в функции обработки сделать выход из dbedit при первом входе в него.
// можно завести M->lFirsView := 0 и анализировать эту паблик переменную...
DO CASE
CASE M->nDBedit == 1
dbedit(2,1,9,78,fields,"table1",formats,titles,'-',,'','')
CASE M->nDBedit == 2
dbedit(2,1,9,78,fields2,"table2",formats2,titles2,'-',,'','')
CASE M->nDBedit == 3
dbedit(2,1,9,78,fields2,"table3",formats3,titles3,'-',,'','')
ENDCASE

ENDDO

Значения M->nDBedit по TAB увеличивать на 1 и делать выход по TAB.
Можно сделать ОДНУ обработку функции на все dbedit(), а можно и сделать отдельный функции. На ваше усмотрение.
Координаты каждого dbedit() сделайте сами.

Переходите лучше на хХарбор !!! Там проще...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 4289
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.11.14 15:31. Заголовок: Hephaestus пишет: Н..


Hephaestus пишет:

 цитата:
Но это всё-таки TBrowse, а я пока мучаю dbedit


Вообще имея свой TBrowse можно было бы все вывести в одной таблице тем более
что они связаны общим ключом.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3
Зарегистрирован: 26.11.14
ссылка на сообщение  Отправлено: 27.11.14 16:03. Заголовок: Andrey пишет: Нельз..


Andrey пишет:

 цитата:
Нельзя !

Ну, так с этого надо было начинать.

 цитата:
Это старая технология, в вашем случае использовать не нужно.

Знаю, что старая.
Но была у меня дохленькая надежда.


 цитата:
Зря потратите время.

Видимо, да. Собственно, я выше писал об этом.


 цитата:
Хотя поизвращаться можете.

Не, не хочу. Лучше уж тогда TBrowse.
Тем более, что в tbr21.prg более-менее внятный код. В совокупности со справочником нормально получается. Разбираюсь.
Не так уж там всё запутано оказалось.


 цитата:
Переходите лучше на хХарбор !!! Там проще...


А что сильно проще? Думал и об этом варианте тоже.
Но конвертация кода в сишный с последующей компиляцией не выглядит проще, честно говоря.

Вообще я сейчас в ситуации Буриданова осла.
Но на Clipper я уже кое-что делал, а (x)Harbour не щупал толком.
Опять-таки нужна внятная литература, статьи в Сети , конечно, есть (читал Кресина), но...
как-то недостаточно оказалось. Чего-то не хватает.
С одной стороны - рассматриваются элементарные вещи а ля "ваши первые шаги в Harbour", с другой - уклон больше в сторону "как перевести вашу Clipper-программу на Harbour". И потом, если переходить на Harbour - это ж по-хорошему весь наш клипперный софт надо перетаскивать. Не потяну. Слишком много.

Dima пишет:

 цитата:
Вообще имея свой TBrowse можно было бы все вывести в одной таблице тем более
что они связаны общим ключом.

А вот это вряд ли. Пример, который я привёл - искусственный, данные взяты из книги Попова по FoxPro 2.5.
Реальные таблицы - их три штуки, из каждой взято по шесть полей.
Если в одном элементе всё выводить - не поместится на экране.
А это только одна задача. Есть ещё две задачи - с теми же таблицами, но с другими наборами полей.
Я планирую все три задачи реализовать в одной оболочке.

В итоге пока останавливаюсь на варианте с TBrowse.

Всем спасибо.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3770
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.11.14 17:02. Заголовок: Hephaestus пишет: Р..


Hephaestus пишет:

 цитата:
Реальные таблицы - их три штуки, из каждой взято по шесть полей.


Если это новая задача, то рекомендую сразу делать на МиниГуи. Легче будет делать !!!
Вот образец 2-х TBROWSE:


Вот сам пример Form_color.prg (536 строк) и ехе-ник - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample

Сборка проекта, такая же простая как и на клипере.
ДискУстановки:\MiniGui\batch\hbmk2.bat Form_color.prg


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 19
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет