powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Delete rows from data window
17 сообщений из 17, страница 1 из 1
Delete rows from data window
    #34939989
dub2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
Удалить  3  строки из data window dw_1
, после и из базы, в которых столбец col_1 =  10 
Код прикреплён к кнопке на dialog window
boolean b // true - выделить строку		false - отменить выделение
long i,n
n= dw_1.RowCount() // количество строк в data window
for i =  1  to n
if dw_1.object.col_1[i] =   10  then
		b = true
		dw_1.selectrow(i,b)	// выделяет строку правильно
end if
next
return

если вместо
dw_1.selectrow(i,b)	
поставить для удаления
dw_1.deleterow(i)   
, то аварийное завершение на операторе
if dw_1.object.col_1[i] =   10  then
.Чтобы не было аварийного
Завершения внутри for ставлю:

dw_1.deleterow(i)   
n -- // вычитаю , т.к. после удаления кол-во оставшихся строк уменьшено на 1.

Однако НЕПРАВИЛЬНО, вот что имеем:
// для col_1 =  10 , всего было  3  записи, т.е.  2  удалены, а  1  остаётся в  DataWindow
// для col_1 =  101 , всего было  7  записей, т.е.  4  удалены, а  3  остаётся в  DataWindow
Как в цикле удалить все строки согласно условию 
if dw_1.object.col_1[i] =   10  then	 	– 	таких строк  3 
или
if dw_1.object.col_1[i] =   101  then	 	-	таких строк  7 

...
Рейтинг: 0 / 0
Delete rows from data window
    #34940007
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dub2 wrote:

> for i = 1 to n

Помедитируй над этой строкой.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940037
dub2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторdub2 wrote:

> for i = 1 to n

Помедитируй над этой строкой.


В условии сказано, что виделение строк виполняется правильно с указанним оператором FOR, только удаление не віполняется
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940059
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще один намёк:
при удалении первой строки, вторая становится первой
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940066
dub2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
n -- // вычитаю , т.к. после удаления кол-во оставшихся строк уменьшено на 1.

Ета строка и учитивает ваш намек, но к упеха нет
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940097
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dub2n -- // вычитаю , т.к. после удаления кол-во оставшихся строк уменьшено на 1.

Ета строка и учитивает ваш намек, но к упеха нет
Не учитывает.
Правильный цикл такой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
i =  1 
Do While i <= n
  If ... Then
     DeleteRow(i)
     n --
     Continue
  End If
  i ++
Loop
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940248
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky dub2n -- // вычитаю , т.к. после удаления кол-во оставшихся строк уменьшено на 1.

Ета строка и учитивает ваш намек, но к упеха нет
Не учитывает.
Правильный цикл такой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
i =  1 
Do While i <= n
  If ... Then
     DeleteRow(i)
     n --
     Continue
  End If
  i ++
Loop


гуру ошибся :)
правильнее сделать цикл так
Код: plaintext
1.
2.
3.
4.
for i = n to i
  If ... Then
     DeleteRow(i)
  End If
next
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940252
edmikeca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще тупее:

for i = n to 1 step – 1
if … then
dw_1.DeleteRow(i)
end if
next
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940254
edmikeca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edmikecaМожно еще тупее:

for i = n to 1 step – 1
if … then
dw_1.DeleteRow(i)
end if
next Звыняте, уже Dmitry. Написал.
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940303
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.правильнее сделать цикл так
Код: plaintext
1.
2.
3.
4.
for i = n to i
  If ... Then
     DeleteRow(i)
  End If
next

Побойтесь бога, через неделю он не сможет вспомнить, что делает эта конструкция (даже если исправит все опечатки) :)
Не говоря уже о том, что сюда сложно вносить изменения. Например, вполне может требоваться именно прямой порядок при обработке строк.
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940349
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может проше сделать так:
- отключить прорисовку DW;
- дать фильтр, где i=10;
- удалить все оставшиеся строки из DW;
- отменить фильтр;
- сброс изменений DW;
- включить прорисовку DW.

Ну, вот пожалуй и всё.
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940872
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n -- // вычитаю , т.к. после удаления кол-во оставшихся строк уменьшено на 1. -
Это надо делать только в том случае если впереди написано
for i=1 to dw_1.rowcount()
У вас же написано
n = dw_1.rowcount()
for i = 1 to n
Поэтому спокойно выбросите и эту строку с вычитанием и все должно отработать

-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940930
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edmikeca wrote:

> for i = n to 1 step -- 1

На это я и намекал аффтару топега .
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Delete rows from data window
    #34940966
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001n -- // вычитаю , т.к. после удаления кол-во оставшихся строк уменьшено на 1. -
Это надо делать только в том случае если впереди написано
for i=1 to dw_1.rowcount()
У вас же написано
n = dw_1.rowcount()
for i = 1 to n
Поэтому спокойно выбросите и эту строку с вычитанием и все должно отработать

-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
Как раз с точностью до наоборот. При for i=1 to dw_1.rowcount() n вообще не участвует в празднике.
...
Рейтинг: 0 / 0
Delete rows from data window
    #34941155
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу скрипта:
бывают случаи, когда нужно идти именно от первой строки к последней. В этом случае не проходит
Код: plaintext
STEP -  1 
. Можно воспользоваться скриптом, приведенном автором топика, только добавить
Код: plaintext
i --
...
Рейтинг: 0 / 0
Delete rows from data window
    #34941314
А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А
Гость
i-- взлом счетчика, это не очень хорошо
если нужен порядок, то я бы написал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
long i =  1 
do while ( true )
	if ( dw_1.RowCount() < i ) then exit
	if ( dw_1.Object.col_1[i] =  10  ) then
		dw_1.DeleteRow( i )
	else
		i++
	end if
loop
а если порядок не нужен, так как edmikeca
...
Рейтинг: 0 / 0
Delete rows from data window
    #34941329
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага не участвует только при каждой итерации пересчитывается
И если используется не обратный шаг возникают пропуски
так что явное уменьшение при обратном удалении можно не добавлять
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Delete rows from data window
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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