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

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

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


возвращает корректное значение.Подозреваю, что в вашем случае фокс длины результирующих полей определяет по результатам обработки первой обработанной записи. Попробуйте прокастить с явным указанием длины результата.
...
Рейтинг: 0 / 0
Уникальные записи с Memo полями
    #39095909
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
Уникальные записи с Memo полями
    #39095974
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Уникальные записи с Memo полями
    #39095987
T1gRa_NT,

самый незаморочный способ уже показан. Еще раз:
insert into table 2 select ....
Просто в нем каждое мемо-поле обернуть в rtrim(left(поле, 254))
...
Рейтинг: 0 / 0
Уникальные записи с Memo полями
    #39096049
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
T1gRa_NTtanglirПодозреваю, что в вашем случае фокс длины результирующих полей определяет по результатам обработки первой обработанной записи. Попробуйте прокастить с явным указанием длины результата.
Хм, на сколько понял слово "прокастить": определить максимальную длину текста в memo без концевых пробелов и явно её указать в запросе?
Сделать фиксированный размер поля. Как вариант
Код: sql
1.
padr(field, 254)
...
Рейтинг: 0 / 0
Уникальные записи с Memo полями
    #39096068
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это то понятно, а вот как при этом не потерять 255 и тд символы? Ведь ради них memo поля и создавал( и все прелесть полных наименований теряется...
...
Рейтинг: 0 / 0
Уникальные записи с Memo полями
    #39096086
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
Уникальные записи с Memo полями
    #39096090
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока есть 2 варианта реализации:
1.
Код: sql
1.
Sys(2017,'',-1,3)

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

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

PS Недоверяю Sys(2017), подробностей не помню, помню что какие-то неадекватные результаты он выдавал. Заменил на Sys(2007)
...
Рейтинг: 0 / 0
Уникальные записи с Memo полями
    #39096106
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут 18376355 напутал немного, sys(2007) надо вместо 2017
...
Рейтинг: 0 / 0
Уникальные записи с Memo полями
    #39096655
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Уникальные записи с Memo полями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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