Имя: Пароль:
1C
1С v8
Обработка строк из цифр в запросе
0 User_Agronom
 
15.09.15
21:08
Есть две таблицы. Нужно соединить эти таблицы (например, левым соединением) по полю КодАБС

Проблема состоит в том, что значения в поле КодАБС имеют различное количество первых нулей. Кроме того, они имеют различную длину.

Вопрос: каким-нибудь образом можно обработать это в запросе?

Пример: Поле в таблице А 000123, а в таблице Б 0123.
Или в таблице А 5879, а в таблице Б 05879.
1 hhhh
 
15.09.15
21:15
сделать изначально нормальные таблицы с нормальными кодами.
2 badboychik
 
15.09.15
21:15
Удалить нули в обеих и все
3 Ildarovich
 
15.09.15
21:18
Вот статья http://catalog.mista.ru/public/170336/ . Там есть нужный вам запрос. Он первый по порядку. Запрос преобразует строку цифр в число. Отбрасывая, кстати, буквы и незначащие нули.
4 User_Agronom
 
15.09.15
21:36
(3) Куча ПОДОБНО. Это теория пример.

С ПОДОБНО я и тут могу справиться.

левое соединение ... по
ТаблА.Поле подобно ТаблБ.Поле или ТаблБ.Поле подобно ТаблА.Поле

Можно без ИЛИ через объединить все.
5 Ildarovich
 
15.09.15
22:02
(4) не понял про "кучу ПОДОБНО". В приведенном в (3) запросе никаких ПОДОБНО нет. Там делается преобразование строки в число. Вот запрос

    "ВЫБРАТЬ Дано.НомерСтроки, Дано.КодАБС КАК Строка
    |ПОМЕСТИТЬ ДаноА
    |ИЗ ТаблА КАК Дано
    |;
    |ВЫБРАТЬ 0 С,    1 КАК П
    |ПОМЕСТИТЬ Р16
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  1, 10
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  2, 100
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  3, 1000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  4, 10000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  5, 100000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  6, 1000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  7, 10000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  8, 100000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ  9, 1000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 10, 10000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 11, 100000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 12, 1000000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 13, 10000000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 14, 100000000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 15, 1000000000000000
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 16, 10000000000000000
    |;
    |ВЫБРАТЬ Дано.НомерСтроки, СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК ЧислоАБС
    |ПОМЕСТИТЬ ВТаблА
    |ИЗ ДаноА КАК Дано, Р16 КАК А, Р16 КАК Б
    |ГДЕ    Б.С < 10 И ПОДСТРОКА(Дано.Строка, 17 - А.С, 1) = ПОДСТРОКА(""0123456789"", Б.С + 1, 1)
    |СГРУППИРОВАТЬ ПО Дано.НомерСтроки
    |;
ВЫБРАТЬ Дано.НомерСтроки, Дано.КодАБС КАК Строка
    |ПОМЕСТИТЬ ДаноБ
    |ИЗ ТаблБ КАК Дано
    |;
    |ВЫБРАТЬ Дано.НомерСтроки, СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК ЧислоАБС
    |ПОМЕСТИТЬ ВТаблБ
    |ИЗ ДаноБ КАК Дано, Р16 КАК А, Р16 КАК Б
    |ГДЕ    Б.С < 10 И ПОДСТРОКА(Дано.Строка, 17 - А.С, 1) = ПОДСТРОКА(""0123456789"", Б.С + 1, 1)
    |СГРУППИРОВАТЬ ПО Дано.НомерСтроки
    |;

В итоге в ВТаблА и ВТаблБ есть поля ЧислоАБС, очищенные от ведущих нулей и букв, по которым можно делать соединение
6 Aleksandr N
 
16.09.15
00:15
(0) Обработать таблицы перед запросом?
7 ИС-2
 
naïve
16.09.15
06:52
(6) +1. Лмбо использовать 2 набора данных СКД

Посмотрите на функции запросов, например использовать символ для поиска текста %. Но как будет работать такое чудо - хз.
http://helpme1c.ru/funkcii-v-zaprosax-v-1s-8-v-primerax
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший