Форум » GUI » как? EDIT INPLACE по полям из дочерней базы » Ответить

как? EDIT INPLACE по полям из дочерней базы

gustow: Есть две базы: SP_LS (справочник лекарств), PF_LS (план-факт-остаток по лекарствам). Нужно в броузе (по SP_LS) менять "на месте" (прямо в нем) цифры плана (конечно, можно бы и в InputWindow каком-нибудь - но "заказчику" так хочется, "по-экселски"). Пишу "по-простому" такой, к примеру, код ("RU866" - т.к. базы в DOS-кодировке): [pre2] use PF_LS codepage "RU866" new index on NOMKOD to PF_LS.NTX // NOMKOD - (N, 7) код лек-ва из SP_LS set index to PF_LS.NTX use SP_LS codepage "RU866" new index on NOMKOD to SP_LSN.NTX set index to SP_LSN.NTX set relation to NOMKOD into PF_LS go top .... // в main-окне Win_1 на соотв. странице таба - броуз @ 30, GetBorderWidth() browse Br_Lek2 of Win_1 ; /* width Win_1.Tab_0.Width */ ; // ?? как получить ширину таба? width Win_1.Width - GetBorderWidth() * 4 ; height 160 ; workarea SP_LS ; fields { "SP_LS->NOMKOD", "SP_LS->NAIM", ; "SP_LS->TORG_R", "SP_LS->TORG_L", ; "SP_LS->MNN_R", "SP_LS->MNN_L", ; "PF_LS->PLAN1", "PF_LS->FAKT1", "PF_LS->OST1", ; "PF_LS->PLAN6", "PF_LS->FAKT6", "PF_LS->OST6" ; } ; widths { 70, 60, 60, 60, 80, 50, 60, 60, 60, 60, 60, 60 } ; headers { "Ном.код", "Наименование", ; "Торг.наим.(рус.)", "Торг.наим.(лат.)", ; "МНН (рус.)", "МНН (лат.)", ; "План 1м.", "Факт 1м.", "Остаток 1м.", ; "План 6м.", "Факт 6м.", "Остаток 6м." ; } ; justify { BROWSE_JTFY_RIGHT,,,,,, ; BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT, ; BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT } ; on change { || Ris_Gr_Le2() } ; // функция разрисовки грида с детальной инфой по ЛС readonly { .T., .T., .T., .T., .T., .T., .F., .T., .T., .F., .T., .T. } ; edit inplace [/pre2]т.е. "редактируемые на месте" поля - из "дочерней" базы. Кликаем в броузе на какой-то из "планов" (например, на PF_LS->PLAN1, открывается GETBOX ввода (как и хотим, "на месте"), вводим цифирь, ENTER... и вылетаем по ошибке [pre2]Error BASE/1003 Переменная не существует: PLAN1 Called from _INPLACEEDITSAVE(2189) Called from _INPLACEEDITOK(2166) Called from (b)_BROWSEINPLACEEDIT(1977) Called from _DOCONTROLEVENTPROCEDURE(1559) Called from EVENTS(473) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1280) Called from _BROWSEINPLACEEDIT(2081) Called from _BROWSEEDIT(1238) Called from EVENTS(2164) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1280) Called from DOMETHOD(4608) Called from MAIN(74)[/pre2] ...и что - "не суждено сбыться мечте идиота"? :) Кстати, почему-то еще "в нагрузку" после этого (именно после подобного вылета) перестают в FARе работать клавиши ENTER и ESC (пользую KEYRUS в Win98) ("лечится" перезагрузкой - иногда только "холодной").

Ответов - 5

gfilatov: gustow пишет: "редактируемые на месте" поля - из "дочерней" базы Стандартный Browse для этой цели не подойдет, т.к. он рассчитан на использование при редактировании только той базы, которая указана в ключевом слове WORKAREA. Может помочь использование GRID, в который сначала выгружаются данные из базы, а по окончании редактирования производится обновление данных в дочерних базах. Это не очень удобно, поэтому рекомендуется для решения такой задачи использовать TBROWSE (см. пример 4 в папке samples\Advanced\TsBrowse).

gustow: Спасибо, Григорий, а то голову сломал (кто-то из нас двоих - или я, или оно - тупит; скорее, конечно, я...). GRID не очень подойдет (база лекарств здоровенная), буду TBROWSE'ить. Заодно рапортую, что "завербовал" еще несколько поклонников Harbour+MiniGUI (программеры из больниц нашей области); люди говорят: "Вот об чем я мечтал бессонными ночами!" :) Заодно еще спрошу про TBROWSE (поскольку, знаю, что у тебя тоже Win98 - или это не зависит от ОС?). Там "по умолчанию" headers выглядят "плоскими"; а как их сделать (если можно) выглядящими такими же "кнопками", как в BROWSE (по умолчанию)? (а то как-то "доморощенно" выглядит)

gfilatov: gustow пишет: headers выглядят "плоскими"; Каждый заголовок колонки имеет свойство l3DLookHead в массиве ::aColumns. Переопределить можно так: oBrw:aColumns[ nColumn ]:l3DLookHead := .T., где nColumn - номер колонки


Петр: gustow пишет: GRID не очень подойдет (база лекарств здоровенная) И Grid и Browse построены на SysListView32, ограничения у них одни и те же. буду TBROWSE'ить Ну если вас до сих пор устраивал Browse - просто модифицируйте его. Меньше переделывать программу придется и другим пригодится :) Примерно так _BrowseInPlaceEdit() .. FieldName := _GridFields [ CellColIndex ] r := at ( '>', FieldName ) if r != 0 sFieldName := Right ( FieldName, Len(Fieldname) - r ) _GridWorkArea := Left( FieldName, r - 2 ) Else sFieldName := FieldName EndIf Конечно, нужно добавить все необходимые проверки и все утрясти хорошенько. Ничего сложного.

gustow: Григорий, Петр - спасибо! Пошел "копать" :)



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