Решил. Разнёс данные по трём таблицам.

Почему добавляются пустые строки в Гриды (на форме 3 вкладки и, соответственно, 3 Грида)?

DriveSoft wrote:

3) Сделал, теперь таблица periodText не нужна.
в таблицу periodNo добавил значение 0, которое условно будет обозначать Постоянное хранение документа, также сделал вычисляемое поле, чтобы вместо нуля было написано Постоянно.

Спасибо. Но текстовых значений для данного примера нужно четыре разных Как быть? Может возможно разрядность применить, и обозначать их как "0", "00", "000", "0000"?
Кроме того, не корректно выглядит запись "Постоянно" в колонке "На уничтожение". Может быть добавить ещё одну колонку "Срок хранения", которая бы участвовала в поиске, но не участвовала в вычислении: в неё дублировать запись числовых значений и вычисление по текстовым (вот это самое "Постоянно"? А ту, что есть сейчас и участвует в вычислении скрыть? Ну как-то так...
======
Вроде бы всё, кроме текстовых значений, решил. Осталась одна проблема.

Тестовый проект для архива учреждения (организации) прилагаю. В нём есть вычисление года возможного уничтожения архивных документов, у которых истекли сроки хранения.
Непонятки:
1) Не работает поиск по вычесленному значению.
2) Как сделать, чтобы вычесленное значение (это год возможного уничтожения документов, у которых истекли сроки хранения), если оно меньше или равно текущему году, было выделено цветом или иным образом?
3) Из-за того, что в вычислении (Год формирования дела + Срок хранения + 1) должны, как я думаю, участвовать целые числа, пришлось "Сроки храненния" разбить на две таблицы - числовую и текстовую (для, например, "Постоянно"), соответственно и словарей стало два, и всего прочего. А может это разбиение можно как-то обойти, задав, например, условие для вычисления?

АКТУАЛЬНО ТАКЖЕ ДЛЯ ПРОЕКТОВ ПО УЧЁТУ ПРОДУКТОВ, МЕДПРЕПАРАТОВ, КОСМЕТИКИ И ПР., ИМЕЮЩЕГО ОГРАНИЧЕННЫЙ СРОК ГОДНОСТИ.

ПОИСК ПО НАЛИЧИЮ ЗНАЧЕНИЯ
Отбор только тех записей, у которых имеется определённое значение.

356

(4 replies, posted in Russian)

Спасибо! Это именно то, что нужно

357

(4 replies, posted in Russian)

Проект у Вас есть ("Arhiv"). Вчера Вы правили скрипт. До сегодня в структуре ничего не поменялось. Входите как гость, т.е. без логина и пароля, и всё поймёте. Сейчас там задействован DBFile. Я думаю, что он вполне устроил бы, если в нём скриптом возможно отключить все его функции, кроме "Открыть файл"

Есть формы:
     1) Пользователь. На ней DBFile1, через который в папку file добавляется файл, привязанный к конкретному id таблицы.
     2) ГостьПоиск. На этой форме он видит таблицу с возможностью поиска.
     3) ГостьПросмотр. Сюда гостем выводятся результаты поиска. Вот здесь и нужен просмотр прикрепленного файла, т.е открытие именно файла, а не папки или директории. DBFile1 сюда ну никак не подходит, т.к. даёт гостю возможность влезть в папку программы.
      Как решить?

359

(237 replies, posted in Russian)

Сделал. Положил в РЕШЕБНИК. Спасибо!

СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ БД
В папке "backup" программы создаётся и сохраняется один файл вида backup_дата_время.db при входе в программу, который обновляется каждые три часа и при выходе.
Файлы в течение дня накапливаться не будут. Но это менее практично, т.к. обнаружить, что база данных кем то испорчена, можно не сразу, а тем временем не испорченная база будет замещена испорченной

361

(237 replies, posted in Russian)

Сделал для вас проект с примером, база дублируется в папке backup при входе в программу, при выходе и каждые 3 часа.

Спасибо! Но хотелось бы не накопления файлов, а их замещения. Т.е. в течение дня файл замещается на более новый и в итоге сохраняется в папке последний файл дня. При смене даты создаётся новый файл.
Тем не менее, переложил исходник в "Решебник". Просьба к Вам, давайте впредь выкладывать тестовые файлы в "Решебник", а в других топиках писать "Сделал. Смотрите РЕШЕБНИК". Вами ведь выложено много тестовых проектов, но все они разбросаны по разным темам и не всегда удаётся найти то, что конкретнму пользователю нужно, хотя ответ на его вопрос, возможно, на форуме уже есть.

СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ БД
В папке "backup" программы создаются и сохраняются файлы вида backup_дата_время.db при входе в программу, каждые три часа и при выходе.

ВХОД ЧЕРЕЗ ЛОГИН И ПАРОЛЬ. Назначение прав.

КНОПКА. ОТКРЫТИЕ ФАЙЛА, ПАПКИ, ДИРЕКТОРИИ.

Господа форумчане! Дабы не напрягать Дмитрия нашими непонятками и не отвлекать его от совершенствования My Visual Database, предлагаю в этом топике делиться секретами создания проектов с обязательным прикреплением исходника решения. Здесь не просим помощи и не обсуждаем. Здесь ищем подходящий вариант готового решения. Сюда выкладываем тестовые проекты. Лично я вижу эту тему как библиотеку готовых решений.

Спасибо! В тестовом работает:

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);

var
   sFolder: string;

begin
OpenFile('c:\Documents and Settings\Фильм\VIDEO');
end;


begin

end.

Осталось перенести в свой проект smile
С помощью Дмитрия РЕШЕНО: ответ в теме "Решебник"

Спасибо.

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
   sFolder: string;
begin
     sFolder := 'с:\';
     if SelectDirectory('Select folder', '', sFolder) then
     begin
          ShowMessage(sFolder);
     end;
end;


begin

end.

Открывает "Обзор папок". А как дописать, чтобы по процедуре увидеть именно содержимое указанной папки?

Дмитрий! Проект Вы видели и правили. Сейчас я просто пытаюсь на пустой форме экспериментировать.

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

DriveSoft wrote:

А если бы ещё можно было и начальную папку задавать...

procedure Form1_Button8_OnClick (Sender: string; var Cancel: boolean);
var
   sFolder: string;
begin
     sFolder := 'd:\Films';
     if SelectDirectory('Select folder', '', sFolder) then
     begin
          ShowMessage(sFolder);
     end;
end;

А у меня это почему-то не работает sad ???  Есть пустая Form1 с одной кнопкой Button1. Скрипт записал так:

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);

var
   sFolder: string;

begin
     sFolder := 'c:\Documents and Settings';
     if SelectDirectory('Select folder', '', sFolder) then
     begin
          ShowMessage(sFolder);
     end;
end.

Упорно пишет: ';' expected at 12:4  (12:4 - это после закрывающего "end")
Кнопка не функционирует, указанную папку не открывает.

371

(237 replies, posted in Russian)

Спасибо! Сделал, работает! Ура!
Ещё "хотелка":
Может, где-то на форуме есть, но я не нашёл. Хотелось бы дублирования БД в формируемый при первом входе в программу файл Date.db, его обновление в течение рабочего дня и последующее сохранение в отдельной папке программы. Думаю, что при сетевой работе это важно, особенно когда сотрудники слабо владеют компьютером. Как бы чего не наворотили! Всё ж таки за один день восстановить данные проще, чем начинать с нуля.

372

(237 replies, posted in Russian)

Программка прелесть! Виват автору! Даже для меня, как человека очень далёкого от программирования, многое интуитивно достаточно понятно.
Но, хотелось бы:
Убрать с главной формы вкладки "Файл" и "Инструменты". Назначение первой вообще не понятно. Вторая пользователю не нужна, её логичнее реализовать в самой программе - ведь это инструменты разработчика, как я понимаю..

DriveSoft wrote:

kunar80
Приложите пожалуйста ваш архив проекта к сообщению без exe и dll файла, либо пришлите проект на support@drive-software.com со ссылкой на данный топик.

Спасибо за внимание  к пользовапелям! Отправил сообщение в личку.

Прошу помощи!

На этапе входа в проект задействованы три формы:
1.    frmHello (главная): кнопки bUser и bVisitor
2.    frmLogin: текстбоксы edUser , edPassword и кнопка bEnter
3.    frmChoice: кнопки 1, 2 и bSetting

Есть вот такой скрипт:

var
   sUser: string = '';

// event OnShow
procedure frmHello_OnShow (Sender: string; Action: string);
begin
     frmLogin.edPassword.PasswordChar := '*';
     frmLogin.ShowModal; // show windows for login
end;


procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // SQL query for check user and password
     s := VarToStr( SQLExecute('SELECT count(id) FROM users WHERE (login = ''' + frmLogin.edUser.Text + ''') AND (password = ''' + frmLogin.edPassword.Text + ''');') );

     // if SQL query found login and password
     if (s <> '0') and (s<>'') then
     begin
          sUser := frmLogin.edUser.Text; // remember username

          // check admin rights
          s := VarToStr( SQLExecute('SELECT administrator FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then frmChoice.bSetting.Enabled := False; // если пользователь не обладает правами администратора, отключить кнопку

          frmLogin.Close; // close login form
        end else MessageDlg('неправильный логин или пароль ', mtError, mbOk, 0); // сообщение, если пароль неверный

end;


// window closing event for login
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
     //if the user has not been defined, and the user closes the login window, then close the main form
     if sUser='' then frmChoice.Close;
end;




begin
  // Initial check whether there is a database administrator user
  // if not, create an administrator with username admin and password admin
     if VarToStr( SQLExecute('SELECT count(id) FROM users WHERE administrator=1;') ) = '0' then
     begin
         SQLExecute('INSERT INTO users (login, password, read, write, remove, search, administrator) VALUES ("admin", "admin", 1, 1, 1, 1, 1);');
         frmLogin.edUser.Text := 'admin';
         frmLogin.edPassword.Text := 'admin';
     end;

end.

Работает так:

1.    С логином 'admin' и паролем 'admin'  - нормально
2.    С логином и паролем пользователя – нормально
3.    С незаполненными или не правильно заполненными полями edUser  и  edPassword – открывается MessageDlg, при нажатии на кнопку mbOk происходит вход в форму frmChoice с правами администратора (?).
4.    Кроме того не закрываются не активные формы, т. е. каждая вновь открытая форма накладывается на открытую предыдущую.
5.    При наборе пароля текстовые знаки не заменяются на ‘*’, хотя это вроде бы прописано: frmLogin.edPassword.PasswordChar := '*';

Очень прошу помочь разобраться!
И с Днём автомобилиста всех!

375

(43 replies, posted in Russian)

Пока СПАСИБО! Но вопросы ещё обязательно будут.