На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! ПРАВИЛА РАЗДЕЛА
Прежде чем задать вопрос, зайдите в раздел FAQ, возможно там уже есть ответ на него.
Если вы хотите вставить код в сообщение, то пожалуйста выделяйте его тегом [code=dfp] ... [/сode].
Для этого используйте кнопку [code=dfp] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Delphi for PHP.
Модераторы: ViktorXP, vicis
  
> Работа с базами данных
    Подскажите, как узнать тип получаемых данных (тип поля)?

    У меня есть шаблон в котором есть мои внутренние теги заключенные в ~ (твидеры)
    Пример:
    <span class="textTitle">Цена:</span> <span class="textTitleBRed">~SUM_RES~ руб.</span> <span class="textTitle">Дата изменения:</span><span class="text"> ~LAST_UPDATE_DATE~</span><br>

    ~SUM_RES~ - имя поля
    В цикле - заменяю их на значение полей. Получаемые данные не совсем удовлетворяют требованиям.
    Т.е. сумма и дата не в нужном формате.
    Хочу предварительно получать тип данных, форматировать в нужный формат, а затем заполнять шаблон.
      тут есть два выхода:
      1) научить саму базу выдавать данные в нужном формате.
      2) использовать метаданные.

      первый не буду объяснять. (про формат много в справочной системе написано, но если не разберешься тогда пиши.)

      для второй нужно будет немного дописывать компонент (почему то разработчики vcl сделали на ее месте заглушку которая почти ничего не делает)
      я предположил что ты работает через MySql:
      1) открываем файл mysql.inс.php
      2) находим там код
      ExpandedWrap disabled
        class MySQLDatabase extends CustomConnection
        {
                public $_connection=null;
                protected $_debug=0;
                protected $_databasename="";
                protected $_host="";
                protected $_username="";
                protected $_userpassword="";
                protected $_connected="0";
                protected $_dictionary="";
                protected $_dictionaryproperties=false;
         
                function MetaFields($tablename)
                {
                    $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
         
                    $rs = $this->Execute(sprintf($metaColumnsSQL,$tablename));
                    $result=array();
                    while ($row=mysql_fetch_row($rs))
                    {
                        $result[$row[0]]='';
                    }
                    return($result);
                }

      3) функцию MetaFields немного дописываем
      ExpandedWrap disabled
                function MetaFields($tablename)
                {
                    $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
         
                    $rs = $this->Execute(sprintf($metaColumnsSQL,$tablename));
                    $result=array();
                    while ($row=mysql_fetch_row($rs))
                    {
                        $result[$row[0]]=array('type'=>$row[1]);
                    }
                    return($result);
                }

      4) сохраняем.

      теперь вот таким способом можно запросить данные для таблицы `user`
      ExpandedWrap disabled
        $MetaFields = $this->MySQLDatabase1->MetaFields('user');

      а вот таким образом можно вывести все поля+значения+тип поля таблицы `user`
      ExpandedWrap disabled
                $arr = $this->MySQLQuery1->Fields;
                reset($arr);
                while(list($Field, $value) = each($arr))
                {
                    echo "Field: $Field; Value: $value; Type: ".$MetaFields[$Field]['type']."<br>\n";
                }


      пс. рекомендовал бы первый способ.
        Цитата nstur @
        Подскажите, как узнать тип получаемых данных (тип поля)?

        У меня есть шаблон в котором есть мои внутренние теги заключенные в ~ (твидеры)
        Пример:
        <span class="textTitle">Цена:</span> <span class="textTitleBRed">~SUM_RES~ руб.</span> <span class="textTitle">Дата изменения:</span><span class="text"> ~LAST_UPDATE_DATE~</span><br>


        зачем для такого шаблона узнавать тип данных ?
        это лишнее действие...
        там же ясно написано - рубли
        это значит что выводить нужно рубли не зависимо от того что там в базе
        а при записи в базу нужно контролировать что бы туда текст левый (не рубли) не попал

        при этом лежать в базе может как угодно, а форматировать нужно на этапе вывода на экран
        при этом, например: количество знаков после запятой обычно может менятся как от отчёта так и от настроек всей системы
        бухгалтер обычно хочет видеть всё до копеек, а если округление, скидки, то и до 3-4 знаков после запятой
        но руководитель обычно с копейками не возится - давай целые
        не хранить же в базе в двух видах одно и тоже

        таким образом - компонент не стоит курочить ;)
        во всяком случае для этой задачи (чем меньше изменений в компонентах тем они совместимее)

        предлагаю для данного случая такие функции (хотя это уже чистый php)

        Цитата
        Для форматирования чисел типа float команда number_format
        Описание
        string number_format ( float $number [, int $decimals ] )
        string number_format ( float $number , int $decimals , string $dec_point , string $thousands_sep )
        number_format() возвращает отформатированное число number . Функция принимает один, два или четыре аргумента (не три):

        Если передан только один аргумент, number будет отформатирован без дробной части, но с запятой (",") между группами цифр по 3.

        Если переданы два аргумента, number будет отформатирован с decimals знаками после точки (".") и с запятой (",") между группами цифр по 3.

        Если переданы все четыре аргумента, number будет отформатирован с decimals знаками после точки и с разделитилем между группами цифр по 3, при этом в качестве десятичной точки будет использован dec_point , а в качестве разделителя групп - thousands_sep .

        Используется только первый символ строки thousands_sep . Например, при передаче foo в качестве thousands_sep для форматирования числа 1000, number_format() возвращает 1f000.

        Например: для того что бы вывести число с двумя знаками после запятой(здесь будет округление) и разделением между группами по три знака пробелами делаем так:
        ExpandedWrap disabled
          $xxx = 12345.678912;
          number_format($xxx,2,'.',' ');  // получим 12 345.68


        ещё есть floatval для преобразования строки
        пример:
        ExpandedWrap disabled
          <?php
          $var = '122.34343The';
          $float_value_of_var = floatval($var);
          echo $float_value_of_var; // 122.34343
          ?>
          Просто я переделываю программу на PHP - есть такая необходимость
          Дело в том, что шаблон и его содержимое будет меняться ($q1)
          И формат выводимых данных будет меняться в зависимости от 'имени' поля.
          ExpandedWrap disabled
              for ($k = 0; $k < $this->Pager1->RecordsPerPage; $k++)
              {
                       global $q1;
                       $tempstr = $q1
                       $fn = GetWith1On2($tempstr,False,'~~'); //метод ищет значения, заключенные в указанные символы
                       while (!empty($fn))
                       {
                         $tempstr = str_replace('~'.$fn.'~', $this->qty_fill_dbgrid->fieldget($fn), $tempstr);
                         $fn = GetWith1On2($tempstr,False,'~~');
                       }
                       $this->TextGrid->Caption = $this->TextGrid->Caption.$tempstr;
              ...
              }


          Если есть какие возможность о которых я не подозреваю, подскажите пожалуста...

          Думаю есть выход. Задавать в самом шаблоне тип данных и маску для форматирования.
            Цитата nstur @
            Думаю есть выход. Задавать в самом шаблоне тип данных и маску для форматирования.


            как вариант
            например:
            ~SUM_RES::float::2#.# ~
            (это для случая number_format ( $test , 2,'.',' ' ); )
            тогда можно вытащить значения так

            ExpandedWrap disabled
                  $templ_value = //сюда подставляем значение из поля базы данных
                  $templ_array = explode('::',$templ_value);
                  if ($templ_array[1]=='float')
                    {
                    $templ_format = explode('#',$templ_array[2]);
                    $this->Edit5->Text =number_format ( $templ_array[0] , $templ_format[0],$templ_format[1],$templ_format[2] );
                    }
                    else...
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0336 ]   [ 14 queries used ]   [ Generated: 12.05.24, 08:10 GMT ]