|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |