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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.06.2007, 17:13   #1  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
? как получить нужное значение из такого ?
Есть значение зк1234567/1P1,
как получить с этого значения 1234567/1,
то есть обрезать вначале буквы и в конце буквы и всё что после них?
Старый 28.06.2007, 17:21   #2  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Я бы, наверное воспользовался str StrRem (str text1,str text2) (описание есть в SystemDocumentation/Functions)
Старый 28.06.2007, 17:22   #3  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Lemming Посмотреть сообщение
Я бы, наверное воспользовался str StrRem (str text1,str text2)
ну хорошо, выкину я например P, а как же быть с последними цифрами?
X++:
modifSalesPickingListId = strRem(SalesPickingListJournalLine.PickingListId, 'P');
Старый 28.06.2007, 17:31   #4  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от fialka Посмотреть сообщение
ну хорошо, выкину я например P, а как же быть с последними цифрами?
X++:
modifSalesPickingListId = strRem(SalesPickingListJournalLine.PickingListId, 'P');
Хороший вопрос! Сорри, невнимательно просмотрел исходную строку и решил, что стояла задача избавиться от букв
Старый 28.06.2007, 17:34   #5  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Lemming Посмотреть сообщение
Хороший вопрос! Сорри, невнимательно просмотрел исходную строку и решил, что стояла задача избавиться от букв
Эх... хорошо бы только от букв.. А мне надо распилить получается нужно на две части, до буковки Р и после))
Старый 28.06.2007, 17:25   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Если речь идет о Ax4 я бы написал регулярное выражение
Старый 28.06.2007, 17:26   #7  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от belugin Посмотреть сообщение
Если речь идет о Ax4 я бы написал регулярное выражение
Нет.. тут всего лишь тройка
Старый 28.06.2007, 17:41   #8  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
А так не подойдет:
s - исходная строка
X++:
int pos = strfind(s, 'P',1, strlen(s));
str s1 = substr(s,1,pos-1);
str s2 = substr(s,pos+1, strlen(s)-pos-1);
От двух первых букв можно издавиться скажем с помощью strkeep, или отрезать 2 первых символа
Старый 28.06.2007, 18:24   #9  
Akinak is offline
Akinak
Участник
 
17 / 11 (1) +
Регистрация: 22.02.2007
X++:
//returns true if needed char found in _str
boolean IsStrOk(str 100 _str)
{
  if (strfind(_str,'0123456789/',1,strlen(_str)))
    return(true);
  else
    return(false);
}
 
While (Cnt <= strlen(str_to_parse))
{
  if ( IsStrOk(SubStr(str_to_parse,Cnt,1)))
  {
    str_to_receive = str_to_receive + SubStr(str_to_parse,Cnt,1);
    // здесь надо ставить break; на знак Р или любой другой закачивающий разбор строки.
  }
  Cnt++;
}
подойдет такой вариант?
З.Ы. переделано на скорую руку из старого проекта, прошу сильно не бить)

Последний раз редактировалось Akinak; 28.06.2007 в 18:34.
Старый 28.06.2007, 18:27   #10  
Zuzaz is offline
Zuzaz
Участник
 
119 / 18 (1) ++
Регистрация: 22.09.2006
Цитата:
Сообщение от fialka Посмотреть сообщение
Есть значение зк1234567/1P1,
как получить с этого значения 1234567/1,
то есть обрезать вначале буквы и в конце буквы и всё что после них?
Как часто случается, это задание недостаточно формализовано. Без уточнения ряда вопросов по формату номера предлагать варианты бесполезно:
1) вначале всегда идут буквы ? их всегда две, как в примере, или может быть любое число?
2) между начальным и конечным набором букв цифры всегда идут со слешем, или могут быть только цифры ? Могут ли вместо слеша быть и другие знаки, например тире или точка?
3) количество знаков между первым и конечным набором букв всегда одинаково, или может быть любым?
3) в конечном наборе буква всегда одна, или их может быть две и больше ?
4) в конечном наборе всегда идут буквы и потом цифры, или могут быть другие варианты (например, только буквы;буквы, цифры и снова буквы) ? Сколько цифр может быть после последней буквы ?
5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ?

Если подходить формально, решая задачу именно так, как она вами записана, то это так:
X++:
S2 = substr(S1,3,9)

Последний раз редактировалось Zuzaz; 28.06.2007 в 18:31.
Старый 28.06.2007, 18:37   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Zuzaz Посмотреть сообщение
5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ?
я бы к этому совершенно справедливому списку добавил еще пару оргвопросов:

6) задача разовая или постоянная? (честно говоря, если постоянная, то тогда, как поется в одной бардовской песне, "просто дыбом волоса" от проектирования...)
7) можно ли решить ее вне Аксапты (например, в Excel'е) ?

Цитата:
Сообщение от fialka Посмотреть сообщение
А мне надо распилить получается нужно на две части, до буковки Р и после))
А во как еще мона :
X++:
    [strDO, strPOSLE] = str2con_ru('зк1234567/1P1', 'P');
P.S. А еще вот так:
X++:
{
    str str0, strDO, strPOSLE;
;
    [strDO, strPOSLE] = str2con_ru( 'зк1234567/1P1', 'P' );
    [str0 , strDO   ] = str2con_ru( strDO          , 'зк');

    info(strDO + ' ---  ' + strPOSLE);
}

Последний раз редактировалось Gustav; 29.06.2007 в 08:52. Причина: добавил второй фрагмент кода
Старый 29.06.2007, 09:10   #12  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
[quote=Gustav;142376]я бы к этому совершенно справедливому списку добавил еще пару оргвопросов:

6) задача разовая или постоянная? (честно говоря, если постоянная, то тогда, как поется в одной бардовской песне, "просто дыбом волоса" от проектирования...)
7) можно ли решить ее вне Аксапты (например, в Excel'е) ?

quote]
задача постояная и решится должна только в АХ..
Старый 29.06.2007, 09:09   #13  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Zuzaz Посмотреть сообщение
Как часто случается, это задание недостаточно формализовано. Без уточнения ряда вопросов по формату номера предлагать варианты бесполезно:
1) вначале всегда идут буквы ? их всегда две, как в примере, или может быть любое число?
2) между начальным и конечным набором букв цифры всегда идут со слешем, или могут быть только цифры ? Могут ли вместо слеша быть и другие знаки, например тире или точка?
3) количество знаков между первым и конечным набором букв всегда одинаково, или может быть любым?
3) в конечном наборе буква всегда одна, или их может быть две и больше ?
4) в конечном наборе всегда идут буквы и потом цифры, или могут быть другие варианты (например, только буквы;буквы, цифры и снова буквы) ? Сколько цифр может быть после последней буквы ?
5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ?

Если подходить формально, решая задачу именно так, как она вами записана, то это так:

X++:
S2 = substr(S1,3,9)
1. вначале всегда идут буквы, неизвестно сколько их.
2. Далее идут цифры (тоже непонятно сколько ) разделение слеш и ещё несколько цифр... вот в первый заход их нужно получить.
3. Потом идёт буква Р после неё цифры. Второе значение у меня должно как раз ему равнятся...
то есть если первоначально было ППРРВ12345/45Р5,
то должно получится два значения: первое 12345/45 и второе 5
Старый 29.06.2007, 09:16   #14  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от fialka Посмотреть сообщение
то есть если первоначально было ППРРВ12345/45Р5,
то должно получится два значения: первое 12345/45 и второе 5
В таком случае нужно еще дописать, к указанному мной выше
X++:
s1 = strkeep(s1, '1234567890/');
И все долно получиться.

P.S. Согласен с Gustav, делить строку с помощью str2con_RU более оптимальный вариант
Старый 29.06.2007, 09:21   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
В таком случае нужно еще дописать, к указанному мной выше
X++:
s1 = strkeep(s1, '1234567890/');
И все долно получиться.
именно! уже тоже написал, поэтому опубликую:
X++:
[strDO, strPOSLE] = str2con_ru( 'зк1234567/1P1', 'P' );
strDO = strkeep( strDO, '1234567890/');
Старый 29.06.2007, 09:34   #16  
fialka is offline
fialka
Участник
 
347 / 16 (1) ++
Регистрация: 05.10.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Gustav Посмотреть сообщение
именно! уже тоже написал, поэтому опубликую:
X++:
[strDO, strPOSLE] = str2con_ru( 'зк1234567/1P1', 'P' );
strDO = strkeep( strDO, '1234567890/');
Спасибо.
а ещё маленький вопрос как впереди первого значения поставить "*" ?
то есть формируется у меня номер например накладной..
X++:
modifSalesPickingListId = strRem(SalesPickingListJournalTable.SalesId, 'зсчЗКП'); //обрезаем символы заказа и закупки
          modifSalesPickingListId = modifSalesPickingListId + '/' + pickingId;
должно в итоге получится *123456/1.
мне казалось , J - это '*', или я что-то путаю?

Последний раз редактировалось fialka; 29.06.2007 в 09:39.
Старый 28.06.2007, 18:30   #17  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Первое, что приходит на ум в конце рабочего дня — организовать цикл по строке с начала в конец, перебирая символы по одному. Запомнить позицию первого правильного, и первого неправильного, который следует после правильного. Потом вырезать подстроку. Функции для определения того, правильный символ или нет в Аксапте есть, и достаточно удобные.
__________________
С уважением,
glibs®
Старый 28.06.2007, 18:36   #18  
Zuzaz is offline
Zuzaz
Участник
 
119 / 18 (1) ++
Регистрация: 22.09.2006
Цитата:
Сообщение от glibs Посмотреть сообщение
Функции для определения того, правильный символ или нет в Аксапте есть, и достаточно удобные.
glibs, функции-то конечно есть, но для этого нужно четка знать критерии, которые этими функциями будут проверяться. Пока этого нет. Если формат четко такой, как в примере, т.е. 2 буквы вначале и затем 9 знаков номера, то и никакой перебор с проверками не нужен.
Старый 29.06.2007, 08:27   #19  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Может это поможет:
X++:
container str2con_MY(str _string, str _separator = ",", boolean _multiSeparator = False)
{
    container   con;
    int         pos, oldPos = 1;
    str         strTemp1;
    str         symbol;
    ;

    if(_multiSeparator)
    {
        do
        {
            symbol = subStr(_string, oldPos, 1);
            if(strfind(_separator,symbol,1,strlen(_separator)) || !symbol)
            {
                con += strTemp1;
                strTemp1 = "";
            }
            else
            {
                strTemp1 = strTemp1 + symbol;
            }

            oldPos++;
        }
        while (symbol);
    }
    else
    {
        do
        {
            pos    =  strScan(_string, _separator, pos ? pos + strLen(_separator) : 1, strLen(_string));
            con    += subStr(_string, oldPos, pos ? pos - oldPos : strLen(_string) + 1 - oldPos);
            oldPos =  pos + strLen(_separator);
        }
        while (pos);
    }
    return con;
}
В принципе это стандартная функция, но она позволяет указать несколько разделителей, по которым формируются элементы контейнера.
Пример вызова например так:
X++:
str2con_MY("зк1234567/1P1", "зк/P", True)
конечно проблемно выглядит разделитель "зк" но его можно отбросить с самого начала
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно получить значение с компонента формы Daido DAX: Программирование 5 05.11.2007 17:37
WebComboBox - как получить выбранное значение? egorych DAX: Программирование 8 17.10.2007 22:44
Получить значение поля таблицы по номеру (Id) поля Anais DAX: Программирование 2 15.04.2004 13:00
Как получить значение поля Datasource на динамически созданной форме? storer DAX: Программирование 2 14.11.2003 16:41
получить значение из SysQueryForm Дмитрий DAX: Программирование 4 16.08.2002 16:29
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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