AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 28.06.2007, 17:13   #1  
fialka ist offline
fialka
Участник
 
347 / 16 (1) ++
Registriert seit: 05.10.2006
Ort: Екатеринбург
? как получить нужное значение из такого ?
Есть значение зк1234567/1P1,
как получить с этого значения 1234567/1,
то есть обрезать вначале буквы и в конце буквы и всё что после них?
Alt 28.06.2007, 17:21   #2  
Lemming ist offline
Lemming
Участник
Benutzerbild von Lemming
 
1.144 / 343 (14) ++++++
Registriert seit: 20.04.2004
Ort: Москва, Чайнатаун в Люблино
Blog-Einträge: 10
Я бы, наверное воспользовался str StrRem (str text1,str text2) (описание есть в SystemDocumentation/Functions)
Alt 28.06.2007, 17:22   #3  
fialka ist offline
fialka
Участник
 
347 / 16 (1) ++
Registriert seit: 05.10.2006
Ort: Екатеринбург
Zitat:
Zitat von Lemming Beitrag anzeigen
Я бы, наверное воспользовался str StrRem (str text1,str text2)
ну хорошо, выкину я например P, а как же быть с последними цифрами?
X++:
modifSalesPickingListId = strRem(SalesPickingListJournalLine.PickingListId, 'P');
Alt 28.06.2007, 17:25   #4  
belugin ist offline
belugin
Участник
Benutzerbild von belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.622 / 2925 (107) +++++++++
Registriert seit: 16.01.2004
Blog-Einträge: 5
Если речь идет о Ax4 я бы написал регулярное выражение
Alt 28.06.2007, 17:26   #5  
fialka ist offline
fialka
Участник
 
347 / 16 (1) ++
Registriert seit: 05.10.2006
Ort: Екатеринбург
Zitat:
Zitat von belugin Beitrag anzeigen
Если речь идет о Ax4 я бы написал регулярное выражение
Нет.. тут всего лишь тройка
Alt 28.06.2007, 17:31   #6  
Lemming ist offline
Lemming
Участник
Benutzerbild von Lemming
 
1.144 / 343 (14) ++++++
Registriert seit: 20.04.2004
Ort: Москва, Чайнатаун в Люблино
Blog-Einträge: 10
Zitat:
Zitat von fialka Beitrag anzeigen
ну хорошо, выкину я например P, а как же быть с последними цифрами?
X++:
modifSalesPickingListId = strRem(SalesPickingListJournalLine.PickingListId, 'P');
Хороший вопрос! Сорри, невнимательно просмотрел исходную строку и решил, что стояла задача избавиться от букв
Alt 28.06.2007, 17:34   #7  
fialka ist offline
fialka
Участник
 
347 / 16 (1) ++
Registriert seit: 05.10.2006
Ort: Екатеринбург
Zitat:
Zitat von Lemming Beitrag anzeigen
Хороший вопрос! Сорри, невнимательно просмотрел исходную строку и решил, что стояла задача избавиться от букв
Эх... хорошо бы только от букв.. А мне надо распилить получается нужно на две части, до буковки Р и после))
Alt 28.06.2007, 17:41   #8  
Lucky13 ist offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Registriert seit: 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 первых символа
Alt 28.06.2007, 18:24   #9  
Akinak ist offline
Akinak
Участник
 
17 / 11 (1) +
Registriert seit: 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++;
}
подойдет такой вариант?
З.Ы. переделано на скорую руку из старого проекта, прошу сильно не бить)

Geändert von Akinak (28.06.2007 um 18:34 Uhr)
Alt 28.06.2007, 18:27   #10  
Zuzaz ist offline
Zuzaz
Участник
 
119 / 18 (1) ++
Registriert seit: 22.09.2006
Zitat:
Zitat von fialka Beitrag anzeigen
Есть значение зк1234567/1P1,
как получить с этого значения 1234567/1,
то есть обрезать вначале буквы и в конце буквы и всё что после них?
Как часто случается, это задание недостаточно формализовано. Без уточнения ряда вопросов по формату номера предлагать варианты бесполезно:
1) вначале всегда идут буквы ? их всегда две, как в примере, или может быть любое число?
2) между начальным и конечным набором букв цифры всегда идут со слешем, или могут быть только цифры ? Могут ли вместо слеша быть и другие знаки, например тире или точка?
3) количество знаков между первым и конечным набором букв всегда одинаково, или может быть любым?
3) в конечном наборе буква всегда одна, или их может быть две и больше ?
4) в конечном наборе всегда идут буквы и потом цифры, или могут быть другие варианты (например, только буквы;буквы, цифры и снова буквы) ? Сколько цифр может быть после последней буквы ?
5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ?

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

Geändert von Zuzaz (28.06.2007 um 18:31 Uhr)
Alt 28.06.2007, 18:30   #11  
glibs ist offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4.942 / 911 (40) +++++++
Registriert seit: 10.06.2002
Ort: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Первое, что приходит на ум в конце рабочего дня — организовать цикл по строке с начала в конец, перебирая символы по одному. Запомнить позицию первого правильного, и первого неправильного, который следует после правильного. Потом вырезать подстроку. Функции для определения того, правильный символ или нет в Аксапте есть, и достаточно удобные.
__________________
С уважением,
glibs®
Alt 28.06.2007, 18:36   #12  
Zuzaz ist offline
Zuzaz
Участник
 
119 / 18 (1) ++
Registriert seit: 22.09.2006
Zitat:
Zitat von glibs Beitrag anzeigen
Функции для определения того, правильный символ или нет в Аксапте есть, и достаточно удобные.
glibs, функции-то конечно есть, но для этого нужно четка знать критерии, которые этими функциями будут проверяться. Пока этого нет. Если формат четко такой, как в примере, т.е. 2 буквы вначале и затем 9 знаков номера, то и никакой перебор с проверками не нужен.
Alt 28.06.2007, 18:37   #13  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von Zuzaz Beitrag anzeigen
5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ?
я бы к этому совершенно справедливому списку добавил еще пару оргвопросов:

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

Zitat:
Zitat von fialka Beitrag anzeigen
А мне надо распилить получается нужно на две части, до буковки Р и после))
А во как еще мона :
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);
}

Geändert von Gustav (29.06.2007 um 08:52 Uhr) Grund: добавил второй фрагмент кода
Alt 29.06.2007, 08:27   #14  
blokva ist offline
blokva
Пенсионер
Benutzerbild von blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Registriert seit: 04.06.2003
Ort: Беларусь
Может это поможет:
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/
Alt 29.06.2007, 09:09   #15  
fialka ist offline
fialka
Участник
 
347 / 16 (1) ++
Registriert seit: 05.10.2006
Ort: Екатеринбург
Zitat:
Zitat von Zuzaz Beitrag anzeigen
Как часто случается, это задание недостаточно формализовано. Без уточнения ряда вопросов по формату номера предлагать варианты бесполезно:
1) вначале всегда идут буквы ? их всегда две, как в примере, или может быть любое число?
2) между начальным и конечным набором букв цифры всегда идут со слешем, или могут быть только цифры ? Могут ли вместо слеша быть и другие знаки, например тире или точка?
3) количество знаков между первым и конечным набором букв всегда одинаково, или может быть любым?
3) в конечном наборе буква всегда одна, или их может быть две и больше ?
4) в конечном наборе всегда идут буквы и потом цифры, или могут быть другие варианты (например, только буквы;буквы, цифры и снова буквы) ? Сколько цифр может быть после последней буквы ?
5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ?

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

X++:
S2 = substr(S1,3,9)
1. вначале всегда идут буквы, неизвестно сколько их.
2. Далее идут цифры (тоже непонятно сколько ) разделение слеш и ещё несколько цифр... вот в первый заход их нужно получить.
3. Потом идёт буква Р после неё цифры. Второе значение у меня должно как раз ему равнятся...
то есть если первоначально было ППРРВ12345/45Р5,
то должно получится два значения: первое 12345/45 и второе 5
Alt 29.06.2007, 09:10   #16  
fialka ist offline
fialka
Участник
 
347 / 16 (1) ++
Registriert seit: 05.10.2006
Ort: Екатеринбург
[quote=Gustav;142376]я бы к этому совершенно справедливому списку добавил еще пару оргвопросов:

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

quote]
задача постояная и решится должна только в АХ..
Alt 29.06.2007, 09:16   #17  
Lucky13 ist offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Registriert seit: 21.10.2004
Zitat:
Zitat von fialka Beitrag anzeigen
то есть если первоначально было ППРРВ12345/45Р5,
то должно получится два значения: первое 12345/45 и второе 5
В таком случае нужно еще дописать, к указанному мной выше
X++:
s1 = strkeep(s1, '1234567890/');
И все долно получиться.

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

Geändert von fialka (29.06.2007 um 09:39 Uhr)
Alt 29.06.2007, 09:42   #20  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von fialka Beitrag anzeigen
а ещё маленький вопрос как впереди первого значения поставить "*" ?
так?
X++:
strDO = '*' + strDO;
Stichworte
ax3.0

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Как правильно получить значение с компонента формы 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 20:37 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.