26

(17 replies, posted in Russian)

В общем, я даже не дурак, а идиот (хотя могу сослаться на незнание работы MVD как таковой), но таки получилось полностью решить проблему. Полный рабочий код выглядит так:

procedure frm_btnReset_OnClick (Sender: TObject; var Cancel: boolean);
begin
  frm.tg.ClearRows;
  if frm.cb1.dbItemID <> -1 then frm.cb1.dbItemID := -1;
  if frm.cb2.dbItemID <> -1 then frm.cb2.dbItemID := -1;
end;

procedure frm_cb2_OnChange (Sender: TObject);
begin
  if frm.cb2.dbItemID = -1 then frm.btnReset.Click; 
end;

procedure frm_cb1_OnChange (Sender: TObject);
begin
  if frm.cb1.dbItemID = -1 then frm.btnReset.Click;
end;

и без всяких дополнительных переменных, флажков и прочая... Все гораздо проще. А дело было в frm.tg.ClearRows...

27

(17 replies, posted in Russian)

Есть frmMeasurement, на ней два ComboBox с ForeignKey и FieldName, также они завязаны при помощи Increm. Search на две скрытые визуально кнопки с действием "Поиск". Кроме того, имеется видимая кнопка Reset с действием "Поиск", которая "отменяет" действие ComboBox'ов и приводит таблицу tgMeasurement в "исходное" состояние (на момент первичного открытия frmMeasurement). Собственно, вся диспозиция.
Код приведен выше, его я специально даю абстрактно, без привязки к конкретным именам форм и компонентов формы, однако повторюсь и здесь:

var tgSQLQuery: string;
...
procedure frm_tg_OnChange (Sender: TObject); // таблица, в куда выводится результат ComboBox'ов и кнопки Reset
begin
  // при первом показе frm получим исходный SQL-запрос
  if tgSQLQuery = '' then tgSQLQuery := frm.tg.dbGetSqlStatement;
end;

procedure frm_btnReset_OnClick (Sender: TObject; var Cancel: boolean);
begin
  frm.tg.dbItemID := -1;
  frm.tg.dbFilter := '';
  if frm.cb1.dbItemID <> -1 then frm.cb1.dbItemID := -1; 
  if frm.cb2.dbItemID <> -1 then frm.cb2.dbItemID := -1;
end;

procedure frm_cb2_OnChange (Sender: TObject);  // связанный через Increm. Search с скрытой кнопкой btn2 с действием "Поиск"
begin
  if frm.cb2.dbItemID = -1 then
    frm.tg.dbGetSqlStatement := tgSQLQuery;
end;

procedure frm_cb1_OnChange (Sender: TObject); // связанный через Increm. Search с скрытой кнопкой btn1 с действием "Поиск"
begin
  if frm.cb1.dbItemID = -1 then
    frm.tg.dbGetSqlStatement := tgSQLQuery;
end;
...
begin
  tgSQLQuery := '';
end.

Собственно, проблема как раз и состоит в том, что если не выделить в таблице на форме какую-нить строку, то все взаимодействует как и задумывалось - нажатие кнопки Reset возвращает таблицу на форме в "исходное" состояние, то же происходит и при выборе пустых значений в обоих ComboBox'ах.
НО  стоит только выделить строку в таблице - так нажатие кнопки Reset приводит лишь к отображению выделенной строки в таблице. При этом установка в выпадающих списках пустого значения тоже работает лишь по настройке связанных с ComboBox'ами кнопками с действием "Поиск".
Не смотря на весь приведенный код, где строками

  frm.tg.dbItemID := -1;
  frm.tg.dbFilter := '';

я пытаюсь снять выделение строки в таблице и очистить фильтры, если таковые имеются, чтобы они не влияли на SQL-запрос кнопки Reset.
UPD1. Такое впечатление, что код

procedure frm_tg_OnChange (Sender: TObject);
begin
  // при первом показе frm получим исходный SQL-запрос
  if tgSQLQuery = '' then tgSQLQuery := frm.tg.dbGetSqlStatement;
end;

срабатывает каждый раз при изменении таблицы на форме при помощи ComboBox'ов, хотя такое не должно быть, так как во второй и последующие события OnCnange таблицы переменная tgSQLQuery не пустая.
UPD1.1. Да, переменная tgSQLQuery меняет свое значение КАЖДЫЙ раз при наступлении OnChange таблицы на форме. Решение - ввод дополнительного флага булевского типа:

var tgSQLQuery_Flag: boolean;
...
procedure frm_tg_OnChange (Sender: TObject);
begin
  // при первом показе frm получим исходный SQL-запрос ПО ЗАДУМКЕ!!!
  if not tgSQLQuery_Flag then
    begin
      tgSQLQuery := frmMeasurement.tgMeasurement.dbGetSqlStatement;
      tgSQLQuery_Flag := True;
    end;
end;
...
begin
  tgSQLQuery_Flag := False;
  ...
end.

но это не решает проблему работы кода не так, как задумывается, при выделенной строке в таблице на форме...
UPD2. Вижу проблему некорректной работы кода (не так, как хотелось бы, как задумывалось) в том, что не снимается выделение со строки в таблице на форме. Попробовал изменить код так:

procedure frm_cb2_OnChange (Sender: TObject);
begin
  if frm.cb2.dbItemID = -1 then
    begin
      frm.tg.dbItemID := -1;
      frm.tg.dbGetSqlStatement := tgSQLQuery;
    end;
end;

procedure frm_cb1_OnChange (Sender: TObject);
begin
  if frm.cb2.dbItemID = -1 then
    begin
      frm.tg.dbItemID := -1;
      frm.tg.dbGetSqlStatement := tgSQLQuery;
    end;
end;

и результата - ноль... Все та же работа не так, как задумывалось. Как убрать выделение строки в таблице?
UPD3. Понял, что дурак... Переделал код так:

procedure frm_btnReset_OnClick (Sender: TObject; var Cancel: boolean);
begin
  frm.tg.dbItemID := -1;
  frm.tg.dbFilter := '';
  if frm.cb1.dbItemID <> -1 then frm.cb1.dbItemID := -1;
  if frm.cb2.dbItemID <> -1 then frm.cb2.dbItemID := -1;
end;

procedure frm_cb2_OnChange (Sender: TObject);
begin
  if frm.cb2.dbItemID = -1 then
    begin
      frm.tg.ClearRows;
      frm.btnReset.Click;
    end;
end;

procedure frm_cb1_OnChange (Sender: TObject);
begin
  if frm.cb1.dbItemID = -1 then
    begin
      frm.tg.ClearRows;
      frm.btnReset.Click;
    end;
end;

Во-первых, избавили от события OnChange таблицы на форме, во-вторых, избавились от переменных tgSQLQuery и tgSQLQuery_Flag. При этом установка ComboBox'ов в пустое значение работает даже при выделенной строке в таблице, что и требовалось. Осталось лишь заставить нормально работать кнопку Reset при выделенной строке в таблице, ибо продолжается некорректная работа Reset при выделенной строке в таблице.

28

(17 replies, posted in Russian)

sibprogsistem wrote:

form.TableGrid.dbFilter := '';
у меня эта часть кода полностью блокирует все остольные фильтры и у Вас видимо то же смое

даже если я комментирую эту строку - ситуация не меняется.

29

(17 replies, posted in Russian)

В общем-то, я все бьюсь над своей проблемкой небольшой.
Напомню: есть таблица на форме, есть два малость изменяющих в нем состав колонок и число колонок выпадающих списка, есть кнопка Reset, которая по идее приводит таблицу в первичное состояние для ликвидации "последствий" работы выпадающих списков, сама Reset имеет действие "поиск", в настройках действия которого прописаны параметры изначального заполнения таблицы на форме.
Так вот, так как

procedure form_buttonReset_WithActionSearch_OnClick (Sender: TObject; var Cancel: boolean);
begin
  form.TableGrid.dbFilter := '';
end;

через некоторое время срабатывать перестает, я начал изучать взаимодействие этих выпадающих списков (ComboBox'ов) и кнопки Reset с таблицей на форме.
Написал такой код:

var tgSQLQuery: string;
...
procedure frm_tg_OnChange (Sender: TObject);
begin
  // при первом показе frm получим исходный SQL-запрос
  if tgSQLQuery = '' then tgSQLQuery := frm.tg.dbGetSqlStatement;
end;

procedure frm_btnReset_OnClick (Sender: TObject; var Cancel: boolean);
begin
  frm.tg.dbItemID := -1;
  frm.tg.dbFilter := '';
  if frm.cb1.dbItemID <> -1 then frm.cb1.dbItemID := -1;
  if frm.cb2.dbItemID <> -1 then frm.cb2.dbItemID := -1;
end;

procedure frm_cb2_OnChange (Sender: TObject);
begin
  if frm.cb2.dbItemID = -1 then
    frm.tg.dbGetSqlStatement := tgSQLQuery;
end;

procedure frm_cb1_OnChange (Sender: TObject);
begin
  if frm.cb1.dbItemID = -1 then
    frm.tg.dbGetSqlStatement := tgSQLQuery;
end;
...
begin
  tgSQLQuery := '';
end.

и получается так, что если не выделять строку в таблице на форме, то все работает нормально, при возвращении выпадающих списков на пустое значение и при нажатии кнопки Reset все работает...
НО стоит только выделить строку в таблице - так нажатие кнопки Reset приводит лишь к отображению выделенной строки в таблице. При этом установка в выпадающих списках пустого значения работает нормально и при выделенной строке в таблице. Как так-то?
Напоминаю, что кнопка Reset имеет действие "поиск" и использует в качестве компонента, участвующего в поиске, саму таблицу на форме. Собственно, и вывод результата своих действий производит в эту же таблицу.

Может, свойство Count имеет тип Integer, а надо бы какой-нить WideInteger? Это вопрос к Дмитрию.

kunar80 wrote:

И о какой приведенной теме Вы говорите?

Которую вы привели в посте номер 36 этой темы.
Там чуваки программно, при помощи скрипта, решили этот вопрос. Ребята там формируют отчет при помощи скрипта, а не автоматически как в MVD.

Вот скачал ваш проект, оформил шаблон отчета, выставил суммирование в поле - и не работает... Вообще никак. Пробовал по всякому. Не пойму, почему. Хотя формально все нормально и корректно. Я даже нули в базу поставил вместо NULL - и то не помогло.

kunar80 wrote:
m.prokhachev wrote:

А покажите код, который передает данные в отчет из вашей программы...

SELECT
tovarName.tovarName,
tovar.prihod,
tovar.rashod

FROM tovar

LEFT OUTER JOIN tovarName ON tovar.id_tovarName=tovarName.id

это именно SQL-запрос, а я имел в виду скрипт, если вы через скрипт подготавливаете данные для передачи в модуль формирования отчета...
или вы через кнопку с действием "Отчет" передаете данные?
Просто там же в приведенной теме есть и решение проблемы. Вы посредством кнопки с действием "отчет" передаете значения как строки, поэтому FastReport проводит конкатенацию строк, а не суммирование чисел. Вам надо передавать данные как числа. На самом деле, в простом виде это может Дмитрий решить, усовершенствовав в MVD действие кнопки "отчет".

А покажите код, который передает данные в отчет из вашей программы...

35

(17 replies, posted in Russian)

m.prokhachev wrote:

Хм... Вроде бы проблема решилась так:

procedure form_buttonWithActionSearch_OnClick (Sender: TObject; var Cancel: boolean);
begin
  form.TableGrid.dbFilter := '';
end;

то есть в OnClick кнопки с действием "поиск", которая на самом деле должна возвращать грид в исходное состояние (как при первом показе формы), надо прописать обнуление конструкции WHERE в автоматически формируемом SQL-запросе
Потестирую какое-то время, если обнаружится недостаток - отпишусь.

Все равно через некоторое время происходит какая-то фигня... В итоге остается одна строка в гриде. И хоть убейся об стену...
Буду пробовать вариант Дмитрия.

36

(73 replies, posted in Russian)

Дык дайте ваш проект, что ли... Или ваши скрипты, связанные с этим вопросом.

37

(2 replies, posted in Russian)

Приведите пример SQL-запроса, а то не очень понятно, о чем речь...

38

(26 replies, posted in Russian)

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

Поищите ответы в темах:
http://myvisualdatabase.com/forum/viewtopic.php?id=2895
http://myvisualdatabase.com/forum/viewtopic.php?id=2789

39

(8 replies, posted in Russian)

А я и не про виртуальную таблицу...

40

(26 replies, posted in Russian)

Ну по хорошему, ты должен сделать локальный сайт и скопировать эти файлы в корневой каталог сайта

41

(8 replies, posted in Russian)

Не пойму, а в чем проблема сделать раздельно программу-клиент и программу-сервер?
И не надо удалять запись в том смысле, в котором это понимаете вы, достаточно пометить сессию как закрытую. А запись останется для логов - мало ли, вам в какой-то момент по какой-то нужде придется просмотреть все подключения пользователей к серверу за какой-то период?..

42

(26 replies, posted in Russian)

Так Денвер - это и есть связка Apache + PHP + mySQL... Видимо, надо смотреть нюансы Денвера.

Дмитрий, насколько я понял из форума, триал-период среды разработки MVD в 60 дней позволяет создавать ПО, на которое не должно было влиять ситуация со средой разработки. А сейчас получается так, что и приложение независимо от MVD я не могу запустить, не купив ключ на MVD. Почему-то я считал, что когда закончится бесплатный период MVD, то приложение, созданное в этот период, продолжит запускаться и после окончания пробного периода, не будет только уже возможности доработки ПО и создания других программ на базе MVD. Это баг или фича?

Версия MVD - 4.6 beta

44

(89 replies, posted in Russian)

Задачка решается при помощи SplitString и массива строк из первого файла плюс массив строк для второго файла...

45

(24 replies, posted in Russian)

Я бы больше расспросил вас про считыватели, ардуино и прочая... Вдруг понадобится на будущее. Что, как, где.

46

(24 replies, posted in Russian)

Господи, да Паскаль достаточно простой язык... Достаточно прочитать пару учебников. Я бы хотел помочь, честно, но не хочу давать невыполнимых обещаний, ибо у самого нету времени, так как свой проект имеется и своя работа. Сегодня я отправил запрос на покупку ключа к MVD, так как кончается пробный период. Посильную помощь могу оказать только по конкретике - и то, через дней 10, как получу ключ.

47

(24 replies, posted in Russian)

Я бы все-таки порекомендовал разделить на два поля состояние взято/сдано. Это в перспективе вкупе с двумя полями типа дата-время позволит найти злостный несдавальщиков инвентаря.
А алгоритм пункта 6 на мой взгляд выглядит так:
1) пропикали инвентарь, получили штрих-код
2) запросом в БД проверили этот штрих код на человека (точно ли он взял) и на состояние "сдано в аренду" (может, не сдано, ну? подсовывают такой же инвентарь с другим штрих-кодом)
3) если условия выполняются - ставим статус в табилце RentLogs по данному инвентарю "возвращено из аренды", и все
А чек-бокс на форме хорош тем, что он автоматом может ставиться в галку, или убирать галку по пропикиванию инвентаря... А так же быть в третьем состоянии ни да, ни нет на момент выдачи инвентаря. Опять же, это мое ИМХО.
Самое трудное тут будет - получение события от RFID-сканера и сканера штрих-кода...

48

(24 replies, posted in Russian)

Ну что я могу сказать... Логика работы БД с бабушкой в качестве оператора тогда мне представляется такой:
1) приходит человек с RFID-картой за инвентарем, а на инвентаре у нас штрих-кода.
2) человек подносит RFID-карту к считывателю, прога автоматом определяет ID человека и выскакивает форма с профайлом по этому человеку
3) бабушка пропикивает штрих-коды нескольких единиц инвентаря, которые прога отмечает в БД как взятые в "аренду" со ссылкой на ID чкеловека
4) у этих единиц инвентаря в БД статус "сдано"
5) приходит этот же человек с этой же RFID-картой и бабушка пропикивает сданный ей инвентарь назад, при открытом профайле со уже определенным (тем же) ID человека в БД
6) процедура пропикивания приводит к тому, что единицы инвентаря получают статус "возвращено", а записи со ссылкой на человека так и остаются в БД
Какие мои соображения... Минимум три таблицы.
Таблица с профилями людей Emploees, таблица со списком инвентаря Equipment и собственно таблица движения инвентаря RentsLog.
Таблица Emploees должна содержать данные о RFID-карте и другие сведения о сотруднике (вплоть до фото - имеется же такая возможность, ну!). Таблица Equipment содержит наименование единицы инвентаря, штрих-код, нанесенный на этот самый инвентарь, ну и прочие описания ("лопата зеленая, с деревянной ручкой, с выщербленкой у основания штыка"). Ну а таблица RentsLog содержит сведения такие: ссылка-ключ id_Emploees, ссылка-ключ id_Equipment, чек-бокс на "взято в аренду", чек-бок на "отдано из аренды", дата-время взятия в аренду, дата-время возвращения из аренды. Собственно и все.
В самой программе в гриде тупо поставить "режекторный" фильтр на отображение тех записей RentsLog, у которых чек-бокс на "отдано из аренды" равен false или 0 (уж сами определитесь). То есть бабушка при открытом профиле человека пикает инвентарь - инвентарь появляется в списке взятого человеком оборудования, пикает этот же инвентарь второй раз - инвентарь пропадает из списка взятого человеком оборудования. Ну и запилить отдельную форму, где можно тупо смотреть по ID человека и штрих-коду инвентаря историю сколько раз и когда был взят этот инвентарь этим человеком.
По моему, все просто) за основу можно взять проект из книги по MVD, там больше половины функционала уже реализовано, прикрутить только считыватели и изменить структуру БД.

49

(24 replies, posted in Russian)

Это не статистика, это логгирование или ведение истории "аренды" инвентаря... Для этого нужна отдельная таблица, на мой взгляд... Где будет ссылка-ключ на человека, дата дневной "аренды" и ссылка-ключ на предмет, который брался в "аренду" на день. Возможна так же пометка о статусе "аренды" - взял или сдал... Если это на несколько дней - то дата начала "аренды" и дата окончания "аренды"... Ой, что-то мне это напоминает... Где-то, блин, уже читал... В какой-то книжке электронной, угу... )))
Интересные вы ребята, леголасы... Значит, с ардуино работать - нет проблем, а простейшую БД для аренды инвентаря написать - уже сложно))) Научите меня с ардуино работать, а?)

1. Хотелось бы создавать программно свой DataSet
2. Хотелось бы по типу компоненты "Карта" привязывать растр к прямоугольным условным координатам и использовать далее в работе программы точки-метки, привязанные к координатам на изображении.