|
работа c DBF... Ø |
☑ | ||
|---|---|---|---|---|
|
0
Quest
02.12.05
✎
15:39
|
Помогите написать пожалуйста такую штуку...
Есть три переменные: Перем1, Перем2, Перем3. Они содержат определенные значения... Есть файл DBF, который содержит три поля, строк там около 100 000. Нужно найти строку в файле в точности соответствубщую этим трем переменным. |
|||
|
1
КонецЦикла
02.12.05
✎
15:41
|
создай индексный файл
потом можно НайтиПоКлючу() |
|||
|
2
mikecool
02.12.05
✎
15:42
|
Создай индексный файл по трем полям и ищи по индексу
|
|||
|
3
Quest
02.12.05
✎
15:48
|
Так а как создать-то ?
|
|||
|
4
Stopper
02.12.05
✎
16:18
|
Хоть Фоксом. Зачем себя люди ограничивают?
|
|||
|
5
Quest
02.12.05
✎
17:34
|
Причем тут фокс ? Мне в 1с нада ...
|
|||
|
6
Witch
02.12.05
✎
17:42
|
(5) Синтаксис-помощник религия не позволяет смотреть?
СоздатьИндексныйФайл(<?>) Синтаксис: СоздатьИндексныйФайл(<ИмяФайла>) Назначение: Создает индексный файл, содержащий все индексы, которые были созданы методом ''ДобавитьИндекс''. Параметры: <ИмяФайла> - строковое выражение с именем создаваемого индексного файла. ДобавитьИндекс(<?>,,,,); Синтаксис: ДобавитьИндекс(<Название>,<Выражение>,<Уникальность>,<Убывание>,<Фильтр>) Назначение: Добавить индекс в структуру базы. Метод можно использовать только перед созданием новой базы. Параметры: <Название> - строковое выражение, содержащее имя создаваемого индекса, <Выражение> - строковое выражение, содержащее ключ индекса (должно соответствовать инструкциям CodeBase), <Уникальность> - флаг уникальности индекса (1 - уникальный, 0 - нет), <Убывание> - флаг направления убывания индекса (1 - по убыванию значения ключа, 0 - по возрастанию), <Фильтр> - строковое выражение содержащее фильтр индекса (в соответствии с инструкциям CodeBase). Подробнее см. в документации, глава ''Работа с базами данных DBF формата'' |
|||
|
7
Quest
05.12.05
✎
18:01
|
Да религия-то не причем здесь... Читал я синтаксис, да не пойму как мне организовать поиск сразу по трем полям. Вот по одному получается... Если может кто-нить кроме как копировать строки из синт.помошника, напишите пожалуйста какой-нить элементарный пример... Заранее благодарен.
|
|||
|
8
Quest
05.12.05
✎
18:05
|
Как мне индекс-то постоить ?
|
|||
|
9
AAAChel
05.12.05
✎
18:15
|
Вам же написали:
ДобавитьИндекс(<Название>,<Выражение>,<Уникальность>,<Убывание>,<Фильтр>) <Название> - просто обзовите <Выражение> - сцепите в одно выражение Ваши 3 переменные, получите из них уникальную строку |
|||
|
10
callisto
05.12.05
✎
18:29
|
а почему бы ADO не попользовать ? ;)
|
|||
|
11
banda
05.12.05
✎
18:32
|
БазаЗ=СоздатьОбъект("XBase");
фильтр="Pole1='"+Перем1+"'.AND.Pole3='"+Перем2+"'.AND.Pole3='"+Перем3+"'"; БазаЗ.ДобавитьИндекс("ПервыйИндекс","Pole1+Pole2+Pole3",0,0,фильтр); БазаЗ.СоздатьИндексныйФайл(""+КаталогБазыДанных()+"МойИндекс.cdx"); БазаЗ.ТекущийИндекс("ПервыйИндекс"); все, теперь в БазаЗ, будут только те записи, которые удовлетворяют условию |
|||
|
12
banda
05.12.05
✎
18:37
|
+(11) если же тебе надо проверять в цикла,
то будет работать быстрее, если сделать так: БазаЗ=СоздатьОбъект("XBase"); БазаЗ.ДобавитьИндекс("ПервыйИндекс","Pole1+Pole2+Pole3",0,0,); БазаЗ.СоздатьИндексныйФайл(""+КаталогБазыДанных()+"МойИндекс.cdx"); БазаЗ.ТекущийИндекс("ПервыйИндекс"); Для н=1 По СколькоРазТебеНадо Цикл БазаЗ.Ключ.Pole1=Перем1; БазаЗ.Ключ.Pole2=Перем2; БазаЗ.Ключ.Pole3=Перем3; Если БазаЗ.НайтиПоКлючу(0)=1 Тогда //вот она твоя запись КонецЕсли; КонецЦикла; |
|||
|
13
Quest
06.12.05
✎
10:20
|
Спасибо.
|
|||
|
14
Бомж
06.12.05
✎
10:32
|
А так быстрее будет ;)
ADO = CreateObject("ADODB.Connection"); Base= CreateObject("ADODB.Recordset"); ADO.Open("Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB="+КаталогИБ()+";Exclusive=No;Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO"); ЗапросСтр = "Select * from "+ИмяДБФ+" where (поле1 = """+зн1+""") and (поле2 = """+зн2+""") and (поле3 = """+зн3+""");"; //Сообщить(ЗапросСтр); Base.Open(ЗапросСтр,ADO); Пока Base.EOF()=0 Цикл // Делаем что-нить... Base.MoveNext(); КонецЦикла; Base.Close(); |
|||
|
15
Марат
06.12.05
✎
11:01
|
а что значит Base.EOF()=0 ?
|
|||
|
16
Редкий гость
06.12.05
✎
11:17
|
EndOfFile
|
|||
|
17
Quest
06.12.05
✎
11:30
|
(12) Не получается почему-то так сделать в 1Cv8... :(
Пишет ошибку при создании индексного файла №460. Неверный тип подвыражения. |
|||
|
18
banda
06.12.05
✎
11:55
|
(17) а ты хоть слово говорил пор то, что ты это делаешь в восьмерке?
(11,12) это для 7.7, а с восьмеркой я еще мало знаком |
|||
|
19
Quest
06.12.05
✎
15:05
|
Про восьмерку не говорил, но работаю в ней. В приципе в плане работы с DBF там всё похоже... Но почему-то так не работает...
|
|||
|
20
banda
06.12.05
✎
15:11
|
(19)тогда тебе прямая дорога в синтаксис-помощник
|
|||
|
21
Quest
06.12.05
✎
15:12
|
Как я понимаю, ошибка именно тут...
БазаЗ.ДобавитьИндекс("ПервыйИндекс","Pole1+Pole2+Pole3",0,0,); Потому что так - "БазаЗ.ДобавитьИндекс("ПервыйИндекс","Pole1",0,0,);" - создается индексный файл нормально. |
|||
|
22
Quest
06.12.05
✎
15:15
|
Так синтаксис уже цитировали тут... Там ничего толкового не сказано...
Можно ли несколько полей в один индекс запихивать ? |
|||
|
23
banda
06.12.05
✎
15:17
|
(22)ЖКК
|
|||
|
24
Quest
06.12.05
✎
15:26
|
Что за ЖКК ?
|
|||
|
25
banda
06.12.05
✎
15:34
|
(24)Желто-красные книжки
|
|||
|
26
Quest
06.12.05
✎
15:36
|
Нда... Особенно у 8ки они очень информативные...
|
|||
|
27
Quest
06.12.05
✎
17:30
|
Я всё понял, я складывал в один индекс поля разных типов. Ну а что же делать в этом случае ? У меня такой вот расклад (Дата,Строка,Строка,Строка,Число).
|
|||
|
28
КонецЦикла
06.12.05
✎
17:35
|
А ты того... преобразовывай
БДОст.ДобавитьИндекс("GOODS","TRIM(ALLTYPE)+TRIM(GOOD)+'@'+STR(STORE)+'@'",0,0,""); БДПоз.ДобавитьИндекс("POSDOCS","DTOS(DOCDATE)+TRIM(DOCNUM)+'@'",0,0,""); |
|||
|
29
Quest
06.12.05
✎
17:44
|
Неа, снова ошибку такую-же выдавать начинает...
|
|||
|
30
Quest
07.12.05
✎
02:20
|
+'@' - а что это значит ?
|
|||
|
31
trdm
07.12.05
✎
05:25
|
(21) (*)|(*) и как >> БазаЗ.ДобавитьИндекс("ПервыйИндекс"...
Хавает название индекса на русском языке и с такой длиннннннной? |
|||
|
32
Quest
07.12.05
✎
10:18
|
"ПервыйИндекс" - условность-же. Какой пример привели, то и цитирую. Я использую свое название латинскими символави до 8 знаков.
|
|||
|
33
Бомж
07.12.05
✎
10:26
|
А по (14) не пробовал?
Или в 8-ке так не прокатывает? |
|||
|
34
Quest
07.12.05
✎
10:45
|
Не пробовал... Я не совсем понимаю (14). У меня другим способом всё получилось, за исключением преобразований...
|
|||
|
35
Quest
07.12.05
✎
10:54
|
Вообще-то перобразуется всё нормально, только больше двух полей в индекс почемуто не помещается...
|
|||
|
36
Quest
07.12.05
✎
11:01
|
Пишет Error#:-350 Key Length is too Large
|
|||
|
37
Quest
07.12.05
✎
12:22
|
Что за длина ключа ?
|
|||
|
38
Quest
07.12.05
✎
12:39
|
Ауу
|
|||
|
39
Quest
07.12.05
✎
12:42
|
Вот такой строкой я добавляю индекс...
БД_Стр.Индексы.Добавить("IDXData", "DTOS(Data)+TRIM(Customer)+TRIM(Document)+TRIM(Account)+STR(Sum,15,2)"); |
|||
|
40
Quest
07.12.05
✎
14:27
|
Что я не правильно делаю ?
|
|||
|
41
anisovka
07.12.05
✎
14:55
|
слушай, а если убрать один из длинных/неудобных ключей и перебирать его циклом?
|
|||
|
42
Quest
07.12.05
✎
15:20
|
(41) Долго-же будет...
(39) Я пришел к выводу, что больше 2х текстовых полей запихать в индекс не получается, однако нигде не нашел, что-б говорилось об ограничении... |
|||
|
43
Quest
07.12.05
✎
15:47
|
Я всё понял ! Длина индекса не должна превышать 256 байт.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |