powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / GetColumn ... Visible
21 сообщений из 21, страница 1 из 1
GetColumn ... Visible
    #32750063
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте.

Есть скрипт

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
li_row_count= 1 
do while li_row_count <= dw_1.rowcount( )
   dw_1.setrow( li_row_count )
   li_cln =  1 
   do while li_cln <= Long(dw_1.object.DataWindow.column.count)
      dw_1.setcolumn( li_cln )
      Ole_XLS.WorkBooks( 1 ).ActiveSheet.Cells(li_row_count,li_cln).Value = dw_1.gettext()
      li_cln ++
   loop;
   li_row_count ++
loop
...

Как и где в этом скрипте добавить или изменить так чтоб
переносил только видимые колонки???
================
PB 9.0.1
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32750177
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
li_row_count=1
do while li_row_count <= dw_1.rowcount( )
   dw_1.setrow( li_row_count )
   li_cln = 1
   do while li_cln <= Long(dw_1.object.DataWindow.column.count)
      dw_1.setcolumn( li_cln )
       if dw_1.Describe('#' + String(li_cln) + '.Visible') = '1' then 
         Ole_XLS.WorkBooks(1).ActiveSheet.Cells(li_row_count,li_cln).Value = dw_1.gettext()
       end if 
      li_cln ++
   loop;
   li_row_count ++
loop
...
Как нибудь так... (не проверял, предлагаю как направление мысли...)
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32750242
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСе! ОК! Работает
СПАСИБО!
===============================
PB 9.0.1 (7236) ASA 9.0.0 (1312)
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32751100
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторif dw_1.Describe('#' + String(li_cln) + '.Visible') = '1' then
Все хорошо до тех пор пока в Visible нет выражения.
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32751249
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPRO, а зачем вы вещи, которые я подчеркнул делаете?
dw_1.setcolumn( li_cln )
Ole_XLS.WorkBooks(1).ActiveSheet.Cells(li_row_count,li_cln).Value = dw_1.gettext()
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32751251
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с выражением на visibility можно так бороться:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// visibility may be an expression that we must evaluate
s_visibility = this.Describe(s_token+".visible")
IF Pos(s_visibility, "~t") >  0  THEN
	// Strip off section prior to tab
	s_visibility = Mid(s_visibility, Pos(s_visibility, "~t") +  1 ,  999 )
	// Strip off last double quote
	s_visibility = Left(s_visibility, Len(s_visibility) -  1 )
	ELSEIF s_visibility = "!" THEN
		s_visibility = "1"
	END IF
	// if there are single quotes in the visibility expression then 
	// we could have conflicts with the single quotes in the evaluate so
	// add some escape characters with a function call
	s_visibility = global_replace(s_visibility, "'", "~~~'")
	s_eval = "Evaluate('" + s_visibility + "', " + String(l_row) + ")"
	s_eval = this.Describe(s_eval)
END IF
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32751396
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полезно иметь в своем арсенале функцию вычисляющую любое выражение в свойствах DataWindow, например такую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
u_dw.of_evaluateproperty(string as_property)
string ls_exp, ls_return = ""
integer li_tab
n_cst_string lnv_string

IF isnull(as_property) OR as_property = "" THEN Return ""

li_tab = pos(as_property, "~t")

IF li_tab >  0  THEN
	ls_exp = mid(as_property, li_tab +  1 , len(as_property) - li_tab -  1 )
	ls_exp = lnv_string.of_GlobalReplace(ls_exp, "'", "~~~'")

	ls_return = this.Describe("Evaluate('"+ls_exp + "', "+string(al_row)+")")
	IF isnull(ls_return) OR ls_return = "" THEN
		ls_return = mid(as_property,  2 , li_tab -  2 )
	END IF
ELSE
	ls_return = as_property
END IF

Return ls_return
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32752733
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Филипп

В каком смысле, что я делаю?
Просто перебираю все записи и поля, и перекыдываю из в Excel
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32753702
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPRO To Филипп
В каком смысле, что я делаю?
Просто перебираю все записи и поля, и перекыдываю из в Excel
Ну это было и так очевидно. Именно по этому я и спрашивал, зачем:
dw_1. setcolumn ( li_cln )
Ole_XLS.WorkBooks(1).ActiveSheet.Cells(li_row_count,li_cln).Value = dw_1. gettext ()
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32758662
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп, как настоящий гуру, медленно но настойчиво подводит ученика к правильному осознанию.

где-то это уже было:
Нежнее Филипп... еще нежнее...
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32758866
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Филипп

Это делается для слудующего:

Есть форма в ней dw1 и dw2 связь оди-ко-многим
Есть кнопка перенос в Excel, при нажитии на эту кнопку выходит диалог окно
там спрашивается
для dw1: перенести все записи; только выделенные
для dw2: Не переносить; Переносить слитно; Переносить раздельно

Видел это в одной программе, пользователи довольны да безумия
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32759886
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенести все записи, только выделенные, не переносить, переносить слитно, раздельно , раздетым или голым, это конечно всё очень хорошо, но какое к этому имеет отношение setcolumn(...) и gettext() ?

Вы в цикле по ВСЕМ (видимым) колонкам эти функции зовёте. Вы можете мне объяснить зачем?
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32760342
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый ФИЛИПП

Признаюсь честно не понимаю на что Вы намекаете
Если у меня сделанно не правильно или не рационально
прошу подскажите как будет правильно.


Код: plaintext
Вы в цикле по ВСЕМ (видимым) колонкам эти функции зовёте. Вы можете мне объяснить зачем?
1.Да, по ВСЕМ в цикле.
2.Для переноса в Excel
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32760592
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
dw_1.SetColumn( li_cln )
Ole_XLS.WorkBooks( 1 ).ActiveSheet.Cells(li_row_count,li_cln).Value = dw_1.GetText()
заменить на
Код: plaintext
Ole_XLS.WorkBooks( 1 ).ActiveSheet.Cells(li_row_count,li_cln).Value = string( dw_1.Object.Data[li_row_count,li_Cln] )
и никаких SetRow, SetColumn и GetText ...
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32760652
Guest_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что SetColumn(...) для Вашего случая не просто не нужен, а таки опасен.
Код: plaintext
1.
2.
3.
4.
do while li_cln <= Long(dw_1.object.DataWindow.column.count)
        dw_1.setcolumn( li_cln ) //А Вы уверены, что перейдете к этой колонке?
                                 //Что будет если она видимая, но tabsequence =  0 
        ...
loop
Используя getText() Вы, пытаетесь избежать использования таких ф-ций как:
getItemString(...), getItemNumber(...) и т.д., которые подтребовали бы для использования предварительного определения типа колонки. Тем не менее Вы совершенно забыли про dot-нотацию для доступа к данным DataWindow.

Syntax for a single data item in a DataWindow Description
A DataWindow data expression accesses a single data item when you specify its row and column number.

Syntax
dwcontrol.Object.Data {.buffer } {.datasource } [ rownum, colnum ]
...
Return value
The data type of the expression is Any. The expression returns a single item in the DataWindow control. Its data type is the data type of the column.

Examples
These expressions both refer to a single item in row 1, column 2. It accesses current data in the primary buffer:

dw_1.Object.Data[1,2]

dw_1.Object.Data.Primary.Current[1,2]

This statement changes the value of the original data to 0 for the item in row 1, column 2 in the Filter buffer. Column 2 holds numeric data:

dw_1.Object.Data.Filter.Original[1,2] = 0

PS.
А ещё Excel может открывать текстоваые файлы, в которых в качестве разделителя между полям используется символ табуляции.
А PowerBuilder как раз может создавать такие файлы с помощью saveAsASCII()
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32760759
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexis glinski

Код: plaintext
Ole_XLS.WorkBooks( 1 ).ActiveSheet.Cells(li_row_count,li_cln).Value = string( dw_1.Object.Data[li_row_count,li_Cln] )
повторюсь, нужны не все колонки, а только видимые + не нужна первая колонка

Guest_2
Код: plaintext
1.
2.
3.
4.
5.
Дело в том, что SetColumn(...) для Вашего случая не просто не нужен, а таки опасен.
do while 
        dw_1.setcolumn( li_cln ) //А Вы уверены, что перейдете к этой колонке?
                                 //Что будет если она видимая, но tabsequence =  0 
        ...
loop
А почему не может быть уверенности если есть условие:
li_cln <= Long(dw_1.object.DataWindow.column.count)?

Код: plaintext
tabsequence =  0 
- с эти я еще не знаком, я новичек в РВ

Код: plaintext
1.
2.
PS. 
А ещё Excel может открывать текстоваые файлы, в которых в качестве разделителя между полям используется символ табуляции.
А PowerBuilder как раз может создавать такие файлы с помощью saveAsASCII()
Повторюсь еще раз:
Код: plaintext
1.
2.
3.
4.
Есть форма в ней dw1 и dw2 связь оди-ко-многим
Есть кнопка перенос в Excel, при нажитии на эту кнопку выходит диалог окно
там спрашивается 
для dw1: перенести все записи; только выделенные
для dw2: Не переносить; Переносить слитно; Переносить раздельно

P.S. Я не спорю, что я прав и делаю все правильно. Если что не так, расскажите, подскажите.
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32760994
Guest_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А потому что вы почему-то не проверяете результат выполнения своего dw_1.setcolumn( li_cln ). Если результат = -1, то это будет означать для Вас, что Вы не перешли к колонке с номером li_cln, а остались на прежней. И именно это у Вас произойдет, в случае, если колонка будет видимой, но tab order = 0.

Как определить видимость колонки, Вам "доступно и всерьез" объяснили Ikar и Филипп. Но у меня почему-то есть подозрение, что Вы можите просто вляпать их решение к своим setColumn(...) и getText() . Alexis Glinsky и Я показали Вам, что следует использовать вместо этих функций.
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32761075
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо.
Вот мой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
do while li_row_count <= dw_1.rowcount( )
		dw_1.setrow( li_row_count )
		li_cln =  1 
		li_column =  1 

		do while li_cln <= Long(dw_1.object.DataWindow.column.count)
			dw_1.setcolumn( li_cln )
			if dw_1.Describe('#' + String(li_cln) + '.Visible') = '1' and dw_1.getcolumnname( )<>'row_sel' then
			Ole_XLS.WorkBooks( 1 ).ActiveSheet.Cells(li_row_count,li_column).Value = dw_1.gettext()
			li_column ++
			end if
			li_cln ++
		loop;
		
		li_row_count ++
loop
Нарисуйте пожалуйста как будет правильно.
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32761104
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexis glinski...
заменить на
Код: plaintext
Ole_XLS.WorkBooks( 1 ).ActiveSheet.Cells(li_row_count,li_cln).Value = string( dw_1.Object.Data[li_row_count,li_Cln] )
и никаких SetRow, SetColumn и GetText ...В этом выражении в случае использования стиля редактирования DDDW или DDLB получим код (Data Value) вместо необходимого нам значения (display value). Здесь следовало бы, вероятно, еще использовать что-нибудь вроде
Код: plaintext
dw_1.Describe ("Evaluate '(lookupdisplay(" + string( dw_1.Object.Data[li_row_count,li_Cln] ) + "), " + string(li_row_count) + "')")
За безглючность кода не ручаюсь, но направление движения, надеюсь, понятно :-)
Lookupdisplay для прочих стилей редактирования просто возвращает значение.
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32761385
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В PFC есть функция of_getitem(...) returns string
которая возвращает форматированную строку (в т.ч. декодированный через LookupDisplay(...) ddlb, dddw, codetable)
...
Рейтинг: 0 / 0
GetColumn ... Visible
    #32762476
Guest_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для доступа к данным вместо getText() следует использовать dot нотацию.

У Вас, PB установлен без help'a?

Если Help установлен, то следует читать DataWindow Reference, а в нём уже Accesing Data in Code.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / GetColumn ... Visible
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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