Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Уникальные записи с Memo полями / 13 сообщений из 13, страница 1 из 1
05.11.2015, 19:40
    #39095852
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Добрый день!
Подскажите решение задачки:
Имеются 2 таблицы одинаковой структуры но в структуре содержаться Memo поля.
Необходимо оптимально перенести уникальные записи одной таблицы в другую.
Пытался воспользоваться функцией
Код: sql
1.
SELECT DISTINCT * from table into array unik

сругалась.
ОК.
Почитал, про её несовместимость с memo и тд...
Хотел воспользоваться Alltrim, но он собака, обрезает не концевые пробелы, а вообще по средине слова, причем на
Код: sql
1.
? alltrim(field) 

возвращает корректное значение.
Есть ли какие-то механизмы, достаточно просто получить такие данные?
...
Рейтинг: 0 / 0
05.11.2015, 19:52
    #39095866
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
T1gRa_NTно он собака, обрезает не концевые пробелы, а вообще по средине слова, причем на
Код: sql
1.
? alltrim(field) 


возвращает корректное значение.Подозреваю, что в вашем случае фокс длины результирующих полей определяет по результатам обработки первой обработанной записи. Попробуйте прокастить с явным указанием длины результата.
...
Рейтинг: 0 / 0
05.11.2015, 20:51
    #39095909
Уникальные записи с Memo полями
T1gRa_NTДобрый день!
Подскажите решение задачки:
Имеются 2 таблицы одинаковой структуры но в структуре содержаться Memo поля.
Необходимо оптимально перенести уникальные записи одной таблицы в другую. Будем считать, что это есть условие задачи. Надо только уточнить термин "перенести". Надеюсь, я правильно понял и сие означает копировать/добавить записи из этой таблицы в другую таблицу.Пытался воспользоваться функцией
Код: sql
1.
SELECT DISTINCT * from table into array unik

сругалась.
ОК.
Почитал, про её несовместимость с memo и тд... 1. Это не функция, а запрос.
2. Это запрос никак никуда и ничего не переносит и переносить не может.
3. Этот запрос выбирает записи уникальные в пределах одной таблицы. А как они соотносятся со второй таблицей? Уникальность в пределах обоих таблиц нужна или нет?
4. Если я правильно понял условия, то пока вырисовывается один запрос вида
Код: sql
1.
insert into table2 select distinct * from table1 where <условие, зависящее от ответа на вопрос в п.3>


Хотел воспользоваться Alltrim, но он собака, обрезает не концевые пробелы, а вообще по средине слова, причем на
Код: sql
1.
? alltrim(field) 

возвращает корректное значение.Этот пассаж вообще непонятен. Или где-то есть условия по переносу исключительно через массив? Какое отношение это имеет к переносу?
Есть ли какие-то механизмы, достаточно просто получить такие данные?Переформулируйте вопрос. Ибо непонятно какое здесь слово основное вопросительное. "Есть ли", "достаточно", "получить" или "такие"?
...
Рейтинг: 0 / 0
05.11.2015, 22:56
    #39095974
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
tanglirПодозреваю, что в вашем случае фокс длины результирующих полей определяет по результатам обработки первой обработанной записи. Попробуйте прокастить с явным указанием длины результата.
Хм, на сколько понял слово "прокастить": определить максимальную длину текста в memo без концевых пробелов и явно её указать в запросе?

правильный проходящий.Будем считать, что это есть условие задачи. Надо только уточнить термин "перенести". Надеюсь, я правильно понял и сие означает копировать/добавить записи из этой таблицы в другую таблицу.
Да, именно так, добавлять уникальные записи из таблицы1 в таблицу2.

правильный проходящий.1. Это не функция, а запрос.
2. Это запрос никак никуда и ничего не переносит и переносить не может.
3. Этот запрос выбирает записи уникальные в пределах одной таблицы. А как они соотносятся со второй таблицей? Уникальность в пределах обоих таблиц нужна или нет?
4. Если я правильно понял условия, то пока вырисовывается один запрос вида
Код: sql
1.
insert into table2 select distinct * from table1 where <условие, зависящее от ответа на вопрос в п.3>



1. Да это запрос, который создает массив и заполняет его уникальными записями из таблицы 1. А потом простейшим
Код: sql
1.
append from array... 

все записи со всеми полями добавляются в таблицу 2.
2. И не должен, он выбирает уникальные записи по всем полям и заносит их в массив.
3.Никак, таблица2 или пустая или записи из первой добавляются в конец таблицы2. Уникальность нужна только по записям таблицы1.
4.К большому сожалению как я и писал выше distinct не работает если select проходит по таблице с memo полями.
http://www.foxclub.ru/rhproject/project/html/8a629568-55b2-43df-b0e9-8e9f8f527c2f.htm


правильный проходящий.Этот пассаж вообще непонятен. Или где-то есть условия по переносу исключительно через массив? Какое отношение это имеет к переносу?
Условия исключительно через массив нету, пытался уменьшить писанину.
правильный проходящий.Переформулируйте вопрос. Ибо непонятно какое здесь слово основное вопросительное. "Есть ли", "достаточно", "получить" или "такие"?
Главное слово "Есть ли", ну и хотелось бы не сильно замороченный способ)
...
Рейтинг: 0 / 0
05.11.2015, 23:23
    #39095987
Уникальные записи с Memo полями
T1gRa_NT,

самый незаморочный способ уже показан. Еще раз:
insert into table 2 select ....
Просто в нем каждое мемо-поле обернуть в rtrim(left(поле, 254))
...
Рейтинг: 0 / 0
06.11.2015, 05:41
    #39096049
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
T1gRa_NTtanglirПодозреваю, что в вашем случае фокс длины результирующих полей определяет по результатам обработки первой обработанной записи. Попробуйте прокастить с явным указанием длины результата.
Хм, на сколько понял слово "прокастить": определить максимальную длину текста в memo без концевых пробелов и явно её указать в запросе?
Сделать фиксированный размер поля. Как вариант
Код: sql
1.
padr(field, 254)
...
Рейтинг: 0 / 0
06.11.2015, 06:45
    #39096068
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Это то понятно, а вот как при этом не потерять 255 и тд символы? Ведь ради них memo поля и создавал( и все прелесть полных наименований теряется...
...
Рейтинг: 0 / 0
06.11.2015, 07:26
    #39096086
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Можно просто отсортировать таблицу по контрольной сумме мемо-поля, scan`ом пройтись по ней и сравнивать предыдущее с текущим, вставлять если не совпало
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select f1, f2, f3,  MyMemo, sys(2017, MyMemo, 0, 1) as cCrc from t1 order by f1, f2, f3, cCrc into cursor MyCur
lcPrev = '*'
scan
   if lcPrev != MyCur.f1 + MyCur.f2 + MyCur.f3 + MyCur.MyMemo
     insert into ... values (MyCur.f1, MyCur.f2, MyCur.f3, MyCur.MyMemo)
   endif
   lcPrev = MyCur.f1 + MyCur.f2 + MyCur.f3 + MyCur.MyMemo
endscan
...
Рейтинг: 0 / 0
06.11.2015, 07:37
    #39096090
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Пока есть 2 варианта реализации:
1.
Код: sql
1.
Sys(2017,'',-1,3)

Вычисляем контрольную сумму по всем полям включая memo по алгоритму CRC32 - быстро, легко но не дает 100% уникальности. Хотя если на малых объемах (у меня бывает не более 60 записей в таблице1), то думаю будет работать корректно.
2. Сканированием закидывать все поля в переменные
Код: sql
1.
Scatter memo memvar

и проверять есть ли такие сочетания в таблице2, если не встретились, то добавлять запись.
Долго, но надежно, при увеличении кол-во записей в таблице2 растет время работы.
Дорогие коллеги, какой вариант посоветуете?
...
Рейтинг: 0 / 0
06.11.2015, 07:45
    #39096096
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Dima T, пока писал своё сообщение, написали Вы)
У Вас получалась так сказать компиляция моих вариантов)
Единственное, Вы тягаете не memo, а их контрольные значения, но да, в вашем варианте используется только 1 таблица, спасибо большое, буду смотреть)
...
Рейтинг: 0 / 0
06.11.2015, 07:56
    #39096099
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Лучше объединить оба варианта: сначала по Sys(2017) а там где оно совпало для нескольких записей дополнительно сравнить только их между собой.

PS Недоверяю Sys(2017), подробностей не помню, помню что какие-то неадекватные результаты он выдавал. Заменил на Sys(2007)
...
Рейтинг: 0 / 0
06.11.2015, 08:16
    #39096106
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Тут 18376355 напутал немного, sys(2007) надо вместо 2017
...
Рейтинг: 0 / 0
06.11.2015, 14:36
    #39096655
T1gRa_NT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальные записи с Memo полями
Dima T, спасибо, воспользовался Вашим вариантом. Вроде пока отрабатывает корректно.
Dima TМожно просто отсортировать таблицу по контрольной сумме мемо-поля, scan`ом пройтись по ней и сравнивать предыдущее с текущим, вставлять если не совпало
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select f1, f2, f3,  MyMemo, sys(2017, MyMemo, 0, 1) as cCrc from t1 order by f1, f2, f3, cCrc into cursor MyCur
lcPrev = '*'
scan
   if lcPrev != MyCur.f1 + MyCur.f2 + MyCur.f3 + MyCur.MyMemo
     insert into ... values (MyCur.f1, MyCur.f2, MyCur.f3, MyCur.MyMemo)
   endif
   lcPrev = MyCur.f1 + MyCur.f2 + MyCur.f3 + MyCur.MyMemo
endscan
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Уникальные записи с Memo полями / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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