forum.bitel.ru
http://forum.bitel.ru/

SQL-запрос в счете
http://forum.bitel.ru/viewtopic.php?f=14&t=6790
Страница 1 из 1

Автор:  stanislav [ 17 май 2012, 13:12 ]
Заголовок сообщения:  SQL-запрос в счете

Подскажите, пожалуйста, как вставить SQL-запрос в шаблон счета за услуги связи.
Нашел в WIKI следующее описание:
Объявляется расширение так:

<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:sql="bitel.billing.server.util.exslt.SQLQuery">
......
Используется так:

<xsl:variable name="query" select="'SELECT id, title FROM contract'"/>
<xsl:variable name="contracts" select="sql:select( $query )"/>

<xsl:for-each select="$contracts/row"/>
<xsl:value-of select="@id"/>
<xsl:value-of select="@title"/>
</xsl:for-each>

Этот запрос выводит данные по всем абонентам. Как изменить его, чтобы выводилось только для абонента которому создается счет? Что-то вроде SELECT id, title FROM contract WHERE id=xxxx.
Подскажите, что подставить вместо ****.

Автор:  skyb [ 17 май 2012, 13:25 ]
Заголовок сообщения:  Re: SQL-запрос в счете

а какие поля нада вывести?

Автор:  stanislav [ 17 май 2012, 13:47 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Мне нужно выводить детализацию МГ переговоров. Этот запрос я взял для примера из описания.

Автор:  skyb [ 18 май 2012, 05:09 ]
Заголовок сообщения:  Re: SQL-запрос в счете

нене, просто допустим есть поля которые можно получить не запросом, просто я не вкурсе как передать id в счет

Автор:  stanislav [ 18 май 2012, 12:39 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Мне нужно выводить поля: дата, номер абонента Б, длительность разговора. Все это находится в тблицах log_session_1_yyyymm. Если есть возможность извлечь эти данные без SQL-запроса, подскажите как.

Автор:  skyb [ 18 май 2012, 12:43 ]
Заголовок сообщения:  Re: SQL-запрос в счете

а, не, неть кажись :(

Автор:  focus [ 18 май 2012, 14:00 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Проверить у себя не могу, пока предположения.
XSL натравливается на XML, в котором информация о счете.
В xml счета есть вот такая информация (это вкратце, всякие атрибуты выкинул, чтобы не загромождать)
Код:
<?xml version="1.0" encoding="windows-1251"?>
<data secret="984BBF2483277311604E298D8DB8E12A" status="ok">
    <inline_params/>
    <bill account>
        <sub_bill cid="3"/>
        <sub_bill cid="4"/>
        <sub_bill cid="5"/>
        <contract_data cid="1">
    </bill account>
</data>


т.е добраться до идентификатора договора можно. Вопрос Вам нужен основной договор или субдоговоры ?
Если основной то, вот так можно попробовать

Код:
<!-- Так объявляем для себя переменную, куда будет сохраняться значения cid -->
<xsl:variable name="mycid" select="/data/bill/contract_data/@cid" />
<!-- Так передаем это значение в SQL запрос -->
<xsl:variable name="query">select id, title from contract where id=<xsl:value-of select="$mycid"/></xsl:variable>
<xsl:variable name="contracts" select="sql:select( $query )"/>
<!-- Перебираем строки запроса -->
<xsl:for-each select="$contracts/row">
<fo:block><xsl:value-of select="@id"/></fo:block>
<fo:block><xsl:value-of select="@title"/></fo:block>
</xsl:for-each>


Если вам нужны данные из log_session_1_.... то запрос модифицируем
Код:
.........
<!-- Так передаем это значение в SQL запрос -->
<xsl:variable name="query">select session_start, to_number_164, round_session_time from log_session_1_201204 where id=<xsl:value-of select="$mycid"/></xsl:variable>
.........


Нужно будет ещё динамически формировать имя таблички в зависимости от года и месяца.

Автор:  stanislav [ 18 май 2012, 15:04 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Большое спасибо за помощь. Ваше предположение полностью оправдалось.
Скажите еще, пожалуйста, как вы узнали, что переменная находится data/bill/contract_data/@cid

Автор:  focus [ 21 май 2012, 07:41 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Посмотрел сформированный xml счета.
XML можно посмотреть из клиентской части.
В 5.2 по крайней мере можно:
Заходим в модуль Bill, переходим к сформированным счетам. Делаем поиск какого-нибудь счета или выводим все счета за месяц, правой кнопкой на конкретном счете - "Просмотр". Откроется закладка с просмотром документов. Там есть кнопочка XML. И видим XML документа, на основании которого формируется счет.
Этот же xml есть в табличке bill_data_[mid].

Автор:  stanislav [ 22 май 2012, 12:09 ]
Заголовок сообщения:  Re: SQL-запрос в счете

У меня биллинг версии 4.6. Здесь тоже есть возможность просмотра XML.
Запись имеет вид <contract_data cid="6421">. 6421 соответствует id договора в базе данных.
Вопрос в том, как это переводится в переменную <xsl:variable name="mycid" select="/data/bill/contract_data/@cid"/>.

И еще, в моем шаблоне уже есть переменная <xsl:variable name="cid" select="/data/bill/@cid"/>.
Если в SQL использовать ее, получается тот же результат. Может быть и еще где-то есть.

Наверное где-то есть описание этих переменных?

Автор:  dimOn [ 22 май 2012, 12:58 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Вы же сами сказали что видите XML, там явно видно структуру XML и что cid берётся по xpath: /data/bill/contract_data/@cid. Это никакая не переменная, какое ещё описание нужно? Структуры XML? Всё вроде из семантики понятно…

Автор:  focus [ 23 май 2012, 14:01 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Цитата:
Вопрос в том, как это переводится в переменную <xsl:variable name="mycid" select="/data/bill/contract_data/@cid"/>.

dimOn писал(а):
cid берётся по xpath: /data/bill/contract_data/@cid.

т.е из xml с помощью XPath берем значение атрибута и запоминаем в переменную mycid.
Если в xsl уже есть переменная cid и "видна" (доступна) в том месте, где выполняется SQL запрос, то используем её.
Согласен с dimOn, что вроде интуитивно понятно из названий что к чему.

Автор:  stanislav [ 24 май 2012, 11:22 ]
Заголовок сообщения:  Re: SQL-запрос в счете

Вроде бы разобрался. Еще раз большое спасибо за помощь.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/