Форум » Clipper » Редактирование связанных таблиц » Ответить

Редактирование связанных таблиц

Hephaestus: Здравствуйте, уважаемые форумчане. Категорически приветствую вас! Пытаюсь организовать редактирование связанных таблиц средствами Clipper. Идея такова: На экране представлены три таблицы, связанные по общему ключевому полю. То есть область экрана разделена на три части, в каждой по одной таблице. Перемещение по таблицам должно быть синхронным. Также должна быть возможность редактирования любой из этих таблиц. Попробовал использовать dbedit() Однако вывести содержимое всех трех таблиц одновременно не удалось, только по очереди, в итоге курсор находится внутри третьего dbedit() - третьей таблицы. Как перемещаться между таблицами - непонятно. В документации сказано, что dbedit() позволяет вложенные вызовы. Это как? Я понял так, что к первому dbedit() привязана пользовательская функция, внутри которой вызывается второй dbedit() и т.д. Попробовал сделать, из функции первого dbedit() вызывал второй dbedit(), из его функции, в свою очередь вызывал третий, а оттуда снова первый. Но это приводит к ошибке переполнения. Связал вызов дочерних dbedit() с клавишей TAB - в этом случае все три таблицы не отображаются, только первая, остальные по нажатию TAB, зато получилось циклическое перемещение между таблицами, но опять-таки после нескольких переходов возникает переполнение. На данный момент задача-минимум - вывод на экран трёх связанных таблиц с возможностью перехода между ними по клавише TAB. Допускаю, что TBrowse() подходит лучше, но с ним пока вообще не разобрался. Посмотрел пример из поставки Clipper (tbdemo.prg) - как-то слишком уж развесистый код для отображения всего одной таблицы. Итак, вопрос: Возможно ли с помощью нескольких dbedit() отображать на одном экране и редактировать несколько связанных таблиц одновременно? Прошу объяснить в общих чертах, как это делается. Либо ткните меня носом в статью/документацию/рабочий пример, ибо сам я ничего толком найти не смог.

Ответов - 7

Andrey: Hephaestus пишет: Однако вывести содержимое всех трех таблиц одновременно не удалось, только по очереди, Это все равно что ездить сразу на 3-х машинах ! Hephaestus пишет: На данный момент задача-минимум - вывод на экран трёх связанных таблиц с возможностью перехода между ними по клавише TAB. Вот сделай вывод на экран по этой задаче, а переход между ними по клавише таб делаем в обработке каждого dbedit(). Как пример сваяешь, так и показывай код. А там дальше поможем.

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

Hephaestus: Andrey пишет: Это все равно что ездить сразу на 3-х машинах ! Я имел в виду, что заполнен только первый dbedit, остальные пустые. Второй заполняется, только когда прерывается первый, третий заполняется, когда прерывается второй. Оно может и правильно, но если первый dbedit прервать, как потом в него вернуться? Вот мой тестовый модуль. Выводит на экран одну таблицу с помощью dbedit. Прерывается по нажатию Esc. [pre] #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 [/pre] Вот как вывести вторую таблицу - это вопрос. Второй dbedit откуда вызывать? Следом за первым или всё-таки из функции table1? Пока не понял. Dima пишет: что то типа этого CLIPPER\SOURCE\TBROW\SKIPDBF\TBR21.prg Да, именно так. Этот пример делает то, что нужно. Но это всё-таки TBrowse, а я пока мучаю dbedit. Тем не менее, за пример спасибо, не исключено, что возьму на вооружение. Кстати, поясню, почему именно dbedit. У нас есть много приложений, созданных с помощью clipper. Они все имеют единый стиль интерфейса. И одни созданы на основе других. Там часто используется dbedit. Но там нигде не было параллельного просмотра таблиц в dbedit. Вот свою задачу я начал решать, также с помощью dbedit. Ради единообразия, ну и часть кода уже написана. Вот если с dbedit можно сделать также как в tbr21.prg, то я хочу понять, как. Если же однозначно нет, тогда мне следует выкинуть нафиг dbedit и не тратить на него время, а разбираться с TBrowse.

Andrey: 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() сделайте сами. Переходите лучше на хХарбор !!! Там проще...

Dima: Hephaestus пишет: Но это всё-таки TBrowse, а я пока мучаю dbedit Вообще имея свой TBrowse можно было бы все вывести в одной таблице тем более что они связаны общим ключом.

Hephaestus: Andrey пишет: Нельзя !Ну, так с этого надо было начинать. Это старая технология, в вашем случае использовать не нужно.Знаю, что старая. Но была у меня дохленькая надежда. Зря потратите время. Видимо, да. Собственно, я выше писал об этом. Хотя поизвращаться можете.Не, не хочу. Лучше уж тогда TBrowse. Тем более, что в tbr21.prg более-менее внятный код. В совокупности со справочником нормально получается. Разбираюсь. Не так уж там всё запутано оказалось. Переходите лучше на хХарбор !!! Там проще... А что сильно проще? Думал и об этом варианте тоже. Но конвертация кода в сишный с последующей компиляцией не выглядит проще, честно говоря. Вообще я сейчас в ситуации Буриданова осла. Но на Clipper я уже кое-что делал, а (x)Harbour не щупал толком. Опять-таки нужна внятная литература, статьи в Сети , конечно, есть (читал Кресина), но... как-то недостаточно оказалось. Чего-то не хватает. С одной стороны - рассматриваются элементарные вещи а ля "ваши первые шаги в Harbour", с другой - уклон больше в сторону "как перевести вашу Clipper-программу на Harbour". И потом, если переходить на Harbour - это ж по-хорошему весь наш клипперный софт надо перетаскивать. Не потяну. Слишком много. Dima пишет: Вообще имея свой TBrowse можно было бы все вывести в одной таблице тем более что они связаны общим ключом. А вот это вряд ли. Пример, который я привёл - искусственный, данные взяты из книги Попова по FoxPro 2.5. Реальные таблицы - их три штуки, из каждой взято по шесть полей. Если в одном элементе всё выводить - не поместится на экране. А это только одна задача. Есть ещё две задачи - с теми же таблицами, но с другими наборами полей. Я планирую все три задачи реализовать в одной оболочке. В итоге пока останавливаюсь на варианте с TBrowse. Всем спасибо.

Andrey: Hephaestus пишет: Реальные таблицы - их три штуки, из каждой взято по шесть полей. Если это новая задача, то рекомендую сразу делать на МиниГуи. Легче будет делать !!! Вот образец 2-х TBROWSE: Вот сам пример Form_color.prg (536 строк) и ехе-ник - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample Сборка проекта, такая же простая как и на клипере. ДискУстановки:\MiniGui\batch\hbmk2.bat Form_color.prg



полная версия страницы