Имя: Пароль:
1C
1C 7.7
v7: Помогите с запросом VFPOLEDB на DBF базе
0 smitti911
 
11.08.14
12:17
Есть код :
    
Соединение="
    |Provider=VFPOLEDB.1;
    |Null = Yes;
    |Exclusive = No;
    |SourceType = DBF;
    |Data Source=" + КаталогИБ() + ";
    |Mode=ReadWrite;
    |Extended Properties="""";
    |User ID="""";
    |Password="""";
    |Mask Password=False;
    |Collating Sequence=MACHINE;
    |DSN=""""";

//-- Попытка открыть базу данных через OLEDB

  Попытка
      OLEDB=СоздатьОбъект("OLEDBData");
      Рез=OLEDB.Соединение(Соединение);
      cmdOLEDB=OLEDB.СоздатьКоманду();
      Сообщить("Коннект");
  Исключение
    Предупреждение("Неудачная попытка открыть базу данных");
  КонецПопытки;
    
cmdOLEDB = OLEDB.СоздатьКоманду();

ТекстЗапроса = "
|Select
|    Док.IDDoc,
|    _1SJourn.IDDOCDEF,
|    _1SJourn.DOCNO,
|    _1SJourn.Date_Time_IDDoc
|FROM
|   $ДокументСтроки." + ВидДок.Идентификатор + " as Док
|INNER JOIN
|   _1SJourn ON _1SJourn.IDDoc = Док.IDDoc
|WHERE
|_1SJourn.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
|";
            
            
    cmdOLEDB.УстановитьТекстовыйПараметр("НачДата", НачДата);
    cmdOLEDB.УстановитьТекстовыйПараметр("КонДата", КонДата);

        Попытка
        тз = cmdOLEDB.ВыполнитьИнструкцию(ТекстЗапроса);
        Исключение
            Сообщить("Запрос не выполнился!", "!");
        КонецПопытки;


При выполнении сообщает коннект и 1С падает.


Тоже самое при использовании 1СQA. Если в консольке набрать select * from 1sjourn , идет выполнения запроса (секунды 3) и падает 1С с сообщением RunTime Error.
Что может быть не так?
1 big
 
11.08.14
12:22
Date_Time_IDDoc   кажись нету такого поля в ДБФ. Есть отдельно Date и Time
2 smitti911
 
11.08.14
12:24
Есть там такое поле http://www.script-coding.com/v77tables.html#1.2.4.
Но суть не в том , можна написать селект * и все равно вылет
3 big
 
11.08.14
12:24
(1) + и имя таблицы 1sjourn. Т.е. - без нижнего подчеркивания впереди. У тебя запрос для SQL на самом деле
4 big
 
11.08.14
12:26
(2)
по ссылке.

Это всё применительно к SQL.
5 smitti911
 
11.08.14
12:26
В консольке 1sqa выбираю драйвер фокс
FAILED! ICommandText::Execute(): File '_1sjourn.dbf' does not exist.

А если писать 1sjourn.dbf запрос начинает выполнятся и 1С падает
6 smitti911
 
11.08.14
12:28
select * from $Справочник.ТМЦ  - вылет
7 smitti911
 
11.08.14
12:29
Драйвер отсюда http://uzhast.fatal.ru/vfpoledb/
8 big
 
11.08.14
12:33
(5) тебе же пишет, что файла с таким именем нету )))

в папке с базой у тебя нет такого файла! :)  У тебя есть файл 1sjourn.dbf.  Присмотрись ))
9 smitti911
 
11.08.14
12:36
(8) Правильно ,я пишу 1sjourn без _
1с++ версии 3.2.3.19
10 big
 
11.08.14
12:37
Пример по удалению документов.  ЗАменить delete на select и будет просто отбор делать


    Соединение = "Provider=VFPOLEDB.1;
//                    |Deleted=Yes;
                |Data Source=" + ПутьБД + ";
                |Mode=ReadWrite;
                |Extended Properties="";
                |Exclusive = No;
                |User ID="";
                |Password="";
                |Mask Password=False;
                |Collating Sequence=RUSSIAN;
                |DSN=""";
    
    Для а=1 По Метаданные.Документ() Цикл
        
        ДокИД        = Метаданные.Документ(а).Идентификатор;

        ДокШапка    = мд.ИмяТаблицыШапки(ДокИД);
        ДокТабчасть = мд.ИмяТаблицыТабличнойЧасти(ДокИД);
        
        ПутьШапка    = ПутьБД + ДокШапка        +".dbf";
        ПутьТЧ        = ПутьБД + ДокТабчасть    +".dbf";
    
        Если ФС.СуществуетФайл(ПутьШапка) <> 0 Тогда
            DB        = СоздатьОбъект("OLEDBData");
            Рез        = DB.Соединение(Соединение);
            Запрос    = DB.СоздатьКоманду();
            Запрос.Отладка(флОтладка);
            Запрос.УстановитьТекстовыйПараметр("НачДата",НачДата);
            Запрос.УстановитьТекстовыйПараметр("КонДата",КонДата);
            ТЗ_Шапка = "
            |    delete
            |    from " + ДокШапка + "
            |    where
            |      " + ДокШапка+".iddoc in (
            |    select
            |      jr.iddoc as iddoc
            |    from
            |      1sjourn as jr
            |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~))
            |";
            Состояние("Удаляются документы: "+ДокИД+". Шапка");
            
            Попытка
                ТЗ = Запрос.ВыполнитьИнструкцию(ТЗ_Шапка);
            Исключение
                Сообщить("== Удаление шапки "+ДокИД+". Запрос не выполнен");
            КонецПопытки;
        КонецЕсли;
    
        Если ФС.СуществуетФайл(ПутьТЧ) <> 0 Тогда
            DB        = СоздатьОбъект("OLEDBData");
            Рез        = DB.Соединение(Соединение);
            Запрос    = DB.СоздатьКоманду();
            Запрос.Отладка(флОтладка);
            Запрос.УстановитьТекстовыйПараметр("НачДата",НачДата);
            Запрос.УстановитьТекстовыйПараметр("КонДата",КонДата);
            ТЗ_Табчасть = "
            |    delete
            |    from " + ДокТабчасть + "
            |    where
            |      " + ДокТабчасть+".iddoc in (
            |    select
            |      jr.iddoc as iddoc
            |    from
            |      1sjourn as jr
            |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~))
            |";
            Состояние("Удаляются документы: "+ДокИД+". Табличная часть");
            Попытка
                ТЗ = Запрос.ВыполнитьИнструкцию(ТЗ_Табчасть);
            Исключение
                Сообщить("== Удаление ТЧ: "+ДокИД+". Запрос не выполнен");
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
11 smitti911
 
11.08.14
12:38
Сейчас попробую....
12 smitti911
 
11.08.14
12:47
(10) Ваш запрос работает нормально, почему же в консольке не отрабатыват select * from $Справочник.ТМЦ ?
13 smitti911
 
11.08.14
12:49
А вот select * from DH6431 работает нормально...
14 smitti911
 
11.08.14
12:53
select * from 1SCONST за 6 сек  340000 строк

закрыл открыл 1с , тот же запрос призводит к вылету....
то еть работает через раз...
15 Ёпрст
 
11.08.14
13:08
1. поставить православный vfp
http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en

2.убрать провайдер от ужаста, если нужны запросы в монопольке, использовать это:
http://infostart.ru/public/16268/

3. строка подключения должна быть такой :

    ОлеДБ = СоздатьОбъект("OLEDBData");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
    Рез = ОлеДБ.Соединение(Соединение);
    Запрос = ОлеДБ.СоздатьКоманду();
    Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");  
    Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
    Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");    
    Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
4. чтобы запрос быстро отрабатывал, читаем тут
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705/30#31
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705
16 Ёпрст
 
11.08.14
13:08
5. наслаждайся
17 smitti911
 
11.08.14
13:10
(16) Попробуем, спасибо.
18 smitti911
 
11.08.14
13:53
Проблема осталась, 1 раз работает нормально, потом вылет, реиндексация, опять работает или опять вылет...Ничего не понятно......
19 Ёпрст
 
11.08.14
13:55
переустановка vfp и ребут компа
20 Ёпрст
 
11.08.14
13:56
ну и не видно, как и че ты запущаешь и какие запросы выполняешь, какой зоопарк из вк стоит ит .д
21 smitti911
 
11.08.14
13:58
Зоопарк :

    ЗагрузитьВК("1CPP.dll");
    Настройки=СоздатьОбъект("УправлениеНастройками");
    Настройки.Сбросить("Проверка типов");
    Настройки.Сбросить("Отладка");  
    Настройки.Включить("Оптимизация");  
    Настройки.Включить("TurboBL");  
    Настройки.Включить("ПерехватитьСобытияГК");    


    ЗагрузитьВК("1sqlite.dll");
    ЗагрузитьВК("FormEx.dll");
    ЗагрузитьВК("TurboMD.dll");
    ЗагрузитьВК("SpreadSheet.dll");
    ЗагрузитьВК("MiracleV8.dll");
    ЗагрузитьВК("RWidjets.dll");
    ЗагрузитьВК("ROM-Mail.dll");
    ЗагрузитьВК("DialMail.dll");
    ЗагрузитьВК("OpenXML.dll");
    ЗагрузитьВК("Tracer1C.dll");
//    ЗагрузитьВК("dynwrapx.dll");

Запрос select * from 1SCONST работает через раз
22 Ёпрст
 
11.08.14
14:03
ну а так че ?

    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();    
           запрос.ВыполнитьЗапрос("select * from [Журнал]").ВыбратьСтроку();
23 smitti911
 
11.08.14
14:05
(22) Через 1sqlite не пробовал , хочу уже с этим VFP разобраться....
24 smitti911
 
11.08.14
14:08
в классе ПрямойЗапрос есть возможность сделать DELETE записей из табличек?
25 Ёпрст
 
11.08.14
14:12
класс прямой запрос в топку, учись писать запросы без него
26 Злопчинский
 
11.08.14
14:13
(25) ну.. это можно рассматривать как деградацию + одну из ступеней перехода на снеговика с его "прямыми" запросами.. ;-)
27 Ёпрст
 
11.08.14
14:13
на счет vfp - всё написано в (15).
1sqlite не способен на delete/insert/update/запрос к чужой базе, тут только запрос на оледб.
28 smitti911
 
11.08.14
17:16
(19) Пока перезагрузку не могу сделать (работают юзвери), но есть новая ошибка:
Не найден ключ реестра с данным класидомHKCR\oledbdata\CLSID\ для объекта: oledbdata
Прог-ид oledbdata не найден в реестре и помечен как обработанный для исключения повторной генерации.
Ошибка генерации файлов по прог-иду: oledbdata
29 smitti911
 
11.08.14
17:18
На демо конфигурации Комплексная отрабатывают любые запросы в консольке ...
30 smitti911
 
12.08.14
12:55
Как оптимизировать запрос ?
Код :
    ТекстЗапроса = "
    |Delete
    |    Пров
    |FROM
    |   1SENTRY as Пров
    |WHERE
    | (Пров.docid in (
    |    select
    |      jr.iddoc as iddoc
    |    from
    |      1sjourn as jr
    |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~) AND " + УсловиеПоВидамДок() + "))
    |
    |";  
    

    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...проводки удалены");
    Исключение
        Сообщить("Запрос по проводкам документов не выполнился!", "!");
        Сообщить("Ош "+ОписаниеОшибки());
    КонецПопытки;
31 smitti911
 
12.08.14
12:57
Или так, есть процедура очистки базы прямым запросом
Код:


//*******************************************
Процедура Удалить()
    
    
    ОлеДБ = СоздатьОбъект("OLEDBData");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
    Рез = ОлеДБ.Соединение(Соединение);
    Сообщить("Рез "+Рез);
    рс = ОлеДБ.СоздатьКоманду();
    рс.Выполнить("EXECSCRIPT('SET ANSI OFF')");  

    рс.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
    рс.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");    
    рс.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
    рс.Отладка(1);
    
    Сообщить("Обработка таблиц документов");
    
    Для Счетчик = 1 По Докум.РазмерСписка() Цикл //по таблицам документов
        
        Если Докум.Пометка(Счетчик) = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        ВидДок = Докум.ПолучитьЗначение(Счетчик);
        
        Сообщить(" ..." + ВидДок + "...");
        
        Состояние("...удаляются строки документов...");
        
        ТекстЗапроса = "
            |Delete
            |    Док
            |FROM
            |   $ДокументСтроки." + ВидДок.Идентификатор + " as Док
            |   where Док.iddoc in (
            |    select
            |      jr.iddoc as iddoc
            |    from
            |      1sjourn as jr
            |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~))
            |";  
            
            
        рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
        рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
        
        Попытка
            рс.ВыполнитьИнструкцию(ТекстЗапроса);
            Сообщить("...строки удалены");
        Исключение
            Сообщить("Запрос по строкам документов вида " + ВидДок.Идентификатор + " не выполнился!", "!");
            Сообщить("ош  "+ОписаниеОшибки());
        КонецПопытки;
    
        Состояние("...удаляются шапки документов...");
        
        ТекстЗапроса = "
            |Delete
            |    Док
            |FROM
            |   $Документ." + ВидДок.Идентификатор + " as Док
            |   where Док.iddoc in (
            |    select
            |      jr.iddoc as iddoc
            |    from
            |      1sjourn as jr
            |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~))
            |";  
        
        рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
        рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
        
        Попытка
            рс.ВыполнитьИнструкцию(ТекстЗапроса);
            Сообщить("...шапки удалены");
        Исключение
            Сообщить("Запрос по шапкам документов вида " + ВидДок.Идентификатор + " не выполнился!", "!");
        КонецПопытки;
        
    КонецЦикла; //по табоицам документов
    
    Состояние("");
    Сообщить("Обработка таблиц регистров");
    //
    Для СчетчикРег = 1 По спРегистров.РазмерСписка() Цикл //по таблицам регистров
        
        ВидРег = спРегистров.ПолучитьЗначение(СчетчикРег);
    
        Сообщить("..." + ВидРег + "...");
    
        ТекстЗапроса = "
        |Delete
        |    Рег
        |FROM
        |   $Регистр." + ВидРег.Идентификатор + " as Рег
        |WHERE Рег.iddoc in (
            |    select
            |      jr.iddoc as iddoc
            |    from
            |      1sjourn as jr
            |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~) AND " + УсловиеПоВидамДок() + ")
        |  
        |
        |    
        |";  
        
        рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
        рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
        Попытка
            рс.ВыполнитьИнструкцию(ТекстЗапроса);
            Сообщить("...движения удалены");
        Исключение
            Сообщить("Запрос по регистру вида " + ВидРег + " документов вида " + ВидДок.Идентификатор + " не выполнился!", "!");
        КонецПопытки;
        
    КонецЦикла; //по таблицам регистров
    
    //смотрим общие таблицы по всем видам
    
    Сообщить("Обработка общих таблиц");
    
    Сообщить(" ...удаляются проводки...");
    
    ТекстЗапроса = "
    |Delete
    |    Пров
    |FROM
    |   1SENTRY as Пров
    |WHERE
    | (Пров.docid in (
    |    select
    |      jr.iddoc as iddoc
    |    from
    |      1sjourn as jr
    |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~) AND " + УсловиеПоВидамДок() + "))
    |
    |";  
    

    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...проводки удалены");
    Исключение
        Сообщить("Запрос по проводкам документов не выполнился!", "!");
        Сообщить("Ош "+ОписаниеОшибки());
    КонецПопытки;
        
    Сообщить(" ...удаляются периодические реквизиты, заполняемые документами...");
    
    ТекстЗапроса = "
        |Delete
        |    Конст
        |FROM
        |   1SCONST as Конст
        |WHERE (Конст.docid in (
        |    select
        |      jr.iddoc as iddoc
        |    from
        |      1sjourn as jr
        |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~) AND " + УсловиеПоВидамДок() + "))
        |";  
        

    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...периодика удалена");
    Исключение
        Сообщить("Запрос по периодике не выполнился!", "!");
        Сообщить("Ош "+ОписаниеОшибки());
    КонецПопытки;
    //
    Сообщить(" ...удаляются перекрестные ссылки...");
        
    ТекстЗапроса = "
        |DELETE
        |    Док
        |FROM
        |    1scrdoc as Док
        |
        |WHERE (SUBSTR(Док.ParentVal, 7, 9) in (
        |    select
        |      jr.iddoc as iddoc
        |    from
        |      1sjourn as jr
        |   where  " + УсловиеПоВидамДок() + ")) AND Док.childdate BETWEEN :НачДата~~ AND :КонДата~~
        |
        |";
    
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...перекрестные ссылки удалены");
    Исключение
        Сообщить("Запрос по перекрестным ссылкам и графам отбора не выполнился!", "!");
    Сообщить("Ош "+ОписаниеОшибки());
    КонецПопытки;
    //    
    Сообщить(" ...удаляются операции...");
        
    ТекстЗапроса = "
        |DELETE
        |    Док
        |FROM
        |    1soper as Док
        |
        |WHERE Док.DocID in (
        |    select
        |      jr.iddoc as iddoc
        |    from
        |      1sjourn as jr
        |   where  " + УсловиеПоВидамДок() + ") AND Док.Date BETWEEN :НачДата~~ AND :КонДата~~
        |
        |";
    
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...операции удалены");
    Исключение
        Сообщить("Запрос по таблице операций не выполнился!", "!");
    Сообщить("Ош "+ОписаниеОшибки());
    КонецПопытки;
    //
    Сообщить(" ...удаляются ссылки из журнала документов...");
    
    ТекстЗапроса = "
        |Delete
        |    jr
        |FROM
        |   1SJourn as jr
        |WHERE " + УсловиеПоВидамДок() + "
        |    AND
        |    jr.date BETWEEN :НачДата~~ AND :КонДата~~
        |";  
        
    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    
    Попытка
        рс.ВыполнитьИнструкцию(ТекстЗапроса);
        Сообщить("...ссылки удалены");
    Исключение
        Сообщить("Запрос по ссылкам документов не выполнился!", "!");
    Сообщить("Ош "+ОписаниеОшибки());
    КонецПопытки;
    
    
    
    Предупреждение("Обработка закончена!");
    
КонецПроцедуры  

Где можно оптимизировать запросы ?Проводки и ссылки удаляются очень долго.
32 Ёпрст
 
12.08.14
13:12
читать это
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705

и переписывать запросы под попадание в индекс
33 smitti911
 
12.08.14
13:15
(32) Интересует табличка 1SENTRY. Есть еще проблемка, если журнал цеплять через иннер джоин то VFP ругается Function name is missing.Может мое условие
   |Delete
    |    Пров
    |FROM
    |   1SENTRY as Пров
    |WHERE
    | (Пров.docid in (
    |    select
    |      jr.iddoc as iddoc
    |    from
    |      1sjourn as jr
    |   where (jr.date BETWEEN :НачДата~~ AND :КонДата~~) AND " + УсловиеПоВидамДок() + "))
    |
    |";  

можно переписать оптимальней?
34 SSSSS_AAAAA
 
12.08.14
13:33
(33) ":НачДата~~ "
Вы такой синтаксис где откопали?
35 smitti911
 
12.08.14
13:36
36 SSSSS_AAAAA
 
12.08.14
13:39
(35) А конкретней? В списке форумов предлагаете искать?
На каком языке этот код? Для какого драйвера этот код?
37 smitti911
 
12.08.14
13:41
(36) Все описано выше : VFPOLEDB на DBF базе прямой запрос 1С++
38 smitti911
 
12.08.14
13:43
(36) Сейчас читаю про попадание в индекс, например:

Например мы хотим выбрать документы из 1SJOURN за период .
Подходящий индекс – ACDATETIM (дата/время) : «DTOS(date)+time+iddoc»
Если использовать
Код:

|WHERE    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~


то оптимизатор не найдет индекса, так как «Жур.Date»  не соответствует «DTOS(date)+time+iddoc»
    К счастью FoxPro поддерживает упорядочение строк – и можно использовать оператор          BETWEEN .
Длина строки «time+iddoc» равна 15.
Определим переменные МинСтрока= "               "
                                        МаксСтрока= "ZZZZZZZZZZZZZZZ"
Собственно условие
Код:

WHERE   DTOS(date)+time+iddoc BETWEEN (DTOS(:НачДата~~)+'           ') AND (DTOS(:КонДата~~)+'ZZZZZZZZZZZZZZZ')


(для простоты переменные МинСтрока и МаксСтрока не используются)
39 Ёпрст
 
12.08.14
13:43
(34) че не устраивает ?
40 SSSSS_AAAAA
 
12.08.14
13:46
(39) Зайдем с другой стороны. Что еще пишет в сообщении об ошибке кроме Function name is missing? На какую строку ругается?
41 Ёпрст
 
12.08.14
13:52
вот.. кусок кода
    мд = СоздатьОбъект("MetaDataWork");
    Для ном = 1 по Метаданные.Регистр() Цикл
        Рег = Метаданные.Регистр(ном);
        Состояние("движуха регистра "+Рег.Идентификатор);
        Сообщить("движуха регистра "+Рег.Идентификатор,"i");
        
        Если Рег.БыстраяОбработкаДвижений =0 Тогда
            стр ="
            |DELETE
            |FROM $Регистр."+Рег.Идентификатор+"
            |WHERE iddoc in (select Жур.iddoc from 1sjourn Жур where
            |
            |dtos(Жур.date)+Жур.time+Жур.iddoc between (dtos(:НачДата~~)+'      '+'         ')  and  (dtos(:КонДата~~)+'ZZZZZZ' + 'ZZZZZZZZZ')
            |)
            |";
        Иначе
            стр ="
            |DELETE
            |FROM $Регистр."+Рег.Идентификатор+"
            |    WHERE
            |        DTOS(date)+time+iddoc+STR(lineno,4)+STR(actno,6) BETWEEN
            |         DTOS(:НачДата~~)+'      '+'         '+'    '+'      '
            |     And DTOS(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ'    
            |
            |";
        КонецЕсли;            
        Запрос.УстановитьТекстовыйПараметр("НачДата", '01.01.80');
        Запрос.УстановитьТекстовыйПараметр("КонДата", ВыбДата);
            
            
            
        Если Запрос.ВыполнитьИнструкцию(стр) = 0 Тогда
            Сообщить("движуха регистра "+Рег.Идентификатор,"!!!");
        КонецЕсли;
42 Ёпрст
 
12.08.14
13:53
А тебе.. можно запихать выборку доков во временную табличку и соединять потом везде в делете
43 SSSSS_AAAAA
 
12.08.14
13:57
(41) dtos(:НачДата~~) в сочетании с УстановитьТекстовыйПараметр("НачДата", '01.01.80') - чушь, приводящая к ругани на несоответствие типов. К тому же, '01.01.80' есть большие грабли в деле правильного понимания драйвером сего безобразия.
44 SSSSS_AAAAA
 
12.08.14
13:58
(41) Добавчик: а Жур.date у нас какого типа?
45 Ёпрст
 
12.08.14
14:00
(43) ты не в теме
46 SSSSS_AAAAA
 
12.08.14
14:05
(45) Я очень даже в теме VFPOLEDB на DBF.
VFPOLEDB на dtos() со строковым параметром будет ругаться на несоответствие типов.
47 SSSSS_AAAAA
 
12.08.14
14:07
(45) Изучай:

Visual FoxPro 9.0 Справка по языку  
Функция DTOS( )  
См.также  Пример  

Свернуть все  




Возвращает дату в виде символьной строки формата ггггммдд из заданного выражения типа "дата" (Date) или "дата-время" DateTime.





DTOS(dExpression | tExpression)



Параметры
dExpression

Указывает выражение типа "дата" для преобразования посредством функции DTOS( ) в строку из восьми цифр. tExpression

Указывает выражение типа "дата-время" для преобразования посредством функции DTOS( ) в строку из восьми цифр.
Возвращаемое значение


Символьное

Примечания


Эта функция полезна для индексирования таблиц, содержащих поля типа "дата" и "дата-время". Она равнозначна функции DTOC( ) для случая, когда указывается первый необязательный аргумент.

Вид и содержимое символьной строки, возвращаемой функцией DTOS( ), не зависит от установок SET DATE или SET CENTURY.
48 Ёпрст
 
12.08.14
14:09
(46) :)
49 Ёпрст
 
12.08.14
14:10
Продолжай дальше изучение справки по vfp
50 smitti911
 
12.08.14
14:11
(40) Запрос >>> OLEDBCommand error:
FAILED! ICommandText::Execute(): Function name is missing ).
51 SSSSS_AAAAA
 
12.08.14
14:14
(49) Спасибо, но в таких рекомендациях не нуждаюсь. Эту справку и так почти наизусть знаю.
52 smitti911
 
12.08.14
14:15
(41) В чем разница Если Рег.БыстраяОбработкаДвижений =0 Тогда
53 Ёпрст
 
12.08.14
14:17
(52) в табличке движений регистра будут доп поля - не надо будет делать соединение с журналом (аналогично будут поля, ежели стоит галка на одном из измерений регистра)
54 SSSSS_AAAAA
 
12.08.14
14:17
(50) М-да, очень информативно. Но видно, что стоит закрывающая скобка, которой не найдено соответствие.
55 Ёпрст
 
12.08.14
14:18
для проводок, нужно задействовать этот индекс
DTOS(DATE)+TIME+DOCID+STR(NUMBER,5)+STR(CORNO,5)
56 Ёпрст
 
12.08.14
14:19
(51) и как помогает ?
57 Ёпрст
 
12.08.14
14:19
в УсловиеПоВидамДок

у тя там че хоть ?

Ты не у всех документов режешь движуху ?
58 smitti911
 
12.08.14
14:21
(57) Движуху надо оставить по банк.випис. и зарплатная часть

//*******************************************
Функция УсловиеПоВидамДок()
    
    СтрокаУсловия = "(";
    
    СчетчикВыбраных = 0;
    Для СчетчикДок = 1 По Докум.РазмерСписка() Цикл //перебираем таблицы документов
        
        Если Докум.Пометка(СчетчикДок) = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        СчетчикВыбраных = СчетчикВыбраных + 1;
        
    КонецЦикла;
        
    Для СчетчикДок = 1 По Докум.РазмерСписка() Цикл //перебираем таблицы документов
        
        Если Докум.Пометка(СчетчикДок) = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        ВидДок = Докум.ПолучитьЗначение(СчетчикДок);
        
        СтрокаУсловия = СтрокаУсловия + "jr.IDDOCDEF = $ВидДокумента." + ВидДок.Идентификатор;
        СчетчикВыбраных = СчетчикВыбраных - 1;
        
        Если СчетчикВыбраных = 0 Тогда
            СтрокаУсловия = СтрокаУсловия + ")";
        Иначе
            СтрокаУсловия = СтрокаУсловия + "
            |    OR ";
        КонецЕсли;
            
    КонецЦикла;
    
    Возврат СтрокаУсловия;
    
КонецФункции
59 smitti911
 
12.08.14
14:23
(55) Чем можно смотреть какой индекс используется у какай таблички?
60 SSSSS_AAAAA
 
12.08.14
14:24
(56) Ага, особенно в поисках ошибок в чужом коде.
61 smitti911
 
12.08.14
14:27
(50) select Пров.TIME FROM 1SENTRY as Пров
INNER JOIN
   1SJourn ON 1SJourn.IDDoc = Пров.DocID
WHERE 1SJourn.Date BETWEEN :НачДата AND :НачДата~


Запрос >>> OLEDBCommand error:
FAILED! ICommandText::Execute(): Command contains unrecognized phrase/keyword.
62 SSSSS_AAAAA
 
12.08.14
14:28
(59) Ничем. В фоксе нет такого средства. Но есть возможность посмотреть уровень оптимизации. SYS(3054). Но для этого запрос надо отлаживать в фоксе, и только потом готовый запрос тащить в другие системы.
63 SSSSS_AAAAA
 
12.08.14
14:30
(61) Разумеется ругается. Он не знает что такое  :НачДата
64 Ёпрст
 
12.08.14
14:30
(61)
select
Пров.TIME
FROM 1SENTRY as Пров
INNER JOIN
   1SJourn as Жур ON Жур .IDDoc = Пров.DocID
WHERE Жур .Date BETWEEN :НачДата~~ AND :НачДата~~
65 Ёпрст
 
12.08.14
14:30
(62) :)))))))))))))))))))))))))))))))))))))
66 Ёпрст
 
12.08.14
14:31
только вот, соединение с журналом в этом запросе лишнее + нет попадания в индекс
67 SSSSS_AAAAA
 
12.08.14
14:32
(65) Ну вот и прелестно, хоть кому-то я жизнь скрасил.
68 Ёпрст
 
12.08.14
14:33
(67) месье не знает как посмотреть индексы на табличку ?
69 SSSSS_AAAAA
 
12.08.14
14:34
(68) Мсье знает как посмотреть индексы на табличку, но вопрос был про использование индексов в запросе, а это сильно разные вещи.
70 Junior1s
 
12.08.14
14:35
(68) кто то походу троллит тебя :)
71 smitti911
 
12.08.14
14:38
(31) Лучше переписать через INNER JOIN с журналом или оставить как есть только попадать в индекс.Что бістрее отработает?
72 smitti911
 
12.08.14
14:39
(64) Так работает.Спасибо.
73 smitti911
 
12.08.14
14:40
(63) Все он знает. 1sqa если что....
74 SSSSS_AAAAA
 
12.08.14
14:42
(73) Не всё. Найдите отличия между :НачДата~~ и :НачДата
75 SSSSS_AAAAA
 
12.08.14
14:43
(71) Что быстрее отработает поможет узнать тестовый прогон запросов.
76 Ёпрст
 
12.08.14
14:45
(74) {d '2001-01-01'}, '20010101'
дальше бум тупить, или как ?
77 Ёпрст
 
12.08.14
14:45
(75) что быстрее работает, покажет план выполнения запроса
78 Ёпрст
 
12.08.14
14:46
и о чудо, его тоже можно смотреть в дбф базах.. если че
79 Ёпрст
 
12.08.14
14:48
(72) см. (66)

в этом запросе, можно выкинуть соединение с журналом и воткнуть условие на дату из проводки
80 SSSSS_AAAAA
 
12.08.14
15:07
(76) И что? Первое вообще не пойми что, второе - строка, которая может быть получена от функции dtos() при передаче ей значения типа ДАТА, например {^2001-01-1}.
81 SSSSS_AAAAA
 
12.08.14
15:08
(78) его - это ЧТО?
82 smitti911
 
12.08.14
15:10
ТекстЗапроса = "
    |Delete
    |    Пров
    |FROM
    |   1SENTRY as Пров
    |WHERE
    | Пров.docid in (
    |    select
    |      jr.iddoc as iddoc
    |    from
    |      1sjourn as jr
    |where DTOS(jr.date)+jr.time+jr.iddoc BETWEEN (DTOS(:НачДата~~)+'               ') AND (DTOS(:КонДата~~)+'ZZZZZZZZZZZZZZZ') AND " + УсловиеПоВидамДок() + ")
    |
    |
    |";
    
В журнале ведь индекс DTOS(date)+time+iddoc  , почему нету прироста по скорости?
83 SSSSS_AAAAA
 
12.08.14
15:11
(78) Или под словом "его" имеется в виду план запроса? Если так, то разочарую - в фоксе нет понятия "план запроса", впрочем, как нет и понятия "дбф база" :)
84 SSSSS_AAAAA
 
12.08.14
15:13
(82) "ведь индекс DTOS(date)+time+iddoc  , почему нету прироста по скорости?"
Потому, что, как минимум, наличие какого-то индекса не гарантирует его использования.
85 Ёпрст
 
12.08.14
15:16
(82)
что в УсловиеПоВидамДок ?
86 smitti911
 
12.08.14
15:17
(85) WHERE (jr.IDDOCDEF = ' E7L')
87 Ёпрст
 
12.08.14
15:21
(86) там всегда 1 вид документа ?
или что ?
88 Ёпрст
 
12.08.14
15:21
УсловиеПоВидамДок() покажи код функции
89 Ёпрст
 
12.08.14
15:21
(83) та ты шо
90 smitti911
 
12.08.14
15:23
(87) Нет, пока пробую на копии базы то 1 . А потом будет порядка 20-и
91 smitti911
 
12.08.14
15:23
через OR
92 smitti911
 
12.08.14
15:23
(87) Cvjnhb (58)
93 Ёпрст
 
12.08.14
15:26
(90) и зачем это всё ?
Зачем в этом запросе ограничение по виду ?
Это свёртка же, там нужно у всех доков проводки выкидывать
94 Ёпрст
 
12.08.14
15:28
если у двух документов нужно оставить, то так тогда хотя бы

and not in ($ВидДокумента.ПервыйДок,$ВидДокумента.ВторойДок)
но никак не or
95 smitti911
 
12.08.14
15:29
(93) Ну назовем это неполная свертка, нужно несколько видов доков оставить с проводками, движухой и т.д.Такая вот тупая задача.Незнаю как бухи будут сводить остатки....

Сейчас запускал чистку за 1 день по виду док. приходная.Время выполнения 45 сек причем 33 из них это чистка 1ссентри
96 SSSSS_AAAAA
 
12.08.14
15:34
(89) Сильный аргумент. :) Лучше ссылочку на доку по планам запросов в фоксе кинул для изучения, может где мимо меня промелькнула?
97 Ёпрст
 
12.08.14
15:37
98 Ёпрст
 
12.08.14
15:38
даже фокс не нужен, только некоторое файло с него
99 SSSSS_AAAAA
 
12.08.14
15:59
(98) "ЗЫ... Нужны VFP9 Run-Time Libraries " А это уже перестало быть фоксом? :) Учите матчасть. :)
100 SSSSS_AAAAA
 
12.08.14
16:01
(98) И что-то про планы запросов не наблюдаю ничего? Куда смотреть?
101 Ёпрст
 
12.08.14
16:03
(99) читать то умеешь, али как ?
102 SSSSS_AAAAA
 
12.08.14
16:04
(101) Аргументировать то можешь или как? Пруф на планы запросов в фоксе в студию.
103 Ёпрст
 
12.08.14
16:07
чем тебя (97) не устраивает ?
104 SSSSS_AAAAA
 
12.08.14
16:07
(103) Тем, что там нет ничего про планы запросов.
105 Ёпрст
 
12.08.14
16:09
ну и для тех, у кого не установлен фокс, читаем это:
http://www.1cpp.ru/forum/YaBB.pl?num=1210677779/27#27
106 SSSSS_AAAAA
 
12.08.14
16:12
(105) Ну и где там про планы запросов. Где взять и как работать с рантаймом фокса я сам поучить могу. Где планы запросов, ткни меня носом.
107 SSSSS_AAAAA
 
12.08.14
16:18
(105) А, ты повелся на Execute_PLAN? Наивный... :) Нет и не может там быть плана ибо его нет в природе. Там всего лишь вывод в файл результата работы уже упомянутой функции Sys(3054). А это ни разу не план, в нем нет информации по используемым индексам и т.д. Там есть уровень оптимизации и не более того.
108 Ёпрст
 
12.08.14
16:28
(107) спасибо, я в курсе
109 Ёпрст
 
12.08.14
16:35
а на счет индексов - всё там будет написано
110 Ёпрст
 
12.08.14
16:37
будет написано какой задействован индекс и какой уровень оптимизации
111 Ёпрст
 
12.08.14
16:37
этого более чем достаточно в данном вопросе.
112 SSSSS_AAAAA
 
12.08.14
16:43
(109) Не будет. Уровень оптимизации указывается всего тремя словами: full, partial, none. Всё!

Кстати, о птичках. Так как в данной теме обсужадется получение данных из дбф-файлов 1С версии 7.*, то могу огорчить еще одним сообщением.
Для того, что бы индеккс использовался, нужно чтобы он был открыт во время выполнения запроса. Отрываться он может и автоматом при открытии таблицы, но для этого он должен быть создан соотвествующим образом. А вот это с указанными файлами еще надо проверить. Хоть в 1с у индексных фалов и стоИт расширение CDX, то еще не факт, что в дбф-файлах стоИт соттвествующий признак. А без него что есть индексы, что их нет - без разницы.
113 SSSSS_AAAAA
 
12.08.14
16:47
(110) Не будет. Нет там указания на индекс.

Статью из хелпа показать?
114 Ёпрст
 
12.08.14
16:56
115 Ёпрст
 
12.08.14
16:57
using index... не о чем не говорит вам ?
116 SSSSS_AAAAA
 
12.08.14
17:13
(115) Дата поста и версия фокса ничего не говорят?
117 Ёпрст
 
12.08.14
17:15
(116) в 9.2 я вижу тоже самое, если что , используя поделку из форума 1cpp
118 SSSSS_AAAAA
 
12.08.14
17:28
(117) 9.2? Это что? Версия фокса? Или чего-то еще? Если фокса, то где откопал? Или ты так второй сервиспак обзываешь? Так после него еще паки были.
119 Ёпрст
 
12.08.14
17:35
да sp2
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn