Переключение на Главную Страницу Страницы: 1 [2] 3 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Индексы при вставке записей (число прочтений - 12310 )
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #15 - 20. Апреля 2009 :: 08:37
Печать  
основной кусок кода вот:
//  Удаляем старое содержимое      
     MW  = СоздатьОбъект("MetaDataWork");
    ТабDst = MW.GetRefTableName(Справочник);
     ТекстЗапроса = "DELETE FROM " + ТабDst;
     SQLComm.ExecuteStatement (ТекстЗапроса);                              

//  Поля источника      
     СписокПолей = "Id,Code,Descr,IsFolder,IsMark,ParentId,VerStamp,";
     СписокПолейSrc = СписокПолей;
     КолПовт = СписокПолейОбяз.РазмерСписка();
     Для Поз = 1 По КолПовт Цикл
           Идентификатор  = СписокПолейОбяз.ПолучитьЗначение(Поз);
           СписокПолейSrc = СписокПолейSrc + "SP" + MW.GetRefFieldId("Номенклатура",Идентификатор) + ",";
     КонецЦикла;      
     СписокПолейSrc = СписокПолейSrc + "Id";
     СписокПолейSrc = СтрЗаменить(СписокПолейSrc, "ParentId", """     0   """);
     
//  Поля приемника      
     СписокПолейDst = СписокПолей;
     Для Поз = 1 По КолПовт Цикл   
           Идентификатор  = СписокПолейОбяз.ПолучитьЗначение(Поз);
           СписокПолейDst = СписокПолейDst + "SP" + MW.GetRefFieldId(Справочник, Идентификатор) + ",";
     КонецЦикла;                     
     СписокПолейDst = СписокПолейDst + "SP" + MW.GetRefFieldId(Справочник, "Номенклатура") + ",";
     СписокПолейDst = СписокПолейDst + "SP" + MW.GetRefFieldId(Справочник, "Остаток") + ",";
     СписокПолейDst = СписокПолейDst + "SP" + MW.GetRefFieldId(Справочник, "ОстатокПоФирме") + ",";
     СписокПолейDst = СписокПолейDst + "SP" + MW.GetRefFieldId(Справочник, "Цена");

     ТекстЗапросаОстаткиФирма = ТекстЗапросаПоОстаткам(1);
     
//      Запрос на вставку выборки в приемник                           
     ТекстЗапроса = "INSERT INTO " + ТабDst + "
                          |(" +  СписокПолейDst + ")
                    |SELECT " + СписокПолейSrc + ",0.00, 0.00, 0.00
                          |FROM $Справочник.Номенклатура Ном
                          |WHERE 1 = 1";
                          
     Если ТолькоСОстатками = 1 Тогда                           
           ТекстЗапроса = ТекстЗапроса;
           ТекстЗапроса = ТекстЗапроса + " AND                  
           |  (Ном.Id IN (SELECT SOst.Id FROM (" + ТекстЗапросаОстаткиФирма + ")SOst))";
     Иначе
           Если ПустоеЗначение(ВыбТМЦ) = 0 Тогда
                 ТекстЗапроса = ТекстЗапроса + " AND
               |(Ном.ParentId = :ВыбТМЦ)";
           КонецЕсли;      
     КонецЕсли;          

//      Сообщить(ТекстЗапроса);
     SQLComm.SetTextParam ("ДатаИтогов", ДатаИтогов);
     SQLComm.ExecuteStatement (ТекстЗапроса);                              
     
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #16 - 20. Апреля 2009 :: 08:38
Печать  
Потом еще остатки вставляются с помошью UPDATE, могут и цены, но это неважно и без них косяк
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #17 - 20. Апреля 2009 :: 08:43
Печать  
А то, что драйвер добавляет в индексный файл свой  тэг по IDELETED , это может быть принципиальным? Ведь формально посде этого структура индексов не соответсвует словарю 1СV7.MD
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Индексы при вставке записей
Ответ #18 - 20. Апреля 2009 :: 08:50
Печать  
AAA_CHEL писал(а) 20. Апреля 2009 :: 08:43:
А то, что драйвер добавляет в индексный файл свой  тэг по IDELETED , это может быть принципиальным? Ведь формально посде этого структура индексов не соответсвует словарю 1СV7.MD


Нет. Это стандартно для 1С и нужно для фильтрованных индексов (как 1С)
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Индексы при вставке записей
Ответ #19 - 20. Апреля 2009 :: 08:59
Печать  
По поводу запросов - попробуй везде использовать псевдонимы
типа

DELETE тОстатки FROM "+ТабDst+" as тОстатки

и тоже с UPDATE
http://www.1cpp.ru/forum/YaBB.pl?num=1223527883/11#11

P.S. Если запросы в модуле, то в строке подключения должно быть
TABLEVALIDATE =0;
отключает блокировку заголовку таблиц штатным способом ()
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Индексы при вставке записей
Ответ #20 - 20. Апреля 2009 :: 09:15
Печать  
Текс запроса по остаткам - не понятно - возможен ли случай что ParentId
есть, а саму группу не внесли.

Т.е. наблюдается ли ошибка если
ТолькоСОстатками <>1
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #21 - 20. Апреля 2009 :: 09:27
Печать  
я же ParentId обнуляю пустым значением:
     СписокПолейSrc = СтрЗаменить(СписокПолейSrc, "ParentId", """     0   """);
с ним все нормально, я смотрел в базе. Еще непонятно, почему до и после переиндексации разный порядок следования индексных тэгов. После ререиндексации - как в словаре, а сразу после вставки записей в справочник - отличается. Хотя тэги именованные, но вдруг тут загадка
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #22 - 20. Апреля 2009 :: 09:37
Печать  
Все, больше суток с этим сижу, голова кругом. Сейчас тот же порядок следования тэгов, только все равно не работает )))
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Индексы при вставке записей
Ответ #23 - 20. Апреля 2009 :: 10:00
Печать  
Да , задачка ....
Есть еще одна идея - поиграться
SQLComm.ExecuteStatement("Exec('SET DELETED OFF')")
или
SQLComm.ExecuteStatement("Exec('SET DELETED ON')")
после инициализации SQLComm.
Вдруг фоксу нужно и индекс IDELETED обновлять при вставке...

Цитата:
Параметры
ON
Определяет, что команды не обрабатывают записи, помеченные на удаление, включая записи в связанных (дочерних) таблицах; задаваемые диапазоны записей (Scope Records) также не включают эти записи в свои списки.

OFF
(По-умолчанию) Определяет, что записи, помеченные на удаление обрабатываются как обычные записи, включая записи в связанных (дочерних) таблицах; диапазоны записей также включают их в списки, как и обычные записи.
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #24 - 20. Апреля 2009 :: 10:10
Печать  
[quote author=kiruha link=1240102224/15#23 date=1240221650]Да , задачка ....
Есть еще одна идея - поиграться
SQLComm.ExecuteStatement("Exec('SET DELETED OFF')")
или
SQLComm.ExecuteStatement("Exec('SET DELETED ON')")
после инициализации SQLComm.
Вдруг фоксу нужно и индекс IDELETED обновлять при вставке...

Не дает эффекта, список крутится и вдруг как будто его конец, сразу перескакивает в хвост
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #25 - 20. Апреля 2009 :: 11:05
Печать  
Еще информация, пока малопонятная для использования, но сужающая круг поиска.
- Родной CDX файла справочника при первой вставке - 87040. Форма списка глючит
- Делаю в фоксе VFP 9.0  REINDEX таблицы. CDX - 73216. Форма списка глючит.
- Делаю переиндексацию в 1С.  CDX - 73216. Форма списка работает нормально.
- Ещке раз делаю в фоксе REINDEX таблицы. CDX - 73216. Форма списка опять глючит.
Вот такие пироги. То есть дело явно в OLEDB, точнее даже в фоксе Улыбка но что не так, щас фактически надо понять и довести таблицу до ума  в самом фоксе. Индексы получаются разные в 1С и фоксе
  
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #26 - 20. Апреля 2009 :: 11:09
Печать  
По моему это как-то связано с 1с-овскими индексами по UPPER и для русских букв получается видимо фигня, как-то по разному индексируют
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Индексы при вставке записей
Ответ #27 - 20. Апреля 2009 :: 11:13
Печать  
Провел тест.
В конфигураторе копируем справочник номенклатуры, вставляем -
получается спр Номенклатура1

Запускаем тест : очистка Номенклатура1 и заполнение из спр Номенклатура.

Никаких глюков не нашел
  

_______________________1.ert ( 32 KB | Загрузки )
Наверх
 
IP записан
 
AAA_CHEL
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 46
Зарегистрирован: 19. Апреля 2009
Re: Индексы при вставке записей
Ответ #28 - 20. Апреля 2009 :: 11:36
Печать  
kiruha писал(а) 20. Апреля 2009 :: 11:13:
Провел тест.
В конфигураторе копируем справочник номенклатуры, вставляем -
получается спр Номенклатура1

Запускаем тест : очистка Номенклатура1 и заполнение из спр Номенклатура.

Никаких глюков не нашел


Может ты их просто не видишь, или дело в моем исходном справочнике, у меня в этой группе порядка 800 позиций, и глючит не во всех группах, всего групп 60. На ней просто наткнулись. Я индексирую в фоксе INDEX ON UPPER(DESCR) TAG DESCR и форма списка справочника ломается. Индексирую опять в 1с, все работает. Кодовая страница файла не задана. Это чем можно объяснить, забыв всю тему. Это уже точно факт
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Индексы при вставке записей
Ответ #29 - 20. Апреля 2009 :: 11:39
Печать  
AAA_CHEL писал(а) 20. Апреля 2009 :: 11:36:
kiruha писал(а) 20. Апреля 2009 :: 11:13:
Провел тест.
В конфигураторе копируем справочник номенклатуры, вставляем -
получается спр Номенклатура1

Запускаем тест : очистка Номенклатура1 и заполнение из спр Номенклатура.

Никаких глюков не нашел


Может ты их просто не видишь, или дело в моем исходном справочнике, у меня в этой группе порядка 800 позиций, и глючит не во всех группах, всего групп 60. На ней просто наткнулись. Я индексирую в фоксе INDEX ON UPPER(DESCR) TAG DESCR и форма списка справочника ломается. Индексирую опять в 1с, все работает. Кодовая страница файла не задана. Это чем можно объяснить, забыв всю тему. Это уже точно факт


Там тест я выложил универсальный .
Проверь на своей тестовой базе - пройдет или нет.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 
ОтправитьПечать