... {code} select a.nakme || ';' || 'Создан: ' || a.activate_date || ';' || h.city || ', ' || h.street || ', ' || h.s_number || ';' || t.name uf_ip2string(u.ip) from abonents a join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 join homes h on av_addr.attribute_value=h.id join tarif t on a.tarif_id=t.id where a.deleted=0 {code} Отчет не выполнится, разберём почему. h2. Отчет завершился ошибкой "Column unknown" Ошибка "Column unknown" говорит о том, что в структуре отчета Вы пытаетесь получить данные из несуществующей колонки. Причин может быть несколько. h3. Орфографическая ошибка h4. Ошибка в алиасах {code:title=Текст ошибки}Column unknown\n- AV.ABONENT_ID\n- At line 8, column 51{code} При соединении таблиц _abonents_ и _attribute_values_ мы дали им "алиасы", чтобы проще и короче писать наименования полей * _abonents_ - *a* * _attribute_values_ - *av_addr* Но при указании условий объединения таблиц, мы используем неправильный алиас для _attribute_values_ - *av* {code:title=Было}on a.id=av.abonent_id and av.attribute_id=3{code} Чтобы исправить, замените исправьте алиас: {code:title=Стало}on a.id=av_addr.abonent_id and av_addr.attribute_id=3 {code} h4. Ошибка в имени поля Так же ошибку вызовет поле *a.na{color:red}k{color}me* - в нем лишняя буква "k", правильно *a.name* {code:title=Было} select a.nakme || ';' || {code} {code:title=Стало} select a.name || ';' || {code} h3. Логическая - поля действительно не существует {code:title=Текст ошибки}Column unknown\n- U.IP\n- At line 6, column 20'{code} Исправив ошибку алиаса, мы получаем новую и тоже "Column unknown". Поле которое его вызвало - *u.ip*. Если посмотреть набор таблиц, которые мы объединяем, то таблицы учтены записей _users_ мы там не найдем. Для исправления присоедините эту таблицу: {code:title=Было} from abonents a join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 {code} {code:title=Стало} from abonents a join users u on a.id=u.abonent_id join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 {code} h2. Отчет завершился ошибкой "Token unknown" {code:title=Текст ошибки}Token unknown - line 6, column 17{code} Таблицу Users добавили, но опять ошибка в 6 строке. Проблему вызвало то, что после *t.name* пропущен операнд объединения строк *||* (или запятая, если строится для конструктора, а не для СОРМ). Исправим: {code:title=Было} t.name uf_ip2string(u.ip) {code} {code:title=Стало} t.name || ';' || uf_ip2string(u.ip) {code} h2. Отчет выполнился, но записи только "None" !sql_error_none.png|border=0,width=300! Если появляются записи "None", значит есть абоненты попадающие в выборку, но в каких-то полях нет значения - null, none. Для решения проблемы используйте конструкцю *coalesce*, задавая какое-то значение по-умолчанию, но предварительно преобразуем *a.activate_date* в строковый формат: {code:title=Было}'Создан: ' || a.activate_date || ';' ||{code} {code:title=Стало}'Создан: ' || coalesce(cast(a.activate_date as varchar(32)),'1970-01-01 00:00:01') || ';' ||{code} h2. Отчет завершился ошибкой "arithmetic exception, numeric overflow, or string truncation" Ошибка "_arithmetic exception, numeric overflow, or string truncation_" говорит о том, что мы пытамся производить операции над данными [разных типов|https://firebirdsql.org/manual/migration-mssql-data-types.html], что в ряде случаев пройдет успешно и СУБД произведёт конверсию автоматический, но не всегда. Если взять пример где все записи были "None" и убрать оттуда предварительную конверсию даты в строку, вот так: {code}'Создан: ' || coalesce(a.activate_date,'1970-01-01 00:00:01') || ';' ||{code} То мы получим эту ошибку. h2. В выгрузке нет ни одной записи !sql_error_empty.png|border=0,width=300! Причин может быть две: * По условиям запроса и правда нет данных * При объединении таблиц, в одной из них не оказалось искомых записей h3. По условиям запроса и правда нет данных Попробуйте взять контрольного абонента, в конец условий добавить его ID: {code}where a.deleted=0 and a.id=12345{code} И постепенно убирать дополнительные условия. h3. При объединении таблиц, в одной из них не оказалось искомых записей Попробуйте заменить объединения через JOIN на LEFT JOIN (о разницы между ними Вы можете почитать в [справке по оператору в Википедии|https://ru.wikipedia.org/wiki/Join_(SQL)]) {code:title=Было} join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 join homes h on av_addr.attribute_value=h.id {code} {code:title=Стало} left join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 left join homes h on av_addr.attribute_value=h.id {code} {info}Если данных в таблицах много, LEFT JOIN может существенно замедлить выполнение отчета.{info} h2. При выполнении отчета ошибка "not enough arguments for format string" Такая ошибка может возникнуть если Вы сделали отчет для выполнения в [конструкторе отчетов|CarbonBilling:Конструктор отчетов] и добавили в форму параметры для заполнения ("_Параметры полей формы_"), при этом где-то в отчете допущена ошибка - одна из выше описанных. Чтобы найти проблему: # Замените все _заполняемые_ параметры статическими, например: \\ \\ {code:title=Было}BILL_DATE between ':1-Начало|date$' and ':2-Конец|date$'{code} {code:title=Стало}BILL_DATE between '2019-10-01' and '2019-10-31'{code} \\ # Выполните отчет и в выводе будет описана настоящая ошибка. h2. Я не могу найти ошибку. Что делать? +Локализуйте проблему+. Максимально упростите запрос и постепенно добавляйте объединения таблиц, или наоборот - постепенно удаляйте поля из исходного запроса. Например # Упростите начальный запрос до такого: {code} select a.nakme from abonents a {code} Отчет завершится с ошибкой "_Column unknown_" - еще раз прочитав запроса вероятно станет понятно, что скорей всего поля "nakme" не существует и в нем лишний символ. # Исправив ошибку в поле a.name, добавьте еще +одно поле+ из исходного запроса: {code} select a.name || ';' || 'Создан: ' || a.activate_date || ';' || from abonents a {code} Отчет завершится ошибкой "Token unknown", так как последнее поле завершается [оператором объединения строк|https://firebirdsql.org/refdocs/langrefupd15-concat.html]. # Приведите отчет к рабочему виду: {code} select a.name || ';' || 'Создан: ' || a.activate_date from abonents a {code} В выводе будет множество полей "None". Причина - заведено множество еще не активированных абонентов + в вывод попали папки, когда хотели получить только абонентов. Исправьте: {code} select a.name || ';' || 'Создан: ' || coalesce(cast(a.activate_date as varchar(32)),'1970-01-01 00:00:01') from abonents a where a.is_folder=0 {code} И так далее, пока не восстановите полную структуру начального отчета.
|