AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.09.2004, 10:53   #1  
Smith is offline
Smith
Участник
 
76 / 10 (1) +
Регистрация: 02.09.2004
Символ в строке
Есть строка

,,Казань,,Татарстан,11,,38

Надо из нее выдернуть город (после двух запятых), улицу (после 4-х запятых) и т.д.
У меня есть алгоритм, но чтобы он заработал мне нужен доступ к отдельному символу строки, как если бы она была массивом.. Таких функций в аксапте я не нашел (может плохо искал).. Есть идеи?
Старый 06.09.2004, 11:19   #3  
Smith is offline
Smith
Участник
 
76 / 10 (1) +
Регистрация: 02.09.2004
это мой старый топик
Но в нем нет ответа на мой новый вопрос..
Старый 06.09.2004, 11:32   #4  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
PHP код:
street conpeek(con2str(AddressString),3
Старый 06.09.2004, 11:53   #5  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Lexey
PHP код:
street conpeek(con2str(AddressString),3
Гхм... давайте уже без извращений, всё проще и производительнее:

substr( stree, n, 1 )

(в аксапте как и в бейсике нет символьного типа данных (char), за символ достаточно принять строку с длиной 1)
Старый 06.09.2004, 11:55   #6  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
А разве строка не есть массив символов?
PHP код:
str string;

string "пример";
info(string[2]); 
Результат символ "р"
Старый 06.09.2004, 12:13   #7  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
Цитата:
Изначально опубликовано Alks


Гхм... давайте уже без извращений, всё проще и производительнее:

Давайте. Цифирки n и 1 как будем искать? Напомню - задача стояла ''выдернуть город (после двух запятых), улицу (после 4-х запятых) ".
Старый 06.09.2004, 12:22   #8  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано YVAS
А разве строка не есть массив символов?
PHP код:
str string;

string "пример";
info(string[2]); 
Результат символ "р"
Результат - сообщение компилятора об ошибка "переменная не является массивом".
Старый 06.09.2004, 12:22   #9  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Изначально опубликовано YVAS
А разве строка не есть массив символов?
PHP код:
str string;

string "пример";
info(string[2]); 
Результат символ "р"
2 YVAS: И что, этот код работает??? Это же не С++...

2 Smith: Кроме приведенного здесь, посмотрите еще класс TextBuffer - там много вкусного, а также методы класса Global.

2 Lexey: Наверное, не con2str(), а str2con()?
__________________
Старый 06.09.2004, 12:28   #10  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
2Ruff, Alks

Ребят спасибо, просто Аксапты под рукой нет. Проверить не могу.
Старый 06.09.2004, 12:30   #11  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Lexey


Давайте. Цифирки n и 1 как будем искать? Напомню - задача стояла ''выдернуть город (после двух запятых), улицу (после 4-х запятых) ".
Извиняюсь, у вас просто ошибка - надо не con2str, а str2con было писать. И так действительно str2con решает задачу элегантно.
Старый 06.09.2004, 12:57   #12  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
А зачем Вам вообще какой-то алгоритм? Есть прекрасный класс TextBuffer, который умеет работать с token'ами:
PHP код:
textBuffer = new TextBuffer();
textBuffer.setText(",,Казань,,Татарстан,11,,38");
// AXAPTA не совсем правильно работает с пустыми
// токенами, поэтому от них надо сначала избавиться
textBuffer.regularExpressions(true);
textBuffer.replace(",,"",~,");
textBuffer.replace("<,""~,");
textBuffer.replace(",>"",~");
num 0;
while (
textBuffer.nextToken(false",")) {
    
num++;
    switch (
num) {
        case 
3:
            
info(strfmt("Город: %1"textBuffer.token()));
            break;
        case 
5:
            
info(strfmt("Улица: %1"textBuffer.token()));
            break;
    }

__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 06.09.2004, 13:03   #13  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
Talking
Ну вот и разобрались
Старый 06.09.2004, 13:56   #14  
Smith is offline
Smith
Участник
 
76 / 10 (1) +
Регистрация: 02.09.2004
Спасибо!
Взял на вооружение наиболее простой и наглядный для меня способ из описанных здесь. Вот что получилось:
X++:
static void Job5(Args _args)
{
    str   sTmp, sS = ',,Казань,,Амирхана,31,2,89';
    int   zpt, i = 1;
    ;
    zpt = 0;
    while (i != StrLen(sS)+1)
    {
    if (subStr(sS, i, 1) != ',')
    {
        sTmp = sTmp + subStr(sS, i, 1);
    }
    else
    {
       zpt++;
       switch (zpt)
       {
            case 3: print('city ' + sTmp);break;
            case 5: print('street ' + sTmp);break;
            case 6: print('House ' + sTmp);break;
            case 7: print('Building ' + sTmp);break;
       }
       sTmp = '';
    }
//    print(subStr(sS, i, 1));
    i++;
    }
    print('Flat ' + sTmp);
    pause;
}
Работает и хорошо! Всем спасибо за ответы!
Старый 06.09.2004, 14:22   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
PHP код:
conPeek(str2con_ru(",,Казань,,Татарстан,11,,38"), 3
Старый 06.09.2004, 15:32   #16  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Re: Спасибо!
Цитата:
Изначально опубликовано Smith
Взял на вооружение наиболее простой и наглядный для меня способ из описанных здесь. ... Работает и хорошо!
Простой и наглядный - это, конечно, хорошо, но правильный и универсальный - лучше . Я бы советовал Вам все же прислушаться к Максиму Горбунову (по его советам уже пора русскую редакцию Best Practices составлять ). Да и str2con() тоже выглядит попроще, чем цикл со свитчем.

То, что Вы нашли частное решение для конкретного случая - это на первый взгляд хорошо, но когда, в будущем, возникнут похожие задачи, и каждый раз придется придумывать новый алгоритм, то это вполне может привести к увеличению вероятности ошибки.

Да, TextBuffer поначалу выглядит тяжеловато и громоздко, но как говорится "лучше день потерять, а потом за час долететь"!
__________________
Старый 06.09.2004, 23:39   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: Символ в строке
Цитата:
Изначально опубликовано Smith
Есть строка

,,Казань,,Татарстан,11,,38

Надо из нее выдернуть город (после двух запятых), улицу (после 4-х запятых) и т.д.
Не, это программистский подход.

Без программирования задача должна ставится следующим образом: есть клиент - узнать из адреса его город и улицу. Адрес строится согласно адресного формата.

Теперь и только теперь в дело вступает программист.

Во-первых, не надо ничего программировать и ничего никуда переводить, не надо никаких строк.
Во-вторых, смотрим стандартный функционал. Есть map AddressMap. У него есть метод AddressMap.loadFields(). Этот метод возвращает контейнер [address, streetName, zipCodeId, city, countryId, stateId, countyId].
Вот и юзайте этот стандартный метод.

В сторону и про себя: вот бы локализаторы вместо того, чтобы городить свои мапы, нормально расширили бы станадртные...

Тогда вызов будут выглядеть так:
PHP код:
Containter c;
custTable.AddressMap::loadFields()
infoconpeek(c4) ); // город
infoconpeek(c2) ); // улица 
Метод будет работать с ЛЮБЫМ адресным форматом!

Если же вы все такие поторопились и у вас есть только строка, то можно выкрутиться следующим образом - присвоить эту строку новой записи. Не забудьте указать страну.

PHP код:
Container c;
CustTable custTable;
;
custTable.country 'RU'// укажите код России в вашей базе
custTable.address ", , , Казань, Татарстан, 11, , 38";
custTable.AddressMap::loadFields();
infoconpeek(c4) ); // город
infoconpeek(c2) ); // улица 
Обратите внимание, что строка должна полностью соответствовать адресному формату. Так у меня в качестве разделителей указана запятая с пробелом ", ". Поэтому в строке мне пришлось добавить пробелы и передвинуть Казань на четвертую позицию...
Теги
textbuffer, адресный формат, законченный пример, разбор строки

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
сумма по строке закупки Nikolaich DAX: Программирование 2 03.04.2007 13:37
Как достать символ из шрифта по коду ? DTD DAX: Программирование 1 01.02.2006 17:19
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02
Ловим \ в строке Smith DAX: Программирование 2 10.09.2004 16:09
Скидка по строке и многострочная скидка efim DAX: Функционал 0 18.06.2003 16:32

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:26.