Имя: Пароль:
1C
 
работа 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 байт.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший