Текущее время: Вт, июл 29 2025, 13:01

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: PDF. Программный код для декодировки количества страниц в формуляре.
СообщениеДобавлено: Чт, авг 09 2012, 11:05 
Начинающий
Начинающий

Зарегистрирован:
Чт, авг 09 2012, 10:53
Сообщения: 4
В SMARTFORMS был создан элемент логика выполнения-> строка программы , который декодировал в текст количество страниц в формуляре.
CASE sfsy-jobpages.
WHEN '1'. W_PCNT = 'Одном'.
WHEN '2'. W_PCNT = 'Двух'.
WHEN '3'. W_PCNT = 'Трех'.
WHEN '4'. W_PCNT = 'Четырех'.
WHEN '5'. W_PCNT = 'Пяти'.
WHEN '6'. W_PCNT = 'Шести'.
ENDCASE.
Получалось например: Товарная накладная имеет приложение на двух листах.

Перевожу формуляр в PDF, нужно получить то же самое. Подскажите пожалуйста где и как вставить этот код? И если не ошибаюсь, то обращение к системным переменным в PDF тоже изменилось.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: PDF. Программный код для декодировки количества страниц в формуляре.
СообщениеДобавлено: Чт, авг 09 2012, 16:51 
Специалист
Специалист

Зарегистрирован:
Чт, ноя 23 2006, 17:37
Сообщения: 197
Откуда: Москва
Пол: Мужской
В формуляре в узле Variables создаете объект типа Script Object. Обзываете его, для единообразия, speller.
Далее открываете формуляр J_3R_INV1_CONTEXT, Layout, находите в иерархии узлов Variables тот самый speller, копируете исходный код к себе в объект (язык JavaScript!!!)
Далее, в кодировке события layout.ready поля, содержащего требуемый текст, прописываете код (язык JavaScript!!!)
Code:
var pages = xfa.layout.pageCount();
this.rawValue = speller.spellWordsOf(pages, 1);

Пояснения: для форматирования выводимых числительных их требуется подправить в кодировке объекта speller. По умолчанию, числительные написаны в им. падеже и ПРОПИСНЫМИ.
Все куски кода, использующие кодировку из Script Object должны быть на JavaScript, т.к. сама кодировка объекта на том же языке.

Вроде, всё, если чего забыл, спрашивайте, уточняйте, дополняйте.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: PDF. Программный код для декодировки количества страниц в формуляре.
СообщениеДобавлено: Вт, авг 14 2012, 08:02 
Начинающий
Начинающий

Зарегистрирован:
Чт, авг 09 2012, 10:53
Сообщения: 4
Доброе утро, Paul_80, спасибо за ответ.
В нашей системе, к сожалению, формуляра J_3R_INV1_CONTEXT нет (
В своем формуляре создала узел Variables, создала объект типа Script Object. Не могу найти каким образом вставить в этот объект код. И еще не понимаю, как привязать этот узел Variables к моему полю, где должен отображаться этот текст.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: PDF. Программный код для декодировки количества страниц в формуляре.
СообщениеДобавлено: Вт, авг 14 2012, 09:14 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, апр 17 2006, 21:49
Сообщения: 299
Откуда: Москва
lumca написал(а):
Доброе утро, Paul_80, спасибо за ответ.
В нашей системе, к сожалению, формуляра J_3R_INV1_CONTEXT нет (

Code:
data.#variables[0].speller - (JavaScript, client)
var _Digits = new Array( "НОЛЬ", "ОДИН", "ДВА", "ТРИ", "ЧЕТЫРЕ", "ПЯТЬ", "ШЕСТЬ", "СЕМЬ", "ВОСЕМЬ", "ДЕВЯТЬ" );
var _HigherDigits = new Array( "НОЛЬ", "ОДНА", "ДВЕ", "ТРИ", "ЧЕТЫРЕ", "ПЯТЬ", "ШЕСТЬ", "СЕМЬ", "ВОСЕМЬ", "ДЕВЯТЬ" ); // in case of thousands the 1 and the 2
                  //   at the following numbers is different: 1,2,21,22,31,32,41,42,51,52,61,62,71,72
var _FromTenToTwenty = new Array( "ДЕСЯТЬ", "ОДИННАДЦАТЬ", "ДВЕНАДЦАТЬ", "ТРИНАДЦАТЬ", "ЧЕТЫРНАДЦАТЬ", "ПЯТНАДЦАТЬ", "ШЕСТНАДЦАТЬ", "СЕМНАДЦАТЬ", "ВОСЕМНАДЦАТЬ", "ДЕВЯТНАДЦАТЬ" );
var _Tens = new Array( "-", "ДЕСЯТЬ", "ДВАДЦАТЬ", "ТРИДЦАТЬ", "СОРОК", "ПЯТЬДЕСЯТ", "ШЕСТЬДЕСЯТ", "СЕМЬДЕСЯТ", "ВОСЕМЬДЕСЯТ", "ДЕВЯНОСТО" );
var _Hundreds = new Array( "-", "СТО", "ДВЕСТИ", "ТРИСТА", "ЧЕТЫРЕСТА", "ПЯТЬСОТ", "ШЕСТЬСОТ", "СЕМЬСОТ", "ВОСЕМЬСОТ", "ДЕВЯТЬСОТ", "ТЫСЯЧА" );
var _Thousands = new Array("ТЫСЯЧА", "ТЫСЯЧИ", "ТЫСЯЧ");       // thousands ending with 1:_Thousands[0], with 2-4: _Thousands[1], with 0, 5-9 and 10-19: _Thousands[2]
var _Millions = new Array("МИЛЛИОН", "МИЛЛИОНА", "МИЛЛИОНОВ");       // millions  ending with 1:_Millios[0],   with 2-4: _Millios[1],   with 0, 5-9 and 10-19: _Millios[2]
var _Billions = new Array("МИЛЛИАРД", "МИЛЛИАРДА", "МИЛЛИАРДОВ");    // billions  ending with 1:_Billions[0],  with 2-4: _Billions[1],  with 0, 5-9 and 10-19: _Billions[2]
var _Trillions = new Array("ТРИЛЛИОН", "ТРИЛЛИОНА", "ТРИЛЛИОНОВ");    // trillions ending with 1:_Trillions[0], with 2-4: _Trillions[1], with 0, 5-9 and 10-19: _Trillions[2]
      
      // Remove the trailing space from a string, if any
      function removeLastSpace( str )   
      {
         var result = new String();
         result = str.toString();
         if( result.charAt(result.length - 1) - 1 )
            result = result.substr(0, result.length - 1);
         return result;
      }
      
      // Function to determine which word to take from Thousands, millions, Billions and Trillions
      function determineConjugation( number )
      {   
         var chunk_digit =  number % 10;
         var chunk_ten = parseInt((number % 100) / 10);

         if(chunk_ten == 1){
            // number ends with a number between 10 and 19
            return 2;
         }
         else{
            if(chunk_digit == 1){
               // number ends with 1
               return 0;
            }
            else if(chunk_digit >= 2 && chunk_digit <= 4){
               // number ends with 2, 3, or 4
               return 1;
            }
            else if(chunk_digit >= 5 && chunk_digit <= 9){
               // number ends with 5, 6, 7, 8 or 9
               return 2;
            }
            else if(chunk_digit == 0){
               return 2;

            }

         }      
      }
      
      // Function that spells a number into words
      function spellWordsOf( amount, checkEnding)
      {
         
         amount = parseInt(amount);      
         if (isNaN(amount)) return "";
         
         checkEnding = parseInt(checkEnding);
         if (isNaN(checkEnding)) checkEnding = 0;
         
         var different = 0;
         var sb = new String();
         var amountString = new String();
         amountString = "" + amount;

             var amount_Digits =  new Array();
             var amountDigitValues = new Array();
             for(var i = 0; i < amountString.length; i++ ) {
            amount_Digits[i] = amountString.charAt(i);
            amountDigitValues[i] = 0;
         }
         
         // If only a single digit, go back quickly
         if (amount < 10 && amount > -10)
         {
            if(amount < 0)
            {
               sb += "Minus ";
               amount = -amount;
            }
            if(checkEnding == 1){ // && different == 1
               sb += ( _HigherDigits[amount] );
            }
            else{
               sb += ( _Digits[amount] ); // Append prefix
            }

            //sb += (_Digits[amount]);
            
            return sb;

         }

             // Loop through _Digits from most to least significant          
         for(var i = 0; i < amount_Digits.length; i++)
         {

            if( amount_Digits[i] != '-' ) amountDigitValues[i] = parseInt(amount_Digits[i]);
            var offset = amount_Digits.length - i - 1;
            
            // If Negative sign
            if( amount_Digits[i] == '-' )
               sb += ("Minus ");
            else if(checkEnding == 1 && amount_Digits.length >= 2 && i == (amount_Digits.length - 2) && amountDigitValues[i] == 0 ){
               // if at decimal point for the 10 thousand the value is 0, the 1 and 2 at the decimal point for the thousands is different in certain cases
               different = 1;
            }
            else if(amountDigitValues[i] > 0)
            {
               // For Trillios, Billions, Millions and Thousands.
               if(offset > 2)
               {
                  var nextOffset = offset - (offset % 3);

                  var chunk = amountString.substring(i, amount_Digits.length - nextOffset);
                  i = amount_Digits.length - nextOffset - 1;
                  var digitOffset = parseInt((offset / 3));
                  
                  if(offset >= 3 && offset <= 5){
                     // in case of thousands the ending of 1 and 2 is different in certain cases
                     sb += ( spellWordsOf( chunk, 1 ) );
                  }
                  else{
                     sb += ( spellWordsOf( chunk, 0 ) );
                  }
                  sb += (" ");                  
                  switch(digitOffset){

                     case 0:
                        // hundreds
                        sb += _Hundreds[determineConjugation(parseInt(chunk))];
                        break;
                     case 1:
                        // thousands                                             
                        sb += _Thousands[determineConjugation(parseInt(chunk))];
                        break;
                     case 2:
                        // millons
                        sb += _Millions[determineConjugation(parseInt(chunk))];
                        break;
                     case 3:
                        // billions
                        sb += _Billions[determineConjugation(parseInt(chunk))];
                        break;
                     case 4:
                        // trillions
                        sb += _Trillions[determineConjugation(parseInt(chunk))];
                        break;
                  }   
                  sb += (" ");
               }

               else if(offset == 2) // hundreds
               {
                  sb += _Hundreds[amountDigitValues[i]];
                  sb += (" ");
               }
               else if(offset == 1) // Tens
               {
                  if(amountDigitValues[i] == 1) // From ten to twenty
                  {
                     amountDigitValues[i + 1] = parseInt(amount_Digits[i + 1]);
                     sb += ( _FromTenToTwenty[ amountDigitValues[i + 1] ] );
                     sb += (" ");
                     i++;
                  }
                  else
                  {
                     if(checkEnding == 1){                                    
                        switch (amountDigitValues[i]){
                           case 2:
                           case 3:
                           case 4:
                           case 5:
                           case 6:
                           case 7:
                           case 8:
                           case 9:                           
                                 different = 1;
                                 break;
                           case 1:
                                 different = 0;
                                 break;
                        }
                     }
                     sb += ( _Tens[ amountDigitValues[i] ] ); // Append prefix
                     sb += (" ");
                  }
               }
               else if(offset == 0) // Solo Digits
               {
                  if(checkEnding == 1 && different == 1){
                     sb += ( _HigherDigits[ amountDigitValues[i] ] );
                  }
                  else{
                     sb += ( _Digits[ amountDigitValues[i] ] ); // Append prefix
                  }
                  sb += (" ");
               }

            } // end else digit not 0

         } // end for loop on Digits
         
         return removeLastSpace(sb);

      }

lumca написал(а):
В своем формуляре создала узел Variables, создала объект типа Script Object. Не могу найти каким образом вставить в этот объект код.

Выберите объект, в меню Palettes выберите Script Editor, увидите область ввода, выберите в опции Language язык JavaScript
lumca написал(а):
И еще не понимаю, как привязать этот узел Variables к моему полю, где должен отображаться этот текст.

там же в области ввода кода, надо ввести наподобие:
Code:
this.rawValue = speller.spellWordsOf(total_amount, 0);


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: PDF. Программный код для декодировки количества страниц в формуляре.
СообщениеДобавлено: Пт, ноя 23 2012, 07:00 
Начинающий
Начинающий

Зарегистрирован:
Чт, авг 09 2012, 10:53
Сообщения: 4
Спасибо, ввести код и привязать к текстовому полю получилось. Теперь другой вопрос)
Если я правильно поняла, то эта функция переводит число в текст. У меня всегда теперь печатается " Minus ОДНА", независимо от количества страниц. А как получить из формуляра число страниц формуляра, системную переменную sfsy-jobpages.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: PDF. Программный код для декодировки количества страниц в формуляре.
СообщениеДобавлено: Пт, ноя 23 2012, 09:18 
Начинающий
Начинающий

Зарегистрирован:
Чт, авг 09 2012, 10:53
Сообщения: 4
Ой, простите, разобралась, я не в том событии присвоение для поля писала. Разобралась, получилось, спасибо)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB