powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как лучше реализовать добавление новых значений в dddw ?
12 сообщений из 12, страница 1 из 1
Как лучше реализовать добавление новых значений в dddw ?
    #32663659
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть dw . На нем колонка со стилем dddw. пользователь хочет ,
чтобы при вводе несуществующей в dddw записи она автоматически
попадала в БД и dddw "перерисовывалось" с учетом новой записи.

Как лучше закодировать такое поведение , какие события использовать?

В инете предлагают ItemChanged или ItemError.

Может кто сталкивался с примером такого решения , посоветуйте , pls !
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32663848
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если dddw настолько примитивен, что имеет дело только с двумя колонками, то можно и в ItemChanged. Подразумевается, что dddw allows edit.
В общем то это плохая практика - "пользователь хочет ,
чтобы при вводе несуществующей в dddw записи она автоматически
попадала в БД и dddw "перерисовывалось" с учетом новой записи".
А что пользователь подразумевает под вводом - код или дисплей значение?
Что будешь писать в БД - одно и то же для кода и дисплей значений?
А что если то что введено НЕсовпадает ни с каким кодом, но совпадает с каким то дисплей значением? Будешь хашировать?

То есть продумать надо, что же ты на самом деле делать будешь, а потом об имплементации спрашивать...
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32664394
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случай на самом деле , я думаю , распространенный.
Основное dw служит для ввода некого документа . у документа есть
атрибут - клиент. для выбора клиента используется dddw. с помощью pfc
осуществляется автопоиск в dddw при вводе пользователем символов с
клавиатуры.

в dddw отображается название клиента , а в документ вносится его
код. Edit для dddw allowed.

так вот . нужно сделать так , чтобы : если то название , которое ввел пользователь не имеется в dddw , возник вопрос , вводить ли нового клиента
в базу. если ответ да , происходит insert в базу и перезапрос dddw.
я так это себе представляю. но как это лучше реализовать ?
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32664469
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, а точнее я практически уверен, что в данном случае с клиентами предлагаемый Вами подход порочен изначально. Если не вдаваться в теорию БД про нормальные формы и первичные и внешние ключи, практически очень быстро у Вас появятся большое количество вариантов названия одного и того же клиента.
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32664665
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как делаю я
Пример, есть таблица операций, связанная внешним ключем (поле payee_id типа integer) с таблицей имен клиентов.
В DW операций поле payee_id привязано к DDDW со справочником имен. Для него стоит Allow Editing = True, Empty String is Null = True,Required = True. Справочник в свою очередь привязан к кэшу справочных данных.
Факт того, что пользователь ввел имя, отсутствующее в DDDW отлавливается в событии ItemError.
В событии ItemEerror проверяется в каком поле произошла ошибка и если в payee_id, то вызывается модальное окно с новой записью клиента. Как параметр в него передается только что введенный текст, который становится именем клиента.
Юзер вводит необходимые доп. данные и жмет OK или Отмена.
Если OK отрабатывается логика сохранения в базе нового клиента и возвращается payee_id нового клиента. Эта же логика обновляет данные в кэше справочных данных, соответственно обновится и DDDW.
Код в ItemError проверяет возвращенное значение и если не ноль, то делает
this.Post SetItem(row, column, ll_payee_id) // Это чтобы не возиться с поиском новой записи в DDDW. и обязательно Return 2 - это означает принять введенные данные.
Если юзер нажал в форме Отмена или произошла ошибка при сохранении новой записи в базе, в ItemError делаем Return 1 - это возвращает юзера в поле payee_id, для исправления введенного текста.
Если ошибки в DW другого рода и не связаны с полем payee_id делаем Return 0 - это выводит сообщение об ошибке

Если дочитал до конца, еще добавлю что как параметр в программе предусмотрено автоматическое добавление имени клиента в базу с проверкой на дублирование имен.

Успехов!
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32664673
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 urvas
То что будут появляться записи об одном и том же клиенте с разными именами - это в любом случае, независимо от способа реализации интерфейса. Для это у меня существует механизм объединения записей в справочных таблицах. Но это отдельная тема.
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32664822
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2rcryo

Большое спасибо !
Это именно то , что я хотел услышать : хорошее описание вполне
подходящего для меня решения !
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32665617
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот , если кому интересно , полный скрипт того , что в итоге пока получилось :

(событие ItemError)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
// первая упрощенная попытка "автоматич" 
// пополнения dddw
integer li_answ
long ll_key

// в какое поле введены неверные данные
string ls_column
ls_column = dwo.name
choose case ls_column
	case 'клиент' , 'плательщик'
		// те которые нуждаются в "автоматич" пополнении
		li_answ = MessageBox("Внимание !", &
		'Зарегистрировать нового контрагента : ' + data +' ?', &
	     Question!, OKCancel!,  2 )
		 
			IF li_answ =  1  THEN
			 // Process OK. ввод нового клиента в базу
			 // строим динамический sql
			 insert Контрагент ( Компания ) Values (:data);
				
				IF SQLCA.SQLCode = - 1  THEN 
				  MessageBox("Произошла Ошибка" &
					, SQLCA.SQLErrText , Exclamation!)
				  return AncestorReturnValue	  
				END IF

				// извлекаем код
				DECLARE GetIdentity     DYNAMIC CURSOR FOR SQLSA ;
				PREPARE SQLSA FROM 'SELECT @@Identity' USING SQLCA ;
				OPEN DYNAMIC GetIdentity;
				if SQLCA.SQLCode =  0  then
						FETCH GetIdentity INTO :ll_key ;
				end if
				CLOSE GetIdentity ;
		 		
				IF ISNULL(ll_key) then  return AncestorReturnValue
				
				// обновляем dddw и заносим получ код в кач-ве знач
				uf_ddw_simple_retrieve('клиент')
				uf_ddw_simple_retrieve('плательщик')
				post SetItem(row,ls_column,ll_key)
				// возвращаем : "принять введенное значение"
				return  2 
			 
			ELSE
			 // Process CANCEL. ничего не делаем
			 return  1  //AncestorReturnValue
			END IF
	
	case else
		return AncestorReturnValue
end choose
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32665661
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выглядит это ужасающе :-)

1) непонятно зачем это в ItemError, а не в ItemChanged
2) Если твой dddw умеет ретривить из этих таблиц или у тебя есть dataobject, который умеет это делать, то почему не использовать его для update, в том числе и с Identity column, вместо того чтобы писать этот уродливый embedded SQL...
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32665677
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Филипп

1) в ItemError , тк это событие срабатывает , когда данные ,
введенные пользователем , не присутствуют в dddw
2) у меня запрос-источник для dddw не обновляемый .
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32665685
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вовику меня запрос-источник для dddw не обновляемый .
А что мешает его сделать обновляемым?
...
Рейтинг: 0 / 0
Как лучше реализовать добавление новых значений в dddw ?
    #32667804
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Филипп

Хорошая идея , подумаю
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как лучше реализовать добавление новых значений в dddw ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]