Имя: Пароль:
1C
1C 7.7
v7: Поиск в DBF файле
0 vitalka
 
08.08.13
15:46
сочинил обработку, которая должна искать заданную строку ВыбИмя в DBF-файле. Поиск выполняю без учета регистра, пробелов, табуляций, запятых и точек в поле NAME.

Но почему-то по моему условию Найти(""+КодДет,""+ВыбИмя)>0 ничего не находится.

Процедура Сформировать()
    ДБФ = СоздатьОбъект("XBase");
    ПутьДБ = ВыбПоставщик.ПутьКпрайсу;
    ДБФ.ОткрытьФайл(ПутьДБ);
    
    ВыбИмя = СтрЗаменить(ВыбИмя," ","");
    ВыбИмя = Нрег(ВыбИмя);
    ВыбИмя = СтрЗаменить(ВыбИмя,",","");
    ВыбИмя = СтрЗаменить(ВыбИмя,".","");
    
    Если ДБФ.Открыта() = 1 Тогда
        ДБФ.Первая();
        Пока ДБФ.ВКонце() = 0 Цикл
            
            //Убираем пробелы
            КодДет = СтрЗаменить(""+ДБФ.NAME," ","");
            //Убираем табуляции
            КодДет = СтрЗаменить(КодДет,"    ","");
            //Делаем все строчными буквами
            КодДет = Нрег(КодДет);
            ////Убираем запятые и точки
            КодДет = СтрЗаменить(КодДет,",","");
            КодДет = СтрЗаменить(КодДет,".","");
//            Сообщить(КодДет+"   -   "+ВыбИмя);
            
            
            
            Если Найти(""+КодДет,""+ВыбИмя)>0 Тогда
                Сообщить(СокрЛП(""+ДБФ.NAME));
            КонецЕсли;
            Если ДБФ.Следующая() = 0 Тогда
                Прервать;
                ДБФ.ЗакрытьФайл();
            КонецЕсли;
        КонецЦикла;
        ДБФ.ЗакрытьФайл();
    Иначе
        Предупреждение("Не смогли открыть Базу!"+"     "+ПутьДБ,0);
    КонецЕсли;
    
КонецПроцедуры
1 dk
 
08.08.13
15:57
про отладчик уже было? (С)
2 palpetrovich
 
08.08.13
15:58
(0) хвастешься? :)
(0) не еще

зы: наверное стоит открыть для себя индексы
3 palpetrovich
 
08.08.13
15:58
второе (0) читать (1) :)
4 1Сергей
 
08.08.13
15:58
чему равны КодДет и ВыбИмя, при которых Найти(""+КодДет,""+ВыбИмя) = 0 ?
5 Масянька
 
08.08.13
16:09
+(4) Типы значений: ДБФ.NAME и КодДет?
6 oslokot
 
08.08.13
16:14
(0) Найти(КодДет,СокрЛП(ВыбИмя))
7 vitalka
 
08.08.13
16:14
(5)я специально их скавниваю как ""+, чтобы оба значения были строковыми, но сейчас попробую перед сравнением преобразовывать в строку.

Если розкоментировать строку

//            Сообщить(КодДет+"   -   "+ВыбИмя);

выводятся значения КодДет   -   ВыбИмя
вот кусок

                                    
ad130348=13348   -   ad130354=13354                                    
ad130352   -   ad130354=13354                                    
ad130354=13354   -   ad130354=13354

последние (помоему) одинаковые
8 Масянька
 
08.08.13
16:16
(7) После преобразования в строку - отсекай пробелы справа и слева.
9 vitalka
 
08.08.13
16:20
(8)Пробовал
Результат тот-же, что и

КодДет = СтрЗаменить(""+ДБФ.NAME," ","");
10 Масянька
 
08.08.13
16:22
(9) То, что (7) последние - неодинаковые. Покажи, как отсекал пробелы.
11 vitalka
 
08.08.13
16:25
//Это то, что ищем


    ВыбИмя = СтрЗаменить(ВыбИмя," ","");
    ВыбИмя = Нрег(ВыбИмя);
    ВыбИмя = СтрЗаменить(ВыбИмя,",","");
    ВыбИмя = СтрЗаменить(ВыбИмя,".","");
    ВыбИмя = СокрЛП(ВыбИмя);

//Это то, где ищем


            //Убираем пробелы
            КодДет = СтрЗаменить(""+ДБФ.NAME," ","");
            //Убираем табуляции
            КодДет = СтрЗаменить(КодДет,"    ","");
            //Делаем все строчными буквами
            КодДет = Нрег(КодДет);
            ////Убираем запятые и точки
            КодДет = СтрЗаменить(КодДет,",","");
            КодДет = СтрЗаменить(КодДет,".","");
            КодДет = СокрЛП(КодДет);
12 Масянька
 
08.08.13
16:28
(11) И в таком варианте возвращает то, что в (7)?
А зачем Найти используешь?
13 vitalka
 
08.08.13
16:36
(12)да, если выводить до Найти

+(12)а что использовать?
14 Масянька
 
08.08.13
16:55
(13) Да не может такое, как в (7) возвращать после кода в (11). Давай полный код. Вместо Найти - тупое сравнение

Если КодДет = ВыбИмя Тогда
                Сообщить(СокрЛП(""+ДБФ.NAME));
            КонецЕсли;

Кстати, из Сообщить убери пробелы перед и после - и покажи, что возвращает.
15 vitalka
 
08.08.13
17:12
(14)Вот это ищу "AD 03.0314 = 3.314"

Вот это код процедуры

Процедура Сформировать()
    ДБФ = СоздатьОбъект("XBase");
    ПутьДБ = ВыбПоставщик.ПутьКпрайсу;
    ДБФ.ОткрытьФайл(ПутьДБ);
    
    ВыбИмя = СтрЗаменить(ВыбИмя," ","");
    ВыбИмя = Нрег(ВыбИмя);
    ВыбИмя = СтрЗаменить(ВыбИмя,",","");
    ВыбИмя = СтрЗаменить(ВыбИмя,".","");
//    ВыбИмя = Строка(ВыбИмя);
    ВыбИмя = СокрЛП(ВыбИмя);
    
    Если ДБФ.Открыта() = 1 Тогда
        ДБФ.Первая();
        Пока ДБФ.ВКонце() = 0 Цикл
            
            //Убираем пробелы
            КодДет = СтрЗаменить(""+ДБФ.NAME," ","");
            //Убираем табуляции
            КодДет = СтрЗаменить(КодДет,"    ","");
            //Делаем все строчными буквами
            КодДет = Нрег(КодДет);
            ////Убираем запятые и точки
            КодДет = СтрЗаменить(КодДет,",","");
            КодДет = СтрЗаменить(КодДет,".","");
//            КодДет = Строка(КодДет);
            КодДет = СокрЛП(КодДет);
            Сообщить(КодДет+"   -   "+ВыбИмя);
            
            
            
            Если КодДет=ВыбИмя Тогда
                Сообщить(СокрЛП("НАШЛО      -"+ДБФ.NAME));
            КонецЕсли;  
            
            
            Если ДБФ.Следующая() = 0 Тогда
                Прервать;
                ДБФ.ЗакрытьФайл();
            КонецЕсли;
        КонецЦикла;
        ДБФ.ЗакрытьФайл();
    Иначе
        Предупреждение("Не смогли открыть Базу!"+"     "+ПутьДБ,0);
    КонецЕсли;
    
КонецПроцедуры



Вот это выводимый результат


ad030314=3314   -   ad130332                                          
ad1103112   -   ad130332                                          
ad110364=11364   -   ad130332                                          
ad1103761=113761   -   ad130332                                          
ad113621=1103621   -   ad130332                                          
ad130309=13309   -   ad130332                                          
ad130319=13319   -   ad130332                                          
ad130321=13321   -   ad130332                                          
ad130332   -   ad130332                                          
ad130335   -   ad130332

В предпоследней записи одинаковые значения
16 Ёпрст
 
08.08.13
17:17
И выбИмя поди, реквизит формы ?
:))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
17 Масянька
 
08.08.13
17:17
Замени - Сообщить(КодДет+"   -   "+ВыбИмя); на -            Сообщить(КодДет+"-"+ВыбИмя); покажи, что вывело.
18 Ёпрст
 
08.08.13
17:18
(15)

замени на
Если КодДет=СокрЛП(ВыбИмя) Тогда
   Сообщить("Спасибо, Ёпрст!");
19 vitalka
 
08.08.13
17:20
(16)спасибо!!!Заработало
20 Масянька
 
08.08.13
17:21
(18) А разница между (14) и (18) в чем?
21 Ёпрст
 
08.08.13
17:23
(20) длина реквизита формы всегда постоянная велечина, заданая свойством реквизита
22 vitalka
 
08.08.13
17:25
(15)(18)Заменил имя реквизита формы на ВыбИмя_

а в процедуру добавил

ВыбИмя = ВыбИмя_;

и заработало

Что изменилось хрен его знает ))))
23 Ёпрст
 
08.08.13
17:27
(22) см. (21)
24 Ёпрст
 
08.08.13
17:28
Если не дошло, то выведи так:

Сообщить(СтрЗаменить(ВыбИмя," ","*"));
25 Масянька
 
08.08.13
17:29
+(24) Лучше так: Сообщить("1 - (" + ВыбИмя + ")");
26 vitalka
 
08.08.13
17:29
(23)Спасибо, уже понял
А с индексами не буду и пробовать и так ищет мгновенно)))
27 oslokot
 
08.08.13
17:33
тяжела жизнь без отладчика, не спорю.
Основная теорема систематики: Новые системы плодят новые проблемы.