:: Visual Foxpro, Foxpro for DOS
Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Коллеги, можно ли извратиться и из курсора

create cursor cur1 (id I, cc c(20) )
insert into cur1 (id, cc) values (10, '34-56-78-90')

подучить вида

Id element
10 34
10 56
10 78
10 90

Цикл с aliens() не надо, так я тоже умею.


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 10.01.22 12:58
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
А надо через SELECT SQL штоле?
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
GetWordNum(cc, NN, '-')

Но, в общем случае, если требуется анализ по фрагментам строки, то в таблице (или в подчиненной таблице) должны быть созданы поля, содержащие эти фрагменты. И заполнение этих фрагментов должно быть напрямую на форме пользователем. А итоговая строка с разделителями - это как раз результат сложения (вычисления)

Проблема в том, что строковый анализ - это всегда сомнительная операция. Всегда есть шанс ошибиться
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Цикл с aliens() не надо, так я тоже умею.
Вариантов обработки строки несколько, но, уверен, ты все из них знаешь.
Так что конкретно тебя не устраивает в этом, зачем искать другой?
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Да вот пытаюсь придумать, как можно ускорить банальный alines() и с последующим перебором цикла и записью в новый курсор.

Хочется, чтобы было красиво и быстро, а-ля коррелиремый запрос, который формируется функцией типа array2cursor путём create cursor... from array. Но так не получается пока.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
sphinx
Но так не получается пока.

Дороги пока тоже не везде одинаково хороши, однако и по ним приходится ездить. ;)
Ratings: 0 negative/1 positive
Re: Как получить курсор из строки с разделителем?
vnkor

Сообщений: 324
Дата регистрации: 04.10.2007
А такое решение:
create cursor cur1 (id I, cc c(20) )
insert into cur1 (id, cc) values (10, '34-56-78-90')
CREATE CURSOR cur2 (element c(20), id I)
SELECT cur1
SCAN
STRTOFILE(STRTRAN(cur1.cc, "-", CHR(13)), "file1.txt")
SELECT cur2
APPEND FROM file1.txt TYPE DELIMITED
REPLACE id WITH cur1.id FOR id = 0 IN cur2
SELECT cur1
ENDSCAN
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Идея понятна, но вряд ли работа с файлом быстрее работы с массивом.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Про "быстродействие" процедуры - не буду обсуждать (в малых обьемах исходных файлов это несущественно)
Про решение - без двухэтапного SELECT (не вложенного SELECT) невозможно, мтк. Т.е
- получить выборку из GETWORDNUM(i) деталей второй колонки (получить тройку колонок (10, i, деталь_номера))
- превратить эту тройку колонок в желаемое, тем же SELECT
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
без двухэтапного SELECT (не вложенного SELECT) невозможно

Думаю что возможно (используя getwordnum в запросе и объединение с дополнительным курсором-болванкой на N "пронумерованных" записей), но скорее всего это будет абсолютно неэффективно. Это потребует многократного прохода по исходной таблице, вынимая лишь по 1 элементу за раз, ещё и "лишние" проходы, т.к. количество N придётся взять с запасом, чтобы сработало и в самом "крайнем" случае, когда это поле со списком заполнено под завязку односимвольными "элементами".

Я бы сказал что оптимальнее всего в цикле по исходной таблице используя alines постепенно заполнять выходной курсор.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Igor Korolyov
в цикле по исходной таблице используя alines

А, теперь понятно, а то все не доходило, причем тут инопланетяне

sphinx
Цикл с aliens()
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
alines - это aliеn(e)s ? ) это тривиально
() я тупанул, по пьяни



Исправлено 1 раз(а). Последнее : of63, 12.01.22 00:17
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
vnkor
А такое решение

Оно несомненно будет среди лидеров в номинации "наиболее экзотическое решение".

И чтобы оно не чувствовало себя одиноко, добавлю еще одно "по мотивам":

CREATE CURSOR cur2 (id I,element C(20))
CREATE CURSOR cur1 (id I,s C(20))
INSERT INTO cur1 VALUES (10,'34-56-78-90')
SCAN
STRTOFILE(TRAN(id)+','+STRTRAN(s,'-',0h0d+TRAN(id)+','),'file1.txt')
SELECT cur2
APPEND FROM file1.txt DELIMITED
ENDSCAN



Исправлено 7 раз(а). Последнее : akvvohinc, 12.01.22 04:02
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
leonid
Igor Korolyov
в цикле по исходной таблице используя alines

А, теперь понятно, а то все не доходило, причем тут инопланетяне

sphinx
Цикл с aliens()

T9 исправил, я правильно писал.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
vnkor

Сообщений: 324
Дата регистрации: 04.10.2007
akvvohinc
vnkor
А такое решение
Оно несомненно будет среди лидеров в номинации "наиболее экзотическое решение".

Сделано именно так, как просил автор:

sphinx
Коллеги, можно ли извратиться ...
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Придумал годное решение.
1) Сначала выбираем уникальные записи.
2) Создаём курсор с одним полем - для приёма элементов между разделителем.
3) Для каждой строки с разделителем:
а) заменяем дефис на символ перевода строки
б) сохраняем строку в файл (элементы уже в столбце!)
в) APPEND FROM этот_файл TYPE SDF в курсор п.2
г) INSERT INTO tmp (str, element) SELECT string_with_defis, element FROM cursor

4) SELECT FROM table1 t1 LEFT JOIN tmp t2 ON t1.string_with_defis=t2.string_with_defis INTO TABLE t_result.

Скорость почти в 2 раза.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Придумал годное решение.
Скорость почти в 2 раза.

Больше, меньше?
По сравнению с каким вариантом?
Покажи тестовые коды - исходный и "придуманный годный".
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Быстрее.
А код будет, только выкупить из классов. Но раз интересно, то сделаем. Если под забуду/закручусь - напомни. Да, считать можно и без файлов, обычным циклом. Но остальное всё же неплохо, так думаю.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Серёг, приятно, что кому-то реально интересно. Поверь, у нас оптимизацию кода совсем не ценят, по сути я на добровольных началах, просто знаю, что можно сделать быстрее. Сюда данные всё не выложу по понятным причинам, но есть варианты ;) Это только часть формирования НСИ, но выкушу только то, о чем писал в начале темы.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как получить курсор из строки с разделителем?
Burn

Сообщений: 5640
Откуда: Днепр
Дата регистрации: 02.01.2002
А обратную операцию средствами одного MSSQL 2016 можно проделать?


------------------
В борьбе бобра с козлом побеждает бобро
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 25 (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика