Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нужны идеи
 
 автор: osmor   (25.08.2009 в 09:07)   личное сообщение
 
 

Задача (условно):
есть 2 таблицы в каждой по тестовому одному полю.
[исправлено]
Нужно добавить в таблицу2 новые уникальные записи изтаблицы1. т.е. те токотые есть в таблице1, но нет в таблице2 [/исправлено]
записи в таблице1 могут дублироваться (но добавить нужно только уникальные)
...
чуть не забыл... значения в полях Case зависимые
т.е.
A2a <> a2a

Пока идея такая:
создать поле содержащее коды символов составляющих строку и по нему сравнивать.
Поскольку данные будут только Engl символьные надеюсь обойтись ASC
(какое будет поле вычисляемое в запросе или реальное в таблицах пока не решил, наверное все же реальное, записей очень много и задача регулярная, но это пока не суть)
Пока нужны ИДЕИ!!!

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 09:23)   личное сообщение
 
 


Нужно добавить в таблицу2 записи отсутствующие в таблице1


Получается в Таблице2 мы просто дублируем записи??? или В таблицу3

  Ответить  
 
 автор: osmor   (25.08.2009 в 09:32)   личное сообщение
 
 

неправильно выразился
нужно добавить в таблицу2 записи которые есть в таблице1, но нет в таблице2
т.е. из таблицы1 в таблицу2 отсутствующие в таблице2 записи
в таблице1 записи могут дублироваться, в таблице2 - нет
пример:
таблица 1:

a1A
a1a
A1a
A1A
a1A

таблица 2:

a1a
a1A


должно получиться в Таблице 2

a1a
A1a
A1A
a1A

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 09:51)   личное сообщение
 
 

Грубо говоря создание Справочника наименований наоборот - есть список поступлений, и добавляем новае наименования из списка.
В чем проблема?
есть функция LEFT JOIN.
и при добавление записи в Табл1 и вносить ее в Табл2 типа "Отсутствие в списке".

  Ответить  
 
 автор: osmor   (25.08.2009 в 09:56)   личное сообщение
 
 

проблема в
"Case зависимости"
т.е.
A2a <> a2a

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 10:09)   личное сообщение
 
 

Че значит Case зависимость?
есть - Asc() и сравнивай коды символов. Напиши рекурсию.
И вообще есть ли смысл в A2a <> a2a, т.к. один напишет "Хлеб" другой "ХЛеб" и будет 2 "хлеба" хотя по логике он один.

  Ответить  
 
 автор: osmor   (25.08.2009 в 10:16)   личное сообщение
 
 

для этой программы
Хлеб и ХЛеб и хлеб - это все разные слова несущие разную смысловую нагрузку
Идея про Asc() уже пришла , я ее в своем вопросе описал...
хотелось бы решить задачу запросами, т.к. объемы в районе 300 000 записей в таблице2 (в нее добавляем), а таблица1 (каждый раз новая) по 30-50 тыс. записей.
В принципе идея с кодами символов вполне устраивает, т.е. строки из таблицы один все равно предварительно обрабатываются посимвольно, т.е. создать еще одно поле и гнать туда коды - не проблема, но хочется чего-то "красивого"

  Ответить  
 
 автор: час   (25.08.2009 в 10:42)   личное сообщение
 
 

Это значит свою функцию-запрос надо ...
- записи без подчинённых - Да???

  Ответить  
 
 автор: osmor   (25.08.2009 в 10:45)   личное сообщение
 
 

ну почти

  Ответить  
 
 автор: час   (25.08.2009 в 10:49)   личное сообщение
 
 

У мну красиво не получится
У мну куралесово получится

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 10:50)   личное сообщение
 
 

если простое сравнение + сумма Asc-ки кодов символов - получится не плохо.

Запрос


SELECT Таблица3.Код, Таблица3.g1
FROM Таблица3 LEFT JOIN Запрос12 ON Таблица3.Код = Запрос12.Код
WHERE (((Запрос12.g1) Is Null));



Запрос12---


SELECT Таблица3.g1, opo([g1])-opo([g2]) AS Выражение1, Таблица3.Код
FROM Таблица3 LEFT JOIN Таблица4 ON Таблица3.g1 = Таблица4.g2
WHERE (((opo([g1])-opo([g2]))=0));


где


Function opo(ParamArray Ar())
Dim k, l, m, n As Variant
Sum = 0
If Nz(Ar(0), "стоп") = "стоп"  Then  
    Sum = 0
    Else
For i = 1 To Len(Ar(0))
    Sum = Sum + Asc(Mid(Ar(0), i, 1)) * i
Next
End If
opo = Sum
End Function


таблы
Таблица3
Код g1
1 aaa
2 aAa
3 aaA
4 ssss

Таблица4
Код g2
1 aaa
2 aAa

Запрос выдает

Код g1
3 aaA
4 ssss

  Ответить  
 
 автор: osmor   (25.08.2009 в 11:01)   личное сообщение
 
 

Идея с кодами понятна, вот только я бы не стал их суммировать....

? asc("1")+asc("2")
99
? asc("c")
99

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 11:04)   личное сообщение
 
 

вот для этого и есть * i - добавляется вес позиции

  Ответить  
 
 автор: osmor   (25.08.2009 в 11:04)   личное сообщение
 
 

ага, был невнимателен

  Ответить  
 
 автор: Анатолий (Киев)   (25.08.2009 в 10:54)   личное сообщение
 
 

Например использовать функцию StrComp в режиме vbBinaryCompare:
INSERT INTO T2 (Поле) SELECT T1.Поле FROM T1 WHERE NOT EXISTS (SELECT * FROM T2 WHERE StrComp(T1.Поле, T2.Поле, 0)=0)

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 11:02)   личное сообщение
 
 

Красивше

  Ответить  
 
 автор: osmor   (25.08.2009 в 11:02)   личное сообщение
 
 

интересно, посмотрю по скорости

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 11:14)   личное сообщение
 
 

А мона пример Таблицы1, че там за данные. (я про Хлеб и Хлеб)
Интересно просто.

  Ответить  
 
 автор: osmor   (25.08.2009 в 11:26)   личное сообщение
 
 

ЛеГко, на значение этих слов у меня не спрашивайте

a 1 b glycoprotein
a 1 bg
alpha 1 b glycoprotein
alpha 1 b glycoprotein
dkfzp 686 f 0970
glycoprotein alpha 1 b
hyst 2477
liver regeneration related 1
liver regeneration related i
loc 125908
loc 147680
loc 223599
loc 64024
A(2)M
a ( 2 ) mg
a 2 ( mg )
A2M
a2m
A2m
a2-m
A2-m
A2-M
a 2 maa
a 2 mac i
a 2 mac 1
a 2 macroglobulin
a 2 mg
a - 2 mg
a 2 - mg
a 2 mg _ human
alpha 1 inhibitor 3 variant i
alpha 2 m
alpha 2 macroglobulin
alpha 2 macroglobulin
cpamd 5
dkfzp 779 b 086
fwp 007
mgc 114358
mug i
mug 1
mug 2
murinoglobulin 1
murinoglobulin 2
murinoglobulin i
murinoglobulin ii
rata 2 mac i
rata 2 mac 1
s 863 7
s 863 ( 7 )
s 8637
s 863 - 7
a 2 mp
alpha 2 macroglobulin pseudogene
atrophia areata peripapillary chorioretinal degeneration
gt - iic binding protein
gtrgeo 5
loc 653546
loc 654195

  Ответить  
 
 автор: ShadowOfSun   (25.08.2009 в 11:37)   личное сообщение
 
 

Предлагаю складывать не цифры

Function HexString(InpString As String) As String
   Dim n, i As Long
   HexString = ""
   
   n = Len(InpString)
   For i = 1 To Len(InpString)
      HexString = HexString & Hex$(Asc(Mid$(InpString, i, 1)))
   Next i
End Function

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 11:44)   личное сообщение
 
 

а на ситуацию когда два символа дают туже последовательность что и Один не нарвемся?

  Ответить  
 
 автор: ShadowOfSun   (25.08.2009 в 12:25)   личное сообщение
 
 

Попробуй
Если Hex на любой англицкий символ выдает два,
то это из разряда фантастики

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 11:39)   личное сообщение
 
 

Мда, трудна и неказиста жизнь простого программиста.
но т.к. в конечном итоге все данные кто-то вводит ручками, то бесконтрольное добавление может давать неправильные результаты в будущем.

  Ответить  
 
 автор: osmor   (25.08.2009 в 11:45)   личное сообщение
 
 

в 80% случаев данные добавляются "пакетно" из текстовых файлов "регулярной" структуры.
для остальных 20% созданы (будут созданы) формы позволяющие добавлять/изменять/удалять записи с контролем новых данных.
для выявления различного рода ошибок которые все же "проскочили" контроль, будут созданы процедуры выявления ошибок в существующих данных.

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 11:49)   личное сообщение
 
 

Челу который будет осуществлять этот контроль проще застрелится.

Кажется нужно изначально предусмотреть ввод данных которые поступают в Таблицу1 на основании Таблицы2

"Только преодолевая трудности - ты становишся человеком" (кажется Семен Альтов)

  Ответить  
 
 автор: osmor   (25.08.2009 в 11:59)   личное сообщение
 
 

"Челу который будет осуществлять этот контроль проще застрелится."
он уже сейчас это делает, без всех этих инструментов

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 12:06)   личное сообщение
 
 

Если не предусмотреть изменение Поля в месте где оно формируется двойники будут постоянно, т.е. опять пришли к Справочнику.

  Ответить  
 
 автор: osmor   (25.08.2009 в 12:27)   личное сообщение
 
 

двойники будут отсекаться в момент добавления данных их таблицы1 в таблицу2.
Данные "формируется" в интернете. Это результат работы поисковика по определенным критериям т.е. Html с разных страниц интернета, которые потом парсятся и на выходе получается некий текстовый файл, более или менее структурированный.
Этот файл дается на вход программе которую сейчас и вояю, весь контроль должен быть в этой программе.
добавление в общем-то и происходит в справочник.
Задачу я представил очень упрощенно, на самом деле полей конечно не одно, и добавление будет происходит не по одному полю, на самом деле в зависимости от данных в других полях, для каких-то строк данные не будут Case зависимыми, для каких-то условий возможны дубли, для каких-то "фраза" должна состоять из слов из другого справочника... в общем там все не просто , но жутко интересно

  Ответить  
 
 автор: kot_k_k   (25.08.2009 в 12:35)   личное сообщение
 
 

Может есть смысл сделать таблицу Аналоги, чтоб не напарываться на двойников и не давать разростаться Таблице.

  Ответить  
 
 автор: osmor   (25.08.2009 в 15:17)   личное сообщение
 
 

это и есть таблица аналогий
так и называется tblAliases

  Ответить  
 
 автор: Lukas   (25.08.2009 в 17:30)   личное сообщение
 
 

А где данные будут храниться, в родных табличках MDB или на сервере?

  Ответить  
 
 автор: osmor   (25.08.2009 в 17:45)   личное сообщение
 
 

Пока в MDB
слишком многое выясняется в процессе...
Например с уникальностью полей так до конца и не разобрались
то "поле VAL уникально ВЕЗДЕ", а начинаем смотреть то что сделал "поле VAL уникально, но может повторяться если набор организмов разный" в общем... пока MDB, точнее ACCDB

  Ответить  
 
 автор: Lukas   (25.08.2009 в 17:58)   личное сообщение
 
 

ОК. У меня пока джет не справляется с моими идеями по этой теме.

  Ответить  
 
 автор: osmor   (25.08.2009 в 18:10)   личное сообщение
 
 

придется написать свой движок

  Ответить  
 
 автор: Lukas   (25.08.2009 в 18:45)   личное сообщение
 
 

Неее. Проще научиться играть по его правилам.
Я так понимаю, что уникальным индексом по одному полю в данном случае отделаться не получиться?
Это я к тому, что может сделать поле с регистрозависимым индексом?

  Ответить  
 
 автор: osmor   (25.08.2009 в 19:34)   личное сообщение
 
 

не не получится

  Ответить  
 
 автор: Lukas   (25.08.2009 в 19:40)   личное сообщение
 
 

Хорошо, а составной регистрозависимый индекс нам не поможет?

  Ответить  
 
 автор: osmor   (25.08.2009 в 19:51)   личное сообщение
 
 

а это как ?
хотя боюсь что нет... слишком много условий завязанных на другие справочники
т.е. например есть некий многозначный атрибут объекта (т.е. это не поле а таблица связанная с объектом) , объект относится к определенному типу, тип входит в какой-то словарь, в словаре указано могут ли быть повторы значения атрибута объекта внутри данного словаря. если можно, то в объектах относящимся к одному словарю могут быть повторы (но не в одном объекте), а вот если нельзя, то этот атрибут объекта уникален во всем словаре
В общем Ж...
так что ты там говорил про регистрозависимый индекс? Как он создается ?

  Ответить  
 
 автор: Lukas   (25.08.2009 в 19:54)   личное сообщение
 
 

у booby про регистрозависимый индекс

  Ответить  
 
 автор: osmor   (25.08.2009 в 20:00)   личное сообщение
 
 

Круто! Век живи, век учись, как был дураком так и останешься

  Ответить  
 
 автор: osmor   (25.08.2009 в 19:55)   личное сообщение
 
 

По моему пора прекратить забивать всем голову общей задачей... Я в этой каше разбираюсь уже 5 месяцев и еще не все выяснил.
Мне нужна идея решения локальной задачи... добавления уникальных регистрозависимых записей.

  Ответить  
 
 автор: Lukas   (26.08.2009 в 01:32)   личное сообщение
 
 

Докладаю вариант, окончание которого удалось таки дождаться:
1. Создал таблицу tblA, натолкал 300 000 записей (поле Alias 52-84 разных символов)
2. Создал таблицу tblNew, натолкал 50 000 записей (IDItem Long, Alias 52-84 разных символов), из них 25 000 записей cо значением Alias, идентичным значениям в таблице tblA.
3. Создал таблицу tblTemp (IdItem Long, Alias varBinary 510). Задал уникальный индекс по полю Alias.
4. Запросом (запуск вручную) добавил записи из tblA в tblTemp (только поле Alias) - 4 мин 45 сек.
5. Запросом (запуск вручную) добавил записи из tblNew в tblTemp (IDItem, Alias) - 0 мин 23 сек.
Получил отказ на 25 000 записей (что радует)
6. Запросом (запуск вручную) добавил записи из tblTemp в tblA (Alias), где IDItem Is Not Null - 0 мин 05 сек. (Новые 25 000 записей)
7. Запросом (запуск вручную) удалил все записи из tblTemp. Очень быстро.

  Ответить  
 
 автор: osmor   (26.08.2009 в 12:29)   личное сообщение
 
 

Спасибо.
Про индекс очень хорошо подумаю... видимо где-то можно будет применить.

  Ответить  
 
 автор: Lukas   (26.08.2009 в 15:16)   личное сообщение
 
 

Исчо мутная идея:
Хранить "маски регистров" буковок, преобразованные в Long:
Если мы имеем строку до 31 символа (увы): "Однажды В Втуденую Зимнюю Пору"
Мы можем получить ее маску регистров:___100000001010000000010000001000
и преобразовать ее в Long:______________1613235208

В итоге, мы храним значительно меньше лишнего, всего 4 байта на строку, и имеем возможность сравнивать строки с учетом регистра.
На скорость не проверял.

  Ответить  
 
 автор: osmor   (26.08.2009 в 15:20)   личное сообщение
 
 

вот именно чего-то подобного я и ждал когда начинал этот топик!!!!
Именно идей!!! А уж проверить, прикрутить, попробовать - я сам :-)
спасибо!

  Ответить  
 
 автор: Lukas   (26.08.2009 в 15:22)   личное сообщение
 
 


...я сам...


А нам то тоже-ж интересно.

  Ответить  
 
 автор: osmor   (26.08.2009 в 15:44)   личное сообщение
 
 

Тут еще народ насоветовал.
"Зиповать" строки сравнивать зипованное значение

  Ответить  
 
 автор: osmor   (27.08.2009 в 17:32)   личное сообщение
 
 

Закрывая тему.
Нашел на sql.ru несколько обсуждений на данную тему.
Пока рассматриваю 3 варианта
1-й
Суммирование кодов символов с учетом веса положения символа в строке (спасибо kot_k_k)
и сравнение/группировка по этому полю
2-й
Вычисление строки определяющей положение больший и маленьких символов в строке
типа:
OsMOr = 10110
и сравнение/группировка по 2-м полям
3-й
использование дополнительного поля binary с тем же значением что и текстовое и его использовать для сравнения/группировки

StrComp - пока никак не придумаю как его прикрутить к группировке (для Join подходит идеально)

Что буду использовать пока не решил, нужно покрутить в голове все +/- (дело не только в скорости)
Вот в дополнение ссылка от MS
http://support.microsoft.com/kb/244693
Всем большое спасибо!

  Ответить  
 
 автор: Lukas   (27.08.2009 в 18:21)   личное сообщение
 
 


Вычисление строки ... OsMOr = 10110

А чего в Long не перевести, медленно?

  Ответить  
 
 автор: osmor   (27.08.2009 в 18:26)   личное сообщение
 
 

в смысле строку "10110" в число?

  Ответить  
 
 автор: Lukas   (27.08.2009 в 18:27)   личное сообщение
 
 

Не, исходную строку сразу в Long (при длине Max 31 символ) через маску регистров.
Например:
"osmor"=0
"Osmor"=1
"OSmor"=3
"OsMOr"=13
"OSMOROSMOROSMOROSMOROSMOROSMORO"=2147483647
И даже то, что
"osmorosmorosmor"=0
не должно помешать по-моему, так так задействованы два поля, основное и маска.
Хотя суммирование кодов символов пожалуй побыстрее будет и однозначнее.

Добавлено:
Однозначнее, да не очень, потому как:
?opo("AA")-аглицкие А
195
?opo("Г") - русская Г
195
?opo("FA")
200
?opo("И")
200
Или например на чистом аглицком:
?opo("ABC")
398
?opo("DBB")
398

Для opo=561 насчитал 781 буквосочетание (из трех аглицких букв обоих регистров и пробела).
Из возможных 53*53*53=148877 вариантов буквосочетаний не повторились только 46 значений opo.
Я так понимаю, что сравнение/группировка по одному этому полю (вариант 1), тоже не получится.

  Ответить  
 
 автор: kot_k_k   (28.08.2009 в 09:15)   личное сообщение
 
 

Там было умножение на ВЕС позиции!


For i = 1 To Len(Ar(0))
    Sum = Sum + Asc(Mid(Ar(0), i, 1)) * i
Next


  Ответить  
 
 автор: Lukas   (28.08.2009 в 09:26)   личное сообщение
 
 

Я видел, но если-бы строку можно было однозначно преобразовать к Long, никто-бы строки не хранил по 2 байта на символ.
Проверь хотя бы то, что я привел. Считал твоей функцией.
Как маску регистров использовать можно, как однозначный идентификатор для сортировки, сравнения и группировки - нет.

  Ответить  
 
 автор: kot_k_k   (28.08.2009 в 09:44)   личное сообщение
 
 

Функция ведь написана для проверки РАВНЫХ (для бахнутого Аксеса) строк!!!
Она работает в Запросе, где поля равны друг другу и Задает ПОЛОНУЮ строгость отношения РАВНО (каламбур).


FROM Таблица3 LEFT JOIN Таблица4 ON Таблица3.g1 = Таблица4.g2 
WHERE (((opo([g1])-opo([g2]))=0)); 

  Ответить  
 
 автор: Lukas   (28.08.2009 в 09:56)   личное сообщение
 
 

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

Public Function funASCIndexHex(strInput As String) As String
    Dim i As Long
    funASCIndexHex = String(Len(strInput) * 2, " ")
    For i = 1 To Len(strInput)
        Mid$(funASCIndexHex, i * 2 - 1, 2) = Hex(Asc(Mid$(strInput, i, 1)))
    Next i
End Function

тогда одно поле с ее значением можно было-бы использовать для объединения, группировки, сравнения и т.д.

  Ответить  
 
 автор: kot_k_k   (28.08.2009 в 10:31)   личное сообщение
 
 

Да тут полностью согласен, ведь писал "в лоб".

  Ответить  
 
 автор: Lukas   (28.08.2009 в 10:53)   личное сообщение
 
 

Да нормальный для маски алгоритм. Быстрее чем предложенный мной.
В моем алгоритме есть один теоретический малопригодный нюанс.
Можно хранить одно значение буквосочетаний в нижнем регистре и несколько масок регистров и,
при необходимости, восстанавливать по маске регистров значение буквосочетания с учетом регистра.
Но работать будет жуть как медленно.

  Ответить  
 
 автор: ShadowOfSun   (28.08.2009 в 10:57)   личное сообщение
 
 

Специально для kot_k_k
И если есть железная уверенность, что первые 16 символов никто не введет
можно суммировать Нех от символа


HexString= = 10
HexString= = 11
HexString= = 12
HexString= = 13
HexString= = 14
HexString= = 15
HexString= = 16
HexString= = 17
HexString= = 18
HexString= = 19
HexString= = 1A
HexString= = 1B
HexString= = 1C
HexString= = 1D
HexString= = 1E
HexString= = 1F
HexString=  = 20
HexString=! = 21
HexString=" = 22
HexString=# = 23
HexString=$ = 24
HexString=% = 25
HexString=& = 26
HexString=' = 27
HexString=( = 28
HexString=) = 29
HexString=* = 2A
HexString=+ = 2B
HexString=, = 2C
HexString=- = 2D
HexString=. = 2E
HexString=/ = 2F
HexString=0 = 30
HexString=1 = 31
HexString=2 = 32
HexString=3 = 33
HexString=4 = 34
HexString=5 = 35
HexString=6 = 36
HexString=7 = 37
HexString=8 = 38
HexString=9 = 39
HexString=: = 3A
HexString=; = 3B
HexString=< = 3C
HexString== = 3D
HexString=> = 3E
HexString=? = 3F
HexString=@ = 40
HexString=A = 41
HexString=B = 42
HexString=C = 43
HexString=D = 44
HexString=E = 45
HexString=F = 46
HexString=G = 47
HexString=H = 48
HexString=I = 49
HexString=J = 4A
HexString=K = 4B
HexString=L = 4C
HexString=M = 4D
HexString=N = 4E
HexString=O = 4F
HexString=P = 50
HexString=Q = 51
HexString=R = 52
HexString=S = 53
HexString=T = 54
HexString=U = 55
HexString=V = 56
HexString=W = 57
HexString=X = 58
HexString=Y = 59
HexString=Z = 5A
HexString=[ = 5B
HexString=\ = 5C
HexString=] = 5D
HexString=^ = 5E
HexString=_ = 5F
HexString=' = 60
HexString=a = 61
HexString=b = 62
HexString=c = 63
HexString=d = 64
HexString=e = 65
HexString=f = 66
HexString=g = 67
HexString=h = 68
HexString=i = 69
HexString=j = 6A
HexString=k = 6B
HexString=l = 6C
HexString=m = 6D
HexString=n = 6E
HexString=o = 6F
HexString=p = 70
HexString=q = 71
HexString=r = 72
HexString=s = 73
HexString=t = 74
HexString=u = 75
HexString=v = 76
HexString=w = 77
HexString=x = 78
HexString=y = 79
HexString=z = 7A
HexString={ = 7B
HexString=| = 7C
HexString=} = 7D
HexString=~ = 7E
HexString= = 7F
HexString=? = 80
HexString=? = 81
HexString=‚ = 82
HexString=? = 83
HexString=„ = 84
HexString=… = 85
HexString=† = 86
HexString=‡ = 87
HexString=? = 88
HexString=‰ = 89
HexString=S = 8A
HexString=‹ = 8B
HexString=? = 8C
HexString=? = 8D
HexString=Z = 8E
HexString=? = 8F
HexString=? = 90
HexString=‘ = 91
HexString=’ = 92
HexString=“ = 93
HexString=” = 94
HexString=• = 95
HexString=– = 96
HexString=— = 97
HexString=? = 98
HexString=™ = 99
HexString=s = 9A
HexString=› = 9B
HexString=? = 9C
HexString=? = 9D
HexString=z = 9E
HexString=Y = 9F
HexString=  = A0
HexString=? = A1
HexString=? = A2
HexString=? = A3
HexString=¤ = A4
HexString=? = A5
HexString=¦ = A6
HexString=§ = A7
HexString=? = A8
HexString=© = A9
HexString=? = AA
HexString=« = AB
HexString=¬ = AC
HexString=­ = AD
HexString=® = AE
HexString=? = AF
HexString=° = B0
HexString=± = B1
HexString=? = B2
HexString=? = B3
HexString=? = B4
HexString=µ = B5
HexString=¶ = B6
HexString=· = B7
HexString=? = B8
HexString=9 = 39
HexString=: = 3A
HexString=; = 3B
HexString=< = 3C
HexString== = 3D
HexString=> = 3E
HexString=? = 3F
HexString=@ = 40
HexString=A = 41
HexString=B = 42
HexString=C = 43
HexString=D = 44
HexString=E = 45
HexString=F = 46
HexString=G = 47
HexString=H = 48
HexString=I = 49
HexString=J = 4A
HexString=K = 4B
HexString=L = 4C
HexString=M = 4D
HexString=N = 4E
HexString=O = 4F
HexString=P = 50
HexString=Q = 51
HexString=R = 52
HexString=S = 53
HexString=T = 54
HexString=U = 55
HexString=V = 56
HexString=W = 57
HexString=X = 58
HexString=Y = 59
HexString=Z = 5A
HexString=[ = 5B
HexString=\ = 5C
HexString=] = 5D
HexString=^ = 5E
HexString=_ = 5F
HexString=' = 60
HexString=a = 61
HexString=b = 62
HexString=c = 63
HexString=d = 64
HexString=e = 65
HexString=f = 66
HexString=g = 67
HexString=h = 68
HexString=i = 69
HexString=j = 6A
HexString=k = 6B
HexString=l = 6C
HexString=m = 6D
HexString=n = 6E
HexString=o = 6F
HexString=p = 70
HexString=q = 71
HexString=r = 72
HexString=s = 73
HexString=t = 74
HexString=u = 75
HexString=v = 76
HexString=w = 77
HexString=x = 78
HexString=y = 79
HexString=z = 7A
HexString={ = 7B
HexString=| = 7C
HexString=} = 7D
HexString=~ = 7E
HexString= = 7F
HexString=Ђ = 80
HexString=Ѓ = 81
HexString=‚ = 82
HexString=ѓ = 83
HexString=„ = 84
HexString=… = 85
HexString=† = 86
HexString=‡ = 87
HexString=? = 88
HexString=‰ = 89
HexString=Љ = 8A
HexString=‹ = 8B
HexString=Њ = 8C
HexString=Ќ = 8D
HexString=Ћ = 8E
HexString=Џ = 8F
HexString=ђ = 90
HexString=‘ = 91
HexString=’ = 92
HexString=“ = 93
HexString=” = 94
HexString=• = 95
HexString=– = 96
HexString=— = 97
HexString=&#152; = 98
HexString=™ = 99
HexString=љ = 9A
HexString=› = 9B
HexString=њ = 9C
HexString=ќ = 9D
HexString=ћ = 9E
HexString=џ = 9F
HexString=  = A0
HexString=Ў = A1
HexString=ў = A2
HexString=Ј = A3
HexString=¤ = A4
HexString=Ґ = A5
HexString=¦ = A6
HexString=§ = A7
HexString=Ё = A8
HexString=© = A9
HexString=Є = AA
HexString=« = AB
HexString=¬ = AC
HexString=­ = AD
HexString=® = AE
HexString=Ї = AF
HexString=° = B0
HexString=± = B1
HexString=І = B2
HexString=і = B3
HexString=ґ = B4
HexString=µ = B5
HexString=¶ = B6
HexString=· = B7
HexString=ё = B8
HexString=№ = B9
HexString=є = BA
HexString=» = BB
HexString=ј = BC
HexString=Ѕ = BD
HexString=ѕ = BE
HexString=ї = BF
HexString=А = C0
HexString=Б = C1
HexString=В = C2
HexString=Г = C3
HexString=Д = C4
HexString=Е = C5
HexString=Ж = C6
HexString=З = C7
HexString=И = C8
HexString=Й = C9
HexString=К = CA
HexString=Л = CB
HexString=М = CC
HexString=Н = CD
HexString=О = CE
HexString=П = CF
HexString=Р = D0
HexString=С = D1
HexString=Т = D2
HexString=У = D3
HexString=Ф = D4
HexString=Х = D5
HexString=Ц = D6
HexString=Ч = D7
HexString=Ш = D8
HexString=Щ = D9
HexString=Ъ = DA
HexString=Ы = DB
HexString=Ь = DC
HexString=Э = DD
HexString=Ю = DE
HexString=Я = DF
HexString=а = E0
HexString=б = E1
HexString=в = E2
HexString=г = E3
HexString=д = E4
HexString=е = E5
HexString=ж = E6
HexString=з = E7
HexString=и = E8
HexString=й = E9
HexString=к = EA
HexString=л = EB
HexString=м = EC
HexString=н = ED
HexString=о = EE
HexString=п = EF
HexString=р = F0
HexString=с = F1
HexString=т = F2
HexString=у = F3
HexString=ф = F4
HexString=х = F5
HexString=ц = F6
HexString=ч = F7
HexString=ш = F8
HexString=щ = F9
HexString=ъ = FA
HexString=ы = FB
HexString=ь = FC
HexString=э = FD
HexString=ю = FE
HexString=я = FF

  Ответить  
 
 автор: Lukas   (28.08.2009 в 11:00)   личное сообщение
 
 

А смысл?

  Ответить  
 
 автор: ShadowOfSun   (28.08.2009 в 11:07)   личное сообщение
 
 

Ликбез для Кота

  Ответить  
 
 автор: kot_k_k   (28.08.2009 в 14:30)   личное сообщение
 
 

Ваще не понял .
При чем тут Нех сумирование, скрорее склейка.
И никогда нет железной гарантии, особенно если что-то делается блудливыми ручками пользователей.

п.с. Сумма от разрядности системы числения НЕЗАВИСИТ.
И ты получаешь один и тотже результат хоть НЕХ хоть Бинари хоть Десятиричный.

  Ответить  
 
 автор: osmor   (28.08.2009 в 12:16)   личное сообщение
 
 

ну вот некоторое резюме.
Самый быстрый это конечно BINARY, но при этом база вырастает 2 в раза
расчет битовой маски "на лету", очень медленно
Добавление текстового поля с битовой маской дает увеличение размера бд примерно на 10%

Учитывая что значения этих полей у меня один фиг до этого формируются из других полей посимвольной обработкой (той про которую я прошлый раз спрашивал http://hiprog.com/forum/read.php?id_forum=1&id_theme=5477&page=6), то решил использовать битовую маску
Вот примерно функция

Public Function CaseToBin(strParam As String) As Variant
Dim U() As Byte
Dim L() As Byte
Dim i As Integer
Const ZERO As String = "0"
Const ONE As String = "1"
CaseToBin = String(Len(strParam), ZERO)
Dim intStep As Integer
intStep = LenB("A")
U() = UCase(strParam)
L() = strParam
For i = 0 To UBound(U) Step intStep
    If U(i) = L(i) Then Mid$(CaseToBin, i / intStep + 1, 1) = ONE
Next
End Function

А вот время ее работы с апдейтом через рекордсет 34 тыс записей (10 проходов)

CaseToBin 1 - 4085 ms
CaseToBin 2 - 3756 ms
CaseToBin 3 - 2974 ms
CaseToBin 4 - 3415 ms
CaseToBin 5 - 3715 ms
CaseToBin 6 - 4867 ms
CaseToBin 7 - 2454 ms
CaseToBin 8 - 3625 ms
CaseToBin 9 - 5748 ms
CaseToBin 10 - 4537 ms
Сумма - 39 186 ms

  Ответить  
 
 автор: Lukas   (28.08.2009 в 12:29)   личное сообщение
 
 

Я все-таки не могу понять, почему ты отказываешься маску конвертировать в лонг?
Чуть медленнее бы формировалось значение маски, но
занимало бы значительно меньше места на диске, возможно быстрее бы работало в запросах.
Или есть что-то, о чем я не догадываюсь?
Ведь при:
?CaseToBin("Однажды в студеную зимнюю пору")
100000010100000000100000010000
Приходится хранить два размера исходной строки (оригинал и маска).

  Ответить  
 
 автор: osmor   (28.08.2009 в 12:36)   личное сообщение
 
 

ну у меня символов до 255 (встречаются и длиннее, но заказчик согласился при загрузке такие отмечать и выдавать для контроля оператору)
в среднем в существующих данных длинна строки колеблется от 1 до 138 символов, наиболее часто от 25 до 56
Как в Long загнать?

  Ответить  
 
 автор: Lukas   (28.08.2009 в 12:40)   личное сообщение
 
 

Currency, Decimal не подойдут?

Добавлено:
Отвечу сам себе: пожалуй нет.

  Ответить  
 
 автор: Lukas   (28.08.2009 в 17:20)   личное сообщение
 
 

Вот ведь мастер функцию нарисовал, даже и не разогнать.

Разве что Variant на String поменять в объявлении функции, и то всего 8% прибыли.
Даже не интересно.

  Ответить  
 
 автор: osmor   (30.08.2009 в 00:00)   личное сообщение
 
 

Ну тут я старался... боролся за скорость...
кстати... ХЗ почему я Variant написал... надо попытаться вспомнить... были же какие-то мысли, наверное

  Ответить  
 
 автор: Lukas   (30.08.2009 в 02:24)   личное сообщение
 
 

Можно выиграть еще несколько процентов, если во входных строках присутствуют не буквенные символы:

Public Function CaseToBin2(strParam As String) As String
Dim N() As Byte
Dim L() As Byte
Dim i As Integer
Const ZERO As String = "0"
Const ONE As String = "1"
CaseToBin2 = String(Len(strParam), ZERO)
Dim intStep As Integer
intStep = LenB("A")
L() = LCase(strParam)
N() = strParam
For i = 0 To UBound(L) Step intStep
    If L(i) > N(i) Then Mid$(CaseToBin2, i / intStep + 1, 1) = ONE
Next
End Function

Тогда нет необходимости лишний раз MID$-итировать:
?CaseToBin("OsMoR 123 ()")
101011111111
?CaseToBin2("OsMoR 123 ()")
101010000000

На показанном ранее в качестве образца наборе строк выигрыш составил 16%.

  Ответить  
 
 автор: osmor   (31.08.2009 в 08:42)   личное сообщение
 
 

Во.. так лучше, я как раз думал как бы выкинуть те строки которые заведомо состоят из одних цифирь

  Ответить  
 
 автор: Lukas   (31.08.2009 в 13:17)   личное сообщение
 
 

Может не только цифирьки а весь Non&LowerCase?:

Public Function CaseToBin2(strParam As String) As String
Dim N() As Byte
Dim L() As Byte
Dim i As Integer
Const ZERO As String = "0"
Const ONE As String = "1"
If StrComp(LCase(strParam), strParam, vbBinaryCompare) = 0 Then Exit Function
L() = LCase(strParam)
N() = strParam
CaseToBin2 = String(Len(strParam), ZERO)
Dim intStep As Integer
intStep = LenB("A")
For i = 0 To UBound(L) Step intStep
    If L(i) > N(i) Then Mid$(CaseToBin2, i / intStep + 1, 1) = ONE
Next
End Function

На 74% быстрее на образцах данных + экономия на диске.

  Ответить  
 
 автор: osmor   (31.08.2009 в 13:58)   личное сообщение
 
 

ага, только для меня нужно
If StrComp(LCase(strParam), strParam, vbBinaryCompare) = 0 Then CaseToBin2 = ZERO : Exit Function

  Ответить  
 
 автор: Lukas   (01.09.2009 в 15:47)   личное сообщение
 
 

Мне еще вот эти варианты не нравятся:
?CaseToBin2("atrophia areata peripapillary chorioretinal degeneration A")
00000000000000000000000000000000000 00000000000000000000001
Вроде как лидирующие 0 тут не играют рояля?
Может немножко пожертвовать скоростью с целью экономии места на диске?

  Ответить  
 
 автор: osmor   (01.09.2009 в 16:15)   личное сообщение
 
 

думаю можно... строки все же довольно длинные, а + 5-10 секунд погоды не сделают... есть операции которые до 2-х минут длятся
(но их я потом оптимизировать буду, когда "в принципе" заработает)

  Ответить  
 
 автор: Lukas   (01.09.2009 в 16:43)   личное сообщение
 
 

ОК.

  Ответить  
 
 автор: Alfar   (04.09.2009 в 14:29)   личное сообщение
 
 

Наткнулся на задачу в поисках решения своих проблем
Не все понял из разговора
Нужны именно коды? Чисто академический интерес?
Если нет, то почему не свалить все на Access? На запросы
Если нужна таблица, то тем же путем , ток данные из запроса забирать
Изв, ес не по делу вмешался - нуб я)
Удачи)

  Ответить  
 
 автор: osmor   (04.09.2009 в 14:55)   личное сообщение
 
 

задача стоит (стояла) сравнивать текстовые поля с учетом регистра. Здесь пообсуждали несколько вариантов.

  Ответить  
 
 автор: Alfar   (04.09.2009 в 15:13)   личное сообщение
 
 

Создаем запрос по табл1, в конструкторе уст сортировку, там же в свойствах запроса - уникальность значений
Результат - запрос полностью соотвтств требованиям к табл2

  Ответить  
 
 автор: osmor   (04.09.2009 в 15:17)   личное сообщение
 
 

непонял. JET при работе с текстовыми полями не различает размер букв, т.е. для него "A" и "a" одинаковы
мне же нужно что бы при сравнении это были разными значениями
т.е.
"Арбуз" <> "АРбуз" <> "арбуз" <> "арбуЗ"
т.е. если в таблице1 есть
"Арбуз"
"АРбуз"
"арбуз"
"арбуЗ"
то все они должны попасть в таблицу2

  Ответить  
 
 автор: Alfar   (04.09.2009 в 16:20)   личное сообщение
 
 

Т.е те данные, что содер в твоей табл1 в табл Access в принципе хранить невозможно? Пропадает Case зависимость?

  Ответить  
 
 автор: osmor   (04.09.2009 в 16:52)   личное сообщение
 
 

почему? где же я их сейчас храню? если нет никаких ограничений или индексов, ничего не мешает внести в таблицу одинаковые данные
сам ACCESS хранит то что ему дали, и в том виде в каком дали.
Дали "АрБуЗ", так и будет сохранять.

  Ответить  
 
 автор: Силblч   (04.09.2009 в 17:20)   личное сообщение
 
 

каждый символ в винде имеет определенное представление в таблице знакогенератора
соответственно, надо сравнивать эти таблицы %)

  Ответить  
 
 автор: osmor   (04.09.2009 в 17:31)   личное сообщение
 
 

иди на фиг! Ты сейчас что-нибудь придумаешь а мне переделывать Я уже сделал с маской, переделывать не буду!!! Идея с кодами тоже была, но не выдержала конкуренции

  Ответить  
 
 автор: Силblч   (04.09.2009 в 17:55)   личное сообщение
 
 

([рогАнь] ага

  Ответить  
 
 автор: Alfar   (04.09.2009 в 17:26)   личное сообщение
 
 

Спасибо, понял
Извините за мелочи для вас, пообщаться не с кем в своем соку варюсь

  Ответить  
 
 автор: Alfar   (07.09.2009 в 10:53)   личное сообщение
 
 

Меня зацепило просто :)
Уже чисто спортивный азарт
Не знаю на твоей базе как будет по скорости при таких количествах
Идея следующая
Создаю в табл еще текстовое поле и туда при вводе загоняется строка той же длины
На месте прописных - 1, строчных - 0
... и далее - как я излагал, запрос и т.д.
База вдвое правда вырастает :(
У меня прошло

  Ответить  
 
 автор: osmor   (07.09.2009 в 11:04)   личное сообщение
 
 


Прочитайте все обсуждение.
Этот вариант уже был предложен выше, более того к нему написана функция (даже не одна) и он уже реализован в рабочей базе
База вырастет не в 2 раза, а несколько меньше, если убирать ведущие "0", см. функции предложенные выше

  Ответить  
 
 автор: Alfar   (07.09.2009 в 11:07)   личное сообщение
 
 

:(

  Ответить  
 
 автор: Lukas   (11.09.2009 в 11:01)   личное сообщение
 
 

"Шарик, ты балбес". Это я про себя.
Все пытался маску регистров в Long преобразовать, а можно иначе "поджаться".
Преобразовывать группы разрядов маски по 4 знака к Hex-у.
В итоге, можно поджаться еще до 4 крат.
В принципе, можно и до 6 крат (если перегонять в 64-значное представление), но, наверное, более затратно.

ps. Хорошая мысля приходит опосля.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList