Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Split Разделение строки на подстроки (число прочтений - 5361 )
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Split Разделение строки на подстроки
05. Ноября 2009 :: 10:12
Печать  
Есть документ "Заявка", в котором есть реквизит "Фамилии".
В этот реквизит могут вводится как одна, так и несколько фамилий с разделителем ",".

Вопрос в следующем: как можно получить таблицу вида
+
------------
+
------------
+
|
Фамилия
|
Документ
|
+ ------------ + ------------ +
|
ИВАНОВ
|
Заявка 1
|
|
ПЕТРОВ
|
Заявка 1
|
|
СИДОРОВ
|
Заявка 1
|
|
ПУПКИН
|
Заявка 2
|
+ ------------ + ------------ +

при исходных данных:
Заявка 1 - Фамилии=ИВАНОВ,ПЕТРОВ,СИДОРОВ
Заявка 2 - Фамилии=ПУПКИН
?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #1 - 05. Ноября 2009 :: 10:22
Печать  
grayrat писал(а) 05. Ноября 2009 :: 10:12:
Есть документ "Заявка", в котором есть реквизит "Фамилии".
В этот реквизит могут вводится как одна, так и несколько фамилий с разделителем ",".

Вопрос в следующем: как можно получить таблицу вида
+
------------
+
------------
+
|
Фамилия
|
Документ
|
+ ------------ + ------------ +
|
ИВАНОВ
|
Заявка 1
|
|
ПЕТРОВ
|
Заявка 1
|
|
СИДОРОВ
|
Заявка 1
|
|
ПУПКИН
|
Заявка 2
|
+ ------------ + ------------ +

при исходных данных:
Заявка 1 - Фамилии=ИВАНОВ,ПЕТРОВ,СИДОРОВ
Заявка 2 - Фамилии=ПУПКИН
?

Какова длина поля реквизита Фамилия ?
Сколько максимум Фамилий может быть в этом поле ?
В каком  справочнике хранятся эти ФИО ?
База  dbf или sql ?
  
Наверх
 
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #2 - 05. Ноября 2009 :: 10:48
Печать  
На данный момент в базе - максимум 20, обычно - от одной до пяти. Но не хотелось бы привязываться к конкретной цифре. Длина - строка неограниченная. База - sql. В справочнике ФИО не хранятся.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #3 - 05. Ноября 2009 :: 10:58
Печать  
Ну тогда только на 1с разбирая эту строку и добавляя данные в ТЗ.

Также учтите что данные subj не соответвуют первой нормальной форме.
Как будешь различать несколько Иванов в одной заявке ?
  
Наверх
 
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #4 - 05. Ноября 2009 :: 11:04
Печать  
Это я все понимаю. Это - наследство  Улыбка
Задача в том и состоит, чтобы привести это все в нормальный вид.
На 1с - это плохо, поскольку документов около 100к.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Split Разделение строки на подстроки
Ответ #5 - 05. Ноября 2009 :: 11:15
Печать  
Ну напиши хранимую процедуру.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #6 - 05. Ноября 2009 :: 11:28
Печать  
grayrat писал(а) 05. Ноября 2009 :: 11:04:
Это я все понимаю. Это - наследство  Улыбка
Задача в том и состоит, чтобы привести это все в нормальный вид.
На 1с - это плохо, поскольку документов около 100к.

100к всего или 100к в отдельной выборке ?


Можешь хранить  в отдельной sql таблице
IDDOC кластер. индекс
IDDOC char(9)
FIO      varchar(30)
тогда простым inner join получишь subj
  
Наверх
 
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #7 - 05. Ноября 2009 :: 11:31
Печать  
Как хранить - это отдельный вопрос. Сейчас вопрос - как разобрать.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #8 - 05. Ноября 2009 :: 11:34
Печать  
grayrat писал(а) 05. Ноября 2009 :: 11:31:
Как хранить - это отдельный вопрос. Сейчас вопрос - как разобрать.

В чем вопрос как найти символ ','  на t- sql ?
смотри   charindex
  
Наверх
 
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #9 - 05. Ноября 2009 :: 14:19
Печать  
В общем, как-то вот так:

Код
Выбрать все
SELECT
    substring(',' + Cast($d.Фамилии AS varchar(2000)) +
    ',', n.Position + 1, charindex(',', ',' +
    Cast($d.Фамилии AS varchar(2000)) +
    ',', n.Position + 1) - n.Position - 1) Фамилия,
    d.IDDOC [Документ $Документ.Заявка]
FROM
(
  Select top 2002
    Count(j2.IDDOC) Position
  From
    _1sJourn j1 (nolock)
  Inner Join
    _1sJourn j2 (nolock) ON j1.IDDOC>=j2.IDDOC
  Group by j1.IDDOC
  Order by j1.IDDOC
) n
INNER JOIN
  $Документ.Заявка d (nolock)
ON
    n.Position <= len(',' + Cast($d.Фамилии AS varchar(2000)) + ',') - 1
  AND
    substring(',' + Cast($d.Фамилии AS varchar(2000)) + ',', n.Position, 1) = ','
ORDER by d.IDDOC, Фамилия
 



Работает до размера текста в 2000 символов. Немного, конечно, долговато.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Split Разделение строки на подстроки
Ответ #10 - 07. Ноября 2009 :: 15:59
Печать  
Select top 2002
это на чем основано  ?
  
Наверх
 
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #11 - 10. Ноября 2009 :: 07:55
Печать  
Длина строки + 2 - начальный и конечный разделитель. Т.е. если применять для строки длиной 100, то должно быть top 102.

Еще надо помнить, что в журнале должно быть достаточное количество записей - не меньше числа символов в строке + 2, хотя эту часть можно построить на любой таблице с нужным количеством записей.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Split Разделение строки на подстроки
Ответ #12 - 10. Ноября 2009 :: 09:13
Печать  
Так
Цитата:
(
 Select top 2002
   Count(j2.IDDOC) Position
 From
   _1sJourn j1 (nolock)
 Inner Join
   _1sJourn j2 (nolock) ON j1.IDDOC>=j2.IDDOC
 Group by j1.IDDOC
 Order by j1.IDDOC
) n

чтобы получить таблицу с числами 0,1,2 ....2002
Улыбка
  
Наверх
 
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Split Разделение строки на подстроки
Ответ #13 - 12. Ноября 2009 :: 08:29
Печать  
Ага. Только 1,2,3...2002.
Сразу скажу - писал не сам- взял пару примеров с sql.ru, соединил и подправил под себя. Главное - задача решилась одним запросом Улыбка
  
Наверх
 
IP записан
 
Юрий-inet
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 17. Ноября 2011
Re: Split Разделение строки на подстроки
Ответ #14 - 17. Ноября 2011 :: 09:05
Печать  
Тема конечная очень старая, но сегодня искал как можно работать со строкой с разделителями в 1С 7. Нашел ссылку foolsoft.ru/?p=50. Там предложено вполне хорошее решение. Может кому надо  Подмигивание
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать