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



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
работа с строками
08. Октября 2008 :: 12:54
Печать  
Ребят незнаю как решить одну проблемку со строками!

Смотрите есть список значений в котором сидят наименования номенклатуры у которой "отрезан" цвет.

Тоисть:

Справочник номенклатуры имееть структуру Наименование и артикул!

Так вот к приммеру

Наименование                                       Артикул
S-60 Стелаж торгівельний (білий)          1005-101-01
S-60 Стелаж торгівельний (синий)          1005-101-02

тоисть они одинаковые только по цвету разные! Вот список значений содержит наименование:

S-60 Стелаж торгівельний
тоисть обрубан цвет!

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

Наименование                                       Артикул
S-60 Стелаж торгівельний (білий)          1005-101-01
S-60 Стелаж торгівельний (синий)          1005-101-02


Проблема состоит в том, что я не знаю как работать с обрезкой строк в СКЛ я хочу вот так сравнить:

WHERE [СпрНом.Наименование] IN [@СЗ]

ГДЕ - СпрНом.Наименование должно отрезать цвета

И еще цвета всегда в конце строки наименования номенклатуры!!!
  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: работа с строками
Ответ #1 - 08. Октября 2008 :: 13:15
Печать  
WHERE LEFT([СпрНом.Наименование], CHARINDEX('(', [СпрНом.Наименование])-1) IN [@СЗ]
  
Наверх
ICQ  
IP записан
 
logarifm
Junior Member
**
Отсутствует



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
Re: работа с строками
Ответ #2 - 08. Октября 2008 :: 13:27
Печать  
DmitrO писал(а) 08. Октября 2008 :: 13:15:
WHERE LEFT([СпрНом.Наименование], CHARINDEX('(', [СпрНом.Наименование])-1) IN [@СЗ]


все круто но я плохой приммер позиций взял!!!

вот бывает такое:

S-80с Стелаж торгівельний з скляними дверима (2замки) (білий)
S-80с Стелаж торгівельний з скляними дверима (2замки) (синий)

а в списке будет

S-80с Стелаж торгівельний з скляними дверима (2замки)


Список строиться при получении даных с внешнего файла ексель и проходит ьакой алгоритм:

в цикле..

     Наименование = СокрЛП(СпрНоменклатура.Наименование);
           
           //Из наименования исключаем цвета
           Если Прав(Наименование,1) = ")" Тогда
                 
                 Ошибка = 0;
                 Дужка  = "";
                 
                 ДлинаСтроки = СтрДлина(Наименование);
                 
                 Пока (Дужка <> "(") и (Ошибка = 0)  Цикл
                       
                       Дужка = Сред(Наименование,ДлинаСтроки,1);
                       
                       ДлинаСтроки = ДлинаСтроки - 1;
                       Если ДлинаСтроки = 0 Тогда
                             Ошибка = 1;
                       КонецЕсли;
                       
                 КонецЦикла;
                 
                 Если Ошибка = 1 Тогда
                       Сообщить("Не могу отрезать цвет краски, возможно его здесь нету: " + Наименование + " номер строки: " + ТекСтрока,"!");
                 Иначе
                       РазницаСимволов = (СтрДлина(Наименование)-ДлинаСтроки);
                       Наименование    = СокрЛП(Лев(Наименование,СтрДлина(Наименование)-РазницаСимволов));
                 КонецЕсли;
                 
           КонецЕсли;
  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: работа с строками
Ответ #3 - 08. Октября 2008 :: 14:09
Печать  
список кладешь во временную таблицу и в запросе

from Справочник... as Спр
inner join #tmp1 on Спр.descr like #tmp1.name+'%'
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: работа с строками
Ответ #4 - 09. Октября 2008 :: 07:00
Печать  
1.А нельзя цвета  определять по артиклу те отбрасывать в артикле -01,-02 ?
2. Если можно менять конфигурацию тое лучше выносить  цвет либо в отдельный атрибут.
  
Наверх
 
IP записан
 
logarifm
Junior Member
**
Отсутствует



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
Re: работа с строками
Ответ #5 - 09. Октября 2008 :: 07:38
Печать  
Z1 писал(а) 09. Октября 2008 :: 07:00:
1.А нельзя цвета  определять по артиклу те отбрасывать в артикле -01,-02 ?
2. Если можно менять конфигурацию тое лучше выносить  цвет либо в отдельный атрибут.


Согласен. Конфу просто тут делали через пень колоду, а вот уже не получиться переделыввать номенклатурного состава более 100 000
  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
logarifm
Junior Member
**
Отсутствует



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
Re: работа с строками
Ответ #6 - 09. Октября 2008 :: 08:35
Печать  
trad писал(а) 08. Октября 2008 :: 14:09:
список кладешь во временную таблицу и в запросе

from Справочник... as Спр
inner join #tmp1 on Спр.descr like #tmp1.name+'%'


сразу взял реализацию. СПС. сделал! Всем спасибо!
  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
logarifm
Junior Member
**
Отсутствует



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
Re: работа с строками
Ответ #7 - 09. Октября 2008 :: 10:28
Печать  
Натолкнулся на очередную проблему!!!

Когда я набивал значения в темповую таблицу в наименовании мать его апострофф тоисть '  в итоге ошибка!!!

Я могу конечно сделать

СтрЗаменить()

тогда как решить сравнени с базой и темповой таблицой

|JOIN
     |      [ВремОбъекты.#TableTMP] AS Временка
     |ON
     |      [СпрНом.Наименование] like '%'+(RTRIM(Временка.descr))+'%'

  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
logarifm
Junior Member
**
Отсутствует



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
Re: работа с строками
Ответ #8 - 09. Октября 2008 :: 10:35
Печать  
Привожу полный код:

//*******************************************
Процедура Сформировать()
   
     Если глПараметрыToySQL() = 0 Тогда
           Сообщить("Ошибка загрузки/выгрузки библиотеки ToySQL","!!!");
           Возврат;
     КонецЕсли;
     
     ВременнаяТаблица = Query.СоздатьВрем();
     
     Если ВременнаяТаблица.СоздатьТаблицу("#TableTMP","
     |DESCR:Строка(155);
     |Вес:    Число(12,3);
     |Высота: Число(7,2);
     |Ширина: Число(7,2);
     |Длина:  Число(7,2)
     |"
     ) = 0
     Тогда
           Сообщить("Не удалось создать структуру времменой таблицы","!!");
           Возврат;
     КонецЕсли;
     
     
     Попытка
           Ексель = СоздатьОбъект("Excel.Application");
     Исключение
           Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.","!");
           Возврат;
     КонецПопытки;
     сФайл = "";
     сКатал = "";
     Если ФС.ВыбратьФайл(0,сФайл,сКатал,"Выберите файл импорта","Таблицы Excel (*.xls)|*.xls") = 1 Тогда
           ИмяФайла = сКатал+сФайл;
     КонецЕсли;
     Если ПустаяСтрока(ИмяФайла)=1 Тогда
           Возврат;
     КонецЕсли; 
     Ексель.Workbooks.Open(Сокрлп(ИмяФайла));
     Ексель.Visible=1;
     
     Книга = Ексель.ActiveWorkbook;
     Строк = Ексель.Cells.CurrentRegion.Rows.Count;
     Нач   = 2;
     Кон   = строк;
     ВвестиЧисло(Нач,"Початкова стрічка",12,0,);
     ВвестиЧисло(Кон,"Кінцева стрічка",12,0);
     
     Если Нач>Кон Тогда
         Возврат;
     КонецЕсли;
     
     НомерКолонкиАртикул      = 8;
     НомерКолонкиВес          = 3;
     НомерКолонкиВысота       = 5;
     НомерКолонкиШирина       = 6;
     НомерКолонкиДлина        = 7;
     
     Если ВвестиЧисло(НомерКолонкиАртикул,"Номер колонки Артикул",1,0) = 0 Тогда
           Возврат;
     КонецЕсли;
     
     Если ВвестиЧисло(НомерКолонкиВес,"Номер колонки Вес",1,0) = 0 Тогда
           Возврат;
     КонецЕсли;
     
     Если ВвестиЧисло(НомерКолонкиВысота,"Номер колонки Высота",1,0) = 0 Тогда
           Возврат;
     КонецЕсли;
     
     Если ВвестиЧисло(НомерКолонкиШирина,"Номер колонки Ширина",1,0) = 0 Тогда
           Возврат;
     КонецЕсли;
     
     Если ВвестиЧисло(НомерКолонкиДлина,"Номер колонки Длина",1,0) = 0 Тогда
           Возврат;
     КонецЕсли;
     
     таб = СоздатьОбъект("ТаблицаЗначений");
     
     таб.НоваяКолонка("Наименование");
     таб.НоваяКолонка("Вес");
     таб.НоваяКолонка("Высота");
     таб.НоваяКолонка("Ширина");
     таб.НоваяКолонка("Длина");
     
     СпрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");
     
     Для ТекСтрока = Нач По Кон Цикл
           
           
           Артикул= СокрЛП(Строка(Ексель.Cells(ТекСтрока,НомерКолонкиАртикул).Value));
           Вес    = Число(Ексель.Cells(ТекСтрока,НомерКолонкиВес).Value);
           Высота = Число(Ексель.Cells(ТекСтрока,НомерКолонкиВысота).Value);
           Ширина = Число(Ексель.Cells(ТекСтрока,НомерКолонкиШирина).Value);
           Длина  = Число(Ексель.Cells(ТекСтрока,НомерКолонкиДлина).Value);
           
           
           Если ПустоеЗначение(Артикул) = 1  Тогда
                 Продолжить;
           КонецЕсли;
           
           Если СпрНоменклатура.НайтиПоРеквизиту("Артикул",Артикул,1) = 0 Тогда
                 Сообщить("Позиция с артикулом: " + Артикул + " в учетной системе отсутсвует","!!");
                 Продолжить;
           КонецЕсли;
           
           Наименование = СокрЛП(СпрНоменклатура.Наименование);
           
           Если ПустоеЗначение(Наименование) = 1 Тогда
                 Продолжить;
           КонецЕсли;
           
           //Из наименования исключаем цвета
           Если Прав(Наименование,1) = ")" Тогда
                 
                 Ошибка = 0;
                 Дужка  = "";
                 
                 ДлинаСтроки = СтрДлина(Наименование);
                 
                 Пока (Дужка <> "(") и (Ошибка = 0)  Цикл
                       
                       Дужка = Сред(Наименование,ДлинаСтроки,1);
                       
                       ДлинаСтроки = ДлинаСтроки - 1;
                       Если ДлинаСтроки = 0 Тогда
                             Ошибка = 1;
                       КонецЕсли;
                       
                 КонецЦикла;
                 
                 Если Ошибка = 1 Тогда
                       Сообщить("Не могу отрезать цвет краски, возможно его здесь нету: " + Наименование + " номер строки: " + ТекСтрока,"!");
                 Иначе
                       РазницаСимволов = (СтрДлина(Наименование)-ДлинаСтроки);
                       Наименование    = СокрЛП(Лев(Наименование,СтрДлина(Наименование)-РазницаСимволов));
                 КонецЕсли;
                 
           КонецЕсли;
           
           Сообщить("номСтр: " + ТекСтрока + "  нименование: " + Наименование + "  артикул: " + Артикул);
           
           таб.НоваяСтрока();
           таб.Наименование = Наименование;
           таб.Вес          = Вес;
           таб.Высота       = Высота;
           таб.Ширина       = Ширина;
           таб.Длина        = Длина;
           
           QStr = "
           |INSERT  [ВремОбъекты.#TableTMP]
           |
           |VALUES('"+Наименование+"',
           |       '"+Вес+"',
           |            '"+Высота+"',
           |            '"+Ширина+"',
           |            '"+Длина+"'
           |            )
           |";
           
           Если Query.МетаЗапрос(QStr) = 0 Тогда
                 Сообщить(Query.Ошибка);
                 Сообщить(Query.Разбор(QStr));
                 СтатусВозврата(0);
                 Возврат;
           КонецЕсли;
           
     КонецЦикла;
     
     //таб.Свернуть("Наименование","Количество");
     таб.ВыбратьСтроку(0,"");
     
     СЗ = СоздатьОбъект("СписокЗначений");
     таб.выгрузить(сз,,,"Наименование");
     
     
     
     QStr = "
     | SELECT
     |        [СпрНом.Артикул   ]
     |,  [СпрНом.Ссылка    ] Номенклатура
     |,  [СпрЕдиницы.Ссылка] ЭлементСпрЕд
     |,  [Временка.Вес   ]
     |,      [Временка.Высота]
     |,      [Временка.Ширина]
     |,      [Временка.Длина ]
     |
     |FROM   
     |      [Справочник.Номенклатура] СпрНом WITH (NOLOCK)
     |
     |JOIN
     |      [ВремОбъекты.#TableTMP] AS Временка
     |ON
     |      [СпрНом.Наименование] like '%'+(RTRIM(Временка.descr))+'%'
     |
     |JOIN
     |      [Справочник.Единицы] СпрЕдиницы WITH (NOLOCK)
     |ON
     |   [СпрНом.Ссылка] = [СпрЕдиницы.Владелец] AND [СпрЕдиницы.Единица] = [СпрНом.БазоваяЕдиницаИзмерения]
     |";
     
     Если Query.МетаЗапрос(QStr) = 0 Тогда
           Сообщить(Query.Ошибка);
           Сообщить(Query.Разбор(QStr));
           Возврат;
     КонецЕсли;
     
     ТаблицаСправочника = СоздатьОбъект("ТаблицаЗначений");
     Query.Выгрузить(ТаблицаСправочника);
     Query.Закрыть();

КонецПроцед
  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: работа с строками
Ответ #9 - 09. Октября 2008 :: 11:26
Печать  
...
VALUES('"+СтрЗаменить(Наименование,"'","''")+"',
...
больше ничего не надо

Цитата:
тогда как решить сравнени с базой и темповой таблицой
все будет нормально
  

1&&2&&3
Наверх
 
IP записан
 
logarifm
Junior Member
**
Отсутствует



Сообщений: 92
Местоположение: Украина
Зарегистрирован: 29. Марта 2007
Пол: Мужской
Re: работа с строками
Ответ #10 - 09. Октября 2008 :: 14:23
Печать  
спс Улыбка
  

я переписал бы мир, но Бог не дает мне исходники...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать