Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Editable crosstab / 10 сообщений из 10, страница 1 из 1
16.06.2005, 13:22
    #33119371
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
По форуму лазил, были ссылки.
Но ничего не могу найти, чтобы могло помочь организовать на ПБ редактируемое перекрестное ДВ.
В гугле тоже искал.
Подскажите как сделать такое ДВ или его функциональный аналог с минимальными трудозатратами.
Вообще можно ли такое сделать используя для обновления БД встроенные возможности ДВ.?
...
Рейтинг: 0 / 0
16.06.2005, 17:19
    #33120235
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
iLLerПо форуму лазил, были ссылки.
Но ничего не могу найти, чтобы могло помочь организовать на ПБ редактируемое перекрестное ДВ.
В гугле тоже искал.
Нашел?
http://groups-beta.google.com/groups?hl=en&lr=&ie=ISO-8859-1&c2coff=1&q=%22editable+crosstab%22group%3Apowersoft.public.powerbuilder.*
iLLerПодскажите как сделать такое ДВ или его функциональный аналог с минимальными трудозатратами.
Вот тут осталось определить понятие минимальности трудозатрат :-)
iLLerВообще можно ли такое сделать используя для обновления БД встроенные возможности ДВ.?Кодировать придется.

Теперь по существу (навскидку, сам не проверял):
1. В синтаксисе включить возможность редактирования (taborder = 10)
2. В run-time превести в static mode
3. После завершения внесения изменений по команде "Сохранить" выполнить действия (скорее всего вызвать соответствующие хранимые процедуры) для каждого из измененных полей, учитывая при этом, что если оригинальное значение было null, то, вероятно, следует делать Insert, а если null новое значение - delete.

Еще одно соображение. Можно не заморачиваться с кросстабом, а поднимать для редактирования отдельное окно.

Последнее (на самом деле первое, к чему следует стремиться:-). А может можно вообще без кросстаба обойтись?

Все IMHO, разумеется.
...
Рейтинг: 0 / 0
16.06.2005, 17:49
    #33120306
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
Я тоже склоняюсь к варианту без crosstab'а.

Придумал вариант с временной табличкой и нормальным ДВ. А из времянки перегонять в нормальную таблицу при помощи ХП.

По ссылке нашел идею: для первичных данных использовать ДС, для отображения ДВ, апдейтить через ДС.

Без crosstab'а плохо только одно, нельзя добиться динамичности второго измерения. Если только через динамическое создание ДВ.
...
Рейтинг: 0 / 0
16.06.2005, 18:08
    #33120335
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
iLLer...Без crosstab'а плохо только одно, нельзя добиться динамичности второго измерения. Если только через динамическое создание ДВ.Можно даже не создавать DW динамически, а создать шаблон с максимально необходимым кол-вом полей, ненужные поля скрывать по мере необходимости. Пожалуй, этот подход будет самый дешевый, в смысле трудозатрат на реализацию :-)
...
Рейтинг: 0 / 0
16.06.2005, 18:58
    #33120413
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
PL99Еще одно соображение. Можно не заморачиваться с кросстабом, а поднимать для редактирования отдельное окно.
А можно даже окна не поднимать, а так сделать...
...
Рейтинг: 0 / 0
17.06.2005, 01:50
    #33120725
Астралопитек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
Филипп PL99Еще одно соображение. Можно не заморачиваться с кросстабом, а поднимать для редактирования отдельное окно.
А можно даже окна не поднимать, а так сделать...
Филипп, спасибо, крнечно, но ссылка на редкость дохлая.
Можно как-нибудь ещё zip кинуть?
...
Рейтинг: 0 / 0
17.06.2005, 02:20
    #33120730
Guest1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
Астралопитек
Филипп, спасибо, крнечно, но ссылка на редкость дохлая.
Можно как-нибудь ещё zip кинуть?

Там всего-то 20К. Хорошо бы прямо сюда приатачить !
...
Рейтинг: 0 / 0
17.06.2005, 03:16
    #33120745
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
Features
Full keyboard movement: Up/Down/Tab/Shift+Tab.
Enter Key can be used to move the cell across or down (or even ignored).
Responds to datawindow column resizing.
Responds to Horizontal Split Scrolling.
Responds to standard horizontal and vertical scrolling.
DataWindow status flags are maintained, so code can be written to scan for modified rows (using GetNextModified) and modified values (using GetItemStatus).
Recalculates crosstab totals
100% PurePB (no API or external DLL calls)
Free commented source code
Download (20K)
Quick Start
Before using the demo, use the supplied SQL script (CROSSTAB.SQL) to create and populate the demo table. Without this table, the demo will not run.

In order to use the uem_cell user object, you need to add code to the following events (see the example application for the actual code listings):

Window open event (or DataWindow constructor event) to initialize the control DataWindow
Clicked event DataWindow
Paint event (user event mapped to PBM_PAINT)
DataWindow ScrollHorizontal and ScrollVertical Events
...
Рейтинг: 0 / 0
17.06.2005, 11:50
    #33121361
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
Филипп, раз пошла такая пьянка, очень прошу выслать по почте или опубликовать здесь сервис запрещающий ресайз колонок в гриде. Знаю у вас есть, в и-нете не нашел.
...
Рейтинг: 0 / 0
17.06.2005, 18:34
    #33122627
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Editable crosstab
1) Map pbm_lbuttondown on your datawindow control ancestor
2) Import the object attached
3) Make it an instance variable on your datawindow of the
type
n_cst_noresize_columns_ingrid
4) Create it in the constructor and call it's method
of_setrequestor(..)
5) Call it's method of_registernoresizecolumn(..)
6) In the event mapped in step 1), write (assuming that
the name of the
instance variable is 'nv_grid'):


IF inv_grid.of_hittest(flags, xpos, ypos) THEN
message.processed = TRUE
RETURN 1
END IF
Код: 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
$PBExportHeader$n_cst_noresize_columns_ingrid.sru
forward
global type n_cst_noresize_columns_ingrid from nonvisualobject
end type
end forward

global type n_cst_noresize_columns_ingrid from nonvisualobject
event type boolean lbuttondown ( unsignedlong flags,  integer xpos,  integer ypos )
end type
global n_cst_noresize_columns_ingrid n_cst_noresize_columns_ingrid

type variables
Protected:

string 	is_noresizecolumn[]
datawindow idw_requestor
integer PROXIMITY_FACTOR =  16 
end variables

forward prototypes
public function integer of_registernoresizecolumn (string as_column)
public function integer of_getregistered (ref string as_regcolumns[])
public function boolean of_isregistered (string as_column)
public function integer of_unregister (string as_column)
public function integer of_setrequestor (datawindow adw_requestor)
public function integer of_setproximity_factor (integer ai_factor)
end prototypes

event type boolean lbuttondown(unsignedlong flags, integer xpos, integer ypos);/*------------------------------------------------------------------------------

 Event   :			 n_cst_noresize_columns_ingrid.Lbuttondown

 Returns:         Boolean

 Parameters:      value UnsignedLong flags
                  value Integer xpos
                  value Integer ypos

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
IF NOT IsValid(idw_requestor) THEN RETURN FALSE
IF IsNull(idw_requestor) THEN RETURN FALSE
IF idw_requestor.Describe("DataWindow.Processing") <> "1" THEN RETURN FALSE //operate only on grids

integer COL_N, kounter, li_total
boolean lb_near
string ls_obj
long ll_X

long li_colwidth, lix
ls_obj = idw_requestor.GetBandAtpointer( )
IF Pos(ls_obj, "header",  1 ) <>  1  THEN RETURN FALSE
li_total = UpperBound(is_noresizecolumn) 
IF li_total <  1  THEN RETURN FALSE

ll_X = Long( idw_requestor.Describe('datawindow.horizontalscrollposition' ) )
IF ll_X >  0  THEN xpos += ll_X //UnitsToPixels( ll_X, XUnitsToPixels! )

FOR kounter =  1  TO li_total
	lb_near = FALSE
	
	lix = Long(idw_requestor.Describe(is_noresizecolumn[kounter] + ".x"))
	
	li_colwidth = Long(idw_requestor.Describe(is_noresizecolumn[kounter] + ".width"))	
	
	lb_near = (xpos > lix + li_colwidth - PROXIMITY_FACTOR AND xpos <= lix + li_colwidth)
	IF NOT lb_near THEN lb_near = (xpos >= lix + li_colwidth AND xpos < lix + li_colwidth + PROXIMITY_FACTOR)
	IF lb_near THEN RETURN TRUE
NEXT
RETURN lb_near
end event

public function integer of_registernoresizecolumn (string as_column);/*------------------------------------------------------------------------------

 Function:			public n_cst_noresize_columns_ingrid.of_Registernoresizecolumn

 Returns:         Integer

 Parameters:      value String as_column

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
integer	li_upper
integer	li_cnt


// Check arguments.
If IsNull(as_column) THEN RETURN - 1 

// Trim and Convert to lower case.
as_column = Lower(Trim(as_column))

IF Len(as_column)= 0  Then Return - 1 


// Determine if column is already registered.
IF of_isregistered( as_column) THEN RETURN  1 
// Add to array.
is_noresizecolumn[ UpperBound(is_noresizecolumn) +  1  ] = as_column

Return  1 
end function

public function integer of_getregistered (ref string as_regcolumns[]);/*------------------------------------------------------------------------------

 Function:			public n_cst_noresize_columns_ingrid.of_Getregistered

 Returns:         Integer

 Parameters:      reference String as_regcolumns[]

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/

integer	li_upper
string	ls_empty[]

// Initialize
as_regcolumns = ls_empty


li_upper = UpperBound(is_noresizecolumn)
If li_upper >  0  Then		
		as_regcolumns = is_noresizecolumn
End If


Return UpperBound(as_regcolumns[])
end function

public function boolean of_isregistered (string as_column);/*------------------------------------------------------------------------------

 Function:			public n_cst_noresize_columns_ingrid.of_Isregistered

 Returns:         Boolean

 Parameters:      value String as_column

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
integer	li_upper
integer	li_cnt

// Check arguments.
If IsNull(as_column) or Len(Trim(as_column))= 0  Then 
	Return False
End If

// Trim and Convert to lower case.
as_column = Lower(Trim(as_column))

// Determine if column is registered.
li_upper = UpperBound(is_noresizecolumn)
For li_cnt =  1  to li_upper
	If is_noresizecolumn[li_cnt] = as_column Then
		// Column was previously registered.
		Return True
	End If
Next

// The column is not registerd.
Return False
end function

public function integer of_unregister (string as_column);/*------------------------------------------------------------------------------

 Function:			public n_cst_noresize_columns_ingrid.of_Unregister

 Returns:         Integer

 Parameters:      value String as_column

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/

integer	li_upper, ii
integer	li_index
boolean lb_found
string ls_newarray[]
// Check arguments.
If IsNull(as_column) or Len(Trim(as_column))= 0  Then 
	Return - 1 
End If

// Get the current number of entries on array.
li_upper = UpperBound (is_noresizecolumn)

// Loop around array and unregister entry if found.
For li_index =  1  to li_upper
	lb_found = Lower(as_column) = Lower(is_noresizecolumn[li_index]) 
	IF lb_found THEN CONTINUE
	ii ++
	ls_newarray[ii]=is_noresizecolumn[li_index]
Next
IF lb_found THEN
	is_noresizecolumn = ls_newarray
	RETURN  1 
END IF

// No maching entry was found to unregister.
Return - 1 
end function

public function integer of_setrequestor (datawindow adw_requestor);/*------------------------------------------------------------------------------

 Function:			public n_cst_noresize_columns_ingrid.of_Setrequestor

 Returns:         Integer

 Parameters:      value DataWindow adw_requestor

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
If IsNull(adw_requestor) or Not IsValid(adw_requestor) Then
	Return - 1 
End If

idw_Requestor = adw_Requestor
Return  1 
end function

public function integer of_setproximity_factor (integer ai_factor);/*------------------------------------------------------------------------------

 Function:			public n_cst_noresize_columns_ingrid.of_Setproximity_factor

 Returns:         Integer

 Parameters:      value Integer ai_factor

 Copyright ©2003 DTI - Philip Salgannik

 Date Created: 11/17/2003

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
IF IsNull(ai_factor) THEN RETURN PROXIMITY_FACTOR
IF ai_factor <  1  OR ai_factor >  32  THEN RETURN PROXIMITY_FACTOR

integer li_temp
li_temp = PROXIMITY_FACTOR
PROXIMITY_FACTOR = ai_factor

RETURN li_temp
end function

on n_cst_noresize_columns_ingrid.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_noresize_columns_ingrid.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Editable crosstab / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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