26

(43 replies, posted in Russian)

sibprogsistem wrote:

да, так мы берем id записи выделенной в таблице..
это называется "Конкатена́ция" - склеивание строк пишется через '  ' так используются два разных (обработчика) а с помощью + происходит склеивание строк..  в общем так мы добавляем текст из переменной...

если Вам нужно отобразить дату в tablegrid есть два варианта
1.   tab1 -- tab2 -- tab3 чтобы вывести информация всех трех таблиц ...... в 1-м условии настройки таблицы нужно выбрать таблицу tab2..
2.  tab1 -- tab2 -- tab3-- tab4  в этом случае без SQL запроса не получиться..
если вам нужно отобразить отфильтрованную дату в таблице то без запроса не получиться..

Спасибо! Теперь понятно!
С отфильтрованной датой для отображения в таблице пока решил оставить вычисляемое поле, а вот для форм использую скрипт, чтобы оперативно данные менялись.

27

(43 replies, posted in Russian)

sibprogsistem wrote:

ок

Действительно, заработало! Большое спасибо!
При использовании вычисляемого поля, я писал:
WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks и это работало
А в скрипте эта строка не работала и вы предложили писать вместо нее:
statuses_etalon_ks.id_card_etalon_ks = '+ FrmEquipment_KS.TableGrid1.sqlValue +'.
А что означает эта фраза '+ ........sqlValue +' ? Получение номера id открываемой записи получается? А для чего в этом случае одинарные кавычки, знаки плюсов?
Скажите, как в случае использования скриптов вместо вычисляемых полей, отобразить в таблице card полученную дату? Мне бы не хотелось создавать еще одно поле для хранения этой даты в таблице card, потому вычисляемое поле как временный параметр подходил для этих целей. Жаль, оно не обновляется сразу

Если вы не против, в будущем воспользуюсь вашим примером для демонстрации еще некоторых затруднений в реализации вычислений.

28

(43 replies, posted in Russian)

Добавил условие с таблицей card и появилась ошибка SQL запроса

29

(43 replies, posted in Russian)

Скорректировал ваш проект, добавив еще одну таблицу и пару форм, чтобы стало понятно, чего я хочу добиться.
На форме FrmCard я хотел бы отобразить макс дату статуса с id статуса равной 1. И так для каждой строки таблицы Card, которые отображаю на форме FrmCard_full.

30

(43 replies, posted in Russian)

sibprogsistem wrote:

внешний ключ (organization_atalon.id_name_status_etalon) имеет те жи идентификаторы что и name_status_etalon.id
Вы точно знаете что name_status_etalon.id =1
то есть записать можно так  (organization_atalon.id_name_status_etalon=1)
---
Вам нужно вывести последнюю дату (из Вашего же запроса) в компонент Edit..
 
Примерно будет так, без проекта не могу точно написать

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM statuses_etalon_ks LEFT OUTER JOIN organization_attribute_etalon ON statuses_etalon_ks.id_organization_attribute_etalon = organization_attribute_etalon.id WHERE organization_atalon.id_name_status_etalon=1 ORDER BY date_status DESC LIMIT 1);

Без дополнения после WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks он выдает мне максимальную дату среди всех card_etalon_ks, а мне нужна максимальная дата для конкретной строки таблицы card_etalon_ks, потому добавляется данная строчка, но именно на нее и ругается программа после внесения изменений в таблице statuses_etalon_ks.
В работе вычисляемого поля нет проблем при таком написании, а в скрипте есть.
Видимо от того, что таблица card не связана напрямую с таблицей statuses возникает такая ошибка в скрипте, иначе я не понимаю, что не нравится программе в таком написании.

Вычисляемое поле выглядит сейчас с вашим сокращением вот так:
SELECT date (date_status)
FROM statuses_etalon_ks 
INNER JOIN organization_attribute_etalon ON organization_attribute_etalon.id = statuses_etalon_ks.id_organization_attribute_etalon
WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks AND organization_attribute_etalon.id_name_status_etalon_ks = 1
ORDER BY date_status DESC LIMIT 1

31

(43 replies, posted in Russian)

CDB wrote:

Причиной двойных кавычек является то, как MVD представляет все операторы SQL внутри. Это правда, что вам не нужно представлять их при использовании сценария.


Однако предоставленные мною фрагменты кода - это действующие фрагменты кода из моего текущего проекта.


Inilka, было бы полезно, если бы вы могли опубликовать фактический текст ошибки или изображение полученного вами текста ошибки.
Я упустил тот факт, что вы пытаетесь использовать вычисляемое поле.



The reason for double quotes is this is how MVD represents all the SQL statements inside. It is true that you do not need to represent them this way when using the script.


However, the code snippets I provided are valid code snippets from my current project.


Inilka, it would be helpful if you could either post the actual error text or a picture of the error text that you are getting.
I missed the fact that you are trying to use a calculated field.


Using Google translate.

Вот здесь я приложил файл с ошибкой. http://myvisualdatabase.com/forum/viewt … 281#p37281
Вычисляемое поле с этим же запросом SQL такой ошибки не выдает. А скрипт выдает.

32

(43 replies, posted in Russian)

sibprogsistem wrote:

интересно... Вы пытаетесь объединить 2-е таблицы statuses_etalon_ks - name_status_etalon_ks но в условии их объединения третья таблица organization_attribute_etalon ...
WHERE "card_etalon_ks".id - Вы пытаетесь получить условие где таблица card_etalon_ks, но она в роди как в данном
случае не имеет отношения к запросу..
зачем ковычки " "?
   
можно по подробнее, что Вы пытаетесь сделать?

Вот здесь я описал, что хочу реализовать и приложил фото куска своей базы http://myvisualdatabase.com/forum/viewt … 82#p37082.
Я хочу на форме, где расположены элементы таблицы Card_etalon отобразить п.1 своего запроса - последнюю дату (хранится в таблице statuses_etalon_ks) статуса (name_status_etalon_ks) с id=1.
Промежуточная таблица organization_attribute_etalon.
Двойные кавычки я использовал из примеры выше, что мне был предложен как вариант решения, но видимо дело не в них.
Вычисляемое поле с таким запросом работает, а вот скрипт нет. Я бы с радостью оставил вычисляемое поле с этим запросом, но оно не обновляется сразу после внесения изменений в таблицу statuses_etalon_ks, где я изменяю дату, а обновляется лишь как только закрываю и открываю вновь форму.

33

(43 replies, posted in Russian)

Пробовал вот так:

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT "1"');  

и вот так:

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = "1" ORDER BY "date_status" DESC LIMIT "1"');  
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = "1" ORDER BY "date_status" DESC LIMIT 1');  
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT 1');  

Все равно, не работает.

Ему не нравится запись "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks".
Без нее во всех card_etalon_ks появляется дата одного из них

34

(43 replies, posted in Russian)

Спасибо! Увы, но не помогло. Видимо я не так кавычки располагаю:
Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = 1 ORDER BY "date_status" DESC LIMIT 1');
Ошибка возникает, когда я открываю вкладку с этим полем.

35

(43 replies, posted in Russian)

Нашел ответ на свой первый вопрос, создав запрос для вычисляемого поля, которое работает. Для первого статуса это:
SELECT date_status
FROM statuses_etalon_ks
INNER JOIN name_status_etalon_ks ON name_status_etalon_ks.id = organization_attribute_etalon.id_name_status_etalon_ks
INNER JOIN organization_attribute_etalon ON organization_attribute_etalon.id = statuses_etalon_ks.id_organization_attribute_etalon
WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks AND name_status_etalon_ks.id = 1
ORDER BY date_status DESC LIMIT 1

Решил перевести этот запрос в скрипт, но он выдает ошибку при открытии вкладки, на которой отображается Edit13. Не могу понять, что тут в синтаксисе не так. Помогите.
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM statuses_etalon_ks
    INNER JOIN name_status_etalon_ks ON name_status_etalon_ks.id = organization_attribute_etalon.id_name_status_etalon_ks
    INNER JOIN organization_attribute_etalon ON organization_attribute_etalon.id = statuses_etalon_ks.id_organization_attribute_etalon
    WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks AND name_status_etalon_ks.id = 1
    ORDER BY date_status DESC LIMIT 1');

Скажите, где можно более подробно прочитать про синтаксис SQLexecute?

Большое спасибо, sibprogsistem! Буду разбирать ваш скрипт, чтобы адаптировать для своего варианта!

sibprogsistem wrote:

Когда у Вас открывается форма, Вы получаете результат в вычисляемом поле, то есть ( у Вас уже есть этот скрипт)
после того как Вы внесли новую запись Вам нужно повторить этот скрипт...
 
что именно Вы вычисляете...?
прикрепите проект

Скорректировал предыдущее сообщение, добавив пример.

sibprogsistem wrote:
Inkalika wrote:

Дело в том, что этого компонента у меня нет в таблице - он отображается в компоненте Edit на самой форме, только на другой вкладке (изменения же происходят в вычисл. поле, когда меняются данные на другой вкладке),  потому обновление тут таблицы не подходит - тоже думал так попробовать, но не сработало

при каких условиях происходит изменение записи
поле этого условия используйте:

Form1.edit1.Text:=SQLExecute('SELECT ваше_поле FROM ваша_таблица WHERE id= идентификатор записи');

Т.е. вы предалагаете не использовать вычисляемое поле, а скриптом этот компонент создавать?
Получается, я удаляю вычисляемое поле и заполняю его запросом БД?
В моем случае не текст, а дата/время.

Приложил пример.
На вкладке 2 формы Forma1 я добавляю дату/время, а при переходе на вкладку 1 предполагалось, что в вычисляемом поле отобразиться самая большая дата/время, но это поле заполняется лишь при закрытии формы, потому вижу я новое значение вычисл. поля лишь при новом открытии, что не совсем удобно.

Дело в том, что этого компонента у меня нет в таблице - он отображается в компоненте Edit на самой форме, только на другой вкладке (изменения же происходят в вычисл. поле, когда меняются данные на другой вкладке),  потому обновление тут таблицы не подходит - тоже думал так попробовать, но не сработало

Скажите, в справочнике написано про Вычисл. поле следующее "с его помощью можно вычислить необходимое значение на основе данных в текущей таблице, либо даже на основе данных из других таблиц. SQL запрос необходимо писать в скобках."
То есть для этого поля можно лишь использовать запрос вида SELECT или можно писать в этом месте небольшие скриптики?
Т.к. я начинающий разработчик, то не могу понять, где грань между применимостью вычисл. поля и переходом уже на написание скриптов.
Как пример. Есть у меня вычисл. поле, в котором я указываю дату. В другой таблице есть количество месяцев. Предполагаю, что я смогу в другом вычисл. поле сложить дату и месяцы функцией IncMonth (), хотя пока у меня это не получилось.
Но я хотел бы добавить к этому сложению условию IF ELSE, будет ли такой конструктив работать в вычисляемом поле или нет?
Если я верно понял, то вычисл. поле оперирует языком запросов SQL, а скрипты пишутся на Delphi и смешивать их в вычисляемом поле нельзя.

Прошу просвятить меня по поводу вичисл. поля и какие функции, запросы, синтаксис языка можно использовать.

PS Возможно ли наименование вычисл. поля использовать в скриптах или нужно тот запрос, что в нем использован целиком переносить в скрипт?

Здравствуйте!
Скажите как можно обновить значение компонента Edit, в котором вычисляемое поле типа дата?
Подробнее: У меня есть форма, на которой я расположил несколько вкладок. На одной из них есть таблица, на другой вкладке есть компонент Edit, в котором вычисляемое поле типа дата. В вычисляемом поле сделал запрос на ту самую таблицу из другой вкладки.
Если я добавил в таблицу строку, которая участвует в запросе, то дата в вычисляемом поле должна поменяться, но так происходит только тогда, когда я закрываю и вновь открываю форму, а вот при переходе из одной вкладки в другую без закрытия формы, нет.
Как в этом случае обновить данные без закрытия формы?

http://myvisualdatabase.com/forum/viewtopic.php?id=6735

Большое спасибо! Помогло!

44

(63 replies, posted in Russian)

В таблице при редактировании записи прямо в ней невозможно выбрать дату, когда нажал на месяц и попал в меню месяцев. Через форму это возможно сделать.

45

(63 replies, posted in Russian)

Не увеличивается длина выпадающего списка сортировки в кнопке Поиск даже если раскрываю на весь экран окно заполнения.
Был случай, когда не влазит название таблицы и я не вижу по какому из параметров я выбрал сортировку. Приходится ориентироваться на очередность отображения строк.

46

(63 replies, posted in Russian)

Поиск по компоненту Edit, если есть он используется с шаблоном вида !\+\7\(000\)000-00-00 работает неккоректно;
В Поиске выбран фильтр %s%, что предполагает, что будут показаны все записи, имеющие соответствующие числа. Но на самом деле этом случае поиск выдает результат лишь когда я забью почти весь номер без двух последних цифр, иначе же не выдает никакого совпадения.

47

(63 replies, posted in Russian)

Решил организовать поиск по 2-м комбикам, один из которых фильтруется по другому, имеет свойство MultiSelect и FirstEmptyItem (другой этих свойств не имеет). В этом случае у отфильтрованного комбика нет первой пустой ячейки, а при нажатии первой строки из выбора, нажимаются все сразу. В итоге, первая строка замещает пустую ячейку, значения первой строки получается не существует, вторая строка выбирается нормально.
Как только убираю фильтрацию одного комбика по другому — появляется пустая ячейка. Или убираю пустую ячейку — появляется возможность выбрать первую строку.

Здравствуйте!
Захотел в проекте реализовать копирование строки таблицы, т.к. параметров много в таблице, а обычно отличие строк таблицы друг от  друга лишь в одном-двум полях.
Воспользовавшись скриптом форумчанина k245, была оформлена кнопка Скопировать, работа которой основана на кнопке "Показать запись" с дальнейшим сохранением записи как новой.
В итоге, на форме расположена таблица, кнопки для нее Добавить, Редактировать, Удалить, Копировать.
Скрипт работает, кнопки тоже, но вот только двойной клик по строке таблицы, который автоматически вызывает форму редактирования, начал открывать не одну форму редактирования, а столько, сколько этих самых кнопок со свойством "Показать запись" на этой форме привязаны к этой таблице. Получаю, что первая форма действительно позволяет редактировать запись, а после ее закрытия, открывается автоматически еще раз эта же форма, только после нажатия кнопки Сохранить, создается новая запись.
Планировал отключить возможность открытия формы редактирования по двойному клику, а затем скриптом указать конкретную кнопку, которую нужно нажать, при двойном клике на строку таблицы, но не смог найти как отключить открытие формы редактирования при двойном нажатии на строку таблицы.
Возможно есть какой-то иной вариант, как избежать подобной ситуации?

49

(43 replies, posted in Russian)

Еще одна картинка для понимания. Это форма для заполнения Сущности Statuses.

50

(43 replies, posted in Russian)

Здравствуйте!
Помогите пожалуйста с создание вычисляемых полей.
Есть Карточка прибора (Card...), в нем таблица, в которой фиксируются различные этапы его эксплуатации (Statuses...). В Сущности Status... я указываю какие этапы эксплуатации могут быть в виде справочника. А в Сущности Organization attribute - вид организации.
Например, прибор может быть куплен (статус) у организации-поставщика (вид организации), находиться в эксплуатации у организации-владельца, в ремонте в сервисной организации, списан и т.п.
Задача же стоит в том, чтобы:
1) отобразить для каждого вида статуса (В Эксплуатации, Списан, В ремонте и т.п.) его последнюю дату создания для определенного прибора на форме этого самого прибора
2) отобразить последний по дате/времени создания статус для определенного прибора
3) Зная разницу даты создания определенного вида статуса с текущей датой, указать определенный текстовый индикатор, который также может быть выбран из отдельной сущности или прямо в вычисляемом поле указана интерпретация.