Приблизительно так. Определиться кто будет уникальным, клиент или авто,. Лучше наверное авто, так как у клиента их может быть несколько, это главная таблица. Связанная таблица куда будет вноситься информация . А на форме где будет заполняться первичная информация, создавать дополнительно движение, например новая запись- клиент обратился, следующая запись -авто выдано. И т.д.
2 2019-01-27 20:34:01
Re: номер жеского диска (8 replies, posted in Russian)
3 2019-01-23 22:24:36
Topic: Ошибка??? (0 replies, posted in Russian)
Дмитрий, это фича или глюк, в прежних версиях такого эффекта не наблюдается.
Суть:
1. Форма добавления новой записи - ничего не заполняем.
2. Пытаемся сразу добавить новое движение (коих может быть множество) - и при нажатии кнопки "Новая запись" одновременно срабатывает кнопка "Сохранить запись" и в базе появляется пустая запись, даже если закрыть форму.
4 2019-01-17 12:18:12
Re: Блокировка антивирусами (2 replies, posted in Russian)
Блокировка и Есет и Malwarebytes
5 2019-01-17 12:15:05
Topic: Блокировка антивирусами (2 replies, posted in Russian)
Дмитрий Вас почему то начали блочить.
6 2019-01-06 11:58:52
Re: Медицинская карта амбулаторной стоматологии (5 replies, posted in Russian)
Возможно, тут даже человек создавал такую и есть сырец на форуме.
7 2018-12-27 22:18:00
Re: Нужна помощь (РЕШЕНО) (5 replies, posted in Russian)
Дмитрий в процессе построения запроса SQl добился таки верного вывода результата. Но при попытке прикрутить поиск посредством комбобокса в выборку не уходит ничего. Что я делаю не так.?
SELECT
"$autoinc",
Uchet.id,
id,
(SELECT VidDvizeniyaa.vidDvizeniya FROM Uchet u
LEFT OUTER JOIN Dvizenie ON Uchet.id=Dvizenie.id_Uchet
LEFT OUTER JOIN VidDvizeniyaa ON Dvizenie.id_VidDvizeniyaa=VidDvizeniyaa.id
WHERE Uchet.id=u.id AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id) ))
FROM
Uchet
WHERE
(CASE WHEN {cbSearchVidDvizeniya} <> -1 THEN (SELECT [b]VidDvizeniyaa.vidDvizeniya[/b] FROM Uchet u
LEFT OUTER JOIN Dvizenie ON Uchet.id=Dvizenie.id_Uchet
LEFT OUTER JOIN VidDvizeniyaa ON Dvizenie.id_VidDvizeniyaa=VidDvizeniyaa.id
WHERE Uchet.id=u.id AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id))) = {cbSearchVidDvizeniya} ELSE 1=1 END)
Решено. ошибка. Вместо - VidDvizeniyaa.vidDvizeniya нужно запросить VidDvizeniyaa.id
8 2018-12-26 12:04:18
Re: Нужна помощь (РЕШЕНО) (5 replies, posted in Russian)
Спасибо мельком просмотрел в обед. Вроде действительно так как надо. Вот я лох уперся в первую таблицу и к ней как основной пытаюсь запросы делать. надеюсь дальше разберусь. Еще раз спасибо.
9 2018-12-25 21:41:10
Re: Нужна помощь (РЕШЕНО) (5 replies, posted in Russian)
Спасибо за ответ но что то никак не получается. Еще раз суть - в БД формируется основная запись (Таблица 1), на форме расположены элементы с помощью которых формируется движение предмета (таблица 2), и словарь для таблицы 2 (Таблица 3) куда внесены 5 видов движения предмета. вывод происходит по таблице 1, но нужно в вывод добавить вид движения а также возможность поиска по данным размещенным в таблице 3.
10 2018-12-24 18:03:30
Topic: Нужна помощь (РЕШЕНО) (5 replies, posted in Russian)
Никак не могу понять как сделать SQL запрос для выборки. Может кто поможет. Главная таблица main_table, с ее помощью создается основной идентификатор и в нее вносятся основные сведения.
Таблица second_table предназначена для ввода сведений о движении предмета, и так как движений может быть только 5 то скриптом при первом запуске 5 видов движений записываются в таблицу dictionary_table.
Вопрос - как сформировать sql запрос для поиска на главной форме по полю вид движения, такой не работает.
SELECT dictionary_table.aaa FROM main_table m
LEFT OUTER JOIN dictionary_table.id=second_table.id_dictionary_table
WHERE second_table.id=m.id
Никак не могу понять логику сложных выборок. Спасибо за помощь.
11 2018-11-11 21:20:37
Topic: Вопрос общего характера (0 replies, posted in Russian)
Ребят помогите создать наилучший вариант структуры БД.
Имеем:
Приход ТМЦ. Например основная таблица 1 + таблицы словари. Здесь учитываются все его характеристики. необходимо однако организовать несколько различных последующих движений ТМЦ по указанным ниже параметрам.
Как наиболее верно организовать несколько видов последующих движений, чтобы корректно впоследствии можно было делать выборки по параметрам:
1. Остаток (выводится по умолчанию)
2. подготовлено к уничтожению (списанию).
3. передано в головной офис.
12 2018-10-24 21:15:36
Re: Выбранная запись в отчет (2 replies, posted in Russian)
Спасибо Дмитрий как всегда. Справку эту читал, не помогало, все оказалось в устаревшей версии программы, перекачал и все пошло.
13 2018-10-23 21:26:28
Topic: Выбранная запись в отчет (2 replies, posted in Russian)
Всем здравствуйте. Такой вопрос. Использую кнопку с действием SQL отчет, так как стандартным способом слишком сложный вывод. Все работает изумительно при выводе в отчет всей информации помещенной в грид по результатам поиска. Теперь понадобилось создать еще один отчет в который должны выводится данные только выбранной записи в гриде. Так вот, если запись в гриде всего 1 до она и выводится. если записей много то выводится не выбранная, а почему то первая. Запрос используется тот же. Ньюанс - имеется связанный список, если им сужать все до 1 записи до она выводится верно. Сам запрос такой
SELECT
(SELECT Naimenovanie.nazvanie FROM Uchet u
LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model
LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel
LEFT OUTER JOIN Naimenovanie ON Naimenovanie.id=Proizvoditel.id_Naimenovanie
WHERE Uchet.id=u.id),
(SELECT Model.model FROM Model WHERE Model.id=Uchet.id_Model),
(SELECT Proizvoditel.proizvoditel FROM Uchet u
LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model
LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel
WHERE Uchet.id=u.id),
Uchet.inv_number,
Uchet.ser_number,
strftime('%d.%m.%Y',Uchet.date_release),
strftime('%d.%m.%Y',Uchet.date_of_input),
Uchet.aurum,
Uchet.argentum,
Uchet.platinum,
Uchet.palladium,
Kabinet.kabinet,
Dolznost.dolznost,
OtvLico.lico,
Sluzba.sluzba,
Uchet.id,
strftime('%d.%m.%Y',(SELECT Dvizenie.debited_date FROM Dvizenie
WHERE
(Dvizenie.id_Uchet=Uchet.id) AND
(DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id) ))),
CASE WHEN (SELECT COUNT(Dvizenie.id)FROM Dvizenie WHERE Dvizenie.spisano=1 AND Dvizenie.id_Uchet=Uchet.id ) > 0 THEN 'Списано' ELSE 'Активно' END,
(
SELECT Dvizenie.akt_number FROM Dvizenie
WHERE
(Dvizenie.id_Uchet=Uchet.id) AND
(DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id) )
),
(
SELECT Dvizenie.primechanie FROM Dvizenie
WHERE
(Dvizenie.id_Uchet=Uchet.id) AND
(DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id) )
)
FROM
tgResult
LEFT OUTER JOIN Kabinet ON Kabinet.id=Uchet.id_Kabinet
LEFT OUTER JOIN Dolznost ON Dolznost.id=Uchet.id_Dolznost
LEFT OUTER JOIN OtvLico ON OtvLico.id=Uchet.id_OtvLico
LEFT OUTER JOIN Sluzba ON Sluzba.id=Uchet.id_Sluzba
WHERE
(CASE WHEN {cbNaimenovanie} <> -1 THEN (SELECT Naimenovanie.id FROM Uchet u
LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model
LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel
LEFT OUTER JOIN Naimenovanie ON Naimenovanie.id=Proizvoditel.id_Naimenovanie
WHERE Uchet.id=u.id) = {cbNaimenovanie} ELSE 1=1 END) AND
(CASE WHEN {cbProizvoditel} <> -1 THEN (SELECT Proizvoditel.id FROM Uchet u
LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model
LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel
WHERE Uchet.id=u.id) = {cbProizvoditel} ELSE 1=1 END) AND
(CASE WHEN {cbModel} <> -1 THEN (SELECT Model.id FROM Model WHERE Model.id=Uchet.id_Model) = {cbModel} ELSE 1=1 END) AND
(CASE WHEN '{edSerNumber}' = '' THEN 1=1 ELSE Uchet.ser_number LIKE '%{edSerNumber}%' END) AND
(CASE WHEN '{edInvNumber}' = '' THEN 1=1 ELSE Uchet.inv_number LIKE '%{edInvNumber}%' END) AND
(CASE WHEN {dtpVipuskS} IS NOT NULL THEN date (Uchet.date_release)>= date({dtpVipuskS}) ELSE 1=1 END) AND
(CASE WHEN {dtpVipuskPo} IS NOT NULL THEN date(Uchet.date_release) <= date({dtpVipuskPo}) ELSE 1=1 END) AND
(CASE WHEN {dtpVvodS} IS NOT NULL THEN date(Uchet.date_of_input) >= date({dtpVvodS}) ELSE 1=1 END) AND
(CASE WHEN {dtpVvodPo} IS NOT NULL THEN date(Uchet.date_of_input) <= date({dtpVvodPo}) ELSE 1=1 END) AND
(CASE WHEN {cbSluzba} <> -1 THEN Uchet.id_Sluzba = {cbSluzba} ELSE 1=1 END) AND
(CASE WHEN {cbKabinet} <> -1 THEN Uchet.id_Kabinet = {cbKabinet} ELSE 1=1 END) AND
(CASE WHEN {cbOtvLico} <> -1 THEN Uchet.id_OtvLico = {cbOtvLico} ELSE 1=1 END) AND
(CASE WHEN {dtpSpisanS} IS NOT NULL THEN (SELECT Dvizenie.debited_date FROM Dvizenie WHERE (Dvizenie.id_Uchet=Uchet.id) AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id))) >= date({dtpSpisanS}) ELSE 1=1 END) AND
(CASE WHEN {dtpSpisanPo} IS NOT NULL THEN (SELECT Dvizenie.debited_date FROM Dvizenie WHERE (Dvizenie.id_Uchet=Uchet.id) AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id) )) <= date({dtpSpisanPo}) ELSE 1=1 END) AND
(CASE WHEN {chbPodlezSpisaniyu} IS NOT NULL THEN (CASE WHEN (SELECT COUNT(Dvizenie.id)FROM Dvizenie WHERE Dvizenie.spisano=1 AND Dvizenie.id_Uchet=Uchet.id ) > 0 THEN 1 ELSE 0 END) = {chbPodlezSpisaniyu} ELSE 1=1 END)
ORDER BY Kabinet.kabinet
Как передать в действие чтобы в данном случае можно было вывести лишь 1 выбранную запись?
14 2018-09-03 21:29:51
Re: Сортировка в отчет (10 replies, posted in Russian)
Спасибо теперь разжевано и понятно. :-)
15 2018-09-03 11:36:33
Re: Сортировка в отчет (10 replies, posted in Russian)
Нда, пока понял лишь на половину, но все равно спасибо за ответ. Буду разбираться. По идее можно наверное и через компонент на форме в виде например комбобокса с выбором колонок сделать?
16 2018-09-03 09:33:45
Topic: Сортировка в отчет (10 replies, posted in Russian)
Дмитрий возник такой вопрос. Имеется ли возможность передачи результатов сортировки в гриде в отчет?
Например результаты поиска в грид выводятся SQL запросом, с некоторым порядком сортировки, но в результате я желаю передать в отчет иную последовательность (отсортировано вручную по заголовку в гриде). Если использовать компонент "Передать в таблицу Excel", результаты ручной сортировки сохраняются, хотелось бы такое и для отчета. Или можно сделать только через некоторое количество вариантов отчета с нужной сортировкой?
18 2018-08-28 19:59:53
Re: Sql запрос (2 replies, posted in Russian)
Спасибо случайно нашел: ответ такой:
Если вы не хотите видеть значение id в компоненте таблицы, введите название для этой колонки delete_col
19 2018-08-28 14:07:58
Topic: Sql запрос (2 replies, posted in Russian)
При использовании sql запроса, я выбираю все позиции которые необходимы для вывода в грид, а также позиции по которым происходит выборка но не все они нужны для вывода в грид. Вопрос кроме сокрытия ненужных для вывода колонок скриптом ничего нельзя сделать?
20 2018-08-25 13:39:13
Topic: Импорт (2 replies, posted in Russian)
Друзья может кто подскажет как изменить данный скрипт (не хватает понимания его работы) чтобы он не проверял на дубликат?
Procedure ImportToSl (FileName: string); // Import procedure using the passed csv filename to this procedure
var
iField, cField: integer;
iLine, cLine: integer;
sl: TStringList;
arrValues: array of string;
arrFields: array of string;
sValue, sValues,TableName,Fields,Fields_No_Id,Where_Clause,idValue: string;
begin
sl := TStringList.Create;
sl.LoadFromFile(FileName); // Load the contents of the csv file into the stringlist
cLine := sl.Count-1;
SQLExecute('PRAGMA foreign_keys=OFF'); // Turn foreign keys off during import process
for iLine := 0 to cLine do // Spin through each line of the stringlist
begin
ProgressBar.Position := ProgressBar.Position + 10;
sValues := '';
arrValues := SplitString(sl[iLine], ',');
If arrValues[0] = 'TableName' then
begin // Check to see if the line is a header line (each element contains the DB field name)
cField := Length(arrValues)-1;
Fields := '';
idValue := '';
for iField := 1 to cField do // Go through each field of the header line
begin
Fields := Fields + arrValues[iField] + ','; // Concatenate together with a comma separation
Continue;
end;
Delete(Fields, Length(Fields), 1); // Remove trailing comma
Fields_No_Id := Fields;
Delete(Fields_No_Id,1,3); // Setup Field list without id in header for importing records without an id
arrfields := SplitString(Fields, ','); // Load the header field list into array. This will be used in the SQL Where Clause for checking duplicates
continue;
end;
If arrValues[0] <> 'TableName' then
Begin // The line is not a header line, but a data line
TableName := arrValues[0];
cField := Length(arrValues)-1;
for iField := 1 to cField do
begin
sValue := arrValues[iField];
sValue := ReplaceStr(sValue, ',', ',');
sValue := ReplaceStr(sValue, '|', #13#10);
sValues := sValues + sValue+','; // Concatenate together with a comma separation. Used for SQL INSERT
end;
Delete(sValues, Length(sValues), 1); // Remove trailing comma
end;
Where_Clause := ' Where ';
For iField := 1 to cField do // Go through each field array and value array and prepare where clause for duplicate checking
Begin
sValue := arrValues[iField];
sValue := ReplaceStr(sValue, ',', ',');
sValue := ReplaceStr(sValue, '|', #13#10);
If iField = 1 then
Begin
idValue := sValue; // Trap id value in csv line
continue; // Go to next field. Do not include in WHERE Clause.
end;
Where_Clause := Where_Clause + arrFields[iField-1] + ' = ' + sValue + ' and '; // Concatenate fields and values for Where Clause with an " and " in between. Used for SQL SELECT for duplicate checking.
End;
Delete(Where_Clause, Length(Where_Clause)-4,5); // Remove trailing " and " from Where Clause
If idValue = '''''' then // Check for empty id in csv line. id field contains ''
Begin
Delete(sValues,1,3); // Remove 'id,' from field names list because id is empty in csv line
If SqlExecute('Select id From ' + TableName + Where_Clause) <> 0 then Dups := Dups + 1 // check for duplicates in all fields except id. If dupicates then increment dup counter
else SQLExecute('INSERT INTO '+TableName+' ('+Fields_No_Id+') VALUES ('+sValues+')'); // If not duplicate then insert record with new id
end;
If idValue <> '''''' then // If id is not empty then check for duplicate id in table. If not exist then insert record.
Begin
If SqlExecute('Select id From ' + TableName + ' Where id = ' + idValue) <> 0 then Dups := Dups + 1 // Check for duplicates. If duplicate then increment dup count.
else SQLExecute('INSERT INTO '+TableName+' ('+Fields+') VALUES ('+sValues+')'); // If not duplicate then insert record
end;
end;
sl.Free;
SQLExecute('PRAGMA foreign_keys=ON'); // Turn foreign keys back on
end;
21 2018-07-16 21:20:17
Topic: Триггеры и режим LinkFile (1 replies, posted in Russian)
Дмитрий здравствуйте, возник такой вопрос как передать в обработку ссылку на изображение для логгирования при использовании триггеров? в таком виде сохраняет при создании новой записи -
(SELECT photoFile_filename FROM Person)
но не обновляет ссылку при обновлении записи. (новое фото ложится в папку, в бд прописывается новая ссылка, но в логи уходит первичное название). при удалении записи в логах поле пустое.
22 2018-07-10 21:53:45
Re: Финальная версия 4.5 (2 replies, posted in Russian)
А где посмотреть информацию по новым событиям?
24 2018-06-21 20:14:32
Re: Связь многие-ко-многим (14 replies, posted in Russian)
В Вашем примере из поста №10, поиск по чек боксу с выводом в грид осуществляется отлично, но если добавить, но при таких же настройках (поиск по чекбоксу осуществляется через вычисляемое поле) при попытке создания отчета выдается ошибка нет такой колонки.
no such column - Uchet.calc_spisano. Я так понимаю данное поле для поиска с выводом в отчет в таком виде использовать не получится?
25 2018-06-18 21:31:21
Re: Связь многие-ко-многим (14 replies, posted in Russian)
Дмитрий, спасибо за пример, сделал по аналогии и поиск заработал как требуется. Только не могу понять как теперь на его основе сделать отчёт. При использовании стандартной возможности по генерации отчёта, и если поисковый чекбокс завязан на вычисляемое поле выдает ошибку - нет такой колонки. ? Пробовал и на вашем примере сгенерировать отчёт, результат тот же.